Loading services/core/java/com/android/server/am/ActivityStack.java +3 −1 Original line number Diff line number Diff line Loading @@ -953,7 +953,9 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai if (DEBUG_TASKS) Slog.d(TAG_TASKS, "Skipping " + task + ": different user"); continue; } final ActivityRecord r = task.getTopActivity(); // Overlays should not be considered as the task's logical top activity. final ActivityRecord r = task.getTopActivity(false /* includeOverlays */); if (r == null || r.finishing || r.userId != userId || r.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE) { if (DEBUG_TASKS) Slog.d(TAG_TASKS, "Skipping " + task + ": mismatch root " + r); Loading services/core/java/com/android/server/am/TaskRecord.java +5 −1 Original line number Diff line number Diff line Loading @@ -1138,9 +1138,13 @@ final class TaskRecord extends ConfigurationContainer implements TaskWindowConta } ActivityRecord getTopActivity() { return getTopActivity(true /* includeOverlays */); } ActivityRecord getTopActivity(boolean includeOverlays) { for (int i = mActivities.size() - 1; i >= 0; --i) { final ActivityRecord r = mActivities.get(i); if (r.finishing) { if (r.finishing || (!includeOverlays && r.mTaskOverlay)) { continue; } return r; Loading services/tests/servicestests/src/com/android/server/am/ActivityStackTests.java +24 −0 Original line number Diff line number Diff line Loading @@ -24,6 +24,7 @@ import static org.junit.Assert.assertNull; import android.app.ActivityManager; import android.content.ComponentName; import android.content.pm.ActivityInfo; import android.os.UserHandle; import android.platform.test.annotations.Presubmit; import android.support.test.filters.SmallTest; import android.support.test.runner.AndroidJUnit4; Loading @@ -44,6 +45,8 @@ public class ActivityStackTests extends ActivityTestsBase { private static final int TEST_STACK_ID = 100; private static final ComponentName testActivityComponent = ComponentName.unflattenFromString("com.foo/.BarActivity"); private static final ComponentName testOverlayComponent = ComponentName.unflattenFromString("com.foo/.OverlayActivity"); @Test public void testEmptyTaskCleanupOnRemove() throws Exception { Loading Loading @@ -98,4 +101,25 @@ public class ActivityStackTests extends ActivityTestsBase { testStack.stopActivityLocked(activityRecord); } @Test public void testFindTaskWithOverlay() throws Exception { final ActivityManagerService service = createActivityManagerService(); final TaskRecord task = createTask(service, testActivityComponent, TEST_STACK_ID); final ActivityRecord activityRecord = createActivity(service, testActivityComponent, task, 0); // Overlay must be for a different user to prevent recognizing a matching top activity final ActivityRecord taskOverlay = createActivity(service, testOverlayComponent, task, UserHandle.PER_USER_RANGE * 2); taskOverlay.mTaskOverlay = true; final ActivityStack testStack = service.mStackSupervisor.getStack(TEST_STACK_ID); final ActivityStackSupervisor.FindTaskResult result = new ActivityStackSupervisor.FindTaskResult(); testStack.findTaskLocked(activityRecord, result); assertEquals(task.getTopActivity(false /* includeOverlays */), activityRecord); assertEquals(task.getTopActivity(true /* includeOverlays */), taskOverlay); assertNotNull(result.r); } } services/tests/servicestests/src/com/android/server/am/ActivityTestsBase.java +6 −0 Original line number Diff line number Diff line Loading @@ -87,11 +87,17 @@ public class ActivityTestsBase { protected static ActivityRecord createActivity(ActivityManagerService service, ComponentName component, TaskRecord task) { return createActivity(service, component, task, 0 /* userId */); } protected static ActivityRecord createActivity(ActivityManagerService service, ComponentName component, TaskRecord task, int uid) { Intent intent = new Intent(); intent.setComponent(component); final ActivityInfo aInfo = new ActivityInfo(); aInfo.applicationInfo = new ApplicationInfo(); aInfo.applicationInfo.packageName = component.getPackageName(); aInfo.applicationInfo.uid = uid; AttributeCache.init(service.mContext); final ActivityRecord activity = new ActivityRecord(service, null /* caller */, 0 /* launchedFromPid */, 0, null, intent, null, Loading Loading
services/core/java/com/android/server/am/ActivityStack.java +3 −1 Original line number Diff line number Diff line Loading @@ -953,7 +953,9 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai if (DEBUG_TASKS) Slog.d(TAG_TASKS, "Skipping " + task + ": different user"); continue; } final ActivityRecord r = task.getTopActivity(); // Overlays should not be considered as the task's logical top activity. final ActivityRecord r = task.getTopActivity(false /* includeOverlays */); if (r == null || r.finishing || r.userId != userId || r.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE) { if (DEBUG_TASKS) Slog.d(TAG_TASKS, "Skipping " + task + ": mismatch root " + r); Loading
services/core/java/com/android/server/am/TaskRecord.java +5 −1 Original line number Diff line number Diff line Loading @@ -1138,9 +1138,13 @@ final class TaskRecord extends ConfigurationContainer implements TaskWindowConta } ActivityRecord getTopActivity() { return getTopActivity(true /* includeOverlays */); } ActivityRecord getTopActivity(boolean includeOverlays) { for (int i = mActivities.size() - 1; i >= 0; --i) { final ActivityRecord r = mActivities.get(i); if (r.finishing) { if (r.finishing || (!includeOverlays && r.mTaskOverlay)) { continue; } return r; Loading
services/tests/servicestests/src/com/android/server/am/ActivityStackTests.java +24 −0 Original line number Diff line number Diff line Loading @@ -24,6 +24,7 @@ import static org.junit.Assert.assertNull; import android.app.ActivityManager; import android.content.ComponentName; import android.content.pm.ActivityInfo; import android.os.UserHandle; import android.platform.test.annotations.Presubmit; import android.support.test.filters.SmallTest; import android.support.test.runner.AndroidJUnit4; Loading @@ -44,6 +45,8 @@ public class ActivityStackTests extends ActivityTestsBase { private static final int TEST_STACK_ID = 100; private static final ComponentName testActivityComponent = ComponentName.unflattenFromString("com.foo/.BarActivity"); private static final ComponentName testOverlayComponent = ComponentName.unflattenFromString("com.foo/.OverlayActivity"); @Test public void testEmptyTaskCleanupOnRemove() throws Exception { Loading Loading @@ -98,4 +101,25 @@ public class ActivityStackTests extends ActivityTestsBase { testStack.stopActivityLocked(activityRecord); } @Test public void testFindTaskWithOverlay() throws Exception { final ActivityManagerService service = createActivityManagerService(); final TaskRecord task = createTask(service, testActivityComponent, TEST_STACK_ID); final ActivityRecord activityRecord = createActivity(service, testActivityComponent, task, 0); // Overlay must be for a different user to prevent recognizing a matching top activity final ActivityRecord taskOverlay = createActivity(service, testOverlayComponent, task, UserHandle.PER_USER_RANGE * 2); taskOverlay.mTaskOverlay = true; final ActivityStack testStack = service.mStackSupervisor.getStack(TEST_STACK_ID); final ActivityStackSupervisor.FindTaskResult result = new ActivityStackSupervisor.FindTaskResult(); testStack.findTaskLocked(activityRecord, result); assertEquals(task.getTopActivity(false /* includeOverlays */), activityRecord); assertEquals(task.getTopActivity(true /* includeOverlays */), taskOverlay); assertNotNull(result.r); } }
services/tests/servicestests/src/com/android/server/am/ActivityTestsBase.java +6 −0 Original line number Diff line number Diff line Loading @@ -87,11 +87,17 @@ public class ActivityTestsBase { protected static ActivityRecord createActivity(ActivityManagerService service, ComponentName component, TaskRecord task) { return createActivity(service, component, task, 0 /* userId */); } protected static ActivityRecord createActivity(ActivityManagerService service, ComponentName component, TaskRecord task, int uid) { Intent intent = new Intent(); intent.setComponent(component); final ActivityInfo aInfo = new ActivityInfo(); aInfo.applicationInfo = new ApplicationInfo(); aInfo.applicationInfo.packageName = component.getPackageName(); aInfo.applicationInfo.uid = uid; AttributeCache.init(service.mContext); final ActivityRecord activity = new ActivityRecord(service, null /* caller */, 0 /* launchedFromPid */, 0, null, intent, null, Loading