Merge "Do not consider overlays when finding task to reuse." into oc-mr1-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
32b477db15
@@ -953,7 +953,9 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai
|
|||||||
if (DEBUG_TASKS) Slog.d(TAG_TASKS, "Skipping " + task + ": different user");
|
if (DEBUG_TASKS) Slog.d(TAG_TASKS, "Skipping " + task + ": different user");
|
||||||
continue;
|
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 ||
|
if (r == null || r.finishing || r.userId != userId ||
|
||||||
r.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE) {
|
r.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE) {
|
||||||
if (DEBUG_TASKS) Slog.d(TAG_TASKS, "Skipping " + task + ": mismatch root " + r);
|
if (DEBUG_TASKS) Slog.d(TAG_TASKS, "Skipping " + task + ": mismatch root " + r);
|
||||||
|
|||||||
@@ -1138,9 +1138,13 @@ final class TaskRecord extends ConfigurationContainer implements TaskWindowConta
|
|||||||
}
|
}
|
||||||
|
|
||||||
ActivityRecord getTopActivity() {
|
ActivityRecord getTopActivity() {
|
||||||
|
return getTopActivity(true /* includeOverlays */);
|
||||||
|
}
|
||||||
|
|
||||||
|
ActivityRecord getTopActivity(boolean includeOverlays) {
|
||||||
for (int i = mActivities.size() - 1; i >= 0; --i) {
|
for (int i = mActivities.size() - 1; i >= 0; --i) {
|
||||||
final ActivityRecord r = mActivities.get(i);
|
final ActivityRecord r = mActivities.get(i);
|
||||||
if (r.finishing) {
|
if (r.finishing || (!includeOverlays && r.mTaskOverlay)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
return r;
|
return r;
|
||||||
|
|||||||
@@ -24,6 +24,7 @@ import static org.junit.Assert.assertNull;
|
|||||||
import android.app.ActivityManager;
|
import android.app.ActivityManager;
|
||||||
import android.content.ComponentName;
|
import android.content.ComponentName;
|
||||||
import android.content.pm.ActivityInfo;
|
import android.content.pm.ActivityInfo;
|
||||||
|
import android.os.UserHandle;
|
||||||
import android.platform.test.annotations.Presubmit;
|
import android.platform.test.annotations.Presubmit;
|
||||||
import android.support.test.filters.SmallTest;
|
import android.support.test.filters.SmallTest;
|
||||||
import android.support.test.runner.AndroidJUnit4;
|
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 int TEST_STACK_ID = 100;
|
||||||
private static final ComponentName testActivityComponent =
|
private static final ComponentName testActivityComponent =
|
||||||
ComponentName.unflattenFromString("com.foo/.BarActivity");
|
ComponentName.unflattenFromString("com.foo/.BarActivity");
|
||||||
|
private static final ComponentName testOverlayComponent =
|
||||||
|
ComponentName.unflattenFromString("com.foo/.OverlayActivity");
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testEmptyTaskCleanupOnRemove() throws Exception {
|
public void testEmptyTaskCleanupOnRemove() throws Exception {
|
||||||
@@ -98,4 +101,25 @@ public class ActivityStackTests extends ActivityTestsBase {
|
|||||||
|
|
||||||
testStack.stopActivityLocked(activityRecord);
|
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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -87,11 +87,17 @@ public class ActivityTestsBase {
|
|||||||
|
|
||||||
protected static ActivityRecord createActivity(ActivityManagerService service,
|
protected static ActivityRecord createActivity(ActivityManagerService service,
|
||||||
ComponentName component, TaskRecord task) {
|
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 intent = new Intent();
|
||||||
intent.setComponent(component);
|
intent.setComponent(component);
|
||||||
final ActivityInfo aInfo = new ActivityInfo();
|
final ActivityInfo aInfo = new ActivityInfo();
|
||||||
aInfo.applicationInfo = new ApplicationInfo();
|
aInfo.applicationInfo = new ApplicationInfo();
|
||||||
aInfo.applicationInfo.packageName = component.getPackageName();
|
aInfo.applicationInfo.packageName = component.getPackageName();
|
||||||
|
aInfo.applicationInfo.uid = uid;
|
||||||
AttributeCache.init(service.mContext);
|
AttributeCache.init(service.mContext);
|
||||||
final ActivityRecord activity = new ActivityRecord(service, null /* caller */,
|
final ActivityRecord activity = new ActivityRecord(service, null /* caller */,
|
||||||
0 /* launchedFromPid */, 0, null, intent, null,
|
0 /* launchedFromPid */, 0, null, intent, null,
|
||||||
|
|||||||
Reference in New Issue
Block a user