2019-04-28 22:43:54 +02:00
|
|
|
|
package org.schabi.newpipe.local.subscription.dialog
|
|
|
|
|
|
|
|
|
|
import android.app.Dialog
|
|
|
|
|
import android.os.Bundle
|
|
|
|
|
import android.os.Parcelable
|
|
|
|
|
import android.text.Editable
|
2020-04-05 21:25:44 +02:00
|
|
|
|
import android.text.TextUtils
|
2019-04-28 22:43:54 +02:00
|
|
|
|
import android.text.TextWatcher
|
|
|
|
|
import android.view.LayoutInflater
|
|
|
|
|
import android.view.View
|
|
|
|
|
import android.view.ViewGroup
|
|
|
|
|
import android.view.inputmethod.InputMethodManager
|
|
|
|
|
import android.widget.Toast
|
2020-09-13 13:50:29 +02:00
|
|
|
|
import androidx.core.content.getSystemService
|
2020-10-17 12:08:45 +02:00
|
|
|
|
import androidx.core.os.bundleOf
|
2019-04-28 22:43:54 +02:00
|
|
|
|
import androidx.fragment.app.DialogFragment
|
|
|
|
|
import androidx.lifecycle.Observer
|
2020-04-05 21:25:44 +02:00
|
|
|
|
import androidx.lifecycle.ViewModelProvider
|
2019-04-28 22:43:54 +02:00
|
|
|
|
import androidx.recyclerview.widget.GridLayoutManager
|
|
|
|
|
import androidx.recyclerview.widget.RecyclerView
|
|
|
|
|
import com.xwray.groupie.GroupAdapter
|
2020-04-05 21:25:44 +02:00
|
|
|
|
import com.xwray.groupie.OnItemClickListener
|
2019-04-28 22:43:54 +02:00
|
|
|
|
import com.xwray.groupie.Section
|
2019-10-10 15:28:57 +02:00
|
|
|
|
import com.xwray.groupie.kotlinandroidextensions.GroupieViewHolder
|
2019-04-28 22:43:54 +02:00
|
|
|
|
import icepick.Icepick
|
|
|
|
|
import icepick.State
|
2020-05-01 20:13:21 +02:00
|
|
|
|
import java.io.Serializable
|
2020-04-05 21:25:44 +02:00
|
|
|
|
import kotlin.collections.contains
|
|
|
|
|
import kotlinx.android.synthetic.main.dialog_feed_group_create.*
|
|
|
|
|
import kotlinx.android.synthetic.main.toolbar_search_layout.*
|
2019-04-28 22:43:54 +02:00
|
|
|
|
import org.schabi.newpipe.R
|
|
|
|
|
import org.schabi.newpipe.database.feed.model.FeedGroupEntity
|
2020-04-05 21:25:44 +02:00
|
|
|
|
import org.schabi.newpipe.fragments.BackPressable
|
2019-04-28 22:43:54 +02:00
|
|
|
|
import org.schabi.newpipe.local.subscription.FeedGroupIcon
|
2020-05-01 20:13:01 +02:00
|
|
|
|
import org.schabi.newpipe.local.subscription.dialog.FeedGroupDialog.ScreenState.DeleteScreen
|
|
|
|
|
import org.schabi.newpipe.local.subscription.dialog.FeedGroupDialog.ScreenState.IconPickerScreen
|
|
|
|
|
import org.schabi.newpipe.local.subscription.dialog.FeedGroupDialog.ScreenState.InitialScreen
|
|
|
|
|
import org.schabi.newpipe.local.subscription.dialog.FeedGroupDialog.ScreenState.SubscriptionsPickerScreen
|
2020-03-06 00:57:00 +01:00
|
|
|
|
import org.schabi.newpipe.local.subscription.dialog.FeedGroupDialogViewModel.DialogEvent.ProcessingEvent
|
|
|
|
|
import org.schabi.newpipe.local.subscription.dialog.FeedGroupDialogViewModel.DialogEvent.SuccessEvent
|
2019-04-28 22:43:54 +02:00
|
|
|
|
import org.schabi.newpipe.local.subscription.item.EmptyPlaceholderItem
|
|
|
|
|
import org.schabi.newpipe.local.subscription.item.PickerIconItem
|
|
|
|
|
import org.schabi.newpipe.local.subscription.item.PickerSubscriptionItem
|
2020-07-21 00:43:49 +02:00
|
|
|
|
import org.schabi.newpipe.util.DeviceUtils
|
2019-04-28 22:43:54 +02:00
|
|
|
|
import org.schabi.newpipe.util.ThemeHelper
|
|
|
|
|
|
2020-04-05 21:25:44 +02:00
|
|
|
|
class FeedGroupDialog : DialogFragment(), BackPressable {
|
2019-04-28 22:43:54 +02:00
|
|
|
|
private lateinit var viewModel: FeedGroupDialogViewModel
|
|
|
|
|
private var groupId: Long = NO_GROUP_SELECTED
|
|
|
|
|
private var groupIcon: FeedGroupIcon? = null
|
2020-02-26 03:01:23 +01:00
|
|
|
|
private var groupSortOrder: Long = -1
|
2019-04-28 22:43:54 +02:00
|
|
|
|
|
|
|
|
|
sealed class ScreenState : Serializable {
|
|
|
|
|
object InitialScreen : ScreenState()
|
2020-03-06 00:57:00 +01:00
|
|
|
|
object IconPickerScreen : ScreenState()
|
|
|
|
|
object SubscriptionsPickerScreen : ScreenState()
|
2020-03-06 00:27:00 +01:00
|
|
|
|
object DeleteScreen : ScreenState()
|
2019-04-28 22:43:54 +02:00
|
|
|
|
}
|
|
|
|
|
|
2020-04-05 21:25:44 +02:00
|
|
|
|
@State @JvmField var selectedIcon: FeedGroupIcon? = null
|
|
|
|
|
@State @JvmField var selectedSubscriptions: HashSet<Long> = HashSet()
|
|
|
|
|
@State @JvmField var wasSubscriptionSelectionChanged: Boolean = false
|
|
|
|
|
@State @JvmField var currentScreen: ScreenState = InitialScreen
|
|
|
|
|
|
|
|
|
|
@State @JvmField var subscriptionsListState: Parcelable? = null
|
|
|
|
|
@State @JvmField var iconsListState: Parcelable? = null
|
|
|
|
|
@State @JvmField var wasSearchSubscriptionsVisible = false
|
|
|
|
|
@State @JvmField var subscriptionsCurrentSearchQuery = ""
|
2020-04-09 18:07:02 +02:00
|
|
|
|
@State @JvmField var subscriptionsShowOnlyUngrouped = false
|
2020-04-05 21:25:44 +02:00
|
|
|
|
|
|
|
|
|
private val subscriptionMainSection = Section()
|
|
|
|
|
private val subscriptionEmptyFooter = Section()
|
|
|
|
|
private lateinit var subscriptionGroupAdapter: GroupAdapter<GroupieViewHolder>
|
2019-04-28 22:43:54 +02:00
|
|
|
|
|
|
|
|
|
override fun onCreate(savedInstanceState: Bundle?) {
|
|
|
|
|
super.onCreate(savedInstanceState)
|
|
|
|
|
Icepick.restoreInstanceState(this, savedInstanceState)
|
|
|
|
|
|
|
|
|
|
setStyle(STYLE_NO_TITLE, ThemeHelper.getMinWidthDialogTheme(requireContext()))
|
|
|
|
|
groupId = arguments?.getLong(KEY_GROUP_ID, NO_GROUP_SELECTED) ?: NO_GROUP_SELECTED
|
|
|
|
|
}
|
|
|
|
|
|
2020-04-05 21:25:44 +02:00
|
|
|
|
override fun onCreateView(
|
|
|
|
|
inflater: LayoutInflater,
|
|
|
|
|
container: ViewGroup?,
|
|
|
|
|
savedInstanceState: Bundle?
|
|
|
|
|
): View? {
|
2019-04-28 22:43:54 +02:00
|
|
|
|
return inflater.inflate(R.layout.dialog_feed_group_create, container)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
|
|
|
|
|
return object : Dialog(requireActivity(), theme) {
|
|
|
|
|
override fun onBackPressed() {
|
2020-04-05 21:25:44 +02:00
|
|
|
|
if (!this@FeedGroupDialog.onBackPressed()) {
|
2019-04-28 22:43:54 +02:00
|
|
|
|
super.onBackPressed()
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2020-04-05 21:25:44 +02:00
|
|
|
|
override fun onPause() {
|
|
|
|
|
super.onPause()
|
|
|
|
|
|
|
|
|
|
wasSearchSubscriptionsVisible = isSearchVisible()
|
|
|
|
|
}
|
|
|
|
|
|
2019-04-28 22:43:54 +02:00
|
|
|
|
override fun onSaveInstanceState(outState: Bundle) {
|
|
|
|
|
super.onSaveInstanceState(outState)
|
|
|
|
|
|
|
|
|
|
iconsListState = icon_selector.layoutManager?.onSaveInstanceState()
|
2020-01-30 03:23:10 +01:00
|
|
|
|
subscriptionsListState = subscriptions_selector_list.layoutManager?.onSaveInstanceState()
|
2019-04-28 22:43:54 +02:00
|
|
|
|
|
|
|
|
|
Icepick.saveInstanceState(this, outState)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
|
|
|
|
super.onViewCreated(view, savedInstanceState)
|
|
|
|
|
|
2020-04-05 21:25:44 +02:00
|
|
|
|
viewModel = ViewModelProvider(this,
|
|
|
|
|
FeedGroupDialogViewModel.Factory(requireContext(),
|
2020-04-09 18:07:02 +02:00
|
|
|
|
groupId, subscriptionsCurrentSearchQuery, subscriptionsShowOnlyUngrouped)
|
2020-04-05 21:25:44 +02:00
|
|
|
|
).get(FeedGroupDialogViewModel::class.java)
|
2019-04-28 22:43:54 +02:00
|
|
|
|
|
|
|
|
|
viewModel.groupLiveData.observe(viewLifecycleOwner, Observer(::handleGroup))
|
2020-04-05 21:25:44 +02:00
|
|
|
|
viewModel.subscriptionsLiveData.observe(viewLifecycleOwner, Observer {
|
|
|
|
|
setupSubscriptionPicker(it.first, it.second)
|
|
|
|
|
})
|
2020-03-05 23:37:00 +01:00
|
|
|
|
viewModel.dialogEventLiveData.observe(viewLifecycleOwner, Observer {
|
2019-04-28 22:43:54 +02:00
|
|
|
|
when (it) {
|
2020-03-05 23:37:00 +01:00
|
|
|
|
ProcessingEvent -> disableInput()
|
|
|
|
|
SuccessEvent -> dismiss()
|
2019-04-28 22:43:54 +02:00
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
|
2020-04-05 21:25:44 +02:00
|
|
|
|
subscriptionGroupAdapter = GroupAdapter<GroupieViewHolder>().apply {
|
|
|
|
|
add(subscriptionMainSection)
|
|
|
|
|
add(subscriptionEmptyFooter)
|
|
|
|
|
spanCount = 4
|
|
|
|
|
}
|
|
|
|
|
subscriptions_selector_list.apply {
|
|
|
|
|
// Disable animations, too distracting.
|
|
|
|
|
itemAnimator = null
|
|
|
|
|
adapter = subscriptionGroupAdapter
|
|
|
|
|
layoutManager = GridLayoutManager(requireContext(), subscriptionGroupAdapter.spanCount,
|
|
|
|
|
RecyclerView.VERTICAL, false).apply {
|
|
|
|
|
spanSizeLookup = subscriptionGroupAdapter.spanSizeLookup
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2019-04-28 22:43:54 +02:00
|
|
|
|
setupIconPicker()
|
2020-03-06 00:57:00 +01:00
|
|
|
|
setupListeners()
|
2019-04-28 22:43:54 +02:00
|
|
|
|
|
2020-03-06 00:57:00 +01:00
|
|
|
|
showScreen(currentScreen)
|
2020-04-05 21:25:44 +02:00
|
|
|
|
|
|
|
|
|
if (currentScreen == SubscriptionsPickerScreen && wasSearchSubscriptionsVisible) {
|
|
|
|
|
showSearch()
|
|
|
|
|
} else if (currentScreen == InitialScreen && groupId == NO_GROUP_SELECTED) {
|
|
|
|
|
showKeyboard()
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
override fun onDestroyView() {
|
|
|
|
|
super.onDestroyView()
|
|
|
|
|
subscriptions_selector_list?.adapter = null
|
|
|
|
|
icon_selector?.adapter = null
|
2020-03-06 00:57:00 +01:00
|
|
|
|
}
|
|
|
|
|
|
2020-04-05 21:25:44 +02:00
|
|
|
|
/*///////////////////////////////////////////////////////////////////////////
|
2020-03-06 00:57:00 +01:00
|
|
|
|
// Setup
|
2020-04-05 21:25:44 +02:00
|
|
|
|
////////////////////////////////////////////////////////////////////////// */
|
|
|
|
|
|
|
|
|
|
override fun onBackPressed(): Boolean {
|
|
|
|
|
if (currentScreen is SubscriptionsPickerScreen && isSearchVisible()) {
|
|
|
|
|
hideSearch()
|
|
|
|
|
return true
|
|
|
|
|
} else if (currentScreen !is InitialScreen) {
|
|
|
|
|
showScreen(InitialScreen)
|
|
|
|
|
return true
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return false
|
|
|
|
|
}
|
2020-03-06 00:57:00 +01:00
|
|
|
|
|
|
|
|
|
private fun setupListeners() {
|
|
|
|
|
delete_button.setOnClickListener { showScreen(DeleteScreen) }
|
2019-04-28 22:43:54 +02:00
|
|
|
|
|
|
|
|
|
cancel_button.setOnClickListener {
|
2020-03-06 00:57:00 +01:00
|
|
|
|
when (currentScreen) {
|
|
|
|
|
InitialScreen -> dismiss()
|
|
|
|
|
else -> showScreen(InitialScreen)
|
2019-04-28 22:43:54 +02:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
group_name_input_container.error = null
|
|
|
|
|
group_name_input.addTextChangedListener(object : TextWatcher {
|
|
|
|
|
override fun afterTextChanged(s: Editable?) {}
|
|
|
|
|
override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {}
|
|
|
|
|
|
|
|
|
|
override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
|
|
|
|
|
if (group_name_input_container.isErrorEnabled && !s.isNullOrBlank()) {
|
|
|
|
|
group_name_input_container.error = null
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
|
2020-04-05 21:25:44 +02:00
|
|
|
|
confirm_button.setOnClickListener { handlePositiveButton() }
|
|
|
|
|
|
|
|
|
|
select_channel_button.setOnClickListener {
|
|
|
|
|
subscriptions_selector_list.scrollToPosition(0)
|
|
|
|
|
showScreen(SubscriptionsPickerScreen)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
val headerMenu = subscriptions_header_toolbar.menu
|
|
|
|
|
requireActivity().menuInflater.inflate(R.menu.menu_feed_group_dialog, headerMenu)
|
|
|
|
|
|
|
|
|
|
headerMenu.findItem(R.id.action_search).setOnMenuItemClickListener {
|
|
|
|
|
showSearch()
|
|
|
|
|
true
|
|
|
|
|
}
|
|
|
|
|
|
2020-04-09 18:07:02 +02:00
|
|
|
|
headerMenu.findItem(R.id.feed_group_toggle_show_only_ungrouped_subscriptions).apply {
|
|
|
|
|
isChecked = subscriptionsShowOnlyUngrouped
|
|
|
|
|
setOnMenuItemClickListener {
|
|
|
|
|
subscriptionsShowOnlyUngrouped = !subscriptionsShowOnlyUngrouped
|
|
|
|
|
it.isChecked = subscriptionsShowOnlyUngrouped
|
|
|
|
|
viewModel.toggleShowOnlyUngrouped(subscriptionsShowOnlyUngrouped)
|
|
|
|
|
true
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2020-04-05 21:25:44 +02:00
|
|
|
|
toolbar_search_clear.setOnClickListener {
|
|
|
|
|
if (TextUtils.isEmpty(toolbar_search_edit_text.text)) {
|
|
|
|
|
hideSearch()
|
|
|
|
|
return@setOnClickListener
|
|
|
|
|
}
|
|
|
|
|
resetSearch()
|
|
|
|
|
showKeyboardSearch()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
toolbar_search_edit_text.setOnClickListener {
|
2020-07-21 00:43:49 +02:00
|
|
|
|
if (DeviceUtils.isTv(context)) {
|
2020-04-05 21:25:44 +02:00
|
|
|
|
showKeyboardSearch()
|
2020-03-06 00:57:00 +01:00
|
|
|
|
}
|
|
|
|
|
}
|
2020-04-05 21:25:44 +02:00
|
|
|
|
|
|
|
|
|
toolbar_search_edit_text.addTextChangedListener(object : TextWatcher {
|
|
|
|
|
override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) = Unit
|
|
|
|
|
override fun afterTextChanged(s: Editable) = Unit
|
|
|
|
|
override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) {
|
|
|
|
|
val newQuery: String = toolbar_search_edit_text.text.toString()
|
|
|
|
|
subscriptionsCurrentSearchQuery = newQuery
|
|
|
|
|
viewModel.filterSubscriptionsBy(newQuery)
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
|
2020-08-27 22:56:58 +02:00
|
|
|
|
subscriptionGroupAdapter.setOnItemClickListener(subscriptionPickerItemListener)
|
2020-04-05 21:25:44 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private fun handlePositiveButton() = when {
|
|
|
|
|
currentScreen is InitialScreen -> handlePositiveButtonInitialScreen()
|
|
|
|
|
currentScreen is DeleteScreen -> viewModel.deleteGroup()
|
|
|
|
|
currentScreen is SubscriptionsPickerScreen && isSearchVisible() -> hideSearch()
|
|
|
|
|
else -> showScreen(InitialScreen)
|
2020-03-06 00:57:00 +01:00
|
|
|
|
}
|
2019-04-28 22:43:54 +02:00
|
|
|
|
|
2020-03-06 00:57:00 +01:00
|
|
|
|
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
|
|
|
|
|
}
|
2019-04-28 22:43:54 +02:00
|
|
|
|
|
2020-03-06 00:57:00 +01:00
|
|
|
|
if (selectedSubscriptions.isEmpty()) {
|
|
|
|
|
Toast.makeText(requireContext(), getString(R.string.feed_group_dialog_empty_selection), Toast.LENGTH_SHORT).show()
|
|
|
|
|
return
|
2019-04-28 22:43:54 +02:00
|
|
|
|
}
|
|
|
|
|
|
2020-03-06 00:57:00 +01:00
|
|
|
|
when (groupId) {
|
|
|
|
|
NO_GROUP_SELECTED -> viewModel.createGroup(name, icon, selectedSubscriptions)
|
|
|
|
|
else -> viewModel.updateGroup(name, icon, selectedSubscriptions, groupSortOrder)
|
2019-04-28 22:43:54 +02:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private fun handleGroup(feedGroupEntity: FeedGroupEntity? = null) {
|
|
|
|
|
val icon = feedGroupEntity?.icon ?: FeedGroupIcon.ALL
|
|
|
|
|
val name = feedGroupEntity?.name ?: ""
|
|
|
|
|
groupIcon = feedGroupEntity?.icon
|
2020-02-26 03:01:23 +01:00
|
|
|
|
groupSortOrder = feedGroupEntity?.sortOrder ?: -1
|
2019-04-28 22:43:54 +02:00
|
|
|
|
|
2020-04-05 21:25:44 +02:00
|
|
|
|
val feedGroupIcon = if (selectedIcon == null) icon else selectedIcon!!
|
|
|
|
|
icon_preview.setImageResource(feedGroupIcon.getDrawableRes(requireContext()))
|
2019-04-28 22:43:54 +02:00
|
|
|
|
|
|
|
|
|
if (group_name_input.text.isNullOrBlank()) {
|
|
|
|
|
group_name_input.setText(name)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2020-04-05 21:25:44 +02:00
|
|
|
|
private val subscriptionPickerItemListener = OnItemClickListener { item, view ->
|
|
|
|
|
if (item is PickerSubscriptionItem) {
|
|
|
|
|
val subscriptionId = item.subscriptionEntity.uid
|
|
|
|
|
wasSubscriptionSelectionChanged = true
|
2019-04-28 22:43:54 +02:00
|
|
|
|
|
2020-04-05 21:25:44 +02:00
|
|
|
|
val isSelected = if (this.selectedSubscriptions.contains(subscriptionId)) {
|
|
|
|
|
this.selectedSubscriptions.remove(subscriptionId)
|
|
|
|
|
false
|
|
|
|
|
} else {
|
|
|
|
|
this.selectedSubscriptions.add(subscriptionId)
|
|
|
|
|
true
|
|
|
|
|
}
|
2019-04-28 22:43:54 +02:00
|
|
|
|
|
2020-04-05 21:25:44 +02:00
|
|
|
|
item.updateSelected(view, isSelected)
|
|
|
|
|
updateSubscriptionSelectedCount()
|
2019-04-28 22:43:54 +02:00
|
|
|
|
}
|
2020-04-05 21:25:44 +02:00
|
|
|
|
}
|
2019-04-28 22:43:54 +02:00
|
|
|
|
|
2020-04-05 21:25:44 +02:00
|
|
|
|
private fun setupSubscriptionPicker(
|
|
|
|
|
subscriptions: List<PickerSubscriptionItem>,
|
|
|
|
|
selectedSubscriptions: Set<Long>
|
|
|
|
|
) {
|
|
|
|
|
if (!wasSubscriptionSelectionChanged) {
|
|
|
|
|
this.selectedSubscriptions.addAll(selectedSubscriptions)
|
|
|
|
|
}
|
2019-04-28 22:43:54 +02:00
|
|
|
|
|
2020-04-05 21:25:44 +02:00
|
|
|
|
updateSubscriptionSelectedCount()
|
2019-04-28 22:43:54 +02:00
|
|
|
|
|
2020-04-05 21:25:44 +02:00
|
|
|
|
if (subscriptions.isEmpty()) {
|
|
|
|
|
subscriptionEmptyFooter.clear()
|
|
|
|
|
subscriptionEmptyFooter.add(EmptyPlaceholderItem())
|
|
|
|
|
} else {
|
|
|
|
|
subscriptionEmptyFooter.clear()
|
2019-04-28 22:43:54 +02:00
|
|
|
|
}
|
|
|
|
|
|
2020-04-05 21:25:44 +02:00
|
|
|
|
subscriptions.forEach {
|
|
|
|
|
it.isSelected = this@FeedGroupDialog.selectedSubscriptions
|
|
|
|
|
.contains(it.subscriptionEntity.uid)
|
2019-04-28 22:43:54 +02:00
|
|
|
|
}
|
|
|
|
|
|
2020-04-05 21:25:44 +02:00
|
|
|
|
subscriptionMainSection.update(subscriptions, false)
|
|
|
|
|
|
|
|
|
|
if (subscriptionsListState != null) {
|
|
|
|
|
subscriptions_selector_list.layoutManager?.onRestoreInstanceState(subscriptionsListState)
|
|
|
|
|
subscriptionsListState = null
|
|
|
|
|
} else {
|
2020-01-30 03:23:10 +01:00
|
|
|
|
subscriptions_selector_list.scrollToPosition(0)
|
2019-04-28 22:43:54 +02:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2020-04-05 21:25:44 +02:00
|
|
|
|
private fun updateSubscriptionSelectedCount() {
|
|
|
|
|
val selectedCount = this.selectedSubscriptions.size
|
|
|
|
|
val selectedCountText = resources.getQuantityString(
|
|
|
|
|
R.plurals.feed_group_dialog_selection_count,
|
|
|
|
|
selectedCount, selectedCount)
|
|
|
|
|
selected_subscription_count_view.text = selectedCountText
|
|
|
|
|
subscriptions_header_info.text = selectedCountText
|
|
|
|
|
}
|
|
|
|
|
|
2019-04-28 22:43:54 +02:00
|
|
|
|
private fun setupIconPicker() {
|
2019-10-10 15:28:57 +02:00
|
|
|
|
val groupAdapter = GroupAdapter<GroupieViewHolder>()
|
2019-04-28 22:43:54 +02:00
|
|
|
|
groupAdapter.addAll(FeedGroupIcon.values().map { PickerIconItem(requireContext(), it) })
|
|
|
|
|
|
|
|
|
|
icon_selector.apply {
|
|
|
|
|
layoutManager = GridLayoutManager(requireContext(), 7, RecyclerView.VERTICAL, false)
|
|
|
|
|
adapter = groupAdapter
|
|
|
|
|
|
|
|
|
|
if (iconsListState != null) {
|
|
|
|
|
layoutManager?.onRestoreInstanceState(iconsListState)
|
|
|
|
|
iconsListState = null
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
groupAdapter.setOnItemClickListener { item, _ ->
|
|
|
|
|
when (item) {
|
|
|
|
|
is PickerIconItem -> {
|
|
|
|
|
selectedIcon = item.icon
|
|
|
|
|
icon_preview.setImageResource(item.iconRes)
|
|
|
|
|
|
2020-03-06 00:57:00 +01:00
|
|
|
|
showScreen(InitialScreen)
|
2019-04-28 22:43:54 +02:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
icon_preview.setOnClickListener {
|
|
|
|
|
icon_selector.scrollToPosition(0)
|
2020-03-06 00:57:00 +01:00
|
|
|
|
showScreen(IconPickerScreen)
|
2019-04-28 22:43:54 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (groupId == NO_GROUP_SELECTED) {
|
|
|
|
|
val icon = selectedIcon ?: FeedGroupIcon.ALL
|
|
|
|
|
icon_preview.setImageResource(icon.getDrawableRes(requireContext()))
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2020-04-05 21:25:44 +02:00
|
|
|
|
/*///////////////////////////////////////////////////////////////////////////
|
2019-04-28 22:43:54 +02:00
|
|
|
|
// Screen Selector
|
2020-04-05 21:25:44 +02:00
|
|
|
|
////////////////////////////////////////////////////////////////////////// */
|
2019-04-28 22:43:54 +02:00
|
|
|
|
|
2020-03-06 00:57:00 +01:00
|
|
|
|
private fun showScreen(screen: ScreenState) {
|
|
|
|
|
currentScreen = screen
|
2019-04-28 22:43:54 +02:00
|
|
|
|
|
2020-03-06 00:57:00 +01:00
|
|
|
|
options_root.onlyVisibleIn(InitialScreen)
|
|
|
|
|
icon_selector.onlyVisibleIn(IconPickerScreen)
|
|
|
|
|
subscriptions_selector.onlyVisibleIn(SubscriptionsPickerScreen)
|
|
|
|
|
delete_screen_message.onlyVisibleIn(DeleteScreen)
|
2019-04-28 22:43:54 +02:00
|
|
|
|
|
2020-03-06 00:57:00 +01:00
|
|
|
|
separator.onlyVisibleIn(SubscriptionsPickerScreen, IconPickerScreen)
|
|
|
|
|
cancel_button.onlyVisibleIn(InitialScreen, DeleteScreen)
|
2019-04-28 22:43:54 +02:00
|
|
|
|
|
2020-03-06 00:57:00 +01:00
|
|
|
|
confirm_button.setText(when {
|
|
|
|
|
currentScreen == InitialScreen && groupId == NO_GROUP_SELECTED -> R.string.create
|
|
|
|
|
else -> android.R.string.ok
|
|
|
|
|
})
|
2019-04-28 22:43:54 +02:00
|
|
|
|
|
2020-03-06 00:57:00 +01:00
|
|
|
|
delete_button.visibility = when {
|
|
|
|
|
currentScreen != InitialScreen -> View.GONE
|
|
|
|
|
groupId == NO_GROUP_SELECTED -> View.GONE
|
|
|
|
|
else -> View.VISIBLE
|
|
|
|
|
}
|
2019-04-28 22:43:54 +02:00
|
|
|
|
|
2020-04-05 21:25:44 +02:00
|
|
|
|
hideKeyboard()
|
|
|
|
|
hideSearch()
|
2019-04-28 22:43:54 +02:00
|
|
|
|
}
|
|
|
|
|
|
2020-03-06 00:57:00 +01:00
|
|
|
|
private fun View.onlyVisibleIn(vararg screens: ScreenState) {
|
|
|
|
|
visibility = when (currentScreen) {
|
|
|
|
|
in screens -> View.VISIBLE
|
|
|
|
|
else -> View.GONE
|
|
|
|
|
}
|
2020-03-06 00:27:00 +01:00
|
|
|
|
}
|
|
|
|
|
|
2020-04-05 21:25:44 +02:00
|
|
|
|
/*///////////////////////////////////////////////////////////////////////////
|
2019-04-28 22:43:54 +02:00
|
|
|
|
// Utils
|
2020-04-05 21:25:44 +02:00
|
|
|
|
////////////////////////////////////////////////////////////////////////// */
|
|
|
|
|
|
|
|
|
|
private fun isSearchVisible() = subscriptions_header_search_container?.visibility == View.VISIBLE
|
|
|
|
|
|
|
|
|
|
private fun resetSearch() {
|
|
|
|
|
toolbar_search_edit_text.setText("")
|
|
|
|
|
subscriptionsCurrentSearchQuery = ""
|
|
|
|
|
viewModel.clearSubscriptionsFilter()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private fun hideSearch() {
|
|
|
|
|
resetSearch()
|
|
|
|
|
subscriptions_header_search_container.visibility = View.GONE
|
|
|
|
|
subscriptions_header_info_container.visibility = View.VISIBLE
|
|
|
|
|
subscriptions_header_toolbar.menu.findItem(R.id.action_search).isVisible = true
|
|
|
|
|
hideKeyboardSearch()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private fun showSearch() {
|
|
|
|
|
subscriptions_header_search_container.visibility = View.VISIBLE
|
|
|
|
|
subscriptions_header_info_container.visibility = View.GONE
|
|
|
|
|
subscriptions_header_toolbar.menu.findItem(R.id.action_search).isVisible = false
|
|
|
|
|
showKeyboardSearch()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private val inputMethodManager by lazy {
|
2020-09-13 13:50:29 +02:00
|
|
|
|
requireActivity().getSystemService<InputMethodManager>()!!
|
2020-04-05 21:25:44 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private fun showKeyboardSearch() {
|
|
|
|
|
if (toolbar_search_edit_text.requestFocus()) {
|
|
|
|
|
inputMethodManager.showSoftInput(toolbar_search_edit_text, InputMethodManager.SHOW_IMPLICIT)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private fun hideKeyboardSearch() {
|
|
|
|
|
inputMethodManager.hideSoftInputFromWindow(toolbar_search_edit_text.windowToken,
|
|
|
|
|
InputMethodManager.RESULT_UNCHANGED_SHOWN)
|
|
|
|
|
toolbar_search_edit_text.clearFocus()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private fun showKeyboard() {
|
|
|
|
|
if (group_name_input.requestFocus()) {
|
|
|
|
|
inputMethodManager.showSoftInput(group_name_input, InputMethodManager.SHOW_IMPLICIT)
|
|
|
|
|
}
|
|
|
|
|
}
|
2019-04-28 22:43:54 +02:00
|
|
|
|
|
|
|
|
|
private fun hideKeyboard() {
|
2020-04-05 21:25:44 +02:00
|
|
|
|
inputMethodManager.hideSoftInputFromWindow(group_name_input.windowToken,
|
|
|
|
|
InputMethodManager.RESULT_UNCHANGED_SHOWN)
|
2019-04-28 22:43:54 +02:00
|
|
|
|
group_name_input.clearFocus()
|
|
|
|
|
}
|
|
|
|
|
|
2020-03-05 23:37:00 +01:00
|
|
|
|
private fun disableInput() {
|
|
|
|
|
delete_button?.isEnabled = false
|
|
|
|
|
confirm_button?.isEnabled = false
|
|
|
|
|
cancel_button?.isEnabled = false
|
|
|
|
|
isCancelable = false
|
|
|
|
|
|
|
|
|
|
hideKeyboard()
|
|
|
|
|
}
|
|
|
|
|
|
2019-04-28 22:43:54 +02:00
|
|
|
|
companion object {
|
|
|
|
|
private const val KEY_GROUP_ID = "KEY_GROUP_ID"
|
|
|
|
|
private const val NO_GROUP_SELECTED = -1L
|
|
|
|
|
|
|
|
|
|
fun newInstance(groupId: Long = NO_GROUP_SELECTED): FeedGroupDialog {
|
|
|
|
|
val dialog = FeedGroupDialog()
|
2020-10-17 12:08:45 +02:00
|
|
|
|
dialog.arguments = bundleOf(KEY_GROUP_ID to groupId)
|
2019-04-28 22:43:54 +02:00
|
|
|
|
return dialog
|
|
|
|
|
}
|
|
|
|
|
}
|
2020-05-01 20:13:01 +02:00
|
|
|
|
}
|