Skip to content
Open
Show file tree
Hide file tree
Changes from 7 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
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ project.xcworkspace
.gradle
local.properties
android.iml
**/.cxx

# Cocoapods
#
Expand Down
2 changes: 1 addition & 1 deletion __mocks__/setup.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ jest.mock('@react-native-async-storage/async-storage', () => mockAsyncStorage);
/*
* Mock navigator to avoid undefined access in analytics-connector
*/
global['navigator'] = { product: 'ReactNative' };
global['navigator'] = { product: 'ReactNative' } as unknown as Navigator;

/*
* Mock Native Module
Expand Down
40 changes: 32 additions & 8 deletions android/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -6,41 +6,65 @@ buildscript {
}

dependencies {
classpath 'com.android.tools.build:gradle:7.2.2'
classpath 'com.android.tools.build:gradle:8.2.1'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
}
}

apply plugin: 'com.android.library'
apply plugin: 'kotlin-android'
apply plugin: 'com.facebook.react'

react {
// Intentionally empty
}

def isNewArchitectureEnabled() {
return project.hasProperty("newArchEnabled") && project.newArchEnabled == "true"
}

def safeExtGet(prop, fallback) {
rootProject.ext.has(prop) ? rootProject.ext.get(prop) : fallback
}

android {
compileSdkVersion safeExtGet('ExperimentReactNativeClient_compileSdkVersion', 31)
buildToolsVersion safeExtGet('ExperimentReactNativeClient_buildToolsVersion', '31.0.0')
namespace "com.amplitude.experiment.reactnative"
compileSdk safeExtGet('ExperimentReactNativeClient_compileSdkVersion', 34)
buildToolsVersion safeExtGet('ExperimentReactNativeClient_buildToolsVersion', '34.0.0')

defaultConfig {
minSdkVersion safeExtGet('ExperimentReactNativeClient_minSdkVersion', 21)
targetSdkVersion safeExtGet('ExperimentReactNativeClient_targetSdkVersion', 31)
minSdkVersion safeExtGet('ExperimentReactNativeClient_minSdkVersion', 23)
targetSdkVersion safeExtGet('ExperimentReactNativeClient_targetSdkVersion', 34)
versionCode 1
versionName "1.0"

buildConfigField "boolean", "IS_NEW_ARCHITECTURE_ENABLED", isNewArchitectureEnabled().toString()
}

buildTypes {
release {
minifyEnabled false
}
}
lintOptions {

lint {
disable 'GradleCompatible'
}

compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}

sourceSets {
main {
if (isNewArchitectureEnabled()) {
java.srcDirs += ['src/newarch']
} else {
java.srcDirs += ['src/oldarch']
}
}
}
}

repositories {
Expand All @@ -54,6 +78,6 @@ repositories {
}

dependencies {
//noinspection GradleDynamicVersion
implementation "com.facebook.react:react-native:+" // From node_modules
implementation "com.facebook.react:react-native"
implementation "com.facebook.react:react-android"
}
3 changes: 1 addition & 2 deletions android/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.amplitude.experiment.reactnative">
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.amplitude.experiment.reactnative">
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
</manifest>
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Shared Android native code implementation.

Original file line number Diff line number Diff line change
@@ -1,26 +1,17 @@
package com.amplitude.experiment.reactnative

import com.facebook.react.bridge.Promise
import com.facebook.react.module.annotations.ReactModule
import com.facebook.react.bridge.ReactApplicationContext
import com.facebook.react.bridge.ReactContextBaseJavaModule
import com.facebook.react.bridge.ReactMethod
import com.facebook.react.bridge.ReadableMap
import com.facebook.react.bridge.WritableNativeMap

const val MODULE_NAME = "ExperimentReactNativeClient"

@ReactModule(name = MODULE_NAME)
class ExperimentReactNativeClientModule(private val reactContext: ReactApplicationContext) : ReactContextBaseJavaModule(reactContext) {
class ExperimentReactNativeClientImpl(reactContext: ReactApplicationContext) {
companion object {
const val NAME = "ExperimentReactNativeClient"
}

private val androidContextProvider = AndroidContextProvider(reactContext.applicationContext, false)

override fun getName(): String {
return MODULE_NAME
}

@ReactMethod
private fun getApplicationContext(promise: Promise) {
public fun getApplicationContext(promise: Promise) {
promise.resolve(WritableNativeMap().apply {
putString("version", androidContextProvider.versionName)
putString("platform", androidContextProvider.osName)
Expand All @@ -32,4 +23,4 @@ class ExperimentReactNativeClientModule(private val reactContext: ReactApplicati
putString("carrier", androidContextProvider.carrier)
})
}
}
}
Copy link
Contributor Author

@zhukaihan zhukaihan Oct 16, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

New arch Android implementation. To conform to the generated spec interface. Redirect call to shared impl.

Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package com.amplitude.experiment.reactnative

import com.facebook.react.bridge.Promise
import com.facebook.react.bridge.ReactApplicationContext
import com.facebook.react.bridge.WritableNativeMap

class ExperimentReactNativeClientModule(reactContext: ReactApplicationContext) :
NativeExperimentReactNativeClientSpec(reactContext) {

private val expRnClient = ExperimentReactNativeClientImpl(reactContext)

@Override
override fun getName(): String {
return ExperimentReactNativeClientImpl.NAME
}

@Override
override fun getApplicationContext(promise: Promise) {
expRnClient.getApplicationContext(promise)
}
}
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Old arch Android implementation. Old interface. Redirect call to shared impl.

Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package com.amplitude.experiment.reactnative

import com.facebook.react.bridge.Promise
import com.facebook.react.module.annotations.ReactModule
import com.facebook.react.bridge.ReactApplicationContext
import com.facebook.react.bridge.ReactContextBaseJavaModule
import com.facebook.react.bridge.ReactMethod
import com.facebook.react.bridge.WritableNativeMap

class ExperimentReactNativeClientModule(private val reactContext: ReactApplicationContext) :
ReactContextBaseJavaModule(reactContext) {

private val expRnClient = ExperimentReactNativeClientImpl(reactContext)

@Override
override fun getName(): String {
return ExperimentReactNativeClientImpl.NAME
}

@ReactMethod
fun getApplicationContext(promise: Promise) {
expRnClient.getApplicationContext(promise)
}
}
Loading