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 00386a5d3..a03672ea0 100644 --- a/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt @@ -26,6 +26,9 @@ import kotlinx.coroutines.runBlocking import mozilla.components.browser.menu.BrowserMenu import mozilla.components.browser.session.Session import mozilla.components.browser.session.SessionManager +import mozilla.components.concept.sync.AccountObserver +import mozilla.components.concept.sync.OAuthAccount +import mozilla.components.concept.sync.Profile import org.jetbrains.anko.constraint.layout.ConstraintSetBuilder.Side.BOTTOM import org.jetbrains.anko.constraint.layout.ConstraintSetBuilder.Side.END import org.jetbrains.anko.constraint.layout.ConstraintSetBuilder.Side.START @@ -67,7 +70,7 @@ import kotlin.coroutines.CoroutineContext import kotlin.math.roundToInt @SuppressWarnings("TooManyFunctions", "LargeClass") -class HomeFragment : Fragment(), CoroutineScope { +class HomeFragment : Fragment(), CoroutineScope, AccountObserver { private val bus = ActionBusFactory.get(this) private var sessionObserver: SessionManager.Observer? = null private var tabCollectionObserver: Observer>? = null @@ -209,6 +212,8 @@ class HomeFragment : Fragment(), CoroutineScope { homeLayout?.progress = if (homeViewModel?.motionLayoutProgress ?: 0F > MOTION_LAYOUT_PROGRESS_ROUND_POINT) 1.0f else 0f (activity as AppCompatActivity).supportActionBar?.hide() + + requireComponents.backgroundServices.accountManager.register(this, owner = this) } @SuppressWarnings("ComplexMethod") @@ -613,6 +618,11 @@ class HomeFragment : Fragment(), CoroutineScope { ) } + private fun emitAccountChanges() { + val mode = currentMode() + getManagedEmitter().onNext(SessionControlChange.ModeChange(mode)) + } + private fun showCollectionCreationFragment( selectedTabId: String? = null, selectedTabCollection: TabCollection? = null, @@ -639,7 +649,6 @@ class HomeFragment : Fragment(), CoroutineScope { } private fun currentMode(): Mode = if (!onboarding.userHasBeenOnboarded()) { - // 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) @@ -652,6 +661,11 @@ class HomeFragment : Fragment(), CoroutineScope { Mode.Normal } + override fun onAuthenticated(account: OAuthAccount) { emitAccountChanges() } + override fun onError(error: Exception) { emitAccountChanges() } + override fun onLoggedOut() { emitAccountChanges() } + override fun onProfileUpdated(profile: Profile) { emitAccountChanges() } + companion object { private const val toolbarPaddingDp = 12f private const val MOTION_LAYOUT_PROGRESS_ROUND_POINT = 0.25f 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 02a56d72c..ac097f8f5 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 @@ -69,11 +69,11 @@ fun List.toSessionBundle(context: Context): MutableList { * Describes various onboarding states. */ enum class OnboardingState { - // signed out, no account carried over from Fennec. + // Signed out, no account carried over from Fennec. SignedOut, - // auto-signed in, via a Fennec account. + // Auto-signed in, via a Fennec account. AutoSignedIn, - // manually signed in while in onboarding. + // Manually signed in while in onboarding. ManuallySignedIn } 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 680f846e3..9e19d30e2 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 @@ -64,7 +64,6 @@ private fun privateModeAdapterItems(tabs: List): List { 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 -> { diff --git a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/onboarding/OnboardingFirefoxAccountViewHolder.kt b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/onboarding/OnboardingFirefoxAccountViewHolder.kt index e033260af..af0c9697a 100644 --- a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/onboarding/OnboardingFirefoxAccountViewHolder.kt +++ b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/onboarding/OnboardingFirefoxAccountViewHolder.kt @@ -20,6 +20,17 @@ class OnboardingFirefoxAccountViewHolder(private val view: View) : RecyclerView. } fun bind(autoSignedIn: Boolean) { + updateHeaderText(autoSignedIn) + updateButtonVisibility(autoSignedIn) + } + + private fun updateButtonVisibility(autoSignedIn: Boolean) { + view.turn_on_sync_button.visibility = if (autoSignedIn) View.GONE else View.VISIBLE + view.stay_signed_in_button.visibility = if (autoSignedIn) View.VISIBLE else View.GONE + view.sign_out_button.visibility = if (autoSignedIn) View.VISIBLE else View.GONE + } + + private fun updateHeaderText(autoSignedIn: Boolean) { val appName = view.context.getString(R.string.app_name) val icon = @@ -30,10 +41,6 @@ class OnboardingFirefoxAccountViewHolder(private val view: View) : RecyclerView. view.header_text.text = if (!autoSignedIn) view.context.getString(R.string.onboarding_firefox_account_auto_signin_header) else view.context.getString(R.string.onboarding_firefox_account_header, appName) - - view.turn_on_sync_button.visibility = if (autoSignedIn) View.GONE else View.VISIBLE - view.stay_signed_in_button.visibility = if (autoSignedIn) View.VISIBLE else View.GONE - view.sign_out_button.visibility = if (autoSignedIn) View.VISIBLE else View.GONE } companion object {