|
|
|
/* 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.home
|
|
|
|
|
|
|
|
import android.content.Context
|
|
|
|
import mozilla.components.concept.sync.AccountObserver
|
|
|
|
import mozilla.components.concept.sync.AuthType
|
|
|
|
import mozilla.components.concept.sync.OAuthAccount
|
|
|
|
import mozilla.components.concept.sync.Profile
|
|
|
|
import mozilla.components.service.fxa.sharing.ShareableAccount
|
|
|
|
import org.mozilla.fenix.browser.browsingmode.BrowsingMode
|
|
|
|
import org.mozilla.fenix.browser.browsingmode.BrowsingModeManager
|
|
|
|
import org.mozilla.fenix.ext.components
|
|
|
|
import org.mozilla.fenix.onboarding.FenixOnboarding
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Describes various states of the home fragment UI.
|
|
|
|
*/
|
|
|
|
sealed class Mode {
|
|
|
|
object Normal : Mode()
|
|
|
|
object Private : Mode()
|
|
|
|
data class Onboarding(val state: OnboardingState) : Mode()
|
|
|
|
|
|
|
|
companion object {
|
|
|
|
fun fromBrowsingMode(browsingMode: BrowsingMode) = when (browsingMode) {
|
|
|
|
BrowsingMode.Normal -> Normal
|
|
|
|
BrowsingMode.Private -> Private
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Describes various onboarding states.
|
|
|
|
*/
|
|
|
|
sealed class OnboardingState {
|
|
|
|
// Signed out, without an option to auto-login using a shared FxA account.
|
|
|
|
object SignedOutNoAutoSignIn : OnboardingState()
|
|
|
|
// Signed out, with an option to auto-login into a shared FxA account.
|
|
|
|
data class SignedOutCanAutoSignIn(val withAccount: ShareableAccount) : OnboardingState()
|
|
|
|
// Signed in.
|
|
|
|
object SignedIn : OnboardingState()
|
|
|
|
}
|
|
|
|
|
|
|
|
class CurrentMode(
|
|
|
|
private val context: Context,
|
|
|
|
private val onboarding: FenixOnboarding,
|
|
|
|
private val browsingModeManager: BrowsingModeManager,
|
|
|
|
private val dispatchModeChanges: (mode: Mode) -> Unit
|
|
|
|
) : AccountObserver {
|
|
|
|
|
|
|
|
private val accountManager by lazy { context.components.backgroundServices.accountManager }
|
|
|
|
|
|
|
|
fun getCurrentMode() = if (onboarding.userHasBeenOnboarded()) {
|
|
|
|
Mode.fromBrowsingMode(browsingModeManager.mode)
|
|
|
|
} else {
|
|
|
|
val account = accountManager.authenticatedAccount()
|
|
|
|
if (account != null) {
|
|
|
|
Mode.Onboarding(OnboardingState.SignedIn)
|
|
|
|
} else {
|
|
|
|
Mode.Onboarding(OnboardingState.SignedOutNoAutoSignIn)
|
|
|
|
// The following other state is effectively disabled - #6521
|
|
|
|
// Code still exists in app for when it will be used again - #15694
|
|
|
|
// Mode.Onboarding(OnboardingState.SignedOutCanAutoSignIn(accountManager.shareableAccounts(context)[0]))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
fun emitModeChanges() {
|
|
|
|
dispatchModeChanges(getCurrentMode())
|
|
|
|
}
|
|
|
|
|
|
|
|
override fun onAuthenticated(account: OAuthAccount, authType: AuthType) = emitModeChanges()
|
|
|
|
override fun onAuthenticationProblems() = emitModeChanges()
|
|
|
|
override fun onLoggedOut() = emitModeChanges()
|
|
|
|
override fun onProfileUpdated(profile: Profile) = emitModeChanges()
|
|
|
|
}
|