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.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

View File

@ -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])
}

View File

@ -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
)
}
}

View File

@ -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);
}
}

View File

@ -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)
}
}
}