diff options
| author | 2021-02-03 22:51:15 +0800 | |
|---|---|---|
| committer | 2021-03-12 04:08:56 +0000 | |
| commit | 11af33eeaf59b8cc5e1524b0fe2efdfef27eb803 (patch) | |
| tree | c0ce25aa5fdcaebfb7009a8acabd1fa956db0cf1 | |
| parent | d52e491d2f13acae00a8397ccebf156634da4466 (diff) | |
Fix several test failures for the new starting window.(10/N)
1. Register TestStartingWindowOrganizer to mock add/remove starting
window.
2. Do not show starting window if not occluded.
3. Add ReadFrameBuffer permission so Car can get TaskSnapshot.
4. Correct package path for shell.startingsurface.
5. Do not show starting window for home type.
Bug: 73289295
Bug: 131311659
Test: atest TaplTestsLauncher3
Test: atest WmTests StartingSurfaceDrawerTests TaskSnapshotWindowTest
Test: atest CtsWindowManagerDeviceTestCases
Change-Id: I89930d2e8a05cca6197c36c780ee1843fe454354
11 files changed, 118 insertions, 15 deletions
diff --git a/core/java/android/window/StartingWindowInfo.java b/core/java/android/window/StartingWindowInfo.java index d1c1e40d1578..c7672dc9fe7d 100644 --- a/core/java/android/window/StartingWindowInfo.java +++ b/core/java/android/window/StartingWindowInfo.java @@ -126,6 +126,12 @@ public final class StartingWindowInfo implements Parcelable { */ public int splashScreenThemeResId; + /** + * Is keyguard occluded on default display. + * @hide + */ + public boolean isKeyguardOccluded = false; + public StartingWindowInfo() { } @@ -147,6 +153,7 @@ public final class StartingWindowInfo implements Parcelable { dest.writeTypedObject(topOpaqueWindowLayoutParams, flags); dest.writeTypedObject(mainWindowLayoutParams, flags); dest.writeInt(splashScreenThemeResId); + dest.writeBoolean(isKeyguardOccluded); } void readFromParcel(@NonNull Parcel source) { @@ -157,6 +164,7 @@ public final class StartingWindowInfo implements Parcelable { WindowManager.LayoutParams.CREATOR); mainWindowLayoutParams = source.readTypedObject(WindowManager.LayoutParams.CREATOR); splashScreenThemeResId = source.readInt(); + isKeyguardOccluded = source.readBoolean(); } @Override diff --git a/libs/WindowManager/Shell/AndroidManifest.xml b/libs/WindowManager/Shell/AndroidManifest.xml index c0bc73dcbd47..d2b3cf6a4fe2 100644 --- a/libs/WindowManager/Shell/AndroidManifest.xml +++ b/libs/WindowManager/Shell/AndroidManifest.xml @@ -18,4 +18,5 @@ <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.android.wm.shell"> <uses-permission android:name="android.permission.ROTATE_SURFACE_FLINGER" /> + <uses-permission android:name="android.permission.READ_FRAME_BUFFER" /> </manifest> diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/StartingSurfaceDrawer.java b/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/StartingSurfaceDrawer.java index dbd518d4a3d3..14fbaacb9613 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/StartingSurfaceDrawer.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/StartingSurfaceDrawer.java @@ -217,7 +217,7 @@ public class StartingSurfaceDrawer { // the keyguard is being hidden. This is okay because starting windows never show // secret information. // TODO(b/113840485): Occluded may not only happen on default display - if (displayId == DEFAULT_DISPLAY) { + if (displayId == DEFAULT_DISPLAY && windowInfo.isKeyguardOccluded) { windowFlags |= WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED; } @@ -343,12 +343,6 @@ public class StartingSurfaceDrawer { Slog.w(TAG, appToken + " already running, starting window not displayed. " + e.getMessage()); shouldSaveView = false; - } catch (RuntimeException e) { - // don't crash if something else bad happens, for example a - // failure loading resources because we are loading from an app - // on external storage that has been unmounted. - Slog.w(TAG, appToken + " failed creating starting window", e); - shouldSaveView = false; } finally { if (view != null && view.getParent() == null) { Slog.w(TAG, "view not successfully added to wm, removing view"); diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/StartingWindowController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/StartingWindowController.java index 60f9585137f9..a694e525a761 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/StartingWindowController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/StartingWindowController.java @@ -123,7 +123,8 @@ public class StartingWindowController { + " allowTaskSnapshot " + allowTaskSnapshot + " activityCreated " + activityCreated); } - if (newTask || !processRunning || (taskSwitch && !activityCreated)) { + if ((newTask || !processRunning || (taskSwitch && !activityCreated)) + && windowInfo.taskInfo.topActivityType != ACTIVITY_TYPE_HOME) { return STARTING_WINDOW_TYPE_SPLASH_SCREEN; } if (taskSwitch && allowTaskSnapshot) { diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/startingsurface/StartingSurfaceDrawerTests.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/startingsurface/StartingSurfaceDrawerTests.java index 624c27fe9fd2..207db9e80511 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/startingsurface/StartingSurfaceDrawerTests.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/startingsurface/StartingSurfaceDrawerTests.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package unittest.src.com.android.wm.shell.startingsurface; +package com.android.wm.shell.startingsurface; import static com.android.dx.mockito.inline.extended.ExtendedMockito.doNothing; import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn; @@ -51,7 +51,6 @@ import androidx.test.platform.app.InstrumentationRegistry; import com.android.wm.shell.common.HandlerExecutor; import com.android.wm.shell.common.ShellExecutor; import com.android.wm.shell.common.TransactionPool; -import com.android.wm.shell.startingsurface.StartingSurfaceDrawer; import org.junit.Before; import org.junit.Test; diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/startingsurface/TaskSnapshotWindowTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/startingsurface/TaskSnapshotWindowTest.java index 27e5f51d88b8..b908df20d3c0 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/startingsurface/TaskSnapshotWindowTest.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/startingsurface/TaskSnapshotWindowTest.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package unittest.src.com.android.wm.shell.startingsurface; +package com.android.wm.shell.startingsurface; import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD; import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN; @@ -48,7 +48,6 @@ import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.filters.SmallTest; import com.android.wm.shell.TestShellExecutor; -import com.android.wm.shell.startingsurface.TaskSnapshotWindow; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java index d132f9e96479..b2c1395b6105 100644 --- a/services/core/java/com/android/server/wm/ActivityRecord.java +++ b/services/core/java/com/android/server/wm/ActivityRecord.java @@ -2128,7 +2128,8 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A private int getStartingWindowType(boolean newTask, boolean taskSwitch, boolean processRunning, boolean allowTaskSnapshot, boolean activityCreated, TaskSnapshot snapshot) { - if (newTask || !processRunning || (taskSwitch && !activityCreated)) { + if ((newTask || !processRunning || (taskSwitch && !activityCreated)) + && !isActivityTypeHome()) { return STARTING_WINDOW_TYPE_SPLASH_SCREEN; } else if (taskSwitch && allowTaskSnapshot) { if (isSnapshotCompatible(snapshot)) { diff --git a/services/core/java/com/android/server/wm/StartingSurfaceController.java b/services/core/java/com/android/server/wm/StartingSurfaceController.java index 70666e7d9e9b..f06025b8ffde 100644 --- a/services/core/java/com/android/server/wm/StartingSurfaceController.java +++ b/services/core/java/com/android/server/wm/StartingSurfaceController.java @@ -42,7 +42,6 @@ public class StartingSurfaceController { /** Set to {@code true} to enable shell starting surface drawer. */ static final boolean DEBUG_ENABLE_SHELL_DRAWER = SystemProperties.getBoolean("persist.debug.shell_starting_surface", false); - private final WindowManagerService mService; public StartingSurfaceController(WindowManagerService wm) { diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java index d992a4591a22..124ad7e196ce 100644 --- a/services/core/java/com/android/server/wm/Task.java +++ b/services/core/java/com/android/server/wm/Task.java @@ -4135,6 +4135,8 @@ class Task extends WindowContainer<WindowContainer> { final StartingWindowInfo info = new StartingWindowInfo(); info.taskInfo = getTaskInfo(); + info.isKeyguardOccluded = + mAtmService.mKeyguardController.isDisplayOccluded(DEFAULT_DISPLAY); final ActivityRecord topActivity = getTopMostActivity(); if (topActivity != null) { info.startingWindowTypeParameter = diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java index d8e7582633de..c19f3489898d 100644 --- a/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java @@ -159,6 +159,11 @@ public class ActivityRecordTests extends WindowTestsBase { setBooted(mAtm); } + private TestStartingWindowOrganizer registerTestStartingWindowOrganizer() { + return new TestStartingWindowOrganizer(mAtm, + mSystemServicesTestRule.getPowerManagerWrapper()); + } + @Test public void testStackCleanupOnClearingTask() { final ActivityRecord activity = createActivityWith2LevelTask(); @@ -2294,6 +2299,7 @@ public class ActivityRecordTests extends WindowTestsBase { @Test public void testCreateRemoveStartingWindow() { + registerTestStartingWindowOrganizer(); final ActivityRecord activity = new ActivityBuilder(mAtm).setCreateTask(true).build(); activity.addStartingWindow(mPackageName, android.R.style.Theme, null, "Test", 0, 0, 0, 0, null, true, true, false, true, @@ -2307,6 +2313,7 @@ public class ActivityRecordTests extends WindowTestsBase { @Test public void testAddRemoveRace() { + registerTestStartingWindowOrganizer(); // There was once a race condition between adding and removing starting windows final ActivityRecord appToken = new ActivityBuilder(mAtm).setCreateTask(true).build(); for (int i = 0; i < 1000; i++) { @@ -2321,6 +2328,7 @@ public class ActivityRecordTests extends WindowTestsBase { @Test public void testTransferStartingWindow() { + registerTestStartingWindowOrganizer(); final ActivityRecord activity1 = new ActivityBuilder(mAtm).setCreateTask(true).build(); final ActivityRecord activity2 = new ActivityBuilder(mAtm).setCreateTask(true).build(); activity1.addStartingWindow(mPackageName, @@ -2337,9 +2345,10 @@ public class ActivityRecordTests extends WindowTestsBase { @Test public void testTransferStartingWindowWhileCreating() { + final TestStartingWindowOrganizer organizer = registerTestStartingWindowOrganizer(); final ActivityRecord activity1 = new ActivityBuilder(mAtm).setCreateTask(true).build(); final ActivityRecord activity2 = new ActivityBuilder(mAtm).setCreateTask(true).build(); - ((TestWindowManagerPolicy) activity1.mWmService.mPolicy).setRunnableWhenAddingSplashScreen( + organizer.setRunnableWhenAddingSplashScreen( () -> { // Surprise, ...! Transfer window in the middle of the creation flow. activity2.addStartingWindow(mPackageName, @@ -2357,6 +2366,7 @@ public class ActivityRecordTests extends WindowTestsBase { @Test public void testTransferStartingWindowCanAnimate() { + registerTestStartingWindowOrganizer(); final ActivityRecord activity1 = new ActivityBuilder(mAtm).setCreateTask(true).build(); final ActivityRecord activity2 = new ActivityBuilder(mAtm).setCreateTask(true).build(); activity1.addStartingWindow(mPackageName, @@ -2380,6 +2390,7 @@ public class ActivityRecordTests extends WindowTestsBase { @Test public void testTransferStartingWindowFromFinishingActivity() { + registerTestStartingWindowOrganizer(); final ActivityRecord activity = new ActivityBuilder(mAtm).setCreateTask(true).build(); final Task task = activity.getTask(); activity.addStartingWindow(mPackageName, android.R.style.Theme, null /* compatInfo */, @@ -2423,6 +2434,7 @@ public class ActivityRecordTests extends WindowTestsBase { @Test public void testTransferStartingWindowSetFixedRotation() { + registerTestStartingWindowOrganizer(); final ActivityRecord activity = new ActivityBuilder(mAtm).setCreateTask(true).build(); final Task task = activity.getTask(); final ActivityRecord topActivity = new ActivityBuilder(mAtm).setTask(task).build(); @@ -2454,6 +2466,7 @@ public class ActivityRecordTests extends WindowTestsBase { @Test public void testTryTransferStartingWindowFromHiddenAboveToken() { + registerTestStartingWindowOrganizer(); // Add two tasks on top of each other. final ActivityRecord activityTop = new ActivityBuilder(mAtm).setCreateTask(true).build(); final ActivityRecord activityBottom = new ActivityBuilder(mAtm).build(); diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java b/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java index 4ee459a10f0b..4a7784cf1b36 100644 --- a/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java +++ b/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java @@ -36,6 +36,7 @@ import static android.view.WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; import static android.view.WindowManager.LayoutParams.LAST_APPLICATION_WINDOW; import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_ATTACHED_DIALOG; import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_MEDIA_OVERLAY; +import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_STARTING; import static android.view.WindowManager.LayoutParams.TYPE_BASE_APPLICATION; import static android.view.WindowManager.LayoutParams.TYPE_DOCK_DIVIDER; import static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD; @@ -50,6 +51,7 @@ import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentat import static com.android.dx.mockito.inline.extended.ExtendedMockito.doNothing; import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn; import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn; +import static com.android.server.wm.StartingSurfaceController.DEBUG_ENABLE_SHELL_DRAWER; import static com.android.server.wm.WindowContainer.POSITION_BOTTOM; import static com.android.server.wm.WindowStateAnimator.HAS_DRAWN; @@ -75,6 +77,7 @@ import android.os.IBinder; import android.os.RemoteException; import android.os.UserHandle; import android.service.voice.IVoiceInteractionSession; +import android.util.SparseArray; import android.view.Display; import android.view.DisplayInfo; import android.view.IDisplayWindowInsetsController; @@ -101,6 +104,7 @@ import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; +import java.util.HashMap; /** Common base class for window manager unit test classes. */ class WindowTestsBase extends SystemServiceTestsBase { @@ -1124,6 +1128,88 @@ class WindowTestsBase extends SystemServiceTestsBase { } } + static class TestStartingWindowOrganizer extends ITaskOrganizer.Stub { + private final ActivityTaskManagerService mAtm; + private final WindowManagerService mWMService; + private final WindowState.PowerManagerWrapper mPowerManagerWrapper; + + private Runnable mRunnableWhenAddingSplashScreen; + private final SparseArray<IBinder> mTaskAppMap = new SparseArray<>(); + private final HashMap<IBinder, WindowState> mAppWindowMap = new HashMap<>(); + + TestStartingWindowOrganizer(ActivityTaskManagerService service, + WindowState.PowerManagerWrapper powerManagerWrapper) { + mAtm = service; + mWMService = mAtm.mWindowManager; + mPowerManagerWrapper = powerManagerWrapper; + if (DEBUG_ENABLE_SHELL_DRAWER) { + mAtm.mTaskOrganizerController.setDeferTaskOrgCallbacksConsumer(Runnable::run); + mAtm.mTaskOrganizerController.registerTaskOrganizer(this); + } + } + + void setRunnableWhenAddingSplashScreen(Runnable r) { + if (DEBUG_ENABLE_SHELL_DRAWER) { + mRunnableWhenAddingSplashScreen = r; + } else { + ((TestWindowManagerPolicy) mWMService.mPolicy).setRunnableWhenAddingSplashScreen(r); + } + } + + @Override + public void addStartingWindow(StartingWindowInfo info, IBinder appToken) { + synchronized (mWMService.mGlobalLock) { + final ActivityRecord activity = mWMService.mRoot.getActivityRecord( + appToken); + IWindow iWindow = mock(IWindow.class); + doReturn(mock(IBinder.class)).when(iWindow).asBinder(); + final WindowState window = WindowTestsBase.createWindow(null, + TYPE_APPLICATION_STARTING, activity, + "Starting window", 0 /* ownerId */, 0 /* userId*/, + false /* internalWindows */, mWMService, mock(Session.class), + iWindow, + mPowerManagerWrapper); + activity.mStartingWindow = window; + mAppWindowMap.put(appToken, window); + mTaskAppMap.put(info.taskInfo.taskId, appToken); + } + if (mRunnableWhenAddingSplashScreen != null) { + mRunnableWhenAddingSplashScreen.run(); + mRunnableWhenAddingSplashScreen = null; + } + } + @Override + public void removeStartingWindow(int taskId, SurfaceControl leash, Rect frame, + boolean playRevealAnimation) { + synchronized (mWMService.mGlobalLock) { + final IBinder appToken = mTaskAppMap.get(taskId); + if (appToken != null) { + mTaskAppMap.remove(taskId); + final ActivityRecord activity = mWMService.mRoot.getActivityRecord( + appToken); + WindowState win = mAppWindowMap.remove(appToken); + activity.removeChild(win); + activity.mStartingWindow = null; + } + } + } + @Override + public void copySplashScreenView(int taskId) { + } + @Override + public void onTaskAppeared(ActivityManager.RunningTaskInfo info, SurfaceControl leash) { + } + @Override + public void onTaskVanished(ActivityManager.RunningTaskInfo info) { + } + @Override + public void onTaskInfoChanged(ActivityManager.RunningTaskInfo info) { + } + @Override + public void onBackPressedOnTaskRoot(ActivityManager.RunningTaskInfo taskInfo) { + } + } + static class TestSplitOrganizer extends ITaskOrganizer.Stub { final ActivityTaskManagerService mService; Task mPrimary; |