diff --git a/ui-lists/build.gradle b/ui-lists/build.gradle index 2bcecab9c7..da5ba3ec73 100644 --- a/ui-lists/build.gradle +++ b/ui-lists/build.gradle @@ -1,6 +1,5 @@ apply plugin: 'com.android.library' apply plugin: 'kotlin-android' -apply plugin: 'kotlin-android-extensions' apply plugin: 'kotlin-kapt' apply plugin: 'dagger.hilt.android.plugin' apply from: '../versions.gradle' diff --git a/ui-lists/src/main/java/com/michaldrabik/ui_lists/details/ListDetailsFragment.kt b/ui-lists/src/main/java/com/michaldrabik/ui_lists/details/ListDetailsFragment.kt index b8955bcde5..226c6d1e8b 100644 --- a/ui-lists/src/main/java/com/michaldrabik/ui_lists/details/ListDetailsFragment.kt +++ b/ui-lists/src/main/java/com/michaldrabik/ui_lists/details/ListDetailsFragment.kt @@ -25,10 +25,7 @@ import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.michaldrabik.common.Config import com.michaldrabik.common.Mode import com.michaldrabik.ui_base.BaseFragment -import com.michaldrabik.ui_base.common.ListViewMode.GRID -import com.michaldrabik.ui_base.common.ListViewMode.GRID_TITLE -import com.michaldrabik.ui_base.common.ListViewMode.LIST_COMPACT -import com.michaldrabik.ui_base.common.ListViewMode.LIST_NORMAL +import com.michaldrabik.ui_base.common.ListViewMode import com.michaldrabik.ui_base.common.sheets.sort_order.SortOrderBottomSheet import com.michaldrabik.ui_base.utilities.events.Event import com.michaldrabik.ui_base.utilities.extensions.add @@ -44,7 +41,9 @@ import com.michaldrabik.ui_base.utilities.extensions.onClick import com.michaldrabik.ui_base.utilities.extensions.requireParcelable import com.michaldrabik.ui_base.utilities.extensions.visibleIf import com.michaldrabik.ui_base.utilities.extensions.withSpanSizeLookup +import com.michaldrabik.ui_base.utilities.viewBinding import com.michaldrabik.ui_lists.R +import com.michaldrabik.ui_lists.databinding.FragmentListDetailsBinding import com.michaldrabik.ui_lists.details.ListDetailsUiEvent.OpenPremium import com.michaldrabik.ui_lists.details.helpers.ListItemDragListener import com.michaldrabik.ui_lists.details.helpers.ListItemSwipeListener @@ -72,16 +71,6 @@ import com.michaldrabik.ui_navigation.java.NavigationArgs.ARG_SELECTED_SORT_TYPE import com.michaldrabik.ui_navigation.java.NavigationArgs.ARG_SHOW_ID import com.michaldrabik.ui_navigation.java.NavigationArgs.REQUEST_SORT_ORDER import dagger.hilt.android.AndroidEntryPoint -import kotlinx.android.synthetic.main.fragment_list_details.fragmentListDetailsEmptyView -import kotlinx.android.synthetic.main.fragment_list_details.fragmentListDetailsFiltersView -import kotlinx.android.synthetic.main.fragment_list_details.fragmentListDetailsLoadingView -import kotlinx.android.synthetic.main.fragment_list_details.fragmentListDetailsManageButton -import kotlinx.android.synthetic.main.fragment_list_details.fragmentListDetailsMoreButton -import kotlinx.android.synthetic.main.fragment_list_details.fragmentListDetailsRecycler -import kotlinx.android.synthetic.main.fragment_list_details.fragmentListDetailsRoot -import kotlinx.android.synthetic.main.fragment_list_details.fragmentListDetailsToolbar -import kotlinx.android.synthetic.main.fragment_list_details.fragmentListDetailsViewModeButton -import kotlinx.android.synthetic.main.view_list_delete_confirm.view.viewListDeleteConfirmCheckbox @AndroidEntryPoint class ListDetailsFragment : @@ -95,6 +84,7 @@ class ListDetailsFragment : override val navigationId = R.id.listDetailsFragment override val viewModel by viewModels() + private val binding by viewBinding(FragmentListDetailsBinding::bind) private val list by lazy { requireParcelable(ARG_LIST) } @@ -136,30 +126,32 @@ class ListDetailsFragment : override fun onPause() { enableUi() - headerTranslation = fragmentListDetailsFiltersView.translationY + headerTranslation = binding.fragmentListDetailsFiltersView.translationY super.onPause() } private fun setupView() { - fragmentListDetailsRoot.doOnApplyWindowInsets { view, insets, padding, _ -> - val inset = insets.getInsets(WindowInsetsCompat.Type.systemBars()).top - view.updatePadding(top = padding.top + inset) - } - with(fragmentListDetailsToolbar) { - title = list.name - subtitle = list.description - setNavigationOnClickListener { - if (isReorderMode) toggleReorderMode() - else activity?.onBackPressed() + with(binding) { + fragmentListDetailsRoot.doOnApplyWindowInsets { view, insets, padding, _ -> + val inset = insets.getInsets(WindowInsetsCompat.Type.systemBars()).top + view.updatePadding(top = padding.top + inset) } + with(fragmentListDetailsToolbar) { + title = list.name + subtitle = list.description + setNavigationOnClickListener { + if (isReorderMode) toggleReorderMode() + else activity?.onBackPressed() + } + } + with(fragmentListDetailsFiltersView) { + onTypesChangeListener = { viewModel.setFilterTypes(list.id, it) } + onSortClickListener = { order, type -> openSortOrderDialog(order, type) } + translationY = headerTranslation + } + fragmentListDetailsManageButton.onClick { toggleReorderMode() } + fragmentListDetailsViewModeButton.onClick(safe = false) { viewModel.toggleViewMode() } } - with(fragmentListDetailsFiltersView) { - onTypesChangeListener = { viewModel.setFilterTypes(list.id, it) } - onSortClickListener = { order, type -> openSortOrderDialog(order, type) } - translationY = headerTranslation - } - fragmentListDetailsManageButton.onClick { toggleReorderMode() } - fragmentListDetailsViewModeButton.onClick(safe = false) { viewModel.toggleViewMode() } } private fun setupRecycler() { @@ -173,8 +165,10 @@ class ListDetailsFragment : viewModel.loadMissingTranslation(it) }, itemsChangedListener = { - fragmentListDetailsRecycler.scrollToPosition(0) - fragmentListDetailsFiltersView.translationY = 0F + with(binding) { + fragmentListDetailsRecycler.scrollToPosition(0) + fragmentListDetailsFiltersView.translationY = 0F + } }, itemsClearedListener = { if (isReorderMode) viewModel.updateRanks(list.id, it) @@ -187,7 +181,7 @@ class ListDetailsFragment : ).apply { stateRestorationPolicy = StateRestorationPolicy.PREVENT_WHEN_EMPTY } - fragmentListDetailsRecycler.apply { + binding.fragmentListDetailsRecycler.apply { adapter = this@ListDetailsFragment.adapter layoutManager = this@ListDetailsFragment.layoutManager (itemAnimator as SimpleItemAnimator).supportsChangeAnimations = false @@ -197,10 +191,10 @@ class ListDetailsFragment : val touchCallback = ReorderListCallback(adapter as ReorderListCallbackAdapter) touchHelper = ItemTouchHelper(touchCallback) - touchHelper?.attachToRecyclerView(fragmentListDetailsRecycler) + touchHelper?.attachToRecyclerView(binding.fragmentListDetailsRecycler) } - private fun setupRecyclerPaddings() { + private fun setupRecyclerPaddings() = with(binding) { if (layoutManager is GridLayoutManager) { fragmentListDetailsRecycler.updatePadding( top = recyclerPaddingGridTop, @@ -249,7 +243,7 @@ class ListDetailsFragment : .setTitle(R.string.textConfirmDeleteListTitle) .setMessage(R.string.textConfirmDeleteListSubtitle) .setPositiveButton(R.string.textYes) { _, _ -> - val removeFromTrakt = view.viewListDeleteConfirmCheckbox?.isChecked + val removeFromTrakt = view.binding.viewListDeleteConfirmCheckbox?.isChecked viewModel.deleteList(list.id, removeFromTrakt == true) } .setNegativeButton(R.string.textNo) { _, _ -> } @@ -266,7 +260,7 @@ class ListDetailsFragment : private fun openItemDetails(listItem: ListDetailsItem) { disableUi() - fragmentListDetailsRoot.fadeOut(150) { + binding.fragmentListDetailsRoot.fadeOut(150) { val bundle = bundleOf( ARG_SHOW_ID to listItem.show?.traktId, ARG_MOVIE_ID to listItem.movie?.traktId @@ -282,7 +276,7 @@ class ListDetailsFragment : } private fun openPopupMenu(quickRemoveEnabled: Boolean) { - PopupMenu(requireContext(), fragmentListDetailsMoreButton, Gravity.CENTER).apply { + PopupMenu(requireContext(), binding.fragmentListDetailsMoreButton, Gravity.CENTER).apply { inflate(R.menu.menu_list_details) setOnMenuItemClickListener { menuItem -> when (menuItem.itemId) { @@ -304,7 +298,7 @@ class ListDetailsFragment : fun renderTitle(name: String?, itemsCount: Int? = null) { if (name.isNullOrBlank()) return - fragmentListDetailsToolbar.title = when { + binding.fragmentListDetailsToolbar.title = when { itemsCount != null && itemsCount > 0 -> "$name ($itemsCount)" else -> name } @@ -312,83 +306,85 @@ class ListDetailsFragment : uiState.run { renderTitle(listDetails?.name, listItems?.size) - viewMode.let { - if (adapter?.listViewMode != it) { - layoutManager = when (it) { - LIST_NORMAL, LIST_COMPACT -> LinearLayoutManager(requireContext(), VERTICAL, false) - GRID, GRID_TITLE -> GridLayoutManager(context, Config.LISTS_GRID_SPAN) - } - adapter?.listViewMode = it - fragmentListDetailsRecycler?.let { recycler -> - recycler.layoutManager = layoutManager - recycler.adapter = adapter - } - setupRecyclerPaddings() - fragmentListDetailsViewModeButton.setImageResource( - when (it) { - LIST_NORMAL, LIST_COMPACT -> R.drawable.ic_view_list - GRID, GRID_TITLE -> R.drawable.ic_view_grid + with(binding) { + viewMode.let { + if (adapter?.listViewMode != it) { + layoutManager = when (it) { + ListViewMode.LIST_NORMAL, ListViewMode.LIST_COMPACT -> LinearLayoutManager(requireContext(), VERTICAL, false) + ListViewMode.GRID, ListViewMode.GRID_TITLE -> GridLayoutManager(context, Config.LISTS_GRID_SPAN) + } + adapter?.listViewMode = it + fragmentListDetailsRecycler?.let { recycler -> + recycler.layoutManager = layoutManager + recycler.adapter = adapter } - ) + setupRecyclerPaddings() + fragmentListDetailsViewModeButton.setImageResource( + when (it) { + ListViewMode.LIST_NORMAL, ListViewMode.LIST_COMPACT -> R.drawable.ic_view_list + ListViewMode.GRID, ListViewMode.GRID_TITLE -> R.drawable.ic_view_grid + } + ) + } } - } - listDetails?.let { details -> - val isQuickRemoveEnabled = isQuickRemoveEnabled - fragmentListDetailsToolbar.subtitle = details.description - fragmentListDetailsMoreButton.onClick { openPopupMenu(isQuickRemoveEnabled) } - fragmentListDetailsFiltersView.setFilters(details.filterTypeLocal, details.sortByLocal, details.sortHowLocal) - } - listItems?.let { - val isRealEmpty = it.isEmpty() && listDetails?.filterTypeLocal?.containsAll(Mode.getAll()) == true - fragmentListDetailsEmptyView.fadeIf(it.isEmpty()) - fragmentListDetailsManageButton.visibleIf(!isRealEmpty) - fragmentListDetailsViewModeButton.visibleIf(!isRealEmpty) - - val scrollTop = resetScroll?.consume() == true - adapter?.setItems(it, scrollTop) - (layoutManager as? GridLayoutManager)?.withSpanSizeLookup { pos -> - adapter?.items?.get(pos)?.image?.type?.spanSize!! + listDetails?.let { details -> + val isQuickRemoveEnabled = isQuickRemoveEnabled + fragmentListDetailsToolbar.subtitle = details.description + fragmentListDetailsMoreButton.onClick { openPopupMenu(isQuickRemoveEnabled) } + fragmentListDetailsFiltersView.setFilters(details.filterTypeLocal, details.sortByLocal, details.sortHowLocal) } - } - isManageMode.let { isManageMode -> - if (listItems?.isEmpty() == true && listDetails?.filterTypeLocal?.containsAll(Mode.getAll()) == true) { - return@let + listItems?.let { + val isRealEmpty = it.isEmpty() && listDetails?.filterTypeLocal?.containsAll(Mode.getAll()) == true + fragmentListDetailsEmptyView.root.fadeIf(it.isEmpty()) + fragmentListDetailsManageButton.visibleIf(!isRealEmpty) + fragmentListDetailsViewModeButton.visibleIf(!isRealEmpty) + + val scrollTop = resetScroll?.consume() == true + adapter?.setItems(it, scrollTop) + (layoutManager as? GridLayoutManager)?.withSpanSizeLookup { pos -> + adapter?.items?.get(pos)?.image?.type?.spanSize!! + } } + isManageMode.let { isManageMode -> + if (listItems?.isEmpty() == true && listDetails?.filterTypeLocal?.containsAll(Mode.getAll()) == true) { + return@let + } - fragmentListDetailsManageButton.visibleIf(!isManageMode) - fragmentListDetailsMoreButton.visibleIf(!isManageMode) - fragmentListDetailsViewModeButton.visibleIf(!isManageMode) - - if (isManageMode) { - fragmentListDetailsToolbar.title = getString(R.string.textChangeRanks) - fragmentListDetailsToolbar.subtitle = getString(R.string.textChangeRanksSubtitle) - fragmentListDetailsRecycler.updatePadding( - top = if (layoutManager is GridLayoutManager) dimenToPx(R.dimen.spaceTiny) else 0, - bottom = recyclerPaddingBottom - ) - } else { - renderTitle(listDetails?.name ?: list.name, listItems?.size) - fragmentListDetailsToolbar.subtitle = listDetails?.description - fragmentListDetailsRecycler.updatePadding( - top = if (layoutManager is GridLayoutManager) recyclerPaddingGridTop else recyclerPaddingTop, - bottom = recyclerPaddingBottom - ) - } + fragmentListDetailsManageButton.visibleIf(!isManageMode) + fragmentListDetailsMoreButton.visibleIf(!isManageMode) + fragmentListDetailsViewModeButton.visibleIf(!isManageMode) + + if (isManageMode) { + fragmentListDetailsToolbar.title = getString(R.string.textChangeRanks) + fragmentListDetailsToolbar.subtitle = getString(R.string.textChangeRanksSubtitle) + fragmentListDetailsRecycler.updatePadding( + top = if (layoutManager is GridLayoutManager) dimenToPx(R.dimen.spaceTiny) else 0, + bottom = recyclerPaddingBottom + ) + } else { + renderTitle(listDetails?.name ?: list.name, listItems?.size) + fragmentListDetailsToolbar.subtitle = listDetails?.description + fragmentListDetailsRecycler.updatePadding( + top = if (layoutManager is GridLayoutManager) recyclerPaddingGridTop else recyclerPaddingTop, + bottom = recyclerPaddingBottom + ) + } - if (resetScroll?.consume() == true) { - fragmentListDetailsRecycler.scrollToPosition(0) - fragmentListDetailsFiltersView.translationY = 0F + if (resetScroll?.consume() == true) { + fragmentListDetailsRecycler.scrollToPosition(0) + fragmentListDetailsFiltersView.translationY = 0F + } + } + isFiltersVisible.let { + fragmentListDetailsFiltersView.visibleIf(it) + } + isLoading.let { + fragmentListDetailsLoadingView.visibleIf(it) + if (it) disableUi() else enableUi() + } + deleteEvent?.let { event -> + event.consume()?.let { activity?.onBackPressed() } } - } - isFiltersVisible.let { - fragmentListDetailsFiltersView.visibleIf(it) - } - isLoading.let { - fragmentListDetailsLoadingView.visibleIf(it) - if (it) disableUi() else enableUi() - } - deleteEvent?.let { event -> - event.consume()?.let { activity?.onBackPressed() } } } } @@ -412,7 +408,7 @@ class ListDetailsFragment : override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) - outState.putFloat(ARG_HEADER_TRANSLATION, fragmentListDetailsFiltersView?.translationY ?: 0F) + outState.putFloat(ARG_HEADER_TRANSLATION, binding.fragmentListDetailsFiltersView?.translationY ?: 0F) } override fun onDestroyView() { diff --git a/ui-lists/src/main/java/com/michaldrabik/ui_lists/details/views/ListDetailsDeleteConfirmView.kt b/ui-lists/src/main/java/com/michaldrabik/ui_lists/details/views/ListDetailsDeleteConfirmView.kt index 7d9e35f7e0..c271d17568 100644 --- a/ui-lists/src/main/java/com/michaldrabik/ui_lists/details/views/ListDetailsDeleteConfirmView.kt +++ b/ui-lists/src/main/java/com/michaldrabik/ui_lists/details/views/ListDetailsDeleteConfirmView.kt @@ -2,10 +2,11 @@ package com.michaldrabik.ui_lists.details.views import android.content.Context import android.util.AttributeSet +import android.view.LayoutInflater import android.view.ViewGroup.LayoutParams.MATCH_PARENT import android.view.ViewGroup.LayoutParams.WRAP_CONTENT import android.widget.FrameLayout -import com.michaldrabik.ui_lists.R +import com.michaldrabik.ui_lists.databinding.ViewListDeleteConfirmBinding class ListDetailsDeleteConfirmView : FrameLayout { @@ -13,8 +14,9 @@ class ListDetailsDeleteConfirmView : FrameLayout { constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr) + val binding = ViewListDeleteConfirmBinding.inflate(LayoutInflater.from(context), this) + init { - inflate(context, R.layout.view_list_delete_confirm, this) layoutParams = LayoutParams(MATCH_PARENT, WRAP_CONTENT) } } diff --git a/ui-lists/src/main/java/com/michaldrabik/ui_lists/details/views/ListDetailsMovieItemView.kt b/ui-lists/src/main/java/com/michaldrabik/ui_lists/details/views/ListDetailsMovieItemView.kt index 0fbf224bb4..2ca426a4f2 100644 --- a/ui-lists/src/main/java/com/michaldrabik/ui_lists/details/views/ListDetailsMovieItemView.kt +++ b/ui-lists/src/main/java/com/michaldrabik/ui_lists/details/views/ListDetailsMovieItemView.kt @@ -4,6 +4,7 @@ import android.annotation.SuppressLint import android.content.Context import android.content.res.ColorStateList import android.util.AttributeSet +import android.view.LayoutInflater import android.view.MotionEvent.ACTION_DOWN import android.view.MotionEvent.ACTION_MOVE import android.view.MotionEvent.ACTION_UP @@ -20,10 +21,9 @@ import com.michaldrabik.ui_base.utilities.extensions.expandTouch import com.michaldrabik.ui_base.utilities.extensions.onClick import com.michaldrabik.ui_base.utilities.extensions.visibleIf import com.michaldrabik.ui_lists.R +import com.michaldrabik.ui_lists.databinding.ViewListDetailsMovieItemBinding import com.michaldrabik.ui_lists.details.recycler.ListDetailsItem import com.michaldrabik.ui_model.Movie -import kotlinx.android.synthetic.main.view_list_details_movie_item.view.* -import kotlinx.android.synthetic.main.view_list_details_show_item.view.* import java.util.Locale.ENGLISH import kotlin.math.abs @@ -34,8 +34,9 @@ class ListDetailsMovieItemView : ListDetailsItemView { constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr) + private val binding = ViewListDetailsMovieItemBinding.inflate(LayoutInflater.from(context), this) + init { - inflate(context, R.layout.view_list_details_movie_item, this) layoutParams = LayoutParams(MATCH_PARENT, WRAP_CONTENT) setBackgroundColor(context.colorFromAttr(android.R.attr.windowBackground)) @@ -45,71 +46,77 @@ class ListDetailsMovieItemView : ListDetailsItemView { } } - listDetailsMovieHandle.expandTouch(100) - listDetailsMovieHandle.setOnTouchListener { _, event -> - if (item.isManageMode && event.action == ACTION_DOWN) { - itemDragStartListener?.invoke() + with(binding) { + listDetailsMovieHandle.expandTouch(100) + listDetailsMovieHandle.setOnTouchListener { _, event -> + if (item.isManageMode && event.action == ACTION_DOWN) { + itemDragStartListener?.invoke() + } + false } - false - } - var x = 0F - listDetailsMovieRoot.setOnTouchListener { _, event -> - if (item.isManageMode) { - return@setOnTouchListener false - } - if (event.action == ACTION_DOWN) x = event.x - if (event.action == ACTION_UP) x = 0F - if (event.action == ACTION_MOVE && abs(x - event.x) > 50F) { - itemSwipeStartListener?.invoke() - return@setOnTouchListener true + var x = 0F + listDetailsMovieRoot.setOnTouchListener { _, event -> + if (item.isManageMode) { + return@setOnTouchListener false + } + if (event.action == ACTION_DOWN) x = event.x + if (event.action == ACTION_UP) x = 0F + if (event.action == ACTION_MOVE && abs(x - event.x) > 50F) { + itemSwipeStartListener?.invoke() + return@setOnTouchListener true + } + false } - false - } - listDetailsMovieRoot.onClick { - if (item.isEnabled && !item.isManageMode) itemClickListener?.invoke(item) + listDetailsMovieRoot.onClick { + if (item.isEnabled && !item.isManageMode) itemClickListener?.invoke(item) + } } } - override val imageView: ImageView = listDetailsMovieImage - override val placeholderView: ImageView = listDetailsMoviePlaceholder + override val imageView: ImageView = binding.listDetailsMovieImage + override val placeholderView: ImageView = binding.listDetailsMoviePlaceholder override fun bind(item: ListDetailsItem) { super.bind(item) - Glide.with(this).clear(listDetailsMovieImage) - val movie = item.requireMovie() - listDetailsMovieProgress.visibleIf(item.isLoading) + with(binding) { + Glide.with(this@ListDetailsMovieItemView).clear(listDetailsMovieImage) + val movie = item.requireMovie() + + listDetailsMovieProgress.visibleIf(item.isLoading) - listDetailsMovieTitle.text = - if (item.translation?.title.isNullOrBlank()) movie.title - else item.translation?.title + listDetailsMovieTitle.text = + if (item.translation?.title.isNullOrBlank()) movie.title + else item.translation?.title - bindDescription(item, movie) - bindRating(item, movie) + bindDescription(item, movie) + bindRating(item, movie) - listDetailsMovieHeader.text = String.format(ENGLISH, "%d", movie.year) - listDetailsMovieUserRating.text = String.format(ENGLISH, "%d", item.userRating) + listDetailsMovieHeader.text = String.format(ENGLISH, "%d", movie.year) + listDetailsMovieUserRating.text = String.format(ENGLISH, "%d", item.userRating) - listDetailsMovieRank.visibleIf(item.isRankDisplayed) - listDetailsMovieRank.text = String.format(ENGLISH, "%d", item.rankDisplay) + listDetailsMovieRank.visibleIf(item.isRankDisplayed) + listDetailsMovieRank.text = String.format(ENGLISH, "%d", item.rankDisplay) - listDetailsMovieHandle.visibleIf(item.isManageMode) - listDetailsMovieStarIcon.visibleIf(!item.isManageMode) - listDetailsMovieUserStarIcon.visibleIf(!item.isManageMode && item.userRating != null) - listDetailsMovieUserRating.visibleIf(!item.isManageMode && item.userRating != null) + listDetailsMovieHandle.visibleIf(item.isManageMode) + listDetailsMovieStarIcon.visibleIf(!item.isManageMode) + listDetailsMovieUserStarIcon.visibleIf(!item.isManageMode && item.userRating != null) + listDetailsMovieUserRating.visibleIf(!item.isManageMode && item.userRating != null) - with(listDetailsMovieHeaderBadge) { - val inCollection = item.isWatched || item.isWatchlist - visibleIf(inCollection) - if (inCollection) { - val color = if (item.isWatched) R.color.colorAccent else R.color.colorGrayLight - imageTintList = ColorStateList.valueOf(ContextCompat.getColor(context, color)) + with(listDetailsMovieHeaderBadge) { + val inCollection = item.isWatched || item.isWatchlist + visibleIf(inCollection) + if (inCollection) { + val color = if (item.isWatched) R.color.colorAccent else R.color.colorGrayLight + imageTintList = ColorStateList.valueOf(ContextCompat.getColor(context, color)) + } } + + listDetailsMovieRoot.alpha = if (item.isEnabled) 1F else 0.45F } - listDetailsMovieRoot.alpha = if (item.isEnabled) 1F else 0.45F loadImage(item) } @@ -129,13 +136,13 @@ class ListDetailsMovieItemView : ListDetailsItemView { val isWatchlistHidden = item.spoilers.isWatchlistMoviesHidden && item.isWatchlist val isNotCollectedHidden = item.spoilers.isNotCollectedMoviesHidden && (!item.isWatched && !item.isWatchlist) if (isMyHidden || isWatchlistHidden || isNotCollectedHidden) { - listDetailsMovieDescription.tag = description + binding.listDetailsMovieDescription.tag = description description = SPOILERS_REGEX.replace(description.toString(), Config.SPOILERS_HIDE_SYMBOL) } - listDetailsMovieDescription.text = description + binding.listDetailsMovieDescription.text = description if (item.spoilers.isTapToReveal) { - with(listDetailsMovieDescription) { + with(binding.listDetailsMovieDescription) { onClick { tag?.let { text = it.toString() } isClickable = false @@ -154,15 +161,15 @@ class ListDetailsMovieItemView : ListDetailsItemView { val isWatchlistHidden = item.spoilers.isWatchlistMoviesRatingsHidden && item.isWatchlist val isNotCollectedHidden = item.spoilers.isNotCollectedMoviesRatingsHidden && (!item.isWatched && !item.isWatchlist) if (isMyHidden || isWatchlistHidden || isNotCollectedHidden) { - listDetailsMovieRating.tag = rating + binding.listDetailsMovieRating.tag = rating rating = SPOILERS_RATINGS_HIDE_SYMBOL } - listDetailsMovieRating.visibleIf(!item.isManageMode) - listDetailsMovieRating.text = rating + binding.listDetailsMovieRating.visibleIf(!item.isManageMode) + binding.listDetailsMovieRating.text = rating if (item.spoilers.isTapToReveal) { - with(listDetailsMovieRating) { + with(binding.listDetailsMovieRating) { onClick { tag?.let { text = it.toString() } isClickable = false diff --git a/ui-lists/src/main/java/com/michaldrabik/ui_lists/details/views/ListDetailsShowItemView.kt b/ui-lists/src/main/java/com/michaldrabik/ui_lists/details/views/ListDetailsShowItemView.kt index b098d8761b..6060abeab6 100644 --- a/ui-lists/src/main/java/com/michaldrabik/ui_lists/details/views/ListDetailsShowItemView.kt +++ b/ui-lists/src/main/java/com/michaldrabik/ui_lists/details/views/ListDetailsShowItemView.kt @@ -4,6 +4,7 @@ import android.annotation.SuppressLint import android.content.Context import android.content.res.ColorStateList import android.util.AttributeSet +import android.view.LayoutInflater import android.view.MotionEvent.ACTION_DOWN import android.view.MotionEvent.ACTION_MOVE import android.view.MotionEvent.ACTION_UP @@ -20,9 +21,9 @@ import com.michaldrabik.ui_base.utilities.extensions.expandTouch import com.michaldrabik.ui_base.utilities.extensions.onClick import com.michaldrabik.ui_base.utilities.extensions.visibleIf import com.michaldrabik.ui_lists.R +import com.michaldrabik.ui_lists.databinding.ViewListDetailsShowItemBinding import com.michaldrabik.ui_lists.details.recycler.ListDetailsItem import com.michaldrabik.ui_model.Show -import kotlinx.android.synthetic.main.view_list_details_show_item.view.* import java.util.Locale.ENGLISH import kotlin.math.abs @@ -33,8 +34,9 @@ class ListDetailsShowItemView : ListDetailsItemView { constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr) + private val binding = ViewListDetailsShowItemBinding.inflate(LayoutInflater.from(context), this) + init { - inflate(context, R.layout.view_list_details_show_item, this) layoutParams = LayoutParams(MATCH_PARENT, WRAP_CONTENT) setBackgroundColor(context.colorFromAttr(android.R.attr.windowBackground)) @@ -44,71 +46,76 @@ class ListDetailsShowItemView : ListDetailsItemView { } } - listDetailsShowHandle.expandTouch(100) - listDetailsShowHandle.setOnTouchListener { _, event -> - if (item.isManageMode && event.action == ACTION_DOWN) { - itemDragStartListener?.invoke() + with(binding) { + listDetailsShowHandle.expandTouch(100) + listDetailsShowHandle.setOnTouchListener { _, event -> + if (item.isManageMode && event.action == ACTION_DOWN) { + itemDragStartListener?.invoke() + } + false } - false - } - var x = 0F - listDetailsShowRoot.setOnTouchListener { _, event -> - if (item.isManageMode) { - return@setOnTouchListener false - } - if (event.action == ACTION_DOWN) x = event.x - if (event.action == ACTION_UP) x = 0F - if (event.action == ACTION_MOVE && abs(x - event.x) > 50F) { - itemSwipeStartListener?.invoke() - return@setOnTouchListener true + var x = 0F + listDetailsShowRoot.setOnTouchListener { _, event -> + if (item.isManageMode) { + return@setOnTouchListener false + } + if (event.action == ACTION_DOWN) x = event.x + if (event.action == ACTION_UP) x = 0F + if (event.action == ACTION_MOVE && abs(x - event.x) > 50F) { + itemSwipeStartListener?.invoke() + return@setOnTouchListener true + } + false } - false - } - listDetailsShowRoot.onClick { - if (!item.isManageMode) itemClickListener?.invoke(item) + listDetailsShowRoot.onClick { + if (!item.isManageMode) itemClickListener?.invoke(item) + } } } - override val imageView: ImageView = listDetailsShowImage - override val placeholderView: ImageView = listDetailsShowPlaceholder + override val imageView: ImageView = binding.listDetailsShowImage + override val placeholderView: ImageView = binding.listDetailsShowPlaceholder override fun bind(item: ListDetailsItem) { super.bind(item) - Glide.with(this).clear(listDetailsShowImage) - val show = item.requireShow() + with(binding) { + Glide.with(this@ListDetailsShowItemView).clear(listDetailsShowImage) - listDetailsShowProgress.visibleIf(item.isLoading) + val show = item.requireShow() - listDetailsShowTitle.text = - if (item.translation?.title.isNullOrBlank()) show.title - else item.translation?.title + listDetailsShowProgress.visibleIf(item.isLoading) - bindDescription(item, show) - bindRating(item, show) + listDetailsShowTitle.text = + if (item.translation?.title.isNullOrBlank()) show.title + else item.translation?.title - listDetailsShowHeader.text = - if (show.year > 0) context.getString(R.string.textNetwork, show.year.toString(), show.network) - else String.format("%s", show.network) + bindDescription(item, show) + bindRating(item, show) - listDetailsShowUserRating.text = String.format(ENGLISH, "%d", item.userRating) + listDetailsShowHeader.text = + if (show.year > 0) context.getString(R.string.textNetwork, show.year.toString(), show.network) + else String.format("%s", show.network) - listDetailsShowRank.visibleIf(item.isRankDisplayed) - listDetailsShowRank.text = String.format(ENGLISH, "%d", item.rankDisplay) + listDetailsShowUserRating.text = String.format(ENGLISH, "%d", item.userRating) - listDetailsShowHandle.visibleIf(item.isManageMode) - listDetailsShowStarIcon.visibleIf(!item.isManageMode) - listDetailsShowUserStarIcon.visibleIf(!item.isManageMode && item.userRating != null) - listDetailsShowUserRating.visibleIf(!item.isManageMode && item.userRating != null) + listDetailsShowRank.visibleIf(item.isRankDisplayed) + listDetailsShowRank.text = String.format(ENGLISH, "%d", item.rankDisplay) - with(listDetailsShowHeaderBadge) { - val inCollection = item.isWatched || item.isWatchlist - visibleIf(inCollection) - if (inCollection) { - val color = if (item.isWatched) R.color.colorAccent else R.color.colorGrayLight - imageTintList = ColorStateList.valueOf(ContextCompat.getColor(context, color)) + listDetailsShowHandle.visibleIf(item.isManageMode) + listDetailsShowStarIcon.visibleIf(!item.isManageMode) + listDetailsShowUserStarIcon.visibleIf(!item.isManageMode && item.userRating != null) + listDetailsShowUserRating.visibleIf(!item.isManageMode && item.userRating != null) + + with(listDetailsShowHeaderBadge) { + val inCollection = item.isWatched || item.isWatchlist + visibleIf(inCollection) + if (inCollection) { + val color = if (item.isWatched) R.color.colorAccent else R.color.colorGrayLight + imageTintList = ColorStateList.valueOf(ContextCompat.getColor(context, color)) + } } } @@ -130,13 +137,13 @@ class ListDetailsShowItemView : ListDetailsItemView { val isWatchlistHidden = item.spoilers.isWatchlistShowsHidden && item.isWatchlist val isNotCollectedHidden = item.spoilers.isNotCollectedShowsHidden && (!item.isWatched && !item.isWatchlist) if (isMyHidden || isWatchlistHidden || isNotCollectedHidden) { - listDetailsShowDescription.tag = description + binding.listDetailsShowDescription.tag = description description = SPOILERS_REGEX.replace(description.toString(), SPOILERS_HIDE_SYMBOL) } - listDetailsShowDescription.text = description + binding.listDetailsShowDescription.text = description if (item.spoilers.isTapToReveal) { - with(listDetailsShowDescription) { + with(binding.listDetailsShowDescription) { onClick { tag?.let { text = it.toString() } isClickable = false @@ -155,15 +162,15 @@ class ListDetailsShowItemView : ListDetailsItemView { val isWatchlistHidden = item.spoilers.isWatchlistShowsRatingsHidden && item.isWatchlist val isNotCollectedHidden = item.spoilers.isNotCollectedShowsRatingsHidden && (!item.isWatched && !item.isWatchlist) if (isMyHidden || isWatchlistHidden || isNotCollectedHidden) { - listDetailsShowRating.tag = rating + binding.listDetailsShowRating.tag = rating rating = SPOILERS_RATINGS_HIDE_SYMBOL } - listDetailsShowRating.visibleIf(!item.isManageMode) - listDetailsShowRating.text = rating + binding.listDetailsShowRating.visibleIf(!item.isManageMode) + binding.listDetailsShowRating.text = rating if (item.spoilers.isTapToReveal) { - with(listDetailsShowRating) { + with(binding.listDetailsShowRating) { onClick { tag?.let { text = it.toString() } isClickable = false diff --git a/ui-lists/src/main/java/com/michaldrabik/ui_lists/details/views/compact/ListDetailsCompactMovieItemView.kt b/ui-lists/src/main/java/com/michaldrabik/ui_lists/details/views/compact/ListDetailsCompactMovieItemView.kt index 9d100a2f0c..c040c45533 100644 --- a/ui-lists/src/main/java/com/michaldrabik/ui_lists/details/views/compact/ListDetailsCompactMovieItemView.kt +++ b/ui-lists/src/main/java/com/michaldrabik/ui_lists/details/views/compact/ListDetailsCompactMovieItemView.kt @@ -4,6 +4,7 @@ import android.annotation.SuppressLint import android.content.Context import android.content.res.ColorStateList import android.util.AttributeSet +import android.view.LayoutInflater import android.view.MotionEvent.ACTION_DOWN import android.view.MotionEvent.ACTION_MOVE import android.view.MotionEvent.ACTION_UP @@ -18,11 +19,10 @@ import com.michaldrabik.ui_base.utilities.extensions.expandTouch import com.michaldrabik.ui_base.utilities.extensions.onClick import com.michaldrabik.ui_base.utilities.extensions.visibleIf import com.michaldrabik.ui_lists.R +import com.michaldrabik.ui_lists.databinding.ViewListDetailsMovieItemCompactBinding import com.michaldrabik.ui_lists.details.recycler.ListDetailsItem import com.michaldrabik.ui_lists.details.views.ListDetailsItemView import com.michaldrabik.ui_model.Movie -import kotlinx.android.synthetic.main.view_list_details_movie_item_compact.view.* -import kotlinx.android.synthetic.main.view_list_details_show_item_compact.view.* import java.util.Locale.ENGLISH import kotlin.math.abs @@ -33,8 +33,9 @@ class ListDetailsCompactMovieItemView : ListDetailsItemView { constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr) + private val binding = ViewListDetailsMovieItemCompactBinding.inflate(LayoutInflater.from(context), this) + init { - inflate(context, R.layout.view_list_details_movie_item_compact, this) layoutParams = LayoutParams(MATCH_PARENT, WRAP_CONTENT) setBackgroundColor(context.colorFromAttr(android.R.attr.windowBackground)) @@ -44,69 +45,73 @@ class ListDetailsCompactMovieItemView : ListDetailsItemView { } } - listDetailsMovieHandle.expandTouch(100) - listDetailsMovieHandle.setOnTouchListener { _, event -> - if (item.isManageMode && event.action == ACTION_DOWN) { - itemDragStartListener?.invoke() + with(binding) { + listDetailsMovieHandle.expandTouch(100) + listDetailsMovieHandle.setOnTouchListener { _, event -> + if (item.isManageMode && event.action == ACTION_DOWN) { + itemDragStartListener?.invoke() + } + false } - false - } - var x = 0F - listDetailsMovieRoot.setOnTouchListener { _, event -> - if (item.isManageMode) { - return@setOnTouchListener false - } - if (event.action == ACTION_DOWN) x = event.x - if (event.action == ACTION_UP) x = 0F - if (event.action == ACTION_MOVE && abs(x - event.x) > 50F) { - itemSwipeStartListener?.invoke() - return@setOnTouchListener true + var x = 0F + listDetailsMovieRoot.setOnTouchListener { _, event -> + if (item.isManageMode) { + return@setOnTouchListener false + } + if (event.action == ACTION_DOWN) x = event.x + if (event.action == ACTION_UP) x = 0F + if (event.action == ACTION_MOVE && abs(x - event.x) > 50F) { + itemSwipeStartListener?.invoke() + return@setOnTouchListener true + } + false } - false - } - listDetailsMovieRoot.onClick { - if (item.isEnabled && !item.isManageMode) itemClickListener?.invoke(item) + listDetailsMovieRoot.onClick { + if (item.isEnabled && !item.isManageMode) itemClickListener?.invoke(item) + } } } - override val imageView: ImageView = listDetailsMovieImage - override val placeholderView: ImageView = listDetailsMoviePlaceholder + override val imageView: ImageView = binding.listDetailsMovieImage + override val placeholderView: ImageView = binding.listDetailsMoviePlaceholder override fun bind(item: ListDetailsItem) { super.bind(item) - Glide.with(this).clear(listDetailsMovieImage) - val movie = item.requireMovie() - - listDetailsMovieProgress.visibleIf(item.isLoading) - - listDetailsMovieTitle.text = - if (item.translation?.title.isNullOrBlank()) movie.title - else item.translation?.title - - listDetailsMovieHeader.text = String.format(ENGLISH, "%d", movie.year) - listDetailsMovieUserRating.text = String.format(ENGLISH, "%d", item.userRating) - bindRating(item, movie) - - listDetailsMovieRank.visibleIf(item.isRankDisplayed) - listDetailsMovieRank.text = String.format(ENGLISH, "%d", item.rankDisplay) - - listDetailsMovieHandle.visibleIf(item.isManageMode) - listDetailsMovieStarIcon.visibleIf(!item.isManageMode) - listDetailsMovieUserStarIcon.visibleIf(!item.isManageMode && item.userRating != null) - listDetailsMovieUserRating.visibleIf(!item.isManageMode && item.userRating != null) - - with(listDetailsMovieHeaderBadge) { - val inCollection = item.isWatched || item.isWatchlist - visibleIf(inCollection) - if (inCollection) { - val color = if (item.isWatched) R.color.colorAccent else R.color.colorGrayLight - imageTintList = ColorStateList.valueOf(ContextCompat.getColor(context, color)) + with(binding) { + Glide.with(this@ListDetailsCompactMovieItemView).clear(listDetailsMovieImage) + val movie = item.requireMovie() + + listDetailsMovieProgress.visibleIf(item.isLoading) + + listDetailsMovieTitle.text = + if (item.translation?.title.isNullOrBlank()) movie.title + else item.translation?.title + + listDetailsMovieHeader.text = String.format(ENGLISH, "%d", movie.year) + listDetailsMovieUserRating.text = String.format(ENGLISH, "%d", item.userRating) + bindRating(item, movie) + + listDetailsMovieRank.visibleIf(item.isRankDisplayed) + listDetailsMovieRank.text = String.format(ENGLISH, "%d", item.rankDisplay) + + listDetailsMovieHandle.visibleIf(item.isManageMode) + listDetailsMovieStarIcon.visibleIf(!item.isManageMode) + listDetailsMovieUserStarIcon.visibleIf(!item.isManageMode && item.userRating != null) + listDetailsMovieUserRating.visibleIf(!item.isManageMode && item.userRating != null) + + with(listDetailsMovieHeaderBadge) { + val inCollection = item.isWatched || item.isWatchlist + visibleIf(inCollection) + if (inCollection) { + val color = if (item.isWatched) R.color.colorAccent else R.color.colorGrayLight + imageTintList = ColorStateList.valueOf(ContextCompat.getColor(context, color)) + } } - } - listDetailsMovieRoot.alpha = if (item.isEnabled) 1F else 0.45F + listDetailsMovieRoot.alpha = if (item.isEnabled) 1F else 0.45F + } loadImage(item) } @@ -114,26 +119,28 @@ class ListDetailsCompactMovieItemView : ListDetailsItemView { item: ListDetailsItem, movie: Movie, ) { - var rating = String.format(ENGLISH, "%.1f", movie.rating) - - val isMyHidden = item.spoilers.isMyMoviesRatingsHidden && item.isWatched - val isWatchlistHidden = item.spoilers.isWatchlistMoviesRatingsHidden && item.isWatchlist - val isNotCollectedHidden = item.spoilers.isNotCollectedMoviesRatingsHidden && (!item.isWatched && !item.isWatchlist) - if (isMyHidden || isWatchlistHidden || isNotCollectedHidden) { - listDetailsMovieRating.tag = rating - rating = SPOILERS_RATINGS_HIDE_SYMBOL - - if (item.spoilers.isTapToReveal) { - with(listDetailsMovieRating) { - onClick { - tag?.let { text = it.toString() } - isClickable = false + with(binding) { + var rating = String.format(ENGLISH, "%.1f", movie.rating) + + val isMyHidden = item.spoilers.isMyMoviesRatingsHidden && item.isWatched + val isWatchlistHidden = item.spoilers.isWatchlistMoviesRatingsHidden && item.isWatchlist + val isNotCollectedHidden = item.spoilers.isNotCollectedMoviesRatingsHidden && (!item.isWatched && !item.isWatchlist) + if (isMyHidden || isWatchlistHidden || isNotCollectedHidden) { + listDetailsMovieRating.tag = rating + rating = SPOILERS_RATINGS_HIDE_SYMBOL + + if (item.spoilers.isTapToReveal) { + with(listDetailsMovieRating) { + onClick { + tag?.let { text = it.toString() } + isClickable = false + } } } } - } - listDetailsMovieRating.visibleIf(!item.isManageMode) - listDetailsMovieRating.text = rating + listDetailsMovieRating.visibleIf(!item.isManageMode) + listDetailsMovieRating.text = rating + } } } diff --git a/ui-lists/src/main/java/com/michaldrabik/ui_lists/details/views/compact/ListDetailsCompactShowItemView.kt b/ui-lists/src/main/java/com/michaldrabik/ui_lists/details/views/compact/ListDetailsCompactShowItemView.kt index 10eb044184..a344df7f5a 100644 --- a/ui-lists/src/main/java/com/michaldrabik/ui_lists/details/views/compact/ListDetailsCompactShowItemView.kt +++ b/ui-lists/src/main/java/com/michaldrabik/ui_lists/details/views/compact/ListDetailsCompactShowItemView.kt @@ -4,6 +4,7 @@ import android.annotation.SuppressLint import android.content.Context import android.content.res.ColorStateList import android.util.AttributeSet +import android.view.LayoutInflater import android.view.MotionEvent.ACTION_DOWN import android.view.MotionEvent.ACTION_MOVE import android.view.MotionEvent.ACTION_UP @@ -18,24 +19,10 @@ import com.michaldrabik.ui_base.utilities.extensions.expandTouch import com.michaldrabik.ui_base.utilities.extensions.onClick import com.michaldrabik.ui_base.utilities.extensions.visibleIf import com.michaldrabik.ui_lists.R +import com.michaldrabik.ui_lists.databinding.ViewListDetailsShowItemCompactBinding import com.michaldrabik.ui_lists.details.recycler.ListDetailsItem import com.michaldrabik.ui_lists.details.views.ListDetailsItemView import com.michaldrabik.ui_model.Show -import kotlinx.android.synthetic.main.view_list_details_show_item.view.* -import kotlinx.android.synthetic.main.view_list_details_show_item_compact.view.* -import kotlinx.android.synthetic.main.view_list_details_show_item_compact.view.listDetailsShowHandle -import kotlinx.android.synthetic.main.view_list_details_show_item_compact.view.listDetailsShowHeader -import kotlinx.android.synthetic.main.view_list_details_show_item_compact.view.listDetailsShowHeaderBadge -import kotlinx.android.synthetic.main.view_list_details_show_item_compact.view.listDetailsShowImage -import kotlinx.android.synthetic.main.view_list_details_show_item_compact.view.listDetailsShowPlaceholder -import kotlinx.android.synthetic.main.view_list_details_show_item_compact.view.listDetailsShowProgress -import kotlinx.android.synthetic.main.view_list_details_show_item_compact.view.listDetailsShowRank -import kotlinx.android.synthetic.main.view_list_details_show_item_compact.view.listDetailsShowRating -import kotlinx.android.synthetic.main.view_list_details_show_item_compact.view.listDetailsShowRoot -import kotlinx.android.synthetic.main.view_list_details_show_item_compact.view.listDetailsShowStarIcon -import kotlinx.android.synthetic.main.view_list_details_show_item_compact.view.listDetailsShowTitle -import kotlinx.android.synthetic.main.view_list_details_show_item_compact.view.listDetailsShowUserRating -import kotlinx.android.synthetic.main.view_list_details_show_item_compact.view.listDetailsShowUserStarIcon import java.util.Locale.ENGLISH import kotlin.math.abs @@ -46,8 +33,9 @@ class ListDetailsCompactShowItemView : ListDetailsItemView { constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr) + private val binding = ViewListDetailsShowItemCompactBinding.inflate(LayoutInflater.from(context), this) + init { - inflate(context, R.layout.view_list_details_show_item_compact, this) layoutParams = LayoutParams(MATCH_PARENT, WRAP_CONTENT) setBackgroundColor(context.colorFromAttr(android.R.attr.windowBackground)) @@ -57,69 +45,74 @@ class ListDetailsCompactShowItemView : ListDetailsItemView { } } - listDetailsShowHandle.expandTouch(100) - listDetailsShowHandle.setOnTouchListener { _, event -> - if (item.isManageMode && event.action == ACTION_DOWN) { - itemDragStartListener?.invoke() + with(binding) { + listDetailsShowHandle.expandTouch(100) + listDetailsShowHandle.setOnTouchListener { _, event -> + if (item.isManageMode && event.action == ACTION_DOWN) { + itemDragStartListener?.invoke() + } + false } - false - } - var x = 0F - listDetailsShowRoot.setOnTouchListener { _, event -> - if (item.isManageMode) { - return@setOnTouchListener false - } - if (event.action == ACTION_DOWN) x = event.x - if (event.action == ACTION_UP) x = 0F - if (event.action == ACTION_MOVE && abs(x - event.x) > 50F) { - itemSwipeStartListener?.invoke() - return@setOnTouchListener true + var x = 0F + listDetailsShowRoot.setOnTouchListener { _, event -> + if (item.isManageMode) { + return@setOnTouchListener false + } + if (event.action == ACTION_DOWN) x = event.x + if (event.action == ACTION_UP) x = 0F + if (event.action == ACTION_MOVE && abs(x - event.x) > 50F) { + itemSwipeStartListener?.invoke() + return@setOnTouchListener true + } + false } - false - } - listDetailsShowRoot.onClick { - if (!item.isManageMode) itemClickListener?.invoke(item) + listDetailsShowRoot.onClick { + if (!item.isManageMode) itemClickListener?.invoke(item) + } } } - override val imageView: ImageView = listDetailsShowImage - override val placeholderView: ImageView = listDetailsShowPlaceholder + override val imageView: ImageView = binding.listDetailsShowImage + override val placeholderView: ImageView = binding.listDetailsShowPlaceholder override fun bind(item: ListDetailsItem) { super.bind(item) - Glide.with(this).clear(listDetailsShowImage) - val show = item.requireShow() + with(binding) { + Glide.with(this@ListDetailsCompactShowItemView).clear(listDetailsShowImage) + + val show = item.requireShow() - listDetailsShowProgress.visibleIf(item.isLoading) + listDetailsShowProgress.visibleIf(item.isLoading) - listDetailsShowTitle.text = - if (item.translation?.title.isNullOrBlank()) show.title - else item.translation?.title + listDetailsShowTitle.text = + if (item.translation?.title.isNullOrBlank()) show.title + else item.translation?.title - listDetailsShowHeader.text = - if (show.year > 0) context.getString(R.string.textNetwork, show.year.toString(), show.network) - else String.format("%s", show.network) + listDetailsShowHeader.text = + if (show.year > 0) context.getString(R.string.textNetwork, show.year.toString(), show.network) + else String.format("%s", show.network) - bindRating(item, show) - listDetailsShowUserRating.text = String.format(ENGLISH, "%d", item.userRating) + bindRating(item, show) + listDetailsShowUserRating.text = String.format(ENGLISH, "%d", item.userRating) - listDetailsShowRank.visibleIf(item.isRankDisplayed) - listDetailsShowRank.text = String.format(ENGLISH, "%d", item.rankDisplay) + listDetailsShowRank.visibleIf(item.isRankDisplayed) + listDetailsShowRank.text = String.format(ENGLISH, "%d", item.rankDisplay) - listDetailsShowHandle.visibleIf(item.isManageMode) - listDetailsShowStarIcon.visibleIf(!item.isManageMode) - listDetailsShowUserStarIcon.visibleIf(!item.isManageMode && item.userRating != null) - listDetailsShowUserRating.visibleIf(!item.isManageMode && item.userRating != null) + listDetailsShowHandle.visibleIf(item.isManageMode) + listDetailsShowStarIcon.visibleIf(!item.isManageMode) + listDetailsShowUserStarIcon.visibleIf(!item.isManageMode && item.userRating != null) + listDetailsShowUserRating.visibleIf(!item.isManageMode && item.userRating != null) - with(listDetailsShowHeaderBadge) { - val inCollection = item.isWatched || item.isWatchlist - visibleIf(inCollection) - if (inCollection) { - val color = if (item.isWatched) R.color.colorAccent else R.color.colorGrayLight - imageTintList = ColorStateList.valueOf(ContextCompat.getColor(context, color)) + with(listDetailsShowHeaderBadge) { + val inCollection = item.isWatched || item.isWatchlist + visibleIf(inCollection) + if (inCollection) { + val color = if (item.isWatched) R.color.colorAccent else R.color.colorGrayLight + imageTintList = ColorStateList.valueOf(ContextCompat.getColor(context, color)) + } } } @@ -130,26 +123,28 @@ class ListDetailsCompactShowItemView : ListDetailsItemView { item: ListDetailsItem, show: Show, ) { - var rating = String.format(ENGLISH, "%.1f", show.rating) - - val isMyHidden = item.spoilers.isMyShowsRatingsHidden && item.isWatched - val isWatchlistHidden = item.spoilers.isWatchlistShowsRatingsHidden && item.isWatchlist - val isNotCollectedHidden = item.spoilers.isNotCollectedShowsRatingsHidden && (!item.isWatched && !item.isWatchlist) - if (isMyHidden || isWatchlistHidden || isNotCollectedHidden) { - listDetailsShowRating.tag = rating - rating = SPOILERS_RATINGS_HIDE_SYMBOL - - if (item.spoilers.isTapToReveal) { - with(listDetailsShowRating) { - onClick { - tag?.let { text = it.toString() } - isClickable = false + with(binding) { + var rating = String.format(ENGLISH, "%.1f", show.rating) + + val isMyHidden = item.spoilers.isMyShowsRatingsHidden && item.isWatched + val isWatchlistHidden = item.spoilers.isWatchlistShowsRatingsHidden && item.isWatchlist + val isNotCollectedHidden = item.spoilers.isNotCollectedShowsRatingsHidden && (!item.isWatched && !item.isWatchlist) + if (isMyHidden || isWatchlistHidden || isNotCollectedHidden) { + listDetailsShowRating.tag = rating + rating = SPOILERS_RATINGS_HIDE_SYMBOL + + if (item.spoilers.isTapToReveal) { + with(listDetailsShowRating) { + onClick { + tag?.let { text = it.toString() } + isClickable = false + } } } } - } - listDetailsShowRating.visibleIf(!item.isManageMode) - listDetailsShowRating.text = rating + listDetailsShowRating.visibleIf(!item.isManageMode) + listDetailsShowRating.text = rating + } } } diff --git a/ui-lists/src/main/java/com/michaldrabik/ui_lists/lists/ListsFragment.kt b/ui-lists/src/main/java/com/michaldrabik/ui_lists/lists/ListsFragment.kt index 172dc9cde3..36b8836955 100644 --- a/ui-lists/src/main/java/com/michaldrabik/ui_lists/lists/ListsFragment.kt +++ b/ui-lists/src/main/java/com/michaldrabik/ui_lists/lists/ListsFragment.kt @@ -42,7 +42,9 @@ import com.michaldrabik.ui_base.utilities.extensions.showKeyboard import com.michaldrabik.ui_base.utilities.extensions.updateTopMargin import com.michaldrabik.ui_base.utilities.extensions.visible import com.michaldrabik.ui_base.utilities.extensions.visibleIf +import com.michaldrabik.ui_base.utilities.viewBinding import com.michaldrabik.ui_lists.R +import com.michaldrabik.ui_lists.databinding.FragmentListsBinding import com.michaldrabik.ui_lists.lists.recycler.ListsAdapter import com.michaldrabik.ui_lists.lists.recycler.ListsItem import com.michaldrabik.ui_model.SortOrder @@ -54,17 +56,6 @@ import com.michaldrabik.ui_navigation.java.NavigationArgs import com.michaldrabik.ui_navigation.java.NavigationArgs.ARG_LIST import com.michaldrabik.ui_navigation.java.NavigationArgs.REQUEST_CREATE_LIST import dagger.hilt.android.AndroidEntryPoint -import kotlinx.android.synthetic.main.fragment_lists.fragmentListsCreateListButton -import kotlinx.android.synthetic.main.fragment_lists.fragmentListsEmptyView -import kotlinx.android.synthetic.main.fragment_lists.fragmentListsFilters -import kotlinx.android.synthetic.main.fragment_lists.fragmentListsIcons -import kotlinx.android.synthetic.main.fragment_lists.fragmentListsModeTabs -import kotlinx.android.synthetic.main.fragment_lists.fragmentListsRecycler -import kotlinx.android.synthetic.main.fragment_lists.fragmentListsRoot -import kotlinx.android.synthetic.main.fragment_lists.fragmentListsSearchButton -import kotlinx.android.synthetic.main.fragment_lists.fragmentListsSearchLocalView -import kotlinx.android.synthetic.main.fragment_lists.fragmentListsSearchView -import kotlinx.android.synthetic.main.fragment_lists.fragmentListsSnackHost import javax.inject.Inject @AndroidEntryPoint @@ -77,6 +68,7 @@ class ListsFragment : } override val viewModel by viewModels() + private val binding by viewBinding(FragmentListsBinding::bind) @Inject lateinit var eventsManager: EventsManager @@ -118,60 +110,68 @@ class ListsFragment : override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) - outState.putFloat("ARG_SEARCH_POSITION", fragmentListsSearchView?.translationY ?: 0F) - outState.putFloat("ARG_TABS_POSITION", fragmentListsModeTabs?.translationY ?: 0F) - outState.putBoolean("ARG_FAB_HIDDEN", fragmentListsCreateListButton?.visibility != VISIBLE) + with(binding) { + outState.putFloat("ARG_SEARCH_POSITION", fragmentListsSearchView?.translationY ?: 0F) + outState.putFloat("ARG_TABS_POSITION", fragmentListsModeTabs?.translationY ?: 0F) + outState.putBoolean("ARG_FAB_HIDDEN", fragmentListsCreateListButton?.visibility != VISIBLE) + } } override fun onPause() { enableUi() - tabsTranslation = fragmentListsModeTabs.translationY - searchViewTranslation = fragmentListsSearchView.translationY + with(binding) { + tabsTranslation = fragmentListsModeTabs.translationY + searchViewTranslation = fragmentListsSearchView.translationY + } super.onPause() } private fun setupView() { - fragmentListsSearchView.run { - hint = getString(R.string.textSearchFor) - onSettingsClickListener = { openSettings() } - } - with(fragmentListsSearchLocalView) { - onCloseClickListener = { exitSearch() } - } - fragmentListsModeTabs.run { - onModeSelected = { (requireActivity() as ModeHost).setMode(it, force = true) } - showMovies(moviesEnabled) - showLists(true, anchorEnd = moviesEnabled) - selectLists() - } - fragmentListsCreateListButton.run { - if (!isFabHidden) fadeIn() - onClick { openCreateList() } - } - fragmentListsFilters.onSortClickListener = { sortOrder, sortType -> - showSortOrderDialog(sortOrder, sortType) - } - fragmentListsSearchButton.run { - onClick { if (!isSearching) enterSearch() else exitSearch() } - } - fragmentListsSearchView.onClick { openMainSearch() } + with(binding) { + fragmentListsSearchView.run { + hint = getString(R.string.textSearchFor) + onSettingsClickListener = { openSettings() } + } + with(fragmentListsSearchLocalView) { + onCloseClickListener = { exitSearch() } + } + fragmentListsModeTabs.run { + onModeSelected = { (requireActivity() as ModeHost).setMode(it, force = true) } + showMovies(moviesEnabled) + showLists(true, anchorEnd = moviesEnabled) + selectLists() + } + fragmentListsCreateListButton.run { + if (!isFabHidden) fadeIn() + onClick { openCreateList() } + } + fragmentListsFilters.onSortClickListener = { sortOrder, sortType -> + showSortOrderDialog(sortOrder, sortType) + } + fragmentListsSearchButton.run { + onClick { if (!isSearching) enterSearch() else exitSearch() } + } + fragmentListsSearchView.onClick { openMainSearch() } - fragmentListsSearchView.translationY = searchViewTranslation - fragmentListsModeTabs.translationY = tabsTranslation - fragmentListsIcons.translationY = tabsTranslation + fragmentListsSearchView.translationY = searchViewTranslation + fragmentListsModeTabs.translationY = tabsTranslation + fragmentListsIcons.translationY = tabsTranslation + } } private fun setupStatusBar() { - fragmentListsRoot.doOnApplyWindowInsets { _, insets, _, _ -> - val statusBarSize = insets.getInsets(WindowInsetsCompat.Type.systemBars()).top - fragmentListsRecycler - .updatePadding(top = statusBarSize + dimenToPx(R.dimen.listsRecyclerPaddingTop)) - fragmentListsSearchView.applyWindowInsetBehaviour(dimenToPx(R.dimen.spaceNormal) + statusBarSize) - fragmentListsSearchView.updateTopMargin(dimenToPx(R.dimen.spaceMedium) + statusBarSize) - fragmentListsModeTabs.updateTopMargin(dimenToPx(R.dimen.collectionTabsMargin) + statusBarSize) - fragmentListsIcons.updateTopMargin(dimenToPx(R.dimen.listsIconsPadding) + statusBarSize) - fragmentListsSearchLocalView.updateTopMargin(dimenToPx(R.dimen.listsSearchLocalViewPadding) + statusBarSize) - fragmentListsEmptyView.updateTopMargin(statusBarSize) + with(binding) { + fragmentListsRoot.doOnApplyWindowInsets { _, insets, _, _ -> + val statusBarSize = insets.getInsets(WindowInsetsCompat.Type.systemBars()).top + fragmentListsRecycler + .updatePadding(top = statusBarSize + dimenToPx(R.dimen.listsRecyclerPaddingTop)) + fragmentListsSearchView.applyWindowInsetBehaviour(dimenToPx(R.dimen.spaceNormal) + statusBarSize) + fragmentListsSearchView.updateTopMargin(dimenToPx(R.dimen.spaceMedium) + statusBarSize) + fragmentListsModeTabs.updateTopMargin(dimenToPx(R.dimen.collectionTabsMargin) + statusBarSize) + fragmentListsIcons.updateTopMargin(dimenToPx(R.dimen.listsIconsPadding) + statusBarSize) + fragmentListsSearchLocalView.updateTopMargin(dimenToPx(R.dimen.listsSearchLocalViewPadding) + statusBarSize) + fragmentListsEmptyView.root.updateTopMargin(statusBarSize) + } } } @@ -188,31 +188,33 @@ class ListsFragment : viewModel.loadMissingImage(item, itemImage, force) } } - fragmentListsRecycler.apply { - adapter = this@ListsFragment.adapter - layoutManager = this@ListsFragment.layoutManager - (itemAnimator as SimpleItemAnimator).supportsChangeAnimations = false - setHasFixedSize(true) - clearOnScrollListeners() - addOnScrollListener(object : RecyclerView.OnScrollListener() { - var isFading = false - override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { - if (isFading) return - val position = this@ListsFragment.layoutManager?.findFirstCompletelyVisibleItemPosition() ?: 0 - if (position > 1) { - if (fragmentListsCreateListButton.visibility != VISIBLE) return - fragmentListsCreateListButton - .fadeOut(125, endAction = { isFading = false }) - .add(animations) - } else { - if (fragmentListsCreateListButton.visibility != GONE) return - fragmentListsCreateListButton - .fadeIn(125, endAction = { isFading = false }) - .add(animations) + with(binding) { + fragmentListsRecycler.apply { + adapter = this@ListsFragment.adapter + layoutManager = this@ListsFragment.layoutManager + (itemAnimator as SimpleItemAnimator).supportsChangeAnimations = false + setHasFixedSize(true) + clearOnScrollListeners() + addOnScrollListener(object : RecyclerView.OnScrollListener() { + var isFading = false + override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { + if (isFading) return + val position = this@ListsFragment.layoutManager?.findFirstCompletelyVisibleItemPosition() ?: 0 + if (position > 1) { + if (fragmentListsCreateListButton.visibility != VISIBLE) return + fragmentListsCreateListButton + .fadeOut(125, endAction = { isFading = false }) + .add(animations) + } else { + if (fragmentListsCreateListButton.visibility != GONE) return + fragmentListsCreateListButton + .fadeIn(125, endAction = { isFading = false }) + .add(animations) + } + isFading = true } - isFading = true - } - }) + }) + } } } @@ -230,36 +232,40 @@ class ListsFragment : private fun enterSearch() { resetTranslations() - fragmentListsSearchLocalView.fadeIn(150) - fragmentListsIcons.gone() - fragmentListsRecycler.smoothScrollToPosition(0) - with(fragmentListsSearchLocalView.binding.searchViewLocalInput) { - setText("") - doAfterTextChanged { - viewModel.loadItems( - searchQuery = it.toString().trim(), - resetScroll = true - ) + with(binding) { + fragmentListsSearchLocalView.fadeIn(150) + fragmentListsIcons.gone() + fragmentListsRecycler.smoothScrollToPosition(0) + with(fragmentListsSearchLocalView.binding.searchViewLocalInput) { + setText("") + doAfterTextChanged { + viewModel.loadItems( + searchQuery = it.toString().trim(), + resetScroll = true + ) + } + visible() + showKeyboard() + requestFocus() } - visible() - showKeyboard() - requestFocus() } isSearching = true } private fun exitSearch() { - isSearching = false - resetTranslations() - fragmentListsSearchLocalView.gone() - fragmentListsIcons.visible() - fragmentListsRecycler.translationY = 0F - fragmentListsRecycler.postDelayed(200) { layoutManager?.scrollToPosition(0) } - with(fragmentListsSearchLocalView.binding.searchViewLocalInput) { - setText("") - gone() - hideKeyboard() - clearFocus() + with(binding) { + isSearching = false + resetTranslations() + fragmentListsSearchLocalView.gone() + fragmentListsIcons.visible() + fragmentListsRecycler.translationY = 0F + fragmentListsRecycler.postDelayed(200) { layoutManager?.scrollToPosition(0) } + with(fragmentListsSearchLocalView.binding.searchViewLocalInput) { + setText("") + gone() + hideKeyboard() + clearFocus() + } } } @@ -278,19 +284,21 @@ class ListsFragment : private fun render(uiState: ListsUiState) { uiState.run { - items?.let { - fragmentListsEmptyView.fadeIf(it.isEmpty() && !isSearching) - fragmentListsSearchButton.visibleIf(it.isNotEmpty() || isSearching) + with(binding) { + items?.let { + fragmentListsEmptyView.root.fadeIf(it.isEmpty() && !isSearching) + fragmentListsSearchButton.visibleIf(it.isNotEmpty() || isSearching) - val resetScroll = resetScroll.consume() == true - adapter?.setItems(it, resetScroll) - } - sortOrder?.let { - fragmentListsFilters.setSorting(it.first, it.second) - } - isSyncing?.let { - fragmentListsSearchView.setTraktProgress(it) - fragmentListsSearchView.isEnabled = !it + val resetScroll = resetScroll.consume() == true + adapter?.setItems(it, resetScroll) + } + sortOrder?.let { + fragmentListsFilters.setSorting(it.first, it.second) + } + isSyncing?.let { + fragmentListsSearchView.setTraktProgress(it) + fragmentListsSearchView.isEnabled = !it + } } } } @@ -298,17 +306,19 @@ class ListsFragment : private fun openMainSearch() { disableUi() hideNavigation() - fragmentListsModeTabs.fadeOut(duration = 200).add(animations) - fragmentListsIcons.fadeOut(duration = 200).add(animations) - fragmentListsRecycler.fadeOut(duration = 200) { - super.navigateTo(R.id.actionListsFragmentToSearch, null) - }.add(animations) + with(binding) { + fragmentListsModeTabs.fadeOut(duration = 200).add(animations) + fragmentListsIcons.fadeOut(duration = 200).add(animations) + fragmentListsRecycler.fadeOut(duration = 200) { + super.navigateTo(R.id.actionListsFragmentToSearch, null) + }.add(animations) + } } private fun openListDetails(listItem: ListsItem) { disableUi() hideNavigation() - fragmentListsRoot.fadeOut(150) { + binding.fragmentListsRoot.fadeOut(150) { val bundle = bundleOf(ARG_LIST to listItem.list) navigateTo(R.id.actionListsFragmentToDetailsFragment, bundle) exitSearch() @@ -328,13 +338,15 @@ class ListsFragment : private fun resetTranslations(duration: Long = TRANSLATION_DURATION) { if (view == null) return - arrayOf( - fragmentListsSearchView, - fragmentListsModeTabs, - fragmentListsIcons, - fragmentListsSearchLocalView - ).forEach { - it.animate().translationY(0F).setDuration(duration).add(animations)?.start() + with(binding) { + arrayOf( + fragmentListsSearchView, + fragmentListsModeTabs, + fragmentListsIcons, + fragmentListsSearchLocalView + ).forEach { + it.animate().translationY(0F).setDuration(duration).add(animations)?.start() + } } } @@ -342,12 +354,12 @@ class ListsFragment : when (event) { is TraktListQuickSyncSuccess -> { val text = resources.getQuantityString(R.plurals.textTraktQuickSyncComplete, 1, 1) - fragmentListsSnackHost.showInfoSnackbar(text) + binding.fragmentListsSnackHost.showInfoSnackbar(text) } is TraktQuickSyncSuccess -> { val text = resources.getQuantityString(R.plurals.textTraktQuickSyncComplete, event.count, event.count) - fragmentListsSnackHost.showInfoSnackbar(text) + binding.fragmentListsSnackHost.showInfoSnackbar(text) } else -> Unit @@ -356,7 +368,7 @@ class ListsFragment : override fun onTabReselected() { resetTranslations() - fragmentListsRecycler.smoothScrollToPosition(0) + binding.fragmentListsRecycler.smoothScrollToPosition(0) } override fun onDestroyView() { diff --git a/ui-lists/src/main/java/com/michaldrabik/ui_lists/lists/views/ListsItemView.kt b/ui-lists/src/main/java/com/michaldrabik/ui_lists/lists/views/ListsItemView.kt index f327a2743a..1e84211f69 100644 --- a/ui-lists/src/main/java/com/michaldrabik/ui_lists/lists/views/ListsItemView.kt +++ b/ui-lists/src/main/java/com/michaldrabik/ui_lists/lists/views/ListsItemView.kt @@ -3,19 +3,19 @@ package com.michaldrabik.ui_lists.lists.views import android.annotation.SuppressLint import android.content.Context import android.util.AttributeSet +import android.view.LayoutInflater import android.view.ViewGroup.LayoutParams.MATCH_PARENT import android.view.ViewGroup.LayoutParams.WRAP_CONTENT import android.widget.FrameLayout import com.michaldrabik.ui_base.utilities.extensions.capitalizeWords import com.michaldrabik.ui_base.utilities.extensions.onClick import com.michaldrabik.ui_base.utilities.extensions.visibleIf -import com.michaldrabik.ui_lists.R +import com.michaldrabik.ui_lists.databinding.ViewListsItemBinding import com.michaldrabik.ui_lists.lists.helpers.ListsItemImage import com.michaldrabik.ui_lists.lists.recycler.ListsItem import com.michaldrabik.ui_model.SortOrder.DATE_UPDATED import com.michaldrabik.ui_model.SortOrder.NAME import com.michaldrabik.ui_model.SortOrder.NEWEST -import kotlinx.android.synthetic.main.view_lists_item.view.* @SuppressLint("SetTextI18n") class ListsItemView : FrameLayout { @@ -24,15 +24,18 @@ class ListsItemView : FrameLayout { constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr) + private val binding = ViewListsItemBinding.inflate(LayoutInflater.from(context), this) + var itemClickListener: ((ListsItem) -> Unit)? = null var missingImageListener: ((ListsItem, ListsItemImage, Boolean) -> Unit)? = null init { - inflate(context, R.layout.view_lists_item, this) layoutParams = LayoutParams(MATCH_PARENT, WRAP_CONTENT) - listsItemRoot.onClick { itemClickListener?.invoke(item) } - listsItemImages.missingImageListener = { itemImage, force -> - missingImageListener?.invoke(item, itemImage, force) + with(binding) { + listsItemRoot.onClick { itemClickListener?.invoke(item) } + listsItemImages.missingImageListener = { itemImage, force -> + missingImageListener?.invoke(item, itemImage, force) + } } } @@ -40,22 +43,23 @@ class ListsItemView : FrameLayout { fun bind(item: ListsItem) { this.item = item + with(binding) { + listsItemTitle.text = item.list.name + with(listsItemDescription) { + text = item.list.description + visibleIf(!item.list.description.isNullOrBlank()) + } - listsItemTitle.text = item.list.name - with(listsItemDescription) { - text = item.list.description - visibleIf(!item.list.description.isNullOrBlank()) - } + val sortOrder = item.sortOrder.first + listsItemHeader.visibleIf(sortOrder != NAME) + listsItemHeader.text = when (sortOrder) { + NAME -> "" + NEWEST -> item.dateFormat?.format(item.list.createdAt)?.capitalizeWords() + DATE_UPDATED -> item.dateFormat?.format(item.list.updatedAt)?.capitalizeWords() + else -> throw IllegalStateException() + } - val sortOrder = item.sortOrder.first - listsItemHeader.visibleIf(sortOrder != NAME) - listsItemHeader.text = when (sortOrder) { - NAME -> "" - NEWEST -> item.dateFormat?.format(item.list.createdAt)?.capitalizeWords() - DATE_UPDATED -> item.dateFormat?.format(item.list.updatedAt)?.capitalizeWords() - else -> throw IllegalStateException() + listsItemImages.bind(item.images) } - - listsItemImages.bind(item.images) } } diff --git a/ui-lists/src/main/java/com/michaldrabik/ui_lists/lists/views/ListsTripleImageView.kt b/ui-lists/src/main/java/com/michaldrabik/ui_lists/lists/views/ListsTripleImageView.kt index 052b5b5e0e..b3839a1d9c 100644 --- a/ui-lists/src/main/java/com/michaldrabik/ui_lists/lists/views/ListsTripleImageView.kt +++ b/ui-lists/src/main/java/com/michaldrabik/ui_lists/lists/views/ListsTripleImageView.kt @@ -3,6 +3,7 @@ package com.michaldrabik.ui_lists.lists.views import android.annotation.SuppressLint import android.content.Context import android.util.AttributeSet +import android.view.LayoutInflater import android.view.ViewGroup.LayoutParams.MATCH_PARENT import android.view.ViewGroup.LayoutParams.WRAP_CONTENT import android.widget.FrameLayout @@ -19,9 +20,9 @@ import com.michaldrabik.ui_base.utilities.extensions.visible import com.michaldrabik.ui_base.utilities.extensions.withFailListener import com.michaldrabik.ui_base.utilities.extensions.withSuccessListener import com.michaldrabik.ui_lists.R +import com.michaldrabik.ui_lists.databinding.ViewTripleImageBinding import com.michaldrabik.ui_lists.lists.helpers.ListsItemImage import com.michaldrabik.ui_model.ImageStatus -import kotlinx.android.synthetic.main.view_triple_image.view.* @SuppressLint("SetTextI18n") class ListsTripleImageView : FrameLayout { @@ -30,31 +31,34 @@ class ListsTripleImageView : FrameLayout { constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr) + private val binding = ViewTripleImageBinding.inflate(LayoutInflater.from(context), this) + private val cornerRadius by lazy { context.dimenToPx(R.dimen.mediaTileCorner) } var missingImageListener: ((ListsItemImage, Boolean) -> Unit)? = null init { - inflate(context, R.layout.view_triple_image, this) layoutParams = LayoutParams(MATCH_PARENT, WRAP_CONTENT) } fun bind(images: List) { clear() - if (images.all { it.image.status == ImageStatus.UNAVAILABLE }) { - viewTripleImagePlaceholder1.visible() - viewTripleImagePlaceholder1.visible() - viewTripleImagePlaceholder2.visible() - viewTripleImagePlaceholder3.visible() - viewTripleImage1.gone() - viewTripleImage2.gone() - viewTripleImage3.gone() - return + with(binding) { + if (images.all { it.image.status == ImageStatus.UNAVAILABLE }) { + viewTripleImagePlaceholder1.visible() + viewTripleImagePlaceholder1.visible() + viewTripleImagePlaceholder2.visible() + viewTripleImagePlaceholder3.visible() + viewTripleImage1.gone() + viewTripleImage2.gone() + viewTripleImage3.gone() + return + } + // List is guaranteed to always have exact 3 items. + loadImage(images[0], viewTripleImage1, viewTripleImagePlaceholder1) + loadImage(images[1], viewTripleImage2, viewTripleImagePlaceholder2) + loadImage(images[2], viewTripleImage3, viewTripleImagePlaceholder3) } - // List is guaranteed to always have exact 3 items. - loadImage(images[0], viewTripleImage1, viewTripleImagePlaceholder1) - loadImage(images[1], viewTripleImage2, viewTripleImagePlaceholder2) - loadImage(images[2], viewTripleImage3, viewTripleImagePlaceholder3) } private fun loadImage( @@ -92,10 +96,13 @@ class ListsTripleImageView : FrameLayout { .into(imageView) } - private fun clear() = - Glide.with(this).run { - clear(viewTripleImage1) - clear(viewTripleImage2) - clear(viewTripleImage3) + private fun clear() { + with(binding) { + Glide.with(this@ListsTripleImageView).run { + clear(viewTripleImage1) + clear(viewTripleImage2) + clear(viewTripleImage3) + } } + } } diff --git a/ui-lists/src/main/java/com/michaldrabik/ui_lists/manage/views/ManageListsItemView.kt b/ui-lists/src/main/java/com/michaldrabik/ui_lists/manage/views/ManageListsItemView.kt index 2e8239f505..8af6aec1da 100644 --- a/ui-lists/src/main/java/com/michaldrabik/ui_lists/manage/views/ManageListsItemView.kt +++ b/ui-lists/src/main/java/com/michaldrabik/ui_lists/manage/views/ManageListsItemView.kt @@ -3,12 +3,12 @@ package com.michaldrabik.ui_lists.manage.views import android.annotation.SuppressLint import android.content.Context import android.util.AttributeSet +import android.view.LayoutInflater import android.view.ViewGroup.LayoutParams.MATCH_PARENT import android.view.ViewGroup.LayoutParams.WRAP_CONTENT import android.widget.FrameLayout -import com.michaldrabik.ui_lists.R +import com.michaldrabik.ui_lists.databinding.ViewManageListsItemBinding import com.michaldrabik.ui_lists.manage.recycler.ManageListsItem -import kotlinx.android.synthetic.main.view_manage_lists_item.view.* @SuppressLint("SetTextI18n") class ManageListsItemView : FrameLayout { @@ -17,13 +17,14 @@ class ManageListsItemView : FrameLayout { constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr) + private val binding = ViewManageListsItemBinding.inflate(LayoutInflater.from(context), this) + var itemCheckListener: ((ManageListsItem, Boolean) -> Unit)? = null - var isCheckEnabled = false + private var isCheckEnabled = false init { - inflate(context, R.layout.view_manage_lists_item, this) layoutParams = LayoutParams(MATCH_PARENT, WRAP_CONTENT) - manageListsItemCheckbox.setOnCheckedChangeListener { _, isChecked -> + binding.manageListsItemCheckbox.setOnCheckedChangeListener { _, isChecked -> if (isCheckEnabled) itemCheckListener?.invoke(item, isChecked) } } @@ -33,9 +34,11 @@ class ManageListsItemView : FrameLayout { fun bind(item: ManageListsItem) { this.item = item isCheckEnabled = false - manageListsItemCheckbox.text = " ${item.list.name}" - manageListsItemCheckbox.isChecked = item.isChecked - manageListsItemCheckbox.isEnabled = item.isEnabled + with(binding) { + manageListsItemCheckbox.text = " ${item.list.name}" + manageListsItemCheckbox.isChecked = item.isChecked + manageListsItemCheckbox.isEnabled = item.isEnabled + } isCheckEnabled = true } }