From 30c947df377af0a50736f401a8061b2b67b882f0 Mon Sep 17 00:00:00 2001 From: Sergey Nikolaienkov Date: Wed, 15 Apr 2020 19:55:48 +0200 Subject: [PATCH] Make unfocused windows in pinned mode unable to receive touch input Make unfocused ActivityStacks in pinned windowing mode ignore input on Leanback devices (TVs). Bug: 144032975 Bug: 153050065 Test: atest atest CtsWindowManagerDeviceTestCases:PinnedStackTests Change-Id: Id9049c543ed6493a840b7a34a68f4e7bc1010262 --- .../core/java/com/android/server/wm/ActivityStack.java | 10 +++++++++- .../android/server/wm/ActivityTaskManagerService.java | 8 ++++++-- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/services/core/java/com/android/server/wm/ActivityStack.java b/services/core/java/com/android/server/wm/ActivityStack.java index 8bf46bc7c2e84..45c881b9ffa68 100644 --- a/services/core/java/com/android/server/wm/ActivityStack.java +++ b/services/core/java/com/android/server/wm/ActivityStack.java @@ -3610,7 +3610,15 @@ class ActivityStack extends Task { } boolean shouldIgnoreInput() { - return inSplitScreenPrimaryWindowingMode() && !isFocusable(); + if (inSplitScreenPrimaryWindowingMode() && !isFocusable()) { + return true; + } + if (mAtmService.mHasLeanbackFeature && inPinnedWindowingMode() + && !isFocusedStackOnDisplay()) { + // Preventing Picture-in-Picture stack from receiving input on TVs. + return true; + } + return false; } @Override diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java index 7a04894523f59..80036865c3770 100644 --- a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java +++ b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java @@ -42,7 +42,9 @@ import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK; import static android.content.pm.ApplicationInfo.FLAG_FACTORY_TEST; import static android.content.pm.ConfigurationInfo.GL_ES_VERSION_UNDEFINED; import static android.content.pm.PackageManager.FEATURE_ACTIVITIES_ON_SECONDARY_DISPLAYS; +import static android.content.pm.PackageManager.FEATURE_CANT_SAVE_STATE; import static android.content.pm.PackageManager.FEATURE_FREEFORM_WINDOW_MANAGEMENT; +import static android.content.pm.PackageManager.FEATURE_LEANBACK; import static android.content.pm.PackageManager.FEATURE_PICTURE_IN_PICTURE; import static android.content.pm.PackageManager.PERMISSION_GRANTED; import static android.os.FactoryTest.FACTORY_TEST_HIGH_LEVEL; @@ -393,6 +395,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { /** The currently running heavy-weight process, if any. */ WindowProcessController mHeavyWeightProcess = null; boolean mHasHeavyWeightFeature; + boolean mHasLeanbackFeature; /** * This is the process holding the activity the user last visited that is in a different process * from the one they are currently in. @@ -734,8 +737,9 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { public void onSystemReady() { synchronized (mGlobalLock) { - mHasHeavyWeightFeature = mContext.getPackageManager().hasSystemFeature( - PackageManager.FEATURE_CANT_SAVE_STATE); + final PackageManager pm = mContext.getPackageManager(); + mHasHeavyWeightFeature = pm.hasSystemFeature(FEATURE_CANT_SAVE_STATE); + mHasLeanbackFeature = pm.hasSystemFeature(FEATURE_LEANBACK); mAssistUtils = new AssistUtils(mContext); mVrController.onSystemReady(); mRecentTasks.onSystemReadyLocked();