From 13b7e64c9b43b2f6acac79666bb8fbfc456e2f01 Mon Sep 17 00:00:00 2001 From: Emily Kager Date: Mon, 15 Jul 2019 16:21:13 -0700 Subject: [PATCH] For #3134 - Add confirmation dialog to sign out of FxA (#3959) --- .../fenix/settings/AccountProblemFragment.kt | 10 +-- .../fenix/settings/AccountSettingsFragment.kt | 9 ++- .../mozilla/fenix/settings/SignOutFragment.kt | 74 +++++++++++++++++++ app/src/main/res/layout/fragment_sign_out.xml | 39 ++++++++++ app/src/main/res/navigation/nav_graph.xml | 36 ++++++--- 5 files changed, 147 insertions(+), 21 deletions(-) create mode 100644 app/src/main/java/org/mozilla/fenix/settings/SignOutFragment.kt create mode 100644 app/src/main/res/layout/fragment_sign_out.xml diff --git a/app/src/main/java/org/mozilla/fenix/settings/AccountProblemFragment.kt b/app/src/main/java/org/mozilla/fenix/settings/AccountProblemFragment.kt index 9f73d192a..d0fb059a2 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/AccountProblemFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/AccountProblemFragment.kt @@ -7,7 +7,6 @@ package org.mozilla.fenix.settings import android.os.Bundle import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.lifecycleScope -import androidx.navigation.Navigation import androidx.navigation.fragment.NavHostFragment import androidx.preference.Preference import androidx.preference.PreferenceFragmentCompat @@ -19,6 +18,7 @@ import org.mozilla.fenix.BrowserDirection import org.mozilla.fenix.HomeActivity import org.mozilla.fenix.R import org.mozilla.fenix.ext.getPreferenceKey +import org.mozilla.fenix.ext.nav import org.mozilla.fenix.ext.requireComponents class AccountProblemFragment : PreferenceFragmentCompat(), AccountObserver { @@ -67,10 +67,10 @@ class AccountProblemFragment : PreferenceFragmentCompat(), AccountObserver { private fun getClickListenerForSignOut(): Preference.OnPreferenceClickListener { return Preference.OnPreferenceClickListener { - lifecycleScope.launch { - requireComponents.backgroundServices.accountManager.logoutAsync().await() - } - Navigation.findNavController(view!!).popBackStack() + nav( + R.id.accountProblemFragment, + AccountProblemFragmentDirections.actionAccountProblemFragmentToSignOutFragment() + ) true } } diff --git a/app/src/main/java/org/mozilla/fenix/settings/AccountSettingsFragment.kt b/app/src/main/java/org/mozilla/fenix/settings/AccountSettingsFragment.kt index 2551b2299..c3dbe083d 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/AccountSettingsFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/AccountSettingsFragment.kt @@ -34,6 +34,7 @@ import org.mozilla.fenix.R import org.mozilla.fenix.components.FenixSnackbar import org.mozilla.fenix.components.metrics.Event import org.mozilla.fenix.ext.getPreferenceKey +import org.mozilla.fenix.ext.nav import org.mozilla.fenix.ext.requireComponents class AccountSettingsFragment : PreferenceFragmentCompat() { @@ -124,10 +125,10 @@ class AccountSettingsFragment : PreferenceFragmentCompat() { private fun getClickListenerForSignOut(): Preference.OnPreferenceClickListener { return Preference.OnPreferenceClickListener { - requireComponents.analytics.metrics.track(Event.SyncAccountSignOut) - lifecycleScope.launch { - accountManager.logoutAsync().await() - } + nav( + R.id.accountSettingsFragment, + AccountSettingsFragmentDirections.actionAccountSettingsFragmentToSignOutFragment() + ) true } } diff --git a/app/src/main/java/org/mozilla/fenix/settings/SignOutFragment.kt b/app/src/main/java/org/mozilla/fenix/settings/SignOutFragment.kt new file mode 100644 index 000000000..da6b5bf0e --- /dev/null +++ b/app/src/main/java/org/mozilla/fenix/settings/SignOutFragment.kt @@ -0,0 +1,74 @@ +/* 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.settings + +import android.app.Dialog +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.FrameLayout +import androidx.fragment.app.DialogFragment +import androidx.lifecycle.lifecycleScope +import androidx.navigation.fragment.findNavController +import com.google.android.material.bottomsheet.BottomSheetBehavior +import com.google.android.material.bottomsheet.BottomSheetDialogFragment +import kotlinx.android.synthetic.main.fragment_sign_out.view.* +import kotlinx.coroutines.launch +import mozilla.components.service.fxa.manager.FxaAccountManager +import org.mozilla.fenix.R +import org.mozilla.fenix.components.metrics.Event +import org.mozilla.fenix.ext.requireComponents + +class SignOutFragment : BottomSheetDialogFragment() { + private lateinit var accountManager: FxaAccountManager + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setStyle(DialogFragment.STYLE_NO_TITLE, R.style.FirefoxAccountsDialogStyle) + } + + override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { + val dialog = super.onCreateDialog(savedInstanceState) + + dialog.setOnShowListener { + val bottomSheet = dialog.findViewById( + com.google.android.material.R.id.design_bottom_sheet + ) as? FrameLayout + val behavior = BottomSheetBehavior.from(bottomSheet) + behavior.state = BottomSheetBehavior.STATE_EXPANDED + } + + return dialog + } + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + accountManager = requireComponents.backgroundServices.accountManager + return inflater.inflate(R.layout.fragment_sign_out, container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + view.sign_out_disconnect.setOnClickListener { + requireComponents.analytics.metrics.track(Event.SyncAccountSignOut) + lifecycleScope.launch { + accountManager.logoutAsync().await() + }.invokeOnCompletion { + if (!findNavController().popBackStack(R.id.settingsFragment, false)) { + dismiss() + } + } + } + + view.sign_out_cancel.setOnClickListener { + dismiss() + } + } +} diff --git a/app/src/main/res/layout/fragment_sign_out.xml b/app/src/main/res/layout/fragment_sign_out.xml new file mode 100644 index 000000000..27201206c --- /dev/null +++ b/app/src/main/res/layout/fragment_sign_out.xml @@ -0,0 +1,39 @@ + + + + + +