diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/HomeScreenRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/HomeScreenRobot.kt index f1e24be71..8540e2a0a 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/HomeScreenRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/HomeScreenRobot.kt @@ -553,11 +553,11 @@ private fun assertWelcomeHeader() = .check(matches(withEffectiveVisibility(Visibility.VISIBLE))) private fun assertGetTheMostHeader() = - onView(allOf(withText("Get the most out of Firefox Preview."))) + onView(allOf(withText("Start syncing bookmarks, passwords, and more with your Firefox account."))) .check(matches(withEffectiveVisibility(Visibility.VISIBLE))) private fun assertAccountsSignInButton() = - onView(ViewMatchers.withResourceName("turn_on_sync_button")) + onView(ViewMatchers.withResourceName("fxa_sign_in_button")) .check(matches(withEffectiveVisibility(Visibility.VISIBLE))) private fun assertGetToKnowHeader() = diff --git a/app/src/main/java/org/mozilla/fenix/addons/AddonsManagementFragment.kt b/app/src/main/java/org/mozilla/fenix/addons/AddonsManagementFragment.kt index e6bc5e57b..20c32bc3a 100644 --- a/app/src/main/java/org/mozilla/fenix/addons/AddonsManagementFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/addons/AddonsManagementFragment.kt @@ -120,7 +120,6 @@ class AddonsManagementFragment : Fragment(R.layout.fragment_add_ons_management) addonNameTextColor = ThemeManager.resolveAttribute(R.attr.primaryText, context), addonSummaryTextColor = ThemeManager.resolveAttribute(R.attr.secondaryText, context), sectionsTypeFace = ResourcesCompat.getFont(context, R.font.metropolis_semibold), - addonBackgroundIconColor = ThemeManager.resolveAttribute(R.attr.inset, requireContext()), addonAllowPrivateBrowsingLabelDrawableRes = R.drawable.ic_add_on_private_browsing_label ) } diff --git a/app/src/main/java/org/mozilla/fenix/components/toolbar/DefaultToolbarMenu.kt b/app/src/main/java/org/mozilla/fenix/components/toolbar/DefaultToolbarMenu.kt index 4ae5b3f59..ff549ffa2 100644 --- a/app/src/main/java/org/mozilla/fenix/components/toolbar/DefaultToolbarMenu.kt +++ b/app/src/main/java/org/mozilla/fenix/components/toolbar/DefaultToolbarMenu.kt @@ -24,6 +24,7 @@ import mozilla.components.browser.state.selector.findTab import mozilla.components.browser.state.store.BrowserStore import mozilla.components.concept.storage.BookmarksStorage import mozilla.components.support.ktx.android.content.getColorFromAttr +import org.mozilla.fenix.FeatureFlags import org.mozilla.fenix.HomeActivity import org.mozilla.fenix.R import org.mozilla.fenix.browser.browsingmode.BrowsingMode diff --git a/app/src/main/java/org/mozilla/fenix/ext/Context.kt b/app/src/main/java/org/mozilla/fenix/ext/Context.kt index 1e3d3b782..d10637026 100644 --- a/app/src/main/java/org/mozilla/fenix/ext/Context.kt +++ b/app/src/main/java/org/mozilla/fenix/ext/Context.kt @@ -6,6 +6,9 @@ package org.mozilla.fenix.ext import android.app.Activity import android.content.Context +import android.content.Intent +import android.os.Build +import android.provider.Settings import android.view.ContextThemeWrapper import android.view.View import android.view.ViewGroup @@ -89,3 +92,21 @@ fun Context.getStringWithArgSafe(@StringRes resId: Int, formatArg: String): Stri */ val Context.accessibilityManager: AccessibilityManager get() = getSystemService(Context.ACCESSIBILITY_SERVICE) as AccessibilityManager + +/** + * Used to navigate to system notifications settings for app + */ +fun Context.navigateToNotificationsSettings() { + val intent = Intent() + intent.let { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + it.action = Settings.ACTION_APP_NOTIFICATION_SETTINGS + it.putExtra(Settings.EXTRA_APP_PACKAGE, this.packageName) + } else { + it.action = "android.settings.APP_NOTIFICATION_SETTINGS" + it.putExtra("app_package", this.packageName) + it.putExtra("app_uid", this.applicationInfo.uid) + } + } + startActivity(intent) +} diff --git a/app/src/main/java/org/mozilla/fenix/home/HomeMenu.kt b/app/src/main/java/org/mozilla/fenix/home/HomeMenu.kt index 8036399ea..579e4bf95 100644 --- a/app/src/main/java/org/mozilla/fenix/home/HomeMenu.kt +++ b/app/src/main/java/org/mozilla/fenix/home/HomeMenu.kt @@ -21,6 +21,7 @@ import mozilla.components.concept.sync.AccountObserver import mozilla.components.concept.sync.AuthType import mozilla.components.concept.sync.OAuthAccount import mozilla.components.support.ktx.android.content.getColorFromAttr +import org.mozilla.fenix.FeatureFlags import org.mozilla.fenix.R import org.mozilla.fenix.ext.components import org.mozilla.fenix.ext.settings diff --git a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/onboarding/OnboardingAutomaticSignInViewHolder.kt b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/onboarding/OnboardingAutomaticSignInViewHolder.kt index 39c49a414..c09fb31d2 100644 --- a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/onboarding/OnboardingAutomaticSignInViewHolder.kt +++ b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/onboarding/OnboardingAutomaticSignInViewHolder.kt @@ -31,9 +31,9 @@ class OnboardingAutomaticSignInViewHolder( private val headerText = view.header_text init { - view.turn_on_sync_button.setOnClickListener { + view.fxa_sign_in_button.setOnClickListener { scope.launch { - onClick(it.turn_on_sync_button) + onClick(it.fxa_sign_in_button) } } } diff --git a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/onboarding/OnboardingManualSignInViewHolder.kt b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/onboarding/OnboardingManualSignInViewHolder.kt index e4fa6d5a3..f7b04965a 100644 --- a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/onboarding/OnboardingManualSignInViewHolder.kt +++ b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/onboarding/OnboardingManualSignInViewHolder.kt @@ -5,40 +5,40 @@ package org.mozilla.fenix.home.sessioncontrol.viewholders.onboarding import android.view.View -import androidx.core.content.ContextCompat import androidx.navigation.Navigation import androidx.recyclerview.widget.RecyclerView import kotlinx.android.synthetic.main.onboarding_manual_signin.view.* -import mozilla.components.support.ktx.android.content.getDrawableWithTint -import mozilla.components.support.ktx.android.view.putCompoundDrawablesRelativeWithIntrinsicBounds import org.mozilla.fenix.R import org.mozilla.fenix.components.metrics.Event +import org.mozilla.fenix.ext.addUnderline import org.mozilla.fenix.ext.components import org.mozilla.fenix.home.HomeFragmentDirections +import org.mozilla.fenix.onboarding.OnboardingController +import org.mozilla.fenix.onboarding.OnboardingInteractor class OnboardingManualSignInViewHolder(view: View) : RecyclerView.ViewHolder(view) { private val headerText = view.header_text init { - view.turn_on_sync_button.setOnClickListener { + val interactor = OnboardingInteractor(OnboardingController(itemView.context)) + + view.fxa_sign_in_button.setOnClickListener { it.context.components.analytics.metrics.track(Event.OnboardingManualSignIn) val directions = HomeFragmentDirections.actionGlobalTurnOnSync() Navigation.findNavController(view).navigate(directions) } + + view.learn_more.addUnderline() + view.learn_more.setOnClickListener { + interactor.onLearnMoreClicked() + } } fun bind() { val context = itemView.context - - val appName = context.getString(R.string.app_name) - headerText.text = context.getString(R.string.onboarding_firefox_account_header, appName) - val icon = context.getDrawableWithTint( - R.drawable.ic_onboarding_firefox_accounts, - ContextCompat.getColor(context, R.color.white_color) - ) - headerText.putCompoundDrawablesRelativeWithIntrinsicBounds(start = icon) + headerText.text = context.getString(R.string.onboarding_firefox_account_header) } companion object { diff --git a/app/src/main/java/org/mozilla/fenix/library/downloads/DownloadAdapter.kt b/app/src/main/java/org/mozilla/fenix/library/downloads/DownloadAdapter.kt index 95ce6f247..71fc6d0f4 100644 --- a/app/src/main/java/org/mozilla/fenix/library/downloads/DownloadAdapter.kt +++ b/app/src/main/java/org/mozilla/fenix/library/downloads/DownloadAdapter.kt @@ -1,4 +1,3 @@ - /* 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/. */ diff --git a/app/src/main/java/org/mozilla/fenix/library/downloads/DownloadController.kt b/app/src/main/java/org/mozilla/fenix/library/downloads/DownloadController.kt index 9cc676272..ccd30c136 100644 --- a/app/src/main/java/org/mozilla/fenix/library/downloads/DownloadController.kt +++ b/app/src/main/java/org/mozilla/fenix/library/downloads/DownloadController.kt @@ -1,4 +1,3 @@ - /* 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/. */ diff --git a/app/src/main/java/org/mozilla/fenix/library/downloads/DownloadFragmentStore.kt b/app/src/main/java/org/mozilla/fenix/library/downloads/DownloadFragmentStore.kt index 2078064a7..c79d45027 100644 --- a/app/src/main/java/org/mozilla/fenix/library/downloads/DownloadFragmentStore.kt +++ b/app/src/main/java/org/mozilla/fenix/library/downloads/DownloadFragmentStore.kt @@ -16,7 +16,13 @@ import mozilla.components.lib.state.Store * @property size The size in bytes of the download item * @property contentType The type of file the download is */ -data class DownloadItem(val id: Long, val fileName: String?, val filePath: String, val size: String, val contentType: String?) +data class DownloadItem( + val id: Long, + val fileName: String?, + val filePath: String, + val size: String, + val contentType: String? +) /** * The [Store] for holding the [DownloadFragmentState] and applying [DownloadFragmentAction]s. diff --git a/app/src/main/java/org/mozilla/fenix/library/downloads/DownloadInteractor.kt b/app/src/main/java/org/mozilla/fenix/library/downloads/DownloadInteractor.kt index 244444634..ea55bd2eb 100644 --- a/app/src/main/java/org/mozilla/fenix/library/downloads/DownloadInteractor.kt +++ b/app/src/main/java/org/mozilla/fenix/library/downloads/DownloadInteractor.kt @@ -15,13 +15,9 @@ class DownloadInteractor( downloadController.handleOpen(item) } - override fun select(item: DownloadItem) { - TODO("Not yet implemented") - } + override fun select(item: DownloadItem) { /* noop */ } - override fun deselect(item: DownloadItem) { - TODO("Not yet implemented") - } + override fun deselect(item: DownloadItem) { /* noop */ } override fun onBackPressed(): Boolean { return downloadController.handleBackPressed() diff --git a/app/src/main/java/org/mozilla/fenix/library/downloads/DownloadView.kt b/app/src/main/java/org/mozilla/fenix/library/downloads/DownloadView.kt index 3261ee91e..76989458d 100644 --- a/app/src/main/java/org/mozilla/fenix/library/downloads/DownloadView.kt +++ b/app/src/main/java/org/mozilla/fenix/library/downloads/DownloadView.kt @@ -1,5 +1,3 @@ - - /* 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/. */ @@ -9,8 +7,10 @@ package org.mozilla.fenix.library.downloads import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.core.view.isVisible import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.SimpleItemAnimator +import kotlinx.android.synthetic.main.component_downloads.* import kotlinx.android.synthetic.main.component_downloads.view.* import mozilla.components.support.base.feature.UserInteractionHandler import org.mozilla.fenix.R @@ -56,10 +56,11 @@ class DownloadView( fun update(state: DownloadFragmentState) { - view.swipe_refresh.isEnabled = - state.mode === DownloadFragmentState.Mode.Normal + view.swipe_refresh.isEnabled = false mode = state.mode + updateEmptyState(state.items.isNotEmpty()) + downloadAdapter.updateMode(state.mode) downloadAdapter.updateDownloads(state.items) @@ -68,6 +69,14 @@ class DownloadView( ) } + fun updateEmptyState(userHasDownloads: Boolean) { + download_list.isVisible = userHasDownloads + download_empty_view.isVisible = !userHasDownloads + if (!userHasDownloads) { + download_empty_view.announceForAccessibility(context.getString(R.string.download_empty_message)) + } + } + override fun onBackPressed(): Boolean { return interactor.onBackPressed() } diff --git a/app/src/main/java/org/mozilla/fenix/onboarding/OnboardingController.kt b/app/src/main/java/org/mozilla/fenix/onboarding/OnboardingController.kt new file mode 100644 index 000000000..3e1945103 --- /dev/null +++ b/app/src/main/java/org/mozilla/fenix/onboarding/OnboardingController.kt @@ -0,0 +1,22 @@ +/* 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.onboarding + +import android.content.Context +import org.mozilla.fenix.BrowserDirection +import org.mozilla.fenix.HomeActivity +import org.mozilla.fenix.settings.SupportUtils + +class OnboardingController( + private val context: Context +) { + fun handleLearnMoreClicked() { + (context as HomeActivity).openToBrowserAndLoad( + searchTermOrURL = SupportUtils.getFirefoxAccountSumoUrl(), + newTab = true, + from = BrowserDirection.FromHome + ) + } +} diff --git a/app/src/main/java/org/mozilla/fenix/onboarding/OnboardingInteractor.kt b/app/src/main/java/org/mozilla/fenix/onboarding/OnboardingInteractor.kt new file mode 100644 index 000000000..ad11d459c --- /dev/null +++ b/app/src/main/java/org/mozilla/fenix/onboarding/OnboardingInteractor.kt @@ -0,0 +1,14 @@ +/* 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.onboarding + +class OnboardingInteractor(private val onboardingController: OnboardingController) { + + /** + * Called when the user clicks the learn more link + * @param url the url the suggestion was providing + */ + fun onLearnMoreClicked() = onboardingController.handleLearnMoreClicked() +} diff --git a/app/src/main/java/org/mozilla/fenix/searchdialog/SearchDialogFragment.kt b/app/src/main/java/org/mozilla/fenix/searchdialog/SearchDialogFragment.kt index 9c869aa81..976e8bdc7 100644 --- a/app/src/main/java/org/mozilla/fenix/searchdialog/SearchDialogFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/searchdialog/SearchDialogFragment.kt @@ -5,10 +5,14 @@ package org.mozilla.fenix.searchdialog import android.app.Dialog +import android.content.DialogInterface +import android.graphics.Typeface import android.os.Bundle +import android.text.style.StyleSpan import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AppCompatDialogFragment import androidx.constraintlayout.widget.ConstraintProperties.BOTTOM import androidx.constraintlayout.widget.ConstraintProperties.PARENT_ID @@ -16,14 +20,26 @@ import androidx.constraintlayout.widget.ConstraintProperties.TOP import androidx.constraintlayout.widget.ConstraintSet import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.navArgs -import kotlinx.android.synthetic.main.fragment_search.view.* import kotlinx.android.synthetic.main.fragment_search_dialog.* +import kotlinx.android.synthetic.main.fragment_search_dialog.pill_wrapper +import kotlinx.android.synthetic.main.fragment_search_dialog.qr_scan_button +import kotlinx.android.synthetic.main.fragment_search_dialog.toolbar +import kotlinx.android.synthetic.main.fragment_search_dialog.view.* +import kotlinx.android.synthetic.main.fragment_search_dialog.view.search_engines_shortcut_button +import kotlinx.android.synthetic.main.fragment_search_dialog.view.qr_scan_button +import kotlinx.android.synthetic.main.fragment_search_dialog.view.toolbar import kotlinx.coroutines.ExperimentalCoroutinesApi +import mozilla.components.feature.qr.QrFeature import mozilla.components.lib.state.ext.consumeFrom import mozilla.components.support.base.feature.UserInteractionHandler +import mozilla.components.support.base.feature.ViewBoundFeatureWrapper +import mozilla.components.support.ktx.android.content.hasCamera +import mozilla.components.support.ktx.android.content.res.getSpanned import mozilla.components.support.ktx.android.view.hideKeyboard +import org.mozilla.fenix.BrowserDirection import org.mozilla.fenix.HomeActivity import org.mozilla.fenix.R +import org.mozilla.fenix.components.metrics.Event import org.mozilla.fenix.components.toolbar.ToolbarPosition import org.mozilla.fenix.ext.requireComponents import org.mozilla.fenix.ext.settings @@ -42,6 +58,9 @@ class SearchDialogFragment : AppCompatDialogFragment(), UserInteractionHandler { private lateinit var store: SearchDialogFragmentStore private lateinit var toolbarView: ToolbarView private lateinit var awesomeBarView: AwesomeBarView + private var firstUpdate = true + + private val qrFeature = ViewBoundFeatureWrapper() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -101,7 +120,7 @@ class SearchDialogFragment : AppCompatDialogFragment(), UserInteractionHandler { awesomeBarView = AwesomeBarView( requireContext(), interactor, - view.awesomeBar + view.awesome_bar ) return view @@ -111,6 +130,101 @@ class SearchDialogFragment : AppCompatDialogFragment(), UserInteractionHandler { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) + setupConstraints(view) + + search_wrapper.setOnClickListener { + it.hideKeyboard() + dismissAllowingStateLoss() + } + + view.search_engines_shortcut_button.setOnClickListener { + interactor.onSearchShortcutsButtonClicked() + } + + qr_scan_button.visibility = if (context?.hasCamera() == true) View.VISIBLE else View.GONE + + qr_scan_button.setOnClickListener { + if (!requireContext().hasCamera()) { return@setOnClickListener } + + toolbarView.view.clearFocus() + requireComponents.analytics.metrics.track(Event.QRScannerOpened) + qrFeature.get()?.scan(R.id.search_wrapper) + } + + qrFeature.set( + createQrFeature(), + owner = this, + view = view + ) + + consumeFrom(store) { + val shouldShowAwesomebar = + !firstUpdate && + it.query.isNotBlank() || + it.showSearchShortcuts + + awesome_bar?.visibility = if (shouldShowAwesomebar) View.VISIBLE else View.INVISIBLE + toolbarView.update(it) + awesomeBarView.update(it) + firstUpdate = false + } + } + + override fun onBackPressed(): Boolean { + return when { + qrFeature.onBackPressed() -> { + toolbarView.view.edit.focus() + view?.qr_scan_button?.isChecked = false + toolbarView.view.requestFocus() + true + } + else -> { + view?.hideKeyboard() + dismissAllowingStateLoss() + true + } + } + } + + private fun createQrFeature(): QrFeature { + return QrFeature( + requireContext(), + fragmentManager = childFragmentManager, + onNeedToRequestPermissions = { permissions -> + requestPermissions(permissions, REQUEST_CODE_CAMERA_PERMISSIONS) + }, + onScanResult = { result -> + qr_scan_button.isChecked = false + activity?.let { + AlertDialog.Builder(it).apply { + val spannable = resources.getSpanned( + R.string.qr_scanner_confirmation_dialog_message, + getString(R.string.app_name) to StyleSpan(Typeface.BOLD), + result to StyleSpan(Typeface.ITALIC) + ) + setMessage(spannable) + setNegativeButton(R.string.qr_scanner_dialog_negative) { dialog: DialogInterface, _ -> + requireComponents.analytics.metrics.track(Event.QRScannerNavigationDenied) + dialog.cancel() + } + setPositiveButton(R.string.qr_scanner_dialog_positive) { dialog: DialogInterface, _ -> + requireComponents.analytics.metrics.track(Event.QRScannerNavigationAllowed) + (activity as HomeActivity) + .openToBrowserAndLoad( + searchTermOrURL = result, + newTab = store.state.tabId == null, + from = BrowserDirection.FromSearch + ) + dialog.dismiss() + } + create() + }.show() + requireComponents.analytics.metrics.track(Event.QRScannerPromptDisplayed) + } + }) + } + + private fun setupConstraints(view: View) { if (view.context.settings().toolbarPosition == ToolbarPosition.BOTTOM) { ConstraintSet().apply { clone(search_wrapper) @@ -118,31 +232,17 @@ class SearchDialogFragment : AppCompatDialogFragment(), UserInteractionHandler { clear(toolbar.id, TOP) connect(toolbar.id, BOTTOM, PARENT_ID, BOTTOM) - clear(awesomeBar.id, TOP) - clear(awesomeBar.id, BOTTOM) - connect(awesomeBar.id, TOP, PARENT_ID, TOP) - connect(awesomeBar.id, BOTTOM, toolbar.id, TOP) + clear(awesome_bar.id, TOP) + clear(pill_wrapper.id, BOTTOM) + connect(awesome_bar.id, TOP, PARENT_ID, TOP) + connect(pill_wrapper.id, BOTTOM, toolbar.id, TOP) applyTo(search_wrapper) } } - - search_wrapper.setOnClickListener { - it.hideKeyboard() - dismissAllowingStateLoss() - } - - consumeFrom(store) { - awesomeBar?.visibility = if (it.query.isEmpty()) View.INVISIBLE else View.VISIBLE - toolbarView.update(it) - awesomeBarView.update(it) - } } - override fun onBackPressed(): Boolean { - view?.hideKeyboard() - dismissAllowingStateLoss() - - return true + companion object { + private const val REQUEST_CODE_CAMERA_PERMISSIONS = 1 } } diff --git a/app/src/main/java/org/mozilla/fenix/settings/SettingsFragment.kt b/app/src/main/java/org/mozilla/fenix/settings/SettingsFragment.kt index 38dc05b83..4c64a967d 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/SettingsFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/SettingsFragment.kt @@ -36,6 +36,7 @@ import org.mozilla.fenix.ext.application import org.mozilla.fenix.ext.components import org.mozilla.fenix.ext.getPreferenceKey import org.mozilla.fenix.ext.metrics +import org.mozilla.fenix.ext.navigateToNotificationsSettings import org.mozilla.fenix.ext.requireComponents import org.mozilla.fenix.ext.settings import org.mozilla.fenix.ext.showToolbar @@ -271,10 +272,7 @@ class SettingsFragment : PreferenceFragmentCompat() { SettingsFragmentDirections.actionSettingsFragmentToDeleteBrowsingDataOnQuitFragment() } resources.getString(R.string.pref_key_notifications) -> { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - val intent = Intent(Settings.ACTION_APP_NOTIFICATION_SETTINGS) - startActivity(intent) - } + context?.navigateToNotificationsSettings() null } resources.getString(R.string.pref_key_customize) -> { @@ -359,10 +357,6 @@ class SettingsFragment : PreferenceFragmentCompat() { findPreference( getPreferenceKey(R.string.pref_key_debug_settings) )?.isVisible = requireContext().settings().showSecretDebugMenuThisSession - - findPreference( - getPreferenceKey(R.string.pref_key_notifications) - )?.isVisible = requireContext().settings().showNotificationsSetting } private fun getClickListenerForMakeDefaultBrowser(): Preference.OnPreferenceClickListener { 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 a1a613cc1..3e1bae04a 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/SupportUtils.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/SupportUtils.kt @@ -74,6 +74,10 @@ object SupportUtils { return "https://support.mozilla.org/$langTag/kb/$escapedTopic" } + fun getFirefoxAccountSumoUrl(): String { + return "https://support.mozilla.org/kb/access-mozilla-services-firefox-account" + } + fun getMozillaPageUrl(page: MozillaPage, locale: Locale = Locale.getDefault()): String { val path = page.path val langTag = getLanguageTag(locale) diff --git a/app/src/main/res/drawable/ic_onboarding_avatar_anonymous_large.xml b/app/src/main/res/drawable/ic_onboarding_avatar_anonymous_large.xml new file mode 100644 index 000000000..422897fd9 --- /dev/null +++ b/app/src/main/res/drawable/ic_onboarding_avatar_anonymous_large.xml @@ -0,0 +1,16 @@ + + + + + + diff --git a/app/src/main/res/layout/fragment_search_dialog.xml b/app/src/main/res/layout/fragment_search_dialog.xml index 4a2abe039..712e22b1a 100644 --- a/app/src/main/res/layout/fragment_search_dialog.xml +++ b/app/src/main/res/layout/fragment_search_dialog.xml @@ -30,7 +30,7 @@ app:layout_constraintTop_toTopOf="parent"/> + + + + + + diff --git a/app/src/main/res/layout/onboarding_automatic_signin.xml b/app/src/main/res/layout/onboarding_automatic_signin.xml index d96855dcc..2b88fd85d 100644 --- a/app/src/main/res/layout/onboarding_automatic_signin.xml +++ b/app/src/main/res/layout/onboarding_automatic_signin.xml @@ -22,7 +22,7 @@ tools:text="@string/onboarding_firefox_account_auto_signin_header_2" />