Merge branch 'setAsWallpaper' into beta
authortobiasKaminsky <tobias@kaminsky.me>
Mon, 2 Nov 2015 08:38:24 +0000 (09:38 +0100)
committertobiasKaminsky <tobias@kaminsky.me>
Mon, 2 Nov 2015 08:38:24 +0000 (09:38 +0100)
1  2 
res/menu/file_actions_menu.xml
res/values/strings.xml
src/com/owncloud/android/files/FileOperationsHelper.java
src/com/owncloud/android/ui/preview/PreviewImageFragment.java

@@@ -1,5 -1,4 +1,5 @@@
 -<?xml version="1.0" encoding="utf-8"?><!--
 +<?xml version="1.0" encoding="utf-8"?>
 +<!--
    ownCloud Android client application
  
    Copyright (C) 2012  Bartek Przybylski
          android:icon="@android:drawable/ic_menu_share"
          android:orderInCategory="1" />
      <item
 +        android:id="@+id/action_stream_file"
 +        android:title="@string/action_stream_file"
 +        android:icon="@android:drawable/ic_menu_view"
 +        android:orderInCategory="1" />
 +    <item
          android:id="@+id/action_unshare_file"
          android:title="@string/action_unshare_file"
          android:icon="@android:drawable/ic_menu_share"
          android:icon="@android:drawable/ic_menu_set_as"
          android:orderInCategory="1" />
      <item
+         android:id="@+id/action_set_as_wallpaper"
+         android:title="@string/set_picture_as"
+         android:icon="@android:drawable/ic_menu_set_as"
+         android:orderInCategory="1" />
+     <item
          android:id="@+id/action_see_details"
          android:title="@string/actionbar_see_details"
          android:icon="@android:drawable/ic_menu_info_details"
diff --combined res/values/strings.xml
@@@ -23,7 -23,8 +23,7 @@@
      <!-- TODO re-enable when "Accounts" is available in Navigation Drawer -->
      <!--<string name="drawer_item_accounts">Accounts</string>-->
      <string name="drawer_item_all_files">All files</string>
 -    <!-- TODO re-enable when "On Device" is available
 -    <string name="drawer_item_on_device">On device</string>-->
 +    <string name="drawer_item_on_device">On device</string>
      <string name="drawer_item_settings">Settings</string>
      <string name="drawer_item_logs">Logs</string>
        <string name="drawer_close">Close</string>
      <string name="unfavorite">Unfavorite</string>
      <string name="common_rename">Rename</string>
      <string name="common_remove">Remove</string>
 -    <string name="confirmation_remove_alert">"Do you really want to remove %1$s?"</string>
 +    <string name="confirmation_remove_file_alert">"Do you really want to remove %1$s?"</string>
      <string name="confirmation_remove_folder_alert">"Do you really want to remove %1$s and its contents?"</string>
      <string name="confirmation_remove_local">Local only</string>
      <string name="confirmation_remove_folder_local">Local only</string>
 -    <string name="confirmation_remove_remote">From server</string>
 +    <string name="confirmation_remove_file_remote">From server</string>
      <string name="confirmation_remove_remote_and_local">Remote &amp; local</string>
      <string name="remove_success_msg">"Removal succeeded"</string>
      <string name="remove_fail_msg">"Removal failed"</string>
      <string name="placeholder_filesize">389 KB</string>
      <string name="placeholder_timestamp">2012/05/18 12:23 PM</string>
      <string name="placeholder_media_time">12:23:45</string>
 -
 -    <string name="instant_upload_on_wifi">Upload pictures via WiFi only</string>
 -    <string name="instant_video_upload_on_wifi">Upload videos via WiFi only</string>
 +    
 +    <string name="instant_upload_on_wifi">Upload pictures via wifi only</string>
 +    <string name="instant_upload_on_charging">Upload when charging only</string>
 +    <string name="instant_video_upload_on_wifi">Upload videos via wifi only</string>
 +    <string name="instant_video_upload_on_charging">Upload when charging only</string>
      <string name="instant_upload_path">/InstantUpload</string>
      <string name="conflict_title">File conflict</string>
      <string name="conflict_message">Which files do you want to keep? If you select both versions, the local file will have a number added to its name.</string>
      <string name="preview_image_error_unknown_format">This image cannot be shown</string>
  
      <string name="error__upload__local_file_not_copied">%1$s could not be copied to %2$s local folder</string>
 -    <string name="prefs_instant_upload_path_title">Upload Path</string>
 +    <string name="prefs_instant_upload_path_title">Upload path</string>
  
        <string name="share_link_no_support_share_api">Sorry, sharing is not enabled on your server. Please contact your
                administrator.</string>
      <string name="prefs_category_instant_uploading">Instant Uploads</string>
        <string name="prefs_category_security">Security</string>
  
 -      <string name="prefs_instant_video_upload_path_title">Upload Video Path</string>
 +      <string name="prefs_instant_video_upload_path_title">Upload video path</string>
 +    <string name="download_folder_failed_content">Download of %1$s folder could not be completed</string>
      <string name="sync_folder_failed_content">Synchronization of %1$s folder could not be completed</string>
  
        <string name="shared_subject_header">shared</string>
      <string name="file_list__footer__files">%1$d files</string>
      <string name="file_list__footer__files_and_folder">%1$d files, 1 folder</string>
      <string name="file_list__footer__files_and_folders">%1$d files, %2$d folders</string>
 +    <string name="action_switch_grid_view">Switch to grid view</string>
 +    <string name="action_switch_list_view">Switch to list view</string>
 +    <string name="common_category">Common</string>
 +    <string name="pref_cache_size">Cache size</string>
 +    <string name="prefs_instant_behaviour_dialogTitle">Upload file to server and ...</string>
 +    <string name="prefs_instant_behaviour_title">Behaviour</string>
 +    <string name="upload_copy_files">Copy file</string>
 +    <string name="upload_move_files">Move file</string>
 +
 +    <string name="pref_behaviour_entries_do_nothing">do nothing</string>
 +    <string name="pref_behaviour_entries_copy">copy file to OC folder</string>
 +    <string name="pref_behaviour_entries_move">move file to OC folder</string>
 +    <string name="pref_behaviour_entries_delete">delete origin file</string>
 +    <string name="confirmation_remove_files_alert">Do you really want to remove selected items?</string>
 +    <string name="confirmation_remove_folders_alert">Do you really want to remove a folder and its content?</string>
 +    <string name="confirmation_remove_files">selected items</string>
 +    <string name="error_log_exit">Exit</string>
 +    <string name="error_log_send">Send Log</string>
 +    <string name="error_log_title">Error Log</string>
 +    <string name="action_stream_file">Stream file with external player</string>
 +    <string name="stream_expose_password">Do you want to stream this file with an external app?\n\nCAUTION: This may expose your password!</string>
+     <string name="set_picture_as">Set picture as</string>
  
  </resources>
@@@ -27,17 -27,14 +27,17 @@@ import android.content.Context
  import android.content.Intent;
  import android.content.pm.PackageManager;
  import android.content.pm.ResolveInfo;
 +import android.graphics.Bitmap;
  import android.net.Uri;
  import android.support.v4.app.DialogFragment;
  import android.webkit.MimeTypeMap;
  import android.widget.Toast;
  
 +import com.owncloud.android.MainApp;
  import com.owncloud.android.R;
  import com.owncloud.android.authentication.AccountUtils;
  import com.owncloud.android.datamodel.OCFile;
 +import com.owncloud.android.datamodel.ThumbnailsCacheManager;
  import com.owncloud.android.files.services.FileDownloader.FileDownloaderBinder;
  import com.owncloud.android.files.services.FileUploader.FileUploaderBinder;
  import com.owncloud.android.lib.common.network.WebdavUtils;
@@@ -46,21 -43,13 +46,22 @@@ import com.owncloud.android.lib.resourc
  import com.owncloud.android.services.OperationsService;
  import com.owncloud.android.services.observer.FileObserverService;
  import com.owncloud.android.ui.activity.FileActivity;
 +import com.owncloud.android.ui.adapter.DiskLruImageCacheFileProvider;
  import com.owncloud.android.ui.dialog.ShareLinkToDialog;
  
  import org.apache.http.protocol.HTTP;
  
+ import java.io.File;
  import java.util.List;
  
 +import java.io.ByteArrayOutputStream;
 +import java.io.File;
 +import java.io.FileNotFoundException;
 +import java.io.FileOutputStream;
 +import java.io.IOException;
 +
 +import java.util.ArrayList;
 +
  /**
   *
   */
@@@ -248,30 -237,34 +249,43 @@@ public class FileOperationsHelper 
          }
      }
  
+     public void setPictureAs(OCFile file) {
++        if (file != null || file.isDown()) {
++            File externalFile=new File(file.getStoragePath());
++            Uri sendUri = Uri.fromFile(externalFile);
++            Intent intent = new Intent(Intent.ACTION_ATTACH_DATA);
++            intent.setDataAndType(sendUri, file.getMimetype());
++            intent.putExtra("mimeType", file.getMimetype());
++            mFileActivity.startActivityForResult(Intent.createChooser(intent, "Set As"), 200);
++        } else {
++            Log_OC.wtf(TAG, "Trying to send a NULL OCFile");
++        }
++    }
++
 +    public void sendCachedImage(OCFile file) {
          if (file != null) {
 -            if (file.isDown()) {
 -                File externalFile=new File(file.getStoragePath());
 -                Uri sendUri = Uri.fromFile(externalFile);
 -                Intent intent = new Intent(Intent.ACTION_ATTACH_DATA);
 -                intent.setDataAndType(sendUri, file.getMimetype());
 -                intent.putExtra("mimeType", file.getMimetype());
 -                mFileActivity.startActivityForResult(Intent.createChooser(intent, "Set As"), 200);
 -            } else {
 -                // TODO re-enable after resized images is available
 -//                Intent sendIntent = new Intent(android.content.Intent.ACTION_SEND);
 -//                // set MimeType
 -//                sendIntent.setType(file.getMimetype());
 -////            sendIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("content://" + DiskLruImageCacheFileProvider.AUTHORITY + "/#" + file.getRemoteId() + "#" + file.getFileName()));
 -//                sendIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("content://" + DiskLruImageCacheFileProvider.AUTHORITY + file.getRemotePath()));
 -//                sendIntent.putExtra(Intent.ACTION_SEND, true);      // Send Action
 -//
 -//                // Show dialog, without the own app
 -//                String[] packagesToExclude = new String[] { mFileActivity.getPackageName() };
 -//                DialogFragment chooserDialog = ShareLinkToDialog.newInstance(sendIntent, packagesToExclude, file);
 -//                chooserDialog.show(mFileActivity.getSupportFragmentManager(), FTAG_CHOOSER_DIALOG);
 -            }
 +            Intent sendIntent = new Intent(android.content.Intent.ACTION_SEND);
 +            // set MimeType
 +            sendIntent.setType(file.getMimetype());
 +//            sendIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("content://" + DiskLruImageCacheFileProvider.AUTHORITY + "/#" + file.getRemoteId() + "#" + file.getFileName()));
 +            sendIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("content://" + DiskLruImageCacheFileProvider.AUTHORITY + file.getRemotePath()));
 +            sendIntent.putExtra(Intent.ACTION_SEND, true);      // Send Action
 +
 +            // Show dialog, without the own app
 +            String[] packagesToExclude = new String[] { mFileActivity.getPackageName() };
 +            DialogFragment chooserDialog = ShareLinkToDialog.newInstance(sendIntent, packagesToExclude, file);
 +            chooserDialog.show(mFileActivity.getSupportFragmentManager(), FTAG_CHOOSER_DIALOG);
          } else {
              Log_OC.wtf(TAG, "Trying to send a NULL OCFile");
          }
      }
  
 +    public void syncFiles(ArrayList<OCFile> files) {
 +        for (OCFile file: files) {
 +            syncFile(file);
 +        }
 +    }
 +
      /**
       * Request the synchronization of a file or folder with the OC server, including its contents.
       *
              intent.putExtra(OperationsService.EXTRA_SYNC_FILE_CONTENTS, true);
              mWaitingForOpId = mFileActivity.getOperationsServiceBinder().queueNewOperation(intent);
              mFileActivity.showLoadingDialog();
 -            
 +
          } else {
              Intent intent = new Intent(mFileActivity, OperationsService.class);
              intent.setAction(OperationsService.ACTION_SYNC_FOLDER);
          }
      }
  
 +    public void toggleFavorites(ArrayList<OCFile> files, boolean isFavorite){
 +        for (OCFile file: files) {
 +            toggleFavorite(file, isFavorite);
 +        }
 +    }
 +
      public void toggleFavorite(OCFile file, boolean isFavorite) {
          file.setFavorite(isFavorite);
          mFileActivity.getStorageManager().saveFile(file);
          service.putExtra(OperationsService.EXTRA_ACCOUNT, mFileActivity.getAccount());
          mWaitingForOpId =  mFileActivity.getOperationsServiceBinder().queueNewOperation(service);
  
 -        mFileActivity.showLoadingDialog();
 +        // TODO Tobi loading dialog?
 +        // mFileActivity.showLoadingDialog();
      }
  
      /**
@@@ -41,10 -41,8 +41,10 @@@ import android.widget.ImageView
  import android.widget.ProgressBar;
  import android.widget.TextView;
  
 +import com.owncloud.android.MainApp;
  import com.owncloud.android.R;
  import com.owncloud.android.datamodel.OCFile;
 +import com.owncloud.android.datamodel.ThumbnailsCacheManager;
  import com.owncloud.android.files.FileMenuFilter;
  import com.owncloud.android.lib.common.utils.Log_OC;
  import com.owncloud.android.ui.dialog.ConfirmationDialogFragment;
@@@ -71,14 -69,11 +71,14 @@@ public class PreviewImageFragment exten
  
      private static final String ARG_FILE = "FILE";
      private static final String ARG_IGNORE_FIRST = "IGNORE_FIRST";
 +    private static final String ARG_SHOW_RESIZED_IMAGE = "SHOW_RESIZED_IMAGE";
  
      private TouchImageViewCustom mImageView;
      private TextView mMessageView;
      private ProgressBar mProgressWheel;
  
 +    private Boolean mShowResizedImage = false;
 +
      public Bitmap mBitmap = null;
  
      private static final String TAG = PreviewImageFragment.class.getSimpleName();
       *                                  {@link FragmentStatePagerAdapter}
       *                                  ; TODO better solution
       */
 -    public static PreviewImageFragment newInstance(OCFile imageFile, boolean ignoreFirstSavedState){
 +    public static PreviewImageFragment newInstance(OCFile imageFile, boolean ignoreFirstSavedState,
 +            boolean showResizedImage){
          PreviewImageFragment frag = new PreviewImageFragment();
 +        frag.mShowResizedImage = showResizedImage;
          Bundle args = new Bundle();
          args.putParcelable(ARG_FILE, imageFile);
          args.putBoolean(ARG_IGNORE_FIRST, ignoreFirstSavedState);
 +        args.putBoolean(ARG_SHOW_RESIZED_IMAGE, showResizedImage);
          frag.setArguments(args);
          return frag;
      }
              // not right now
  
          mIgnoreFirstSavedState = args.getBoolean(ARG_IGNORE_FIRST);
 +        mShowResizedImage = args.getBoolean(ARG_SHOW_RESIZED_IMAGE);
          setHasOptionsMenu(true);
      }
  
          if (getFile() == null) {
              throw new IllegalStateException("Instanced with a NULL OCFile");
          }
 -        if (!getFile().isDown()) {
 -            throw new IllegalStateException("There is no local file to preview");
 -        }
      }
  
  
      public void onStart() {
          super.onStart();
          if (getFile() != null) {
 -            mLoadBitmapTask = new LoadBitmapTask(mImageView, mMessageView, mProgressWheel);
 -            //mLoadBitmapTask.execute(new String[]{getFile().getStoragePath()});
 -//            mLoadBitmapTask.execute(getFile().getStoragePath());
 -            mLoadBitmapTask.execute(getFile());
 +            mImageView.setTag(getFile().getFileId());
 +
 +            if (mShowResizedImage){
 +                Bitmap thumbnail = ThumbnailsCacheManager.getBitmapFromDiskCache(
 +                        String.valueOf("r" + getFile().getRemoteId())
 +                );
 +
 +                if (thumbnail != null && !getFile().needsUpdateThumbnail()){
 +                    mProgressWheel.setVisibility(View.GONE);
 +                    mImageView.setImageBitmap(thumbnail);
 +                    mImageView.setVisibility(View.VISIBLE);
 +                    mBitmap  = thumbnail;
 +                } else {
 +                    // generate new Thumbnail
 +                    if (ThumbnailsCacheManager.cancelPotentialWork(getFile(), mImageView) &&
 +                        mContainerActivity.getStorageManager() != null) {
 +                        final ThumbnailsCacheManager.ThumbnailGenerationTask task =
 +                                new ThumbnailsCacheManager.ThumbnailGenerationTask(
 +                                        mImageView, mContainerActivity.getStorageManager(),
 +                                        mContainerActivity.getStorageManager().getAccount(),
 +                                        mProgressWheel);
 +                        if (thumbnail == null) {
 +                            thumbnail = ThumbnailsCacheManager.mDefaultImg;
 +                        }
 +                        final ThumbnailsCacheManager.AsyncDrawable asyncDrawable =
 +                                new ThumbnailsCacheManager.AsyncDrawable(
 +                                        MainApp.getAppContext().getResources(),
 +                                        thumbnail,
 +                                        task
 +                                );
 +                        mImageView.setImageDrawable(asyncDrawable);
 +                        task.execute(getFile(), false);
 +                    }
 +            }
 +            } else {
 +                mLoadBitmapTask = new LoadBitmapTask(mImageView, mMessageView, mProgressWheel);
 +                mLoadBitmapTask.execute(getFile());
 +            }
          }
      }
  
                  return true;
              }
              case R.id.action_send_file: {
 -                mContainerActivity.getFileOperationsHelper().sendDownloadedFile(getFile());
 -                return true;
 +                if (getFile().isImage() && !getFile().isDown()){
 +                    mContainerActivity.getFileOperationsHelper().sendCachedImage(getFile());
 +                    return true;
 +                } else {
 +                    mContainerActivity.getFileOperationsHelper().sendDownloadedFile(getFile());
 +                    return true;
 +                }
              }
              case R.id.action_sync_file: {
                  mContainerActivity.getFileOperationsHelper().syncFile(getFile());
                  mContainerActivity.getFileOperationsHelper().toggleFavorite(getFile(), false);
                  return true;
              }
+             case R.id.action_set_as_wallpaper:{
+                 mContainerActivity.getFileOperationsHelper().setPictureAs(getFile());
+                 return true;
+             }
              default:
                  return false;
          }
                      imageView.setBackground(backrepeat);
                  }
  
 -                imageView.setImageBitmap(bitmap);
 +                if (result.ocFile.getMimetype().equalsIgnoreCase("image/gif")){
 +                    imageView.setGifImage(result.ocFile);
 +                } else {
 +                    imageView.setImageBitmap(bitmap);
 +                }
 +
                  imageView.setVisibility(View.VISIBLE);
                  mBitmap  = bitmap;  // needs to be kept for recycling when not useful
              }