diff --git a/lawnchair/res/values/attrs.xml b/lawnchair/res/values/attrs.xml
index 3a34f60ae6..e8f6fed099 100644
--- a/lawnchair/res/values/attrs.xml
+++ b/lawnchair/res/values/attrs.xml
@@ -66,4 +66,9 @@
+
+
+
+
+
diff --git a/lawnchair/src/app/lawnchair/LawnchairLayoutFactory.kt b/lawnchair/src/app/lawnchair/LawnchairLayoutFactory.kt
index f8781319d5..49cf35bce6 100644
--- a/lawnchair/src/app/lawnchair/LawnchairLayoutFactory.kt
+++ b/lawnchair/src/app/lawnchair/LawnchairLayoutFactory.kt
@@ -2,11 +2,13 @@ package app.lawnchair
import android.content.Context
import app.lawnchair.font.FontManager
+import app.lawnchair.theme.ResourceTokenApplier
import rikka.layoutinflater.view.LayoutInflaterFactory
class LawnchairLayoutFactory(context: Context) : LayoutInflaterFactory() {
init {
addOnViewCreatedListener(FontManager.INSTANCE.get(context).onViewCreatedListener)
+ addOnViewCreatedListener(ResourceTokenApplier)
}
}
diff --git a/lawnchair/src/app/lawnchair/theme/ResourceTokenApplier.kt b/lawnchair/src/app/lawnchair/theme/ResourceTokenApplier.kt
new file mode 100644
index 0000000000..5022b38c06
--- /dev/null
+++ b/lawnchair/src/app/lawnchair/theme/ResourceTokenApplier.kt
@@ -0,0 +1,37 @@
+package app.lawnchair.theme
+
+import android.content.Context
+import android.graphics.drawable.Drawable
+import android.util.AttributeSet
+import android.view.View
+import android.widget.ImageView
+import app.lawnchair.theme.drawable.DrawableTokens
+import com.android.launcher3.R
+import rikka.layoutinflater.view.LayoutInflaterFactory.OnViewCreatedListener
+
+object ResourceTokenApplier : OnViewCreatedListener {
+
+ override fun onViewCreated(view: View, parent: View?, name: String, context: Context, attrs: AttributeSet) {
+ val ta = context.obtainStyledAttributes(attrs, R.styleable.ResourceTokenOverride)
+ for (i in 0 until ta.indexCount) {
+ when (val attr = ta.getIndex(i)) {
+ R.styleable.ResourceTokenOverride_android_background -> {
+ val resId = ta.getResourceId(attr, 0)
+ val drawable = resolveDrawable(resId, context) ?: continue
+ view.background = drawable
+ }
+ R.styleable.ResourceTokenOverride_android_src -> {
+ if (view !is ImageView) continue
+ val resId = ta.getResourceId(attr, 0)
+ val drawable = resolveDrawable(resId, context) ?: continue
+ view.setImageDrawable(drawable)
+ }
+ }
+ }
+ ta.recycle()
+ }
+
+ private fun resolveDrawable(resId: Int, context: Context): Drawable? {
+ return DrawableTokens.drawableMapping[resId]?.resolve(context)
+ }
+}
diff --git a/lawnchair/src/app/lawnchair/theme/drawable/DrawableTokens.kt b/lawnchair/src/app/lawnchair/theme/drawable/DrawableTokens.kt
index bab49639f0..5d6d2ee490 100644
--- a/lawnchair/src/app/lawnchair/theme/drawable/DrawableTokens.kt
+++ b/lawnchair/src/app/lawnchair/theme/drawable/DrawableTokens.kt
@@ -8,28 +8,53 @@ import com.android.launcher3.R
object DrawableTokens {
+ private val privateDrawableMapping = mutableMapOf>()
+ val drawableMapping: Map> get() = privateDrawableMapping
+
@JvmField
val BgCellLayout = ResourceDrawableToken(R.drawable.bg_celllayout)
.setTint(ColorTokens.ColorAccent)
- @JvmField
- val BgOverviewClearAllButton = ResourceDrawableToken(R.drawable.bg_overview_clear_all_button)
- .mutate { context, scheme, uiColorMode ->
- val background = getDrawable(0) as GradientDrawable
- background.setColor(ColorTokens.Surface.resolveColor(context, scheme, uiColorMode))
+ init {
+ addDrawableMapping(R.drawable.bg_overview_clear_all_button) {
+ it.mutate { context, scheme, uiColorMode ->
+ val background = getDrawable(0) as GradientDrawable
+ background.setColor(ColorTokens.Surface.resolveColor(context, scheme, uiColorMode))
+ }
}
- @JvmField
- val BgWidgetsFullSheet = ResourceDrawableToken(R.drawable.bg_widgets_full_sheet)
- .setColor(ColorTokens.ColorBackground)
+ addDrawableMapping(R.drawable.bg_widgets_full_sheet) {
+ it.setColor(ColorTokens.ColorBackground)
+ }
- @JvmField
- val BgWidgetsSearchbox = ResourceDrawableToken(R.drawable.bg_widgets_searchbox)
- .setColor(ColorTokens.Surface)
+ addDrawableMapping(R.drawable.bg_widgets_searchbox) {
+ it.setColor(ColorTokens.Surface)
+ }
- @JvmField
- val DropTargetBackground = ResourceDrawableToken(R.drawable.drop_target_background)
- .setTint(ColorTokens.WorkspaceAccentColor)
+ addDrawableMapping(R.drawable.drop_target_background) {
+ it.setTint(ColorTokens.WorkspaceAccentColor)
+ }
+
+ addDrawableMapping(R.drawable.task_menu_item_bg) {
+ it.setColor(ColorTokens.ColorPrimary)
+ }
+
+ addDrawableMapping(R.drawable.bg_rounded_corner_bottom_sheet) {
+ it.setColor(ColorTokens.Surface)
+ }
+
+ addDrawableMapping(R.drawable.widgets_recommendation_background) {
+ it.setColor(ColorTokens.Surface)
+ }
+
+ addDrawableMapping(R.drawable.widget_resize_frame) {
+ it.setColor(ColorTokens.WorkspaceAccentColor)
+ }
+
+ addDrawableMapping(R.drawable.work_card) {
+ it.setColor(ColorTokens.Surface)
+ }
+ }
@JvmField
val MiddleItemPrimary = ResourceDrawableToken(R.drawable.middle_item_primary)
@@ -63,22 +88,6 @@ object DrawableTokens {
val SingleItemPrimary = ResourceDrawableToken(R.drawable.single_item_primary)
.setColor(ColorTokens.PopupColorPrimary)
- @JvmField
- val TaskMenuItemBg = ResourceDrawableToken(R.drawable.task_menu_item_bg)
- .setColor(ColorTokens.ColorPrimary)
-
- @JvmField
- val WidgetsBottomSheetBackground = ResourceDrawableToken(R.drawable.bg_rounded_corner_bottom_sheet)
- .setColor(ColorTokens.Surface)
-
- @JvmField
- val WidgetsRecommendationBackground = ResourceDrawableToken(R.drawable.widgets_recommendation_background)
- .setColor(ColorTokens.Surface)
-
- @JvmField
- val WidgetResizeFrame = ResourceDrawableToken(R.drawable.widget_resize_frame)
- .setTint(ColorTokens.WorkspaceAccentColor)
-
@JvmField
val AllAppsTabsBackground = NewDrawable { context, scheme, uiColorMode ->
val list = StateListDrawable()
@@ -120,6 +129,11 @@ object DrawableTokens {
list
}
- @JvmField val WorkCard = ResourceDrawableToken(R.drawable.work_card)
- .setColor(ColorTokens.Surface)
+ private fun addDrawableMapping(
+ resId: Int,
+ customizer: (DrawableToken) -> DrawableToken<*> = { it }
+ ) {
+ val token = customizer(ResourceDrawableToken(resId))
+ privateDrawableMapping[resId] = token
+ }
}
diff --git a/quickstep/src/com/android/quickstep/views/ClearAllButton.java b/quickstep/src/com/android/quickstep/views/ClearAllButton.java
index f20bbc50b7..4f2ed4cd82 100644
--- a/quickstep/src/com/android/quickstep/views/ClearAllButton.java
+++ b/quickstep/src/com/android/quickstep/views/ClearAllButton.java
@@ -25,9 +25,6 @@ import com.android.launcher3.DeviceProfile;
import com.android.launcher3.statemanager.StatefulActivity;
import com.android.launcher3.touch.PagedOrientationHandler;
-import app.lawnchair.font.FontManager;
-import app.lawnchair.theme.drawable.DrawableTokens;
-
public class ClearAllButton extends Button {
public static final FloatProperty VISIBILITY_ALPHA =
@@ -78,8 +75,6 @@ public class ClearAllButton extends Button {
super(context, attrs);
mIsRtl = getLayoutDirection() == LAYOUT_DIRECTION_RTL;
mActivity = StatefulActivity.fromContext(context);
- FontManager.INSTANCE.get(context).overrideFont(this, attrs);
- setBackground(DrawableTokens.BgOverviewClearAllButton.resolve(context));
}
@Override
diff --git a/quickstep/src/com/android/quickstep/views/TaskMenuView.java b/quickstep/src/com/android/quickstep/views/TaskMenuView.java
index 3ca2047edd..853a02343f 100644
--- a/quickstep/src/com/android/quickstep/views/TaskMenuView.java
+++ b/quickstep/src/com/android/quickstep/views/TaskMenuView.java
@@ -56,8 +56,6 @@ import com.android.quickstep.TaskUtils;
import com.android.quickstep.util.TaskCornerRadius;
import com.android.quickstep.views.TaskView.TaskIdAttributeContainer;
-import app.lawnchair.theme.drawable.DrawableTokens;
-
/**
* Contains options for a recent task when long-pressing its icon.
*/
@@ -93,7 +91,6 @@ public class TaskMenuView extends AbstractFloatingView implements OnScrollChange
protected void onFinishInflate() {
super.onFinishInflate();
mTaskName = findViewById(R.id.task_name);
- mTaskName.setBackground(DrawableTokens.TaskMenuItemBg.resolve(getContext()));
mOptionLayout = findViewById(R.id.menu_option_layout);
}
@@ -259,7 +256,6 @@ public class TaskMenuView extends AbstractFloatingView implements OnScrollChange
menuOption.onClick(view);
}
});
- menuOptionView.setBackground(DrawableTokens.TaskMenuItemBg.resolve(mActivity));
mOptionLayout.addView(menuOptionView);
}
diff --git a/res/layout/work_apps_edu.xml b/res/layout/work_apps_edu.xml
index 421dc006b2..1517087fe2 100644
--- a/res/layout/work_apps_edu.xml
+++ b/res/layout/work_apps_edu.xml
@@ -25,6 +25,7 @@
android:orientation="vertical"
android:paddingHorizontal="@dimen/work_card_padding_horizontal"
android:paddingVertical="@dimen/work_card_padding_horizontal"
+ android:background="@drawable/work_card"
android:layout_gravity="center_horizontal"
android:gravity="center"
android:id="@+id/wrapper">
diff --git a/src/com/android/launcher3/AppWidgetResizeFrame.java b/src/com/android/launcher3/AppWidgetResizeFrame.java
index c4b11bc97b..adc29c0f3f 100644
--- a/src/com/android/launcher3/AppWidgetResizeFrame.java
+++ b/src/com/android/launcher3/AppWidgetResizeFrame.java
@@ -1,7 +1,6 @@
package com.android.launcher3;
import static android.appwidget.AppWidgetHostView.getDefaultPaddingForWidget;
-
import static com.android.launcher3.CellLayout.SPRING_LOADED_PROGRESS;
import static com.android.launcher3.LauncherAnimUtils.LAYOUT_HEIGHT;
import static com.android.launcher3.LauncherAnimUtils.LAYOUT_WIDTH;
@@ -46,7 +45,6 @@ import java.util.ArrayList;
import java.util.List;
import app.lawnchair.theme.color.ColorTokens;
-import app.lawnchair.theme.drawable.DrawableTokens;
public class AppWidgetResizeFrame extends AbstractFloatingView implements View.OnKeyListener {
private static final int SNAP_DURATION = 150;
@@ -209,10 +207,9 @@ public class AppWidgetResizeFrame extends AbstractFloatingView implements View.O
DragLayer dl = launcher.getDragLayer();
AppWidgetResizeFrame frame = (AppWidgetResizeFrame) launcher.getLayoutInflater()
.inflate(R.layout.app_widget_resize_frame, dl, false);
- ImageView imageView = frame.findViewById(R.id.widget_resize_frame);
- imageView.setImageDrawable(DrawableTokens.WidgetResizeFrame.resolve(launcher));
if (widget.hasEnforcedCornerRadius()) {
float enforcedCornerRadius = widget.getEnforcedCornerRadius();
+ ImageView imageView = frame.findViewById(R.id.widget_resize_frame);
Drawable d = imageView.getDrawable();
if (d instanceof GradientDrawable) {
GradientDrawable gd = (GradientDrawable) d.mutate();
diff --git a/src/com/android/launcher3/ButtonDropTarget.java b/src/com/android/launcher3/ButtonDropTarget.java
index efcb887983..799218a2be 100644
--- a/src/com/android/launcher3/ButtonDropTarget.java
+++ b/src/com/android/launcher3/ButtonDropTarget.java
@@ -43,8 +43,6 @@ import com.android.launcher3.model.data.ItemInfo;
import com.android.launcher3.util.Themes;
import app.lawnchair.theme.color.ColorTokens;
-import app.lawnchair.theme.drawable.DrawableToken;
-import app.lawnchair.theme.drawable.DrawableTokens;
/**
* Implements a DropTarget.
@@ -102,7 +100,6 @@ public abstract class ButtonDropTarget extends TextView
super.onFinishInflate();
mText = getText();
setContentDescription(mText);
- setBackground(DrawableTokens.DropTargetBackground.resolve(getContext()));
setTextColor();
}
diff --git a/src/com/android/launcher3/allapps/WorkEduCard.java b/src/com/android/launcher3/allapps/WorkEduCard.java
index c0939d04cc..54aa664679 100644
--- a/src/com/android/launcher3/allapps/WorkEduCard.java
+++ b/src/com/android/launcher3/allapps/WorkEduCard.java
@@ -81,9 +81,7 @@ public class WorkEduCard extends FrameLayout implements View.OnClickListener,
button.setAllCaps(false);
FontManager.INSTANCE.get(getContext()).setCustomFont(button, R.id.font_button);
- LinearLayout wrapper = ViewCompat.requireViewById(this, R.id.wrapper);
- wrapper.setBackground(DrawableTokens.WorkCard.resolve(getContext()));
- MarginLayoutParams lp = ((MarginLayoutParams) wrapper.getLayoutParams());
+ MarginLayoutParams lp = ((MarginLayoutParams) findViewById(R.id.wrapper).getLayoutParams());
lp.width = mLauncher.getAppsView().getActiveRecyclerView().getTabWidth();
TextView title = ViewCompat.requireViewById(this, R.id.work_apps_paused_title);
diff --git a/src/com/android/launcher3/widget/WidgetsBottomSheet.java b/src/com/android/launcher3/widget/WidgetsBottomSheet.java
index cbc5a42e90..b152ddc2d9 100644
--- a/src/com/android/launcher3/widget/WidgetsBottomSheet.java
+++ b/src/com/android/launcher3/widget/WidgetsBottomSheet.java
@@ -45,8 +45,6 @@ import com.android.launcher3.widget.util.WidgetsTableUtils;
import java.util.List;
-import app.lawnchair.theme.drawable.DrawableTokens;
-
/**
* Bottom sheet for the "Widgets" system shortcut in the long-press popup.
*/
@@ -121,7 +119,6 @@ public class WidgetsBottomSheet extends BaseWidgetSheet {
protected void onFinishInflate() {
super.onFinishInflate();
mContent = findViewById(R.id.widgets_bottom_sheet);
- mContent.setBackground(DrawableTokens.WidgetsBottomSheetBackground.resolve(getContext()));
}
@Override
diff --git a/src/com/android/launcher3/widget/picker/SearchAndRecommendationsScrollController.java b/src/com/android/launcher3/widget/picker/SearchAndRecommendationsScrollController.java
index 2adfdff450..716dcf3398 100644
--- a/src/com/android/launcher3/widget/picker/SearchAndRecommendationsScrollController.java
+++ b/src/com/android/launcher3/widget/picker/SearchAndRecommendationsScrollController.java
@@ -33,8 +33,6 @@ import com.android.launcher3.R;
import com.android.launcher3.widget.picker.WidgetsSpaceViewHolderBinder.EmptySpaceView;
import com.android.launcher3.widget.picker.search.WidgetsSearchBar;
-import app.lawnchair.theme.drawable.DrawableTokens;
-
/**
* A controller which measures & updates {@link WidgetsFullSheet}'s views padding, margin and
* vertical displacement upon scrolling.
@@ -84,8 +82,6 @@ final class SearchAndRecommendationsScrollController implements
mSearchBar = mContainer.findViewById(R.id.widgets_search_bar);
mHeaderTitle = mContainer.findViewById(R.id.title);
mRecommendedWidgetsTable = mContainer.findViewById(R.id.recommended_widget_table);
- mRecommendedWidgetsTable.setBackground(
- DrawableTokens.WidgetsRecommendationBackground.resolve(mContainer.getContext()));
mTabBar = mContainer.findViewById(R.id.tabs);
mContainer.setSearchAndRecommendationScrollController(this);
diff --git a/src/com/android/launcher3/widget/picker/WidgetsFullSheet.java b/src/com/android/launcher3/widget/picker/WidgetsFullSheet.java
index 1dc40c885c..517cc58deb 100644
--- a/src/com/android/launcher3/widget/picker/WidgetsFullSheet.java
+++ b/src/com/android/launcher3/widget/picker/WidgetsFullSheet.java
@@ -186,7 +186,6 @@ public class WidgetsFullSheet extends BaseWidgetSheet
protected void onFinishInflate() {
super.onFinishInflate();
mContent = findViewById(R.id.container);
- mContent.setBackground(DrawableTokens.BgWidgetsFullSheet.resolve(getContext()));
View collapseHandle = findViewById(R.id.collapse_handle);
collapseHandle.setBackgroundColor(ColorTokens.TextColorSecondary.resolveColor(getContext()));
diff --git a/src/com/android/launcher3/widget/picker/search/LauncherWidgetsSearchBar.java b/src/com/android/launcher3/widget/picker/search/LauncherWidgetsSearchBar.java
index 86968911aa..65937b644a 100644
--- a/src/com/android/launcher3/widget/picker/search/LauncherWidgetsSearchBar.java
+++ b/src/com/android/launcher3/widget/picker/search/LauncherWidgetsSearchBar.java
@@ -28,8 +28,6 @@ import com.android.launcher3.ExtendedEditText;
import com.android.launcher3.R;
import com.android.launcher3.popup.PopupDataProvider;
-import app.lawnchair.theme.drawable.DrawableTokens;
-
/**
* View for a search bar with an edit text with a cancel button.
*/
@@ -69,7 +67,6 @@ public class LauncherWidgetsSearchBar extends LinearLayout implements WidgetsSea
super.onFinishInflate();
mEditText = findViewById(R.id.widgets_search_bar_edit_text);
mCancelButton = findViewById(R.id.widgets_search_cancel_button);
- setBackground(DrawableTokens.BgWidgetsSearchbox.resolve(getContext()));
}
@Override