Merge "Keyguard: use transition state for syncing occlude [RESTRICT AUTOMERGE]" into tm-qpr-dev
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
index d608abc..58ed3aa 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
@@ -963,14 +963,7 @@
                             mOccludeByDreamAnimator.cancel();
                         }
                     });
-                    // The value of isKeyguardOccluded here may come from mergeAnimation, which
-                    // isn't reliable. In all cases, after running or cancelling this animation,
-                    // keyguard should be occluded.
-                    setOccluded(true /* isOccluded */, false /* animate */);
-                    if (DEBUG) {
-                        Log.d(TAG, "Occlude by Dream animation cancelled. Occluded state is now: "
-                                + mOccluded);
-                    }
+                    Log.d(TAG, "Occlude by Dream animation cancelled.");
                 }
 
                 @Override
@@ -1076,10 +1069,7 @@
                         }
                     });
 
-                    setOccluded(isKeyguardOccluded /* isOccluded */, false /* animate */);
-                    Log.d(TAG, "Unocclude animation cancelled. Occluded state is now: "
-                            + mOccluded);
-
+                    Log.d(TAG, "Unocclude animation cancelled.");
                     mInteractionJankMonitor.cancel(CUJ_LOCKSCREEN_OCCLUSION);
                 }
 
@@ -3446,10 +3436,7 @@
         public void onAnimationCancelled(boolean isKeyguardOccluded) throws RemoteException {
             super.onAnimationCancelled(isKeyguardOccluded);
 
-            Log.d(TAG, "Occlude animation cancelled by WM. "
-                    + "Setting occluded state to: " + isKeyguardOccluded);
-            setOccluded(isKeyguardOccluded /* occluded */, false /* animate */);
-
+            Log.d(TAG, "Occlude animation cancelled by WM.");
             mInteractionJankMonitor.cancel(CUJ_LOCKSCREEN_OCCLUSION);
         }
     }
diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java
index 74d87cd..2426a88 100644
--- a/services/core/java/com/android/server/policy/PhoneWindowManager.java
+++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java
@@ -2134,10 +2134,14 @@
         }
 
         mWindowManagerInternal.registerAppTransitionListener(new AppTransitionListener() {
+            private boolean mOccludeChangingInTransition = false;
+
             @Override
             public int onAppTransitionStartingLocked(boolean keyguardGoingAway,
                     boolean keyguardOccluding, long duration, long statusBarAnimationStartTime,
                     long statusBarAnimationDuration) {
+                mOccludeChangingInTransition = keyguardGoingAway || keyguardOccluding;
+
                 // When remote animation is enabled for KEYGUARD_GOING_AWAY transition, SysUI
                 // receives IRemoteAnimationRunner#onAnimationStart to start animation, so we don't
                 // need to call IKeyguardService#keyguardGoingAway here.
@@ -2153,6 +2157,11 @@
                         0 /* duration */);
 
                 synchronized (mLock) {
+                    if (mOccludeChangingInTransition) {
+                        mKeyguardOccludedChanged = true;
+                        mOccludeChangingInTransition = false;
+                    }
+                    applyKeyguardOcclusionChange(false);
                     mLockAfterAppTransitionFinished = false;
                 }
             }
@@ -2160,12 +2169,16 @@
             @Override
             public void onAppTransitionFinishedLocked(IBinder token) {
                 synchronized (mLock) {
+                    if (mOccludeChangingInTransition) {
+                        mKeyguardOccludedChanged = true;
+                        mOccludeChangingInTransition = false;
+                    }
+                    applyKeyguardOcclusionChange(false /* transitionStarted */);
                     if (!mLockAfterAppTransitionFinished) {
                         return;
                     }
                     mLockAfterAppTransitionFinished = false;
                 }
-
                 lockNow(null);
             }
         });
@@ -3355,7 +3368,7 @@
         if (mKeyguardOccludedChanged) {
             if (DEBUG_KEYGUARD) Slog.d(TAG, "transition/occluded changed occluded="
                     + mPendingKeyguardOccluded);
-            if (setKeyguardOccludedLw(mPendingKeyguardOccluded, false /* force */,
+            if (setKeyguardOccludedLw(mPendingKeyguardOccluded, true /* force */,
                     transitionStarted)) {
                 return FINISH_LAYOUT_REDO_LAYOUT | FINISH_LAYOUT_REDO_WALLPAPER;
             }
@@ -3616,6 +3629,7 @@
     private boolean setKeyguardOccludedLw(boolean isOccluded, boolean force,
             boolean transitionStarted) {
         if (DEBUG_KEYGUARD) Slog.d(TAG, "setKeyguardOccluded occluded=" + isOccluded);
+        mPendingKeyguardOccluded = isOccluded;
         mKeyguardOccludedChanged = false;
         if (isKeyguardOccluded() == isOccluded && !force) {
             return false;