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