Search in sources :

Example 91 with DragLayer

use of com.android.launcher3.dragndrop.DragLayer in project android_packages_apps_404Launcher by P-404.

the class AbsSwipeUpHandler method onLauncherStart.

private void onLauncherStart() {
    final T activity = mActivityInterface.getCreatedActivity();
    if (mActivity != activity) {
        return;
    }
    if (mStateCallback.hasStates(STATE_HANDLER_INVALIDATED)) {
        return;
    }
    // RecentsView never updates the display rotation until swipe-up, force update
    // RecentsOrientedState before passing to TaskViewSimulator.
    mRecentsView.updateRecentsRotation();
    runActionOnRemoteHandles(remoteTargetHandle -> remoteTargetHandle.getTaskViewSimulator().setOrientationState(mRecentsView.getPagedViewOrientedState()));
    // as that will set the state as BACKGROUND_APP, overriding the animation to NORMAL.
    if (mGestureState.getEndTarget() != HOME) {
        Runnable initAnimFactory = () -> {
            mAnimationFactory = mActivityInterface.prepareRecentsUI(mDeviceState, mWasLauncherAlreadyVisible, this::onAnimatorPlaybackControllerCreated);
            maybeUpdateRecentsAttachedState(false);
            if (mGestureState.getEndTarget() != null) {
                // Update the end target in case the gesture ended before we init.
                mAnimationFactory.setEndTarget(mGestureState.getEndTarget());
            }
        };
        if (mWasLauncherAlreadyVisible) {
            // Launcher is visible, but might be about to stop. Thus, if we prepare recents
            // now, it might get overridden by moveToRestState() in onStop(). To avoid this,
            // wait until the next gesture (and possibly launcher) starts.
            mStateCallback.runOnceAtState(STATE_GESTURE_STARTED, initAnimFactory);
        } else {
            initAnimFactory.run();
        }
    }
    AbstractFloatingView.closeAllOpenViewsExcept(activity, mWasLauncherAlreadyVisible, AbstractFloatingView.TYPE_LISTENER);
    if (mWasLauncherAlreadyVisible) {
        mStateCallback.setState(STATE_LAUNCHER_DRAWN);
    } else {
        Object traceToken = TraceHelper.INSTANCE.beginSection("WTS-init");
        View dragLayer = activity.getDragLayer();
        dragLayer.getViewTreeObserver().addOnDrawListener(new OnDrawListener() {

            boolean mHandled = false;

            @Override
            public void onDraw() {
                if (mHandled) {
                    return;
                }
                mHandled = true;
                TraceHelper.INSTANCE.endSection(traceToken);
                dragLayer.post(() -> dragLayer.getViewTreeObserver().removeOnDrawListener(this));
                if (activity != mActivity) {
                    return;
                }
                mStateCallback.setState(STATE_LAUNCHER_DRAWN);
            }
        });
    }
    activity.getRootView().setOnApplyWindowInsetsListener(this);
    mStateCallback.setState(STATE_LAUNCHER_STARTED);
}
Also used : LAUNCHER_QUICKSWITCH_RIGHT(com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_QUICKSWITCH_RIGHT) STATE_END_TARGET_SET(com.android.quickstep.GestureState.STATE_END_TARGET_SET) LAUNCHER_QUICKSWITCH_LEFT(com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_QUICKSWITCH_LEFT) LENGTH_SHORT(android.widget.Toast.LENGTH_SHORT) OnDrawListener(android.view.ViewTreeObserver.OnDrawListener) TaskView(com.android.quickstep.views.TaskView) View(android.view.View) RecentsView(com.android.quickstep.views.RecentsView) AbstractFloatingView(com.android.launcher3.AbstractFloatingView)

Example 92 with DragLayer

use of com.android.launcher3.dragndrop.DragLayer in project android_packages_apps_404Launcher by P-404.

the class ArrowPopup method onLayout.

@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
    super.onLayout(changed, l, t, r, b);
    // enforce contained is within screen
    BaseDragLayer dragLayer = getPopupContainer();
    Rect insets = dragLayer.getInsets();
    if (getTranslationX() + l < insets.left || getTranslationX() + r > dragLayer.getWidth() - insets.right) {
        // If we are still off screen, center horizontally too.
        mGravity |= Gravity.CENTER_HORIZONTAL;
    }
    if (Gravity.isHorizontal(mGravity)) {
        setX(dragLayer.getWidth() / 2 - getMeasuredWidth() / 2);
        mArrow.setVisibility(INVISIBLE);
    }
    if (Gravity.isVertical(mGravity)) {
        setY(dragLayer.getHeight() / 2 - getMeasuredHeight() / 2);
    }
}
Also used : BaseDragLayer(com.android.launcher3.views.BaseDragLayer) Rect(android.graphics.Rect)

Example 93 with DragLayer

use of com.android.launcher3.dragndrop.DragLayer in project android_packages_apps_404Launcher by P-404.

the class ArrowPopup method orientAboutObject.

/**
 * @see #orientAboutObject()
 *
 * @param allowAlignLeft Set to false if we already tried aligning left and didn't have room.
 * @param allowAlignRight Set to false if we already tried aligning right and didn't have room.
 * TODO: Can we test this with all permutations of widths/heights and icon locations + RTL?
 */
private void orientAboutObject(boolean allowAlignLeft, boolean allowAlignRight) {
    measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED);
    int extraVerticalSpace = mArrowHeight + mArrowOffsetVertical + getResources().getDimensionPixelSize(R.dimen.popup_vertical_padding);
    // The margins are added after we call this method, so we need to account for them here.
    int numVisibleChildren = 0;
    for (int i = getChildCount() - 1; i >= 0; --i) {
        if (getChildAt(i).getVisibility() == VISIBLE) {
            numVisibleChildren++;
        }
    }
    int childMargins = (numVisibleChildren - 1) * mMargin;
    int height = getMeasuredHeight() + extraVerticalSpace + childMargins;
    int width = getMeasuredWidth() + getPaddingLeft() + getPaddingRight();
    getTargetObjectLocation(mTempRect);
    InsettableFrameLayout dragLayer = getPopupContainer();
    Rect insets = dragLayer.getInsets();
    // Align left (right in RTL) if there is room.
    int leftAlignedX = mTempRect.left;
    int rightAlignedX = mTempRect.right - width;
    mIsLeftAligned = !mIsRtl ? allowAlignLeft : !allowAlignRight;
    int x = mIsLeftAligned ? leftAlignedX : rightAlignedX;
    // Offset x so that the arrow and shortcut icons are center-aligned with the original icon.
    int iconWidth = mTempRect.width();
    int xOffset = iconWidth / 2 - mArrowOffsetHorizontal - mArrowWidth / 2;
    x += mIsLeftAligned ? xOffset : -xOffset;
    // Check whether we can still align as we originally wanted, now that we've calculated x.
    if (!allowAlignLeft && !allowAlignRight) {
    // We've already tried both ways and couldn't make it fit. onLayout() will set the
    // gravity to CENTER_HORIZONTAL, but continue below to update y.
    } else {
        boolean canBeLeftAligned = x + width + insets.left < dragLayer.getWidth() - insets.right;
        boolean canBeRightAligned = x > insets.left;
        boolean alignmentStillValid = mIsLeftAligned && canBeLeftAligned || !mIsLeftAligned && canBeRightAligned;
        if (!alignmentStillValid) {
            // Try again, but don't allow this alignment we already know won't work.
            orientAboutObject(allowAlignLeft && !mIsLeftAligned, /* allowAlignLeft */
            allowAlignRight && mIsLeftAligned);
            return;
        }
    }
    // Open above icon if there is room.
    int iconHeight = mTempRect.height();
    int y = mTempRect.top - height;
    mIsAboveIcon = y > dragLayer.getTop() + insets.top;
    if (!mIsAboveIcon) {
        y = mTempRect.top + iconHeight + extraVerticalSpace;
    }
    // Insets are added later, so subtract them now.
    x -= insets.left;
    y -= insets.top;
    mGravity = 0;
    if (y + height > dragLayer.getBottom() - insets.bottom) {
        // The container is opening off the screen, so just center it in the drag layer instead.
        mGravity = Gravity.CENTER_VERTICAL;
        // Put the container next to the icon, preferring the right side in ltr (left in rtl).
        int rightSide = leftAlignedX + iconWidth - insets.left;
        int leftSide = rightAlignedX - iconWidth - insets.left;
        if (!mIsRtl) {
            if (rightSide + width < dragLayer.getRight()) {
                x = rightSide;
                mIsLeftAligned = true;
            } else {
                x = leftSide;
                mIsLeftAligned = false;
            }
        } else {
            if (leftSide > dragLayer.getLeft()) {
                x = leftSide;
                mIsLeftAligned = false;
            } else {
                x = rightSide;
                mIsLeftAligned = true;
            }
        }
        mIsAboveIcon = true;
    }
    setX(x);
    if (Gravity.isVertical(mGravity)) {
        return;
    }
    FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) getLayoutParams();
    FrameLayout.LayoutParams arrowLp = (FrameLayout.LayoutParams) mArrow.getLayoutParams();
    if (mIsAboveIcon) {
        arrowLp.gravity = lp.gravity = Gravity.BOTTOM;
        lp.bottomMargin = getPopupContainer().getHeight() - y - getMeasuredHeight() - insets.top;
        arrowLp.bottomMargin = lp.bottomMargin - arrowLp.height - mArrowOffsetVertical - insets.bottom;
    } else {
        arrowLp.gravity = lp.gravity = Gravity.TOP;
        lp.topMargin = y + insets.top;
        arrowLp.topMargin = lp.topMargin - insets.top - arrowLp.height - mArrowOffsetVertical;
    }
}
Also used : Rect(android.graphics.Rect) FrameLayout(android.widget.FrameLayout) InsettableFrameLayout(com.android.launcher3.InsettableFrameLayout) InsettableFrameLayout(com.android.launcher3.InsettableFrameLayout)

Example 94 with DragLayer

use of com.android.launcher3.dragndrop.DragLayer in project android_packages_apps_404Launcher by P-404.

the class ArrowPopup method initColorExtractionLocations.

private void initColorExtractionLocations(Launcher launcher) {
    if (mColorExtractors == null) {
        return;
    }
    Workspace workspace = launcher.getWorkspace();
    if (workspace == null) {
        return;
    }
    boolean firstVisibleChild = true;
    int screenId = workspace.getScreenIdForPageIndex(workspace.getCurrentPage());
    DragLayer dragLayer = launcher.getDragLayer();
    final View[] viewAlignedWithArrow = new View[1];
    // Order matters here, since we need the arrow to match the color of its adjacent view.
    for (final View view : getChildrenForColorExtraction()) {
        if (view != null && view.getVisibility() == VISIBLE) {
            Rect pos = new Rect();
            dragLayer.getDescendantRectRelativeToSelf(view, pos);
            if (!pos.isEmpty()) {
                LocalColorExtractor extractor = LocalColorExtractor.newInstance(launcher);
                extractor.setWorkspaceLocation(pos, dragLayer, screenId);
                extractor.setListener(extractedColors -> {
                    AnimatorSet colors = new AnimatorSet();
                    int newColor = getExtractedColor(extractedColors);
                    setChildColor(view, newColor, colors);
                    int numChildren = view instanceof ViewGroup ? ((ViewGroup) view).getChildCount() : 0;
                    for (int i = 0; i < numChildren; ++i) {
                        View childView = ((ViewGroup) view).getChildAt(i);
                        setChildColor(childView, newColor, colors);
                    }
                    if (viewAlignedWithArrow[0] == view) {
                        mArrowColor = newColor;
                        updateArrowColor();
                    }
                    colors.setDuration(150);
                    view.post(colors::start);
                });
                mColorExtractors.add(extractor);
                if (mIsAboveIcon || firstVisibleChild) {
                    viewAlignedWithArrow[0] = view;
                }
                firstVisibleChild = false;
            }
        }
    }
}
Also used : BaseDragLayer(com.android.launcher3.views.BaseDragLayer) DragLayer(com.android.launcher3.dragndrop.DragLayer) Rect(android.graphics.Rect) ViewGroup(android.view.ViewGroup) AnimatorSet(android.animation.AnimatorSet) LocalColorExtractor(com.android.launcher3.widget.LocalColorExtractor) View(android.view.View) DeepShortcutView(com.android.launcher3.shortcuts.DeepShortcutView) AbstractFloatingView(com.android.launcher3.AbstractFloatingView) Workspace(com.android.launcher3.Workspace)

Example 95 with DragLayer

use of com.android.launcher3.dragndrop.DragLayer in project android_packages_apps_404Launcher by P-404.

the class Launcher method addAppWidgetFromDrop.

/**
 * Process a widget drop.
 */
private void addAppWidgetFromDrop(PendingAddWidgetInfo info) {
    AppWidgetHostView hostView = info.boundWidget;
    final int appWidgetId;
    WidgetAddFlowHandler addFlowHandler = info.getHandler();
    if (hostView != null) {
        // In the case where we've prebound the widget, we remove it from the DragLayer
        if (LOGD) {
            Log.d(TAG, "Removing widget view from drag layer and setting boundWidget to null");
        }
        getDragLayer().removeView(hostView);
        appWidgetId = hostView.getAppWidgetId();
        addAppWidgetFromDropImpl(appWidgetId, info, hostView, addFlowHandler);
        // Clear the boundWidget so that it doesn't get destroyed.
        info.boundWidget = null;
    } else {
        // the widget, or we need to start an activity to configure the widget, or both.
        if (info.itemType == LauncherSettings.Favorites.ITEM_TYPE_CUSTOM_APPWIDGET) {
            appWidgetId = CustomWidgetManager.INSTANCE.get(this).getWidgetIdForCustomProvider(info.componentName);
        } else {
            appWidgetId = getAppWidgetHost().allocateAppWidgetId();
        }
        Bundle options = info.bindOptions;
        boolean success = mAppWidgetManager.bindAppWidgetIdIfAllowed(appWidgetId, info.info, options);
        if (success) {
            addAppWidgetFromDropImpl(appWidgetId, info, null, addFlowHandler);
        } else {
            addFlowHandler.startBindFlow(this, appWidgetId, info, REQUEST_BIND_APPWIDGET);
        }
    }
}
Also used : PendingAppWidgetHostView(com.android.launcher3.widget.PendingAppWidgetHostView) LauncherAppWidgetHostView(com.android.launcher3.widget.LauncherAppWidgetHostView) AppWidgetHostView(android.appwidget.AppWidgetHostView) Bundle(android.os.Bundle) WidgetAddFlowHandler(com.android.launcher3.widget.WidgetAddFlowHandler)

Aggregations

DragLayer (com.android.launcher3.dragndrop.DragLayer)100 Rect (android.graphics.Rect)67 BaseDragLayer (com.android.launcher3.views.BaseDragLayer)33 ViewGroup (android.view.ViewGroup)23 Resources (android.content.res.Resources)22 AnimatorSet (android.animation.AnimatorSet)20 View (android.view.View)18 SuppressLint (android.annotation.SuppressLint)16 AbstractFloatingView (com.android.launcher3.AbstractFloatingView)15 DeviceProfile (com.android.launcher3.DeviceProfile)15 Workspace (com.android.launcher3.Workspace)15 Animator (android.animation.Animator)14 ObjectAnimator (android.animation.ObjectAnimator)14 Point (android.graphics.Point)12 ItemInfo (com.android.launcher3.model.data.ItemInfo)12 CellLayout (com.android.launcher3.CellLayout)11 DragView (com.android.launcher3.dragndrop.DragView)11 ArrayList (java.util.ArrayList)11 AnimatorListenerAdapter (android.animation.AnimatorListenerAdapter)10 Drawable (android.graphics.drawable.Drawable)10