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
diff --git a/src/com/android/settings/accessibility/MagnificationEnablePreferenceController.java b/src/com/android/settings/accessibility/MagnificationEnablePreferenceController.java
index a21c024..57a2962 100644
--- a/src/com/android/settings/accessibility/MagnificationEnablePreferenceController.java
+++ b/src/com/android/settings/accessibility/MagnificationEnablePreferenceController.java
@@ -20,9 +20,6 @@
 import android.os.UserHandle;
 import android.provider.Settings;
 
-import androidx.preference.Preference;
-import androidx.preference.SwitchPreference;
-
 import com.android.settings.core.TogglePreferenceController;
 
 /** Controller that shows the magnification enable mode summary. */
diff --git a/src/com/android/settings/accessibility/MagnificationGesturesPreferenceController.java b/src/com/android/settings/accessibility/MagnificationGesturesPreferenceController.java
index f73ca01..6883644 100644
--- a/src/com/android/settings/accessibility/MagnificationGesturesPreferenceController.java
+++ b/src/com/android/settings/accessibility/MagnificationGesturesPreferenceController.java
@@ -54,6 +54,7 @@
             populateMagnificationGesturesPreferenceExtras(extras, mContext);
             extras.putBoolean(AccessibilitySettings.EXTRA_CHECKED, isChecked());
             extras.putBoolean(AccessibilitySettings.EXTRA_LAUNCHED_FROM_SUW, mIsFromSUW);
+            return true;
         }
         return false;
     }
diff --git a/src/com/android/settings/accessibility/MagnificationNavbarPreferenceController.java b/src/com/android/settings/accessibility/MagnificationNavbarPreferenceController.java
index 952f820..9813bde 100644
--- a/src/com/android/settings/accessibility/MagnificationNavbarPreferenceController.java
+++ b/src/com/android/settings/accessibility/MagnificationNavbarPreferenceController.java
@@ -59,6 +59,7 @@
                     mContext.getText(R.string.accessibility_screen_magnification_navbar_summary));
             extras.putBoolean(AccessibilitySettings.EXTRA_CHECKED, isChecked());
             extras.putBoolean(AccessibilitySettings.EXTRA_LAUNCHED_FROM_SUW, mIsFromSUW);
+            return true;
         }
         return false;
     }
diff --git a/src/com/android/settings/accounts/AccountPreferenceController.java b/src/com/android/settings/accounts/AccountPreferenceController.java
index db3a8eb..ff5bc78 100644
--- a/src/com/android/settings/accounts/AccountPreferenceController.java
+++ b/src/com/android/settings/accounts/AccountPreferenceController.java
@@ -80,6 +80,7 @@
     private static final int ORDER_NEXT_TO_LAST = 1001;
     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_WORK_PROFILE_SETTING = "work_profile_setting";
 
@@ -225,11 +226,13 @@
 
     @Override
     public boolean onPreferenceClick(Preference preference) {
+        final int metricsCategory = mFragment.getMetricsCategory();
         // Check the preference
         final int count = mProfiles.size();
         for (int i = 0; i < count; i++) {
             ProfileData profileData = mProfiles.valueAt(i);
             if (preference == profileData.addAccountPreference) {
+                mMetricsFeatureProvider.logClickedPreference(preference, metricsCategory);
                 Intent intent = new Intent(ACTION_ADD_ACCOUNT);
                 intent.putExtra(EXTRA_USER, profileData.userInfo.getUserHandle());
                 intent.putExtra(EXTRA_AUTHORITIES, mAuthorities);
@@ -237,16 +240,18 @@
                 return true;
             }
             if (preference == profileData.removeWorkProfilePreference) {
+                mMetricsFeatureProvider.logClickedPreference(preference, metricsCategory);
                 final int userId = profileData.userInfo.id;
                 RemoveUserFragment.newInstance(userId).show(mFragment.getFragmentManager(),
                         "removeUser");
                 return true;
             }
             if (preference == profileData.managedProfilePreference) {
+                mMetricsFeatureProvider.logClickedPreference(preference, metricsCategory);
                 Bundle arguments = new Bundle();
                 arguments.putParcelable(Intent.EXTRA_USER, profileData.userInfo.getUserHandle());
                 new SubSettingLauncher(mContext)
-                        .setSourceMetricsCategory(mFragment.getMetricsCategory())
+                        .setSourceMetricsCategory(metricsCategory)
                         .setDestination(ManagedProfileSettings.class.getName())
                         .setTitleRes(R.string.managed_profile_settings_title)
                         .setArguments(arguments)
@@ -360,6 +365,7 @@
     private RestrictedPreference newAddAccountPreference() {
         RestrictedPreference preference =
                 new RestrictedPreference(mFragment.getPreferenceManager().getContext());
+        preference.setKey(PREF_KEY_ADD_ACCOUNT);
         preference.setTitle(R.string.add_account_label);
         preference.setIcon(R.drawable.ic_add_24dp);
         preference.setOnPreferenceClickListener(this);
diff --git a/src/com/android/settings/accounts/RemoveAccountPreferenceController.java b/src/com/android/settings/accounts/RemoveAccountPreferenceController.java
index 5c6e6bb..037f584 100644
--- a/src/com/android/settings/accounts/RemoveAccountPreferenceController.java
+++ b/src/com/android/settings/accounts/RemoveAccountPreferenceController.java
@@ -40,10 +40,12 @@
 import com.android.settings.R;
 import com.android.settings.core.PreferenceControllerMixin;
 import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
+import com.android.settings.overlay.FeatureFactory;
 import com.android.settingslib.RestrictedLockUtils;
 import com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
 import com.android.settingslib.RestrictedLockUtilsInternal;
 import com.android.settingslib.core.AbstractPreferenceController;
+import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
 import com.android.settingslib.widget.LayoutPreference;
 
 import java.io.IOException;
@@ -53,20 +55,23 @@
 
     private static final String KEY_REMOVE_ACCOUNT = "remove_account";
 
+    private final MetricsFeatureProvider mMetricsFeatureProvider;
     private Account mAccount;
     private Fragment mParentFragment;
     private UserHandle mUserHandle;
+    private LayoutPreference mRemoveAccountPreference;
 
     public RemoveAccountPreferenceController(Context context, Fragment parent) {
         super(context);
         mParentFragment = parent;
+        mMetricsFeatureProvider = FeatureFactory.getFactory(context).getMetricsFeatureProvider();
     }
 
     @Override
     public void displayPreference(PreferenceScreen screen) {
         super.displayPreference(screen);
-        final LayoutPreference removeAccountPreference = screen.findPreference(KEY_REMOVE_ACCOUNT);
-        Button removeAccountButton = (Button) removeAccountPreference.findViewById(R.id.button);
+        mRemoveAccountPreference = screen.findPreference(KEY_REMOVE_ACCOUNT);
+        final Button removeAccountButton = mRemoveAccountPreference.findViewById(R.id.button);
         removeAccountButton.setOnClickListener(this);
     }
 
@@ -82,6 +87,8 @@
 
     @Override
     public void onClick(View v) {
+        mMetricsFeatureProvider.logClickedPreference(mRemoveAccountPreference,
+                mMetricsFeatureProvider.getMetricsCategory(mParentFragment));
         if (mUserHandle != null) {
             final EnforcedAdmin admin = RestrictedLockUtilsInternal.checkIfRestrictionEnforced(
                     mContext, UserManager.DISALLOW_MODIFY_ACCOUNTS, mUserHandle.getIdentifier());
diff --git a/src/com/android/settings/dashboard/DashboardFragment.java b/src/com/android/settings/dashboard/DashboardFragment.java
index c70d841..e4041fb 100644
--- a/src/com/android/settings/dashboard/DashboardFragment.java
+++ b/src/com/android/settings/dashboard/DashboardFragment.java
@@ -173,6 +173,13 @@
     public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
         checkUiBlocker(mControllers);
         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
@@ -211,8 +218,6 @@
     public boolean onPreferenceTreeClick(Preference preference) {
         final Collection<List<AbstractPreferenceController>> controllers =
                 mPreferenceControllers.values();
-        // Give all controllers a chance to handle click.
-        preference.getExtras().putInt(CATEGORY, getMetricsCategory());
         for (List<AbstractPreferenceController> controllerList : controllers) {
             for (AbstractPreferenceController controller : controllerList) {
                 if (controller.handlePreferenceTreeClick(preference)) {
diff --git a/src/com/android/settings/deviceinfo/BrandedAccountPreferenceController.java b/src/com/android/settings/deviceinfo/BrandedAccountPreferenceController.java
index 3543832..f00a327 100644
--- a/src/com/android/settings/deviceinfo/BrandedAccountPreferenceController.java
+++ b/src/com/android/settings/deviceinfo/BrandedAccountPreferenceController.java
@@ -20,6 +20,7 @@
 import android.app.settings.SettingsEnums;
 import android.content.Context;
 import android.os.Bundle;
+import android.text.TextUtils;
 
 import androidx.preference.Preference;
 import androidx.preference.PreferenceScreen;
@@ -63,23 +64,29 @@
         }
 
         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)
-                    .setDestination(AccountDetailDashboardFragment.class.getName())
-                    .setTitleRes(R.string.account_sync_title)
-                    .setArguments(args)
-                    .setSourceMetricsCategory(SettingsEnums.DEVICEINFO)
-                    .launch();
-            return true;
-        });
+    @Override
+    public boolean handlePreferenceTreeClick(Preference preference) {
+        if (!TextUtils.equals(preference.getKey(), getPreferenceKey())) {
+            return false;
+        }
+
+        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
diff --git a/src/com/android/settings/deviceinfo/aboutphone/MyDeviceInfoFragment.java b/src/com/android/settings/deviceinfo/aboutphone/MyDeviceInfoFragment.java
index b2e2980..4af5d79 100644
--- a/src/com/android/settings/deviceinfo/aboutphone/MyDeviceInfoFragment.java
+++ b/src/com/android/settings/deviceinfo/aboutphone/MyDeviceInfoFragment.java
@@ -23,7 +23,6 @@
 import android.content.pm.UserInfo;
 import android.os.Bundle;
 import android.os.UserManager;
-import android.provider.SearchIndexableResource;
 import android.view.View;
 
 import com.android.settings.R;
@@ -50,7 +49,6 @@
 import com.android.settingslib.widget.LayoutPreference;
 
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.List;
 
 @SearchIndexable
diff --git a/src/com/android/settings/dream/StartNowPreferenceController.java b/src/com/android/settings/dream/StartNowPreferenceController.java
index a5db93b..fb0581f 100644
--- a/src/com/android/settings/dream/StartNowPreferenceController.java
+++ b/src/com/android/settings/dream/StartNowPreferenceController.java
@@ -16,7 +16,6 @@
 
 package com.android.settings.dream;
 
-import android.app.settings.SettingsEnums;
 import android.content.Context;
 import android.widget.Button;
 
@@ -25,6 +24,7 @@
 
 import com.android.settings.R;
 import com.android.settings.core.PreferenceControllerMixin;
+import com.android.settings.dashboard.DashboardFragment;
 import com.android.settings.overlay.FeatureFactory;
 import com.android.settingslib.core.AbstractPreferenceController;
 import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
@@ -62,7 +62,8 @@
         LayoutPreference pref = screen.findPreference(getPreferenceKey());
         Button startButton = pref.findViewById(R.id.dream_start_now_button);
         startButton.setOnClickListener(v -> {
-            mMetricsFeatureProvider.logClickedPreference(pref, SettingsEnums.DREAM);
+            mMetricsFeatureProvider.logClickedPreference(pref,
+                    pref.getExtras().getInt(DashboardFragment.CATEGORY));
             mBackend.startDreaming();
         });
     }
diff --git a/src/com/android/settings/location/AppSettingsInjector.java b/src/com/android/settings/location/AppSettingsInjector.java
index 8120821..bea623e 100644
--- a/src/com/android/settings/location/AppSettingsInjector.java
+++ b/src/com/android/settings/location/AppSettingsInjector.java
@@ -17,11 +17,14 @@
 package com.android.settings.location;
 
 import android.content.Context;
+import android.content.Intent;
 import android.text.TextUtils;
 
 import androidx.preference.Preference;
 
+import com.android.settings.overlay.FeatureFactory;
 import com.android.settings.widget.RestrictedAppPreference;
+import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
 import com.android.settingslib.location.InjectedSetting;
 import com.android.settingslib.location.SettingsInjector;
 import com.android.settingslib.widget.apppreference.AppPreference;
@@ -31,8 +34,13 @@
  */
 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);
+        mMetricsCategory = metricsCategory;
+        mMetricsFeatureProvider = FeatureFactory.getFactory(context).getMetricsFeatureProvider();
     }
 
     @Override
@@ -41,4 +49,9 @@
                 ? new AppPreference(prefContext)
                 : new RestrictedAppPreference(prefContext, setting.userRestriction);
     }
+
+    @Override
+    protected void logPreferenceClick(Intent intent) {
+        mMetricsFeatureProvider.logStartedIntent(intent, mMetricsCategory);
+    }
 }
diff --git a/src/com/android/settings/location/LocationServicePreferenceController.java b/src/com/android/settings/location/LocationServicePreferenceController.java
index 56a23bd..04a9250 100644
--- a/src/com/android/settings/location/LocationServicePreferenceController.java
+++ b/src/com/android/settings/location/LocationServicePreferenceController.java
@@ -58,7 +58,7 @@
     @Override
     public void init(DashboardFragment fragment) {
         super.init(fragment);
-        mInjector = new AppSettingsInjector(mContext);
+        mInjector = new AppSettingsInjector(mContext, getMetricsCategory());
     }
 
     @Override
diff --git a/src/com/android/settings/password/ChooseLockGeneric.java b/src/com/android/settings/password/ChooseLockGeneric.java
index 755d158..5beacdd 100644
--- a/src/com/android/settings/password/ChooseLockGeneric.java
+++ b/src/com/android/settings/password/ChooseLockGeneric.java
@@ -311,8 +311,9 @@
 
         @Override
         public boolean onPreferenceTreeClick(Preference preference) {
-            final String key = preference.getKey();
+            writePreferenceClickMetric(preference);
 
+            final String key = preference.getKey();
             if (!isUnlockMethodSecure(key) && mLockPatternUtils.isSecure(mUserId)) {
                 // Show the disabling FRP warning only when the user is switching from a secure
                 // unlock method to an insecure one
diff --git a/src/com/android/settings/security/ChangeScreenLockPreferenceController.java b/src/com/android/settings/security/ChangeScreenLockPreferenceController.java
index 650b1e3..d678d86 100644
--- a/src/com/android/settings/security/ChangeScreenLockPreferenceController.java
+++ b/src/com/android/settings/security/ChangeScreenLockPreferenceController.java
@@ -31,6 +31,7 @@
 import com.android.settings.Utils;
 import com.android.settings.core.PreferenceControllerMixin;
 import com.android.settings.core.SubSettingLauncher;
+import com.android.settings.dashboard.DashboardFragment;
 import com.android.settings.overlay.FeatureFactory;
 import com.android.settings.password.ChooseLockGeneric;
 import com.android.settings.security.screenlock.ScreenLockSettings;
@@ -39,6 +40,7 @@
 import com.android.settingslib.RestrictedLockUtilsInternal;
 import com.android.settingslib.RestrictedPreference;
 import com.android.settingslib.core.AbstractPreferenceController;
+import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
 
 public class ChangeScreenLockPreferenceController extends AbstractPreferenceController implements
         PreferenceControllerMixin, GearPreference.OnGearClickListener {
@@ -52,6 +54,7 @@
 
     protected final int mUserId = UserHandle.myUserId();
     protected final int mProfileChallengeUserId;
+    private final MetricsFeatureProvider mMetricsFeatureProvider;
 
     protected RestrictedPreference mPreference;
 
@@ -64,6 +67,7 @@
                 .getLockPatternUtils(context);
         mHost = host;
         mProfileChallengeUserId = Utils.getManagedProfileId(mUm, mUserId);
+        mMetricsFeatureProvider = FeatureFactory.getFactory(context).getMetricsFeatureProvider();
     }
 
     @Override
@@ -104,6 +108,8 @@
     @Override
     public void onGearClick(GearPreference p) {
         if (TextUtils.equals(p.getKey(), getPreferenceKey())) {
+            mMetricsFeatureProvider.logClickedPreference(p,
+                    p.getExtras().getInt(DashboardFragment.CATEGORY));
             new SubSettingLauncher(mContext)
                     .setDestination(ScreenLockSettings.class.getName())
                     .setSourceMetricsCategory(mHost.getMetricsCategory())