diff --git a/app/src/main/java/org/mozilla/fenix/components/accounts/FenixAccountManager.kt b/app/src/main/java/org/mozilla/fenix/components/accounts/FenixAccountManager.kt index fe5397bd1d..07ac48b101 100644 --- a/app/src/main/java/org/mozilla/fenix/components/accounts/FenixAccountManager.kt +++ b/app/src/main/java/org/mozilla/fenix/components/accounts/FenixAccountManager.kt @@ -21,6 +21,20 @@ open class FenixAccountManager(context: Context) { val accountProfileEmail get() = accountManager.accountProfile()?.email + /** + * The current state of the Firefox Account. See [AccountState]. + */ + val accountState: AccountState + get() = if (accountManager.authenticatedAccount() == null) { + AccountState.NO_ACCOUNT + } else { + if (accountManager.accountNeedsReauth()) { + AccountState.NEEDS_REAUTHENTICATION + } else { + AccountState.AUTHENTICATED + } + } + /** * Check if the current account is signed in and authenticated. */ @@ -31,3 +45,23 @@ open class FenixAccountManager(context: Context) { return account != null && !needsReauth } } + +/** + * General states as an overview of the current Firefox Account. + */ +enum class AccountState { + /** + * There is no known Firefox Account. + */ + NO_ACCOUNT, + + /** + * A Firefox Account exists but needs to be re-authenticated. + */ + NEEDS_REAUTHENTICATION, + + /** + * A Firefox Account exists and the user is currently signed into it. + */ + AUTHENTICATED, +} diff --git a/app/src/test/java/org/mozilla/fenix/components/accounts/FenixAccountManagerTest.kt b/app/src/test/java/org/mozilla/fenix/components/accounts/FenixAccountManagerTest.kt index d93616bc56..e3c410ca3c 100644 --- a/app/src/test/java/org/mozilla/fenix/components/accounts/FenixAccountManagerTest.kt +++ b/app/src/test/java/org/mozilla/fenix/components/accounts/FenixAccountManagerTest.kt @@ -12,6 +12,7 @@ import mozilla.components.concept.sync.Profile import mozilla.components.service.fxa.manager.FxaAccountManager import org.junit.Assert.assertEquals import org.junit.Assert.assertFalse +import org.junit.Assert.assertSame import org.junit.Assert.assertTrue import org.junit.Before import org.junit.Test @@ -98,4 +99,45 @@ class FenixAccountManagerTest { val signedIn = fenixFxaManager.signedInToFxa() assertFalse(signedIn) } + + @Test + fun `GIVEN no account exists WHEN accountState is called THEN it returns AccountState#NO_ACCOUNT`() { + every { context.components.backgroundServices.accountManager } returns accountManagerComponent + every { accountManagerComponent.authenticatedAccount() } returns null + fenixFxaManager = FenixAccountManager(context) + + assertSame(AccountState.NO_ACCOUNT, fenixFxaManager.accountState) + + // No account but signed in should not be possible. Test protecting against such a regression. + every { accountManagerComponent.accountNeedsReauth() } returns false + assertSame(AccountState.NO_ACCOUNT, fenixFxaManager.accountState) + + // No account and signed out still means no account. Test protecting against such a regression. + every { accountManagerComponent.accountNeedsReauth() } returns true + assertSame(AccountState.NO_ACCOUNT, fenixFxaManager.accountState) + } + + @Test + fun `GIVEN an account exists but needs to be re-authenticated WHEN accountState is called THEN it returns AccountState#NEEDS_REAUTHENTICATION`() { + every { context.components.backgroundServices.accountManager } returns accountManagerComponent + every { accountManagerComponent.authenticatedAccount() } returns mockk() + every { accountManagerComponent.accountNeedsReauth() } returns true + fenixFxaManager = FenixAccountManager(context) + + val result = fenixFxaManager.accountState + + assertSame(AccountState.NEEDS_REAUTHENTICATION, result) + } + + @Test + fun `GIVEN an account exists and doesn't need to be re-authenticated WHEN accountState is called THEN it returns AccountState#AUTHENTICATED`() { + every { context.components.backgroundServices.accountManager } returns accountManagerComponent + every { accountManagerComponent.authenticatedAccount() } returns mockk() + every { accountManagerComponent.accountNeedsReauth() } returns false + fenixFxaManager = FenixAccountManager(context) + + val result = fenixFxaManager.accountState + + assertSame(AccountState.AUTHENTICATED, result) + } }