From 42dfd3f1a26877d78996985f8a6c382aefe0f8f4 Mon Sep 17 00:00:00 2001 From: Xiaowei Zhu <33129495+zhu-xiaowei@users.noreply.github.com> Date: Fri, 19 May 2023 23:26:21 +0800 Subject: [PATCH] chore: update readme with usage guide (#13) 1. update readme for usage doc 2. fix publishing.gradle with no keyFile. --------- Co-authored-by: xiaoweii --- README.md | 215 ++++++++++++++++++++++++++++++++++++++---- build.gradle | 1 + images/raw_folder.png | Bin 0 -> 20192 bytes publishing.gradle | 14 +-- 4 files changed, 204 insertions(+), 26 deletions(-) create mode 100644 images/raw_folder.png diff --git a/README.md b/README.md index 45c4e1c..f7b29ed 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,7 @@ # AWS Solution Clickstream Analytics SDK for Android - +[![Maven Central](https://img.shields.io/maven-central/v/software.aws.solution/clickstream.svg)](https://search.maven.org/artifact/software.aws.solution/clickstream) ## Introduction + Clickstream Android SDK can help you easily report in-app events on Android. After the event is reported, statistics and analysis of specific scenario data can be completed on AWS Clickstream solution. The SDK relies on the Amplify for Android SDK Core Library and is developed according to the Amplify Android SDK plug-in specification, while using the same event definitions and attribute specifications as amplifyframework analytics. In addition to this, we've added commonly used preset event statistics to make it easier to use. @@ -9,26 +10,200 @@ The SDK relies on the Amplify for Android SDK Core Library and is developed acco The Clickstream SDK supports Android API level 16 (Android 4.1) and above. +## Integrate SDK + +**1.Include SDK** + +Add the following dependency to your `app` module's `build.gradle` file. + +```groovy +dependencies { + implementation 'software.aws.solution:clickstream:0.4.1' +} +``` + +then sync your project. + +**2.Parameter configuration** + +Find the res directory under your `project/app/src/main` , and manually create a raw folder in the res directory. + +![](images/raw_folder.png) + +Downlod your `amplifyconfiguration.json` file from your clickstream control plane, and paste it to raw floder, the json file will be as following: + +```json +{ + "analytics": { + "plugins": { + "awsClickstreamPlugin": { + "appId": "appId", + "endpoint": "https://example.com/collect", + "isCompressEvents": true, + "autoFlushEventsInterval": 10000, + "isTrackAppExceptionEvents": false + } + } + } +} +``` + +Your `appId` and `endpoint` are already set up in it, here's an explanation of each property: + +- **appId**: the app id of your project in control plane. +- **endpoint**: the endpoint url you will upload the event to AWS server. +- **isCompressEvents**: whether to compress event content when uploading events, default is `true` +- **autoFlushEventsInterval**: event sending interval, the default is `10s` +- **isTrackAppExceptionEvents**: whether auto track exception event in app, default is `true` + +**3.Initialize the SDK** + +Please Initialize the SDK in the Application `onCreate()` method. + +```java +import software.aws.solution.clickstream.ClickstreamAnalytics; + +public void onCreate() { + super.onCreate(); + + try{ + ClickstreamAnalytics.init(this); + Log.i("MyApp", "Initialized ClickstreamAnalytics"); + } catch (AmplifyException error){ + Log.e("MyApp", "Could not initialize ClickstreamAnalytics", error); + } +} +``` + +**4.Config the SDK** + +After initial the SDK we can use the following code to custom configure it. + +```java +import software.aws.solution.clickstream.ClickstreamAnalytics; + +// config the SDK after initialize. +ClickstreamAnalytics.getClickStreamConfiguration() + .withAppId("appId") + .withEndpoint("https://example.com/collect") + .withAuthCookie("your authentication cookie") + .withSendEventsInterval(10000) + .withSessionTimeoutDuration(1800000) + .withTrackAppExceptionEvents(false) + .withLogEvents(true) + .withCustomDns(CustomOkhttpDns.getInstance()) + .withCompressEvents(true); +``` + +> note: this configuration will override the default configuration in `amplifyconfiguration.json` file. + +### Start using + +Now that you've integrated the SDK, let's start using it in your app. + +#### Record event + +Add the following code where you need to report an event. + +```java +import software.aws.solution.clickstream.ClickstreamAnalytics; +import com.amplifyframework.analytics.AnalyticsEvent; + +AnalyticsEvent event = AnalyticsEvent.builder() + .name("PasswordReset") + .add("Channel", "SMS") + .add("Successful", true) + .add("ProcessDuration", 78.2) + .add("UserAge", 20) + .build(); +ClickstreamAnalytics.recordEvent(event); + +// for record an event directly +ClickstreamAnalytics.recordEvent("button_click"); +``` + +#### Add global attribute + +```java +import software.aws.solution.clickstream.ClickstreamAttribute; +import software.aws.solution.clickstream.ClickstreamAnalytics; + +ClickstreamAttribute globalAttribute = ClickstreamAttribute.builder() + .add("channel", "HUAWEI") + .add("level", 5.1) + .add("class", 6) + .add("isOpenNotification", true) + .build(); +ClickstreamAnalytics.addGlobalAttributes(globalAttribute); + +// for delete an global attribute +ClickstreamAnalytics.deleteGlobalAttributes("level"); +``` + +#### Login and logout + +```java +import software.aws.solution.clickstream.ClickstreamAnalytics; + +// when user login success. +ClickstreamAnalytics.setUserId("UserId"); + +// when user logout +ClickstreamAnalytics.setUserId(null); +``` + +When we log into another user, we will clear the before user's user attributes, after `setUserId()` you need add your user's attribute. + +#### Add user attribute + +```java +import software.aws.solution.clickstream.ClickstreamAnalytcs; +import software.aws.solution.clickstream.ClickstreamUserAttribute; + +ClickstreamUserAttribute clickstreamUserAttribute = ClickstreamUserAttribute.builder() + .add("_user_age", 21) + .add("_user_name", "carl") + .build(); +ClickstreamAnalytics.addUserAttributes(clickstreamUserAttribute); +``` + +Current login user‘s attributes will be cached in disk, so the next time app launch you don't need to set all user's attribute again, of course you can update the current user's attribute when it changes. + +#### Log the event json in debug mode + +```java +import software.aws.solution.clickstream.ClickstreamAnalytics; + +// log the event in debug mode. +ClickstreamAnalytics.getClickStreamConfiguration() + .withLogEvents(BuildConfig.DEBUG); +``` + +after config `.withLogEvents(true)` and when you record an event, you can see the event json at your AndroidStudio **Logcat** by filter `EventRecorder`. + +#### Config custom DNS + +```java +import software.aws.solution.clickstream.ClickstreamAnalytics; + +// config custom dns. +ClickstreamAnalytics.getClickStreamConfiguration() + .withCustomDns(CustomOkhttpDns.getInstance()); +``` + +If you want to use custom DNS for network request, you can create your `CustomOkhttpDns` which implementaion `okhttp3.Dns`, then config `.withCustomDns(CustomOkhttpDns.getInstance())` to make it works. + +#### Send event immediately + +```java +// for send event immediately. +ClickstreamAnalytics.flushEvent(); +``` + ## How to build locally -### Config your local environment -First of all you should install the latest version of [Android Studio](https://developer.android.com/studio). -#### Config your checkstyle: -1. Open your Android Studio -> Preferences -> Tools -> check style window. -2. Change the check style version to 8.29. -3. Add config file from ./configuration/checkstyle.gradle. then check and apply. - -#### Config your code format -1. Open your Android Studio -> Preferences -> Editor -> Code Style -> Java window. -2. Click the top setting icon -> import scheme -> checkstyle configuration -3. Select ./configuration/checkstyle.gradle file, then click ok to submit. -4. Config your Reformat code keymap to format your code with checkstyle configured above. - -#### Config your java version -1. Open your Android Studio -> Preferences -> Build, Execution, Deployment -> Build Tools -> Gradle window. -2. make sure you `Gradle JDK` version is set to the 1.8, then click apply and ok. - -### Build aar -open an terminal window,at the root project folder to execute: + +open an terminal window, at the root project folder to execute: + ```shell ./gradlew build -p clickstream ``` diff --git a/build.gradle b/build.gradle index 2e3761a..15cbc88 100644 --- a/build.gradle +++ b/build.gradle @@ -75,6 +75,7 @@ subprojects { project -> afterEvaluate { configAndroidLibrary(project) project.apply from: '../jacoco.gradle' + project.apply from: '../publishing.gradle' } } diff --git a/images/raw_folder.png b/images/raw_folder.png new file mode 100644 index 0000000000000000000000000000000000000000..a278092ce30596492b8299bde006b21606b0c7ae GIT binary patch literal 20192 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 literal 0 HcmV?d00001 diff --git a/publishing.gradle b/publishing.gradle index bd331c1..d800b42 100644 --- a/publishing.gradle +++ b/publishing.gradle @@ -21,7 +21,7 @@ version = project.ext.VERSION_NAME group = POM_GROUP def keyFile = rootProject.file("key.properties") def keyProp = new Properties() -keyProp.load(keyFile.newInputStream()) +keyFile.exists() ? keyProp.load(keyFile.newInputStream()) : keyProp afterEvaluate { project -> publishing { @@ -89,10 +89,12 @@ afterEvaluate { project -> } signing { - def signingPassword = keyProp.getProperty("signing.password") - def keyId = keyProp.getProperty("signing.keyId") - def signingKey = keyProp.getProperty("signing.inMemoryKey").replace("\\n", "\n") - useInMemoryPgpKeys(keyId, signingKey, signingPassword) - sign publishing.publications.library + if (keyFile.exists()) { + def signingPassword = keyProp.getProperty("signing.password") + def keyId = keyProp.getProperty("signing.keyId") + def signingKey = keyProp.getProperty("signing.inMemoryKey").replace("\\n", "\n") + useInMemoryPgpKeys(keyId, signingKey, signingPassword) + sign publishing.publications.library + } } } \ No newline at end of file