|
|
|
@ -7,6 +7,7 @@ package org.mozilla.fenix.library.recentlyclosed
|
|
|
|
|
import android.content.ClipboardManager
|
|
|
|
|
import android.content.Context
|
|
|
|
|
import android.os.Bundle
|
|
|
|
|
import android.text.SpannableString
|
|
|
|
|
import android.view.LayoutInflater
|
|
|
|
|
import android.view.Menu
|
|
|
|
|
import android.view.MenuInflater
|
|
|
|
@ -21,6 +22,7 @@ import kotlinx.coroutines.flow.map
|
|
|
|
|
import mozilla.components.browser.state.state.recover.RecoverableTab
|
|
|
|
|
import mozilla.components.lib.state.ext.consumeFrom
|
|
|
|
|
import mozilla.components.lib.state.ext.flowScoped
|
|
|
|
|
import mozilla.components.support.base.feature.UserInteractionHandler
|
|
|
|
|
import mozilla.components.support.ktx.kotlinx.coroutines.flow.ifChanged
|
|
|
|
|
import org.mozilla.fenix.BrowserDirection
|
|
|
|
|
import org.mozilla.fenix.HomeActivity
|
|
|
|
@ -30,17 +32,19 @@ import org.mozilla.fenix.components.FenixSnackbar
|
|
|
|
|
import org.mozilla.fenix.components.StoreProvider
|
|
|
|
|
import org.mozilla.fenix.ext.getRootView
|
|
|
|
|
import org.mozilla.fenix.ext.requireComponents
|
|
|
|
|
import org.mozilla.fenix.ext.setTextColor
|
|
|
|
|
import org.mozilla.fenix.ext.showToolbar
|
|
|
|
|
import org.mozilla.fenix.library.LibraryPageFragment
|
|
|
|
|
|
|
|
|
|
@Suppress("TooManyFunctions")
|
|
|
|
|
class RecentlyClosedFragment : LibraryPageFragment<RecoverableTab>() {
|
|
|
|
|
class RecentlyClosedFragment : LibraryPageFragment<RecoverableTab>(), UserInteractionHandler {
|
|
|
|
|
private lateinit var recentlyClosedFragmentStore: RecentlyClosedFragmentStore
|
|
|
|
|
private var _recentlyClosedFragmentView: RecentlyClosedFragmentView? = null
|
|
|
|
|
protected val recentlyClosedFragmentView: RecentlyClosedFragmentView
|
|
|
|
|
get() = _recentlyClosedFragmentView!!
|
|
|
|
|
|
|
|
|
|
private lateinit var recentlyClosedInteractor: RecentlyClosedFragmentInteractor
|
|
|
|
|
private lateinit var recentlyClosedController: RecentlyClosedController
|
|
|
|
|
|
|
|
|
|
override fun onResume() {
|
|
|
|
|
super.onResume()
|
|
|
|
@ -48,16 +52,44 @@ class RecentlyClosedFragment : LibraryPageFragment<RecoverableTab>() {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
|
|
|
|
|
if (recentlyClosedFragmentStore.state.selectedTabs.isNotEmpty()) {
|
|
|
|
|
inflater.inflate(R.menu.history_select_multi, menu)
|
|
|
|
|
menu.findItem(R.id.delete_history_multi_select)?.let { deleteItem ->
|
|
|
|
|
deleteItem.title = SpannableString(deleteItem.title)
|
|
|
|
|
.apply { setTextColor(requireContext(), R.attr.destructive) }
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
inflater.inflate(R.menu.library_menu, menu)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
override fun onOptionsItemSelected(item: MenuItem): Boolean = when (item.itemId) {
|
|
|
|
|
override fun onOptionsItemSelected(item: MenuItem): Boolean {
|
|
|
|
|
val selectedTabs = recentlyClosedFragmentStore.state.selectedTabs
|
|
|
|
|
|
|
|
|
|
return when (item.itemId) {
|
|
|
|
|
R.id.close_history -> {
|
|
|
|
|
close()
|
|
|
|
|
true
|
|
|
|
|
}
|
|
|
|
|
R.id.share_history_multi_select -> {
|
|
|
|
|
recentlyClosedController.handleShare(selectedTabs)
|
|
|
|
|
true
|
|
|
|
|
}
|
|
|
|
|
R.id.delete_history_multi_select -> {
|
|
|
|
|
recentlyClosedController.handleDelete(selectedTabs)
|
|
|
|
|
true
|
|
|
|
|
}
|
|
|
|
|
R.id.open_history_in_new_tabs_multi_select -> {
|
|
|
|
|
recentlyClosedController.handleOpen(selectedTabs, BrowsingMode.Normal)
|
|
|
|
|
true
|
|
|
|
|
}
|
|
|
|
|
R.id.open_history_in_private_tabs_multi_select -> {
|
|
|
|
|
recentlyClosedController.handleOpen(selectedTabs, BrowsingMode.Private)
|
|
|
|
|
true
|
|
|
|
|
}
|
|
|
|
|
else -> super.onOptionsItemSelected(item)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
override fun onCreate(savedInstanceState: Bundle?) {
|
|
|
|
|
super.onCreate(savedInstanceState)
|
|
|
|
@ -73,14 +105,15 @@ class RecentlyClosedFragment : LibraryPageFragment<RecoverableTab>() {
|
|
|
|
|
recentlyClosedFragmentStore = StoreProvider.get(this) {
|
|
|
|
|
RecentlyClosedFragmentStore(
|
|
|
|
|
RecentlyClosedFragmentState(
|
|
|
|
|
items = listOf()
|
|
|
|
|
items = listOf(),
|
|
|
|
|
selectedTabs = emptySet()
|
|
|
|
|
)
|
|
|
|
|
)
|
|
|
|
|
}
|
|
|
|
|
recentlyClosedInteractor = RecentlyClosedFragmentInteractor(
|
|
|
|
|
recentlyClosedController = DefaultRecentlyClosedController(
|
|
|
|
|
navController = findNavController(),
|
|
|
|
|
store = requireComponents.core.store,
|
|
|
|
|
browserStore = requireComponents.core.store,
|
|
|
|
|
recentlyClosedStore = recentlyClosedFragmentStore,
|
|
|
|
|
activity = activity as HomeActivity,
|
|
|
|
|
tabsUseCases = requireComponents.useCases.tabsUseCases,
|
|
|
|
|
resources = requireContext().resources,
|
|
|
|
@ -91,7 +124,7 @@ class RecentlyClosedFragment : LibraryPageFragment<RecoverableTab>() {
|
|
|
|
|
clipboardManager = activity?.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager,
|
|
|
|
|
openToBrowser = ::openItem
|
|
|
|
|
)
|
|
|
|
|
)
|
|
|
|
|
recentlyClosedInteractor = RecentlyClosedFragmentInteractor(recentlyClosedController)
|
|
|
|
|
_recentlyClosedFragmentView = RecentlyClosedFragmentView(
|
|
|
|
|
view.recentlyClosedLayout,
|
|
|
|
|
recentlyClosedInteractor
|
|
|
|
@ -116,8 +149,9 @@ class RecentlyClosedFragment : LibraryPageFragment<RecoverableTab>() {
|
|
|
|
|
|
|
|
|
|
@ExperimentalCoroutinesApi
|
|
|
|
|
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
|
|
|
|
consumeFrom(recentlyClosedFragmentStore) {
|
|
|
|
|
recentlyClosedFragmentView.update(it.items)
|
|
|
|
|
consumeFrom(recentlyClosedFragmentStore) { state ->
|
|
|
|
|
recentlyClosedFragmentView.update(state)
|
|
|
|
|
activity?.invalidateOptionsMenu()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
requireComponents.core.store.flowScoped(viewLifecycleOwner) { flow ->
|
|
|
|
@ -132,4 +166,8 @@ class RecentlyClosedFragment : LibraryPageFragment<RecoverableTab>() {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
override val selectedItems: Set<RecoverableTab> = setOf()
|
|
|
|
|
|
|
|
|
|
override fun onBackPressed(): Boolean {
|
|
|
|
|
return recentlyClosedController.handleBackPressed()
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|