From ef4c225290572e9b171e77e8386da48234f55533 Mon Sep 17 00:00:00 2001 From: Igor Tarasov Date: Wed, 15 Jan 2020 12:36:25 +0200 Subject: [PATCH] AccountManager: write user ID synchronously, keep it in memory. (#145) * AccountManager: write user ID synchronously, keep it in memory. * Unit tests: run AccountsManagerTest with Robolectric. --- .../com/mapbox/mapboxsdk/AccountsManager.java | 45 ++++++++++--------- .../mapbox/mapboxsdk/AccountsManagerTest.java | 3 ++ 2 files changed, 28 insertions(+), 20 deletions(-) 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() {