mirror of
https://github.com/nextcloud/talk-android
synced 2025-06-20 12:09:45 +01:00
Theme RemoteFileBrowser
Signed-off-by: Álvaro Brey <alvaro.brey@nextcloud.com>
This commit is contained in:
parent
a4c01978a8
commit
49f9e0ffc4
@ -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
|
||||||
|
@ -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])
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user