From 6a3be12ba301f59eba0517e0b7634adbeb6e34a5 Mon Sep 17 00:00:00 2001 From: Christian Wiwie Date: Tue, 25 Feb 2020 14:40:09 +0100 Subject: [PATCH 01/12] 3175: initial commit for home screen shortcuts --- src/main/AndroidManifest.xml | 4 +- .../ui/activity/FileDisplayActivity.java | 16 +++++ .../ui/fragment/OCFileListFragment.java | 4 ++ .../ui/helpers/FileOperationsHelper.java | 61 +++++++++++++++++++ .../owncloud/android/utils/MimeTypeUtil.java | 9 ++- src/main/res/menu/item_file.xml | 6 ++ 6 files changed, 98 insertions(+), 2 deletions(-) diff --git a/src/main/AndroidManifest.xml b/src/main/AndroidManifest.xml index 4edba5c5e1c1..fd2b53f214f7 100644 --- a/src/main/AndroidManifest.xml +++ b/src/main/AndroidManifest.xml @@ -111,12 +111,14 @@ android:theme="@style/Theme.ownCloud.Launcher"> - + + + diff --git a/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java b/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java index 7815fa40e2e4..bdde1b2eee24 100644 --- a/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java @@ -163,6 +163,7 @@ public class FileDisplayActivity extends FileActivity public static final String RESTART = "RESTART"; public static final String ALL_FILES = "ALL_FILES"; public static final String PHOTO_SEARCH = "PHOTO_SEARCH"; + public static final String OPEN_FILE = "NC_OPEN_FILE"; private SyncBroadcastReceiver mSyncBroadcastReceiver; private UploadFinishReceiver mUploadFinishReceiver; @@ -329,6 +330,10 @@ public void onClick(View v) { upgradeNotificationForInstantUpload(); checkOutdatedServer(); + + if (OPEN_FILE.equals(getIntent().getAction())) { + onOpenFileIntent(getIntent()); + } } private Activity getActivity() { @@ -511,6 +516,8 @@ protected void onNewIntent(Intent intent) { showDetails(file); } else if (Intent.ACTION_VIEW.equals(intent.getAction())) { handleOpenFileViaIntent(intent); + } else if (OPEN_FILE.equals(intent.getAction())) { + onOpenFileIntent(intent); } else if (RESTART.equals(intent.getAction())) { finish(); startActivity(intent); @@ -568,6 +575,15 @@ protected void onNewIntent(Intent intent) { } } + private void onOpenFileIntent(Intent intent) { + String extra = intent.getStringExtra(EXTRA_FILE); + OCFile file = getStorageManager().getFileByPath(extra); + + getSupportFragmentManager().executePendingTransactions(); + OCFileListFragment fileListFragment = getListOfFilesFragment(); + fileListFragment.onItemClicked(file); + } + private void doShareWith(String shareeName, ShareType shareType) { getFileOperationsHelper().shareFileWithSharee(getFile(), shareeName, shareType, getAppropriatePermissions(shareType)); diff --git a/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java b/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java index 5d255e9bf659..d6708d1f56d3 100644 --- a/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java +++ b/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java @@ -1109,6 +1109,10 @@ public boolean onFileActionChosen(MenuItem item, Set checkedFiles) { mContainerActivity.getFileOperationsHelper().toggleEncryption(singleFile, false); return true; } + case R.id.action_add_shortcut_to_desktop: { + mContainerActivity.getFileOperationsHelper().addShortcutToDesktop(singleFile); + return true; + } } } diff --git a/src/main/java/com/owncloud/android/ui/helpers/FileOperationsHelper.java b/src/main/java/com/owncloud/android/ui/helpers/FileOperationsHelper.java index 79097e48add7..6364c36d9748 100755 --- a/src/main/java/com/owncloud/android/ui/helpers/FileOperationsHelper.java +++ b/src/main/java/com/owncloud/android/ui/helpers/FileOperationsHelper.java @@ -29,12 +29,16 @@ import android.Manifest; import android.accounts.Account; import android.app.Activity; +import android.app.PendingIntent; import android.content.ActivityNotFoundException; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; +import android.content.pm.ShortcutInfo; +import android.content.pm.ShortcutManager; +import android.graphics.drawable.Icon; import android.net.Uri; import android.os.Build; import android.os.Environment; @@ -68,6 +72,7 @@ import com.owncloud.android.ui.activity.ConflictsResolveActivity; import com.owncloud.android.ui.activity.ExternalSiteWebView; import com.owncloud.android.ui.activity.FileActivity; +import com.owncloud.android.ui.activity.FileDisplayActivity; import com.owncloud.android.ui.activity.RichDocumentsEditorWebView; import com.owncloud.android.ui.activity.ShareActivity; import com.owncloud.android.ui.activity.TextEditorWebView; @@ -77,6 +82,7 @@ import com.owncloud.android.ui.events.SyncEventFinished; import com.owncloud.android.utils.DisplayUtils; import com.owncloud.android.utils.FileStorageUtils; +import com.owncloud.android.utils.MimeTypeUtil; import com.owncloud.android.utils.PermissionUtil; import com.owncloud.android.utils.UriUtils; @@ -1028,6 +1034,61 @@ private void deleteOldFiles(Activity activity) { } } + public void addShortcutToDesktop(OCFile file) { + ShortcutManager shortcutManager = fileActivity.getSystemService(ShortcutManager.class); + + final Intent intent = new Intent(fileActivity, FileDisplayActivity.class); + intent.setAction(FileDisplayActivity.OPEN_FILE); + //intent.putExtra(FileDisplayActivity.KEY_FILE_ID, file.getRemoteId()); + intent.putExtra(FileActivity.EXTRA_FILE, file.getRemotePath()); + intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); + + final String shortcutId = "nextcloud_shortcut_" + file.getRemoteId(); + + int iconId; + if (file.isFolder()) { + iconId = MimeTypeUtil.getFolderTypeIconId(file.isSharedWithMe() || + file.isSharedWithSharee(), file.isSharedViaLink(), file.isEncrypted(), file.getMountType()); + } else { + iconId = MimeTypeUtil.getFileTypeIconId(file.getMimeType(), file.getFileName()); + } + + ShortcutInfo shortcut = new ShortcutInfo.Builder(fileActivity, shortcutId) + .setShortLabel(file.getFileName()) + .setLongLabel("Open " + file.getFileName()) + .setIcon(Icon.createWithResource(fileActivity, iconId)) + .setIntent(intent) + .build(); + + shortcutManager.addDynamicShortcuts(Arrays.asList(shortcut)); + + + if (shortcutManager.isRequestPinShortcutSupported()) { + // Assumes there's already a shortcut with the ID "my-shortcut". + // The shortcut must be enabled. + ShortcutInfo pinShortcutInfo = + new ShortcutInfo.Builder(fileActivity, shortcutId).build(); + + // Create the PendingIntent object only if your app needs to be notified + // that the user allowed the shortcut to be pinned. Note that, if the + // pinning operation fails, your app isn't notified. We assume here that the + // app has implemented a method called createShortcutResultIntent() that + // returns a broadcast intent. + Intent pinnedShortcutCallbackIntent = + shortcutManager.createShortcutResultIntent(pinShortcutInfo); + + // Configure the intent so that your app's broadcast receiver gets + // the callback successfully.For details, see PendingIntent.getBroadcast(). + PendingIntent successCallback = PendingIntent.getBroadcast(fileActivity, /* request code */ 0, + pinnedShortcutCallbackIntent, /* flags */ 0); + + shortcutManager.requestPinShortcut(pinShortcutInfo, + successCallback.getIntentSender()); + } + + + } + public static File createImageFile(Activity activity) { File storageDir = activity.getExternalFilesDir(Environment.DIRECTORY_PICTURES); diff --git a/src/main/java/com/owncloud/android/utils/MimeTypeUtil.java b/src/main/java/com/owncloud/android/utils/MimeTypeUtil.java index 969ed3058921..5cc9f46a2583 100644 --- a/src/main/java/com/owncloud/android/utils/MimeTypeUtil.java +++ b/src/main/java/com/owncloud/android/utils/MimeTypeUtil.java @@ -161,6 +161,13 @@ public static Drawable getFolderTypeIcon(boolean isSharedViaUsers, boolean isSha public static Drawable getFolderTypeIcon(boolean isSharedViaUsers, boolean isSharedViaLink, boolean isEncrypted, Account account, WebdavEntry.MountType mountType, Context context) { + int drawableId = getFolderTypeIconId(isSharedViaUsers, isSharedViaLink, isEncrypted, mountType); + + return ThemeUtils.tintDrawable(drawableId, ThemeUtils.elementColor(account, context)); + } + + public static int getFolderTypeIconId(boolean isSharedViaUsers, boolean isSharedViaLink, + boolean isEncrypted, WebdavEntry.MountType mountType) { int drawableId; if (isSharedViaLink) { @@ -177,7 +184,7 @@ public static Drawable getFolderTypeIcon(boolean isSharedViaUsers, boolean isSha drawableId = R.drawable.folder; } - return ThemeUtils.tintDrawable(drawableId, ThemeUtils.elementColor(account, context)); + return drawableId; } public static Drawable getDefaultFolderIcon(Context context) { diff --git a/src/main/res/menu/item_file.xml b/src/main/res/menu/item_file.xml index 26a5e3ee7675..5e2d4cfbadc1 100644 --- a/src/main/res/menu/item_file.xml +++ b/src/main/res/menu/item_file.xml @@ -137,4 +137,10 @@ app:showAsAction="never" android:showAsAction="never" /> + + From fb1eed2c7b7cd0f6914d14cff8da569fef16fd5c Mon Sep 17 00:00:00 2001 From: Christian Wiwie Date: Tue, 25 Feb 2020 21:51:34 +0100 Subject: [PATCH 02/12] 3175: creating pinned shortcuts without using dynamic shortcuts to avoid running into shortcut limit --- .../ui/helpers/FileOperationsHelper.java | 29 +++++-------------- 1 file changed, 7 insertions(+), 22 deletions(-) diff --git a/src/main/java/com/owncloud/android/ui/helpers/FileOperationsHelper.java b/src/main/java/com/owncloud/android/ui/helpers/FileOperationsHelper.java index 6364c36d9748..7da4724e301d 100755 --- a/src/main/java/com/owncloud/android/ui/helpers/FileOperationsHelper.java +++ b/src/main/java/com/owncloud/android/ui/helpers/FileOperationsHelper.java @@ -1053,32 +1053,17 @@ public void addShortcutToDesktop(OCFile file) { iconId = MimeTypeUtil.getFileTypeIconId(file.getMimeType(), file.getFileName()); } - ShortcutInfo shortcut = new ShortcutInfo.Builder(fileActivity, shortcutId) - .setShortLabel(file.getFileName()) - .setLongLabel("Open " + file.getFileName()) - .setIcon(Icon.createWithResource(fileActivity, iconId)) - .setIntent(intent) - .build(); - - shortcutManager.addDynamicShortcuts(Arrays.asList(shortcut)); - - if (shortcutManager.isRequestPinShortcutSupported()) { - // Assumes there's already a shortcut with the ID "my-shortcut". - // The shortcut must be enabled. - ShortcutInfo pinShortcutInfo = - new ShortcutInfo.Builder(fileActivity, shortcutId).build(); - - // Create the PendingIntent object only if your app needs to be notified - // that the user allowed the shortcut to be pinned. Note that, if the - // pinning operation fails, your app isn't notified. We assume here that the - // app has implemented a method called createShortcutResultIntent() that - // returns a broadcast intent. + ShortcutInfo pinShortcutInfo = new ShortcutInfo.Builder(fileActivity, shortcutId) + .setShortLabel(file.getFileName()) + .setLongLabel("Open " + file.getFileName()) + .setIcon(Icon.createWithResource(fileActivity, iconId)) + .setIntent(intent) + .build(); + Intent pinnedShortcutCallbackIntent = shortcutManager.createShortcutResultIntent(pinShortcutInfo); - // Configure the intent so that your app's broadcast receiver gets - // the callback successfully.For details, see PendingIntent.getBroadcast(). PendingIntent successCallback = PendingIntent.getBroadcast(fileActivity, /* request code */ 0, pinnedShortcutCallbackIntent, /* flags */ 0); From fb99107a1062f3930d3a9a6e8cd37085775403c0 Mon Sep 17 00:00:00 2001 From: Christian Wiwie Date: Tue, 25 Feb 2020 22:42:21 +0100 Subject: [PATCH 03/12] 3175: using Intent.FLAG_ACTIVITY_CLEAR_TOP --- .../com/owncloud/android/ui/helpers/FileOperationsHelper.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/owncloud/android/ui/helpers/FileOperationsHelper.java b/src/main/java/com/owncloud/android/ui/helpers/FileOperationsHelper.java index 7da4724e301d..d233a8961fa8 100755 --- a/src/main/java/com/owncloud/android/ui/helpers/FileOperationsHelper.java +++ b/src/main/java/com/owncloud/android/ui/helpers/FileOperationsHelper.java @@ -1041,7 +1041,7 @@ public void addShortcutToDesktop(OCFile file) { intent.setAction(FileDisplayActivity.OPEN_FILE); //intent.putExtra(FileDisplayActivity.KEY_FILE_ID, file.getRemoteId()); intent.putExtra(FileActivity.EXTRA_FILE, file.getRemotePath()); - intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); final String shortcutId = "nextcloud_shortcut_" + file.getRemoteId(); From 68c600d252d494d2b895af406aa733bc489103a9 Mon Sep 17 00:00:00 2001 From: Christian Wiwie Date: Tue, 25 Feb 2020 23:51:00 +0100 Subject: [PATCH 04/12] #3175: added resource string --- src/main/res/menu/item_file.xml | 2 +- src/main/res/values-de/strings.xml | 1 + src/main/res/values/strings.xml | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/res/menu/item_file.xml b/src/main/res/menu/item_file.xml index 5e2d4cfbadc1..f6a7bfc8e85c 100644 --- a/src/main/res/menu/item_file.xml +++ b/src/main/res/menu/item_file.xml @@ -139,7 +139,7 @@ diff --git a/src/main/res/values-de/strings.xml b/src/main/res/values-de/strings.xml index 59d32acaca5a..81909b13a371 100644 --- a/src/main/res/values-de/strings.xml +++ b/src/main/res/values-de/strings.xml @@ -803,6 +803,7 @@ Was-gibt\'s-Neues-Bild Überspringen Neu in %1$s + Zum Startbildschirm hinzufügen Inhalte von %1$d Datei konnten nicht synchronisiert werden (Konflikte: %2$d) Inhalte von %1$d Dateien konnten nicht synchronisiert werden (Konflikte: %2$d) diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml index a8f3d431c62f..bd75ce3f2df0 100644 --- a/src/main/res/values/strings.xml +++ b/src/main/res/values/strings.xml @@ -920,6 +920,7 @@ Delete Create new %1$s %2$s + Add to home screen Choose what to sync Free up space From a3b3a9d95a170f573144099b3a538dc269b473d0 Mon Sep 17 00:00:00 2001 From: Christian Wiwie Date: Wed, 26 Feb 2020 09:11:05 +0100 Subject: [PATCH 05/12] 3175: only creating icon if pinning is supported --- .../ui/helpers/FileOperationsHelper.java | 39 +++++++++---------- 1 file changed, 19 insertions(+), 20 deletions(-) diff --git a/src/main/java/com/owncloud/android/ui/helpers/FileOperationsHelper.java b/src/main/java/com/owncloud/android/ui/helpers/FileOperationsHelper.java index d233a8961fa8..3ae717788d3b 100755 --- a/src/main/java/com/owncloud/android/ui/helpers/FileOperationsHelper.java +++ b/src/main/java/com/owncloud/android/ui/helpers/FileOperationsHelper.java @@ -1034,38 +1034,37 @@ private void deleteOldFiles(Activity activity) { } } - public void addShortcutToDesktop(OCFile file) { - ShortcutManager shortcutManager = fileActivity.getSystemService(ShortcutManager.class); + public void addShortcutToHomescreen(OCFile file) { + final ShortcutManager shortcutManager = fileActivity.getSystemService(ShortcutManager.class); - final Intent intent = new Intent(fileActivity, FileDisplayActivity.class); - intent.setAction(FileDisplayActivity.OPEN_FILE); - //intent.putExtra(FileDisplayActivity.KEY_FILE_ID, file.getRemoteId()); - intent.putExtra(FileActivity.EXTRA_FILE, file.getRemotePath()); - intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); + if (shortcutManager.isRequestPinShortcutSupported()) { + final Intent intent = new Intent(fileActivity, FileDisplayActivity.class); + intent.setAction(FileDisplayActivity.OPEN_FILE); + intent.putExtra(FileActivity.EXTRA_FILE, file.getRemotePath()); + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); - final String shortcutId = "nextcloud_shortcut_" + file.getRemoteId(); + final String shortcutId = "nextcloud_shortcut_" + file.getRemoteId(); - int iconId; - if (file.isFolder()) { - iconId = MimeTypeUtil.getFolderTypeIconId(file.isSharedWithMe() || - file.isSharedWithSharee(), file.isSharedViaLink(), file.isEncrypted(), file.getMountType()); - } else { - iconId = MimeTypeUtil.getFileTypeIconId(file.getMimeType(), file.getFileName()); - } + int iconId; + if (file.isFolder()) { + iconId = MimeTypeUtil.getFolderTypeIconId(file.isSharedWithMe() || + file.isSharedWithSharee(), file.isSharedViaLink(), file.isEncrypted(), file.getMountType()); + } else { + iconId = MimeTypeUtil.getFileTypeIconId(file.getMimeType(), file.getFileName()); + } - if (shortcutManager.isRequestPinShortcutSupported()) { - ShortcutInfo pinShortcutInfo = new ShortcutInfo.Builder(fileActivity, shortcutId) + final ShortcutInfo pinShortcutInfo = new ShortcutInfo.Builder(fileActivity, shortcutId) .setShortLabel(file.getFileName()) .setLongLabel("Open " + file.getFileName()) .setIcon(Icon.createWithResource(fileActivity, iconId)) .setIntent(intent) .build(); - Intent pinnedShortcutCallbackIntent = + final Intent pinnedShortcutCallbackIntent = shortcutManager.createShortcutResultIntent(pinShortcutInfo); - PendingIntent successCallback = PendingIntent.getBroadcast(fileActivity, /* request code */ 0, - pinnedShortcutCallbackIntent, /* flags */ 0); + final PendingIntent successCallback = PendingIntent.getBroadcast(fileActivity,0, + pinnedShortcutCallbackIntent,0); shortcutManager.requestPinShortcut(pinShortcutInfo, successCallback.getIntentSender()); From 9e3e8332b31306dd2af73d4758fed42588433c91 Mon Sep 17 00:00:00 2001 From: Christian Wiwie Date: Wed, 26 Feb 2020 09:12:39 +0100 Subject: [PATCH 06/12] 3175: terminology fix; desktop -> homescreen --- .../com/owncloud/android/ui/fragment/OCFileListFragment.java | 4 ++-- src/main/res/menu/item_file.xml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java b/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java index d6708d1f56d3..1e40f391363e 100644 --- a/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java +++ b/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java @@ -1109,8 +1109,8 @@ public boolean onFileActionChosen(MenuItem item, Set checkedFiles) { mContainerActivity.getFileOperationsHelper().toggleEncryption(singleFile, false); return true; } - case R.id.action_add_shortcut_to_desktop: { - mContainerActivity.getFileOperationsHelper().addShortcutToDesktop(singleFile); + case R.id.action_add_shortcut_to_homescreen: { + mContainerActivity.getFileOperationsHelper().addShortcutToHomescreen(singleFile); return true; } } diff --git a/src/main/res/menu/item_file.xml b/src/main/res/menu/item_file.xml index f6a7bfc8e85c..04068ade273c 100644 --- a/src/main/res/menu/item_file.xml +++ b/src/main/res/menu/item_file.xml @@ -138,7 +138,7 @@ android:showAsAction="never" /> From 2193572759bda05b2f7750174c1b8768d5d71669 Mon Sep 17 00:00:00 2001 From: Christian Wiwie Date: Wed, 26 Feb 2020 09:14:05 +0100 Subject: [PATCH 07/12] 3175: only invoking executePendingTransactions() when it is necessary --- .../com/owncloud/android/ui/activity/FileDisplayActivity.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java b/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java index bdde1b2eee24..cb9619ccbf38 100644 --- a/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java @@ -332,6 +332,7 @@ public void onClick(View v) { checkOutdatedServer(); if (OPEN_FILE.equals(getIntent().getAction())) { + getSupportFragmentManager().executePendingTransactions(); onOpenFileIntent(getIntent()); } } @@ -579,7 +580,6 @@ private void onOpenFileIntent(Intent intent) { String extra = intent.getStringExtra(EXTRA_FILE); OCFile file = getStorageManager().getFileByPath(extra); - getSupportFragmentManager().executePendingTransactions(); OCFileListFragment fileListFragment = getListOfFilesFragment(); fileListFragment.onItemClicked(file); } From 48fe28f0f79f31ecb3b74c2972b0152259ce4ea8 Mon Sep 17 00:00:00 2001 From: Christian Wiwie Date: Wed, 26 Feb 2020 09:16:55 +0100 Subject: [PATCH 08/12] 3175: added javadoc --- .../owncloud/android/ui/helpers/FileOperationsHelper.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/com/owncloud/android/ui/helpers/FileOperationsHelper.java b/src/main/java/com/owncloud/android/ui/helpers/FileOperationsHelper.java index 3ae717788d3b..ddbe5aa7dfb8 100755 --- a/src/main/java/com/owncloud/android/ui/helpers/FileOperationsHelper.java +++ b/src/main/java/com/owncloud/android/ui/helpers/FileOperationsHelper.java @@ -1034,6 +1034,11 @@ private void deleteOldFiles(Activity activity) { } } + /** + * Adds a pinned shortcut to the home screen that points to the passed file/folder. + * + * @param file The file/folder to which a pinned shortcut should be added to the home screen. + */ public void addShortcutToHomescreen(OCFile file) { final ShortcutManager shortcutManager = fileActivity.getSystemService(ShortcutManager.class); From 5c5f4df179d396c812cd46d92ab2c33257510d65 Mon Sep 17 00:00:00 2001 From: Christian Wiwie Date: Wed, 26 Feb 2020 13:27:31 +0100 Subject: [PATCH 09/12] 3175: using thumbnails of files as icons for pinned shortcuts --- .../ui/helpers/FileOperationsHelperTest.java | 4 ++ .../ui/helpers/FileOperationsHelper.java | 42 ++++++++++++++++--- 2 files changed, 40 insertions(+), 6 deletions(-) create mode 100644 src/androidTest/java/com/owncloud/android/ui/helpers/FileOperationsHelperTest.java diff --git a/src/androidTest/java/com/owncloud/android/ui/helpers/FileOperationsHelperTest.java b/src/androidTest/java/com/owncloud/android/ui/helpers/FileOperationsHelperTest.java new file mode 100644 index 000000000000..0137fbc9a10e --- /dev/null +++ b/src/androidTest/java/com/owncloud/android/ui/helpers/FileOperationsHelperTest.java @@ -0,0 +1,4 @@ +package com.owncloud.android.ui.helpers; + +public class FileOperationsHelperTest { +} diff --git a/src/main/java/com/owncloud/android/ui/helpers/FileOperationsHelper.java b/src/main/java/com/owncloud/android/ui/helpers/FileOperationsHelper.java index ddbe5aa7dfb8..fce3b92e1474 100755 --- a/src/main/java/com/owncloud/android/ui/helpers/FileOperationsHelper.java +++ b/src/main/java/com/owncloud/android/ui/helpers/FileOperationsHelper.java @@ -38,6 +38,14 @@ import android.content.pm.ResolveInfo; import android.content.pm.ShortcutInfo; import android.content.pm.ShortcutManager; +import android.graphics.Bitmap; +import android.graphics.Canvas; +import android.graphics.Paint; +import android.graphics.PorterDuff; +import android.graphics.PorterDuffXfermode; +import android.graphics.Rect; +import android.graphics.drawable.BitmapDrawable; +import android.graphics.drawable.Drawable; import android.graphics.drawable.Icon; import android.net.Uri; import android.os.Build; @@ -57,6 +65,7 @@ import com.owncloud.android.R; import com.owncloud.android.datamodel.FileDataStorageManager; import com.owncloud.android.datamodel.OCFile; +import com.owncloud.android.datamodel.ThumbnailsCacheManager; import com.owncloud.android.files.StreamMediaFileOperation; import com.owncloud.android.files.services.FileDownloader.FileDownloaderBinder; import com.owncloud.android.files.services.FileUploader.FileUploaderBinder; @@ -1050,18 +1059,26 @@ public void addShortcutToHomescreen(OCFile file) { final String shortcutId = "nextcloud_shortcut_" + file.getRemoteId(); - int iconId; - if (file.isFolder()) { - iconId = MimeTypeUtil.getFolderTypeIconId(file.isSharedWithMe() || - file.isSharedWithSharee(), file.isSharedViaLink(), file.isEncrypted(), file.getMountType()); + Icon icon; + + Bitmap thumbnail = ThumbnailsCacheManager.getBitmapFromDiskCache( + ThumbnailsCacheManager.PREFIX_THUMBNAIL + file.getRemoteId()); + if (thumbnail != null) { + thumbnail = bitmapToAdaptiveBitmap(thumbnail, fileActivity); + icon = Icon.createWithAdaptiveBitmap(thumbnail); + } else if (file.isFolder()) { + icon = Icon.createWithResource(fileActivity, + MimeTypeUtil.getFolderTypeIconId(file.isSharedWithMe() || + file.isSharedWithSharee(), file.isSharedViaLink(), file.isEncrypted(), file.getMountType())); } else { - iconId = MimeTypeUtil.getFileTypeIconId(file.getMimeType(), file.getFileName()); + icon = Icon.createWithResource(fileActivity, + MimeTypeUtil.getFileTypeIconId(file.getMimeType(), file.getFileName())); } final ShortcutInfo pinShortcutInfo = new ShortcutInfo.Builder(fileActivity, shortcutId) .setShortLabel(file.getFileName()) .setLongLabel("Open " + file.getFileName()) - .setIcon(Icon.createWithResource(fileActivity, iconId)) + .setIcon(icon) .setIntent(intent) .build(); @@ -1074,8 +1091,21 @@ public void addShortcutToHomescreen(OCFile file) { shortcutManager.requestPinShortcut(pinShortcutInfo, successCallback.getIntentSender()); } + } + + private static Bitmap bitmapToAdaptiveBitmap(final Bitmap orig, final Context context) { + final float screenDensity = context.getResources().getDisplayMetrics().density; + final int adaptiveIconSize = Math.round(108 * screenDensity); + final int adaptiveIconOuterSides = Math.round(18 * screenDensity); + Drawable drawable = new BitmapDrawable(context.getResources(), orig); + final Bitmap bitmap = Bitmap.createBitmap(adaptiveIconSize, adaptiveIconSize, Bitmap.Config.ARGB_8888); + final Canvas canvas = new Canvas(bitmap); + drawable.setBounds(adaptiveIconOuterSides, adaptiveIconOuterSides, adaptiveIconSize - adaptiveIconOuterSides, + adaptiveIconSize - adaptiveIconOuterSides); + drawable.draw(canvas); + return bitmap; } public static File createImageFile(Activity activity) { From b454476760df5ca6acd4009c82c03650fb7dd182 Mon Sep 17 00:00:00 2001 From: Christian Wiwie Date: Wed, 26 Feb 2020 14:06:26 +0100 Subject: [PATCH 10/12] 3175: optimized imports --- .../ui/helpers/FileOperationsHelper.java | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/owncloud/android/ui/helpers/FileOperationsHelper.java b/src/main/java/com/owncloud/android/ui/helpers/FileOperationsHelper.java index fce3b92e1474..92acd1ec9e1c 100755 --- a/src/main/java/com/owncloud/android/ui/helpers/FileOperationsHelper.java +++ b/src/main/java/com/owncloud/android/ui/helpers/FileOperationsHelper.java @@ -40,10 +40,6 @@ import android.content.pm.ShortcutManager; import android.graphics.Bitmap; import android.graphics.Canvas; -import android.graphics.Paint; -import android.graphics.PorterDuff; -import android.graphics.PorterDuffXfermode; -import android.graphics.Rect; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.graphics.drawable.Icon; @@ -57,6 +53,13 @@ import android.view.View; import android.webkit.MimeTypeMap; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.annotation.RequiresApi; +import androidx.core.content.FileProvider; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentTransaction; + import com.evernote.android.job.JobRequest; import com.nextcloud.client.account.CurrentAccountProvider; import com.nextcloud.client.account.User; @@ -113,13 +116,6 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.annotation.RequiresApi; -import androidx.core.content.FileProvider; -import androidx.fragment.app.FragmentManager; -import androidx.fragment.app.FragmentTransaction; - /** * Helper implementation for file operations locally and remote. */ From eefda1ef5d3836411c27116694a47c55d0eb77f3 Mon Sep 17 00:00:00 2001 From: Christian Wiwie Date: Thu, 27 Feb 2020 10:26:50 +0100 Subject: [PATCH 11/12] 3175: hide menu items if pinned shortcuts not available --- .../ui/fragment/OCFileListFragment.java | 9 ++- .../ui/helpers/FileOperationsHelper.java | 76 ++++++++++--------- .../android/ui/helpers/MenuHelper.java | 26 +++++++ .../ui/preview/PreviewImageFragment.java | 3 +- .../ui/preview/PreviewMediaFragment.java | 3 +- .../ui/preview/PreviewTextFileFragment.java | 3 +- 6 files changed, 77 insertions(+), 43 deletions(-) create mode 100644 src/main/java/com/owncloud/android/ui/helpers/MenuHelper.java diff --git a/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java b/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java index 1e40f391363e..420ae3ba31b2 100644 --- a/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java +++ b/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java @@ -90,6 +90,7 @@ import com.owncloud.android.ui.events.FavoriteEvent; import com.owncloud.android.ui.events.SearchEvent; import com.owncloud.android.ui.helpers.FileOperationsHelper; +import com.owncloud.android.ui.helpers.MenuHelper; import com.owncloud.android.ui.interfaces.OCFileListFragmentInterface; import com.owncloud.android.ui.preview.PreviewImageFragment; import com.owncloud.android.ui.preview.PreviewMediaFragment; @@ -494,7 +495,7 @@ public void showActivityDetailView(OCFile file) { @Override public void onOverflowIconClicked(OCFile file, View view) { PopupMenu popup = new PopupMenu(getActivity(), view); - popup.inflate(R.menu.item_file); + MenuHelper.inflateItemFileMenu(popup.getMenuInflater(), popup.getMenu()); Account currentAccount = ((FileActivity) getActivity()).getAccount(); FileMenuFilter mf = new FileMenuFilter(mAdapter.getFiles().size(), Collections.singleton(file), @@ -630,7 +631,7 @@ public boolean onCreateActionMode(ActionMode mode, Menu menu) { mActiveActionMode = mode; MenuInflater inflater = getActivity().getMenuInflater(); - inflater.inflate(R.menu.item_file, menu); + MenuHelper.inflateItemFileMenu(inflater, menu); mode.invalidate(); //set gray color @@ -1110,7 +1111,9 @@ public boolean onFileActionChosen(MenuItem item, Set checkedFiles) { return true; } case R.id.action_add_shortcut_to_homescreen: { - mContainerActivity.getFileOperationsHelper().addShortcutToHomescreen(singleFile); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1) { + mContainerActivity.getFileOperationsHelper().addShortcutToHomescreen(singleFile); + } return true; } } diff --git a/src/main/java/com/owncloud/android/ui/helpers/FileOperationsHelper.java b/src/main/java/com/owncloud/android/ui/helpers/FileOperationsHelper.java index 92acd1ec9e1c..a900cf75c118 100755 --- a/src/main/java/com/owncloud/android/ui/helpers/FileOperationsHelper.java +++ b/src/main/java/com/owncloud/android/ui/helpers/FileOperationsHelper.java @@ -1045,47 +1045,49 @@ private void deleteOldFiles(Activity activity) { * @param file The file/folder to which a pinned shortcut should be added to the home screen. */ public void addShortcutToHomescreen(OCFile file) { - final ShortcutManager shortcutManager = fileActivity.getSystemService(ShortcutManager.class); - - if (shortcutManager.isRequestPinShortcutSupported()) { - final Intent intent = new Intent(fileActivity, FileDisplayActivity.class); - intent.setAction(FileDisplayActivity.OPEN_FILE); - intent.putExtra(FileActivity.EXTRA_FILE, file.getRemotePath()); - intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); - - final String shortcutId = "nextcloud_shortcut_" + file.getRemoteId(); - - Icon icon; - - Bitmap thumbnail = ThumbnailsCacheManager.getBitmapFromDiskCache( - ThumbnailsCacheManager.PREFIX_THUMBNAIL + file.getRemoteId()); - if (thumbnail != null) { - thumbnail = bitmapToAdaptiveBitmap(thumbnail, fileActivity); - icon = Icon.createWithAdaptiveBitmap(thumbnail); - } else if (file.isFolder()) { - icon = Icon.createWithResource(fileActivity, - MimeTypeUtil.getFolderTypeIconId(file.isSharedWithMe() || - file.isSharedWithSharee(), file.isSharedViaLink(), file.isEncrypted(), file.getMountType())); - } else { - icon = Icon.createWithResource(fileActivity, - MimeTypeUtil.getFileTypeIconId(file.getMimeType(), file.getFileName())); - } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + final ShortcutManager shortcutManager = fileActivity.getSystemService(ShortcutManager.class); + + if (shortcutManager.isRequestPinShortcutSupported()) { + final Intent intent = new Intent(fileActivity, FileDisplayActivity.class); + intent.setAction(FileDisplayActivity.OPEN_FILE); + intent.putExtra(FileActivity.EXTRA_FILE, file.getRemotePath()); + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); + + final String shortcutId = "nextcloud_shortcut_" + file.getRemoteId(); + + Icon icon; + + Bitmap thumbnail = ThumbnailsCacheManager.getBitmapFromDiskCache( + ThumbnailsCacheManager.PREFIX_THUMBNAIL + file.getRemoteId()); + if (thumbnail != null) { + thumbnail = bitmapToAdaptiveBitmap(thumbnail, fileActivity); + icon = Icon.createWithAdaptiveBitmap(thumbnail); + } else if (file.isFolder()) { + icon = Icon.createWithResource(fileActivity, + MimeTypeUtil.getFolderTypeIconId(file.isSharedWithMe() || + file.isSharedWithSharee(), file.isSharedViaLink(), file.isEncrypted(), file.getMountType())); + } else { + icon = Icon.createWithResource(fileActivity, + MimeTypeUtil.getFileTypeIconId(file.getMimeType(), file.getFileName())); + } - final ShortcutInfo pinShortcutInfo = new ShortcutInfo.Builder(fileActivity, shortcutId) - .setShortLabel(file.getFileName()) - .setLongLabel("Open " + file.getFileName()) - .setIcon(icon) - .setIntent(intent) - .build(); + final ShortcutInfo pinShortcutInfo = new ShortcutInfo.Builder(fileActivity, shortcutId) + .setShortLabel(file.getFileName()) + .setLongLabel("Open " + file.getFileName()) + .setIcon(icon) + .setIntent(intent) + .build(); - final Intent pinnedShortcutCallbackIntent = - shortcutManager.createShortcutResultIntent(pinShortcutInfo); + final Intent pinnedShortcutCallbackIntent = + shortcutManager.createShortcutResultIntent(pinShortcutInfo); - final PendingIntent successCallback = PendingIntent.getBroadcast(fileActivity,0, - pinnedShortcutCallbackIntent,0); + final PendingIntent successCallback = PendingIntent.getBroadcast(fileActivity, 0, + pinnedShortcutCallbackIntent, 0); - shortcutManager.requestPinShortcut(pinShortcutInfo, - successCallback.getIntentSender()); + shortcutManager.requestPinShortcut(pinShortcutInfo, + successCallback.getIntentSender()); + } } } diff --git a/src/main/java/com/owncloud/android/ui/helpers/MenuHelper.java b/src/main/java/com/owncloud/android/ui/helpers/MenuHelper.java new file mode 100644 index 000000000000..91e6acf09462 --- /dev/null +++ b/src/main/java/com/owncloud/android/ui/helpers/MenuHelper.java @@ -0,0 +1,26 @@ +package com.owncloud.android.ui.helpers; + +import android.os.Build; +import android.view.Menu; +import android.view.MenuInflater; + +import androidx.annotation.MenuRes; + +import com.owncloud.android.R; + +/** + * Collection of helper functions for handling menus. + */ +public class MenuHelper { + + /** + * Inflates the item file menu and handles menu items according to SDK version. + * + * @param inflater The inflater to use for inflation of the item file menu. + * @param menu The menu into which to inflate. + */ + public static void inflateItemFileMenu(final MenuInflater inflater, final Menu menu) { + inflater.inflate(R.menu.item_file, menu); + menu.findItem(R.id.action_add_shortcut_to_homescreen).setVisible(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O); + } +} diff --git a/src/main/java/com/owncloud/android/ui/preview/PreviewImageFragment.java b/src/main/java/com/owncloud/android/ui/preview/PreviewImageFragment.java index 9269460f4d79..69d058f77761 100644 --- a/src/main/java/com/owncloud/android/ui/preview/PreviewImageFragment.java +++ b/src/main/java/com/owncloud/android/ui/preview/PreviewImageFragment.java @@ -69,6 +69,7 @@ import com.owncloud.android.ui.dialog.ConfirmationDialogFragment; import com.owncloud.android.ui.dialog.RemoveFilesDialogFragment; import com.owncloud.android.ui.fragment.FileFragment; +import com.owncloud.android.ui.helpers.MenuHelper; import com.owncloud.android.utils.BitmapUtils; import com.owncloud.android.utils.DisplayUtils; import com.owncloud.android.utils.MimeType; @@ -322,7 +323,7 @@ public void onStop() { @Override public void onCreateOptionsMenu(@NotNull Menu menu, @NotNull MenuInflater inflater) { super.onCreateOptionsMenu(menu, inflater); - inflater.inflate(R.menu.item_file, menu); + MenuHelper.inflateItemFileMenu(inflater, menu); int nightModeFlag = getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK; diff --git a/src/main/java/com/owncloud/android/ui/preview/PreviewMediaFragment.java b/src/main/java/com/owncloud/android/ui/preview/PreviewMediaFragment.java index 5484f18895c8..ef4aaade88fe 100644 --- a/src/main/java/com/owncloud/android/ui/preview/PreviewMediaFragment.java +++ b/src/main/java/com/owncloud/android/ui/preview/PreviewMediaFragment.java @@ -72,6 +72,7 @@ import com.owncloud.android.ui.dialog.ConfirmationDialogFragment; import com.owncloud.android.ui.dialog.RemoveFilesDialogFragment; import com.owncloud.android.ui.fragment.FileFragment; +import com.owncloud.android.ui.helpers.MenuHelper; import com.owncloud.android.utils.MimeTypeUtil; import java.lang.ref.WeakReference; @@ -340,7 +341,7 @@ private void stopAudio() { public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { super.onCreateOptionsMenu(menu, inflater); menu.removeItem(R.id.action_search); - inflater.inflate(R.menu.item_file, menu); + MenuHelper.inflateItemFileMenu(inflater, menu); } @Override diff --git a/src/main/java/com/owncloud/android/ui/preview/PreviewTextFileFragment.java b/src/main/java/com/owncloud/android/ui/preview/PreviewTextFileFragment.java index cb899fb76bb6..5b8c9b480100 100644 --- a/src/main/java/com/owncloud/android/ui/preview/PreviewTextFileFragment.java +++ b/src/main/java/com/owncloud/android/ui/preview/PreviewTextFileFragment.java @@ -40,6 +40,7 @@ import com.owncloud.android.ui.activity.FileDisplayActivity; import com.owncloud.android.ui.dialog.ConfirmationDialogFragment; import com.owncloud.android.ui.dialog.RemoveFilesDialogFragment; +import com.owncloud.android.ui.helpers.MenuHelper; import com.owncloud.android.utils.DisplayUtils; import com.owncloud.android.utils.MimeTypeUtil; @@ -235,7 +236,7 @@ protected void onPostExecute(final StringWriter stringWriter) { @Override public void onCreateOptionsMenu(@NotNull Menu menu, @NotNull MenuInflater inflater) { super.onCreateOptionsMenu(menu, inflater); - inflater.inflate(R.menu.item_file, menu); + MenuHelper.inflateItemFileMenu(inflater, menu); MenuItem menuItem = menu.findItem(R.id.action_search); menuItem.setVisible(true); From 5b66ecaa76e453b98c3717da6a72fb15986dca81 Mon Sep 17 00:00:00 2001 From: Christian Wiwie Date: Thu, 27 Feb 2020 11:15:44 +0100 Subject: [PATCH 12/12] 3175: making MenuHelper utility class --- .../java/com/owncloud/android/ui/helpers/MenuHelper.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/owncloud/android/ui/helpers/MenuHelper.java b/src/main/java/com/owncloud/android/ui/helpers/MenuHelper.java index 91e6acf09462..3ce7771198a5 100644 --- a/src/main/java/com/owncloud/android/ui/helpers/MenuHelper.java +++ b/src/main/java/com/owncloud/android/ui/helpers/MenuHelper.java @@ -4,14 +4,16 @@ import android.view.Menu; import android.view.MenuInflater; -import androidx.annotation.MenuRes; - import com.owncloud.android.R; /** * Collection of helper functions for handling menus. */ -public class MenuHelper { +public final class MenuHelper { + + private MenuHelper() { + + } /** * Inflates the item file menu and handles menu items according to SDK version.