Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -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,
Expand Down
11 changes: 5 additions & 6 deletions android/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -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")
Expand Down
9 changes: 9 additions & 0 deletions android/gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -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
2 changes: 1 addition & 1 deletion android/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.reactnative.pianoanalytics">
</manifest>
Original file line number Diff line number Diff line change
@@ -1,3 +1,2 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.reactnative.pianoanalytics">
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
</manifest>
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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<Property>()
val iterator = params.keySetIterator()
params?.let {
val iterator = params.keySetIterator()
while (iterator.hasNextKey()) {
val key = iterator.nextKey()
when (params.getType(key)) {
Expand All @@ -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
Expand All @@ -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
}

Expand All @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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() {
Expand Down
4 changes: 3 additions & 1 deletion android/src/oldarch/PianoAnalyticsSpec.kt
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
14 changes: 12 additions & 2 deletions example/android/gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -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",
Expand Down
6 changes: 5 additions & 1 deletion src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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<PrivacyMode> {
Expand Down
Loading