From daba353325b4862b8aeef60b11080d64fb2b17af Mon Sep 17 00:00:00 2001 From: Debanjan Chatterjee Date: Mon, 8 Jan 2024 10:27:42 +0530 Subject: [PATCH 1/2] fix: added synchronization to RudderContext made the variables final --- .../android/sdk/core/RudderApp.java | 29 ++++++++++++------- .../android/sdk/core/RudderClient.java | 2 +- .../android/sdk/core/RudderContext.java | 16 +++++++--- .../android/sdk/core/RudderLibraryInfo.java | 4 +-- .../android/sdk/core/RudderOSInfo.java | 4 +-- 5 files changed, 36 insertions(+), 19 deletions(-) diff --git a/core/src/main/java/com/rudderstack/android/sdk/core/RudderApp.java b/core/src/main/java/com/rudderstack/android/sdk/core/RudderApp.java index a32d96520..ea0b61a51 100644 --- a/core/src/main/java/com/rudderstack/android/sdk/core/RudderApp.java +++ b/core/src/main/java/com/rudderstack/android/sdk/core/RudderApp.java @@ -9,30 +9,39 @@ class RudderApp { @SerializedName("build") - private String build; + private final String build; @SerializedName("name") - private String name; + private final String name; @SerializedName("namespace") - private String nameSpace; + private final String nameSpace; @SerializedName("version") - private String version; + private final String version; // internal constructor // to be used while creating a cache of context RudderApp(Application application) { + String buildValue = null; + String nameValue = null; + String nameSpaceValue = null; + String versionValue = null; try { String packageName = application.getPackageName(); PackageManager packageManager = application.getPackageManager(); PackageInfo packageInfo = packageManager.getPackageInfo(packageName, 0); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) - this.build = Long.toString(packageInfo.getLongVersionCode()); - else this.build = Integer.toString(packageInfo.versionCode); - this.name = packageInfo.applicationInfo.loadLabel(packageManager).toString(); - this.nameSpace = packageName; - this.version = packageInfo.versionName; + buildValue = (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P)? + Long.toString(packageInfo.getLongVersionCode()): Integer.toString(packageInfo.versionCode); + nameValue = packageInfo.applicationInfo.loadLabel(packageManager).toString(); + nameSpaceValue = packageName; + versionValue = packageInfo.versionName; } catch (PackageManager.NameNotFoundException ex) { ReportManager.reportError(ex); RudderLogger.logError(ex.getCause()); } + finally { + this.build = buildValue; + this.name = nameValue; + this.nameSpace = nameSpaceValue; + this.version = versionValue; + } } } diff --git a/core/src/main/java/com/rudderstack/android/sdk/core/RudderClient.java b/core/src/main/java/com/rudderstack/android/sdk/core/RudderClient.java index c9ec32eec..b12bd95e0 100644 --- a/core/src/main/java/com/rudderstack/android/sdk/core/RudderClient.java +++ b/core/src/main/java/com/rudderstack/android/sdk/core/RudderClient.java @@ -37,7 +37,7 @@ public class RudderClient { private static RudderOption defaultOptions; private static String deviceToken; private static String authToken; - private static ReentrantLock reentrantLock = new ReentrantLock(); + private static final ReentrantLock reentrantLock = new ReentrantLock(); private static final int NUMBER_OF_FLUSH_CALLS_IN_QUEUE = 1; diff --git a/core/src/main/java/com/rudderstack/android/sdk/core/RudderContext.java b/core/src/main/java/com/rudderstack/android/sdk/core/RudderContext.java index 9fb525dc7..dd3f6e4c8 100644 --- a/core/src/main/java/com/rudderstack/android/sdk/core/RudderContext.java +++ b/core/src/main/java/com/rudderstack/android/sdk/core/RudderContext.java @@ -118,7 +118,9 @@ public class RudderContext { void resetTraits() { RudderTraits traits = new RudderTraits(); // convert the whole traits to map and take care of the extras - this.traits = Utils.convertToMap(RudderGson.getInstance().toJson(traits)); + synchronized (this) { + this.traits = Utils.convertToMap(RudderGson.getInstance().toJson(traits)); + } } void updateTraits(RudderTraits traits) { @@ -135,13 +137,17 @@ void updateTraits(RudderTraits traits) { // If a user is already loggedIn and then a new user tries to login if (existingId != null && newId != null && !existingId.equals(newId)) { - this.traits = traitsMap; + synchronized (this) { + this.traits = traitsMap; + } resetExternalIds(); return; } // update traits object here - this.traits.putAll(traitsMap); + synchronized (this) { + this.traits.putAll(traitsMap); + } } @@ -386,7 +392,9 @@ RudderContext copy() { copy.app = this.app; if (this.traits != null) { - copy.traits = new HashMap<>(this.traits); + synchronized (this) { + copy.traits = new HashMap<>(this.traits); + } } copy.libraryInfo = this.libraryInfo; copy.osInfo = this.osInfo; diff --git a/core/src/main/java/com/rudderstack/android/sdk/core/RudderLibraryInfo.java b/core/src/main/java/com/rudderstack/android/sdk/core/RudderLibraryInfo.java index bc7c39dd9..462fd175a 100644 --- a/core/src/main/java/com/rudderstack/android/sdk/core/RudderLibraryInfo.java +++ b/core/src/main/java/com/rudderstack/android/sdk/core/RudderLibraryInfo.java @@ -4,7 +4,7 @@ class RudderLibraryInfo { @SerializedName("name") - private String name = BuildConfig.LIBRARY_PACKAGE_NAME; + private final String name = BuildConfig.LIBRARY_PACKAGE_NAME; @SerializedName("version") - private String version = BuildConfig.VERSION_NAME; + private final String version = BuildConfig.VERSION_NAME; } diff --git a/core/src/main/java/com/rudderstack/android/sdk/core/RudderOSInfo.java b/core/src/main/java/com/rudderstack/android/sdk/core/RudderOSInfo.java index c218c185b..6b58d28e2 100644 --- a/core/src/main/java/com/rudderstack/android/sdk/core/RudderOSInfo.java +++ b/core/src/main/java/com/rudderstack/android/sdk/core/RudderOSInfo.java @@ -6,7 +6,7 @@ class RudderOSInfo { @SerializedName("name") - private String name = "Android"; + private final String name = "Android"; @SerializedName("version") - private String version = Build.VERSION.RELEASE; + private final String version = Build.VERSION.RELEASE; } From bbbcf2cd42ca354415dd76dab24d1034e1b82c99 Mon Sep 17 00:00:00 2001 From: Abhishek Pandey <64667840+1abhishekpandey@users.noreply.github.com> Date: Tue, 16 Jan 2024 13:02:08 +0530 Subject: [PATCH 2/2] fix: synchronize the RudderContext.persistTraits --- .../java/com/rudderstack/android/sdk/core/RudderContext.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/com/rudderstack/android/sdk/core/RudderContext.java b/core/src/main/java/com/rudderstack/android/sdk/core/RudderContext.java index dd3f6e4c8..c84f7db17 100644 --- a/core/src/main/java/com/rudderstack/android/sdk/core/RudderContext.java +++ b/core/src/main/java/com/rudderstack/android/sdk/core/RudderContext.java @@ -160,7 +160,9 @@ void persistTraits() { try { if (RudderClient.getApplication() != null) { RudderPreferenceManager preferenceManger = RudderPreferenceManager.getInstance(RudderClient.getApplication()); - preferenceManger.saveTraits(RudderGson.getInstance().toJson(this.traits)); + synchronized (this) { + preferenceManger.saveTraits(RudderGson.getInstance().toJson(this.traits)); + } } } catch (NullPointerException ex) { ReportManager.reportError(ex);