1
0
Fork 0

For #12735: Fixes issue with tab deletion undo (#12737)

master
Sawyer Blatz 2020-07-20 10:48:16 -07:00 committed by GitHub
parent 3f25a28cf7
commit f0c6bc0226
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 46 additions and 45 deletions

View File

@ -43,20 +43,14 @@ class TabCounter @JvmOverloads constructor(
}
fun setCountWithAnimation(count: Int) {
setCount(count)
// No need to animate on these cases.
when {
count == INTERNAL_COUNT -> return // There isn't any tab added or removed.
INTERNAL_COUNT == 0 -> {
setCount(count)
return
} // Initial state.
count > MAX_VISIBLE_TABS && INTERNAL_COUNT > MAX_VISIBLE_TABS -> {
INTERNAL_COUNT = count
updateContentDescription(count)
return
} // There are still over MAX_VISIBLE_TABS tabs open.
INTERNAL_COUNT == 0 -> return // Initial state.
INTERNAL_COUNT == count -> return // There isn't any tab added or removed.
INTERNAL_COUNT > MAX_VISIBLE_TABS -> return // There are still over MAX_VISIBLE_TABS tabs open.
}
setCount(count)
// Cancel previous animations if necessary.
if (animationSet.isRunning) {

View File

@ -113,6 +113,7 @@ import kotlin.math.min
@Suppress("TooManyFunctions", "LargeClass")
class HomeFragment : Fragment() {
private val args by navArgs<HomeFragmentArgs>()
private lateinit var bundleArgs: Bundle
private val homeViewModel: HomeScreenViewModel by viewModels {
ViewModelProvider.AndroidViewModelFactory(requireActivity().application)
@ -160,6 +161,7 @@ class HomeFragment : Fragment() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
postponeEnterTransition()
bundleArgs = args.toBundle()
lifecycleScope.launch(IO) {
if (!onboarding.userHasBeenOnboarded()) {
requireComponents.analytics.metrics.track(Event.OpenedAppFirstRun)
@ -377,7 +379,9 @@ class HomeFragment : Fragment() {
}
}
if (view.context.settings().accessibilityServicesEnabled && args.focusOnAddressBar) {
if (view.context.settings().accessibilityServicesEnabled &&
bundleArgs.getBoolean(FOCUS_ON_ADDRESS_BAR)
) {
// We cannot put this in the fragment_home.xml file as it breaks tests
view.toolbar_wrapper.isFocusableInTouchMode = true
viewLifecycleOwner.lifecycleScope.launch {
@ -395,6 +399,39 @@ class HomeFragment : Fragment() {
consumeFrom(requireComponents.core.store) {
updateTabCounter(it)
}
bundleArgs.getString(SESSION_TO_DELETE)?.also {
sessionManager.findSessionById(it)?.let { session ->
val snapshot = sessionManager.createSessionSnapshot(session)
val state = snapshot.engineSession?.saveState()
val isSelected =
session.id == requireComponents.core.store.state.selectedTabId ?: false
val snackbarMessage = if (snapshot.session.private) {
requireContext().getString(R.string.snackbar_private_tab_closed)
} else {
requireContext().getString(R.string.snackbar_tab_closed)
}
viewLifecycleOwner.lifecycleScope.allowUndo(
requireView(),
snackbarMessage,
requireContext().getString(R.string.snackbar_deleted_undo),
{
sessionManager.add(
snapshot.session,
isSelected,
engineSessionState = state
)
findNavController().navigate(HomeFragmentDirections.actionHomeFragmentToBrowserFragment(null))
},
operation = { },
anchorView = snackbarAnchorView
)
requireComponents.useCases.tabsUseCases.removeTab.invoke(session)
}
}
updateTabCounter(requireComponents.core.store.state)
}
@ -402,6 +439,7 @@ class HomeFragment : Fragment() {
super.onDestroyView()
_sessionControlInteractor = null
sessionControlView = null
bundleArgs.clear()
requireView().homeAppBar.removeOnOffsetChangedListener(homeAppBarOffSetListener)
requireActivity().window.clearFlags(FLAG_SECURE)
}
@ -503,38 +541,6 @@ class HomeFragment : Fragment() {
}
hideToolbar()
args.sessionToDelete?.also {
sessionManager.findSessionById(it)?.let { session ->
val snapshot = sessionManager.createSessionSnapshot(session)
val state = snapshot.engineSession?.saveState()
val isSelected =
session.id == requireComponents.core.store.state.selectedTabId ?: false
val snackbarMessage = if (snapshot.session.private) {
requireContext().getString(R.string.snackbar_private_tab_closed)
} else {
requireContext().getString(R.string.snackbar_tab_closed)
}
viewLifecycleOwner.lifecycleScope.allowUndo(
requireView(),
snackbarMessage,
requireContext().getString(R.string.snackbar_deleted_undo),
{
sessionManager.add(
snapshot.session,
isSelected,
engineSessionState = state
)
findNavController().navigate(HomeFragmentDirections.actionHomeFragmentToBrowserFragment(null))
},
operation = { },
anchorView = snackbarAnchorView
)
requireComponents.useCases.tabsUseCases.removeTab.invoke(session)
}
}
}
override fun onPause() {
@ -926,6 +932,8 @@ class HomeFragment : Fragment() {
}
companion object {
private const val FOCUS_ON_ADDRESS_BAR = "focusOnAddressBar"
private const val SESSION_TO_DELETE = "session_to_delete"
private const val ANIMATION_DELAY = 100L
private const val NON_TAB_ITEM_NUM = 3

View File

@ -44,5 +44,4 @@ open class GithubDetailsTask : DefaultTask() {
project.mkdir("/builds/worker/github")
detailsFile.writeText(replaced + suffix)
}
}