diff options
7 files changed, 62 insertions, 1 deletions
diff --git a/core/java/com/android/internal/statusbar/IStatusBar.aidl b/core/java/com/android/internal/statusbar/IStatusBar.aidl index 7e501d27d30f..c715577cb7d2 100644 --- a/core/java/com/android/internal/statusbar/IStatusBar.aidl +++ b/core/java/com/android/internal/statusbar/IStatusBar.aidl @@ -167,4 +167,9 @@ oneway interface IStatusBar * Notifies System UI that the display is ready to show system decorations. */ void onDisplayReady(int displayId); + + /** + * Notifies System UI whether the recents animation is running or not. + */ + void onRecentsAnimationStateChanged(boolean running); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java b/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java index f97be1ea8358..6329af56077b 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java @@ -115,6 +115,7 @@ public class CommandQueue extends IStatusBar.Stub implements CallbackController< private static final int MSG_SHOW_CHARGING_ANIMATION = 44 << MSG_SHIFT; private static final int MSG_SHOW_PINNING_TOAST_ENTER_EXIT = 45 << MSG_SHIFT; private static final int MSG_SHOW_PINNING_TOAST_ESCAPE = 46 << MSG_SHIFT; + private static final int MSG_RECENTS_ANIMATION_STATE_CHANGED = 47 << MSG_SHIFT; public static final int FLAG_EXCLUDE_NONE = 0; public static final int FLAG_EXCLUDE_SEARCH_PANEL = 1 << 0; @@ -281,10 +282,16 @@ public class CommandQueue extends IStatusBar.Stub implements CallbackController< * @see IStatusBar#onDisplayReady(int) */ default void onDisplayReady(int displayId) { } + /** * @see DisplayManager.DisplayListener#onDisplayRemoved(int) */ default void onDisplayRemoved(int displayId) { } + + /** + * @see IStatusBar#onRecentsAnimationStateChanged(boolean) + */ + default void onRecentsAnimationStateChanged(boolean running) { } } @VisibleForTesting @@ -785,6 +792,14 @@ public class CommandQueue extends IStatusBar.Stub implements CallbackController< } } + @Override + public void onRecentsAnimationStateChanged(boolean running) { + synchronized (mLock) { + mHandler.obtainMessage(MSG_RECENTS_ANIMATION_STATE_CHANGED, running ? 1 : 0, 0) + .sendToTarget(); + } + } + private void handleShowImeButton(int displayId, IBinder token, int vis, int backDisposition, boolean showImeSwitcher) { if (displayId == INVALID_DISPLAY) return; @@ -1071,6 +1086,11 @@ public class CommandQueue extends IStatusBar.Stub implements CallbackController< mCallbacks.get(i).onDisplayReady(msg.arg1); } break; + case MSG_RECENTS_ANIMATION_STATE_CHANGED: + for (int i = 0; i < mCallbacks.size(); i++) { + mCallbacks.get(i).onRecentsAnimationStateChanged(msg.arg1 > 0); + } + break; } } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java index 17f0d5a79034..38ea9f8d8063 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java @@ -2154,6 +2154,11 @@ public class StatusBar extends SystemUI implements DemoMode, } } + @Override + public void onRecentsAnimationStateChanged(boolean running) { + setInteracting(StatusBarManager.WINDOW_NAVIGATION_BAR, running); + } + protected @TransitionMode int computeStatusBarMode(int oldVal, int newVal) { return computeBarMode(oldVal, newVal); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/CommandQueueTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/CommandQueueTest.java index b049632942cf..84a7d4f0ff15 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/CommandQueueTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/CommandQueueTest.java @@ -358,4 +358,11 @@ public class CommandQueueTest extends SysuiTestCase { waitForIdleSync(); verify(mCallbacks).onDisplayRemoved(eq(SECONDARY_DISPLAY)); } + + @Test + public void testOnRecentsAnimationStateChanged() { + mCommandQueue.onRecentsAnimationStateChanged(true); + waitForIdleSync(); + verify(mCallbacks).onRecentsAnimationStateChanged(eq(true)); + } } diff --git a/services/core/java/com/android/server/statusbar/StatusBarManagerInternal.java b/services/core/java/com/android/server/statusbar/StatusBarManagerInternal.java index 7734d6bd30a7..a93d2b8b6fb9 100644 --- a/services/core/java/com/android/server/statusbar/StatusBarManagerInternal.java +++ b/services/core/java/com/android/server/statusbar/StatusBarManagerInternal.java @@ -108,4 +108,9 @@ public interface StatusBarManagerInternal { * @param displayId display ID */ void onDisplayReady(int displayId); + + /** + * Notifies System UI whether the recents animation is running. + */ + void onRecentsAnimationStateChanged(boolean running); } diff --git a/services/core/java/com/android/server/statusbar/StatusBarManagerService.java b/services/core/java/com/android/server/statusbar/StatusBarManagerService.java index b2d7084fcd05..112104d073b0 100644 --- a/services/core/java/com/android/server/statusbar/StatusBarManagerService.java +++ b/services/core/java/com/android/server/statusbar/StatusBarManagerService.java @@ -453,8 +453,18 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D if (mBar != null) { try { mBar.onDisplayReady(displayId); - } catch (RemoteException ex) { } + } catch (RemoteException ex) {} + } + } + + @Override + public void onRecentsAnimationStateChanged(boolean running) { + if (mBar != null) { + try { + mBar.onRecentsAnimationStateChanged(running); + } catch (RemoteException ex) {} } + } }; diff --git a/services/core/java/com/android/server/wm/RecentsAnimationController.java b/services/core/java/com/android/server/wm/RecentsAnimationController.java index d2c510fa8902..c03dabe660ad 100644 --- a/services/core/java/com/android/server/wm/RecentsAnimationController.java +++ b/services/core/java/com/android/server/wm/RecentsAnimationController.java @@ -56,6 +56,7 @@ import android.view.SurfaceControl.Transaction; import com.android.internal.annotations.VisibleForTesting; import com.android.server.LocalServices; import com.android.server.inputmethod.InputMethodManagerInternal; +import com.android.server.statusbar.StatusBarManagerInternal; import com.android.server.wm.SurfaceAnimator.OnAnimationFinishedCallback; import com.android.server.wm.utils.InsetUtils; @@ -87,6 +88,7 @@ public class RecentsAnimationController implements DeathRecipient { public @interface ReorderMode {} private final WindowManagerService mService; + private final StatusBarManagerInternal mStatusBar; private IRecentsAnimationRunner mRunner; private final RecentsAnimationCallbacks mCallbacks; private final ArrayList<TaskAnimationAdapter> mPendingAnimations = new ArrayList<>(); @@ -308,6 +310,7 @@ public class RecentsAnimationController implements DeathRecipient { mRunner = remoteAnimationRunner; mCallbacks = callbacks; mDisplayId = displayId; + mStatusBar = LocalServices.getService(StatusBarManagerInternal.class); } public void initialize(int targetActivityType, SparseBooleanArray recentTaskIds) { @@ -381,6 +384,9 @@ public class RecentsAnimationController implements DeathRecipient { mMinimizedHomeBounds); mService.mWindowPlacerLocked.performSurfacePlacement(); + + // Notify that the animation has started + mStatusBar.onRecentsAnimationStateChanged(true /* running */); } @VisibleForTesting @@ -594,6 +600,9 @@ public class RecentsAnimationController implements DeathRecipient { .mAppTransition.notifyAppTransitionFinishedLocked(mTargetAppToken.token); } } + + // Notify that the animation has ended + mStatusBar.onRecentsAnimationStateChanged(false /* running */); } void scheduleFailsafe() { |