From 32ff76cb4e7f6643db05868941bb66b5934d1f31 Mon Sep 17 00:00:00 2001 From: Jon Miranda Date: Tue, 1 Jun 2021 21:26:10 -0700 Subject: [PATCH] Adding color back to popup container. For Color exctraction now occurs in groups: - System shortcuts - Deep shortcuts - Notifications For home setting popup, each DeepShortcutView will have its own extracted color. Bug: 188095443 Test: manual Change-Id: I7e209f863ff180b8f017aeb2a73c6f1a51842e68 --- res/layout/longpress_options_menu.xml | 2 +- res/layout/popup_container.xml | 11 +- res/values-v31/colors.xml | 4 +- res/values/config.xml | 3 + .../notification/NotificationItemView.java | 10 + .../notification/NotificationMainView.java | 33 ++- .../android/launcher3/popup/ArrowPopup.java | 216 ++++++++++++++++-- .../popup/PopupContainerWithArrow.java | 42 +++- .../launcher3/views/OptionsPopupView.java | 14 +- .../com/android/launcher3/tapl/AppIcon.java | 4 +- .../tapl/LauncherInstrumentation.java | 2 +- .../launcher3/tapl/OptionsPopupMenu.java | 2 +- .../com/android/launcher3/tapl/Workspace.java | 2 +- 13 files changed, 300 insertions(+), 45 deletions(-) diff --git a/res/layout/longpress_options_menu.xml b/res/layout/longpress_options_menu.xml index d2f7a660d9..fbe28d85a9 100644 --- a/res/layout/longpress_options_menu.xml +++ b/res/layout/longpress_options_menu.xml @@ -15,7 +15,7 @@ --> + + + - @android:color/system_neutral1_0 + @android:color/system_accent2_50 @android:color/system_neutral2_100 @android:color/system_neutral2_300 @android:color/system_neutral1_1000 - @android:color/system_neutral1_800 + @android:color/system_neutral2_800 @android:color/system_neutral1_900 @android:color/system_neutral2_700 diff --git a/res/values/config.xml b/res/values/config.xml index 77c7e986d5..299c80ef8b 100644 --- a/res/values/config.xml +++ b/res/values/config.xml @@ -31,6 +31,9 @@ + + popup_container_iterate_children + diff --git a/src/com/android/launcher3/notification/NotificationItemView.java b/src/com/android/launcher3/notification/NotificationItemView.java index d44d158010..932e721058 100644 --- a/src/com/android/launcher3/notification/NotificationItemView.java +++ b/src/com/android/launcher3/notification/NotificationItemView.java @@ -18,6 +18,7 @@ package com.android.launcher3.notification; import static com.android.launcher3.touch.SingleAxisSwipeDetector.HORIZONTAL; +import android.animation.AnimatorSet; import android.app.Notification; import android.content.Context; import android.graphics.Color; @@ -92,6 +93,15 @@ public class NotificationItemView { }); } + /** + * Animates the background color to a new color. + * @param color The color to change to. + * @param animatorSetOut The AnimatorSet where we add the color animator to. + */ + public void updateBackgroundColor(int color, AnimatorSet animatorSetOut) { + mMainView.updateBackgroundColor(color, animatorSetOut); + } + public void addGutter() { if (mGutter == null) { mGutter = mPopupContainer.inflateAndAdd(R.layout.notification_gutter, mRootView); diff --git a/src/com/android/launcher3/notification/NotificationMainView.java b/src/com/android/launcher3/notification/NotificationMainView.java index c9956667db..e9b5f32ce7 100644 --- a/src/com/android/launcher3/notification/NotificationMainView.java +++ b/src/com/android/launcher3/notification/NotificationMainView.java @@ -20,10 +20,13 @@ import static com.android.launcher3.anim.Interpolators.scrollInterpolatorForVelo import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_NOTIFICATION_DISMISSED; import android.animation.Animator; +import android.animation.AnimatorSet; import android.animation.ObjectAnimator; +import android.animation.ValueAnimator; import android.annotation.TargetApi; import android.content.Context; import android.content.res.ColorStateList; +import android.graphics.Color; import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.RippleDrawable; import android.os.Build; @@ -78,6 +81,9 @@ public class NotificationMainView extends FrameLayout implements SingleAxisSwipe private SingleAxisSwipeDetector mSwipeDetector; + private final ColorDrawable mColorDrawable; + private final RippleDrawable mRippleDrawable; + public NotificationMainView(Context context) { this(context, null, 0); } @@ -90,6 +96,10 @@ public class NotificationMainView extends FrameLayout implements SingleAxisSwipe super(context, attrs, defStyle); mContentTranslateAnimator = ObjectAnimator.ofFloat(this, CONTENT_TRANSLATION, 0); + mColorDrawable = new ColorDrawable(Color.TRANSPARENT); + mRippleDrawable = new RippleDrawable(ColorStateList.valueOf( + Themes.getAttrColor(getContext(), android.R.attr.colorControlHighlight)), + mColorDrawable, null); } @Override @@ -105,18 +115,31 @@ public class NotificationMainView extends FrameLayout implements SingleAxisSwipe updateBackgroundColor(colorBackground.getColor()); } - public void updateBackgroundColor(int color) { + private void updateBackgroundColor(int color) { mBackgroundColor = color; - RippleDrawable rippleBackground = new RippleDrawable(ColorStateList.valueOf( - Themes.getAttrColor(getContext(), android.R.attr.colorControlHighlight)), - new ColorDrawable(color), null); - mTextAndBackground.setBackground(rippleBackground); + mColorDrawable.setColor(color); + mTextAndBackground.setBackground(mRippleDrawable); if (mNotificationInfo != null) { mIconView.setBackground(mNotificationInfo.getIconForBackground(getContext(), mBackgroundColor)); } } + /** + * Animates the background color to a new color. + * @param color The color to change to. + * @param animatorSetOut The AnimatorSet where we add the color animator to. + */ + public void updateBackgroundColor(int color, AnimatorSet animatorSetOut) { + int oldColor = mBackgroundColor; + ValueAnimator colors = ValueAnimator.ofArgb(oldColor, color); + colors.addUpdateListener(valueAnimator -> { + int newColor = (int) valueAnimator.getAnimatedValue(); + updateBackgroundColor(newColor); + }); + animatorSetOut.play(colors); + } + public void setSwipeDetector(SingleAxisSwipeDetector swipeDetector) { mSwipeDetector = swipeDetector; } diff --git a/src/com/android/launcher3/popup/ArrowPopup.java b/src/com/android/launcher3/popup/ArrowPopup.java index 8dea14a8c0..2095a0de54 100644 --- a/src/com/android/launcher3/popup/ArrowPopup.java +++ b/src/com/android/launcher3/popup/ArrowPopup.java @@ -25,35 +25,48 @@ import android.animation.AnimatorListenerAdapter; import android.animation.AnimatorSet; import android.animation.ObjectAnimator; import android.animation.ValueAnimator; +import android.annotation.TargetApi; import android.content.Context; import android.content.res.Resources; import android.graphics.Rect; +import android.graphics.RectF; +import android.graphics.drawable.ColorDrawable; +import android.graphics.drawable.Drawable; import android.graphics.drawable.GradientDrawable; +import android.os.Build; import android.util.AttributeSet; import android.util.Pair; +import android.util.SparseIntArray; import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.view.ViewTreeObserver; import android.view.animation.Interpolator; import android.widget.FrameLayout; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import com.android.launcher3.AbstractFloatingView; import com.android.launcher3.BaseDraggingActivity; import com.android.launcher3.InsettableFrameLayout; +import com.android.launcher3.Launcher; import com.android.launcher3.LauncherState; import com.android.launcher3.R; import com.android.launcher3.Utilities; +import com.android.launcher3.Workspace; import com.android.launcher3.dragndrop.DragLayer; import com.android.launcher3.shortcuts.DeepShortcutView; import com.android.launcher3.statemanager.StatefulActivity; import com.android.launcher3.util.Themes; import com.android.launcher3.views.BaseDragLayer; +import com.android.launcher3.widget.LocalColorExtractor; import java.util.ArrayList; import java.util.Collections; +import java.util.HashMap; +import java.util.List; /** * A container for shortcuts to deep links and notifications associated with an app. @@ -76,6 +89,10 @@ public abstract class ArrowPopup> private static final int CLOSE_CHILD_FADE_START_DELAY = 0; private static final int CLOSE_CHILD_FADE_DURATION = 140; + // Index used to get background color when using local wallpaper color extraction, + private static final int DARK_COLOR_EXTRACTION_INDEX = android.R.color.system_neutral2_800; + private static final int LIGHT_COLOR_EXTRACTION_INDEX = android.R.color.system_accent2_50; + private final Rect mTempRect = new Rect(); protected final LayoutInflater mInflater; @@ -104,9 +121,18 @@ public abstract class ArrowPopup> private Runnable mOnCloseCallback = () -> { }; + // The rect string of the view that the arrow is attached to, in screen reference frame. + protected String mArrowColorRectString; + private int mArrowColor; + protected final HashMap mViewForRect = new HashMap<>(); + + @Nullable protected LocalColorExtractor mColorExtractor; + private final float mElevation; private final int mBackgroundColor; + private final String mIterateChildrenTag; + public ArrowPopup(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); mInflater = LayoutInflater.from(context); @@ -115,6 +141,7 @@ public abstract class ArrowPopup> mIsRtl = Utilities.isRtl(getResources()); mBackgroundColor = Themes.getAttrColor(context, R.attr.popupColorPrimary); + mArrowColor = mBackgroundColor; mElevation = getResources().getDimension(R.dimen.deep_shortcuts_elevation); // Initialize arrow view @@ -139,6 +166,14 @@ public abstract class ArrowPopup> mRoundedBottom.setColor(mBackgroundColor); mRoundedBottom.setCornerRadii(new float[] { smallerRadius, smallerRadius, smallerRadius, smallerRadius, mOutlineRadius, mOutlineRadius, mOutlineRadius, mOutlineRadius}); + + mIterateChildrenTag = getContext().getString(R.string.popup_container_iterate_children); + + boolean isAboveAnotherSurface = getTopOpenViewWithType(mLauncher, TYPE_FOLDER) != null + || mLauncher.getStateManager().getState() == LauncherState.ALL_APPS; + if (!isAboveAnotherSurface && Utilities.ATLEAST_S) { + setupColorExtraction(); + } } public ArrowPopup(Context context, AttributeSet attrs) { @@ -184,11 +219,11 @@ public abstract class ArrowPopup> /** * Set the margins and radius of backgrounds after views are properly ordered. */ - protected void assignMarginsAndBackgrounds() { - int count = getChildCount(); + public void assignMarginsAndBackgrounds(ViewGroup viewGroup) { + int count = viewGroup.getChildCount(); int totalVisibleShortcuts = 0; for (int i = 0; i < count; i++) { - View view = getChildAt(i); + View view = viewGroup.getChildAt(i); if (view.getVisibility() == VISIBLE && view instanceof DeepShortcutView) { totalVisibleShortcuts++; } @@ -197,8 +232,7 @@ public abstract class ArrowPopup> int numVisibleShortcut = 0; View lastView = null; for (int i = 0; i < count; i++) { - View view = getChildAt(i); - boolean isShortcut = view instanceof DeepShortcutView; + View view = viewGroup.getChildAt(i); if (view.getVisibility() == VISIBLE) { if (lastView != null) { MarginLayoutParams mlp = (MarginLayoutParams) lastView.getLayoutParams(); @@ -208,7 +242,12 @@ public abstract class ArrowPopup> MarginLayoutParams mlp = (MarginLayoutParams) lastView.getLayoutParams(); mlp.bottomMargin = 0; - if (isShortcut) { + if (view instanceof ViewGroup && mIterateChildrenTag.equals(view.getTag())) { + assignMarginsAndBackgrounds((ViewGroup) view); + continue; + } + + if (view instanceof DeepShortcutView) { if (totalVisibleShortcuts == 1) { view.setBackgroundResource(R.drawable.single_item_primary); } else if (totalVisibleShortcuts > 1) { @@ -227,6 +266,118 @@ public abstract class ArrowPopup> measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED); } + + @TargetApi(Build.VERSION_CODES.S) + private int getExtractedColor(SparseIntArray colors) { + int index = Utilities.isDarkTheme(getContext()) + ? DARK_COLOR_EXTRACTION_INDEX + : LIGHT_COLOR_EXTRACTION_INDEX; + return colors.get(index, mBackgroundColor); + } + + @TargetApi(Build.VERSION_CODES.S) + private void setupColorExtraction() { + Workspace workspace = mLauncher.findViewById(R.id.workspace); + if (workspace == null) { + return; + } + + mColorExtractor = LocalColorExtractor.newInstance(mLauncher); + mColorExtractor.setListener((rect, extractedColors) -> { + String rectString = rect.toShortString(); + View v = mViewForRect.get(rectString); + AnimatorSet colors = new AnimatorSet(); + if (v != null) { + int newColor = getExtractedColor(extractedColors); + setChildColor(v, newColor, colors); + int numChildren = v instanceof ViewGroup ? ((ViewGroup) v).getChildCount() : 0; + for (int i = 0; i < numChildren; ++i) { + View childView = ((ViewGroup) v).getChildAt(i); + setChildColor(childView, newColor, colors); + + } + if (rectString.equals(mArrowColorRectString)) { + mArrowColor = newColor; + updateArrowColor(); + } + } + colors.setDuration(150); + v.post(colors::start); + }); + } + + protected void addPreDrawForColorExtraction(Launcher launcher) { + getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { + @Override + public boolean onPreDraw() { + getViewTreeObserver().removeOnPreDrawListener(this); + initColorExtractionLocations(launcher); + return true; + } + }); + } + + /** + * Returns list of child views that will receive local color extraction treatment. + * Note: Order should match the view hierarchy. + */ + protected List getChildrenForColorExtraction() { + return Collections.emptyList(); + } + + private void initColorExtractionLocations(Launcher launcher) { + if (mColorExtractor == null) { + return; + } + ArrayList locations = new ArrayList<>(); + + boolean firstVisibleChild = true; + // Order matters here, since we need the arrow to match the color of its adjacent view. + for (View view : getChildrenForColorExtraction()) { + if (view != null && view.getVisibility() == VISIBLE) { + RectF rf = new RectF(); + mColorExtractor.getExtractedRectForView(launcher, + launcher.getWorkspace().getCurrentPage(), view, rf); + if (!rf.isEmpty()) { + locations.add(rf); + String rectString = rf.toShortString(); + mViewForRect.put(rectString, view); + if (mIsAboveIcon) { + mArrowColorRectString = rectString; + } else { + if (firstVisibleChild) { + mArrowColorRectString = rectString; + } + } + + if (firstVisibleChild) { + firstVisibleChild = false; + } + + } + } + } + if (!locations.isEmpty()) { + mColorExtractor.addLocation(locations); + } + } + + /** + * Sets the background color of the child. + */ + protected void setChildColor(View view, int color, AnimatorSet animatorSetOut) { + Drawable bg = view.getBackground(); + if (bg instanceof GradientDrawable) { + GradientDrawable gd = (GradientDrawable) bg.mutate(); + int oldColor = ((GradientDrawable) bg).getColor().getDefaultColor(); + animatorSetOut.play(ObjectAnimator.ofArgb(gd, "color", oldColor, color)); + } else if (bg instanceof ColorDrawable) { + ColorDrawable cd = (ColorDrawable) bg.mutate(); + int oldColor = ((ColorDrawable) bg).getColor(); + animatorSetOut.play(ObjectAnimator.ofArgb(cd, "color", oldColor, color)); + } + } + /** * Shows the popup at the desired location, optionally reversing the children. * @param viewsToFlip number of views from the top to to flip in case of reverse order @@ -238,7 +389,7 @@ public abstract class ArrowPopup> reverseOrder(viewsToFlip); } onInflationComplete(reverseOrder); - assignMarginsAndBackgrounds(); + assignMarginsAndBackgrounds(this); if (shouldAddArrow()) { addArrow(); } @@ -251,7 +402,7 @@ public abstract class ArrowPopup> protected void show() { setupForDisplay(); onInflationComplete(false); - assignMarginsAndBackgrounds(); + assignMarginsAndBackgrounds(this); if (shouldAddArrow()) { addArrow(); } @@ -297,18 +448,24 @@ public abstract class ArrowPopup> // so we centered it instead. In that case we don't want to showDefaultOptions the arrow. mArrow.setVisibility(INVISIBLE); } else { + updateArrowColor(); + } + + mArrow.setPivotX(mArrowWidth / 2.0f); + mArrow.setPivotY(mIsAboveIcon ? mArrowHeight : 0); + } + + private void updateArrowColor() { + if (!Gravity.isVertical(mGravity)) { mArrow.setBackground(new RoundedArrowDrawable( mArrowWidth, mArrowHeight, mArrowPointRadius, mOutlineRadius, getMeasuredWidth(), getMeasuredHeight(), mArrowOffsetHorizontal, -mArrowOffsetVertical, !mIsAboveIcon, mIsLeftAligned, - mBackgroundColor)); + mArrowColor)); // TODO: Remove elevation when arrow is above as it casts a shadow on the container mArrow.setElevation(mIsAboveIcon ? mElevation : 0); } - - mArrow.setPivotX(mArrowWidth / 2.0f); - mArrow.setPivotY(mIsAboveIcon ? mArrowHeight : 0); } /** @@ -506,7 +663,7 @@ public abstract class ArrowPopup> private AnimatorSet getOpenCloseAnimator(boolean isOpening, int totalDuration, int fadeStartDelay, int fadeDuration, int childFadeStartDelay, int childFadeDuration, Interpolator interpolator) { - final AnimatorSet openAnim = new AnimatorSet(); + final AnimatorSet animatorSet = new AnimatorSet(); float[] alphaValues = isOpening ? new float[] {0, 1} : new float[] {1, 0}; float[] scaleValues = isOpening ? new float[] {0.5f, 1} : new float[] {1, 0.5f}; @@ -519,32 +676,41 @@ public abstract class ArrowPopup> mArrow.setAlpha(alpha); setAlpha(alpha); }); - openAnim.play(fade); + animatorSet.play(fade); setPivotX(mIsLeftAligned ? 0 : getMeasuredWidth()); setPivotY(mIsAboveIcon ? getMeasuredHeight() : 0); Animator scale = ObjectAnimator.ofFloat(this, View.SCALE_Y, scaleValues); scale.setDuration(totalDuration); scale.setInterpolator(interpolator); - openAnim.play(scale); + animatorSet.play(scale); - for (int i = getChildCount() - 1; i >= 0; --i) { - View view = getChildAt(i); + fadeInChildViews(this, alphaValues, childFadeStartDelay, childFadeDuration, animatorSet); + + return animatorSet; + } + + private void fadeInChildViews(ViewGroup group, float[] alphaValues, long startDelay, + long duration, AnimatorSet out) { + for (int i = group.getChildCount() - 1; i >= 0; --i) { + View view = group.getChildAt(i); if (view.getVisibility() == VISIBLE && view instanceof ViewGroup) { + if (mIterateChildrenTag.equals(view.getTag())) { + fadeInChildViews((ViewGroup) view, alphaValues, startDelay, duration, out); + continue; + } for (int j = ((ViewGroup) view).getChildCount() - 1; j >= 0; --j) { View childView = ((ViewGroup) view).getChildAt(j); - childView.setAlpha(alphaValues[0]); ValueAnimator childFade = ObjectAnimator.ofFloat(childView, ALPHA, alphaValues); - childFade.setStartDelay(childFadeStartDelay); - childFade.setDuration(childFadeDuration); + childFade.setStartDelay(startDelay); + childFade.setDuration(duration); childFade.setInterpolator(LINEAR); - openAnim.play(childFade); + out.play(childFade); } } } - return openAnim; } @@ -593,6 +759,12 @@ public abstract class ArrowPopup> getPopupContainer().removeView(this); getPopupContainer().removeView(mArrow); mOnCloseCallback.run(); + mArrowColorRectString = null; + mViewForRect.clear(); + if (mColorExtractor != null) { + mColorExtractor.removeLocations(); + mColorExtractor.setListener(null); + } } /** diff --git a/src/com/android/launcher3/popup/PopupContainerWithArrow.java b/src/com/android/launcher3/popup/PopupContainerWithArrow.java index b115678562..332390d8e2 100644 --- a/src/com/android/launcher3/popup/PopupContainerWithArrow.java +++ b/src/com/android/launcher3/popup/PopupContainerWithArrow.java @@ -71,6 +71,7 @@ import com.android.launcher3.util.ShortcutUtil; import com.android.launcher3.views.BaseDragLayer; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.Objects; @@ -95,6 +96,8 @@ public class PopupContainerWithArrow> private int mNumNotifications; private ViewGroup mNotificationContainer; + private ViewGroup mDeepShortcutContainer; + private ViewGroup mSystemShortcutContainer; protected PopupItemDragHandler mPopupItemDragHandler; @@ -172,6 +175,14 @@ public class PopupContainerWithArrow> return false; } + @Override + protected void setChildColor(View view, int color, AnimatorSet animatorSetOut) { + super.setChildColor(view, color, animatorSetOut); + if (view.getId() == R.id.notification_container && mNotificationItemView != null) { + mNotificationItemView.updateBackgroundColor(color, animatorSetOut); + } + } + /** * Returns true if we can show the container. */ @@ -218,6 +229,13 @@ public class PopupContainerWithArrow> mPopupItemDragHandler = new LauncherPopupItemDragHandler(launcher, this); mAccessibilityDelegate = new ShortcutMenuAccessibilityDelegate(launcher); launcher.getDragController().addDragListener(this); + addPreDrawForColorExtraction(launcher); + } + + @Override + protected List getChildrenForColorExtraction() { + return Arrays.asList(mSystemShortcutContainer, mDeepShortcutContainer, + mNotificationContainer); } @Override @@ -262,13 +280,18 @@ public class PopupContainerWithArrow> } int viewsToFlip = getChildCount(); mSystemShortcutContainer = this; + if (mDeepShortcutContainer == null) { + mDeepShortcutContainer = findViewById(R.id.deep_shortcuts_container); + } if (hasDeepShortcuts) { + mDeepShortcutContainer.setVisibility(View.VISIBLE); + if (mNotificationItemView != null) { mNotificationItemView.addGutter(); } for (int i = shortcutCount; i > 0; i--) { - DeepShortcutView v = inflateAndAdd(R.layout.deep_shortcut, this); + DeepShortcutView v = inflateAndAdd(R.layout.deep_shortcut, mDeepShortcutContainer); v.getLayoutParams().width = containerWidth; mShortcuts.add(v); } @@ -281,13 +304,16 @@ public class PopupContainerWithArrow> R.layout.system_shortcut_icon_only, mSystemShortcutContainer, shortcut); } } - } else if (!systemShortcuts.isEmpty()) { - if (mNotificationItemView != null) { - mNotificationItemView.addGutter(); - } + } else { + mDeepShortcutContainer.setVisibility(View.GONE); + if (!systemShortcuts.isEmpty()) { + if (mNotificationItemView != null) { + mNotificationItemView.addGutter(); + } - for (SystemShortcut shortcut : systemShortcuts) { - initializeSystemShortcut(R.layout.system_shortcut, this, shortcut); + for (SystemShortcut shortcut : systemShortcuts) { + initializeSystemShortcut(R.layout.system_shortcut, this, shortcut); + } } } @@ -563,7 +589,7 @@ public class PopupContainerWithArrow> mNotificationItemView = null; mNotificationContainer.setVisibility(GONE); updateHiddenShortcuts(); - assignMarginsAndBackgrounds(); + assignMarginsAndBackgrounds(PopupContainerWithArrow.this); } else { mNotificationItemView.trimNotifications( NotificationKeyData.extractKeysOnly(dotInfo.getNotificationKeys())); diff --git a/src/com/android/launcher3/views/OptionsPopupView.java b/src/com/android/launcher3/views/OptionsPopupView.java index 98cc876c93..06ccbbd53e 100644 --- a/src/com/android/launcher3/views/OptionsPopupView.java +++ b/src/com/android/launcher3/views/OptionsPopupView.java @@ -146,13 +146,25 @@ public class OptionsPopupView extends ArrowPopup view.setOnLongClickListener(popup); popup.mItemMap.put(view, item); } + + popup.addPreDrawForColorExtraction(launcher); popup.show(); return popup; } + @Override + protected List getChildrenForColorExtraction() { + int childCount = getChildCount(); + ArrayList children = new ArrayList<>(childCount); + for (int i = 0; i < childCount; ++i) { + children.add(getChildAt(i)); + } + return children; + } + @VisibleForTesting public static ArrowPopup getOptionsPopup(Launcher launcher) { - return launcher.findViewById(R.id.deep_shortcuts_container); + return launcher.findViewById(R.id.popup_container); } public static void showDefaultOptions(Launcher launcher, float x, float y) { diff --git a/tests/tapl/com/android/launcher3/tapl/AppIcon.java b/tests/tapl/com/android/launcher3/tapl/AppIcon.java index 5de5b4a0a6..56723b18d2 100644 --- a/tests/tapl/com/android/launcher3/tapl/AppIcon.java +++ b/tests/tapl/com/android/launcher3/tapl/AppIcon.java @@ -47,7 +47,7 @@ public final class AppIcon extends Launchable { public AppIconMenu openMenu() { try (LauncherInstrumentation.Closable e = mLauncher.eventsCheck()) { return new AppIconMenu(mLauncher, mLauncher.clickAndGet( - mObject, "deep_shortcuts_container", LONG_CLICK_EVENT)); + mObject, "popup_container", LONG_CLICK_EVENT)); } } @@ -58,7 +58,7 @@ public final class AppIcon extends Launchable { @Override protected String getLongPressIndicator() { - return "deep_shortcuts_container"; + return "popup_container"; } @Override diff --git a/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java b/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java index c99a81f0f6..bf7984eb53 100644 --- a/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java +++ b/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java @@ -155,7 +155,7 @@ public final class LauncherInstrumentation { private static final String APPS_RES_ID = "apps_view"; private static final String OVERVIEW_RES_ID = "overview_panel"; private static final String WIDGETS_RES_ID = "primary_widgets_list_view"; - private static final String CONTEXT_MENU_RES_ID = "deep_shortcuts_container"; + private static final String CONTEXT_MENU_RES_ID = "popup_container"; public static final int WAIT_TIME_MS = 60000; private static final String SYSTEMUI_PACKAGE = "com.android.systemui"; private static final String ANDROID_PACKAGE = "android"; diff --git a/tests/tapl/com/android/launcher3/tapl/OptionsPopupMenu.java b/tests/tapl/com/android/launcher3/tapl/OptionsPopupMenu.java index 282fca9333..787dc70063 100644 --- a/tests/tapl/com/android/launcher3/tapl/OptionsPopupMenu.java +++ b/tests/tapl/com/android/launcher3/tapl/OptionsPopupMenu.java @@ -26,7 +26,7 @@ public class OptionsPopupMenu { OptionsPopupMenu(LauncherInstrumentation launcher) { mLauncher = launcher; - mDeepShortcutsContainer = launcher.waitForLauncherObject("deep_shortcuts_container"); + mDeepShortcutsContainer = launcher.waitForLauncherObject("popup_container"); } /** diff --git a/tests/tapl/com/android/launcher3/tapl/Workspace.java b/tests/tapl/com/android/launcher3/tapl/Workspace.java index d43e2352a2..36246245bd 100644 --- a/tests/tapl/com/android/launcher3/tapl/Workspace.java +++ b/tests/tapl/com/android/launcher3/tapl/Workspace.java @@ -179,7 +179,7 @@ public final class Workspace extends Home { getHotseatAppIcon("Chrome"), new Point(mLauncher.getDevice().getDisplayWidth(), mLauncher.getVisibleBounds(workspace).centerY()), - "deep_shortcuts_container", + "popup_container", false, false, () -> mLauncher.expectEvent(