Skip to content
This repository has been archived by the owner on Apr 12, 2022. It is now read-only.

Commit

Permalink
Merge pull request #2425 from vector-im/feature/analytics
Browse files Browse the repository at this point in the history
Feature/analytics
  • Loading branch information
ganfra committed Jul 16, 2018
2 parents c0a12c8 + 9c6c918 commit 0f9b78a
Show file tree
Hide file tree
Showing 10 changed files with 259 additions and 119 deletions.
3 changes: 2 additions & 1 deletion CHANGES.rst
Expand Up @@ -2,9 +2,10 @@ Changes in Riot 0.8.13 (2018-XX-XX)
===================================================

Features:
-
- Resurrect performance metrics (#2391)

Improvements:
- Piwik: Update the way how stats are reported (#2402)
- Improve BugReport screen: display a preview of the screenshot (#2318)

Other changes:
Expand Down
20 changes: 14 additions & 6 deletions vector/src/main/java/im/vector/Matrix.java
Expand Up @@ -33,6 +33,7 @@
import org.matrix.androidsdk.crypto.MXCrypto;
import org.matrix.androidsdk.data.Room;
import org.matrix.androidsdk.data.RoomState;
import org.matrix.androidsdk.data.metrics.MetricsListener;
import org.matrix.androidsdk.data.store.IMXStore;
import org.matrix.androidsdk.data.store.MXFileStore;
import org.matrix.androidsdk.db.MXLatestChatMessageCache;
Expand Down Expand Up @@ -60,6 +61,8 @@

import im.vector.activity.CommonActivityUtils;
import im.vector.activity.SplashActivity;
import im.vector.analytics.MetricsListenerProxy;
import im.vector.analytics.PiwikAnalytics;
import im.vector.gcm.GcmRegistrationManager;
import im.vector.services.EventStreamService;
import im.vector.store.LoginStorage;
Expand Down Expand Up @@ -624,17 +627,22 @@ public MXSession createSession(HomeServerConnectionConfig hsConfig) {
private MXSession createSession(final Context context, HomeServerConnectionConfig hsConfig) {
IMXStore store;

Credentials credentials = hsConfig.getCredentials();
final MetricsListener metricsListener = new MetricsListenerProxy(VectorApp.getInstance().getAnalytics());
final Credentials credentials = hsConfig.getCredentials();

/*if (true) {*/
store = new MXFileStore(hsConfig, context);
store.setMetricsListener(metricsListener);

/*} else {
store = new MXMemoryStore(hsConfig.getCredentials(), context);
}*/

final MXSession session = new MXSession(hsConfig, new MXDataHandler(store, credentials), mAppContext);

session.getDataHandler().setRequestNetworkErrorListener(new MXDataHandler.RequestNetworkErrorListener() {
final MXDataHandler dataHandler = new MXDataHandler(store, credentials);
final MXSession session = new MXSession(hsConfig, dataHandler, mAppContext);
session.setMetricsListener(metricsListener);
dataHandler.setMetricsListener(metricsListener);
dataHandler.setRequestNetworkErrorListener(new MXDataHandler.RequestNetworkErrorListener() {

@Override
public void onConfigurationError(String matrixErrorCode) {
Expand Down Expand Up @@ -682,10 +690,10 @@ public void onReject() {
session.enableCryptoWhenStarting();
}

session.getDataHandler().addListener(mLiveEventListener);
dataHandler.addListener(mLiveEventListener);
session.setUseDataSaveMode(PreferencesManager.useDataSaveMode(context));

session.getDataHandler().addListener(new MXEventListener() {
dataHandler.addListener(new MXEventListener() {
@Override
public void onInitialSyncComplete(String toToken) {
if (null != session.getCrypto()) {
Expand Down
142 changes: 33 additions & 109 deletions vector/src/main/java/im/vector/VectorApp.java
Expand Up @@ -75,6 +75,9 @@
import im.vector.activity.VectorCallViewActivity;
import im.vector.activity.VectorMediasPickerActivity;
import im.vector.activity.WidgetActivity;
import im.vector.analytics.Analytics;
import im.vector.analytics.AppAnalytics;
import im.vector.analytics.PiwikAnalytics;
import im.vector.contacts.ContactsManager;
import im.vector.contacts.PIDsRetriever;
import im.vector.gcm.GcmRegistrationManager;
Expand Down Expand Up @@ -127,10 +130,8 @@ public class VectorApp extends MultiDexApplication {
/**
* Google analytics information.
*/
public static int VERSION_BUILD = -1;
private static String VECTOR_VERSION_STRING = "";
private static String SDK_VERSION_STRING = "";
private static String SHORT_VERSION = "";

/**
* Tells if there a pending call whereas the application is backgrounded.
Expand All @@ -152,6 +153,8 @@ public class VectorApp extends MultiDexApplication {
*/
private CallsManager mCallsManager;

private Analytics mAppAnalytics;

/**
* @return the current instance
*/
Expand Down Expand Up @@ -203,31 +206,18 @@ public void onCreate() {

instance = this;
mCallsManager = new CallsManager(this);
mAppAnalytics = new AppAnalytics(this, new PiwikAnalytics(this));

mActivityTransitionTimer = null;
mActivityTransitionTimerTask = null;

try {
PackageInfo packageInfo = getPackageManager().getPackageInfo(getPackageName(), 0);
VERSION_BUILD = packageInfo.versionCode;
} catch (PackageManager.NameNotFoundException e) {
Log.e(LOG_TAG, "fails to retrieve the package info " + e.getMessage(), e);
}

VECTOR_VERSION_STRING = Matrix.getInstance(this).getVersion(true, true);

// not the first launch
if (null != Matrix.getInstance(this).getDefaultSession()) {
SDK_VERSION_STRING = Matrix.getInstance(this).getDefaultSession().getVersion(true);
} else {
SDK_VERSION_STRING = "";
}

try {
PackageInfo pInfo = getPackageManager().getPackageInfo(getPackageName(), 0);
SHORT_VERSION = pInfo.versionName;
} catch (Exception e) {
}

mLogsDirectoryFile = new File(getCacheDir().getAbsolutePath() + "/logs");

org.matrix.androidsdk.util.Log.setLogDirectory(mLogsDirectoryFile);
Expand Down Expand Up @@ -353,6 +343,7 @@ public void onActivityDestroyed(Activity activity) {

PreferencesManager.fixMigrationIssues(this);
initApplicationLocale();
visitSessionVariables();
}

@Override
Expand Down Expand Up @@ -491,6 +482,7 @@ public void run() {
}
}


/**
* List the used permissions statuses.
*/
Expand Down Expand Up @@ -608,6 +600,13 @@ private void setCurrentActivity(Activity activity) {
}
}

/**
* @return the analytics app instance
*/
public Analytics getAnalytics() {
return mAppAnalytics;
}

/**
* @return the current active activity
*/
Expand Down Expand Up @@ -1076,77 +1075,22 @@ public static String localeToLocalisedString(Locale locale) {
}

//==============================================================================================================
// Piwik management
// Analytics management
//==============================================================================================================

// the piwik tracker
private Tracker mPiwikTracker;

/**
* Set the visit variable
*
* @param trackMe
* @param id
* @param name
* @param value
*/
private static final void visitVariables(TrackMe trackMe, int id, String name, String value) {
CustomVariables customVariables = new CustomVariables(trackMe.get(QueryParams.VISIT_SCOPE_CUSTOM_VARIABLES));
customVariables.put(id, name, value);
trackMe.set(QueryParams.VISIT_SCOPE_CUSTOM_VARIABLES, customVariables.toString());
}

/**
* @return the piwik instance
*/
private Tracker getPiwikTracker() {
if (mPiwikTracker == null) {
try {
mPiwikTracker = Piwik.getInstance(this).newTracker(new TrackerConfig("https://piwik.riot.im/", 1, "AndroidPiwikTracker"));
// sends the tracking information each minute
// the app might be killed in background
mPiwikTracker.setDispatchInterval(30 * 1000);

//
TrackMe trackMe = mPiwikTracker.getDefaultTrackMe();

visitVariables(trackMe, 1, "App Platform", "Android Platform");
visitVariables(trackMe, 2, "App Version", SHORT_VERSION);
visitVariables(trackMe, 4, "Chosen Language", getApplicationLocale().toString());

if (null != Matrix.getInstance(this).getDefaultSession()) {
MXSession session = Matrix.getInstance(this).getDefaultSession();

visitVariables(trackMe, 7, "Homeserver URL", session.getHomeServerConfig().getHomeserverUri().toString());
visitVariables(trackMe, 8, "Identity Server URL", session.getHomeServerConfig().getIdentityServerUri().toString());
}
} catch (Throwable t) {
Log.e(LOG_TAG, "## getPiwikTracker() : newTracker failed " + t.getMessage(), t);
}
}

return mPiwikTracker;
}


/**
* Add the stats variables to the piwik screen.
*
* @return the piwik screen
* Send session custom variables
*/
private TrackHelper.Screen addCustomVariables(TrackHelper.Screen screen) {
screen.variable(1, "App Platform", "Android Platform");
screen.variable(2, "App Version", SHORT_VERSION);
screen.variable(4, "Chosen Language", getApplicationLocale().toString());

if (null != Matrix.getInstance(this).getDefaultSession()) {
MXSession session = Matrix.getInstance(this).getDefaultSession();

screen.variable(7, "Homeserver URL", session.getHomeServerConfig().getHomeserverUri().toString());
screen.variable(8, "Identity Server URL", session.getHomeServerConfig().getIdentityServerUri().toString());
private void visitSessionVariables() {
mAppAnalytics.visitVariable(1, "App Platform", "Android Platform");
mAppAnalytics.visitVariable(2, "App Version", BuildConfig.VERSION_NAME);
mAppAnalytics.visitVariable(4, "Chosen Language", getApplicationLocale().toString());

final MXSession session = Matrix.getInstance(this).getDefaultSession();
if (session != null) {
mAppAnalytics.visitVariable(7, "Homeserver URL", session.getHomeServerConfig().getHomeserverUri().toString());
mAppAnalytics.visitVariable(8, "Identity Server URL", session.getHomeServerConfig().getIdentityServerUri().toString());
}

return screen;
}

/**
Expand All @@ -1155,37 +1099,17 @@ private TrackHelper.Screen addCustomVariables(TrackHelper.Screen screen) {
* @param activity the new activity
*/
private void onNewScreen(Activity activity) {
if (PreferencesManager.useAnalytics(this)) {
Tracker tracker = getPiwikTracker();
if (null != tracker) {
try {
TrackHelper.Screen screen = TrackHelper.track().screen("/android/" + Matrix.getApplicationName()
+ "/" + getString(R.string.flavor_description)
+ "/" + SHORT_VERSION
+ "/" + activity.getClass().getName().replace(".", "/"));
addCustomVariables(screen).with(tracker);
} catch (Throwable t) {
Log.e(LOG_TAG, "## onNewScreen() : failed " + t.getMessage(), t);
}
}
}
final String screenPath = "/android/" + Matrix.getApplicationName()
+ "/" + getString(R.string.flavor_description)
+ "/" + BuildConfig.VERSION_NAME
+ "/" + activity.getClass().getName().replace(".", "/");
mAppAnalytics.trackScreen(screenPath, null);
}


/**
* The application is paused.
*/
private void onAppPause() {
if (PreferencesManager.useAnalytics(this)) {
Tracker tracker = getPiwikTracker();
if (null != tracker) {
try {
// force to send the pending actions
tracker.dispatch();
} catch (Throwable t) {
Log.e(LOG_TAG, "## onAppPause() : failed " + t.getMessage(), t);
}
}
}
mAppAnalytics.forceDispatch();
}
}
6 changes: 6 additions & 0 deletions vector/src/main/java/im/vector/activity/SplashActivity.java
Expand Up @@ -42,6 +42,8 @@
import im.vector.Matrix;
import im.vector.R;
import im.vector.VectorApp;
import im.vector.analytics.Event;
import im.vector.analytics.PiwikAnalytics;
import im.vector.gcm.GcmRegistrationManager;
import im.vector.receiver.VectorUniversalLinkReceiver;
import im.vector.services.EventStreamService;
Expand Down Expand Up @@ -91,6 +93,10 @@ private boolean hasCorruptedStore() {
*/
private void onFinish() {
Log.e(LOG_TAG, "##onFinish() : start VectorHomeActivity");
final long finishTime = System.currentTimeMillis();
final long duration = finishTime - mLaunchTime;
final Event event = new Event.LaunchScreen(duration);
VectorApp.getInstance().getAnalytics().trackEvent(event);

if (!hasCorruptedStore()) {
// Go to the home page
Expand Down
Expand Up @@ -109,6 +109,7 @@

import butterknife.BindView;
import butterknife.OnClick;
import im.vector.BuildConfig;
import im.vector.Matrix;
import im.vector.MyPresenceManager;
import im.vector.PublicRoomsManager;
Expand Down Expand Up @@ -323,13 +324,13 @@ public void initUiAndData() {
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
int version = preferences.getInt(PreferencesManager.VERSION_BUILD, 0);

if (version != VectorApp.VERSION_BUILD) {
Log.d(LOG_TAG, "The application has been updated from version " + version + " to version " + VectorApp.VERSION_BUILD);
if (version != BuildConfig.VERSION_CODE) {
Log.d(LOG_TAG, "The application has been updated from version " + version + " to version " + BuildConfig.VERSION_CODE);

// TODO add some dedicated actions here

preferences.edit()
.putInt(PreferencesManager.VERSION_BUILD, VectorApp.VERSION_BUILD)
.putInt(PreferencesManager.VERSION_BUILD, BuildConfig.VERSION_CODE)
.apply();
}

Expand Down
34 changes: 34 additions & 0 deletions vector/src/main/java/im/vector/analytics/Analytics.kt
@@ -0,0 +1,34 @@
package im.vector.analytics

/**
* Defines the available tracking methods.
*/
interface Analytics {

/**
* Method to track a screen in the analytic solution
* @param screen the path of the screen
* @param title the optional title of the screen
*/
fun trackScreen(screen: String, title: String? = null)

/**
* Method to track an event
* @param event the event to track
*/
fun trackEvent(event: Event)

/**
* Method to add custom variable to the session
* @param index the index of the variable
* @param name the name of the variable
* @param value the value of the variable
*/
fun visitVariable(index: Int, name: String, value: String)

/**
* Method to dispatch immediately the previously not dispatched metrics
*/
fun forceDispatch()

}

0 comments on commit 0f9b78a

Please sign in to comment.