diff --git a/res/drawable/ic_homepage_about.xml b/res/drawable/ic_homepage_about.xml
index 07dbb34..ef2136e 100644
--- a/res/drawable/ic_homepage_about.xml
+++ b/res/drawable/ic_homepage_about.xml
@@ -18,7 +18,7 @@
 <layer-list xmlns:android="http://schemas.android.com/apk/res/android">
 
     <item>
-        <com.android.settings.homepage.AdaptiveIconShapeDrawable
+        <com.android.settingslib.widget.AdaptiveIconShapeDrawable
             android:width="@dimen/dashboard_tile_image_size"
             android:height="@dimen/dashboard_tile_image_size"
             android:color="@color/homepage_about_background" />
diff --git a/res/drawable/ic_homepage_accessibility.xml b/res/drawable/ic_homepage_accessibility.xml
index 39f241b..85d4be3 100644
--- a/res/drawable/ic_homepage_accessibility.xml
+++ b/res/drawable/ic_homepage_accessibility.xml
@@ -18,7 +18,7 @@
 <layer-list xmlns:android="http://schemas.android.com/apk/res/android">
 
     <item>
-        <com.android.settings.homepage.AdaptiveIconShapeDrawable
+        <com.android.settingslib.widget.AdaptiveIconShapeDrawable
             android:width="@dimen/dashboard_tile_image_size"
             android:height="@dimen/dashboard_tile_image_size"
             android:color="@color/homepage_accessibility_background" />
diff --git a/res/drawable/ic_homepage_accounts.xml b/res/drawable/ic_homepage_accounts.xml
index 17408ed..3f4f3ab 100644
--- a/res/drawable/ic_homepage_accounts.xml
+++ b/res/drawable/ic_homepage_accounts.xml
@@ -18,7 +18,7 @@
 <layer-list xmlns:android="http://schemas.android.com/apk/res/android">
 
     <item>
-        <com.android.settings.homepage.AdaptiveIconShapeDrawable
+        <com.android.settingslib.widget.AdaptiveIconShapeDrawable
             android:width="@dimen/dashboard_tile_image_size"
             android:height="@dimen/dashboard_tile_image_size"
             android:color="@color/homepage_accounts_background" />
diff --git a/res/drawable/ic_homepage_apps.xml b/res/drawable/ic_homepage_apps.xml
index 2a6789c..24a580c 100644
--- a/res/drawable/ic_homepage_apps.xml
+++ b/res/drawable/ic_homepage_apps.xml
@@ -18,7 +18,7 @@
 <layer-list xmlns:android="http://schemas.android.com/apk/res/android">
 
     <item>
-        <com.android.settings.homepage.AdaptiveIconShapeDrawable
+        <com.android.settingslib.widget.AdaptiveIconShapeDrawable
             android:width="@dimen/dashboard_tile_image_size"
             android:height="@dimen/dashboard_tile_image_size"
             android:color="@color/homepage_app_and_notification_background" />
diff --git a/res/drawable/ic_homepage_battery.xml b/res/drawable/ic_homepage_battery.xml
index 87bb5be..0a1f77a 100644
--- a/res/drawable/ic_homepage_battery.xml
+++ b/res/drawable/ic_homepage_battery.xml
@@ -18,7 +18,7 @@
 <layer-list xmlns:android="http://schemas.android.com/apk/res/android">
 
     <item>
-        <com.android.settings.homepage.AdaptiveIconShapeDrawable
+        <com.android.settingslib.widget.AdaptiveIconShapeDrawable
             android:width="@dimen/dashboard_tile_image_size"
             android:height="@dimen/dashboard_tile_image_size"
             android:color="@color/homepage_battery_background" />
diff --git a/res/drawable/ic_homepage_connected_device.xml b/res/drawable/ic_homepage_connected_device.xml
index f3ce186..a648c44 100644
--- a/res/drawable/ic_homepage_connected_device.xml
+++ b/res/drawable/ic_homepage_connected_device.xml
@@ -18,7 +18,7 @@
 <layer-list xmlns:android="http://schemas.android.com/apk/res/android">
 
     <item>
-        <com.android.settings.homepage.AdaptiveIconShapeDrawable
+        <com.android.settingslib.widget.AdaptiveIconShapeDrawable
             android:width="@dimen/dashboard_tile_image_size"
             android:height="@dimen/dashboard_tile_image_size"
             android:color="@color/homepage_connected_device_background" />
diff --git a/res/drawable/ic_homepage_display.xml b/res/drawable/ic_homepage_display.xml
index fba7149..72db231 100644
--- a/res/drawable/ic_homepage_display.xml
+++ b/res/drawable/ic_homepage_display.xml
@@ -18,7 +18,7 @@
 <layer-list xmlns:android="http://schemas.android.com/apk/res/android">
 
     <item>
-        <com.android.settings.homepage.AdaptiveIconShapeDrawable
+        <com.android.settingslib.widget.AdaptiveIconShapeDrawable
             android:width="@dimen/dashboard_tile_image_size"
             android:height="@dimen/dashboard_tile_image_size"
             android:color="@color/homepage_display_background" />
diff --git a/res/drawable/ic_homepage_location.xml b/res/drawable/ic_homepage_location.xml
index c5d6e89..db6a791 100644
--- a/res/drawable/ic_homepage_location.xml
+++ b/res/drawable/ic_homepage_location.xml
@@ -18,7 +18,7 @@
 <layer-list xmlns:android="http://schemas.android.com/apk/res/android">
 
     <item>
-        <com.android.settings.homepage.AdaptiveIconShapeDrawable
+        <com.android.settingslib.widget.AdaptiveIconShapeDrawable
             android:width="@dimen/dashboard_tile_image_size"
             android:height="@dimen/dashboard_tile_image_size"
             android:color="@color/homepage_location_background" />
diff --git a/res/drawable/ic_homepage_network.xml b/res/drawable/ic_homepage_network.xml
index 1457ab9..085a688 100644
--- a/res/drawable/ic_homepage_network.xml
+++ b/res/drawable/ic_homepage_network.xml
@@ -18,7 +18,7 @@
 <layer-list xmlns:android="http://schemas.android.com/apk/res/android">
 
     <item>
-        <com.android.settings.homepage.AdaptiveIconShapeDrawable
+        <com.android.settingslib.widget.AdaptiveIconShapeDrawable
             android:width="@dimen/dashboard_tile_image_size"
             android:height="@dimen/dashboard_tile_image_size"
             android:color="@color/homepage_network_background" />
diff --git a/res/drawable/ic_homepage_privacy.xml b/res/drawable/ic_homepage_privacy.xml
index a102905..ebf8beb 100644
--- a/res/drawable/ic_homepage_privacy.xml
+++ b/res/drawable/ic_homepage_privacy.xml
@@ -18,7 +18,7 @@
 <layer-list xmlns:android="http://schemas.android.com/apk/res/android">
 
     <item>
-        <com.android.settings.homepage.AdaptiveIconShapeDrawable
+        <com.android.settingslib.widget.AdaptiveIconShapeDrawable
             android:width="@dimen/dashboard_tile_image_size"
             android:height="@dimen/dashboard_tile_image_size"
             android:color="@color/homepage_privacy_background" />
diff --git a/res/drawable/ic_homepage_security.xml b/res/drawable/ic_homepage_security.xml
index 0b6a1fd..8a0673c 100644
--- a/res/drawable/ic_homepage_security.xml
+++ b/res/drawable/ic_homepage_security.xml
@@ -18,7 +18,7 @@
 <layer-list xmlns:android="http://schemas.android.com/apk/res/android">
 
     <item>
-        <com.android.settings.homepage.AdaptiveIconShapeDrawable
+        <com.android.settingslib.widget.AdaptiveIconShapeDrawable
             android:width="@dimen/dashboard_tile_image_size"
             android:height="@dimen/dashboard_tile_image_size"
             android:color="@color/homepage_security_background" />
diff --git a/res/drawable/ic_homepage_sound.xml b/res/drawable/ic_homepage_sound.xml
index 21995c5..a15f4c6 100644
--- a/res/drawable/ic_homepage_sound.xml
+++ b/res/drawable/ic_homepage_sound.xml
@@ -18,7 +18,7 @@
 <layer-list xmlns:android="http://schemas.android.com/apk/res/android">
 
     <item>
-        <com.android.settings.homepage.AdaptiveIconShapeDrawable
+        <com.android.settingslib.widget.AdaptiveIconShapeDrawable
             android:width="@dimen/dashboard_tile_image_size"
             android:height="@dimen/dashboard_tile_image_size"
             android:color="@color/homepage_sound_background" />
diff --git a/res/drawable/ic_homepage_storage.xml b/res/drawable/ic_homepage_storage.xml
index 5e5c3ab..11032fa 100644
--- a/res/drawable/ic_homepage_storage.xml
+++ b/res/drawable/ic_homepage_storage.xml
@@ -18,7 +18,7 @@
 <layer-list xmlns:android="http://schemas.android.com/apk/res/android">
 
     <item>
-        <com.android.settings.homepage.AdaptiveIconShapeDrawable
+        <com.android.settingslib.widget.AdaptiveIconShapeDrawable
             android:width="@dimen/dashboard_tile_image_size"
             android:height="@dimen/dashboard_tile_image_size"
             android:color="@color/homepage_storage_background" />
diff --git a/res/drawable/ic_homepage_support.xml b/res/drawable/ic_homepage_support.xml
index 906dd6c..2e35e4f 100644
--- a/res/drawable/ic_homepage_support.xml
+++ b/res/drawable/ic_homepage_support.xml
@@ -18,7 +18,7 @@
 <layer-list xmlns:android="http://schemas.android.com/apk/res/android">
 
     <item>
-        <com.android.settings.homepage.AdaptiveIconShapeDrawable
+        <com.android.settingslib.widget.AdaptiveIconShapeDrawable
             android:width="@dimen/dashboard_tile_image_size"
             android:height="@dimen/dashboard_tile_image_size"
             android:color="@color/homepage_support_background" />
diff --git a/res/drawable/ic_homepage_system_dashboard.xml b/res/drawable/ic_homepage_system_dashboard.xml
index 5e9f372..add1212 100644
--- a/res/drawable/ic_homepage_system_dashboard.xml
+++ b/res/drawable/ic_homepage_system_dashboard.xml
@@ -18,7 +18,7 @@
 <layer-list xmlns:android="http://schemas.android.com/apk/res/android">
 
     <item>
-        <com.android.settings.homepage.AdaptiveIconShapeDrawable
+        <com.android.settingslib.widget.AdaptiveIconShapeDrawable
             android:width="@dimen/dashboard_tile_image_size"
             android:height="@dimen/dashboard_tile_image_size"
             android:color="@color/homepage_system_background" />
diff --git a/res/values/arrays.xml b/res/values/arrays.xml
index b8bd424..ffe0aa5 100644
--- a/res/values/arrays.xml
+++ b/res/values/arrays.xml
@@ -1398,25 +1398,4 @@
         <item>@string/enhanced_4g_lte_mode_summary_4g_calling</item>
     </string-array>
 
-    <!-- Bluetooth icon foreground colors -->
-    <integer-array name="bt_icon_fg_colors">
-        <item>@color/bt_color_icon_1</item>
-        <item>@color/bt_color_icon_2</item>
-        <item>@color/bt_color_icon_3</item>
-        <item>@color/bt_color_icon_4</item>
-        <item>@color/bt_color_icon_5</item>
-        <item>@color/bt_color_icon_6</item>
-        <item>@color/bt_color_icon_7</item>
-    </integer-array>
-
-    <!-- Bluetooth icon background colors -->
-    <integer-array name="bt_icon_bg_colors">
-        <item>@color/bt_color_bg_1</item>
-        <item>@color/bt_color_bg_2</item>
-        <item>@color/bt_color_bg_3</item>
-        <item>@color/bt_color_bg_4</item>
-        <item>@color/bt_color_bg_5</item>
-        <item>@color/bt_color_bg_6</item>
-        <item>@color/bt_color_bg_7</item>
-    </integer-array>
 </resources>
diff --git a/res/values/colors.xml b/res/values/colors.xml
index ff040ee..b547b5d 100644
--- a/res/values/colors.xml
+++ b/res/values/colors.xml
@@ -141,21 +141,4 @@
     <color name="qr_background_color">#b3ffffff</color> <!-- 70% white transparency -->
     <!-- End of QR code scanner colors -->
 
-    <color name="bt_color_icon_1">#48a50e0e</color> <!-- 72% Material Red 900 -->
-    <color name="bt_color_icon_2">#480d652d</color> <!-- 72% Material Green 900 -->
-    <color name="bt_color_icon_3">#48e37400</color> <!-- 72% Material Yellow 900 -->
-    <color name="bt_color_icon_4">#48b06000</color> <!-- 72% Material Orange 900 -->
-    <color name="bt_color_icon_5">#489c166b</color> <!-- 72% Material Pink 900 -->
-    <color name="bt_color_icon_6">#48681da8</color> <!-- 72% Material Purple 900 -->
-    <color name="bt_color_icon_7">#48007b83</color> <!-- 72% Material Cyan 900 -->
-
-    <color name="bt_color_bg_1">#fad2cf</color> <!-- Material Red 100 -->
-    <color name="bt_color_bg_2">#ceead6</color> <!-- Material Green 100 -->
-    <color name="bt_color_bg_3">#feefc3</color> <!-- Material Yellow 100 -->
-    <color name="bt_color_bg_4">#fedfc8</color> <!-- Material Orange 100 -->
-    <color name="bt_color_bg_5">#fdcfe8</color> <!-- Material Pink 100 -->
-    <color name="bt_color_bg_6">#e9d2fd</color> <!-- Material Purple 100 -->
-    <color name="bt_color_bg_7">#cbf0f8</color> <!-- Material Cyan 100 -->
-
-    <color name="bt_outline_color">#1f000000</color> <!-- icon outline color -->
 </resources>
\ No newline at end of file
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index 4a65bc9..886f558 100755
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -405,12 +405,6 @@
     <!-- Wi-Fi DPP fragment icon size -->
     <dimen name="wifi_dpp_fragment_icon_width_height">48dp</dimen>
 
-    <!-- Size of nearby icon -->
-    <dimen name="bt_nearby_icon_size">24dp</dimen>
-
-    <!-- Stroke size of adaptive outline -->
-    <dimen name="adaptive_outline_stroke">1dp</dimen>
-
     <!-- Elevation of bluetooth icon -->
     <dimen name="bt_icon_elevation">4dp</dimen>
 </resources>
diff --git a/src/com/android/settings/bluetooth/BluetoothDetailsHeaderController.java b/src/com/android/settings/bluetooth/BluetoothDetailsHeaderController.java
index fe73a2e..47d56bc 100644
--- a/src/com/android/settings/bluetooth/BluetoothDetailsHeaderController.java
+++ b/src/com/android/settings/bluetooth/BluetoothDetailsHeaderController.java
@@ -26,6 +26,7 @@
 
 import com.android.settings.R;
 import com.android.settings.widget.EntityHeaderController;
+import com.android.settingslib.bluetooth.BluetoothUtils;
 import com.android.settingslib.bluetooth.CachedBluetoothDevice;
 import com.android.settingslib.bluetooth.CachedBluetoothDeviceManager;
 import com.android.settingslib.bluetooth.LocalBluetoothManager;
@@ -65,8 +66,8 @@
     }
 
     protected void setHeaderProperties() {
-        final Pair<Drawable, String> pair = Utils.getBtRainbowDrawableWithDescription(mContext,
-                mCachedDevice);
+        final Pair<Drawable, String> pair =
+                BluetoothUtils.getBtRainbowDrawableWithDescription(mContext, mCachedDevice);
         String summaryText = mCachedDevice.getConnectionSummary();
         // If both the hearing aids are connected, two device status should be shown.
         // If Second Summary is unavailable, to set it to null.
diff --git a/src/com/android/settings/bluetooth/BluetoothDevicePreference.java b/src/com/android/settings/bluetooth/BluetoothDevicePreference.java
index 4a7ca27..f67822d 100644
--- a/src/com/android/settings/bluetooth/BluetoothDevicePreference.java
+++ b/src/com/android/settings/bluetooth/BluetoothDevicePreference.java
@@ -38,6 +38,7 @@
 import com.android.settings.R;
 import com.android.settings.overlay.FeatureFactory;
 import com.android.settings.widget.GearPreference;
+import com.android.settingslib.bluetooth.BluetoothUtils;
 import com.android.settingslib.bluetooth.CachedBluetoothDevice;
 import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
 
@@ -129,8 +130,8 @@
         // Null check is done at the framework
         setSummary(mCachedDevice.getConnectionSummary());
 
-        final Pair<Drawable, String> pair = Utils
-                .getBtRainbowDrawableWithDescription(getContext(), mCachedDevice);
+        final Pair<Drawable, String> pair =
+                BluetoothUtils.getBtRainbowDrawableWithDescription(getContext(), mCachedDevice);
         if (pair.first != null) {
             setIcon(pair.first);
             contentDescription = pair.second;
diff --git a/src/com/android/settings/bluetooth/Utils.java b/src/com/android/settings/bluetooth/Utils.java
index ecf40b6..a86e1d5 100755
--- a/src/com/android/settings/bluetooth/Utils.java
+++ b/src/com/android/settings/bluetooth/Utils.java
@@ -21,33 +21,20 @@
 import android.bluetooth.BluetoothProfile;
 import android.content.Context;
 import android.content.DialogInterface;
-import android.content.res.Resources;
-import android.graphics.Bitmap;
-import android.graphics.PorterDuff;
-import android.graphics.drawable.Drawable;
-import android.net.Uri;
-import android.provider.MediaStore;
 import android.provider.Settings;
 import android.util.Log;
-import android.util.Pair;
 import android.widget.Toast;
 
 import androidx.annotation.VisibleForTesting;
 import androidx.appcompat.app.AlertDialog;
 
 import com.android.settings.R;
-import com.android.settings.homepage.AdaptiveIconShapeDrawable;
 import com.android.settings.overlay.FeatureFactory;
-import com.android.settings.widget.AdaptiveIcon;
-import com.android.settings.widget.AdaptiveOutlineDrawable;
 import com.android.settingslib.bluetooth.BluetoothUtils;
 import com.android.settingslib.bluetooth.BluetoothUtils.ErrorListener;
-import com.android.settingslib.bluetooth.CachedBluetoothDevice;
 import com.android.settingslib.bluetooth.LocalBluetoothManager;
 import com.android.settingslib.bluetooth.LocalBluetoothManager.BluetoothManagerCallback;
 
-import java.io.IOException;
-
 /**
  * Utils is a helper class that contains constants for various
  * Android resource IDs, debug logging flags, and static methods
@@ -193,54 +180,4 @@
             return META_INT_ERROR;
         }
     }
-
-    /**
-     * Get colorful bluetooth icon with description
-     */
-    public static Pair<Drawable, String> getBtRainbowDrawableWithDescription(Context context,
-            CachedBluetoothDevice cachedDevice) {
-        final Pair<Drawable, String> pair = BluetoothUtils.getBtClassDrawableWithDescription(
-                context, cachedDevice);
-        final boolean untetheredHeadset = Utils.getBooleanMetaData(cachedDevice.getDevice(),
-                BluetoothDevice.METADATA_IS_UNTHETHERED_HEADSET);
-        final int iconSize = context.getResources().getDimensionPixelSize(
-                R.dimen.bt_nearby_icon_size);
-        final Resources resources = context.getResources();
-
-        // Deal with untethered headset
-        if (untetheredHeadset) {
-            final String uriString = Utils.getStringMetaData(cachedDevice.getDevice(),
-                    BluetoothDevice.METADATA_MAIN_ICON);
-            final Uri iconUri = uriString != null ? Uri.parse(uriString) : null;
-            if (iconUri != null) {
-                try {
-                    final Bitmap bitmap = MediaStore.Images.Media.getBitmap(
-                            context.getContentResolver(), iconUri);
-                    if (bitmap != null) {
-                        final Bitmap resizedBitmap = Bitmap.createScaledBitmap(bitmap, iconSize,
-                                iconSize, false);
-                        bitmap.recycle();
-                        final AdaptiveOutlineDrawable drawable = new AdaptiveOutlineDrawable(
-                                resources, resizedBitmap);
-                        return new Pair<>(drawable, pair.second);
-                    }
-                } catch (IOException e) {
-                    Log.e(TAG, "Failed to get drawable for: " + iconUri, e);
-                }
-            }
-        }
-
-        // Deal with normal headset
-        final int[] iconFgColors = resources.getIntArray(R.array.bt_icon_fg_colors);
-        final int[] iconBgColors = resources.getIntArray(R.array.bt_icon_bg_colors);
-
-        // get color index based on mac address
-        final int index =  Math.abs(cachedDevice.getAddress().hashCode()) % iconBgColors.length;
-        pair.first.setColorFilter(iconFgColors[index], PorterDuff.Mode.SRC_ATOP);
-        final Drawable adaptiveIcon = new AdaptiveIcon(context, pair.first);
-        ((AdaptiveIcon) adaptiveIcon).setBackgroundColor(iconBgColors[index]);
-
-        return new Pair<>(adaptiveIcon, pair.second);
-    }
-
 }
diff --git a/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java b/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java
index 744cbd2..2cac4c2 100644
--- a/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java
+++ b/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java
@@ -46,12 +46,12 @@
 import com.android.settings.SettingsActivity;
 import com.android.settings.dashboard.profileselector.ProfileSelectDialog;
 import com.android.settings.overlay.FeatureFactory;
-import com.android.settings.widget.AdaptiveIcon;
 import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
 import com.android.settingslib.drawer.DashboardCategory;
 import com.android.settingslib.drawer.Tile;
 import com.android.settingslib.drawer.TileUtils;
 import com.android.settingslib.utils.ThreadUtils;
+import com.android.settingslib.widget.AdaptiveIcon;
 
 import java.util.List;
 import java.util.Map;
diff --git a/src/com/android/settings/homepage/AdaptiveIconShapeDrawable.java b/src/com/android/settings/homepage/AdaptiveIconShapeDrawable.java
deleted file mode 100644
index 62b768a..0000000
--- a/src/com/android/settings/homepage/AdaptiveIconShapeDrawable.java
+++ /dev/null
@@ -1,43 +0,0 @@
-package com.android.settings.homepage;
-
-import android.content.res.Resources;
-import android.content.res.Resources.Theme;
-import android.graphics.Path;
-import android.graphics.drawable.AdaptiveIconDrawable;
-import android.graphics.drawable.ShapeDrawable;
-import android.graphics.drawable.shapes.PathShape;
-import android.util.AttributeSet;
-import android.util.PathParser;
-
-import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlPullParserException;
-
-import java.io.IOException;
-
-/**
- * Draws a filled {@link ShapeDrawable} using the path from {@link AdaptiveIconDrawable}.
- */
-public class AdaptiveIconShapeDrawable extends ShapeDrawable {
-    public AdaptiveIconShapeDrawable() {
-        super();
-    }
-
-    public AdaptiveIconShapeDrawable(Resources resources) {
-        super();
-        init(resources);
-    }
-
-    @Override
-    public void inflate(Resources r, XmlPullParser parser, AttributeSet attrs, Theme theme)
-            throws XmlPullParserException, IOException {
-        super.inflate(r, parser, attrs, theme);
-        init(r);
-    }
-
-    private void init(Resources resources) {
-        final float pathSize = AdaptiveIconDrawable.MASK_SIZE;
-        final Path path = new Path(PathParser.createPathFromPathData(
-                resources.getString(com.android.internal.R.string.config_icon_mask)));
-        setShape(new PathShape(path, pathSize, pathSize));
-    }
-}
diff --git a/src/com/android/settings/homepage/contextualcards/slices/BluetoothDevicesSlice.java b/src/com/android/settings/homepage/contextualcards/slices/BluetoothDevicesSlice.java
index a760eff..8267df0 100644
--- a/src/com/android/settings/homepage/contextualcards/slices/BluetoothDevicesSlice.java
+++ b/src/com/android/settings/homepage/contextualcards/slices/BluetoothDevicesSlice.java
@@ -46,6 +46,7 @@
 import com.android.settings.slices.CustomSliceable;
 import com.android.settings.slices.SliceBroadcastReceiver;
 import com.android.settings.slices.SliceBuilderUtils;
+import com.android.settingslib.bluetooth.BluetoothUtils;
 import com.android.settingslib.bluetooth.CachedBluetoothDevice;
 import com.android.settingslib.bluetooth.LocalBluetoothManager;
 
@@ -211,8 +212,7 @@
     @VisibleForTesting
     IconCompat getBluetoothDeviceIcon(CachedBluetoothDevice device) {
         final Pair<Drawable, String> pair =
-                com.android.settings.bluetooth.Utils.getBtRainbowDrawableWithDescription(mContext,
-                        device);
+                BluetoothUtils.getBtRainbowDrawableWithDescription(mContext, device);
         final Drawable drawable = pair.first;
 
         // Use default bluetooth icon if can't get icon.
diff --git a/src/com/android/settings/widget/AdaptiveIcon.java b/src/com/android/settings/widget/AdaptiveIcon.java
deleted file mode 100644
index 04b33ae..0000000
--- a/src/com/android/settings/widget/AdaptiveIcon.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/*
- * 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.widget;
-
-import static androidx.annotation.VisibleForTesting.NONE;
-
-import static com.android.settingslib.drawer.TileUtils.META_DATA_PREFERENCE_ICON_BACKGROUND_ARGB;
-import static com.android.settingslib.drawer.TileUtils.META_DATA_PREFERENCE_ICON_BACKGROUND_HINT;
-
-import android.content.Context;
-import android.content.pm.PackageManager;
-import android.graphics.PorterDuff;
-import android.graphics.drawable.Drawable;
-import android.graphics.drawable.LayerDrawable;
-import android.os.Bundle;
-import android.util.Log;
-
-import androidx.annotation.VisibleForTesting;
-
-import com.android.settings.R;
-import com.android.settings.homepage.AdaptiveIconShapeDrawable;
-import com.android.settingslib.drawer.Tile;
-
-public class AdaptiveIcon extends LayerDrawable {
-
-    private static final String TAG = "AdaptiveHomepageIcon";
-
-    @VisibleForTesting(otherwise = NONE)
-    int mBackgroundColor = -1;
-    private AdaptiveConstantState mAdaptiveConstantState;
-
-    public AdaptiveIcon(Context context, Drawable foreground) {
-        super(new Drawable[]{
-                new AdaptiveIconShapeDrawable(context.getResources()),
-                foreground
-        });
-        final int insetPx = context.getResources()
-                .getDimensionPixelSize(R.dimen.dashboard_tile_foreground_image_inset);
-        setLayerInset(1 /* index */, insetPx, insetPx, insetPx, insetPx);
-        mAdaptiveConstantState = new AdaptiveConstantState(context, foreground);
-    }
-
-    public void setBackgroundColor(Context context, Tile tile) {
-        final Bundle metaData = tile.getMetaData();
-        try {
-            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(META_DATA_PREFERENCE_ICON_BACKGROUND_HINT,
-                            0 /* default */);
-                    if (colorRes != 0) {
-                        bgColor = context.getPackageManager()
-                                .getResourcesForApplication(tile.getPackageName())
-                                .getColor(colorRes, null /* theme */);
-                    }
-                }
-                // If found anything, use it.
-                if (bgColor != 0) {
-                    setBackgroundColor(bgColor);
-                    return;
-                }
-            }
-        } catch (PackageManager.NameNotFoundException e) {
-            Log.e(TAG, "Failed to set background color for " + tile.getPackageName());
-        }
-        setBackgroundColor(context.getColor(R.color.homepage_generic_icon_background));
-    }
-
-    public void setBackgroundColor(int color) {
-        mBackgroundColor = color;
-        getDrawable(0).setColorFilter(color, PorterDuff.Mode.SRC_ATOP);
-        Log.d(TAG, "Setting background color " + mBackgroundColor);
-        mAdaptiveConstantState.color = color;
-    }
-
-    @Override
-    public ConstantState getConstantState() {
-        return mAdaptiveConstantState;
-    }
-
-    @VisibleForTesting
-    static class AdaptiveConstantState extends ConstantState {
-        Context context;
-        Drawable drawable;
-        int color;
-
-        public AdaptiveConstantState(Context context, Drawable drawable) {
-            this.context = context;
-            this.drawable = drawable;
-        }
-
-        @Override
-        public Drawable newDrawable() {
-            final AdaptiveIcon icon = new AdaptiveIcon(context, drawable);
-            icon.setBackgroundColor(color);
-
-            return icon;
-        }
-
-        @Override
-        public int getChangingConfigurations() {
-            return 0;
-        }
-    }
-}
diff --git a/src/com/android/settings/widget/AdaptiveOutlineDrawable.java b/src/com/android/settings/widget/AdaptiveOutlineDrawable.java
deleted file mode 100644
index 84c4e2f..0000000
--- a/src/com/android/settings/widget/AdaptiveOutlineDrawable.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * Copyright (C) 2019 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.widget;
-
-import android.content.res.Resources;
-import android.graphics.Bitmap;
-import android.graphics.Canvas;
-import android.graphics.Color;
-import android.graphics.Paint;
-import android.graphics.Path;
-import android.graphics.Rect;
-import android.graphics.drawable.AdaptiveIconDrawable;
-import android.graphics.drawable.DrawableWrapper;
-import android.util.PathParser;
-
-import androidx.annotation.VisibleForTesting;
-
-import com.android.settings.R;
-import com.android.settings.homepage.AdaptiveIconShapeDrawable;
-
-/**
- * Adaptive outline drawable with white plain background color and black outline
- */
-public class AdaptiveOutlineDrawable extends DrawableWrapper {
-    @VisibleForTesting
-    final Paint mOutlinePaint;
-    private Path mPath;
-    private final int mInsetPx;
-    private final Bitmap mBitmap;
-
-    public AdaptiveOutlineDrawable(Resources resources, Bitmap bitmap) {
-        super(new AdaptiveIconShapeDrawable(resources));
-
-        getDrawable().setTint(Color.WHITE);
-        mPath = new Path(PathParser.createPathFromPathData(
-                resources.getString(com.android.internal.R.string.config_icon_mask)));
-        mOutlinePaint = new Paint();
-        mOutlinePaint.setColor(resources.getColor(R.color.bt_outline_color, null));
-        mOutlinePaint.setStyle(Paint.Style.STROKE);
-        mOutlinePaint.setStrokeWidth(resources.getDimension(R.dimen.adaptive_outline_stroke));
-        mOutlinePaint.setAntiAlias(true);
-
-        mInsetPx = resources
-                .getDimensionPixelSize(R.dimen.dashboard_tile_foreground_image_inset);
-        mBitmap = bitmap;
-    }
-
-    @Override
-    public void draw(Canvas canvas) {
-        super.draw(canvas);
-        final Rect bounds = getBounds();
-        final float pathSize = AdaptiveIconDrawable.MASK_SIZE;
-
-        final float scaleX = (bounds.right - bounds.left) / pathSize;
-        final float scaleY = (bounds.bottom - bounds.top) / pathSize;
-
-        final int count = canvas.save();
-        canvas.scale(scaleX, scaleY);
-        // Draw outline
-        canvas.drawPath(mPath, mOutlinePaint);
-        canvas.restoreToCount(count);
-
-        // Draw the foreground icon
-        canvas.drawBitmap(mBitmap, bounds.left + mInsetPx, bounds.top + mInsetPx, null);
-    }
-
-    @Override
-    public int getIntrinsicHeight() {
-        return mBitmap.getHeight() + 2 * mInsetPx;
-    }
-
-    @Override
-    public int getIntrinsicWidth() {
-        return mBitmap.getWidth() + 2 * mInsetPx;
-    }
-}
diff --git a/tests/robotests/src/com/android/settings/bluetooth/UtilsTest.java b/tests/robotests/src/com/android/settings/bluetooth/UtilsTest.java
index a956518..ee79d61 100644
--- a/tests/robotests/src/com/android/settings/bluetooth/UtilsTest.java
+++ b/tests/robotests/src/com/android/settings/bluetooth/UtilsTest.java
@@ -29,8 +29,6 @@
 
 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
 import com.android.settings.testutils.FakeFeatureFactory;
-import com.android.settings.widget.AdaptiveIcon;
-import com.android.settingslib.bluetooth.CachedBluetoothDevice;
 import com.android.settingslib.bluetooth.LocalBluetoothManager;
 import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
 
@@ -41,7 +39,6 @@
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
 
 @RunWith(RobolectricTestRunner.class)
 public class UtilsTest {
@@ -54,8 +51,6 @@
     private Context mContext;
     @Mock
     private BluetoothDevice mBluetoothDevice;
-    @Mock
-    private CachedBluetoothDevice mCachedBluetoothDevice;
 
     private MetricsFeatureProvider mMetricsFeatureProvider;
 
@@ -111,17 +106,4 @@
         assertThat(Utils.getBooleanMetaData(mBluetoothDevice,
                 BluetoothDevice.METADATA_IS_UNTHETHERED_HEADSET)).isEqualTo(true);
     }
-
-    @Test
-    public void getBtRainbowDrawableWithDescription_normalHeadset_returnAdaptiveIcon() {
-        when(mBluetoothDevice.getMetadata(
-                BluetoothDevice.METADATA_IS_UNTHETHERED_HEADSET)).thenReturn("false");
-        when(mCachedBluetoothDevice.getDevice()).thenReturn(mBluetoothDevice);
-        when(mCachedBluetoothDevice.getAddress()).thenReturn("1f:aa:bb");
-
-        assertThat(Utils.getBtRainbowDrawableWithDescription(RuntimeEnvironment.application,
-                mCachedBluetoothDevice).first).isInstanceOf(
-                AdaptiveIcon.class);
-    }
-
 }
diff --git a/tests/robotests/src/com/android/settings/widget/AdaptiveIconTest.java b/tests/robotests/src/com/android/settings/widget/AdaptiveIconTest.java
deleted file mode 100644
index 1be3332..0000000
--- a/tests/robotests/src/com/android/settings/widget/AdaptiveIconTest.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/*
- * 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.widget;
-
-import static com.android.settingslib.drawer.TileUtils.META_DATA_PREFERENCE_ICON_BACKGROUND_ARGB;
-import static com.android.settingslib.drawer.TileUtils.META_DATA_PREFERENCE_ICON_BACKGROUND_HINT;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.mock;
-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.pm.ActivityInfo;
-import android.graphics.Color;
-import android.graphics.PorterDuff;
-import android.graphics.drawable.ColorDrawable;
-import android.graphics.drawable.Icon;
-import android.graphics.drawable.ShapeDrawable;
-import android.os.Bundle;
-
-import com.android.settings.R;
-import com.android.settings.homepage.AdaptiveIconShapeDrawable;
-import com.android.settingslib.drawer.CategoryKey;
-import com.android.settingslib.drawer.Tile;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-
-@RunWith(RobolectricTestRunner.class)
-public class AdaptiveIconTest {
-
-    private Context mContext;
-    private ActivityInfo mActivityInfo;
-
-    @Before
-    public void setUp() {
-        mContext = RuntimeEnvironment.application;
-        mActivityInfo = new ActivityInfo();
-        mActivityInfo.packageName = mContext.getPackageName();
-        mActivityInfo.name = "class";
-        mActivityInfo.metaData = new Bundle();
-    }
-
-    @Test
-    public void createIcon_shouldSetBackgroundAndInset() {
-        final AdaptiveIcon icon =
-                new AdaptiveIcon(mContext, new ColorDrawable(Color.BLACK));
-
-        assertThat(icon.getNumberOfLayers()).isEqualTo(2);
-        assertThat(icon.getDrawable(0)).isInstanceOf(AdaptiveIconShapeDrawable.class);
-    }
-
-    @Test
-    public void setBackgroundColor_shouldUpdateColorFilter() {
-        final AdaptiveIcon icon =
-                spy(new AdaptiveIcon(mContext, new ColorDrawable(Color.BLACK)));
-        final ShapeDrawable background = mock(ShapeDrawable.class);
-        when(icon.getDrawable(0)).thenReturn(background);
-
-        icon.setBackgroundColor(Color.BLUE);
-
-        verify(background).setColorFilter(Color.BLUE, PorterDuff.Mode.SRC_ATOP);
-    }
-
-    @Test
-    public void setBackgroundColor_externalTileWithBackgroundColorRawValue_shouldUpdateIcon() {
-        final Tile tile = spy(new Tile(mActivityInfo, CategoryKey.CATEGORY_HOMEPAGE));
-        mActivityInfo.metaData.putInt(META_DATA_PREFERENCE_ICON_BACKGROUND_ARGB, 0xff0000);
-        doReturn(Icon.createWithResource(mContext, R.drawable.ic_settings_accent))
-                .when(tile).getIcon(mContext);
-        final AdaptiveIcon icon =
-                new AdaptiveIcon(mContext, new ColorDrawable(Color.BLACK));
-
-        icon.setBackgroundColor(mContext, tile);
-        assertThat(icon.mBackgroundColor).isEqualTo(0xff0000);
-    }
-
-    @Test
-    public void setBackgroundColor_tileWithoutBackgroundColor_shouldSetDefaultBackgroundColor() {
-        final Tile tile = spy(new Tile(mActivityInfo, CategoryKey.CATEGORY_HOMEPAGE));
-        doReturn(Icon.createWithResource(mContext, R.drawable.ic_settings_accent))
-            .when(tile).getIcon(mContext);
-        final AdaptiveIcon icon =
-            new AdaptiveIcon(mContext, new ColorDrawable(Color.BLACK));
-
-        icon.setBackgroundColor(mContext, tile);
-
-        assertThat(icon.mBackgroundColor).isEqualTo(
-            mContext.getColor(R.color.homepage_generic_icon_background));
-    }
-
-    @Test
-    public void onBindTile_externalTileWithBackgroundColorHint_shouldUpdateIcon() {
-        final Tile tile = spy(new Tile(mActivityInfo, CategoryKey.CATEGORY_HOMEPAGE));
-        mActivityInfo.metaData.putInt(META_DATA_PREFERENCE_ICON_BACKGROUND_HINT,
-                R.color.material_blue_500);
-        doReturn(Icon.createWithResource(mContext, R.drawable.ic_settings_accent))
-                .when(tile).getIcon(mContext);
-
-        final AdaptiveIcon icon =
-                new AdaptiveIcon(mContext, new ColorDrawable(Color.BLACK));
-        icon.setBackgroundColor(mContext, tile);
-
-        assertThat(icon.mBackgroundColor)
-                .isEqualTo(mContext.getColor(R.color.material_blue_500));
-    }
-
-    @Test
-    public void getConstantState_returnCorrectState() {
-        final AdaptiveIcon icon =
-                new AdaptiveIcon(mContext, new ColorDrawable(Color.BLACK));
-        icon.setBackgroundColor(Color.YELLOW);
-
-        final AdaptiveIcon.AdaptiveConstantState state =
-                (AdaptiveIcon.AdaptiveConstantState) icon.getConstantState();
-
-        assertThat(state.color).isEqualTo(Color.YELLOW);
-        assertThat(state.context).isEqualTo(mContext);
-    }
-}
diff --git a/tests/robotests/src/com/android/settings/widget/AdaptiveOutlineDrawableTest.java b/tests/robotests/src/com/android/settings/widget/AdaptiveOutlineDrawableTest.java
deleted file mode 100644
index f21fc34..0000000
--- a/tests/robotests/src/com/android/settings/widget/AdaptiveOutlineDrawableTest.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Copyright (C) 2019 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.widget;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import android.content.res.Resources;
-import android.graphics.Paint;
-
-import com.android.settings.R;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-
-@RunWith(RobolectricTestRunner.class)
-public class AdaptiveOutlineDrawableTest {
-
-    @Test
-    public void constructor_initPaint() {
-        final Resources resources = RuntimeEnvironment.application.getResources();
-        final AdaptiveOutlineDrawable drawable = new AdaptiveOutlineDrawable(resources, null);
-
-        assertThat(drawable.mOutlinePaint.getStyle()).isEqualTo(Paint.Style.STROKE);
-        assertThat(drawable.mOutlinePaint.getStrokeWidth()).isWithin(0.01f).of(
-                resources.getDimension(R.dimen.adaptive_outline_stroke));
-    }
-
-}
