Theme RemoteFileBrowser

Signed-off-by: Álvaro Brey <alvaro.brey@nextcloud.com>
This commit is contained in:
Álvaro Brey 2022-07-22 15:04:15 +02:00 committed by Andy Scherzinger
parent a4c01978a8
commit 49f9e0ffc4
No known key found for this signature in database
GPG Key ID: 6CADC7E3523C308B
5 changed files with 65 additions and 17 deletions

View File

@ -44,6 +44,7 @@ import com.nextcloud.talk.remotefilebrowser.SelectionInterface
import com.nextcloud.talk.remotefilebrowser.adapters.RemoteFileBrowserItemsAdapter import com.nextcloud.talk.remotefilebrowser.adapters.RemoteFileBrowserItemsAdapter
import com.nextcloud.talk.remotefilebrowser.viewmodels.RemoteFileBrowserItemsViewModel import com.nextcloud.talk.remotefilebrowser.viewmodels.RemoteFileBrowserItemsViewModel
import com.nextcloud.talk.ui.dialog.SortingOrderDialogFragment 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.DisplayUtils
import com.nextcloud.talk.utils.FileSortOrder import com.nextcloud.talk.utils.FileSortOrder
import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_MIME_TYPE_FILTER import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_MIME_TYPE_FILTER
@ -59,6 +60,9 @@ class RemoteFileBrowserActivity : AppCompatActivity(), SelectionInterface, Swipe
@Inject @Inject
lateinit var currentUserProvider: CurrentUserProviderNew lateinit var currentUserProvider: CurrentUserProviderNew
@Inject
lateinit var viewThemeUtils: ViewThemeUtils
private lateinit var binding: ActivityRemoteFileBrowserBinding private lateinit var binding: ActivityRemoteFileBrowserBinding
private lateinit var viewModel: RemoteFileBrowserItemsViewModel private lateinit var viewModel: RemoteFileBrowserItemsViewModel
@ -91,8 +95,7 @@ class RemoteFileBrowserActivity : AppCompatActivity(), SelectionInterface, Swipe
initViewModel(mimeTypeSelectionFilter) initViewModel(mimeTypeSelectionFilter)
binding.swipeRefreshList.setOnRefreshListener(this) binding.swipeRefreshList.setOnRefreshListener(this)
binding.swipeRefreshList.setColorSchemeResources(R.color.colorPrimary) viewThemeUtils.themeSwipeRefreshLayout(binding.swipeRefreshList)
binding.swipeRefreshList.setProgressBackgroundColorSchemeResource(R.color.refresh_spinner_background)
binding.pathNavigationBackButton.setOnClickListener { viewModel.navigateUp() } binding.pathNavigationBackButton.setOnClickListener { viewModel.navigateUp() }
binding.sortButton.setOnClickListener { changeSorting() } binding.sortButton.setOnClickListener { changeSorting() }
@ -160,6 +163,7 @@ class RemoteFileBrowserActivity : AppCompatActivity(), SelectionInterface, Swipe
mimeTypeSelectionFilter = mimeTypeSelectionFilter, mimeTypeSelectionFilter = mimeTypeSelectionFilter,
user = currentUserProvider.currentUser.blockingGet(), user = currentUserProvider.currentUser.blockingGet(),
selectionInterface = this, selectionInterface = this,
viewThemeUtils = viewThemeUtils,
onItemClicked = viewModel::onItemClicked onItemClicked = viewModel::onItemClicked
) )
adapter.items = remoteFileBrowserItems adapter.items = remoteFileBrowserItems

View File

@ -28,19 +28,20 @@ import com.nextcloud.talk.data.user.model.User
import com.nextcloud.talk.databinding.RvItemBrowserFileBinding import com.nextcloud.talk.databinding.RvItemBrowserFileBinding
import com.nextcloud.talk.remotefilebrowser.SelectionInterface import com.nextcloud.talk.remotefilebrowser.SelectionInterface
import com.nextcloud.talk.remotefilebrowser.model.RemoteFileBrowserItem import com.nextcloud.talk.remotefilebrowser.model.RemoteFileBrowserItem
import com.nextcloud.talk.ui.theme.ViewThemeUtils
class RemoteFileBrowserItemsAdapter( class RemoteFileBrowserItemsAdapter(
private val showGrid: Boolean = false, private val showGrid: Boolean = false,
private val mimeTypeSelectionFilter: String? = null, private val mimeTypeSelectionFilter: String? = null,
private val user: User, private val user: User,
private val selectionInterface: SelectionInterface, private val selectionInterface: SelectionInterface,
private val viewThemeUtils: ViewThemeUtils,
private val onItemClicked: (RemoteFileBrowserItem) -> Unit private val onItemClicked: (RemoteFileBrowserItem) -> Unit
) : RecyclerView.Adapter<RemoteFileBrowserItemsViewHolder>() { ) : RecyclerView.Adapter<RemoteFileBrowserItemsViewHolder>() {
var items: List<RemoteFileBrowserItem> = emptyList() var items: List<RemoteFileBrowserItem> = emptyList()
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RemoteFileBrowserItemsViewHolder { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RemoteFileBrowserItemsViewHolder {
return if (showGrid) { return if (showGrid) {
RemoteFileBrowserItemsListViewHolder( RemoteFileBrowserItemsListViewHolder(
RvItemBrowserFileBinding.inflate( RvItemBrowserFileBinding.inflate(
@ -50,7 +51,8 @@ class RemoteFileBrowserItemsAdapter(
), ),
mimeTypeSelectionFilter, mimeTypeSelectionFilter,
user, user,
selectionInterface selectionInterface,
viewThemeUtils
) { ) {
onItemClicked(items[it]) onItemClicked(items[it])
} }
@ -63,7 +65,8 @@ class RemoteFileBrowserItemsAdapter(
), ),
mimeTypeSelectionFilter, mimeTypeSelectionFilter,
user, user,
selectionInterface selectionInterface,
viewThemeUtils
) { ) {
onItemClicked(items[it]) onItemClicked(items[it])
} }

View File

@ -20,6 +20,7 @@
package com.nextcloud.talk.remotefilebrowser.adapters package com.nextcloud.talk.remotefilebrowser.adapters
import android.graphics.drawable.Drawable
import android.text.format.Formatter import android.text.format.Formatter
import android.view.View import android.view.View
import androidx.appcompat.content.res.AppCompatResources 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.databinding.RvItemBrowserFileBinding
import com.nextcloud.talk.remotefilebrowser.SelectionInterface import com.nextcloud.talk.remotefilebrowser.SelectionInterface
import com.nextcloud.talk.remotefilebrowser.model.RemoteFileBrowserItem 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.ApiUtils
import com.nextcloud.talk.utils.DateUtils.getLocalDateTimeStringFromTimestamp import com.nextcloud.talk.utils.DateUtils.getLocalDateTimeStringFromTimestamp
import com.nextcloud.talk.utils.DisplayUtils import com.nextcloud.talk.utils.DisplayUtils
@ -45,6 +47,7 @@ class RemoteFileBrowserItemsListViewHolder(
mimeTypeSelectionFilter: String?, mimeTypeSelectionFilter: String?,
currentUser: User, currentUser: User,
selectionInterface: SelectionInterface, selectionInterface: SelectionInterface,
private val viewThemeUtils: ViewThemeUtils,
onItemClicked: (Int) -> Unit onItemClicked: (Int) -> Unit
) : RemoteFileBrowserItemsViewHolder(binding, mimeTypeSelectionFilter, currentUser, selectionInterface) { ) : RemoteFileBrowserItemsViewHolder(binding, mimeTypeSelectionFilter, currentUser, selectionInterface) {
@ -66,7 +69,6 @@ class RemoteFileBrowserItemsListViewHolder(
} }
override fun onBind(item: RemoteFileBrowserItem) { override fun onBind(item: RemoteFileBrowserItem) {
super.onBind(item) super.onBind(item)
binding.fileIcon.controller = null binding.fileIcon.controller = null
@ -99,9 +101,7 @@ class RemoteFileBrowserItemsListViewHolder(
binding.fileIcon binding.fileIcon
.hierarchy .hierarchy
.setPlaceholderImage( .setPlaceholderImage(
AppCompatResources.getDrawable( getPlaceholderImage(item)
binding.fileIcon.context, getDrawableResourceIdForMimeType(item.mimeType)
)
) )
if (item.hasPreview) { if (item.hasPreview) {
@ -129,9 +129,23 @@ class RemoteFileBrowserItemsListViewHolder(
binding.selectFileCheckbox.isChecked = selectionInterface.isPathSelected(item.path!!) 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() { private fun setSelectability() {
if (selectable) { if (selectable) {
binding.selectFileCheckbox.visibility = View.VISIBLE binding.selectFileCheckbox.visibility = View.VISIBLE
viewThemeUtils.themeCheckbox(binding.selectFileCheckbox)
} else { } else {
binding.selectFileCheckbox.visibility = View.GONE binding.selectFileCheckbox.visibility = View.GONE
} }
@ -150,5 +164,9 @@ class RemoteFileBrowserItemsListViewHolder(
companion object { companion object {
private const val DISABLED_ALPHA: Float = 0.38f private const val DISABLED_ALPHA: Float = 0.38f
private const val ENABLED_ALPHA: Float = 1.0f 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
)
} }
} }

View File

@ -33,9 +33,9 @@ import android.widget.TextView;
import com.google.android.material.button.MaterialButton; import com.google.android.material.button.MaterialButton;
import com.google.android.material.dialog.MaterialAlertDialogBuilder; import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.nextcloud.talk.R;
import com.nextcloud.talk.application.NextcloudTalkApplication; import com.nextcloud.talk.application.NextcloudTalkApplication;
import com.nextcloud.talk.databinding.SortingOrderFragmentBinding; import com.nextcloud.talk.databinding.SortingOrderFragmentBinding;
import com.nextcloud.talk.ui.theme.ViewThemeUtils;
import com.nextcloud.talk.utils.FileSortOrder; import com.nextcloud.talk.utils.FileSortOrder;
import com.nextcloud.talk.utils.preferences.AppPreferences; import com.nextcloud.talk.utils.preferences.AppPreferences;
@ -46,7 +46,6 @@ import javax.inject.Inject;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.fragment.app.DialogFragment; import androidx.fragment.app.DialogFragment;
import autodagger.AutoInjector; import autodagger.AutoInjector;
import kotlin.jvm.JvmField;
/** /**
* Dialog to show and choose the sorting order for the file listing. * 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"; private static final String KEY_SORT_ORDER = "SORT_ORDER";
@Inject @Inject
@JvmField
AppPreferences appPreferences; AppPreferences appPreferences;
@Inject
ViewThemeUtils viewThemeUtils;
private SortingOrderFragmentBinding binding; private SortingOrderFragmentBinding binding;
private View dialogView; private View dialogView;
@ -119,7 +120,7 @@ public class SortingOrderDialogFragment extends DialogFragment implements View.O
* find all relevant UI elements and set their values. * find all relevant UI elements and set their values.
*/ */
private void setupDialogElements() { private void setupDialogElements() {
binding.cancel.setTextColor(getResources().getColor(R.color.colorPrimary)); viewThemeUtils.colorMaterialButtonText(binding.cancel);
taggedViews = new View[12]; taggedViews = new View[12];
taggedViews[0] = binding.sortByNameAscending; 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. * tints the icon reflecting the actual sorting choice in the apps primary color.
*/ */
private void setupActiveOrderSelection() { 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) { for (View view : taggedViews) {
Log.i("SortOrder", ((FileSortOrder) view.getTag()).getName()); Log.i("SortOrder", ((FileSortOrder) view.getTag()).getName());
if (!((FileSortOrder) view.getTag()).getName().equals(currentSortOrderName)) { if (!((FileSortOrder) view.getTag()).getName().equals(currentSortOrderName)) {
continue; continue;
} }
if (view instanceof MaterialButton) { if (view instanceof MaterialButton) {
((MaterialButton) view).setIconTintResource(R.color.colorPrimary); viewThemeUtils.colorMaterialButtonText((MaterialButton) view);
} }
if (view instanceof TextView) { if (view instanceof TextView) {
((TextView) view).setTextColor(color); viewThemeUtils.colorTextViewElement((TextView) view);
((TextView) view).setTypeface(Typeface.DEFAULT_BOLD); ((TextView) view).setTypeface(Typeface.DEFAULT_BOLD);
} }
} }

View File

@ -25,12 +25,15 @@ import android.content.Context
import android.content.res.ColorStateList import android.content.res.ColorStateList
import android.content.res.Configuration import android.content.res.Configuration
import android.graphics.Color import android.graphics.Color
import android.graphics.drawable.Drawable
import android.view.View import android.view.View
import android.widget.CheckBox
import android.widget.ImageView import android.widget.ImageView
import android.widget.TextView import android.widget.TextView
import androidx.appcompat.widget.SwitchCompat import androidx.appcompat.widget.SwitchCompat
import androidx.core.content.res.ResourcesCompat import androidx.core.content.res.ResourcesCompat
import androidx.core.view.children import androidx.core.view.children
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout
import com.google.android.material.button.MaterialButton import com.google.android.material.button.MaterialButton
import com.google.android.material.card.MaterialCardView import com.google.android.material.card.MaterialCardView
import com.google.android.material.floatingactionbutton.FloatingActionButton import com.google.android.material.floatingactionbutton.FloatingActionButton
@ -106,6 +109,7 @@ class ViewThemeUtils @Inject constructor(val theme: ServerTheme) {
fun colorMaterialButtonText(button: MaterialButton) { fun colorMaterialButtonText(button: MaterialButton) {
colorTextViewElement(button) colorTextViewElement(button)
button.iconTint = ColorStateList.valueOf(getElementColor(button.context))
} }
fun colorMaterialButtonBackground(button: MaterialButton) { 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)
}
}
} }