Skip to content

Commit

Permalink
Merge pull request #6 from techery/feature/implement-trackers
Browse files Browse the repository at this point in the history
Implement Adobe and Apptentive trackers for Android
  • Loading branch information
almozavr authored Feb 15, 2018
2 parents 032649f + 8f949af commit ce65f1d
Show file tree
Hide file tree
Showing 73 changed files with 971 additions and 309 deletions.
22 changes: 18 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -115,10 +115,10 @@ public class BuyPetEvent {
@AttributeMap
Map<String, Object> data = new HashMap<>();

public BuyPetEvent(PetEntity petEntity) {
petType = petEntity.petType.name().toLowerCase(Locale.US);
petBirthDate = DateFormat.getDateInstance().format(petEntity.birthDate);
data.put("pet_name", petEntity.name);
public BuyPetEvent(PetEntity pet) {
petType = pet.petType.name().toLowerCase(Locale.US); // assuming PetType is a enum
petBirthDate = DateFormat.getDateInstance().format(pet.birthDate);
data.put("pet_name", pet.name);
}
}
```
Expand Down Expand Up @@ -172,6 +172,20 @@ Grab via Gradle:
* janet-analytics: [![](https://jitpack.io/v/techery/janet-analytics.svg)](https://jitpack.io/#techery/janet-analytics)
* janet: [![](https://jitpack.io/v/janet-io/janet.svg)](https://jitpack.io/#janet-io/janet)

#### Android addons

Two `Tracker` implementations for the Adobe and Apptentive analytics vendors are here for you. Just add some of these dependencies to your build.gradle:

```groovy
dependencies {
...
implementation 'com.github.techery:analytics:android-adobe-tracker:xxx'
implementation 'com.github.techery:analytics:android-apptentive-tracker:xxx'
}
```
> NOTE: setting up a particular SDK in your application (e.g. providing `API_KEY`s and stuff) is up to you. These trackers only handle interface implementation, push processed event to SDK using its API and perform lifecycle tracking when used for Adobe.
## License

Copyright (c) 2018 Techery
Expand Down
31 changes: 31 additions & 0 deletions android-adobe-tracker/build.gradle
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@

apply plugin: 'com.android.library'
apply from: rootProject.file('gradle/plugins/maven-simple.gradle')

android {

compileSdkVersion 26
buildToolsVersion "26.0.2"

defaultConfig {
versionCode 1
versionName "1.0"
minSdkVersion 18
targetSdkVersion 22
}

compileOptions {
sourceCompatibility JavaVersion.VERSION_1_6
targetCompatibility JavaVersion.VERSION_1_6
}
}

repositories {
jcenter()
google()
}

dependencies {
compile project(':api')
compile 'com.adobe.mobile:adobeMobileLibrary:4.13.7'
}
4 changes: 4 additions & 0 deletions android-adobe-tracker/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="io.techery.analytics.tracker.adobe"
/>
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
package io.techery.analytics.tracker;

import android.app.Activity;
import android.app.Application;
import android.os.Bundle;
import com.adobe.mobile.Analytics;
import com.adobe.mobile.Config;
import io.techery.janet.analytics.Tracker;

import java.util.Map;

public class AdobeTracker implements Tracker, Application.ActivityLifecycleCallbacks {

public static final String KEY = "JANET_ADOBE_TRACKER";

protected boolean appContextSet = false;

public AdobeTracker(Application application) {
application.registerActivityLifecycleCallbacks(this);
}

@Override
public String id() {
return KEY;
}

@Override
public void trackEvent(String actionKey, Map<String, Object> data) {
Analytics.trackAction(actionKey, data);
}

@Override
public void onActivityCreated(Activity activity, Bundle bundle) {
if (!appContextSet) {
appContextSet = true;
Config.setContext(activity.getApplicationContext());
}
}

@Override
public void onActivityStarted(Activity activity) {
}

@Override
public void onActivityResumed(Activity activity) {
Config.collectLifecycleData(activity);
}

@Override
public void onActivityPaused(Activity activity) {
Config.pauseCollectingLifecycleData();
}

@Override
public void onActivityStopped(Activity activity) {
}

@Override
public void onActivitySaveInstanceState(Activity activity, Bundle bundle) {
}

@Override
public void onActivityDestroyed(Activity activity) {
}
}
31 changes: 31 additions & 0 deletions android-apptentive-tracker/build.gradle
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@

apply plugin: 'com.android.library'
apply from: rootProject.file('gradle/plugins/maven-simple.gradle')

android {

compileSdkVersion 26
buildToolsVersion "26.0.2"

defaultConfig {
versionCode 1
versionName "1.0"
minSdkVersion 18
targetSdkVersion 22
}

compileOptions {
sourceCompatibility JavaVersion.VERSION_1_6
targetCompatibility JavaVersion.VERSION_1_6
}
}

repositories {
jcenter()
google()
}

dependencies {
compile project(':api')
compile 'com.apptentive:apptentive-android:5.0.2'
}
4 changes: 4 additions & 0 deletions android-apptentive-tracker/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="io.techery.analytics.tracker.apptentive"
/>
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package io.techery.analytics.tracker;

import android.content.Context;
import com.apptentive.android.sdk.Apptentive;
import io.techery.janet.analytics.Tracker;

import java.util.Map;

public class ApptentiveTracker implements Tracker {

public static final String KEY = "JANET_APPTENTIVE_TRACKER";

protected final Context context;

public ApptentiveTracker(Context context) {
this.context = context;
}

@Override
public String id() {
return KEY;
}

@Override
public void trackEvent(String actionKey, Map<String, Object> data) {
Apptentive.engage(context, actionKey, data);
}
}
45 changes: 45 additions & 0 deletions android-sample/build.gradle
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@

apply plugin: 'com.android.application'

android {
compileSdkVersion 26
buildToolsVersion "26.0.2"

defaultConfig {
applicationId "io.techery.analytics.sample.android"
versionCode 1
versionName "1.0"
minSdkVersion 18
targetSdkVersion 22
}

compileOptions {
sourceCompatibility JavaVersion.VERSION_1_7
targetCompatibility JavaVersion.VERSION_1_7
}
}

repositories {
jcenter()
google()
maven { url "https://jitpack.io" }
}

dependencies {
implementation project(':api')
implementation project(':android-apptentive-tracker')
implementation project(':android-adobe-tracker')
implementation project(':sample-common')

implementation project(':service')
annotationProcessor project(':service-compiler')

implementation 'com.google.dagger:dagger:2.14.1'
annotationProcessor 'com.google.dagger:dagger-compiler:2.14.1'

implementation 'com.github.techery:janet:1.0.7'
// it is better to depend explicitly upon latest version

implementation 'com.jakewharton:butterknife:8.8.1'
annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'
}
22 changes: 22 additions & 0 deletions android-sample/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="io.techery.analytics.sample.android">

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

<application
android:name="io.techery.analytics.sample.android.App"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:theme="@style/AppTheme">

<activity android:name="io.techery.analytics.sample.android.MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package io.techery.analytics.sample.android;

import android.app.Application;
import io.techery.analytics.sample.android.di.DaggerDiComponent;
import io.techery.analytics.sample.android.di.DiComponent;
import io.techery.analytics.sample.android.di.DiModule;

public class App extends Application {

private DiComponent diComponent;

@Override
public void onCreate() {
super.onCreate();

diComponent = DaggerDiComponent.builder()
.diModule(new DiModule(this))
.build();
}

public DiComponent diComponent() {
return diComponent;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
package io.techery.analytics.sample.android;

import android.app.Activity;
import android.os.Bundle;
import android.widget.EditText;
import android.widget.RadioGroup;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
import io.techery.analytics.sample.android.action.AdobePetSellEvent;
import io.techery.analytics.sample.android.action.ApptentivePetSellEvent;
import io.techery.analytics.sample_common.entity.PetEntity;
import io.techery.analytics.sample_common.entity.PetType;
import io.techery.analytics.sample_common.janet.AnalyticsInteractor;

import javax.inject.Inject;
import java.util.Calendar;

public class MainActivity extends Activity {

@Inject
AnalyticsInteractor analyticsInteractor;

@BindView(R.id.pet_name)
EditText petNameView;

@BindView(R.id.pet_type_radio_group)
RadioGroup petTypeView;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);

((App) getApplication()).diComponent().inject(this);
}

@OnClick(R.id.button)
void buttonClicked() {
final String petName = petNameView.getText().toString();
PetType petType;
switch (petTypeView.getCheckedRadioButtonId()) {
case R.id.radio_type_cat: petType = PetType.CAT; break;
case R.id.radio_type_dog: petType = PetType.CAT; break;
default: petType = PetType.UNKNOWN;
}
Calendar petBirthDate = Calendar.getInstance();
petBirthDate.set(Calendar.YEAR, 2017);

PetEntity pet = new PetEntity(petType, petName, petBirthDate);
analyticsInteractor.analyticsActionPipe().send(new AdobePetSellEvent(pet));
// analyticsInteractor.analyticsActionPipe()
// .createObservable(new AdobePetSellEvent(pet))
// .subscribe(new Subscriber<ActionState<BaseAnalyticsAction>>() {
// @Override
// public void onCompleted() {
// // do nothing
// }
//
// @Override
// public void onError(Throwable e) {
// // this is highly expected because none of analytic SDK are properly set
// // do nothing
// }
//
// @Override
// public void onNext(ActionState<BaseAnalyticsAction> baseAnalyticsActionActionState) {
// // do nothing
// }
// });
analyticsInteractor.analyticsActionPipe().send(new ApptentivePetSellEvent(pet));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package io.techery.analytics.sample.android.action;

import io.techery.analytics.sample_common.entity.PetEntity;
import io.techery.analytics.tracker.AdobeTracker;
import io.techery.janet.analytics.annotation.AnalyticsEvent;

@AnalyticsEvent(actionKey = "{$pet_type}_sold", trackerIds = AdobeTracker.KEY)
public class AdobePetSellEvent extends BasePetSellEvent {

public AdobePetSellEvent(PetEntity pet) {
super(pet);
}
}
Loading

0 comments on commit ce65f1d

Please sign in to comment.