summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author wilsonshih <wilsonshih@google.com> 2021-02-03 22:51:15 +0800
committer Wei Sheng Shih <wilsonshih@google.com> 2021-03-12 04:08:56 +0000
commit11af33eeaf59b8cc5e1524b0fe2efdfef27eb803 (patch)
treec0ce25aa5fdcaebfb7009a8acabd1fa956db0cf1
parentd52e491d2f13acae00a8397ccebf156634da4466 (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
-rw-r--r--core/java/android/window/StartingWindowInfo.java8
-rw-r--r--libs/WindowManager/Shell/AndroidManifest.xml1
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/StartingSurfaceDrawer.java8
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/StartingWindowController.java3
-rw-r--r--libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/startingsurface/StartingSurfaceDrawerTests.java3
-rw-r--r--libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/startingsurface/TaskSnapshotWindowTest.java3
-rw-r--r--services/core/java/com/android/server/wm/ActivityRecord.java3
-rw-r--r--services/core/java/com/android/server/wm/StartingSurfaceController.java1
-rw-r--r--services/core/java/com/android/server/wm/Task.java2
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java15
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java86
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;