diff --git a/AdjustAdobeExtension/adobeextension/build.gradle b/AdjustAdobeExtension/adobeextension/build.gradle index 0c76b5c..1e11693 100644 --- a/AdjustAdobeExtension/adobeextension/build.gradle +++ b/AdjustAdobeExtension/adobeextension/build.gradle @@ -1,13 +1,14 @@ apply plugin: 'com.android.library' -apply from: 'publish.gradle' +apply plugin: 'maven-publish' +apply plugin: 'signing' android { - compileSdkVersion 32 - buildToolsVersion '32.0.0' + namespace 'com.adjust.adobeextension' + compileSdk 34 defaultConfig { - minSdkVersion 14 - targetSdkVersion 32 + minSdkVersion 19 + targetSdkVersion 34 consumerProguardFiles "consumer-rules.pro" } @@ -21,7 +22,100 @@ android { } dependencies { - implementation 'androidx.test.ext:junit:1.1.3' - implementation 'com.adjust.sdk:adjust-android:4.30.1' - implementation 'com.adobe.marketing.mobile:sdk-core:1.8.0' -} \ No newline at end of file + implementation 'androidx.test.ext:junit:1.1.5' + implementation 'com.adjust.sdk:adjust-android:4.38.1' + implementation 'com.adobe.marketing.mobile:core:2.6.1' +} + +// init +def libGroupId = 'com.adjust.adobeextension' +def libArtifactId = 'adobeextension' +def libVersion = '2.0.0' +def libName = 'Adjust Extension for Adobe Experience SDK' +def libDesc = 'This is the Android Adobe Mobile Extension of Adjust.' +def libUrl = 'https://github.com/adjust/android_adobe_extension' + +// read local properties +File localPropsFile = project.rootProject.file('local.properties') +if (localPropsFile.exists()) { + Properties p = new Properties() + new FileInputStream(localPropsFile).withCloseable { is -> + p.load(is) + } + p.each { name, value -> + ext[name] = value + } +} + +// Generate Source Jar +task sourceJar(type: Jar) { + setArchiveClassifier('sources') + from android.sourceSets.main.java.srcDirs +} + +// Create the publication with the pom configuration +def pomConfig = { + organization { + name 'adjust GmbH' + url 'http://www.adjust.com' + } + licenses { + license { + name 'MIT License' + url 'http://www.opensource.org/licenses/mit-license.php' + } + } + scm { + url 'git@github.com:adjust/android_adobe_extension.git' + connection 'scm:git:git@github.com:adjust/android_adobe_extension.git' + developerConnection 'scm:git:git@github.com:adjust/android_adobe_extension.git' + } + developers { + developer { + name 'Pedro Silva' + email 'pedro@adjust.com' + } + developer { + name 'Shashank Suhane' + email 'shashank@adjust.com' + } + developer { + name 'Ugljesa Erceg' + email 'ugi@adjust.com' + } + } +} + +publishing { + publications { + AdobeExtensionAar(MavenPublication) { + groupId libGroupId + artifactId libArtifactId + version libVersion + artifact(sourceJar) + artifact("$buildDir/outputs/aar/$libArtifactId-release.aar") + pom.withXml { + def root = asNode() + root.appendNode('description', libDesc) + root.appendNode('name', libName) + root.appendNode('url', libUrl) + root.children().last() + pomConfig + } + } + } + + repositories { + maven { + name = "mavencentral" + url = "https://oss.sonatype.org/service/local/staging/deploy/maven2/" + credentials { + username sonatypeUsername + password sonatypePassword + } + } + } +} + +signing { + sign publishing.publications +} diff --git a/AdjustAdobeExtension/adobeextension/publish.gradle b/AdjustAdobeExtension/adobeextension/publish.gradle deleted file mode 100644 index edebe3c..0000000 --- a/AdjustAdobeExtension/adobeextension/publish.gradle +++ /dev/null @@ -1,103 +0,0 @@ -apply plugin: 'maven-publish' -apply plugin: 'signing' - -// init -def libGroupId = 'com.adjust.adobeextension' -def libArtifactId = 'adobeextension' -def libVersion = '1.1.0' -def libName = 'Adjust Extension for Adobe Experience SDK' -def libDesc = 'This is the Android Adobe Mobile Extension of Adjust.' -def libUrl = 'https://github.com/adjust/android_adobe_extension' - -ext["signing.keyId"] = '' -ext["signing.password"] = '' -ext["signing.secretKeyRingFile"] = '' -ext["sonatypeUsername"] = '' -ext["sonatypePassword"] = '' - -// read local properties -File localPropsFile = project.rootProject.file('local.properties') -if (localPropsFile.exists()) { - Properties p = new Properties() - new FileInputStream(localPropsFile).withCloseable { is -> - p.load(is) - } - p.each { name, value -> - ext[name] = value - } -} - -// Generate Source Jar -task sourceJar(type: Jar) { - from android.sourceSets.main.java.srcDirs - classifier "sources" -} - -// Create the publication with the pom configuration -def pomConfig = { - organization { - name 'adjust GmbH' - url 'http://www.adjust.com' - } - licenses { - license { - name 'MIT License' - url 'http://www.opensource.org/licenses/mit-license.php' - } - } - scm { - url 'git@github.com:adjust/android_adobe_extension.git' - connection 'scm:git:git@github.com:adjust/android_adobe_extension.git' - developerConnection 'scm:git:git@github.com:adjust/android_adobe_extension.git' - } - developers { - developer { - name 'Pedro Silva' - email 'pedro@adjust.com' - } - developer { - name 'Shashank Suhane' - email 'shashank@adjust.com' - } - developer { - name 'Ugljesa Erceg' - email 'ugljesa@adjust.com' - } - } -} - -publishing { - publications { - AdobeExtensionAar(MavenPublication) { - groupId libGroupId - artifactId libArtifactId - version libVersion - artifact(sourceJar) - artifact("$buildDir/outputs/aar/$libArtifactId-release.aar") - pom.withXml { - def root = asNode() - root.appendNode('description', libDesc) - root.appendNode('name', libName) - root.appendNode('url', libUrl) - root.children().last() + pomConfig - } - } - } - - repositories { - maven { - name = "mavencentral" - url = "https://oss.sonatype.org/service/local/staging/deploy/maven2/" - credentials { - username sonatypeUsername - password sonatypePassword - } - } - } -} - -signing { - sign publishing.publications -} - - diff --git a/AdjustAdobeExtension/adobeextension/src/main/AndroidManifest.xml b/AdjustAdobeExtension/adobeextension/src/main/AndroidManifest.xml index cfa38f9..5e4420e 100644 --- a/AdjustAdobeExtension/adobeextension/src/main/AndroidManifest.xml +++ b/AdjustAdobeExtension/adobeextension/src/main/AndroidManifest.xml @@ -1,6 +1,5 @@ - + EXTENSION = AdjustAdobeExtensionInternal.class; + public static final String ADOBE_ADJUST_ACTION_TRACK_EVENT = "adj.trackEvent"; + public static final String ADOBE_ADJUST_ACTION_SET_PUSH_TOKEN = "adj.setPushToken"; + public static final String ADOBE_ADJUST_EVENT_TOKEN = "adj.eventToken"; + public static final String ADOBE_ADJUST_PUSH_TOKEN = "adj.pushToken"; + public static final String ADOBE_ADJUST_CURRENCY = "adj.currency"; + public static final String ADOBE_ADJUST_REVENUE = "adj.revenue"; + public static final String ADOBE_ADJUST_EVENT_CALLBACK_PARAM_PREFIX = "adj.event.callback."; + public static final String ADOBE_ADJUST_EVENT_PARTNER_PARAM_PREFIX = "adj.event.partner."; + + private static final String LOG_SOURCE = AdjustAdobeExtension.class.getSimpleName(); + /** * Adjust Sdk Config passed to Adobe Adjust Extension. * It will be used for initialization of Adjust Sdk. @@ -30,34 +43,32 @@ private AdjustAdobeExtension() { * Method used to register Adjust Adobe Extension. * @param config extension config to initialize Adjust Sdk */ - public static void registerExtension(final AdjustAdobeExtensionConfig config) { + public static void setConfiguration(final AdjustAdobeExtensionConfig config) { if (config == null) { - MobileCore.log(LoggingMode.DEBUG, LOG_TAG, - "AdjustAdobeExtensionConfig is null"); + Log.debug(LOG_EXTENSION, LOG_SOURCE, "AdjustAdobeExtensionConfig is null"); return; } if (config.getEnvironment() == null) { - MobileCore.log(LoggingMode.DEBUG, LOG_TAG, - "AdjustAdobeExtensionConfig environment is null"); + Log.debug(LOG_EXTENSION, LOG_SOURCE, "AdjustAdobeExtensionConfig environment is null"); return; } - ExtensionErrorCallback errorCallback = - new ExtensionErrorCallback() { - @Override + adjustAdobeExtensionConfig = config; - public void error(final ExtensionError extensionError) { - MobileCore.log(LoggingMode.ERROR, LOG_TAG, - "Failed to register AdjustAdobeExtension" + - extensionError != null ? - ", error" + extensionError.getErrorName() - : " without error"); - }}; + Log.debug(LOG_EXTENSION, LOG_SOURCE, "Adjust Adobe Extension initialized"); + } - if (MobileCore.registerExtension(AdjustAdobeExtensionInternal.class, errorCallback)) { - adjustAdobeExtensionConfig = config; - } + /** + * Method used to process deep link. + * + * @param url Deep link URL to process + * @param context Application context + */ + public static void openUrl(Uri url, Context context) { + // Pass deep link to Adjust in order to potentially reattribute user. + Log.debug(LOG_EXTENSION, LOG_SOURCE, "openUrl: " + url); + Adjust.appWillOpenUrl(url, context); } /** diff --git a/AdjustAdobeExtension/adobeextension/src/main/java/com/adjust/adobeextension/AdjustAdobeExtensionConstants.java b/AdjustAdobeExtension/adobeextension/src/main/java/com/adjust/adobeextension/AdjustAdobeExtensionConstants.java index 8804b54..1827a2d 100644 --- a/AdjustAdobeExtension/adobeextension/src/main/java/com/adjust/adobeextension/AdjustAdobeExtensionConstants.java +++ b/AdjustAdobeExtension/adobeextension/src/main/java/com/adjust/adobeextension/AdjustAdobeExtensionConstants.java @@ -1,17 +1,13 @@ package com.adjust.adobeextension; class AdjustAdobeExtensionConstants { - static final String LOG_TAG = "AdjustAdobeExtension"; + static final String LOG_EXTENSION = "AdjustAdobeExtension"; static final String EXTENSION_NAME = "com.adjust.adobeextension"; - static final String EXTENSION_VERSION = "adobe_ext1.1.0"; + static final String EXTENSION_VERSION = "adobe_ext2.0.0"; static final String ADOBE_MODULE_CONFIGURATION = "com.adobe.module.configuration"; static final String ADOBE_SHARED_STATE_OWNER = "stateowner"; - static final String EVENT_TYPE_ADOBE_HUB = "com.adobe.eventType.hub"; - static final String EVENT_TYPE_ADOBE_GENERIC_TRACK = "com.adobe.eventType.generic.track"; - static final String EVENT_SOURCE_ADOBE_SHARED_STATE = "com.adobe.eventSource.sharedState"; - static final String EVENT_SOURCE_ADOBE_REQUEST_CONTENT = "com.adobe.eventSource.requestContent"; static final String EVENT_KEY_ACTION = "action"; static final String EVENT_KEY_CONTEXT_DATA = "contextdata"; diff --git a/AdjustAdobeExtension/adobeextension/src/main/java/com/adjust/adobeextension/AdjustAdobeExtensionInternal.java b/AdjustAdobeExtension/adobeextension/src/main/java/com/adjust/adobeextension/AdjustAdobeExtensionInternal.java index c077f76..c3c3a94 100644 --- a/AdjustAdobeExtension/adobeextension/src/main/java/com/adjust/adobeextension/AdjustAdobeExtensionInternal.java +++ b/AdjustAdobeExtension/adobeextension/src/main/java/com/adjust/adobeextension/AdjustAdobeExtensionInternal.java @@ -1,32 +1,31 @@ package com.adjust.adobeextension; +import static com.adjust.adobeextension.AdjustAdobeExtensionConstants.ADJUST_KEY_APP_TOKEN; +import static com.adjust.adobeextension.AdjustAdobeExtensionConstants.ADJUST_KEY_TRACK_ATTRIBUTION; +import static com.adjust.adobeextension.AdjustAdobeExtensionConstants.ADOBE_MODULE_CONFIGURATION; +import static com.adjust.adobeextension.AdjustAdobeExtensionConstants.EVENT_KEY_ACTION; +import static com.adjust.adobeextension.AdjustAdobeExtensionConstants.EVENT_KEY_CONTEXT_DATA; +import static com.adjust.adobeextension.AdjustAdobeExtensionConstants.EXTENSION_NAME; +import static com.adjust.adobeextension.AdjustAdobeExtensionConstants.EXTENSION_VERSION; +import static com.adjust.adobeextension.AdjustAdobeExtensionConstants.LOG_EXTENSION; + +import com.adobe.marketing.mobile.services.Log; + +import androidx.annotation.NonNull; + import com.adobe.marketing.mobile.Event; +import com.adobe.marketing.mobile.EventSource; +import com.adobe.marketing.mobile.EventType; import com.adobe.marketing.mobile.Extension; import com.adobe.marketing.mobile.ExtensionApi; -import com.adobe.marketing.mobile.ExtensionError; -import com.adobe.marketing.mobile.ExtensionErrorCallback; -import com.adobe.marketing.mobile.ExtensionUnexpectedError; -import com.adobe.marketing.mobile.LoggingMode; -import com.adobe.marketing.mobile.MobileCore; +import com.adobe.marketing.mobile.SharedStateResolution; +import com.adobe.marketing.mobile.SharedStateResult; import java.util.Map; import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; -import static com.adjust.adobeextension.AdjustAdobeExtensionConstants.ADJUST_KEY_APP_TOKEN; -import static com.adjust.adobeextension.AdjustAdobeExtensionConstants.ADJUST_KEY_TRACK_ATTRIBUTION; -import static com.adjust.adobeextension.AdjustAdobeExtensionConstants.ADOBE_MODULE_CONFIGURATION; -import static com.adjust.adobeextension.AdjustAdobeExtensionConstants.EVENT_KEY_CONTEXT_DATA; -import static com.adjust.adobeextension.AdjustAdobeExtensionConstants.EVENT_SOURCE_ADOBE_REQUEST_CONTENT; -import static com.adjust.adobeextension.AdjustAdobeExtensionConstants.EVENT_SOURCE_ADOBE_SHARED_STATE; -import static com.adjust.adobeextension.AdjustAdobeExtensionConstants.EVENT_KEY_ACTION; -import static com.adjust.adobeextension.AdjustAdobeExtensionConstants.EVENT_TYPE_ADOBE_GENERIC_TRACK; -import static com.adjust.adobeextension.AdjustAdobeExtensionConstants.EVENT_TYPE_ADOBE_HUB; -import static com.adjust.adobeextension.AdjustAdobeExtensionConstants.EXTENSION_NAME; -import static com.adjust.adobeextension.AdjustAdobeExtensionConstants.EXTENSION_VERSION; -import static com.adjust.adobeextension.AdjustAdobeExtensionConstants.LOG_TAG; - /** * Internal class for Adjust Adobe Extension implementation. * It registers and handles configuration & generic track event. @@ -35,6 +34,7 @@ class AdjustAdobeExtensionInternal extends Extension { + private static final String LOG_SOURCE = AdjustAdobeExtensionInternal.class.getSimpleName(); private final ConcurrentLinkedQueue eventQueue; private final ExecutorService executorService; private final AdjustSdkApiHandler adjustSdkApiHandler; @@ -50,6 +50,7 @@ protected AdjustAdobeExtensionInternal(final ExtensionApi extensionApi) { registerListenerForGenericTrackEvent(extensionApi); } + @NonNull @Override protected String getName() { return EXTENSION_NAME; @@ -60,17 +61,6 @@ protected String getVersion() { return String.format("%s@%s", EXTENSION_VERSION, adjustSdkApiHandler.getVersion()); } - @Override - protected void onUnexpectedError(final ExtensionUnexpectedError extensionUnexpectedError) { - super.onUnexpectedError(extensionUnexpectedError); - - MobileCore.log(LoggingMode.ERROR, LOG_TAG, - "ExtensionUnexpectedError" - + extensionUnexpectedError != null ? - ": " + extensionUnexpectedError.getMessage() - : " with null error"); - } - protected void handleConfigurationEvent(final Event event) { executorService.execute(new Runnable() { @Override @@ -91,37 +81,13 @@ public void run() { // internal methods private void registerListenerForConfigurationEvent(final ExtensionApi extensionApi) { - ExtensionErrorCallback - errorCallback = new ExtensionErrorCallback() { - @Override - public void error(final ExtensionError extensionError) { - MobileCore.log(LoggingMode.ERROR, LOG_TAG, - "Failed to register listener for config update event, error : " + - extensionError.getErrorName()); - } - }; - - extensionApi.registerEventListener( - EVENT_TYPE_ADOBE_HUB, - EVENT_SOURCE_ADOBE_SHARED_STATE, - AdjustAdobeExtensionListener.class, errorCallback); + extensionApi.registerEventListener(EventType.HUB, + EventSource.SHARED_STATE, new AdjustAdobeExtensionListener(this)); } private void registerListenerForGenericTrackEvent(final ExtensionApi extensionApi) { - ExtensionErrorCallback - errorCallback = new ExtensionErrorCallback() { - @Override - public void error(final ExtensionError extensionError) { - MobileCore.log(LoggingMode.ERROR, LOG_TAG, - "Failed to register listener for generic track event, error : " + - extensionError.getErrorName()); - } - }; - - extensionApi.registerEventListener( - EVENT_TYPE_ADOBE_GENERIC_TRACK, - EVENT_SOURCE_ADOBE_REQUEST_CONTENT, - AdjustAdobeExtensionListener.class, errorCallback); + extensionApi.registerEventListener(EventType.GENERIC_TRACK, + EventSource.REQUEST_CONTENT, new AdjustAdobeExtensionListener(this)); } /** @@ -129,36 +95,32 @@ public void error(final ExtensionError extensionError) { * Also calls to process generic track if there are any queued up */ private void handleConfigurationEventAsync(final Event event) { - ExtensionErrorCallback - errorCallback = new ExtensionErrorCallback() { - @Override - public void error(final ExtensionError extensionError) { - MobileCore.log(LoggingMode.ERROR, LOG_TAG, - "Failed to retrieve the shared state, error : " + - extensionError.getErrorName()); - } - }; - Map sharedEventState = getApi().getSharedEventState( + SharedStateResult sharedStateResult = getApi().getSharedState( ADOBE_MODULE_CONFIGURATION, event, - errorCallback); + false, + SharedStateResolution.ANY); + + if (sharedStateResult == null) { + Log.error(LOG_EXTENSION, LOG_SOURCE,"Failed to handle configuration event, sharedStateResult is null"); + return; + } + + Map sharedStateResultMap = sharedStateResult.getValue(); - if (sharedEventState == null) { - MobileCore.log(LoggingMode.ERROR, LOG_TAG, - "Failed to handle configuration event, " - + "sharedEventState is null"); + if (sharedStateResultMap == null) { + Log.error(LOG_EXTENSION, LOG_SOURCE,"Failed to handle configuration event, sharedEventState is null"); return; } - Object appTokenObject = sharedEventState.get(ADJUST_KEY_APP_TOKEN); - Object shouldTrackAttributionObject = sharedEventState.get(ADJUST_KEY_TRACK_ATTRIBUTION); + Object appTokenObject = sharedStateResultMap.get(ADJUST_KEY_APP_TOKEN); + Object shouldTrackAttributionObject = sharedStateResultMap.get(ADJUST_KEY_TRACK_ATTRIBUTION); if (!(appTokenObject instanceof String) || !(shouldTrackAttributionObject instanceof Boolean)) { - MobileCore.log(LoggingMode.ERROR, LOG_TAG, - "Failed to handle configuration event, " + Log.error(LOG_EXTENSION, LOG_SOURCE, "Failed to handle configuration event, " + "appToken or shouldTrackAttribution are not instance of correct type"); return; } diff --git a/AdjustAdobeExtension/adobeextension/src/main/java/com/adjust/adobeextension/AdjustAdobeExtensionListener.java b/AdjustAdobeExtension/adobeextension/src/main/java/com/adjust/adobeextension/AdjustAdobeExtensionListener.java index 54038a5..36a7b16 100644 --- a/AdjustAdobeExtension/adobeextension/src/main/java/com/adjust/adobeextension/AdjustAdobeExtensionListener.java +++ b/AdjustAdobeExtension/adobeextension/src/main/java/com/adjust/adobeextension/AdjustAdobeExtensionListener.java @@ -1,63 +1,57 @@ package com.adjust.adobeextension; +import static com.adjust.adobeextension.AdjustAdobeExtensionConstants.ADOBE_MODULE_CONFIGURATION; +import static com.adjust.adobeextension.AdjustAdobeExtensionConstants.ADOBE_SHARED_STATE_OWNER; +import static com.adjust.adobeextension.AdjustAdobeExtensionConstants.LOG_EXTENSION; + +import com.adobe.marketing.mobile.services.Log; + import com.adobe.marketing.mobile.Event; -import com.adobe.marketing.mobile.ExtensionApi; -import com.adobe.marketing.mobile.ExtensionListener; -import com.adobe.marketing.mobile.LoggingMode; -import com.adobe.marketing.mobile.MobileCore; +import com.adobe.marketing.mobile.EventType; +import com.adobe.marketing.mobile.ExtensionEventListener; import java.util.Map; -import static com.adjust.adobeextension.AdjustAdobeExtensionConstants.ADOBE_MODULE_CONFIGURATION; -import static com.adjust.adobeextension.AdjustAdobeExtensionConstants.ADOBE_SHARED_STATE_OWNER; -import static com.adjust.adobeextension.AdjustAdobeExtensionConstants.EVENT_TYPE_ADOBE_GENERIC_TRACK; -import static com.adjust.adobeextension.AdjustAdobeExtensionConstants.EVENT_TYPE_ADOBE_HUB; -import static com.adjust.adobeextension.AdjustAdobeExtensionConstants.LOG_TAG; - /** * Internal class to hear all events meant for Adobe Extension. * It filters configuration & generic track event and delegate those to Adjust extension. */ class AdjustAdobeExtensionListener - extends ExtensionListener -{ - protected AdjustAdobeExtensionListener(final ExtensionApi extension, - final String type, - final String source) - { - super(extension, type, source); + implements ExtensionEventListener { + + private static final String LOG_SOURCE = AdjustAdobeExtensionListener.class.getSimpleName(); + + AdjustAdobeExtensionInternal adjustAdobeExtension; + + public AdjustAdobeExtensionListener(AdjustAdobeExtensionInternal extension) { + adjustAdobeExtension = extension; } @Override public void hear(final Event event) { if (event == null) { - MobileCore.log(LoggingMode.ERROR, LOG_TAG, - "Failed to hear event in listener, event is null"); + Log.error(LOG_EXTENSION, LOG_SOURCE,"Failed to hear event in listener, event is null"); return; } String eventType = event.getType(); if (eventType == null) { - MobileCore.log(LoggingMode.ERROR, LOG_TAG, - "Failed to hear event in listener, eventType is null"); + Log.error(LOG_EXTENSION, LOG_SOURCE,"Failed to hear event in listener, eventType is null"); return; } Map eventData = event.getEventData(); if (eventData == null) { - MobileCore.log(LoggingMode.ERROR, LOG_TAG, - "Failed to hear event in listener, eventData is null"); + Log.error(LOG_EXTENSION, LOG_SOURCE, "Failed to hear event in listener, eventData is null"); return; } - final AdjustAdobeExtensionInternal adjustAdobeExtension = getParentExtension(); if (adjustAdobeExtension == null) { - MobileCore.log(LoggingMode.ERROR, LOG_TAG, - "Failed to hear event in listener, adjustAdobeExtension is null"); + Log.error(LOG_EXTENSION, LOG_SOURCE,"Failed to hear event in listener, adjustAdobeExtension is null"); return; } - if (EVENT_TYPE_ADOBE_HUB.equalsIgnoreCase(eventType)) { + if (EventType.HUB.equalsIgnoreCase(eventType)) { Object adobeSharedStateOwner = eventData.get(ADOBE_SHARED_STATE_OWNER); if (adobeSharedStateOwner instanceof String @@ -66,13 +60,8 @@ public void hear(final Event event) { adjustAdobeExtension.handleConfigurationEvent(event); } - } else if (EVENT_TYPE_ADOBE_GENERIC_TRACK.equalsIgnoreCase(eventType)) { + } else if (EventType.GENERIC_TRACK.equalsIgnoreCase(eventType)) { adjustAdobeExtension.handleGenericTrackEvent(event); } } - - @Override - protected AdjustAdobeExtensionInternal getParentExtension() { - return (AdjustAdobeExtensionInternal) super.getParentExtension(); - } } diff --git a/AdjustAdobeExtension/adobeextension/src/main/java/com/adjust/adobeextension/AdjustSdkApiHandler.java b/AdjustAdobeExtension/adobeextension/src/main/java/com/adjust/adobeextension/AdjustSdkApiHandler.java index 2eeecd9..ece846c 100644 --- a/AdjustAdobeExtension/adobeextension/src/main/java/com/adjust/adobeextension/AdjustSdkApiHandler.java +++ b/AdjustAdobeExtension/adobeextension/src/main/java/com/adjust/adobeextension/AdjustSdkApiHandler.java @@ -1,9 +1,19 @@ package com.adjust.adobeextension; +import static com.adjust.adobeextension.AdjustAdobeExtensionConstants.ADJUST_ACTION_SET_PUSH_TOKEN; +import static com.adjust.adobeextension.AdjustAdobeExtensionConstants.ADJUST_KEY_EVENT_CALLBACK_PARAM; +import static com.adjust.adobeextension.AdjustAdobeExtensionConstants.ADJUST_KEY_EVENT_CURRENCY; +import static com.adjust.adobeextension.AdjustAdobeExtensionConstants.ADJUST_KEY_EVENT_PARTNER_PARAM; +import static com.adjust.adobeextension.AdjustAdobeExtensionConstants.ADJUST_KEY_EVENT_REVENUE; +import static com.adjust.adobeextension.AdjustAdobeExtensionConstants.ADJUST_KEY_EVENT_TOKEN; +import static com.adjust.adobeextension.AdjustAdobeExtensionConstants.ADJUST_KEY_PUSH_TOKEN_PARAM; +import static com.adjust.adobeextension.AdjustAdobeExtensionConstants.LOG_EXTENSION; + import android.app.Activity; import android.app.Application; import android.content.Context; import android.os.Bundle; +import com.adobe.marketing.mobile.services.Log; import com.adjust.sdk.Adjust; import com.adjust.sdk.AdjustAttribution; @@ -11,26 +21,17 @@ import com.adjust.sdk.AdjustEvent; import com.adjust.sdk.LogLevel; import com.adjust.sdk.OnAttributionChangedListener; -import com.adobe.marketing.mobile.LoggingMode; import com.adobe.marketing.mobile.MobileCore; import java.util.HashMap; import java.util.Map; -import static com.adjust.adobeextension.AdjustAdobeExtensionConstants.ADJUST_ACTION_SET_PUSH_TOKEN; -import static com.adjust.adobeextension.AdjustAdobeExtensionConstants.ADJUST_KEY_EVENT_CALLBACK_PARAM; -import static com.adjust.adobeextension.AdjustAdobeExtensionConstants.ADJUST_KEY_EVENT_CURRENCY; -import static com.adjust.adobeextension.AdjustAdobeExtensionConstants.ADJUST_KEY_EVENT_PARTNER_PARAM; -import static com.adjust.adobeextension.AdjustAdobeExtensionConstants.ADJUST_KEY_EVENT_REVENUE; -import static com.adjust.adobeextension.AdjustAdobeExtensionConstants.ADJUST_KEY_EVENT_TOKEN; -import static com.adjust.adobeextension.AdjustAdobeExtensionConstants.ADJUST_KEY_PUSH_TOKEN_PARAM; -import static com.adjust.adobeextension.AdjustAdobeExtensionConstants.LOG_TAG; - /** * Internal class to interface with Adjust Sdk. * It filters configuration & generic track event and delegate those to Adjust extension. */ class AdjustSdkApiHandler { + private static final String LOG_SOURCE = AdjustSdkApiHandler.class.getSimpleName(); /** * Singleton instance of AdjustSdkApiHandler */ @@ -71,28 +72,24 @@ protected static AdjustSdkApiHandler getInstance() { */ protected void initSdk(final String appToken, final boolean shouldTrackAttribution) { if (sdkInitialised) { - MobileCore.log(LoggingMode.WARNING, LOG_TAG, - "Cannot initialise SDK, already initialised"); + Log.warning(LOG_EXTENSION, LOG_SOURCE,"Cannot initialise SDK, already initialised"); return; } Application application = MobileCore.getApplication(); if (application == null) { - MobileCore.log(LoggingMode.ERROR, LOG_TAG, - "Cannot initialise SDK, application object is null"); + Log.error(LOG_EXTENSION, LOG_SOURCE,"Cannot initialise SDK, application object is null"); return; } if (appToken == null) { - MobileCore.log(LoggingMode.ERROR, LOG_TAG, - "Cannot initialise SDK, appToken is null or empty"); + Log.error(LOG_EXTENSION, LOG_SOURCE,"Cannot initialise SDK, appToken is null or empty"); } AdjustAdobeExtensionConfig adjustAdobeExtensionConfig = AdjustAdobeExtension.getAdjustAdobeExtensionConfig(); if (adjustAdobeExtensionConfig == null) { - MobileCore.log(LoggingMode.ERROR, LOG_TAG, - "Cannot initialise SDK, adjust extension config is null"); + Log.error(LOG_EXTENSION, LOG_SOURCE,"Cannot initialise SDK, adjust extension config is null"); } AdjustConfig adjustConfig = getAdjustConfig(application.getApplicationContext(), @@ -127,15 +124,13 @@ protected void processEvent(final String action, final Map conte */ protected void setPushToken(final Map contextData) { if (contextData == null) { - MobileCore.log(LoggingMode.DEBUG, LOG_TAG, - "Cannot set push token, contextData is null"); + Log.debug(LOG_EXTENSION, LOG_SOURCE,"Cannot set push token, contextData is null"); return; } String pushToken = contextData.get(ADJUST_KEY_PUSH_TOKEN_PARAM); if (pushToken == null) { - MobileCore.log(LoggingMode.DEBUG, LOG_TAG, - "Cannot set, push token is null"); + Log.debug(LOG_EXTENSION, LOG_SOURCE,"Cannot set, push token is null"); return; } @@ -148,15 +143,13 @@ protected void setPushToken(final Map contextData) { */ protected void trackEvent(final Map contextData) { if (contextData == null) { - MobileCore.log(LoggingMode.DEBUG, LOG_TAG, - "Cannot track event, contextData is null"); + Log.debug(LOG_EXTENSION, LOG_SOURCE,"Cannot track event, contextData is null"); return; } String eventToken = contextData.get(ADJUST_KEY_EVENT_TOKEN); if (eventToken == null) { - MobileCore.log(LoggingMode.DEBUG, LOG_TAG, - "Cannot track event, eventToken is null"); + Log.debug(LOG_EXTENSION, LOG_SOURCE,"Cannot track event, eventToken is null"); return; } @@ -210,28 +203,24 @@ protected String getVersion() { */ protected boolean registerActivityLifecycleCallbacks(final Context context) { if (application != null) { - MobileCore.log(LoggingMode.DEBUG, LOG_TAG, - "Cannot register activity lifecycle callbacks more than once"); + Log.debug(LOG_EXTENSION, LOG_SOURCE,"Cannot register activity lifecycle callbacks more than once"); return false; } if (context == null) { - MobileCore.log(LoggingMode.DEBUG, LOG_TAG, - "Cannot register activity lifecycle callbacks without context"); + Log.debug(LOG_EXTENSION, LOG_SOURCE,"Cannot register activity lifecycle callbacks without context"); return false; } final Context applicationContext = context.getApplicationContext(); if (!(applicationContext instanceof Application)) { - MobileCore.log(LoggingMode.DEBUG, LOG_TAG, - "Cannot register activity lifecycle callbacks " + Log.debug(LOG_EXTENSION, LOG_SOURCE,"Cannot register activity lifecycle callbacks " + "without application context as Application"); return false; } - MobileCore.log(LoggingMode.DEBUG, LOG_TAG, - "Registering activity lifecycle callbacks"); + Log.debug(LOG_EXTENSION, LOG_SOURCE,"Registering activity lifecycle callbacks"); application = (Application) applicationContext; diff --git a/AdjustAdobeExtension/build.gradle b/AdjustAdobeExtension/build.gradle index d5d8b85..2b81b0e 100644 --- a/AdjustAdobeExtension/build.gradle +++ b/AdjustAdobeExtension/build.gradle @@ -5,7 +5,7 @@ buildscript { mavenCentral() } dependencies { - classpath 'com.android.tools.build:gradle:7.1.3' + classpath 'com.android.tools.build:gradle:8.1.4' } } diff --git a/AdjustAdobeExtension/example-app/build.gradle b/AdjustAdobeExtension/example-app/build.gradle index 693524f..fdb7eee 100644 --- a/AdjustAdobeExtension/example-app/build.gradle +++ b/AdjustAdobeExtension/example-app/build.gradle @@ -9,13 +9,14 @@ repositories { } android { - compileSdkVersion 32 - buildToolsVersion "32.0.0" + namespace 'com.adjust.examples' + + compileSdk 34 defaultConfig { applicationId "com.adjust.examples" - minSdkVersion 16 - targetSdkVersion 32 + minSdkVersion 19 + targetSdkVersion 34 versionCode 1 versionName "1.0" @@ -36,21 +37,21 @@ android { dependencies { - implementation 'androidx.appcompat:appcompat:1.4.2' - implementation 'com.google.android.material:material:1.6.1' + implementation 'androidx.appcompat:appcompat:1.6.1' + implementation 'com.google.android.material:material:1.11.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' - implementation 'androidx.navigation:navigation-fragment:2.5.0' - implementation 'androidx.navigation:navigation-ui:2.5.0' + implementation 'androidx.navigation:navigation-fragment:2.7.6' + implementation 'androidx.navigation:navigation-ui:2.7.6' testImplementation 'junit:junit:4.13.2' - androidTestImplementation 'androidx.test.ext:junit:1.1.3' - androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' + androidTestImplementation 'androidx.test.ext:junit:1.1.5' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1' - implementation 'com.adobe.marketing.mobile:sdk-core:1.8.0' + implementation 'com.adobe.marketing.mobile:core:2.6.1' implementation 'com.google.android.gms:play-services-ads-identifier:18.0.1' implementation 'com.android.installreferrer:installreferrer:2.2' - implementation 'com.adjust.sdk:adjust-android:4.30.1' + implementation 'com.adjust.sdk:adjust-android:4.38.1' implementation project(path: ':adobeextension') - //implementation 'com.adjust.adobeextension:adobeextension:1.1.0' + //implementation 'com.adjust.adobeextension:adobeextension:2.0.0' } \ No newline at end of file diff --git a/AdjustAdobeExtension/example-app/src/main/AndroidManifest.xml b/AdjustAdobeExtension/example-app/src/main/AndroidManifest.xml index 40d5ba2..77d3cb5 100644 --- a/AdjustAdobeExtension/example-app/src/main/AndroidManifest.xml +++ b/AdjustAdobeExtension/example-app/src/main/AndroidManifest.xml @@ -1,6 +1,6 @@ + xmlns:tools="http://schemas.android.com/tools"> @@ -23,6 +23,12 @@ + + + + + + diff --git a/AdjustAdobeExtension/example-app/src/main/java/com/adjust/examples/MainActivity.java b/AdjustAdobeExtension/example-app/src/main/java/com/adjust/examples/MainActivity.java index add3dd3..2ebc4ff 100644 --- a/AdjustAdobeExtension/example-app/src/main/java/com/adjust/examples/MainActivity.java +++ b/AdjustAdobeExtension/example-app/src/main/java/com/adjust/examples/MainActivity.java @@ -1,10 +1,13 @@ package com.adjust.examples; +import android.content.Intent; +import android.net.Uri; import android.os.Bundle; import android.view.View; import androidx.appcompat.app.AppCompatActivity; +import com.adjust.adobeextension.AdjustAdobeExtension; import com.adobe.marketing.mobile.MobileCore; import java.util.HashMap; @@ -17,50 +20,54 @@ public class MainActivity extends AppCompatActivity { void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); + + Intent intent = getIntent(); + Uri data = intent.getData(); + AdjustAdobeExtension.openUrl(data, getApplicationContext()); } public void trackSimpleEvent(View view) { - String action = "adj.trackEvent"; + String action = AdjustAdobeExtension.ADOBE_ADJUST_ACTION_TRACK_EVENT; Map contextData= new HashMap(); - contextData.put("adj.eventToken", "g3mfiw"); + contextData.put(AdjustAdobeExtension.ADOBE_ADJUST_EVENT_TOKEN, "g3mfiw"); MobileCore.trackAction(action, contextData); } public void trackRevenueEvent(View view) { - String action = "adj.trackEvent"; + String action = AdjustAdobeExtension.ADOBE_ADJUST_ACTION_TRACK_EVENT; Map contextData= new HashMap(); - contextData.put("adj.eventToken", "a4fd35"); - contextData.put("adj.revenue", "0.01"); - contextData.put("adj.currency", "EUR"); + contextData.put(AdjustAdobeExtension.ADOBE_ADJUST_EVENT_TOKEN, "a4fd35"); + contextData.put(AdjustAdobeExtension.ADOBE_ADJUST_REVENUE, "0.01"); + contextData.put(AdjustAdobeExtension.ADOBE_ADJUST_CURRENCY, "EUR"); MobileCore.trackAction(action, contextData); } public void trackCallbackEvent(View view) { - String action = "adj.trackEvent"; + String action = AdjustAdobeExtension.ADOBE_ADJUST_ACTION_TRACK_EVENT; Map contextData= new HashMap(); - contextData.put("adj.eventToken", "34vgg9"); - contextData.put("adj.event.callback.key1", "value1"); - contextData.put("adj.event.callback.key2", "value2"); + contextData.put(AdjustAdobeExtension.ADOBE_ADJUST_EVENT_TOKEN, "34vgg9"); + contextData.put(AdjustAdobeExtension.ADOBE_ADJUST_EVENT_CALLBACK_PARAM_PREFIX + "key1", "value1"); + contextData.put(AdjustAdobeExtension.ADOBE_ADJUST_EVENT_CALLBACK_PARAM_PREFIX + "key2", "value2"); MobileCore.trackAction(action, contextData); } public void trackPartnerEvent(View view) { - String action = "adj.trackEvent"; + String action = AdjustAdobeExtension.ADOBE_ADJUST_ACTION_TRACK_EVENT; Map contextData= new HashMap(); - contextData.put("adj.eventToken", "w788qs"); - contextData.put("adj.event.partner.key1", "value1"); - contextData.put("adj.event.partner.key2", "value2"); + contextData.put(AdjustAdobeExtension.ADOBE_ADJUST_EVENT_TOKEN, "w788qs"); + contextData.put(AdjustAdobeExtension.ADOBE_ADJUST_EVENT_PARTNER_PARAM_PREFIX + "key1", "value1"); + contextData.put(AdjustAdobeExtension.ADOBE_ADJUST_EVENT_PARTNER_PARAM_PREFIX + "key2", "value2"); MobileCore.trackAction(action, contextData); } public void setPushToken(View view) { - String action = "adj.setPushToken"; + String action = AdjustAdobeExtension.ADOBE_ADJUST_ACTION_SET_PUSH_TOKEN; Map contextData= new HashMap(); - contextData.put("adj.pushToken", "your_push_token"); + contextData.put(AdjustAdobeExtension.ADOBE_ADJUST_PUSH_TOKEN, "your_push_token"); MobileCore.trackAction(action, contextData); } diff --git a/AdjustAdobeExtension/example-app/src/main/java/com/adjust/examples/MainApp.java b/AdjustAdobeExtension/example-app/src/main/java/com/adjust/examples/MainApp.java index 83b4f7c..ad49068 100644 --- a/AdjustAdobeExtension/example-app/src/main/java/com/adjust/examples/MainApp.java +++ b/AdjustAdobeExtension/example-app/src/main/java/com/adjust/examples/MainApp.java @@ -7,23 +7,15 @@ import com.adjust.adobeextension.AdjustAdobeExtension; import com.adjust.adobeextension.AdjustAdobeExtensionConfig; import com.adjust.sdk.AdjustAttribution; -import com.adjust.sdk.AdjustEventFailure; -import com.adjust.sdk.AdjustEventSuccess; -import com.adjust.sdk.AdjustSessionFailure; -import com.adjust.sdk.AdjustSessionSuccess; import com.adjust.sdk.OnAttributionChangedListener; import com.adjust.sdk.OnDeeplinkResponseListener; -import com.adjust.sdk.OnEventTrackingFailedListener; -import com.adjust.sdk.OnEventTrackingSucceededListener; -import com.adjust.sdk.OnSessionTrackingFailedListener; -import com.adjust.sdk.OnSessionTrackingSucceededListener; import com.adobe.marketing.mobile.AdobeCallback; -import com.adobe.marketing.mobile.Identity; -import com.adobe.marketing.mobile.InvalidInitException; -import com.adobe.marketing.mobile.Lifecycle; +import com.adobe.marketing.mobile.Extension; import com.adobe.marketing.mobile.LoggingMode; import com.adobe.marketing.mobile.MobileCore; -import com.adobe.marketing.mobile.Signal; + +import java.util.Arrays; +import java.util.List; public class MainApp extends Application { @@ -39,50 +31,56 @@ void onCreate() { // internally translates to Adjust SDK logging MobileCore.setLogLevel(LoggingMode.VERBOSE); - // register Adobe core extensions - // below are just sample extensions, not limited to these + // configure Adjust Adobe Extension + configureAdjustAdobeExtension(); + + // register extensions try { - Identity.registerExtension(); - Signal.registerExtension(); - Lifecycle.registerExtension(); - } catch (InvalidInitException e) { - e.printStackTrace(); + List> extensions = Arrays.asList(AdjustAdobeExtension.EXTENSION); + MobileCore.registerExtensions(extensions, new AdobeCallback() { + @Override + public void call(Object o) { + Log.d("example", "Adjust Adobe Extension SDK initialized"); + } + }); + } catch (Exception e) { + Log.e("example", "Exception while registering Extension: " + e.getMessage()); } - // register the Adjust extension - AdjustAdobeExtensionConfig config = - new AdjustAdobeExtensionConfig(AdjustAdobeExtensionConfig.ENVIRONMENT_SANDBOX); - - // Optional callbacks - // Set attribution delegate. - config.setOnAttributionChangedListener(new OnAttributionChangedListener() { - @Override - public void onAttributionChanged(AdjustAttribution attribution) { - Log.d("example", "Attribution callback called!"); - Log.d("example", "Attribution: " + attribution.toString()); - } - }); - - // Evaluate deferred deep link to be launched. - config.setOnDeeplinkResponseListener(new OnDeeplinkResponseListener() { - @Override - public boolean launchReceivedDeeplink(Uri deeplink) { - Log.d("example", "Deferred deep link callback called!"); - Log.d("example", "Deep link URL: " + deeplink); - - return true; - } - }); - - // register the Adjust SDK extension - AdjustAdobeExtension.registerExtension(config); - - // once all the extensions are registered, start processing the events - MobileCore.start(new AdobeCallback () { - @Override - public void call(Object o) { - MobileCore.configureWithAppID("89645c501ce0/540de252943f/launch-f8d889dd15b6-development"); - } - }); + } + + private void configureAdjustAdobeExtension() { + try { + MobileCore.configureWithAppID("89645c501ce0/540de252943f/launch-f8d889dd15b6-development"); + + AdjustAdobeExtensionConfig config = + new AdjustAdobeExtensionConfig(AdjustAdobeExtensionConfig.ENVIRONMENT_SANDBOX); + + // Optional callbacks + // Set attribution delegate. + config.setOnAttributionChangedListener(new OnAttributionChangedListener() { + @Override + public void onAttributionChanged(AdjustAttribution attribution) { + Log.d("example", "Attribution callback called!"); + Log.d("example", "Attribution: " + attribution.toString()); + } + }); + + // Evaluate deferred deep link to be launched. + config.setOnDeeplinkResponseListener(new OnDeeplinkResponseListener() { + @Override + public boolean launchReceivedDeeplink(Uri deeplink) { + Log.d("example", "Deferred deep link callback called!"); + Log.d("example", "Deep link URL: " + deeplink); + + return true; + } + }); + + // register the Adjust SDK extension + AdjustAdobeExtension.setConfiguration(config); + } catch (Exception e) { + + } } } diff --git a/AdjustAdobeExtension/gradle/wrapper/gradle-wrapper.properties b/AdjustAdobeExtension/gradle/wrapper/gradle-wrapper.properties index 752ffb6..4bbf50d 100644 --- a/AdjustAdobeExtension/gradle/wrapper/gradle-wrapper.properties +++ b/AdjustAdobeExtension/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.2-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-bin.zip diff --git a/CHANGELOG.md b/CHANGELOG.md index 3e5c6ee..d6936b4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,18 @@ +### Version 2.0.0 (30th January 2024) +### Added +- Added support for the latest Adobe Experience Platform Core SDK version 2.0 and above. + +### Removed +- Removed support for the deprecated Adobe Experience Platform SDK version below 2.0. + +### Changed +- Updated native Android SDK dependency to version 4.38.1. + +#### Native Android SDK +- [Android@v4.38.1][android_sdk_v4.38.1] + +--- + ### Version 1.1.0 (7th July 2022) #### Added - Added ability to send event callback and partner parameters. @@ -51,4 +66,5 @@ [android_sdk_v4.24.1]: https://github.com/adjust/android_sdk/tree/v4.24.1 [android_sdk_v4.27.0]: https://github.com/adjust/android_sdk/tree/v4.27.0 [android_sdk_v4.29.1]: https://github.com/adjust/android_sdk/tree/v4.29.1 -[android_sdk_v4.30.1]: https://github.com/adjust/android_sdk/tree/v4.30.1 \ No newline at end of file +[android_sdk_v4.30.1]: https://github.com/adjust/android_sdk/tree/v4.30.1 +[android_sdk_v4.38.1]: https://github.com/adjust/android_sdk/tree/v4.38.1 \ No newline at end of file diff --git a/README.md b/README.md index 94c4422..201f806 100644 --- a/README.md +++ b/README.md @@ -48,15 +48,16 @@ There is an Android example app inside the [example-app][example-app] directory. ### Getting started -These are the minimum required steps to integrate the Adjust Extension in your Android app. We assume that you are using Android Studio for your Android development. The minimum supported Android API level for the Adjust Extension for Adobe Experience SDK integration is **14 (Ice Cream Sandwich)**. +These are the minimum required steps to integrate the Adjust Extension in your Android app. We assume that you are using Android Studio for your Android development. The minimum supported Android API level for the Adjust Extension for Adobe Experience SDK integration is **19 (KitKat)**. ### Add the Extension to your project If you are using [`Maven`][maven], add the following to your `build.gradle` file: ```gradle -implementation 'com.adjust.adobeextension:adobeextension:1.1.0' -implementation 'com.adjust.sdk:adjust-android:4.29.1' +implementation 'com.adjust.adobeextension:adobeextension:2.0.0' +implementation 'com.adjust.sdk:adjust-android:4.38.1' +implementation 'com.adobe.marketing.mobile:core:2.6.1' implementation 'com.android.installreferrer:installreferrer:2.2' ``` @@ -155,8 +156,16 @@ In our example app, we use an `Application` class named `MainApp`. Therefore, we - In your `Application` class, find or create the `onCreate` method. Add the following code to register the Adjust Extension: ```java +import android.app.Application; +import android.net.Uri; +import android.util.Log; + import com.adjust.adobeextension.AdjustAdobeExtension; import com.adjust.adobeextension.AdjustAdobeExtensionConfig; +import com.adobe.marketing.mobile.AdobeCallback; +import com.adobe.marketing.mobile.Analytics; +import com.adobe.marketing.mobile.Extension; +import com.adobe.marketing.mobile.Identity; import com.adobe.marketing.mobile.LoggingMode; import com.adobe.marketing.mobile.MobileCore; @@ -170,23 +179,39 @@ public class MainApp extends Application { MobileCore.setApplication(this); MobileCore.setLogLevel(LoggingMode.VERBOSE); - // register Adjust Adobe extension - String environment = AdjustAdobeExtensionConfig.ENVIRONMENT_SANDBOX; - AdjustAdobeExtensionConfig config = new AdjustAdobeExtensionConfig(environment); - AdjustAdobeExtension.registerExtension(config); - - // start Adobe core - MobileCore.start(new AdobeCallback () { - @Override - public void call(Object o) { + // configure Adjust Adobe extension + try { MobileCore.configureWithAppID("your_adobe_app_id"); + + AdjustAdobeExtensionConfig config = + new AdjustAdobeExtensionConfig(AdjustAdobeExtensionConfig.ENVIRONMENT_SANDBOX); + + // register the Adjust SDK extension + AdjustAdobeExtension.setConfiguration(config); + } catch (Exception e) { + Log.e("example", "Exception while configuration: " + e.getMessage()); } - }); - } + + // register extensions + try { + List> extensions = Arrays.asList( + Analytics.EXTENSION, + Identity.EXTENSION, + AdjustAdobeExtension.EXTENSION); + MobileCore.registerExtensions(extensions, new AdobeCallback() { + @Override + public void call(Object o) { + Log.d("example", "Adjust Adobe Extension SDK initialized"); + } + }); + } catch (Exception e) { + Log.e("example", "Exception while registering Extension: " + e.getMessage()); + } + } } ``` -Replace `{your_adobe_app_id}` with your app id from Adobe Launch. +Replace `{your_adobe_app_id}` with your app id from Adobe Experience Platform Launch. Next, you must set the `environment` to either sandbox or production mode: @@ -235,9 +260,9 @@ Build and run your Android app. In your `LogCat` viewer, set the filter `tag:Adj You can use Adobe `MobileCore.trackAction` API for [`event tracking`][event-tracking]. Suppose you want to track every tap on a button. To do so, you'll create a new event token in your [dashboard]. Let's say that the event token is `abc123`. In your button's `onClick` method, add the following lines to track the click: ```java -String action = "adj.trackEvent"; +String action = AdjustAdobeExtension.ADOBE_ADJUST_ACTION_TRACK_EVENT; Map contextData= new HashMap(); -contextData.put("adj.eventToken", "abc123"); +contextData.put(AdjustAdobeExtension.ADOBE_ADJUST_EVENT_TOKEN, "abc123"); MobileCore.trackAction(action, contextData); ``` @@ -249,11 +274,11 @@ MobileCore.trackAction(action, contextData); If your users can generate revenue by tapping on advertisements or making in-app purchases, you can track those revenues too with events. Let's say a tap is worth one Euro cent. You can track the revenue event like this: ```java -String action = "adj.trackEvent"; +String action = AdjustAdobeExtension.ADOBE_ADJUST_ACTION_TRACK_EVENT; Map contextData= new HashMap(); -contextData.put("adj.eventToken", "abc123"); -contextData.put("adj.revenue", "0.01"); -contextData.put("adj.currency", "EUR"); +contextData.put(AdjustAdobeExtension.ADOBE_ADJUST_EVENT_TOKEN, "abc123"); +contextData.put(AdjustAdobeExtension.ADOBE_ADJUST_REVENUE, "0.01"); +contextData.put(AdjustAdobeExtension.ADOBE_ADJUST_CURRENCY, "EUR"); MobileCore.trackAction(action, contextData); ``` @@ -278,11 +303,11 @@ You can register a callback URL for your events in your [dashboard]. We will sen For example, if you've registered the URL `http://www.example.com/callback`, then you would track an event like this: ```java -String action = "adj.trackEvent"; +String action = AdjustAdobeExtension.ADOBE_ADJUST_ACTION_TRACK_EVENT; Map contextData= new HashMap(); -contextData.put("adj.eventToken", "abc123"); -contextData.put("adj.event.callback.key1", "value1"); -contextData.put("adj.event.callback.key2", "value2"); +contextData.put(AdjustAdobeExtension.ADOBE_ADJUST_EVENT_TOKEN, "abc123"); +contextData.put(AdjustAdobeExtension.ADOBE_ADJUST_EVENT_CALLBACK_PARAM_PREFIX + "key1", "value1"); +contextData.put(AdjustAdobeExtension.ADOBE_ADJUST_EVENT_CALLBACK_PARAM_PREFIX + "key2", "value2"); MobileCore.trackAction(action, contextData); ``` @@ -304,11 +329,11 @@ When your parameters are activated in the Adjust dashboard, you have the option This works similarly to the callback parameters mentioned above; ```java -String action = "adj.trackEvent"; +String action = AdjustAdobeExtension.ADOBE_ADJUST_ACTION_TRACK_EVENT; Map contextData= new HashMap(); -contextData.put("adj.eventToken", "abc123"); -contextData.put("adj.event.partner.key1", "value1"); -contextData.put("adj.event.partner.key2", "value2"); +contextData.put(AdjustAdobeExtension.ADOBE_ADJUST_EVENT_TOKEN, "abc123"); +contextData.put(AdjustAdobeExtension.ADOBE_ADJUST_EVENT_PARTNER_PARAM_PREFIX + "key1", "value1"); +contextData.put(AdjustAdobeExtension.ADOBE_ADJUST_EVENT_PARTNER_PARAM_PREFIX + "key2", "value2"); MobileCore.trackAction(action, contextData); ``` @@ -335,11 +360,21 @@ config.setOnAttributionChangedListener(new OnAttributionChangedListener() { public void onAttributionChanged(AdjustAttribution attribution) {} }); -AdjustAdobeExtension.registerExtension(config); +AdjustAdobeExtension.setConfiguration(config); ``` The listener function is called after the SDK receives the final attribution data. Within the listener function, you'll have access to the `attribution` parameter. +### Direct deep linking (reattribution) + +Deep links are URLs that direct users to a specific page in your app without any additional navigation. You can use them throughout your marketing funnel to improve user acquisition, engagement, and retention. You can also re-engage your users via deep links which can potentially change their attribution. In order for Adjust to be able to properly reattribute your users via deep links, you need to make sure to pass the deep link to Adjust Adobe extension like desrcribed below: + +```java +Intent intent = getIntent(); +Uri data = intent.getData(); +AdjustAdobeExtension.openUrl(data, getApplicationContext()); +``` + ### Deferred deep linking callback The Adjust SDK opens the deferred deep link by default. There is no extra configuration needed. But if you wish to control whether the Adjust SDK will open the deferred deep link or not, you can do it with a callback method in the config object. @@ -361,7 +396,7 @@ config.setOnDeeplinkResponseListener(new OnDeeplinkResponseListener() { } }); -AdjustAdobeExtension.registerExtension(config); +AdjustAdobeExtension.setConfiguration(config); ``` After the Adjust SDK receives the deep link information from our backend, the SDK will deliver you its content via the listener and expect the boolean return value from you. This return value represents your decision on whether or not the Adjust SDK should launch the activity to which you have assigned the scheme name from the deeplink. @@ -373,9 +408,9 @@ Push tokens are used for Audience Builder and client callbacks; they are also re To send us the push notification token, add the following call to Adjust once you have obtained your token (or whenever its value changes): ```java -String action = "adj.setPushToken"; +String action = AdjustAdobeExtension.ADOBE_ADJUST_ACTION_SET_PUSH_TOKEN; Map contextData= new HashMap(); -contextData.put("adj.pushToken", "your_push_token"); +contextData.put(AdjustAdobeExtension.ADOBE_ADJUST_PUSH_TOKEN, "your_push_token"); MobileCore.trackAction(action, contextData); ``` diff --git a/docs/migrate.md b/docs/migrate.md new file mode 100644 index 0000000..bb27227 --- /dev/null +++ b/docs/migrate.md @@ -0,0 +1,210 @@ +## Migrate Adjust Android Extension for Adobe Experience Platform SDK from v1.1.0 to v2.0.0 + +### Migration procedure + +Go to your app's `build.gradle` and update the dependencies as below: + +``` +implementation 'com.adjust.adobeextension:adobeextension:2.0.0 +implementation 'com.adobe.marketing.mobile:core:2.6.1' +``` + +In case your app's minimum SDK version is below API 19, update it to 19 in `build.gradle` as below: + +``` +minSdkVersion 19 +``` + +### SDK initialization + +We have changed how you configure and register the Adjust Extension. The following steps should now be +taken to configure the Adjust Extension: + +1. Create an instance of an `AdjustAdobeExtensionConfig` config object with environment. +2. Optionally, you can call methods of the `AdjustAdobeExtensionConfig` object to specify available + options same as earlier. +3. Set the `AdjustAdobeExtensionConfig` config object to the Adjust Adobe Extension by invoking + `AdjustAdobeExtensionConfig.setConfiguration` with the config object. +4. Register Adjust Adobe Extention with Adobe's Mobile Core SDK by invoking + `MobileCore.registerExtension` method. + +Here is an example of how the setup might look before and after the migration: + +##### Before + +You needed to edit app's `Application` class and to replace the code as below. + +```java +String environment = AdjustAdobeExtensionConfig.ENVIRONMENT_SANDBOX; +AdjustAdobeExtensionConfig config = new AdjustAdobeExtensionConfig(environment); +AdjustAdobeExtension.registerExtension(config); + + // start Adobe core + MobileCore.start(new AdobeCallback () { + @Override + public void call(Object o) { + MobileCore.configureWithAppID("your_adobe_app_id"); + } +}); +``` + +##### After + +```java +// configure Adjust Adobe extension +try { + MobileCore.configureWithAppID("your_adobe_app_id"); + String environment = AdjustAdobeExtensionConfig.ENVIRONMENT_SANDBOX; + AdjustAdobeExtensionConfig config = new AdjustAdobeExtensionConfig(environment); + + // register the Adjust SDK extension + AdjustAdobeExtension.setConfiguration(config); +} catch (Exception e) { + Log.e("example", "Exception while configuration: " + e.getMessage()); +} + +// register extensions +try { + List> extensions = Arrays.asList(AdjustAdobeExtension.EXTENSION); + MobileCore.registerExtensions(extensions, new AdobeCallback() { + @Override + public void call(Object o) { + Log.d("example", "Adjust Adobe Extension SDK initialized"); + } + }); +} catch (Exception e) { + Log.e("example", "Exception while registering Extension: " + e.getMessage()); +} +``` + +### Event tracking + +We also introduced proper constants to use. Again, an example of how it might look like before and after: + +##### Before + +```java +String action = "adj.trackEvent"; +Map contextData= new HashMap(); +contextData.put("adj.eventToken", "{EventToken}"); + +MobileCore.trackAction(action, contextData); +``` + +##### After + +```java +String action = AdjustAdobeExtension.ADOBE_ADJUST_ACTION_TRACK_EVENT; +Map contextData= new HashMap(); +contextData.put(AdjustAdobeExtension.ADOBE_ADJUST_EVENT_TOKEN, "{EventToken}"); + +MobileCore.trackAction(action, contextData); +``` + +### Revenue tracking + +We also introduced proper constants to use. Again, an example of how it might look like before and after: + +##### Before + +```java +String action = "adj.trackEvent"; +Map contextData= new HashMap(); +contextData.put("adj.eventToken", "{EventToken}"); +contextData.put("adj.revenue", "{RevenueAmount}"); +contextData.put("adj.currency", "{RevenueCurrency}"); + +MobileCore.trackAction(action, contextData); +``` + +##### After + +```java +String action = AdjustAdobeExtension.ADOBE_ADJUST_ACTION_TRACK_EVENT; +Map contextData= new HashMap(); +contextData.put(AdjustAdobeExtension.ADOBE_ADJUST_EVENT_TOKEN, "{EventToken}"); +contextData.put(AdjustAdobeExtension.ADOBE_ADJUST_REVENUE, "{RevenueAmount}"); +contextData.put(AdjustAdobeExtension.ADOBE_ADJUST_CURRENCY, "{RevenueCurrency}"); + +MobileCore.trackAction(action, contextData); +``` + +### Event callback parameters + +We also introduced proper constants to use. Again, an example of how it might look like before and after: + +##### Before + +```java +String action = "adj.trackEvent"; +Map contextData= new HashMap(); +contextData.put("adj.eventToken", "{EventToken}"); +contextData.put("adj.event.callback.key1", "value1"); +contextData.put("adj.event.callback.key2", "value2"); + +MobileCore.trackAction(action, contextData); +``` + +##### After + +```java +String action = AdjustAdobeExtension.ADOBE_ADJUST_ACTION_TRACK_EVENT; +Map contextData= new HashMap(); +contextData.put(AdjustAdobeExtension.ADOBE_ADJUST_EVENT_TOKEN, "{EventToken}"); +contextData.put(AdjustAdobeExtension.ADOBE_ADJUST_EVENT_CALLBACK_PARAM_PREFIX + "key1", "value1"); +contextData.put(AdjustAdobeExtension.ADOBE_ADJUST_EVENT_CALLBACK_PARAM_PREFIX + "key2", "value2"); + +MobileCore.trackAction(action, contextData); +``` + +### Event partner parameters + +We also introduced proper constants to use. Again, an example of how it might look like before and after: + +##### Before + +```java +String action = "adj.trackEvent"; +Map contextData= new HashMap(); +contextData.put("adj.eventToken", "{EventToken}"); +contextData.put("adj.event.partner.key1", "value1"); +contextData.put("adj.event.partner.key2", "value2"); + +MobileCore.trackAction(action, contextData); +``` + +##### After + +```java +String action = AdjustAdobeExtension.ADOBE_ADJUST_ACTION_TRACK_EVENT; +Map contextData= new HashMap(); +contextData.put(AdjustAdobeExtension.ADOBE_ADJUST_EVENT_TOKEN, "{EventToken}"); +contextData.put(AdjustAdobeExtension.ADOBE_ADJUST_EVENT_PARTNER_PARAM_PREFIX + "key1", "value1"); +contextData.put(AdjustAdobeExtension.ADOBE_ADJUST_EVENT_PARTNER_PARAM_PREFIX + "key2", "value2"); + +MobileCore.trackAction(action, contextData); +``` + +### Push token (uninstall tracking) + +We also introduced proper constants to use. Again, an example of how it might look like before and after: + +##### Before + +```java +String action = "adj.setPushToken"; +Map contextData= new HashMap(); +contextData.put("adj.pushToken", "{PushToken}"); + +MobileCore.trackAction(action, contextData); +``` + +##### After + +```java +String action = AdjustAdobeExtension.ADOBE_ADJUST_ACTION_SET_PUSH_TOKEN; +Map contextData= new HashMap(); +contextData.put(AdjustAdobeExtension.ADOBE_ADJUST_PUSH_TOKEN, "{PushToken}"); + +MobileCore.trackAction(action, contextData); +``` \ No newline at end of file