From 87ef7e4aec26b562a6941e6184cf255d5e4068e0 Mon Sep 17 00:00:00 2001 From: ZAIEM Houssem-Eddine Date: Tue, 28 Oct 2025 17:07:19 +0100 Subject: [PATCH 1/4] fix: android compilation errors --- android/build.gradle | 11 ++- android/src/main/AndroidManifest.xml | 2 +- ...tDeprecated.xml => AndroidManifestNew.xml} | 3 +- .../pianoanalytics/PianoAnalyticsModule.kt | 69 +++++++++++++------ .../pianoanalytics/PianoAnalyticsPackage.kt | 1 - android/src/oldarch/PianoAnalyticsSpec.kt | 4 +- src/index.ts | 6 +- 7 files changed, 62 insertions(+), 34 deletions(-) rename android/src/main/{AndroidManifestDeprecated.xml => AndroidManifestNew.xml} (57%) diff --git a/android/build.gradle b/android/build.gradle index 6382011..5d67fdb 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -49,20 +49,19 @@ def supportsNamespace() { android { if (supportsNamespace()) { namespace "com.reactnative.pianoanalytics" - } else { + + buildFeatures { + buildConfig = true + } sourceSets { main { - manifest.srcFile "src/main/AndroidManifestDeprecated.xml" + manifest.srcFile "src/main/AndroidManifestNew.xml" } } } compileSdkVersion getExtOrIntegerDefault("compileSdkVersion") - buildFeatures { - buildConfig = true - } - defaultConfig { minSdkVersion getExtOrIntegerDefault("minSdkVersion") targetSdkVersion getExtOrIntegerDefault("targetSdkVersion") diff --git a/android/src/main/AndroidManifest.xml b/android/src/main/AndroidManifest.xml index a2f47b6..3b1b623 100644 --- a/android/src/main/AndroidManifest.xml +++ b/android/src/main/AndroidManifest.xml @@ -1,2 +1,2 @@ - + diff --git a/android/src/main/AndroidManifestDeprecated.xml b/android/src/main/AndroidManifestNew.xml similarity index 57% rename from android/src/main/AndroidManifestDeprecated.xml rename to android/src/main/AndroidManifestNew.xml index 32b82bb..a2f47b6 100644 --- a/android/src/main/AndroidManifestDeprecated.xml +++ b/android/src/main/AndroidManifestNew.xml @@ -1,3 +1,2 @@ - + diff --git a/android/src/main/java/com/reactnative/pianoanalytics/PianoAnalyticsModule.kt b/android/src/main/java/com/reactnative/pianoanalytics/PianoAnalyticsModule.kt index c62a585..5c8f6ae 100644 --- a/android/src/main/java/com/reactnative/pianoanalytics/PianoAnalyticsModule.kt +++ b/android/src/main/java/com/reactnative/pianoanalytics/PianoAnalyticsModule.kt @@ -4,7 +4,6 @@ import com.facebook.react.bridge.* import com.facebook.react.module.annotations.ReactModule import io.piano.android.analytics.Configuration import io.piano.android.analytics.PianoAnalytics -import io.piano.android.analytics.PrivacyModesStorage import io.piano.android.analytics.model.Event import io.piano.android.analytics.model.PrivacyMode import io.piano.android.analytics.model.Property @@ -16,14 +15,11 @@ import io.piano.android.analytics.model.VisitorIDType class RNPianoAnalyticsModule(reactContext: ReactApplicationContext) : RNPianoAnalyticsSpec(reactContext) { - override fun getName(): String { - return NAME - } - @ReactMethod - override fun sendEvent(eventName: String, params: ReadableMap) { + override fun sendEvent(eventName: String?, params: ReadableMap?, promise: Promise?) { val properties = mutableListOf() - val iterator = params.keySetIterator() + params?.let { + val iterator = params.keySetIterator() while (iterator.hasNextKey()) { val key = iterator.nextKey() when (params.getType(key)) { @@ -39,20 +35,44 @@ class RNPianoAnalyticsModule(reactContext: ReactApplicationContext) : else -> {} } } - val event = Event.Builder(eventName).properties(properties).build() - PianoAnalytics.getInstance().sendEvents(event) + val event = eventName?.let { evtName -> Event.Builder(evtName).properties(properties).build() } + event?.let { e -> PianoAnalytics.getInstance().sendEvents(e) } + + promise?.resolve("event sent successfully") + } ?: { + promise?.reject(RNPianoAnalyticsModule.NAME,"params are not defined") + } } @ReactMethod - override fun setUser(id: String, category: String?, enableStorage: Boolean) { + override fun setUser( + userId: String?, + category: String?, + enableStorage: Boolean, + promise: Promise? + ) { val userStorage = PianoAnalytics.getInstance().userStorage - userStorage.currentUser = User(id, category, enableStorage) + userId?.let { + userStorage.currentUser = User(userId, category, enableStorage) + promise?.resolve("userId set successfully") + } ?: { + promise?.reject(RNPianoAnalyticsModule.NAME,"userId not defined") + } + } + + override fun deleteUser(promise: Promise?) { + PianoAnalytics.getInstance().userStorage.currentUser = null } @ReactMethod - override fun privacySetMode(mode: String) { - val privacyMode = getPrivacyMode(mode) ?: return - PianoAnalytics.getInstance().privacyModesStorage.currentMode = privacyMode + override fun privacySetMode(mode: String?, promise: Promise?) { + mode?.let { + val privacyMode = getPrivacyMode(mode) ?: return + PianoAnalytics.getInstance().privacyModesStorage.currentMode = privacyMode + promise?.resolve("privacy mode set successfully") + } ?: { + promise?.reject(RNPianoAnalyticsModule.NAME,"mode is not defined") + } } @ReactMethod @@ -62,7 +82,7 @@ class RNPianoAnalyticsModule(reactContext: ReactApplicationContext) : } @ReactMethod - override fun setVisitorId(visitorId: String) { + override fun setVisitorId(visitorId: String?, promise: Promise?) { PianoAnalytics.getInstance().customVisitorId = visitorId } @@ -77,13 +97,18 @@ class RNPianoAnalyticsModule(reactContext: ReactApplicationContext) : } @ReactMethod - override fun setConfiguration(collectDomain: String, siteId: Int) { - val config = Configuration.Builder( - collectDomain = collectDomain, - site = siteId.toInt(), - visitorIDType = VisitorIDType.UUID, - ).build() - PianoAnalytics.init(reactApplicationContext, config) + override fun setConfiguration(collectionName: String?, siteId: Double, promise: Promise?) { + collectionName?.let { + val config = Configuration.Builder( + collectDomain = collectionName, + site = siteId.toInt(), + visitorIDType = VisitorIDType.UUID, + ).build() + PianoAnalytics.init(reactApplicationContext, config) + promise?.resolve("config initialized successfully") + } ?: { + promise?.reject(RNPianoAnalyticsModule.NAME,"collectionName is not defined") + } } // PRIVACY INCLUDE PROPERTY diff --git a/android/src/main/java/com/reactnative/pianoanalytics/PianoAnalyticsPackage.kt b/android/src/main/java/com/reactnative/pianoanalytics/PianoAnalyticsPackage.kt index 5edc14a..ac30ae7 100644 --- a/android/src/main/java/com/reactnative/pianoanalytics/PianoAnalyticsPackage.kt +++ b/android/src/main/java/com/reactnative/pianoanalytics/PianoAnalyticsPackage.kt @@ -5,7 +5,6 @@ import com.facebook.react.bridge.ReactApplicationContext import com.facebook.react.bridge.NativeModule import com.facebook.react.module.model.ReactModuleInfoProvider import com.facebook.react.module.model.ReactModuleInfo -import com.reactnative.pianoanalytics.RNPianoAnalyticsModule import java.util.HashMap class RNPianoAnalyticsPackage : TurboReactPackage() { diff --git a/android/src/oldarch/PianoAnalyticsSpec.kt b/android/src/oldarch/PianoAnalyticsSpec.kt index 72ae440..ab516ea 100644 --- a/android/src/oldarch/PianoAnalyticsSpec.kt +++ b/android/src/oldarch/PianoAnalyticsSpec.kt @@ -13,10 +13,12 @@ abstract class RNPianoAnalyticsSpec internal constructor(context: ReactApplicati abstract fun setUser(id: String, category: String?, enableStorage: Boolean) + abstract fun deleteUser() + abstract fun privacySetMode(mode: String) abstract fun privacyGetMode(promise: Promise) - + abstract fun setVisitorId(visitorId: String) abstract fun getVisitorId(promise: Promise) diff --git a/src/index.ts b/src/index.ts index ecb9c28..9a14b0e 100644 --- a/src/index.ts +++ b/src/index.ts @@ -43,8 +43,12 @@ export function setUser( return PianoAnalytics.setUser(userId, category, enableStorage); } +export function deleteUser() { + return PianoAnalytics.deleteUser(); +} + export function privacySetMode(mode: PrivacyMode) { - PianoAnalytics.privacySetMode(mode); + return PianoAnalytics.privacySetMode(mode); } export function privacyGetMode(): Promise { From ce0a289e2be6b54f2393d644e03c2a6a2eb9e429 Mon Sep 17 00:00:00 2001 From: ZAIEM Houssem-Eddine Date: Tue, 28 Oct 2025 17:42:02 +0100 Subject: [PATCH 2/4] chore: bump version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 6386006..d7e7361 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@pmu-tech/react-native-piano-analytics", - "version": "0.7.4", + "version": "0.7.5", "description": "Piano Analytics", "main": "lib/commonjs/index", "module": "lib/module/index", From d6c3f7d6a12202268032f28317257b73018b54d6 Mon Sep 17 00:00:00 2001 From: ZAIEM Houssem-Eddine Date: Tue, 28 Oct 2025 17:42:20 +0100 Subject: [PATCH 3/4] docs: update changelog --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index bf2c5b4..a0f40e1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.7.5 (2025/10/28) + +- fix android compilation errors when new architecture is enabled, + ## 0.7.4 (2025/02/18) - fix code generation when new architecture is enabled, From b257664fb92490f31fa746b78759daa4b996e4ad Mon Sep 17 00:00:00 2001 From: ZAIEM Houssem-Eddine Date: Tue, 28 Oct 2025 18:06:20 +0100 Subject: [PATCH 4/4] chore: increased heap size for CI environments and Hermes transforms --- android/gradle.properties | 9 +++++++++ example/android/gradle.properties | 14 ++++++++++++-- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/android/gradle.properties b/android/gradle.properties index bcf43b3..c460b32 100644 --- a/android/gradle.properties +++ b/android/gradle.properties @@ -4,3 +4,12 @@ PianoAnalytics_targetSdkVersion=31 PianoAnalytics_compileSdkVersion=31 PianoAnalytics_ndkversion=21.4.7075529 android.useAndroidX=true + +# Gradle JVM settings - increase heap size for larger projects and CI environments +org.gradle.jvmargs=-Xmx4096m -XX:MaxMetaspaceSize=1024m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 + +# Performance optimizations +org.gradle.parallel=true +org.gradle.daemon=true +org.gradle.configureondemand=true +org.gradle.caching=true diff --git a/example/android/gradle.properties b/example/android/gradle.properties index a3b2fa1..43cba61 100644 --- a/example/android/gradle.properties +++ b/example/android/gradle.properties @@ -10,12 +10,22 @@ # Specifies the JVM arguments used for the daemon process. # The setting is particularly useful for tweaking memory settings. # Default value: -Xmx512m -XX:MaxMetaspaceSize=256m -org.gradle.jvmargs=-Xmx2048m -XX:MaxMetaspaceSize=512m +# Increased heap size for CI environments and Hermes transforms +org.gradle.jvmargs=-Xmx4096m -XX:MaxMetaspaceSize=1024m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 # When configured, Gradle will run in incubating parallel mode. # This option should only be used with decoupled projects. More details, visit # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects -# org.gradle.parallel=true +org.gradle.parallel=true + +# Enable Gradle Daemon for faster builds +org.gradle.daemon=true + +# Enable configuration cache for faster builds +org.gradle.configureondemand=true + +# Enable caching for better performance +org.gradle.caching=true # AndroidX package structure to make it clearer which packages are bundled with the # Android operating system, and which are packaged with your app's APK