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

Commit 7b8f1eab authored by Tony Wickham's avatar Tony Wickham
Browse files

Address comments on original shortcuts UI CL (ag/1061538).

- Only add shortcut touch listener to APPLICATION item types, not SHORTCUT.
- Load shortcuts on LauncherModel worker thread instead of using AsyncTask.
- Avoid a couple of unnecessary object allocations.

Change-Id: I31b911b91df71335542545602fe137e270c745d7
parent c7163ebd
Loading
Loading
Loading
Loading
+1 −2
Original line number Diff line number Diff line
@@ -58,8 +58,7 @@ public class DeepShortcutManager {
    }

    public static boolean supportsShortcuts(ItemInfo info) {
        return info.itemType == LauncherSettings.Favorites.ITEM_TYPE_APPLICATION
                || info.itemType == LauncherSettings.Favorites.ITEM_TYPE_SHORTCUT;
        return info.itemType == LauncherSettings.Favorites.ITEM_TYPE_APPLICATION;
    }

    public boolean wasLastCallSuccess() {
+39 −30
Original line number Diff line number Diff line
@@ -7,8 +7,9 @@ import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Point;
import android.graphics.Rect;
import android.os.AsyncTask;
import android.os.Build;
import android.os.Handler;
import android.os.Looper;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
@@ -21,6 +22,7 @@ import com.android.launcher3.DropTarget;
import com.android.launcher3.ItemInfo;
import com.android.launcher3.Launcher;
import com.android.launcher3.LauncherAppState;
import com.android.launcher3.LauncherModel;
import com.android.launcher3.LogDecelerateInterpolator;
import com.android.launcher3.R;
import com.android.launcher3.ShortcutInfo;
@@ -35,7 +37,6 @@ import com.android.launcher3.userevent.nano.LauncherLogProto;
import com.android.launcher3.userevent.nano.LauncherLogProto.Target;
import com.android.launcher3.util.UiThreadCircularReveal;

import java.util.ArrayList;
import java.util.List;

/**
@@ -98,37 +99,45 @@ public class DeepShortcutsContainer extends LinearLayout implements View.OnLongC
        deferDrag(originalIcon);

        // Load the shortcuts on a background thread and update the container as it animates.
        final Looper workerLooper = LauncherModel.getWorkerLooper();
        final Handler uiHandler = new Handler(Looper.getMainLooper());
        final ItemInfo originalInfo = (ItemInfo) originalIcon.getTag();
        final UserHandleCompat user = originalInfo.user;
        final ComponentName activity = originalInfo.getTargetComponent();
        new AsyncTask<Void, Void, List<ShortcutInfo>>() {
            public List<ShortcutInfo> doInBackground(Void ... args) {
                List<ShortcutInfoCompat> shortcuts = mDeepShortcutsManager
        new Handler(workerLooper).postAtFrontOfQueue(new Runnable() {
            @Override
            public void run() {
                final List<ShortcutInfoCompat> shortcuts = mDeepShortcutsManager
                        .queryForAllAppShortcuts(activity, ids, user);
                List<ShortcutInfo> shortcutInfos = new ArrayList<>(shortcuts.size());
                for (ShortcutInfoCompat shortcut : shortcuts) {
                    shortcutInfos.add(ShortcutInfo.fromDeepShortcutInfo(shortcut, mLauncher));
                for (int i = 0; i < shortcuts.size(); i++) {
                    final ShortcutInfoCompat shortcut = shortcuts.get(i);
                    final ShortcutInfo launcherShortcutInfo = ShortcutInfo
                            .fromDeepShortcutInfo(shortcut, mLauncher);
                    uiHandler.post(new UpdateShortcutChild(i, launcherShortcutInfo));
                }
                return shortcutInfos;
            }
        });
    }

            // TODO: implement onProgressUpdate() to load shortcuts one at a time.
    /** Updates the child of this container at the given index based on the given shortcut info. */
    private class UpdateShortcutChild implements Runnable {
        private int mShortcutChildIndex;
        private ShortcutInfo mShortcutChildInfo;

        public UpdateShortcutChild(int shortcutChildIndex, ShortcutInfo shortcutChildInfo) {
            mShortcutChildIndex = shortcutChildIndex;
            mShortcutChildInfo = shortcutChildInfo;
        }

        @Override
            protected void onPostExecute(List<ShortcutInfo> shortcuts) {
                for (int i = 0; i < shortcuts.size(); i++) {
                    DeepShortcutView iconAndText = (DeepShortcutView) getChildAt(i);
                    ShortcutInfo launcherShortcutInfo = shortcuts.get(i);
                    iconAndText.applyFromShortcutInfo(launcherShortcutInfo,
        public void run() {
            DeepShortcutView shortcutView = (DeepShortcutView) getChildAt(mShortcutChildIndex);
            shortcutView.applyFromShortcutInfo(mShortcutChildInfo,
                    LauncherAppState.getInstance().getIconCache());
                    iconAndText.setOnClickListener(mLauncher);
                    iconAndText.setOnLongClickListener(DeepShortcutsContainer.this);
                    iconAndText.setOnTouchListener(DeepShortcutsContainer.this);
                    int viewId = mLauncher.getViewIdForItem(originalInfo);
                    iconAndText.setId(viewId);
                }
            shortcutView.setOnClickListener(mLauncher);
            shortcutView.setOnLongClickListener(DeepShortcutsContainer.this);
            shortcutView.setOnTouchListener(DeepShortcutsContainer.this);
        }
        }.execute();
    }

    // TODO: update this animation
@@ -220,9 +229,9 @@ public class DeepShortcutsContainer extends LinearLayout implements View.OnLongC
        mDragView.show(motionDownX, motionDownY);
    }

    public boolean onForwardedEvent(MotionEvent ev, int activePointerId, MotionEvent touchDownEvent) {
        mTouchDown = new Point((int) touchDownEvent.getX(), (int) touchDownEvent.getY());
    public boolean onForwardedEvent(MotionEvent ev, int activePointerId, Point touchDown) {
        mActivePointerId = activePointerId;
        mTouchDown = touchDown;
        return dispatchTouchEvent(ev);
    }

@@ -313,9 +322,9 @@ public class DeepShortcutsContainer extends LinearLayout implements View.OnLongC
     * @param y the y touch coordinate relative to this container
     */
    private boolean shouldStartDeferredDrag(int x, int y, boolean containerContainsTouch) {
        Point closestEdge = new Point(mTouchDown.x, mIsAboveIcon ? getMeasuredHeight() : 0);
        double distToEdge = Math.hypot(mTouchDown.x - closestEdge.x, mTouchDown.y - closestEdge.y);
        double newDistToEdge = Math.hypot(x - closestEdge.x, y - closestEdge.y);
        int closestEdgeY = mIsAboveIcon ? getMeasuredHeight() : 0;
        double distToEdge = Math.abs(mTouchDown.y - closestEdgeY);
        double newDistToEdge = Math.hypot(x - mTouchDown.x, y - closestEdgeY);
        return  !containerContainsTouch && (newDistToEdge - distToEdge > mStartDragThreshold);
    }

+12 −8
Original line number Diff line number Diff line
package com.android.launcher3.shortcuts;

import android.content.Context;
import android.graphics.Point;
import android.os.SystemClock;
import android.view.HapticFeedbackConstants;
import android.view.LayoutInflater;
@@ -53,6 +54,8 @@ public class ShortcutsContainerListener implements View.OnTouchListener,
    private Launcher mLauncher;
    private DragLayer mDragLayer;
    private MotionEvent mTouchDownEvent;
    /** The coordinates of the touch down, relative do the shortcuts container. */
    private final Point mTouchDown;

    public ShortcutsContainerListener(BubbleTextView icon) {
        mSrcIcon = icon;
@@ -64,8 +67,8 @@ public class ShortcutsContainerListener implements View.OnTouchListener,
        icon.addOnAttachStateChangeListener(this);

        mLauncher = Launcher.getLauncher(mSrcIcon.getContext());

        mDragLayer = mLauncher.getDragLayer();
        mTouchDown = new Point();
    }

    @Override
@@ -76,6 +79,9 @@ public class ShortcutsContainerListener implements View.OnTouchListener,
        }

        if (event.getAction() == MotionEvent.ACTION_DOWN) {
            if (mTouchDownEvent != null) {
                mTouchDownEvent.recycle();
            }
            mTouchDownEvent = MotionEvent.obtainNoHistory(event);
        }

@@ -134,6 +140,10 @@ public class ShortcutsContainerListener implements View.OnTouchListener,
            deepShortcutsContainer.populateAndShow(mSrcIcon, ids);
            mSrcIcon.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS,
                    HapticFeedbackConstants.FLAG_IGNORE_VIEW_SETTING);

            // Convert touch down event to the container's coordinates.
            Utilities.translateEventCoordinates(mSrcIcon, deepShortcutsContainer, mTouchDownEvent);
            mTouchDown.set((int) mTouchDownEvent.getX(), (int) mTouchDownEvent.getY());
            return true;
        }
        return false;
@@ -252,16 +262,10 @@ public class ShortcutsContainerListener implements View.OnTouchListener,
        final MotionEvent dstEvent = MotionEvent.obtainNoHistory(srcEvent);
        Utilities.translateEventCoordinates(src, dst, dstEvent);

        // Convert touch down event to destination-local coordinates.
        // TODO: only create this once, or just store the x and y.
        final MotionEvent touchDownEvent = MotionEvent.obtainNoHistory(mTouchDownEvent);
        Utilities.translateEventCoordinates(src, dst, touchDownEvent);

        // Forward converted event to destination view, then recycle it.
        // TODO: don't create objects in onForwardedEvent.
        final boolean handled = dst.onForwardedEvent(dstEvent, mActivePointerId, touchDownEvent);
        final boolean handled = dst.onForwardedEvent(dstEvent, mActivePointerId, mTouchDown);
        dstEvent.recycle();
        touchDownEvent.recycle();

        // Always cancel forwarding when the touch stream ends.
        final int action = srcEvent.getActionMasked();