Closes #19090: Show snackbar on adding to bookmarks from tabs tray

upstream-sync
Roger Yang 3 years ago committed by mergify[bot]
parent df563819c5
commit e69f3dfbbb

@ -879,7 +879,6 @@ class SmokeTest {
} }
} }
@Ignore("Disabling until re-implemented by #19090")
@Test @Test
fun createFirstCollectionTest() { fun createFirstCollectionTest() {
val firstWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1) val firstWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1)
@ -895,7 +894,7 @@ class SmokeTest {
}.goToHomescreen { }.goToHomescreen {
}.clickSaveTabsToCollectionButton { }.clickSaveTabsToCollectionButton {
longClickTab(firstWebPage.title) longClickTab(firstWebPage.title)
longClickTab(secondWebPage.title) selectTab(secondWebPage.title)
}.clickSaveCollection { }.clickSaveCollection {
typeCollectionNameAndSave(collectionName) typeCollectionNameAndSave(collectionName)
} }
@ -963,7 +962,6 @@ class SmokeTest {
} }
} }
@Ignore("Disabling until re-implemented by #19090")
@Test @Test
fun shareCollectionTest() { fun shareCollectionTest() {
val webPage = TestAssetHelper.getGenericAsset(mockWebServer, 1) val webPage = TestAssetHelper.getGenericAsset(mockWebServer, 1)
@ -985,7 +983,6 @@ class SmokeTest {
} }
} }
@Ignore("Disabling until re-implemented by #19090")
@Test @Test
fun deleteCollectionTest() { fun deleteCollectionTest() {
val webPage = TestAssetHelper.getGenericAsset(mockWebServer, 1) val webPage = TestAssetHelper.getGenericAsset(mockWebServer, 1)

@ -104,6 +104,7 @@ class DefaultNavigationInteractor(
isNewCollection: Boolean, isNewCollection: Boolean,
collectionToSelect: Long? collectionToSelect: Long?
) -> Unit, ) -> Unit,
private val showBookmarkSnackbar: (tabSize: Int) -> Unit,
private val accountManager: FxaAccountManager, private val accountManager: FxaAccountManager,
private val ioDispatcher: CoroutineContext private val ioDispatcher: CoroutineContext
) : NavigationInteractor { ) : NavigationInteractor {
@ -171,12 +172,12 @@ class DefaultNavigationInteractor(
override fun onSaveToCollections(tabs: Collection<Tab>) { override fun onSaveToCollections(tabs: Collection<Tab>) {
metrics.track(Event.TabsTraySaveToCollectionPressed) metrics.track(Event.TabsTraySaveToCollectionPressed)
tabsTrayStore.dispatch(TabsTrayAction.ExitSelectMode)
CollectionsDialog( CollectionsDialog(
storage = collectionStorage, storage = collectionStorage,
sessionList = browserStore.getTabSessionState(tabs), sessionList = browserStore.getTabSessionState(tabs),
onPositiveButtonClick = { id, isNewCollection -> onPositiveButtonClick = { id, isNewCollection ->
tabsTrayStore.dispatch(TabsTrayAction.ExitSelectMode)
// If collection is null, a new one was created. // If collection is null, a new one was created.
val event = if (isNewCollection) { val event = if (isNewCollection) {
@ -190,9 +191,7 @@ class DefaultNavigationInteractor(
metrics.track(event) metrics.track(event)
}, },
onNegativeButtonClick = { onNegativeButtonClick = {}
tabsTrayStore.dispatch(TabsTrayAction.ExitSelectMode)
}
).show(context) ).show(context)
} }
@ -206,7 +205,7 @@ class DefaultNavigationInteractor(
} }
} }
// TODO show successful snackbar here (regardless of operation success). showBookmarkSnackbar(tabs.size)
} }
override fun onSyncedTabClicked(tab: SyncTab) { override fun onSyncedTabClicked(tab: SyncTab) {

@ -28,6 +28,7 @@ import kotlinx.android.synthetic.main.fragment_tab_tray_dialog.*
import kotlinx.android.synthetic.main.tabs_tray_tab_counter2.* import kotlinx.android.synthetic.main.tabs_tray_tab_counter2.*
import kotlinx.android.synthetic.main.tabstray_multiselect_items.* import kotlinx.android.synthetic.main.tabstray_multiselect_items.*
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import mozilla.appservices.places.BookmarkRoot
import mozilla.components.browser.state.selector.normalTabs import mozilla.components.browser.state.selector.normalTabs
import mozilla.components.browser.state.selector.privateTabs import mozilla.components.browser.state.selector.privateTabs
import mozilla.components.browser.state.store.BrowserStore import mozilla.components.browser.state.store.BrowserStore
@ -49,8 +50,9 @@ import org.mozilla.fenix.tabstray.browser.SelectionBannerBinding
import org.mozilla.fenix.tabstray.browser.SelectionBannerBinding.VisibilityModifier import org.mozilla.fenix.tabstray.browser.SelectionBannerBinding.VisibilityModifier
import org.mozilla.fenix.tabstray.browser.SelectionHandleBinding import org.mozilla.fenix.tabstray.browser.SelectionHandleBinding
import org.mozilla.fenix.tabstray.ext.anchorWithAction import org.mozilla.fenix.tabstray.ext.anchorWithAction
import org.mozilla.fenix.tabstray.ext.bookmarkMessage
import org.mozilla.fenix.tabstray.ext.collectionMessage
import org.mozilla.fenix.tabstray.ext.make import org.mozilla.fenix.tabstray.ext.make
import org.mozilla.fenix.tabstray.ext.message
import org.mozilla.fenix.tabstray.ext.orDefault import org.mozilla.fenix.tabstray.ext.orDefault
import org.mozilla.fenix.tabstray.ext.showWithTheme import org.mozilla.fenix.tabstray.ext.showWithTheme
import org.mozilla.fenix.utils.allowUndo import org.mozilla.fenix.utils.allowUndo
@ -133,6 +135,7 @@ class TabsTrayFragment : AppCompatDialogFragment() {
bookmarksUseCase = requireComponents.useCases.bookmarksUseCases, bookmarksUseCase = requireComponents.useCases.bookmarksUseCases,
collectionStorage = requireComponents.core.tabCollectionStorage, collectionStorage = requireComponents.core.tabCollectionStorage,
showCollectionSnackbar = ::showCollectionSnackbar, showCollectionSnackbar = ::showCollectionSnackbar,
showBookmarkSnackbar = ::showBookmarkSnackbar,
accountManager = requireComponents.backgroundServices.accountManager, accountManager = requireComponents.backgroundServices.accountManager,
ioDispatcher = Dispatchers.IO ioDispatcher = Dispatchers.IO
) )
@ -410,16 +413,10 @@ class TabsTrayFragment : AppCompatDialogFragment() {
isNewCollection: Boolean = false, isNewCollection: Boolean = false,
collectionToSelect: Long? collectionToSelect: Long?
) { ) {
val anchor = if (requireComponents.settings.accessibilityServicesEnabled) {
null
} else {
new_tab_button
}
FenixSnackbar FenixSnackbar
.make(requireView()) .make(requireView())
.message(tabSize, isNewCollection) .collectionMessage(tabSize, isNewCollection)
.anchorWithAction(anchor) { .anchorWithAction(getSnackbarAnchor()) {
findNavController().navigate( findNavController().navigate(
TabsTrayFragmentDirections.actionGlobalHome( TabsTrayFragmentDirections.actionGlobalHome(
focusOnAddressBar = false, focusOnAddressBar = false,
@ -430,6 +427,30 @@ class TabsTrayFragment : AppCompatDialogFragment() {
}.show() }.show()
} }
@VisibleForTesting
internal fun showBookmarkSnackbar(
tabSize: Int
) {
FenixSnackbar
.make(requireView())
.bookmarkMessage(tabSize)
.anchorWithAction(getSnackbarAnchor()) {
findNavController().navigate(
TabsTrayFragmentDirections.actionGlobalBookmarkFragment(BookmarkRoot.Mobile.id)
)
dismissTabsTray()
}
.show()
}
private fun getSnackbarAnchor(): View? {
return if (requireComponents.settings.accessibilityServicesEnabled) {
null
} else {
new_tab_button
}
}
companion object { companion object {
// Minimum number of list items for which to show the tabs tray as expanded. // Minimum number of list items for which to show the tabs tray as expanded.
const val EXPAND_AT_LIST_SIZE = 4 const val EXPAND_AT_LIST_SIZE = 4

@ -9,7 +9,7 @@ import org.mozilla.fenix.R
import org.mozilla.fenix.components.FenixSnackbar import org.mozilla.fenix.components.FenixSnackbar
import org.mozilla.fenix.tabstray.TabsTrayFragment.Companion.ELEVATION import org.mozilla.fenix.tabstray.TabsTrayFragment.Companion.ELEVATION
internal fun FenixSnackbar.message( internal fun FenixSnackbar.collectionMessage(
tabSize: Int, tabSize: Int,
isNewCollection: Boolean = false isNewCollection: Boolean = false
): FenixSnackbar { ): FenixSnackbar {
@ -28,6 +28,21 @@ internal fun FenixSnackbar.message(
return this return this
} }
internal fun FenixSnackbar.bookmarkMessage(
tabSize: Int
): FenixSnackbar {
val stringRes = when {
tabSize > 1 -> {
R.string.snackbar_message_bookmarks_saved
}
else -> {
R.string.bookmark_saved_snackbar
}
}
setText(context.getString(stringRes))
return this
}
internal inline fun FenixSnackbar.anchorWithAction( internal inline fun FenixSnackbar.anchorWithAction(
anchor: View?, anchor: View?,
crossinline action: () -> Unit crossinline action: () -> Unit

@ -54,6 +54,7 @@ class NavigationInteractorTest {
private val context: Context = mockk(relaxed = true) private val context: Context = mockk(relaxed = true)
private val collectionStorage: TabCollectionStorage = mockk(relaxed = true) private val collectionStorage: TabCollectionStorage = mockk(relaxed = true)
private val showCollectionSnackbar: (Int, Boolean, Long?) -> Unit = mockk(relaxed = true) private val showCollectionSnackbar: (Int, Boolean, Long?) -> Unit = mockk(relaxed = true)
private val showBookmarkSnackbar: (Int) -> Unit = mockk(relaxed = true)
private val accountManager: FxaAccountManager = mockk(relaxed = true) private val accountManager: FxaAccountManager = mockk(relaxed = true)
private val activity: HomeActivity = mockk(relaxed = true) private val activity: HomeActivity = mockk(relaxed = true)
@ -78,6 +79,7 @@ class NavigationInteractorTest {
tabsTrayStore, tabsTrayStore,
collectionStorage, collectionStorage,
showCollectionSnackbar, showCollectionSnackbar,
showBookmarkSnackbar,
accountManager, accountManager,
testDispatcher testDispatcher
) )
@ -234,23 +236,9 @@ class NavigationInteractorTest {
@Test @Test
fun `onBookmarkTabs calls navigation on DefaultNavigationInteractor`() = runBlockingTest { fun `onBookmarkTabs calls navigation on DefaultNavigationInteractor`() = runBlockingTest {
navigationInteractor = DefaultNavigationInteractor(
context,
activity,
store,
navController,
metrics,
dismissTabTray,
dismissTabTrayAndNavigateHome,
bookmarksUseCase,
tabsTrayStore,
collectionStorage,
showCollectionSnackbar,
accountManager,
coroutineContext
)
navigationInteractor.onSaveToBookmarks(listOf(createTrayTab())) navigationInteractor.onSaveToBookmarks(listOf(createTrayTab()))
coVerify(exactly = 1) { bookmarksUseCase.addBookmark(any(), any(), any()) } coVerify(exactly = 1) { bookmarksUseCase.addBookmark(any(), any(), any()) }
coVerify(exactly = 1) { showBookmarkSnackbar(1) }
} }
@Test @Test

@ -13,7 +13,7 @@ import org.mozilla.fenix.tabstray.TabsTrayFragment.Companion.ELEVATION
class FenixSnackbarKtTest { class FenixSnackbarKtTest {
@Test @Test
fun `WHEN message is called with different parameters THEN correct text will be set`() { fun `WHEN collectionMessage is called with different parameters THEN correct text will be set`() {
val mockContext: Context = mockk { val mockContext: Context = mockk {
every { getString(R.string.create_collection_tabs_saved_new_collection) } every { getString(R.string.create_collection_tabs_saved_new_collection) }
.answers { "test1" } .answers { "test1" }
@ -27,9 +27,9 @@ class FenixSnackbarKtTest {
} }
every { snackbar.setText(any()) }.answers { snackbar } every { snackbar.setText(any()) }.answers { snackbar }
snackbar.message(1, true) snackbar.collectionMessage(1, true)
snackbar.message(2, false) snackbar.collectionMessage(2, false)
snackbar.message(1, false) snackbar.collectionMessage(1, false)
verifyOrder { verifyOrder {
snackbar.setText("test1") snackbar.setText("test1")
@ -38,6 +38,28 @@ class FenixSnackbarKtTest {
} }
} }
@Test
fun `WHEN bookmarkMessage is called with different parameters THEN correct text will be set`() {
val mockContext: Context = mockk {
every { getString(R.string.bookmark_saved_snackbar) }
.answers { "test1" }
every { getString(R.string.snackbar_message_bookmarks_saved) }
.answers { "test2" }
}
val snackbar: FenixSnackbar = mockk {
every { context }.answers { mockContext }
}
every { snackbar.setText(any()) }.answers { snackbar }
snackbar.bookmarkMessage(1)
snackbar.bookmarkMessage(2)
verifyOrder {
snackbar.setText("test1")
snackbar.setText("test2")
}
}
@Test @Test
fun `WHEN anchorWithAction is called THEN correct text will be set`() { fun `WHEN anchorWithAction is called THEN correct text will be set`() {
val mockContext: Context = mockk { val mockContext: Context = mockk {

Loading…
Cancel
Save