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

Commit 8146b628 authored by Treehugger Robot's avatar Treehugger Robot Committed by Android (Google) Code Review
Browse files

Merge "[omni] Handle touch slop for LPAA." into main

parents 2301e66b 49dc99ab
Loading
Loading
Loading
Loading
+38 −2
Original line number Diff line number Diff line
@@ -25,6 +25,7 @@ import static com.android.launcher3.config.FeatureFlags.ENABLE_ALL_APPS_SEARCH_I
import static com.android.launcher3.config.FeatureFlags.enableTaskbarPinning;
import static com.android.launcher3.icons.IconNormalizer.ICON_VISIBLE_AREA_FACTOR;
import static com.android.launcher3.util.Executors.MAIN_EXECUTOR;
import static com.android.quickstep.RecentsAnimationDeviceState.QUICKSTEP_TOUCH_SLOP_RATIO_TWO_BUTTON;

import android.content.Context;
import android.content.res.Resources;
@@ -32,6 +33,7 @@ import android.graphics.Canvas;
import android.graphics.Rect;
import android.os.Bundle;
import android.util.AttributeSet;
import android.util.Log;
import android.view.DisplayCutout;
import android.view.InputDevice;
import android.view.LayoutInflater;
@@ -66,6 +68,7 @@ import com.android.launcher3.util.Themes;
import com.android.launcher3.views.ActivityContext;
import com.android.launcher3.views.IconButtonView;
import com.android.quickstep.DeviceConfigWrapper;
import com.android.quickstep.RecentsAnimationDeviceState;
import com.android.quickstep.util.AssistStateManager;

import java.util.function.Predicate;
@@ -75,6 +78,8 @@ import java.util.function.Predicate;
 */
public class TaskbarView extends FrameLayout implements FolderIcon.FolderIconParent, Insettable,
        DeviceProfile.OnDeviceProfileChangeListener {
    private static final String TAG = "TaskbarView";

    private static final Rect sTmpRect = new Rect();

    private final int[] mTempOutLocation = new int[2];
@@ -84,8 +89,10 @@ public class TaskbarView extends FrameLayout implements FolderIcon.FolderIconPar
    private final int mItemPadding;
    private final int mFolderLeaveBehindColor;
    private final boolean mIsRtl;
    private final boolean mIsTransientTaskbar;

    private final TaskbarActivityContext mActivityContext;
    private final RecentsAnimationDeviceState mDeviceState;

    // Initialized in init.
    private TaskbarViewCallbacks mControllerCallbacks;
@@ -100,6 +107,8 @@ public class TaskbarView extends FrameLayout implements FolderIcon.FolderIconPar
    private Runnable mAllAppsTouchRunnable;
    private long mAllAppsButtonTouchDelayMs;
    private boolean mAllAppsTouchTriggered;
    private MotionEvent mCurrentDownEvent;
    private float mTouchSlopSquared;

    // Only non-null when device supports having an All Apps button.
    private @Nullable IconButtonView mTaskbarDivider;
@@ -129,7 +138,7 @@ public class TaskbarView extends FrameLayout implements FolderIcon.FolderIconPar
        mActivityContext = ActivityContext.lookupContext(context);
        mIconLayoutBounds = mActivityContext.getTransientTaskbarBounds();
        Resources resources = getResources();
        boolean isTransientTaskbar = DisplayController.isTransientTaskbar(mActivityContext)
        mIsTransientTaskbar = DisplayController.isTransientTaskbar(mActivityContext)
                && !mActivityContext.isPhoneMode();
        mIsRtl = Utilities.isRtl(resources);
        mTransientTaskbarMinWidth = resources.getDimension(R.dimen.transient_taskbar_min_width);
@@ -163,7 +172,7 @@ public class TaskbarView extends FrameLayout implements FolderIcon.FolderIconPar
        mAllAppsButton = (IconButtonView) LayoutInflater.from(context)
                .inflate(R.layout.taskbar_all_apps_button, this, false);
        mAllAppsButton.setIconDrawable(resources.getDrawable(
                getAllAppsButton(isTransientTaskbar)));
                getAllAppsButton(mIsTransientTaskbar)));
        mAllAppsButton.setPadding(mItemPadding, mItemPadding, mItemPadding, mItemPadding);
        mAllAppsButton.setForegroundTint(
                mActivityContext.getColor(R.color.all_apps_button_color));
@@ -182,6 +191,10 @@ public class TaskbarView extends FrameLayout implements FolderIcon.FolderIconPar

        // Default long press (touch) delay = 400ms
        mAllAppsButtonTouchDelayMs = ViewConfiguration.getLongPressTimeout();
        // Default touch slop
        mDeviceState = new RecentsAnimationDeviceState(mContext);
        mTouchSlopSquared = mDeviceState.getSquaredTouchSlop(
                QUICKSTEP_TOUCH_SLOP_RATIO_TWO_BUTTON, 1);
    }

    @DrawableRes
@@ -286,6 +299,12 @@ public class TaskbarView extends FrameLayout implements FolderIcon.FolderIconPar
                    && assistStateManager.getLPNHDurationMillis().isPresent()) {
                mAllAppsButtonTouchDelayMs = assistStateManager.getLPNHDurationMillis().get();
            }
            if (DeviceConfigWrapper.get().getCustomLpaaThresholds()
                    && assistStateManager.getLPNHCustomSlopMultiplier().isPresent()) {
                mTouchSlopSquared = mDeviceState.getSquaredTouchSlop(
                        QUICKSTEP_TOUCH_SLOP_RATIO_TWO_BUTTON,
                        assistStateManager.getLPNHCustomSlopMultiplier().get());
            }
        }
        if (mTaskbarDivider != null && !mActivityContext.isThreeButtonNav()) {
            mTaskbarDivider.setOnLongClickListener(
@@ -708,10 +727,27 @@ public class TaskbarView extends FrameLayout implements FolderIcon.FolderIconPar
    private boolean onAllAppsButtonTouch(View view, MotionEvent ev) {
        switch (ev.getAction()) {
            case MotionEvent.ACTION_DOWN:
                if (mCurrentDownEvent != null) {
                    mCurrentDownEvent.recycle();
                }
                mCurrentDownEvent = MotionEvent.obtain(ev);
                mAllAppsTouchTriggered = false;
                MAIN_EXECUTOR.getHandler().postDelayed(
                        mAllAppsTouchRunnable, mAllAppsButtonTouchDelayMs);
                break;
            case MotionEvent.ACTION_MOVE:
                if (!MAIN_EXECUTOR.getHandler().hasCallbacks(mAllAppsTouchRunnable)
                        || mIsTransientTaskbar) {
                    break;
                }
                float dx = ev.getX() - mCurrentDownEvent.getX();
                float dy = ev.getY() - mCurrentDownEvent.getY();
                double distanceSquared = (dx * dx) + (dy * dy);
                if (distanceSquared > mTouchSlopSquared) {
                    Log.d(TAG, "Touch slop out");
                    cancelAllAppsButtonTouch();
                }
                break;
            case MotionEvent.ACTION_UP:
            case MotionEvent.ACTION_CANCEL:
                cancelAllAppsButtonTouch();
+11 −1
Original line number Diff line number Diff line
@@ -91,7 +91,7 @@ public class RecentsAnimationDeviceState implements DisplayInfoChangeListener, E
    static final String SUPPORT_ONE_HANDED_MODE = "ro.support_one_handed_mode";

    // TODO: Move to quickstep contract
    private static final float QUICKSTEP_TOUCH_SLOP_RATIO_TWO_BUTTON = 3f;
    public static final float QUICKSTEP_TOUCH_SLOP_RATIO_TWO_BUTTON = 3f;
    private static final float QUICKSTEP_TOUCH_SLOP_RATIO_GESTURAL = 1.414f;

    private final Context mContext;
@@ -610,6 +610,16 @@ public class RecentsAnimationDeviceState implements DisplayInfoChangeListener, E
        return touchSlop * touchSlop;
    }

    /**
     * Returns the squared touch slop using the given base slop multiplier {@code slopMultiplier}
     * and custom slop multiplier {@code customSlopMultiplier}.
     */
    public float getSquaredTouchSlop(float slopMultiplier, float customSlopMultiplier) {
        float systemTouchSlop = ViewConfiguration.get(mContext).getScaledTouchSlop();
        float touchSlop = customSlopMultiplier * slopMultiplier * systemTouchSlop;
        return touchSlop * touchSlop;
    }

    public String getSystemUiStateString() {
        return  QuickStepContract.getSystemUiStateString(mSystemUiStateFlags);
    }