Support click metrics logs in several pages

- Assign metrics category to perferences at an earlier stage in
  DashboardFragment for better usability.

Bug: 137559984
Test: robotest
Change-Id: Icd4185efa0e655be20c4b673a1380fa42140923f
This commit is contained in:
Jason Chiu
2020-04-07 16:30:18 +08:00
parent 4edb83b260
commit b12e3b96c9
13 changed files with 74 additions and 31 deletions

View File

@@ -20,9 +20,6 @@ import android.content.Context;
import android.os.UserHandle; import android.os.UserHandle;
import android.provider.Settings; import android.provider.Settings;
import androidx.preference.Preference;
import androidx.preference.SwitchPreference;
import com.android.settings.core.TogglePreferenceController; import com.android.settings.core.TogglePreferenceController;
/** Controller that shows the magnification enable mode summary. */ /** Controller that shows the magnification enable mode summary. */

View File

@@ -54,6 +54,7 @@ public class MagnificationGesturesPreferenceController extends TogglePreferenceC
populateMagnificationGesturesPreferenceExtras(extras, mContext); populateMagnificationGesturesPreferenceExtras(extras, mContext);
extras.putBoolean(AccessibilitySettings.EXTRA_CHECKED, isChecked()); extras.putBoolean(AccessibilitySettings.EXTRA_CHECKED, isChecked());
extras.putBoolean(AccessibilitySettings.EXTRA_LAUNCHED_FROM_SUW, mIsFromSUW); extras.putBoolean(AccessibilitySettings.EXTRA_LAUNCHED_FROM_SUW, mIsFromSUW);
return true;
} }
return false; return false;
} }

View File

@@ -59,6 +59,7 @@ public class MagnificationNavbarPreferenceController extends TogglePreferenceCon
mContext.getText(R.string.accessibility_screen_magnification_navbar_summary)); mContext.getText(R.string.accessibility_screen_magnification_navbar_summary));
extras.putBoolean(AccessibilitySettings.EXTRA_CHECKED, isChecked()); extras.putBoolean(AccessibilitySettings.EXTRA_CHECKED, isChecked());
extras.putBoolean(AccessibilitySettings.EXTRA_LAUNCHED_FROM_SUW, mIsFromSUW); extras.putBoolean(AccessibilitySettings.EXTRA_LAUNCHED_FROM_SUW, mIsFromSUW);
return true;
} }
return false; return false;
} }

View File

@@ -80,6 +80,7 @@ public class AccountPreferenceController extends AbstractPreferenceController
private static final int ORDER_NEXT_TO_LAST = 1001; private static final int ORDER_NEXT_TO_LAST = 1001;
private static final int ORDER_NEXT_TO_NEXT_TO_LAST = 1000; private static final int ORDER_NEXT_TO_NEXT_TO_LAST = 1000;
private static final String PREF_KEY_ADD_ACCOUNT = "add_account";
private static final String PREF_KEY_REMOVE_PROFILE = "remove_profile"; private static final String PREF_KEY_REMOVE_PROFILE = "remove_profile";
private static final String PREF_KEY_WORK_PROFILE_SETTING = "work_profile_setting"; private static final String PREF_KEY_WORK_PROFILE_SETTING = "work_profile_setting";
@@ -225,11 +226,13 @@ public class AccountPreferenceController extends AbstractPreferenceController
@Override @Override
public boolean onPreferenceClick(Preference preference) { public boolean onPreferenceClick(Preference preference) {
final int metricsCategory = mFragment.getMetricsCategory();
// Check the preference // Check the preference
final int count = mProfiles.size(); final int count = mProfiles.size();
for (int i = 0; i < count; i++) { for (int i = 0; i < count; i++) {
ProfileData profileData = mProfiles.valueAt(i); ProfileData profileData = mProfiles.valueAt(i);
if (preference == profileData.addAccountPreference) { if (preference == profileData.addAccountPreference) {
mMetricsFeatureProvider.logClickedPreference(preference, metricsCategory);
Intent intent = new Intent(ACTION_ADD_ACCOUNT); Intent intent = new Intent(ACTION_ADD_ACCOUNT);
intent.putExtra(EXTRA_USER, profileData.userInfo.getUserHandle()); intent.putExtra(EXTRA_USER, profileData.userInfo.getUserHandle());
intent.putExtra(EXTRA_AUTHORITIES, mAuthorities); intent.putExtra(EXTRA_AUTHORITIES, mAuthorities);
@@ -237,16 +240,18 @@ public class AccountPreferenceController extends AbstractPreferenceController
return true; return true;
} }
if (preference == profileData.removeWorkProfilePreference) { if (preference == profileData.removeWorkProfilePreference) {
mMetricsFeatureProvider.logClickedPreference(preference, metricsCategory);
final int userId = profileData.userInfo.id; final int userId = profileData.userInfo.id;
RemoveUserFragment.newInstance(userId).show(mFragment.getFragmentManager(), RemoveUserFragment.newInstance(userId).show(mFragment.getFragmentManager(),
"removeUser"); "removeUser");
return true; return true;
} }
if (preference == profileData.managedProfilePreference) { if (preference == profileData.managedProfilePreference) {
mMetricsFeatureProvider.logClickedPreference(preference, metricsCategory);
Bundle arguments = new Bundle(); Bundle arguments = new Bundle();
arguments.putParcelable(Intent.EXTRA_USER, profileData.userInfo.getUserHandle()); arguments.putParcelable(Intent.EXTRA_USER, profileData.userInfo.getUserHandle());
new SubSettingLauncher(mContext) new SubSettingLauncher(mContext)
.setSourceMetricsCategory(mFragment.getMetricsCategory()) .setSourceMetricsCategory(metricsCategory)
.setDestination(ManagedProfileSettings.class.getName()) .setDestination(ManagedProfileSettings.class.getName())
.setTitleRes(R.string.managed_profile_settings_title) .setTitleRes(R.string.managed_profile_settings_title)
.setArguments(arguments) .setArguments(arguments)
@@ -360,6 +365,7 @@ public class AccountPreferenceController extends AbstractPreferenceController
private RestrictedPreference newAddAccountPreference() { private RestrictedPreference newAddAccountPreference() {
RestrictedPreference preference = RestrictedPreference preference =
new RestrictedPreference(mFragment.getPreferenceManager().getContext()); new RestrictedPreference(mFragment.getPreferenceManager().getContext());
preference.setKey(PREF_KEY_ADD_ACCOUNT);
preference.setTitle(R.string.add_account_label); preference.setTitle(R.string.add_account_label);
preference.setIcon(R.drawable.ic_add_24dp); preference.setIcon(R.drawable.ic_add_24dp);
preference.setOnPreferenceClickListener(this); preference.setOnPreferenceClickListener(this);

View File

@@ -40,10 +40,12 @@ import androidx.preference.PreferenceScreen;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.core.PreferenceControllerMixin; import com.android.settings.core.PreferenceControllerMixin;
import com.android.settings.core.instrumentation.InstrumentedDialogFragment; import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
import com.android.settings.overlay.FeatureFactory;
import com.android.settingslib.RestrictedLockUtils; import com.android.settingslib.RestrictedLockUtils;
import com.android.settingslib.RestrictedLockUtils.EnforcedAdmin; import com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
import com.android.settingslib.RestrictedLockUtilsInternal; import com.android.settingslib.RestrictedLockUtilsInternal;
import com.android.settingslib.core.AbstractPreferenceController; import com.android.settingslib.core.AbstractPreferenceController;
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
import com.android.settingslib.widget.LayoutPreference; import com.android.settingslib.widget.LayoutPreference;
import java.io.IOException; import java.io.IOException;
@@ -53,20 +55,23 @@ public class RemoveAccountPreferenceController extends AbstractPreferenceControl
private static final String KEY_REMOVE_ACCOUNT = "remove_account"; private static final String KEY_REMOVE_ACCOUNT = "remove_account";
private final MetricsFeatureProvider mMetricsFeatureProvider;
private Account mAccount; private Account mAccount;
private Fragment mParentFragment; private Fragment mParentFragment;
private UserHandle mUserHandle; private UserHandle mUserHandle;
private LayoutPreference mRemoveAccountPreference;
public RemoveAccountPreferenceController(Context context, Fragment parent) { public RemoveAccountPreferenceController(Context context, Fragment parent) {
super(context); super(context);
mParentFragment = parent; mParentFragment = parent;
mMetricsFeatureProvider = FeatureFactory.getFactory(context).getMetricsFeatureProvider();
} }
@Override @Override
public void displayPreference(PreferenceScreen screen) { public void displayPreference(PreferenceScreen screen) {
super.displayPreference(screen); super.displayPreference(screen);
final LayoutPreference removeAccountPreference = screen.findPreference(KEY_REMOVE_ACCOUNT); mRemoveAccountPreference = screen.findPreference(KEY_REMOVE_ACCOUNT);
Button removeAccountButton = (Button) removeAccountPreference.findViewById(R.id.button); final Button removeAccountButton = mRemoveAccountPreference.findViewById(R.id.button);
removeAccountButton.setOnClickListener(this); removeAccountButton.setOnClickListener(this);
} }
@@ -82,6 +87,8 @@ public class RemoveAccountPreferenceController extends AbstractPreferenceControl
@Override @Override
public void onClick(View v) { public void onClick(View v) {
mMetricsFeatureProvider.logClickedPreference(mRemoveAccountPreference,
mMetricsFeatureProvider.getMetricsCategory(mParentFragment));
if (mUserHandle != null) { if (mUserHandle != null) {
final EnforcedAdmin admin = RestrictedLockUtilsInternal.checkIfRestrictionEnforced( final EnforcedAdmin admin = RestrictedLockUtilsInternal.checkIfRestrictionEnforced(
mContext, UserManager.DISALLOW_MODIFY_ACCOUNTS, mUserHandle.getIdentifier()); mContext, UserManager.DISALLOW_MODIFY_ACCOUNTS, mUserHandle.getIdentifier());

View File

@@ -173,6 +173,13 @@ public abstract class DashboardFragment extends SettingsPreferenceFragment
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
checkUiBlocker(mControllers); checkUiBlocker(mControllers);
refreshAllPreferences(getLogTag()); refreshAllPreferences(getLogTag());
mControllers.stream()
.map(controller -> (Preference) findPreference(controller.getPreferenceKey()))
.filter(Objects::nonNull)
.forEach(preference -> {
// Give all controllers a chance to handle click.
preference.getExtras().putInt(CATEGORY, getMetricsCategory());
});
} }
@Override @Override
@@ -211,8 +218,6 @@ public abstract class DashboardFragment extends SettingsPreferenceFragment
public boolean onPreferenceTreeClick(Preference preference) { public boolean onPreferenceTreeClick(Preference preference) {
final Collection<List<AbstractPreferenceController>> controllers = final Collection<List<AbstractPreferenceController>> controllers =
mPreferenceControllers.values(); mPreferenceControllers.values();
// Give all controllers a chance to handle click.
preference.getExtras().putInt(CATEGORY, getMetricsCategory());
for (List<AbstractPreferenceController> controllerList : controllers) { for (List<AbstractPreferenceController> controllerList : controllers) {
for (AbstractPreferenceController controller : controllerList) { for (AbstractPreferenceController controller : controllerList) {
if (controller.handlePreferenceTreeClick(preference)) { if (controller.handlePreferenceTreeClick(preference)) {

View File

@@ -20,6 +20,7 @@ import android.accounts.Account;
import android.app.settings.SettingsEnums; import android.app.settings.SettingsEnums;
import android.content.Context; import android.content.Context;
import android.os.Bundle; import android.os.Bundle;
import android.text.TextUtils;
import androidx.preference.Preference; import androidx.preference.Preference;
import androidx.preference.PreferenceScreen; import androidx.preference.PreferenceScreen;
@@ -63,23 +64,29 @@ public class BrandedAccountPreferenceController extends BasePreferenceController
} }
accountPreference.setSummary(mAccounts[0].name); accountPreference.setSummary(mAccounts[0].name);
accountPreference.setOnPreferenceClickListener(preference -> { }
final Bundle args = new Bundle();
args.putParcelable(AccountDetailDashboardFragment.KEY_ACCOUNT,
mAccounts[0]);
args.putParcelable(AccountDetailDashboardFragment.KEY_USER_HANDLE,
android.os.Process.myUserHandle());
args.putString(AccountDetailDashboardFragment.KEY_ACCOUNT_TYPE,
mAccountFeatureProvider.getAccountType());
new SubSettingLauncher(mContext) @Override
.setDestination(AccountDetailDashboardFragment.class.getName()) public boolean handlePreferenceTreeClick(Preference preference) {
.setTitleRes(R.string.account_sync_title) if (!TextUtils.equals(preference.getKey(), getPreferenceKey())) {
.setArguments(args) return false;
.setSourceMetricsCategory(SettingsEnums.DEVICEINFO) }
.launch();
return true; final Bundle args = new Bundle();
}); args.putParcelable(AccountDetailDashboardFragment.KEY_ACCOUNT,
mAccounts[0]);
args.putParcelable(AccountDetailDashboardFragment.KEY_USER_HANDLE,
android.os.Process.myUserHandle());
args.putString(AccountDetailDashboardFragment.KEY_ACCOUNT_TYPE,
mAccountFeatureProvider.getAccountType());
new SubSettingLauncher(mContext)
.setDestination(AccountDetailDashboardFragment.class.getName())
.setTitleRes(R.string.account_sync_title)
.setArguments(args)
.setSourceMetricsCategory(SettingsEnums.DEVICEINFO)
.launch();
return true;
} }
@Override @Override

View File

@@ -23,7 +23,6 @@ import android.content.Intent;
import android.content.pm.UserInfo; import android.content.pm.UserInfo;
import android.os.Bundle; import android.os.Bundle;
import android.os.UserManager; import android.os.UserManager;
import android.provider.SearchIndexableResource;
import android.view.View; import android.view.View;
import com.android.settings.R; import com.android.settings.R;
@@ -50,7 +49,6 @@ import com.android.settingslib.search.SearchIndexable;
import com.android.settingslib.widget.LayoutPreference; import com.android.settingslib.widget.LayoutPreference;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.List; import java.util.List;
@SearchIndexable @SearchIndexable

View File

@@ -16,7 +16,6 @@
package com.android.settings.dream; package com.android.settings.dream;
import android.app.settings.SettingsEnums;
import android.content.Context; import android.content.Context;
import android.widget.Button; import android.widget.Button;
@@ -25,6 +24,7 @@ import androidx.preference.PreferenceScreen;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.core.PreferenceControllerMixin; import com.android.settings.core.PreferenceControllerMixin;
import com.android.settings.dashboard.DashboardFragment;
import com.android.settings.overlay.FeatureFactory; import com.android.settings.overlay.FeatureFactory;
import com.android.settingslib.core.AbstractPreferenceController; import com.android.settingslib.core.AbstractPreferenceController;
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider; import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
@@ -62,7 +62,8 @@ public class StartNowPreferenceController extends AbstractPreferenceController i
LayoutPreference pref = screen.findPreference(getPreferenceKey()); LayoutPreference pref = screen.findPreference(getPreferenceKey());
Button startButton = pref.findViewById(R.id.dream_start_now_button); Button startButton = pref.findViewById(R.id.dream_start_now_button);
startButton.setOnClickListener(v -> { startButton.setOnClickListener(v -> {
mMetricsFeatureProvider.logClickedPreference(pref, SettingsEnums.DREAM); mMetricsFeatureProvider.logClickedPreference(pref,
pref.getExtras().getInt(DashboardFragment.CATEGORY));
mBackend.startDreaming(); mBackend.startDreaming();
}); });
} }

View File

@@ -17,11 +17,14 @@
package com.android.settings.location; package com.android.settings.location;
import android.content.Context; import android.content.Context;
import android.content.Intent;
import android.text.TextUtils; import android.text.TextUtils;
import androidx.preference.Preference; import androidx.preference.Preference;
import com.android.settings.overlay.FeatureFactory;
import com.android.settings.widget.RestrictedAppPreference; import com.android.settings.widget.RestrictedAppPreference;
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
import com.android.settingslib.location.InjectedSetting; import com.android.settingslib.location.InjectedSetting;
import com.android.settingslib.location.SettingsInjector; import com.android.settingslib.location.SettingsInjector;
import com.android.settingslib.widget.apppreference.AppPreference; import com.android.settingslib.widget.apppreference.AppPreference;
@@ -31,8 +34,13 @@ import com.android.settingslib.widget.apppreference.AppPreference;
*/ */
public class AppSettingsInjector extends SettingsInjector { public class AppSettingsInjector extends SettingsInjector {
public AppSettingsInjector(Context context) { private final MetricsFeatureProvider mMetricsFeatureProvider;
private final int mMetricsCategory;
public AppSettingsInjector(Context context, int metricsCategory) {
super(context); super(context);
mMetricsCategory = metricsCategory;
mMetricsFeatureProvider = FeatureFactory.getFactory(context).getMetricsFeatureProvider();
} }
@Override @Override
@@ -41,4 +49,9 @@ public class AppSettingsInjector extends SettingsInjector {
? new AppPreference(prefContext) ? new AppPreference(prefContext)
: new RestrictedAppPreference(prefContext, setting.userRestriction); : new RestrictedAppPreference(prefContext, setting.userRestriction);
} }
@Override
protected void logPreferenceClick(Intent intent) {
mMetricsFeatureProvider.logStartedIntent(intent, mMetricsCategory);
}
} }

View File

@@ -58,7 +58,7 @@ public class LocationServicePreferenceController extends LocationBasePreferenceC
@Override @Override
public void init(DashboardFragment fragment) { public void init(DashboardFragment fragment) {
super.init(fragment); super.init(fragment);
mInjector = new AppSettingsInjector(mContext); mInjector = new AppSettingsInjector(mContext, getMetricsCategory());
} }
@Override @Override

View File

@@ -311,8 +311,9 @@ public class ChooseLockGeneric extends SettingsActivity {
@Override @Override
public boolean onPreferenceTreeClick(Preference preference) { public boolean onPreferenceTreeClick(Preference preference) {
final String key = preference.getKey(); writePreferenceClickMetric(preference);
final String key = preference.getKey();
if (!isUnlockMethodSecure(key) && mLockPatternUtils.isSecure(mUserId)) { if (!isUnlockMethodSecure(key) && mLockPatternUtils.isSecure(mUserId)) {
// Show the disabling FRP warning only when the user is switching from a secure // Show the disabling FRP warning only when the user is switching from a secure
// unlock method to an insecure one // unlock method to an insecure one

View File

@@ -31,6 +31,7 @@ import com.android.settings.R;
import com.android.settings.Utils; import com.android.settings.Utils;
import com.android.settings.core.PreferenceControllerMixin; import com.android.settings.core.PreferenceControllerMixin;
import com.android.settings.core.SubSettingLauncher; import com.android.settings.core.SubSettingLauncher;
import com.android.settings.dashboard.DashboardFragment;
import com.android.settings.overlay.FeatureFactory; import com.android.settings.overlay.FeatureFactory;
import com.android.settings.password.ChooseLockGeneric; import com.android.settings.password.ChooseLockGeneric;
import com.android.settings.security.screenlock.ScreenLockSettings; import com.android.settings.security.screenlock.ScreenLockSettings;
@@ -39,6 +40,7 @@ import com.android.settingslib.RestrictedLockUtils;
import com.android.settingslib.RestrictedLockUtilsInternal; import com.android.settingslib.RestrictedLockUtilsInternal;
import com.android.settingslib.RestrictedPreference; import com.android.settingslib.RestrictedPreference;
import com.android.settingslib.core.AbstractPreferenceController; import com.android.settingslib.core.AbstractPreferenceController;
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
public class ChangeScreenLockPreferenceController extends AbstractPreferenceController implements public class ChangeScreenLockPreferenceController extends AbstractPreferenceController implements
PreferenceControllerMixin, GearPreference.OnGearClickListener { PreferenceControllerMixin, GearPreference.OnGearClickListener {
@@ -52,6 +54,7 @@ public class ChangeScreenLockPreferenceController extends AbstractPreferenceCont
protected final int mUserId = UserHandle.myUserId(); protected final int mUserId = UserHandle.myUserId();
protected final int mProfileChallengeUserId; protected final int mProfileChallengeUserId;
private final MetricsFeatureProvider mMetricsFeatureProvider;
protected RestrictedPreference mPreference; protected RestrictedPreference mPreference;
@@ -64,6 +67,7 @@ public class ChangeScreenLockPreferenceController extends AbstractPreferenceCont
.getLockPatternUtils(context); .getLockPatternUtils(context);
mHost = host; mHost = host;
mProfileChallengeUserId = Utils.getManagedProfileId(mUm, mUserId); mProfileChallengeUserId = Utils.getManagedProfileId(mUm, mUserId);
mMetricsFeatureProvider = FeatureFactory.getFactory(context).getMetricsFeatureProvider();
} }
@Override @Override
@@ -104,6 +108,8 @@ public class ChangeScreenLockPreferenceController extends AbstractPreferenceCont
@Override @Override
public void onGearClick(GearPreference p) { public void onGearClick(GearPreference p) {
if (TextUtils.equals(p.getKey(), getPreferenceKey())) { if (TextUtils.equals(p.getKey(), getPreferenceKey())) {
mMetricsFeatureProvider.logClickedPreference(p,
p.getExtras().getInt(DashboardFragment.CATEGORY));
new SubSettingLauncher(mContext) new SubSettingLauncher(mContext)
.setDestination(ScreenLockSettings.class.getName()) .setDestination(ScreenLockSettings.class.getName())
.setSourceMetricsCategory(mHost.getMetricsCategory()) .setSourceMetricsCategory(mHost.getMetricsCategory())