Merge "Removing number of threads used in background execution to prevent system thrashing" into sc-dev
diff --git a/go/quickstep/res/layout/overview_actions_container.xml b/go/quickstep/res/layout/overview_actions_container.xml
index 6a331ea..b36214b 100644
--- a/go/quickstep/res/layout/overview_actions_container.xml
+++ b/go/quickstep/res/layout/overview_actions_container.xml
@@ -24,11 +24,15 @@
     <LinearLayout
         android:id="@+id/action_buttons"
         android:layout_width="match_parent"
-        android:layout_height="wrap_content"
+        android:layout_height="@dimen/overview_actions_height"
         android:layout_gravity="top|center_horizontal"
         android:orientation="horizontal">
 
         <Space
+            android:layout_width="@dimen/go_overview_button_width"
+            android:layout_height="1dp" />
+
+        <Space
             android:layout_width="0dp"
             android:layout_height="1dp"
             android:layout_weight="1" />
@@ -86,6 +90,10 @@
             android:layout_height="1dp"
             android:layout_weight="1" />
 
+        <Space
+            android:layout_width="@dimen/go_overview_button_width"
+            android:layout_height="1dp" />
+
         <!-- Will be enabled in a future version. -->
         <LinearLayout
             style="@style/GoOverviewActionButtonContainer"
diff --git a/go/quickstep/res/values-kk/strings.xml b/go/quickstep/res/values-kk/strings.xml
index ed59c9c..c897dd8 100644
--- a/go/quickstep/res/values-kk/strings.xml
+++ b/go/quickstep/res/values-kk/strings.xml
@@ -4,5 +4,5 @@
     <string name="app_share_drop_target_label" msgid="5804774105974539508">"Қолданбаны бөлісу"</string>
     <string name="action_listen" msgid="2370304050784689486">"Тыңдау"</string>
     <string name="action_translate" msgid="8028378961867277746">"Аудару"</string>
-    <string name="action_search" msgid="6269564710943755464">"Lens"</string>
+    <string name="action_search" msgid="6269564710943755464">"Объектив"</string>
 </resources>
diff --git a/go/quickstep/res/values-sq/strings.xml b/go/quickstep/res/values-sq/strings.xml
new file mode 100644
index 0000000..56b6ec6
--- /dev/null
+++ b/go/quickstep/res/values-sq/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_share_drop_target_label" msgid="5804774105974539508">"Ndaj aplikacionin"</string>
+    <string name="action_listen" msgid="2370304050784689486">"Dëgjo"</string>
+    <string name="action_translate" msgid="8028378961867277746">"Përkthe"</string>
+    <string name="action_search" msgid="6269564710943755464">"Lentja"</string>
+</resources>
diff --git a/go/quickstep/res/values/dimens.xml b/go/quickstep/res/values/dimens.xml
index cb260b5..da684fa 100644
--- a/go/quickstep/res/values/dimens.xml
+++ b/go/quickstep/res/values/dimens.xml
@@ -23,4 +23,8 @@
     <dimen name="go_overview_button_height">60dp</dimen>
     <dimen name="go_overview_button_container_width">80dp</dimen>
     <dimen name="go_overview_button_caption_margin">8dp</dimen>
+    <dimen name="overview_actions_height">96dp</dimen>
+    <dimen name="overview_proactive_row_height">0dp</dimen>
+    <dimen name="overview_proactive_row_bottom_margin">24dp</dimen>
+    <dimen name="task_corner_radius_override">28dp</dimen>
 </resources>
diff --git a/go/quickstep/res/values/styles.xml b/go/quickstep/res/values/styles.xml
index df49ecd..9b3fe67 100644
--- a/go/quickstep/res/values/styles.xml
+++ b/go/quickstep/res/values/styles.xml
@@ -25,7 +25,7 @@
     </style>
 
     <style name="GoOverviewActionButtonCaption">
-        <item name="android:fontFamily">roboto-medium</item>
+        <item name="android:fontFamily">sans-serif-medium</item>
         <item name="android:textSize">14dp</item>
         <item name="android:textColor">@color/go_overview_button_icon_color</item>
         <item name="android:lineHeight">20dp</item>
diff --git a/quickstep/res/values/dimens.xml b/quickstep/res/values/dimens.xml
index 632bb4c..420c145 100644
--- a/quickstep/res/values/dimens.xml
+++ b/quickstep/res/values/dimens.xml
@@ -19,6 +19,8 @@
     <dimen name="task_thumbnail_icon_size_grid">32dp</dimen>
     <!-- For screens without rounded corners -->
     <dimen name="task_corner_radius_small">2dp</dimen>
+    <!-- For Launchers that want to override the default dialog corner radius -->
+    <dimen name="task_corner_radius_override">-1dp</dimen>
 
     <dimen name="overview_proactive_row_height">48dp</dimen>
     <dimen name="overview_proactive_row_bottom_margin">16dp</dimen>
diff --git a/quickstep/src/com/android/quickstep/TaskAnimationManager.java b/quickstep/src/com/android/quickstep/TaskAnimationManager.java
index e90a1ab..29ddde0 100644
--- a/quickstep/src/com/android/quickstep/TaskAnimationManager.java
+++ b/quickstep/src/com/android/quickstep/TaskAnimationManager.java
@@ -168,7 +168,8 @@
         if (ENABLE_SHELL_TRANSITIONS) {
             RemoteTransitionCompat transition = new RemoteTransitionCompat(mCallbacks,
                     mController != null ? mController.getController() : null);
-            Bundle options = ActivityOptionsCompat.makeRemoteTransition(transition).toBundle();
+            Bundle options = ActivityOptionsCompat.makeRemoteTransition(transition)
+                    .setTransientLaunch().toBundle();
             mCtx.startActivity(intent, options);
         } else {
             UI_HELPER_EXECUTOR.execute(() -> ActivityManagerWrapper.getInstance()
diff --git a/quickstep/src/com/android/quickstep/util/TaskCornerRadius.java b/quickstep/src/com/android/quickstep/util/TaskCornerRadius.java
index 3ddf1b6..6f9c99a 100644
--- a/quickstep/src/com/android/quickstep/util/TaskCornerRadius.java
+++ b/quickstep/src/com/android/quickstep/util/TaskCornerRadius.java
@@ -18,6 +18,7 @@
 import static com.android.systemui.shared.system.QuickStepContract.supportsRoundedCornersOnWindows;
 
 import android.content.Context;
+import android.content.res.Resources;
 
 import com.android.launcher3.R;
 import com.android.launcher3.util.Themes;
@@ -25,8 +26,13 @@
 public class TaskCornerRadius {
 
     public static float get(Context context) {
-        return supportsRoundedCornersOnWindows(context.getResources()) ?
-                Themes.getDialogCornerRadius(context):
-                context.getResources().getDimension(R.dimen.task_corner_radius_small);
+        Resources resources = context.getResources();
+        if (!supportsRoundedCornersOnWindows(resources)) {
+            return resources.getDimension(R.dimen.task_corner_radius_small);
+        }
+
+        float overriddenRadius =
+                resources.getDimension(R.dimen.task_corner_radius_override);
+        return (overriddenRadius > 0) ? overriddenRadius : Themes.getDialogCornerRadius(context);
     }
 }
diff --git a/quickstep/src/com/android/quickstep/views/RecentsView.java b/quickstep/src/com/android/quickstep/views/RecentsView.java
index 4cdae27..64c3174 100644
--- a/quickstep/src/com/android/quickstep/views/RecentsView.java
+++ b/quickstep/src/com/android/quickstep/views/RecentsView.java
@@ -362,7 +362,6 @@
     private final PointF mTempPointF = new PointF();
     private final float[] mTempFloat = new float[1];
     private final List<OnScrollChangedListener> mScrollListeners = new ArrayList<>();
-    private float mFullscreenScale;
 
     // The threshold at which we update the SystemUI flags when animating from the task into the app
     public static final float UPDATE_SYSUI_FLAGS_THRESHOLD = 0.85f;
@@ -1329,8 +1328,6 @@
             // Compensate space caused by TaskView scaling.
             float widthDiff =
                     taskView.getLayoutParams().width * (1 - taskView.getFullscreenScale());
-            // Compensate page spacing widening caused by RecentsView scaling.
-            widthDiff += mPageSpacing * (1 - 1 / mFullscreenScale);
             accumulatedTranslationX += mIsRtl ? widthDiff : -widthDiff;
         }
 
@@ -2615,16 +2612,6 @@
     @Override
     protected void onConfigurationChanged(Configuration newConfig) {
         super.onConfigurationChanged(newConfig);
-        if (LIVE_TILE.get()) {
-            switchToScreenshot(
-                    () -> finishRecentsAnimation(true /* toRecents */,
-                            this::onConfigurationChangedInternal));
-        } else {
-            onConfigurationChangedInternal();
-        }
-    }
-
-    private void onConfigurationChangedInternal() {
         final int rotation = mActivity.getDisplay().getRotation();
         if (mOrientationState.setRecentsRotation(rotation)) {
             updateOrientationHandler();
@@ -2711,8 +2698,8 @@
 
         // Update the pivots such that when the task is scaled, it fills the full page
         getTaskSize(mTempRect);
-        mFullscreenScale = getPagedViewOrientedState().getFullScreenScaleAndPivot(
-                mTempRect, mActivity.getDeviceProfile(), mTempPointF);
+        getPagedViewOrientedState().getFullScreenScaleAndPivot(mTempRect,
+                mActivity.getDeviceProfile(), mTempPointF);
         setPivotX(mTempPointF.x);
         setPivotY(mTempPointF.y);
         setTaskModalness(mTaskModalness);
diff --git a/res/layout/all_apps_personal_work_tabs.xml b/res/layout/all_apps_personal_work_tabs.xml
index 31fa5cf..f089f83 100644
--- a/res/layout/all_apps_personal_work_tabs.xml
+++ b/res/layout/all_apps_personal_work_tabs.xml
@@ -1,5 +1,4 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
+<?xml version="1.0" encoding="utf-8"?><!--
   ~ Copyright (C) 2021 The Android Open Source Project
   ~
   ~ Licensed under the Apache License, Version 2.0 (the "License");
@@ -15,8 +14,7 @@
   ~ limitations under the License.
 -->
 
-<com.android.launcher3.workprofile.PersonalWorkSlidingTabStrip
-    xmlns:android="http://schemas.android.com/apk/res/android"
+<com.android.launcher3.workprofile.PersonalWorkSlidingTabStrip xmlns:android="http://schemas.android.com/apk/res/android"
     android:id="@+id/tabs"
     android:layout_width="match_parent"
     android:layout_height="@dimen/all_apps_header_pill_height"
diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml
index 49bc7fd..90c98fb 100644
--- a/res/values-fr/strings.xml
+++ b/res/values-fr/strings.xml
@@ -48,8 +48,8 @@
     <string name="widgets_full_sheet_cancel_button_description" msgid="5766167035728653605">"Effacer le texte du champ de recherche"</string>
     <string name="no_widgets_available" msgid="9140948620298620513">"Aucun widget disponible"</string>
     <string name="no_search_results" msgid="6518732304311458580">"Aucun résultat de recherche"</string>
-    <string name="widgets_full_sheet_personal_tab" msgid="2743540105607120182">"Widgets personnels"</string>
-    <string name="widgets_full_sheet_work_tab" msgid="3767150027110633765">"Widgets professionnels"</string>
+    <string name="widgets_full_sheet_personal_tab" msgid="2743540105607120182">"Personnels"</string>
+    <string name="widgets_full_sheet_work_tab" msgid="3767150027110633765">"Professionnels"</string>
     <string name="widget_category_conversations" msgid="8894438636213590446">"Conversations"</string>
     <string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Rechercher dans les applications"</string>
     <string name="all_apps_loading_message" msgid="5813968043155271636">"Chargement des applications…"</string>
diff --git a/res/values-sq/strings.xml b/res/values-sq/strings.xml
index 68ffed6..2528aed 100644
--- a/res/values-sq/strings.xml
+++ b/res/values-sq/strings.xml
@@ -97,8 +97,7 @@
     <string name="folder_name_format_exact" msgid="8626242716117004803">"Dosja: <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="SIZE">%2$d</xliff:g> artikuj"</string>
     <string name="folder_name_format_overflow" msgid="4270108890534995199">"Dosja: <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="SIZE">%2$d</xliff:g> ose më shumë artikuj"</string>
     <string name="wallpaper_button_text" msgid="8404103075899945851">"Imazhet e sfondit"</string>
-    <!-- no translation found for styles_wallpaper_button_text (8216961355289236794) -->
-    <skip />
+    <string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Imazhi i sfondit dhe stili"</string>
     <string name="settings_button_text" msgid="8873672322605444408">"Cilësimet e ekranit bazë"</string>
     <string name="msg_disabled_by_admin" msgid="6898038085516271325">"Çaktivizuar nga administratori"</string>
     <string name="allow_rotation_title" msgid="7728578836261442095">"Lejo rrotullimin e ekranit bazë"</string>
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index fd1a29c..451f82b 100644
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -93,6 +93,7 @@
     <dimen name="all_apps_background_canvas_height">475dp</dimen>
     <dimen name="all_apps_header_pill_height">36dp</dimen>
     <dimen name="all_apps_header_pill_corner_radius">18dp</dimen>
+    <dimen name="all_apps_header_pills_width">320dp</dimen>
     <dimen name="all_apps_header_tab_height">48dp</dimen>
     <dimen name="all_apps_tabs_indicator_height">2dp</dimen>
     <dimen name="all_apps_header_top_padding">36dp</dimen>
diff --git a/src/com/android/launcher3/LauncherAppState.java b/src/com/android/launcher3/LauncherAppState.java
index 834b5a7..b6cc6d6 100644
--- a/src/com/android/launcher3/LauncherAppState.java
+++ b/src/com/android/launcher3/LauncherAppState.java
@@ -24,6 +24,8 @@
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
+import android.content.SharedPreferences;
+import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
 import android.content.pm.LauncherApps;
 import android.os.UserHandle;
 import android.util.Log;
@@ -45,6 +47,7 @@
 import com.android.launcher3.util.SafeCloseable;
 import com.android.launcher3.util.SettingsCache;
 import com.android.launcher3.util.SimpleBroadcastReceiver;
+import com.android.launcher3.util.Themes;
 import com.android.launcher3.widget.custom.CustomWidgetManager;
 
 public class LauncherAppState {
@@ -108,6 +111,12 @@
                 observer, MODEL_EXECUTOR.getHandler());
         mOnTerminateCallback.add(iconChangeTracker::close);
         MODEL_EXECUTOR.execute(observer::verifyIconChanged);
+        if (ENABLE_THEMED_ICONS.get()) {
+            SharedPreferences prefs = Utilities.getPrefs(mContext);
+            prefs.registerOnSharedPreferenceChangeListener(observer);
+            mOnTerminateCallback.add(
+                    () -> prefs.unregisterOnSharedPreferenceChangeListener(observer));
+        }
 
         InstallSessionTracker installSessionTracker =
                 InstallSessionHelper.INSTANCE.get(context).registerInstallTracker(mModel);
@@ -128,7 +137,7 @@
         mContext = context;
 
         mInvariantDeviceProfile = InvariantDeviceProfile.INSTANCE.get(context);
-        mIconProvider =  new IconProvider(context, ENABLE_THEMED_ICONS.get());
+        mIconProvider =  new IconProvider(context, Themes.isThemedIconEnabled(context));
         mIconCache = new IconCache(mContext, mInvariantDeviceProfile,
                 iconCacheFileName, mIconProvider);
         mWidgetCache = new WidgetPreviewLoader(mContext, mIconCache);
@@ -187,7 +196,8 @@
         return InvariantDeviceProfile.INSTANCE.get(context);
     }
 
-    private class IconObserver implements IconProvider.IconChangeListener {
+    private class IconObserver
+            implements IconProvider.IconChangeListener, OnSharedPreferenceChangeListener {
 
         @Override
         public void onAppIconChanged(String packageName, UserHandle user) {
@@ -207,5 +217,13 @@
                 onSystemIconStateChanged(iconState);
             }
         }
+
+        @Override
+        public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
+            if (Themes.KEY_THEMED_ICONS.equals(key)) {
+                mIconProvider.setIconThemeSupported(Themes.isThemedIconEnabled(mContext));
+                verifyIconChanged();
+            }
+        }
     }
 }
diff --git a/src/com/android/launcher3/allapps/AllAppsContainerView.java b/src/com/android/launcher3/allapps/AllAppsContainerView.java
index 1620d08..9df95bf 100644
--- a/src/com/android/launcher3/allapps/AllAppsContainerView.java
+++ b/src/com/android/launcher3/allapps/AllAppsContainerView.java
@@ -720,7 +720,7 @@
         mHeaderPaint.setColor(mHeaderColor);
         mHeaderPaint.setAlpha((int) (getAlpha() * Color.alpha(mHeaderColor)));
         if (mHeaderPaint.getColor() != mScrimColor && mHeaderPaint.getColor() != 0) {
-            canvas.drawRect(0, 0, getWidth(), mHeaderTopPadding + getTranslationY(),
+            canvas.drawRect(0, 0, getWidth(), mSearchContainer.getTop() + getTranslationY(),
                     mHeaderPaint);
         }
     }
@@ -830,10 +830,13 @@
 
     protected void updateHeaderScroll(int scrolledOffset) {
         float prog = Math.max(0, Math.min(1, (float) scrolledOffset / mHeaderThreshold));
-        int headerColor = ColorUtils.setAlphaComponent(mHeaderProtectionColor, (int) (prog * 255));
+        int viewBG = ColorUtils.blendARGB(mScrimColor, mHeaderProtectionColor, prog);
+        int headerColor = ColorUtils.setAlphaComponent(viewBG,
+                (int) (getSearchView().getAlpha() * 255));
         if (headerColor != mHeaderColor) {
             mHeaderColor = headerColor;
-            getSearchView().setBackgroundColor(mHeaderColor);
+            getSearchView().setBackgroundColor(viewBG);
+            getFloatingHeaderView().setHeaderColor(viewBG);
             invalidateHeader();
         }
     }
diff --git a/src/com/android/launcher3/allapps/FloatingHeaderView.java b/src/com/android/launcher3/allapps/FloatingHeaderView.java
index 733d867..f55ab25 100644
--- a/src/com/android/launcher3/allapps/FloatingHeaderView.java
+++ b/src/com/android/launcher3/allapps/FloatingHeaderView.java
@@ -17,6 +17,9 @@
 
 import android.animation.ValueAnimator;
 import android.content.Context;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.Paint;
 import android.graphics.Point;
 import android.graphics.Rect;
 import android.util.ArrayMap;
@@ -50,26 +53,28 @@
     private final Rect mClip = new Rect(0, 0, Integer.MAX_VALUE, Integer.MAX_VALUE);
     private final ValueAnimator mAnimator = ValueAnimator.ofInt(0, 0);
     private final Point mTempOffset = new Point();
-    private final RecyclerView.OnScrollListener mOnScrollListener = new RecyclerView.OnScrollListener() {
-        @Override
-        public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
-        }
+    private final Paint mBGPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
+    private final RecyclerView.OnScrollListener mOnScrollListener =
+            new RecyclerView.OnScrollListener() {
+                @Override
+                public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
+                }
 
-        @Override
-        public void onScrolled(RecyclerView rv, int dx, int dy) {
-            if (rv != mCurrentRV) {
-                return;
-            }
+                @Override
+                public void onScrolled(RecyclerView rv, int dx, int dy) {
+                    if (rv != mCurrentRV) {
+                        return;
+                    }
 
-            if (mAnimator.isStarted()) {
-                mAnimator.cancel();
-            }
+                    if (mAnimator.isStarted()) {
+                        mAnimator.cancel();
+                    }
 
-            int current = -mCurrentRV.getCurrentScrollY();
-            moved(current);
-            applyVerticalMove();
-        }
-    };
+                    int current = -mCurrentRV.getCurrentScrollY();
+                    moved(current);
+                    applyVerticalMove();
+                }
+            };
 
     private final int mHeaderTopPadding;
 
@@ -80,9 +85,10 @@
     private AllAppsRecyclerView mWorkRV;
     private AllAppsRecyclerView mCurrentRV;
     private ViewGroup mParent;
-    private boolean mHeaderCollapsed;
+    public boolean mHeaderCollapsed;
     private int mSnappedScrolledY;
     private int mTranslationY;
+    private int mHeaderColor;
 
     private boolean mForwardToRecyclerView;
 
@@ -219,7 +225,7 @@
     }
 
     private AllAppsRecyclerView setupRV(AllAppsRecyclerView old, AllAppsRecyclerView updated) {
-        if (old != updated && updated != null ) {
+        if (old != updated && updated != null) {
             updated.addOnScrollListener(mOnScrollListener);
         }
         return updated;
@@ -262,6 +268,7 @@
                 }
             } else {
                 mHeaderCollapsed = false;
+                invalidate();
             }
             mTranslationY = currentScrollY;
         } else if (!mHeaderCollapsed) {
@@ -274,10 +281,28 @@
             } else if (mTranslationY <= -mMaxTranslation) { // hide or stay hidden
                 mHeaderCollapsed = true;
                 mSnappedScrolledY = -mMaxTranslation;
+                invalidate();
             }
         }
     }
 
+    /**
+     * Set current header protection background color
+     */
+    public void setHeaderColor(int color) {
+        mHeaderColor = color;
+        invalidate();
+    }
+
+    @Override
+    protected void dispatchDraw(Canvas canvas) {
+        if (mHeaderCollapsed && mHeaderColor != Color.TRANSPARENT) {
+            mBGPaint.setColor(mHeaderColor);
+            canvas.drawRect(0, 0, getWidth(), getHeight() + mTranslationY, mBGPaint);
+        }
+        super.dispatchDraw(canvas);
+    }
+
     protected void applyVerticalMove() {
         int uncappedTranslationY = mTranslationY;
         mTranslationY = Math.max(mTranslationY, -mMaxTranslation);
diff --git a/src/com/android/launcher3/graphics/GridCustomizationsProvider.java b/src/com/android/launcher3/graphics/GridCustomizationsProvider.java
index cb42e7a..a03e48d 100644
--- a/src/com/android/launcher3/graphics/GridCustomizationsProvider.java
+++ b/src/com/android/launcher3/graphics/GridCustomizationsProvider.java
@@ -1,5 +1,9 @@
 package com.android.launcher3.graphics;
 
+import static com.android.launcher3.Utilities.getPrefs;
+import static com.android.launcher3.util.Themes.KEY_THEMED_ICONS;
+import static com.android.launcher3.util.Themes.isThemedIconEnabled;
+
 import android.content.ContentProvider;
 import android.content.ContentValues;
 import android.content.pm.PackageManager;
@@ -15,6 +19,7 @@
 import com.android.launcher3.InvariantDeviceProfile;
 import com.android.launcher3.InvariantDeviceProfile.GridOption;
 import com.android.launcher3.R;
+import com.android.launcher3.config.FeatureFlags;
 
 import org.xmlpull.v1.XmlPullParser;
 import org.xmlpull.v1.XmlPullParserException;
@@ -55,6 +60,11 @@
 
     private static final String METHOD_GET_PREVIEW = "get_preview";
 
+    private static final String GET_ICON_THEMED = "/get_icon_themed";
+    private static final String SET_ICON_THEMED = "/set_icon_themed";
+    private static final String ICON_THEMED = "/icon_themed";
+    private static final String BOOLEAN_VALUE = "boolean_value";
+
     @Override
     public boolean onCreate() {
         return true;
@@ -63,22 +73,31 @@
     @Override
     public Cursor query(Uri uri, String[] projection, String selection,
             String[] selectionArgs, String sortOrder) {
-        if (!KEY_LIST_OPTIONS.equals(uri.getPath())) {
-            return null;
+        switch (uri.getPath()) {
+            case KEY_LIST_OPTIONS: {
+                MatrixCursor cursor = new MatrixCursor(new String[] {
+                        KEY_NAME, KEY_ROWS, KEY_COLS, KEY_PREVIEW_COUNT, KEY_IS_DEFAULT});
+                InvariantDeviceProfile idp = InvariantDeviceProfile.INSTANCE.get(getContext());
+                for (GridOption gridOption : parseAllGridOptions()) {
+                    cursor.newRow()
+                            .add(KEY_NAME, gridOption.name)
+                            .add(KEY_ROWS, gridOption.numRows)
+                            .add(KEY_COLS, gridOption.numColumns)
+                            .add(KEY_PREVIEW_COUNT, 1)
+                            .add(KEY_IS_DEFAULT, idp.numColumns == gridOption.numColumns
+                                    && idp.numRows == gridOption.numRows);
+                }
+                return cursor;
+            }
+            case GET_ICON_THEMED:
+            case ICON_THEMED: {
+                MatrixCursor cursor = new MatrixCursor(new String[] {BOOLEAN_VALUE});
+                cursor.newRow().add(BOOLEAN_VALUE, isThemedIconEnabled(getContext()) ? 1 : 0);
+                return cursor;
+            }
+            default:
+                return null;
         }
-        MatrixCursor cursor = new MatrixCursor(new String[] {
-                KEY_NAME, KEY_ROWS, KEY_COLS, KEY_PREVIEW_COUNT, KEY_IS_DEFAULT});
-        InvariantDeviceProfile idp = InvariantDeviceProfile.INSTANCE.get(getContext());
-        for (GridOption gridOption : parseAllGridOptions()) {
-            cursor.newRow()
-                    .add(KEY_NAME, gridOption.name)
-                    .add(KEY_ROWS, gridOption.numRows)
-                    .add(KEY_COLS, gridOption.numColumns)
-                    .add(KEY_PREVIEW_COUNT, 1)
-                    .add(KEY_IS_DEFAULT, idp.numColumns == gridOption.numColumns
-                            && idp.numRows == gridOption.numRows);
-        }
-        return cursor;
     }
 
     private List<GridOption> parseAllGridOptions() {
@@ -117,25 +136,37 @@
 
     @Override
     public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
-        if (!KEY_DEFAULT_GRID.equals(uri.getPath())) {
-            return 0;
-        }
+        switch (uri.getPath()) {
+            case KEY_DEFAULT_GRID: {
+                String gridName = values.getAsString(KEY_NAME);
+                // Verify that this is a valid grid option
+                GridOption match = null;
+                for (GridOption option : parseAllGridOptions()) {
+                    if (option.name.equals(gridName)) {
+                        match = option;
+                        break;
+                    }
+                }
+                if (match == null) {
+                    return 0;
+                }
 
-        String gridName = values.getAsString(KEY_NAME);
-        // Verify that this is a valid grid option
-        GridOption match = null;
-        for (GridOption option : parseAllGridOptions()) {
-            if (option.name.equals(gridName)) {
-                match = option;
-                break;
+                InvariantDeviceProfile.INSTANCE.get(getContext())
+                        .setCurrentGrid(getContext(), gridName);
+                return 1;
             }
+            case ICON_THEMED:
+            case SET_ICON_THEMED: {
+                if (FeatureFlags.ENABLE_THEMED_ICONS.get()) {
+                    getPrefs(getContext()).edit()
+                            .putBoolean(KEY_THEMED_ICONS, values.getAsBoolean(BOOLEAN_VALUE))
+                            .apply();
+                }
+                return 1;
+            }
+            default:
+                return 0;
         }
-        if (match == null) {
-            return 0;
-        }
-
-        InvariantDeviceProfile.INSTANCE.get(getContext()).setCurrentGrid(getContext(), gridName);
-        return 1;
     }
 
     @Override
diff --git a/src/com/android/launcher3/util/Themes.java b/src/com/android/launcher3/util/Themes.java
index 8243dd4..53a584d 100644
--- a/src/com/android/launcher3/util/Themes.java
+++ b/src/com/android/launcher3/util/Themes.java
@@ -32,6 +32,7 @@
 
 import com.android.launcher3.R;
 import com.android.launcher3.Utilities;
+import com.android.launcher3.config.FeatureFlags;
 import com.android.launcher3.icons.GraphicsUtils;
 
 /**
@@ -40,6 +41,8 @@
 @SuppressWarnings("NewApi")
 public class Themes {
 
+    public static final String KEY_THEMED_ICONS = "themed_icons";
+
     public static int getActivityThemeRes(Context context) {
         final int colorHints;
         if (Utilities.ATLEAST_P) {
@@ -67,6 +70,13 @@
         }
     }
 
+    /**
+     * Returns true if workspace icon theming is enabled
+     */
+    public static boolean isThemedIconEnabled(Context context) {
+        return FeatureFlags.ENABLE_THEMED_ICONS.get()
+                && Utilities.getPrefs(context).getBoolean(KEY_THEMED_ICONS, false);
+    }
 
     public static String getDefaultBodyFont(Context context) {
         TypedArray ta = context.obtainStyledAttributes(android.R.style.TextAppearance_DeviceDefault,
diff --git a/src/com/android/launcher3/workprofile/PersonalWorkSlidingTabStrip.java b/src/com/android/launcher3/workprofile/PersonalWorkSlidingTabStrip.java
index 47328d6..8039fd1 100644
--- a/src/com/android/launcher3/workprofile/PersonalWorkSlidingTabStrip.java
+++ b/src/com/android/launcher3/workprofile/PersonalWorkSlidingTabStrip.java
@@ -29,14 +29,12 @@
 import com.android.launcher3.R;
 import com.android.launcher3.Utilities;
 import com.android.launcher3.pageindicators.PageIndicator;
-import com.android.launcher3.util.Themes;
 
 /**
  * Supports two indicator colors, dedicated for personal and work tabs.
  */
 public class PersonalWorkSlidingTabStrip extends LinearLayout implements PageIndicator {
     private final Paint mSelectedIndicatorPaint;
-    private final Paint mDividerPaint;
 
     private int mSelectedIndicatorHeight;
     private final int mSelectedIndicatorRadius;
@@ -52,7 +50,6 @@
 
     public PersonalWorkSlidingTabStrip(@NonNull Context context, @Nullable AttributeSet attrs) {
         super(context, attrs);
-        setOrientation(HORIZONTAL);
         setWillNotDraw(false);
 
         mSelectedIndicatorHeight =
@@ -64,11 +61,6 @@
         mSelectedIndicatorPaint = new Paint();
         mSelectedIndicatorPaint.setColor(context.getColor(R.color.all_apps_tab_bg));
 
-        mDividerPaint = new Paint();
-        mDividerPaint.setColor(Themes.getAttrColor(context, android.R.attr.colorControlHighlight));
-        mDividerPaint.setStrokeWidth(
-                getResources().getDimensionPixelSize(R.dimen.all_apps_divider_height));
-
         mIsRtl = Utilities.isRtl(getResources());
     }
 
@@ -120,8 +112,6 @@
     @Override
     protected void onDraw(Canvas canvas) {
         super.onDraw(canvas);
-
-        float y = getHeight() - mDividerPaint.getStrokeWidth();
         canvas.drawRoundRect(mIndicatorLeft, getHeight() - mSelectedIndicatorHeight,
                 mIndicatorRight, getHeight(), mSelectedIndicatorRadius, mSelectedIndicatorRadius,
                 mSelectedIndicatorPaint);