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/MwmApplication.java b/android/src/com/mapswithme/maps/MwmApplication.java index 21a8c0d89a..a55b55fd4b 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.OnVisibleAppLaunchListener mVisibleAppLaunchListener = + new AppBackgroundTracker.OnVisibleAppLaunchListener() + { + @Override + public void onVisibleAppLaunch() + { + IntentFilter filter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED); + Intent batteryStatus = registerReceiver(null, filter); + if (batteryStatus != null) + Statistics.INSTANCE.trackColdStartupInfo(batteryStatus); + } + }; + public MwmApplication() { super(); @@ -152,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() @@ -180,7 +197,6 @@ public class MwmApplication extends Application if (!isInstallationIdFound) setInstallationIdToCrashlytics(); - mBackgroundTracker = new AppBackgroundTracker(); mBackgroundTracker.addListener(mBackgroundListener); TrackRecorder.init(); Editor.init(); diff --git a/android/src/com/mapswithme/maps/background/AppBackgroundTracker.java b/android/src/com/mapswithme/maps/background/AppBackgroundTracker.java index 3c88fa8ee2..76a8463aa7 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 mVisibleAppLaunchListeners = 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) + notifyVisibleAppLaunchListeners(); mActivities.put(activity.hashCode(), new WeakReference<>(activity)); onActivityChanged(); } @@ -112,6 +115,11 @@ public final class AppBackgroundTracker void onTransit(boolean foreground); } + public interface OnVisibleAppLaunchListener + { + void onVisibleAppLaunch(); + } + 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 notifyVisibleAppLaunchListeners() + { + for (OnVisibleAppLaunchListener listener : mVisibleAppLaunchListeners) + listener.onVisibleAppLaunch(); + mVisibleAppLaunchListeners.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(OnVisibleAppLaunchListener listener) + { + mVisibleAppLaunchListeners.register(listener); + } + + public void removeListener(OnVisibleAppLaunchListener listener) + { + mVisibleAppLaunchListeners.unregister(listener); } @android.support.annotation.UiThread diff --git a/android/src/com/mapswithme/util/statistics/Statistics.java b/android/src/com/mapswithme/util/statistics/Statistics.java index fe5dd92f8a..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; @@ -39,6 +41,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 +50,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 +61,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 +207,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 +295,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 +621,43 @@ public enum Statistics .get()); } + 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()) + { + 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, level) + .add(CHARGING, charging) + .add(NETWORK, network) + .get()); + } + public static ParameterBuilder params() { return new ParameterBuilder();