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 98f6e4dd4..00386a5d3 100644 --- a/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt @@ -55,6 +55,7 @@ import org.mozilla.fenix.home.sessioncontrol.SessionControlViewModel import org.mozilla.fenix.home.sessioncontrol.Tab import org.mozilla.fenix.home.sessioncontrol.TabAction import org.mozilla.fenix.home.sessioncontrol.TabCollection +import org.mozilla.fenix.home.sessioncontrol.OnboardingState import org.mozilla.fenix.lib.Do import org.mozilla.fenix.mvi.ActionBusFactory import org.mozilla.fenix.mvi.getAutoDisposeObservable @@ -638,7 +639,13 @@ class HomeFragment : Fragment(), CoroutineScope { } private fun currentMode(): Mode = if (!onboarding.userHasBeenOnboarded()) { - Mode.Onboarding + // TODO monitor account state changes somewhere in this class via AccountObserver + `accountManager.register()`. + val account = requireComponents.backgroundServices.accountManager.authenticatedAccount() + if (account == null) { + Mode.Onboarding(OnboardingState.SignedOut) + } else { + Mode.Onboarding(OnboardingState.ManuallySignedIn) + } } else if ((activity as HomeActivity).browsingModeManager.isPrivate) { Mode.Private } else { diff --git a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlComponent.kt b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlComponent.kt index e057d9873..02a56d72c 100644 --- a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlComponent.kt +++ b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlComponent.kt @@ -64,10 +64,23 @@ fun List.toSessionBundle(context: Context): MutableList { return sessionBundle } + +/** + * Describes various onboarding states. + */ +enum class OnboardingState { + // signed out, no account carried over from Fennec. + SignedOut, + // auto-signed in, via a Fennec account. + AutoSignedIn, + // manually signed in while in onboarding. + ManuallySignedIn +} + sealed class Mode { object Normal : Mode() object Private : Mode() - object Onboarding : Mode() + data class Onboarding(val state: OnboardingState) : Mode() } data class SessionControlState( diff --git a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlUIView.kt b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlUIView.kt index aef7f84c4..8b2b0bf13 100644 --- a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlUIView.kt +++ b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlUIView.kt @@ -61,25 +61,51 @@ private fun privateModeAdapterItems(tabs: List): List { return items } -private fun onboardingAdapterItems(): List = listOf( - AdapterItem.OnboardingHeader, - AdapterItem.OnboardingSectionHeader() { it.getString(R.string.onboarding_fxa_section_header) }, - AdapterItem.OnboardingFirefoxAccount, - AdapterItem.OnboardingSectionHeader() { - val appName = it.getString(R.string.app_name) - it.getString(R.string.onboarding_feature_section_header, appName) - }, - AdapterItem.OnboardingThemePicker, - AdapterItem.OnboardingTrackingProtection, - AdapterItem.OnboardingPrivateBrowsing, - AdapterItem.OnboardingPrivacyNotice, - AdapterItem.OnboardingFinish -) +private fun onboardingAdapterItems(onboardingState: OnboardingState): List { + val items: MutableList = mutableListOf(AdapterItem.OnboardingHeader) + + // TODO customize the UI based on different account states. + // Customize FxA items based on where we are with the account state: + items.addAll(when (onboardingState) { + OnboardingState.SignedOut -> { + listOf( + AdapterItem.OnboardingSectionHeader { it.getString(R.string.onboarding_fxa_section_header) }, + AdapterItem.OnboardingFirefoxAccount + ) + } + OnboardingState.AutoSignedIn -> { + listOf( + AdapterItem.OnboardingSectionHeader { it.getString(R.string.onboarding_fxa_section_header) }, + AdapterItem.OnboardingFirefoxAccount + ) + } + OnboardingState.ManuallySignedIn -> { + listOf( + AdapterItem.OnboardingSectionHeader { it.getString(R.string.onboarding_fxa_section_header) }, + AdapterItem.OnboardingFirefoxAccount + ) + } + }) + + items.addAll(listOf( + AdapterItem.OnboardingSectionHeader { + val appName = it.getString(R.string.app_name) + it.getString(R.string.onboarding_feature_section_header, appName) + }, + AdapterItem.OnboardingThemePicker, + AdapterItem.OnboardingTrackingProtection, + AdapterItem.OnboardingPrivateBrowsing, + AdapterItem.OnboardingPrivacyNotice, + AdapterItem.OnboardingFinish + )) + + return items +} private fun SessionControlState.toAdapterList(): List = when (mode) { is Mode.Normal -> normalModeAdapterItems(tabs, collections, expandedCollections) is Mode.Private -> privateModeAdapterItems(tabs) - is Mode.Onboarding -> onboardingAdapterItems() + is Mode.Onboarding -> onboardingAdapterItems(mode.state) } private fun collectionTabItems(collection: TabCollection) = collection.tabs.mapIndexed { index, tab ->