Merge "Verify that TaskOrganizer gets transferred launch cookie" into sc-dev

This commit is contained in:
Riddle Hsu
2021-04-21 04:04:17 +00:00
committed by Android (Google) Code Review
4 changed files with 113 additions and 107 deletions

View File

@@ -66,6 +66,18 @@
<activity android:name="com.android.server.wm.TaskStackChangedListenerTest$ResumeWhilePausingActivity"
android:resumeWhilePausing="true"/>
<activity android:name="com.android.server.wm.ActivityLeakTests$DetectLeakActivity" />
<!--
Simulate the common trampoline task that uses floating/translucent theme to avoid double
starting windows and animations of task open.
-->
<activity android:name="com.android.server.wm.ActivityOptionsTest$TrampolineActivity"
android:taskAffinity="com.android.frameworks.wmtests.trampoline"
android:theme="@android:style/Theme.Translucent.NoTitleBar"
android:turnScreenOn="true"
android:showWhenLocked="true" />
<activity android:name="com.android.server.wm.ActivityOptionsTest$MainActivity"
android:turnScreenOn="true"
android:showWhenLocked="true" />
</application>
<instrumentation

View File

@@ -20,17 +20,36 @@ import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD;
import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
import static android.view.WindowManager.LayoutParams.ROTATION_ANIMATION_ROTATE;
import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import android.app.Activity;
import android.app.ActivityManager.RunningTaskInfo;
import android.app.ActivityOptions;
import android.app.Instrumentation;
import android.app.Instrumentation.ActivityMonitor;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.os.Binder;
import android.os.Bundle;
import android.os.IBinder;
import android.platform.test.annotations.Presubmit;
import android.view.SurfaceControl;
import android.window.TaskOrganizer;
import androidx.test.filters.MediumTest;
import org.junit.Test;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
/**
* Build/Install/Run:
* atest WmTests:ActivityOptionsTest
@@ -70,4 +89,78 @@ public class ActivityOptionsTest {
assertTrue(restoredOpts.getTaskOverlay());
assertTrue(restoredOpts.canTaskOverlayResume());
}
@Test
public void testTransferLaunchCookie() {
final Binder cookie = new Binder();
final ActivityOptions options = ActivityOptions.makeBasic();
options.setLaunchCookie(cookie);
final Instrumentation instrumentation = getInstrumentation();
final Context context = instrumentation.getContext();
final ComponentName trampoline = new ComponentName(context, TrampolineActivity.class);
final ComponentName main = new ComponentName(context, MainActivity.class);
final Intent intent = new Intent().setComponent(trampoline)
.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
final ActivityMonitor monitor = new ActivityMonitor(main.getClassName(),
null /* result */, false /* block */);
instrumentation.addMonitor(monitor);
final CountDownLatch mainLatch = new CountDownLatch(1);
final IBinder[] appearedCookies = new IBinder[2];
final TaskOrganizer organizer = new TaskOrganizer() {
@Override
public void onTaskAppeared(RunningTaskInfo taskInfo, SurfaceControl leash) {
try (SurfaceControl.Transaction t = new SurfaceControl.Transaction()) {
t.setVisibility(leash, true /* visible */).apply();
}
int cookieIndex = -1;
if (trampoline.equals(taskInfo.baseActivity)) {
cookieIndex = 0;
} else if (main.equals(taskInfo.baseActivity)) {
cookieIndex = 1;
mainLatch.countDown();
}
if (cookieIndex >= 0) {
appearedCookies[cookieIndex] = taskInfo.launchCookies.isEmpty()
? null : taskInfo.launchCookies.get(0);
}
}
};
Activity mainActivity = null;
try {
organizer.registerOrganizer();
context.startActivity(intent, options.toBundle());
try {
mainLatch.await(10, TimeUnit.SECONDS);
} catch (InterruptedException ignored) {
}
mainActivity = monitor.getLastActivity();
assertNotNull(mainActivity);
assertNotEquals(TrampolineActivity.sTaskId, mainActivity.getTaskId());
assertNull("Trampoline task must not have cookie", appearedCookies[0]);
assertEquals("Main task must get the same cookie", cookie, appearedCookies[1]);
} finally {
organizer.unregisterOrganizer();
instrumentation.removeMonitor(monitor);
if (mainActivity != null) {
mainActivity.finish();
}
}
}
public static class TrampolineActivity extends Activity {
static int sTaskId;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
sTaskId = getTaskId();
startActivity(new Intent(this, MainActivity.class)
.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK));
finish();
}
}
public static class MainActivity extends Activity {
}
}

View File

@@ -543,33 +543,7 @@ public class WindowOrganizerTests extends WindowTestsBase {
@Test
public void testTileAddRemoveChild() {
ITaskOrganizer listener = new ITaskOrganizer.Stub() {
@Override
public void addStartingWindow(StartingWindowInfo info, IBinder appToken) {
}
@Override
public void removeStartingWindow(int taskId, SurfaceControl leash, Rect frame,
boolean playRevealAnimation) { }
@Override
public void copySplashScreenView(int taskId) { }
@Override
public void onTaskAppeared(RunningTaskInfo taskInfo, SurfaceControl leash) { }
@Override
public void onTaskVanished(RunningTaskInfo container) { }
@Override
public void onTaskInfoChanged(RunningTaskInfo info) throws RemoteException {
}
@Override
public void onBackPressedOnTaskRoot(RunningTaskInfo taskInfo) {
}
};
final StubOrganizer listener = new StubOrganizer();
mWm.mAtmService.mTaskOrganizerController.registerTaskOrganizer(listener);
Task task = mWm.mAtmService.mTaskOrganizerController.createRootTask(
mDisplayContent, WINDOWING_MODE_SPLIT_SCREEN_SECONDARY, null);
@@ -612,31 +586,12 @@ public class WindowOrganizerTests extends WindowTestsBase {
public void testTaskInfoCallback() {
final ArrayList<RunningTaskInfo> lastReportedTiles = new ArrayList<>();
final boolean[] called = {false};
ITaskOrganizer listener = new ITaskOrganizer.Stub() {
final StubOrganizer listener = new StubOrganizer() {
@Override
public void addStartingWindow(StartingWindowInfo info, IBinder appToken) {
}
@Override
public void removeStartingWindow(int taskId, SurfaceControl leash, Rect frame,
boolean playRevealAnimation) { }
@Override
public void copySplashScreenView(int taskId) { }
@Override
public void onTaskAppeared(RunningTaskInfo taskInfo, SurfaceControl leash) { }
@Override
public void onTaskVanished(RunningTaskInfo container) { }
@Override
public void onTaskInfoChanged(RunningTaskInfo info) throws RemoteException {
public void onTaskInfoChanged(RunningTaskInfo info) {
lastReportedTiles.add(info);
called[0] = true;
}
@Override
public void onBackPressedOnTaskRoot(RunningTaskInfo taskInfo) {
}
};
mWm.mAtmService.mTaskOrganizerController.registerTaskOrganizer(listener);
Task task = mWm.mAtmService.mTaskOrganizerController.createRootTask(
@@ -689,31 +644,11 @@ public class WindowOrganizerTests extends WindowTestsBase {
@Test
public void testHierarchyTransaction() {
final ArrayMap<IBinder, RunningTaskInfo> lastReportedTiles = new ArrayMap<>();
ITaskOrganizer listener = new ITaskOrganizer.Stub() {
@Override
public void addStartingWindow(StartingWindowInfo info, IBinder appToken) {
}
@Override
public void removeStartingWindow(int taskId, SurfaceControl leash, Rect frame,
boolean playRevealAnimation) { }
@Override
public void copySplashScreenView(int taskId) { }
@Override
public void onTaskAppeared(RunningTaskInfo taskInfo, SurfaceControl leash) { }
@Override
public void onTaskVanished(RunningTaskInfo container) { }
final StubOrganizer listener = new StubOrganizer() {
@Override
public void onTaskInfoChanged(RunningTaskInfo info) {
lastReportedTiles.put(info.token.asBinder(), info);
}
@Override
public void onBackPressedOnTaskRoot(RunningTaskInfo taskInfo) {
}
};
mWm.mAtmService.mTaskOrganizerController.registerTaskOrganizer(listener);
@@ -838,7 +773,7 @@ public class WindowOrganizerTests extends WindowTestsBase {
verify(transactionListener).onTransactionReady(anyInt(), any());
}
class StubOrganizer extends ITaskOrganizer.Stub {
static class StubOrganizer extends ITaskOrganizer.Stub {
RunningTaskInfo mInfo;
@Override

View File

@@ -92,7 +92,6 @@ import android.view.SurfaceControl.Transaction;
import android.view.View;
import android.view.WindowManager;
import android.view.WindowManager.DisplayImePolicy;
import android.window.ITaskOrganizer;
import android.window.ITransitionPlayer;
import android.window.StartingWindowInfo;
import android.window.TransitionInfo;
@@ -1216,7 +1215,7 @@ class WindowTestsBase extends SystemServiceTestsBase {
}
}
static class TestStartingWindowOrganizer extends ITaskOrganizer.Stub {
static class TestStartingWindowOrganizer extends WindowOrganizerTests.StubOrganizer {
private final ActivityTaskManagerService mAtm;
private final WindowManagerService mWMService;
private final WindowState.PowerManagerWrapper mPowerManagerWrapper;
@@ -1281,24 +1280,9 @@ class WindowTestsBase extends SystemServiceTestsBase {
}
}
}
@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 {
static class TestSplitOrganizer extends WindowOrganizerTests.StubOrganizer {
final ActivityTaskManagerService mService;
Task mPrimary;
Task mSecondary;
@@ -1332,22 +1316,7 @@ class WindowTestsBase extends SystemServiceTestsBase {
public void setMoveToSecondaryOnEnter(boolean move) {
mMoveToSecondaryOnEnter = move;
}
@Override
public void addStartingWindow(StartingWindowInfo info, IBinder appToken) {
}
@Override
public void removeStartingWindow(int taskId, SurfaceControl leash, Rect frame,
boolean playRevealAnimation) {
}
@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) {
if (mInSplit) {
@@ -1374,9 +1343,6 @@ class WindowTestsBase extends SystemServiceTestsBase {
}
});
}
@Override
public void onBackPressedOnTaskRoot(ActivityManager.RunningTaskInfo taskInfo) {
}
}
static TestWindowToken createTestWindowToken(int type, DisplayContent dc) {