From b331f9d216e464a7ea5c5d92bb4464ed5d8b1e26 Mon Sep 17 00:00:00 2001 From: Jorim Jaggi Date: Fri, 21 Jul 2017 14:35:49 +0200 Subject: Fix flickery behavior when launching notification when occluded - Launch the action after the panel is fully collapses in this case such that we have a clean transition, like we do when launching all other activities from the shade. - When Keyguard flags changed, don't execute the app transition when there was already be one before, as it might interfere with that one and start it prematurely. Test: go/wm-smoke Test: Launch notification from occluded notification shade Bug: 63686192 Change-Id: I49efb2f627fcc7a0d6386dcea2510d31ab520b11 --- .../com/android/systemui/statusbar/phone/StatusBar.java | 12 +++++++++--- .../java/com/android/server/am/ActivityManagerService.java | 14 ++++++++++++-- 2 files changed, 21 insertions(+), 5 deletions(-) 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 75a27680287b..58c0964f8628 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java @@ -6811,7 +6811,6 @@ public class StatusBar extends SystemUI implements DemoMode, } }); - final boolean keyguardShowing = mStatusBarKeyguardViewManager.isShowing(); final boolean afterKeyguardGone = intent.isActivity() && PreviewInflater.wouldLaunchResolverActivity(mContext, intent.getIntent(), mCurrentUserId); @@ -6838,7 +6837,7 @@ public class StatusBar extends SystemUI implements DemoMode, } } final StatusBarNotification parentToCancelFinal = parentToCancel; - new Thread() { + final Runnable runnable = new Runnable() { @Override public void run() { try { @@ -6910,7 +6909,14 @@ public class StatusBar extends SystemUI implements DemoMode, }); } } - }.start(); + }; + + if (mStatusBarKeyguardViewManager.isShowing() + && mStatusBarKeyguardViewManager.isOccluded()) { + mStatusBarKeyguardViewManager.addAfterKeyguardGoneRunnable(runnable); + } else { + new Thread(runnable).start(); + } // close the shade if it was open animateCollapsePanels(CommandQueue.FLAG_EXCLUDE_RECENTS_PANEL, diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 75467f514540..8ccd176d796f 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -23982,9 +23982,19 @@ public class ActivityManagerService extends IActivityManager.Stub // We might change the visibilities here, so prepare an empty app transition which // might be overridden later if we actually change visibilities. - mWindowManager.prepareAppTransition(TRANSIT_NONE, false /* alwaysKeepCurrent */); + final boolean wasTransitionSet = + mWindowManager.getPendingAppTransition() != TRANSIT_NONE; + if (!wasTransitionSet) { + mWindowManager.prepareAppTransition(TRANSIT_NONE, + false /* alwaysKeepCurrent */); + } mStackSupervisor.ensureActivitiesVisibleLocked(null, 0, !PRESERVE_WINDOWS); - mWindowManager.executeAppTransition(); + + // If there was a transition set already we don't want to interfere with it as we + // might be starting it too early. + if (!wasTransitionSet) { + mWindowManager.executeAppTransition(); + } } if (callback != null) { callback.run(); -- cgit v1.2.3-59-g8ed1b