diff --git a/app/src/main/java/com/nextcloud/talk/remotefilebrowser/activities/RemoteFileBrowserActivity.kt b/app/src/main/java/com/nextcloud/talk/remotefilebrowser/activities/RemoteFileBrowserActivity.kt index 75f87bf93..da0d78049 100644 --- a/app/src/main/java/com/nextcloud/talk/remotefilebrowser/activities/RemoteFileBrowserActivity.kt +++ b/app/src/main/java/com/nextcloud/talk/remotefilebrowser/activities/RemoteFileBrowserActivity.kt @@ -44,6 +44,7 @@ import com.nextcloud.talk.remotefilebrowser.SelectionInterface import com.nextcloud.talk.remotefilebrowser.adapters.RemoteFileBrowserItemsAdapter import com.nextcloud.talk.remotefilebrowser.viewmodels.RemoteFileBrowserItemsViewModel import com.nextcloud.talk.ui.dialog.SortingOrderDialogFragment +import com.nextcloud.talk.ui.theme.ViewThemeUtils import com.nextcloud.talk.utils.DisplayUtils import com.nextcloud.talk.utils.FileSortOrder import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_MIME_TYPE_FILTER @@ -59,6 +60,9 @@ class RemoteFileBrowserActivity : AppCompatActivity(), SelectionInterface, Swipe @Inject lateinit var currentUserProvider: CurrentUserProviderNew + @Inject + lateinit var viewThemeUtils: ViewThemeUtils + private lateinit var binding: ActivityRemoteFileBrowserBinding private lateinit var viewModel: RemoteFileBrowserItemsViewModel @@ -91,8 +95,7 @@ class RemoteFileBrowserActivity : AppCompatActivity(), SelectionInterface, Swipe initViewModel(mimeTypeSelectionFilter) binding.swipeRefreshList.setOnRefreshListener(this) - binding.swipeRefreshList.setColorSchemeResources(R.color.colorPrimary) - binding.swipeRefreshList.setProgressBackgroundColorSchemeResource(R.color.refresh_spinner_background) + viewThemeUtils.themeSwipeRefreshLayout(binding.swipeRefreshList) binding.pathNavigationBackButton.setOnClickListener { viewModel.navigateUp() } binding.sortButton.setOnClickListener { changeSorting() } @@ -160,6 +163,7 @@ class RemoteFileBrowserActivity : AppCompatActivity(), SelectionInterface, Swipe mimeTypeSelectionFilter = mimeTypeSelectionFilter, user = currentUserProvider.currentUser.blockingGet(), selectionInterface = this, + viewThemeUtils = viewThemeUtils, onItemClicked = viewModel::onItemClicked ) adapter.items = remoteFileBrowserItems diff --git a/app/src/main/java/com/nextcloud/talk/remotefilebrowser/adapters/RemoteFileBrowserItemsAdapter.kt b/app/src/main/java/com/nextcloud/talk/remotefilebrowser/adapters/RemoteFileBrowserItemsAdapter.kt index 5a146cb11..d63da5449 100644 --- a/app/src/main/java/com/nextcloud/talk/remotefilebrowser/adapters/RemoteFileBrowserItemsAdapter.kt +++ b/app/src/main/java/com/nextcloud/talk/remotefilebrowser/adapters/RemoteFileBrowserItemsAdapter.kt @@ -28,19 +28,20 @@ import com.nextcloud.talk.data.user.model.User import com.nextcloud.talk.databinding.RvItemBrowserFileBinding import com.nextcloud.talk.remotefilebrowser.SelectionInterface import com.nextcloud.talk.remotefilebrowser.model.RemoteFileBrowserItem +import com.nextcloud.talk.ui.theme.ViewThemeUtils class RemoteFileBrowserItemsAdapter( private val showGrid: Boolean = false, private val mimeTypeSelectionFilter: String? = null, private val user: User, private val selectionInterface: SelectionInterface, + private val viewThemeUtils: ViewThemeUtils, private val onItemClicked: (RemoteFileBrowserItem) -> Unit ) : RecyclerView.Adapter() { var items: List = emptyList() override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RemoteFileBrowserItemsViewHolder { - return if (showGrid) { RemoteFileBrowserItemsListViewHolder( RvItemBrowserFileBinding.inflate( @@ -50,7 +51,8 @@ class RemoteFileBrowserItemsAdapter( ), mimeTypeSelectionFilter, user, - selectionInterface + selectionInterface, + viewThemeUtils ) { onItemClicked(items[it]) } @@ -63,7 +65,8 @@ class RemoteFileBrowserItemsAdapter( ), mimeTypeSelectionFilter, user, - selectionInterface + selectionInterface, + viewThemeUtils ) { onItemClicked(items[it]) } diff --git a/app/src/main/java/com/nextcloud/talk/remotefilebrowser/adapters/RemoteFileBrowserItemsListViewHolder.kt b/app/src/main/java/com/nextcloud/talk/remotefilebrowser/adapters/RemoteFileBrowserItemsListViewHolder.kt index 22ad32704..5ef9d2852 100644 --- a/app/src/main/java/com/nextcloud/talk/remotefilebrowser/adapters/RemoteFileBrowserItemsListViewHolder.kt +++ b/app/src/main/java/com/nextcloud/talk/remotefilebrowser/adapters/RemoteFileBrowserItemsListViewHolder.kt @@ -20,6 +20,7 @@ package com.nextcloud.talk.remotefilebrowser.adapters +import android.graphics.drawable.Drawable import android.text.format.Formatter import android.view.View import androidx.appcompat.content.res.AppCompatResources @@ -33,6 +34,7 @@ import com.nextcloud.talk.data.user.model.User import com.nextcloud.talk.databinding.RvItemBrowserFileBinding import com.nextcloud.talk.remotefilebrowser.SelectionInterface import com.nextcloud.talk.remotefilebrowser.model.RemoteFileBrowserItem +import com.nextcloud.talk.ui.theme.ViewThemeUtils import com.nextcloud.talk.utils.ApiUtils import com.nextcloud.talk.utils.DateUtils.getLocalDateTimeStringFromTimestamp import com.nextcloud.talk.utils.DisplayUtils @@ -45,6 +47,7 @@ class RemoteFileBrowserItemsListViewHolder( mimeTypeSelectionFilter: String?, currentUser: User, selectionInterface: SelectionInterface, + private val viewThemeUtils: ViewThemeUtils, onItemClicked: (Int) -> Unit ) : RemoteFileBrowserItemsViewHolder(binding, mimeTypeSelectionFilter, currentUser, selectionInterface) { @@ -66,7 +69,6 @@ class RemoteFileBrowserItemsListViewHolder( } override fun onBind(item: RemoteFileBrowserItem) { - super.onBind(item) binding.fileIcon.controller = null @@ -99,9 +101,7 @@ class RemoteFileBrowserItemsListViewHolder( binding.fileIcon .hierarchy .setPlaceholderImage( - AppCompatResources.getDrawable( - binding.fileIcon.context, getDrawableResourceIdForMimeType(item.mimeType) - ) + getPlaceholderImage(item) ) if (item.hasPreview) { @@ -129,9 +129,23 @@ class RemoteFileBrowserItemsListViewHolder( binding.selectFileCheckbox.isChecked = selectionInterface.isPathSelected(item.path!!) } + private fun getPlaceholderImage(item: RemoteFileBrowserItem): Drawable? { + val drawableResourceId = getDrawableResourceIdForMimeType(item.mimeType) + val context = binding.fileIcon.context + val drawable = AppCompatResources.getDrawable( + context, + drawableResourceId + ) + if (drawable != null && THEMEABLE_PLACEHOLDER_IDS.contains(drawableResourceId)) { + viewThemeUtils.colorDrawable(context, drawable) + } + return drawable + } + private fun setSelectability() { if (selectable) { binding.selectFileCheckbox.visibility = View.VISIBLE + viewThemeUtils.themeCheckbox(binding.selectFileCheckbox) } else { binding.selectFileCheckbox.visibility = View.GONE } @@ -150,5 +164,9 @@ class RemoteFileBrowserItemsListViewHolder( companion object { private const val DISABLED_ALPHA: Float = 0.38f private const val ENABLED_ALPHA: Float = 1.0f + private val THEMEABLE_PLACEHOLDER_IDS = listOf( + R.drawable.ic_mimetype_package_x_generic, + R.drawable.ic_mimetype_folder + ) } } diff --git a/app/src/main/java/com/nextcloud/talk/ui/dialog/SortingOrderDialogFragment.java b/app/src/main/java/com/nextcloud/talk/ui/dialog/SortingOrderDialogFragment.java index f2d5c8d66..e348504cd 100644 --- a/app/src/main/java/com/nextcloud/talk/ui/dialog/SortingOrderDialogFragment.java +++ b/app/src/main/java/com/nextcloud/talk/ui/dialog/SortingOrderDialogFragment.java @@ -33,9 +33,9 @@ import android.widget.TextView; import com.google.android.material.button.MaterialButton; import com.google.android.material.dialog.MaterialAlertDialogBuilder; -import com.nextcloud.talk.R; import com.nextcloud.talk.application.NextcloudTalkApplication; import com.nextcloud.talk.databinding.SortingOrderFragmentBinding; +import com.nextcloud.talk.ui.theme.ViewThemeUtils; import com.nextcloud.talk.utils.FileSortOrder; import com.nextcloud.talk.utils.preferences.AppPreferences; @@ -46,7 +46,6 @@ import javax.inject.Inject; import androidx.annotation.NonNull; import androidx.fragment.app.DialogFragment; import autodagger.AutoInjector; -import kotlin.jvm.JvmField; /** * Dialog to show and choose the sorting order for the file listing. @@ -60,9 +59,11 @@ public class SortingOrderDialogFragment extends DialogFragment implements View.O private static final String KEY_SORT_ORDER = "SORT_ORDER"; @Inject - @JvmField AppPreferences appPreferences; + @Inject + ViewThemeUtils viewThemeUtils; + private SortingOrderFragmentBinding binding; private View dialogView; @@ -119,7 +120,7 @@ public class SortingOrderDialogFragment extends DialogFragment implements View.O * find all relevant UI elements and set their values. */ private void setupDialogElements() { - binding.cancel.setTextColor(getResources().getColor(R.color.colorPrimary)); + viewThemeUtils.colorMaterialButtonText(binding.cancel); taggedViews = new View[12]; taggedViews[0] = binding.sortByNameAscending; @@ -154,18 +155,17 @@ public class SortingOrderDialogFragment extends DialogFragment implements View.O * tints the icon reflecting the actual sorting choice in the apps primary color. */ private void setupActiveOrderSelection() { - final int color = getResources().getColor(R.color.colorPrimary); - Log.i("SortOrder", "currentSortOrderName="+currentSortOrderName); + Log.i("SortOrder", "currentSortOrderName=" + currentSortOrderName); for (View view : taggedViews) { Log.i("SortOrder", ((FileSortOrder) view.getTag()).getName()); if (!((FileSortOrder) view.getTag()).getName().equals(currentSortOrderName)) { continue; } if (view instanceof MaterialButton) { - ((MaterialButton) view).setIconTintResource(R.color.colorPrimary); + viewThemeUtils.colorMaterialButtonText((MaterialButton) view); } if (view instanceof TextView) { - ((TextView) view).setTextColor(color); + viewThemeUtils.colorTextViewElement((TextView) view); ((TextView) view).setTypeface(Typeface.DEFAULT_BOLD); } } diff --git a/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt b/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt index df5b587f6..eaf5496ab 100644 --- a/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt +++ b/app/src/main/java/com/nextcloud/talk/ui/theme/ViewThemeUtils.kt @@ -25,12 +25,15 @@ import android.content.Context import android.content.res.ColorStateList import android.content.res.Configuration import android.graphics.Color +import android.graphics.drawable.Drawable import android.view.View +import android.widget.CheckBox import android.widget.ImageView import android.widget.TextView import androidx.appcompat.widget.SwitchCompat import androidx.core.content.res.ResourcesCompat import androidx.core.view.children +import androidx.swiperefreshlayout.widget.SwipeRefreshLayout import com.google.android.material.button.MaterialButton import com.google.android.material.card.MaterialCardView import com.google.android.material.floatingactionbutton.FloatingActionButton @@ -106,6 +109,7 @@ class ViewThemeUtils @Inject constructor(val theme: ServerTheme) { fun colorMaterialButtonText(button: MaterialButton) { colorTextViewElement(button) + button.iconTint = ColorStateList.valueOf(getElementColor(button.context)) } fun colorMaterialButtonBackground(button: MaterialButton) { @@ -166,4 +170,23 @@ class ViewThemeUtils @Inject constructor(val theme: ServerTheme) { ) } } + + fun colorDrawable(context: Context, drawable: Drawable) { + val color = getElementColor(context) + drawable.setTint(color) + } + + fun themeCheckbox(checkbox: CheckBox) { + withElementColor(checkbox) { color -> + checkbox.setTextColor(color) + checkbox.buttonTintList = ColorStateList.valueOf(color) + } + } + + fun themeSwipeRefreshLayout(swipeRefreshLayout: SwipeRefreshLayout) { + withElementColor(swipeRefreshLayout) { color -> + swipeRefreshLayout.setColorSchemeColors(color) + swipeRefreshLayout.setProgressBackgroundColorSchemeResource(R.color.refresh_spinner_background) + } + } }