Merge remote-tracking branch 'remotes/upstream/resizedImages' into beta
authortobiasKaminsky <tobias@kaminsky.me>
Mon, 26 Oct 2015 21:49:00 +0000 (22:49 +0100)
committertobiasKaminsky <tobias@kaminsky.me>
Mon, 26 Oct 2015 21:49:00 +0000 (22:49 +0100)
1  2 
AndroidManifest.xml
owncloud-android-library
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>
  
+         <provider
+             android:name=".ui.adapter.DiskLruImageCacheFileProvider"
+             android:authorities="com.owncloud.imageCache.provider">
+         </provider>
          <activity
              android:name=".authentication.AuthenticatorActivity"
              android:exported="true"
@@@ -1,1 -1,1 +1,1 @@@
- Subproject commit ecc3415e3e3c13fa8f73fdd51a88c1ab7087b199
 -Subproject commit f5fbca24becbb01660abe2a7013c1b536ea8a301
++Subproject commit e7d9de771281ae673e1b1f64983c2d7eb7dada9b
@@@ -33,9 -35,8 +35,10 @@@ import android.content.res.Resources
  import android.graphics.Bitmap;
  import android.graphics.Bitmap.CompressFormat;
  import android.graphics.BitmapFactory;
 +import android.graphics.Canvas;
+ import android.graphics.Point;
  import android.graphics.drawable.BitmapDrawable;
 +import android.graphics.drawable.ColorDrawable;
  import android.graphics.drawable.Drawable;
  import android.media.ThumbnailUtils;
  import android.net.Uri;
@@@ -253,21 -297,22 +295,29 @@@ 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(
++                    Bitmap tempBitmap = BitmapUtils.decodeSampledBitmapFromFile(
+                             file.getStoragePath(), pxW, pxH);
++                    Bitmap bitmap = ThumbnailUtils.extractThumbnail(tempBitmap, pxW, pxH);
  
                      if (bitmap != null) {
 -                        thumbnail = addThumbnailToCache(imageKey, bitmap, file.getStoragePath(), pxW, pxH);
 +                        // Handle PNG
 +                        if (file.getMimetype().equalsIgnoreCase("image/png")) {
-                             bitmap = handlePNG(bitmap, px);
++                            bitmap = handlePNG(bitmap, pxW);
 +                        }
 +
-                         thumbnail = addThumbnailToCache(imageKey, bitmap, file.getStoragePath(), px);
++                        thumbnail = addThumbnailToCache(imageKey, bitmap,
++                                                        file.getStoragePath(), pxW, pxH);
  
                          file.setNeedsUpdateThumbnail(false);
                          mStorageManager.saveFile(file);
                      if (mClient != null && serverOCVersion != null) {
                          if (serverOCVersion.supportsRemoteThumbnails()) {
                              try {
--                                String uri = mClient.getBaseUri() + "" +
--                                        "/index.php/apps/files/api/v1/thumbnail/" +
-                                         px + "/" + px + Uri.encode(file.getRemotePath(), "/");
 -                                        pxW + "/" + pxH + Uri.encode(file.getRemotePath(), "/");
--                                Log_OC.d("Thumbnail", "URI: " + uri);
--                                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();
--
-                                     // Handle PNG
-                                     if (file.getMimetype().equalsIgnoreCase("image/png")) {
-                                         thumbnail = handlePNG(thumbnail, px);
 -                                    String type = "";
 -                                    if (mIsThumbnail){
 -                                        type = "Thumbnail";
++                                if (mIsThumbnail) {
++                                    String uri = mClient.getBaseUri() + "" +
++                                            "/index.php/apps/files/api/v1/thumbnail/" +
++                                            pxW + "/" + pxH + Uri.encode(file.getRemotePath(), "/");
++                                    Log_OC.d("Thumbnail", "Download URI: " + uri);
++                                    GetMethod get = new GetMethod(uri);
++                                    int status = mClient.executeMethod(get);
++                                    if (status == HttpStatus.SC_OK) {
++                                        InputStream inputStream = get.getResponseBodyAsStream();
++                                        Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
++                                        thumbnail = ThumbnailUtils.extractThumbnail(bitmap, pxW, pxH);
+                                     } else {
 -                                        type = "Resized image";
++                                        Log_OC.d(TAG, "Status: " + status);
+                                     }
 -                                    Log_OC.d("Thumbnail",
 -                                            type + " size of " + file.getRemotePath()
 -                                                 + ": " + bytes.length);
 -
 -                                    // bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
 -
 -                                    if (mIsThumbnail) {
 -                                        thumbnail = ThumbnailUtils.extractThumbnail(bitmap, pxW, pxH);
++                                } else {
++                                    String gallery = "";
++                                    if (serverOCVersion.supportsNativeGallery()){
++                                        gallery = "gallery";
+                                     } else {
 -                                        thumbnail = bitmap;
++                                        gallery = "galleryplus";
                                      }
  
--                                    // Add thumbnail to cache
--                                    if (thumbnail != null) {
--                                        addBitmapToCache(imageKey, thumbnail);
++                                    String uri = mClient.getBaseUri() +
++                                            "/index.php/apps/" + gallery + "/api/preview/" + Integer.parseInt(file.getRemoteId().substring(0,8)) +
++                                            "/" + pxW + "/" + pxH;
++                                    Log_OC.d("Thumbnail", "FileName: " + file.getFileName() + " Download URI: " + uri);
++                                    GetMethod get = new GetMethod(uri);
++                                    int status = mClient.executeMethod(get);
++                                    if (status == HttpStatus.SC_OK) {
++                                        InputStream inputStream = get.getResponseBodyAsStream();
++                                        Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
++                                        // Download via gallery app
++                                        thumbnail = bitmap;
                                      }
                                  }
++
++                                // Handle PNG
++                                if (thumbnail != null && file.getMimetype().equalsIgnoreCase("image/png")) {
++                                    thumbnail = handlePNG(thumbnail, pxW);
++                                }
++
++                                // Add thumbnail to cache
++                                if (thumbnail != null) {
++                                    addBitmapToCache(imageKey, thumbnail);
++                                }
                              } catch (Exception e) {
                                  e.printStackTrace();
                              }
  
          }
  
-         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) {
+             Bitmap thumbnail = null;
              File file = (File)mFile;
  
              final String imageKey = String.valueOf(file.hashCode());
  
  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.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;
@@@ -35,20 -35,24 +37,28 @@@ 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.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.dialog.ShareLinkToDialog;
  
 +import org.apache.http.protocol.HTTP;
 +
 +import java.util.List;
 +
+ import java.io.ByteArrayOutputStream;
+ import java.io.File;
+ import java.io.FileNotFoundException;
+ import java.io.FileOutputStream;
+ import java.io.IOException;
  /**
   *
   */
@@@ -236,9 -213,27 +246,27 @@@ 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");
+         }
+     }
++
 +
      public void syncFile(OCFile file) {
 -        
 +
          if (!file.isFolder()){
              Intent intent = new Intent(mFileActivity, OperationsService.class);
              intent.setAction(OperationsService.ACTION_SYNC_FILE);
@@@ -319,18 -318,11 +319,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
@@@ -281,14 -223,10 +281,10 @@@ 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!!");
          }
@@@ -74,8 -75,10 +76,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;
          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)) {
+                         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");