Merge "[SettingsLib] Add preference click metric log"

This commit is contained in:
Jason Chiu
2019-12-16 08:58:34 +00:00
committed by Android (Google) Code Review
2 changed files with 108 additions and 27 deletions

View File

@@ -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;
@@ -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;
}
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;
return logSettingsTileClick(cn != null ? cn.flattenToString() : intent.getAction(),
sourceMetricsCategory);
}
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;
}
}

View File

@@ -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;
@@ -60,19 +62,42 @@ 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 logDashboardStartIntent_intentHasNoComponent_shouldLog() {
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);
mProvider.logDashboardStartIntent(mContext, intent, MetricsEvent.SETTINGS_GESTURES);
final boolean loggable = mProvider.logClickedPreference(preference,
MetricsEvent.SETTINGS_GESTURES);
assertThat(loggable).isTrue();
verify(mLogWriter).action(
MetricsEvent.SETTINGS_GESTURES,
MetricsEvent.ACTION_SETTINGS_TILE_CLICK,
@@ -82,11 +107,54 @@ public class MetricsFeatureProviderTest {
}
@Test
public void logDashboardStartIntent_intentIsExternal_shouldLog() {
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 logStartedIntent_intentHasNoComponent_shouldLog() {
final Intent intent = new Intent(Intent.ACTION_ASSIST);
final boolean loggable = mProvider.logStartedIntent(intent, 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 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,