Loading packages/SettingsLib/src/com/android/settingslib/core/instrumentation/MetricsFeatureProvider.java +34 −21 Original line number Diff line number Diff line Loading @@ -23,6 +23,9 @@ import android.content.Intent; import android.text.TextUtils; import android.util.Pair; import androidx.annotation.NonNull; import androidx.preference.Preference; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import java.util.ArrayList; Loading Loading @@ -132,34 +135,44 @@ public class MetricsFeatureProvider { return ((Instrumentable) object).getMetricsCategory(); } public void logDashboardStartIntent(Context context, Intent intent, int sourceMetricsCategory) { /** * Logs an event when the preference is clicked. * * @return true if the preference is loggable, otherwise false */ public boolean logClickedPreference(@NonNull Preference preference, int sourceMetricsCategory) { if (preference == null) { return false; } return logSettingsTileClick(preference.getKey(), sourceMetricsCategory) || logStartedIntent(preference.getIntent(), sourceMetricsCategory) || logSettingsTileClick(preference.getFragment(), sourceMetricsCategory); } /** * Logs an event when the intent is started. * * @return true if the intent is loggable, otherwise false */ public boolean logStartedIntent(Intent intent, int sourceMetricsCategory) { if (intent == null) { return; return false; } final ComponentName cn = intent.getComponent(); if (cn == null) { final String action = intent.getAction(); if (TextUtils.isEmpty(action)) { // Not loggable return; return logSettingsTileClick(cn != null ? cn.flattenToString() : intent.getAction(), sourceMetricsCategory); } action(sourceMetricsCategory, MetricsEvent.ACTION_SETTINGS_TILE_CLICK, SettingsEnums.PAGE_UNKNOWN, action, 0); return; } else if (TextUtils.equals(cn.getPackageName(), context.getPackageName())) { // Going to a Setting internal page, skip click logging in favor of page's own // visibility logging. return; private boolean logSettingsTileClick(String logKey, int sourceMetricsCategory) { if (TextUtils.isEmpty(logKey)) { // Not loggable return false; } action(sourceMetricsCategory, MetricsEvent.ACTION_SETTINGS_TILE_CLICK, SettingsEnums.PAGE_UNKNOWN, cn.flattenToString(), logKey, 0); return true; } } packages/SettingsLib/tests/robotests/src/com/android/settingslib/core/instrumentation/MetricsFeatureProviderTest.java +74 −6 Original line number Diff line number Diff line Loading @@ -26,6 +26,8 @@ import android.content.ComponentName; import android.content.Context; import android.content.Intent; import androidx.preference.Preference; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import org.junit.Before; Loading Loading @@ -60,19 +62,84 @@ public class MetricsFeatureProviderTest { } @Test public void logDashboardStartIntent_intentEmpty_shouldNotLog() { mProvider.logDashboardStartIntent(mContext, null /* intent */, public void logClickedPreference_preferenceEmpty_shouldNotLog() { final boolean loggable = mProvider.logClickedPreference(null /* preference */, MetricsEvent.SETTINGS_GESTURES); assertThat(loggable).isFalse(); verifyNoMoreInteractions(mLogWriter); } @Test public void logClickedPreference_preferenceHasKey_shouldLog() { final String key = "abc"; final Preference preference = new Preference(mContext); preference.setKey(key); final boolean loggable = mProvider.logClickedPreference(preference, MetricsEvent.SETTINGS_GESTURES); assertThat(loggable).isTrue(); verify(mLogWriter).action( MetricsEvent.SETTINGS_GESTURES, MetricsEvent.ACTION_SETTINGS_TILE_CLICK, SettingsEnums.PAGE_UNKNOWN, key, 0); } @Test public void logClickedPreference_preferenceHasIntent_shouldLog() { final Preference preference = new Preference(mContext); final Intent intent = new Intent(Intent.ACTION_ASSIST); preference.setIntent(intent); final boolean loggable = mProvider.logClickedPreference(preference, MetricsEvent.SETTINGS_GESTURES); assertThat(loggable).isTrue(); verify(mLogWriter).action( MetricsEvent.SETTINGS_GESTURES, MetricsEvent.ACTION_SETTINGS_TILE_CLICK, SettingsEnums.PAGE_UNKNOWN, Intent.ACTION_ASSIST, 0); } @Test public void logClickedPreference_preferenceHasFragment_shouldLog() { final Preference preference = new Preference(mContext); final String fragment = "com.android.settings.tts.TextToSpeechSettings"; preference.setFragment(fragment); final boolean loggable = mProvider.logClickedPreference(preference, MetricsEvent.SETTINGS_GESTURES); assertThat(loggable).isTrue(); verify(mLogWriter).action( MetricsEvent.SETTINGS_GESTURES, MetricsEvent.ACTION_SETTINGS_TILE_CLICK, SettingsEnums.PAGE_UNKNOWN, fragment, 0); } @Test public void logStartedIntent_intentEmpty_shouldNotLog() { final boolean loggable = mProvider.logStartedIntent(null /* intent */, MetricsEvent.SETTINGS_GESTURES); assertThat(loggable).isFalse(); verifyNoMoreInteractions(mLogWriter); } @Test public void logDashboardStartIntent_intentHasNoComponent_shouldLog() { public void logStartedIntent_intentHasNoComponent_shouldLog() { final Intent intent = new Intent(Intent.ACTION_ASSIST); mProvider.logDashboardStartIntent(mContext, intent, MetricsEvent.SETTINGS_GESTURES); final boolean loggable = mProvider.logStartedIntent(intent, MetricsEvent.SETTINGS_GESTURES); assertThat(loggable).isTrue(); verify(mLogWriter).action( MetricsEvent.SETTINGS_GESTURES, MetricsEvent.ACTION_SETTINGS_TILE_CLICK, Loading @@ -82,11 +149,12 @@ public class MetricsFeatureProviderTest { } @Test public void logDashboardStartIntent_intentIsExternal_shouldLog() { public void logStartedIntent_intentIsExternal_shouldLog() { final Intent intent = new Intent().setComponent(new ComponentName("pkg", "cls")); mProvider.logDashboardStartIntent(mContext, intent, MetricsEvent.SETTINGS_GESTURES); final boolean loggable = mProvider.logStartedIntent(intent, MetricsEvent.SETTINGS_GESTURES); assertThat(loggable).isTrue(); verify(mLogWriter).action( MetricsEvent.SETTINGS_GESTURES, MetricsEvent.ACTION_SETTINGS_TILE_CLICK, Loading Loading
packages/SettingsLib/src/com/android/settingslib/core/instrumentation/MetricsFeatureProvider.java +34 −21 Original line number Diff line number Diff line Loading @@ -23,6 +23,9 @@ import android.content.Intent; import android.text.TextUtils; import android.util.Pair; import androidx.annotation.NonNull; import androidx.preference.Preference; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import java.util.ArrayList; Loading Loading @@ -132,34 +135,44 @@ public class MetricsFeatureProvider { return ((Instrumentable) object).getMetricsCategory(); } public void logDashboardStartIntent(Context context, Intent intent, int sourceMetricsCategory) { /** * Logs an event when the preference is clicked. * * @return true if the preference is loggable, otherwise false */ public boolean logClickedPreference(@NonNull Preference preference, int sourceMetricsCategory) { if (preference == null) { return false; } return logSettingsTileClick(preference.getKey(), sourceMetricsCategory) || logStartedIntent(preference.getIntent(), sourceMetricsCategory) || logSettingsTileClick(preference.getFragment(), sourceMetricsCategory); } /** * Logs an event when the intent is started. * * @return true if the intent is loggable, otherwise false */ public boolean logStartedIntent(Intent intent, int sourceMetricsCategory) { if (intent == null) { return; return false; } final ComponentName cn = intent.getComponent(); if (cn == null) { final String action = intent.getAction(); if (TextUtils.isEmpty(action)) { // Not loggable return; return logSettingsTileClick(cn != null ? cn.flattenToString() : intent.getAction(), sourceMetricsCategory); } action(sourceMetricsCategory, MetricsEvent.ACTION_SETTINGS_TILE_CLICK, SettingsEnums.PAGE_UNKNOWN, action, 0); return; } else if (TextUtils.equals(cn.getPackageName(), context.getPackageName())) { // Going to a Setting internal page, skip click logging in favor of page's own // visibility logging. return; private boolean logSettingsTileClick(String logKey, int sourceMetricsCategory) { if (TextUtils.isEmpty(logKey)) { // Not loggable return false; } action(sourceMetricsCategory, MetricsEvent.ACTION_SETTINGS_TILE_CLICK, SettingsEnums.PAGE_UNKNOWN, cn.flattenToString(), logKey, 0); return true; } }
packages/SettingsLib/tests/robotests/src/com/android/settingslib/core/instrumentation/MetricsFeatureProviderTest.java +74 −6 Original line number Diff line number Diff line Loading @@ -26,6 +26,8 @@ import android.content.ComponentName; import android.content.Context; import android.content.Intent; import androidx.preference.Preference; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import org.junit.Before; Loading Loading @@ -60,19 +62,84 @@ public class MetricsFeatureProviderTest { } @Test public void logDashboardStartIntent_intentEmpty_shouldNotLog() { mProvider.logDashboardStartIntent(mContext, null /* intent */, public void logClickedPreference_preferenceEmpty_shouldNotLog() { final boolean loggable = mProvider.logClickedPreference(null /* preference */, MetricsEvent.SETTINGS_GESTURES); assertThat(loggable).isFalse(); verifyNoMoreInteractions(mLogWriter); } @Test public void logClickedPreference_preferenceHasKey_shouldLog() { final String key = "abc"; final Preference preference = new Preference(mContext); preference.setKey(key); final boolean loggable = mProvider.logClickedPreference(preference, MetricsEvent.SETTINGS_GESTURES); assertThat(loggable).isTrue(); verify(mLogWriter).action( MetricsEvent.SETTINGS_GESTURES, MetricsEvent.ACTION_SETTINGS_TILE_CLICK, SettingsEnums.PAGE_UNKNOWN, key, 0); } @Test public void logClickedPreference_preferenceHasIntent_shouldLog() { final Preference preference = new Preference(mContext); final Intent intent = new Intent(Intent.ACTION_ASSIST); preference.setIntent(intent); final boolean loggable = mProvider.logClickedPreference(preference, MetricsEvent.SETTINGS_GESTURES); assertThat(loggable).isTrue(); verify(mLogWriter).action( MetricsEvent.SETTINGS_GESTURES, MetricsEvent.ACTION_SETTINGS_TILE_CLICK, SettingsEnums.PAGE_UNKNOWN, Intent.ACTION_ASSIST, 0); } @Test public void logClickedPreference_preferenceHasFragment_shouldLog() { final Preference preference = new Preference(mContext); final String fragment = "com.android.settings.tts.TextToSpeechSettings"; preference.setFragment(fragment); final boolean loggable = mProvider.logClickedPreference(preference, MetricsEvent.SETTINGS_GESTURES); assertThat(loggable).isTrue(); verify(mLogWriter).action( MetricsEvent.SETTINGS_GESTURES, MetricsEvent.ACTION_SETTINGS_TILE_CLICK, SettingsEnums.PAGE_UNKNOWN, fragment, 0); } @Test public void logStartedIntent_intentEmpty_shouldNotLog() { final boolean loggable = mProvider.logStartedIntent(null /* intent */, MetricsEvent.SETTINGS_GESTURES); assertThat(loggable).isFalse(); verifyNoMoreInteractions(mLogWriter); } @Test public void logDashboardStartIntent_intentHasNoComponent_shouldLog() { public void logStartedIntent_intentHasNoComponent_shouldLog() { final Intent intent = new Intent(Intent.ACTION_ASSIST); mProvider.logDashboardStartIntent(mContext, intent, MetricsEvent.SETTINGS_GESTURES); final boolean loggable = mProvider.logStartedIntent(intent, MetricsEvent.SETTINGS_GESTURES); assertThat(loggable).isTrue(); verify(mLogWriter).action( MetricsEvent.SETTINGS_GESTURES, MetricsEvent.ACTION_SETTINGS_TILE_CLICK, Loading @@ -82,11 +149,12 @@ public class MetricsFeatureProviderTest { } @Test public void logDashboardStartIntent_intentIsExternal_shouldLog() { public void logStartedIntent_intentIsExternal_shouldLog() { final Intent intent = new Intent().setComponent(new ComponentName("pkg", "cls")); mProvider.logDashboardStartIntent(mContext, intent, MetricsEvent.SETTINGS_GESTURES); final boolean loggable = mProvider.logStartedIntent(intent, MetricsEvent.SETTINGS_GESTURES); assertThat(loggable).isTrue(); verify(mLogWriter).action( MetricsEvent.SETTINGS_GESTURES, MetricsEvent.ACTION_SETTINGS_TILE_CLICK, Loading