diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java index 398926f0ca858..e5872d5c5e5cf 100644 --- a/services/core/java/com/android/server/wm/ActivityRecord.java +++ b/services/core/java/com/android/server/wm/ActivityRecord.java @@ -925,7 +925,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A // SystemUi sets the pinned mode on activity after transition is done. boolean mWaitForEnteringPinnedMode; - private final ActivityRecordInputSink mActivityRecordInputSink; + final ActivityRecordInputSink mActivityRecordInputSink; // Activities with this uid are allowed to not create an input sink while being in the same // task and directly above this ActivityRecord. This field is updated whenever a new activity @@ -7897,7 +7897,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A } boolean isInTransition() { - return mTransitionController.inTransition() // Shell transitions. + return mTransitionController.inTransition(this) // Shell transitions. || isAnimating(PARENTS | TRANSITION); // Legacy transitions. } diff --git a/services/core/java/com/android/server/wm/ActivityRecordInputSink.java b/services/core/java/com/android/server/wm/ActivityRecordInputSink.java index d59f69622f156..5d038dcab73ad 100644 --- a/services/core/java/com/android/server/wm/ActivityRecordInputSink.java +++ b/services/core/java/com/android/server/wm/ActivityRecordInputSink.java @@ -81,8 +81,8 @@ class ActivityRecordInputSink { // Don't block touches from passing through to an activity below us in the same task, if // that activity is either from the same uid or if that activity has launched an activity // in our uid. - final ActivityRecord activityBelowInTask = - mActivityRecord.getTask().getActivityBelow(mActivityRecord); + final ActivityRecord activityBelowInTask = mActivityRecord.getTask() != null + ? mActivityRecord.getTask().getActivityBelow(mActivityRecord) : null; final boolean allowPassthrough = activityBelowInTask != null && ( activityBelowInTask.mAllowedTouchUid == mActivityRecord.getUid() || activityBelowInTask.isUid(mActivityRecord.getUid())); diff --git a/services/core/java/com/android/server/wm/Transition.java b/services/core/java/com/android/server/wm/Transition.java index 84f6104652e33..f16305026554c 100644 --- a/services/core/java/com/android/server/wm/Transition.java +++ b/services/core/java/com/android/server/wm/Transition.java @@ -95,7 +95,6 @@ import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.util.ArrayList; import java.util.List; -import java.util.Objects; import java.util.function.Predicate; /** @@ -656,6 +655,19 @@ class Transition extends Binder implements BLASTSyncEngine.TransactionReadyListe mController.dispatchLegacyAppTransitionFinished(ar); } } + + // Update the input-sink (touch-blocking) state now that the animation is finished. + SurfaceControl.Transaction inputSinkTransaction = null; + for (int i = 0; i < mParticipants.size(); ++i) { + final ActivityRecord ar = mParticipants.valueAt(i).asActivityRecord(); + if (ar == null || !ar.isVisible()) continue; + if (inputSinkTransaction == null) { + inputSinkTransaction = new SurfaceControl.Transaction(); + } + ar.mActivityRecordInputSink.applyChangesToSurfaceIfChanged(inputSinkTransaction); + } + if (inputSinkTransaction != null) inputSinkTransaction.apply(); + // Always schedule stop processing when transition finishes because activities don't // stop while they are in a transition thus their stop could still be pending. mController.mAtm.mTaskSupervisor