Merge "Layout updated for file size text wrapping with largest display"
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index eb3be0e..1bd458a 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -1463,7 +1463,7 @@
             android:exported="false"
             android:permission="android.permission.MANAGE_USERS"
             android:resizeableActivity="false"
-            android:theme="@android:style/Theme.NoDisplay">
+            android:theme="@android:style/Theme.Translucent.NoTitleBar">
             <intent-filter android:priority="1">
                 <action android:name="android.app.action.CONFIRM_DEVICE_CREDENTIAL_WITH_USER" />
                 <category android:name="android.intent.category.DEFAULT" />
@@ -1598,6 +1598,11 @@
             </intent-filter>
         </activity>
 
+        <activity android:name=".password.SetupChooseLockGeneric$InternalActivity"
+            android:theme="@style/GlifTheme.Light"
+            android:exported="false"
+            android:excludeFromRecents="true" />
+
         <activity android:name=".password.ChooseLockGeneric"
             android:label="@string/lockpassword_choose_lock_generic_header"
             android:excludeFromRecents="true"
diff --git a/res/layout/search_bar.xml b/res/layout/search_bar.xml
index 1ba64ad..3d4d0d6 100644
--- a/res/layout/search_bar.xml
+++ b/res/layout/search_bar.xml
@@ -21,6 +21,7 @@
     android:id="@+id/search_bar_container"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
+    app:layout_scrollFlags="scroll|enterAlways"
     android:background="?android:attr/colorPrimary">
     <androidx.cardview.widget.CardView
         android:id="@+id/search_bar"
diff --git a/res/layout/settings_homepage_container.xml b/res/layout/settings_homepage_container.xml
index 5e0adec..7a84e32 100644
--- a/res/layout/settings_homepage_container.xml
+++ b/res/layout/settings_homepage_container.xml
@@ -15,28 +15,40 @@
      limitations under the License.
 -->
 
-<androidx.core.widget.NestedScrollView
+<androidx.coordinatorlayout.widget.CoordinatorLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
     android:layout_width="match_parent"
     android:layout_height="match_parent">
 
-    <LinearLayout
+    <com.google.android.material.appbar.AppBarLayout
         android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:orientation="vertical"
-        android:descendantFocusability="blocksDescendants">
-
+        android:layout_height="wrap_content">
         <include layout="@layout/search_bar"/>
+    </com.google.android.material.appbar.AppBarLayout>
 
-        <FrameLayout
-            android:id="@+id/contextual_cards_content"
+
+    <androidx.core.widget.NestedScrollView
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        app:layout_behavior="@string/appbar_scrolling_view_behavior">
+
+        <LinearLayout
             android:layout_width="match_parent"
-            android:layout_height="wrap_content"/>
+            android:layout_height="wrap_content"
+            android:orientation="vertical"
+            android:descendantFocusability="blocksDescendants">
 
-        <FrameLayout
-            android:id="@+id/main_content"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"/>
+            <FrameLayout
+                android:id="@+id/contextual_cards_content"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"/>
 
-    </LinearLayout>
-</androidx.core.widget.NestedScrollView>
+            <FrameLayout
+                android:id="@+id/main_content"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"/>
+
+        </LinearLayout>
+    </androidx.core.widget.NestedScrollView>
+</androidx.coordinatorlayout.widget.CoordinatorLayout>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index dbf2615..f15eeb2 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -6462,7 +6462,7 @@
     <!-- User (self) removal confirmation title [CHAR LIMIT=30] -->
     <string name="user_confirm_remove_self_title">Delete yourself?</string>
     <!-- User removal confirmation title [CHAR LIMIT=25] -->
-    <string name="user_confirm_remove_title">Remove this user?</string>
+    <string name="user_confirm_remove_title">Delete this user?</string>
     <!-- Profile removal confirmation title [CHAR LIMIT=25] -->
     <string name="user_profile_confirm_remove_title">Remove this profile?</string>
     <!-- Work profile removal confirmation title [CHAR LIMIT=25] -->
@@ -6500,7 +6500,7 @@
     <!-- Title of preference to enable calling and SMS [CHAR LIMIT=45] -->
     <string name="user_enable_calling_sms">Turn on phone calls &amp; SMS</string>
     <!-- Title of preference to remove the user [CHAR LIMIT=35] -->
-    <string name="user_remove_user">Remove user</string>
+    <string name="user_remove_user">Delete user</string>
     <!-- Title for confirmation of turning on calls [CHAR LIMIT=40] -->
     <string name="user_enable_calling_confirm_title">Turn on phone calls?</string>
     <!-- Message for confirmation of turning on calls [CHAR LIMIT=none] -->
@@ -7112,7 +7112,7 @@
     <string name="alarm_ringtone_title">Default alarm sound</string>
 
     <!-- Sound: Title for the option managing whether or not to vibrate when ringing. [CHAR LIMIT=30] -->
-    <string name="vibrate_when_ringing_title">Also vibrate for calls</string>
+    <string name="vibrate_when_ringing_title">Vibrate for calls</string>
 
     <!-- Sound: Title for the other sounds option and associated settings page. [CHAR LIMIT=30] -->
     <string name="other_sound_settings">Other sounds</string>
@@ -10273,6 +10273,7 @@
     <!-- OK button for Network connection timeout Dialog [CHAR LIMIT=30] -->
     <string name="network_connection_timeout_dialog_ok">Scan again</string>
 
+    <!-- Summary for connected devices count in connected device slice. [CHAR LIMIT=NONE] -->
     <plurals name="show_connected_devices">
         <item quantity="one"><xliff:g id="number_device_count">%1$d</xliff:g> device connected</item>
         <item quantity="other"><xliff:g id="number_device_count">%1$d</xliff:g> devices connected</item>
diff --git a/src/com/android/settings/applications/AppPermissionsPreferenceController.java b/src/com/android/settings/applications/AppPermissionsPreferenceController.java
index 38a56af..0137276 100644
--- a/src/com/android/settings/applications/AppPermissionsPreferenceController.java
+++ b/src/com/android/settings/applications/AppPermissionsPreferenceController.java
@@ -33,7 +33,6 @@
 public class AppPermissionsPreferenceController extends BasePreferenceController {
 
     private static final String TAG = "AppPermissionPrefCtrl";
-    private static final String KEY_APP_PERMISSION_GROUPS = "manage_perms";
     private static final String[] PERMISSION_GROUPS = new String[]{
             "android.permission-group.LOCATION",
             "android.permission-group.MICROPHONE",
@@ -46,8 +45,8 @@
 
     private final PackageManager mPackageManager;
 
-    public AppPermissionsPreferenceController(Context context) {
-        super(context, KEY_APP_PERMISSION_GROUPS);
+    public AppPermissionsPreferenceController(Context context, String preferenceKey) {
+        super(context, preferenceKey);
         mPackageManager = context.getPackageManager();
     }
 
diff --git a/src/com/android/settings/applications/UsageAccessDetails.java b/src/com/android/settings/applications/UsageAccessDetails.java
index 62ce08e..0a01896 100644
--- a/src/com/android/settings/applications/UsageAccessDetails.java
+++ b/src/com/android/settings/applications/UsageAccessDetails.java
@@ -36,6 +36,7 @@
 import com.android.settings.R;
 import com.android.settings.applications.AppStateUsageBridge.UsageState;
 import com.android.settings.overlay.FeatureFactory;
+import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
 
 public class UsageAccessDetails extends AppInfoWithHeader implements OnPreferenceChangeListener,
         OnPreferenceClickListener {
@@ -113,8 +114,14 @@
     void logSpecialPermissionChange(boolean newState, String packageName) {
         int logCategory = newState ? MetricsEvent.APP_SPECIAL_PERMISSION_USAGE_VIEW_ALLOW
                 : MetricsEvent.APP_SPECIAL_PERMISSION_USAGE_VIEW_DENY;
-        FeatureFactory.getFactory(getContext()).getMetricsFeatureProvider().action(getContext(),
-                logCategory, packageName);
+        final MetricsFeatureProvider metricsFeatureProvider =
+                FeatureFactory.getFactory(getContext()).getMetricsFeatureProvider();
+        metricsFeatureProvider.action(
+                metricsFeatureProvider.getAttribution(getActivity()),
+                logCategory,
+                getMetricsCategory(),
+                packageName,
+                0);
     }
 
     @Override
diff --git a/src/com/android/settings/applications/appinfo/AppButtonsPreferenceController.java b/src/com/android/settings/applications/appinfo/AppButtonsPreferenceController.java
index 12c4d9d..6d726b9 100644
--- a/src/com/android/settings/applications/appinfo/AppButtonsPreferenceController.java
+++ b/src/com/android/settings/applications/appinfo/AppButtonsPreferenceController.java
@@ -51,6 +51,7 @@
 import com.android.settings.applications.ApplicationFeatureProvider;
 import com.android.settings.applications.specialaccess.deviceadmin.DeviceAdminAdd;
 import com.android.settings.core.BasePreferenceController;
+import com.android.settings.core.InstrumentedPreferenceFragment;
 import com.android.settings.core.PreferenceControllerMixin;
 import com.android.settings.overlay.FeatureFactory;
 import com.android.settings.widget.ActionButtonPreference;
@@ -106,7 +107,7 @@
     private final UserManager mUserManager;
     private final PackageManager mPm;
     private final SettingsActivity mActivity;
-    private final Fragment mFragment;
+    private final InstrumentedPreferenceFragment mFragment;
     private final MetricsFeatureProvider mMetricsFeatureProvider;
     private final ApplicationFeatureProvider mApplicationFeatureProvider;
     private final int mUserId;
@@ -119,7 +120,8 @@
     private boolean mFinishing = false;
     private boolean mAppsControlDisallowedBySystem;
 
-    public AppButtonsPreferenceController(SettingsActivity activity, Fragment fragment,
+    public AppButtonsPreferenceController(SettingsActivity activity,
+            InstrumentedPreferenceFragment fragment,
             Lifecycle lifecycle, String packageName, ApplicationsState state,
             int requestUninstall, int requestRemoveDeviceAdmin) {
         super(activity, KEY_ACTION_BUTTONS);
@@ -517,8 +519,12 @@
 
     @VisibleForTesting
     void forceStopPackage(String pkgName) {
-        FeatureFactory.getFactory(mContext).getMetricsFeatureProvider().action(mContext,
-                MetricsProto.MetricsEvent.ACTION_APP_FORCE_STOP, pkgName);
+        mMetricsFeatureProvider.action(
+                mMetricsFeatureProvider.getAttribution(mActivity),
+                MetricsProto.MetricsEvent.ACTION_APP_FORCE_STOP,
+                mFragment.getMetricsCategory(),
+                pkgName,
+                0);
         ActivityManager am = (ActivityManager) mActivity.getSystemService(
                 Context.ACTIVITY_SERVICE);
         Log.d(TAG, "Stopping package " + pkgName);
diff --git a/src/com/android/settings/applications/appinfo/DrawOverlayDetails.java b/src/com/android/settings/applications/appinfo/DrawOverlayDetails.java
index 8405c61..f0d1068 100644
--- a/src/com/android/settings/applications/appinfo/DrawOverlayDetails.java
+++ b/src/com/android/settings/applications/appinfo/DrawOverlayDetails.java
@@ -42,6 +42,7 @@
 import com.android.settings.applications.AppStateOverlayBridge.OverlayState;
 import com.android.settings.overlay.FeatureFactory;
 import com.android.settingslib.applications.ApplicationsState.AppEntry;
+import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
 
 public class DrawOverlayDetails extends AppInfoWithHeader implements OnPreferenceChangeListener,
         OnPreferenceClickListener {
@@ -129,8 +130,14 @@
     void logSpecialPermissionChange(boolean newState, String packageName) {
         int logCategory = newState ? MetricsEvent.APP_SPECIAL_PERMISSION_APPDRAW_ALLOW
                 : MetricsEvent.APP_SPECIAL_PERMISSION_APPDRAW_DENY;
-        FeatureFactory.getFactory(getContext())
-                .getMetricsFeatureProvider().action(getContext(), logCategory, packageName);
+        final MetricsFeatureProvider metricsFeatureProvider =
+                FeatureFactory.getFactory(getContext()).getMetricsFeatureProvider();
+        metricsFeatureProvider.action(
+                metricsFeatureProvider.getAttribution(getActivity()),
+                logCategory,
+                getMetricsCategory(),
+                packageName,
+                0);
     }
 
     @Override
diff --git a/src/com/android/settings/applications/defaultapps/DefaultAppPickerFragment.java b/src/com/android/settings/applications/defaultapps/DefaultAppPickerFragment.java
index 9a337a5..14bf1ef 100644
--- a/src/com/android/settings/applications/defaultapps/DefaultAppPickerFragment.java
+++ b/src/com/android/settings/applications/defaultapps/DefaultAppPickerFragment.java
@@ -17,12 +17,12 @@
 package com.android.settings.applications.defaultapps;
 
 import android.app.Dialog;
+import android.app.settings.SettingsEnums;
 import android.content.Context;
 import android.content.DialogInterface;
 import android.content.pm.PackageManager;
 import android.os.Bundle;
 import android.text.TextUtils;
-import android.util.Pair;
 
 import androidx.appcompat.app.AlertDialog;
 import androidx.fragment.app.DialogFragment;
@@ -69,11 +69,12 @@
 
     @Override
     protected void onRadioButtonConfirmed(String selectedKey) {
-        mMetricsFeatureProvider.action(getContext(),
+        mMetricsFeatureProvider.action(
+                mMetricsFeatureProvider.getAttribution(getActivity()),
                 MetricsEvent.ACTION_SETTINGS_UPDATE_DEFAULT_APP,
+                getMetricsCategory(),
                 selectedKey,
-                Pair.create(MetricsEvent.FIELD_CONTEXT, getMetricsCategory()));
-
+                 0 /* value */);
         super.onRadioButtonConfirmed(selectedKey);
     }
 
diff --git a/src/com/android/settings/applications/specialaccess/deviceadmin/DeviceAdminAdd.java b/src/com/android/settings/applications/specialaccess/deviceadmin/DeviceAdminAdd.java
index 7c05bab..a260f67 100644
--- a/src/com/android/settings/applications/specialaccess/deviceadmin/DeviceAdminAdd.java
+++ b/src/com/android/settings/applications/specialaccess/deviceadmin/DeviceAdminAdd.java
@@ -23,6 +23,7 @@
 import android.app.admin.DeviceAdminInfo;
 import android.app.admin.DeviceAdminReceiver;
 import android.app.admin.DevicePolicyManager;
+import android.app.settings.SettingsEnums;
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.DialogInterface;
@@ -489,7 +490,12 @@
     void logSpecialPermissionChange(boolean allow, String packageName) {
         int logCategory = allow ? MetricsProto.MetricsEvent.APP_SPECIAL_PERMISSION_ADMIN_ALLOW :
                 MetricsProto.MetricsEvent.APP_SPECIAL_PERMISSION_ADMIN_DENY;
-        FeatureFactory.getFactory(this).getMetricsFeatureProvider().action(this, logCategory, packageName);
+        FeatureFactory.getFactory(this).getMetricsFeatureProvider().action(
+                SettingsEnums.PAGE_UNKNOWN,
+                logCategory,
+                SettingsEnums.PAGE_UNKNOWN,
+                packageName,
+                0);
     }
 
     @Override
diff --git a/src/com/android/settings/applications/specialaccess/pictureinpicture/PictureInPictureDetails.java b/src/com/android/settings/applications/specialaccess/pictureinpicture/PictureInPictureDetails.java
index 33a779f..c36c97a 100644
--- a/src/com/android/settings/applications/specialaccess/pictureinpicture/PictureInPictureDetails.java
+++ b/src/com/android/settings/applications/specialaccess/pictureinpicture/PictureInPictureDetails.java
@@ -33,6 +33,7 @@
 import com.android.settings.R;
 import com.android.settings.applications.AppInfoWithHeader;
 import com.android.settings.overlay.FeatureFactory;
+import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
 
 public class PictureInPictureDetails extends AppInfoWithHeader
         implements OnPreferenceChangeListener {
@@ -99,7 +100,7 @@
 
     /**
      * @return whether the app associated with the given {@param packageName} is allowed to enter
-     *         picture-in-picture.
+     * picture-in-picture.
      */
     static boolean getEnterPipStateForPackage(Context context, int uid, String packageName) {
         final AppOpsManager appOps = context.getSystemService(AppOpsManager.class);
@@ -108,7 +109,7 @@
 
     /**
      * @return the summary for the current state of whether the app associated with the given
-     *         {@param packageName} is allowed to enter picture-in-picture.
+     * {@param packageName} is allowed to enter picture-in-picture.
      */
     public static int getPreferenceSummary(Context context, int uid, String packageName) {
         final boolean enabled = PictureInPictureDetails.getEnterPipStateForPackage(context, uid,
@@ -122,7 +123,13 @@
         int logCategory = newState
                 ? MetricsEvent.APP_PICTURE_IN_PICTURE_ALLOW
                 : MetricsEvent.APP_PICTURE_IN_PICTURE_DENY;
-        FeatureFactory.getFactory(getContext())
-                .getMetricsFeatureProvider().action(getContext(), logCategory, packageName);
+        final MetricsFeatureProvider metricsFeatureProvider =
+                FeatureFactory.getFactory(getContext()).getMetricsFeatureProvider();
+        metricsFeatureProvider.action(
+                metricsFeatureProvider.getAttribution(getActivity()),
+                logCategory,
+                getMetricsCategory(),
+                packageName,
+                0);
     }
 }
diff --git a/src/com/android/settings/applications/specialaccess/premiumsms/PremiumSmsAccess.java b/src/com/android/settings/applications/specialaccess/premiumsms/PremiumSmsAccess.java
index 5c0d4b1..2ccf64f 100644
--- a/src/com/android/settings/applications/specialaccess/premiumsms/PremiumSmsAccess.java
+++ b/src/com/android/settings/applications/specialaccess/premiumsms/PremiumSmsAccess.java
@@ -44,6 +44,7 @@
 import com.android.settingslib.applications.ApplicationsState.AppEntry;
 import com.android.settingslib.applications.ApplicationsState.Callbacks;
 import com.android.settingslib.applications.ApplicationsState.Session;
+import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
 import com.android.settingslib.search.SearchIndexable;
 import com.android.settingslib.widget.FooterPreference;
 
@@ -126,8 +127,15 @@
                 break;
         }
         if (category != SmsUsageMonitor.PREMIUM_SMS_PERMISSION_UNKNOWN) {
-            FeatureFactory.getFactory(getContext()).getMetricsFeatureProvider().action(
-                    getContext(), category, packageName);
+            // TODO(117860032): Category is wrong. It should be defined in SettingsEnums.
+            final MetricsFeatureProvider metricsFeatureProvider =
+                    FeatureFactory.getFactory(getContext()).getMetricsFeatureProvider();
+            metricsFeatureProvider.action(
+                    metricsFeatureProvider.getAttribution(getActivity()),
+                    category,
+                    getMetricsCategory(),
+                    packageName,
+                    smsState);
         }
     }
 
@@ -214,7 +222,7 @@
                 setIcon(mAppEntry.icon);
             }
             setEntries(R.array.security_settings_premium_sms_values);
-            setEntryValues(new CharSequence[] {
+            setEntryValues(new CharSequence[]{
                     String.valueOf(SmsUsageMonitor.PREMIUM_SMS_PERMISSION_ASK_USER),
                     String.valueOf(SmsUsageMonitor.PREMIUM_SMS_PERMISSION_NEVER_ALLOW),
                     String.valueOf(SmsUsageMonitor.PREMIUM_SMS_PERMISSION_ALWAYS_ALLOW),
diff --git a/src/com/android/settings/applications/specialaccess/vrlistener/VrListenerSettings.java b/src/com/android/settings/applications/specialaccess/vrlistener/VrListenerSettings.java
index cad5957..b0c745d 100644
--- a/src/com/android/settings/applications/specialaccess/vrlistener/VrListenerSettings.java
+++ b/src/com/android/settings/applications/specialaccess/vrlistener/VrListenerSettings.java
@@ -29,6 +29,7 @@
 import com.android.settings.search.BaseSearchIndexProvider;
 import com.android.settings.search.Indexable;
 import com.android.settings.utils.ManagedServiceSettings;
+import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
 import com.android.settingslib.search.SearchIndexable;
 
 import java.util.ArrayList;
@@ -73,8 +74,14 @@
     void logSpecialPermissionChange(boolean enable, String packageName) {
         int logCategory = enable ? MetricsEvent.APP_SPECIAL_PERMISSION_VRHELPER_ALLOW
                 : MetricsEvent.APP_SPECIAL_PERMISSION_VRHELPER_DENY;
-        FeatureFactory.getFactory(getContext()).getMetricsFeatureProvider().action(getContext(),
-                logCategory, packageName);
+        final MetricsFeatureProvider metricsFeatureProvider =
+                FeatureFactory.getFactory(getContext()).getMetricsFeatureProvider();
+        metricsFeatureProvider.action(
+                metricsFeatureProvider.getAttribution(getActivity()),
+                logCategory,
+                getMetricsCategory(),
+                packageName,
+                0);
     }
 
     public static final Indexable.SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
diff --git a/src/com/android/settings/core/instrumentation/StatsLogWriter.java b/src/com/android/settings/core/instrumentation/StatsLogWriter.java
index 2617259..b6644c6 100644
--- a/src/com/android/settings/core/instrumentation/StatsLogWriter.java
+++ b/src/com/android/settings/core/instrumentation/StatsLogWriter.java
@@ -18,8 +18,8 @@
 
 import android.app.settings.SettingsEnums;
 import android.content.Context;
-import android.util.Pair;
 import android.util.StatsLog;
+import android.util.Pair;
 
 import com.android.settingslib.core.instrumentation.LogWriter;
 
@@ -45,7 +45,7 @@
                 0 /* changedPreferenceIntValue */);
     }
 
-   @Override
+    @Override
     public void action(Context context, int action, Pair<Integer, Object>... taggedData) {
         action(SettingsEnums.PAGE_UNKNOWN /* attribution */,
                 action,
@@ -73,8 +73,7 @@
     }
 
     @Override
-    public void action(Context context, int action, String pkg,
-            Pair<Integer, Object>... taggedData) {
+    public void action(Context context, int action, String pkg) {
         action(SettingsEnums.PAGE_UNKNOWN /* attribution */,
                 action,
                 SettingsEnums.PAGE_UNKNOWN /* pageId */,
diff --git a/src/com/android/settings/dashboard/suggestions/SuggestionFeatureProvider.java b/src/com/android/settings/dashboard/suggestions/SuggestionFeatureProvider.java
index 0011177..b755ba7 100644
--- a/src/com/android/settings/dashboard/suggestions/SuggestionFeatureProvider.java
+++ b/src/com/android/settings/dashboard/suggestions/SuggestionFeatureProvider.java
@@ -19,12 +19,9 @@
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.SharedPreferences;
-import android.service.settings.suggestions.Suggestion;
 
 import androidx.annotation.NonNull;
 
-import com.android.settingslib.suggestions.SuggestionControllerMixinCompat;
-
 /** Interface should be implemented if you have added new suggestions */
 public interface SuggestionFeatureProvider {
 
@@ -45,10 +42,4 @@
      * Returns the {@link SharedPreferences} that holds metadata for suggestions.
      */
     SharedPreferences getSharedPrefs(Context context);
-
-    /**
-     * Dismisses a suggestion.
-     */
-    void dismissSuggestion(Context context, SuggestionControllerMixinCompat suggestionMixin,
-            Suggestion suggestion);
 }
diff --git a/src/com/android/settings/dashboard/suggestions/SuggestionFeatureProviderImpl.java b/src/com/android/settings/dashboard/suggestions/SuggestionFeatureProviderImpl.java
index 39d0299..bfa44e5 100644
--- a/src/com/android/settings/dashboard/suggestions/SuggestionFeatureProviderImpl.java
+++ b/src/com/android/settings/dashboard/suggestions/SuggestionFeatureProviderImpl.java
@@ -20,12 +20,9 @@
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.SharedPreferences;
-import android.service.settings.suggestions.Suggestion;
-import android.util.Log;
 
 import androidx.annotation.NonNull;
 
-import com.android.internal.logging.nano.MetricsProto;
 import com.android.settings.Settings.NightDisplaySuggestionActivity;
 import com.android.settings.biometrics.fingerprint.FingerprintEnrollSuggestionActivity;
 import com.android.settings.biometrics.fingerprint.FingerprintSuggestionActivity;
@@ -37,10 +34,6 @@
 import com.android.settings.wallpaper.WallpaperSuggestionActivity;
 import com.android.settings.wifi.calling.WifiCallingSuggestionActivity;
 import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
-import com.android.settingslib.drawer.Tile;
-import com.android.settingslib.suggestions.SuggestionControllerMixinCompat;
-
-import java.util.List;
 
 public class SuggestionFeatureProviderImpl implements SuggestionFeatureProvider {
 
@@ -95,16 +88,4 @@
         mMetricsFeatureProvider = FeatureFactory.getFactory(appContext)
                 .getMetricsFeatureProvider();
     }
-
-    @Override
-    public void dismissSuggestion(Context context, SuggestionControllerMixinCompat mixin,
-            Suggestion suggestion) {
-        if (mixin == null || suggestion == null || context == null) {
-            return;
-        }
-        mMetricsFeatureProvider.action(
-                context, MetricsProto.MetricsEvent.ACTION_SETTINGS_DISMISS_SUGGESTION,
-                suggestion.getId());
-        mixin.dismissSuggestion(suggestion);
-    }
 }
diff --git a/src/com/android/settings/deviceinfo/BuildNumberPreferenceController.java b/src/com/android/settings/deviceinfo/BuildNumberPreferenceController.java
index 6256e23..65492d5 100644
--- a/src/com/android/settings/deviceinfo/BuildNumberPreferenceController.java
+++ b/src/com/android/settings/deviceinfo/BuildNumberPreferenceController.java
@@ -26,16 +26,15 @@
 import android.os.UserManager;
 import android.text.BidiFormatter;
 import android.text.TextUtils;
-import android.util.Pair;
 import android.widget.Toast;
 
-import androidx.fragment.app.Fragment;
 import androidx.preference.Preference;
 import androidx.preference.PreferenceScreen;
 
 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
 import com.android.settings.R;
 import com.android.settings.Utils;
+import com.android.settings.core.InstrumentedPreferenceFragment;
 import com.android.settings.core.PreferenceControllerMixin;
 import com.android.settings.overlay.FeatureFactory;
 import com.android.settings.password.ChooseLockSettingsHelper;
@@ -57,7 +56,7 @@
     private static final String KEY_BUILD_NUMBER = "build_number";
 
     private final Activity mActivity;
-    private final Fragment mFragment;
+    private final InstrumentedPreferenceFragment mFragment;
     private final UserManager mUm;
     private final MetricsFeatureProvider mMetricsFeatureProvider;
 
@@ -67,8 +66,8 @@
     private int mDevHitCountdown;
     private boolean mProcessingLastDevHit;
 
-    public BuildNumberPreferenceController(Context context, Activity activity, Fragment fragment,
-            Lifecycle lifecycle) {
+    public BuildNumberPreferenceController(Context context, Activity activity,
+            InstrumentedPreferenceFragment fragment, Lifecycle lifecycle) {
         super(context);
         mActivity = activity;
         mFragment = fragment;
@@ -145,7 +144,7 @@
                             .setPackage(componentName.getPackageName())
                             .setAction("com.android.settings.action.REQUEST_DEBUG_FEATURES");
                     final ResolveInfo resolveInfo = mContext.getPackageManager().resolveActivity(
-                        requestDebugFeatures, 0);
+                            requestDebugFeatures, 0);
                     if (resolveInfo != null) {
                         mContext.startActivity(requestDebugFeatures);
                         return false;
@@ -176,9 +175,11 @@
                     enableDevelopmentSettings();
                 }
                 mMetricsFeatureProvider.action(
-                        mContext, MetricsEvent.ACTION_SETTINGS_BUILD_NUMBER_PREF,
-                        Pair.create(MetricsEvent.FIELD_SETTINGS_BUILD_NUMBER_DEVELOPER_MODE_ENABLED,
-                                mProcessingLastDevHit ? 0 : 1));
+                        mMetricsFeatureProvider.getAttribution(mActivity),
+                        MetricsEvent.FIELD_SETTINGS_BUILD_NUMBER_DEVELOPER_MODE_ENABLED,
+                        mFragment.getMetricsCategory(),
+                        null,
+                        mProcessingLastDevHit ? 0 : 1);
             } else if (mDevHitCountdown > 0
                     && mDevHitCountdown < (TAPS_TO_BE_A_DEVELOPER - 2)) {
                 if (mDevHitToast != null) {
@@ -191,10 +192,13 @@
                         Toast.LENGTH_SHORT);
                 mDevHitToast.show();
             }
+
             mMetricsFeatureProvider.action(
-                    mContext, MetricsEvent.ACTION_SETTINGS_BUILD_NUMBER_PREF,
-                    Pair.create(MetricsEvent.FIELD_SETTINGS_BUILD_NUMBER_DEVELOPER_MODE_ENABLED,
-                            0));
+                    mMetricsFeatureProvider.getAttribution(mActivity),
+                    MetricsEvent.FIELD_SETTINGS_BUILD_NUMBER_DEVELOPER_MODE_ENABLED,
+                    mFragment.getMetricsCategory(),
+                    null,
+                    0);
         } else if (mDevHitCountdown < 0) {
             if (mDevHitToast != null) {
                 mDevHitToast.cancel();
@@ -203,9 +207,11 @@
                     Toast.LENGTH_LONG);
             mDevHitToast.show();
             mMetricsFeatureProvider.action(
-                    mContext, MetricsEvent.ACTION_SETTINGS_BUILD_NUMBER_PREF,
-                    Pair.create(MetricsEvent.FIELD_SETTINGS_BUILD_NUMBER_DEVELOPER_MODE_ENABLED,
-                            1));
+                    mMetricsFeatureProvider.getAttribution(mActivity),
+                    MetricsEvent.FIELD_SETTINGS_BUILD_NUMBER_DEVELOPER_MODE_ENABLED,
+                    mFragment.getMetricsCategory(),
+                    null,
+                    1);
         }
         return true;
     }
diff --git a/src/com/android/settings/deviceinfo/aboutphone/TopLevelAboutDevicePreferenceController.java b/src/com/android/settings/deviceinfo/aboutphone/TopLevelAboutDevicePreferenceController.java
index ba28f3a..d2ffd0d 100644
--- a/src/com/android/settings/deviceinfo/aboutphone/TopLevelAboutDevicePreferenceController.java
+++ b/src/com/android/settings/deviceinfo/aboutphone/TopLevelAboutDevicePreferenceController.java
@@ -19,7 +19,7 @@
 import android.content.Context;
 
 import com.android.settings.core.BasePreferenceController;
-import com.android.settings.deviceinfo.DeviceModelPreferenceController;
+import com.android.settings.deviceinfo.DeviceNamePreferenceController;
 
 public class TopLevelAboutDevicePreferenceController extends BasePreferenceController {
 
@@ -34,6 +34,8 @@
 
     @Override
     public CharSequence getSummary() {
-        return DeviceModelPreferenceController.getDeviceModel();
+        final DeviceNamePreferenceController deviceNamePreferenceController =
+            new DeviceNamePreferenceController(mContext);
+        return deviceNamePreferenceController.getSummary();
     }
 }
diff --git a/src/com/android/settings/display/NightDisplayActivationPreferenceController.java b/src/com/android/settings/display/NightDisplayActivationPreferenceController.java
index 6421ebd..706ac85 100644
--- a/src/com/android/settings/display/NightDisplayActivationPreferenceController.java
+++ b/src/com/android/settings/display/NightDisplayActivationPreferenceController.java
@@ -17,6 +17,7 @@
 package com.android.settings.display;
 
 import android.content.Context;
+import android.hardware.display.ColorDisplayManager;
 import android.text.TextUtils;
 import android.view.View;
 import android.view.View.OnClickListener;
@@ -53,7 +54,8 @@
 
     @Override
     public int getAvailabilityStatus() {
-        return ColorDisplayController.isAvailable(mContext) ? AVAILABLE : UNSUPPORTED_ON_DEVICE;
+        return ColorDisplayManager.isNightDisplayAvailable(mContext) ? AVAILABLE
+                : UNSUPPORTED_ON_DEVICE;
     }
 
     @Override
diff --git a/src/com/android/settings/display/NightDisplayAutoModePreferenceController.java b/src/com/android/settings/display/NightDisplayAutoModePreferenceController.java
index cfe1791..8ad5e63 100644
--- a/src/com/android/settings/display/NightDisplayAutoModePreferenceController.java
+++ b/src/com/android/settings/display/NightDisplayAutoModePreferenceController.java
@@ -18,6 +18,8 @@
 
 import android.content.Context;
 
+import android.hardware.display.ColorDisplayManager;
+
 import androidx.preference.DropDownPreference;
 import androidx.preference.Preference;
 import androidx.preference.PreferenceScreen;
@@ -39,7 +41,8 @@
 
     @Override
     public int getAvailabilityStatus() {
-        return ColorDisplayController.isAvailable(mContext) ? AVAILABLE : UNSUPPORTED_ON_DEVICE;
+        return ColorDisplayManager.isNightDisplayAvailable(mContext) ? AVAILABLE
+                : UNSUPPORTED_ON_DEVICE;
     }
 
     @Override
diff --git a/src/com/android/settings/display/NightDisplayCustomEndTimePreferenceController.java b/src/com/android/settings/display/NightDisplayCustomEndTimePreferenceController.java
index e2abe1b..f7a5425 100644
--- a/src/com/android/settings/display/NightDisplayCustomEndTimePreferenceController.java
+++ b/src/com/android/settings/display/NightDisplayCustomEndTimePreferenceController.java
@@ -20,6 +20,8 @@
 
 import androidx.preference.Preference;
 
+import android.hardware.display.ColorDisplayManager;
+
 import com.android.internal.app.ColorDisplayController;
 import com.android.settings.core.BasePreferenceController;
 
@@ -37,7 +39,8 @@
 
     @Override
     public int getAvailabilityStatus() {
-        return ColorDisplayController.isAvailable(mContext) ? AVAILABLE : UNSUPPORTED_ON_DEVICE;
+        return ColorDisplayManager.isNightDisplayAvailable(mContext) ? AVAILABLE
+                : UNSUPPORTED_ON_DEVICE;
     }
 
     @Override
diff --git a/src/com/android/settings/display/NightDisplayCustomStartTimePreferenceController.java b/src/com/android/settings/display/NightDisplayCustomStartTimePreferenceController.java
index 255003c..346ddd6 100644
--- a/src/com/android/settings/display/NightDisplayCustomStartTimePreferenceController.java
+++ b/src/com/android/settings/display/NightDisplayCustomStartTimePreferenceController.java
@@ -20,6 +20,8 @@
 
 import androidx.preference.Preference;
 
+import android.hardware.display.ColorDisplayManager;
+
 import com.android.internal.app.ColorDisplayController;
 import com.android.settings.core.BasePreferenceController;
 
@@ -37,7 +39,8 @@
 
     @Override
     public int getAvailabilityStatus() {
-        return ColorDisplayController.isAvailable(mContext) ? AVAILABLE : UNSUPPORTED_ON_DEVICE;
+        return ColorDisplayManager.isNightDisplayAvailable(mContext) ? AVAILABLE
+                : UNSUPPORTED_ON_DEVICE;
     }
 
     @Override
diff --git a/src/com/android/settings/display/NightDisplayFooterPreferenceController.java b/src/com/android/settings/display/NightDisplayFooterPreferenceController.java
index bb59859..e0c12c3 100644
--- a/src/com/android/settings/display/NightDisplayFooterPreferenceController.java
+++ b/src/com/android/settings/display/NightDisplayFooterPreferenceController.java
@@ -20,7 +20,8 @@
 
 import androidx.preference.Preference;
 
-import com.android.internal.app.ColorDisplayController;
+import android.hardware.display.ColorDisplayManager;
+
 import com.android.settings.R;
 import com.android.settings.core.BasePreferenceController;
 import com.android.settingslib.widget.FooterPreference;
@@ -33,7 +34,8 @@
 
     @Override
     public int getAvailabilityStatus() {
-        return ColorDisplayController.isAvailable(mContext) ? AVAILABLE : UNSUPPORTED_ON_DEVICE;
+        return ColorDisplayManager.isNightDisplayAvailable(mContext) ? AVAILABLE
+                : UNSUPPORTED_ON_DEVICE;
     }
 
     @Override
diff --git a/src/com/android/settings/display/NightDisplayIntensityPreferenceController.java b/src/com/android/settings/display/NightDisplayIntensityPreferenceController.java
index db053a5..6adaf23 100644
--- a/src/com/android/settings/display/NightDisplayIntensityPreferenceController.java
+++ b/src/com/android/settings/display/NightDisplayIntensityPreferenceController.java
@@ -17,6 +17,7 @@
 package com.android.settings.display;
 
 import android.content.Context;
+import android.hardware.display.ColorDisplayManager;
 import android.text.TextUtils;
 
 import androidx.preference.Preference;
@@ -37,7 +38,7 @@
 
     @Override
     public int getAvailabilityStatus() {
-        if (!ColorDisplayController.isAvailable(mContext)) {
+        if (!ColorDisplayManager.isNightDisplayAvailable(mContext)) {
             return UNSUPPORTED_ON_DEVICE;
         } else if (!mController.isActivated()) {
             return DISABLED_DEPENDENT_SETTING;
@@ -54,7 +55,7 @@
     public void displayPreference(PreferenceScreen screen) {
         super.displayPreference(screen);
         final SeekBarPreference preference = (SeekBarPreference) screen.findPreference(
-            getPreferenceKey());
+                getPreferenceKey());
         preference.setContinuousUpdates(true);
         preference.setMax(getMaxSteps());
     }
diff --git a/src/com/android/settings/display/NightDisplayPreferenceController.java b/src/com/android/settings/display/NightDisplayPreferenceController.java
index 3cb57e0..678e4d3 100644
--- a/src/com/android/settings/display/NightDisplayPreferenceController.java
+++ b/src/com/android/settings/display/NightDisplayPreferenceController.java
@@ -15,6 +15,7 @@
 
 import android.content.Context;
 
+import android.hardware.display.ColorDisplayManager;
 import com.android.internal.app.ColorDisplayController;
 import com.android.settings.R;
 import com.android.settings.core.PreferenceControllerMixin;
@@ -42,7 +43,7 @@
 
     @Override
     public boolean isAvailable() {
-        return ColorDisplayController.isAvailable(mContext);
+        return ColorDisplayManager.isNightDisplayAvailable(mContext);
     }
 
     @Override
diff --git a/src/com/android/settings/display/NightDisplaySettings.java b/src/com/android/settings/display/NightDisplaySettings.java
index fbd5d3e..7e77415 100644
--- a/src/com/android/settings/display/NightDisplaySettings.java
+++ b/src/com/android/settings/display/NightDisplaySettings.java
@@ -19,6 +19,7 @@
 import android.app.Dialog;
 import android.app.TimePickerDialog;
 import android.content.Context;
+import android.hardware.display.ColorDisplayManager;
 import android.os.Bundle;
 import android.provider.SearchIndexableResource;
 
@@ -178,7 +179,7 @@
         return buildPreferenceControllers(context);
     }
 
-    private static List <AbstractPreferenceController> buildPreferenceControllers(Context context) {
+    private static List<AbstractPreferenceController> buildPreferenceControllers(Context context) {
         final List<AbstractPreferenceController> controllers = new ArrayList<>(1);
         controllers.add(new NightDisplayFooterPreferenceController(context));
         return controllers;
@@ -198,12 +199,12 @@
 
                 @Override
                 protected boolean isPageSearchEnabled(Context context) {
-                    return ColorDisplayController.isAvailable(context);
+                    return ColorDisplayManager.isNightDisplayAvailable(context);
                 }
 
                 @Override
                 public List<AbstractPreferenceController> createPreferenceControllers(
-                    Context context) {
+                        Context context) {
                     return buildPreferenceControllers(context);
                 }
             };
diff --git a/src/com/android/settings/fuelgauge/batterytip/AnomalyDetectionJobService.java b/src/com/android/settings/fuelgauge/batterytip/AnomalyDetectionJobService.java
index b3be061..2534d08 100644
--- a/src/com/android/settings/fuelgauge/batterytip/AnomalyDetectionJobService.java
+++ b/src/com/android/settings/fuelgauge/batterytip/AnomalyDetectionJobService.java
@@ -26,6 +26,7 @@
 import android.app.job.JobScheduler;
 import android.app.job.JobService;
 import android.app.job.JobWorkItem;
+import android.app.settings.SettingsEnums;
 import android.content.ComponentName;
 import android.content.ContentResolver;
 import android.content.Context;
@@ -35,7 +36,6 @@
 import android.os.UserManager;
 import android.provider.Settings;
 import android.util.Log;
-import android.util.Pair;
 
 import androidx.annotation.GuardedBy;
 import androidx.annotation.VisibleForTesting;
@@ -146,20 +146,18 @@
             final int uid = extractUidFromStatsDimensionsValue(intentDimsValue);
             final boolean autoFeatureOn = powerUsageFeatureProvider.isSmartBatterySupported()
                     ? Settings.Global.getInt(contentResolver,
-                            Settings.Global.ADAPTIVE_BATTERY_MANAGEMENT_ENABLED, ON) == ON
+                    Settings.Global.ADAPTIVE_BATTERY_MANAGEMENT_ENABLED, ON) == ON
                     : Settings.Global.getInt(contentResolver,
                             Settings.Global.APP_AUTO_RESTRICTION_ENABLED, ON) == ON;
             final String packageName = batteryUtils.getPackageName(uid);
             final long versionCode = batteryUtils.getAppLongVersionCode(packageName);
-
+            final String versionedPackage = packageName + "/" + versionCode;
             if (batteryUtils.shouldHideAnomaly(powerWhitelistBackend, uid, anomalyInfo)) {
-                metricsFeatureProvider.action(context,
+                metricsFeatureProvider.action(SettingsEnums.PAGE_UNKNOWN,
                         MetricsProto.MetricsEvent.ACTION_ANOMALY_IGNORED,
-                        packageName,
-                        Pair.create(MetricsProto.MetricsEvent.FIELD_ANOMALY_TYPE,
-                                anomalyInfo.anomalyType),
-                        Pair.create(MetricsProto.MetricsEvent.FIELD_APP_VERSION_CODE,
-                                versionCode));
+                        SettingsEnums.PAGE_UNKNOWN,
+                        versionedPackage,
+                        anomalyInfo.anomalyType);
             } else {
                 if (autoFeatureOn && anomalyInfo.autoRestriction) {
                     // Auto restrict this app
@@ -173,13 +171,11 @@
                             AnomalyDatabaseHelper.State.NEW,
                             timeMs);
                 }
-                metricsFeatureProvider.action(context,
+                metricsFeatureProvider.action(SettingsEnums.PAGE_UNKNOWN,
                         MetricsProto.MetricsEvent.ACTION_ANOMALY_TRIGGERED,
-                        packageName,
-                        Pair.create(MetricsProto.MetricsEvent.FIELD_ANOMALY_TYPE,
-                                anomalyInfo.anomalyType),
-                        Pair.create(MetricsProto.MetricsEvent.FIELD_APP_VERSION_CODE,
-                                versionCode));
+                        SettingsEnums.PAGE_UNKNOWN,
+                        versionedPackage,
+                        anomalyInfo.anomalyType);
             }
 
         } catch (NullPointerException | IndexOutOfBoundsException e) {
diff --git a/src/com/android/settings/fuelgauge/batterytip/actions/RestrictAppAction.java b/src/com/android/settings/fuelgauge/batterytip/actions/RestrictAppAction.java
index ac946df..d52a967 100644
--- a/src/com/android/settings/fuelgauge/batterytip/actions/RestrictAppAction.java
+++ b/src/com/android/settings/fuelgauge/batterytip/actions/RestrictAppAction.java
@@ -17,8 +17,8 @@
 package com.android.settings.fuelgauge.batterytip.actions;
 
 import android.app.AppOpsManager;
+import android.app.settings.SettingsEnums;
 import android.content.Context;
-import android.util.Pair;
 
 import androidx.annotation.VisibleForTesting;
 
@@ -64,15 +64,18 @@
                     AppOpsManager.MODE_IGNORED);
             if (CollectionUtils.isEmpty(appInfo.anomalyTypes)) {
                 // Only log context if there is no anomaly type
-                mMetricsFeatureProvider.action(mContext,
-                        MetricsProto.MetricsEvent.ACTION_TIP_RESTRICT_APP, packageName,
-                        Pair.create(MetricsProto.MetricsEvent.FIELD_CONTEXT, metricsKey));
+                mMetricsFeatureProvider.action(SettingsEnums.PAGE_UNKNOWN,
+                        MetricsProto.MetricsEvent.ACTION_TIP_RESTRICT_APP,
+                        metricsKey,
+                        packageName,
+                        0);
             } else {
                 for (int type : appInfo.anomalyTypes) {
-                    mMetricsFeatureProvider.action(mContext,
-                            MetricsProto.MetricsEvent.ACTION_TIP_RESTRICT_APP, packageName,
-                            Pair.create(MetricsProto.MetricsEvent.FIELD_CONTEXT, metricsKey),
-                            Pair.create(MetricsProto.MetricsEvent.FIELD_ANOMALY_TYPE, type));
+                    mMetricsFeatureProvider.action(SettingsEnums.PAGE_UNKNOWN,
+                            MetricsProto.MetricsEvent.ACTION_TIP_RESTRICT_APP,
+                            metricsKey,
+                            packageName,
+                            type);
                 }
             }
         }
diff --git a/src/com/android/settings/fuelgauge/batterytip/actions/UnrestrictAppAction.java b/src/com/android/settings/fuelgauge/batterytip/actions/UnrestrictAppAction.java
index 419e043..db882e5 100644
--- a/src/com/android/settings/fuelgauge/batterytip/actions/UnrestrictAppAction.java
+++ b/src/com/android/settings/fuelgauge/batterytip/actions/UnrestrictAppAction.java
@@ -17,8 +17,8 @@
 package com.android.settings.fuelgauge.batterytip.actions;
 
 import android.app.AppOpsManager;
+import android.app.settings.SettingsEnums;
 import android.content.Context;
-import android.util.Pair;
 
 import androidx.annotation.VisibleForTesting;
 
@@ -50,8 +50,11 @@
         // Clear force app standby, then app can run in the background
         mBatteryUtils.setForceAppStandby(appInfo.uid, appInfo.packageName,
                 AppOpsManager.MODE_ALLOWED);
-        mMetricsFeatureProvider.action(mContext,
-                MetricsProto.MetricsEvent.ACTION_TIP_UNRESTRICT_APP, appInfo.packageName,
-                Pair.create(MetricsProto.MetricsEvent.FIELD_CONTEXT, metricsKey));
+        mMetricsFeatureProvider.action(
+                SettingsEnums.PAGE_UNKNOWN,
+                MetricsProto.MetricsEvent.ACTION_TIP_UNRESTRICT_APP,
+                metricsKey,
+                appInfo.packageName,
+                0);
     }
 }
diff --git a/src/com/android/settings/fuelgauge/batterytip/tips/RestrictAppTip.java b/src/com/android/settings/fuelgauge/batterytip/tips/RestrictAppTip.java
index 4ff0d28..f166734 100644
--- a/src/com/android/settings/fuelgauge/batterytip/tips/RestrictAppTip.java
+++ b/src/com/android/settings/fuelgauge/batterytip/tips/RestrictAppTip.java
@@ -16,11 +16,11 @@
 
 package com.android.settings.fuelgauge.batterytip.tips;
 
+import android.app.settings.SettingsEnums;
 import android.content.Context;
 import android.content.res.Resources;
 import android.icu.text.ListFormatter;
 import android.os.Parcel;
-import android.util.Pair;
 
 import androidx.annotation.VisibleForTesting;
 
@@ -126,12 +126,12 @@
             for (int i = 0, size = mRestrictAppList.size(); i < size; i++) {
                 final AppInfo appInfo = mRestrictAppList.get(i);
                 for (Integer anomalyType : appInfo.anomalyTypes) {
-                    metricsFeatureProvider.action(context,
+                    metricsFeatureProvider.action(SettingsEnums.PAGE_UNKNOWN,
                             MetricsProto.MetricsEvent.ACTION_APP_RESTRICTION_TIP_LIST,
+                            SettingsEnums.PAGE_UNKNOWN,
                             appInfo.packageName,
-                            Pair.create(MetricsProto.MetricsEvent.FIELD_ANOMALY_TYPE, anomalyType));
+                            anomalyType);
                 }
-
             }
         }
     }
diff --git a/src/com/android/settings/homepage/contextualcards/ContextualCard.java b/src/com/android/settings/homepage/contextualcards/ContextualCard.java
index 8d43914..4e4e34f 100644
--- a/src/com/android/settings/homepage/contextualcards/ContextualCard.java
+++ b/src/com/android/settings/homepage/contextualcards/ContextualCard.java
@@ -63,7 +63,7 @@
     private final boolean mIsHalfWidth;
     private final Drawable mIconDrawable;
 
-    String getName() {
+    public String getName() {
         return mName;
     }
 
diff --git a/src/com/android/settings/homepage/contextualcards/ContextualCardManager.java b/src/com/android/settings/homepage/contextualcards/ContextualCardManager.java
index db05abb..8bb8b4d 100644
--- a/src/com/android/settings/homepage/contextualcards/ContextualCardManager.java
+++ b/src/com/android/settings/homepage/contextualcards/ContextualCardManager.java
@@ -29,6 +29,7 @@
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.annotation.VisibleForTesting;
 import androidx.loader.app.LoaderManager;
 import androidx.loader.content.Loader;
 
@@ -109,9 +110,12 @@
         }
     }
 
-    //TODO(b/111822376): implement sorting mechanism.
-    private void sortCards(List<ContextualCard> cards) {
+    @VisibleForTesting
+    List<ContextualCard> sortCards(List<ContextualCard> cards) {
         //take mContextualCards as the source and do the ranking based on the rule.
+        return cards.stream()
+                .sorted((c1, c2) -> Double.compare(c2.getRankingScore(), c1.getRankingScore()))
+                .collect(Collectors.toList());
     }
 
     @Override
@@ -127,10 +131,9 @@
         allCards.addAll(
                 updateList.values().stream().flatMap(List::stream).collect(Collectors.toList()));
 
-        sortCards(allCards);
         //replace with the new data
         mContextualCards.clear();
-        mContextualCards.addAll(allCards);
+        mContextualCards.addAll(sortCards(allCards));
 
         loadCardControllers();
 
diff --git a/src/com/android/settings/homepage/contextualcards/conditional/ConditionalContextualCard.java b/src/com/android/settings/homepage/contextualcards/conditional/ConditionalContextualCard.java
index 81219c3..4f92534 100644
--- a/src/com/android/settings/homepage/contextualcards/conditional/ConditionalContextualCard.java
+++ b/src/com/android/settings/homepage/contextualcards/conditional/ConditionalContextualCard.java
@@ -16,6 +16,8 @@
 
 package com.android.settings.homepage.contextualcards.conditional;
 
+import androidx.annotation.VisibleForTesting;
+
 import com.android.settings.homepage.contextualcards.ContextualCard;
 
 /**
@@ -26,6 +28,9 @@
  */
 public class ConditionalContextualCard extends ContextualCard {
 
+    @VisibleForTesting
+    static final double UNSUPPORTED_RANKING_SCORE = -100.0;
+
     private final long mConditionId;
     private final int mMetricsConstant;
     private final CharSequence mActionText;
@@ -83,6 +88,7 @@
         }
 
         public ConditionalContextualCard build() {
+            setRankingScore(UNSUPPORTED_RANKING_SCORE);
             return new ConditionalContextualCard(this);
         }
     }
diff --git a/src/com/android/settings/network/PrivateDnsModeDialogPreference.java b/src/com/android/settings/network/PrivateDnsModeDialogPreference.java
index a4e7d2a..322fdc4 100644
--- a/src/com/android/settings/network/PrivateDnsModeDialogPreference.java
+++ b/src/com/android/settings/network/PrivateDnsModeDialogPreference.java
@@ -22,12 +22,16 @@
 import static android.system.OsConstants.AF_INET;
 import static android.system.OsConstants.AF_INET6;
 
+import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
+
 import android.content.ActivityNotFoundException;
 import android.content.ContentResolver;
 import android.content.Context;
 import android.content.DialogInterface;
 import android.content.Intent;
 import android.net.NetworkUtils;
+import android.os.UserHandle;
+import android.os.UserManager;
 import android.provider.Settings;
 import android.system.Os;
 import android.text.Editable;
@@ -43,6 +47,7 @@
 
 import androidx.annotation.VisibleForTesting;
 import androidx.appcompat.app.AlertDialog;
+import androidx.preference.PreferenceViewHolder;
 
 import com.android.internal.logging.nano.MetricsProto;
 import com.android.settings.R;
@@ -50,6 +55,8 @@
 import com.android.settings.utils.AnnotationSpan;
 import com.android.settingslib.CustomDialogPreferenceCompat;
 import com.android.settingslib.HelpUtils;
+import com.android.settingslib.RestrictedLockUtils;
+import com.android.settingslib.RestrictedLockUtilsInternal;
 
 import java.util.HashMap;
 import java.util.Map;
@@ -99,19 +106,23 @@
 
     public PrivateDnsModeDialogPreference(Context context) {
         super(context);
+        initialize();
     }
 
     public PrivateDnsModeDialogPreference(Context context, AttributeSet attrs) {
         super(context, attrs);
+        initialize();
     }
 
     public PrivateDnsModeDialogPreference(Context context, AttributeSet attrs, int defStyleAttr) {
         super(context, attrs, defStyleAttr);
+        initialize();
     }
 
     public PrivateDnsModeDialogPreference(Context context, AttributeSet attrs, int defStyleAttr,
             int defStyleRes) {
         super(context, attrs, defStyleAttr, defStyleRes);
+        initialize();
     }
 
     private final AnnotationSpan.LinkInfo mUrlLinkInfo = new AnnotationSpan.LinkInfo(
@@ -129,6 +140,30 @@
         }
     });
 
+    private void initialize() {
+        // Add the "Restricted" icon resource so that if the preference is disabled by the
+        // admin, an information button will be shown.
+        setWidgetLayoutResource(R.layout.restricted_icon);
+    }
+
+    @Override
+    public void onBindViewHolder(PreferenceViewHolder holder) {
+        super.onBindViewHolder(holder);
+        if (isDisabledByAdmin()) {
+            // If the preference is disabled by the admin, set the inner item as enabled so
+            // it could act as a click target. The preference itself will have been disabled
+            // by the controller.
+            holder.itemView.setEnabled(true);
+        }
+
+        final View restrictedIcon = holder.findViewById(R.id.restricted_icon);
+        if (restrictedIcon != null) {
+            // Show the "Restricted" icon if, and only if, the preference was disabled by
+            // the admin.
+            restrictedIcon.setVisibility(isDisabledByAdmin() ? View.VISIBLE : View.GONE);
+        }
+    }
+
     @Override
     protected void onBindDialogView(View view) {
         final Context context = getContext();
@@ -202,6 +237,28 @@
         updateDialogInfo();
     }
 
+    @Override
+    public void performClick() {
+        EnforcedAdmin enforcedAdmin = getEnforcedAdmin();
+
+        if (enforcedAdmin == null) {
+            // If the restriction is not restricted by admin, continue as usual.
+            super.performClick();
+        } else {
+            // Show a dialog explaining to the user why they cannot change the preference.
+            RestrictedLockUtils.sendShowAdminSupportDetailsIntent(getContext(), enforcedAdmin);
+        }
+    }
+
+    private EnforcedAdmin getEnforcedAdmin() {
+        return RestrictedLockUtilsInternal.checkIfRestrictionEnforced(
+                getContext(), UserManager.DISALLOW_CONFIG_PRIVATE_DNS, UserHandle.myUserId());
+    }
+
+    private boolean isDisabledByAdmin() {
+        return getEnforcedAdmin() != null;
+    }
+
     private Button getSaveButton() {
         final AlertDialog dialog = (AlertDialog) getDialog();
         if (dialog == null) {
diff --git a/src/com/android/settings/network/PrivateDnsPreferenceController.java b/src/com/android/settings/network/PrivateDnsPreferenceController.java
index 8b3bfa0..37adea7 100644
--- a/src/com/android/settings/network/PrivateDnsPreferenceController.java
+++ b/src/com/android/settings/network/PrivateDnsPreferenceController.java
@@ -143,7 +143,6 @@
     @Override
     public void updateState(Preference preference) {
         super.updateState(preference);
-        //TODO(b/112982691): Add policy transparency explaining why this setting is disabled.
         preference.setEnabled(!isManagedByAdmin());
     }
 
diff --git a/src/com/android/settings/password/BiometricFragment.java b/src/com/android/settings/password/BiometricFragment.java
index 6e1ae10..3a12bac 100644
--- a/src/com/android/settings/password/BiometricFragment.java
+++ b/src/com/android/settings/password/BiometricFragment.java
@@ -50,6 +50,9 @@
     private Executor mClientExecutor;
     private AuthenticationCallback mClientCallback;
 
+    // Re-settable by the application.
+    private int mUserId;
+
     // Created/Initialized once and retained
     private final Handler mHandler = new Handler(Looper.getMainLooper());
     private PromptInfo mPromptInfo;
@@ -96,6 +99,10 @@
         mClientCallback = callback;
     }
 
+    public void setUser(int userId) {
+        mUserId = userId;
+    }
+
     public void cancel() {
         if (mCancellationSignal != null) {
             mCancellationSignal.cancel();
@@ -126,8 +133,8 @@
         mCancellationSignal = new CancellationSignal();
 
         // TODO: CC doesn't use crypto for now
-        mBiometricPrompt.authenticate(mCancellationSignal, mClientExecutor,
-                mAuthenticationCallback);
+        mBiometricPrompt.authenticateUser(mCancellationSignal, mClientExecutor,
+                mAuthenticationCallback, mUserId);
     }
 
     @Override
diff --git a/src/com/android/settings/password/ConfirmDeviceCredentialActivity.java b/src/com/android/settings/password/ConfirmDeviceCredentialActivity.java
index f68c04a..5eb1f32 100644
--- a/src/com/android/settings/password/ConfirmDeviceCredentialActivity.java
+++ b/src/com/android/settings/password/ConfirmDeviceCredentialActivity.java
@@ -20,9 +20,9 @@
 import android.app.Activity;
 import android.app.KeyguardManager;
 import android.app.admin.DevicePolicyManager;
+import android.app.trust.TrustManager;
 import android.content.Context;
 import android.content.Intent;
-import android.hardware.biometrics.BiometricConstants;
 import android.hardware.biometrics.BiometricManager;
 import android.hardware.biometrics.BiometricPrompt;
 import android.hardware.biometrics.BiometricPrompt.AuthenticationCallback;
@@ -84,13 +84,13 @@
     private DevicePolicyManager mDevicePolicyManager;
     private LockPatternUtils mLockPatternUtils;
     private UserManager mUserManager;
+    private TrustManager mTrustManager;
     private ChooseLockSettingsHelper mChooseLockSettingsHelper;
     private Handler mHandler = new Handler(Looper.getMainLooper());
 
     private String mTitle;
     private String mDetails;
     private int mUserId;
-    private int mEffectiveUserId;
     private int mCredentialMode;
     private boolean mGoingToBackground;
 
@@ -108,10 +108,16 @@
                     showConfirmCredentials();
                 }
             }
-
         }
 
         public void onAuthenticationSucceeded(BiometricPrompt.AuthenticationResult result) {
+            mTrustManager.setDeviceLockedForUser(mUserId, false);
+
+            ConfirmDeviceCredentialUtils.reportSuccessfulAttempt(mLockPatternUtils, mUserManager,
+                    mUserId);
+            ConfirmDeviceCredentialUtils.checkForPendingIntent(
+                    ConfirmDeviceCredentialActivity.this);
+
             setResult(Activity.RESULT_OK);
             finish();
         }
@@ -124,6 +130,7 @@
         mBiometricManager = getSystemService(BiometricManager.class);
         mDevicePolicyManager = getSystemService(DevicePolicyManager.class);
         mUserManager = UserManager.get(this);
+        mTrustManager = getSystemService(TrustManager.class);
         mLockPatternUtils = new LockPatternUtils(this);
 
         Intent intent = getIntent();
@@ -134,7 +141,7 @@
         boolean frp = KeyguardManager.ACTION_CONFIRM_FRP_CREDENTIAL.equals(intent.getAction());
 
         mUserId = UserHandle.myUserId();
-        mEffectiveUserId = mUserManager.getCredentialOwnerProfile(mUserId);
+        final int effectiveUserId = mUserManager.getCredentialOwnerProfile(mUserId);
         if (isInternalActivity()) {
             try {
                 mUserId = Utils.getUserIdFromBundle(this, intent.getExtras());
@@ -162,21 +169,23 @@
         } else if (isManagedProfile && isInternalActivity()
                 && !lockPatternUtils.isSeparateProfileChallengeEnabled(mUserId)) {
             mCredentialMode = CREDENTIAL_MANAGED;
-            if (isBiometricAllowed()) {
+            if (isBiometricAllowed(effectiveUserId)) {
                 showBiometricPrompt();
                 launchedBiometric = true;
             } else {
                 showConfirmCredentials();
+                launchedCDC = true;
             }
         } else {
             mCredentialMode = CREDENTIAL_NORMAL;
-            if (isBiometricAllowed()) {
+            if (isBiometricAllowed(effectiveUserId)) {
                 // Don't need to check if biometrics / pin/pattern/pass are enrolled. It will go to
                 // onAuthenticationError and do the right thing automatically.
                 showBiometricPrompt();
                 launchedBiometric = true;
             } else {
                 showConfirmCredentials();
+                launchedCDC = true;
             }
         }
 
@@ -217,19 +226,20 @@
     // credential. Otherwise, biometric can't unlock fbe/keystore through
     // verifyTiedProfileChallenge. In such case, we also wanna show the user message that
     // biometric is disabled due to device restart.
-    private boolean isStrongAuthRequired() {
-        return !mLockPatternUtils.isBiometricAllowedForUser(mEffectiveUserId)
+    private boolean isStrongAuthRequired(int effectiveUserId) {
+        return !mLockPatternUtils.isBiometricAllowedForUser(effectiveUserId)
                 || !mUserManager.isUserUnlocked(mUserId);
     }
 
-    private boolean isBiometricDisabledByAdmin() {
+    private boolean isBiometricDisabledByAdmin(int effectiveUserId) {
         final int disabledFeatures =
-                mDevicePolicyManager.getKeyguardDisabledFeatures(null, mEffectiveUserId);
+                mDevicePolicyManager.getKeyguardDisabledFeatures(null, effectiveUserId);
         return (disabledFeatures & DevicePolicyManager.KEYGUARD_DISABLE_BIOMETRICS) != 0;
     }
 
-    private boolean isBiometricAllowed() {
-        return !isStrongAuthRequired() && !isBiometricDisabledByAdmin();
+    private boolean isBiometricAllowed(int effectiveUserId) {
+        return !isStrongAuthRequired(effectiveUserId)
+                && !isBiometricDisabledByAdmin(effectiveUserId);
     }
 
     private void showBiometricPrompt() {
@@ -250,6 +260,7 @@
             newFragment = true;
         }
         mBiometricFragment.setCallbacks(mExecutor, mAuthenticationCallback);
+        mBiometricFragment.setUser(mUserId);
 
         if (newFragment) {
             getSupportFragmentManager().beginTransaction()
diff --git a/src/com/android/settings/password/ConfirmDeviceCredentialBaseFragment.java b/src/com/android/settings/password/ConfirmDeviceCredentialBaseFragment.java
index 9b677aa..2de7625 100644
--- a/src/com/android/settings/password/ConfirmDeviceCredentialBaseFragment.java
+++ b/src/com/android/settings/password/ConfirmDeviceCredentialBaseFragment.java
@@ -18,17 +18,12 @@
 package com.android.settings.password;
 
 import android.annotation.Nullable;
-import android.app.ActivityManager;
-import android.app.ActivityOptions;
 import android.app.Dialog;
-import android.app.IActivityManager;
 import android.app.KeyguardManager;
 import android.app.admin.DevicePolicyManager;
-import android.app.trust.TrustManager;
 import android.content.Context;
 import android.content.DialogInterface;
 import android.content.Intent;
-import android.content.IntentSender;
 import android.content.pm.UserInfo;
 import android.graphics.Point;
 import android.graphics.PorterDuff;
@@ -36,7 +31,6 @@
 import android.graphics.drawable.Drawable;
 import android.os.Bundle;
 import android.os.Handler;
-import android.os.RemoteException;
 import android.os.UserManager;
 import android.text.TextUtils;
 import android.view.View;
@@ -199,29 +193,6 @@
     public void startEnterAnimation() {
     }
 
-    protected void checkForPendingIntent() {
-        int taskId = getActivity().getIntent().getIntExtra(Intent.EXTRA_TASK_ID, -1);
-        if (taskId != -1) {
-            try {
-                IActivityManager activityManager = ActivityManager.getService();
-                final ActivityOptions options = ActivityOptions.makeBasic();
-                activityManager.startActivityFromRecents(taskId, options.toBundle());
-                return;
-            } catch (RemoteException e) {
-                // Do nothing.
-            }
-        }
-        IntentSender intentSender = getActivity().getIntent()
-                .getParcelableExtra(Intent.EXTRA_INTENT);
-        if (intentSender != null) {
-            try {
-                getActivity().startIntentSenderForResult(intentSender, -1, null, 0, 0, 0);
-            } catch (IntentSender.SendIntentException e) {
-                /* ignore */
-            }
-        }
-    }
-
     private void setWorkChallengeBackground(View baseView, int userId) {
         View mainContent = getActivity().findViewById(com.android.settings.R.id.main_content);
         if (mainContent != null) {
@@ -246,15 +217,6 @@
         }
     }
 
-    protected void reportSuccessfulAttempt() {
-        mLockPatternUtils.reportSuccessfulPasswordAttempt(mEffectiveUserId);
-        if (mUserManager.isManagedProfile(mEffectiveUserId)) {
-            // Keyguard is responsible to disable StrongAuth for primary user. Disable StrongAuth
-            // for work challenge only here.
-            mLockPatternUtils.userPresent(mEffectiveUserId);
-        }
-    }
-
     protected void reportFailedAttempt() {
         updateErrorMessage(
                 mLockPatternUtils.getCurrentFailedPasswordAttempts(mEffectiveUserId) + 1);
diff --git a/src/com/android/settings/password/ConfirmDeviceCredentialUtils.java b/src/com/android/settings/password/ConfirmDeviceCredentialUtils.java
new file mode 100644
index 0000000..11d6924
--- /dev/null
+++ b/src/com/android/settings/password/ConfirmDeviceCredentialUtils.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.settings.password;
+
+import android.app.Activity;
+import android.app.ActivityManager;
+import android.app.ActivityOptions;
+import android.app.IActivityManager;
+import android.content.Intent;
+import android.content.IntentSender;
+import android.os.RemoteException;
+import android.os.UserManager;
+
+import com.android.internal.widget.LockPatternUtils;
+
+/** Class containing methods shared between CDCA and CDCBA */
+public class ConfirmDeviceCredentialUtils {
+
+    public static void checkForPendingIntent(Activity activity) {
+        // See Change-Id I52c203735fa9b53fd2f7df971824747eeb930f36 for context
+        int taskId = activity.getIntent().getIntExtra(Intent.EXTRA_TASK_ID, -1);
+        if (taskId != -1) {
+            try {
+                IActivityManager activityManager = ActivityManager.getService();
+                final ActivityOptions options = ActivityOptions.makeBasic();
+                activityManager.startActivityFromRecents(taskId, options.toBundle());
+                return;
+            } catch (RemoteException e) {
+                // Do nothing.
+            }
+        }
+        IntentSender intentSender = activity.getIntent().getParcelableExtra(Intent.EXTRA_INTENT);
+        if (intentSender != null) {
+            try {
+                activity.startIntentSenderForResult(intentSender, -1, null, 0, 0, 0);
+            } catch (IntentSender.SendIntentException e) {
+                /* ignore */
+            }
+        }
+    }
+
+    public static void reportSuccessfulAttempt(LockPatternUtils utils, UserManager userManager,
+            int userId) {
+        utils.reportSuccessfulPasswordAttempt(userId);
+        if (userManager.isManagedProfile(userId)) {
+            // Keyguard is responsible to disable StrongAuth for primary user. Disable StrongAuth
+            // for work challenge only here.
+            utils.userPresent(userId);
+        }
+    }
+}
diff --git a/src/com/android/settings/password/ConfirmLockPassword.java b/src/com/android/settings/password/ConfirmLockPassword.java
index d380fc9..45b8129 100644
--- a/src/com/android/settings/password/ConfirmLockPassword.java
+++ b/src/com/android/settings/password/ConfirmLockPassword.java
@@ -434,10 +434,11 @@
             mPasswordEntryInputDisabler.setInputEnabled(true);
             if (matched) {
                 if (newResult) {
-                    reportSuccessfulAttempt();
+                    ConfirmDeviceCredentialUtils.reportSuccessfulAttempt(mLockPatternUtils,
+                            mUserManager, mEffectiveUserId);
                 }
                 startDisappearAnimation(intent);
-                checkForPendingIntent();
+                ConfirmDeviceCredentialUtils.checkForPendingIntent(getActivity());
             } else {
                 if (timeoutMs > 0) {
                     refreshLockScreen();
diff --git a/src/com/android/settings/password/ConfirmLockPattern.java b/src/com/android/settings/password/ConfirmLockPattern.java
index 95a0aca..83141ea 100644
--- a/src/com/android/settings/password/ConfirmLockPattern.java
+++ b/src/com/android/settings/password/ConfirmLockPattern.java
@@ -487,10 +487,11 @@
             mLockPatternView.setEnabled(true);
             if (matched) {
                 if (newResult) {
-                    reportSuccessfulAttempt();
+                    ConfirmDeviceCredentialUtils.reportSuccessfulAttempt(mLockPatternUtils,
+                            mUserManager, mEffectiveUserId);
                 }
                 startDisappearAnimation(intent);
-                checkForPendingIntent();
+                ConfirmDeviceCredentialUtils.checkForPendingIntent(getActivity());
             } else {
                 if (timeoutMs > 0) {
                     refreshLockScreen();
diff --git a/src/com/android/settings/privacy/PrivacyDashboardFragment.java b/src/com/android/settings/privacy/PrivacyDashboardFragment.java
index e3cd457..dd4c8fa 100644
--- a/src/com/android/settings/privacy/PrivacyDashboardFragment.java
+++ b/src/com/android/settings/privacy/PrivacyDashboardFragment.java
@@ -23,8 +23,6 @@
 import com.android.settings.R;
 import com.android.settings.dashboard.DashboardFragment;
 import com.android.settings.search.BaseSearchIndexProvider;
-import com.android.settings.security.ShowPasswordPreferenceController;
-import com.android.settingslib.core.AbstractPreferenceController;
 import com.android.settingslib.search.SearchIndexable;
 
 import java.util.ArrayList;
diff --git a/src/com/android/settings/slices/SliceBroadcastReceiver.java b/src/com/android/settings/slices/SliceBroadcastReceiver.java
index 4b86f33..2860e9a 100644
--- a/src/com/android/settings/slices/SliceBroadcastReceiver.java
+++ b/src/com/android/settings/slices/SliceBroadcastReceiver.java
@@ -17,24 +17,20 @@
 package com.android.settings.slices;
 
 import static com.android.settings.bluetooth.BluetoothSliceBuilder.ACTION_BLUETOOTH_SLICE_CHANGED;
-import static com.android.settings.flashlight.FlashlightSliceBuilder
-        .ACTION_FLASHLIGHT_SLICE_CHANGED;
-import static com.android.settings.network.telephony.Enhanced4gLteSliceHelper
-        .ACTION_ENHANCED_4G_LTE_CHANGED;
+import static com.android.settings.flashlight.FlashlightSliceBuilder.ACTION_FLASHLIGHT_SLICE_CHANGED;
+import static com.android.settings.network.telephony.Enhanced4gLteSliceHelper.ACTION_ENHANCED_4G_LTE_CHANGED;
 import static com.android.settings.notification.ZenModeSliceBuilder.ACTION_ZEN_MODE_SLICE_CHANGED;
+import static com.android.settings.slices.SettingsSliceProvider.ACTION_COPY;
 import static com.android.settings.slices.SettingsSliceProvider.ACTION_SLIDER_CHANGED;
 import static com.android.settings.slices.SettingsSliceProvider.ACTION_TOGGLE_CHANGED;
-import static com.android.settings.slices.SettingsSliceProvider.ACTION_COPY;
 import static com.android.settings.slices.SettingsSliceProvider.EXTRA_SLICE_KEY;
 import static com.android.settings.slices.SettingsSliceProvider.EXTRA_SLICE_PLATFORM_DEFINED;
 import static com.android.settings.wifi.calling.WifiCallingSliceHelper.ACTION_WIFI_CALLING_CHANGED;
-import static com.android.settings.wifi.calling.WifiCallingSliceHelper
-        .ACTION_WIFI_CALLING_PREFERENCE_CELLULAR_PREFERRED;
-import static com.android.settings.wifi.calling.WifiCallingSliceHelper
-        .ACTION_WIFI_CALLING_PREFERENCE_WIFI_ONLY;
-import static com.android.settings.wifi.calling.WifiCallingSliceHelper
-        .ACTION_WIFI_CALLING_PREFERENCE_WIFI_PREFERRED;
+import static com.android.settings.wifi.calling.WifiCallingSliceHelper.ACTION_WIFI_CALLING_PREFERENCE_CELLULAR_PREFERRED;
+import static com.android.settings.wifi.calling.WifiCallingSliceHelper.ACTION_WIFI_CALLING_PREFERENCE_WIFI_ONLY;
+import static com.android.settings.wifi.calling.WifiCallingSliceHelper.ACTION_WIFI_CALLING_PREFERENCE_WIFI_PREFERRED;
 
+import android.app.settings.SettingsEnums;
 import android.app.slice.Slice;
 import android.content.BroadcastReceiver;
 import android.content.ContentResolver;
@@ -44,7 +40,6 @@
 import android.provider.SettingsSlicesContract;
 import android.text.TextUtils;
 import android.util.Log;
-import android.util.Pair;
 
 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
 import com.android.settings.bluetooth.BluetoothSliceBuilder;
@@ -216,12 +211,11 @@
      * follows the pattern in SharedPreferenceLogger.
      */
     private void logSliceValueChange(Context context, String sliceKey, int newValue) {
-        final Pair<Integer, Object> namePair = Pair.create(
-                MetricsEvent.FIELD_SETTINGS_PREFERENCE_CHANGE_NAME, sliceKey);
-        final Pair<Integer, Object> valuePair = Pair.create(
-                MetricsEvent.FIELD_SETTINGS_PREFERENCE_CHANGE_INT_VALUE, newValue);
         FeatureFactory.getFactory(context).getMetricsFeatureProvider()
-                .action(context, MetricsEvent.ACTION_SETTINGS_SLICE_CHANGED, namePair, valuePair);
+                .action(SettingsEnums.PAGE_UNKNOWN,
+                        MetricsEvent.ACTION_SETTINGS_SLICE_CHANGED,
+                        SettingsEnums.PAGE_UNKNOWN,
+                        sliceKey, newValue);
     }
 
     private BasePreferenceController getPreferenceController(Context context, String key) {
diff --git a/src/com/android/settings/slices/SliceBuilderUtils.java b/src/com/android/settings/slices/SliceBuilderUtils.java
index f6cc57f..f18225a 100644
--- a/src/com/android/settings/slices/SliceBuilderUtils.java
+++ b/src/com/android/settings/slices/SliceBuilderUtils.java
@@ -22,6 +22,7 @@
 
 import android.annotation.ColorInt;
 import android.app.PendingIntent;
+import android.app.settings.SettingsEnums;
 import android.content.ContentResolver;
 import android.content.Context;
 import android.content.Intent;
@@ -77,12 +78,12 @@
     public static Slice buildSlice(Context context, SliceData sliceData) {
         Log.d(TAG, "Creating slice for: " + sliceData.getPreferenceController());
         final BasePreferenceController controller = getPreferenceController(context, sliceData);
-        final Pair<Integer, Object> sliceNamePair =
-                Pair.create(MetricsEvent.FIELD_SETTINGS_PREFERENCE_CHANGE_NAME, sliceData.getKey());
-        // Log Slice requests using the same schema as SharedPreferenceLogger (but with a different
-        // action name).
         FeatureFactory.getFactory(context).getMetricsFeatureProvider()
-                .action(context, MetricsEvent.ACTION_SETTINGS_SLICE_REQUESTED, sliceNamePair);
+                .action(SettingsEnums.PAGE_UNKNOWN,
+                        MetricsEvent.ACTION_SETTINGS_SLICE_REQUESTED,
+                        SettingsEnums.PAGE_UNKNOWN,
+                        sliceData.getKey(),
+                        0);
 
         if (!controller.isAvailable()) {
             // Cannot guarantee setting page is accessible, let the presenter handle error case.
diff --git a/tests/robotests/src/com/android/settings/applications/AppPermissionsPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/applications/AppPermissionsPreferenceControllerTest.java
index cb3d3ad..e828a62 100644
--- a/tests/robotests/src/com/android/settings/applications/AppPermissionsPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/applications/AppPermissionsPreferenceControllerTest.java
@@ -143,7 +143,7 @@
         when(mPackageManager.queryPermissionsByGroup(anyString(), anyInt()))
                 .thenReturn(permissions);
 
-        mController = spy(new AppPermissionsPreferenceController(mContext));
+        mController = spy(new AppPermissionsPreferenceController(mContext, "pref_key"));
     }
 
     @Test
diff --git a/tests/robotests/src/com/android/settings/applications/UsageAccessDetailsTest.java b/tests/robotests/src/com/android/settings/applications/UsageAccessDetailsTest.java
index f9cb01b..1834689 100644
--- a/tests/robotests/src/com/android/settings/applications/UsageAccessDetailsTest.java
+++ b/tests/robotests/src/com/android/settings/applications/UsageAccessDetailsTest.java
@@ -18,12 +18,10 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
-import static org.mockito.ArgumentMatchers.nullable;
-import static org.mockito.Matchers.eq;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.verify;
 
-import android.content.Context;
+import android.app.settings.SettingsEnums;
 import android.os.Bundle;
 
 import com.android.internal.logging.nano.MetricsProto;
@@ -54,12 +52,20 @@
     @Test
     public void logSpecialPermissionChange() {
         mFragment.logSpecialPermissionChange(true, "app");
-        verify(mFeatureFactory.metricsFeatureProvider).action(nullable(Context.class),
-                eq(MetricsProto.MetricsEvent.APP_SPECIAL_PERMISSION_USAGE_VIEW_ALLOW), eq("app"));
+        verify(mFeatureFactory.metricsFeatureProvider).action(
+                SettingsEnums.PAGE_UNKNOWN,
+                MetricsProto.MetricsEvent.APP_SPECIAL_PERMISSION_USAGE_VIEW_ALLOW,
+                mFragment.getMetricsCategory(),
+                "app",
+                0);
 
         mFragment.logSpecialPermissionChange(false, "app");
-        verify(mFeatureFactory.metricsFeatureProvider).action(nullable(Context.class),
-                eq(MetricsProto.MetricsEvent.APP_SPECIAL_PERMISSION_USAGE_VIEW_DENY), eq("app"));
+        verify(mFeatureFactory.metricsFeatureProvider).action(
+                SettingsEnums.PAGE_UNKNOWN,
+                MetricsProto.MetricsEvent.APP_SPECIAL_PERMISSION_USAGE_VIEW_DENY,
+                mFragment.getMetricsCategory(),
+                "app",
+                0);
     }
 
     @Test
diff --git a/tests/robotests/src/com/android/settings/applications/appinfo/AppButtonsPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/applications/appinfo/AppButtonsPreferenceControllerTest.java
index 44ace78..f7b2700 100644
--- a/tests/robotests/src/com/android/settings/applications/appinfo/AppButtonsPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/applications/appinfo/AppButtonsPreferenceControllerTest.java
@@ -35,6 +35,7 @@
 import android.app.ActivityManager;
 import android.app.Application;
 import android.app.admin.DevicePolicyManager;
+import android.app.settings.SettingsEnums;
 import android.content.Context;
 import android.content.Intent;
 import android.content.pm.ApplicationInfo;
@@ -42,10 +43,9 @@
 import android.content.pm.PackageManager;
 import android.os.UserManager;
 
-import androidx.fragment.app.Fragment;
-
 import com.android.settings.R;
 import com.android.settings.SettingsActivity;
+import com.android.settings.core.InstrumentedPreferenceFragment;
 import com.android.settings.testutils.FakeFeatureFactory;
 import com.android.settings.testutils.SettingsRobolectricTestRunner;
 import com.android.settings.widget.ActionButtonPreference;
@@ -377,12 +377,17 @@
      * The test fragment which implements
      * {@link ButtonActionDialogFragment.AppButtonsDialogListener}
      */
-    public static class TestFragment extends Fragment
+    public static class TestFragment extends InstrumentedPreferenceFragment
             implements ButtonActionDialogFragment.AppButtonsDialogListener {
 
         @Override
         public void handleDialogClick(int type) {
             // Do nothing
         }
+
+        @Override
+        public int getMetricsCategory() {
+            return SettingsEnums.PAGE_UNKNOWN;
+        }
     }
 }
diff --git a/tests/robotests/src/com/android/settings/applications/appinfo/DrawOverlayDetailsTest.java b/tests/robotests/src/com/android/settings/applications/appinfo/DrawOverlayDetailsTest.java
index 1b25286..4093cba 100644
--- a/tests/robotests/src/com/android/settings/applications/appinfo/DrawOverlayDetailsTest.java
+++ b/tests/robotests/src/com/android/settings/applications/appinfo/DrawOverlayDetailsTest.java
@@ -19,12 +19,10 @@
 import static android.view.WindowManager.LayoutParams.SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS;
 
 import static org.junit.Assert.assertEquals;
-import static org.mockito.Matchers.eq;
-import static org.mockito.Matchers.nullable;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
-import android.content.Context;
+import android.app.settings.SettingsEnums;
 import android.view.Window;
 import android.view.WindowManager.LayoutParams;
 
@@ -75,12 +73,14 @@
         when(mFragment.getContext()).thenReturn(RuntimeEnvironment.application);
 
         mFragment.logSpecialPermissionChange(true, "app");
-        verify(mFeatureFactory.metricsFeatureProvider).action(nullable(Context.class),
-                eq(MetricsProto.MetricsEvent.APP_SPECIAL_PERMISSION_APPDRAW_ALLOW), eq("app"));
+        verify(mFeatureFactory.metricsFeatureProvider).action(SettingsEnums.PAGE_UNKNOWN,
+                MetricsProto.MetricsEvent.APP_SPECIAL_PERMISSION_APPDRAW_ALLOW,
+                mFragment.getMetricsCategory(), "app", 0);
 
         mFragment.logSpecialPermissionChange(false, "app");
-        verify(mFeatureFactory.metricsFeatureProvider).action(nullable(Context.class),
-                eq(MetricsProto.MetricsEvent.APP_SPECIAL_PERMISSION_APPDRAW_DENY), eq("app"));
+        verify(mFeatureFactory.metricsFeatureProvider).action(SettingsEnums.PAGE_UNKNOWN,
+                MetricsProto.MetricsEvent.APP_SPECIAL_PERMISSION_APPDRAW_DENY,
+                mFragment.getMetricsCategory(), "app", 0);
     }
 
     @Test
diff --git a/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultAppPickerFragmentTest.java b/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultAppPickerFragmentTest.java
index 541954b..de602ba 100644
--- a/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultAppPickerFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultAppPickerFragmentTest.java
@@ -17,15 +17,14 @@
 package com.android.settings.applications.defaultapps;
 
 import static org.mockito.Matchers.any;
-import static org.mockito.Matchers.eq;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
+import android.app.settings.SettingsEnums;
 import android.content.Context;
 import android.os.UserManager;
-import android.util.Pair;
 
 import androidx.fragment.app.FragmentActivity;
 import androidx.preference.PreferenceScreen;
@@ -89,10 +88,12 @@
         mFragment.onAttach((Context) mActivity);
         mFragment.onRadioButtonConfirmed("test_pkg");
 
-        verify(mFeatureFactory.metricsFeatureProvider).action(any(Context.class),
-                eq(MetricsProto.MetricsEvent.ACTION_SETTINGS_UPDATE_DEFAULT_APP),
-                eq("test_pkg"),
-                any(Pair.class));
+        verify(mFeatureFactory.metricsFeatureProvider).action(
+                SettingsEnums.PAGE_UNKNOWN,
+                MetricsProto.MetricsEvent.ACTION_SETTINGS_UPDATE_DEFAULT_APP,
+                mFragment.getMetricsCategory(),
+                "test_pkg",
+                0);
     }
 
     public static class TestFragment extends DefaultAppPickerFragment {
diff --git a/tests/robotests/src/com/android/settings/applications/specialaccess/deviceadmin/DeviceAdminAddTest.java b/tests/robotests/src/com/android/settings/applications/specialaccess/deviceadmin/DeviceAdminAddTest.java
index 6bc143c..eaccdc0 100644
--- a/tests/robotests/src/com/android/settings/applications/specialaccess/deviceadmin/DeviceAdminAddTest.java
+++ b/tests/robotests/src/com/android/settings/applications/specialaccess/deviceadmin/DeviceAdminAddTest.java
@@ -16,10 +16,8 @@
 
 package com.android.settings.applications.specialaccess.deviceadmin;
 
-import static org.mockito.Matchers.any;
 import static org.mockito.Matchers.anyInt;
 import static org.mockito.Matchers.anyString;
-import static org.mockito.Matchers.eq;
 import static org.mockito.Mockito.doNothing;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.never;
@@ -29,7 +27,7 @@
 
 import android.app.AppOpsManager;
 import android.app.admin.DeviceAdminInfo;
-import android.content.Context;
+import android.app.settings.SettingsEnums;
 
 import com.android.internal.logging.nano.MetricsProto;
 import com.android.settings.fuelgauge.BatteryUtils;
@@ -73,12 +71,20 @@
     @Test
     public void logSpecialPermissionChange() {
         mDeviceAdminAdd.logSpecialPermissionChange(true, "app");
-        verify(mFeatureFactory.metricsFeatureProvider).action(any(Context.class),
-                eq(MetricsProto.MetricsEvent.APP_SPECIAL_PERMISSION_ADMIN_ALLOW), eq("app"));
+        verify(mFeatureFactory.metricsFeatureProvider).action(
+                SettingsEnums.PAGE_UNKNOWN,
+                MetricsProto.MetricsEvent.APP_SPECIAL_PERMISSION_ADMIN_ALLOW,
+                SettingsEnums.PAGE_UNKNOWN,
+                "app",
+                0);
 
         mDeviceAdminAdd.logSpecialPermissionChange(false, "app");
-        verify(mFeatureFactory.metricsFeatureProvider).action(any(Context.class),
-                eq(MetricsProto.MetricsEvent.APP_SPECIAL_PERMISSION_ADMIN_DENY), eq("app"));
+        verify(mFeatureFactory.metricsFeatureProvider).action(
+                SettingsEnums.PAGE_UNKNOWN,
+                MetricsProto.MetricsEvent.APP_SPECIAL_PERMISSION_ADMIN_DENY,
+                SettingsEnums.PAGE_UNKNOWN,
+                "app",
+                0);
     }
 
     @Test
diff --git a/tests/robotests/src/com/android/settings/applications/specialaccess/pictureinpicture/PictureInPictureDetailsTest.java b/tests/robotests/src/com/android/settings/applications/specialaccess/pictureinpicture/PictureInPictureDetailsTest.java
index 9d53f95..b3d6958 100644
--- a/tests/robotests/src/com/android/settings/applications/specialaccess/pictureinpicture/PictureInPictureDetailsTest.java
+++ b/tests/robotests/src/com/android/settings/applications/specialaccess/pictureinpicture/PictureInPictureDetailsTest.java
@@ -18,11 +18,9 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
-import static org.mockito.ArgumentMatchers.nullable;
-import static org.mockito.Matchers.eq;
 import static org.mockito.Mockito.verify;
 
-import android.content.Context;
+import android.app.settings.SettingsEnums;
 import android.content.pm.ActivityInfo;
 
 import com.android.internal.logging.nano.MetricsProto;
@@ -75,12 +73,20 @@
     @Test
     public void logSpecialPermissionChange() {
         mFragment.logSpecialPermissionChange(true, "app");
-        verify(mFeatureFactory.metricsFeatureProvider).action(nullable(Context.class),
-                eq(MetricsProto.MetricsEvent.APP_PICTURE_IN_PICTURE_ALLOW), eq("app"));
+        verify(mFeatureFactory.metricsFeatureProvider).action(
+                SettingsEnums.PAGE_UNKNOWN,
+                MetricsProto.MetricsEvent.APP_PICTURE_IN_PICTURE_ALLOW,
+                mFragment.getMetricsCategory(),
+                "app",
+                0);
 
         mFragment.logSpecialPermissionChange(false, "app");
-        verify(mFeatureFactory.metricsFeatureProvider).action(nullable(Context.class),
-                eq(MetricsProto.MetricsEvent.APP_PICTURE_IN_PICTURE_DENY), eq("app"));
+        verify(mFeatureFactory.metricsFeatureProvider).action(
+                SettingsEnums.PAGE_UNKNOWN,
+                MetricsProto.MetricsEvent.APP_PICTURE_IN_PICTURE_DENY,
+                mFragment.getMetricsCategory(),
+                "app",
+                0);
     }
 
     private boolean checkPackageHasPictureInPictureActivities(String packageName,
diff --git a/tests/robotests/src/com/android/settings/applications/specialaccess/premiumsms/PremiumSmsAccessTest.java b/tests/robotests/src/com/android/settings/applications/specialaccess/premiumsms/PremiumSmsAccessTest.java
index 3978825..1f32b18 100644
--- a/tests/robotests/src/com/android/settings/applications/specialaccess/premiumsms/PremiumSmsAccessTest.java
+++ b/tests/robotests/src/com/android/settings/applications/specialaccess/premiumsms/PremiumSmsAccessTest.java
@@ -16,11 +16,9 @@
 
 package com.android.settings.applications.specialaccess.premiumsms;
 
-import static org.mockito.ArgumentMatchers.nullable;
-import static org.mockito.Matchers.eq;
 import static org.mockito.Mockito.verify;
 
-import android.content.Context;
+import android.app.settings.SettingsEnums;
 
 import com.android.internal.logging.nano.MetricsProto;
 import com.android.internal.telephony.SmsUsageMonitor;
@@ -51,18 +49,29 @@
     public void logSpecialPermissionChange() {
         mFragment.logSpecialPermissionChange(SmsUsageMonitor.PREMIUM_SMS_PERMISSION_ASK_USER,
                 "app");
-        verify(mFeatureFactory.metricsFeatureProvider).action(nullable(Context.class),
-                eq(MetricsProto.MetricsEvent.APP_SPECIAL_PERMISSION_PREMIUM_SMS_ASK), eq("app"));
+        verify(mFeatureFactory.metricsFeatureProvider).action(
+                SettingsEnums.PAGE_UNKNOWN,
+                MetricsProto.MetricsEvent.APP_SPECIAL_PERMISSION_PREMIUM_SMS_ASK,
+                mFragment.getMetricsCategory(),
+                "app",
+                SmsUsageMonitor.PREMIUM_SMS_PERMISSION_ASK_USER);
 
         mFragment.logSpecialPermissionChange(SmsUsageMonitor.PREMIUM_SMS_PERMISSION_NEVER_ALLOW,
                 "app");
-        verify(mFeatureFactory.metricsFeatureProvider).action(nullable(Context.class),
-                eq(MetricsProto.MetricsEvent.APP_SPECIAL_PERMISSION_PREMIUM_SMS_DENY), eq("app"));
+        verify(mFeatureFactory.metricsFeatureProvider).action(
+                SettingsEnums.PAGE_UNKNOWN,
+                MetricsProto.MetricsEvent.APP_SPECIAL_PERMISSION_PREMIUM_SMS_DENY,
+                mFragment.getMetricsCategory(),
+                "app",
+                SmsUsageMonitor.PREMIUM_SMS_PERMISSION_NEVER_ALLOW);
 
         mFragment.logSpecialPermissionChange(SmsUsageMonitor.PREMIUM_SMS_PERMISSION_ALWAYS_ALLOW,
                 "app");
-        verify(mFeatureFactory.metricsFeatureProvider).action(nullable(Context.class),
-                eq(MetricsProto.MetricsEvent.APP_SPECIAL_PERMISSION_PREMIUM_SMS_ALWAYS_ALLOW),
-                eq("app"));
+        verify(mFeatureFactory.metricsFeatureProvider).action(
+                SettingsEnums.PAGE_UNKNOWN,
+                MetricsProto.MetricsEvent.APP_SPECIAL_PERMISSION_PREMIUM_SMS_ALWAYS_ALLOW,
+                mFragment.getMetricsCategory(),
+                "app",
+                SmsUsageMonitor.PREMIUM_SMS_PERMISSION_ALWAYS_ALLOW);
     }
 }
diff --git a/tests/robotests/src/com/android/settings/applications/specialaccess/vrlistener/VrListenerSettingsTest.java b/tests/robotests/src/com/android/settings/applications/specialaccess/vrlistener/VrListenerSettingsTest.java
index 4f5b2bb..3f0bc1d 100644
--- a/tests/robotests/src/com/android/settings/applications/specialaccess/vrlistener/VrListenerSettingsTest.java
+++ b/tests/robotests/src/com/android/settings/applications/specialaccess/vrlistener/VrListenerSettingsTest.java
@@ -16,11 +16,7 @@
 
 package com.android.settings.applications.specialaccess.vrlistener;
 
-import static org.mockito.ArgumentMatchers.nullable;
-import static org.mockito.Matchers.eq;
-import static org.mockito.Mockito.verify;
-
-import android.content.Context;
+import android.app.settings.SettingsEnums;
 
 import com.android.internal.logging.nano.MetricsProto;
 import com.android.settings.testutils.FakeFeatureFactory;
@@ -47,11 +43,19 @@
     @Test
     public void logSpecialPermissionChange() {
         mFragment.logSpecialPermissionChange(true, "app");
-        verify(mFeatureFactory.metricsFeatureProvider).action(nullable(Context.class),
-                eq(MetricsProto.MetricsEvent.APP_SPECIAL_PERMISSION_VRHELPER_ALLOW), eq("app"));
+        mFeatureFactory.metricsFeatureProvider.action(
+                SettingsEnums.PAGE_UNKNOWN,
+                MetricsProto.MetricsEvent.APP_SPECIAL_PERMISSION_VRHELPER_ALLOW,
+                SettingsEnums.PAGE_UNKNOWN,
+                "app",
+                0);
 
         mFragment.logSpecialPermissionChange(false, "app");
-        verify(mFeatureFactory.metricsFeatureProvider).action(nullable(Context.class),
-                eq(MetricsProto.MetricsEvent.APP_SPECIAL_PERMISSION_VRHELPER_DENY), eq("app"));
+        mFeatureFactory.metricsFeatureProvider.action(
+                SettingsEnums.PAGE_UNKNOWN,
+                MetricsProto.MetricsEvent.APP_SPECIAL_PERMISSION_VRHELPER_DENY,
+                SettingsEnums.PAGE_UNKNOWN,
+                "app",
+                0);
     }
 }
diff --git a/tests/robotests/src/com/android/settings/dashboard/suggestions/SuggestionFeatureProviderImplTest.java b/tests/robotests/src/com/android/settings/dashboard/suggestions/SuggestionFeatureProviderImplTest.java
index f9a7379..3c97f48 100644
--- a/tests/robotests/src/com/android/settings/dashboard/suggestions/SuggestionFeatureProviderImplTest.java
+++ b/tests/robotests/src/com/android/settings/dashboard/suggestions/SuggestionFeatureProviderImplTest.java
@@ -18,10 +18,6 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
-import static org.mockito.Matchers.anyString;
-import static org.mockito.Matchers.eq;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.verifyZeroInteractions;
 import static org.mockito.Mockito.when;
 
 import android.app.ActivityManager;
@@ -31,13 +27,10 @@
 import android.hardware.fingerprint.FingerprintManager;
 import android.service.settings.suggestions.Suggestion;
 
-import com.android.internal.logging.nano.MetricsProto;
 import com.android.settings.testutils.FakeFeatureFactory;
 import com.android.settings.testutils.SettingsRobolectricTestRunner;
 import com.android.settings.testutils.shadow.SettingsShadowResources;
 import com.android.settings.testutils.shadow.ShadowSecureSettings;
-import com.android.settingslib.drawer.CategoryKey;
-import com.android.settingslib.drawer.Tile;
 import com.android.settingslib.suggestions.SuggestionControllerMixinCompat;
 
 import org.junit.After;
@@ -49,9 +42,6 @@
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
 
-import java.util.ArrayList;
-import java.util.List;
-
 @RunWith(SettingsRobolectricTestRunner.class)
 @Config(shadows = ShadowSecureSettings.class)
 public class SuggestionFeatureProviderImplTest {
@@ -111,36 +101,8 @@
     }
 
     @Test
-    public void isSuggestionV2Enabled_isNotLowMemoryDevice_shouldReturnTrue() {
+    public void isSuggestionEnabled_isNotLowMemoryDevice_shouldReturnTrue() {
         when(mActivityManager.isLowRamDevice()).thenReturn(false);
         assertThat(mProvider.isSuggestionEnabled(mContext)).isTrue();
     }
-
-    @Test
-    public void dismissSuggestion_noControllerOrSuggestion_noop() {
-        mProvider.dismissSuggestion(mContext, null, null);
-        mProvider.dismissSuggestion(mContext, mSuggestionControllerMixin, null);
-        mProvider.dismissSuggestion(mContext, null, new Suggestion.Builder("id").build());
-
-        verifyZeroInteractions(mFactory.metricsFeatureProvider);
-        verifyZeroInteractions(mSuggestionControllerMixin);
-    }
-
-    @Test
-    public void dismissSuggestion_noContext_shouldDoNothing() {
-        mProvider.dismissSuggestion(null, mSuggestionControllerMixin, mSuggestion);
-
-        verifyZeroInteractions(mFactory.metricsFeatureProvider);
-    }
-
-    @Test
-    public void dismissSuggestion_shouldLogAndDismiss() {
-        mProvider.dismissSuggestion(mContext, mSuggestionControllerMixin, mSuggestion);
-
-        verify(mFactory.metricsFeatureProvider).action(
-                eq(mContext),
-                eq(MetricsProto.MetricsEvent.ACTION_SETTINGS_DISMISS_SUGGESTION),
-                anyString());
-        verify(mSuggestionControllerMixin).dismissSuggestion(mSuggestion);
-    }
 }
diff --git a/tests/robotests/src/com/android/settings/deviceinfo/BuildNumberPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/deviceinfo/BuildNumberPreferenceControllerTest.java
index c88237d..9bec78d 100644
--- a/tests/robotests/src/com/android/settings/deviceinfo/BuildNumberPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/deviceinfo/BuildNumberPreferenceControllerTest.java
@@ -33,12 +33,12 @@
 import android.provider.Settings;
 import android.text.BidiFormatter;
 
-import androidx.fragment.app.Fragment;
 import androidx.lifecycle.LifecycleOwner;
 import androidx.preference.Preference;
 import androidx.preference.PreferenceScreen;
 
 import com.android.internal.logging.nano.MetricsProto;
+import com.android.settings.core.InstrumentedPreferenceFragment;
 import com.android.settings.testutils.FakeFeatureFactory;
 import com.android.settings.testutils.SettingsRobolectricTestRunner;
 import com.android.settings.testutils.shadow.ShadowUtils;
@@ -64,7 +64,7 @@
     @Mock(answer = Answers.RETURNS_DEEP_STUBS)
     private Activity mActivity;
     @Mock(answer = Answers.RETURNS_DEEP_STUBS)
-    private Fragment mFragment;
+    private InstrumentedPreferenceFragment mFragment;
     @Mock(answer = RETURNS_DEEP_STUBS)
     private PreferenceScreen mScreen;
 
diff --git a/tests/robotests/src/com/android/settings/deviceinfo/aboutphone/TopLevelAboutDevicePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/deviceinfo/aboutphone/TopLevelAboutDevicePreferenceControllerTest.java
index ae3007c..25fbeee 100644
--- a/tests/robotests/src/com/android/settings/deviceinfo/aboutphone/TopLevelAboutDevicePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/deviceinfo/aboutphone/TopLevelAboutDevicePreferenceControllerTest.java
@@ -23,6 +23,7 @@
 
 import android.content.Context;
 import android.os.Build;
+import android.provider.Settings.Global;
 
 import com.android.settings.testutils.SettingsRobolectricTestRunner;
 
@@ -49,7 +50,15 @@
     }
 
     @Test
-    public void getSummary_shouldReturnDeviceModel() {
+    public void getSummary_deviceNameNotSet_shouldReturnDeviceModel() {
         assertThat(mController.getSummary().toString()).isEqualTo(Build.MODEL);
     }
+
+    @Test
+    public void getSummary_deviceNameSet_shouldReturnDeviceName() {
+        Global.putString(mContext.getContentResolver(), Global.DEVICE_NAME, "Test");
+        assertThat(mController.getSummary().toString()).isEqualTo("Test");
+    }
+
+
 }
diff --git a/tests/robotests/src/com/android/settings/display/NightDisplayPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/display/NightDisplayPreferenceControllerTest.java
index 9c4c539..3822f73 100644
--- a/tests/robotests/src/com/android/settings/display/NightDisplayPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/display/NightDisplayPreferenceControllerTest.java
@@ -3,17 +3,14 @@
 import static com.google.common.truth.Truth.assertThat;
 
 import android.app.Application;
-import android.content.ComponentName;
 import android.provider.Settings.Secure;
 
 import com.android.internal.app.ColorDisplayController;
 import com.android.settings.R;
-import com.android.settings.Settings.NightDisplaySuggestionActivity;
 import com.android.settings.testutils.SettingsRobolectricTestRunner;
 import com.android.settings.testutils.shadow.SettingsShadowResources;
 
 import org.junit.After;
-import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.robolectric.RuntimeEnvironment;
@@ -25,16 +22,8 @@
 })
 public class NightDisplayPreferenceControllerTest {
 
-  private NightDisplayPreferenceController mPreferenceController;
-
-  @Before
-  public void setUp() {
-    mPreferenceController = new NightDisplayPreferenceController(RuntimeEnvironment.application);
-  }
-
   @After
   public void tearDown() {
-    mPreferenceController = null;
     SettingsShadowResources.reset();
   }
 
@@ -43,9 +32,7 @@
     final Application context = RuntimeEnvironment.application;
     Secure.putInt(context.getContentResolver(),
         Secure.NIGHT_DISPLAY_AUTO_MODE, ColorDisplayController.AUTO_MODE_DISABLED);
-    final ComponentName componentName =
-        new ComponentName(context, NightDisplaySuggestionActivity.class);
-    assertThat(mPreferenceController.isSuggestionComplete(context)).isFalse();
+    assertThat(NightDisplayPreferenceController.isSuggestionComplete(context)).isFalse();
   }
 
   @Test
@@ -53,9 +40,7 @@
     final Application context = RuntimeEnvironment.application;
     Secure.putInt(context.getContentResolver(),
         Secure.NIGHT_DISPLAY_AUTO_MODE, ColorDisplayController.AUTO_MODE_CUSTOM);
-    final ComponentName componentName =
-        new ComponentName(context, NightDisplaySuggestionActivity.class);
-    assertThat(mPreferenceController.isSuggestionComplete(context)).isTrue();
+    assertThat(NightDisplayPreferenceController.isSuggestionComplete(context)).isTrue();
   }
 
   @Test
@@ -63,9 +48,7 @@
     final Application context = RuntimeEnvironment.application;
     Secure.putInt(context.getContentResolver(),
         Secure.NIGHT_DISPLAY_AUTO_MODE, ColorDisplayController.AUTO_MODE_TWILIGHT);
-    final ComponentName componentName =
-        new ComponentName(context, NightDisplaySuggestionActivity.class);
-    assertThat(mPreferenceController.isSuggestionComplete(context)).isTrue();
+    assertThat(NightDisplayPreferenceController.isSuggestionComplete(context)).isTrue();
   }
 
   @Test
@@ -74,9 +57,6 @@
     Secure.putInt(context.getContentResolver(),
             Secure.NIGHT_DISPLAY_AUTO_MODE, ColorDisplayController.AUTO_MODE_DISABLED);
     SettingsShadowResources.overrideResource(R.bool.config_night_light_suggestion_enabled, false);
-
-    final ComponentName componentName =
-            new ComponentName(context, NightDisplaySuggestionActivity.class);
-    assertThat(mPreferenceController.isSuggestionComplete(context)).isTrue();
+    assertThat(NightDisplayPreferenceController.isSuggestionComplete(context)).isTrue();
   }
 }
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/AnomalyDetectionJobServiceTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/AnomalyDetectionJobServiceTest.java
index 8622e65..11b22dd 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/AnomalyDetectionJobServiceTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/AnomalyDetectionJobServiceTest.java
@@ -43,13 +43,13 @@
 import android.app.job.JobParameters;
 import android.app.job.JobScheduler;
 import android.app.job.JobWorkItem;
+import android.app.settings.SettingsEnums;
 import android.content.Context;
 import android.content.Intent;
 import android.os.Bundle;
 import android.os.Process;
 import android.os.StatsDimensionsValue;
 import android.os.UserManager;
-import android.util.Pair;
 
 import com.android.internal.logging.nano.MetricsProto;
 import com.android.settings.R;
@@ -174,11 +174,11 @@
 
         verify(mBatteryDatabaseManager, never()).insertAnomaly(anyInt(), anyString(), anyInt(),
                 anyInt(), anyLong());
-        verify(mFeatureFactory.metricsFeatureProvider).action(mContext,
+        verify(mFeatureFactory.metricsFeatureProvider).action(SettingsEnums.PAGE_UNKNOWN,
                 MetricsProto.MetricsEvent.ACTION_ANOMALY_IGNORED,
-                SYSTEM_PACKAGE,
-                Pair.create(MetricsProto.MetricsEvent.FIELD_ANOMALY_TYPE, ANOMALY_TYPE),
-                Pair.create(MetricsProto.MetricsEvent.FIELD_APP_VERSION_CODE, VERSION_CODE));
+                SettingsEnums.PAGE_UNKNOWN,
+                SYSTEM_PACKAGE + "/" + VERSION_CODE,
+                 ANOMALY_TYPE);
     }
 
     @Test
@@ -229,11 +229,11 @@
 
         verify(mBatteryDatabaseManager).insertAnomaly(anyInt(), anyString(), eq(6),
                 eq(AnomalyDatabaseHelper.State.AUTO_HANDLED), anyLong());
-        verify(mFeatureFactory.metricsFeatureProvider).action(mContext,
+        verify(mFeatureFactory.metricsFeatureProvider).action(SettingsEnums.PAGE_UNKNOWN,
                 MetricsProto.MetricsEvent.ACTION_ANOMALY_TRIGGERED,
-                SYSTEM_PACKAGE,
-                Pair.create(MetricsProto.MetricsEvent.FIELD_ANOMALY_TYPE, ANOMALY_TYPE),
-                Pair.create(MetricsProto.MetricsEvent.FIELD_APP_VERSION_CODE, VERSION_CODE));
+                SettingsEnums.PAGE_UNKNOWN,
+                SYSTEM_PACKAGE + "/" + VERSION_CODE,
+                ANOMALY_TYPE);
     }
 
     @Test
@@ -254,11 +254,11 @@
 
         verify(mBatteryDatabaseManager).insertAnomaly(anyInt(), anyString(), eq(6),
                 eq(AnomalyDatabaseHelper.State.NEW), anyLong());
-        verify(mFeatureFactory.metricsFeatureProvider).action(mContext,
+        verify(mFeatureFactory.metricsFeatureProvider).action(SettingsEnums.PAGE_UNKNOWN,
                 MetricsProto.MetricsEvent.ACTION_ANOMALY_TRIGGERED,
-                SYSTEM_PACKAGE,
-                Pair.create(MetricsProto.MetricsEvent.FIELD_ANOMALY_TYPE, ANOMALY_TYPE),
-                Pair.create(MetricsProto.MetricsEvent.FIELD_APP_VERSION_CODE, VERSION_CODE));
+                SettingsEnums.PAGE_UNKNOWN,
+                SYSTEM_PACKAGE + "/" + VERSION_CODE,
+                ANOMALY_TYPE);
     }
 
     @Test
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/actions/RestrictAppActionTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/actions/RestrictAppActionTest.java
index 0d6f9c5..86c6714 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/actions/RestrictAppActionTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/actions/RestrictAppActionTest.java
@@ -18,7 +18,7 @@
 import static org.mockito.Mockito.verify;
 
 import android.app.AppOpsManager;
-import android.util.Pair;
+import android.app.settings.SettingsEnums;
 
 import com.android.internal.logging.nano.MetricsProto;
 import com.android.settings.fuelgauge.BatteryUtils;
@@ -91,16 +91,13 @@
                 .setForceAppStandby(UID_1, PACKAGE_NAME_1, AppOpsManager.MODE_IGNORED);
         verify(mBatteryUtils)
                 .setForceAppStandby(UID_2, PACKAGE_NAME_2, AppOpsManager.MODE_IGNORED);
-        verify(mFeatureFactory.metricsFeatureProvider).action(RuntimeEnvironment.application,
-                MetricsProto.MetricsEvent.ACTION_TIP_RESTRICT_APP, PACKAGE_NAME_1, Pair.create(
-                        MetricsProto.MetricsEvent.FIELD_CONTEXT, METRICS_KEY));
-        verify(mFeatureFactory.metricsFeatureProvider).action(RuntimeEnvironment.application,
-                MetricsProto.MetricsEvent.ACTION_TIP_RESTRICT_APP, PACKAGE_NAME_2,
-                Pair.create(MetricsProto.MetricsEvent.FIELD_CONTEXT, METRICS_KEY),
-                Pair.create(MetricsProto.MetricsEvent.FIELD_ANOMALY_TYPE, ANOMALY_WAKEUP));
-        verify(mFeatureFactory.metricsFeatureProvider).action(RuntimeEnvironment.application,
-                MetricsProto.MetricsEvent.ACTION_TIP_RESTRICT_APP, PACKAGE_NAME_2,
-                Pair.create(MetricsProto.MetricsEvent.FIELD_CONTEXT, METRICS_KEY),
-                Pair.create(MetricsProto.MetricsEvent.FIELD_ANOMALY_TYPE, ANOMALY_BT));
+        verify(mFeatureFactory.metricsFeatureProvider).action(SettingsEnums.PAGE_UNKNOWN,
+                MetricsProto.MetricsEvent.ACTION_TIP_RESTRICT_APP, METRICS_KEY, PACKAGE_NAME_1, 0);
+        verify(mFeatureFactory.metricsFeatureProvider).action(SettingsEnums.PAGE_UNKNOWN,
+                MetricsProto.MetricsEvent.ACTION_TIP_RESTRICT_APP, METRICS_KEY, PACKAGE_NAME_2,
+                ANOMALY_WAKEUP);
+        verify(mFeatureFactory.metricsFeatureProvider).action(SettingsEnums.PAGE_UNKNOWN,
+                MetricsProto.MetricsEvent.ACTION_TIP_RESTRICT_APP, METRICS_KEY, PACKAGE_NAME_2,
+                ANOMALY_BT);
     }
 }
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/actions/UnrestrictAppActionTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/actions/UnrestrictAppActionTest.java
index c44ae78..f57284a 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/actions/UnrestrictAppActionTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/actions/UnrestrictAppActionTest.java
@@ -18,7 +18,7 @@
 import static org.mockito.Mockito.verify;
 
 import android.app.AppOpsManager;
-import android.util.Pair;
+import android.app.settings.SettingsEnums;
 
 import com.android.internal.logging.nano.MetricsProto;
 import com.android.settings.fuelgauge.BatteryUtils;
@@ -75,8 +75,11 @@
 
         verify(mBatteryUtils)
                 .setForceAppStandby(UID_1, PACKAGE_NAME_1, AppOpsManager.MODE_ALLOWED);
-        verify(mFeatureFactory.metricsFeatureProvider).action(RuntimeEnvironment.application,
-                MetricsProto.MetricsEvent.ACTION_TIP_UNRESTRICT_APP, PACKAGE_NAME_1, Pair.create(
-                        MetricsProto.MetricsEvent.FIELD_CONTEXT, METRICS_KEY));
+        verify(mFeatureFactory.metricsFeatureProvider).action(
+                SettingsEnums.PAGE_UNKNOWN,
+                MetricsProto.MetricsEvent.ACTION_TIP_UNRESTRICT_APP,
+                METRICS_KEY,
+                PACKAGE_NAME_1,
+                0);
     }
 }
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/tips/RestrictAppTipTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/tips/RestrictAppTipTest.java
index 317e426..d4a10bc 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/tips/RestrictAppTipTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/tips/RestrictAppTipTest.java
@@ -17,7 +17,6 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
-import static org.mockito.Matchers.any;
 import static org.mockito.Matchers.anyInt;
 import static org.mockito.Matchers.anyString;
 import static org.mockito.Mockito.doReturn;
@@ -26,11 +25,11 @@
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.verify;
 
+import android.app.settings.SettingsEnums;
 import android.content.Context;
 import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageManager;
 import android.os.Parcel;
-import android.util.Pair;
 
 import com.android.internal.logging.nano.MetricsProto;
 import com.android.settings.R;
@@ -99,7 +98,8 @@
         mUsageAppList.add(mAppInfo);
         mNewBatteryTip = new RestrictAppTip(BatteryTip.StateType.NEW, mUsageAppList);
         mHandledBatteryTip = new RestrictAppTip(BatteryTip.StateType.HANDLED, mUsageAppList);
-        mInvisibleBatteryTip = new RestrictAppTip(BatteryTip.StateType.INVISIBLE, new ArrayList<>());
+        mInvisibleBatteryTip = new RestrictAppTip(BatteryTip.StateType.INVISIBLE,
+                new ArrayList<>());
     }
 
     @After
@@ -142,7 +142,7 @@
     @Test
     public void getSummary_stateNew_showRestrictSummary() {
         assertThat(mNewBatteryTip.getSummary(mContext))
-            .isEqualTo("app has high background battery usage");
+                .isEqualTo("app has high background battery usage");
     }
 
     @Test
@@ -226,14 +226,16 @@
 
         verify(mMetricsFeatureProvider).action(mContext,
                 MetricsProto.MetricsEvent.ACTION_APP_RESTRICTION_TIP, BatteryTip.StateType.NEW);
-        verify(mMetricsFeatureProvider).action(mContext,
+        verify(mMetricsFeatureProvider).action(SettingsEnums.PAGE_UNKNOWN,
                 MetricsProto.MetricsEvent.ACTION_APP_RESTRICTION_TIP_LIST,
+                SettingsEnums.PAGE_UNKNOWN,
                 PACKAGE_NAME,
-                Pair.create(MetricsProto.MetricsEvent.FIELD_ANOMALY_TYPE, ANOMALY_WAKEUP));
-        verify(mMetricsFeatureProvider).action(mContext,
+                ANOMALY_WAKEUP);
+        verify(mMetricsFeatureProvider).action(SettingsEnums.PAGE_UNKNOWN,
                 MetricsProto.MetricsEvent.ACTION_APP_RESTRICTION_TIP_LIST,
+                SettingsEnums.PAGE_UNKNOWN,
                 PACKAGE_NAME,
-                Pair.create(MetricsProto.MetricsEvent.FIELD_ANOMALY_TYPE, ANOMALY_WAKELOCK));
+                ANOMALY_WAKELOCK);
     }
 
     @Test
@@ -242,7 +244,8 @@
 
         verify(mMetricsFeatureProvider).action(mContext,
                 MetricsProto.MetricsEvent.ACTION_APP_RESTRICTION_TIP, BatteryTip.StateType.HANDLED);
-        verify(mMetricsFeatureProvider, never()).action(any(), anyInt(), anyString(), any());
+        verify(mMetricsFeatureProvider, never()).action(
+                anyInt(), anyInt(), anyInt(), anyString(), anyInt());
 
     }
 }
diff --git a/tests/robotests/src/com/android/settings/homepage/contextualcards/ContextualCardLoaderTest.java b/tests/robotests/src/com/android/settings/homepage/contextualcards/ContextualCardLoaderTest.java
index 598e23f..f9eda49 100644
--- a/tests/robotests/src/com/android/settings/homepage/contextualcards/ContextualCardLoaderTest.java
+++ b/tests/robotests/src/com/android/settings/homepage/contextualcards/ContextualCardLoaderTest.java
@@ -38,7 +38,6 @@
 import org.junit.runner.RunWith;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.shadows.ShadowContentResolver;
-import org.robolectric.shadows.ShadowLog;
 
 import java.util.ArrayList;
 import java.util.Arrays;
diff --git a/tests/robotests/src/com/android/settings/homepage/contextualcards/ContextualCardManagerTest.java b/tests/robotests/src/com/android/settings/homepage/contextualcards/ContextualCardManagerTest.java
new file mode 100644
index 0000000..091a51b
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/homepage/contextualcards/ContextualCardManagerTest.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.homepage.contextualcards;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.Context;
+import android.net.Uri;
+
+import com.android.settings.homepage.contextualcards.conditional.ConditionalContextualCard;
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RuntimeEnvironment;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+public class ContextualCardManagerTest {
+
+    private Context mContext;
+    private ContextualCardManager mManager;
+
+    @Before
+    public void setUp() {
+        mContext = RuntimeEnvironment.application;
+        final ContextualCardsFragment fragment = new ContextualCardsFragment();
+        mManager = new ContextualCardManager(mContext, fragment.getSettingsLifecycle());
+    }
+
+    @Test
+    public void sortCards_hasConditionalAndSliceCards_conditionalShouldAlwaysBeTheLast() {
+        final String sliceUri = "content://com.android.settings.slices/action/flashlight";
+        final List<ContextualCard> cards = new ArrayList<>();
+        cards.add(new ConditionalContextualCard.Builder().build());
+        cards.add(buildContextualCard(sliceUri));
+
+        final List<ContextualCard> sortedCards = mManager.sortCards(cards);
+
+        assertThat(sortedCards.get(cards.size() - 1).getCardType())
+                .isEqualTo(ContextualCard.CardType.CONDITIONAL);
+    }
+
+    private ContextualCard buildContextualCard(String sliceUri) {
+        return new ContextualCard.Builder()
+                .setName("test_name")
+                .setSliceUri(Uri.parse(sliceUri))
+                .build();
+    }
+}
diff --git a/tests/robotests/src/com/android/settings/homepage/contextualcards/ConditionalContextualCardTest.java b/tests/robotests/src/com/android/settings/homepage/contextualcards/conditional/ConditionalContextualCardTest.java
similarity index 74%
rename from tests/robotests/src/com/android/settings/homepage/contextualcards/ConditionalContextualCardTest.java
rename to tests/robotests/src/com/android/settings/homepage/contextualcards/conditional/ConditionalContextualCardTest.java
index 74e88d7..1c74ef3 100644
--- a/tests/robotests/src/com/android/settings/homepage/contextualcards/ConditionalContextualCardTest.java
+++ b/tests/robotests/src/com/android/settings/homepage/contextualcards/conditional/ConditionalContextualCardTest.java
@@ -14,10 +14,14 @@
  * limitations under the License.
  */
 
-package com.android.settings.homepage.contextualcards;
+package com.android.settings.homepage.contextualcards.conditional;
+
+import static com.android.settings.homepage.contextualcards.conditional.ConditionalContextualCard
+        .UNSUPPORTED_RANKING_SCORE;
 
 import static com.google.common.truth.Truth.assertThat;
 
+import com.android.settings.homepage.contextualcards.ContextualCard;
 import com.android.settings.homepage.contextualcards.conditional.ConditionalContextualCard;
 import com.android.settings.testutils.SettingsRobolectricTestRunner;
 
@@ -39,4 +43,10 @@
         assertThat(new ConditionalContextualCard.Builder().build().getCardType())
                 .isEqualTo(ContextualCard.CardType.CONDITIONAL);
     }
+
+    @Test
+    public void getRankingScore_shouldAlwaysBeUnsupportedScore() {
+        assertThat(new ConditionalContextualCard.Builder().build().getRankingScore())
+                .isEqualTo(UNSUPPORTED_RANKING_SCORE);
+    }
 }
diff --git a/tests/robotests/src/com/android/settings/slices/SliceBroadcastReceiverTest.java b/tests/robotests/src/com/android/settings/slices/SliceBroadcastReceiverTest.java
index 4e09632..bd59179 100644
--- a/tests/robotests/src/com/android/settings/slices/SliceBroadcastReceiverTest.java
+++ b/tests/robotests/src/com/android/settings/slices/SliceBroadcastReceiverTest.java
@@ -28,6 +28,7 @@
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
+import android.app.settings.SettingsEnums;
 import android.app.slice.Slice;
 import android.content.ContentResolver;
 import android.content.ContentValues;
@@ -37,7 +38,6 @@
 import android.net.Uri;
 import android.provider.Settings;
 import android.provider.SettingsSlicesContract;
-import android.util.Pair;
 
 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
 import com.android.settings.core.BasePreferenceController;
@@ -54,7 +54,6 @@
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
-import org.mockito.ArgumentCaptor;
 import org.robolectric.RuntimeEnvironment;
 
 @RunWith(SettingsRobolectricTestRunner.class)
@@ -72,8 +71,6 @@
     private SliceBroadcastReceiver mReceiver;
     private SearchFeatureProvider mSearchFeatureProvider;
     private FakeFeatureFactory mFakeFeatureFactory;
-    private ArgumentCaptor<Pair<Integer, Object>> mLoggingNameArgumentCatpor;
-    private ArgumentCaptor<Pair<Integer, Object>> mLoggingValueArgumentCatpor;
 
     @Before
     public void setUp() {
@@ -88,8 +85,6 @@
         CustomSliceManager manager = new CustomSliceManager(mContext);
         when(mFakeFeatureFactory.slicesFeatureProvider.getCustomSliceManager(any()))
                 .thenReturn(manager);
-        mLoggingNameArgumentCatpor = ArgumentCaptor.forClass(Pair.class);
-        mLoggingValueArgumentCatpor = ArgumentCaptor.forClass(Pair.class);
     }
 
     @After
@@ -123,20 +118,12 @@
 
         assertThat(fakeToggleController.isChecked()).isFalse();
         verify(mFakeFeatureFactory.metricsFeatureProvider)
-                .action(eq(mContext),
-                        eq(MetricsEvent.ACTION_SETTINGS_SLICE_CHANGED),
-                        mLoggingNameArgumentCatpor.capture(),
-                        mLoggingValueArgumentCatpor.capture());
-
-        final Pair<Integer, Object> namePair = mLoggingNameArgumentCatpor.getValue();
-        final Pair<Integer, Object> valuePair = mLoggingValueArgumentCatpor.getValue();
-        assertThat(namePair.first).isEqualTo(MetricsEvent.FIELD_SETTINGS_PREFERENCE_CHANGE_NAME);
-        assertThat(namePair.second).isEqualTo(fakeToggleController.getPreferenceKey());
-
+                .action(SettingsEnums.PAGE_UNKNOWN,
+                        MetricsEvent.ACTION_SETTINGS_SLICE_CHANGED,
+                        SettingsEnums.PAGE_UNKNOWN,
+                        fakeToggleController.getPreferenceKey(),
+                        0);
         verify(resolver).notifyChange(uri, null);
-        assertThat(valuePair.first)
-                .isEqualTo(MetricsEvent.FIELD_SETTINGS_PREFERENCE_CHANGE_INT_VALUE);
-        assertThat(valuePair.second).isEqualTo(0);
     }
 
     @Test
@@ -229,20 +216,13 @@
 
         assertThat(fakeSliderController.getSliderPosition()).isEqualTo(position);
         verify(mFakeFeatureFactory.metricsFeatureProvider)
-                .action(eq(mContext),
-                        eq(MetricsEvent.ACTION_SETTINGS_SLICE_CHANGED),
-                        mLoggingNameArgumentCatpor.capture(),
-                        mLoggingValueArgumentCatpor.capture());
-
-        final Pair<Integer, Object> namePair = mLoggingNameArgumentCatpor.getValue();
-        final Pair<Integer, Object> valuePair = mLoggingValueArgumentCatpor.getValue();
-        assertThat(namePair.first).isEqualTo(MetricsEvent.FIELD_SETTINGS_PREFERENCE_CHANGE_NAME);
-        assertThat(namePair.second).isEqualTo(key);
+                .action(SettingsEnums.PAGE_UNKNOWN,
+                        MetricsEvent.ACTION_SETTINGS_SLICE_CHANGED,
+                        SettingsEnums.PAGE_UNKNOWN,
+                        key,
+                        position);
 
         verify(resolver).notifyChange(uri, null);
-        assertThat(valuePair.first)
-                .isEqualTo(MetricsEvent.FIELD_SETTINGS_PREFERENCE_CHANGE_INT_VALUE);
-        assertThat(valuePair.second).isEqualTo(position);
     }
 
     @Test(expected = IllegalArgumentException.class)
diff --git a/tests/robotests/src/com/android/settings/slices/SliceBuilderUtilsTest.java b/tests/robotests/src/com/android/settings/slices/SliceBuilderUtilsTest.java
index 4371278..2e2104b 100644
--- a/tests/robotests/src/com/android/settings/slices/SliceBuilderUtilsTest.java
+++ b/tests/robotests/src/com/android/settings/slices/SliceBuilderUtilsTest.java
@@ -18,11 +18,11 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
-import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.verify;
 
+import android.app.settings.SettingsEnums;
 import android.content.ContentResolver;
 import android.content.Context;
 import android.content.Intent;
@@ -52,7 +52,6 @@
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
-import org.mockito.ArgumentCaptor;
 import org.robolectric.RuntimeEnvironment;
 
 @RunWith(SettingsRobolectricTestRunner.class)
@@ -77,14 +76,11 @@
 
     private Context mContext;
     private FakeFeatureFactory mFeatureFactory;
-    private ArgumentCaptor<Pair<Integer, Object>> mLoggingArgumentCatpor;
 
     @Before
     public void setUp() {
         mContext = RuntimeEnvironment.application;
         mFeatureFactory = FakeFeatureFactory.setupForTest();
-        mLoggingArgumentCatpor = ArgumentCaptor.forClass(Pair.class);
-
         // Set-up specs for SliceMetadata.
         SliceProvider.setSpecs(SliceLiveData.SUPPORTED_SPECS);
     }
@@ -103,14 +99,11 @@
 
         final Slice slice = SliceBuilderUtils.buildSlice(mContext, dummyData);
         verify(mFeatureFactory.metricsFeatureProvider)
-                .action(eq(mContext), eq(MetricsEvent.ACTION_SETTINGS_SLICE_REQUESTED),
-                        mLoggingArgumentCatpor.capture());
-        final Pair<Integer, Object> capturedLoggingPair = mLoggingArgumentCatpor.getValue();
-
-        assertThat(capturedLoggingPair.first)
-                .isEqualTo(MetricsEvent.FIELD_SETTINGS_PREFERENCE_CHANGE_NAME);
-        assertThat(capturedLoggingPair.second)
-                .isEqualTo(dummyData.getKey());
+                .action(SettingsEnums.PAGE_UNKNOWN,
+                        MetricsEvent.ACTION_SETTINGS_SLICE_REQUESTED,
+                        SettingsEnums.PAGE_UNKNOWN,
+                        dummyData.getKey(),
+                        0);
         SliceTester.testSettingsToggleSlice(mContext, slice, dummyData);
     }
 
@@ -120,14 +113,11 @@
 
         final Slice slice = SliceBuilderUtils.buildSlice(mContext, data);
         verify(mFeatureFactory.metricsFeatureProvider)
-                .action(eq(mContext), eq(MetricsEvent.ACTION_SETTINGS_SLICE_REQUESTED),
-                        mLoggingArgumentCatpor.capture());
-        final Pair<Integer, Object> capturedLoggingPair = mLoggingArgumentCatpor.getValue();
-
-        assertThat(capturedLoggingPair.first)
-                .isEqualTo(MetricsEvent.FIELD_SETTINGS_PREFERENCE_CHANGE_NAME);
-        assertThat(capturedLoggingPair.second)
-                .isEqualTo(data.getKey());
+                .action(SettingsEnums.PAGE_UNKNOWN,
+                        MetricsEvent.ACTION_SETTINGS_SLICE_REQUESTED,
+                        SettingsEnums.PAGE_UNKNOWN,
+                        data.getKey(),
+                        0);
         SliceTester.testSettingsSliderSlice(mContext, slice, data);
     }
 
@@ -137,14 +127,11 @@
 
         final Slice slice = SliceBuilderUtils.buildSlice(mContext, dummyData);
         verify(mFeatureFactory.metricsFeatureProvider)
-                .action(eq(mContext), eq(MetricsEvent.ACTION_SETTINGS_SLICE_REQUESTED),
-                        mLoggingArgumentCatpor.capture());
-        final Pair<Integer, Object> capturedLoggingPair = mLoggingArgumentCatpor.getValue();
-
-        assertThat(capturedLoggingPair.first)
-                .isEqualTo(MetricsEvent.FIELD_SETTINGS_PREFERENCE_CHANGE_NAME);
-        assertThat(capturedLoggingPair.second)
-                .isEqualTo(dummyData.getKey());
+                .action(SettingsEnums.PAGE_UNKNOWN,
+                        MetricsEvent.ACTION_SETTINGS_SLICE_REQUESTED,
+                        SettingsEnums.PAGE_UNKNOWN,
+                        dummyData.getKey(),
+                        0);
         SliceTester.testSettingsCopyableSlice(mContext, slice, dummyData);
     }
 
@@ -390,14 +377,12 @@
         final Slice slice = SliceBuilderUtils.buildSlice(mContext, data);
 
         verify(mFeatureFactory.metricsFeatureProvider)
-                .action(eq(mContext), eq(MetricsEvent.ACTION_SETTINGS_SLICE_REQUESTED),
-                        mLoggingArgumentCatpor.capture());
-        final Pair<Integer, Object> capturedLoggingPair = mLoggingArgumentCatpor.getValue();
+                .action(SettingsEnums.PAGE_UNKNOWN,
+                        MetricsEvent.ACTION_SETTINGS_SLICE_REQUESTED,
+                        SettingsEnums.PAGE_UNKNOWN,
+                        data.getKey(),
+                        0);
 
-        assertThat(capturedLoggingPair.first)
-                .isEqualTo(MetricsEvent.FIELD_SETTINGS_PREFERENCE_CHANGE_NAME);
-        assertThat(capturedLoggingPair.second)
-                .isEqualTo(data.getKey());
         SliceTester.testSettingsUnavailableSlice(mContext, slice, data);
     }
 
@@ -412,16 +397,11 @@
         final Slice slice = SliceBuilderUtils.buildSlice(mContext, data);
 
         verify(mFeatureFactory.metricsFeatureProvider)
-                .action(eq(mContext), eq(MetricsEvent.ACTION_SETTINGS_SLICE_REQUESTED),
-                        mLoggingArgumentCatpor.capture());
-
-        final Pair<Integer, Object> capturedLoggingPair = mLoggingArgumentCatpor.getValue();
-
-        assertThat(capturedLoggingPair.first)
-                .isEqualTo(MetricsEvent.FIELD_SETTINGS_PREFERENCE_CHANGE_NAME);
-        assertThat(capturedLoggingPair.second)
-                .isEqualTo(data.getKey());
-        assertThat(slice).isNull();
+                .action(SettingsEnums.PAGE_UNKNOWN,
+                        MetricsEvent.ACTION_SETTINGS_SLICE_REQUESTED,
+                        SettingsEnums.PAGE_UNKNOWN,
+                        data.getKey(),
+                        0);
     }
 
     @Test