From 1f564c10ce60de8cba5fc6dd325b4ec0effad59c Mon Sep 17 00:00:00 2001 From: Gabriel Luong Date: Tue, 18 Aug 2020 17:55:52 -0400 Subject: [PATCH] For #10342 - Part 4: Use the TopSitesFeature in the HomeFragment for displaying top sites --- .../java/org/mozilla/fenix/FeatureFlags.kt | 5 ++++ .../java/org/mozilla/fenix/components/Core.kt | 4 ++- .../org/mozilla/fenix/home/HomeFragment.kt | 29 +++++++++++++++++-- .../topsites/DefaultTopSitesView.kt | 19 ++++++++++++ .../topsites/TopSiteItemViewHolder.kt | 3 +- .../fenix/settings/SecretSettingsFragment.kt | 6 ++++ .../java/org/mozilla/fenix/utils/Settings.kt | 12 ++++++++ app/src/main/res/values/preference_keys.xml | 8 ++++- app/src/main/res/values/static_strings.xml | 2 ++ .../res/xml/secret_settings_preferences.xml | 5 ++++ .../fenix/MigratingFenixApplication.kt | 2 +- 11 files changed, 88 insertions(+), 7 deletions(-) create mode 100644 app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/topsites/DefaultTopSitesView.kt diff --git a/app/src/main/java/org/mozilla/fenix/FeatureFlags.kt b/app/src/main/java/org/mozilla/fenix/FeatureFlags.kt index 4993e8ee3..074591d9e 100644 --- a/app/src/main/java/org/mozilla/fenix/FeatureFlags.kt +++ b/app/src/main/java/org/mozilla/fenix/FeatureFlags.kt @@ -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 */ diff --git a/app/src/main/java/org/mozilla/fenix/components/Core.kt b/app/src/main/java/org/mozilla/fenix/components/Core.kt index 0fc25f1d7..a38eb06a6 100644 --- a/app/src/main/java/org/mozilla/fenix/components/Core.kt +++ b/app/src/main/java/org/mozilla/fenix/components/Core.kt @@ -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>() @@ -286,7 +288,7 @@ class Core(private val context: Context, private val crashReporter: CrashReporti } DefaultTopSitesStorage( - PinnedSiteStorage(context), + pinnedSiteStorage, historyStorage, defaultTopSites ) diff --git a/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt b/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt index ce16a8da3..6f3cfcdcf 100644 --- a/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt @@ -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() + 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 diff --git a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/topsites/DefaultTopSitesView.kt b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/topsites/DefaultTopSitesView.kt new file mode 100644 index 000000000..63fd9c2c9 --- /dev/null +++ b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/topsites/DefaultTopSitesView.kt @@ -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) { + store.dispatch(HomeFragmentAction.TopSitesChange(topSites)) + } +} diff --git a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/topsites/TopSiteItemViewHolder.kt b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/topsites/TopSiteItemViewHolder.kt index 4f5ee6e1e..b1249423d 100644 --- a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/topsites/TopSiteItemViewHolder.kt +++ b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/topsites/TopSiteItemViewHolder.kt @@ -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 { diff --git a/app/src/main/java/org/mozilla/fenix/settings/SecretSettingsFragment.kt b/app/src/main/java/org/mozilla/fenix/settings/SecretSettingsFragment.kt index 7040af768..4e06e5661 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/SecretSettingsFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/SecretSettingsFragment.kt @@ -31,6 +31,12 @@ class SecretSettingsFragment : PreferenceFragmentCompat() { onPreferenceChangeListener = SharedPreferenceUpdater() } + requirePreference(R.string.pref_key_enable_top_frecent_sites).apply { + isVisible = FeatureFlags.topFrecentSite + isChecked = context.settings().showTopFrecentSites + onPreferenceChangeListener = SharedPreferenceUpdater() + } + requirePreference(R.string.pref_key_wait_first_paint).apply { isVisible = FeatureFlags.waitUntilPaintToDraw isChecked = context.settings().waitToShowPageUntilFirstPaint diff --git a/app/src/main/java/org/mozilla/fenix/utils/Settings.kt b/app/src/main/java/org/mozilla/fenix/utils/Settings.kt index 3cd3f8399..690dc8a10 100644 --- a/app/src/main/java/org/mozilla/fenix/utils/Settings.kt +++ b/app/src/main/java/org/mozilla/fenix/utils/Settings.kt @@ -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), diff --git a/app/src/main/res/values/preference_keys.xml b/app/src/main/res/values/preference_keys.xml index 621b377d7..a7af0f00c 100644 --- a/app/src/main/res/values/preference_keys.xml +++ b/app/src/main/res/values/preference_keys.xml @@ -165,10 +165,16 @@ pref_key_testing_stage pref_key_encryption_key_generated + + pref_key_pocket_top_site_added pref_key_top_sites_size + + pref_key_top_sites_max_limit + + pref_key_top_frecent_sites - + pref_key_user_knows_about_pwa pref_key_migrating_from_fenix_nightly_tip diff --git a/app/src/main/res/values/static_strings.xml b/app/src/main/res/values/static_strings.xml index 4a76e78b4..975270daa 100644 --- a/app/src/main/res/values/static_strings.xml +++ b/app/src/main/res/values/static_strings.xml @@ -34,6 +34,8 @@ Secret Settings Use New Search Experience + + Show Top Frequently Visited Sites Wait Until First Paint To Show Page Content diff --git a/app/src/main/res/xml/secret_settings_preferences.xml b/app/src/main/res/xml/secret_settings_preferences.xml index 794994749..0a43e3609 100644 --- a/app/src/main/res/xml/secret_settings_preferences.xml +++ b/app/src/main/res/xml/secret_settings_preferences.xml @@ -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" /> +