Merge "Remove the function that not used in BluetoothCallback"
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index bb43bbf..e2e89bd 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -2452,7 +2452,6 @@
         <activity
             android:name="Settings$ZenAccessSettingsActivity"
             android:label="@string/manage_zen_access_title"
-            android:taskAffinity="com.android.settings"
             android:parentActivityName="Settings">
             <intent-filter android:priority="1">
                 <action android:name="android.settings.NOTIFICATION_POLICY_ACCESS_SETTINGS" />
diff --git a/res/layout/apps_filter_spinner.xml b/res/layout/apps_filter_spinner.xml
index 3faff50..e468a4b 100644
--- a/res/layout/apps_filter_spinner.xml
+++ b/res/layout/apps_filter_spinner.xml
@@ -21,7 +21,6 @@
     android:layout_height="?android:attr/actionBarSize"
     android:background="?android:attr/colorAccent"
     android:gravity="center_vertical"
-    android:paddingEnd="@dimen/switchbar_subsettings_margin_end"
     android:orientation="horizontal">
 
     <Spinner
diff --git a/res/values/bools.xml b/res/values/bools.xml
index 08bb08c..0a928c3 100644
--- a/res/values/bools.xml
+++ b/res/values/bools.xml
@@ -60,6 +60,9 @@
     <!-- Whether toggle_airplane is available or not. -->
     <bool name="config_show_toggle_airplane">true</bool>
 
+    <!-- Whether private_dns_settings is available or not. -->
+    <bool name="config_show_private_dns_settings">true</bool>
+
     <!-- Whether memory from app_info_settings is available or not. -->
     <bool name="config_show_app_info_settings_memory">false</bool>
 
diff --git a/res/xml/zen_mode_settings.xml b/res/xml/zen_mode_settings.xml
index 240c4c5..b8af650 100644
--- a/res/xml/zen_mode_settings.xml
+++ b/res/xml/zen_mode_settings.xml
@@ -56,9 +56,10 @@
         android:key="zen_mode_settings_category_schedule"
         android:title="@string/zen_category_schedule">
         <!-- DND duration settings -->
-        <Preference
+        <com.android.settings.notification.ZenDurationDialogPreference
             android:key="zen_mode_duration_settings"
-            android:title="@string/zen_mode_duration_settings_title" />
+            android:title="@string/zen_mode_duration_settings_title"
+            android:widgetLayout="@null"/>
 
         <!-- Automatic rules -->
         <Preference
diff --git a/src/com/android/settings/SettingsActivity.java b/src/com/android/settings/SettingsActivity.java
index f95a303..d268eb6 100644
--- a/src/com/android/settings/SettingsActivity.java
+++ b/src/com/android/settings/SettingsActivity.java
@@ -42,6 +42,16 @@
 import android.widget.Button;
 import android.widget.Toolbar;
 
+import androidx.annotation.Nullable;
+import androidx.annotation.VisibleForTesting;
+import androidx.fragment.app.Fragment;
+import androidx.fragment.app.FragmentManager;
+import androidx.fragment.app.FragmentTransaction;
+import androidx.localbroadcastmanager.content.LocalBroadcastManager;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceFragmentCompat;
+import androidx.preference.PreferenceManager;
+
 import com.android.internal.util.ArrayUtils;
 import com.android.settings.Settings.WifiSettingsActivity;
 import com.android.settings.applications.manageapplications.ManageApplications;
@@ -65,16 +75,6 @@
 import java.util.ArrayList;
 import java.util.List;
 
-import androidx.annotation.Nullable;
-import androidx.annotation.VisibleForTesting;
-import androidx.fragment.app.Fragment;
-import androidx.fragment.app.FragmentManager;
-import androidx.fragment.app.FragmentTransaction;
-import androidx.localbroadcastmanager.content.LocalBroadcastManager;
-import androidx.preference.Preference;
-import androidx.preference.PreferenceFragmentCompat;
-import androidx.preference.PreferenceManager;
-
 
 public class SettingsActivity extends SettingsBaseActivity
         implements PreferenceManager.OnPreferenceTreeClickListener,
@@ -723,7 +723,8 @@
                 for (DashboardCategory category : categories) {
                     final int tileCount = category.getTilesCount();
                     for (int i = 0; i < tileCount; i++) {
-                        final ComponentName component = category.getTile(i).intent.getComponent();
+                        final ComponentName component = category.getTile(i)
+                                .getIntent().getComponent();
                         final String name = component.getClassName();
                         final boolean isEnabledForRestricted = ArrayUtils.contains(
                                 SettingsGateway.SETTINGS_FOR_RESTRICTED, name);
diff --git a/src/com/android/settings/accounts/AccountDetailDashboardFragment.java b/src/com/android/settings/accounts/AccountDetailDashboardFragment.java
index 709066a..f98aee1 100644
--- a/src/com/android/settings/accounts/AccountDetailDashboardFragment.java
+++ b/src/com/android/settings/accounts/AccountDetailDashboardFragment.java
@@ -22,6 +22,9 @@
 import android.os.UserHandle;
 import android.os.UserManager;
 
+import androidx.annotation.VisibleForTesting;
+import androidx.preference.PreferenceScreen;
+
 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
 import com.android.settings.R;
 import com.android.settings.Utils;
@@ -33,9 +36,6 @@
 import java.util.ArrayList;
 import java.util.List;
 
-import androidx.annotation.VisibleForTesting;
-import androidx.preference.PreferenceScreen;
-
 public class AccountDetailDashboardFragment extends DashboardFragment {
 
     private static final String TAG = "AccountDetailDashboard";
@@ -126,13 +126,13 @@
         if (mAccountType == null) {
             return false;
         }
-        final Bundle metadata = tile.metaData;
+        final Bundle metadata = tile.getMetaData();
         if (metadata == null) {
             return false;
         }
         final boolean display = mAccountType.equals(metadata.getString(METADATA_IA_ACCOUNT));
-        if (display && tile.intent != null) {
-            tile.intent.putExtra(EXTRA_ACCOUNT_NAME, mAccount.name);
+        if (display) {
+            tile.getIntent().putExtra(EXTRA_ACCOUNT_NAME, mAccount.name);
         }
         return display;
     }
diff --git a/src/com/android/settings/bluetooth/BluetoothPermissionActivity.java b/src/com/android/settings/bluetooth/BluetoothPermissionActivity.java
index 4467362..74a5f24 100644
--- a/src/com/android/settings/bluetooth/BluetoothPermissionActivity.java
+++ b/src/com/android/settings/bluetooth/BluetoothPermissionActivity.java
@@ -208,7 +208,6 @@
             CachedBluetoothDevice cachedDevice = cachedDeviceManager.findDevice(mDevice);
             if (cachedDevice == null) {
                 cachedDevice = cachedDeviceManager.addDevice(bluetoothManager.getBluetoothAdapter(),
-                                                             bluetoothManager.getProfileManager(),
                                                              mDevice);
             }
             always = cachedDevice.checkAndIncreaseMessageRejectionCount();
diff --git a/src/com/android/settings/bluetooth/BluetoothPermissionRequest.java b/src/com/android/settings/bluetooth/BluetoothPermissionRequest.java
index 85c5e45..bbf3fff 100644
--- a/src/com/android/settings/bluetooth/BluetoothPermissionRequest.java
+++ b/src/com/android/settings/bluetooth/BluetoothPermissionRequest.java
@@ -232,7 +232,7 @@
         CachedBluetoothDevice cachedDevice = cachedDeviceManager.findDevice(mDevice);
         if (cachedDevice == null) {
             cachedDevice = cachedDeviceManager.addDevice(bluetoothManager.getBluetoothAdapter(),
-                bluetoothManager.getProfileManager(), mDevice);
+                mDevice);
         }
 
         String intentName = BluetoothDevice.ACTION_CONNECTION_ACCESS_REPLY;
diff --git a/src/com/android/settings/dashboard/CategoryManager.java b/src/com/android/settings/dashboard/CategoryManager.java
index 2d830de..21324b2 100644
--- a/src/com/android/settings/dashboard/CategoryManager.java
+++ b/src/com/android/settings/dashboard/CategoryManager.java
@@ -98,7 +98,7 @@
             DashboardCategory category = mCategories.get(i);
             for (int j = 0; j < category.getTilesCount(); j++) {
                 Tile tile = category.getTile(j);
-                if (tileBlacklist.contains(tile.intent.getComponent())) {
+                if (tileBlacklist.contains(tile.getIntent().getComponent())) {
                     category.removeTile(j--);
                 }
             }
@@ -153,7 +153,7 @@
             boolean useNewKey = false;
             boolean useOldKey = false;
             for (Tile tile : tiles) {
-                if (CategoryKey.KEY_COMPAT_MAP.containsKey(tile.category)) {
+                if (CategoryKey.KEY_COMPAT_MAP.containsKey(tile.getCategory())) {
                     useOldKey = true;
                 } else {
                     useNewKey = true;
@@ -163,12 +163,13 @@
             // Uses only old key, map them to new keys one by one.
             if (useOldKey && !useNewKey) {
                 for (Tile tile : tiles) {
-                    final String newCategoryKey = CategoryKey.KEY_COMPAT_MAP.get(tile.category);
-                    tile.category = newCategoryKey;
+                    final String newCategoryKey =
+                            CategoryKey.KEY_COMPAT_MAP.get(tile.getCategory());
+                    tile.setCategory(newCategoryKey);
                     // move tile to new category.
                     DashboardCategory newCategory = categoryByKeyMap.get(newCategoryKey);
                     if (newCategory == null) {
-                        newCategory = new DashboardCategory();
+                        newCategory = new DashboardCategory(newCategoryKey);
                         categoryByKeyMap.put(newCategoryKey, newCategory);
                     }
                     newCategory.addTile(tile);
@@ -204,10 +205,7 @@
             final Set<ComponentName> components = new ArraySet<>();
             for (int i = count - 1; i >= 0; i--) {
                 final Tile tile = category.getTile(i);
-                if (tile.intent == null) {
-                    continue;
-                }
-                final ComponentName tileComponent = tile.intent.getComponent();
+                final ComponentName tileComponent = tile.getIntent().getComponent();
                 if (components.contains(tileComponent)) {
                     category.removeTile(i);
                 } else {
diff --git a/src/com/android/settings/dashboard/DashboardAdapter.java b/src/com/android/settings/dashboard/DashboardAdapter.java
index d256a5d..d3afd3f 100644
--- a/src/com/android/settings/dashboard/DashboardAdapter.java
+++ b/src/com/android/settings/dashboard/DashboardAdapter.java
@@ -64,7 +64,7 @@
 
     @VisibleForTesting
     static final String STATE_CONDITION_EXPANDED = "condition_expanded";
-
+    static final String META_DATA_PREFERENCE_ICON_BACKGROUND_ARGB = "com.android.settings.bg.argb";
     private final IconCache mCache;
     private final Context mContext;
     private final MetricsFeatureProvider mMetricsFeatureProvider;
@@ -320,19 +320,30 @@
         if (!TextUtils.equals(tileIcon.getResPackage(), mContext.getPackageName())
                 && !(icon instanceof RoundedHomepageIcon)) {
             icon = new RoundedHomepageIcon(mContext, icon);
+            final Bundle metaData = tile.getMetaData();
             try {
-                if (tile.metaData != null) {
-                    final int colorRes = tile.metaData.getInt(
-                            TileUtils.META_DATA_PREFERENCE_ICON_BACKGROUND_HINT, 0 /* default */);
-                    if (colorRes != 0) {
-                        final int bgColor = mContext.getPackageManager()
-                                .getResourcesForApplication(tileIcon.getResPackage())
-                                .getColor(colorRes, null /* theme */);
+                if (metaData != null) {
+                    // Load from bg.argb first
+                    int bgColor = metaData.getInt(META_DATA_PREFERENCE_ICON_BACKGROUND_ARGB,
+                            0 /* default */);
+                    // Not found, load from bg.hint
+                    if (bgColor == 0) {
+                        final int colorRes = metaData.getInt(
+                                TileUtils.META_DATA_PREFERENCE_ICON_BACKGROUND_HINT,
+                                0 /* default */);
+                        if (colorRes != 0) {
+                            bgColor = mContext.getPackageManager()
+                                    .getResourcesForApplication(tileIcon.getResPackage())
+                                    .getColor(colorRes, null /* theme */);
+                        }
+                    }
+                    // If found anything, use it.
+                    if (bgColor != 0) {
                         ((RoundedHomepageIcon) icon).setBackgroundColor(bgColor);
                     }
                 }
             } catch (PackageManager.NameNotFoundException e) {
-                Log.e(TAG, "Failed to set background color for " + tile.intent.getPackage());
+                Log.e(TAG, "Failed to set background color for " + tile.getPackageName());
             }
             mCache.updateIcon(tileIcon, icon);
         }
diff --git a/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java b/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java
index 1bef415..49c7bbb 100644
--- a/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java
+++ b/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java
@@ -117,14 +117,14 @@
 
     @Override
     public String getDashboardKeyForTile(Tile tile) {
-        if (tile == null || tile.intent == null) {
+        if (tile == null) {
             return null;
         }
         if (!TextUtils.isEmpty(tile.key)) {
             return tile.key;
         }
         final StringBuilder sb = new StringBuilder(DASHBOARD_TILE_PREF_KEY_PREFIX);
-        final ComponentName component = tile.intent.getComponent();
+        final ComponentName component = tile.getIntent().getComponent();
         sb.append(component.getClassName());
         return sb.toString();
     }
@@ -143,7 +143,7 @@
         }
         bindSummary(pref, tile);
         bindIcon(pref, tile);
-        final Bundle metadata = tile.metaData;
+        final Bundle metadata = tile.getMetaData();
         String clsName = null;
         String action = null;
         Integer order = null;
@@ -157,8 +157,8 @@
         }
         if (!TextUtils.isEmpty(clsName)) {
             pref.setFragment(clsName);
-        } else if (tile.intent != null) {
-            final Intent intent = new Intent(tile.intent);
+        } else {
+            final Intent intent = new Intent(tile.getIntent());
             intent.putExtra(VisibilityLoggerMixin.EXTRA_SOURCE_METRICS_CATEGORY,
                     sourceMetricsCategory);
             if (action != null) {
@@ -178,11 +178,8 @@
             order = -tile.priority;
         }
         if (order != null) {
-            boolean shouldSkipBaseOrderOffset = false;
-            if (tile.intent != null) {
-                shouldSkipBaseOrderOffset = TextUtils.equals(
-                        skipOffsetPackageName, tile.intent.getComponent().getPackageName());
-            }
+            boolean shouldSkipBaseOrderOffset = TextUtils.equals(
+                    skipOffsetPackageName, tile.getIntent().getComponent().getPackageName());
             if (shouldSkipBaseOrderOffset || baseOrder == Preference.DEFAULT_ORDER) {
                 pref.setOrder(order);
             } else {
@@ -204,11 +201,7 @@
             mContext.startActivity(intent);
             return;
         }
-
-        if (tile.intent == null) {
-            return;
-        }
-        final Intent intent = new Intent(tile.intent)
+        final Intent intent = new Intent(tile.getIntent())
                 .putExtra(VisibilityLoggerMixin.EXTRA_SOURCE_METRICS_CATEGORY,
                         MetricsEvent.DASHBOARD_SUMMARY)
                 .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
@@ -218,15 +211,15 @@
     private void bindSummary(Preference preference, Tile tile) {
         if (tile.summary != null) {
             preference.setSummary(tile.summary);
-        } else if (tile.metaData != null
-                && tile.metaData.containsKey(META_DATA_PREFERENCE_SUMMARY_URI)) {
+        } else if (tile.getMetaData() != null
+                && tile.getMetaData().containsKey(META_DATA_PREFERENCE_SUMMARY_URI)) {
             // Set a placeholder summary before  starting to fetch real summary, this is necessary
             // to avoid preference height change.
             preference.setSummary(R.string.summary_placeholder);
 
             ThreadUtils.postOnBackgroundThread(() -> {
                 final Map<String, IContentProvider> providerMap = new ArrayMap<>();
-                final String uri = tile.metaData.getString(META_DATA_PREFERENCE_SUMMARY_URI);
+                final String uri = tile.getMetaData().getString(META_DATA_PREFERENCE_SUMMARY_URI);
                 final String summary = TileUtils.getTextFromUri(
                         mContext, uri, providerMap, META_DATA_PREFERENCE_SUMMARY);
                 ThreadUtils.postOnMainThread(() -> preference.setSummary(summary));
@@ -241,20 +234,18 @@
         final Icon tileIcon = tile.getIcon(mContext);
         if (tileIcon != null) {
             preference.setIcon(tileIcon.loadDrawable(preference.getContext()));
-        } else if (tile.metaData != null
-                && tile.metaData.containsKey(META_DATA_PREFERENCE_ICON_URI)) {
+        } else if (tile.getMetaData() != null
+                && tile.getMetaData().containsKey(META_DATA_PREFERENCE_ICON_URI)) {
             ThreadUtils.postOnBackgroundThread(() -> {
+                final Intent intent = tile.getIntent();
                 String packageName = null;
-                if (tile.intent != null) {
-                    Intent intent = tile.intent;
-                    if (!TextUtils.isEmpty(intent.getPackage())) {
-                        packageName = intent.getPackage();
-                    } else if (intent.getComponent() != null) {
-                        packageName = intent.getComponent().getPackageName();
-                    }
+                if (!TextUtils.isEmpty(intent.getPackage())) {
+                    packageName = intent.getPackage();
+                } else if (intent.getComponent() != null) {
+                    packageName = intent.getComponent().getPackageName();
                 }
                 final Map<String, IContentProvider> providerMap = new ArrayMap<>();
-                final String uri = tile.metaData.getString(META_DATA_PREFERENCE_ICON_URI);
+                final String uri = tile.getMetaData().getString(META_DATA_PREFERENCE_ICON_URI);
                 final Pair<String, Integer> iconInfo = TileUtils.getIconFromUri(
                         mContext, packageName, uri, providerMap);
                 if (iconInfo == null) {
diff --git a/src/com/android/settings/dashboard/DashboardFragment.java b/src/com/android/settings/dashboard/DashboardFragment.java
index b24164f..acf885d 100644
--- a/src/com/android/settings/dashboard/DashboardFragment.java
+++ b/src/com/android/settings/dashboard/DashboardFragment.java
@@ -18,6 +18,7 @@
 import android.app.Activity;
 import android.content.Context;
 import android.content.res.TypedArray;
+import android.graphics.drawable.Icon;
 import android.os.Bundle;
 import android.text.TextUtils;
 import android.util.ArrayMap;
@@ -40,7 +41,6 @@
 import com.android.settingslib.core.lifecycle.LifecycleObserver;
 import com.android.settingslib.drawer.DashboardCategory;
 import com.android.settingslib.drawer.Tile;
-import com.android.settingslib.drawer.TileUtils;
 
 import java.util.ArrayList;
 import java.util.Collection;
@@ -254,24 +254,6 @@
         return true;
     }
 
-    @VisibleForTesting
-    boolean tintTileIcon(Tile tile) {
-        final Context context = getContext();
-        if (tile.getIcon(context) == null) {
-            return false;
-        }
-        // First check if the tile has set the icon tintable metadata.
-        final Bundle metadata = tile.metaData;
-        if (metadata != null
-                && metadata.containsKey(TileUtils.META_DATA_PREFERENCE_ICON_TINTABLE)) {
-            return metadata.getBoolean(TileUtils.META_DATA_PREFERENCE_ICON_TINTABLE);
-        }
-        final String pkgName = context.getPackageName();
-        // If this drawable is coming from outside Settings, tint it to match the color.
-        return pkgName != null && tile.intent != null
-                && !pkgName.equals(tile.intent.getComponent().getPackageName());
-    }
-
     /**
      * Displays resource based tiles.
      */
@@ -370,8 +352,11 @@
             if (!displayTile(tile)) {
                 continue;
             }
-            if (tintTileIcon(tile)) {
-                tile.getIcon(context).setTint(tintColor);
+            if (tile.isIconTintable(context)) {
+                final Icon icon = tile.getIcon(context);
+                if (icon != null) {
+                    icon.setTint(tintColor);
+                }
             }
             if (mDashboardTilePrefKeys.contains(key)) {
                 // Have the key already, will rebind.
diff --git a/src/com/android/settings/dashboard/SummaryLoader.java b/src/com/android/settings/dashboard/SummaryLoader.java
index ffd6246..199331d 100644
--- a/src/com/android/settings/dashboard/SummaryLoader.java
+++ b/src/com/android/settings/dashboard/SummaryLoader.java
@@ -18,6 +18,7 @@
 import android.app.Activity;
 import android.content.BroadcastReceiver;
 import android.content.ComponentName;
+import android.content.Intent;
 import android.content.IntentFilter;
 import android.os.Bundle;
 import android.os.Handler;
@@ -30,6 +31,8 @@
 import android.util.ArraySet;
 import android.util.Log;
 
+import androidx.annotation.VisibleForTesting;
+
 import com.android.settings.SettingsActivity;
 import com.android.settings.overlay.FeatureFactory;
 import com.android.settingslib.drawer.DashboardCategory;
@@ -39,8 +42,6 @@
 import java.lang.reflect.Field;
 import java.util.List;
 
-import androidx.annotation.VisibleForTesting;
-
 public class SummaryLoader {
     private static final boolean DEBUG = DashboardSummary.DEBUG;
     private static final String TAG = "SummaryLoader";
@@ -155,19 +156,20 @@
     }
 
     private SummaryProvider getSummaryProvider(Tile tile) {
-        if (!mActivity.getPackageName().equals(tile.intent.getComponent().getPackageName())) {
+        if (!mActivity.getPackageName().equals(tile.getPackageName())) {
             // Not within Settings, can't load Summary directly.
             // TODO: Load summary indirectly.
             return null;
         }
-        Bundle metaData = getMetaData(tile);
+        final Bundle metaData = tile.getMetaData();
+        final Intent intent = tile.getIntent();
         if (metaData == null) {
-            if (DEBUG) Log.d(TAG, "No metadata specified for " + tile.intent.getComponent());
+            Log.d(TAG, "No metadata specified for " + intent.getComponent());
             return null;
         }
-        String clsName = metaData.getString(SettingsActivity.META_DATA_KEY_FRAGMENT_CLASS);
+        final String clsName = metaData.getString(SettingsActivity.META_DATA_KEY_FRAGMENT_CLASS);
         if (clsName == null) {
-            if (DEBUG) Log.d(TAG, "No fragment specified for " + tile.intent.getComponent());
+            Log.d(TAG, "No fragment specified for " + intent.getComponent());
             return null;
         }
         try {
@@ -187,25 +189,18 @@
         return null;
     }
 
-    private Bundle getMetaData(Tile tile) {
-        return tile.metaData;
-    }
-
     /**
      * Registers a receiver and automatically unregisters it when the activity is stopping.
      * This ensures that the receivers are unregistered immediately, since most summary loader
      * operations are asynchronous.
      */
     public void registerReceiver(final BroadcastReceiver receiver, final IntentFilter filter) {
-        mActivity.runOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                if (!mListening) {
-                    return;
-                }
-                mReceivers.add(receiver);
-                mActivity.registerReceiver(receiver, filter);
+        mActivity.runOnUiThread(() -> {
+            if (!mListening) {
+                return;
             }
+            mReceivers.add(receiver);
+            mActivity.registerReceiver(receiver, filter);
         });
     }
 
@@ -246,7 +241,7 @@
         SummaryProvider provider = getSummaryProvider(tile);
         if (provider != null) {
             if (DEBUG) Log.d(TAG, "Creating " + tile);
-            mSummaryProviderMap.put(provider, tile.intent.getComponent());
+            mSummaryProviderMap.put(provider, tile.getIntent().getComponent());
         }
     }
 
@@ -258,7 +253,7 @@
         final int tileCount = tiles.size();
         for (int j = 0; j < tileCount; j++) {
             final Tile tile = tiles.get(j);
-            if (component.equals(tile.intent.getComponent())) {
+            if (component.equals(tile.getIntent().getComponent())) {
                 return tile;
             }
         }
diff --git a/src/com/android/settings/dashboard/profileselector/ProfileSelectDialog.java b/src/com/android/settings/dashboard/profileselector/ProfileSelectDialog.java
index e56c58b..b49f401 100644
--- a/src/com/android/settings/dashboard/profileselector/ProfileSelectDialog.java
+++ b/src/com/android/settings/dashboard/profileselector/ProfileSelectDialog.java
@@ -71,8 +71,9 @@
     public void onClick(DialogInterface dialog, int which) {
         UserHandle user = mSelectedTile.userHandle.get(which);
         // Show menu on top level items.
-        mSelectedTile.intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
-        getActivity().startActivityAsUser(mSelectedTile.intent, user);
+        final Intent intent = mSelectedTile.getIntent();
+        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
+        getActivity().startActivityAsUser(intent, user);
     }
 
     public static void updateUserHandlesIfNeeded(Context context, Tile tile) {
diff --git a/src/com/android/settings/datausage/DataUsageList.java b/src/com/android/settings/datausage/DataUsageList.java
index d912462..0c9c7f9 100644
--- a/src/com/android/settings/datausage/DataUsageList.java
+++ b/src/com/android/settings/datausage/DataUsageList.java
@@ -48,6 +48,7 @@
 import android.view.View;
 import android.widget.AdapterView;
 import android.widget.AdapterView.OnItemSelectedListener;
+import android.widget.ImageView;
 import android.widget.Spinner;
 
 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
@@ -293,6 +294,7 @@
         if (isNetworkPolicyModifiable(policy, mSubId) && isMobileDataAvailable(mSubId)) {
             mChart.setNetworkPolicy(policy);
             configureButton.setVisibility(View.VISIBLE);
+            ((ImageView) configureButton).setColorFilter(android.R.color.white);
         } else {
             // controls are disabled; don't bind warning/limit sweeps
             mChart.setNetworkPolicy(null);
diff --git a/src/com/android/settings/network/PrivateDnsPreferenceController.java b/src/com/android/settings/network/PrivateDnsPreferenceController.java
index ce3a9c0..1c62f81 100644
--- a/src/com/android/settings/network/PrivateDnsPreferenceController.java
+++ b/src/com/android/settings/network/PrivateDnsPreferenceController.java
@@ -80,7 +80,9 @@
 
     @Override
     public int getAvailabilityStatus() {
-        return AVAILABLE;
+        return mContext.getResources().getBoolean(R.bool.config_show_private_dns_settings)
+                ? AVAILABLE
+                : UNSUPPORTED_ON_DEVICE;
     }
 
     @Override
diff --git a/src/com/android/settings/notification/ZenDurationDialogPreference.java b/src/com/android/settings/notification/ZenDurationDialogPreference.java
new file mode 100644
index 0000000..a161d6e
--- /dev/null
+++ b/src/com/android/settings/notification/ZenDurationDialogPreference.java
@@ -0,0 +1,52 @@
+/*
+ * 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.notification;
+
+import android.content.Context;
+import android.content.DialogInterface;
+import android.util.AttributeSet;
+
+import com.android.settingslib.CustomDialogPreferenceCompat;
+import com.android.settingslib.notification.ZenDurationDialog;
+
+import androidx.appcompat.app.AlertDialog;
+
+public class ZenDurationDialogPreference extends CustomDialogPreferenceCompat {
+
+    public ZenDurationDialogPreference(Context context, AttributeSet attrs, int defStyleAttr,
+            int defStyleRes) {
+        super(context, attrs, defStyleAttr, defStyleRes);
+    }
+
+    public ZenDurationDialogPreference(Context context, AttributeSet attrs, int defStyleAttr) {
+        super(context, attrs, defStyleAttr);
+    }
+
+    public ZenDurationDialogPreference(Context context, AttributeSet attrs) {
+        super(context, attrs);
+    }
+
+
+    @Override
+    protected void onPrepareDialogBuilder(AlertDialog.Builder builder,
+            DialogInterface.OnClickListener listener) {
+        super.onPrepareDialogBuilder(builder, listener);
+
+        ZenDurationDialog zenDialog = new ZenDurationDialog(getContext());
+        zenDialog.setupDialog(builder);
+    }
+}
diff --git a/src/com/android/settings/notification/ZenModeDurationPreferenceController.java b/src/com/android/settings/notification/ZenModeDurationPreferenceController.java
index 0f884dd..3972bb1 100644
--- a/src/com/android/settings/notification/ZenModeDurationPreferenceController.java
+++ b/src/com/android/settings/notification/ZenModeDurationPreferenceController.java
@@ -22,21 +22,13 @@
 import com.android.settings.core.PreferenceControllerMixin;
 import com.android.settingslib.core.lifecycle.Lifecycle;
 
-import androidx.fragment.app.FragmentManager;
-import androidx.preference.Preference;
-import androidx.preference.PreferenceScreen;
-
 public class ZenModeDurationPreferenceController extends AbstractZenModePreferenceController
-        implements PreferenceControllerMixin, Preference.OnPreferenceClickListener {
+        implements PreferenceControllerMixin {
 
-    private static final String TAG = "ZenModeDurationDialog";
     protected static final String KEY = "zen_mode_duration_settings";
-    private FragmentManager mFragment;
 
-    public ZenModeDurationPreferenceController(Context context, Lifecycle lifecycle, FragmentManager
-            fragment) {
+    public ZenModeDurationPreferenceController(Context context, Lifecycle lifecycle) {
         super(context, KEY, lifecycle);
-        mFragment = fragment;
     }
 
     @Override
@@ -50,16 +42,8 @@
     }
 
     @Override
-    public void displayPreference(PreferenceScreen screen) {
-        super.displayPreference(screen);
-        screen.findPreference(KEY).setOnPreferenceClickListener(this);
-    }
-
-    @Override
-    public void updateState(Preference preference) {
-        super.updateState(preference);
-
-        String summary = "";
+    public CharSequence getSummary() {
+        String summary;
         int zenDuration = getZenDuration();
         if (zenDuration < 0) {
             summary = mContext.getString(R.string.zen_mode_duration_summary_always_prompt);
@@ -76,12 +60,6 @@
             }
         }
 
-        preference.setSummary(summary);
+        return summary;
     }
-
-    @Override
-    public boolean onPreferenceClick(Preference preference) {
-        new SettingsZenDurationDialog().show(mFragment, TAG);
-        return true;
-    }
-}
\ No newline at end of file
+}
diff --git a/src/com/android/settings/notification/ZenModeSettings.java b/src/com/android/settings/notification/ZenModeSettings.java
index ce8fe4d..f2ebd2b 100644
--- a/src/com/android/settings/notification/ZenModeSettings.java
+++ b/src/com/android/settings/notification/ZenModeSettings.java
@@ -86,8 +86,7 @@
         controllers.add(new ZenModeBehaviorSoundPreferenceController(context, lifecycle));
         controllers.add(new ZenModeBehaviorCallsPreferenceController(context, lifecycle));
         controllers.add(new ZenModeBlockedEffectsPreferenceController(context, lifecycle));
-        controllers.add(new ZenModeDurationPreferenceController(context, lifecycle,
-                fragmentManager));
+        controllers.add(new ZenModeDurationPreferenceController(context, lifecycle));
         controllers.add(new ZenModeAutomationPreferenceController(context));
         controllers.add(new ZenModeButtonPreferenceController(context, lifecycle, fragmentManager));
         controllers.add(new ZenModeSettingsFooterPreferenceController(context, lifecycle));
diff --git a/src/com/android/settings/search/SettingsSearchIndexablesProvider.java b/src/com/android/settings/search/SettingsSearchIndexablesProvider.java
index 97f7240..26d15f5 100644
--- a/src/com/android/settings/search/SettingsSearchIndexablesProvider.java
+++ b/src/com/android/settings/search/SettingsSearchIndexablesProvider.java
@@ -167,8 +167,8 @@
             // Build parent-child class pairs for all children listed under this key.
             for (Tile tile : category.getTiles()) {
                 String childClass = null;
-                if (tile.metaData != null) {
-                    childClass = tile.metaData.getString(
+                if (tile.getMetaData() != null) {
+                    childClass = tile.getMetaData().getString(
                             SettingsActivity.META_DATA_KEY_FRAGMENT_CLASS);
                 }
                 if (childClass == null) {
diff --git a/src/com/android/settings/users/EditUserInfoController.java b/src/com/android/settings/users/EditUserInfoController.java
index 6045516..2035f66 100644
--- a/src/com/android/settings/users/EditUserInfoController.java
+++ b/src/com/android/settings/users/EditUserInfoController.java
@@ -41,6 +41,7 @@
 import java.io.File;
 
 import androidx.appcompat.app.AlertDialog;
+import androidx.annotation.VisibleForTesting;
 import androidx.fragment.app.Fragment;
 
 /**
@@ -103,9 +104,8 @@
     public void onActivityResult(int requestCode, int resultCode, Intent data) {
         mWaitingForActivityResult = false;
 
-        if (mEditUserInfoDialog != null && mEditUserInfoDialog.isShowing()
-                && mEditUserPhotoController.onActivityResult(requestCode, resultCode, data)) {
-            return;
+        if (mEditUserInfoDialog != null) {
+            mEditUserPhotoController.onActivityResult(requestCode, resultCode, data);
         }
     }
 
@@ -115,7 +115,7 @@
         Activity activity = fragment.getActivity();
         mUser = user;
         if (mUserManager == null) {
-            mUserManager = UserManager.get(activity);
+            mUserManager = activity.getSystemService(UserManager.class);
         }
         LayoutInflater inflater = activity.getLayoutInflater();
         View content = inflater.inflate(R.layout.edit_user_info_dialog_content, null);
@@ -136,8 +136,7 @@
             }
         }
         userPhotoView.setImageDrawable(drawable);
-        mEditUserPhotoController = new EditUserPhotoController(fragment, userPhotoView,
-                mSavedPhoto, drawable, mWaitingForActivityResult);
+        mEditUserPhotoController = createEditUserPhotoController(fragment, userPhotoView, drawable);
         mEditUserInfoDialog = new AlertDialog.Builder(activity)
                 .setTitle(R.string.profile_info_settings_title)
                 .setView(content)
@@ -195,4 +194,11 @@
 
         return mEditUserInfoDialog;
     }
+
+    @VisibleForTesting
+    EditUserPhotoController createEditUserPhotoController(Fragment fragment,
+            ImageView userPhotoView, Drawable drawable) {
+        return new EditUserPhotoController(fragment, userPhotoView,
+                mSavedPhoto, drawable, mWaitingForActivityResult);
+    }
 }
diff --git a/tests/robotests/res/values-mcc999/config.xml b/tests/robotests/res/values-mcc999/config.xml
index 6d82451..676a8dd 100644
--- a/tests/robotests/res/values-mcc999/config.xml
+++ b/tests/robotests/res/values-mcc999/config.xml
@@ -23,6 +23,7 @@
     <bool name="config_additional_system_update_setting_enable">true</bool>
     <bool name="config_show_wifi_settings">false</bool>
     <bool name="config_show_toggle_airplane">false</bool>
+    <bool name="config_show_private_dns_settings">false</bool>
     <bool name="config_show_app_info_settings_memory">true</bool>
     <bool name="config_show_app_info_settings_battery">false</bool>
     <bool name="config_show_high_power_apps">false</bool>
diff --git a/tests/robotests/src/com/android/settings/accounts/AccountDetailDashboardFragmentTest.java b/tests/robotests/src/com/android/settings/accounts/AccountDetailDashboardFragmentTest.java
index 33ac5b6..10d5f22 100644
--- a/tests/robotests/src/com/android/settings/accounts/AccountDetailDashboardFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/accounts/AccountDetailDashboardFragmentTest.java
@@ -57,10 +57,15 @@
 
     private AccountDetailDashboardFragment mFragment;
     private Context mContext;
+    private ActivityInfo mActivityInfo;
 
     @Before
     public void setUp() {
         mContext = RuntimeEnvironment.application;
+        mActivityInfo = new ActivityInfo();
+        mActivityInfo.packageName = "pkg";
+        mActivityInfo.name = "clazz";
+        mActivityInfo.metaData = new Bundle();
 
         final Bundle args = new Bundle();
         args.putParcelable(METADATA_USER_HANDLE, UserHandle.CURRENT);
@@ -79,32 +84,26 @@
 
     @Test
     public void refreshDashboardTiles_HasAccountType_shouldDisplay() {
-        final Tile tile = new Tile(new ActivityInfo());
-        final Bundle metaData = new Bundle();
-        metaData.putString(METADATA_CATEGORY, CategoryKey.CATEGORY_ACCOUNT_DETAIL);
-        metaData.putString(METADATA_ACCOUNT_TYPE, "com.abc");
-        tile.metaData = metaData;
+        final Tile tile = new Tile(mActivityInfo, CategoryKey.CATEGORY_ACCOUNT_DETAIL);
+        mActivityInfo.metaData.putString(METADATA_CATEGORY, CategoryKey.CATEGORY_ACCOUNT_DETAIL);
+        mActivityInfo.metaData.putString(METADATA_ACCOUNT_TYPE, "com.abc");
 
         assertThat(mFragment.displayTile(tile)).isTrue();
     }
 
     @Test
     public void refreshDashboardTiles_NoAccountType_shouldNotDisplay() {
-        final Tile tile = new Tile(new ActivityInfo());
-        final Bundle metaData = new Bundle();
-        metaData.putString(METADATA_CATEGORY, CategoryKey.CATEGORY_ACCOUNT_DETAIL);
-        tile.metaData = metaData;
+        final Tile tile = new Tile(mActivityInfo, CategoryKey.CATEGORY_ACCOUNT_DETAIL);
+        mActivityInfo.metaData.putString(METADATA_CATEGORY, CategoryKey.CATEGORY_ACCOUNT_DETAIL);
 
         assertThat(mFragment.displayTile(tile)).isFalse();
     }
 
     @Test
     public void refreshDashboardTiles_OtherAccountType_shouldNotDisplay() {
-        final Tile tile = new Tile(new ActivityInfo());
-        final Bundle metaData = new Bundle();
-        metaData.putString(METADATA_CATEGORY, CategoryKey.CATEGORY_ACCOUNT_DETAIL);
-        metaData.putString(METADATA_ACCOUNT_TYPE, "com.other");
-        tile.metaData = metaData;
+        final Tile tile = new Tile(mActivityInfo, CategoryKey.CATEGORY_ACCOUNT_DETAIL);
+        mActivityInfo.metaData.putString(METADATA_CATEGORY, CategoryKey.CATEGORY_ACCOUNT_DETAIL);
+        mActivityInfo.metaData.putString(METADATA_ACCOUNT_TYPE, "com.other");
 
         assertThat(mFragment.displayTile(tile)).isFalse();
     }
@@ -118,13 +117,12 @@
         when(packageManager.resolveActivity(any(Intent.class), anyInt()))
                 .thenReturn(mock(ResolveInfo.class));
 
-        final Tile tile = new Tile(new ActivityInfo());
+        final Tile tile = new Tile(mActivityInfo, CategoryKey.CATEGORY_ACCOUNT_DETAIL);
         tile.key = "key";
-        tile.metaData = new Bundle();
-        tile.metaData.putString(METADATA_CATEGORY, CategoryKey.CATEGORY_ACCOUNT);
-        tile.metaData.putString(METADATA_ACCOUNT_TYPE, "com.abc");
-        tile.metaData.putString("com.android.settings.intent.action", Intent.ACTION_ASSIST);
-        tile.intent = new Intent();
+        mActivityInfo.metaData.putString(METADATA_CATEGORY, CategoryKey.CATEGORY_ACCOUNT);
+        mActivityInfo.metaData.putString(METADATA_ACCOUNT_TYPE, "com.abc");
+        mActivityInfo.metaData.putString("com.android.settings.intent.action",
+                Intent.ACTION_ASSIST);
         tile.userHandle = null;
         mFragment.displayTile(tile);
 
diff --git a/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrollingTest.java b/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrollingTest.java
index bee208f..da91a1d 100644
--- a/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrollingTest.java
+++ b/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrollingTest.java
@@ -106,6 +106,7 @@
                 anyInt(),
                 nullable(String.class),
                 any(VibrationEffect.class),
+                nullable(String.class),
                 nullable(AudioAttributes.class));
     }
 
diff --git a/tests/robotests/src/com/android/settings/bluetooth/BluetoothDeviceUpdaterTest.java b/tests/robotests/src/com/android/settings/bluetooth/BluetoothDeviceUpdaterTest.java
index a5422e7..9f81711 100644
--- a/tests/robotests/src/com/android/settings/bluetooth/BluetoothDeviceUpdaterTest.java
+++ b/tests/robotests/src/com/android/settings/bluetooth/BluetoothDeviceUpdaterTest.java
@@ -30,11 +30,8 @@
 import com.android.settings.connecteddevice.DevicePreferenceCallback;
 import com.android.settings.dashboard.DashboardFragment;
 import com.android.settings.testutils.SettingsRobolectricTestRunner;
-import com.android.settingslib.bluetooth.A2dpProfile;
 import com.android.settingslib.bluetooth.CachedBluetoothDevice;
-import com.android.settingslib.bluetooth.HeadsetProfile;
 import com.android.settingslib.bluetooth.LocalBluetoothManager;
-import com.android.settingslib.bluetooth.LocalBluetoothProfileManager;
 
 import org.junit.Before;
 import org.junit.Test;
@@ -61,12 +58,6 @@
     private SettingsActivity mSettingsActivity;
     @Mock
     private LocalBluetoothManager mLocalManager;
-    @Mock
-    private LocalBluetoothProfileManager mLocalBluetoothProfileManager;
-    @Mock
-    private HeadsetProfile mHeadsetProfile;
-    @Mock
-    private A2dpProfile mA2dpProfile;
 
     private Context mContext;
     private BluetoothDeviceUpdater mBluetoothDeviceUpdater;
@@ -79,9 +70,6 @@
         mContext = RuntimeEnvironment.application;
         doReturn(mContext).when(mDashboardFragment).getContext();
         when(mCachedBluetoothDevice.getDevice()).thenReturn(mBluetoothDevice);
-        when(mLocalManager.getProfileManager()).thenReturn(mLocalBluetoothProfileManager);
-        when(mLocalBluetoothProfileManager.getHeadsetProfile()).thenReturn(mHeadsetProfile);
-        when(mLocalBluetoothProfileManager.getA2dpProfile()).thenReturn(mA2dpProfile);
 
         mPreference = new BluetoothDevicePreference(mContext, mCachedBluetoothDevice, false);
         mBluetoothDeviceUpdater =
diff --git a/tests/robotests/src/com/android/settings/bluetooth/ConnectedBluetoothDeviceUpdaterTest.java b/tests/robotests/src/com/android/settings/bluetooth/ConnectedBluetoothDeviceUpdaterTest.java
index bf88245..d94a8a7 100644
--- a/tests/robotests/src/com/android/settings/bluetooth/ConnectedBluetoothDeviceUpdaterTest.java
+++ b/tests/robotests/src/com/android/settings/bluetooth/ConnectedBluetoothDeviceUpdaterTest.java
@@ -34,9 +34,7 @@
 import com.android.settings.testutils.shadow.ShadowAudioManager;
 import com.android.settingslib.bluetooth.CachedBluetoothDevice;
 import com.android.settingslib.bluetooth.CachedBluetoothDeviceManager;
-import com.android.settingslib.bluetooth.HeadsetProfile;
 import com.android.settingslib.bluetooth.LocalBluetoothManager;
-import com.android.settingslib.bluetooth.LocalBluetoothProfileManager;
 
 import org.junit.Before;
 import org.junit.Test;
@@ -63,16 +61,10 @@
     @Mock
     private LocalBluetoothManager mLocalManager;
     @Mock
-    private LocalBluetoothProfileManager mLocalBluetoothProfileManager;
-    @Mock
-    private HeadsetProfile mHeadsetProfile;
+    private CachedBluetoothDeviceManager mCachedDeviceManager;
 
     private Context mContext;
     private ConnectedBluetoothDeviceUpdater mBluetoothDeviceUpdater;
-
-    @Mock
-    private CachedBluetoothDeviceManager mCachedDeviceManager;
-
     private Collection<CachedBluetoothDevice> cachedDevices;
     private ShadowAudioManager mShadowAudioManager;
 
@@ -87,8 +79,6 @@
                 new ArrayList<CachedBluetoothDevice>(new ArrayList<CachedBluetoothDevice>());
 
         when(mCachedBluetoothDevice.getDevice()).thenReturn(mBluetoothDevice);
-        when(mLocalManager.getProfileManager()).thenReturn(mLocalBluetoothProfileManager);
-        when(mLocalBluetoothProfileManager.getHeadsetProfile()).thenReturn(mHeadsetProfile);
         when(mLocalManager.getCachedDeviceManager()).thenReturn(mCachedDeviceManager);
         when(mCachedDeviceManager.getCachedDevicesCopy()).thenReturn(cachedDevices);
 
diff --git a/tests/robotests/src/com/android/settings/dashboard/CategoryManagerTest.java b/tests/robotests/src/com/android/settings/dashboard/CategoryManagerTest.java
index 3bb4a65..0f44c85 100644
--- a/tests/robotests/src/com/android/settings/dashboard/CategoryManagerTest.java
+++ b/tests/robotests/src/com/android/settings/dashboard/CategoryManagerTest.java
@@ -16,6 +16,8 @@
 
 package com.android.settings.dashboard;
 
+import static com.android.settingslib.drawer.CategoryKey.CATEGORY_HOMEPAGE;
+
 import static com.google.common.truth.Truth.assertThat;
 
 import android.content.ComponentName;
@@ -52,6 +54,8 @@
     public void setUp() {
         mContext = RuntimeEnvironment.application;
         mActivityInfo = new ActivityInfo();
+        mActivityInfo.packageName = "pkg";
+        mActivityInfo.name = "class";
         mActivityInfo.applicationInfo = new ApplicationInfo();
         mTileByComponentCache = new HashMap<>();
         mCategoryByKeyMap = new HashMap<>();
@@ -65,11 +69,9 @@
 
     @Test
     public void backwardCompatCleanupForCategory_shouldNotChangeCategoryForNewKeys() {
-        final Tile tile1 = new Tile(mActivityInfo);
-        final Tile tile2 = new Tile(mActivityInfo);
-        tile1.category = CategoryKey.CATEGORY_ACCOUNT;
-        tile2.category = CategoryKey.CATEGORY_ACCOUNT;
-        final DashboardCategory category = new DashboardCategory();
+        final Tile tile1 = new Tile(mActivityInfo, CategoryKey.CATEGORY_ACCOUNT);
+        final Tile tile2 = new Tile(mActivityInfo, CategoryKey.CATEGORY_ACCOUNT);
+        final DashboardCategory category = new DashboardCategory(CategoryKey.CATEGORY_ACCOUNT);
         category.addTile(tile1);
         category.addTile(tile2);
         mCategoryByKeyMap.put(CategoryKey.CATEGORY_ACCOUNT, category);
@@ -84,14 +86,12 @@
 
     @Test
     public void backwardCompatCleanupForCategory_shouldNotChangeCategoryForMixedKeys() {
-        final Tile tile1 = new Tile(mActivityInfo);
-        final Tile tile2 = new Tile(mActivityInfo);
+        final Tile tile1 = new Tile(mActivityInfo, CategoryKey.CATEGORY_ACCOUNT);
         final String oldCategory = "com.android.settings.category.wireless";
-        tile1.category = CategoryKey.CATEGORY_ACCOUNT;
-        tile2.category = oldCategory;
-        final DashboardCategory category1 = new DashboardCategory();
+        final Tile tile2 = new Tile(mActivityInfo, oldCategory);
+        final DashboardCategory category1 = new DashboardCategory(CategoryKey.CATEGORY_ACCOUNT);
         category1.addTile(tile1);
-        final DashboardCategory category2 = new DashboardCategory();
+        final DashboardCategory category2 = new DashboardCategory(oldCategory);
         category2.addTile(tile2);
         mCategoryByKeyMap.put(CategoryKey.CATEGORY_ACCOUNT, category1);
         mCategoryByKeyMap.put(oldCategory, category2);
@@ -108,10 +108,10 @@
 
     @Test
     public void backwardCompatCleanupForCategory_shouldChangeCategoryForOldKeys() {
-        final Tile tile1 = new Tile(mActivityInfo);
         final String oldCategory = "com.android.settings.category.wireless";
-        tile1.category = oldCategory;
-        final DashboardCategory category1 = new DashboardCategory();
+        final Tile tile1 = new Tile(mActivityInfo, oldCategory);
+        tile1.setCategory(oldCategory);
+        final DashboardCategory category1 = new DashboardCategory(oldCategory);
         category1.addTile(tile1);
         mCategoryByKeyMap.put(oldCategory, category1);
         mTileByComponentCache.put(new Pair<>("PACKAGE", "CLASS1"), tile1);
@@ -131,23 +131,26 @@
     public void sortCategories_singlePackage_shouldReorderBasedOnPriority() {
         // Create some fake tiles that are not sorted.
         final String testPackage = "com.android.test";
-        final DashboardCategory category = new DashboardCategory();
-        final Tile tile1 = new Tile(mActivityInfo);
-        tile1.intent =
-                new Intent().setComponent(new ComponentName(testPackage, "class1"));
+        final DashboardCategory category = new DashboardCategory(CATEGORY_HOMEPAGE);
+        mActivityInfo.packageName = testPackage;
+        mActivityInfo.name = "class1";
+        final Tile tile1 = new Tile(mActivityInfo, category.key);
         tile1.priority = 100;
-        final Tile tile2 = new Tile(mActivityInfo);
-        tile2.intent =
-                new Intent().setComponent(new ComponentName(testPackage, "class2"));
+
+        mActivityInfo.packageName = testPackage;
+        mActivityInfo.name = "class2";
+        final Tile tile2 = new Tile(mActivityInfo, category.key);
         tile2.priority = 50;
-        final Tile tile3 = new Tile(mActivityInfo);
-        tile3.intent =
-                new Intent().setComponent(new ComponentName(testPackage, "class3"));
+
+        mActivityInfo.packageName = testPackage;
+        mActivityInfo.name = "class3";
+        final Tile tile3 = new Tile(mActivityInfo, category.key);
         tile3.priority = 200;
+
         category.addTile(tile1);
         category.addTile(tile2);
         category.addTile(tile3);
-        mCategoryByKeyMap.put(CategoryKey.CATEGORY_HOMEPAGE, category);
+        mCategoryByKeyMap.put(CATEGORY_HOMEPAGE, category);
 
         // Sort their priorities
         mCategoryManager.sortCategories(ShadowApplication.getInstance().getApplicationContext(),
@@ -164,23 +167,27 @@
         // Create some fake tiles that are not sorted.
         final String testPackage1 = "com.android.test1";
         final String testPackage2 = "com.android.test2";
-        final DashboardCategory category = new DashboardCategory();
-        final Tile tile1 = new Tile(mActivityInfo);
-        tile1.intent =
-                new Intent().setComponent(new ComponentName(testPackage2, "class1"));
+        final DashboardCategory category = new DashboardCategory(CATEGORY_HOMEPAGE);
+
+        mActivityInfo.packageName = testPackage2;
+        mActivityInfo.name = "class1";
+        final Tile tile1 = new Tile(mActivityInfo, category.key);
         tile1.priority = 100;
-        final Tile tile2 = new Tile(mActivityInfo);
-        tile2.intent =
-                new Intent().setComponent(new ComponentName(testPackage1, "class2"));
+
+        mActivityInfo.packageName = testPackage1;
+        mActivityInfo.name = "class2";
+        final Tile tile2 = new Tile(mActivityInfo, category.key);
         tile2.priority = 100;
-        final Tile tile3 = new Tile(mActivityInfo);
-        tile3.intent =
-                new Intent().setComponent(new ComponentName(testPackage1, "class3"));
+
+        mActivityInfo.packageName = testPackage1;
+        mActivityInfo.name = "class3";
+        final Tile tile3 = new Tile(mActivityInfo, category.key);
         tile3.priority = 50;
+
         category.addTile(tile1);
         category.addTile(tile2);
         category.addTile(tile3);
-        mCategoryByKeyMap.put(CategoryKey.CATEGORY_HOMEPAGE, category);
+        mCategoryByKeyMap.put(CATEGORY_HOMEPAGE, category);
 
         // Sort their priorities
         mCategoryManager.sortCategories(mContext, mCategoryByKeyMap);
@@ -195,23 +202,27 @@
     public void sortCategories_internalPackageTiles_shouldSkipTileForInternalPackage() {
         // Create some fake tiles that are not sorted.
         final String testPackage = mContext.getPackageName();
-        final DashboardCategory category = new DashboardCategory();
-        final Tile tile1 = new Tile(mActivityInfo);
-        tile1.intent =
-                new Intent().setComponent(new ComponentName(testPackage, "class1"));
+        final DashboardCategory category = new DashboardCategory(CATEGORY_HOMEPAGE);
+
+        mActivityInfo.packageName = testPackage;
+        mActivityInfo.name = "class1";
+        final Tile tile1 = new Tile(mActivityInfo, category.key);
         tile1.priority = 100;
-        final Tile tile2 = new Tile(mActivityInfo);
-        tile2.intent =
-                new Intent().setComponent(new ComponentName(testPackage, "class2"));
+
+        mActivityInfo.packageName = testPackage;
+        mActivityInfo.name = "class2";
+        final Tile tile2 = new Tile(mActivityInfo, category.key);
         tile2.priority = 100;
-        final Tile tile3 = new Tile(mActivityInfo);
-        tile3.intent =
-                new Intent().setComponent(new ComponentName(testPackage, "class3"));
+
+        mActivityInfo.packageName = testPackage;
+        mActivityInfo.name = "class3";
+        final Tile tile3 = new Tile(mActivityInfo, category.key);
         tile3.priority = 50;
+
         category.addTile(tile1);
         category.addTile(tile2);
         category.addTile(tile3);
-        mCategoryByKeyMap.put(CategoryKey.CATEGORY_HOMEPAGE, category);
+        mCategoryByKeyMap.put(CATEGORY_HOMEPAGE, category);
 
         // Sort their priorities
         mCategoryManager.sortCategories(mContext, mCategoryByKeyMap);
@@ -227,24 +238,28 @@
         // Inject one external tile among internal tiles.
         final String testPackage = mContext.getPackageName();
         final String testPackage2 = "com.google.test2";
-        final DashboardCategory category = new DashboardCategory();
-        final Tile tile1 = new Tile(mActivityInfo);
-        tile1.intent = new Intent().setComponent(new ComponentName(testPackage, "class1"));
+        final DashboardCategory category = new DashboardCategory(CATEGORY_HOMEPAGE);
+        mActivityInfo.packageName = testPackage;
+        mActivityInfo.name = "class1";
+        final Tile tile1 = new Tile(mActivityInfo, category.key);
         tile1.priority = 2;
-        final Tile tile2 = new Tile(mActivityInfo);
-        tile2.intent = new Intent().setComponent(new ComponentName(testPackage, "class2"));
+        mActivityInfo.packageName = testPackage;
+        mActivityInfo.name = "class2";
+        final Tile tile2 = new Tile(mActivityInfo, category.key);
         tile2.priority = 1;
-        final Tile tile3 = new Tile(mActivityInfo);
-        tile3.intent = new Intent().setComponent(new ComponentName(testPackage2, "class0"));
+        mActivityInfo.packageName = testPackage2;
+        mActivityInfo.name = "class0";
+        final Tile tile3 = new Tile(mActivityInfo, category.key);
         tile3.priority = 0;
-        final Tile tile4 = new Tile(mActivityInfo);
-        tile4.intent = new Intent().setComponent(new ComponentName(testPackage, "class3"));
+        mActivityInfo.packageName = testPackage;
+        mActivityInfo.name = "class3";
+        final Tile tile4 = new Tile(mActivityInfo, category.key);
         tile4.priority = -1;
         category.addTile(tile1);
         category.addTile(tile2);
         category.addTile(tile3);
         category.addTile(tile4);
-        mCategoryByKeyMap.put(CategoryKey.CATEGORY_HOMEPAGE, category);
+        mCategoryByKeyMap.put(CATEGORY_HOMEPAGE, category);
 
         // Sort their priorities
         mCategoryManager.sortCategories(mContext, mCategoryByKeyMap);
@@ -262,20 +277,26 @@
         final String testPackage = mContext.getPackageName();
         final String testPackage2 = "com.google.test2";
         final String testPackage3 = "com.abcde.test3";
-        final DashboardCategory category = new DashboardCategory();
-        final Tile tile1 = new Tile(mActivityInfo);
-        tile1.intent = new Intent().setComponent(new ComponentName(testPackage2, "class1"));
+        final DashboardCategory category = new DashboardCategory(CATEGORY_HOMEPAGE);
+        mActivityInfo.packageName = testPackage2;
+        mActivityInfo.name = "class1";
+        final Tile tile1 = new Tile(mActivityInfo, category.key);
         tile1.priority = 1;
-        final Tile tile2 = new Tile(mActivityInfo);
-        tile2.intent = new Intent().setComponent(new ComponentName(testPackage, "class2"));
+
+        mActivityInfo.packageName = testPackage;
+        mActivityInfo.name = "class2";
+        final Tile tile2 = new Tile(mActivityInfo, category.key);
         tile2.priority = 1;
-        final Tile tile3 = new Tile(mActivityInfo);
-        tile3.intent = new Intent().setComponent(new ComponentName(testPackage3, "class3"));
+
+        mActivityInfo.packageName = testPackage3;
+        mActivityInfo.name = "class3";
+        final Tile tile3 = new Tile(mActivityInfo, category.key);
         tile3.priority = 1;
+
         category.addTile(tile1);
         category.addTile(tile2);
         category.addTile(tile3);
-        mCategoryByKeyMap.put(CategoryKey.CATEGORY_HOMEPAGE, category);
+        mCategoryByKeyMap.put(CATEGORY_HOMEPAGE, category);
 
         // Sort their priorities
         mCategoryManager.sortCategories(mContext, mCategoryByKeyMap);
@@ -290,23 +311,26 @@
     public void filterTiles_noDuplicate_noChange() {
         // Create some unique tiles
         final String testPackage = mContext.getPackageName();
-        final DashboardCategory category = new DashboardCategory();
-        final Tile tile1 = new Tile(mActivityInfo);
-        tile1.intent =
-                new Intent().setComponent(new ComponentName(testPackage, "class1"));
+        final DashboardCategory category = new DashboardCategory(CATEGORY_HOMEPAGE);
+        mActivityInfo.packageName = testPackage;
+        mActivityInfo.name = "class1";
+        final Tile tile1 = new Tile(mActivityInfo, category.key);
         tile1.priority = 100;
-        final Tile tile2 = new Tile(mActivityInfo);
-        tile2.intent =
-                new Intent().setComponent(new ComponentName(testPackage, "class2"));
+
+        mActivityInfo.packageName = testPackage;
+        mActivityInfo.name = "class2";
+        final Tile tile2 = new Tile(mActivityInfo, category.key);
         tile2.priority = 100;
-        final Tile tile3 = new Tile(mActivityInfo);
-        tile3.intent =
-                new Intent().setComponent(new ComponentName(testPackage, "class3"));
+
+        mActivityInfo.packageName = testPackage;
+        mActivityInfo.name = "class3";
+        final Tile tile3 = new Tile(mActivityInfo, category.key);
         tile3.priority = 50;
+
         category.addTile(tile1);
         category.addTile(tile2);
         category.addTile(tile3);
-        mCategoryByKeyMap.put(CategoryKey.CATEGORY_HOMEPAGE, category);
+        mCategoryByKeyMap.put(CATEGORY_HOMEPAGE, category);
 
         mCategoryManager.filterDuplicateTiles(mCategoryByKeyMap);
 
@@ -317,23 +341,19 @@
     public void filterTiles_hasDuplicate_shouldOnlyKeepUniqueTiles() {
         // Create tiles pointing to same intent.
         final String testPackage = mContext.getPackageName();
-        final DashboardCategory category = new DashboardCategory();
-        final Tile tile1 = new Tile(mActivityInfo);
-        tile1.intent =
-                new Intent().setComponent(new ComponentName(testPackage, "class1"));
+        final DashboardCategory category = new DashboardCategory(CATEGORY_HOMEPAGE);
+        mActivityInfo.packageName = testPackage;
+        mActivityInfo.name = "class1";
+        final Tile tile1 = new Tile(mActivityInfo, category.key);
         tile1.priority = 100;
-        final Tile tile2 = new Tile(mActivityInfo);
-        tile2.intent =
-                new Intent().setComponent(new ComponentName(testPackage, "class1"));
+        final Tile tile2 = new Tile(mActivityInfo, category.key);
         tile2.priority = 100;
-        final Tile tile3 = new Tile(mActivityInfo);
-        tile3.intent =
-                new Intent().setComponent(new ComponentName(testPackage, "class1"));
+        final Tile tile3 = new Tile(mActivityInfo, category.key);
         tile3.priority = 50;
         category.addTile(tile1);
         category.addTile(tile2);
         category.addTile(tile3);
-        mCategoryByKeyMap.put(CategoryKey.CATEGORY_HOMEPAGE, category);
+        mCategoryByKeyMap.put(CATEGORY_HOMEPAGE, category);
 
         mCategoryManager.filterDuplicateTiles(mCategoryByKeyMap);
 
diff --git a/tests/robotests/src/com/android/settings/dashboard/DashboardAdapterTest.java b/tests/robotests/src/com/android/settings/dashboard/DashboardAdapterTest.java
index c823433..8f10af7 100644
--- a/tests/robotests/src/com/android/settings/dashboard/DashboardAdapterTest.java
+++ b/tests/robotests/src/com/android/settings/dashboard/DashboardAdapterTest.java
@@ -50,6 +50,7 @@
 import com.android.settings.testutils.FakeFeatureFactory;
 import com.android.settings.testutils.SettingsRobolectricTestRunner;
 import com.android.settings.testutils.shadow.SettingsShadowResources;
+import com.android.settingslib.drawer.CategoryKey;
 import com.android.settingslib.drawer.Tile;
 import com.android.settingslib.drawer.TileUtils;
 import com.android.settingslib.utils.IconCache;
@@ -91,6 +92,9 @@
         MockitoAnnotations.initMocks(this);
         mFactory = FakeFeatureFactory.setupForTest();
         mActivityInfo = new ActivityInfo();
+        mActivityInfo.packageName = "pkg";
+        mActivityInfo.name = "class";
+        mActivityInfo.metaData = new Bundle();
         when(mFactory.dashboardFeatureProvider.shouldTintIcon()).thenReturn(true);
 
         when(mContext.getSystemService(Context.WINDOW_SERVICE)).thenReturn(mWindowManager);
@@ -201,7 +205,7 @@
         final View view = LayoutInflater.from(context).inflate(R.layout.dashboard_tile, null);
         final DashboardAdapter.DashboardItemHolder holder =
                 new DashboardAdapter.DashboardItemHolder(view);
-        final Tile tile = spy(new Tile(mActivityInfo));
+        final Tile tile = spy(new Tile(mActivityInfo, CategoryKey.CATEGORY_HOMEPAGE));
         doReturn(Icon.createWithResource(context, R.drawable.ic_settings))
                 .when(tile).getIcon(context);
         final IconCache iconCache = mock(IconCache.class);
@@ -222,7 +226,7 @@
         final View view = LayoutInflater.from(context).inflate(R.layout.dashboard_tile, null);
         final DashboardAdapter.DashboardItemHolder holder =
                 new DashboardAdapter.DashboardItemHolder(view);
-        final Tile tile = spy(new Tile(mActivityInfo));
+        final Tile tile = spy(new Tile(mActivityInfo, CategoryKey.CATEGORY_HOMEPAGE));
         final Icon icon = Icon.createWithResource(context, R.drawable.ic_settings);
         doReturn(icon).when(tile).getIcon(context);
 
@@ -240,14 +244,37 @@
     }
 
     @Test
+    public void onBindTile_externalTileWithBackgroundColorRawValue_shouldUpdateIcon() {
+        final Context context = spy(RuntimeEnvironment.application);
+        final View view = LayoutInflater.from(context).inflate(R.layout.dashboard_tile, null);
+        final DashboardAdapter.DashboardItemHolder holder =
+                new DashboardAdapter.DashboardItemHolder(view);
+        final Tile tile = spy(new Tile(mActivityInfo, CategoryKey.CATEGORY_HOMEPAGE));
+        tile.getMetaData().putInt(DashboardAdapter.META_DATA_PREFERENCE_ICON_BACKGROUND_ARGB,
+                0xff0000);
+        doReturn(Icon.createWithResource(context, R.drawable.ic_settings))
+                .when(tile).getIcon(context);
+        final IconCache iconCache = new IconCache(context);
+        mDashboardAdapter = new DashboardAdapter(context, null /* savedInstanceState */,
+                null /* conditions */, null /* suggestionControllerMixin */, null /* lifecycle */);
+        ReflectionHelpers.setField(mDashboardAdapter, "mCache", iconCache);
+
+        doReturn("another.package").when(context).getPackageName();
+        mDashboardAdapter.onBindTile(holder, tile);
+
+        final RoundedHomepageIcon homepageIcon = (RoundedHomepageIcon) iconCache.getIcon(
+                tile.getIcon(context));
+        assertThat(homepageIcon.mBackgroundColor).isEqualTo(0xff0000);
+    }
+
+    @Test
     public void onBindTile_externalTileWithBackgroundColorHint_shouldUpdateIcon() {
         final Context context = spy(RuntimeEnvironment.application);
         final View view = LayoutInflater.from(context).inflate(R.layout.dashboard_tile, null);
         final DashboardAdapter.DashboardItemHolder holder =
                 new DashboardAdapter.DashboardItemHolder(view);
-        final Tile tile = spy(new Tile(mActivityInfo));
-        tile.metaData = new Bundle();
-        tile.metaData.putInt(TileUtils.META_DATA_PREFERENCE_ICON_BACKGROUND_HINT,
+        final Tile tile = spy(new Tile(mActivityInfo, CategoryKey.CATEGORY_HOMEPAGE));
+        tile.getMetaData().putInt(TileUtils.META_DATA_PREFERENCE_ICON_BACKGROUND_HINT,
                 R.color.memory_critical);
         doReturn(Icon.createWithResource(context, R.drawable.ic_settings))
                 .when(tile).getIcon(context);
@@ -271,7 +298,7 @@
         final View view = LayoutInflater.from(context).inflate(R.layout.dashboard_tile, null);
         final DashboardAdapter.DashboardItemHolder holder =
                 new DashboardAdapter.DashboardItemHolder(view);
-        final Tile tile = spy(new Tile(mActivityInfo));
+        final Tile tile = spy(new Tile(mActivityInfo, CategoryKey.CATEGORY_HOMEPAGE));
         doReturn(mock(Icon.class)).when(tile).getIcon(context);
         when(tile.getIcon(context).getResPackage()).thenReturn("another.package");
 
diff --git a/tests/robotests/src/com/android/settings/dashboard/DashboardDataTest.java b/tests/robotests/src/com/android/settings/dashboard/DashboardDataTest.java
index 5ea7d2d..dfa0494 100644
--- a/tests/robotests/src/com/android/settings/dashboard/DashboardDataTest.java
+++ b/tests/robotests/src/com/android/settings/dashboard/DashboardDataTest.java
@@ -36,6 +36,7 @@
 import com.android.settings.dashboard.conditional.AirplaneModeCondition;
 import com.android.settings.dashboard.conditional.Condition;
 import com.android.settings.testutils.SettingsRobolectricTestRunner;
+import com.android.settingslib.drawer.CategoryKey;
 import com.android.settingslib.drawer.DashboardCategory;
 import com.android.settingslib.drawer.Tile;
 
@@ -72,7 +73,7 @@
     public void SetUp() {
         MockitoAnnotations.initMocks(this);
 
-        mDashboardCategory = new DashboardCategory();
+        mDashboardCategory = new DashboardCategory(CategoryKey.CATEGORY_HOMEPAGE);
 
         // Build suggestions
         final List<Suggestion> suggestions = new ArrayList<>();
@@ -276,14 +277,16 @@
     /**
      * Test when using the
      * {@link com.android.settings.dashboard.DashboardData.ItemsDataDiffCallback}
-     * to transfer List from {@paramref baseDashboardData} to {@paramref diffDashboardData}, whether
+     * to transfer List from {@paramref baseDashboardData} to {@paramref diffDashboardData},
+     * whether
      * the transform data result is equals to {@paramref testResultData}
      * <p>
      * The steps are described below:
      * 1. Calculate a {@link androidx.recyclerview.widget.DiffUtil.DiffResult} from
      * {@paramref baseDashboardData} to {@paramref diffDashboardData}
      * <p>
-     * 2. Dispatch the {@link androidx.recyclerview.widget.DiffUtil.DiffResult} calculated from step 1
+     * 2. Dispatch the {@link androidx.recyclerview.widget.DiffUtil.DiffResult} calculated from step
+     * 1
      * into {@link ListUpdateResult}
      * <p>
      * 3. Get result data(a.k.a. baseResultData) from {@link ListUpdateResult} and compare it to
diff --git a/tests/robotests/src/com/android/settings/dashboard/DashboardFeatureProviderImplTest.java b/tests/robotests/src/com/android/settings/dashboard/DashboardFeatureProviderImplTest.java
index 963411d..12411a0 100644
--- a/tests/robotests/src/com/android/settings/dashboard/DashboardFeatureProviderImplTest.java
+++ b/tests/robotests/src/com/android/settings/dashboard/DashboardFeatureProviderImplTest.java
@@ -34,7 +34,6 @@
 import static org.mockito.Mockito.when;
 
 import android.app.Activity;
-import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
 import android.content.pm.ActivityInfo;
@@ -101,6 +100,9 @@
         MockitoAnnotations.initMocks(this);
         mContext = spy(RuntimeEnvironment.application);
         mActivityInfo = new ActivityInfo();
+        mActivityInfo.packageName = "pkg";
+        mActivityInfo.name = "class";
+        mActivityInfo.metaData = new Bundle();
         doReturn(mPackageManager).when(mContext).getPackageManager();
         when(mPackageManager.resolveActivity(any(Intent.class), anyInt()))
                 .thenReturn(new ResolveInfo());
@@ -116,13 +118,12 @@
     @Test
     public void bindPreference_shouldBindAllData() {
         final Preference preference = new Preference(RuntimeEnvironment.application);
-        final Tile tile = spy(new Tile(mActivityInfo));
+        final Tile tile = spy(new Tile(mActivityInfo, CategoryKey.CATEGORY_HOMEPAGE));
         tile.title = "title";
         tile.summary = "summary";
         doReturn(Icon.createWithBitmap(Bitmap.createBitmap(1, 1, Bitmap.Config.RGB_565)))
                 .when(tile).getIcon(any(Context.class));
-        tile.metaData = new Bundle();
-        tile.metaData.putString(SettingsActivity.META_DATA_KEY_FRAGMENT_CLASS, "HI");
+        mActivityInfo.metaData.putString(SettingsActivity.META_DATA_KEY_FRAGMENT_CLASS, "HI");
         tile.priority = 10;
         mImpl.bindPreferenceToTile(mActivity, MetricsProto.MetricsEvent.SETTINGS_GESTURES,
                 preference, tile, "123", Preference.DEFAULT_ORDER);
@@ -130,19 +131,16 @@
         assertThat(preference.getTitle()).isEqualTo(tile.title);
         assertThat(preference.getSummary()).isEqualTo(tile.summary);
         assertThat(preference.getIcon()).isNotNull();
-        assertThat(preference.getFragment())
-                .isEqualTo(tile.metaData.getString(SettingsActivity.META_DATA_KEY_FRAGMENT_CLASS));
+        assertThat(preference.getFragment()).isEqualTo(
+                mActivityInfo.metaData.getString(SettingsActivity.META_DATA_KEY_FRAGMENT_CLASS));
         assertThat(preference.getOrder()).isEqualTo(-tile.priority);
     }
 
     @Test
     public void bindPreference_noFragmentMetadata_shouldBindIntent() {
         final Preference preference = new Preference(RuntimeEnvironment.application);
-        final Tile tile = new Tile(mActivityInfo);
-        tile.metaData = new Bundle();
+        final Tile tile = new Tile(mActivityInfo, CategoryKey.CATEGORY_HOMEPAGE);
         tile.priority = 10;
-        tile.intent = new Intent();
-        tile.intent.setComponent(new ComponentName("pkg", "class"));
 
         mImpl.bindPreferenceToTile(mActivity, MetricsProto.MetricsEvent.SETTINGS_GESTURES,
                 preference, tile, "123", Preference.DEFAULT_ORDER);
@@ -155,13 +153,10 @@
     @Test
     public void bindPreference_noFragmentMetadata_shouldBindToProfileSelector() {
         final Preference preference = new Preference(RuntimeEnvironment.application);
-        final Tile tile = new Tile(mActivityInfo);
-        tile.metaData = new Bundle();
+        final Tile tile = new Tile(mActivityInfo, CategoryKey.CATEGORY_HOMEPAGE);
         tile.userHandle = new ArrayList<>();
         tile.userHandle.add(mock(UserHandle.class));
         tile.userHandle.add(mock(UserHandle.class));
-        tile.intent = new Intent();
-        tile.intent.setComponent(new ComponentName("pkg", "class"));
 
         when(mActivity.getApplicationContext().getSystemService(Context.USER_SERVICE))
                 .thenReturn(mUserManager);
@@ -176,12 +171,9 @@
     @Test
     public void bindPreference_noFragmentMetadataSingleUser_shouldBindToDirectLaunchIntent() {
         final Preference preference = new Preference(RuntimeEnvironment.application);
-        final Tile tile = new Tile(mActivityInfo);
-        tile.metaData = new Bundle();
+        final Tile tile = new Tile(mActivityInfo, CategoryKey.CATEGORY_HOMEPAGE);
         tile.userHandle = new ArrayList<>();
         tile.userHandle.add(mock(UserHandle.class));
-        tile.intent = new Intent();
-        tile.intent.setComponent(new ComponentName("pkg", "class"));
 
         when(mActivity.getSystemService(Context.USER_SERVICE))
                 .thenReturn(mUserManager);
@@ -201,13 +193,10 @@
     @Test
     public void bindPreference_toInternalSettingActivity_shouldBindToDirectLaunchIntentAndNotLog() {
         final Preference preference = new Preference(RuntimeEnvironment.application);
-        final Tile tile = new Tile(mActivityInfo);
-        tile.metaData = new Bundle();
+        mActivityInfo.packageName = RuntimeEnvironment.application.getPackageName();
+        final Tile tile = new Tile(mActivityInfo, CategoryKey.CATEGORY_HOMEPAGE);
         tile.userHandle = new ArrayList<>();
         tile.userHandle.add(mock(UserHandle.class));
-        tile.intent = new Intent();
-        tile.intent.setComponent(
-                new ComponentName(RuntimeEnvironment.application.getPackageName(), "class"));
 
         when(mActivity.getSystemService(Context.USER_SERVICE))
                 .thenReturn(mUserManager);
@@ -237,9 +226,7 @@
     @Test
     public void bindPreference_withNullKeyNullPriority_shouldGenerateKeyAndPriority() {
         final Preference preference = new Preference(RuntimeEnvironment.application);
-        final Tile tile = new Tile(mActivityInfo);
-        tile.intent = new Intent();
-        tile.intent.setComponent(new ComponentName("pkg", "class"));
+        final Tile tile = new Tile(mActivityInfo, CategoryKey.CATEGORY_HOMEPAGE);
         mImpl.bindPreferenceToTile(mActivity, MetricsProto.MetricsEvent.VIEW_UNKNOWN,
                 preference, tile, null /*key */, Preference.DEFAULT_ORDER);
 
@@ -250,9 +237,7 @@
     @Test
     public void bindPreference_noSummary_shouldSetSummaryToPlaceholder() {
         final Preference preference = new Preference(RuntimeEnvironment.application);
-        final Tile tile = new Tile(mActivityInfo);
-        tile.intent = new Intent();
-        tile.intent.setComponent(new ComponentName("pkg", "class"));
+        final Tile tile = new Tile(mActivityInfo, CategoryKey.CATEGORY_HOMEPAGE);
         mImpl.bindPreferenceToTile(mActivity, MetricsProto.MetricsEvent.VIEW_UNKNOWN,
                 preference, tile, null /*key */, Preference.DEFAULT_ORDER);
 
@@ -263,10 +248,8 @@
     @Test
     public void bindPreference_hasSummary_shouldSetSummary() {
         final Preference preference = new Preference(RuntimeEnvironment.application);
-        final Tile tile = new Tile(mActivityInfo);
+        final Tile tile = new Tile(mActivityInfo, CategoryKey.CATEGORY_HOMEPAGE);
         tile.summary = "test";
-        tile.intent = new Intent();
-        tile.intent.setComponent(new ComponentName("pkg", "class"));
         mImpl.bindPreferenceToTile(mActivity, MetricsProto.MetricsEvent.VIEW_UNKNOWN,
                 preference, tile, null /*key */, Preference.DEFAULT_ORDER);
 
@@ -277,11 +260,8 @@
     @Config(shadows = {ShadowTileUtils.class, ShadowThreadUtils.class})
     public void bindPreference_hasSummaryUri_shouldLoadSummaryFromContentProvider() {
         final Preference preference = new Preference(RuntimeEnvironment.application);
-        final Tile tile = new Tile(mActivityInfo);
-        tile.intent = new Intent();
-        tile.intent.setComponent(new ComponentName("pkg", "class"));
-        tile.metaData = new Bundle();
-        tile.metaData.putString(TileUtils.META_DATA_PREFERENCE_SUMMARY_URI,
+        final Tile tile = new Tile(mActivityInfo, CategoryKey.CATEGORY_HOMEPAGE);
+        mActivityInfo.metaData.putString(TileUtils.META_DATA_PREFERENCE_SUMMARY_URI,
                 "content://com.android.settings/tile_summary");
 
         mImpl.bindPreferenceToTile(mActivity, MetricsProto.MetricsEvent.VIEW_UNKNOWN,
@@ -293,10 +273,8 @@
     @Test
     public void bindPreference_withNullKeyTileKey_shouldUseTileKey() {
         final Preference preference = new Preference(RuntimeEnvironment.application);
-        final Tile tile = new Tile(mActivityInfo);
+        final Tile tile = new Tile(mActivityInfo, CategoryKey.CATEGORY_HOMEPAGE);
         tile.key = "key";
-        tile.intent = new Intent();
-        tile.intent.setComponent(new ComponentName("pkg", "class"));
         mImpl.bindPreferenceToTile(mActivity, MetricsProto.MetricsEvent.VIEW_UNKNOWN,
                 preference, tile, null /* key */, Preference.DEFAULT_ORDER);
 
@@ -307,13 +285,10 @@
     @Config(shadows = {ShadowTileUtils.class, ShadowThreadUtils.class})
     public void bindPreference_withIconUri_shouldLoadIconFromContentProvider() {
         final Preference preference = new Preference(RuntimeEnvironment.application);
-        final Tile tile = new Tile(mActivityInfo);
+        mActivityInfo.packageName = RuntimeEnvironment.application.getPackageName();
+        final Tile tile = new Tile(mActivityInfo, CategoryKey.CATEGORY_HOMEPAGE);
         tile.key = "key";
-        tile.intent = new Intent();
-        tile.intent.setComponent(
-                new ComponentName(RuntimeEnvironment.application.getPackageName(), "class"));
-        tile.metaData = new Bundle();
-        tile.metaData.putString(TileUtils.META_DATA_PREFERENCE_ICON_URI,
+        mActivityInfo.metaData.putString(TileUtils.META_DATA_PREFERENCE_ICON_URI,
                 "content://com.android.settings/tile_icon");
         mImpl.bindIcon(preference, tile);
 
@@ -324,8 +299,7 @@
     public void bindPreference_withBaseOrder_shouldOffsetPriority() {
         final int baseOrder = 100;
         final Preference preference = new Preference(RuntimeEnvironment.application);
-        final Tile tile = new Tile(mActivityInfo);
-        tile.metaData = new Bundle();
+        final Tile tile = new Tile(mActivityInfo, CategoryKey.CATEGORY_HOMEPAGE);
         tile.priority = 10;
         mImpl.bindPreferenceToTile(mActivity, MetricsProto.MetricsEvent.VIEW_UNKNOWN,
                 preference, tile, "123", baseOrder);
@@ -337,9 +311,8 @@
     public void bindPreference_withOrderMetadata_shouldUseOrderInMetadata() {
         final Preference preference = new Preference(RuntimeEnvironment.application);
         final int testOrder = -30;
-        final Tile tile = new Tile(mActivityInfo);
-        tile.metaData = new Bundle();
-        tile.metaData.putInt(mImpl.META_DATA_KEY_ORDER, testOrder);
+        final Tile tile = new Tile(mActivityInfo, CategoryKey.CATEGORY_HOMEPAGE);
+        mActivityInfo.metaData.putInt(mImpl.META_DATA_KEY_ORDER, testOrder);
         tile.priority = 10;
         mImpl.bindPreferenceToTile(mActivity, MetricsProto.MetricsEvent.VIEW_UNKNOWN,
                 preference, tile, "123", Preference.DEFAULT_ORDER);
@@ -350,9 +323,8 @@
     @Test
     public void bindPreference_invalidOrderMetadata_shouldIgnore() {
         final Preference preference = new Preference(RuntimeEnvironment.application);
-        final Tile tile = new Tile(mActivityInfo);
-        tile.metaData = new Bundle();
-        tile.metaData.putString(mImpl.META_DATA_KEY_ORDER, "hello");
+        final Tile tile = new Tile(mActivityInfo, CategoryKey.CATEGORY_HOMEPAGE);
+        mActivityInfo.metaData.putString(mImpl.META_DATA_KEY_ORDER, "hello");
         tile.priority = 10;
         mImpl.bindPreferenceToTile(mActivity, MetricsProto.MetricsEvent.VIEW_UNKNOWN,
                 preference, tile, "123", Preference.DEFAULT_ORDER);
@@ -364,12 +336,9 @@
     public void bindPreference_withIntentActionMetadata_shouldSetLaunchAction() {
         Activity activity = Robolectric.buildActivity(Activity.class).get();
         final Preference preference = new Preference(RuntimeEnvironment.application);
-        final Tile tile = new Tile(mActivityInfo);
+        final Tile tile = new Tile(mActivityInfo, CategoryKey.CATEGORY_HOMEPAGE);
         tile.key = "key";
-        tile.intent = new Intent();
-        tile.intent.setComponent(new ComponentName("pkg", "class"));
-        tile.metaData = new Bundle();
-        tile.metaData.putString("com.android.settings.intent.action", "TestAction");
+        mActivityInfo.metaData.putString("com.android.settings.intent.action", "TestAction");
         tile.userHandle = null;
         mImpl.bindPreferenceToTile(activity, MetricsProto.MetricsEvent.SETTINGS_GESTURES,
                 preference, tile, "123", Preference.DEFAULT_ORDER);
@@ -390,12 +359,9 @@
         Activity activity = Robolectric.buildActivity(Activity.class).get();
         final ShadowApplication application = ShadowApplication.getInstance();
         final Preference preference = new Preference(application.getApplicationContext());
-        final Tile tile = new Tile(mActivityInfo);
+        final Tile tile = new Tile(mActivityInfo, CategoryKey.CATEGORY_HOMEPAGE);
         tile.key = "key";
-        tile.intent = new Intent();
-        tile.intent.setComponent(new ComponentName("pkg", "class"));
-        tile.metaData = new Bundle();
-        tile.metaData.putString("com.android.settings.intent.action", "TestAction");
+        mActivityInfo.metaData.putString("com.android.settings.intent.action", "TestAction");
         tile.userHandle = null;
 
         mImpl.bindPreferenceToTile(activity, MetricsProto.MetricsEvent.SETTINGS_GESTURES,
@@ -425,7 +391,7 @@
         mImpl = new DashboardFeatureProviderImpl(mActivity);
         ReflectionHelpers.setField(mImpl, "mCategoryManager", mCategoryManager);
         when(mCategoryManager.getTilesByCategory(mActivity, CategoryKey.CATEGORY_HOMEPAGE))
-                .thenReturn(new DashboardCategory());
+                .thenReturn(new DashboardCategory(CategoryKey.CATEGORY_HOMEPAGE));
 
         assertThat(mImpl.getPreferencesForCategory(null, null,
                 MetricsProto.MetricsEvent.SETTINGS_GESTURES, CategoryKey.CATEGORY_HOMEPAGE))
@@ -436,8 +402,8 @@
     public void getPreferences_hasTileForCategory_shouldReturnPrefList() {
         mImpl = new DashboardFeatureProviderImpl(mActivity);
         ReflectionHelpers.setField(mImpl, "mCategoryManager", mCategoryManager);
-        final DashboardCategory category = new DashboardCategory();
-        category.addTile(new Tile(mActivityInfo));
+        final DashboardCategory category = new DashboardCategory(CategoryKey.CATEGORY_HOMEPAGE);
+        category.addTile(new Tile(mActivityInfo, category.key));
         when(mCategoryManager
                 .getTilesByCategory(any(Context.class), eq(CategoryKey.CATEGORY_HOMEPAGE)))
                 .thenReturn(category);
@@ -467,10 +433,7 @@
 
     @Test
     public void openTileIntent_profileSelectionDialog_shouldShow() {
-        final Tile tile = new Tile(mActivityInfo);
-        tile.metaData = new Bundle();
-        tile.intent = new Intent();
-        tile.intent.setComponent(new ComponentName("pkg", "class"));
+        final Tile tile = new Tile(mActivityInfo, CategoryKey.CATEGORY_HOMEPAGE);
         final ArrayList<UserHandle> handles = new ArrayList<>();
         handles.add(new UserHandle(0));
         handles.add(new UserHandle(10));
@@ -484,11 +447,8 @@
 
     @Test
     public void openTileIntent_profileSelectionDialog_explicitMetadataShouldShow() {
-        final Tile tile = new Tile(mActivityInfo);
-        tile.metaData = new Bundle();
-        tile.metaData.putString(META_DATA_KEY_PROFILE, PROFILE_ALL);
-        tile.intent = new Intent();
-        tile.intent.setComponent(new ComponentName("pkg", "class"));
+        mActivityInfo.metaData.putString(META_DATA_KEY_PROFILE, PROFILE_ALL);
+        final Tile tile = new Tile(mActivityInfo, CategoryKey.CATEGORY_HOMEPAGE);
         final ArrayList<UserHandle> handles = new ArrayList<>();
         handles.add(new UserHandle(0));
         handles.add(new UserHandle(10));
@@ -502,11 +462,8 @@
 
     @Test
     public void openTileIntent_profileSelectionDialog_shouldNotShow() {
-        final Tile tile = new Tile(mActivityInfo);
-        tile.metaData = new Bundle();
-        tile.metaData.putString(META_DATA_KEY_PROFILE, PROFILE_PRIMARY);
-        tile.intent = new Intent();
-        tile.intent.setComponent(new ComponentName("pkg", "class"));
+        mActivityInfo.metaData.putString(META_DATA_KEY_PROFILE, PROFILE_PRIMARY);
+        final Tile tile = new Tile(mActivityInfo, CategoryKey.CATEGORY_HOMEPAGE);
         final ArrayList<UserHandle> handles = new ArrayList<>();
         handles.add(new UserHandle(0));
         handles.add(new UserHandle(10));
diff --git a/tests/robotests/src/com/android/settings/dashboard/DashboardFragmentTest.java b/tests/robotests/src/com/android/settings/dashboard/DashboardFragmentTest.java
index 8c1b99b..8182a1c 100644
--- a/tests/robotests/src/com/android/settings/dashboard/DashboardFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/dashboard/DashboardFragmentTest.java
@@ -17,9 +17,7 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
-import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.nullable;
-import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.spy;
@@ -27,11 +25,8 @@
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
-import android.content.ComponentName;
 import android.content.Context;
-import android.content.Intent;
 import android.content.pm.ActivityInfo;
-import android.graphics.drawable.Icon;
 import android.os.Bundle;
 
 import androidx.preference.Preference;
@@ -45,7 +40,6 @@
 import com.android.settingslib.core.instrumentation.VisibilityLoggerMixin;
 import com.android.settingslib.drawer.DashboardCategory;
 import com.android.settingslib.drawer.Tile;
-import com.android.settingslib.drawer.TileUtils;
 
 import org.junit.Before;
 import org.junit.Test;
@@ -73,9 +67,11 @@
         MockitoAnnotations.initMocks(this);
         mContext = spy(RuntimeEnvironment.application);
         mActivityInfo = new ActivityInfo();
+        mActivityInfo.packageName = "pkg";
+        mActivityInfo.name = "class";
         mFakeFeatureFactory = FakeFeatureFactory.setupForTest();
-        mDashboardCategory = new DashboardCategory();
-        mDashboardCategory.addTile(new Tile(mActivityInfo));
+        mDashboardCategory = new DashboardCategory("key");
+        mDashboardCategory.addTile(new Tile(mActivityInfo, mDashboardCategory.key));
         mTestFragment = new TestFragment(RuntimeEnvironment.application);
         when(mFakeFeatureFactory.dashboardFeatureProvider
                 .getTilesForCategory(nullable(String.class)))
@@ -181,42 +177,6 @@
         verify(mockController2).getPreferenceKey();
     }
 
-    @Test
-    public void tintTileIcon_hasMetadata_shouldReturnIconTintableMetadata() {
-        final Tile tile = spy(new Tile(mActivityInfo));
-        doReturn(mock(Icon.class)).when(tile).getIcon(any(Context.class));
-        final Bundle metaData = new Bundle();
-        tile.metaData = metaData;
-
-        metaData.putBoolean(TileUtils.META_DATA_PREFERENCE_ICON_TINTABLE, false);
-        assertThat(mTestFragment.tintTileIcon(tile)).isFalse();
-
-        metaData.putBoolean(TileUtils.META_DATA_PREFERENCE_ICON_TINTABLE, true);
-        assertThat(mTestFragment.tintTileIcon(tile)).isTrue();
-    }
-
-    @Test
-    public void tintTileIcon_noIcon_shouldReturnFalse() {
-        final Tile tile = new Tile(mActivityInfo);
-        tile.metaData = new Bundle();
-
-        assertThat(mTestFragment.tintTileIcon(tile)).isFalse();
-    }
-
-    @Test
-    public void tintTileIcon_noMetadata_shouldReturnPackageNameCheck() {
-        final Tile tile = spy(new Tile(mActivityInfo));
-        doReturn(mock(Icon.class)).when(tile).getIcon(any(Context.class));
-        final Intent intent = new Intent();
-        tile.intent = intent;
-        intent.setComponent(
-                new ComponentName(RuntimeEnvironment.application.getPackageName(), "TestClass"));
-        assertThat(mTestFragment.tintTileIcon(tile)).isFalse();
-
-        intent.setComponent(new ComponentName("OtherPackage", "TestClass"));
-        assertThat(mTestFragment.tintTileIcon(tile)).isTrue();
-    }
-
     public static class TestPreferenceController extends AbstractPreferenceController
             implements PreferenceControllerMixin {
 
diff --git a/tests/robotests/src/com/android/settings/dashboard/DashboardItemAnimatorTest.java b/tests/robotests/src/com/android/settings/dashboard/DashboardItemAnimatorTest.java
index b1d2031..646643b 100644
--- a/tests/robotests/src/com/android/settings/dashboard/DashboardItemAnimatorTest.java
+++ b/tests/robotests/src/com/android/settings/dashboard/DashboardItemAnimatorTest.java
@@ -25,6 +25,7 @@
 import androidx.recyclerview.widget.RecyclerView;
 
 import com.android.settings.testutils.SettingsRobolectricTestRunner;
+import com.android.settingslib.drawer.CategoryKey;
 import com.android.settingslib.drawer.Tile;
 
 import org.junit.Before;
@@ -42,7 +43,10 @@
     public void SetUp() {
         mDashboardItemAnimator = new DashboardItemAnimator();
         mViewHolder = new ViewHolder(new TextView(RuntimeEnvironment.application));
-        mViewHolder.itemView.setTag(new Tile(new ActivityInfo()));
+        final ActivityInfo activityInfo = new ActivityInfo();
+        activityInfo.packageName = "pkg";
+        activityInfo.name = "class";
+        mViewHolder.itemView.setTag(new Tile(activityInfo, CategoryKey.CATEGORY_HOMEPAGE));
     }
 
     @Test
diff --git a/tests/robotests/src/com/android/settings/dashboard/SummaryLoaderTest.java b/tests/robotests/src/com/android/settings/dashboard/SummaryLoaderTest.java
index 053bc9c..a4fd8d1 100644
--- a/tests/robotests/src/com/android/settings/dashboard/SummaryLoaderTest.java
+++ b/tests/robotests/src/com/android/settings/dashboard/SummaryLoaderTest.java
@@ -22,7 +22,6 @@
 import static org.mockito.Mockito.when;
 
 import android.app.Activity;
-import android.content.Intent;
 import android.content.pm.ActivityInfo;
 
 import com.android.settings.testutils.FakeFeatureFactory;
@@ -52,8 +51,10 @@
     public void SetUp() {
         MockitoAnnotations.initMocks(this);
         mFeatureFactory = FakeFeatureFactory.setupForTest();
-
-        mTile = new Tile(new ActivityInfo());
+        final ActivityInfo activityInfo = new ActivityInfo();
+        activityInfo.packageName = "pkg";
+        activityInfo.name = "class";
+        mTile = new Tile(activityInfo, CategoryKey.CATEGORY_HOMEPAGE);
         mTile.summary = SUMMARY_1;
         mCallbackInvoked = false;
 
@@ -85,10 +86,12 @@
     @Test
     public void testUpdateSummaryToCache_hasCache_shouldUpdate() {
         final String testSummary = "test_summary";
-        final DashboardCategory category = new DashboardCategory();
-        final Tile tile = new Tile(new ActivityInfo());
+        final DashboardCategory category = new DashboardCategory(CategoryKey.CATEGORY_HOMEPAGE);
+        final ActivityInfo activityInfo = new ActivityInfo();
+        activityInfo.packageName = "pkg";
+        activityInfo.name = "cls";
+        final Tile tile = new Tile(activityInfo, category.key);
         tile.key = "123";
-        tile.intent = new Intent();
         category.addTile(tile);
         when(mFeatureFactory.dashboardFeatureProvider.getDashboardKeyForTile(tile))
                 .thenReturn(tile.key);
diff --git a/tests/robotests/src/com/android/settings/dashboard/profileselector/ProfileSelectDialogTest.java b/tests/robotests/src/com/android/settings/dashboard/profileselector/ProfileSelectDialogTest.java
index 70bac9a..8d7f841 100644
--- a/tests/robotests/src/com/android/settings/dashboard/profileselector/ProfileSelectDialogTest.java
+++ b/tests/robotests/src/com/android/settings/dashboard/profileselector/ProfileSelectDialogTest.java
@@ -24,13 +24,13 @@
 import static org.mockito.Mockito.when;
 
 import android.content.Context;
-import android.content.Intent;
 import android.content.pm.ActivityInfo;
 import android.content.pm.UserInfo;
 import android.os.UserHandle;
 import android.os.UserManager;
 
 import com.android.settings.testutils.SettingsRobolectricTestRunner;
+import com.android.settingslib.drawer.CategoryKey;
 import com.android.settingslib.drawer.Tile;
 
 import org.junit.Before;
@@ -50,6 +50,8 @@
     @Mock
     private UserManager mUserManager;
 
+    private ActivityInfo mActivityInfo;
+
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
@@ -57,12 +59,15 @@
         final UserInfo userInfo = new UserInfo(
                 NORMAL_USER.getIdentifier(), "test_user", UserInfo.FLAG_RESTRICTED);
         when(mUserManager.getUserInfo(NORMAL_USER.getIdentifier())).thenReturn(userInfo);
+        mActivityInfo = new ActivityInfo();
+        mActivityInfo.packageName = "pkg";
+        mActivityInfo.name = "cls";
+
     }
 
     @Test
     public void updateUserHandlesIfNeeded_Normal() {
-        final Tile tile = new Tile(new ActivityInfo());
-        tile.intent = new Intent();
+        final Tile tile = new Tile(mActivityInfo, CategoryKey.CATEGORY_HOMEPAGE);
         tile.userHandle.add(NORMAL_USER);
 
         ProfileSelectDialog.updateUserHandlesIfNeeded(mContext, tile);
@@ -74,8 +79,7 @@
 
     @Test
     public void updateUserHandlesIfNeeded_Remove() {
-        final Tile tile = new Tile(new ActivityInfo());
-        tile.intent = new Intent();
+        final Tile tile = new Tile(mActivityInfo, CategoryKey.CATEGORY_HOMEPAGE);
         tile.userHandle.add(REMOVED_USER);
         tile.userHandle.add(NORMAL_USER);
         tile.userHandle.add(REMOVED_USER);
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 ffd25c3..5fdf458 100644
--- a/tests/robotests/src/com/android/settings/dashboard/suggestions/SuggestionFeatureProviderImplTest.java
+++ b/tests/robotests/src/com/android/settings/dashboard/suggestions/SuggestionFeatureProviderImplTest.java
@@ -36,6 +36,7 @@
 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;
 
@@ -77,6 +78,8 @@
         MockitoAnnotations.initMocks(this);
         mFactory = FakeFeatureFactory.setupForTest();
         mActivityInfo = new ActivityInfo();
+        mActivityInfo.packageName = "pkg";
+        mActivityInfo.name = "class";
         when(mContext.getPackageManager()).thenReturn(mPackageManager);
         // Explicit casting to object due to MockitoCast bug
         when((Object) mContext.getSystemService(FingerprintManager.class))
@@ -144,13 +147,13 @@
     @Test
     public void filterExclusiveSuggestions_shouldOnlyKeepFirst3() {
         final List<Tile> suggestions = new ArrayList<>();
-        suggestions.add(new Tile(mActivityInfo));
-        suggestions.add(new Tile(mActivityInfo));
-        suggestions.add(new Tile(mActivityInfo));
-        suggestions.add(new Tile(mActivityInfo));
-        suggestions.add(new Tile(mActivityInfo));
-        suggestions.add(new Tile(mActivityInfo));
-        suggestions.add(new Tile(mActivityInfo));
+        suggestions.add(new Tile(mActivityInfo, CategoryKey.CATEGORY_APPS));
+        suggestions.add(new Tile(mActivityInfo, CategoryKey.CATEGORY_APPS));
+        suggestions.add(new Tile(mActivityInfo, CategoryKey.CATEGORY_APPS));
+        suggestions.add(new Tile(mActivityInfo, CategoryKey.CATEGORY_APPS));
+        suggestions.add(new Tile(mActivityInfo, CategoryKey.CATEGORY_APPS));
+        suggestions.add(new Tile(mActivityInfo, CategoryKey.CATEGORY_APPS));
+        suggestions.add(new Tile(mActivityInfo, CategoryKey.CATEGORY_APPS));
 
         mProvider.filterExclusiveSuggestions(suggestions);
 
diff --git a/tests/robotests/src/com/android/settings/network/PrivateDnsPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/network/PrivateDnsPreferenceControllerTest.java
index 47354c7..eb17bcb 100644
--- a/tests/robotests/src/com/android/settings/network/PrivateDnsPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/network/PrivateDnsPreferenceControllerTest.java
@@ -24,6 +24,8 @@
 import static android.provider.Settings.Global.PRIVATE_DNS_SPECIFIER;
 import static androidx.lifecycle.Lifecycle.Event.ON_START;
 import static androidx.lifecycle.Lifecycle.Event.ON_STOP;
+import static com.android.settings.core.BasePreferenceController.AVAILABLE;
+import static com.android.settings.core.BasePreferenceController.UNSUPPORTED_ON_DEVICE;
 import static com.google.common.truth.Truth.assertThat;
 import static org.mockito.ArgumentMatchers.nullable;
 import static org.mockito.Matchers.anyString;
@@ -57,6 +59,7 @@
 import org.mockito.Captor;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.annotation.Config;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.shadow.api.Shadow;
 import org.robolectric.shadows.ShadowContentResolver;
@@ -144,6 +147,17 @@
     }
 
     @Test
+    public void getAvailibilityStatus_availableByDefault() {
+        assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
+    }
+
+    @Test
+    @Config(qualifiers = "mcc999")
+    public void getAvailabilityStatus_unsupportedWhenSet() {
+        assertThat(mController.getAvailabilityStatus()).isEqualTo(UNSUPPORTED_ON_DEVICE);
+    }
+
+    @Test
     public void goThroughLifecycle_shouldRegisterUnregisterSettingsObserver() {
         mLifecycle.handleLifecycleEvent(ON_START);
         verify(mContext, atLeastOnce()).getContentResolver();
diff --git a/tests/robotests/src/com/android/settings/notification/ZenModeDurationPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/ZenModeDurationPreferenceControllerTest.java
index bbb2142..b9d2978 100644
--- a/tests/robotests/src/com/android/settings/notification/ZenModeDurationPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/notification/ZenModeDurationPreferenceControllerTest.java
@@ -16,8 +16,8 @@
 
 package com.android.settings.notification;
 
+import static org.junit.Assert.assertEquals;
 import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
 import android.app.NotificationManager;
@@ -38,10 +38,6 @@
 import org.robolectric.shadows.ShadowApplication;
 import org.robolectric.util.ReflectionHelpers;
 
-import androidx.fragment.app.FragmentManager;
-import androidx.preference.Preference;
-import androidx.preference.PreferenceScreen;
-
 @RunWith(SettingsRobolectricTestRunner.class)
 public class ZenModeDurationPreferenceControllerTest {
     private ZenModeDurationPreferenceController mController;
@@ -51,11 +47,7 @@
     @Mock
     private NotificationManager mNotificationManager;
     @Mock
-    private Preference mockPref;
-    @Mock
     private NotificationManager.Policy mPolicy;
-    @Mock
-    private PreferenceScreen mPreferenceScreen;
     private ContentResolver mContentResolver;
     private Context mContext;
 
@@ -67,34 +59,27 @@
 
         mContext = shadowApplication.getApplicationContext();
         mContentResolver = RuntimeEnvironment.application.getContentResolver();
-        mController = new ZenModeDurationPreferenceController(mContext, mock(Lifecycle.class),
-                mock(FragmentManager.class));
+        mController = new ZenModeDurationPreferenceController(mContext, mock(Lifecycle.class));
         when(mNotificationManager.getNotificationPolicy()).thenReturn(mPolicy);
         ReflectionHelpers.setField(mController, "mBackend", mBackend);
-        when(mPreferenceScreen.findPreference(mController.getPreferenceKey())).thenReturn(
-                mockPref);
-        mController.displayPreference(mPreferenceScreen);
     }
 
     @Test
     public void updateState_DurationForever() {
         Settings.Secure.putInt(mContentResolver, Settings.Secure.ZEN_DURATION,
                 Settings.Secure.ZEN_DURATION_FOREVER);
-        final Preference mockPref = mock(Preference.class);
-        mController.updateState(mockPref);
 
-        verify(mockPref).setSummary(mContext.getString(R.string.zen_mode_duration_summary_forever));
+        assertEquals(mContext.getString(R.string.zen_mode_duration_summary_forever),
+                mController.getSummary());
     }
 
     @Test
     public void updateState_DurationPrompt() {
         Settings.Secure.putInt(mContentResolver, Settings.Secure.ZEN_DURATION,
                 Settings.Secure.ZEN_DURATION_PROMPT);
-        final Preference mockPref = mock(Preference.class);
-        mController.updateState(mockPref);
 
-        verify(mockPref).setSummary(mContext.getString(
-                R.string.zen_mode_duration_summary_always_prompt));
+        assertEquals(mContext.getString(R.string.zen_mode_duration_summary_always_prompt),
+                mController.getSummary());
     }
 
     @Test
@@ -102,10 +87,8 @@
         int zenDuration = 45;
         Settings.Secure.putInt(mContentResolver, Settings.Secure.ZEN_DURATION,
                 zenDuration);
-        final Preference mockPref = mock(Preference.class);
-        mController.updateState(mockPref);
 
-        verify(mockPref).setSummary(mContext.getResources().getString(
-                R.string.zen_mode_duration_summary_time_minutes, zenDuration));
+        assertEquals(mContext.getString(R.string.zen_mode_duration_summary_time_minutes,
+                zenDuration), mController.getSummary());
     }
-}
\ No newline at end of file
+}
diff --git a/tests/robotests/src/com/android/settings/testutils/shadow/ShadowVibrator.java b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowVibrator.java
index 9046720..69e08d5 100644
--- a/tests/robotests/src/com/android/settings/testutils/shadow/ShadowVibrator.java
+++ b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowVibrator.java
@@ -50,7 +50,8 @@
     public final Vibrator delegate = mock(Vibrator.class);
 
     @Implementation
-    public void vibrate(int uid, String opPkg, VibrationEffect vibe, AudioAttributes attributes) {
-        delegate.vibrate(uid, opPkg, vibe, attributes);
+    public void vibrate(int uid, String opPkg, VibrationEffect vibe, String reason,
+            AudioAttributes attributes) {
+        delegate.vibrate(uid, opPkg, vibe, reason, attributes);
     }
 }
diff --git a/tests/robotests/src/com/android/settings/users/EditUserInfoControllerTest.java b/tests/robotests/src/com/android/settings/users/EditUserInfoControllerTest.java
new file mode 100644
index 0000000..2e205f8
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/users/EditUserInfoControllerTest.java
@@ -0,0 +1,126 @@
+/*
+ * 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.users;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.ArgumentMatchers.same;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.UserInfo;
+import android.graphics.drawable.Drawable;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.widget.EditText;
+import android.widget.ImageView;
+
+import com.android.settings.R;
+import com.android.settings.testutils.Robolectric;
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
+import com.android.settings.testutils.shadow.ShadowUserManager;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Answers;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.annotation.Config;
+
+import androidx.fragment.app.Fragment;
+import androidx.fragment.app.FragmentActivity;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowUserManager.class})
+public class EditUserInfoControllerTest {
+    @Mock
+    private Fragment mFragment;
+    @Mock
+    private LayoutInflater mInflater;
+    @Mock(answer = Answers.RETURNS_DEEP_STUBS)
+    private UserInfo mUserInfo;
+    @Mock(answer = Answers.RETURNS_DEEP_STUBS)
+    private View mDialogContent;
+    @Mock
+    private EditText mUserName;
+    @Mock
+    private ImageView mPhotoView;
+    @Mock
+    private Drawable mCurrentIcon;
+
+    private ShadowUserManager mUserManager;
+    private FragmentActivity mActivity;
+    private TestEditUserInfoController mController;
+
+    public class TestEditUserInfoController extends EditUserInfoController {
+        private EditUserPhotoController mPhotoController;
+
+        public EditUserPhotoController getPhotoController() {
+            return mPhotoController;
+        }
+
+        @Override
+        protected EditUserPhotoController createEditUserPhotoController(Fragment fragment,
+                ImageView userPhotoView, Drawable drawable) {
+            mPhotoController = mock(EditUserPhotoController.class, Answers.RETURNS_DEEP_STUBS);
+            return mPhotoController;
+        }
+    }
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        mUserManager = ShadowUserManager.getShadow();
+        mUserManager.setUserInfo(0, mUserInfo);
+        mActivity = spy(Robolectric.buildActivity(FragmentActivity.class).get());
+        when(mFragment.getActivity()).thenReturn(mActivity);
+        when(mActivity.getLayoutInflater()).thenReturn(mInflater);
+        when(mInflater.inflate(eq(R.layout.edit_user_info_dialog_content), any())).thenReturn(
+                mDialogContent);
+        when(mDialogContent.findViewById(eq(R.id.user_name))).thenReturn(mUserName);
+        when(mDialogContent.findViewById(eq(R.id.user_photo))).thenReturn(mPhotoView);
+        when(mPhotoView.getContext()).thenReturn((Context) mActivity);
+        mController = new TestEditUserInfoController();
+    }
+
+    @After
+    public void tearDown() {
+        mUserManager.reset();
+    }
+
+    @Test
+    public void photoControllerOnActivityResult_whenWaiting_isCalled() {
+        mController.createDialog(mFragment, mCurrentIcon, "test user",
+                R.string.profile_info_settings_title, null, android.os.Process.myUserHandle());
+        mController.startingActivityForResult();
+        Intent resultData = new Intent();
+        mController.onActivityResult(0, 0, resultData);
+        EditUserPhotoController photoController = mController.getPhotoController();
+        assertThat(photoController).isNotNull();
+        verify(photoController).onActivityResult(eq(0), eq(0), same(resultData));
+    }
+}