From f94c13df3562f9fa4d440b48f679dbaa7f57dbb3 Mon Sep 17 00:00:00 2001 From: Sawyer Blatz Date: Fri, 22 May 2020 16:06:48 -0700 Subject: [PATCH 1/2] For #9488: Add search widget CFR --- .../org/mozilla/fenix/cfr/SearchWidgetCFR.kt | 90 ++++++++++++++++ .../fenix/components/SearchWidgetCreator.kt | 33 ++++++ .../org/mozilla/fenix/home/HomeFragment.kt | 10 ++ .../mozilla/fenix/search/SearchController.kt | 4 + .../java/org/mozilla/fenix/utils/Settings.kt | 57 ++++++++++ .../search_widget_illustration.png | Bin 0 -> 23276 bytes app/src/main/res/layout/search_widget_cfr.xml | 100 ++++++++++++++++++ app/src/main/res/values/preference_keys.xml | 6 ++ app/src/main/res/values/strings.xml | 10 +- 9 files changed, 309 insertions(+), 1 deletion(-) create mode 100644 app/src/main/java/org/mozilla/fenix/cfr/SearchWidgetCFR.kt create mode 100644 app/src/main/java/org/mozilla/fenix/components/SearchWidgetCreator.kt create mode 100644 app/src/main/res/drawable-xhdpi/search_widget_illustration.png create mode 100644 app/src/main/res/layout/search_widget_cfr.xml diff --git a/app/src/main/java/org/mozilla/fenix/cfr/SearchWidgetCFR.kt b/app/src/main/java/org/mozilla/fenix/cfr/SearchWidgetCFR.kt new file mode 100644 index 000000000000..884e7c11fafa --- /dev/null +++ b/app/src/main/java/org/mozilla/fenix/cfr/SearchWidgetCFR.kt @@ -0,0 +1,90 @@ +/* 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.cfr + +import android.app.Dialog +import android.content.Context +import android.graphics.Color +import android.graphics.drawable.ColorDrawable +import android.view.Gravity +import android.view.LayoutInflater +import android.view.View +import androidx.core.view.isGone +import androidx.core.view.isVisible +import androidx.core.view.marginTop +import kotlinx.android.synthetic.main.search_widget_cfr.view.* +import kotlinx.android.synthetic.main.tracking_protection_onboarding_popup.view.drop_down_triangle +import kotlinx.android.synthetic.main.tracking_protection_onboarding_popup.view.pop_up_triangle +import org.mozilla.fenix.R +import org.mozilla.fenix.components.SearchWidgetCreator +import org.mozilla.fenix.ext.settings +import org.mozilla.fenix.utils.Settings + +/** + * Displays a CFR above the HomeFragment toolbar that recommends usage / installation of the search widget. + */ +class SearchWidgetCFR( + private val context: Context, + private val getToolbar: () -> View +) { + + // TODO: Based on pref && is in the bucket...? + fun displayIfNecessary() { + if (!context.settings().shouldDisplaySearchWidgetCFR()) { return } + showSearchWidgetCFR() + } + + @Suppress("MagicNumber", "InflateParams") + private fun showSearchWidgetCFR() { + context.settings().incrementSearchWidgetCFRDisplayed() + + val searchWidgetCFRDialog = Dialog(context) + val layout = LayoutInflater.from(context) + .inflate(R.layout.search_widget_cfr, null) + val isBottomToolbar = Settings.getInstance(context).shouldUseBottomToolbar + + layout.drop_down_triangle.isGone = isBottomToolbar + layout.pop_up_triangle.isVisible = isBottomToolbar + + val toolbar = getToolbar() + + val gravity = if (isBottomToolbar) { + Gravity.CENTER_HORIZONTAL or Gravity.BOTTOM + } else { + Gravity.CENTER_HORIZONTAL or Gravity.TOP + } + + layout.cfr_neg_button.setOnClickListener { + searchWidgetCFRDialog.dismiss() + context.settings().manuallyDismissSearchWidgetCFR() + } + + layout.cfr_pos_button.setOnClickListener { + //context.components.analytics.metrics.track(Event.) + SearchWidgetCreator.createSearchWidget(context) + searchWidgetCFRDialog.dismiss() + //context.settings().manuallyDismissSearchWidgetCFR() + } + + searchWidgetCFRDialog.apply { + setContentView(layout) + } + + searchWidgetCFRDialog.window?.let { + it.setGravity(gravity) + val attr = it.attributes + attr.y = + (toolbar.y + toolbar.height - toolbar.marginTop - toolbar.paddingTop).toInt() + it.attributes = attr + it.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) + } + + searchWidgetCFRDialog.setOnDismissListener { + context.settings().incrementSearchWidgetCFRDismissed() + } + + searchWidgetCFRDialog.show() + } +} diff --git a/app/src/main/java/org/mozilla/fenix/components/SearchWidgetCreator.kt b/app/src/main/java/org/mozilla/fenix/components/SearchWidgetCreator.kt new file mode 100644 index 000000000000..f16cc4eef29a --- /dev/null +++ b/app/src/main/java/org/mozilla/fenix/components/SearchWidgetCreator.kt @@ -0,0 +1,33 @@ +/* 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.components + +import android.annotation.TargetApi +import android.appwidget.AppWidgetManager +import android.content.ComponentName +import android.content.Context +import android.os.Build +import org.mozilla.gecko.search.SearchWidgetProvider + +/** + * Handles the creation of search widget. + */ +object SearchWidgetCreator { + + /** + * Attempts to display a prompt requesting the user pin the search widget + * Returns true if the prompt is displayed successfully, and false otherwise. + */ + @TargetApi(Build.VERSION_CODES.O) + fun createSearchWidget(context: Context): Boolean { + val appWidgetManager: AppWidgetManager = context.getSystemService(AppWidgetManager::class.java) + if (!appWidgetManager.isRequestPinAppWidgetSupported) { return false } + + val myProvider = ComponentName(context, SearchWidgetProvider::class.java) + appWidgetManager.requestPinAppWidget(myProvider, null, null) + + return true + } +} 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 8d3f9461c020..ccaf1c4b4dd5 100644 --- a/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt @@ -26,6 +26,7 @@ import androidx.constraintlayout.widget.ConstraintSet.PARENT_ID import androidx.constraintlayout.widget.ConstraintSet.TOP import androidx.coordinatorlayout.widget.CoordinatorLayout import androidx.core.content.ContextCompat +import androidx.core.view.doOnLayout import androidx.core.view.isVisible import androidx.core.view.updateLayoutParams import androidx.fragment.app.Fragment @@ -78,6 +79,7 @@ import org.mozilla.fenix.addons.runIfFragmentIsAttached import org.mozilla.fenix.browser.BrowserAnimator.Companion.getToolbarNavOptions import org.mozilla.fenix.browser.browsingmode.BrowsingMode import org.mozilla.fenix.collections.SaveCollectionStep +import org.mozilla.fenix.cfr.SearchWidgetCFR import org.mozilla.fenix.components.FenixSnackbar import org.mozilla.fenix.components.PrivateShortcutCreateManager import org.mozilla.fenix.components.StoreProvider @@ -380,6 +382,14 @@ class HomeFragment : Fragment() { ) } } + + // We call this onLayout so that the bottom bar width is correctly set for us to center + // the CFR in. + view.toolbar_wrapper.doOnLayout { + if (!browsingModeManager.mode.isPrivate) { + SearchWidgetCFR(view.context) { view.toolbar_wrapper }.displayIfNecessary() + } + } } override fun onDestroyView() { diff --git a/app/src/main/java/org/mozilla/fenix/search/SearchController.kt b/app/src/main/java/org/mozilla/fenix/search/SearchController.kt index c69515c53a98..cbe131f1c8d7 100644 --- a/app/src/main/java/org/mozilla/fenix/search/SearchController.kt +++ b/app/src/main/java/org/mozilla/fenix/search/SearchController.kt @@ -81,6 +81,8 @@ class DefaultSearchController( val event = if (url.isUrl()) { Event.EnteredUrl(false) } else { + context.settings().incrementActiveSearchCount() + val searchAccessPoint = when (store.state.searchAccessPoint) { NONE -> ACTION else -> store.state.searchAccessPoint @@ -142,6 +144,8 @@ class DefaultSearchController( } override fun handleSearchTermsTapped(searchTerms: String) { + context.settings().incrementActiveSearchCount() + activity.openToBrowserAndLoad( searchTermOrURL = searchTerms, newTab = store.state.session == null, 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 f63b874c0767..342e15e5eb23 100644 --- a/app/src/main/java/org/mozilla/fenix/utils/Settings.kt +++ b/app/src/main/java/org/mozilla/fenix/utils/Settings.kt @@ -149,6 +149,63 @@ class Settings private constructor( preferences.getBoolean(appContext.getString(R.string.pref_key_migrating_from_firefox_nightly_tip), true) && preferences.getBoolean(appContext.getString(R.string.pref_key_migrating_from_fenix_tip), true) + private val activeSearchCount by intPreference( + appContext.getPreferenceKey(R.string.pref_key_search_count), + default = 0 + ) + + fun incrementActiveSearchCount() { + preferences.edit().putInt( + appContext.getPreferenceKey(R.string.pref_key_search_count), + activeSearchCount + 1 + ).apply() + } + + private val isActiveSearcher: Boolean + get() = activeSearchCount > 2 + + fun shouldDisplaySearchWidgetCFR(): Boolean = + isActiveSearcher && + searchWidgetCFRDismissCount < 3 && + !searchWidgetInstalled && + !searchWidgetCFRManuallyDismissed + + private val searchWidgetCFRDisplayCount by intPreference( + appContext.getPreferenceKey(R.string.pref_key_search_widget_cfr_display_count), + default = 0 + ) + + fun incrementSearchWidgetCFRDisplayed() { + preferences.edit().putInt( + appContext.getPreferenceKey(R.string.pref_key_search_widget_cfr_display_count), + searchWidgetCFRDisplayCount + 1 + ).apply() + } + + private val searchWidgetCFRManuallyDismissed by booleanPreference( + appContext.getPreferenceKey(R.string.pref_key_search_widget_cfr_manually_dismissed), + default = false + ) + + fun manuallyDismissSearchWidgetCFR() { + preferences.edit().putBoolean( + appContext.getPreferenceKey(R.string.pref_key_search_widget_cfr_manually_dismissed), + true + ).apply() + } + + private val searchWidgetCFRDismissCount by intPreference( + appContext.getPreferenceKey(R.string.pref_key_search_widget_cfr_dismiss_count), + default = 0 + ) + + fun incrementSearchWidgetCFRDismissed() { + preferences.edit().putInt( + appContext.getPreferenceKey(R.string.pref_key_search_widget_cfr_dismiss_count), + searchWidgetCFRDismissCount + 1 + ).apply() + } + var defaultSearchEngineName by stringPreference( appContext.getPreferenceKey(R.string.pref_key_search_engine), default = "" diff --git a/app/src/main/res/drawable-xhdpi/search_widget_illustration.png b/app/src/main/res/drawable-xhdpi/search_widget_illustration.png new file mode 100644 index 0000000000000000000000000000000000000000..dc6539813c9afdba638ef3b44e01af4c0042f227 GIT binary patch literal 23276 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 z + + + + + + + + + + + + +