From 7832e4e81ba823be89cc17c997a803622a43bc4f Mon Sep 17 00:00:00 2001 From: Phillip Thelen Date: Tue, 2 Feb 2016 21:19:07 +0100 Subject: [PATCH] Add amplitude support --- Habitica/AndroidManifest.xml | 2 +- Habitica/build.gradle | 2 ++ .../habitrpg/android/habitica/APIHelper.java | 2 ++ .../android/habitica/HabiticaApplication.java | 2 ++ .../habitica/ui/activities/LoginActivity.java | 19 ++++++++++ .../habitica/ui/activities/MainActivity.java | 27 ++++++++++++++ .../habitica/ui/activities/SetupActivity.java | 35 +++++++++++++++++++ .../habitica/ui/fragments/BaseFragment.java | 28 ++++++++++++++- .../fragments/setup/AvatarSetupFragment.java | 3 +- .../ui/fragments/setup/IntroFragment.java | 4 +-- .../ui/fragments/setup/TaskSetupFragment.java | 3 +- .../tasks/TaskRecyclerViewFragment.java | 5 +++ .../ui/fragments/tasks/TasksFragment.java | 5 +++ 13 files changed, 131 insertions(+), 6 deletions(-) diff --git a/Habitica/AndroidManifest.xml b/Habitica/AndroidManifest.xml index a54324132..b4af3e1ea 100644 --- a/Habitica/AndroidManifest.xml +++ b/Habitica/AndroidManifest.xml @@ -2,7 +2,7 @@ diff --git a/Habitica/build.gradle b/Habitica/build.gradle index 61ccc485b..71cb820f0 100644 --- a/Habitica/build.gradle +++ b/Habitica/build.gradle @@ -88,6 +88,8 @@ dependencies { compile 'fr.avianey.com.viewpagerindicator:library:2.4.1@aar' + compile 'com.amplitude:android-sdk:2.5.0' + debugCompile 'com.squareup.leakcanary:leakcanary-android:1.3.1' releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.3.1' } diff --git a/Habitica/src/com/habitrpg/android/habitica/APIHelper.java b/Habitica/src/com/habitrpg/android/habitica/APIHelper.java index ab8e07c41..957f6a72b 100644 --- a/Habitica/src/com/habitrpg/android/habitica/APIHelper.java +++ b/Habitica/src/com/habitrpg/android/habitica/APIHelper.java @@ -4,6 +4,7 @@ import android.app.Activity; import android.content.DialogInterface; import android.support.v7.app.AlertDialog; +import com.amplitude.api.Amplitude; import com.google.gson.ExclusionStrategy; import com.google.gson.FieldAttributes; import com.google.gson.Gson; @@ -71,6 +72,7 @@ public class APIHelper implements ErrorHandler, Profiler { //private HostConfig mConfig; public APIHelper(final HostConfig cfg) { this.cfg = cfg; + Amplitude.getInstance().setUserId(cfg.getUser()); RequestInterceptor requestInterceptor = new RequestInterceptor() { @Override diff --git a/Habitica/src/com/habitrpg/android/habitica/HabiticaApplication.java b/Habitica/src/com/habitrpg/android/habitica/HabiticaApplication.java index ac9645db0..4e8f63d14 100644 --- a/Habitica/src/com/habitrpg/android/habitica/HabiticaApplication.java +++ b/Habitica/src/com/habitrpg/android/habitica/HabiticaApplication.java @@ -14,6 +14,7 @@ import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.util.Log; +import com.amplitude.api.Amplitude; import com.crashlytics.android.Crashlytics; import com.crashlytics.android.core.CrashlyticsCore; import com.facebook.FacebookSdk; @@ -60,6 +61,7 @@ public class HabiticaApplication extends Application { setupCrashlytics(); createBillingAndCheckout(); registerActivityLifecycleCallbacks(); + Amplitude.getInstance().initialize(this, getString(R.string.amplitude_app_id)).enableForegroundTracking(this); } private void setupLeakCanary() { diff --git a/Habitica/src/com/habitrpg/android/habitica/ui/activities/LoginActivity.java b/Habitica/src/com/habitrpg/android/habitica/ui/activities/LoginActivity.java index ddde14272..9e1e0cfe4 100644 --- a/Habitica/src/com/habitrpg/android/habitica/ui/activities/LoginActivity.java +++ b/Habitica/src/com/habitrpg/android/habitica/ui/activities/LoginActivity.java @@ -22,6 +22,7 @@ import android.widget.ProgressBar; import android.widget.TableRow; import android.widget.TextView; +import com.amplitude.api.Amplitude; import com.facebook.AccessToken; import com.facebook.CallbackManager; import com.facebook.FacebookCallback; @@ -146,6 +147,16 @@ public class LoginActivity extends AppCompatActivity mApiHelper = new APIHelper(hc); this.isRegistering = true; + + JSONObject eventProperties = new JSONObject(); + try { + eventProperties.put("eventAction", "navigate"); + eventProperties.put("eventCategory", "navigation"); + eventProperties.put("hitType", "pageview"); + eventProperties.put("page", this.getClass().getSimpleName()); + } catch (JSONException exception) { + } + Amplitude.getInstance().logEvent("navigate", eventProperties); } private void resetLayout() { @@ -333,6 +344,14 @@ public class LoginActivity extends AppCompatActivity if (this.isRegistering) { this.startSetupActivity(); } else { + JSONObject eventProperties = new JSONObject(); + try { + eventProperties.put("eventAction", "lofin"); + eventProperties.put("eventCategory", "behaviour"); + eventProperties.put("hitType", "event"); + } catch (JSONException exception) { + } + Amplitude.getInstance().logEvent("login", eventProperties); this.startMainActivity(); } } diff --git a/Habitica/src/com/habitrpg/android/habitica/ui/activities/MainActivity.java b/Habitica/src/com/habitrpg/android/habitica/ui/activities/MainActivity.java index f57419542..946327d7c 100644 --- a/Habitica/src/com/habitrpg/android/habitica/ui/activities/MainActivity.java +++ b/Habitica/src/com/habitrpg/android/habitica/ui/activities/MainActivity.java @@ -25,6 +25,7 @@ import android.widget.ImageView; import android.widget.TextView; import com.afollestad.materialdialogs.MaterialDialog; +import com.amplitude.api.Amplitude; import com.habitrpg.android.habitica.APIHelper; import com.habitrpg.android.habitica.HabiticaApplication; import com.habitrpg.android.habitica.HostConfig; @@ -73,6 +74,8 @@ import com.raizlabs.android.dbflow.sql.language.From; import com.raizlabs.android.dbflow.sql.language.Select; import com.raizlabs.android.dbflow.sql.language.Where; +import org.json.JSONException; +import org.json.JSONObject; import org.solovyev.android.checkout.ActivityCheckout; import org.solovyev.android.checkout.Checkout; @@ -803,6 +806,18 @@ public class MainActivity extends BaseActivity implements HabitRPGUserCallback.O view.onReaction = this; this.overlayFrameLayout.addView(view); this.activeTutorialView = view; + + JSONObject eventProperties = new JSONObject(); + try { + eventProperties.put("eventAction", "tutorial"); + eventProperties.put("eventCategory", "behaviour"); + eventProperties.put("hitType", "event"); + eventProperties.put("eventLabel", step.getIdentifier()+"-android"); + eventProperties.put("eventValue", step.getIdentifier()); + eventProperties.put("complete", false); + } catch (JSONException exception) { + } + Amplitude.getInstance().logEvent("tutorial", eventProperties); } @Override @@ -813,6 +828,18 @@ public class MainActivity extends BaseActivity implements HabitRPGUserCallback.O mAPIHelper.apiService.updateUser(updateData, new HabitRPGUserCallback(this)); this.overlayFrameLayout.removeView(this.activeTutorialView); this.removeActiveTutorialView(); + + JSONObject eventProperties = new JSONObject(); + try { + eventProperties.put("eventAction", "tutorial"); + eventProperties.put("eventCategory", "behaviour"); + eventProperties.put("hitType", "event"); + eventProperties.put("eventLabel", step.getIdentifier()+"-android"); + eventProperties.put("eventValue", step.getIdentifier()); + eventProperties.put("complete", true); + } catch (JSONException exception) { + } + Amplitude.getInstance().logEvent("tutorial", eventProperties); } @Override diff --git a/Habitica/src/com/habitrpg/android/habitica/ui/activities/SetupActivity.java b/Habitica/src/com/habitrpg/android/habitica/ui/activities/SetupActivity.java index 62e9f0d94..96a3b4f3d 100644 --- a/Habitica/src/com/habitrpg/android/habitica/ui/activities/SetupActivity.java +++ b/Habitica/src/com/habitrpg/android/habitica/ui/activities/SetupActivity.java @@ -10,6 +10,7 @@ import android.util.AttributeSet; import android.view.View; import android.widget.Button; +import com.amplitude.api.Amplitude; import com.habitrpg.android.habitica.APIHelper; import com.habitrpg.android.habitica.HabiticaApplication; import com.habitrpg.android.habitica.HostConfig; @@ -23,6 +24,9 @@ import com.magicmicky.habitrpgwrapper.lib.models.HabitRPGUser; import com.raizlabs.android.dbflow.sql.builder.Condition; import com.raizlabs.android.dbflow.sql.language.Select; +import org.json.JSONException; +import org.json.JSONObject; + import java.util.List; import java.util.Map; @@ -74,6 +78,16 @@ public class SetupActivity extends BaseActivity implements View.OnClickListener, this.nextButton.setOnClickListener(this); this.previousButton.setOnClickListener(this); this.completedSetup = false; + + JSONObject eventProperties = new JSONObject(); + try { + eventProperties.put("eventAction", "setup"); + eventProperties.put("eventCategory", "behaviour"); + eventProperties.put("hitType", "event"); + eventProperties.put("status", "displayed"); + } catch (JSONException exception) { + } + Amplitude.getInstance().logEvent("setup", eventProperties); } @Override @@ -147,6 +161,17 @@ public class SetupActivity extends BaseActivity implements View.OnClickListener, this.pager.setCurrentItem(this.pager.getCurrentItem()+1); } else if (v == this.previousButton) { this.pager.setCurrentItem(this.pager.getCurrentItem()-1); + } else if (v == this.skipButton) { + JSONObject eventProperties = new JSONObject(); + try { + eventProperties.put("eventAction", "setup"); + eventProperties.put("eventCategory", "behaviour"); + eventProperties.put("hitType", "event"); + eventProperties.put("status", "skipped"); + } catch (JSONException exception) { + } + Amplitude.getInstance().logEvent("setup", eventProperties); + this.startMainActivity(); } } @@ -185,6 +210,16 @@ public class SetupActivity extends BaseActivity implements View.OnClickListener, this.avatarSetupFragment.setUser(user); } } + + JSONObject eventProperties = new JSONObject(); + try { + eventProperties.put("eventAction", "setup"); + eventProperties.put("eventCategory", "behaviour"); + eventProperties.put("hitType", "event"); + eventProperties.put("status", "completed"); + } catch (JSONException exception) { + } + Amplitude.getInstance().logEvent("setup", eventProperties); } @Override diff --git a/Habitica/src/com/habitrpg/android/habitica/ui/fragments/BaseFragment.java b/Habitica/src/com/habitrpg/android/habitica/ui/fragments/BaseFragment.java index e4aee1de2..1f04ef066 100644 --- a/Habitica/src/com/habitrpg/android/habitica/ui/fragments/BaseFragment.java +++ b/Habitica/src/com/habitrpg/android/habitica/ui/fragments/BaseFragment.java @@ -2,6 +2,7 @@ package com.habitrpg.android.habitica.ui.fragments; import android.support.v4.app.Fragment; +import com.amplitude.api.Amplitude; import com.habitrpg.android.habitica.events.DisplayTutorialEvent; import com.habitrpg.android.habitica.ui.activities.MainActivity; import com.magicmicky.habitrpgwrapper.lib.models.TutorialStep; @@ -10,6 +11,9 @@ import com.raizlabs.android.dbflow.runtime.transaction.TransactionListener; import com.raizlabs.android.dbflow.sql.builder.Condition; import com.raizlabs.android.dbflow.sql.language.Select; +import org.json.JSONException; +import org.json.JSONObject; + import java.util.Date; import de.greenrobot.event.EventBus; @@ -23,10 +27,30 @@ public class BaseFragment extends Fragment { public void setUserVisibleHint(boolean isVisibleToUser) { super.setUserVisibleHint(isVisibleToUser); if (isVisibleToUser) { - new Select().from(TutorialStep.class).where(Condition.column("identifier").eq(tutorialStepIdentifier)).async().querySingle(tutorialStepTransactionListener); + if (this.tutorialStepIdentifier != null) { + new Select().from(TutorialStep.class).where(Condition.column("identifier").eq(tutorialStepIdentifier)).async().querySingle(tutorialStepTransactionListener); + } + + String displayedClassName = this.getDisplayedClassName(); + + if (displayedClassName != null) { + JSONObject eventProperties = new JSONObject(); + try { + eventProperties.put("eventAction", "navigate"); + eventProperties.put("eventCategory", "navigation"); + eventProperties.put("hitType", "pageview"); + eventProperties.put("page", displayedClassName); + } catch (JSONException exception) { + } + Amplitude.getInstance().logEvent("navigate", eventProperties); + } } } + public String getDisplayedClassName() { + return this.getClass().getSimpleName(); + } + private TransactionListener tutorialStepTransactionListener = new TransactionListener() { @Override public void onResultReceived(TutorialStep step) { @@ -49,4 +73,6 @@ public class BaseFragment extends Fragment { } }; + + } diff --git a/Habitica/src/com/habitrpg/android/habitica/ui/fragments/setup/AvatarSetupFragment.java b/Habitica/src/com/habitrpg/android/habitica/ui/fragments/setup/AvatarSetupFragment.java index f5399bbfc..ec910b936 100644 --- a/Habitica/src/com/habitrpg/android/habitica/ui/fragments/setup/AvatarSetupFragment.java +++ b/Habitica/src/com/habitrpg/android/habitica/ui/fragments/setup/AvatarSetupFragment.java @@ -14,6 +14,7 @@ import com.habitrpg.android.habitica.R; import com.habitrpg.android.habitica.ui.activities.SetupActivity; import com.habitrpg.android.habitica.ui.adapter.SkillsRecyclerViewAdapter; import com.habitrpg.android.habitica.ui.adapter.setup.CustomizationSetupAdapter; +import com.habitrpg.android.habitica.ui.fragments.BaseFragment; import com.habitrpg.android.habitica.ui.helpers.MarginDecoration; import com.habitrpg.android.habitica.userpicture.UserPicture; import com.magicmicky.habitrpgwrapper.lib.models.Customization; @@ -29,7 +30,7 @@ import java.util.List; import butterknife.Bind; import butterknife.ButterKnife; -public class AvatarSetupFragment extends Fragment { +public class AvatarSetupFragment extends BaseFragment { View view; public SetupActivity activity; diff --git a/Habitica/src/com/habitrpg/android/habitica/ui/fragments/setup/IntroFragment.java b/Habitica/src/com/habitrpg/android/habitica/ui/fragments/setup/IntroFragment.java index 5b10de135..d7a164773 100644 --- a/Habitica/src/com/habitrpg/android/habitica/ui/fragments/setup/IntroFragment.java +++ b/Habitica/src/com/habitrpg/android/habitica/ui/fragments/setup/IntroFragment.java @@ -12,12 +12,12 @@ import android.widget.ImageView; import android.widget.TextView; import com.habitrpg.android.habitica.R; +import com.habitrpg.android.habitica.ui.fragments.BaseFragment; import butterknife.Bind; import butterknife.ButterKnife; -public class IntroFragment extends Fragment { - +public class IntroFragment extends BaseFragment { @Bind(R.id.titleTextView) TextView titleTextView; diff --git a/Habitica/src/com/habitrpg/android/habitica/ui/fragments/setup/TaskSetupFragment.java b/Habitica/src/com/habitrpg/android/habitica/ui/fragments/setup/TaskSetupFragment.java index 6718fbd54..f990f2e97 100644 --- a/Habitica/src/com/habitrpg/android/habitica/ui/fragments/setup/TaskSetupFragment.java +++ b/Habitica/src/com/habitrpg/android/habitica/ui/fragments/setup/TaskSetupFragment.java @@ -12,6 +12,7 @@ import android.view.ViewGroup; import com.habitrpg.android.habitica.R; import com.habitrpg.android.habitica.ui.activities.SetupActivity; import com.habitrpg.android.habitica.ui.adapter.setup.TaskSetupAdapter; +import com.habitrpg.android.habitica.ui.fragments.BaseFragment; import java.util.ArrayList; import java.util.Arrays; @@ -24,7 +25,7 @@ import java.util.Map; import butterknife.Bind; import butterknife.ButterKnife; -public class TaskSetupFragment extends Fragment { +public class TaskSetupFragment extends BaseFragment { View view; diff --git a/Habitica/src/com/habitrpg/android/habitica/ui/fragments/tasks/TaskRecyclerViewFragment.java b/Habitica/src/com/habitrpg/android/habitica/ui/fragments/tasks/TaskRecyclerViewFragment.java index 08db987c0..1601553ac 100644 --- a/Habitica/src/com/habitrpg/android/habitica/ui/fragments/tasks/TaskRecyclerViewFragment.java +++ b/Habitica/src/com/habitrpg/android/habitica/ui/fragments/tasks/TaskRecyclerViewFragment.java @@ -102,4 +102,9 @@ public class TaskRecyclerViewFragment extends BaseFragment implements View.OnCli EventBus.getDefault().post(event); } + + @Override + public String getDisplayedClassName() { + return this.classType + super.getDisplayedClassName(); + } } diff --git a/Habitica/src/com/habitrpg/android/habitica/ui/fragments/tasks/TasksFragment.java b/Habitica/src/com/habitrpg/android/habitica/ui/fragments/tasks/TasksFragment.java index e2b1b4f3f..d9b35d284 100644 --- a/Habitica/src/com/habitrpg/android/habitica/ui/fragments/tasks/TasksFragment.java +++ b/Habitica/src/com/habitrpg/android/habitica/ui/fragments/tasks/TasksFragment.java @@ -531,4 +531,9 @@ public class TasksFragment extends BaseMainFragment implements OnCheckedChangeLi break; } } + + @Override + public String getDisplayedClassName() { + return null; + } }