diff options
8 files changed, 98 insertions, 48 deletions
diff --git a/quickstep/recents_ui_overrides/src/com/android/quickstep/inputconsumers/AssistantTouchConsumer.java b/quickstep/recents_ui_overrides/src/com/android/quickstep/inputconsumers/AssistantTouchConsumer.java index 20ea3a169..2ff5e2386 100644 --- a/quickstep/recents_ui_overrides/src/com/android/quickstep/inputconsumers/AssistantTouchConsumer.java +++ b/quickstep/recents_ui_overrides/src/com/android/quickstep/inputconsumers/AssistantTouchConsumer.java @@ -23,6 +23,7 @@ import static android.view.MotionEvent.ACTION_POINTER_DOWN; import static android.view.MotionEvent.ACTION_POINTER_UP; import static android.view.MotionEvent.ACTION_UP; +import static com.android.launcher3.Utilities.squaredHypot; import static com.android.launcher3.userevent.nano.LauncherLogProto.Action.Direction.UPLEFT; import static com.android.launcher3.userevent.nano.LauncherLogProto.Action.Direction.UPRIGHT; import static com.android.launcher3.userevent.nano.LauncherLogProto.Action.Touch.FLING; @@ -81,7 +82,7 @@ public class AssistantTouchConsumer extends DelegateInputConsumer private final float mDistThreshold; private final long mTimeThreshold; private final int mAngleThreshold; - private final float mSlop; + private final float mSquaredSlop; private final ISystemUiProxy mSysUiProxy; private final Context mContext; private final SwipeDetector mSwipeDetector; @@ -96,7 +97,8 @@ public class AssistantTouchConsumer extends DelegateInputConsumer mDistThreshold = res.getDimension(R.dimen.gestures_assistant_drag_threshold); mTimeThreshold = res.getInteger(R.integer.assistant_gesture_min_time_threshold); mAngleThreshold = res.getInteger(R.integer.assistant_gesture_corner_deg_threshold); - mSlop = QuickStepContract.getQuickStepDragSlopPx(); + float slop = QuickStepContract.getQuickStepDragSlopPx(); + mSquaredSlop = slop * slop; mActivityControlHelper = activityControlHelper; mSwipeDetector = new SwipeDetector(mContext, this, SwipeDetector.VERTICAL); mSwipeDetector.setDetectableScrollConditions(SwipeDetector.DIRECTION_POSITIVE, false); @@ -155,7 +157,8 @@ public class AssistantTouchConsumer extends DelegateInputConsumer if (!mPassedSlop) { // Normal gesture, ensure we pass the slop before we start tracking the gesture - if (Math.hypot(mLastPos.x - mDownPos.x, mLastPos.y - mDownPos.y) > mSlop) { + if (squaredHypot(mLastPos.x - mDownPos.x, mLastPos.y - mDownPos.y) + > mSquaredSlop) { mPassedSlop = true; mStartDragPos.set(mLastPos.x, mLastPos.y); @@ -218,31 +221,35 @@ public class AssistantTouchConsumer extends DelegateInputConsumer private void updateAssistantProgress() { if (!mLaunchedAssistant) { mLastProgress = Math.min(mDistance * 1f / mDistThreshold, 1) * mTimeFraction; - updateAssistant(SWIPE); + try { + if (mDistance >= mDistThreshold && mTimeFraction >= 1) { + mSysUiProxy.onAssistantGestureCompletion(0); + startAssistantInternal(SWIPE); + + Bundle args = new Bundle(); + args.putInt(INVOCATION_TYPE_KEY, INVOCATION_TYPE_GESTURE); + mSysUiProxy.startAssistant(args); + mLaunchedAssistant = true; + } else { + mSysUiProxy.onAssistantProgress(mLastProgress); + } + } catch (RemoteException e) { + Log.w(TAG, "Failed to send SysUI start/send assistant progress: " + mLastProgress, + e); + } } } - private void updateAssistant(int gestureType) { - try { - mSysUiProxy.onAssistantProgress(mLastProgress); - if (gestureType == FLING || (mDistance >= mDistThreshold && mTimeFraction >= 1)) { - UserEventDispatcher.newInstance(mContext) - .logActionOnContainer(gestureType, mDirection, NAVBAR); - Bundle args = new Bundle(); - args.putInt(INVOCATION_TYPE_KEY, INVOCATION_TYPE_GESTURE); - - BaseDraggingActivity launcherActivity = mActivityControlHelper.getCreatedActivity(); - if (launcherActivity != null) { - launcherActivity.getRootView().performHapticFeedback( - 13, // HapticFeedbackConstants.GESTURE_END - HapticFeedbackConstants.FLAG_IGNORE_VIEW_SETTING); - } + private void startAssistantInternal(int gestureType) { + UserEventDispatcher.newInstance(mContext) + .logActionOnContainer(gestureType, mDirection, NAVBAR); - mSysUiProxy.startAssistant(args); - mLaunchedAssistant = true; - } - } catch (RemoteException e) { - Log.w(TAG, "Failed to send SysUI start/send assistant progress: " + mLastProgress, e); + BaseDraggingActivity launcherActivity = mActivityControlHelper + .getCreatedActivity(); + if (launcherActivity != null) { + launcherActivity.getRootView().performHapticFeedback( + 13, // HapticFeedbackConstants.GESTURE_END + HapticFeedbackConstants.FLAG_IGNORE_VIEW_SETTING); } } @@ -268,7 +275,18 @@ public class AssistantTouchConsumer extends DelegateInputConsumer public void onDragEnd(float velocity, boolean fling) { if (fling && !mLaunchedAssistant) { mLastProgress = 1; - updateAssistant(FLING); + try { + mSysUiProxy.onAssistantGestureCompletion(velocity); + startAssistantInternal(FLING); + + Bundle args = new Bundle(); + args.putInt(INVOCATION_TYPE_KEY, INVOCATION_TYPE_GESTURE); + mSysUiProxy.startAssistant(args); + mLaunchedAssistant = true; + } catch (RemoteException e) { + Log.w(TAG, "Failed to send SysUI start/send assistant progress: " + mLastProgress, + e); + } } } } diff --git a/quickstep/recents_ui_overrides/src/com/android/quickstep/inputconsumers/DeviceLockedInputConsumer.java b/quickstep/recents_ui_overrides/src/com/android/quickstep/inputconsumers/DeviceLockedInputConsumer.java index b1d175df8..d01b5ec19 100644 --- a/quickstep/recents_ui_overrides/src/com/android/quickstep/inputconsumers/DeviceLockedInputConsumer.java +++ b/quickstep/recents_ui_overrides/src/com/android/quickstep/inputconsumers/DeviceLockedInputConsumer.java @@ -15,11 +15,13 @@ */ package com.android.quickstep.inputconsumers; +import static com.android.launcher3.Utilities.squaredHypot; +import static com.android.launcher3.Utilities.squaredTouchSlop; + import android.content.Context; import android.content.Intent; import android.graphics.PointF; import android.view.MotionEvent; -import android.view.ViewConfiguration; /** * A dummy input consumer used when the device is still locked, e.g. from secure camera. @@ -32,8 +34,7 @@ public class DeviceLockedInputConsumer implements InputConsumer { public DeviceLockedInputConsumer(Context context) { mContext = context; - float touchSlop = ViewConfiguration.get(context).getScaledTouchSlop(); - mTouchSlopSquared = touchSlop * touchSlop; + mTouchSlopSquared = squaredTouchSlop(context); } @Override @@ -48,9 +49,7 @@ public class DeviceLockedInputConsumer implements InputConsumer { if (ev.getAction() == MotionEvent.ACTION_DOWN) { mTouchDown.set(x, y); } else if (ev.getAction() == MotionEvent.ACTION_MOVE) { - float xSquared = (x - mTouchDown.x) * (x - mTouchDown.x); - float ySquared = (y - mTouchDown.y) * (y - mTouchDown.y); - if (xSquared + ySquared > mTouchSlopSquared) { + if (squaredHypot(x - mTouchDown.x, y - mTouchDown.y) > mTouchSlopSquared) { // For now, just start the home intent so user is prompted to unlock the device. mContext.startActivity(new Intent(Intent.ACTION_MAIN) .addCategory(Intent.CATEGORY_HOME) diff --git a/quickstep/recents_ui_overrides/src/com/android/quickstep/inputconsumers/OtherActivityInputConsumer.java b/quickstep/recents_ui_overrides/src/com/android/quickstep/inputconsumers/OtherActivityInputConsumer.java index eb5366ca0..b0acffa39 100644 --- a/quickstep/recents_ui_overrides/src/com/android/quickstep/inputconsumers/OtherActivityInputConsumer.java +++ b/quickstep/recents_ui_overrides/src/com/android/quickstep/inputconsumers/OtherActivityInputConsumer.java @@ -23,6 +23,7 @@ import static android.view.MotionEvent.ACTION_POINTER_UP; import static android.view.MotionEvent.ACTION_UP; import static android.view.MotionEvent.INVALID_POINTER_ID; import static com.android.launcher3.Utilities.EDGE_NAV_BAR; +import static com.android.launcher3.Utilities.squaredHypot; import static com.android.launcher3.uioverrides.RecentsUiFactory.ROTATION_LANDSCAPE; import static com.android.launcher3.uioverrides.RecentsUiFactory.ROTATION_SEASCAPE; import static com.android.launcher3.util.RaceConditionTracker.ENTER; @@ -109,7 +110,7 @@ public class OtherActivityInputConsumer extends ContextWrapper implements InputC private int mActivePointerId = INVALID_POINTER_ID; private final float mDragSlop; - private final float mTouchSlop; + private final float mSquaredTouchSlop; // Slop used to check when we start moving window. private boolean mPassedDragSlop; @@ -157,7 +158,8 @@ public class OtherActivityInputConsumer extends ContextWrapper implements InputC mDisplayRotation = getSystemService(WindowManager.class).getDefaultDisplay().getRotation(); mDragSlop = QuickStepContract.getQuickStepDragSlopPx(); - mTouchSlop = QuickStepContract.getQuickStepTouchSlopPx(); + float slop = QuickStepContract.getQuickStepTouchSlopPx(); + mSquaredTouchSlop = slop * slop; mPassedTouchSlop = mPassedDragSlop = continuingPreviousGesture; } @@ -256,7 +258,7 @@ public class OtherActivityInputConsumer extends ContextWrapper implements InputC } if (!mPassedTouchSlop) { - if (Math.hypot(displacementX, mLastPos.y - mDownPos.y) >= mTouchSlop) { + if (squaredHypot(displacementX, mLastPos.y - mDownPos.y) >= mSquaredTouchSlop) { mPassedTouchSlop = true; if (mIsDeferredDownTarget) { diff --git a/quickstep/recents_ui_overrides/src/com/android/quickstep/views/RecentsView.java b/quickstep/recents_ui_overrides/src/com/android/quickstep/views/RecentsView.java index a835680c2..661468ac6 100644 --- a/quickstep/recents_ui_overrides/src/com/android/quickstep/views/RecentsView.java +++ b/quickstep/recents_ui_overrides/src/com/android/quickstep/views/RecentsView.java @@ -20,6 +20,8 @@ import static com.android.launcher3.BaseActivity.STATE_HANDLER_INVISIBILITY_FLAG import static com.android.launcher3.InvariantDeviceProfile.CHANGE_FLAG_ICON_PARAMS; import static com.android.launcher3.LauncherAnimUtils.SCALE_PROPERTY; import static com.android.launcher3.Utilities.EDGE_NAV_BAR; +import static com.android.launcher3.Utilities.squaredHypot; +import static com.android.launcher3.Utilities.squaredTouchSlop; import static com.android.launcher3.anim.Interpolators.ACCEL; import static com.android.launcher3.anim.Interpolators.ACCEL_2; import static com.android.launcher3.anim.Interpolators.FAST_OUT_SLOW_IN; @@ -281,7 +283,7 @@ public abstract class RecentsView<T extends BaseActivity> extends PagedView impl private boolean mHandleTaskStackChanges; private boolean mSwipeDownShouldLaunchApp; private boolean mTouchDownToStartHome; - private final int mTouchSlop; + private final float mSquaredTouchSlop; private int mDownX; private int mDownY; @@ -339,7 +341,7 @@ public abstract class RecentsView<T extends BaseActivity> extends PagedView impl setLayoutDirection(mIsRtl ? View.LAYOUT_DIRECTION_RTL : View.LAYOUT_DIRECTION_LTR); mTaskTopMargin = getResources() .getDimensionPixelSize(R.dimen.task_thumbnail_top_margin); - mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop(); + mSquaredTouchSlop = squaredTouchSlop(context); mEmptyIcon = context.getDrawable(R.drawable.ic_empty_recents); mEmptyIcon.setCallback(this); @@ -496,7 +498,8 @@ public abstract class RecentsView<T extends BaseActivity> extends PagedView impl case MotionEvent.ACTION_MOVE: // Passing the touch slop will not allow dismiss to home if (mTouchDownToStartHome && - (isHandlingTouch() || Math.hypot(mDownX - x, mDownY - y) > mTouchSlop)) { + (isHandlingTouch() || + squaredHypot(mDownX - x, mDownY - y) > mSquaredTouchSlop)) { mTouchDownToStartHome = false; } break; diff --git a/src/com/android/launcher3/BubbleTextView.java b/src/com/android/launcher3/BubbleTextView.java index bff7f4213..2f801e04b 100644 --- a/src/com/android/launcher3/BubbleTextView.java +++ b/src/com/android/launcher3/BubbleTextView.java @@ -51,7 +51,6 @@ import com.android.launcher3.graphics.PreloadIconDrawable; import com.android.launcher3.icons.DotRenderer; import com.android.launcher3.icons.IconCache.IconLoadRequest; import com.android.launcher3.icons.IconCache.ItemInfoUpdateReceiver; -import com.android.launcher3.icons.LauncherIcons; import com.android.launcher3.model.PackageItemInfo; import com.android.launcher3.views.ActivityContext; @@ -561,7 +560,10 @@ public class BubbleTextView extends TextView implements ItemInfoUpdateReceiver, } } if (itemInfo.contentDescription != null) { - if (hasDot()) { + if (itemInfo.isDisabled()) { + setContentDescription(getContext().getString(R.string.disabled_app_label, + itemInfo.contentDescription)); + } else if (hasDot()) { int count = mDotInfo.getNotificationCount(); setContentDescription(getContext().getResources().getQuantityString( R.plurals.dotted_app_label, count, itemInfo.contentDescription, count)); diff --git a/src/com/android/launcher3/Utilities.java b/src/com/android/launcher3/Utilities.java index 796fd2505..cc9bda710 100644 --- a/src/com/android/launcher3/Utilities.java +++ b/src/com/android/launcher3/Utilities.java @@ -61,6 +61,7 @@ import android.util.Pair; import android.util.TypedValue; import android.view.MotionEvent; import android.view.View; +import android.view.ViewConfiguration; import android.view.animation.Interpolator; import com.android.launcher3.compat.LauncherAppsCompat; @@ -726,6 +727,15 @@ public final class Utilities { return str.toString(); } + public static float squaredHypot(float x, float y) { + return x * x + y * y; + } + + public static float squaredTouchSlop(Context context) { + float slop = ViewConfiguration.get(context).getScaledTouchSlop(); + return slop * slop; + } + private static class FixedSizeEmptyDrawable extends ColorDrawable { private final int mSize; diff --git a/src/com/android/launcher3/popup/PopupContainerWithArrow.java b/src/com/android/launcher3/popup/PopupContainerWithArrow.java index 047f4862b..7b14fa249 100644 --- a/src/com/android/launcher3/popup/PopupContainerWithArrow.java +++ b/src/com/android/launcher3/popup/PopupContainerWithArrow.java @@ -16,6 +16,8 @@ package com.android.launcher3.popup; +import static com.android.launcher3.Utilities.squaredHypot; +import static com.android.launcher3.Utilities.squaredTouchSlop; import static com.android.launcher3.notification.NotificationMainView.NOTIFICATION_ITEM_INFO; import static com.android.launcher3.popup.PopupPopulator.MAX_SHORTCUTS; import static com.android.launcher3.popup.PopupPopulator.MAX_SHORTCUTS_IF_NOTIFICATIONS; @@ -37,7 +39,6 @@ import android.util.AttributeSet; import android.util.Pair; import android.view.MotionEvent; import android.view.View; -import android.view.ViewConfiguration; import android.view.ViewGroup; import android.widget.ImageView; @@ -51,6 +52,7 @@ import com.android.launcher3.ItemInfoWithIcon; import com.android.launcher3.Launcher; import com.android.launcher3.LauncherModel; import com.android.launcher3.R; +import com.android.launcher3.Utilities; import com.android.launcher3.accessibility.LauncherAccessibilityDelegate; import com.android.launcher3.accessibility.ShortcutMenuAccessibilityDelegate; import com.android.launcher3.dot.DotInfo; @@ -136,8 +138,8 @@ public class PopupContainerWithArrow extends ArrowPopup implements DragSource, return true; } // Stop sending touch events to deep shortcut views if user moved beyond touch slop. - return Math.hypot(mInterceptTouchDown.x - ev.getX(), mInterceptTouchDown.y - ev.getY()) - > ViewConfiguration.get(getContext()).getScaledTouchSlop(); + return squaredHypot(mInterceptTouchDown.x - ev.getX(), mInterceptTouchDown.y - ev.getY()) + > squaredTouchSlop(getContext()); } @Override diff --git a/tests/tapl/com/android/launcher3/tapl/AllApps.java b/tests/tapl/com/android/launcher3/tapl/AllApps.java index 792ec4313..70405fed8 100644 --- a/tests/tapl/com/android/launcher3/tapl/AllApps.java +++ b/tests/tapl/com/android/launcher3/tapl/AllApps.java @@ -52,11 +52,24 @@ public class AllApps extends LauncherInstrumentation.VisibleContainer { private boolean hasClickableIcon( UiObject2 allAppsContainer, UiObject2 appListRecycler, BySelector appIconSelector) { final UiObject2 icon = appListRecycler.findObject(appIconSelector); - if (icon == null) return false; - if (mLauncher.getNavigationModel() == ZERO_BUTTON) return true; - final UiObject2 navBar = mLauncher.waitForSystemUiObject("navigation_bar_frame"); - if (icon.getVisibleBounds().bottom >= navBar.getVisibleBounds().top) return false; - if (iconCenterInSearchBox(allAppsContainer, icon)) return false; + if (icon == null) { + LauncherInstrumentation.log("hasClickableIcon: icon not visible"); + return false; + } + final Rect iconBounds = icon.getVisibleBounds(); + LauncherInstrumentation.log("hasClickableIcon: icon bounds: " + iconBounds); + if (mLauncher.getNavigationModel() != ZERO_BUTTON) { + final UiObject2 navBar = mLauncher.waitForSystemUiObject("navigation_bar_frame"); + if (iconBounds.bottom >= navBar.getVisibleBounds().top) { + LauncherInstrumentation.log("hasClickableIcon: icon intersects with nav bar"); + return false; + } + } + if (iconCenterInSearchBox(allAppsContainer, icon)) { + LauncherInstrumentation.log("hasClickableIcon: icon center is under search box"); + return false; + } + LauncherInstrumentation.log("hasClickableIcon: icon is clickable"); return true; } @@ -76,7 +89,7 @@ public class AllApps extends LauncherInstrumentation.VisibleContainer { @NonNull public AppIcon getAppIcon(String appName) { try (LauncherInstrumentation.Closable c = mLauncher.addContextLayer( - "want to get app icon on all apps")) { + "want to get app icon " + appName + " on all apps")) { final UiObject2 allAppsContainer = verifyActiveContainer(); final UiObject2 appListRecycler = mLauncher.waitForObjectInContainer(allAppsContainer, "apps_list_view"); @@ -112,6 +125,7 @@ public class AllApps extends LauncherInstrumentation.VisibleContainer { private void scrollBackToBeginning() { try (LauncherInstrumentation.Closable c = mLauncher.addContextLayer( "want to scroll back in all apps")) { + LauncherInstrumentation.log("Scrolling to the beginning"); final UiObject2 allAppsContainer = verifyActiveContainer(); final UiObject2 searchBox = getSearchBox(allAppsContainer); |