For #10342 - Part 4: Use the TopSitesFeature in the HomeFragment for displaying top sites
This commit is contained in:
parent
46aa6a003e
commit
1f564c10ce
|
@ -31,6 +31,11 @@ object FeatureFlags {
|
|||
*/
|
||||
const val newSearchExperience = true
|
||||
|
||||
/**
|
||||
* Enables showing the top frequently visited sites
|
||||
*/
|
||||
val topFrecentSite = Config.channel.isNightlyOrDebug
|
||||
|
||||
/**
|
||||
* Enables wait til first contentful paint
|
||||
*/
|
||||
|
|
|
@ -255,6 +255,8 @@ class Core(private val context: Context, private val crashReporter: CrashReporti
|
|||
*/
|
||||
val thumbnailStorage by lazy { ThumbnailStorage(context) }
|
||||
|
||||
val pinnedSiteStorage by lazy { PinnedSiteStorage(context) }
|
||||
|
||||
val topSiteStorage by lazy {
|
||||
val defaultTopSites = mutableListOf<Pair<String, String>>()
|
||||
|
||||
|
@ -286,7 +288,7 @@ class Core(private val context: Context, private val crashReporter: CrashReporti
|
|||
}
|
||||
|
||||
DefaultTopSitesStorage(
|
||||
PinnedSiteStorage(context),
|
||||
pinnedSiteStorage,
|
||||
historyStorage,
|
||||
defaultTopSites
|
||||
)
|
||||
|
|
|
@ -68,7 +68,10 @@ import mozilla.components.concept.sync.AccountObserver
|
|||
import mozilla.components.concept.sync.AuthType
|
||||
import mozilla.components.concept.sync.OAuthAccount
|
||||
import mozilla.components.feature.tab.collections.TabCollection
|
||||
import mozilla.components.feature.top.sites.TopSitesConfig
|
||||
import mozilla.components.feature.top.sites.TopSitesFeature
|
||||
import mozilla.components.lib.state.ext.consumeFrom
|
||||
import mozilla.components.support.base.feature.ViewBoundFeatureWrapper
|
||||
import mozilla.components.support.ktx.android.util.dpToPx
|
||||
import org.mozilla.fenix.BrowserDirection
|
||||
import org.mozilla.fenix.HomeActivity
|
||||
|
@ -96,6 +99,7 @@ import org.mozilla.fenix.home.sessioncontrol.DefaultSessionControlController
|
|||
import org.mozilla.fenix.home.sessioncontrol.SessionControlInteractor
|
||||
import org.mozilla.fenix.home.sessioncontrol.SessionControlView
|
||||
import org.mozilla.fenix.home.sessioncontrol.viewholders.CollectionViewHolder
|
||||
import org.mozilla.fenix.home.sessioncontrol.viewholders.topsites.DefaultTopSitesView
|
||||
import org.mozilla.fenix.onboarding.FenixOnboarding
|
||||
import org.mozilla.fenix.settings.SupportUtils
|
||||
import org.mozilla.fenix.settings.SupportUtils.SumoTopic.HELP
|
||||
|
@ -159,6 +163,8 @@ class HomeFragment : Fragment() {
|
|||
private var sessionControlView: SessionControlView? = null
|
||||
private lateinit var currentMode: CurrentMode
|
||||
|
||||
private val topSitesFeature = ViewBoundFeatureWrapper<TopSitesFeature>()
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
postponeEnterTransition()
|
||||
|
@ -192,15 +198,23 @@ class HomeFragment : Fragment() {
|
|||
collections = components.core.tabCollectionStorage.cachedTabCollections,
|
||||
expandedCollections = emptySet(),
|
||||
mode = currentMode.getCurrentMode(),
|
||||
topSites = StrictMode.allowThreadDiskReads().resetPoliciesAfter {
|
||||
components.core.topSiteStorage.cachedTopSites
|
||||
},
|
||||
topSites = components.core.topSiteStorage.cachedTopSites,
|
||||
tip = FenixTipManager(listOf(MigrationTipProvider(requireContext()))).getTip(),
|
||||
showCollectionPlaceholder = components.settings.showCollectionsPlaceholderOnHome
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
topSitesFeature.set(
|
||||
feature = TopSitesFeature(
|
||||
view = DefaultTopSitesView(homeFragmentStore),
|
||||
storage = components.core.topSiteStorage,
|
||||
config = ::getTopSitesConfig
|
||||
),
|
||||
owner = this,
|
||||
view = view
|
||||
)
|
||||
|
||||
_sessionControlInteractor = SessionControlInteractor(
|
||||
DefaultSessionControlController(
|
||||
activity = activity,
|
||||
|
@ -234,6 +248,15 @@ class HomeFragment : Fragment() {
|
|||
return view
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a [TopSitesConfig] which specifies how many top sites to display and whether or
|
||||
* not frequently visited sites should be displayed.
|
||||
*/
|
||||
private fun getTopSitesConfig(): TopSitesConfig {
|
||||
val settings = requireContext().settings()
|
||||
return TopSitesConfig(settings.topSitesMaxLimit, settings.showTopFrecentSites)
|
||||
}
|
||||
|
||||
/**
|
||||
* The [SessionControlView] is forced to update with our current state when we call
|
||||
* [HomeFragment.onCreateView] in order to be able to draw everything at once with the current
|
||||
|
|
|
@ -0,0 +1,19 @@
|
|||
/* 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.home.sessioncontrol.viewholders.topsites
|
||||
|
||||
import mozilla.components.feature.top.sites.TopSite
|
||||
import mozilla.components.feature.top.sites.view.TopSitesView
|
||||
import org.mozilla.fenix.home.HomeFragmentAction
|
||||
import org.mozilla.fenix.home.HomeFragmentStore
|
||||
|
||||
class DefaultTopSitesView(
|
||||
val store: HomeFragmentStore
|
||||
) : TopSitesView {
|
||||
|
||||
override fun displayTopSites(topSites: List<TopSite>) {
|
||||
store.dispatch(HomeFragmentAction.TopSitesChange(topSites))
|
||||
}
|
||||
}
|
|
@ -14,6 +14,7 @@ import kotlinx.android.synthetic.main.top_site_item.*
|
|||
import mozilla.components.browser.menu.BrowserMenuBuilder
|
||||
import mozilla.components.browser.menu.item.SimpleBrowserMenuItem
|
||||
import mozilla.components.feature.top.sites.TopSite
|
||||
import mozilla.components.feature.top.sites.TopSite.Type.DEFAULT
|
||||
import org.mozilla.fenix.R
|
||||
import org.mozilla.fenix.ext.components
|
||||
import org.mozilla.fenix.ext.loadIntoView
|
||||
|
@ -39,7 +40,7 @@ class TopSiteItemViewHolder(
|
|||
}
|
||||
|
||||
top_site_item.setOnClickListener {
|
||||
interactor.onSelectTopSite(topSite.url, topSite.isDefault)
|
||||
interactor.onSelectTopSite(topSite.url, topSite.type === DEFAULT)
|
||||
}
|
||||
|
||||
top_site_item.setOnLongClickListener {
|
||||
|
|
|
@ -31,6 +31,12 @@ class SecretSettingsFragment : PreferenceFragmentCompat() {
|
|||
onPreferenceChangeListener = SharedPreferenceUpdater()
|
||||
}
|
||||
|
||||
requirePreference<SwitchPreference>(R.string.pref_key_enable_top_frecent_sites).apply {
|
||||
isVisible = FeatureFlags.topFrecentSite
|
||||
isChecked = context.settings().showTopFrecentSites
|
||||
onPreferenceChangeListener = SharedPreferenceUpdater()
|
||||
}
|
||||
|
||||
requirePreference<SwitchPreference>(R.string.pref_key_wait_first_paint).apply {
|
||||
isVisible = FeatureFlags.waitUntilPaintToDraw
|
||||
isChecked = context.settings().waitToShowPageUntilFirstPaint
|
||||
|
|
|
@ -54,6 +54,7 @@ class Settings(private val appContext: Context) : PreferencesHolder {
|
|||
const val showLoginsSecureWarningMaxCount = 1
|
||||
const val trackingProtectionOnboardingMaximumCount = 1
|
||||
const val pwaVisitsToShowPromptMaxCount = 3
|
||||
const val topSitesMaxCount = 16
|
||||
const val FENIX_PREFERENCES = "fenix_preferences"
|
||||
|
||||
private const val showSearchWidgetCFRMaxCount = 3
|
||||
|
@ -103,6 +104,12 @@ class Settings(private val appContext: Context) : PreferencesHolder {
|
|||
featureFlag = FeatureFlags.newSearchExperience
|
||||
)
|
||||
|
||||
var showTopFrecentSites by featureFlagPreference(
|
||||
appContext.getPreferenceKey(R.string.pref_key_enable_top_frecent_sites),
|
||||
default = false,
|
||||
featureFlag = FeatureFlags.topFrecentSite
|
||||
)
|
||||
|
||||
var waitToShowPageUntilFirstPaint by featureFlagPreference(
|
||||
appContext.getPreferenceKey(R.string.pref_key_wait_first_paint),
|
||||
default = false,
|
||||
|
@ -829,6 +836,11 @@ class Settings(private val appContext: Context) : PreferencesHolder {
|
|||
default = 0
|
||||
)
|
||||
|
||||
val topSitesMaxLimit by intPreference(
|
||||
appContext.getPreferenceKey(R.string.pref_key_top_sites_max_limit),
|
||||
default = topSitesMaxCount
|
||||
)
|
||||
|
||||
fun setOpenTabsCount(count: Int) {
|
||||
preferences.edit().putInt(
|
||||
appContext.getPreferenceKey(R.string.pref_key_open_tabs_count),
|
||||
|
|
|
@ -165,10 +165,16 @@
|
|||
<string name="pref_key_testing_stage" translatable="false">pref_key_testing_stage</string>
|
||||
|
||||
<string name="pref_key_encryption_key_generated" translatable="false">pref_key_encryption_key_generated</string>
|
||||
|
||||
<!-- Top Sites -->
|
||||
<string name="default_top_sites_added" translatable="false">pref_key_pocket_top_site_added</string>
|
||||
<string name="pref_key_top_sites_size" translatable="false">pref_key_top_sites_size</string>
|
||||
<!-- Maximum number of top sites to display -->
|
||||
<string name="pref_key_top_sites_max_limit" translatable="false">pref_key_top_sites_max_limit</string>
|
||||
<!-- Whether or not the top frecent sites are shown along with pinned top sites -->
|
||||
<string name="pref_key_enable_top_frecent_sites" translatable="false">pref_key_top_frecent_sites</string>
|
||||
|
||||
<!-- A value of `true` means the PWA dialog has been showed or user already has PWAs installed-->
|
||||
<!-- A value of `true` means the PWA dialog has been showed or user already has PWAs installed -->
|
||||
<string name="pref_key_user_knows_about_pwa" translatable="false">pref_key_user_knows_about_pwa</string>
|
||||
|
||||
<string name="pref_key_migrating_from_fenix_nightly_tip" translatable="false">pref_key_migrating_from_fenix_nightly_tip</string>
|
||||
|
|
|
@ -34,6 +34,8 @@
|
|||
<string name="preferences_debug_settings">Secret Settings</string>
|
||||
<!-- Label for the new search experience preference -->
|
||||
<string name="preferences_debug_settings_use_new_search_experience">Use New Search Experience</string>
|
||||
<!-- Label for the show top frequently visited sites preference -->
|
||||
<string name="preferences_debug_settings_enable_top_frecent_sites">Show Top Frequently Visited Sites</string>
|
||||
<!-- Label for the wait until first paint preference -->
|
||||
<string name="preferences_debug_settings_wait_first_paint">Wait Until First Paint To Show Page Content</string>
|
||||
<!-- Label for showing Synced Tabs in the tabs tray -->
|
||||
|
|
|
@ -9,6 +9,11 @@
|
|||
android:key="@string/pref_key_use_new_search_experience"
|
||||
android:title="@string/preferences_debug_settings_use_new_search_experience"
|
||||
app:iconSpaceReserved="false" />
|
||||
<SwitchPreference
|
||||
android:defaultValue="false"
|
||||
android:key="@string/pref_key_enable_top_frecent_sites"
|
||||
android:title="@string/preferences_debug_settings_enable_top_frecent_sites"
|
||||
app:iconSpaceReserved="false" />
|
||||
<SwitchPreference
|
||||
android:defaultValue="false"
|
||||
android:key="@string/pref_key_wait_first_paint"
|
||||
|
|
|
@ -28,7 +28,7 @@ class MigratingFenixApplication : FenixApplication() {
|
|||
.migrateHistory(this.components.core.lazyHistoryStorage)
|
||||
.migrateBookmarks(
|
||||
this.components.core.lazyBookmarksStorage,
|
||||
this.components.core.topSiteStorage.storage
|
||||
this.components.core.pinnedSiteStorage
|
||||
)
|
||||
.migrateLogins(this.components.core.lazyPasswordsStorage)
|
||||
.migrateFxa(lazy { this.components.backgroundServices.accountManager })
|
||||
|
|
Loading…
Reference in New Issue