From 4aef38d98aa6c6a3bce6180bf37fc1293b164e1d Mon Sep 17 00:00:00 2001 From: A117870935 Date: Thu, 25 May 2023 16:20:08 +0530 Subject: [PATCH] Auto Upload behaviour customized. Fix scroll lagging for auto-upload files. (NMC-2589) NMC-2125: Upload file behaviour customized. --- .../preferences/AppPreferencesImpl.java | 3 +- .../datamodel/ThumbnailsCacheManager.java | 28 ++++++++++++-- .../ui/activity/UploadFilesActivity.java | 37 +++++++++++++++---- .../android/ui/adapter/SyncedFolderAdapter.kt | 16 ++++++-- .../LocalStoragePathPickerDialogFragment.kt | 8 ++-- .../dialog/parcel/SyncedFolderParcelable.java | 5 ++- app/src/main/res/values-de/strings.xml | 1 + app/src/main/res/values-sw600dp/dims.xml | 1 + app/src/main/res/values/attrs.xml | 6 ++- app/src/main/res/values/dims.xml | 1 + app/src/main/res/values/strings.xml | 1 + 11 files changed, 85 insertions(+), 22 deletions(-) diff --git a/app/src/main/java/com/nextcloud/client/preferences/AppPreferencesImpl.java b/app/src/main/java/com/nextcloud/client/preferences/AppPreferencesImpl.java index 709f368080d8..329572212267 100644 --- a/app/src/main/java/com/nextcloud/client/preferences/AppPreferencesImpl.java +++ b/app/src/main/java/com/nextcloud/client/preferences/AppPreferencesImpl.java @@ -477,7 +477,8 @@ public void setAutoUploadInit(boolean autoUploadInit) { @Override public int getUploaderBehaviour() { - return preferences.getInt(AUTO_PREF__UPLOADER_BEHAVIOR, 1); + // NMC Customization + return preferences.getInt(AUTO_PREF__UPLOADER_BEHAVIOR, 0); } @Override diff --git a/app/src/main/java/com/owncloud/android/datamodel/ThumbnailsCacheManager.java b/app/src/main/java/com/owncloud/android/datamodel/ThumbnailsCacheManager.java index 326817a9a4ac..7c3da9fcc233 100644 --- a/app/src/main/java/com/owncloud/android/datamodel/ThumbnailsCacheManager.java +++ b/app/src/main/java/com/owncloud/android/datamodel/ThumbnailsCacheManager.java @@ -75,6 +75,7 @@ import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; +import androidx.annotation.DimenRes; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; @@ -173,9 +174,19 @@ public static void initDiskCacheAsync() { * @return int */ public static int getThumbnailDimension() { + return getThumbnailDimension(R.dimen.file_icon_size_grid); + } + + /** + * Converts size of file icon from dp to pixel + * this function is required for custom thumbnail sizes + * @param thumbnailDimension dimension to be converted + * @return int + */ + public static int getThumbnailDimension(@DimenRes int thumbnailDimension) { // Converts dp to pixel Resources r = MainApp.getAppContext().getResources(); - return Math.round(r.getDimension(R.dimen.file_icon_size_grid)); + return Math.round(r.getDimension(thumbnailDimension)); } /** @@ -769,14 +780,25 @@ private enum Type {IMAGE, VIDEO} private String mImageKey; @SuppressLint("StaticFieldLeak") private final Context mContext; private final ViewThemeUtils viewThemeUtils; + @DimenRes + private final int thumbnailDimension; + + public MediaThumbnailGenerationTask(ImageView imageView, + Context context, + ViewThemeUtils viewThemeUtils) { + this(imageView, context, R.dimen.file_icon_size_grid, viewThemeUtils); + } + // constructor to generate thumbnails for the requested size public MediaThumbnailGenerationTask(ImageView imageView, Context context, + @DimenRes int thumbnailDimension, ViewThemeUtils viewThemeUtils) { // Use a WeakReference to ensure the ImageView can be garbage collected mImageViewReference = new WeakReference<>(imageView); mContext = context; this.viewThemeUtils = viewThemeUtils; + this.thumbnailDimension = thumbnailDimension; } @Override @@ -849,7 +871,7 @@ private Bitmap doFileInBackground(File file, Type type) { if (thumbnail == null) { if (Type.IMAGE == type) { - int px = getThumbnailDimension(); + int px = getThumbnailDimension(thumbnailDimension); Bitmap bitmap = BitmapUtils.decodeSampledBitmapFromFile(file.getAbsolutePath(), px, px); @@ -860,7 +882,7 @@ private Bitmap doFileInBackground(File file, Type type) { thumbnail = getThumbnailFromMediaRetriever(file); if (thumbnail != null) { // Scale down bitmap if too large. - int px = getThumbnailDimension(); + int px = getThumbnailDimension(thumbnailDimension); int width = thumbnail.getWidth(); int height = thumbnail.getHeight(); int max = Math.max(width, height); diff --git a/app/src/main/java/com/owncloud/android/ui/activity/UploadFilesActivity.java b/app/src/main/java/com/owncloud/android/ui/activity/UploadFilesActivity.java index 4280eac6bf6f..3ea779135ae4 100644 --- a/app/src/main/java/com/owncloud/android/ui/activity/UploadFilesActivity.java +++ b/app/src/main/java/com/owncloud/android/ui/activity/UploadFilesActivity.java @@ -205,8 +205,9 @@ public void onCreate(Bundle savedInstanceState) { // file upload spinner List behaviours = new ArrayList<>(); - behaviours.add(getString(R.string.uploader_upload_files_behaviour_move_to_nextcloud_folder, - themeUtils.getDefaultDisplayNameForRootFolder(this))); + // Not required this option for NMC + // behaviours.add(getString(R.string.uploader_upload_files_behaviour_move_to_nextcloud_folder, + // themeUtils.getDefaultDisplayNameForRootFolder(this))); behaviours.add(getString(R.string.uploader_upload_files_behaviour_only_upload)); behaviours.add(getString(R.string.uploader_upload_files_behaviour_upload_and_delete_from_source)); @@ -215,6 +216,19 @@ public void onCreate(Bundle savedInstanceState) { behaviourAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); binding.uploadFilesSpinnerBehaviour.setAdapter(behaviourAdapter); binding.uploadFilesSpinnerBehaviour.setSelection(localBehaviour); + // NMC Customization + binding.uploadFilesSpinnerBehaviour.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { + @Override + public void onItemSelected(AdapterView adapterView, View view, int i, long l) { + // store behaviour + preferences.setUploaderBehaviour(binding.uploadFilesSpinnerBehaviour.getSelectedItemPosition()); + } + + @Override + public void onNothingSelected(AdapterView adapterView) { + + } + }); // setup the toolbar setupToolbar(); @@ -275,7 +289,12 @@ public void showToolbarSpinner() { private void fillDirectoryDropdown() { File currentDir = mCurrentDir; while (currentDir != null && currentDir.getParentFile() != null) { - mDirectories.add(currentDir.getName()); + // NMC Customization + if (currentDir.getName().equals("0")) { + mDirectories.add(getResources().getString(R.string.storage_internal_storage)); + } else { + mDirectories.add(currentDir.getName()); + } currentDir = currentDir.getParentFile(); } mDirectories.add(File.separator); @@ -534,15 +553,16 @@ public void onCheckAvailableSpaceFinish(boolean hasEnoughSpaceAvailable, String. // set result code switch (binding.uploadFilesSpinnerBehaviour.getSelectedItemPosition()) { - case 0: // move to nextcloud folder + // Not required for NMC + /*case 0: // move to nextcloud folder setResult(RESULT_OK_AND_MOVE, data); - break; + break;*/ - case 1: // only upload + case 0: // only upload setResult(RESULT_OK_AND_DO_NOTHING, data); break; - case 2: // upload and delete from source + case 1: // upload and delete from source setResult(RESULT_OK_AND_DELETE, data); break; @@ -608,7 +628,8 @@ private void checkWritableFolder(File folder) { int localBehaviour = preferences.getUploaderBehaviour(); binding.uploadFilesSpinnerBehaviour.setSelection(localBehaviour); } else { - binding.uploadFilesSpinnerBehaviour.setSelection(1); + // NMC Customization: default select 0 + binding.uploadFilesSpinnerBehaviour.setSelection(0); textView.setText(new StringBuilder().append(getString(R.string.uploader_upload_files_behaviour)) .append(' ') .append(getString(R.string.uploader_upload_files_behaviour_not_writable)) diff --git a/app/src/main/java/com/owncloud/android/ui/adapter/SyncedFolderAdapter.kt b/app/src/main/java/com/owncloud/android/ui/adapter/SyncedFolderAdapter.kt index 67b92725c408..6cb332c3ced1 100644 --- a/app/src/main/java/com/owncloud/android/ui/adapter/SyncedFolderAdapter.kt +++ b/app/src/main/java/com/owncloud/android/ui/adapter/SyncedFolderAdapter.kt @@ -18,10 +18,10 @@ import androidx.annotation.VisibleForTesting import androidx.core.content.ContextCompat import androidx.core.view.isVisible import androidx.lifecycle.LifecycleCoroutineScope +import androidx.core.content.res.ResourcesCompat import com.afollestad.sectionedrecyclerview.SectionedRecyclerViewAdapter import com.afollestad.sectionedrecyclerview.SectionedViewHolder import com.google.android.material.button.MaterialButton -import com.nextcloud.android.common.ui.theme.utils.ColorRole import com.nextcloud.client.core.Clock import com.nextcloud.client.device.PowerManagementService import com.nextcloud.client.network.ConnectivityService @@ -433,6 +433,9 @@ class SyncedFolderAdapter( MediaThumbnailGenerationTask( holder.binding.thumbnail, context, + // due to 512dp(NMC) thumb size there was scroll lagging in auto upload + // so for auto upload we have to use different thumb size (NMC-2589) + R.dimen.auto_upload_file_thumb_size, viewThemeUtils ) @@ -541,8 +544,15 @@ class SyncedFolderAdapter( private fun setSyncButtonActiveIcon(syncStatusButton: MaterialButton, enabled: Boolean) { if (enabled) { - syncStatusButton.icon = - viewThemeUtils.platform.tintDrawable(context, R.drawable.ic_cloud_sync_on, ColorRole.PRIMARY) + // NMC Customization theme color icon + val drawable = ResourcesCompat.getDrawable(context.resources, R.drawable.ic_cloud_sync_on, null) + drawable?.let { + syncStatusButton.icon = + viewThemeUtils.platform.colorDrawable( + it, + ResourcesCompat.getColor(context.resources, R.color.primary, null) + ) + } } else { syncStatusButton.icon = ContextCompat.getDrawable(context, R.drawable.ic_cloud_sync_off) } diff --git a/app/src/main/java/com/owncloud/android/ui/dialog/LocalStoragePathPickerDialogFragment.kt b/app/src/main/java/com/owncloud/android/ui/dialog/LocalStoragePathPickerDialogFragment.kt index a186f0c3c435..8d407eb54e4e 100644 --- a/app/src/main/java/com/owncloud/android/ui/dialog/LocalStoragePathPickerDialogFragment.kt +++ b/app/src/main/java/com/owncloud/android/ui/dialog/LocalStoragePathPickerDialogFragment.kt @@ -86,12 +86,14 @@ class LocalStoragePathPickerDialogFragment : Environment.getExternalStoragePublicDirectory(standardDirectory.name).absolutePath ) } - val sdCard = getString(R.string.storage_internal_storage) for (dir in FileStorageUtils.getStorageDirectories(requireActivity())) { + // NMC Customisation if (internalStoragePaths.contains(dir)) { - addIfExists(storagePathItems, R.drawable.ic_sd_grey600, sdCard, dir) + val internalStorage = getString(R.string.storage_internal_storage) + addIfExists(storagePathItems, R.drawable.ic_sd_grey600, internalStorage, dir) } else { - addIfExists(storagePathItems, R.drawable.ic_sd_grey600, File(dir).name, dir) + val sdCard = getString(R.string.storage_sd_card) + addIfExists(storagePathItems, R.drawable.ic_sd, sdCard, dir) } } return storagePathItems diff --git a/app/src/main/java/com/owncloud/android/ui/dialog/parcel/SyncedFolderParcelable.java b/app/src/main/java/com/owncloud/android/ui/dialog/parcel/SyncedFolderParcelable.java index 5e64943f31b4..cdcc285236db 100644 --- a/app/src/main/java/com/owncloud/android/ui/dialog/parcel/SyncedFolderParcelable.java +++ b/app/src/main/java/com/owncloud/android/ui/dialog/parcel/SyncedFolderParcelable.java @@ -126,8 +126,9 @@ public int describeContents() { public Integer getUploadActionInteger() { return switch (uploadAction) { case FileUploadWorker.LOCAL_BEHAVIOUR_FORGET -> 0; - case FileUploadWorker.LOCAL_BEHAVIOUR_MOVE -> 1; - case FileUploadWorker.LOCAL_BEHAVIOUR_DELETE -> 2; + // NMC customization: No required move + // case FileUploadWorker.LOCAL_BEHAVIOUR_MOVE -> 1; + case FileUploadWorker.LOCAL_BEHAVIOUR_DELETE -> 1; default -> 0; }; } diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 576b1f29753d..0bb44b4c73e0 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -1301,6 +1301,7 @@ E-Mail senden Speicherordner existiert nicht! Ursache könnte die Wiederherstellung einer Sicherungskopie auf einem anderen Gerät sein. Der Standard-Ordner wird jetzt wieder verwendet. Bitte überprüfen Sie die Einstellungen bezüglich des Speicherortes. + SD-Karte %1$d Element — %2$s %1$d Elemente — %2$s diff --git a/app/src/main/res/values-sw600dp/dims.xml b/app/src/main/res/values-sw600dp/dims.xml index 7436d593a3c5..0d67561d21f4 100644 --- a/app/src/main/res/values-sw600dp/dims.xml +++ b/app/src/main/res/values-sw600dp/dims.xml @@ -9,4 +9,5 @@ 6 512dp + 512dp diff --git a/app/src/main/res/values/attrs.xml b/app/src/main/res/values/attrs.xml index 8641f4e9de73..036e7277b9d5 100644 --- a/app/src/main/res/values/attrs.xml +++ b/app/src/main/res/values/attrs.xml @@ -9,13 +9,15 @@ @string/pref_behaviour_entries_keep_file - @string/pref_behaviour_entries_move + + @string/pref_behaviour_entries_delete_file LOCAL_BEHAVIOUR_FORGET - LOCAL_BEHAVIOUR_MOVE + + LOCAL_BEHAVIOUR_DELETE diff --git a/app/src/main/res/values/dims.xml b/app/src/main/res/values/dims.xml index 5e8e56a0f69a..ed0a51a4aab2 100644 --- a/app/src/main/res/values/dims.xml +++ b/app/src/main/res/values/dims.xml @@ -133,6 +133,7 @@ 24dp -3dp 80dp + 128dp 16sp 18sp 24dp diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 62321a715267..e7162606c56b 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1381,6 +1381,7 @@ Delete Link Settings Confirm + SD Card Destination filename Suggest Enter destination filename