From: Andy Scherzinger Date: Mon, 10 Aug 2015 14:02:02 +0000 (+0200) Subject: Merge branch 'master' of https://github.com/owncloud/android into video_thumbnail X-Git-Tag: beta-20151202~1^2~2^2 X-Git-Url: http://git.linex4red.de/pub/Android/ownCloud.git/commitdiff_plain/a1b24dea37013fec794ecee6a6ef2f3fedefc0a3?hp=2b79f3292f5ca8b5e7f15ff6b2303df3d6802b36 Merge branch 'master' of https://github.com/owncloud/android into video_thumbnail --- diff --git a/res/drawable-hdpi/view_play.png b/res/drawable-hdpi/view_play.png new file mode 100644 index 00000000..57c9fa54 Binary files /dev/null and b/res/drawable-hdpi/view_play.png differ diff --git a/res/drawable-mdpi/view_play.png b/res/drawable-mdpi/view_play.png new file mode 100644 index 00000000..c61e948b Binary files /dev/null and b/res/drawable-mdpi/view_play.png differ diff --git a/res/drawable-xhdpi/view_play.png b/res/drawable-xhdpi/view_play.png new file mode 100644 index 00000000..a3c80e73 Binary files /dev/null and b/res/drawable-xhdpi/view_play.png differ diff --git a/res/drawable-xxhdpi/view_play.png b/res/drawable-xxhdpi/view_play.png new file mode 100644 index 00000000..547ef30a Binary files /dev/null and b/res/drawable-xxhdpi/view_play.png differ diff --git a/res/drawable-xxxhdpi/view_play.png b/res/drawable-xxxhdpi/view_play.png new file mode 100644 index 00000000..be5c062b Binary files /dev/null and b/res/drawable-xxxhdpi/view_play.png differ diff --git a/src/com/owncloud/android/datamodel/ThumbnailsCacheManager.java b/src/com/owncloud/android/datamodel/ThumbnailsCacheManager.java index 0e59a834..07849e18 100644 --- a/src/com/owncloud/android/datamodel/ThumbnailsCacheManager.java +++ b/src/com/owncloud/android/datamodel/ThumbnailsCacheManager.java @@ -24,6 +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 @@ 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; @@ -176,8 +180,20 @@ public class ThumbnailsCacheManager { if (mFile instanceof OCFile) { thumbnail = doOCFileInBackground(); + + if (((OCFile) mFile).isVideo()){ + thumbnail = addVideoOverlay(thumbnail); + } } else if (mFile instanceof File) { thumbnail = doFileInBackground(); + + String url = ((File) mFile).getAbsolutePath(); + FileNameMap fileNameMap = URLConnection.getFileNameMap(); + String mMimeType = fileNameMap.getContentTypeFor("file://" + url); + + if (mMimeType != null && mMimeType.startsWith("video/")){ + thumbnail = addVideoOverlay(thumbnail); + } //} else { do nothing } @@ -362,6 +378,51 @@ public class ThumbnailsCacheManager { 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 bitmapWorkerTaskReference; diff --git a/src/com/owncloud/android/ui/adapter/FileListListAdapter.java b/src/com/owncloud/android/ui/adapter/FileListListAdapter.java index 33fa57fd..5c0e8e8c 100644 --- a/src/com/owncloud/android/ui/adapter/FileListListAdapter.java +++ b/src/com/owncloud/android/ui/adapter/FileListListAdapter.java @@ -30,6 +30,9 @@ import android.accounts.Account; import android.content.Context; import android.content.SharedPreferences; import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.Canvas; +import android.graphics.Paint; import android.os.Build; import android.preference.PreferenceManager; import android.text.format.DateUtils; @@ -293,13 +296,19 @@ public class FileListListAdapter extends BaseAdapter implements ListAdapter { // No Folder if (!file.isFolder()) { - if (file.isImage() && file.getRemoteId() != null){ + if ((file.isImage() || file.isVideo()) && file.getRemoteId() != null){ // Thumbnail in Cache? Bitmap thumbnail = ThumbnailsCacheManager.getBitmapFromDiskCache( String.valueOf(file.getRemoteId()) ); if (thumbnail != null && !file.needsUpdateThumbnail()){ - fileIcon.setImageBitmap(thumbnail); + + if (file.isVideo()) { + Bitmap withOverlay = ThumbnailsCacheManager.addVideoOverlay(thumbnail); + fileIcon.setImageBitmap(withOverlay); + } else { + fileIcon.setImageBitmap(thumbnail); + } } else { // generate new Thumbnail if (ThumbnailsCacheManager.cancelPotentialWork(file, fileIcon)) { @@ -308,12 +317,15 @@ public class FileListListAdapter extends BaseAdapter implements ListAdapter { fileIcon, mStorageManager, mAccount ); if (thumbnail == null) { - thumbnail = ThumbnailsCacheManager.mDefaultImg; +// thumbnail = ThumbnailsCacheManager.mDefaultImg; + Integer id = DisplayUtils.getFileTypeIconId(file.getMimetype(), + file.getFileName()); + thumbnail = BitmapFactory.decodeResource(mContext.getResources(), id); } final ThumbnailsCacheManager.AsyncDrawable asyncDrawable = new ThumbnailsCacheManager.AsyncDrawable( - mContext.getResources(), - thumbnail, + mContext.getResources(), + thumbnail, task ); fileIcon.setImageDrawable(asyncDrawable); diff --git a/src/com/owncloud/android/ui/fragment/OCFileListFragment.java b/src/com/owncloud/android/ui/fragment/OCFileListFragment.java index 47d99925..5dfb329d 100644 --- a/src/com/owncloud/android/ui/fragment/OCFileListFragment.java +++ b/src/com/owncloud/android/ui/fragment/OCFileListFragment.java @@ -429,7 +429,7 @@ public class OCFileListFragment extends ExtendedListFragment { foldersCount++; } else { filesCount++; - if (file.isImage()){ + if (file.isImage() || file.isVideo()){ imagesCount++; } } @@ -445,6 +445,7 @@ public class OCFileListFragment extends ExtendedListFragment { switchToGridView(); } else { switchToListView(); +// switchToGridView(); } } }