From 8123647d85280c63678e84718df8ae515e9a7055 Mon Sep 17 00:00:00 2001 From: Mugurell Date: Wed, 5 Aug 2020 17:28:38 +0300 Subject: [PATCH] [fenix] For https://github.com/mozilla-mobile/fenix/issues/13037 - Use email to sign in to fxa if device has no camera App can be installed on devices with no camera modules. Like Android TV boxes. Will skip presenting the option to sign in by scanning a qr code in this case and default to login with email and password. --- .../settings/account/TurnOnSyncFragment.kt | 47 +++++++++++++++---- 1 file changed, 37 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/org/mozilla/fenix/settings/account/TurnOnSyncFragment.kt b/app/src/main/java/org/mozilla/fenix/settings/account/TurnOnSyncFragment.kt index ceedd23091..acfa74c2a7 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/account/TurnOnSyncFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/account/TurnOnSyncFragment.kt @@ -17,6 +17,7 @@ import kotlinx.android.synthetic.main.fragment_turn_on_sync.view.* 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.hasCamera import org.mozilla.fenix.R import org.mozilla.fenix.components.FenixSnackbar import org.mozilla.fenix.components.metrics.Event @@ -26,15 +27,11 @@ import org.mozilla.fenix.ext.showToolbar class TurnOnSyncFragment : Fragment(), AccountObserver { private val args by navArgs() + private var shouldLoginJustWithEmail = false + private var pairWithEmailStarted = false private val signInClickListener = View.OnClickListener { - requireComponents.services.accountsAuthFeature.beginAuthentication(requireContext()) - requireComponents.analytics.metrics.track(Event.SyncAuthUseEmail) - // TODO The sign-in web content populates session history, - // so pressing "back" after signing in won't take us back into the settings screen, but rather up the - // session history stack. - // We could auto-close this tab once we get to the end of the authentication process? - // Via an interceptor, perhaps. + navigateToPairWithEmail() } private val paringClickListener = View.OnClickListener { @@ -46,6 +43,14 @@ class TurnOnSyncFragment : Fragment(), AccountObserver { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) requireComponents.analytics.metrics.track(Event.SyncAuthOpened) + + // App can be installed on devices with no camera modules. Like Android TV boxes. + // Let's skip presenting the option to sign in by scanning a qr code in this case + // and default to login with email and password. + shouldLoginJustWithEmail = !requireContext().hasCamera() + if (shouldLoginJustWithEmail) { + navigateToPairWithEmail() + } } override fun onDestroy() { @@ -55,16 +60,28 @@ class TurnOnSyncFragment : Fragment(), AccountObserver { override fun onResume() { super.onResume() - if (requireComponents.backgroundServices.accountManager.authenticatedAccount() != null) { + if (pairWithEmailStarted || + requireComponents.backgroundServices.accountManager.authenticatedAccount() != null) { + findNavController().popBackStack() return } - requireComponents.backgroundServices.accountManager.register(this, owner = this) - showToolbar(getString(R.string.preferences_sync)) + if (shouldLoginJustWithEmail) { + // Next time onResume is called, after returning from pairing with email this Fragment will be popped. + pairWithEmailStarted = true + } else { + requireComponents.backgroundServices.accountManager.register(this, owner = this) + showToolbar(getString(R.string.preferences_sync)) + } } override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + if (shouldLoginJustWithEmail) { + // Headless fragment. Don't need UI if we're taking the user to another screen. + return null + } + val view = inflater.inflate(R.layout.fragment_turn_on_sync, container, false) view.signInScanButton.setOnClickListener(paringClickListener) view.signInEmailButton.setOnClickListener(signInClickListener) @@ -99,4 +116,14 @@ class TurnOnSyncFragment : Fragment(), AccountObserver { .show() } } + + private fun navigateToPairWithEmail() { + requireComponents.services.accountsAuthFeature.beginAuthentication(requireContext()) + requireComponents.analytics.metrics.track(Event.SyncAuthUseEmail) + // TODO The sign-in web content populates session history, + // so pressing "back" after signing in won't take us back into the settings screen, but rather up the + // session history stack. + // We could auto-close this tab once we get to the end of the authentication process? + // Via an interceptor, perhaps. + } }