From 946b54f57c9f55d783db0f2214bde628401638e2 Mon Sep 17 00:00:00 2001 From: Andy Scherzinger Date: Thu, 8 Jan 2026 15:31:45 +0100 Subject: [PATCH] fix(theming): Improve color theming and general layouting Resolves #16245 Signed-off-by: Andy Scherzinger --- .../android/ui/activity/EditorWebView.java | 3 + .../ui/activity/InternalTwoWaySyncActivity.kt | 5 +- .../ui/adapter/InternalTwoWaySyncAdapter.kt | 18 ++-- .../android/ui/adapter/LinkShareViewHolder.kt | 6 +- .../android/ui/adapter/ShareViewHolder.java | 1 + .../ui/fragment/FileDetailFragment.java | 1 + .../fragment/FileDetailSharingFragment.java | 10 ++- .../theme/FilesSpecificViewThemeUtils.kt | 22 +++++ .../main/res/layout/file_details_fragment.xml | 1 + .../layout/file_details_sharing_fragment.xml | 83 ++++++++++--------- .../layout/internal_two_way_sync_layout.xml | 16 ++-- .../internal_two_way_sync_view_holder.xml | 21 ++--- app/src/main/res/values-night/colors.xml | 2 +- app/src/main/res/values/colors.xml | 2 +- app/src/main/res/values/dims.xml | 1 + app/src/main/res/values/strings.xml | 2 +- 16 files changed, 120 insertions(+), 74 deletions(-) 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 d216177436a0..cb03db76006b 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 @@ -25,6 +25,7 @@ import android.webkit.WebView; import com.google.android.material.snackbar.Snackbar; +import com.nextcloud.android.common.ui.theme.utils.ColorRole; import com.nextcloud.client.account.User; import com.nextcloud.utils.extensions.IntentExtensionsKt; import com.owncloud.android.R; @@ -130,6 +131,8 @@ protected void bindView() { protected void postOnCreate() { super.postOnCreate(); + viewThemeUtils.platform.colorCircularProgressBar(binding.progressBar2, ColorRole.PRIMARY); + getWebView().setWebChromeClient(new WebChromeClient() { final EditorWebView activity = EditorWebView.this; diff --git a/app/src/main/java/com/owncloud/android/ui/activity/InternalTwoWaySyncActivity.kt b/app/src/main/java/com/owncloud/android/ui/activity/InternalTwoWaySyncActivity.kt index 89d37b84da4d..f85127cd2ded 100644 --- a/app/src/main/java/com/owncloud/android/ui/activity/InternalTwoWaySyncActivity.kt +++ b/app/src/main/java/com/owncloud/android/ui/activity/InternalTwoWaySyncActivity.kt @@ -50,7 +50,8 @@ class InternalTwoWaySyncActivity : override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - internalTwoWaySyncAdapter = InternalTwoWaySyncAdapter(fileDataStorageManager, user.get(), this, this) + internalTwoWaySyncAdapter = + InternalTwoWaySyncAdapter(fileDataStorageManager, user.get(), this, this, viewThemeUtils) binding = InternalTwoWaySyncLayoutBinding.inflate(layoutInflater) setContentView(binding.root) @@ -163,6 +164,7 @@ class InternalTwoWaySyncActivity : handleDurationSelected(durations[position].first.inWholeMinutes) } } + viewThemeUtils.material.colorTextInputLayout(binding.twoWaySyncIntervalLayout) } private fun handleDurationSelected(duration: Long) { @@ -184,6 +186,7 @@ class InternalTwoWaySyncActivity : backgroundJobManager.cancelTwoWaySyncJob() } } + viewThemeUtils.material.colorMaterialSwitch(binding.twoWaySyncToggle) } private fun checkLayoutVisibilities(condition: Boolean) { diff --git a/app/src/main/java/com/owncloud/android/ui/adapter/InternalTwoWaySyncAdapter.kt b/app/src/main/java/com/owncloud/android/ui/adapter/InternalTwoWaySyncAdapter.kt index 376d32deb34b..6c2cbe368de8 100644 --- a/app/src/main/java/com/owncloud/android/ui/adapter/InternalTwoWaySyncAdapter.kt +++ b/app/src/main/java/com/owncloud/android/ui/adapter/InternalTwoWaySyncAdapter.kt @@ -12,16 +12,19 @@ import android.content.Context import android.view.LayoutInflater import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView +import com.nextcloud.android.common.ui.theme.utils.ColorRole import com.nextcloud.client.account.User import com.owncloud.android.databinding.InternalTwoWaySyncViewHolderBinding import com.owncloud.android.datamodel.FileDataStorageManager import com.owncloud.android.datamodel.OCFile +import com.owncloud.android.utils.theme.ViewThemeUtils class InternalTwoWaySyncAdapter( private val dataStorageManager: FileDataStorageManager, private val user: User, val context: Context, - private val onUpdateListener: InternalTwoWaySyncAdapterOnUpdate + private val onUpdateListener: InternalTwoWaySyncAdapterOnUpdate, + private val viewThemeUtils: ViewThemeUtils ) : RecyclerView.Adapter() { interface InternalTwoWaySyncAdapterOnUpdate { @@ -30,14 +33,11 @@ class InternalTwoWaySyncAdapter( var folders: List = dataStorageManager.getInternalTwoWaySyncFolders(user) - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): InternalTwoWaySyncViewHolder = - InternalTwoWaySyncViewHolder( - InternalTwoWaySyncViewHolderBinding.inflate( - LayoutInflater.from(parent.context), - parent, - false - ) - ) + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): InternalTwoWaySyncViewHolder { + val binding = InternalTwoWaySyncViewHolderBinding.inflate(LayoutInflater.from(parent.context), parent, false) + viewThemeUtils.platform.colorImageView(binding.folderIcon, ColorRole.PRIMARY) + return InternalTwoWaySyncViewHolder(binding) + } override fun getItemCount(): Int = folders.size diff --git a/app/src/main/java/com/owncloud/android/ui/adapter/LinkShareViewHolder.kt b/app/src/main/java/com/owncloud/android/ui/adapter/LinkShareViewHolder.kt index dd9a01832ccb..3ebe6b08d380 100644 --- a/app/src/main/java/com/owncloud/android/ui/adapter/LinkShareViewHolder.kt +++ b/app/src/main/java/com/owncloud/android/ui/adapter/LinkShareViewHolder.kt @@ -93,11 +93,9 @@ internal class LinkShareViewHolder(itemView: View) : RecyclerView.ViewHolder(ite } val label = publicShare.label - if (label.isNullOrEmpty()) { - return + if (!label.isNullOrEmpty()) { + binding.name.text = context.getString(R.string.share_link_with_label, label) } - - binding.name.text = context.getString(R.string.share_link_with_label, label) } private fun setSubline(binding: FileDetailsShareLinkShareItemBinding?, context: Context?, publicShare: OCShare) { diff --git a/app/src/main/java/com/owncloud/android/ui/adapter/ShareViewHolder.java b/app/src/main/java/com/owncloud/android/ui/adapter/ShareViewHolder.java index 26159013d544..f57a1701c6c4 100644 --- a/app/src/main/java/com/owncloud/android/ui/adapter/ShareViewHolder.java +++ b/app/src/main/java/com/owncloud/android/ui/adapter/ShareViewHolder.java @@ -135,6 +135,7 @@ private void setPermissionName(String permissionName) { if (!TextUtils.isEmpty(permissionName)) { binding.permissionName.setText(permissionName); binding.permissionName.setVisibility(View.VISIBLE); + viewThemeUtils.androidx.colorPrimaryTextViewElement(binding.permissionName); } else { binding.permissionName.setVisibility(View.GONE); } diff --git a/app/src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.java b/app/src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.java index 49df63f254eb..595ccacce1e1 100644 --- a/app/src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.java +++ b/app/src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.java @@ -276,6 +276,7 @@ public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { if (getFile() != null && user != null) { viewThemeUtils.platform.themeHorizontalProgressBar(binding.progressBar); + viewThemeUtils.platform.themeCheckbox(binding.folderSyncButton); progressListener = new DownloadProgressListener(binding.progressBar); binding.cancelBtn.setOnClickListener(this); binding.favorite.setOnClickListener(this); diff --git a/app/src/main/java/com/owncloud/android/ui/fragment/FileDetailSharingFragment.java b/app/src/main/java/com/owncloud/android/ui/fragment/FileDetailSharingFragment.java index 969b29c8d349..23b3e553f1e6 100644 --- a/app/src/main/java/com/owncloud/android/ui/fragment/FileDetailSharingFragment.java +++ b/app/src/main/java/com/owncloud/android/ui/fragment/FileDetailSharingFragment.java @@ -34,6 +34,7 @@ import android.view.animation.AnimationUtils; import android.widget.LinearLayout; +import com.nextcloud.android.common.ui.theme.utils.ColorRole; import com.nextcloud.client.account.User; import com.nextcloud.client.account.UserAccountManager; import com.nextcloud.client.database.entity.FileEntity; @@ -292,8 +293,12 @@ private void setupView() { (SearchManager) fileActivity.getSystemService(Context.SEARCH_SERVICE), binding.searchView, fileActivity.getComponentName()); - viewThemeUtils.androidx.themeToolbarSearchView(binding.searchView); + viewThemeUtils.material.themeSearchCardView(binding.searchCardWrapper); + viewThemeUtils.files.themeContentSearchView(binding.searchView); + viewThemeUtils.platform.colorImageView(binding.searchViewIcon, ColorRole.ON_SURFACE_VARIANT); + viewThemeUtils.platform.colorImageView(binding.pickContactEmailBtn, ColorRole.ON_SURFACE_VARIANT); + viewThemeUtils.material.colorMaterialButtonPrimaryBorderless(binding.sharesListInternalShowAll); viewThemeUtils.material.colorMaterialTextButton(binding.sharesListInternalShowAll); binding.sharesListInternalShowAll.setOnClickListener(view -> { internalShareeListAdapter.toggleShowAll(); @@ -301,6 +306,9 @@ private void setupView() { binding.sharesListInternalShowAll.setText(textRes); }); + viewThemeUtils.material.colorMaterialButtonPrimaryOutlined(binding.createLink); + + viewThemeUtils.material.colorMaterialButtonPrimaryBorderless(binding.sharesListExternalShowAll); viewThemeUtils.material.colorMaterialTextButton(binding.sharesListExternalShowAll); binding.sharesListExternalShowAll.setOnClickListener(view -> { externalShareeListAdapter.toggleShowAll(); 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 b2acffbafbf8..2ad091baa356 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 @@ -16,11 +16,15 @@ import android.preference.PreferenceCategory import android.text.Spannable import android.text.SpannableString import android.text.style.ForegroundColorSpan +import android.view.View import android.widget.ImageView +import android.widget.LinearLayout import androidx.annotation.DrawableRes import androidx.annotation.Px import androidx.annotation.StringRes import androidx.appcompat.app.ActionBar +import androidx.appcompat.widget.AppCompatAutoCompleteTextView +import androidx.appcompat.widget.SearchView import androidx.core.content.res.ResourcesCompat import com.google.android.material.card.MaterialCardView import com.nextcloud.android.common.ui.color.ColorUtil @@ -36,6 +40,7 @@ import me.zhanghai.android.fastscroll.FastScrollerBuilder import me.zhanghai.android.fastscroll.PopupStyles import javax.inject.Inject +@Suppress("TooManyFunctions") class FilesSpecificViewThemeUtils @Inject constructor( schemes: MaterialSchemes, private val colorUtil: ColorUtil, @@ -256,6 +261,23 @@ class FilesSpecificViewThemeUtils @Inject constructor( supportActionBar.setHomeAsUpIndicator(tinted) } + fun themeContentSearchView(searchView: SearchView) { + withScheme(searchView) { scheme -> + // hacky as no default way is provided + val editText = searchView + .findViewById(androidx.appcompat.R.id.search_src_text) as AppCompatAutoCompleteTextView + val searchPlate = searchView.findViewById(androidx.appcompat.R.id.search_plate) as LinearLayout + val closeButton = searchView.findViewById(androidx.appcompat.R.id.search_close_btn) as ImageView + val searchButton = searchView.findViewById(androidx.appcompat.R.id.search_button) as ImageView + editText.setHintTextColor(scheme.onSurfaceVariant) + editText.highlightColor = scheme.inverseOnSurface + editText.setTextColor(scheme.onSurface) + closeButton.setColorFilter(scheme.onSurface) + searchButton.setColorFilter(scheme.onSurface) + searchPlate.setBackgroundColor(scheme.surfaceContainerHigh) + } + } + companion object { private val TAG = FilesSpecificViewThemeUtils::class.simpleName diff --git a/app/src/main/res/layout/file_details_fragment.xml b/app/src/main/res/layout/file_details_fragment.xml index 8ed20b18a048..aac508c36f68 100644 --- a/app/src/main/res/layout/file_details_fragment.xml +++ b/app/src/main/res/layout/file_details_fragment.xml @@ -198,6 +198,7 @@ diff --git a/app/src/main/res/layout/file_details_sharing_fragment.xml b/app/src/main/res/layout/file_details_sharing_fragment.xml index 310c49197c6e..02401065bf07 100644 --- a/app/src/main/res/layout/file_details_sharing_fragment.xml +++ b/app/src/main/res/layout/file_details_sharing_fragment.xml @@ -83,45 +83,53 @@ - - - + android:layout_marginHorizontal="@dimen/standard_margin" + android:layout_marginTop="@dimen/standard_half_margin" + app:cardBackgroundColor="@color/grey_600" + app:cardCornerRadius="28dp" + app:strokeWidth="0dp"> - - - + android:orientation="horizontal"> + + + + + + - + + + + android:background="@color/list_divider_background" /> @@ -202,5 +210,4 @@ - diff --git a/app/src/main/res/layout/internal_two_way_sync_layout.xml b/app/src/main/res/layout/internal_two_way_sync_layout.xml index 19d3e5074183..57bbce6139d8 100644 --- a/app/src/main/res/layout/internal_two_way_sync_layout.xml +++ b/app/src/main/res/layout/internal_two_way_sync_layout.xml @@ -22,21 +22,21 @@ + android:minHeight="@dimen/minimum_size_for_touchable_area" + android:text="@string/prefs_two_way_sync_title" + android:textSize="@dimen/txt_size_16sp" /> diff --git a/app/src/main/res/layout/internal_two_way_sync_view_holder.xml b/app/src/main/res/layout/internal_two_way_sync_view_holder.xml index ba949f304bfc..26942304fdc7 100644 --- a/app/src/main/res/layout/internal_two_way_sync_view_holder.xml +++ b/app/src/main/res/layout/internal_two_way_sync_view_holder.xml @@ -2,36 +2,36 @@ +--> + android:orientation="horizontal"> diff --git a/app/src/main/res/values-night/colors.xml b/app/src/main/res/values-night/colors.xml index db1e1d218038..bc3d5e523b54 100644 --- a/app/src/main/res/values-night/colors.xml +++ b/app/src/main/res/values-night/colors.xml @@ -11,7 +11,7 @@ #000000 #ff6F6F6F #A5A5A5 - #222222 + #49454F #222222 diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 36d7459ecdaf..c48ded2bf87d 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -20,7 +20,7 @@ @color/secondary_text_color #ffffff #ff888888 - #eeeeee + #CAC4D0 #FFFFFF #DDDDDD #EEEEEE diff --git a/app/src/main/res/values/dims.xml b/app/src/main/res/values/dims.xml index 3192d5eb772f..d021ac9ac1c1 100644 --- a/app/src/main/res/values/dims.xml +++ b/app/src/main/res/values/dims.xml @@ -142,6 +142,7 @@ 10dp 60dp 48dp + 12dp 24dp 400dp 24dp diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index eac2c70202b3..7259956bf44b 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -139,7 +139,7 @@ Dark Follow system Theme - Enable two way sync + Two way sync Interval