diff --git a/quickstep/res/drawable/ic_floating_task_button.xml b/quickstep/res/drawable/ic_floating_task_button.xml index e50f65cee7..63b2fd85b7 100644 --- a/quickstep/res/drawable/ic_floating_task_button.xml +++ b/quickstep/res/drawable/ic_floating_task_button.xml @@ -19,11 +19,17 @@ android:height="24dp" android:viewportWidth="24" android:viewportHeight="24"> - - + + + + diff --git a/quickstep/res/layout/taskbar_all_apps_button.xml b/quickstep/res/layout/taskbar_all_apps_button.xml new file mode 100644 index 0000000000..b275305da4 --- /dev/null +++ b/quickstep/res/layout/taskbar_all_apps_button.xml @@ -0,0 +1,23 @@ + + + diff --git a/quickstep/res/layout/taskbar_floating_task_button.xml b/quickstep/res/layout/taskbar_floating_task_button.xml new file mode 100644 index 0000000000..b5beded54a --- /dev/null +++ b/quickstep/res/layout/taskbar_floating_task_button.xml @@ -0,0 +1,21 @@ + + + diff --git a/quickstep/src/com/android/launcher3/taskbar/LaunchFloatingTaskButton.java b/quickstep/src/com/android/launcher3/taskbar/LaunchFloatingTaskButton.java deleted file mode 100644 index b15669b5ef..0000000000 --- a/quickstep/src/com/android/launcher3/taskbar/LaunchFloatingTaskButton.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright (C) 2022 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.launcher3.taskbar; - -import android.content.Context; -import android.graphics.Bitmap; -import android.util.AttributeSet; -import android.view.ContextThemeWrapper; - -import com.android.launcher3.BubbleTextView; -import com.android.launcher3.LauncherAppState; -import com.android.launcher3.R; -import com.android.launcher3.icons.FastBitmapDrawable; - -/** - * Button in Taskbar that opens something in a floating task. - */ -public class LaunchFloatingTaskButton extends BubbleTextView { - - public LaunchFloatingTaskButton(Context context) { - this(context, null); - } - - public LaunchFloatingTaskButton(Context context, AttributeSet attrs) { - this(context, attrs, 0); - } - - public LaunchFloatingTaskButton(Context context, AttributeSet attrs, int defStyle) { - super(context, attrs, defStyle); - - Context theme = new ContextThemeWrapper(context, R.style.AllAppsButtonTheme); - Bitmap bitmap = LauncherAppState.getInstance(context).getIconCache().getIconFactory() - .createScaledBitmapWithShadow( - theme.getDrawable(R.drawable.ic_floating_task_button)); - setIcon(new FastBitmapDrawable(bitmap)); - } -} diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarView.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarView.java index bb82d19734..31c2132888 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarView.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarView.java @@ -26,7 +26,6 @@ import android.util.Log; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; -import android.view.ViewGroup; import android.widget.FrameLayout; import androidx.annotation.LayoutRes; @@ -47,7 +46,6 @@ import com.android.launcher3.model.data.ItemInfo; import com.android.launcher3.model.data.WorkspaceItemInfo; import com.android.launcher3.util.LauncherBindableItemsContainer; import com.android.launcher3.views.ActivityContext; -import com.android.launcher3.views.AllAppsButton; import com.android.launcher3.views.DoubleShadowBubbleTextView; import java.util.function.Predicate; @@ -81,12 +79,12 @@ public class TaskbarView extends FrameLayout implements FolderIcon.FolderIconPar private @Nullable FolderIcon mLeaveBehindFolderIcon; // Only non-null when device supports having an All Apps button. - private @Nullable AllAppsButton mAllAppsButton; + private @Nullable View mAllAppsButton; private View mQsb; // Only non-null when device supports having a floating task. - private @Nullable BubbleTextView mFloatingTaskButton; + private @Nullable View mFloatingTaskButton; private @Nullable Intent mFloatingTaskIntent; private static final boolean FLOATING_TASKS_ENABLED = SystemProperties.getBoolean("persist.wm.debug.floating_tasks", false); @@ -125,9 +123,8 @@ public class TaskbarView extends FrameLayout implements FolderIcon.FolderIconPar mThemeIconsBackground = calculateThemeIconsBackground(); if (FeatureFlags.ENABLE_ALL_APPS_IN_TASKBAR.get()) { - mAllAppsButton = new AllAppsButton(context); - mAllAppsButton.setLayoutParams( - new ViewGroup.LayoutParams(mIconTouchSize, mIconTouchSize)); + mAllAppsButton = LayoutInflater.from(context) + .inflate(R.layout.taskbar_all_apps_button, this, false); mAllAppsButton.setPadding(mItemPadding, mItemPadding, mItemPadding, mItemPadding); } @@ -137,9 +134,8 @@ public class TaskbarView extends FrameLayout implements FolderIcon.FolderIconPar if (FLOATING_TASKS_ENABLED) { mFloatingTaskIntent = FloatingTaskIntentResolver.getIntent(context); if (mFloatingTaskIntent != null) { - mFloatingTaskButton = new LaunchFloatingTaskButton(context); - mFloatingTaskButton.setLayoutParams( - new ViewGroup.LayoutParams(mIconTouchSize, mIconTouchSize)); + mFloatingTaskButton = LayoutInflater.from(context) + .inflate(R.layout.taskbar_floating_task_button, this, false); mFloatingTaskButton.setPadding(mItemPadding, mItemPadding, mItemPadding, mItemPadding); } else { diff --git a/res/drawable/ic_all_apps_button.xml b/res/drawable/ic_all_apps_button.xml index 5770d3cf19..7de390ac4a 100644 --- a/res/drawable/ic_all_apps_button.xml +++ b/res/drawable/ic_all_apps_button.xml @@ -18,27 +18,29 @@ android:width="80dp" android:height="80dp" android:viewportWidth="80" - android:viewportHeight="80" - android:theme="@style/AllAppsTheme"> - - - - - - - + android:viewportHeight="80"> + + + + + + + + diff --git a/res/values/attrs.xml b/res/values/attrs.xml index 862341400f..283c793e26 100644 --- a/res/values/attrs.xml +++ b/res/values/attrs.xml @@ -56,12 +56,6 @@ - - - - - - diff --git a/res/values/styles.xml b/res/values/styles.xml index 90553a160e..d0be420a1a 100644 --- a/res/values/styles.xml +++ b/res/values/styles.xml @@ -207,14 +207,6 @@ no - - diff --git a/src/com/android/launcher3/icons/ShortcutCachingLogic.java b/src/com/android/launcher3/icons/ShortcutCachingLogic.java index d5a79dde08..26ddc0bed7 100644 --- a/src/com/android/launcher3/icons/ShortcutCachingLogic.java +++ b/src/com/android/launcher3/icons/ShortcutCachingLogic.java @@ -76,7 +76,8 @@ public class ShortcutCachingLogic implements CachingLogic { Drawable unbadgedDrawable = ShortcutCachingLogic.getIcon( context, info, LauncherAppState.getIDP(context).fillResIconDpi); if (unbadgedDrawable == null) return BitmapInfo.LOW_RES_INFO; - return new BitmapInfo(li.createScaledBitmapWithoutShadow(unbadgedDrawable), + return new BitmapInfo( + li.createScaledBitmap(unbadgedDrawable, BaseIconFactory.MODE_WITH_SHADOW), Themes.getColorAccent(context)); } } diff --git a/src/com/android/launcher3/views/AllAppsButton.java b/src/com/android/launcher3/views/AllAppsButton.java deleted file mode 100644 index ab8e5dbff6..0000000000 --- a/src/com/android/launcher3/views/AllAppsButton.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (C) 2022 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.launcher3.views; - -import android.content.Context; -import android.graphics.Bitmap; -import android.util.AttributeSet; -import android.view.ContextThemeWrapper; - -import com.android.launcher3.BubbleTextView; -import com.android.launcher3.LauncherAppState; -import com.android.launcher3.R; -import com.android.launcher3.icons.FastBitmapDrawable; - -/** - * Button in Taskbar that opens All Apps. - */ -public class AllAppsButton extends BubbleTextView { - - public AllAppsButton(Context context) { - this(context, null); - } - - public AllAppsButton(Context context, AttributeSet attrs) { - this(context, attrs, 0); - } - - public AllAppsButton(Context context, AttributeSet attrs, int defStyle) { - super(context, attrs, defStyle); - - Context theme = new ContextThemeWrapper(context, R.style.AllAppsButtonTheme); - Bitmap bitmap = LauncherAppState.getInstance(context).getIconCache().getIconFactory() - .createScaledBitmapWithShadow(theme.getDrawable(R.drawable.ic_all_apps_button)); - setIcon(new FastBitmapDrawable(bitmap)); - setContentDescription(context.getString(R.string.all_apps_button_label)); - } -} diff --git a/src/com/android/launcher3/views/IconButtonView.java b/src/com/android/launcher3/views/IconButtonView.java new file mode 100644 index 0000000000..dd48c99c7d --- /dev/null +++ b/src/com/android/launcher3/views/IconButtonView.java @@ -0,0 +1,94 @@ +/* + * Copyright (C) 2022 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.launcher3.views; + +import android.annotation.TargetApi; +import android.content.Context; +import android.content.res.ColorStateList; +import android.content.res.TypedArray; +import android.graphics.Bitmap; +import android.graphics.BlendMode; +import android.graphics.BlendModeColorFilter; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Rect; +import android.graphics.drawable.ColorDrawable; +import android.graphics.drawable.Drawable; +import android.os.Build; +import android.util.AttributeSet; + +import com.android.launcher3.BubbleTextView; +import com.android.launcher3.icons.BaseIconFactory; +import com.android.launcher3.icons.FastBitmapDrawable; +import com.android.launcher3.icons.LauncherIcons; + +/** + * Button in Taskbar that shows a tinted background and foreground. + */ +public class IconButtonView extends BubbleTextView { + + private static final int[] ATTRS = {android.R.attr.icon}; + + public IconButtonView(Context context) { + this(context, null); + } + + public IconButtonView(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + public IconButtonView(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + + TypedArray a = context.obtainStyledAttributes(attrs, ATTRS, defStyle, 0); + Drawable fg = a.getDrawable(0); + a.recycle(); + + ColorStateList tintList = getBackgroundTintList(); + int tint = tintList == null ? Color.WHITE : tintList.getDefaultColor(); + + if (fg == null) { + fg = new ColorDrawable(Color.TRANSPARENT); + } + try (BaseIconFactory factory = LauncherIcons.obtain(context)) { + setIcon(new IconDrawable(factory.getWhiteShadowLayer(), tint, fg)); + } + } + + private static class IconDrawable extends FastBitmapDrawable { + + private final Drawable mFg; + + @TargetApi(Build.VERSION_CODES.TIRAMISU) + IconDrawable(Bitmap b, int colorBg, Drawable fg) { + super(b); + mPaint.setColorFilter(new BlendModeColorFilter(colorBg, BlendMode.SRC_IN)); + mFg = fg; + } + + @Override + protected void drawInternal(Canvas canvas, Rect bounds) { + super.drawInternal(canvas, bounds); + mFg.draw(canvas); + } + + @Override + protected void onBoundsChange(Rect bounds) { + super.onBoundsChange(bounds); + mFg.setBounds(bounds); + } + } +} diff --git a/src/com/android/launcher3/widget/PendingItemDragHelper.java b/src/com/android/launcher3/widget/PendingItemDragHelper.java index c8d528b8e8..bbbc329c9c 100644 --- a/src/com/android/launcher3/widget/PendingItemDragHelper.java +++ b/src/com/android/launcher3/widget/PendingItemDragHelper.java @@ -39,6 +39,7 @@ import com.android.launcher3.R; import com.android.launcher3.dragndrop.DragOptions; import com.android.launcher3.dragndrop.DraggableView; import com.android.launcher3.graphics.DragPreviewProvider; +import com.android.launcher3.icons.BaseIconFactory; import com.android.launcher3.icons.FastBitmapDrawable; import com.android.launcher3.icons.LauncherIcons; import com.android.launcher3.icons.RoundDrawableWrapper; @@ -181,7 +182,8 @@ public class PendingItemDragHelper extends DragPreviewProvider { PendingAddShortcutInfo createShortcutInfo = (PendingAddShortcutInfo) mAddInfo; Drawable icon = createShortcutInfo.activityInfo.getFullResIcon(app.getIconCache()); LauncherIcons li = LauncherIcons.obtain(launcher); - preview = new FastBitmapDrawable(li.createScaledBitmapWithoutShadow(icon)); + preview = new FastBitmapDrawable( + li.createScaledBitmap(icon, BaseIconFactory.MODE_DEFAULT)); previewWidth = preview.getIntrinsicWidth(); previewHeight = preview.getIntrinsicHeight(); li.recycle();