From 16561ab53fba7813fe45ae7ad5b54ad18c8a92ce Mon Sep 17 00:00:00 2001 From: A117870935 Date: Wed, 12 Apr 2023 20:28:31 +0530 Subject: [PATCH] Filtering only folders and showing them as per NMC-2893 Task Update UnifiedSearchFragment.kt. Commit id: 4fb3fb3 from branch bug/NMC-1652. NMC-2140: Tinting removed for folder and file icons and not overlaying icon for folders. --- .../client/media/NextcloudExoPlayer.kt | 4 +++- .../java/com/nextcloud/utils/ShortcutUtil.kt | 8 +++++-- .../com/nmc/android/utils/KeyboardUtils.java | 21 ++++++++++++++++++ .../android/media/MediaControlView.kt | 2 ++ .../android/ui/activity/EditorWebView.java | 6 +++-- .../ui/activity/FileDisplayActivity.kt | 3 +++ .../ReceiveExternalFilesActivity.java | 5 +++++ .../android/ui/activity/ShareActivity.java | 5 +++-- .../ui/adapter/ReceiveExternalFilesAdapter.kt | 6 ++--- .../ui/fragment/OCFileListFragment.java | 6 +++-- .../ui/fragment/UnifiedSearchFragment.kt | 4 ++++ .../owncloud/android/utils/DisplayUtils.java | 5 ++--- .../owncloud/android/utils/MimeTypeUtil.java | 22 +++++-------------- 13 files changed, 65 insertions(+), 32 deletions(-) create mode 100644 app/src/main/java/com/nmc/android/utils/KeyboardUtils.java diff --git a/app/src/main/java/com/nextcloud/client/media/NextcloudExoPlayer.kt b/app/src/main/java/com/nextcloud/client/media/NextcloudExoPlayer.kt index 283f4e56ba04..443164a53efb 100644 --- a/app/src/main/java/com/nextcloud/client/media/NextcloudExoPlayer.kt +++ b/app/src/main/java/com/nextcloud/client/media/NextcloudExoPlayer.kt @@ -42,7 +42,9 @@ object NextcloudExoPlayer { .setMediaSourceFactory(mediaSourceFactory) .setAudioAttributes(AudioAttributes.DEFAULT, true) .setHandleAudioBecomingNoisy(true) - .setSeekForwardIncrementMs(FIVE_SECONDS_IN_MILLIS) + // NMC-3192 Fix + .setSeekBackIncrementMs(2 * FIVE_SECONDS_IN_MILLIS) + .setSeekForwardIncrementMs(2 * FIVE_SECONDS_IN_MILLIS) .build() } } diff --git a/app/src/main/java/com/nextcloud/utils/ShortcutUtil.kt b/app/src/main/java/com/nextcloud/utils/ShortcutUtil.kt index f0800cc1402d..2da43746116c 100644 --- a/app/src/main/java/com/nextcloud/utils/ShortcutUtil.kt +++ b/app/src/main/java/com/nextcloud/utils/ShortcutUtil.kt @@ -15,6 +15,7 @@ import android.content.Intent import android.graphics.Bitmap import android.graphics.Canvas import android.graphics.drawable.Drawable +import androidx.core.content.ContextCompat import androidx.core.content.pm.ShortcutInfoCompat import androidx.core.content.pm.ShortcutManagerCompat import androidx.core.graphics.createBitmap @@ -60,10 +61,13 @@ class ShortcutUtil @Inject constructor(private val mContext: Context) { icon = IconCompat.createWithAdaptiveBitmap(thumbnail) } else if (file.isFolder) { val isAutoUploadFolder = SyncedFolderProvider.isAutoUploadFolder(syncedFolderProvider, file, user) - val isDarkModeActive = syncedFolderProvider.preferences.isDarkModeEnabled val overlayIconId = file.getFileOverlayIconId(isAutoUploadFolder) - val drawable = MimeTypeUtil.getFolderIcon(isDarkModeActive, overlayIconId, mContext, viewThemeUtils) + // NMC Customization: No overlay icon will be used. Directly using folder icons + val drawable = ContextCompat.getDrawable(mContext, overlayIconId) ?: MimeTypeUtil.getDefaultFolderIcon( + mContext, + viewThemeUtils + ) val bitmapIcon = drawable.toBitmap() icon = IconCompat.createWithBitmap(bitmapIcon) } else { diff --git a/app/src/main/java/com/nmc/android/utils/KeyboardUtils.java b/app/src/main/java/com/nmc/android/utils/KeyboardUtils.java new file mode 100644 index 000000000000..ec43ac2dd3a8 --- /dev/null +++ b/app/src/main/java/com/nmc/android/utils/KeyboardUtils.java @@ -0,0 +1,21 @@ +package com.nmc.android.utils; + +import android.app.Activity; +import android.content.Context; +import android.view.View; +import android.view.inputmethod.InputMethodManager; + +public class KeyboardUtils { + + public static void showSoftKeyboard(Context context, View view) { + view.requestFocus(); + InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE); + imm.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT); + } + + public static void hideKeyboardFrom(Context context, View view) { + view.clearFocus(); + InputMethodManager imm = (InputMethodManager) context.getSystemService(Activity.INPUT_METHOD_SERVICE); + imm.hideSoftInputFromWindow(view.getWindowToken(), 0); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/owncloud/android/media/MediaControlView.kt b/app/src/main/java/com/owncloud/android/media/MediaControlView.kt index 217c1c153501..e787a3404570 100644 --- a/app/src/main/java/com/owncloud/android/media/MediaControlView.kt +++ b/app/src/main/java/com/owncloud/android/media/MediaControlView.kt @@ -351,5 +351,7 @@ class MediaControlView(context: Context, attrs: AttributeSet?) : companion object { private val TAG = MediaControlView::class.java.getSimpleName() private const val SHOW_PROGRESS = 1 + // NMC-3192 Fix + private const val FIVE_SECONDS_IN_MILLIS = 5000 } } diff --git a/app/src/main/java/com/owncloud/android/ui/activity/EditorWebView.java b/app/src/main/java/com/owncloud/android/ui/activity/EditorWebView.java index 132957c36b87..a08cecf64de5 100644 --- a/app/src/main/java/com/owncloud/android/ui/activity/EditorWebView.java +++ b/app/src/main/java/com/owncloud/android/ui/activity/EditorWebView.java @@ -43,6 +43,8 @@ import javax.inject.Inject; +import androidx.core.content.ContextCompat; + public abstract class EditorWebView extends ExternalSiteWebView { public static final int REQUEST_LOCAL_FILE = 101; public ValueCallback uploadMessage; @@ -254,8 +256,8 @@ protected void setThumbnailView(final User user) { boolean isAutoUploadFolder = SyncedFolderProvider.isAutoUploadFolder(syncedFolderProvider, file, user); Integer overlayIconId = file.getFileOverlayIconId(isAutoUploadFolder); - LayerDrawable drawable = MimeTypeUtil.getFolderIcon(preferences.isDarkModeEnabled(), overlayIconId, this, viewThemeUtils); - binding.thumbnail.setImageDrawable(drawable); + // NMC Customization: No overlay icon will be used. Directly using folder icons + binding.thumbnail.setImageDrawable(ContextCompat.getDrawable(this, overlayIconId)); } else { if ((MimeTypeUtil.isImage(file) || MimeTypeUtil.isVideo(file)) && file.getRemoteId() != null) { // Thumbnail in cache? diff --git a/app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt b/app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt index 87ef694000b3..b341a7c35e6e 100644 --- a/app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt +++ b/app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt @@ -84,6 +84,7 @@ import com.nextcloud.utils.extensions.lastFragment import com.nextcloud.utils.extensions.logFileSize import com.nextcloud.utils.fileNameValidator.FileNameValidator.checkFolderPath import com.nextcloud.utils.view.FastScrollUtils +import com.nmc.android.utils.KeyboardUtils import com.owncloud.android.MainApp import com.owncloud.android.R import com.owncloud.android.databinding.FilesBinding @@ -1218,6 +1219,8 @@ class FileDisplayActivity : private fun popBack() { binding.fabMain.setImageResource(R.drawable.ic_plus) resetScrolling(true) + // NMC: hide the keyboard on back press if showing + KeyboardUtils.hideKeyboardFrom(this, binding.root) showSortListGroup(false) super.onBackPressed() } diff --git a/app/src/main/java/com/owncloud/android/ui/activity/ReceiveExternalFilesActivity.java b/app/src/main/java/com/owncloud/android/ui/activity/ReceiveExternalFilesActivity.java index c9b4be929b4d..d2aacdd09b68 100755 --- a/app/src/main/java/com/owncloud/android/ui/activity/ReceiveExternalFilesActivity.java +++ b/app/src/main/java/com/owncloud/android/ui/activity/ReceiveExternalFilesActivity.java @@ -100,6 +100,7 @@ import java.util.Stack; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; +import java.util.stream.Collectors; import javax.inject.Inject; @@ -770,6 +771,10 @@ private void populateDirectoryList(OCFile file) { List files = getStorageManager().getFolderContent(mFile, false); + // NMC-2893 Task + // Filtering and showing only files which are folder + files = files.stream().filter(OCFile::isFolder).collect(Collectors.toList()); + if (files.isEmpty()) { setMessageForEmptyList(R.string.file_list_empty_headline, R.string.empty, R.drawable.uploads); diff --git a/app/src/main/java/com/owncloud/android/ui/activity/ShareActivity.java b/app/src/main/java/com/owncloud/android/ui/activity/ShareActivity.java index 3c6b724e553f..2419696f677a 100644 --- a/app/src/main/java/com/owncloud/android/ui/activity/ShareActivity.java +++ b/app/src/main/java/com/owncloud/android/ui/activity/ShareActivity.java @@ -39,6 +39,7 @@ import javax.inject.Inject; +import androidx.core.content.ContextCompat; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentTransaction; @@ -73,8 +74,8 @@ protected void onCreate(Bundle savedInstanceState) { boolean isAutoUploadFolder = SyncedFolderProvider.isAutoUploadFolder(syncedFolderProvider, file, optionalUser.get()); Integer overlayIconId = file.getFileOverlayIconId(isAutoUploadFolder); - LayerDrawable drawable = MimeTypeUtil.getFolderIcon(preferences.isDarkModeEnabled(), overlayIconId, this, viewThemeUtils); - binding.shareFileIcon.setImageDrawable(drawable); + // NMC Customization: No overlay icon will be used. Directly using folder icons + binding.shareFileIcon.setImageDrawable(ContextCompat.getDrawable(this, overlayIconId)); } else { binding.shareFileIcon.setImageDrawable(MimeTypeUtil.getFileTypeIcon(file.getMimeType(), file.getFileName(), diff --git a/app/src/main/java/com/owncloud/android/ui/adapter/ReceiveExternalFilesAdapter.kt b/app/src/main/java/com/owncloud/android/ui/adapter/ReceiveExternalFilesAdapter.kt index 12736f80f651..4ba839809bcd 100644 --- a/app/src/main/java/com/owncloud/android/ui/adapter/ReceiveExternalFilesAdapter.kt +++ b/app/src/main/java/com/owncloud/android/ui/adapter/ReceiveExternalFilesAdapter.kt @@ -13,6 +13,7 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.ImageView +import androidx.core.content.ContextCompat import androidx.recyclerview.widget.RecyclerView import com.nextcloud.client.account.User import com.owncloud.android.databinding.UploaderListItemLayoutBinding @@ -113,10 +114,9 @@ class ReceiveExternalFilesAdapter( private fun setupThumbnailForFolder(thumbnailImageView: ImageView, file: OCFile) { val isAutoUploadFolder = SyncedFolderProvider.isAutoUploadFolder(syncedFolderProvider, file, user) - val isDarkModeActive = syncedFolderProvider.preferences.isDarkModeEnabled val overlayIconId = file.getFileOverlayIconId(isAutoUploadFolder) - val icon = MimeTypeUtil.getFolderIcon(isDarkModeActive, overlayIconId, context, viewThemeUtils) - thumbnailImageView.setImageDrawable(icon) + // NMC Customization: No overlay icon will be used. Directly using folder icons + thumbnailImageView.setImageDrawable(ContextCompat.getDrawable(context, overlayIconId)) } @Suppress("NestedBlockDepth") diff --git a/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java b/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java index ace98a65ca44..a302930433c2 100644 --- a/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java +++ b/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java @@ -1934,9 +1934,11 @@ protected void handleSearchEvent(SearchEvent event) { } else if (!isGridViewPreferred(mFile) && isGridEnabled()) { switchToListView(); } - }; - updateSortButton(); + // NMC-4749 fix + // move the ui operation inside runnable to execute it on Main Thread + updateSortButton(); + }; new Handler(Looper.getMainLooper()).post(switchViewsRunnable); diff --git a/app/src/main/java/com/owncloud/android/ui/fragment/UnifiedSearchFragment.kt b/app/src/main/java/com/owncloud/android/ui/fragment/UnifiedSearchFragment.kt index 6089e78466cf..6c719b9b7244 100644 --- a/app/src/main/java/com/owncloud/android/ui/fragment/UnifiedSearchFragment.kt +++ b/app/src/main/java/com/owncloud/android/ui/fragment/UnifiedSearchFragment.kt @@ -33,6 +33,7 @@ import com.nextcloud.client.account.UserAccountManager import com.nextcloud.client.core.AsyncRunner import com.nextcloud.client.di.Injectable import com.nextcloud.client.di.ViewModelFactory +import com.nmc.android.utils.KeyboardUtils import com.nextcloud.client.network.ClientFactory import com.nextcloud.utils.extensions.typedActivity import com.owncloud.android.R @@ -325,6 +326,8 @@ class UnifiedSearchFragment : private fun showFile(file: OCFile, showFileActions: Boolean) { activity.let { if (activity is FileDisplayActivity) { + // NMC: hide keyboard when user taps on any file to view + KeyboardUtils.hideKeyboardFrom(requireContext(), binding.root) val fda = activity as FileDisplayActivity fda.file = file @@ -386,6 +389,7 @@ class UnifiedSearchFragment : } override fun onQueryTextSubmit(query: String): Boolean { + KeyboardUtils.hideKeyboardFrom(requireContext(), binding.root) vm.setQuery(query) vm.initialQuery() return true diff --git a/app/src/main/java/com/owncloud/android/utils/DisplayUtils.java b/app/src/main/java/com/owncloud/android/utils/DisplayUtils.java index 795bd439c35e..cce37b2d5f6e 100644 --- a/app/src/main/java/com/owncloud/android/utils/DisplayUtils.java +++ b/app/src/main/java/com/owncloud/android/utils/DisplayUtils.java @@ -863,11 +863,10 @@ private static void setThumbnailForFolder(OCFile file, ImageView thumbnailView, stopShimmer(shimmerThumbnail, thumbnailView); boolean isAutoUploadFolder = SyncedFolderProvider.isAutoUploadFolder(syncedFolderProvider, file, user); - boolean isDarkModeActive = preferences.isDarkModeEnabled(); final var overlayIconId = file.getFileOverlayIconId(isAutoUploadFolder); - final var fileIcon = MimeTypeUtil.getFolderIcon(isDarkModeActive, overlayIconId, context, viewThemeUtils); - thumbnailView.setImageDrawable(fileIcon); + // NMC Customization: No overlay icon will be used. Directly using folder icons + thumbnailView.setImageDrawable(ContextCompat.getDrawable(context, overlayIconId)); } private static void setThumbnailFromCache(OCFile file, ImageView thumbnailView, FileDataStorageManager storageManager, List asyncTasks, boolean gridView, LoaderImageView shimmerThumbnail, User user, AppPreferences preferences, Context context, ViewThemeUtils viewThemeUtils) { diff --git a/app/src/main/java/com/owncloud/android/utils/MimeTypeUtil.java b/app/src/main/java/com/owncloud/android/utils/MimeTypeUtil.java index 5e9493f67190..32e4691ed013 100644 --- a/app/src/main/java/com/owncloud/android/utils/MimeTypeUtil.java +++ b/app/src/main/java/com/owncloud/android/utils/MimeTypeUtil.java @@ -16,7 +16,6 @@ import android.net.Uri; import android.webkit.MimeTypeMap; -import com.nextcloud.android.common.ui.theme.utils.ColorRole; import com.owncloud.android.R; import com.owncloud.android.datamodel.OCFile; import com.owncloud.android.lib.resources.files.model.ServerFileInterface; @@ -94,16 +93,8 @@ public static Drawable getFileTypeIcon(String mimetype, ViewThemeUtils viewThemeUtils) { if (context != null) { int iconId = MimeTypeUtil.getFileTypeIconId(mimetype, filename); - Drawable icon = ContextCompat.getDrawable(context, iconId); - if (icon == null) { - return null; - } - - if (R.drawable.file_zip == iconId) { - viewThemeUtils.platform.tintDrawable(context, icon, ColorRole.PRIMARY); - } - - return icon; + //NMC Customization + return ContextCompat.getDrawable(context, iconId); } else { return null; } @@ -117,11 +108,6 @@ public static Drawable getIcon(String localPath, Context context, ViewThemeUtils int iconId = determineIconIdByMimeTypeList(possibleMimeTypes); Drawable result = ContextCompat.getDrawable(context, iconId); - if (result == null) return null; - - if (R.drawable.file_zip == iconId) { - viewThemeUtils.platform.tintDrawable(context, result, ColorRole.PRIMARY); - } return result; } @@ -148,10 +134,12 @@ public static Drawable getDefaultFolderIcon(Context context, ViewThemeUtils view Drawable drawable = ContextCompat.getDrawable(context, R.drawable.folder); assert(drawable != null); - viewThemeUtils.platform.tintDrawable(context, drawable, ColorRole.PRIMARY); return drawable; } + // NMC Note: This funtion won't be used in NMC as we are using different folder icons with inbuilt overlay. So this function is of no use for us. + // changed access to PRIVATE, in case if NC will use this function in more areas then we will get compile error which can be fixed by us + // so that UI won't be impacted. public static LayerDrawable getFolderIcon(boolean isDarkModeActive, Integer overlayIconId, Context context, ViewThemeUtils viewThemeUtils) { Drawable folderDrawable = getDefaultFolderIcon(context, viewThemeUtils); assert(folderDrawable != null);