Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f892756e authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Revert "Use color extraction for arrow popup."" into sc-dev

parents 299de3f2 17fda29b
Loading
Loading
Loading
Loading
+2 −9
Original line number Diff line number Diff line
@@ -18,7 +18,6 @@ package com.android.launcher3;

import static android.animation.ValueAnimator.areAnimatorsEnabled;

import static com.android.launcher3.Utilities.getBoundsForViewInDragLayer;
import static com.android.launcher3.anim.Interpolators.DEACCEL_1_5;

import android.animation.Animator;
@@ -194,7 +193,6 @@ public class CellLayout extends ViewGroup {
    private static final int INVALID_DIRECTION = -100;

    private final Rect mTempRect = new Rect();
    private final RectF mTempRectF = new RectF();

    private static final Paint sPaint = new Paint();

@@ -1069,16 +1067,11 @@ public class CellLayout extends ViewGroup {
        // Apply local extracted color if the DragView is an AppWidgetHostViewDrawable.
        View view = dragObject.dragView.getContentView();
        if (view instanceof LauncherAppWidgetHostView) {
            Launcher launcher = Launcher.getLauncher(dragObject.dragView.getContext());
            Workspace workspace = launcher.getWorkspace();
            Workspace workspace =
                    Launcher.getLauncher(dragObject.dragView.getContext()).getWorkspace();
            int screenId = workspace.getIdForScreen(this);
            int pageId = workspace.getPageIndexForScreenId(screenId);
            cellToRect(targetCell[0], targetCell[1], spanX, spanY, mTempRect);

            // Now get the rect in drag layer coordinates.
            getBoundsForViewInDragLayer(launcher.getDragLayer(), workspace, mTempRect, false,
                    mTempRectF);
            Utilities.setRect(mTempRectF, mTempRect);
            ((LauncherAppWidgetHostView) view).handleDrag(mTempRect, pageId);
        }
    }
+0 −50
Original line number Diff line number Diff line
@@ -33,7 +33,6 @@ import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.content.pm.ShortcutInfo;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.database.ContentObserver;
import android.graphics.Bitmap;
@@ -85,7 +84,6 @@ import com.android.launcher3.shortcuts.ShortcutKey;
import com.android.launcher3.shortcuts.ShortcutRequest;
import com.android.launcher3.util.IntArray;
import com.android.launcher3.util.PackageManagerHelper;
import com.android.launcher3.views.BaseDragLayer;
import com.android.launcher3.widget.PendingAddShortcutInfo;

import java.lang.reflect.Method;
@@ -106,8 +104,6 @@ public final class Utilities {
    private static final Pattern sTrimPattern =
            Pattern.compile("^[\\s|\\p{javaSpaceChar}]*(.*)[\\s|\\p{javaSpaceChar}]*$");

    private static final float[] sTmpFloatArray = new float[4];

    private static final int[] sLoc0 = new int[2];
    private static final int[] sLoc1 = new int[2];
    private static final Matrix sMatrix = new Matrix();
@@ -137,15 +133,6 @@ public final class Utilities {
            Build.TYPE.toLowerCase(Locale.ROOT).contains("debug") ||
            Build.TYPE.toLowerCase(Locale.ROOT).equals("eng");

    /**
     * Returns true if theme is dark.
     */
    public static boolean isDarkTheme(Context context) {
        Configuration configuration = context.getResources().getConfiguration();
        int nightMode = configuration.uiMode & Configuration.UI_MODE_NIGHT_MASK;
        return nightMode == Configuration.UI_MODE_NIGHT_YES;
    }

    public static boolean isDevelopersOptionsEnabled(Context context) {
        return Settings.Global.getInt(context.getApplicationContext().getContentResolver(),
                        Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, 0) != 0;
@@ -231,33 +218,6 @@ public final class Utilities {
        return scale;
    }

    /**
     * Returns bounds for a child view of DragLayer, in drag layer coordinates.
     *
     * see {@link com.android.launcher3.dragndrop.DragLayer}.
     *
     * @param viewBounds Bounds of the view wanted in drag layer coordinates, relative to the view
     *                   itself. eg. (0, 0, view.getWidth, view.getHeight)
     * @param ignoreTransform If true, view transform is ignored
     * @param outRect The out rect where we return the bounds of {@param view} in drag layer coords.
     */
    public static void getBoundsForViewInDragLayer(BaseDragLayer dragLayer, View view,
            Rect viewBounds, boolean ignoreTransform, RectF outRect) {
        float[] points = sTmpFloatArray;
        points[0] = viewBounds.left;
        points[1] = viewBounds.top;
        points[2] = viewBounds.right;
        points[3] = viewBounds.bottom;

        Utilities.getDescendantCoordRelativeToAncestor(view, dragLayer, points,
                false, ignoreTransform);
        outRect.set(
                Math.min(points[0], points[2]),
                Math.min(points[1], points[3]),
                Math.max(points[0], points[2]),
                Math.max(points[1], points[3]));
    }

    /**
     * Inverse of {@link #getDescendantCoordRelativeToAncestor(View, View, float[], boolean)}.
     */
@@ -313,16 +273,6 @@ public final class Utilities {
        return new int[] {sLoc1[0] - sLoc0[0], sLoc1[1] - sLoc0[1]};
    }

    /**
     * Helper method to set rectOut with rectFSrc.
     */
    public static void setRect(RectF rectFSrc, Rect rectOut) {
        rectOut.left = (int) rectFSrc.left;
        rectOut.top = (int) rectFSrc.top;
        rectOut.right = (int) rectFSrc.right;
        rectOut.bottom = (int) rectFSrc.bottom;
    }

    public static void scaleRectFAboutCenter(RectF r, float scale) {
        if (scale != 1.0f) {
            float cx = r.centerX();
+4 −2
Original line number Diff line number Diff line
@@ -21,6 +21,7 @@ import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.ObjectAnimator;
import android.content.Context;
import android.content.res.Configuration;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Matrix;
@@ -33,7 +34,6 @@ import android.util.Property;
import android.util.SparseArray;
import android.view.ContextThemeWrapper;

import com.android.launcher3.Utilities;
import com.android.launcher3.anim.Interpolators;
import com.android.launcher3.icons.FastBitmapDrawable;
import com.android.launcher3.icons.GraphicsUtils;
@@ -119,7 +119,9 @@ public class PreloadIconDrawable extends FastBitmapDrawable {
                info,
                IconPalette.getPreloadProgressColor(context, info.bitmap.color),
                getPreloadColors(context),
                Utilities.isDarkTheme(context));
            (context.getResources().getConfiguration().uiMode
                    & Configuration.UI_MODE_NIGHT_MASK
                    & Configuration.UI_MODE_NIGHT_YES) != 0) /* isDarkMode */;
    }

    public PreloadIconDrawable(
+5 −100
Original line number Diff line number Diff line
@@ -16,9 +16,9 @@

package com.android.launcher3.popup;

import static com.android.launcher3.AbstractFloatingView.getTopOpenViewWithType;
import static com.android.launcher3.anim.Interpolators.ACCEL_DEACCEL;
import static com.android.launcher3.popup.PopupPopulator.MAX_SHORTCUTS;
import static com.android.launcher3.util.ColorExtractionUtils.getColorExtractionRect;

import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
@@ -31,7 +31,6 @@ import android.content.Context;
import android.content.res.Resources;
import android.graphics.Outline;
import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.GradientDrawable;
@@ -42,21 +41,17 @@ import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewOutlineProvider;
import android.view.ViewTreeObserver;
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.LauncherAnimUtils;
import com.android.launcher3.LauncherState;
import com.android.launcher3.R;
import com.android.launcher3.Utilities;
import com.android.launcher3.Workspace;
import com.android.launcher3.anim.RevealOutlineAnimation;
import com.android.launcher3.anim.RoundedRectRevealOutlineProvider;
import com.android.launcher3.dragndrop.DragLayer;
@@ -64,11 +59,9 @@ 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;

/**
 * A container for shortcuts to deep links and notifications associated with an app.
@@ -80,9 +73,6 @@ public abstract class ArrowPopup<T extends StatefulActivity<LauncherState>>

    // +1 for system shortcut view
    private static final int MAX_NUM_CHILDREN = MAX_SHORTCUTS + 1;
    // Index used to get background color when using local wallpaper color extraction,
    private static final int LIGHT_COLOR_EXTRACTION_INDEX = android.R.color.system_accent2_50;
    private static final int DARK_COLOR_EXTRACTION_INDEX = android.R.color.system_accent2_800;

    private final Rect mTempRect = new Rect();

@@ -114,14 +104,8 @@ public abstract class ArrowPopup<T extends StatefulActivity<LauncherState>>

    private Runnable mOnCloseCallback = () -> { };

    // The rect string of the view that the arrow is attached to, in screen reference frame.
    private String mArrowColorRectString;
    private int mArrowColor;
    private final int[] mColors;
    private final HashMap<String, View> mViewForRect = new HashMap<>();

    private final int mColorExtractionIndex;
    @Nullable private LocalColorExtractor mColorExtractor;

    public ArrowPopup(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
@@ -129,9 +113,7 @@ public abstract class ArrowPopup<T extends StatefulActivity<LauncherState>>
        mOutlineRadius = Themes.getDialogCornerRadius(context);
        mLauncher = BaseDraggingActivity.fromContext(context);
        mIsRtl = Utilities.isRtl(getResources());
        mColorExtractionIndex = Utilities.isDarkTheme(context)
                ? DARK_COLOR_EXTRACTION_INDEX
                : LIGHT_COLOR_EXTRACTION_INDEX;

        setClipToOutline(true);
        setOutlineProvider(new ViewOutlineProvider() {
            @Override
@@ -176,10 +158,6 @@ public abstract class ArrowPopup<T extends StatefulActivity<LauncherState>>
                mColors[i] =
                        (int) argb.evaluate((i + 1) * step, primaryColor, secondaryColor);
            }

            if (Utilities.ATLEAST_S) {
                setupColorExtraction();
            }
        }
    }

@@ -364,15 +342,6 @@ public abstract class ArrowPopup<T extends StatefulActivity<LauncherState>>
            // 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(),
@@ -381,6 +350,9 @@ public abstract class ArrowPopup<T extends StatefulActivity<LauncherState>>
                    mArrowColor));
            mArrow.setElevation(getElevation());
        }

        mArrow.setPivotX(mArrowWidth / 2.0f);
        mArrow.setPivotY(mIsAboveIcon ? mArrowHeight : 0);
    }

    /**
@@ -699,11 +671,6 @@ public abstract class ArrowPopup<T extends StatefulActivity<LauncherState>>
        getPopupContainer().removeView(this);
        getPopupContainer().removeView(mArrow);
        mOnCloseCallback.run();
        mArrowColorRectString = null;
        mViewForRect.clear();
        if (mColorExtractor != null) {
            mColorExtractor.removeLocations();
        }
    }

    /**
@@ -713,68 +680,6 @@ public abstract class ArrowPopup<T extends StatefulActivity<LauncherState>>
        mOnCloseCallback = callback;
    }

    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);
            if (v != null) {
                int newColor = extractedColors.get(mColorExtractionIndex);
                setChildColor(v, newColor);
                if (rectString.equals(mArrowColorRectString)) {
                    mArrowColor = newColor;
                    updateArrowColor();
                }
            }
        });

        getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
            @Override
            public boolean onPreDraw() {
                getViewTreeObserver().removeOnPreDrawListener(this);

                ArrayList<RectF> locations = new ArrayList<>();
                Rect r = new Rect();

                int count = getChildCount();
                int numVisibleChild = 0;
                for (int i = 0; i < count; i++) {
                    View view = getChildAt(i);
                    if (view.getVisibility() == VISIBLE) {
                        RectF rf = new RectF();
                        getColorExtractionRect(Launcher.getLauncher(getContext()),
                                workspace.getCurrentPage(), view, rf);
                        if (rf.isEmpty()) {
                            numVisibleChild++;
                            continue;
                        }

                        locations.add(rf);
                        String rectString = rf.toShortString();
                        mViewForRect.put(rectString, view);

                        // Arrow color matches the first child or the last child.
                        if (!mIsAboveIcon && numVisibleChild == 0) {
                            mArrowColorRectString = rectString;
                        } else if (mIsAboveIcon) {
                            mArrowColorRectString = rectString;
                        }

                        numVisibleChild++;
                    }
                }

                mColorExtractor.addLocation(locations);
                return false;
            }
        });
    }

    protected BaseDragLayer getPopupContainer() {
        return mLauncher.getDragLayer();
    }
+0 −110
Original line number Diff line number Diff line
/*
 * Copyright (C) 2021 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.util;

import android.content.res.Resources;
import android.graphics.Rect;
import android.graphics.RectF;
import android.view.View;

import com.android.launcher3.DeviceProfile;
import com.android.launcher3.Launcher;
import com.android.launcher3.Utilities;

/**
 * Utility class used to map launcher views to wallpaper rect.
 */
public class ColorExtractionUtils {

    public static final String TAG = "ColorExtractionUtils";

    private static final Rect sTempRect = new Rect();
    private static final RectF sTempRectF = new RectF();

    /**
     * Takes a view and returns its rect that can be used by the wallpaper local color extractor.
     *
     * @param launcher Launcher class class.
     * @param pageId The page the workspace item is on.
     * @param v The view.
     * @param colorExtractionRectOut The location rect, but converted to a format expected by the
     *                               wallpaper local color extractor.
     */
    public static void getColorExtractionRect(Launcher launcher, int pageId, View v,
            RectF colorExtractionRectOut) {
        Rect viewRect = sTempRect;
        viewRect.set(0, 0, v.getWidth(), v.getHeight());
        Utilities.getBoundsForViewInDragLayer(launcher.getDragLayer(), v, viewRect, false,
                sTempRectF);
        Utilities.setRect(sTempRectF, viewRect);
        getColorExtractionRect(launcher, pageId, viewRect, colorExtractionRectOut);
    }

    /**
     * Takes a rect in drag layer coordinates and returns the rect that can be used by the wallpaper
     * local color extractor.
     *
     * @param launcher Launcher class.
     * @param pageId The page the workspace item is on.
     * @param rectInDragLayer The relevant bounds of the view in drag layer coordinates.
     * @param colorExtractionRectOut The location rect, but converted to a format expected by the
     *                               wallpaper local color extractor.
     */
    public static void getColorExtractionRect(Launcher launcher, int pageId, Rect rectInDragLayer,
            RectF colorExtractionRectOut) {
        // If the view hasn't been measured and laid out, we cannot do this.
        if (rectInDragLayer.isEmpty()) {
            colorExtractionRectOut.setEmpty();
            return;
        }

        Resources res = launcher.getResources();
        DeviceProfile dp = launcher.getDeviceProfile().inv.getDeviceProfile(launcher);
        float screenWidth = dp.widthPx;
        float screenHeight = dp.heightPx;
        int numScreens = launcher.getWorkspace().getNumPagesForWallpaperParallax();
        pageId = Utilities.isRtl(res) ? numScreens - pageId - 1 : pageId;
        float relativeScreenWidth = 1f / numScreens;

        int[] dragLayerBounds = new int[2];
        launcher.getDragLayer().getLocationOnScreen(dragLayerBounds);
        // Translate from drag layer coordinates to screen coordinates.
        int screenLeft = rectInDragLayer.left + dragLayerBounds[0];
        int screenTop = rectInDragLayer.top + dragLayerBounds[1];
        int screenRight = rectInDragLayer.right + dragLayerBounds[0];
        int screenBottom = rectInDragLayer.bottom + dragLayerBounds[1];

        // This is the position of the view relative to the wallpaper, as expected by the
        // local color extraction of the WallpaperManager.
        // The coordinate system is such that, on the horizontal axis, each screen has a
        // distinct range on the [0,1] segment. So if there are 3 screens, they will have the
        // ranges [0, 1/3], [1/3, 2/3] and [2/3, 1]. The position on the subrange should be
        // the position of the view relative to the screen. For the vertical axis, this is
        // simply the location of the view relative to the screen.
        // Translate from drag layer coordinates to screen coordinates
        colorExtractionRectOut.left = (screenLeft / screenWidth + pageId) * relativeScreenWidth;
        colorExtractionRectOut.right = (screenRight / screenWidth + pageId) * relativeScreenWidth;
        colorExtractionRectOut.top = screenTop / screenHeight;
        colorExtractionRectOut.bottom = screenBottom / screenHeight;

        if (colorExtractionRectOut.left < 0
                || colorExtractionRectOut.right > 1
                || colorExtractionRectOut.top < 0
                || colorExtractionRectOut.bottom > 1) {
            colorExtractionRectOut.setEmpty();
        }
    }
}
Loading