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
11 changes: 5 additions & 6 deletions android/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -58,11 +58,11 @@ android {
}
}

compileSdkVersion getExtOrIntegerDefault("compileSdkVersion")
compileSdkVersion 34

defaultConfig {
minSdkVersion getExtOrIntegerDefault("minSdkVersion")
targetSdkVersion getExtOrIntegerDefault("targetSdkVersion")
minSdkVersion 23
targetSdkVersion 34

}

Expand All @@ -84,6 +84,7 @@ android {

repositories {
mavenCentral()
mavenLocal()
google()
}

Expand All @@ -95,7 +96,5 @@ dependencies {
//noinspection GradleDynamicVersion
implementation "com.facebook.react:react-native:+"
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
implementation "net.consentmanager.sdkv3:cmsdkv3:0.2.0-alpha"
implementation "org.jetbrains.kotlinx:kotlinx-serialization-json"
implementation "net.consentmanager.sdkv3:cmsdkv3:3.2.0"
}

2 changes: 1 addition & 1 deletion android/gradle.properties
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
CmSdkReactNativeV3_kotlinVersion=1.7.0
CmSdkReactNativeV3_minSdkVersion=21
CmSdkReactNativeV3_minSdkVersion=25
CmSdkReactNativeV3_targetSdkVersion=31
CmSdkReactNativeV3_compileSdkVersion=31
CmSdkReactNativeV3_ndkversion=21.4.7075529
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,12 @@ import com.facebook.react.modules.core.DeviceEventManagerModule
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.serialization.json.JsonObject
import net.consentmanager.cm_sdk_android_v3.CMPManager
import net.consentmanager.cm_sdk_android_v3.CMPManagerDelegate
import net.consentmanager.cm_sdk_android_v3.ConsentLayerUIConfig
import net.consentmanager.cm_sdk_android_v3.ConsentStatus
import net.consentmanager.cm_sdk_android_v3.UrlConfig
import net.consentmanager.cm_sdk_android_v3.UserConsentStatus

class CmSdkReactNativeV3Module(reactContext: ReactApplicationContext) :
ReactContextBaseJavaModule(reactContext), LifecycleEventListener, CMPManagerDelegate {
Expand Down Expand Up @@ -107,11 +108,168 @@ class CmSdkReactNativeV3Module(reactContext: ReactApplicationContext) :
cmpManager.setActivity(activity)
}

// MARK: - New methods

/**
* Gets the comprehensive user consent status
*/
@ReactMethod
fun getUserStatus(promise: Promise) {
try {
val userStatus = cmpManager.getUserStatus()
val result = Arguments.createMap().apply {
putString("hasUserChoice", userStatus.hasUserChoice.toString())
putString("tcf", userStatus.tcf)
putString("addtlConsent", userStatus.addtlConsent)
putString("regulation", userStatus.regulation)

// Convert vendors map
val vendorsMap = Arguments.createMap()
userStatus.vendors.forEach { (vendorId, status) ->
vendorsMap.putString(vendorId, status.toString())
}
putMap("vendors", vendorsMap)

// Convert purposes map
val purposesMap = Arguments.createMap()
userStatus.purposes.forEach { (purposeId, status) ->
purposesMap.putString(purposeId, status.toString())
}
putMap("purposes", purposesMap)
}

promise.resolve(result)
} catch (e: Exception) {
promise.reject("ERROR", "Failed to get user status: ${e.message}", e)
}
}

/**
* Gets the consent status for a specific purpose
*/
@ReactMethod
fun getStatusForPurpose(purposeId: String, promise: Promise) {
try {
val status = cmpManager.getStatusForPurpose(purposeId)
promise.resolve(status.toString())
} catch (e: Exception) {
promise.reject("ERROR", "Failed to get status for purpose: ${e.message}", e)
}
}

/**
* Gets the consent status for a specific vendor
*/
@ReactMethod
fun getStatusForVendor(vendorId: String, promise: Promise) {
try {
val status = cmpManager.getStatusForVendor(vendorId)
promise.resolve(status.toString())
} catch (e: Exception) {
promise.reject("ERROR", "Failed to get status for vendor: ${e.message}", e)
}
}

/**
* Gets Google Consent Mode v2 compatible settings
*/
@ReactMethod
fun getGoogleConsentModeStatus(promise: Promise) {
try {
val consentModeStatus = cmpManager.getGoogleConsentModeStatus()
val result = Arguments.createMap()

consentModeStatus.forEach { (key, value) ->
result.putString(key, value)
}

promise.resolve(result)
} catch (e: Exception) {
promise.reject("ERROR", "Failed to get Google Consent Mode status: ${e.message}", e)
}
}

/**
* Replacement for openConsentLayer - force opens the consent UI
*/
@ReactMethod
fun forceOpen(jumpToSettings: Boolean, promise: Promise) {
scope.launch {
try {
cmpManager.forceOpen(jumpToSettings) { result ->
if (result.isSuccess) {
promise.resolve(true)
} else {
promise.reject("ERROR", result.exceptionOrNull()?.message ?: "Unknown error")
}
}
} catch (e: Exception) {
promise.reject("ERROR", "Failed to force open consent layer: ${e.message}", e)
}
}
}

/**
* Replacement for checkWithServerAndOpenIfNecessary - checks with server and opens if needed
*/
@ReactMethod
fun checkAndOpen(jumpToSettings: Boolean, promise: Promise) {
scope.launch {
try {
cmpManager.checkAndOpen(jumpToSettings) { result ->
if (result.isSuccess) {
promise.resolve(true)
} else {
promise.reject("ERROR", result.exceptionOrNull()?.message ?: "Unknown error")
}
}
} catch (e: Exception) {
promise.reject("ERROR", "Failed to check and open consent: ${e.message}", e)
}
}
}

/**
* Import a CMP information string
*/
@ReactMethod
fun importCMPInfo(cmpString: String, promise: Promise) {
scope.launch {
try {
cmpManager.importCMPInfo(cmpString) { result ->
if (result.isSuccess) {
promise.resolve(true)
} else {
promise.reject("ERROR", result.exceptionOrNull()?.message ?: "Unknown error")
}
}
} catch (e: Exception) {
promise.reject("ERROR", "Failed to import CMP info: ${e.message}", e)
}
}
}

/**
* Reset all consent management data
*/
@ReactMethod
fun resetConsentManagementData(promise: Promise) {
try {
cmpManager.resetConsentManagementData()
promise.resolve(true)
} catch (e: Exception) {
promise.reject("ERROR", "Failed to reset consent management data: ${e.message}", e)
}
}

// MARK: - Deprecated methods (kept for backward compatibility)

@ReactMethod
fun checkWithServerAndOpenIfNecessary(promise: Promise) {
scope.launch {
try {
cmpManager.checkWithServerAndOpenIfNecessary { result ->
// Call the new method instead, but keep the API signature the same
cmpManager.checkAndOpen(false) { result ->
if (result.isSuccess) {
promise.resolve(true)
} else {
Expand All @@ -128,7 +286,8 @@ class CmSdkReactNativeV3Module(reactContext: ReactApplicationContext) :
fun openConsentLayer(promise: Promise) {
scope.launch {
try {
cmpManager.openConsentLayer { result ->
// Call the new method instead, but keep the API signature the same
cmpManager.forceOpen(false) { result ->
if (result.isSuccess) {
promise.resolve(true)
} else {
Expand All @@ -141,6 +300,23 @@ class CmSdkReactNativeV3Module(reactContext: ReactApplicationContext) :
}
}

@ReactMethod
fun jumpToSettings(promise: Promise) {
scope.launch {
try {
cmpManager.forceOpen(true) { result ->
if (result.isSuccess) {
promise.resolve(true)
} else {
promise.reject("ERROR", result.exceptionOrNull()?.message ?: "Unknown error")
}
}
} catch (e: Exception) {
promise.reject("ERROR", "Failed to jump to settings: ${e.message}", e)
}
}
}

@ReactMethod
fun checkIfConsentIsRequired(promise: Promise) {
scope.launch {
Expand Down Expand Up @@ -360,7 +536,7 @@ class CmSdkReactNativeV3Module(reactContext: ReactApplicationContext) :
const val NAME = "CmSdkReactNativeV3"
}

override fun didReceiveConsent(consent: String, jsonObject: JsonObject) {
override fun didReceiveConsent(consent: String, jsonObject: Map<String, Any>) {
val params = Arguments.createMap().apply {
putString("consent", consent)
putString("jsonObject", jsonObject.toString())
Expand Down
2 changes: 2 additions & 0 deletions example/android/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ buildscript {

repositories {
mavenCentral()
mavenLocal()
google()
}

Expand All @@ -38,6 +39,7 @@ allprojects {
}())
}
mavenCentral()
mavenLocal()
google()
}
}
Loading
Loading