Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
The Tor Project
Applications
fenix
Commits
2f6fcbf1
Commit
2f6fcbf1
authored
Feb 04, 2021
by
Jonathan Almeida
Committed by
Jonathan Almeida
Feb 20, 2021
Browse files
Close #13892: Remove Synced Tabs appended to tabs tray
parent
516a6a34
Changes
17
Hide whitespace changes
Inline
Side-by-side
app/src/main/java/org/mozilla/fenix/FeatureFlags.kt
View file @
2f6fcbf1
...
...
@@ -14,13 +14,6 @@ object FeatureFlags {
*/
val
pullToRefreshEnabled
=
Config
.
channel
.
isNightlyOrDebug
/**
* Shows Synced Tabs in the tabs tray.
*
* Tracking issue: https://github.com/mozilla-mobile/fenix/issues/13892
*/
val
syncedTabsInTabsTray
=
Config
.
channel
.
isNightlyOrDebug
/**
* Enables the Nimbus experiments library.
*/
...
...
app/src/main/java/org/mozilla/fenix/components/toolbar/DefaultToolbarMenu.kt
View file @
2f6fcbf1
...
...
@@ -332,14 +332,12 @@ class DefaultToolbarMenu(
?.
browsingModeManager
?.
mode
==
BrowsingMode
.
Normal
val
shouldDeleteDataOnQuit
=
context
.
components
.
settings
.
shouldDeleteBrowsingDataOnQuit
val
syncedTabsInTabsTray
=
context
.
components
.
settings
.
syncedTabsInTabsTray
val
menuItems
=
listOfNotNull
(
downloadsItem
,
historyItem
,
bookmarksItem
,
if
(
syncedTabsInTabsTray
)
null
else
syncedTabs
,
syncedTabs
,
settings
,
if
(
shouldDeleteDataOnQuit
)
deleteDataOnQuit
else
null
,
BrowserMenuDivider
(),
...
...
@@ -471,9 +469,6 @@ class DefaultToolbarMenu(
onItemTapped
.
invoke
(
ToolbarMenu
.
Item
.
Settings
)
}
val
syncedTabsInTabsTray
=
context
.
components
.
settings
.
syncedTabsInTabsTray
val
menuItems
=
listOfNotNull
(
newTabItem
,
BrowserMenuDivider
(),
...
...
@@ -481,7 +476,7 @@ class DefaultToolbarMenu(
historyItem
,
downloadsItem
,
extensionsItem
,
if
(
syncedTabsInTabsTray
)
null
else
syncedTabsItem
,
syncedTabsItem
,
BrowserMenuDivider
(),
findInPageItem
,
desktopSiteItem
,
...
...
app/src/main/java/org/mozilla/fenix/home/HomeMenu.kt
View file @
2f6fcbf1
...
...
@@ -190,7 +190,7 @@ class HomeMenu(
if
(
settings
.
shouldDeleteBrowsingDataOnQuit
)
quitItem
else
null
,
settingsItem
,
BrowserMenuDivider
(),
if
(
settings
.
syncedTabsInTabsTray
)
null
else
syncedTabsItem
,
syncedTabsItem
,
bookmarksItem
,
historyItem
,
downloadsItem
,
...
...
app/src/main/java/org/mozilla/fenix/settings/SecretSettingsFragment.kt
View file @
2f6fcbf1
...
...
@@ -6,10 +6,7 @@ package org.mozilla.fenix.settings
import
android.os.Bundle
import
androidx.preference.PreferenceFragmentCompat
import
androidx.preference.SwitchPreference
import
org.mozilla.fenix.FeatureFlags
import
org.mozilla.fenix.R
import
org.mozilla.fenix.ext.settings
import
org.mozilla.fenix.ext.showToolbar
class
SecretSettingsFragment
:
PreferenceFragmentCompat
()
{
...
...
@@ -21,11 +18,5 @@ class SecretSettingsFragment : PreferenceFragmentCompat() {
override
fun
onCreatePreferences
(
savedInstanceState
:
Bundle
?,
rootKey
:
String
?)
{
setPreferencesFromResource
(
R
.
xml
.
secret_settings_preferences
,
rootKey
)
requirePreference
<
SwitchPreference
>(
R
.
string
.
pref_key_synced_tabs_tabs_tray
).
apply
{
isVisible
=
FeatureFlags
.
syncedTabsInTabsTray
isChecked
=
context
.
settings
().
syncedTabsInTabsTray
onPreferenceChangeListener
=
SharedPreferenceUpdater
()
}
}
}
app/src/main/java/org/mozilla/fenix/sync/SyncedTabsFragment.kt
View file @
2f6fcbf1
...
...
@@ -17,7 +17,6 @@ import mozilla.components.browser.storage.sync.Tab
import
mozilla.components.feature.syncedtabs.SyncedTabsFeature
import
mozilla.components.support.base.feature.ViewBoundFeatureWrapper
import
org.mozilla.fenix.BrowserDirection
import
org.mozilla.fenix.FeatureFlags
import
org.mozilla.fenix.HomeActivity
import
org.mozilla.fenix.R
import
org.mozilla.fenix.ext.components
...
...
@@ -28,11 +27,6 @@ import org.mozilla.fenix.theme.ThemeManager
class
SyncedTabsFragment
:
LibraryPageFragment
<
Tab
>()
{
private
val
syncedTabsFeature
=
ViewBoundFeatureWrapper
<
SyncedTabsFeature
>()
init
{
// Sanity-check: Remove this class when the feature flag is always enabled.
FeatureFlags
.
syncedTabsInTabsTray
}
override
fun
onCreateView
(
inflater
:
LayoutInflater
,
container
:
ViewGroup
?,
...
...
app/src/main/java/org/mozilla/fenix/sync/SyncedTabsLayout.kt
View file @
2f6fcbf1
...
...
@@ -19,7 +19,6 @@ import kotlinx.coroutines.launch
import
mozilla.components.browser.storage.sync.SyncedDeviceTabs
import
mozilla.components.browser.storage.sync.Tab
import
mozilla.components.feature.syncedtabs.view.SyncedTabsView
import
org.mozilla.fenix.FeatureFlags
import
org.mozilla.fenix.R
import
org.mozilla.fenix.components.metrics.Event
import
org.mozilla.fenix.components.metrics.MetricController
...
...
@@ -47,9 +46,6 @@ class SyncedTabsLayout @JvmOverloads constructor(
synced_tabs_list
.
adapter
=
adapter
synced_tabs_pull_to_refresh
.
setOnRefreshListener
{
listener
?.
onRefresh
()
}
// Sanity-check: Remove this class when the feature flag is always enabled.
FeatureFlags
.
syncedTabsInTabsTray
}
override
fun
onError
(
error
:
SyncedTabsView
.
ErrorType
)
{
...
...
app/src/main/java/org/mozilla/fenix/tabtray/SyncedTabsController.kt
deleted
100644 → 0
View file @
516a6a34
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
package
org.mozilla.fenix.tabtray
import
android.view.View
import
androidx.fragment.app.FragmentManager.findFragment
import
androidx.lifecycle.LifecycleOwner
import
androidx.navigation.NavController
import
androidx.navigation.fragment.findNavController
import
androidx.recyclerview.widget.ConcatAdapter
import
kotlinx.coroutines.CoroutineScope
import
kotlinx.coroutines.Dispatchers
import
kotlinx.coroutines.ExperimentalCoroutinesApi
import
kotlinx.coroutines.flow.collect
import
kotlinx.coroutines.flow.drop
import
kotlinx.coroutines.flow.map
import
kotlinx.coroutines.launch
import
mozilla.components.browser.storage.sync.SyncedDeviceTabs
import
mozilla.components.feature.syncedtabs.view.SyncedTabsView
import
mozilla.components.lib.state.ext.flowScoped
import
mozilla.components.support.ktx.kotlinx.coroutines.flow.ifChanged
import
org.mozilla.fenix.components.metrics.MetricController
import
org.mozilla.fenix.sync.ListenerDelegate
import
org.mozilla.fenix.sync.SyncedTabsAdapter
import
org.mozilla.fenix.sync.ext.toAdapterList
import
org.mozilla.fenix.sync.ext.toAdapterItem
import
org.mozilla.fenix.sync.ext.toStringRes
import
kotlin.coroutines.CoroutineContext
@OptIn
(
ExperimentalCoroutinesApi
::
class
)
class
SyncedTabsController
(
lifecycleOwner
:
LifecycleOwner
,
private
val
view
:
View
,
store
:
TabTrayDialogFragmentStore
,
private
val
concatAdapter
:
ConcatAdapter
,
coroutineContext
:
CoroutineContext
=
Dispatchers
.
Main
,
metrics
:
MetricController
)
:
SyncedTabsView
{
override
var
listener
:
SyncedTabsView
.
Listener
?
=
null
val
adapter
=
SyncedTabsAdapter
(
ListenerDelegate
(
metrics
)
{
listener
})
private
val
scope
:
CoroutineScope
=
CoroutineScope
(
coroutineContext
)
init
{
store
.
flowScoped
(
lifecycleOwner
)
{
flow
->
flow
.
map
{
it
.
mode
}
.
ifChanged
()
.
drop
(
1
)
.
collect
{
mode
->
when
(
mode
)
{
is
TabTrayDialogFragmentState
.
Mode
.
Normal
->
{
concatAdapter
.
addAdapter
(
adapter
)
}
is
TabTrayDialogFragmentState
.
Mode
.
MultiSelect
->
{
concatAdapter
.
removeAdapter
(
adapter
)
}
}
}
}
}
override
fun
displaySyncedTabs
(
syncedTabs
:
List
<
SyncedDeviceTabs
>)
{
scope
.
launch
{
val
tabsList
=
listOf
(
SyncedTabsAdapter
.
AdapterItem
.
Title
)
+
syncedTabs
.
toAdapterList
()
// Reverse layout for TabTrayView which does things backwards.
adapter
.
submitList
(
tabsList
.
reversed
())
}
}
override
fun
onError
(
error
:
SyncedTabsView
.
ErrorType
)
{
scope
.
launch
{
val
navController
:
NavController
?
=
try
{
findFragment
<
TabTrayDialogFragment
>(
view
).
findNavController
()
}
catch
(
exception
:
IllegalStateException
)
{
null
}
val
descriptionResId
=
error
.
toStringRes
()
val
errorItem
=
error
.
toAdapterItem
(
descriptionResId
,
navController
)
adapter
.
submitList
(
listOf
(
errorItem
))
}
}
}
app/src/main/java/org/mozilla/fenix/tabtray/TabTrayController.kt
View file @
2f6fcbf1
...
...
@@ -20,7 +20,6 @@ import mozilla.components.concept.engine.prompt.ShareData
import
mozilla.components.concept.storage.BookmarksStorage
import
mozilla.components.concept.tabstray.Tab
import
mozilla.components.feature.tabs.TabsUseCases
import
org.mozilla.fenix.BrowserDirection
import
org.mozilla.fenix.HomeActivity
import
org.mozilla.fenix.browser.browsingmode.BrowsingMode
import
org.mozilla.fenix.browser.browsingmode.BrowsingModeManager
...
...
@@ -28,7 +27,6 @@ import org.mozilla.fenix.components.TabCollectionStorage
import
org.mozilla.fenix.components.metrics.Event
import
org.mozilla.fenix.components.metrics.MetricController
import
org.mozilla.fenix.home.HomeFragment
import
mozilla.components.browser.storage.sync.Tab
as
SyncTab
/**
* [TabTrayDialogFragment] controller.
...
...
@@ -42,7 +40,6 @@ interface TabTrayController {
fun
handleTabSettingsClicked
()
fun
handleShareTabsOfTypeClicked
(
private
:
Boolean
)
fun
handleShareSelectedTabsClicked
(
selectedTabs
:
Set
<
Tab
>)
fun
handleSyncedTabClicked
(
syncTab
:
SyncTab
)
fun
handleSaveToCollectionClicked
(
selectedTabs
:
Set
<
Tab
>)
fun
handleBookmarkSelectedTabs
(
selectedTabs
:
Set
<
Tab
>)
fun
handleDeleteSelectedTabs
(
selectedTabs
:
Set
<
Tab
>)
...
...
@@ -197,14 +194,6 @@ class DefaultTabTrayController(
}
}
override
fun
handleSyncedTabClicked
(
syncTab
:
SyncTab
)
{
activity
.
openToBrowserAndLoad
(
searchTermOrURL
=
syncTab
.
active
().
url
,
newTab
=
true
,
from
=
BrowserDirection
.
FromTabTray
)
}
@OptIn
(
ExperimentalCoroutinesApi
::
class
)
override
fun
handleCloseAllTabsClicked
(
private
:
Boolean
)
{
val
sessionsToClose
=
if
(
private
)
{
...
...
app/src/main/java/org/mozilla/fenix/tabtray/TabTrayDialogFragment.kt
View file @
2f6fcbf1
...
...
@@ -215,7 +215,6 @@ class TabTrayDialogFragment : AppCompatDialogFragment(), UserInteractionHandler
showBookmarksSnackbar
=
::
showBookmarksSnackbar
)
),
store
=
tabTrayDialogStore
,
isPrivate
=
isPrivate
,
isInLandscape
=
::
isInLandscape
,
lifecycleOwner
=
viewLifecycleOwner
...
...
app/src/main/java/org/mozilla/fenix/tabtray/TabTrayFragmentInteractor.kt
View file @
2f6fcbf1
...
...
@@ -5,7 +5,6 @@
package
org.mozilla.fenix.tabtray
import
mozilla.components.concept.tabstray.Tab
import
mozilla.components.browser.storage.sync.Tab
as
SyncTab
@Suppress
(
"TooManyFunctions"
)
interface
TabTrayInteractor
{
...
...
@@ -54,11 +53,6 @@ interface TabTrayInteractor {
*/
fun
onCloseAllTabsClicked
(
private
:
Boolean
)
/**
* Called when the user clicks on a synced tab entry.
*/
fun
onSyncedTabClicked
(
syncTab
:
SyncTab
)
/**
* Called when the physical back button is clicked.
*/
...
...
@@ -146,10 +140,6 @@ class TabTrayFragmentInteractor(private val controller: TabTrayController) : Tab
controller
.
handleCloseAllTabsClicked
(
private
)
}
override
fun
onSyncedTabClicked
(
syncTab
:
SyncTab
)
{
controller
.
handleSyncedTabClicked
(
syncTab
)
}
override
fun
onBackPressed
():
Boolean
{
return
controller
.
handleBackPressed
()
}
...
...
app/src/main/java/org/mozilla/fenix/tabtray/TabTrayView.kt
View file @
2f6fcbf1
...
...
@@ -41,8 +41,6 @@ import mozilla.components.browser.state.selector.privateTabs
import
mozilla.components.browser.state.state.BrowserState
import
mozilla.components.browser.state.state.TabSessionState
import
mozilla.components.browser.tabstray.TabViewHolder
import
mozilla.components.feature.syncedtabs.SyncedTabsFeature
import
mozilla.components.support.base.feature.ViewBoundFeatureWrapper
import
mozilla.components.support.ktx.android.util.dpToPx
import
mozilla.components.ui.tabcounter.TabCounter.Companion.INFINITE_CHAR_PADDING_BOTTOM
import
org.mozilla.fenix.R
...
...
@@ -59,7 +57,6 @@ import org.mozilla.fenix.utils.Settings
import
java.text.NumberFormat
import
kotlin.math.max
import
kotlin.math.roundToInt
import
mozilla.components.browser.storage.sync.Tab
as
SyncTab
/**
* View that contains and configures the BrowserAwesomeBar
...
...
@@ -69,7 +66,6 @@ class TabTrayView(
private
val
container
:
ViewGroup
,
private
val
tabsAdapter
:
FenixTabsAdapter
,
private
val
interactor
:
TabTrayInteractor
,
store
:
TabTrayDialogFragmentStore
,
isPrivate
:
Boolean
,
private
val
isInLandscape
:
()
->
Boolean
,
lifecycleOwner
:
LifecycleOwner
,
...
...
@@ -97,11 +93,6 @@ class TabTrayView(
private
var
tabsTouchHelper
:
TabsTouchHelper
private
val
collectionsButtonAdapter
=
SaveToCollectionsButtonAdapter
(
interactor
,
isPrivate
)
private
val
metrics
=
container
.
context
.
components
.
analytics
.
metrics
private
val
syncedTabsController
=
SyncedTabsController
(
lifecycleOwner
,
view
,
store
,
concatAdapter
,
metrics
=
metrics
)
private
val
syncedTabsFeature
=
ViewBoundFeatureWrapper
<
SyncedTabsFeature
>()
private
var
hasLoaded
=
false
...
...
@@ -167,21 +158,6 @@ class TabTrayView(
setTopOffset
(
isInLandscape
())
if
(
view
.
context
.
settings
().
syncedTabsInTabsTray
)
{
syncedTabsFeature
.
set
(
feature
=
SyncedTabsFeature
(
context
=
container
.
context
,
storage
=
components
.
backgroundServices
.
syncedTabsStorage
,
accountManager
=
components
.
backgroundServices
.
accountManager
,
view
=
syncedTabsController
,
lifecycleOwner
=
lifecycleOwner
,
onTabClicked
=
::
handleTabClicked
),
owner
=
lifecycleOwner
,
view
=
view
)
}
updateTabsTrayLayout
()
view
.
tabsTray
.
apply
{
...
...
@@ -197,7 +173,6 @@ class TabTrayView(
tabsAdapter
.
tabTrayInteractor
=
interactor
tabsAdapter
.
onTabsUpdated
=
{
concatAdapter
.
addAdapter
(
collectionsButtonAdapter
)
concatAdapter
.
addAdapter
(
syncedTabsController
.
adapter
)
if
(
hasAccessibilityEnabled
)
{
tabsAdapter
.
notifyItemRangeChanged
(
0
,
tabs
.
size
)
...
...
@@ -344,10 +319,6 @@ class TabTrayView(
}
}
private
fun
handleTabClicked
(
tab
:
SyncTab
)
{
interactor
.
onSyncedTabClicked
(
tab
)
}
private
fun
adjustNewTabButtonsForNormalMode
()
{
view
.
tab_tray_new_tab
.
apply
{
isVisible
=
hasAccessibilityEnabled
...
...
app/src/main/java/org/mozilla/fenix/utils/Settings.kt
View file @
2f6fcbf1
...
...
@@ -26,12 +26,10 @@ import mozilla.components.support.ktx.android.content.longPreference
import
mozilla.components.support.ktx.android.content.stringPreference
import
org.mozilla.fenix.BuildConfig
import
org.mozilla.fenix.Config
import
org.mozilla.fenix.FeatureFlags
import
org.mozilla.fenix.R
import
org.mozilla.fenix.browser.browsingmode.BrowsingMode
import
org.mozilla.fenix.components.metrics.MozillaProductDetector
import
org.mozilla.fenix.components.settings.counterPreference
import
org.mozilla.fenix.components.settings.featureFlagPreference
import
org.mozilla.fenix.components.toolbar.ToolbarPosition
import
org.mozilla.fenix.ext.components
import
org.mozilla.fenix.ext.getPreferenceKey
...
...
@@ -123,12 +121,6 @@ class Settings(private val appContext: Context) : PreferencesHolder {
val
canShowCfr
:
Boolean
get
()
=
(
System
.
currentTimeMillis
()
-
lastCfrShownTimeInMillis
)
>
THREE_DAYS_MS
var
syncedTabsInTabsTray
by
featureFlagPreference
(
appContext
.
getPreferenceKey
(
R
.
string
.
pref_key_synced_tabs_tabs_tray
),
default
=
false
,
featureFlag
=
FeatureFlags
.
syncedTabsInTabsTray
)
var
forceEnableZoom
by
booleanPreference
(
appContext
.
getPreferenceKey
(
R
.
string
.
pref_key_accessibility_force_enable_zoom
),
default
=
false
...
...
app/src/main/res/values/preference_keys.xml
View file @
2f6fcbf1
...
...
@@ -213,8 +213,6 @@
<string
name=
"pref_key_migrating_from_fenix_tip"
translatable=
"false"
>
pref_key_migrating_from_fenix_tip
</string>
<string
name=
"pref_key_master_password_tip"
translatable=
"false"
>
pref_key_master_password_tip
</string>
<string
name=
"pref_key_synced_tabs_tabs_tray"
translatable=
"false"
>
pref_key_synced_tabs_tabs_tray
</string>
<string
name=
"pref_key_debug_settings"
translatable=
"false"
>
pref_key_debug_settings
</string>
<string
name=
"pref_key_open_tabs_count"
translatable=
"false"
>
pref_key_open_tabs_count
</string>
...
...
app/src/main/res/xml/secret_settings_preferences.xml
View file @
2f6fcbf1
...
...
@@ -4,9 +4,4 @@
- file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
<PreferenceScreen
xmlns:android=
"http://schemas.android.com/apk/res/android"
xmlns:app=
"http://schemas.android.com/apk/res-auto"
>
<SwitchPreference
android:defaultValue=
"false"
android:key=
"@string/pref_key_synced_tabs_tabs_tray"
android:title=
"@string/preferences_debug_synced_tabs_tabs_tray"
app:iconSpaceReserved=
"false"
/>
</PreferenceScreen>
app/src/test/java/org/mozilla/fenix/tabtray/DefaultTabTrayControllerTest.kt
View file @
2f6fcbf1
...
...
@@ -32,7 +32,6 @@ import org.junit.Assert.assertEquals
import
org.junit.Assert.assertTrue
import
org.junit.Before
import
org.junit.Test
import
org.mozilla.fenix.BrowserDirection
import
org.mozilla.fenix.HomeActivity
import
org.mozilla.fenix.R
import
org.mozilla.fenix.browser.browsingmode.BrowsingMode
...
...
@@ -179,15 +178,6 @@ class DefaultTabTrayControllerTest {
}
}
@Test
fun
onSyncedTabClicked
()
{
controller
.
handleSyncedTabClicked
(
mockk
(
relaxed
=
true
))
verify
{
activity
.
openToBrowserAndLoad
(
any
(),
true
,
BrowserDirection
.
FromTabTray
)
}
}
@Test
fun
handleBackPressed
()
{
every
{
tabTrayFragmentStore
.
state
.
mode
}
returns
TabTrayDialogFragmentState
.
Mode
.
MultiSelect
(
...
...
app/src/test/java/org/mozilla/fenix/tabtray/SyncedTabsControllerTest.kt
deleted
100644 → 0
View file @
516a6a34
package
org.mozilla.fenix.tabtray
import
android.view.LayoutInflater
import
android.view.View
import
androidx.lifecycle.Lifecycle
import
androidx.lifecycle.LifecycleOwner
import
androidx.lifecycle.LifecycleRegistry
import
androidx.recyclerview.widget.ConcatAdapter
import
io.mockk.Called
import
io.mockk.every
import
io.mockk.mockk
import
io.mockk.verify
import
kotlinx.coroutines.ExperimentalCoroutinesApi
import
kotlinx.coroutines.test.TestCoroutineDispatcher
import
kotlinx.coroutines.test.runBlockingTest
import
mozilla.components.browser.storage.sync.SyncedDeviceTabs
import
mozilla.components.feature.syncedtabs.view.SyncedTabsView.ErrorType
import
mozilla.components.support.test.ext.joinBlocking
import
mozilla.components.support.test.robolectric.testContext
import
mozilla.components.support.test.rule.MainCoroutineRule
import
org.junit.After
import
org.junit.Assert.assertEquals
import
org.junit.Before
import
org.junit.Rule
import
org.junit.Test
import
org.junit.runner.RunWith
import
org.mozilla.fenix.R
import
org.mozilla.fenix.components.metrics.MetricController
import
org.mozilla.fenix.helpers.FenixRobolectricTestRunner
import
org.mozilla.fenix.sync.SyncedTabsViewHolder
import
org.mozilla.fenix.tabtray.TabTrayDialogFragmentAction.EnterMultiSelectMode
import
org.mozilla.fenix.tabtray.TabTrayDialogFragmentAction.ExitMultiSelectMode
import
org.mozilla.fenix.tabtray.TabTrayDialogFragmentState.Mode
@ExperimentalCoroutinesApi
@RunWith
(
FenixRobolectricTestRunner
::
class
)
class
SyncedTabsControllerTest
{
private
val
testDispatcher
=
TestCoroutineDispatcher
()
@
get
:
Rule
val
coroutinesTestRule
=
MainCoroutineRule
(
testDispatcher
)
private
lateinit
var
view
:
View
private
lateinit
var
controller
:
SyncedTabsController
private
lateinit
var
lifecycleOwner
:
LifecycleOwner
private
lateinit
var
lifecycle
:
LifecycleRegistry
private
lateinit
var
concatAdapter
:
ConcatAdapter
private
lateinit
var
store
:
TabTrayDialogFragmentStore
@Before
fun
setup
()
=
runBlockingTest
{
lifecycleOwner
=
mockk
()
lifecycle
=
LifecycleRegistry
(
lifecycleOwner
)
lifecycle
.
handleLifecycleEvent
(
Lifecycle
.
Event
.
ON_START
)
every
{
lifecycleOwner
.
lifecycle
}
returns
lifecycle
concatAdapter
=
mockk
()
every
{
concatAdapter
.
addAdapter
(
any
())
}
returns
true
every
{
concatAdapter
.
removeAdapter
(
any
())
}
returns
true
store
=
TabTrayDialogFragmentStore
(
initialState
=
TabTrayDialogFragmentState
(
mode
=
Mode
.
Normal
,
browserState
=
mockk
(
relaxed
=
true
)
)
)
view
=
LayoutInflater
.
from
(
testContext
).
inflate
(
R
.
layout
.
about_list_item
,
null
)
val
metrics
:
MetricController
=
mockk
()
controller
=
SyncedTabsController
(
lifecycleOwner
,
view
,
store
,
concatAdapter
,
coroutineContext
,
metrics
)
}
@After
fun
cleanUp
()
{
testDispatcher
.
cleanupTestCoroutines
()
}
@Test
fun
`display
synced
tabs
in
reverse`
()
{
val
tabs
=
listOf
(
SyncedDeviceTabs
(
device
=
mockk
(
relaxed
=
true
),
tabs
=
listOf
(
mockk
(
relaxed
=
true
),
mockk
(
relaxed
=
true
)
)
)
)
controller
.
displaySyncedTabs
(
tabs
)
val
itemCount
=
controller
.
adapter
.
itemCount
// title + device name + 2 tabs
assertEquals
(
4
,
itemCount
)
assertEquals
(
SyncedTabsViewHolder
.
TitleViewHolder
.
LAYOUT_ID
,
controller
.
adapter
.
getItemViewType
(
itemCount
-
1
)
)
assertEquals
(
SyncedTabsViewHolder
.
DeviceViewHolder
.
LAYOUT_ID
,
controller
.
adapter
.
getItemViewType
(
itemCount
-
2
)
)
assertEquals
(
SyncedTabsViewHolder
.
TabViewHolder
.
LAYOUT_ID
,
controller
.
adapter
.
getItemViewType
(
itemCount
-
3
)
)
assertEquals
(
SyncedTabsViewHolder
.
TabViewHolder
.
LAYOUT_ID
,
controller
.
adapter
.
getItemViewType
(
itemCount
-
4
)
)
}
@Test
fun
`show
error
when
we
go
kaput`
()
{
controller
.
onError
(
ErrorType
.
SYNC_NEEDS_REAUTHENTICATION
)
assertEquals
(
1
,
controller
.
adapter
.
itemCount
)
assertEquals
(
SyncedTabsViewHolder
.
ErrorViewHolder
.
LAYOUT_ID
,
controller
.
adapter
.
getItemViewType
(
0
)
)
}
@Test
fun
`do
nothing
on
init
,
drop
first
event`
()
{
verify
{
concatAdapter
wasNot
Called
}
}
@Test
fun
`concatAdapter
updated
on
mode
changes`
()
=
testDispatcher
.
runBlockingTest
{
store
.
dispatch
(
EnterMultiSelectMode
).
joinBlocking
()
verify
{
concatAdapter
.
removeAdapter
(
any
())
}
store
.
dispatch
(
ExitMultiSelectMode
).
joinBlocking
()
// When returning from Multiselect the adapter should be added at the end
verify
{
concatAdapter
.
addAdapter
(
any
())
}
}
}
app/src/test/java/org/mozilla/fenix/tabtray/TabTrayFragmentInteractorTest.kt
View file @
2f6fcbf1
...
...
@@ -89,12 +89,6 @@ class TabTrayFragmentInteractorTest {
verify
{
controller
.
handleCloseAllTabsClicked
(
true
)
}
}
@Test
fun
onSyncedTabClicked
()
{
interactor
.
onSyncedTabClicked
(
mockk
(
relaxed
=
true
))
verify
{
controller
.
handleSyncedTabClicked
(
any
())
}
}
@Test
fun
onBackPressed
()
{
interactor
.
onBackPressed
()
...
...
Matthew Finkel
@sysrqb
mentioned in issue
#40150 (closed)
·
<