diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java index a1c9f05adb..0541e61df5 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java @@ -449,6 +449,11 @@ public class TaskbarActivityContext extends BaseTaskbarContext { return mControllers.taskbarDragController; } + @Nullable + public BubbleControllers getBubbleControllers() { + return mControllers.bubbleControllers.orElse(null); + } + @Override public ViewCache getViewCache() { return mViewCache; @@ -641,8 +646,12 @@ public class TaskbarActivityContext extends BaseTaskbarContext { mControllers.taskbarForceVisibleImmersiveController.updateSysuiFlags(systemUiStateFlags); mControllers.voiceInteractionWindowController.setIsVoiceInteractionWindowVisible( (systemUiStateFlags & SYSUI_STATE_VOICE_INTERACTION_WINDOW_SHOWING) != 0, fromInit); - mControllers.uiController.updateStateForSysuiFlags(systemUiStateFlags); + mControllers.bubbleControllers.ifPresent(controllers -> { + controllers.bubbleBarController.updateStateForSysuiFlags(systemUiStateFlags); + controllers.bubbleStashedHandleViewController.setIsHomeButtonDisabled( + mControllers.navbarButtonsViewController.isHomeDisabled()); + }); } /** @@ -738,7 +747,7 @@ public class TaskbarActivityContext extends BaseTaskbarContext { } } mWindowLayoutParams.height = height; - mControllers.taskbarInsetsController.onTaskbarWindowHeightOrInsetsChanged(); + mControllers.taskbarInsetsController.onTaskbarOrBubblebarWindowHeightOrInsetsChanged(); mWindowManager.updateViewLayout(mDragLayer, mWindowLayoutParams); } @@ -996,10 +1005,19 @@ public class TaskbarActivityContext extends BaseTaskbarContext { * Called when we want to unstash taskbar when user performs swipes up gesture. */ public void onSwipeToUnstashTaskbar() { - mControllers.taskbarStashController.updateAndAnimateTransientTaskbar(false); + mControllers.taskbarStashController.updateAndAnimateTransientTaskbar(/* stash= */ false); mControllers.taskbarEduTooltipController.hide(); } + /** + * Called when we want to open bubblebar when user performs swipes up gesture. + */ + public void onSwipeToOpenBubblebar() { + mControllers.bubbleControllers.ifPresent(controllers -> { + controllers.bubbleStashController.showBubbleBar(/* expandBubbles= */ true); + }); + } + /** Returns {@code true} if Taskbar All Apps is open. */ public boolean isTaskbarAllAppsOpen() { return mControllers.taskbarAllAppsController.isOpen(); diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarInsetsController.kt b/quickstep/src/com/android/launcher3/taskbar/TaskbarInsetsController.kt index 4f9b1e4188..07cd8ff1de 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarInsetsController.kt +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarInsetsController.kt @@ -56,13 +56,13 @@ class TaskbarInsetsController(val context: TaskbarActivityContext) : LoggableTas private val touchableRegion: Region = Region() private val insetsOwner: IBinder = Binder() private val deviceProfileChangeListener = { _: DeviceProfile -> - onTaskbarWindowHeightOrInsetsChanged() + onTaskbarOrBubblebarWindowHeightOrInsetsChanged() } private val gestureNavSettingsObserver = GestureNavigationSettingsObserver( context.mainThreadHandler, context, - this::onTaskbarWindowHeightOrInsetsChanged + this::onTaskbarOrBubblebarWindowHeightOrInsetsChanged ) // Initialized in init. @@ -72,7 +72,7 @@ class TaskbarInsetsController(val context: TaskbarActivityContext) : LoggableTas fun init(controllers: TaskbarControllers) { this.controllers = controllers windowLayoutParams = context.windowLayoutParams - onTaskbarWindowHeightOrInsetsChanged() + onTaskbarOrBubblebarWindowHeightOrInsetsChanged() context.addOnDeviceProfileChangeListener(deviceProfileChangeListener) gestureNavSettingsObserver.registerForCallingUser() @@ -83,7 +83,7 @@ class TaskbarInsetsController(val context: TaskbarActivityContext) : LoggableTas gestureNavSettingsObserver.unregister() } - fun onTaskbarWindowHeightOrInsetsChanged() { + fun onTaskbarOrBubblebarWindowHeightOrInsetsChanged() { val tappableHeight = controllers.taskbarStashController.tappableHeightToReportToApps // We only report tappableElement height for unstashed, persistent taskbar, // which is also when we draw the rounded corners above taskbar. @@ -121,13 +121,33 @@ class TaskbarInsetsController(val context: TaskbarActivityContext) : LoggableTas ) } - val touchableHeight = controllers.taskbarStashController.touchableHeight - touchableRegion.set( - 0, - windowLayoutParams.height - touchableHeight, - context.deviceProfile.widthPx, - windowLayoutParams.height - ) + val taskbarTouchableHeight = controllers.taskbarStashController.touchableHeight + val bubblesTouchableHeight = + if (controllers.bubbleControllers.isPresent) + controllers.bubbleControllers.get().bubbleStashController.touchableHeight + else 0 + val touchableHeight = Math.max(taskbarTouchableHeight, bubblesTouchableHeight) + + if ( + controllers.bubbleControllers.isPresent && + controllers.bubbleControllers.get().bubbleStashController.isBubblesShowingOnHome + ) { + val iconBounds = + controllers.bubbleControllers.get().bubbleBarViewController.bubbleBarBounds + touchableRegion.set( + iconBounds.left, + iconBounds.top, + iconBounds.right, + iconBounds.bottom + ) + } else { + touchableRegion.set( + 0, + windowLayoutParams.height - touchableHeight, + context.deviceProfile.widthPx, + windowLayoutParams.height + ) + } val contentHeight = controllers.taskbarStashController.contentHeightToReportToApps val res = context.resources for (provider in windowLayoutParams.providedInsets) { @@ -211,6 +231,9 @@ class TaskbarInsetsController(val context: TaskbarActivityContext) : LoggableTas context.dragLayer, insetsInfo.touchableRegion ) + val bubbleBarVisible = + controllers.bubbleControllers.isPresent && + controllers.bubbleControllers.get().bubbleBarViewController.isBubbleBarVisible() var insetsIsTouchableRegion = true if (context.dragLayer.alpha < AlphaUpdateListener.ALPHA_CUTOFF_THRESHOLD) { // Let touches pass through us. @@ -231,7 +254,9 @@ class TaskbarInsetsController(val context: TaskbarActivityContext) : LoggableTas insetsInfo.setTouchableInsets(TOUCHABLE_INSETS_FRAME) insetsIsTouchableRegion = false } else if ( - controllers.taskbarViewController.areIconsVisible() || context.isNavBarKidsModeActive + controllers.taskbarViewController.areIconsVisible() || + context.isNavBarKidsModeActive || + bubbleBarVisible ) { // Taskbar has some touchable elements, take over the full taskbar area if ( diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarLauncherStateController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarLauncherStateController.java index 008f5f6755..122745c96a 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarLauncherStateController.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarLauncherStateController.java @@ -404,6 +404,14 @@ public class TaskbarLauncherStateController { + ", mLauncherState: " + mLauncherState + ", toAlignment: " + toAlignment); } + mControllers.bubbleControllers.ifPresent(controllers -> { + // Show the bubble bar when on launcher home or in overview. + boolean onHome = isInLauncher && mLauncherState == LauncherState.NORMAL; + boolean onOverview = mLauncherState == LauncherState.OVERVIEW; + controllers.bubbleStashController.setBubblesShowingOnHome(onHome); + controllers.bubbleStashController.setBubblesShowingOnOverview(onOverview); + }); + AnimatorSet animatorSet = new AnimatorSet(); if (hasAnyFlag(changedFlags, FLAG_LAUNCHER_IN_STATE_TRANSITION)) { @@ -474,7 +482,8 @@ public class TaskbarLauncherStateController { public void onAnimationEnd(Animator animation) { TaskbarStashController stashController = mControllers.taskbarStashController; - stashController.updateAndAnimateTransientTaskbar(/* stash */ true); + stashController.updateAndAnimateTransientTaskbar( + /* stash */ true, /* bubblesShouldFollow */ true); } }); } else { diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarScrimViewController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarScrimViewController.java index 5ea00cf408..1c250bf377 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarScrimViewController.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarScrimViewController.java @@ -15,6 +15,7 @@ */ package com.android.launcher3.taskbar; +import static com.android.launcher3.taskbar.bubbles.BubbleBarController.BUBBLE_BAR_ENABLED; import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_BUBBLES_EXPANDED; import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_BUBBLES_MANAGE_MENU_EXPANDED; @@ -23,6 +24,7 @@ import android.view.animation.Interpolator; import android.view.animation.PathInterpolator; import com.android.launcher3.anim.AnimatedFloat; +import com.android.launcher3.util.DisplayController; import com.android.quickstep.SystemUiProxy; import java.io.PrintWriter; @@ -63,6 +65,10 @@ public class TaskbarScrimViewController implements TaskbarControllers.LoggableTa * Updates the scrim state based on the flags. */ public void updateStateForSysuiFlags(int stateFlags, boolean skipAnim) { + if (BUBBLE_BAR_ENABLED && DisplayController.isTransientTaskbar(mActivity)) { + // These scrims aren't used if bubble bar & transient taskbar are active. + return; + } final boolean bubblesExpanded = (stateFlags & SYSUI_STATE_BUBBLES_EXPANDED) != 0; final boolean manageMenuExpanded = (stateFlags & SYSUI_STATE_BUBBLES_MANAGE_MENU_EXPANDED) != 0; diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarStashController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarStashController.java index 00e14adf07..a89cfec540 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarStashController.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarStashController.java @@ -255,14 +255,15 @@ public class TaskbarStashController implements TaskbarControllers.LoggableTaskba private boolean mEnableBlockingTimeoutDuringTests = false; // Evaluate whether the handle should be stashed + private final IntPredicate mIsStashedPredicate = flags -> { + boolean inApp = hasAnyFlag(flags, FLAGS_IN_APP); + boolean stashedInApp = hasAnyFlag(flags, FLAGS_STASHED_IN_APP); + boolean stashedLauncherState = hasAnyFlag(flags, FLAG_IN_STASHED_LAUNCHER_STATE); + boolean forceStashed = hasAnyFlag(flags, FLAGS_FORCE_STASHED); + return (inApp && stashedInApp) || (!inApp && stashedLauncherState) || forceStashed; + }; private final StatePropertyHolder mStatePropertyHolder = new StatePropertyHolder( - flags -> { - boolean inApp = hasAnyFlag(flags, FLAGS_IN_APP); - boolean stashedInApp = hasAnyFlag(flags, FLAGS_STASHED_IN_APP); - boolean stashedLauncherState = hasAnyFlag(flags, FLAG_IN_STASHED_LAUNCHER_STATE); - boolean forceStashed = hasAnyFlag(flags, FLAGS_FORCE_STASHED); - return (inApp && stashedInApp) || (!inApp && stashedLauncherState) || forceStashed; - }); + mIsStashedPredicate); private boolean mIsTaskbarSystemActionRegistered = false; private TaskbarSharedState mTaskbarSharedState; @@ -501,9 +502,19 @@ public class TaskbarStashController implements TaskbarControllers.LoggableTaskba } /** - * Stash or unstashes the transient taskbar. + * Stash or unstashes the transient taskbar, using the default TASKBAR_STASH_DURATION. + * If bubble bar exists, it will match taskbars stashing behavior. */ public void updateAndAnimateTransientTaskbar(boolean stash) { + updateAndAnimateTransientTaskbar(stash, /* shouldBubblesFollow= */ true); + } + + /** + * Stash or unstashes the transient taskbar. + * @param stash whether transient taskbar should be stashed. + * @param shouldBubblesFollow whether bubbles should match taskbars behavior. + */ + public void updateAndAnimateTransientTaskbar(boolean stash, boolean shouldBubblesFollow) { if (!DisplayController.isTransientTaskbar(mActivity)) { return; } @@ -519,6 +530,34 @@ public class TaskbarStashController implements TaskbarControllers.LoggableTaskba updateStateForFlag(FLAG_STASHED_IN_APP_AUTO, stash); applyState(); } + + mControllers.bubbleControllers.ifPresent(controllers -> { + if (shouldBubblesFollow) { + final boolean willStash = mIsStashedPredicate.test(mState); + if (willStash != controllers.bubbleStashController.isStashed()) { + // Typically bubbles gets stashed / unstashed along with Taskbar, however, if + // taskbar is becoming stashed because bubbles is being expanded, we don't want + // to stash bubbles. + if (willStash) { + controllers.bubbleStashController.stashBubbleBar(); + } else { + controllers.bubbleStashController.showBubbleBar(false /* expandBubbles */); + } + } + } + }); + } + + /** + * Stashes transient taskbar after it has timed out. + */ + private void updateAndAnimateTransientTaskbarForTimeout() { + // If bubbles are expanded we shouldn't stash them when taskbar is hidden + // for the timeout. + boolean bubbleBarExpanded = mControllers.bubbleControllers.isPresent() + && mControllers.bubbleControllers.get().bubbleBarViewController.isExpanded(); + updateAndAnimateTransientTaskbar(/* stash= */ true, + /* shouldBubblesFollow= */ !bubbleBarExpanded); } /** @@ -886,7 +925,7 @@ public class TaskbarStashController implements TaskbarControllers.LoggableTaskba private void onIsStashedChanged(boolean isStashed) { mControllers.runAfterInit(() -> { mControllers.stashedHandleViewController.onIsStashedChanged(isStashed); - mControllers.taskbarInsetsController.onTaskbarWindowHeightOrInsetsChanged(); + mControllers.taskbarInsetsController.onTaskbarOrBubblebarWindowHeightOrInsetsChanged(); }); } @@ -1133,7 +1172,7 @@ public class TaskbarStashController implements TaskbarControllers.LoggableTaskba if (mControllers.taskbarAutohideSuspendController.isSuspended()) { return; } - updateAndAnimateTransientTaskbar(true); + updateAndAnimateTransientTaskbarForTimeout(); } @Override diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarStashViaTouchController.kt b/quickstep/src/com/android/launcher3/taskbar/TaskbarStashViaTouchController.kt index 1cc667211c..7e40bb9653 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarStashViaTouchController.kt +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarStashViaTouchController.kt @@ -108,7 +108,17 @@ class TaskbarStashViaTouchController(val controllers: TaskbarControllers) : Touc } override fun onControllerInterceptTouchEvent(ev: MotionEvent): Boolean { - if (!enabled || controllers.taskbarStashController.isStashed) { + if (!enabled) { + return false + } + val bubbleControllers = controllers.bubbleControllers.orElse(null) + if (bubbleControllers != null && bubbleControllers.bubbleBarViewController.isExpanded) { + return false + } + if ( + (bubbleControllers == null || bubbleControllers.bubbleStashController.isStashed) && + controllers.taskbarStashController.isStashed + ) { return false } @@ -122,7 +132,12 @@ class TaskbarStashViaTouchController(val controllers: TaskbarControllers) : Touc return true } } else if (ev.action == MotionEvent.ACTION_DOWN) { - if (screenCoordinatesEv.y < gestureHeightYThreshold) { + val isDownOnBubbleBar = + (bubbleControllers != null && + bubbleControllers.bubbleBarViewController.isEventOverAnyItem( + screenCoordinatesEv + )) + if (!isDownOnBubbleBar && screenCoordinatesEv.y < gestureHeightYThreshold) { controllers.taskbarStashController.updateAndAnimateTransientTaskbar(true) } } diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarTranslationController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarTranslationController.java index 065d1117c8..2456f4b5ae 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarTranslationController.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarTranslationController.java @@ -92,6 +92,10 @@ public class TaskbarTranslationController implements TaskbarControllers.Loggable mControllers.stashedHandleViewController.setTranslationYForSwipe(transY); mControllers.taskbarViewController.setTranslationYForSwipe(transY); mControllers.taskbarDragLayerController.setTranslationYForSwipe(transY); + mControllers.bubbleControllers.ifPresent(controllers -> { + controllers.bubbleBarViewController.setTranslationYForSwipe(transY); + controllers.bubbleStashedHandleViewController.setTranslationYForSwipe(transY); + }); } /** diff --git a/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarViewController.java b/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarViewController.java index 82494c6fda..37861896e0 100644 --- a/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarViewController.java +++ b/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarViewController.java @@ -28,6 +28,8 @@ import com.android.launcher3.R; import com.android.launcher3.anim.AnimatedFloat; import com.android.launcher3.taskbar.TaskbarActivityContext; import com.android.launcher3.taskbar.TaskbarControllers; +import com.android.launcher3.taskbar.TaskbarInsetsController; +import com.android.launcher3.taskbar.TaskbarStashController; import com.android.launcher3.util.MultiPropertyFactory; import com.android.launcher3.util.MultiValueAlpha; import com.android.quickstep.SystemUiProxy; @@ -51,6 +53,8 @@ public class BubbleBarViewController { // Initialized in init. private BubbleStashController mBubbleStashController; private BubbleBarController mBubbleBarController; + private TaskbarStashController mTaskbarStashController; + private TaskbarInsetsController mTaskbarInsetsController; private View.OnClickListener mBubbleClickListener; private View.OnClickListener mBubbleBarClickListener; @@ -80,6 +84,8 @@ public class BubbleBarViewController { public void init(TaskbarControllers controllers, BubbleControllers bubbleControllers) { mBubbleStashController = bubbleControllers.bubbleStashController; mBubbleBarController = bubbleControllers.bubbleBarController; + mTaskbarStashController = controllers.taskbarStashController; + mTaskbarInsetsController = controllers.taskbarInsetsController; mActivity.addOnDeviceProfileChangeListener(dp -> mBarView.getLayoutParams().height = mActivity.getDeviceProfile().taskbarHeight @@ -89,7 +95,9 @@ public class BubbleBarViewController { mBubbleClickListener = v -> onBubbleClicked(v); mBubbleBarClickListener = v -> setExpanded(true); mBarView.setOnClickListener(mBubbleBarClickListener); - // TODO: when barView layout changes tell taskbarInsetsController the insets have changed. + mBarView.addOnLayoutChangeListener((view, i, i1, i2, i3, i4, i5, i6, i7) -> + mTaskbarInsetsController.onTaskbarOrBubblebarWindowHeightOrInsetsChanged() + ); } private void onBubbleClicked(View v) { @@ -283,7 +291,8 @@ public class BubbleBarViewController { } else { Log.w(TAG, "trying to expand bubbles when there isn't one selected"); } - // TODO: Tell taskbar stash controller to stash without bubbles following + mTaskbarStashController.updateAndAnimateTransientTaskbar(true /* stash */, + false /* shouldBubblesFollow */); } } } diff --git a/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleStashController.java b/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleStashController.java index 0ab53b0c20..b3c7d41e37 100644 --- a/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleStashController.java +++ b/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleStashController.java @@ -25,6 +25,7 @@ import com.android.launcher3.anim.AnimatedFloat; import com.android.launcher3.taskbar.StashedHandleViewController; import com.android.launcher3.taskbar.TaskbarActivityContext; import com.android.launcher3.taskbar.TaskbarControllers; +import com.android.launcher3.taskbar.TaskbarInsetsController; import com.android.launcher3.taskbar.TaskbarStashController; import com.android.launcher3.util.MultiPropertyFactory; @@ -50,6 +51,7 @@ public class BubbleStashController { // Initialized in init. private TaskbarControllers mControllers; + private TaskbarInsetsController mTaskbarInsetsController; private BubbleBarViewController mBarViewController; private BubbleStashedHandleViewController mHandleViewController; private TaskbarStashController mTaskbarStashController; @@ -77,6 +79,7 @@ public class BubbleStashController { public void init(TaskbarControllers controllers, BubbleControllers bubbleControllers) { mControllers = controllers; + mTaskbarInsetsController = controllers.taskbarInsetsController; mBarViewController = bubbleControllers.bubbleBarViewController; mHandleViewController = bubbleControllers.bubbleStashedHandleViewController; mTaskbarStashController = controllers.taskbarStashController; @@ -271,7 +274,7 @@ public class BubbleStashController { private void onIsStashedChanged() { mControllers.runAfterInit(() -> { mHandleViewController.onIsStashedChanged(); - // TODO: when stash changes tell taskbarInsetsController the insets have changed. + mTaskbarInsetsController.onTaskbarOrBubblebarWindowHeightOrInsetsChanged(); }); } } diff --git a/quickstep/src/com/android/quickstep/inputconsumers/TaskbarUnstashInputConsumer.java b/quickstep/src/com/android/quickstep/inputconsumers/TaskbarUnstashInputConsumer.java index fbe7fde236..e9a0761caf 100644 --- a/quickstep/src/com/android/quickstep/inputconsumers/TaskbarUnstashInputConsumer.java +++ b/quickstep/src/com/android/quickstep/inputconsumers/TaskbarUnstashInputConsumer.java @@ -37,6 +37,7 @@ import com.android.launcher3.R; import com.android.launcher3.Utilities; import com.android.launcher3.taskbar.TaskbarActivityContext; import com.android.launcher3.taskbar.TaskbarTranslationController.TransitionCallback; +import com.android.launcher3.taskbar.bubbles.BubbleControllers; import com.android.launcher3.touch.OverScroll; import com.android.launcher3.util.DisplayController; import com.android.quickstep.InputConsumer; @@ -62,6 +63,7 @@ public class TaskbarUnstashInputConsumer extends DelegateInputConsumer { private final int mTaskbarNavThresholdY; private final boolean mIsTaskbarAllAppsOpen; private boolean mHasPassedTaskbarNavThreshold; + private boolean mIsInBubbleBarArea; private final PointF mDownPos = new PointF(); private final PointF mLastPos = new PointF(); @@ -136,7 +138,7 @@ public class TaskbarUnstashInputConsumer extends DelegateInputConsumer { mHasPassedTaskbarNavThreshold = false; mTaskbarActivityContext.setAutohideSuspendFlag( FLAG_AUTOHIDE_SUSPEND_TOUCHING, true); - if (isInArea(x)) { + if (isInTaskbarArea(x)) { if (!mIsTransientTaskbar) { mLongPressDownX = x; mLongPressDownY = y; @@ -145,10 +147,12 @@ public class TaskbarUnstashInputConsumer extends DelegateInputConsumer { mCanceledUnstashHint = false; } } - if (mTransitionCallback != null && !mIsTaskbarAllAppsOpen) { mTransitionCallback.onActionDown(); } + if (mIsTransientTaskbar && isInBubbleBarArea(x)) { + mIsInBubbleBarArea = true; + } break; case MotionEvent.ACTION_POINTER_UP: int ptrIdx = ev.getActionIndex(); @@ -185,7 +189,11 @@ public class TaskbarUnstashInputConsumer extends DelegateInputConsumer { if (!mHasPassedTaskbarNavThreshold && passedTaskbarNavThreshold) { mHasPassedTaskbarNavThreshold = true; - mTaskbarActivityContext.onSwipeToUnstashTaskbar(); + if (mIsInBubbleBarArea) { + mTaskbarActivityContext.onSwipeToOpenBubblebar(); + } else { + mTaskbarActivityContext.onSwipeToUnstashTaskbar(); + } } if (dY < 0) { @@ -208,21 +216,32 @@ public class TaskbarUnstashInputConsumer extends DelegateInputConsumer { mTransitionCallback.onActionEnd(); } mHasPassedTaskbarNavThreshold = false; + mIsInBubbleBarArea = false; break; } } } } - private boolean isInArea(float x) { + private boolean isInTaskbarArea(float x) { float areaFromMiddle = mUnstashArea / 2.0f; float distFromMiddle = Math.abs(mScreenWidth / 2.0f - x); return distFromMiddle < areaFromMiddle; } + private boolean isInBubbleBarArea(float x) { + if (mTaskbarActivityContext != null && mIsTransientTaskbar) { + BubbleControllers controllers = mTaskbarActivityContext.getBubbleControllers(); + if (controllers == null) return false; + Rect bubbleBarBounds = controllers.bubbleBarViewController.getBubbleBarBounds(); + return x >= bubbleBarBounds.left && x <= bubbleBarBounds.right; + } + return false; + } + private void onLongPressDetected(MotionEvent motionEvent) { if (mTaskbarActivityContext != null - && isInArea(motionEvent.getRawX()) + && isInTaskbarArea(motionEvent.getRawX()) && !mIsTransientTaskbar) { boolean taskBarPressed = mTaskbarActivityContext.onLongPressToUnstashTaskbar(); if (taskBarPressed) {