summaryrefslogtreecommitdiff
path: root/main/java/com/google/android/setupcompat/logging/SetupMetricsLogger.java
diff options
context:
space:
mode:
Diffstat (limited to 'main/java/com/google/android/setupcompat/logging/SetupMetricsLogger.java')
-rw-r--r--main/java/com/google/android/setupcompat/logging/SetupMetricsLogger.java70
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;
}