From 7a72e3c66c895f68ff631059f7fecd42c339af02 Mon Sep 17 00:00:00 2001 From: Dmitry Donskoy Date: Wed, 4 Jul 2018 13:53:28 +0300 Subject: [android] Added stats for maplayers, refactored traffic state types --- .../subway/OnTransitSchemeChangedListener.java | 7 +- .../maps/maplayer/subway/TransitSchemeState.java | 29 +++- .../maps/maplayer/traffic/TrafficManager.java | 72 ++-------- .../maps/maplayer/traffic/TrafficState.java | 153 ++++++++++++++++----- .../com/mapswithme/util/statistics/Statistics.java | 26 ++++ 5 files changed, 186 insertions(+), 101 deletions(-) diff --git a/android/src/com/mapswithme/maps/maplayer/subway/OnTransitSchemeChangedListener.java b/android/src/com/mapswithme/maps/maplayer/subway/OnTransitSchemeChangedListener.java index a7191d4149..358c3fe21f 100644 --- a/android/src/com/mapswithme/maps/maplayer/subway/OnTransitSchemeChangedListener.java +++ b/android/src/com/mapswithme/maps/maplayer/subway/OnTransitSchemeChangedListener.java @@ -2,10 +2,8 @@ package com.mapswithme.maps.maplayer.subway; import android.support.annotation.MainThread; import android.support.annotation.NonNull; -import android.widget.Toast; import com.mapswithme.maps.MwmApplication; -import com.mapswithme.maps.R; import com.mapswithme.maps.content.AbstractContextualListener; public interface OnTransitSchemeChangedListener @@ -29,10 +27,7 @@ public interface OnTransitSchemeChangedListener return; TransitSchemeState state = TransitSchemeState.makeInstance(index); - if (state != TransitSchemeState.NO_DATA) - return; - - Toast.makeText(app, R.string.subway_data_unavailable, Toast.LENGTH_SHORT).show(); + state.onReceived(app); } } } diff --git a/android/src/com/mapswithme/maps/maplayer/subway/TransitSchemeState.java b/android/src/com/mapswithme/maps/maplayer/subway/TransitSchemeState.java index 55a36e5063..aec8f96b42 100644 --- a/android/src/com/mapswithme/maps/maplayer/subway/TransitSchemeState.java +++ b/android/src/com/mapswithme/maps/maplayer/subway/TransitSchemeState.java @@ -1,12 +1,32 @@ package com.mapswithme.maps.maplayer.subway; import android.support.annotation.NonNull; +import android.widget.Toast; + +import com.mapswithme.maps.MwmApplication; +import com.mapswithme.maps.R; +import com.mapswithme.util.statistics.Statistics; public enum TransitSchemeState { DISABLED, - ENABLED, - NO_DATA; + ENABLED + { + @Override + public void onReceived(@NonNull MwmApplication app) + { + Statistics.INSTANCE.trackSubwayEvent(Statistics.ParamValue.SUCCESS); + } + }, + NO_DATA + { + @Override + public void onReceived(@NonNull MwmApplication app) + { + Toast.makeText(app, R.string.subway_data_unavailable, Toast.LENGTH_SHORT).show(); + Statistics.INSTANCE.trackSubwayEvent(Statistics.ParamValue.UNAVAILABLE); + } + }; @NonNull public static TransitSchemeState makeInstance(int index) @@ -15,4 +35,9 @@ public enum TransitSchemeState throw new IllegalArgumentException("No value for index = " + index); return TransitSchemeState.values()[index]; } + + public void onReceived(@NonNull MwmApplication app) + { + /* Do nothing by default */ + } } diff --git a/android/src/com/mapswithme/maps/maplayer/traffic/TrafficManager.java b/android/src/com/mapswithme/maps/maplayer/traffic/TrafficManager.java index 1850e2f877..e2eeb2fb76 100644 --- a/android/src/com/mapswithme/maps/maplayer/traffic/TrafficManager.java +++ b/android/src/com/mapswithme/maps/maplayer/traffic/TrafficManager.java @@ -3,7 +3,6 @@ package com.mapswithme.maps.maplayer.traffic; import android.support.annotation.MainThread; import android.support.annotation.NonNull; -import com.mapswithme.util.Utils; import com.mapswithme.util.log.Logger; import com.mapswithme.util.log.LoggerFactory; @@ -17,14 +16,16 @@ public enum TrafficManager private final String mTag = TrafficManager.class.getSimpleName(); @NonNull private final Logger mLogger = LoggerFactory.INSTANCE.getLogger(LoggerFactory.Type.TRAFFIC); + @NonNull private final TrafficState.StateChangeListener mStateChangeListener = new TrafficStateListener(); - @TrafficState.Value - private int mState = TrafficState.DISABLED; - @TrafficState.Value - private int mLastPostedState = mState; + + @NonNull + private TrafficState.Type mState = TrafficState.Type.DISABLED; + @NonNull private final List mCallbacks = new ArrayList<>(); + private boolean mInitialized = false; public void initialize() @@ -80,7 +81,7 @@ public enum TrafficManager private void postPendingState() { - mStateChangeListener.onTrafficStateChanged(mState); + mStateChangeListener.onTrafficStateChanged(mState.ordinal()); } public void detachAll() @@ -124,61 +125,12 @@ public enum TrafficManager @MainThread public void onTrafficStateChanged(@TrafficState.Value int state) { - mLogger.d(mTag, "onTrafficStateChanged current state = " + TrafficState.nameOf(mState) - + " new value = " + TrafficState.nameOf(state)); - mState = state; - - iterateOverCallbacks(new Utils.Proc() - { - @Override - public void invoke(@NonNull TrafficCallback callback) - { - switch (mState) - { - case TrafficState.DISABLED: - callback.onDisabled(); - break; - - case TrafficState.ENABLED: - callback.onEnabled(); - break; - - case TrafficState.WAITING_DATA: - callback.onWaitingData(); - break; - - case TrafficState.NO_DATA: - callback.onNoData(mLastPostedState != mState); - break; - - case TrafficState.OUTDATED: - callback.onOutdated(); - break; - - case TrafficState.NETWORK_ERROR: - callback.onNetworkError(); - break; - - case TrafficState.EXPIRED_DATA: - callback.onExpiredData(mLastPostedState != mState); - break; - - case TrafficState.EXPIRED_APP: - callback.onExpiredApp(mLastPostedState != mState); - break; - - default: - throw new IllegalArgumentException("Unsupported traffic state: " + mState); - } - mLastPostedState = mState; - } - }); - } + TrafficState.Type newTrafficState = TrafficState.getType(state); + mLogger.d(mTag, "onTrafficStateChanged current state = " + mState + + " new value = " + newTrafficState); - private void iterateOverCallbacks(@NonNull Utils.Proc proc) - { - for (TrafficCallback callback : mCallbacks) - proc.invoke(callback); + newTrafficState.onReceived(mCallbacks, mState); + mState = newTrafficState; } } diff --git a/android/src/com/mapswithme/maps/maplayer/traffic/TrafficState.java b/android/src/com/mapswithme/maps/maplayer/traffic/TrafficState.java index 8f24f16d66..c1926b3d07 100644 --- a/android/src/com/mapswithme/maps/maplayer/traffic/TrafficState.java +++ b/android/src/com/mapswithme/maps/maplayer/traffic/TrafficState.java @@ -4,8 +4,11 @@ import android.support.annotation.IntDef; import android.support.annotation.MainThread; import android.support.annotation.NonNull; +import com.mapswithme.util.statistics.Statistics; + import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; +import java.util.List; final class TrafficState { @@ -24,14 +27,16 @@ final class TrafficState // These values should correspond to // TrafficManager::TrafficState enum (from map/traffic_manager.hpp) - static final int DISABLED = 0; - static final int ENABLED = 1; - static final int WAITING_DATA = 2; - static final int OUTDATED = 3; - static final int NO_DATA = 4; - static final int NETWORK_ERROR = 5; - static final int EXPIRED_DATA = 6; - static final int EXPIRED_APP = 7; + private static final int DISABLED = 0; + private static final int ENABLED = 1; + private static final int WAITING_DATA = 2; + private static final int OUTDATED = 3; + private static final int NO_DATA = 4; + private static final int NETWORK_ERROR = 5; + private static final int EXPIRED_DATA = 6; + private static final int EXPIRED_APP = 7; + + private TrafficState() {} @MainThread static native void nativeSetListener(@NonNull StateChangeListener listener); @@ -40,38 +45,120 @@ final class TrafficState static native void nativeDisable(); static native boolean nativeIsEnabled(); - private TrafficState() {} - - static String nameOf(int state) + public enum Type { - switch (state) + DISABLED + { + @Override + protected void onReceivedInternal(@NonNull TrafficManager.TrafficCallback param, + @NonNull Type lastPostedState) + { + param.onDisabled(); + } + }, + ENABLED(Statistics.ParamValue.SUCCESS) + { + @Override + protected void onReceivedInternal(@NonNull TrafficManager.TrafficCallback param, + @NonNull Type lastPostedState) + { + param.onEnabled(); + } + }, + + WAITING_DATA + { + @Override + protected void onReceivedInternal(@NonNull TrafficManager.TrafficCallback param, + @NonNull Type lastPostedState) + { + param.onWaitingData(); + } + }, + OUTDATED + { + @Override + protected void onReceivedInternal(@NonNull TrafficManager.TrafficCallback param, + @NonNull Type lastPostedState) + { + param.onOutdated(); + } + }, + NO_DATA(Statistics.ParamValue.UNAVAILABLE) + { + @Override + protected void onReceivedInternal(@NonNull TrafficManager.TrafficCallback param, + @NonNull Type lastPostedState) + { + param.onNoData(lastPostedState != NO_DATA); + } + }, + NETWORK_ERROR(Statistics.ParamValue.ERROR) + { + @Override + protected void onReceivedInternal(@NonNull TrafficManager.TrafficCallback param, + @NonNull Type lastPostedState) + { + param.onNetworkError(); + } + }, + EXPIRED_DATA + { + @Override + protected void onReceivedInternal(@NonNull TrafficManager.TrafficCallback param, + @NonNull Type lastPostedState) + { + param.onExpiredData(lastPostedState != EXPIRED_DATA); + } + }, + EXPIRED_APP + { + @Override + protected void onReceivedInternal(@NonNull TrafficManager.TrafficCallback param, + @NonNull Type lastPostedState) + { + param.onExpiredApp(lastPostedState != EXPIRED_APP); + } + }; + + @NonNull + private final String mAnalyticsParamName; + + Type() { - case DISABLED: - return "DISABLED"; - - case ENABLED: - return "ENABLED"; - - case WAITING_DATA: - return "WAITING_DATA"; + mAnalyticsParamName = name(); + } - case OUTDATED: - return "OUTDATED"; + Type(@NonNull String analyticsParamName) + { + mAnalyticsParamName = analyticsParamName; + } - case NO_DATA: - return "NO_DATA"; + @NonNull + private String getAnalyticsParamName() + { + return mAnalyticsParamName; + } - case NETWORK_ERROR: - return "NETWORK_ERROR"; + public void onReceived(@NonNull List trafficCallbacks, + @NonNull Type lastPostedState) + { + for (TrafficManager.TrafficCallback callback : trafficCallbacks) + { + onReceivedInternal(callback, lastPostedState); + Statistics.INSTANCE.trackTrafficEvent(getAnalyticsParamName()); + } + } - case EXPIRED_DATA: - return "EXPIRED_DATA"; + protected abstract void onReceivedInternal(@NonNull TrafficManager.TrafficCallback param, + @NonNull Type lastPostedState); + } - case EXPIRED_APP: - return "EXPIRED_APP"; + public static Type getType(int index) + { + if (index < 0 || index >= Type.values().length) + throw new IllegalArgumentException("Not found value for index = " + index); - default: - return "Unknown: " + state; - } + return Type.values()[index]; } } diff --git a/android/src/com/mapswithme/util/statistics/Statistics.java b/android/src/com/mapswithme/util/statistics/Statistics.java index 44d2acf5fc..884314d831 100644 --- a/android/src/com/mapswithme/util/statistics/Statistics.java +++ b/android/src/com/mapswithme/util/statistics/Statistics.java @@ -306,6 +306,7 @@ public enum Statistics public static final String UGC_AUTH_DECLINED = "UGC_Auth_declined"; public static final String UGC_AUTH_EXTERNAL_REQUEST_SUCCESS = "UGC_Auth_external_request_success"; public static final String UGC_AUTH_ERROR = "UGC_Auth_error"; + public static final String MAP_LAYER = "Map_Layers_activate"; public static class Settings { @@ -392,6 +393,9 @@ public enum Statistics public static final String PRICE_CATEGORY = "price_category"; public static final String DATE = "date"; static final String HAS_AUTH = "has_auth"; + public static final String NAME_LOWER_CASE = "name"; + public static final String STATUS = "status"; + private EventParam() {} } @@ -435,6 +439,11 @@ public enum Statistics static final String DISK_NO_SPACE = "disk_no_space"; static final String BACKUP = "backup"; static final String RESTORE = "restore"; + static final String SUBWAY = "subway"; + static final String TRAFFIC = "traffic"; + public static final String SUCCESS = "success"; + public static final String UNAVAILABLE = "unavailable"; + public static final String ERROR = "error"; } // Initialized once in constructor and does not change until the process restarts. @@ -630,6 +639,23 @@ public enum Statistics PushwooshHelper.nativeSendEditorEditObjectTag(); } + public void trackSubwayEvent(@NonNull String status) + { + trackMapLayerEvent(ParamValue.SUBWAY, status); + } + + public void trackTrafficEvent(@NonNull String status) + { + trackMapLayerEvent(ParamValue.TRAFFIC, status); + } + + private void trackMapLayerEvent(@NonNull String eventName, @NonNull String status) + { + ParameterBuilder builder = new ParameterBuilder().add(EventParam.NAME_LOWER_CASE, eventName) + .add(EventParam.STATUS, status); + trackEvent(EventName.MAP_LAYER, builder); + } + public void trackEditorSuccess(boolean newObject) { trackEvent(newObject ? EventName.EDITOR_SUCCESS_CREATE : EventName.EDITOR_SUCCESS_EDIT, -- cgit v1.2.3