diff --git a/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/AccountsManager.java b/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/AccountsManager.java index 968c33926..3bcb2a1e1 100644 --- a/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/AccountsManager.java +++ b/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/AccountsManager.java @@ -38,6 +38,7 @@ class AccountsManager { private static final String PREFERENCE_TIMESTAMP = "com.mapbox.mapboxsdk.accounts.timestamp"; private SharedPreferences sharedPreferences; + private String userId; private String skuToken; private long timestamp; private boolean isManaged; @@ -57,8 +58,7 @@ class AccountsManager { private void initialize() { retrieveSkuTokenAndTimestamp(); if (isManaged) { - String userId = validateUserId(); - validateRotation(userId); + validateRotation(); } } @@ -92,22 +92,9 @@ class AccountsManager { timestamp = sharedPreferences.getLong(PREFERENCE_TIMESTAMP, 0L); } - private String validateUserId() { - SharedPreferences sharedPreferences = getSharedPreferences(); - String userId = sharedPreferences.getString(PREFERENCE_USER_ID, ""); - if (TextUtils.isEmpty(userId)) { - userId = generateUserId(); - SharedPreferences.Editor editor = getSharedPreferences().edit(); - editor.putString(PREFERENCE_USER_ID, userId); - editor.apply(); - } - - return userId; - } - - private void validateRotation(String userId) { + private void validateRotation() { if (TextUtils.isEmpty(skuToken) || timestamp == 0L) { - skuToken = generateSkuToken(userId); + skuToken = generateSkuToken(getUserId()); timestamp = persistRotation(skuToken); } } @@ -115,9 +102,7 @@ class AccountsManager { String getSkuToken() { if (isManaged) { if (isExpired()) { - SharedPreferences sharedPreferences = getSharedPreferences(); - String userId = sharedPreferences.getString(PREFERENCE_USER_ID, ""); - skuToken = generateSkuToken(userId); + skuToken = generateSkuToken(getUserId()); timestamp = persistRotation(skuToken); } } else { @@ -158,6 +143,26 @@ class AccountsManager { return System.currentTimeMillis(); } + private synchronized String getUserId() { + if (!TextUtils.isEmpty(userId)) { + return userId; + } + + SharedPreferences sharedPreferences = getSharedPreferences(); + userId = sharedPreferences.getString(PREFERENCE_USER_ID, ""); + + if (TextUtils.isEmpty(userId)) { + userId = generateUserId(); + SharedPreferences.Editor editor = getSharedPreferences().edit(); + editor.putString(PREFERENCE_USER_ID, userId); + if (!editor.commit()) { + Logger.e(TAG, "Failed to save user id."); + } + } + + return userId; + } + @NonNull private String generateUserId() { return MapboxAccounts.obtainEndUserId(); diff --git a/MapboxGLAndroidSDK/src/test/java/com/mapbox/mapboxsdk/AccountsManagerTest.java b/MapboxGLAndroidSDK/src/test/java/com/mapbox/mapboxsdk/AccountsManagerTest.java index 5ce71ceac..6ff9a377c 100644 --- a/MapboxGLAndroidSDK/src/test/java/com/mapbox/mapboxsdk/AccountsManagerTest.java +++ b/MapboxGLAndroidSDK/src/test/java/com/mapbox/mapboxsdk/AccountsManagerTest.java @@ -4,6 +4,8 @@ import android.content.SharedPreferences; import android.text.format.DateUtils; import org.junit.Test; +import org.junit.runner.RunWith; +import org.robolectric.RobolectricTestRunner; import static com.mapbox.mapboxsdk.constants.MapboxConstants.KEY_PREFERENCE_SKU_TOKEN; import static org.junit.Assert.assertEquals; @@ -13,6 +15,7 @@ import static org.mockito.Mockito.RETURNS_DEEP_STUBS; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; +@RunWith(RobolectricTestRunner.class) public class AccountsManagerTest { @Test public void testIsExpired() {