Merge remote-tracking branch 'upstream/video_thumbnail' into video_thumbnail
authortobiasKaminsky <tobias@kaminsky.me>
Fri, 14 Aug 2015 13:39:35 +0000 (15:39 +0200)
committertobiasKaminsky <tobias@kaminsky.me>
Fri, 14 Aug 2015 13:39:35 +0000 (15:39 +0200)
1  2 
owncloud-android-library
res/drawable-hdpi/view_play.png
res/drawable-mdpi/view_play.png
res/drawable-xhdpi/view_play.png
res/drawable-xxhdpi/view_play.png
res/drawable-xxxhdpi/view_play.png
src/com/owncloud/android/datamodel/ThumbnailsCacheManager.java
src/com/owncloud/android/ui/adapter/FileListListAdapter.java

diff --combined owncloud-android-library
@@@ -1,1 -1,1 +1,1 @@@
- Subproject commit f5fbca24becbb01660abe2a7013c1b536ea8a301
 -Subproject commit dbc8c325d74f3f7e8da8236c5abe77a141ae4019
++Subproject commit 4eb9ce4ba2d9272de561954b3638f5acde8b2ca5
index 0000000,57c9fa5..5371724
mode 000000,100644..100644
Binary files differ
index 0000000,c61e948..77b2027
mode 000000,100644..100644
Binary files differ
index 0000000,a3c80e7..8482788
mode 000000,100644..100644
Binary files differ
index 0000000,547ef30..fea738b
mode 000000,100644..100644
Binary files differ
index 0000000,be5c062..3786b4d
mode 000000,100644..100644
Binary files differ
@@@ -24,6 -24,8 +24,8 @@@ package com.owncloud.android.datamodel
  import java.io.File;
  import java.io.InputStream;
  import java.lang.ref.WeakReference;
+ import java.net.FileNameMap;
+ import java.net.URLConnection;
  
  import org.apache.commons.httpclient.HttpStatus;
  import org.apache.commons.httpclient.methods.GetMethod;
@@@ -33,6 -35,8 +35,8 @@@ 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.Paint;
  import android.graphics.drawable.BitmapDrawable;
  import android.graphics.drawable.Drawable;
  import android.media.ThumbnailUtils;
@@@ -51,6 -55,6 +55,7 @@@ import com.owncloud.android.lib.resourc
  import com.owncloud.android.ui.adapter.DiskLruImageCache;
  import com.owncloud.android.utils.BitmapUtils;
  import com.owncloud.android.utils.DisplayUtils;
++import com.owncloud.android.utils.FileStorageUtils;
  
  /**
   * Manager for concurrent access to thumbnails cache.
@@@ -176,8 -180,20 +181,19 @@@ public class ThumbnailsCacheManager 
                  
                  if (mFile instanceof OCFile) {
                      thumbnail = doOCFileInBackground();
+                     if (((OCFile) mFile).isVideo()){
+                         thumbnail = addVideoOverlay(thumbnail);
+                     }
                  }  else if (mFile instanceof File) {
                      thumbnail = doFileInBackground();
 -                    FileNameMap fileNameMap = URLConnection.getFileNameMap();
 -                    String mMimeType = fileNameMap.getContentTypeFor("file://" + url);
+                     String url = ((File) mFile).getAbsolutePath();
++                    String mMimeType = FileStorageUtils.getMimeTypeFromName(url);
+                     if (mMimeType != null && mMimeType.startsWith("video/")){
+                         thumbnail = addVideoOverlay(thumbnail);
+                     }
                  //} else {  do nothing
                  }
  
          return null;
      }
  
+     public static Bitmap addVideoOverlay(Bitmap thumbnail){
+         Bitmap playButton = BitmapFactory.decodeResource(MainApp.getAppContext().getResources(),
+                 R.drawable.view_play);
+         Bitmap resizedPlayButton = Bitmap.createScaledBitmap(playButton,
+                 (int) (thumbnail.getWidth() * 0.3),
+                 (int) (thumbnail.getHeight() * 0.3), true);
+         Bitmap resultBitmap = Bitmap.createBitmap(thumbnail.getWidth(),
+                 thumbnail.getHeight(),
+                 Bitmap.Config.ARGB_8888);
+         Canvas c = new Canvas(resultBitmap);
+         // compute visual center of play button, according to resized image
+         int x1 = resizedPlayButton.getWidth();
+         int y1 = resizedPlayButton.getHeight() / 2;
+         int x2 = 0;
+         int y2 = resizedPlayButton.getWidth();
+         int x3 = 0;
+         int y3 = 0;
+         double ym = ( ((Math.pow(x3,2) - Math.pow(x1,2) + Math.pow(y3,2) - Math.pow(y1,2)) *
+                     (x2 - x1)) - (Math.pow(x2,2) - Math.pow(x1,2) + Math.pow(y2,2) -
+                     Math.pow(y1,2)) * (x3 - x1) )  /  (2 * ( ((y3 - y1) * (x2 - x1)) -
+                     ((y2 - y1) * (x3 - x1)) ));
+         double xm = ( (Math.pow(x2,2) - Math.pow(x1,2)) + (Math.pow(y2,2) - Math.pow(y1,2)) -
+                     (2*ym*(y2 - y1)) ) / (2*(x2 - x1));
+         // offset to top left
+         double ox = - xm;
+         double oy = thumbnail.getHeight() - ym;
+         c.drawBitmap(thumbnail, 0, 0, null);
+         Paint p = new Paint();
+         p.setAlpha(230);
+         c.drawBitmap(resizedPlayButton, (float) ((thumbnail.getWidth() / 2) + ox),
+                                         (float) ((thumbnail.getHeight() / 2) - ym), p);
+         return resultBitmap;
+     }
      public static class AsyncDrawable extends BitmapDrawable {
          private final WeakReference<ThumbnailGenerationTask> bitmapWorkerTaskReference;
  
@@@ -30,6 -30,9 +30,9 @@@ import android.accounts.Account
  import android.content.Context;\r
  import android.content.SharedPreferences;\r
  import android.graphics.Bitmap;\r
+ import android.graphics.BitmapFactory;\r
+ import android.graphics.Canvas;\r
+ import android.graphics.Paint;\r
  import android.os.Build;\r
  import android.preference.PreferenceManager;\r
  import android.text.format.DateUtils;\r
@@@ -268,15 -271,14 +271,14 @@@ public class FileListListAdapter extend
                      }\r
  \r
                      // share with me icon\r
-                     if (!file.isFolder()) {\r
-                         ImageView sharedWithMeIconV = (ImageView)\r
-                                 view.findViewById(R.id.sharedWithMeIcon);\r
-                         sharedWithMeIconV.bringToFront();\r
-                         if (checkIfFileIsSharedWithMe(file)) {\r
-                             sharedWithMeIconV.setVisibility(View.VISIBLE);\r
-                         } else {\r
-                             sharedWithMeIconV.setVisibility(View.GONE);\r
-                         }\r
+                     ImageView sharedWithMeIconV = (ImageView)\r
+                             view.findViewById(R.id.sharedWithMeIcon);\r
+                     sharedWithMeIconV.bringToFront();\r
+                     if (checkIfFileIsSharedWithMe(file) &&\r
+                             (!file.isFolder() || !mGridMode)) {\r
+                         sharedWithMeIconV.setVisibility(View.VISIBLE);\r
+                     } else {\r
+                         sharedWithMeIconV.setVisibility(View.GONE);\r
                      }\r
  \r
                      break;\r
              \r
              // this if-else is needed even though favorite icon is visible by default\r
              // because android reuses views in listview\r
-             if (!file.keepInSync()) {\r
+             if (!file.isFavorite()) {\r
                  view.findViewById(R.id.favoriteIcon).setVisibility(View.GONE);\r
              } else {\r
                  view.findViewById(R.id.favoriteIcon).setVisibility(View.VISIBLE);\r
                              String.valueOf(file.getRemoteId())\r
                              );\r
                      if (thumbnail != null && !file.needsUpdateThumbnail()){\r
-                         fileIcon.setImageBitmap(thumbnail);\r
\r
+                         if (file.isVideo()) {\r
+                             Bitmap withOverlay = ThumbnailsCacheManager.addVideoOverlay(thumbnail);\r
+                             fileIcon.setImageBitmap(withOverlay);\r
+                         } else {\r
+                             fileIcon.setImageBitmap(thumbnail);\r
+                         }\r
                      } else {\r
                          // generate new Thumbnail\r
                          if (ThumbnailsCacheManager.cancelPotentialWork(file, fileIcon)) {\r
                                      new ThumbnailsCacheManager.ThumbnailGenerationTask(\r
                                              fileIcon, mStorageManager, mAccount\r
                                              );\r
-                             if (thumbnail != null) {\r
-                                 final ThumbnailsCacheManager.AsyncDrawable asyncDrawable =\r
-                                         new ThumbnailsCacheManager.AsyncDrawable(\r
-                                                 mContext.getResources(),\r
-                                                 thumbnail,\r
-                                                 task\r
-                                         );\r
-                                 fileIcon.setImageDrawable(asyncDrawable);\r
-                                 task.execute(file);\r
-                             } else {\r
-                                 fileIcon.setImageResource(DisplayUtils.getFileTypeIconId(\r
-                                         file.getMimetype(), file.getFileName()));\r
+                             if (thumbnail == null) {\r
 -//                                thumbnail = ThumbnailsCacheManager.mDefaultImg;\r
 -                                Integer id = DisplayUtils.getFileTypeIconId(file.getMimetype(),\r
 -                                        file.getFileName());\r
 -                                thumbnail = BitmapFactory.decodeResource(mContext.getResources(), id);\r
++                                thumbnail = ThumbnailsCacheManager.mDefaultImg;\r
                              }\r
 -                                    mContext.getResources(),\r
 -                                    thumbnail,\r
+                             final ThumbnailsCacheManager.AsyncDrawable asyncDrawable =\r
+                                     new ThumbnailsCacheManager.AsyncDrawable(\r
++                                    mContext.getResources(), \r
++                                    thumbnail, \r
+                                     task\r
+                                     );\r
+                             fileIcon.setImageDrawable(asyncDrawable);\r
+                             task.execute(file);\r
                          }\r
                      }\r
                  } else {\r