From 32696d67511ef968c5530308828bb22c92716e63 Mon Sep 17 00:00:00 2001 From: A117870935 Date: Sun, 14 May 2023 23:02:09 +0530 Subject: [PATCH] NMC-2045: Customized popup menu, overflow menu and FastScroller. NMC-2049: Customized Spinner. --- .../ui/activity/UploadFilesActivity.kt | 5 + .../uploadfiles/UploadBehaviourSelector.kt | 14 ++- .../android/ui/adapter/SyncedFolderAdapter.kt | 5 +- .../adapter/uploadList/UploadListAdapter.kt | 13 ++- .../android/ui/fragment/GalleryFragment.kt | 9 +- .../ui/fragment/OCFileListFragment.java | 3 +- .../ui/preview/media/PreviewMediaFragment.kt | 3 +- .../preview/media/PreviewPlaybackFragment.kt | 2 +- .../android/ui/trashbin/TrashbinFragment.kt | 8 +- .../theme/FilesSpecificViewThemeUtils.kt | 14 ++- .../main/res/color/spinner_color_state.xml | 5 + app/src/main/res/drawable/bg_spinner.xml | 9 ++ .../main/res/layout/simple_spinner_item.xml | 10 ++ .../main/res/layout/upload_files_layout.xml | 1 + app/src/main/res/values-night/nmc_colors.xml | 73 ++++++++++++++ app/src/main/res/values/nmc_colors.xml | 98 +++++++++++++++++++ app/src/main/res/values/nmc_popup_styles.xml | 16 +++ .../main/res/values/nmc_spinner_styles.xml | 8 ++ app/src/main/res/values/styles.xml | 6 +- 19 files changed, 283 insertions(+), 19 deletions(-) create mode 100644 app/src/main/res/color/spinner_color_state.xml create mode 100644 app/src/main/res/drawable/bg_spinner.xml create mode 100644 app/src/main/res/layout/simple_spinner_item.xml create mode 100644 app/src/main/res/values-night/nmc_colors.xml create mode 100644 app/src/main/res/values/nmc_colors.xml create mode 100644 app/src/main/res/values/nmc_popup_styles.xml create mode 100644 app/src/main/res/values/nmc_spinner_styles.xml diff --git a/app/src/main/java/com/owncloud/android/ui/activity/UploadFilesActivity.kt b/app/src/main/java/com/owncloud/android/ui/activity/UploadFilesActivity.kt index a951b9304fe9..d641f7c9a027 100644 --- a/app/src/main/java/com/owncloud/android/ui/activity/UploadFilesActivity.kt +++ b/app/src/main/java/com/owncloud/android/ui/activity/UploadFilesActivity.kt @@ -18,6 +18,7 @@ import android.accounts.Account import android.annotation.SuppressLint import android.app.Activity import android.content.Intent +import android.graphics.Color import android.os.Bundle import android.os.Environment import android.view.Menu @@ -28,6 +29,8 @@ import android.widget.AdapterView import android.widget.ArrayAdapter import androidx.activity.OnBackPressedCallback import androidx.appcompat.widget.SearchView +import androidx.core.graphics.BlendModeColorFilterCompat +import androidx.core.graphics.BlendModeCompat import androidx.core.view.MenuProvider import com.nextcloud.android.common.ui.theme.utils.ColorRole import com.nextcloud.client.account.User @@ -245,6 +248,8 @@ class UploadFilesActivity : private fun setupToolbarSpinner() { mToolbarSpinner.visibility = View.VISIBLE mToolbarSpinner.adapter = directories + mToolbarSpinner.background.colorFilter = + BlendModeColorFilterCompat.createBlendModeColorFilterCompat(Color.TRANSPARENT, BlendModeCompat.SRC_IN) mToolbarSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { override fun onItemSelected(parent: AdapterView<*>, view: View, position: Int, id: Long) { repeat(position) { onBackPressedDispatcher.onBackPressed() } diff --git a/app/src/main/java/com/owncloud/android/ui/activity/uploadfiles/UploadBehaviourSelector.kt b/app/src/main/java/com/owncloud/android/ui/activity/uploadfiles/UploadBehaviourSelector.kt index b81558580f0e..91cfbe984a69 100644 --- a/app/src/main/java/com/owncloud/android/ui/activity/uploadfiles/UploadBehaviourSelector.kt +++ b/app/src/main/java/com/owncloud/android/ui/activity/uploadfiles/UploadBehaviourSelector.kt @@ -8,6 +8,8 @@ package com.owncloud.android.ui.activity.uploadfiles import android.widget.ArrayAdapter import androidx.appcompat.app.AppCompatActivity +import androidx.core.content.ContextCompat +import androidx.core.graphics.drawable.DrawableCompat import com.nextcloud.client.preferences.AppPreferences import com.owncloud.android.R import com.owncloud.android.databinding.UploadFilesLayoutBinding @@ -40,9 +42,19 @@ class UploadBehaviourSelector( activity.getString(R.string.uploader_upload_files_behaviour_upload_and_delete_from_source) ) - spinner.adapter = ArrayAdapter(activity, android.R.layout.simple_spinner_item, behaviours).apply { + // custom spinner item layout for NMC + spinner.adapter = ArrayAdapter(activity, R.layout.simple_spinner_item, behaviours).apply { setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item) } + + // NMC Customization for dropdown icon tinting + val background = DrawableCompat.wrap(spinner.background).mutate() + DrawableCompat.setTintList( + background, + ContextCompat.getColorStateList(activity, R.color.spinner_color_state) + ) + spinner.background = background + spinner.setSelection(preferences.uploaderBehaviour) } 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 63e953b3425d..963fadfc45cc 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 @@ -14,6 +14,7 @@ import android.view.MenuItem import android.view.View import android.view.ViewGroup import android.widget.PopupMenu +import androidx.appcompat.view.ContextThemeWrapper import androidx.annotation.VisibleForTesting import androidx.core.content.ContextCompat import androidx.core.view.isVisible @@ -374,7 +375,9 @@ class SyncedFolderAdapter( } private fun onOverflowIconClicked(section: Int, item: SyncedFolderDisplayItem, view: View) { - val popup = PopupMenu(context, view).apply { + // NMC Customisation + val ctw = ContextThemeWrapper(context, R.style.CustomPopupTheme) + val popup = PopupMenu(ctw, view).apply { inflate(R.menu.synced_folders_adapter) setOnMenuItemClickListener { i: MenuItem -> optionsItemSelected(i, section, item) } menu diff --git a/app/src/main/java/com/owncloud/android/ui/adapter/uploadList/UploadListAdapter.kt b/app/src/main/java/com/owncloud/android/ui/adapter/uploadList/UploadListAdapter.kt index 71ea3dfa7906..4730d42de4e0 100644 --- a/app/src/main/java/com/owncloud/android/ui/adapter/uploadList/UploadListAdapter.kt +++ b/app/src/main/java/com/owncloud/android/ui/adapter/uploadList/UploadListAdapter.kt @@ -15,6 +15,7 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.PopupMenu +import androidx.appcompat.view.ContextThemeWrapper import androidx.lifecycle.lifecycleScope import com.afollestad.sectionedrecyclerview.SectionedRecyclerViewAdapter import com.afollestad.sectionedrecyclerview.SectionedViewHolder @@ -174,7 +175,9 @@ class UploadListAdapter( } private fun showFailedPopupMenu(holder: HeaderViewHolder) { - PopupMenu(activity, holder.binding.uploadListAction).apply { + // NMC Customisation + val ctw = ContextThemeWrapper(activity, R.style.CustomPopupTheme) + PopupMenu(ctw, holder.binding.uploadListAction).apply { inflate(R.menu.upload_list_failed_options) setOnMenuItemClickListener { item -> when (item.itemId) { @@ -199,7 +202,9 @@ class UploadListAdapter( } private fun showCancelledPopupMenu(holder: HeaderViewHolder) { - PopupMenu(activity, holder.binding.uploadListAction).apply { + // NMC Customisation + val ctw = ContextThemeWrapper(activity, R.style.CustomPopupTheme) + PopupMenu(ctw, holder.binding.uploadListAction).apply { inflate(R.menu.upload_list_cancelled_options) setOnMenuItemClickListener { item -> when (item.itemId) { @@ -519,7 +524,9 @@ class UploadListAdapter( override fun onBindFooterViewHolder(holder: SectionedViewHolder?, section: Int) = Unit private fun showItemConflictPopup(item: OCUpload, view: View) { - PopupMenu(activity, view).apply { + // NMC Customisation + val ctw = ContextThemeWrapper(activity, R.style.CustomPopupTheme) + PopupMenu(ctw, view).apply { inflate(R.menu.upload_list_item_file_conflict) setOnMenuItemClickListener { menuItem -> if (menuItem.itemId == R.id.action_upload_list_resolve_conflict) { diff --git a/app/src/main/java/com/owncloud/android/ui/fragment/GalleryFragment.kt b/app/src/main/java/com/owncloud/android/ui/fragment/GalleryFragment.kt index b7f9be66a458..c0546f75342e 100644 --- a/app/src/main/java/com/owncloud/android/ui/fragment/GalleryFragment.kt +++ b/app/src/main/java/com/owncloud/android/ui/fragment/GalleryFragment.kt @@ -26,6 +26,7 @@ import android.view.ScaleGestureDetector import android.view.View import android.view.ViewGroup import androidx.activity.result.contract.ActivityResultContracts +import androidx.core.content.ContextCompat import androidx.core.view.MenuHost import androidx.core.view.MenuProvider import androidx.lifecycle.Lifecycle @@ -121,7 +122,13 @@ class GalleryFragment : override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) { menuInflater.inflate(R.menu.fragment_gallery_three_dots, menu) val menuItem = menu.findItem(R.id.action_three_dot_icon) - viewThemeUtils.platform.colorMenuItemText(requireContext(), menuItem) + // NMC customization + menuItem.icon = menuItem.icon?.let { + viewThemeUtils.platform.colorDrawable( + it, + ContextCompat.getColor(requireContext(), R.color.fontAppbar) + ) + } } override fun onMenuItemSelected(menuItem: MenuItem): Boolean { 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 e1fdf9a331a5..1eae6448c552 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 @@ -921,7 +921,8 @@ public boolean onCreateActionMode(ActionMode mode, Menu menu) { final MenuItem item = menu.findItem(R.id.custom_menu_placeholder_item); if (item.getIcon() != null) { - item.setIcon(viewThemeUtils.platform.colorDrawable(item.getIcon(), ContextCompat.getColor(requireContext(), R.color.white))); + // NMC customization + item.setIcon(viewThemeUtils.platform.colorDrawable(item.getIcon(), ContextCompat.getColor(requireContext(), R.color.fontAppbar))); } mActiveActionMode.invalidate(); diff --git a/app/src/main/java/com/owncloud/android/ui/preview/media/PreviewMediaFragment.kt b/app/src/main/java/com/owncloud/android/ui/preview/media/PreviewMediaFragment.kt index 7acbfab9cedf..8aa2c8771f1b 100644 --- a/app/src/main/java/com/owncloud/android/ui/preview/media/PreviewMediaFragment.kt +++ b/app/src/main/java/com/owncloud/android/ui/preview/media/PreviewMediaFragment.kt @@ -341,10 +341,11 @@ class PreviewMediaFragment : val item = menu.findItem(R.id.custom_menu_placeholder_item) item.icon?.let { + // NMC customization item.setIcon( viewThemeUtils.platform.colorDrawable( it, - ContextCompat.getColor(requireContext(), R.color.white) + ContextCompat.getColor(requireContext(), R.color.fontAppbar) ) ) } diff --git a/app/src/main/java/com/owncloud/android/ui/preview/media/PreviewPlaybackFragment.kt b/app/src/main/java/com/owncloud/android/ui/preview/media/PreviewPlaybackFragment.kt index 1f38e0d939d5..d21f33ff5918 100644 --- a/app/src/main/java/com/owncloud/android/ui/preview/media/PreviewPlaybackFragment.kt +++ b/app/src/main/java/com/owncloud/android/ui/preview/media/PreviewPlaybackFragment.kt @@ -151,7 +151,7 @@ class PreviewPlaybackFragment : item.setIcon( viewThemeUtils.platform.colorDrawable( it, - ContextCompat.getColor(requireContext(), R.color.white) + ContextCompat.getColor(requireContext(), R.color.fontAppbar) ) ) } diff --git a/app/src/main/java/com/owncloud/android/ui/trashbin/TrashbinFragment.kt b/app/src/main/java/com/owncloud/android/ui/trashbin/TrashbinFragment.kt index f05adbcdc373..c2a07b83185c 100644 --- a/app/src/main/java/com/owncloud/android/ui/trashbin/TrashbinFragment.kt +++ b/app/src/main/java/com/owncloud/android/ui/trashbin/TrashbinFragment.kt @@ -24,6 +24,7 @@ import android.widget.TextView import androidx.annotation.IdRes import androidx.annotation.VisibleForTesting import androidx.core.content.ContextCompat +import androidx.appcompat.view.ContextThemeWrapper import androidx.core.content.res.ResourcesCompat import androidx.core.view.MenuHost import androidx.core.view.MenuProvider @@ -253,7 +254,9 @@ class TrashbinFragment : } override fun onOverflowIconClicked(file: TrashbinFile, view: View) { - PopupMenu(requireContext(), view).apply { + // NMC Customization + val ctw = ContextThemeWrapper(requireContext(), R.style.CustomPopupTheme) + PopupMenu(ctw, view).apply { inflate(R.menu.item_trashbin) setOnMenuItemClickListener { onFileActionChosen(it.itemId, setOf(file)) @@ -549,10 +552,11 @@ class TrashbinFragment : val item = menu.findItem(R.id.custom_menu_placeholder_item) item.icon?.let { item.setIcon( + // NMC Customization: color of menu activity?.let { it1 -> viewThemeUtils.platform.colorDrawable( it, - ContextCompat.getColor(it1, R.color.white) + ContextCompat.getColor(it1, R.color.fontAppbar) ) } ) diff --git a/app/src/main/java/com/owncloud/android/utils/theme/FilesSpecificViewThemeUtils.kt b/app/src/main/java/com/owncloud/android/utils/theme/FilesSpecificViewThemeUtils.kt index aa344b5be4c1..cea605ac51a1 100644 --- a/app/src/main/java/com/owncloud/android/utils/theme/FilesSpecificViewThemeUtils.kt +++ b/app/src/main/java/com/owncloud/android/utils/theme/FilesSpecificViewThemeUtils.kt @@ -105,15 +105,19 @@ class FilesSpecificViewThemeUtils @Inject constructor( .setThumbDrawable(getThumbDrawable(context)) .setPopupStyle { PopupStyles.MD2.accept(it) - it.background = FastScrollPopupBackground(context, scheme.primary) + //NMC customisation + it.background = FastScrollPopupBackground(context, context.resources.getColor(R.color.primary, null)) } } private fun getThumbDrawable(context: Context): Drawable = checkNotNull( - androidViewThemeUtils.tintDrawable( - context, - me.zhanghai.android.fastscroll.R.drawable.afs_md2_thumb, - ColorRole.PRIMARY + androidViewThemeUtils.colorDrawable( + ResourcesCompat.getDrawable( + context.resources, + me.zhanghai.android.fastscroll.R.drawable.afs_md2_thumb, + null + )!!, + context.resources.getColor(R.color.primary, null) ) ) { "Fast scroller thumb drawable not found" } diff --git a/app/src/main/res/color/spinner_color_state.xml b/app/src/main/res/color/spinner_color_state.xml new file mode 100644 index 000000000000..5913e0da1a1d --- /dev/null +++ b/app/src/main/res/color/spinner_color_state.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_spinner.xml b/app/src/main/res/drawable/bg_spinner.xml new file mode 100644 index 000000000000..d48644569a5c --- /dev/null +++ b/app/src/main/res/drawable/bg_spinner.xml @@ -0,0 +1,9 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/simple_spinner_item.xml b/app/src/main/res/layout/simple_spinner_item.xml new file mode 100644 index 000000000000..55f585937c2d --- /dev/null +++ b/app/src/main/res/layout/simple_spinner_item.xml @@ -0,0 +1,10 @@ + + \ No newline at end of file diff --git a/app/src/main/res/layout/upload_files_layout.xml b/app/src/main/res/layout/upload_files_layout.xml index 38d17a7566a8..b06c7b88e30e 100644 --- a/app/src/main/res/layout/upload_files_layout.xml +++ b/app/src/main/res/layout/upload_files_layout.xml @@ -60,6 +60,7 @@ diff --git a/app/src/main/res/values-night/nmc_colors.xml b/app/src/main/res/values-night/nmc_colors.xml new file mode 100644 index 000000000000..229d9361177d --- /dev/null +++ b/app/src/main/res/values-night/nmc_colors.xml @@ -0,0 +1,73 @@ + + + + + #FFFFFF + @color/grey_30 + @color/grey_30 + #CCCCCC + @color/grey_70 + @color/grey_80 + #2D2D2D + @color/grey_70 + @color/grey_70 + + + @color/grey_80 + @color/grey_0 + + + @color/grey_80 + @color/grey_0 + + + @color/grey_60 + @color/grey_0 + @color/grey_0 + @color/grey_30 + #FFFFFF + @color/grey_30 + @color/grey_80 + #FFFFFF + + + @color/grey_80 + @color/grey_30 + @color/grey_0 + + + @color/grey_80 + @color/grey_0 + @color/grey_80 + + + @color/grey_70 + @color/grey_60 + + + @color/grey_70 + @color/grey_70 + + + #FFFFFF + @color/grey_30 + @color/grey_0 + @color/grey_0 + @color/grey_0 + @color/grey_0 + @color/grey_60 + @color/grey_0 + #FFFFFF + #7d94f9 + + + #121212 + @color/grey_0 + @color/grey_80 + @color/grey_80 + \ No newline at end of file diff --git a/app/src/main/res/values/nmc_colors.xml b/app/src/main/res/values/nmc_colors.xml new file mode 100644 index 000000000000..3aa33ccdf362 --- /dev/null +++ b/app/src/main/res/values/nmc_colors.xml @@ -0,0 +1,98 @@ + + + + + #191919 + @color/primary + #191919 + #191919 + @color/grey_30 + @android:color/white + #FFFFFF + @color/grey_0 + #CCCCCC + #77c4ff + #B3FFFFFF + @color/grey_10 + + + #101010 + #F2F2F2 + #E5E5E5 + #B2B2B2 + #666666 + #4C4C4C + #333333 + + + @color/design_snackbar_background_color + @color/white + + + #FFFFFF + #191919 + + + @color/grey_0 + #191919 + @color/primary + #191919 + @color/primary + @color/grey_30 + @color/white + #191919 + + + #FFFFFF + #191919 + #191919 + + + #FFFFFF + #191919 + #FFFFFF + + + @color/primary + #F399C7 + #FFFFFF + @color/grey_30 + @color/grey_10 + @color/grey_0 + + + @color/primary + @color/grey_30 + @color/grey_30 + #CCCCCC + + + #191919 + @color/grey_30 + #191919 + #191919 + #191919 + #191919 + @color/grey_30 + #191919 + #000000 + #191919 + #F6E5EB + #C16F81 + #0D39DF + #0099ff + #2238df + + + @color/grey_0 + #191919 + @color/grey_0 + @color/grey_30 + #77b6bb + #5077b6bb + \ No newline at end of file diff --git a/app/src/main/res/values/nmc_popup_styles.xml b/app/src/main/res/values/nmc_popup_styles.xml new file mode 100644 index 000000000000..145a9c4ea15b --- /dev/null +++ b/app/src/main/res/values/nmc_popup_styles.xml @@ -0,0 +1,16 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/nmc_spinner_styles.xml b/app/src/main/res/values/nmc_spinner_styles.xml new file mode 100644 index 000000000000..1025e7759952 --- /dev/null +++ b/app/src/main/res/values/nmc_spinner_styles.xml @@ -0,0 +1,8 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index b01edd987c4e..8a1bd7c444e7 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -367,9 +367,9 @@