From b41a5725fc2e27aff0e3039fc89c59346f31caed Mon Sep 17 00:00:00 2001 From: Roman Romanov Date: Fri, 2 Jun 2017 14:48:37 +0400 Subject: [PATCH 1/6] [android] Cold startup info statistics tracking --- android/AndroidManifest.xml | 1 + .../background/BatteryStatusReceiver.java | 29 +++++++++++++++ .../util/statistics/Statistics.java | 37 +++++++++++++++++++ 3 files changed, 67 insertions(+) create mode 100644 android/src/com/mapswithme/maps/background/BatteryStatusReceiver.java diff --git a/android/AndroidManifest.xml b/android/AndroidManifest.xml index bcc4493793..8262e318de 100644 --- a/android/AndroidManifest.xml +++ b/android/AndroidManifest.xml @@ -34,6 +34,7 @@ + diff --git a/android/src/com/mapswithme/maps/background/BatteryStatusReceiver.java b/android/src/com/mapswithme/maps/background/BatteryStatusReceiver.java new file mode 100644 index 0000000000..4d0e3d3262 --- /dev/null +++ b/android/src/com/mapswithme/maps/background/BatteryStatusReceiver.java @@ -0,0 +1,29 @@ +package com.mapswithme.maps.background; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.os.BatteryManager; + +import com.mapswithme.util.statistics.Statistics; + +public class BatteryStatusReceiver extends BroadcastReceiver +{ + + @Override + public void onReceive(Context context, Intent intent) + { + int level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0); + int chargePlug = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1); + final String charging; + if (chargePlug > 0) + charging = "on"; + else if (chargePlug < 0) + charging = "unknown"; + else + charging = "off"; + + Statistics.INSTANCE.trackColdStartupInfo(level, charging); + context.unregisterReceiver(this); + } +} diff --git a/android/src/com/mapswithme/util/statistics/Statistics.java b/android/src/com/mapswithme/util/statistics/Statistics.java index fe5dd92f8a..e95f51c576 100644 --- a/android/src/com/mapswithme/util/statistics/Statistics.java +++ b/android/src/com/mapswithme/util/statistics/Statistics.java @@ -39,6 +39,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import static com.mapswithme.util.statistics.Statistics.EventName.APPLICATION_COLD_STARTUP_INFO; import static com.mapswithme.util.statistics.Statistics.EventName.DOWNLOADER_DIALOG_ERROR; import static com.mapswithme.util.statistics.Statistics.EventName.PP_BANNER_BLANK; import static com.mapswithme.util.statistics.Statistics.EventName.PP_BANNER_ERROR; @@ -47,6 +48,8 @@ import static com.mapswithme.util.statistics.Statistics.EventName.PP_OWNERSHIP_B import static com.mapswithme.util.statistics.Statistics.EventName.PP_SPONSORED_BOOK; import static com.mapswithme.util.statistics.Statistics.EventParam.BANNER; import static com.mapswithme.util.statistics.Statistics.EventParam.BANNER_STATE; +import static com.mapswithme.util.statistics.Statistics.EventParam.BATTERY; +import static com.mapswithme.util.statistics.Statistics.EventParam.CHARGING; import static com.mapswithme.util.statistics.Statistics.EventParam.ERROR_CODE; import static com.mapswithme.util.statistics.Statistics.EventParam.ERROR_MESSAGE; import static com.mapswithme.util.statistics.Statistics.EventParam.FEATURE_ID; @@ -56,6 +59,7 @@ import static com.mapswithme.util.statistics.Statistics.EventParam.HOTEL_LON; import static com.mapswithme.util.statistics.Statistics.EventParam.MAP_DATA_SIZE; import static com.mapswithme.util.statistics.Statistics.EventParam.MWM_NAME; import static com.mapswithme.util.statistics.Statistics.EventParam.MWM_VERSION; +import static com.mapswithme.util.statistics.Statistics.EventParam.NETWORK; import static com.mapswithme.util.statistics.Statistics.EventParam.PROVIDER; import static com.mapswithme.util.statistics.Statistics.EventParam.RESTAURANT; import static com.mapswithme.util.statistics.Statistics.EventParam.RESTAURANT_LAT; @@ -201,6 +205,9 @@ public enum Statistics public static final String EDITOR_SHARE_CLICK = "Editor_SecondTimeShare_click"; public static final String EDITOR_REPORT = "Editor_Problem_report"; + // Cold start + public static final String APPLICATION_COLD_STARTUP_INFO = "Application_ColdStartup_info"; + public static class Settings { public static final String WEB_SITE = "Setings. Go to website"; @@ -286,6 +293,9 @@ public enum Statistics static final String ERROR_CODE = "error_code"; static final String ERROR_MESSAGE = "error_message"; static final String MAP_DATA_SIZE = "map_data_size:"; + static final String BATTERY = "battery"; + static final String CHARGING = "charging"; + static final String NETWORK = "network"; private EventParam() {} } @@ -609,6 +619,33 @@ public enum Statistics .get()); } + public void trackColdStartupInfo(int batteryLevel, @NonNull String chargingStatus) + { + final String network; + if (ConnectionState.isWifiConnected()) + { + network = "wifi"; + } + else if (ConnectionState.isMobileConnected()) + { + if (ConnectionState.isInRoaming()) + network = "roaming (android)"; + else + network = "mobile"; + } + else + { + network = "off"; + } + + trackEvent(APPLICATION_COLD_STARTUP_INFO, + params() + .add(BATTERY, batteryLevel) + .add(CHARGING, chargingStatus) + .add(NETWORK, network) + .get()); + } + public static ParameterBuilder params() { return new ParameterBuilder(); From 04b47f6b62812fb2838eae201f113ebf70dc92b8 Mon Sep 17 00:00:00 2001 From: Roman Romanov Date: Fri, 2 Jun 2017 15:32:41 +0400 Subject: [PATCH 2/6] [android] remove BatteryStatusReceiver. --- .../background/BatteryStatusReceiver.java | 29 ------------------- .../util/statistics/Statistics.java | 18 ++++++++++-- 2 files changed, 15 insertions(+), 32 deletions(-) delete mode 100644 android/src/com/mapswithme/maps/background/BatteryStatusReceiver.java diff --git a/android/src/com/mapswithme/maps/background/BatteryStatusReceiver.java b/android/src/com/mapswithme/maps/background/BatteryStatusReceiver.java deleted file mode 100644 index 4d0e3d3262..0000000000 --- a/android/src/com/mapswithme/maps/background/BatteryStatusReceiver.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.mapswithme.maps.background; - -import android.content.BroadcastReceiver; -import android.content.Context; -import android.content.Intent; -import android.os.BatteryManager; - -import com.mapswithme.util.statistics.Statistics; - -public class BatteryStatusReceiver extends BroadcastReceiver -{ - - @Override - public void onReceive(Context context, Intent intent) - { - int level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0); - int chargePlug = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1); - final String charging; - if (chargePlug > 0) - charging = "on"; - else if (chargePlug < 0) - charging = "unknown"; - else - charging = "off"; - - Statistics.INSTANCE.trackColdStartupInfo(level, charging); - context.unregisterReceiver(this); - } -} diff --git a/android/src/com/mapswithme/util/statistics/Statistics.java b/android/src/com/mapswithme/util/statistics/Statistics.java index e95f51c576..0975ef599c 100644 --- a/android/src/com/mapswithme/util/statistics/Statistics.java +++ b/android/src/com/mapswithme/util/statistics/Statistics.java @@ -2,9 +2,11 @@ package com.mapswithme.util.statistics; import android.app.Activity; import android.content.Context; +import android.content.Intent; import android.location.Location; import android.net.ConnectivityManager; import android.net.NetworkInfo; +import android.os.BatteryManager; import android.os.Build; import android.support.annotation.IntDef; import android.support.annotation.NonNull; @@ -619,8 +621,18 @@ public enum Statistics .get()); } - public void trackColdStartupInfo(int batteryLevel, @NonNull String chargingStatus) + public void trackColdStartupInfo(@NonNull Intent batteryStatus) { + int level = batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, 0); + int chargePlug = batteryStatus.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1); + final String charging; + if (chargePlug > 0) + charging = "on"; + else if (chargePlug < 0) + charging = "unknown"; + else + charging = "off"; + final String network; if (ConnectionState.isWifiConnected()) { @@ -640,8 +652,8 @@ public enum Statistics trackEvent(APPLICATION_COLD_STARTUP_INFO, params() - .add(BATTERY, batteryLevel) - .add(CHARGING, chargingStatus) + .add(BATTERY, level) + .add(CHARGING, charging) .add(NETWORK, network) .get()); } From a0641b2c39ec0ced70f1411f1b5aaa81c208b46f Mon Sep 17 00:00:00 2001 From: Roman Romanov Date: Fri, 2 Jun 2017 16:08:43 +0400 Subject: [PATCH 3/6] [android] refactoring --- .../com/mapswithme/maps/MwmApplication.java | 17 ++++++++ .../maps/background/AppBackgroundTracker.java | 39 +++++++++++++++---- 2 files changed, 49 insertions(+), 7 deletions(-) diff --git a/android/src/com/mapswithme/maps/MwmApplication.java b/android/src/com/mapswithme/maps/MwmApplication.java index 21a8c0d89a..5002eb01bd 100644 --- a/android/src/com/mapswithme/maps/MwmApplication.java +++ b/android/src/com/mapswithme/maps/MwmApplication.java @@ -2,6 +2,8 @@ package com.mapswithme.maps; import android.app.Application; import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; import android.content.SharedPreferences; import android.content.pm.PackageManager.NameNotFoundException; import android.os.Environment; @@ -101,6 +103,20 @@ public class MwmApplication extends Application } }; + @NonNull + private final AppBackgroundTracker.OnFirstLaunchListener mFirstLaunchListener = + new AppBackgroundTracker.OnFirstLaunchListener() + { + @Override + public void onFirstLaunch() + { + IntentFilter filter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED); + Intent batteryStatus = registerReceiver(null, filter); + if (batteryStatus != null) + Statistics.INSTANCE.trackColdStartupInfo(batteryStatus); + } + }; + public MwmApplication() { super(); @@ -182,6 +198,7 @@ public class MwmApplication extends Application mBackgroundTracker = new AppBackgroundTracker(); mBackgroundTracker.addListener(mBackgroundListener); + mBackgroundTracker.addListener(mFirstLaunchListener); TrackRecorder.init(); Editor.init(); mIsPlatformInitialized = true; diff --git a/android/src/com/mapswithme/maps/background/AppBackgroundTracker.java b/android/src/com/mapswithme/maps/background/AppBackgroundTracker.java index 3c88fa8ee2..6c765b7b27 100644 --- a/android/src/com/mapswithme/maps/background/AppBackgroundTracker.java +++ b/android/src/com/mapswithme/maps/background/AppBackgroundTracker.java @@ -23,7 +23,8 @@ public final class AppBackgroundTracker private static final String TAG = AppBackgroundTracker.class.getSimpleName(); private static final int TRANSITION_DELAY_MS = 1000; - private final Listeners mListeners = new Listeners<>(); + private final Listeners mTransitionListeners = new Listeners<>(); + private final Listeners mFirstLaunchListeners = new Listeners<>(); private SparseArray> mActivities = new SparseArray<>(); private boolean mForeground; @@ -47,7 +48,7 @@ public final class AppBackgroundTracker mForeground = (mActivities.size() > 0); if (mForeground != old) - notifyListeners(); + notifyTransitionListeners(); } }; @@ -64,6 +65,8 @@ public final class AppBackgroundTracker public void onActivityStarted(Activity activity) { LOGGER.d(TAG, "onActivityStarted activity = " + activity); + if (mActivities.size() == 0) + notifyFirstLaunchListeners(); mActivities.put(activity.hashCode(), new WeakReference<>(activity)); onActivityChanged(); } @@ -112,6 +115,11 @@ public final class AppBackgroundTracker void onTransit(boolean foreground); } + public interface OnFirstLaunchListener + { + void onFirstLaunch(); + } + public AppBackgroundTracker() { MwmApplication.get().registerActivityLifecycleCallbacks(mAppLifecycleCallbacks); @@ -122,21 +130,38 @@ public final class AppBackgroundTracker return mForeground; } - private void notifyListeners() + private void notifyTransitionListeners() { - for (OnTransitionListener listener : mListeners) + for (OnTransitionListener listener : mTransitionListeners) listener.onTransit(mForeground); - mListeners.finishIterate(); + mTransitionListeners.finishIterate(); + } + + private void notifyFirstLaunchListeners() + { + for (OnFirstLaunchListener listener : mFirstLaunchListeners) + listener.onFirstLaunch(); + mTransitionListeners.finishIterate(); } public void addListener(OnTransitionListener listener) { - mListeners.register(listener); + mTransitionListeners.register(listener); } public void removeListener(OnTransitionListener listener) { - mListeners.unregister(listener); + mTransitionListeners.unregister(listener); + } + + public void addListener(OnFirstLaunchListener listener) + { + mFirstLaunchListeners.register(listener); + } + + public void removeListener(OnFirstLaunchListener listener) + { + mFirstLaunchListeners.unregister(listener); } @android.support.annotation.UiThread From 2b98d3fc8dcd8f5d55425919358da06feaeee826 Mon Sep 17 00:00:00 2001 From: Roman Romanov Date: Fri, 2 Jun 2017 16:43:55 +0400 Subject: [PATCH 4/6] [android] OnFirstLaunchListener -> OnVisibleAppLaunchListener --- .../com/mapswithme/maps/MwmApplication.java | 8 +++---- .../maps/background/AppBackgroundTracker.java | 22 +++++++++---------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/android/src/com/mapswithme/maps/MwmApplication.java b/android/src/com/mapswithme/maps/MwmApplication.java index 5002eb01bd..dc2c49b8d5 100644 --- a/android/src/com/mapswithme/maps/MwmApplication.java +++ b/android/src/com/mapswithme/maps/MwmApplication.java @@ -104,11 +104,11 @@ public class MwmApplication extends Application }; @NonNull - private final AppBackgroundTracker.OnFirstLaunchListener mFirstLaunchListener = - new AppBackgroundTracker.OnFirstLaunchListener() + private final AppBackgroundTracker.OnVisibleAppLaunchListener mVisibleAppLaunchListener = + new AppBackgroundTracker.OnVisibleAppLaunchListener() { @Override - public void onFirstLaunch() + public void onVisibleAppLaunch() { IntentFilter filter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED); Intent batteryStatus = registerReceiver(null, filter); @@ -198,7 +198,7 @@ public class MwmApplication extends Application mBackgroundTracker = new AppBackgroundTracker(); mBackgroundTracker.addListener(mBackgroundListener); - mBackgroundTracker.addListener(mFirstLaunchListener); + mBackgroundTracker.addListener(mVisibleAppLaunchListener); TrackRecorder.init(); Editor.init(); mIsPlatformInitialized = true; diff --git a/android/src/com/mapswithme/maps/background/AppBackgroundTracker.java b/android/src/com/mapswithme/maps/background/AppBackgroundTracker.java index 6c765b7b27..96d3efb66f 100644 --- a/android/src/com/mapswithme/maps/background/AppBackgroundTracker.java +++ b/android/src/com/mapswithme/maps/background/AppBackgroundTracker.java @@ -24,7 +24,7 @@ public final class AppBackgroundTracker private static final int TRANSITION_DELAY_MS = 1000; private final Listeners mTransitionListeners = new Listeners<>(); - private final Listeners mFirstLaunchListeners = new Listeners<>(); + private final Listeners mVisibleAppLaunchListeners = new Listeners<>(); private SparseArray> mActivities = new SparseArray<>(); private boolean mForeground; @@ -66,7 +66,7 @@ public final class AppBackgroundTracker { LOGGER.d(TAG, "onActivityStarted activity = " + activity); if (mActivities.size() == 0) - notifyFirstLaunchListeners(); + notifyVisibleAppLaunchListeners(); mActivities.put(activity.hashCode(), new WeakReference<>(activity)); onActivityChanged(); } @@ -115,9 +115,9 @@ public final class AppBackgroundTracker void onTransit(boolean foreground); } - public interface OnFirstLaunchListener + public interface OnVisibleAppLaunchListener { - void onFirstLaunch(); + void onVisibleAppLaunch(); } public AppBackgroundTracker() @@ -137,10 +137,10 @@ public final class AppBackgroundTracker mTransitionListeners.finishIterate(); } - private void notifyFirstLaunchListeners() + private void notifyVisibleAppLaunchListeners() { - for (OnFirstLaunchListener listener : mFirstLaunchListeners) - listener.onFirstLaunch(); + for (OnVisibleAppLaunchListener listener : mVisibleAppLaunchListeners) + listener.onVisibleAppLaunch(); mTransitionListeners.finishIterate(); } @@ -154,14 +154,14 @@ public final class AppBackgroundTracker mTransitionListeners.unregister(listener); } - public void addListener(OnFirstLaunchListener listener) + public void addListener(OnVisibleAppLaunchListener listener) { - mFirstLaunchListeners.register(listener); + mVisibleAppLaunchListeners.register(listener); } - public void removeListener(OnFirstLaunchListener listener) + public void removeListener(OnVisibleAppLaunchListener listener) { - mFirstLaunchListeners.unregister(listener); + mVisibleAppLaunchListeners.unregister(listener); } @android.support.annotation.UiThread From 4f2e37e3ea47a5f0dff2789fd1a0d962c74d851e Mon Sep 17 00:00:00 2001 From: Roman Romanov Date: Fri, 2 Jun 2017 17:27:27 +0400 Subject: [PATCH 5/6] [android] remove unnecessary AppBackgroundTracker initialization. --- android/src/com/mapswithme/maps/MwmApplication.java | 1 - 1 file changed, 1 deletion(-) diff --git a/android/src/com/mapswithme/maps/MwmApplication.java b/android/src/com/mapswithme/maps/MwmApplication.java index dc2c49b8d5..825470bfa0 100644 --- a/android/src/com/mapswithme/maps/MwmApplication.java +++ b/android/src/com/mapswithme/maps/MwmApplication.java @@ -196,7 +196,6 @@ public class MwmApplication extends Application if (!isInstallationIdFound) setInstallationIdToCrashlytics(); - mBackgroundTracker = new AppBackgroundTracker(); mBackgroundTracker.addListener(mBackgroundListener); mBackgroundTracker.addListener(mVisibleAppLaunchListener); TrackRecorder.init(); From f172a5182f1b1a54d0d6e720448af104d54216e3 Mon Sep 17 00:00:00 2001 From: Roman Romanov Date: Fri, 2 Jun 2017 18:04:47 +0400 Subject: [PATCH 6/6] [android] fixed bug with VisibleAppLaunchListeners --- android/src/com/mapswithme/maps/MwmApplication.java | 2 +- .../com/mapswithme/maps/background/AppBackgroundTracker.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/android/src/com/mapswithme/maps/MwmApplication.java b/android/src/com/mapswithme/maps/MwmApplication.java index 825470bfa0..a55b55fd4b 100644 --- a/android/src/com/mapswithme/maps/MwmApplication.java +++ b/android/src/com/mapswithme/maps/MwmApplication.java @@ -168,6 +168,7 @@ public class MwmApplication extends Application mPrefs = getSharedPreferences(getString(R.string.pref_file_name), MODE_PRIVATE); mBackgroundTracker = new AppBackgroundTracker(); + mBackgroundTracker.addListener(mVisibleAppLaunchListener); } public void initNativePlatform() @@ -197,7 +198,6 @@ public class MwmApplication extends Application setInstallationIdToCrashlytics(); mBackgroundTracker.addListener(mBackgroundListener); - mBackgroundTracker.addListener(mVisibleAppLaunchListener); TrackRecorder.init(); Editor.init(); mIsPlatformInitialized = true; diff --git a/android/src/com/mapswithme/maps/background/AppBackgroundTracker.java b/android/src/com/mapswithme/maps/background/AppBackgroundTracker.java index 96d3efb66f..76a8463aa7 100644 --- a/android/src/com/mapswithme/maps/background/AppBackgroundTracker.java +++ b/android/src/com/mapswithme/maps/background/AppBackgroundTracker.java @@ -141,7 +141,7 @@ public final class AppBackgroundTracker { for (OnVisibleAppLaunchListener listener : mVisibleAppLaunchListeners) listener.onVisibleAppLaunch(); - mTransitionListeners.finishIterate(); + mVisibleAppLaunchListeners.finishIterate(); } public void addListener(OnTransitionListener listener)