Simplify screen handling in feed group dialog

This commit is contained in:
Mauricio Colli 2020-03-05 20:57:00 -03:00
parent d8b9d353aa
commit f01e40e671
No known key found for this signature in database
GPG Key ID: F200BFD6F29DDD85
1 changed files with 78 additions and 104 deletions

View File

@ -27,11 +27,12 @@ import org.schabi.newpipe.R
import org.schabi.newpipe.database.feed.model.FeedGroupEntity
import org.schabi.newpipe.database.subscription.SubscriptionEntity
import org.schabi.newpipe.local.subscription.FeedGroupIcon
import org.schabi.newpipe.local.subscription.dialog.FeedGroupDialogViewModel.DialogEvent.*
import org.schabi.newpipe.local.subscription.dialog.FeedGroupDialog.ScreenState.*
import org.schabi.newpipe.local.subscription.dialog.FeedGroupDialogViewModel.DialogEvent.ProcessingEvent
import org.schabi.newpipe.local.subscription.dialog.FeedGroupDialogViewModel.DialogEvent.SuccessEvent
import org.schabi.newpipe.local.subscription.item.EmptyPlaceholderItem
import org.schabi.newpipe.local.subscription.item.PickerIconItem
import org.schabi.newpipe.local.subscription.item.PickerSubscriptionItem
import org.schabi.newpipe.util.AnimationUtils.animateView
import org.schabi.newpipe.util.ThemeHelper
import java.io.Serializable
@ -43,14 +44,14 @@ class FeedGroupDialog : DialogFragment() {
sealed class ScreenState : Serializable {
object InitialScreen : ScreenState()
object SubscriptionsPicker : ScreenState()
object IconPickerList : ScreenState()
object IconPickerScreen : ScreenState()
object SubscriptionsPickerScreen : ScreenState()
object DeleteScreen : ScreenState()
}
@State @JvmField var selectedIcon: FeedGroupIcon? = null
@State @JvmField var selectedSubscriptions: HashSet<Long> = HashSet()
@State @JvmField var currentScreen: ScreenState = ScreenState.InitialScreen
@State @JvmField var currentScreen: ScreenState = InitialScreen
@State @JvmField var subscriptionsListState: Parcelable? = null
@State @JvmField var iconsListState: Parcelable? = null
@ -70,8 +71,8 @@ class FeedGroupDialog : DialogFragment() {
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
return object : Dialog(requireActivity(), theme) {
override fun onBackPressed() {
if (currentScreen !is ScreenState.InitialScreen) {
showInitialScreen()
if (currentScreen !is InitialScreen) {
showScreen(InitialScreen)
} else {
super.onBackPressed()
}
@ -104,14 +105,22 @@ class FeedGroupDialog : DialogFragment() {
})
setupIconPicker()
setupListeners()
delete_button.setOnClickListener { showDeleteScreen() }
showScreen(currentScreen)
}
///////////////////////////////////////////////////////////////////////////
// Setup
///////////////////////////////////////////////////////////////////////////
private fun setupListeners() {
delete_button.setOnClickListener { showScreen(DeleteScreen) }
cancel_button.setOnClickListener {
if (currentScreen !is ScreenState.InitialScreen) {
showInitialScreen()
} else {
dismiss()
when (currentScreen) {
InitialScreen -> dismiss()
else -> showScreen(InitialScreen)
}
}
@ -128,46 +137,37 @@ class FeedGroupDialog : DialogFragment() {
})
confirm_button.setOnClickListener {
if (currentScreen is ScreenState.InitialScreen) {
val name = group_name_input.text.toString().trim()
val icon = selectedIcon ?: groupIcon ?: FeedGroupIcon.ALL
if (name.isBlank()) {
group_name_input_container.error = getString(R.string.feed_group_dialog_empty_name)
group_name_input.text = null
group_name_input.requestFocus()
return@setOnClickListener
} else {
group_name_input_container.error = null
}
if (selectedSubscriptions.isEmpty()) {
Toast.makeText(requireContext(), getString(R.string.feed_group_dialog_empty_selection), Toast.LENGTH_SHORT).show()
return@setOnClickListener
}
when (groupId) {
NO_GROUP_SELECTED -> viewModel.createGroup(name, icon, selectedSubscriptions)
else -> viewModel.updateGroup(name, icon, selectedSubscriptions, groupSortOrder)
}
} else if (currentScreen is ScreenState.DeleteScreen) {
viewModel.deleteGroup()
} else {
showInitialScreen()
when (currentScreen) {
InitialScreen -> handlePositiveButtonInitialScreen()
DeleteScreen -> viewModel.deleteGroup()
else -> showScreen(InitialScreen)
}
}
when (currentScreen) {
is ScreenState.InitialScreen -> showInitialScreen()
is ScreenState.IconPickerList -> showIconPicker()
is ScreenState.SubscriptionsPicker -> showSubscriptionsPicker()
is ScreenState.DeleteScreen -> showDeleteScreen()
}
}
///////////////////////////////////////////////////////////////////////////
// Setup
///////////////////////////////////////////////////////////////////////////
private fun handlePositiveButtonInitialScreen() {
val name = group_name_input.text.toString().trim()
val icon = selectedIcon ?: groupIcon ?: FeedGroupIcon.ALL
if (name.isBlank()) {
group_name_input_container.error = getString(R.string.feed_group_dialog_empty_name)
group_name_input.text = null
group_name_input.requestFocus()
return
} else {
group_name_input_container.error = null
}
if (selectedSubscriptions.isEmpty()) {
Toast.makeText(requireContext(), getString(R.string.feed_group_dialog_empty_selection), Toast.LENGTH_SHORT).show()
return
}
when (groupId) {
NO_GROUP_SELECTED -> viewModel.createGroup(name, icon, selectedSubscriptions)
else -> viewModel.updateGroup(name, icon, selectedSubscriptions, groupSortOrder)
}
}
private fun handleGroup(feedGroupEntity: FeedGroupEntity? = null) {
val icon = feedGroupEntity?.icon ?: FeedGroupIcon.ALL
@ -243,7 +243,7 @@ class FeedGroupDialog : DialogFragment() {
select_channel_button.setOnClickListener {
subscriptions_selector_list.scrollToPosition(0)
showSubscriptionsPicker()
showScreen(SubscriptionsPickerScreen)
}
}
@ -267,13 +267,13 @@ class FeedGroupDialog : DialogFragment() {
selectedIcon = item.icon
icon_preview.setImageResource(item.iconRes)
showInitialScreen()
showScreen(InitialScreen)
}
}
}
icon_preview.setOnClickListener {
icon_selector.scrollToPosition(0)
showIconPicker()
showScreen(IconPickerScreen)
}
if (groupId == NO_GROUP_SELECTED) {
@ -286,62 +286,36 @@ class FeedGroupDialog : DialogFragment() {
// Screen Selector
///////////////////////////////////////////////////////////////////////////
private fun showInitialScreen() {
currentScreen = ScreenState.InitialScreen
animateView(icon_selector, false, 0)
animateView(subscriptions_selector, false, 0)
animateView(options_root, true, 250)
animateView(delete_screen_message, false, 0)
private fun showScreen(screen: ScreenState) {
currentScreen = screen
separator.visibility = View.GONE
confirm_button.setText(if (groupId == NO_GROUP_SELECTED) R.string.create else android.R.string.ok)
delete_button.visibility = if (groupId == NO_GROUP_SELECTED) View.GONE else View.VISIBLE
cancel_button.visibility = View.VISIBLE
options_root.onlyVisibleIn(InitialScreen)
icon_selector.onlyVisibleIn(IconPickerScreen)
subscriptions_selector.onlyVisibleIn(SubscriptionsPickerScreen)
delete_screen_message.onlyVisibleIn(DeleteScreen)
separator.onlyVisibleIn(SubscriptionsPickerScreen, IconPickerScreen)
cancel_button.onlyVisibleIn(InitialScreen, DeleteScreen)
confirm_button.setText(when {
currentScreen == InitialScreen && groupId == NO_GROUP_SELECTED -> R.string.create
else -> android.R.string.ok
})
delete_button.visibility = when {
currentScreen != InitialScreen -> View.GONE
groupId == NO_GROUP_SELECTED -> View.GONE
else -> View.VISIBLE
}
if (currentScreen != InitialScreen) hideKeyboard()
}
private fun showIconPicker() {
currentScreen = ScreenState.IconPickerList
animateView(icon_selector, true, 250)
animateView(subscriptions_selector, false, 0)
animateView(options_root, false, 0)
animateView(delete_screen_message, false, 0)
separator.visibility = View.VISIBLE
confirm_button.setText(android.R.string.ok)
delete_button.visibility = View.GONE
cancel_button.visibility = View.GONE
hideKeyboard()
}
private fun showSubscriptionsPicker() {
currentScreen = ScreenState.SubscriptionsPicker
animateView(icon_selector, false, 0)
animateView(subscriptions_selector, true, 250)
animateView(options_root, false, 0)
animateView(delete_screen_message, false, 0)
separator.visibility = View.VISIBLE
confirm_button.setText(android.R.string.ok)
delete_button.visibility = View.GONE
cancel_button.visibility = View.GONE
hideKeyboard()
}
private fun showDeleteScreen() {
currentScreen = ScreenState.DeleteScreen
animateView(icon_selector, false, 0)
animateView(subscriptions_selector, false, 0)
animateView(options_root, false, 0)
animateView(delete_screen_message, true, 250)
separator.visibility = View.GONE
confirm_button.setText(android.R.string.ok)
delete_button.visibility = View.GONE
cancel_button.visibility = View.VISIBLE
hideKeyboard()
private fun View.onlyVisibleIn(vararg screens: ScreenState) {
visibility = when (currentScreen) {
in screens -> View.VISIBLE
else -> View.GONE
}
}
///////////////////////////////////////////////////////////////////////////