Add logging whenever preference leads to intent.

Bug: 34774945
Test: make RunSettignsRoboTests
Change-Id: I694e5a0a2b614c695193c9c525991a1558e0a81a
This commit is contained in:
Fan Zhang
2017-02-23 10:59:47 -08:00
parent 4bc851b520
commit ee45943177
6 changed files with 95 additions and 39 deletions

View File

@@ -29,9 +29,12 @@ public abstract class InstrumentedFragment extends ObservableFragment implements
protected MetricsFeatureProvider mMetricsFeatureProvider;
private final VisibilityLoggerMixin mVisibilityLoggerMixin;
public InstrumentedFragment() {
// Mixin that logs visibility change for activity.
getLifecycle().addObserver(new VisibilityLoggerMixin(getMetricsCategory()));
mVisibilityLoggerMixin = new VisibilityLoggerMixin(getMetricsCategory());
getLifecycle().addObserver(mVisibilityLoggerMixin);
getLifecycle().addObserver(new SurveyMixin(this, getClass().getSimpleName()));
}
@@ -40,4 +43,10 @@ public abstract class InstrumentedFragment extends ObservableFragment implements
super.onAttach(context);
mMetricsFeatureProvider = FeatureFactory.getFactory(context).getMetricsFeatureProvider();
}
@Override
public void onResume() {
mVisibilityLoggerMixin.setSourceMetricsCategory(getActivity());
super.onResume();
}
}

View File

@@ -15,7 +15,10 @@
*/
package com.android.settings.core.instrumentation;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.text.TextUtils;
import android.util.Pair;
import com.android.internal.logging.nano.MetricsProto;
@@ -100,4 +103,27 @@ public class MetricsFeatureProvider {
}
return ((Instrumentable) object).getMetricsCategory();
}
public void logDashboardStartIntent(Context context, Intent intent,
int sourceMetricsCategory) {
if (intent == null) {
return;
}
final ComponentName cn = intent.getComponent();
if (cn == null) {
final String action = intent.getAction();
if (TextUtils.isEmpty(action)) {
// Not loggable
return;
}
action(context, MetricsProto.MetricsEvent.ACTION_SETTINGS_TILE_CLICK, action,
Pair.create(MetricsProto.MetricsEvent.FIELD_CONTEXT, sourceMetricsCategory));
} 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;
}
action(context, MetricsProto.MetricsEvent.ACTION_SETTINGS_TILE_CLICK, cn.flattenToString(),
Pair.create(MetricsProto.MetricsEvent.FIELD_CONTEXT, sourceMetricsCategory));
}
}

View File

@@ -27,10 +27,8 @@ import android.support.v7.preference.Preference;
import android.text.TextUtils;
import android.util.Log;
import com.android.internal.logging.nano.MetricsProto;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.settings.SettingsActivity;
import com.android.settings.SubSettings;
import com.android.settings.core.instrumentation.MetricsFeatureProvider;
import com.android.settings.overlay.FeatureFactory;
import com.android.settingslib.drawer.CategoryManager;
@@ -154,7 +152,7 @@ public class DashboardFeatureProviderImpl implements DashboardFeatureProvider {
intent.setAction(action);
}
pref.setOnPreferenceClickListener(preference -> {
launchIntentOrSelectProfile(activity, tile, intent);
launchIntentOrSelectProfile(activity, tile, intent, sourceMetricsCategory);
return true;
});
}
@@ -204,37 +202,20 @@ public class DashboardFeatureProviderImpl implements DashboardFeatureProvider {
MetricsEvent.DASHBOARD_SUMMARY)
.putExtra(SettingsDrawerActivity.EXTRA_SHOW_MENU, true)
.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
launchIntentOrSelectProfile(activity, tile, intent);
launchIntentOrSelectProfile(activity, tile, intent, MetricsEvent.DASHBOARD_SUMMARY);
}
private void launchIntentOrSelectProfile(Activity activity, Tile tile, Intent intent) {
private void launchIntentOrSelectProfile(Activity activity, Tile tile, Intent intent,
int sourceMetricCategory) {
ProfileSelectDialog.updateUserHandlesIfNeeded(mContext, tile);
if (tile.userHandle == null) {
logStartActivity(intent);
mMetricsFeatureProvider.logDashboardStartIntent(mContext, intent, sourceMetricCategory);
activity.startActivityForResult(intent, 0);
} else if (tile.userHandle.size() == 1) {
logStartActivity(intent);
mMetricsFeatureProvider.logDashboardStartIntent(mContext, intent, sourceMetricCategory);
activity.startActivityForResultAsUser(intent, 0, tile.userHandle.get(0));
} else {
ProfileSelectDialog.show(activity.getFragmentManager(), tile);
}
}
private void logStartActivity(Intent intent) {
if (intent == null) {
return;
}
final ComponentName cn = intent.getComponent();
if (cn == null) {
// Not loggable
return;
} else if (TextUtils.equals(cn.getPackageName(), mContext.getPackageName())) {
// Going to a Setting internal page, skip click logging in favor of page's own
// visibility logging.
return;
}
mMetricsFeatureProvider.action(mContext,
MetricsEvent.ACTION_SETTINGS_TILE_CLICK,
cn.flattenToString());
}
}

View File

@@ -157,6 +157,9 @@ public abstract class DashboardFragment extends SettingsPreferenceFragment
@Override
public boolean onPreferenceTreeClick(Preference preference) {
Collection<PreferenceController> controllers = mPreferenceControllers.values();
// If preference contains intent, log it before handling.
mMetricsFeatureProvider.logDashboardStartIntent(
getContext(), preference.getIntent(), getMetricsCategory());
// Give all controllers a chance to handle click.
for (PreferenceController controller : controllers) {
if (controller.handlePreferenceTreeClick(preference)) {