Merge remote-tracking branch 'remotes/upstream/master' into resizedImagesMaster
authortobiasKaminsky <tobias@kaminsky.me>
Thu, 5 Nov 2015 21:04:57 +0000 (22:04 +0100)
committertobiasKaminsky <tobias@kaminsky.me>
Thu, 5 Nov 2015 21:04:57 +0000 (22:04 +0100)
1  2 
AndroidManifest.xml
src/com/owncloud/android/datamodel/ThumbnailsCacheManager.java
src/com/owncloud/android/files/FileOperationsHelper.java
src/com/owncloud/android/ui/adapter/FileListListAdapter.java
src/com/owncloud/android/ui/fragment/OCFileListFragment.java
src/com/owncloud/android/ui/preview/PreviewImageActivity.java
src/com/owncloud/android/ui/preview/PreviewImageFragment.java

              android:name=".providers.FileContentProvider"
              android:authorities="@string/authority"
              android:enabled="true"
 -            android:exported="false"
 +            android:exported="true"
              android:label="@string/sync_string_files"
-             android:syncable="true" >
-         </provider>
+             android:syncable="true" />
+         <provider
+             android:name=".providers.UsersAndGroupsSearchProvider"
+             android:authorities="com.owncloud.android.providers.UsersAndGroupsSearchProvider"
+             android:enabled="true"
+             android:exported="false"
+             android:label="@string/search_users_and_groups_hint" />
  
 +        <provider
 +            android:name=".ui.adapter.DiskLruImageCacheFileProvider"
 +            android:authorities="com.owncloud.imageCache.provider"
 +            android:exported="true">
 +        </provider>
 +
          <activity
              android:name=".authentication.AuthenticatorActivity"
              android:exported="true"
@@@ -35,8 -33,9 +35,10 @@@ import android.content.res.Resources
  import android.graphics.Bitmap;
  import android.graphics.Bitmap.CompressFormat;
  import android.graphics.BitmapFactory;
 +import android.graphics.Point;
+ import android.graphics.Canvas;
  import android.graphics.drawable.BitmapDrawable;
+ import android.graphics.drawable.ColorDrawable;
  import android.graphics.drawable.Drawable;
  import android.media.ThumbnailUtils;
  import android.net.Uri;
@@@ -297,22 -253,21 +295,27 @@@ public class ThumbnailsCacheManager 
  
              // Not found in disk cache
              if (thumbnail == null || file.needsUpdateThumbnail()) {
 -
 -                int px = getThumbnailDimension();
 +                int pxW = 0;
 +                int pxH = 0;
 +                if (mIsThumbnail) {
 +                    pxW = pxH = getThumbnailDimension();
 +                } else {
 +                    Point p = getScreenDimension();
 +                    pxW = p.x;
 +                    pxH = p.y;
 +                }
  
                  if (file.isDown()) {
 -                    Bitmap temp = BitmapUtils.decodeSampledBitmapFromFile(
 -                            file.getStoragePath(), px, px);
 -                    Bitmap bitmap = ThumbnailUtils.extractThumbnail(temp, px, px);
 +                    Bitmap bitmap = BitmapUtils.decodeSampledBitmapFromFile(
 +                            file.getStoragePath(), pxW, pxH);
  
                      if (bitmap != null) {
 -                            bitmap = handlePNG(bitmap, px);
+                         // Handle PNG
+                         if (file.getMimetype().equalsIgnoreCase("image/png")) {
 -                        thumbnail = addThumbnailToCache(imageKey, bitmap, file.getStoragePath(), px);
++                            bitmap = handlePNG(bitmap, pxW);
+                         }
 +                        thumbnail = addThumbnailToCache(imageKey, bitmap, file.getStoragePath(), pxW, pxH);
  
                          file.setNeedsUpdateThumbnail(false);
                          mStorageManager.saveFile(file);
                                  GetMethod get = new GetMethod(uri);
                                  int status = mClient.executeMethod(get);
                                  if (status == HttpStatus.SC_OK) {
- //                                    byte[] bytes = get.getResponseBody();
- //                                    Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0,
- //                                            bytes.length);
                                      InputStream inputStream = get.getResponseBodyAsStream();
                                      Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
 -                                    thumbnail = ThumbnailUtils.extractThumbnail(bitmap, px, px);
 +                                    thumbnail = ThumbnailUtils.extractThumbnail(bitmap, pxW, pxH);
 +                                    byte[] bytes = get.getResponseBody();
 +
 +                                    if (mIsThumbnail) {
 +                                        thumbnail = ThumbnailUtils.extractThumbnail(bitmap, pxW, pxH);
 +                                    } else {
 +                                        thumbnail = bitmap;
 +                                    }
  
 -                                        thumbnail = handlePNG(thumbnail, px);
+                                     // Handle PNG
+                                     if (file.getMimetype().equalsIgnoreCase("image/png")) {
++                                        thumbnail = handlePNG(thumbnail, pxW);
+                                     }
                                      // Add thumbnail to cache
                                      if (thumbnail != null) {
                                          addBitmapToCache(imageKey, thumbnail);
  
          }
  
 -        private Bitmap doFileInBackground() {
+         private Bitmap handlePNG(Bitmap bitmap, int px){
+             Bitmap resultBitmap = Bitmap.createBitmap(px,
+                     px,
+                     Bitmap.Config.ARGB_8888);
+             Canvas c = new Canvas(resultBitmap);
+             c.drawColor(MainApp.getAppContext().getResources().
+                     getColor(R.color.background_color));
+             c.drawBitmap(bitmap, 0, 0, null);
+             return resultBitmap;
+         }
 +        private Bitmap doFileInBackground(Boolean mIsThumbnail) {
              File file = (File)mFile;
  
 -            final String imageKey = String.valueOf(file.hashCode());
 +            // distinguish between thumbnail and resized image
 +            String temp = String.valueOf(file.hashCode());
 +            if (mIsThumbnail){
 +                temp = "t" + temp;
 +            } else {
 +                temp = "r" + temp;
 +            }
 +
 +            final String imageKey = temp;
  
              // Check disk cache in background thread
              Bitmap thumbnail = getBitmapFromDiskCache(imageKey);
  
  package com.owncloud.android.files;
  
- import org.apache.http.protocol.HTTP;
  import android.accounts.Account;
+ import android.content.ActivityNotFoundException;
+ import android.content.Context;
  import android.content.Intent;
 +import android.graphics.Bitmap;
+ import android.content.pm.PackageManager;
+ import android.content.pm.ResolveInfo;
  import android.net.Uri;
  import android.support.v4.app.DialogFragment;
  import android.webkit.MimeTypeMap;
@@@ -35,24 -35,22 +37,30 @@@ 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;
  import com.owncloud.android.lib.common.utils.Log_OC;
+ import com.owncloud.android.lib.resources.shares.ShareType;
  import com.owncloud.android.lib.resources.status.OwnCloudVersion;
  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.activity.ShareActivity;
  import com.owncloud.android.ui.dialog.ShareLinkToDialog;
  
 +import java.io.ByteArrayOutputStream;
 +import java.io.File;
 +import java.io.FileNotFoundException;
 +import java.io.FileOutputStream;
 +import java.io.IOException;
 +
+ import org.apache.http.protocol.HTTP;
+ import java.util.List;
  /**
   *
   */
@@@ -213,27 -324,12 +334,32 @@@ public class FileOperationsHelper 
          }
      }
  
 +    public void sendCachedImage(OCFile file) {
 +        if (file != null) {
 +            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");
 +        }
 +    }
 +    
 +    
++
+     /**
+      * Request the synchronization of a file or folder with the OC server, including its contents.
+      *
+      * @param file          The file or folder to synchronize
+      */
      public void syncFile(OCFile file) {
-         
          if (!file.isFolder()){
              Intent intent = new Intent(mFileActivity, OperationsService.class);
              intent.setAction(OperationsService.ACTION_SYNC_FILE);
@@@ -317,11 -338,18 +337,18 @@@ public class FileListListAdapter extend
                                      task\r
                                      );\r
                              fileIcon.setImageDrawable(asyncDrawable);\r
 -                            task.execute(file);\r
 +                            task.execute(file, true);\r
                          }\r
                      }\r
\r
+                     if (file.getMimetype().equalsIgnoreCase("image/png")) {\r
+                         fileIcon.setBackgroundColor(mContext.getResources()\r
+                                 .getColor(R.color.background_color));\r
+                     }\r
\r
\r
                  } else {\r
-                     fileIcon.setImageResource(DisplayUtils.getFileTypeIconId(file.getMimetype(),\r
+                     fileIcon.setImageResource(MimetypeIconUtil.getFileTypeIconId(file.getMimetype(),\r
                              file.getFileName()));\r
                  }\r
  \r
@@@ -223,11 -283,14 +283,14 @@@ public class OCFileListFragment extend
                      } else {
                          mContainerActivity.getFileOperationsHelper().openFile(file);
                      }
 -
++                    
                  } else {
                      // automatic download, preview on finish
                      ((FileDisplayActivity) mContainerActivity).startDownloadForPreview(file);
                  }
 -
++                    
              }
 -
++            
          } else {
              Log_OC.d(TAG, "Null object in ListAdapter!!");
          }
@@@ -76,10 -74,8 +77,10 @@@ public class PreviewImageFragment exten
      private TextView mMessageView;
      private ProgressBar mProgressWheel;
  
 +    private Boolean mShowResizedImage = false;
 +
      public Bitmap mBitmap = null;
-     
      private static final String TAG = PreviewImageFragment.class.getSimpleName();
  
      private boolean mIgnoreFirstSavedState;
              // not right now
  
          mIgnoreFirstSavedState = args.getBoolean(ARG_IGNORE_FIRST);
 +        mShowResizedImage = args.getBoolean(ARG_SHOW_RESIZED_IMAGE);
          setHasOptionsMenu(true);
      }
-     
  
      /**
       * {@inheritDoc}
          if (getFile() == null) {
              throw new IllegalStateException("Instanced with a NULL OCFile");
          }
 -        if (!getFile().isDown()) {
 -            throw new IllegalStateException("There is no local file to preview");
 -        }
      }
-         
  
      /**
       * {@inheritDoc}
      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().getStoragePath());
++                mLoadBitmapTask.execute(getFile());
 +            }
          }
      }
-     
-     
      @Override
      public void onStop() {
          Log_OC.d(TAG, "onStop starts");