diff --git a/build.gradle b/build.gradle index 02bc627..d9431f5 100644 --- a/build.gradle +++ b/build.gradle @@ -1,25 +1,25 @@ buildscript { - ext.kotlin_version = '1.8.10' + ext.kotlin_version = '2.0.20' if (!project.hasProperty('version') || project.version.equals('unspecified')) { project.version = '+' } repositories { + google() mavenLocal() mavenCentral() - google() } + dependencies { - classpath 'com.android.tools.build:gradle:7.4.1' + classpath 'com.android.tools.build:gradle:8.1.4' classpath 'com.mparticle:android-kit-plugin:' + project.version classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" - } } plugins { id "org.sonarqube" version "3.5.0.2730" - id "org.jlleitschuh.gradle.ktlint" version "11.2.0" + id "org.jlleitschuh.gradle.ktlint" version "13.0.0" } sonarqube { @@ -31,8 +31,8 @@ sonarqube { } apply plugin: 'org.jlleitschuh.gradle.ktlint' -apply plugin: 'com.mparticle.kit' apply plugin: 'kotlin-android' +apply plugin: 'com.mparticle.kit' repositories { maven { @@ -41,6 +41,28 @@ repositories { mavenCentral() } +android { + namespace 'com.mparticle.kits.singular' + buildFeatures { + buildConfig = true + } + defaultConfig { + minSdkVersion 16 + } + compileOptions { + sourceCompatibility JavaVersion.VERSION_17 + targetCompatibility JavaVersion.VERSION_17 + } + kotlinOptions { + jvmTarget = '17' + } + testOptions { + unitTests.all { + jvmArgs += ['--add-opens', 'java.base/java.lang=ALL-UNNAMED'] + } + } +} + dependencies { api 'com.singular.sdk:singular_sdk:12.5.4' @@ -53,9 +75,3 @@ dependencies { testImplementation "org.robolectric:robolectric:4.3.1" testImplementation 'org.json:json:20220320' } - -android { - defaultConfig { - minSdkVersion 16 - } -} diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index ae04661..e1bef7e 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.0.2-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/src/main/AndroidManifest.xml b/src/main/AndroidManifest.xml index 96412ec..c4e6c98 100644 --- a/src/main/AndroidManifest.xml +++ b/src/main/AndroidManifest.xml @@ -1,2 +1 @@ - - + diff --git a/src/main/kotlin/com/mparticle/kits/SingularKit.kt b/src/main/kotlin/com/mparticle/kits/SingularKit.kt index f0fddad..280fd6a 100644 --- a/src/main/kotlin/com/mparticle/kits/SingularKit.kt +++ b/src/main/kotlin/com/mparticle/kits/SingularKit.kt @@ -30,11 +30,17 @@ import org.json.JSONException import org.json.JSONObject import java.math.BigDecimal -open class SingularKit : KitIntegration(), ActivityListener, EventListener, - PushListener, CommerceListener, ApplicationStateListener, UserAttributeListener, +open class SingularKit : + KitIntegration(), + ActivityListener, + EventListener, + PushListener, + CommerceListener, + ApplicationStateListener, + UserAttributeListener, AttributeListener { - interface DeviceAttributionCallback : SingularDeviceAttributionHandler + interface SdidAccessorHandler : SDIDAccessorHandler private val logger = SingularLog.getLogger(Singular::class.java.simpleName) @@ -45,7 +51,7 @@ open class SingularKit : KitIntegration(), ActivityListener, EventListener, //region Kit Integration Implementation override fun onKitCreate( settings: Map, - context: Context + context: Context, ): List { // Returning the reporting message to state that the method was successful and // Preventing from the mParticle Kit to retry to activate to method. @@ -54,14 +60,15 @@ open class SingularKit : KitIntegration(), ActivityListener, EventListener, ReportingMessage( this, ReportingMessage.MessageType.APP_STATE_TRANSITION, - System.currentTimeMillis(), null - ) + System.currentTimeMillis(), + null, + ), ) return messages } - fun buildSingularConfig(settings: Map?): SingularConfig? { - return try { + fun buildSingularConfig(settings: Map?): SingularConfig? = + try { val singularKey = settings?.get(API_KEY) val singularSecret = settings?.get(API_SECRET) @@ -90,12 +97,14 @@ open class SingularKit : KitIntegration(), ActivityListener, EventListener, linkParams.put(PASSTHROUGH, singularLinkParams.passthrough) linkParams.put(IS_DEFERRED, singularLinkParams.isDeferred) if (singularLinkParams.urlParameters != null) { - linkParams.put(QUERY_PARAMS, + linkParams.put( + QUERY_PARAMS, (singularLinkParams.urlParameters as Map<*, *>?)?.let { JSONObject( - it + it, ) - }) + }, + ) } attributionResult.parameters = linkParams } catch (e: JSONException) { @@ -111,9 +120,9 @@ open class SingularKit : KitIntegration(), ActivityListener, EventListener, config.withLogLevel(Log.DEBUG) } - config.deviceAttributionHandler = deviceAttributionCallback; + config.deviceAttributionHandler = deviceAttributionCallback - config.withCustomSdid(customSdid, sdidAccessorHandler); + config.withCustomSdid(customSdid, sdidAccessorHandler) Singular.setWrapperNameAndVersion(MPARTICLE_WRAPPER_NAME, MPARTICLE_WRAPPER_VERSION) config @@ -121,13 +130,10 @@ open class SingularKit : KitIntegration(), ActivityListener, EventListener, logger.error(CANT_BUILD_SINGULAR_CONFIG_MESSAGE, ex) null } - } override fun setOptOut(b: Boolean): List = emptyList() - override fun getName(): String { - return KIT_NAME - } + override fun getName(): String = KIT_NAME override fun setInstallReferrer(intent: Intent) {} @@ -144,7 +150,10 @@ open class SingularKit : KitIntegration(), ActivityListener, EventListener, } //region Unimplemented (Empty Methods) - override fun onActivityCreated(activity: Activity, bundle: Bundle?): List { + override fun onActivityCreated( + activity: Activity, + bundle: Bundle?, + ): List { initializeSingular() return emptyList() } @@ -155,12 +164,11 @@ open class SingularKit : KitIntegration(), ActivityListener, EventListener, override fun onActivitySaveInstanceState( activity: Activity, - bundle: Bundle? + bundle: Bundle?, ): List = emptyList() override fun onActivityDestroyed(activity: Activity): List = emptyList() - //endregion //endregion //region Event Listener Implementation @@ -171,11 +179,12 @@ open class SingularKit : KitIntegration(), ActivityListener, EventListener, val eventInfo = mpEvent.customAttributes // Logging the event with the Singular API - val eventStatus: Boolean = if (!eventInfo.isNullOrEmpty()) { - Singular.eventJSON(eventName, JSONObject(eventInfo)) - } else { - Singular.event(eventName) - } + val eventStatus: Boolean = + if (!eventInfo.isNullOrEmpty()) { + Singular.eventJSON(eventName, JSONObject(eventInfo)) + } else { + Singular.event(eventName) + } // If the Singular event logging was successful, return the message to the mParticle Kit // So it won't retry the event @@ -189,22 +198,29 @@ open class SingularKit : KitIntegration(), ActivityListener, EventListener, //region Unimplemented (Empty Methods) override fun leaveBreadcrumb(s: String): List = emptyList() - - override fun logError(s: String, map: Map): List = emptyList() + override fun logError( + s: String, + map: Map, + ): List = emptyList() override fun logException( e: Exception, map: Map, - s: String + s: String, ): List = emptyList() - override fun logScreen(s: String, map: Map): List = - emptyList() + override fun logScreen( + s: String, + map: Map, + ): List = emptyList() //endregion //endregion //region Push Listener Implementation - override fun onPushRegistration(deviceToken: String, senderId: String): Boolean { + override fun onPushRegistration( + deviceToken: String, + senderId: String, + ): Boolean { // Saving the registration token to determine when the user uninstalls the app. this.deviceToken = deviceToken executeIfSingularInitialized({ @@ -218,7 +234,7 @@ open class SingularKit : KitIntegration(), ActivityListener, EventListener, private fun executeIfSingularInitialized( operation: () -> Unit, forceInitSingular: Boolean = false, - operationName: String + operationName: String, ) { if (isInitialized) { operation.invoke() @@ -251,7 +267,10 @@ open class SingularKit : KitIntegration(), ActivityListener, EventListener, //region Unimplemented (Empty Methods) override fun willHandlePushMessage(intent: Intent): Boolean = false - override fun onPushMessageReceived(context: Context, intent: Intent) {} + override fun onPushMessageReceived( + context: Context, + intent: Intent, + ) {} //endregion //endregion @@ -279,7 +298,7 @@ open class SingularKit : KitIntegration(), ActivityListener, EventListener, product.name, product.category, product.quantity.toInt(), - product.unitPrice + product.unitPrice, ) } } @@ -313,13 +332,16 @@ open class SingularKit : KitIntegration(), ActivityListener, EventListener, bigDecimal: BigDecimal, bigDecimal1: BigDecimal, s: String, - map: Map + map: Map, ): List = emptyList() //endregion //endregion //region Deprecated Attribute Listener - override fun setUserAttribute(key: String, value: String) { + override fun setUserAttribute( + key: String, + value: String, + ) { // TODO: Debug these lines to understand the code val map = HashMap() if (MParticle.UserAttributes.AGE == key) { @@ -335,64 +357,80 @@ open class SingularKit : KitIntegration(), ActivityListener, EventListener, executeIfSingularInitialized( { Singular.eventJSON("UserAttribute", (map as Map<*, *>?)?.let { JSONObject(it) }) - }, forceInitSingular = false, "setUserAttribute" + }, + forceInitSingular = false, + "setUserAttribute", ) } } - override fun setUserAttributeList(s: String, list: List) {} + override fun setUserAttributeList( + s: String, + list: List, + ) {} override fun onIncrementUserAttribute( key: String?, incrementedBy: Number?, value: String?, - user: FilteredMParticleUser? + user: FilteredMParticleUser?, ) { } + override fun onRemoveUserAttribute( + s: String, + filteredMParticleUser: FilteredMParticleUser, + ) {} - override fun onRemoveUserAttribute(s: String, filteredMParticleUser: FilteredMParticleUser) {} override fun onSetUserAttribute( s: String, o: Any, - filteredMParticleUser: FilteredMParticleUser + filteredMParticleUser: FilteredMParticleUser, ) { } - override fun onSetUserTag(s: String, filteredMParticleUser: FilteredMParticleUser) {} + override fun onSetUserTag( + s: String, + filteredMParticleUser: FilteredMParticleUser, + ) {} + override fun onSetUserAttributeList( s: String, list: List, - filteredMParticleUser: FilteredMParticleUser + filteredMParticleUser: FilteredMParticleUser, ) { } override fun onSetAllUserAttributes( map: Map, map1: Map>, - filteredMParticleUser: FilteredMParticleUser + filteredMParticleUser: FilteredMParticleUser, ) { } - override fun supportsAttributeLists(): Boolean { - return false - } + override fun supportsAttributeLists(): Boolean = false override fun onConsentStateUpdated( consentState: ConsentState, consentState1: ConsentState, - filteredMParticleUser: FilteredMParticleUser + filteredMParticleUser: FilteredMParticleUser, ) { - executeIfSingularInitialized({ consentState.ccpaConsentState?.let { Singular.limitDataSharing(it.isConsented) } }, forceInitSingular = false, "onConsentStateUpdated") - } - override fun setAllUserAttributes(map: Map, map1: Map>) {} + override fun setAllUserAttributes( + map: Map, + map1: Map>, + ) {} + override fun removeUserAttribute(s: String) {} - override fun setUserIdentity(identityType: IdentityType, s: String) { + + override fun setUserIdentity( + identityType: IdentityType, + s: String, + ) { if (identityType == IdentityType.CustomerId) { executeIfSingularInitialized({ Singular.setCustomUserId(s) @@ -450,18 +488,20 @@ open class SingularKit : KitIntegration(), ActivityListener, EventListener, "Can't build Singular Config in the mParticle Kit" private var singularSettings: Map? = null - private var deviceAttributionCallback: DeviceAttributionCallback? = null; - private var customSdid: String? = null; - private var sdidAccessorHandler: SdidAccessorHandler? = null; + private var deviceAttributionCallback: DeviceAttributionCallback? = null + private var customSdid: String? = null + private var sdidAccessorHandler: SdidAccessorHandler? = null @JvmStatic fun setDeviceAttributionCallback(deviceAttributionCallback: DeviceAttributionCallback?) { - this.deviceAttributionCallback = deviceAttributionCallback; + this.deviceAttributionCallback = deviceAttributionCallback } - @JvmStatic fun setCustomSDID(customSDID: String?, sdidAccessorHandler: SdidAccessorHandler?) { + @JvmStatic fun setCustomSDID( + customSDID: String?, + sdidAccessorHandler: SdidAccessorHandler?, + ) { this.customSdid = customSDID this.sdidAccessorHandler = sdidAccessorHandler } - } } diff --git a/src/test/kotlin/com/mparticle/kits/SingularKitTest.kt b/src/test/kotlin/com/mparticle/kits/KitTests.kt similarity index 82% rename from src/test/kotlin/com/mparticle/kits/SingularKitTest.kt rename to src/test/kotlin/com/mparticle/kits/KitTests.kt index 4009618..880425c 100644 --- a/src/test/kotlin/com/mparticle/kits/SingularKitTest.kt +++ b/src/test/kotlin/com/mparticle/kits/KitTests.kt @@ -35,7 +35,7 @@ class KitTests { @Before fun setUp() { - //MockitoAnnotations.initMocks(this); + // MockitoAnnotations.initMocks(this); kit = MockSingularKit() settings = HashMap() settings[API_KEY] = "Test" @@ -76,8 +76,8 @@ class KitTests { Assert.fail( String.format( "logEventWithInfo failed with exception message:%s", - e.message - ) + e.message, + ), ) } finally { Assert.assertTrue(!result.isNullOrEmpty()) @@ -105,8 +105,8 @@ class KitTests { Assert.fail( String.format( "logEventWithInfo failed with exception message:%s", - e.message - ) + e.message, + ), ) } finally { Assert.assertTrue(!result.isNullOrEmpty()) @@ -128,22 +128,25 @@ class KitTests { fun logCommercePurchaseEvents() { var result: List? = null try { - val commerceEvent = CommerceEvent.Builder( - Product.PURCHASE, Product.Builder("Testing", "Unknown", 2.0) - .quantity(1.0) - .category("Category") + val commerceEvent = + CommerceEvent + .Builder( + Product.PURCHASE, + Product + .Builder("Testing", "Unknown", 2.0) + .quantity(1.0) + .category("Category") + .build(), + ).addProduct(Product.Builder("Unknown", "b", 1.0).build()) .build() - ) - .addProduct(Product.Builder("Unknown", "b", 1.0).build()) - .build() result = kit?.logEvent(commerceEvent) } catch (e: Exception) { e.printStackTrace() Assert.fail( String.format( "logCommercePurchaseEvents failed with exception message:%s", - e.message - ) + e.message, + ), ) } finally { Assert.assertTrue(!result.isNullOrEmpty()) @@ -154,22 +157,25 @@ class KitTests { fun logCommerceNonPurchaseEvents() { var result: List? = null try { - val commerceEvent = CommerceEvent.Builder( - Product.DETAIL, Product.Builder("Testing", "Unknown", 2.0) - .quantity(1.0) - .category("Category") + val commerceEvent = + CommerceEvent + .Builder( + Product.DETAIL, + Product + .Builder("Testing", "Unknown", 2.0) + .quantity(1.0) + .category("Category") + .build(), + ).addProduct(Product.Builder("Unknown", "b", 1.0).build()) .build() - ) - .addProduct(Product.Builder("Unknown", "b", 1.0).build()) - .build() result = kit?.logEvent(commerceEvent) } catch (e: Exception) { e.printStackTrace() Assert.fail( String.format( "logCommerceNonPurchaseEvents failed with exception message:%s", - e.message - ) + e.message, + ), ) } finally { Assert.assertTrue(!result.isNullOrEmpty()) @@ -199,4 +205,4 @@ class KitTests { private const val API_SECRET = "secret" private const val DDL_TIME_OUT = "ddlTimeout" } -} \ No newline at end of file +} diff --git a/src/test/kotlin/com/mparticle/kits/MockSingularKit.kt b/src/test/kotlin/com/mparticle/kits/MockSingularKit.kt index b0f940c..d96f8d5 100644 --- a/src/test/kotlin/com/mparticle/kits/MockSingularKit.kt +++ b/src/test/kotlin/com/mparticle/kits/MockSingularKit.kt @@ -7,35 +7,33 @@ import org.json.JSONException import org.json.JSONObject class MockSingularKit : SingularKit() { - override fun logEvent(commerceEvent: CommerceEvent): List { - return mutableListOf( + override fun logEvent(commerceEvent: CommerceEvent): List = + mutableListOf( ReportingMessage( this, commerceEvent.eventName, System.currentTimeMillis(), - HashMap() - ) + HashMap(), + ), ) - } - override fun logEvent(mpEvent: MPEvent): List { - return mutableListOf( + override fun logEvent(mpEvent: MPEvent): List = + mutableListOf( ReportingMessage( this, mpEvent.eventType.toString(), System.currentTimeMillis(), - HashMap() - ) + HashMap(), + ), ) - } override fun getConfiguration(): KitConfiguration? { try { return KitConfiguration.createKitConfiguration( JSONObject().put( "id", - MParticle.ServiceProviders.SINGULAR - ) + MParticle.ServiceProviders.SINGULAR, + ), ) } catch (e: JSONException) { e.printStackTrace() diff --git a/src/test/kotlin/com/singular/sdk/Singular.kt b/src/test/kotlin/com/singular/sdk/Singular.kt index 85d08ae..ce69bed 100644 --- a/src/test/kotlin/com/singular/sdk/Singular.kt +++ b/src/test/kotlin/com/singular/sdk/Singular.kt @@ -1,8 +1,6 @@ package com.singular.sdk -import org.json.JSONObject - object Singular { - var acceptEventJson = false - var acceptEvent = false -} \ No newline at end of file + var acceptEventJson = false + var acceptEvent = false +}