Merge "Fix issue with recent task being replaced by task with another windowing mode" into pi-dev

am: d4d44c7204

Change-Id: Ie4a37fb7fe7ac2be3f4e62f9a5d5d8478189dc66
This commit is contained in:
Winson Chung
2018-04-26 14:13:58 -07:00
committed by android-build-merger
2 changed files with 91 additions and 1 deletions

View File

@@ -22,8 +22,10 @@ import static android.app.ActivityManager.RECENT_WITH_EXCLUDED;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_ASSISTANT;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_HOME;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_RECENTS;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_UNDEFINED;
import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED;
import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_PRIMARY;
import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED;
import static android.content.Intent.FLAG_ACTIVITY_MULTIPLE_TASK;
import static android.content.Intent.FLAG_ACTIVITY_NEW_DOCUMENT;
import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK;
@@ -1255,7 +1257,8 @@ class RecentTasks {
for (int i = 0; i < recentsCount; i++) {
final TaskRecord tr = mTasks.get(i);
if (task != tr) {
if (!task.hasCompatibleActivityType(tr) || task.userId != tr.userId) {
if (!hasCompatibleActivityTypeAndWindowingMode(task, tr)
|| task.userId != tr.userId) {
continue;
}
final Intent trIntent = tr.intent;
@@ -1547,4 +1550,29 @@ class RecentTasks {
return rti;
}
/**
* @return Whether the activity types and windowing modes of the two tasks are considered
* compatible. This is necessary because we currently don't persist the activity type
* or the windowing mode with the task, so they can be undefined when restored.
*/
private boolean hasCompatibleActivityTypeAndWindowingMode(TaskRecord t1, TaskRecord t2) {
final int activityType = t1.getActivityType();
final int windowingMode = t1.getWindowingMode();
final boolean isUndefinedType = activityType == ACTIVITY_TYPE_UNDEFINED;
final boolean isUndefinedMode = windowingMode == WINDOWING_MODE_UNDEFINED;
final int otherActivityType = t2.getActivityType();
final int otherWindowingMode = t2.getWindowingMode();
final boolean isOtherUndefinedType = otherActivityType == ACTIVITY_TYPE_UNDEFINED;
final boolean isOtherUndefinedMode = otherWindowingMode == WINDOWING_MODE_UNDEFINED;
// An activity type and windowing mode is compatible if they are the exact same type/mode,
// or if one of the type/modes is undefined
final boolean isCompatibleType = activityType == otherActivityType
|| isUndefinedType || isOtherUndefinedType;
final boolean isCompatibleMode = windowingMode == otherWindowingMode
|| isUndefinedMode || isOtherUndefinedMode;
return isCompatibleType && isCompatibleMode;
}
}

View File

@@ -21,6 +21,7 @@ import static android.app.WindowConfiguration.ACTIVITY_TYPE_HOME;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_UNDEFINED;
import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED;
import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED;
import static android.content.Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS;
import static android.content.Intent.FLAG_ACTIVITY_MULTIPLE_TASK;
@@ -303,6 +304,8 @@ public class RecentTasksTest extends ActivityTestsBase {
@Test
public void testAddTaskCompatibleActivityType_expectRemove() throws Exception {
// Test with undefined activity type since the type is not persisted by the task persister
// and we want to ensure that a new task will match a restored task
Configuration config1 = new Configuration();
config1.windowConfiguration.setActivityType(ACTIVITY_TYPE_UNDEFINED);
TaskRecord task1 = createTaskBuilder(".Task1")
@@ -354,6 +357,65 @@ public class RecentTasksTest extends ActivityTestsBase {
assertTrue(mCallbacksRecorder.removed.isEmpty());
}
@Test
public void testAddTaskCompatibleWindowingMode_expectRemove() throws Exception {
Configuration config1 = new Configuration();
config1.windowConfiguration.setWindowingMode(WINDOWING_MODE_UNDEFINED);
TaskRecord task1 = createTaskBuilder(".Task1")
.setFlags(FLAG_ACTIVITY_NEW_TASK)
.setStack(mStack)
.build();
task1.onConfigurationChanged(config1);
assertTrue(task1.getWindowingMode() == WINDOWING_MODE_UNDEFINED);
mRecentTasks.add(task1);
mCallbacksRecorder.clear();
Configuration config2 = new Configuration();
config2.windowConfiguration.setWindowingMode(WINDOWING_MODE_FULLSCREEN);
TaskRecord task2 = createTaskBuilder(".Task1")
.setFlags(FLAG_ACTIVITY_NEW_TASK)
.setStack(mStack)
.build();
task2.onConfigurationChanged(config2);
assertTrue(task2.getWindowingMode() == WINDOWING_MODE_FULLSCREEN);
mRecentTasks.add(task2);
assertTrue(mCallbacksRecorder.added.size() == 1);
assertTrue(mCallbacksRecorder.added.contains(task2));
assertTrue(mCallbacksRecorder.trimmed.isEmpty());
assertTrue(mCallbacksRecorder.removed.size() == 1);
assertTrue(mCallbacksRecorder.removed.contains(task1));
}
@Test
public void testAddTaskIncompatibleWindowingMode_expectNoRemove() throws Exception {
Configuration config1 = new Configuration();
config1.windowConfiguration.setWindowingMode(WINDOWING_MODE_FULLSCREEN);
TaskRecord task1 = createTaskBuilder(".Task1")
.setFlags(FLAG_ACTIVITY_NEW_TASK)
.setStack(mStack)
.build();
task1.onConfigurationChanged(config1);
assertTrue(task1.getWindowingMode() == WINDOWING_MODE_FULLSCREEN);
mRecentTasks.add(task1);
Configuration config2 = new Configuration();
config2.windowConfiguration.setWindowingMode(WINDOWING_MODE_PINNED);
TaskRecord task2 = createTaskBuilder(".Task1")
.setFlags(FLAG_ACTIVITY_NEW_TASK)
.setStack(mStack)
.build();
task2.onConfigurationChanged(config2);
assertTrue(task2.getWindowingMode() == WINDOWING_MODE_PINNED);
mRecentTasks.add(task2);
assertTrue(mCallbacksRecorder.added.size() == 2);
assertTrue(mCallbacksRecorder.added.contains(task1));
assertTrue(mCallbacksRecorder.added.contains(task2));
assertTrue(mCallbacksRecorder.trimmed.isEmpty());
assertTrue(mCallbacksRecorder.removed.isEmpty());
}
@Test
public void testUsersTasks() throws Exception {
mRecentTasks.setOnlyTestVisibleRange();