From b72550c28a7d2115a7171853cfcd5fa1f56d9d58 Mon Sep 17 00:00:00 2001 From: ekager Date: Thu, 13 Feb 2020 20:08:05 -0800 Subject: [PATCH] For #8126 - Adds default top sites --- app/metrics.yaml | 24 +++++++++ .../fenix/components/TopSiteStorage.kt | 51 +++++++++++++++++++ .../components/metrics/GleanMetricsService.kt | 7 +++ .../fenix/components/metrics/Metrics.kt | 2 + .../SessionControlController.kt | 13 +++-- .../topsites/TopSiteItemViewHolder.kt | 12 ++++- .../mozilla/fenix/settings/SupportUtils.kt | 3 ++ .../java/org/mozilla/fenix/utils/Settings.kt | 5 ++ app/src/main/res/drawable/ic_pocket.xml | 16 ++++++ app/src/main/res/values/preference_keys.xml | 1 + app/src/main/res/values/static_strings.xml | 7 +++ docs/metrics.md | 2 + 12 files changed, 138 insertions(+), 5 deletions(-) create mode 100644 app/src/main/res/drawable/ic_pocket.xml diff --git a/app/metrics.yaml b/app/metrics.yaml index fa962bc12..13b301405 100644 --- a/app/metrics.yaml +++ b/app/metrics.yaml @@ -1765,3 +1765,27 @@ app_theme: notification_emails: - fenix-core@mozilla.com expires: "2020-09-01" + +pocket: + pocket_top_site_clicked: + type: event + description: > + A user clicked on the trending Pocket top site + bugs: + - https://github.com/mozilla-mobile/fenix/issues/8126 + data_reviews: + - https://github.com/mozilla-mobile/fenix/pull/8098 + notification_emails: + - fenix-core@mozilla.com + expires: "2020-09-01" + pocket_top_site_removed: + type: event + description: > + A user removed the trending Pocket top site + bugs: + - https://github.com/mozilla-mobile/fenix/issues/8126 + data_reviews: + - https://github.com/mozilla-mobile/fenix/pull/8098 + notification_emails: + - fenix-core@mozilla.com + expires: "2020-09-01" diff --git a/app/src/main/java/org/mozilla/fenix/components/TopSiteStorage.kt b/app/src/main/java/org/mozilla/fenix/components/TopSiteStorage.kt index 63a16841d..7dfa56a83 100644 --- a/app/src/main/java/org/mozilla/fenix/components/TopSiteStorage.kt +++ b/app/src/main/java/org/mozilla/fenix/components/TopSiteStorage.kt @@ -6,8 +6,17 @@ package org.mozilla.fenix.components import android.content.Context import androidx.lifecycle.LiveData +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.GlobalScope +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext import mozilla.components.feature.top.sites.TopSite import mozilla.components.feature.top.sites.TopSiteStorage +import mozilla.components.support.locale.LocaleManager +import org.mozilla.fenix.R +import org.mozilla.fenix.ext.settings +import org.mozilla.fenix.settings.SupportUtils +import org.mozilla.fenix.settings.advanced.getSelectedLocale import org.mozilla.fenix.test.Mockable @Mockable @@ -18,6 +27,10 @@ class TopSiteStorage(private val context: Context) { TopSiteStorage(context) } + init { + addDefaultTopSites() + } + /** * Adds a new [TopSite]. */ @@ -38,4 +51,42 @@ class TopSiteStorage(private val context: Context) { fun removeTopSite(topSite: TopSite) { storage.removeTopSite(topSite) } + + private fun addDefaultTopSites() { + val topSiteCandidates = mutableListOf>() + if (!context.settings().defaultTopSitesAdded) { + if (LocaleManager.getSelectedLocale(context).language == "en") { + topSiteCandidates.add( + Pair( + context.getString(R.string.pocket_pinned_top_articles), + SupportUtils.POCKET_TRENDING_URL + ) + ) + } + + topSiteCandidates.add( + Pair( + context.getString(R.string.default_top_site_wikipedia), + SupportUtils.WIKIPEDIA_URL + ) + ) + + topSiteCandidates.add( + Pair( + context.getString(R.string.default_top_site_youtube), + SupportUtils.YOUTUBE_URL + ) + ) + + GlobalScope.launch(Dispatchers.Main) { + withContext(Dispatchers.IO) { + topSiteCandidates.forEach { + addTopSite(it.first, it.second) + } + } + } + context.settings().preferences.edit() + .putBoolean(context.getString(R.string.default_top_sites_added), true).apply() + } + } } diff --git a/app/src/main/java/org/mozilla/fenix/components/metrics/GleanMetricsService.kt b/app/src/main/java/org/mozilla/fenix/components/metrics/GleanMetricsService.kt index cf352e68a..4a0b76932 100644 --- a/app/src/main/java/org/mozilla/fenix/components/metrics/GleanMetricsService.kt +++ b/app/src/main/java/org/mozilla/fenix/components/metrics/GleanMetricsService.kt @@ -29,6 +29,7 @@ import org.mozilla.fenix.GleanMetrics.MediaNotification import org.mozilla.fenix.GleanMetrics.MediaState import org.mozilla.fenix.GleanMetrics.Metrics import org.mozilla.fenix.GleanMetrics.Pings +import org.mozilla.fenix.GleanMetrics.Pocket import org.mozilla.fenix.GleanMetrics.PrivateBrowsingMode import org.mozilla.fenix.GleanMetrics.PrivateBrowsingShortcut import org.mozilla.fenix.GleanMetrics.QrScanner @@ -483,6 +484,12 @@ private val Event.wrapper: EventWrapper<*>? is Event.LibrariesThatWeUseTapped -> EventWrapper( { AboutPage.librariesTapped.record(it) } ) + is Event.PocketTopSiteClicked -> EventWrapper( + { Pocket.pocketTopSiteClicked.record(it) } + ) + is Event.PocketTopSiteRemoved -> EventWrapper( + { Pocket.pocketTopSiteRemoved.record(it) } + ) is Event.DarkThemeSelected -> EventWrapper( { AppTheme.darkThemeSelected.record(it) }, { AppTheme.darkThemeSelectedKeys.valueOf(it) } diff --git a/app/src/main/java/org/mozilla/fenix/components/metrics/Metrics.kt b/app/src/main/java/org/mozilla/fenix/components/metrics/Metrics.kt index 4e0059021..46ff83a59 100644 --- a/app/src/main/java/org/mozilla/fenix/components/metrics/Metrics.kt +++ b/app/src/main/java/org/mozilla/fenix/components/metrics/Metrics.kt @@ -149,6 +149,8 @@ sealed class Event { object RightsTapped : Event() object LicensingTapped : Event() object LibrariesThatWeUseTapped : Event() + object PocketTopSiteClicked : Event() + object PocketTopSiteRemoved : Event() object FennecToFenixMigrated : Event() // Interaction events with extras diff --git a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlController.kt b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlController.kt index 39aeae076..3301037a2 100644 --- a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlController.kt +++ b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlController.kt @@ -17,7 +17,6 @@ import mozilla.components.feature.media.ext.playIfPaused import mozilla.components.feature.media.state.MediaStateMachine import mozilla.components.feature.tab.collections.TabCollection import mozilla.components.feature.top.sites.TopSite -import mozilla.components.feature.tab.collections.Tab as ComponentTab import org.mozilla.fenix.BrowserDirection import org.mozilla.fenix.HomeActivity import org.mozilla.fenix.R @@ -26,9 +25,9 @@ import org.mozilla.fenix.browser.browsingmode.BrowsingModeManager import org.mozilla.fenix.collections.SaveCollectionStep import org.mozilla.fenix.components.TabCollectionStorage import org.mozilla.fenix.components.TopSiteStorage -import org.mozilla.fenix.ext.components import org.mozilla.fenix.components.metrics.Event import org.mozilla.fenix.components.metrics.MetricController +import org.mozilla.fenix.ext.components import org.mozilla.fenix.ext.nav import org.mozilla.fenix.ext.sessionsOfType import org.mozilla.fenix.home.HomeFragment @@ -37,6 +36,7 @@ import org.mozilla.fenix.home.HomeFragmentDirections import org.mozilla.fenix.home.HomeFragmentStore import org.mozilla.fenix.home.Tab import org.mozilla.fenix.settings.SupportUtils +import mozilla.components.feature.tab.collections.Tab as ComponentTab /** * [HomeFragment] controller. An interface that handles the view manipulation of the Tabs triggered @@ -294,6 +294,9 @@ class DefaultSessionControlController( override fun handleRemoveTopSiteClicked(topSite: TopSite) { metrics.track(Event.TopSiteRemoved) + if (topSite.url == SupportUtils.POCKET_TRENDING_URL) { + metrics.track(Event.PocketTopSiteRemoved) + } lifecycleScope.launch(Dispatchers.IO) { topSiteStorage.removeTopSite(topSite) @@ -335,7 +338,8 @@ class DefaultSessionControlController( val directions = HomeFragmentDirections.actionHomeFragmentToBrowserFragment(null) val extras = FragmentNavigator.Extras.Builder() - .addSharedElement(tabView, + .addSharedElement( + tabView, "$TAB_ITEM_TRANSITION_NAME$sessionId" ) .build() @@ -344,6 +348,9 @@ class DefaultSessionControlController( override fun handleSelectTopSite(url: String) { metrics.track(Event.TopSiteOpenInNewTab) + if (url == SupportUtils.POCKET_TRENDING_URL) { + metrics.track(Event.PocketTopSiteClicked) + } activity.components.useCases.tabsUseCases.addTab.invoke(url, true, true) navController.nav( R.id.homeFragment, 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 2d5cefb14..88d754460 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 @@ -8,13 +8,14 @@ import android.content.Context import android.view.View import androidx.recyclerview.widget.RecyclerView import kotlinx.android.synthetic.main.top_site_item.view.* -import mozilla.components.feature.top.sites.TopSite import mozilla.components.browser.menu.BrowserMenuBuilder import mozilla.components.browser.menu.item.SimpleBrowserMenuItem +import mozilla.components.feature.top.sites.TopSite import org.mozilla.fenix.R import org.mozilla.fenix.ext.components import org.mozilla.fenix.ext.loadIntoView import org.mozilla.fenix.home.sessioncontrol.TopSiteInteractor +import org.mozilla.fenix.settings.SupportUtils class TopSiteItemViewHolder( private val view: View, @@ -46,7 +47,14 @@ class TopSiteItemViewHolder( fun bind(topSite: TopSite) { this.topSite = topSite view.top_site_title.text = topSite.title - view.context.components.core.icons.loadIntoView(view.favicon_image, topSite.url) + when { + topSite.url == SupportUtils.POCKET_TRENDING_URL -> { + view.favicon_image.setImageDrawable(view.context.getDrawable(R.drawable.ic_pocket)) + } + else -> { + view.context.components.core.icons.loadIntoView(view.favicon_image, topSite.url) + } + } } companion object { diff --git a/app/src/main/java/org/mozilla/fenix/settings/SupportUtils.kt b/app/src/main/java/org/mozilla/fenix/settings/SupportUtils.kt index 36378da43..df83bd05f 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/SupportUtils.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/SupportUtils.kt @@ -22,7 +22,10 @@ import java.util.Locale object SupportUtils { const val RATE_APP_URL = "market://details?id=" + BuildConfig.APPLICATION_ID const val MOZILLA_MANIFESTO_URL = "https://www.mozilla.org/en-GB/about/manifesto/" + const val POCKET_TRENDING_URL = "https://getpocket.com/fenix-top-articles" + const val WIKIPEDIA_URL = "https://www.wikipedia.org/" const val FENIX_PLAY_STORE_URL = "https://play.google.com/store/apps/details?id=${BuildConfig.APPLICATION_ID}" + const val YOUTUBE_URL = "https://www.youtube.com/" enum class SumoTopic(internal val topicStr: String) { HELP("faq-android"), 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 10fe36a63..9667b179b 100644 --- a/app/src/main/java/org/mozilla/fenix/utils/Settings.kt +++ b/app/src/main/java/org/mozilla/fenix/utils/Settings.kt @@ -339,6 +339,11 @@ class Settings private constructor( default = true ) + val defaultTopSitesAdded by booleanPreference( + appContext.getPreferenceKey(R.string.default_top_sites_added), + default = false + ) + var shouldShowSearchSuggestionsInPrivate by booleanPreference( appContext.getPreferenceKey(R.string.pref_key_show_search_suggestions_in_private), default = false diff --git a/app/src/main/res/drawable/ic_pocket.xml b/app/src/main/res/drawable/ic_pocket.xml new file mode 100644 index 000000000..f2e00d192 --- /dev/null +++ b/app/src/main/res/drawable/ic_pocket.xml @@ -0,0 +1,16 @@ + + + + + + diff --git a/app/src/main/res/values/preference_keys.xml b/app/src/main/res/values/preference_keys.xml index 1db8313a4..6349daabe 100644 --- a/app/src/main/res/values/preference_keys.xml +++ b/app/src/main/res/values/preference_keys.xml @@ -136,4 +136,5 @@ pref_key_testing_stage pref_key_encryption_key_generated + pref_key_pocket_top_site_added diff --git a/app/src/main/res/values/static_strings.xml b/app/src/main/res/values/static_strings.xml index 40b746f23..95d6cfca2 100644 --- a/app/src/main/res/values/static_strings.xml +++ b/app/src/main/res/values/static_strings.xml @@ -23,4 +23,11 @@ GV + + + Top Articles + + Wikipedia + + YouTube diff --git a/docs/metrics.md b/docs/metrics.md index 0c0ccc354..6be577f00 100644 --- a/docs/metrics.md +++ b/docs/metrics.md @@ -114,6 +114,8 @@ The following metrics are added to the ping: | media_state.pause |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |Media playback was paused. |[1](https://github.com/mozilla-mobile/fenix/pull/6463)||2020-09-01 | | media_state.play |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |Media started playing. |[1](https://github.com/mozilla-mobile/fenix/pull/6463)||2020-09-01 | | media_state.stop |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |Media playback has ended. |[1](https://github.com/mozilla-mobile/fenix/pull/6463)||2020-09-01 | +| pocket.pocket_top_site_clicked |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user clicked on the trending Pocket top site |[1](https://github.com/mozilla-mobile/fenix/pull/8098)||2020-09-01 | +| pocket.pocket_top_site_removed |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user removed the trending Pocket top site |[1](https://github.com/mozilla-mobile/fenix/pull/8098)||2020-09-01 | | private_browsing_mode.garbage_icon |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user pressed the garbage can icon on the private browsing home page, deleting all private tabs. |[1](https://github.com/mozilla-mobile/fenix/pull/4968)||2020-09-01 | | private_browsing_mode.notification_delete |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user pressed the private browsing mode notification's "Delete and Open" button. |[1](https://github.com/mozilla-mobile/fenix/pull/4968)||2020-09-01 | | private_browsing_mode.notification_open |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user pressed the private browsing mode notification's "Open" button. |[1](https://github.com/mozilla-mobile/fenix/pull/4968)||2020-09-01 |