3030import static com .salesforce .androidsdk .security .ScreenLockManager .SCREEN_LOCK ;
3131import static com .salesforce .androidsdk .security .ScreenLockManager .SCREEN_LOCK_TIMEOUT ;
3232
33+ import android .accounts .Account ;
34+ import android .accounts .AccountManager ;
3335import android .content .Context ;
3436import android .content .SharedPreferences ;
3537
3638import com .salesforce .androidsdk .accounts .UserAccount ;
39+ import com .salesforce .androidsdk .accounts .UserAccountManager ;
3740import com .salesforce .androidsdk .auth .HttpAccess ;
3841import com .salesforce .androidsdk .auth .OAuth2 ;
3942import com .salesforce .androidsdk .config .AdminSettingsManager ;
4649import java .util .Map ;
4750import java .util .concurrent .Executors ;
4851
49-
5052/**
5153 * This class handles upgrades from one version to another.
5254 *
@@ -60,7 +62,7 @@ public class SalesforceSDKUpgradeManager {
6062
6163 private static SalesforceSDKUpgradeManager INSTANCE = null ;
6264
63- private UserManager userManager ;
65+ private final UserManager userManager ;
6466
6567 /**
6668 * Returns an instance of this class.
@@ -82,12 +84,7 @@ interface UserManager {
8284 }
8385
8486 public SalesforceSDKUpgradeManager () {
85- this (new UserManager () {
86- @ Override
87- public List <UserAccount > getAuthenticatedUsers () {
88- return SalesforceSDKManager .getInstance ().getUserAccountManager ().getAuthenticatedUsers ();
89- }
90- });
87+ this (() -> SalesforceSDKManager .getInstance ().getUserAccountManager ().getAuthenticatedUsers ());
9188 }
9289 public SalesforceSDKUpgradeManager (UserManager userManager ) {
9390 this .userManager = userManager ;
@@ -130,6 +127,9 @@ else if (installedVersion.isGreaterThanOrEqualTo(new SdkVersion(9, 2, 0, false))
130127 if (installedVersion .isLessThan (new SdkVersion (12 , 0 , 0 , false ))) {
131128 updateFromBefore12_0_0 ();
132129 }
130+ if (installedVersion .isLessThan (new SdkVersion (15 , 0 , 0 , false ))) {
131+ migrateAccountType ();
132+ }
133133 } catch (Exception e ) {
134134 SalesforceSDKLogger .e (
135135 TAG ,
@@ -306,4 +306,36 @@ private void updateFromBefore12_0_0() {
306306 PushMessaging .setReRegistrationRequested (true );
307307 }
308308
309+
310+ /*
311+ * Migrate any accounts with account_type "com.salesforce.androidsdk" to a unique value.
312+ * TODO: Remove this in Mobile SDK 15.0
313+ */
314+ private void migrateAccountType () {
315+ final String LEGACY_ACCOUNT_TYPE = "com.salesforce.androidsdk" ;
316+ if (SalesforceSDKManager .getInstance ().getAccountType ().equals (LEGACY_ACCOUNT_TYPE )) {
317+ SalesforceSDKLogger .e (TAG , "No app specific account type found. To ensure users " +
318+ "can login override the \" account_type\" value in your strings.xml." );
319+ return ;
320+ }
321+
322+ final AccountManager accountManager = SalesforceSDKManager .getInstance ().getClientManager ().getAccountManager ();
323+ final UserAccountManager userAccountManager = SalesforceSDKManager .getInstance ().getUserAccountManager ();
324+
325+ for (Account account : accountManager .getAccountsByType (LEGACY_ACCOUNT_TYPE )) {
326+ try {
327+ final UserAccount userAccount = userAccountManager .buildUserAccount (account );
328+ if (userAccount == null ) {
329+ SalesforceSDKLogger .e (TAG , "Unable to build UserAccount from account: " + account .name );
330+ continue ;
331+ }
332+
333+ // Android OS accounts are immutable so we have to remove the account and add a new one.
334+ accountManager .removeAccountExplicitly (account );
335+ userAccountManager .createAccount (userAccount );
336+ } catch (Exception e ) {
337+ SalesforceSDKLogger .e (TAG , "Failed to migrate account: " + account .name , e );
338+ }
339+ }
340+ }
309341}
0 commit comments