Browse Source

Theme RemoteFileBrowser

Signed-off-by: Álvaro Brey <alvaro.brey@nextcloud.com>
Álvaro Brey 2 năm trước cách đây
mục cha
commit
49f9e0ffc4

+ 6 - 2
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

+ 6 - 3
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<RemoteFileBrowserItemsViewHolder>() {
 
     var items: List<RemoteFileBrowserItem> = 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])
             }

+ 22 - 4
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
+        )
     }
 }

+ 8 - 8
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);
             }
         }

+ 23 - 0
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)
+        }
+    }
 }