Merge "Do not consider overlays when finding task to reuse." into oc-mr1-dev

am: 32b477db15

Change-Id: I615181873ab71e8526556967ae62730633c9f003
This commit is contained in:
Bryce Lee
2017-09-05 17:17:20 +00:00
committed by android-build-merger
4 changed files with 38 additions and 2 deletions

View File

@@ -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);

View File

@@ -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;

View File

@@ -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;
@@ -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 {
@@ -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);
}
}

View File

@@ -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,