From 142344cc1cf220549eac7472f9efd90d7aadfb27 Mon Sep 17 00:00:00 2001 From: Ricky Wai Date: Mon, 16 Nov 2020 12:12:57 +0000 Subject: [PATCH] Allow current IME to start background activity Current active IME should be always allowed to start activity, like IME settings. Bug: 159433730 Bug: 168397303 Test: Click home button, then click on any edit text on home screen and open IME setting from IME, setting app is not blocked / delayed. Change-Id: I959cdca58489701453f645a02de0c4879661029b --- .../com/android/server/wm/ActivityStarter.java | 9 +++++++++ .../android/server/wm/ActivityStarterTests.java | 15 +++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/services/core/java/com/android/server/wm/ActivityStarter.java b/services/core/java/com/android/server/wm/ActivityStarter.java index d13b8d4f349bd..6661279cefb9f 100644 --- a/services/core/java/com/android/server/wm/ActivityStarter.java +++ b/services/core/java/com/android/server/wm/ActivityStarter.java @@ -1284,6 +1284,15 @@ class ActivityStarter { return false; } + // IME should always be allowed to start activity, like IME settings. + final WindowState imeWindow = mRootWindowContainer.getCurrentInputMethodWindow(); + if (imeWindow != null && callingAppId == imeWindow.mOwnerUid) { + if (DEBUG_ACTIVITY_STARTS) { + Slog.d(TAG, "Activity start allowed for active ime (" + callingUid + ")"); + } + return false; + } + // App switching will be allowed if BAL app switching flag is not enabled, or if // its app switching rule allows it. // This is used to block background activity launch even if the app is still diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityStarterTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityStarterTests.java index c05eb8e56762e..14ea08e21287d 100644 --- a/services/tests/wmtests/src/com/android/server/wm/ActivityStarterTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/ActivityStarterTests.java @@ -123,6 +123,7 @@ public class ActivityStarterTests extends WindowTestsBase { private static final String FAKE_CALLING_PACKAGE = "com.whatever.dude"; private static final int UNIMPORTANT_UID = 12345; private static final int UNIMPORTANT_UID2 = 12346; + private static final int CURRENT_IME_UID = 12347; @Before public void setUp() throws Exception { @@ -307,6 +308,12 @@ public class ActivityStarterTests extends WindowTestsBase { return prepareStarter(launchFlags, true /* mockGetLaunchStack */); } + private void setupImeWindow() { + final WindowState imeWindow = createWindow(null, W_INPUT_METHOD, + "mImeWindow", CURRENT_IME_UID); + mDisplayContent.mInputMethodWindow = imeWindow; + } + /** * Creates a {@link ActivityStarter} with default parameters and necessary mocks. * @@ -638,6 +645,14 @@ public class ActivityStarterTests extends WindowTestsBase { UNIMPORTANT_UID, false, PROCESS_STATE_TOP + 1, UNIMPORTANT_UID2, false, PROCESS_STATE_TOP + 1, false, false, false, false, true); + + setupImeWindow(); + runAndVerifyBackgroundActivityStartsSubtest( + "disallowed_callingPackageNameIsIme_notAborted", false, + CURRENT_IME_UID, false, PROCESS_STATE_TOP + 1, + UNIMPORTANT_UID2, false, PROCESS_STATE_TOP + 1, + false, false, false, false, false); + } private void runAndVerifyBackgroundActivityStartsSubtest(String name, boolean shouldHaveAborted,