diff options
Diffstat (limited to 'main/java/com/google/android/setupcompat/logging/SetupMetricsLogger.java')
-rw-r--r-- | main/java/com/google/android/setupcompat/logging/SetupMetricsLogger.java | 70 |
1 files changed, 69 insertions, 1 deletions
diff --git a/main/java/com/google/android/setupcompat/logging/SetupMetricsLogger.java b/main/java/com/google/android/setupcompat/logging/SetupMetricsLogger.java index 8d696e0..fab38a2 100644 --- a/main/java/com/google/android/setupcompat/logging/SetupMetricsLogger.java +++ b/main/java/com/google/android/setupcompat/logging/SetupMetricsLogger.java @@ -16,17 +16,25 @@ package com.google.android.setupcompat.logging; +import android.annotation.SuppressLint; import android.content.Context; import androidx.annotation.NonNull; +import androidx.annotation.VisibleForTesting; import com.google.android.setupcompat.internal.Preconditions; import com.google.android.setupcompat.internal.SetupCompatServiceInvoker; import com.google.android.setupcompat.logging.internal.MetricBundleConverter; import com.google.android.setupcompat.logging.internal.SetupMetricsLoggingConstants.MetricType; +import com.google.android.setupcompat.util.Logger; import java.util.concurrent.TimeUnit; -/** SetupMetricsLogger provides an easy way to log custom metrics to SetupWizard. */ +/** + * SetupMetricsLogger provides an easy way to log custom metrics to SetupWizard. + * (go/suw-metrics-collection-api) + */ public class SetupMetricsLogger { + private static final Logger LOG = new Logger("SetupMetricsLogger"); + /** Logs an instance of {@link CustomEvent} to SetupWizard. */ public static void logCustomEvent(@NonNull Context context, @NonNull CustomEvent customEvent) { Preconditions.checkNotNull(context, "Context cannot be null."); @@ -71,4 +79,64 @@ public class SetupMetricsLogger { MetricType.DURATION_EVENT, MetricBundleConverter.createBundleForLoggingTimer(timerName, timeInMillis)); } + + /** + * Logs setup collection metrics + */ + public static void logMetrics( + @NonNull Context context, @NonNull ScreenKey screenKey, @NonNull SetupMetric... metrics) { + Preconditions.checkNotNull(context, "Context cannot be null."); + Preconditions.checkNotNull(screenKey, "ScreenKey cannot be null."); + Preconditions.checkNotNull(metrics, "SetupMetric cannot be null."); + + for (SetupMetric metric : metrics) { + LOG.atDebug("Log metric: " + screenKey + ", " + metric); + + SetupCompatServiceInvoker.get(context).logMetricEvent( + MetricType.SETUP_COLLECTION_EVENT, + MetricBundleConverter.createBundleForLoggingSetupMetric(screenKey, metric)); + } + } + + /** + * A non-static method to log setup collection metrics calling + * {@link #logMetrics(Context, ScreenKey, SetupMetric...)} as the actual implementation. This + * function is useful when performing unit tests in caller's implementation. + * <p> + * For unit testing, caller uses {@link #setInstanceForTesting(SetupMetricsLogger)} to inject the + * mocked SetupMetricsLogger instance and use {@link SetupMetricsLogger#get(Context)} to get the + * SetupMetricsLogger. And verify the this function is called with expected parameters. + * + * @see #logMetrics(Context, ScreenKey, SetupMetric...) + */ + public void logMetrics(@NonNull ScreenKey screenKey, @NonNull SetupMetric... metrics) { + SetupMetricsLogger.logMetrics(context, screenKey, metrics); + } + + private SetupMetricsLogger(Context context) { + this.context = context; + } + + private final Context context; + + /** Use this function to get a singleton of {@link SetupMetricsLogger} */ + public static synchronized SetupMetricsLogger get(Context context) { + if (instance == null) { + instance = new SetupMetricsLogger(context.getApplicationContext()); + } + + return instance; + } + + @VisibleForTesting + public static void setInstanceForTesting(SetupMetricsLogger testInstance) { + instance = testInstance; + } + + // The instance is coming from Application context which alive during the application activate and + // it's not depend on the activities life cycle, so we can avoid memory leak. However linter + // cannot distinguish Application context or activity context, so we add @SuppressLint to avoid + // lint error. + @SuppressLint("StaticFieldLeak") + private static SetupMetricsLogger instance; } |