Loading quickstep/src/com/android/launcher3/taskbar/TaskbarView.java +38 −2 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading Loading @@ -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; Loading @@ -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]; Loading @@ -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; Loading @@ -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; Loading Loading @@ -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); Loading Loading @@ -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)); Loading @@ -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 Loading Loading @@ -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( Loading Loading @@ -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(); Loading quickstep/src/com/android/quickstep/RecentsAnimationDeviceState.java +11 −1 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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); } Loading Loading
quickstep/src/com/android/launcher3/taskbar/TaskbarView.java +38 −2 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading Loading @@ -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; Loading @@ -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]; Loading @@ -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; Loading @@ -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; Loading Loading @@ -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); Loading Loading @@ -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)); Loading @@ -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 Loading Loading @@ -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( Loading Loading @@ -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(); Loading
quickstep/src/com/android/quickstep/RecentsAnimationDeviceState.java +11 −1 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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); } Loading