diff --git a/src/com/android/settings/core/instrumentation/EventLogWriter.java b/src/com/android/settings/core/instrumentation/EventLogWriter.java index de37cba27b6..930451207ed 100644 --- a/src/com/android/settings/core/instrumentation/EventLogWriter.java +++ b/src/com/android/settings/core/instrumentation/EventLogWriter.java @@ -17,8 +17,10 @@ package com.android.settings.core.instrumentation; import android.content.Context; +import android.metrics.LogMaker; import com.android.internal.logging.MetricsLogger; +import com.android.internal.logging.nano.MetricsProto; /** * {@link LogWriter} that writes data to eventlog. @@ -37,6 +39,15 @@ public class EventLogWriter implements LogWriter { MetricsLogger.action(context, category, ""); } + public void actionWithSource(Context context, int source, int category) { + final LogMaker logMaker = new LogMaker(category) + .setType(MetricsProto.MetricsEvent.TYPE_ACTION); + if (source != MetricsProto.MetricsEvent.VIEW_UNKNOWN) { + logMaker.addTaggedData(MetricsProto.MetricsEvent.FIELD_CONTEXT, source); + } + MetricsLogger.action(logMaker); + } + public void action(Context context, int category, int value) { MetricsLogger.action(context, category, Integer.toString(value)); } diff --git a/src/com/android/settings/core/instrumentation/LogWriter.java b/src/com/android/settings/core/instrumentation/LogWriter.java index 45f1d57d663..4a2fc6caf8c 100644 --- a/src/com/android/settings/core/instrumentation/LogWriter.java +++ b/src/com/android/settings/core/instrumentation/LogWriter.java @@ -37,6 +37,11 @@ public interface LogWriter { */ void action(Context context, int category); + /** + * Logs an user action. + */ + void actionWithSource(Context context, int source, int category); + /** * Logs an user action. */ diff --git a/src/com/android/settings/core/instrumentation/MetricsFeatureProvider.java b/src/com/android/settings/core/instrumentation/MetricsFeatureProvider.java index 1a9a451d3eb..13a4d7e50a8 100644 --- a/src/com/android/settings/core/instrumentation/MetricsFeatureProvider.java +++ b/src/com/android/settings/core/instrumentation/MetricsFeatureProvider.java @@ -15,8 +15,79 @@ */ package com.android.settings.core.instrumentation; +import android.content.Context; +import android.metrics.LogMaker; + +import java.util.ArrayList; +import java.util.List; + /** * FeatureProvider for metrics. */ -public interface MetricsFeatureProvider extends LogWriter { +public class MetricsFeatureProvider { + private List mLoggerWriters; + + public MetricsFeatureProvider() { + mLoggerWriters = new ArrayList<>(); + installLogWriters(); + } + + protected void installLogWriters() { + mLoggerWriters.add(new EventLogWriter()); + mLoggerWriters.add(new SettingSuggestionsLogWriter()); + } + + public void visible(Context context, int category) { + for (LogWriter writer : mLoggerWriters) { + writer.visible(context, category); + } + } + + public void hidden(Context context, int category) { + for (LogWriter writer : mLoggerWriters) { + writer.hidden(context, category); + } + } + + public void actionWithSource(Context context, int source, int category) { + for (LogWriter writer : mLoggerWriters) { + writer.actionWithSource(context, source, category); + } + } + + public void action(Context context, int category) { + for (LogWriter writer : mLoggerWriters) { + writer.action(context, category); + } + } + + public void action(Context context, int category, int value) { + for (LogWriter writer : mLoggerWriters) { + writer.action(context, category, value); + } + } + + public void action(Context context, int category, boolean value) { + for (LogWriter writer : mLoggerWriters) { + writer.action(context, category, value); + } + } + + public void action(Context context, int category, String pkg) { + for (LogWriter writer : mLoggerWriters) { + writer.action(context, category, pkg); + } + } + + public void count(Context context, String name, int value) { + for (LogWriter writer : mLoggerWriters) { + writer.count(context, name, value); + } + } + + public void histogram(Context context, String name, int bucket) { + for (LogWriter writer : mLoggerWriters) { + writer.histogram(context, name, bucket); + } + } } diff --git a/src/com/android/settings/core/instrumentation/MetricsFeatureProviderImpl.java b/src/com/android/settings/core/instrumentation/MetricsFeatureProviderImpl.java deleted file mode 100644 index 091eb54f2d9..00000000000 --- a/src/com/android/settings/core/instrumentation/MetricsFeatureProviderImpl.java +++ /dev/null @@ -1,95 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.android.settings.core.instrumentation; - -import android.content.Context; - -import java.util.ArrayList; -import java.util.List; - -/** - * Implementation for {@link MetricsFeatureProvider} - */ -public class MetricsFeatureProviderImpl implements MetricsFeatureProvider { - - private List mLoggerWriters; - - public MetricsFeatureProviderImpl() { - mLoggerWriters = new ArrayList<>(); - installLogWriters(); - } - - protected void installLogWriters() { - mLoggerWriters.add(new EventLogWriter()); - mLoggerWriters.add(new SettingSuggestionsLogWriter()); - } - - @Override - public void visible(Context context, int category) { - for (LogWriter writer : mLoggerWriters) { - writer.visible(context, category); - } - } - - @Override - public void hidden(Context context, int category) { - for (LogWriter writer : mLoggerWriters) { - writer.hidden(context, category); - } - } - - @Override - public void action(Context context, int category) { - for (LogWriter writer : mLoggerWriters) { - writer.action(context, category); - } - } - - @Override - public void action(Context context, int category, int value) { - for (LogWriter writer : mLoggerWriters) { - writer.action(context, category, value); - } - } - - @Override - public void action(Context context, int category, boolean value) { - for (LogWriter writer : mLoggerWriters) { - writer.action(context, category, value); - } - } - - @Override - public void action(Context context, int category, String pkg) { - for (LogWriter writer : mLoggerWriters) { - writer.action(context, category, pkg); - } - } - - @Override - public void count(Context context, String name, int value) { - for (LogWriter writer : mLoggerWriters) { - writer.count(context, name, value); - } - } - - @Override - public void histogram(Context context, String name, int bucket) { - for (LogWriter writer : mLoggerWriters) { - writer.histogram(context, name, bucket); - } - } -} diff --git a/src/com/android/settings/core/instrumentation/SettingSuggestionsLogWriter.java b/src/com/android/settings/core/instrumentation/SettingSuggestionsLogWriter.java index 4c277fb9da3..3b94fe7b794 100644 --- a/src/com/android/settings/core/instrumentation/SettingSuggestionsLogWriter.java +++ b/src/com/android/settings/core/instrumentation/SettingSuggestionsLogWriter.java @@ -17,6 +17,8 @@ package com.android.settings.core.instrumentation; import android.content.Context; +import android.metrics.LogMaker; + import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.internal.logging.MetricsLogger; import com.android.settings.suggestions.EventStore; @@ -40,6 +42,10 @@ public class SettingSuggestionsLogWriter implements LogWriter { public void action(Context context, int category) { } + @Override + public void actionWithSource(Context context, int source, int category) { + } + @Override public void action(Context context, int category, int value) { } diff --git a/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java b/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java index 223d0502c76..395a8bdf1fc 100644 --- a/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java +++ b/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java @@ -181,7 +181,7 @@ public class DashboardFeatureProviderImpl implements DashboardFeatureProvider { @Override public ProgressiveDisclosureMixin getProgressiveDisclosureMixin(Context context, DashboardFragment fragment) { - return new ProgressiveDisclosureMixin(context, this, fragment); + return new ProgressiveDisclosureMixin(context, this, mMetricsFeatureProvider, fragment); } @Override diff --git a/src/com/android/settings/dashboard/ProgressiveDisclosureMixin.java b/src/com/android/settings/dashboard/ProgressiveDisclosureMixin.java index 2907028643a..77bd253e9aa 100644 --- a/src/com/android/settings/dashboard/ProgressiveDisclosureMixin.java +++ b/src/com/android/settings/dashboard/ProgressiveDisclosureMixin.java @@ -25,7 +25,10 @@ import android.support.v7.preference.PreferenceScreen; import android.text.TextUtils; import android.util.Log; +import com.android.internal.logging.nano.MetricsProto; import com.android.settings.R; +import com.android.settings.core.instrumentation.Instrumentable; +import com.android.settings.core.instrumentation.MetricsFeatureProvider; import com.android.settings.core.lifecycle.LifecycleObserver; import com.android.settings.core.lifecycle.events.OnCreate; import com.android.settings.core.lifecycle.events.OnSaveInstanceState; @@ -45,19 +48,23 @@ public class ProgressiveDisclosureMixin implements Preference.OnPreferenceClickL private final DashboardFeatureProvider mDashboardFeatureProvider; // Collapsed preference sorted by order. private final List mCollapsedPrefs = new ArrayList<>(); - private /* final */ ExpandPreference mExpandButton; + private final MetricsFeatureProvider mMetricsFeatureProvider; private final PreferenceFragment mFragment; + private /* final */ ExpandPreference mExpandButton; private int mTileLimit = DEFAULT_TILE_LIMIT; private boolean mUserExpanded; public ProgressiveDisclosureMixin(Context context, - DashboardFeatureProvider dashboardFeatureProvider, PreferenceFragment fragment) { + DashboardFeatureProvider dashboardFeatureProvider, + MetricsFeatureProvider metricsFeatureProvider, + PreferenceFragment fragment) { mContext = context; mFragment = fragment; mExpandButton = new ExpandPreference(context); mExpandButton.setOnPreferenceClickListener(this); mDashboardFeatureProvider = dashboardFeatureProvider; + mMetricsFeatureProvider = metricsFeatureProvider; } @Override @@ -83,6 +90,14 @@ public class ProgressiveDisclosureMixin implements Preference.OnPreferenceClickL } mCollapsedPrefs.clear(); mUserExpanded = true; + final int metricsCategory; + if (mFragment instanceof Instrumentable) { + metricsCategory = ((Instrumentable) mFragment).getMetricsCategory(); + } else { + metricsCategory = MetricsProto.MetricsEvent.VIEW_UNKNOWN; + } + mMetricsFeatureProvider.actionWithSource(mContext, metricsCategory, + MetricsProto.MetricsEvent.ACTION_SETTINGS_ADVANCED_BUTTON_EXPAND); } } return false; diff --git a/src/com/android/settings/overlay/FeatureFactoryImpl.java b/src/com/android/settings/overlay/FeatureFactoryImpl.java index 4c81e309eda..1b504f41c31 100644 --- a/src/com/android/settings/overlay/FeatureFactoryImpl.java +++ b/src/com/android/settings/overlay/FeatureFactoryImpl.java @@ -28,7 +28,6 @@ import com.android.settings.applications.ApplicationFeatureProviderImpl; import com.android.settings.applications.IPackageManagerWrapperImpl; import com.android.settings.applications.PackageManagerWrapperImpl; import com.android.settings.core.instrumentation.MetricsFeatureProvider; -import com.android.settings.core.instrumentation.MetricsFeatureProviderImpl; import com.android.settings.dashboard.DashboardFeatureProvider; import com.android.settings.dashboard.DashboardFeatureProviderImpl; import com.android.settings.dashboard.SuggestionFeatureProvider; @@ -70,7 +69,7 @@ public class FeatureFactoryImpl extends FeatureFactory { @Override public MetricsFeatureProvider getMetricsFeatureProvider() { if (mMetricsFeatureProvider == null) { - mMetricsFeatureProvider = new MetricsFeatureProviderImpl(); + mMetricsFeatureProvider = new MetricsFeatureProvider(); } return mMetricsFeatureProvider; } diff --git a/tests/robotests/src/com/android/settings/dashboard/ProgressiveDisclosureTest.java b/tests/robotests/src/com/android/settings/dashboard/ProgressiveDisclosureTest.java index bb00cb82ba1..573b2b5ccae 100644 --- a/tests/robotests/src/com/android/settings/dashboard/ProgressiveDisclosureTest.java +++ b/tests/robotests/src/com/android/settings/dashboard/ProgressiveDisclosureTest.java @@ -74,7 +74,9 @@ public class ProgressiveDisclosureTest { mAppContext = ShadowApplication.getInstance().getApplicationContext(); mFakeFeatureFactory = (FakeFeatureFactory) FeatureFactory.getFactory(mContext); mMixin = new ProgressiveDisclosureMixin(mAppContext, - mFakeFeatureFactory.dashboardFeatureProvider, mPreferenceFragment); + mFakeFeatureFactory.dashboardFeatureProvider, + mFakeFeatureFactory.metricsFeatureProvider, + mPreferenceFragment); ReflectionHelpers.setField(mMixin, "mExpandButton", mExpandButton); mPreference = new Preference(mAppContext); mPreference.setKey("test");