I have implemented AbstractAccountAuthenticator as a requirement to use SyncAdapter hower my application is supporting only 1 account at a time.
When the user is trying to add another account via settings - Settings crash with an error that it stopped working.
I have seen some application e.g. LinkedIn, Facebook they somehow handle it differently a toast message is shown to the user with a statement that only 1 account is supported. How can I achieve this functionality?
This is my authenticator
class ApplicationAuthenticator(private val context: Context) : AbstractAccountAuthenticator(context) {
// Editing properties is not supported
@Throws(UnsupportedOperationException::class)
override fun editProperties(response: AccountAuthenticatorResponse,
accountType: String): Bundle? {
throw UnsupportedOperationException()
}
// Don't add additional accounts
override fun addAccount(response: AccountAuthenticatorResponse, accountType: String,
authTokenType: String, features: Array<String>,
options: Bundle): Bundle? {
return bundleOf(AccountManager.KEY_INTENT to null)
}
// Ignore attempts to confirm credentials
@Throws(NetworkErrorException::class)
override fun confirmCredentials(response: AccountAuthenticatorResponse, account: Account,
options: Bundle): Bundle? {
return null
}
// Getting an authentication token is not supported
@Throws(NetworkErrorException::class, UnsupportedOperationException::class)
override fun getAuthToken(response: AccountAuthenticatorResponse, account: Account,
authTokenType: String, loginOptions: Bundle): Bundle? {
throw UnsupportedOperationException()
}
// Getting a label for the auth token is not supported
override fun getAuthTokenLabel(authTokenType: String): String {
return context.resources.getString(R.string.application_name)
}
// Updating user credentials is not supported
override fun updateCredentials(response: AccountAuthenticatorResponse, account: Account,
authTokenType: String, loginOptions: Bundle): Bundle? {
return null
}
// Checking features for the account is not supported
@Throws(NetworkErrorException::class)
override fun hasFeatures(response: AccountAuthenticatorResponse, account: Account,
features: Array<String>): Bundle {
return bundleOf(KEY_BOOLEAN_RESULT to false)
}
}
When the user clicks the "Add Account" button, Android just calls the
addAccountmethod of yourApplicationAuthenticator. In return it expects either the account to be created, an Intent which launches the account setup or an error.If you don't allow multiple accounts you have multiple options here:
Return your existing account as the result. At this point you can also show a
Toast.To Return the existing account just let
addAccountreturn aBundlewith the following keys and their respective values:Return an Activity
Intentwhich doesn't create an account but explains to the user that this is an unsupported/unnecessary operation. It's not a requirement that the Activity actually adds an account.This gives the best user experience IMO.