Merge "Not resume TaskFragment behind translucent others" into sc-v2-dev
This commit is contained in:
@@ -5041,8 +5041,7 @@ class Task extends TaskFragment {
|
|||||||
if (topFragment == f) {
|
if (topFragment == f) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (!f.isFocusableAndVisible()) {
|
if (!f.canBeResumed(null /* starting */)) {
|
||||||
// No need to resume activity in TaskFragment that is not visible.
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
resumed[0] |= f.resumeTopActivity(prev, options, deferPause);
|
resumed[0] |= f.resumeTopActivity(prev, options, deferPause);
|
||||||
|
|||||||
@@ -38,7 +38,6 @@ import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_ORIENTATION;
|
|||||||
import static com.android.server.wm.ActivityRecord.State.RESUMED;
|
import static com.android.server.wm.ActivityRecord.State.RESUMED;
|
||||||
import static com.android.server.wm.ActivityTaskManagerService.TAG_ROOT_TASK;
|
import static com.android.server.wm.ActivityTaskManagerService.TAG_ROOT_TASK;
|
||||||
import static com.android.server.wm.DisplayContent.alwaysCreateRootTask;
|
import static com.android.server.wm.DisplayContent.alwaysCreateRootTask;
|
||||||
import static com.android.server.wm.TaskFragment.TASK_FRAGMENT_VISIBILITY_VISIBLE;
|
|
||||||
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_ROOT_TASK;
|
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_ROOT_TASK;
|
||||||
import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;
|
import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;
|
||||||
|
|
||||||
@@ -1475,9 +1474,7 @@ final class TaskDisplayArea extends DisplayArea<WindowContainer> {
|
|||||||
|
|
||||||
leafTask.forAllLeafTaskFragments((taskFrag) -> {
|
leafTask.forAllLeafTaskFragments((taskFrag) -> {
|
||||||
final ActivityRecord resumedActivity = taskFrag.getResumedActivity();
|
final ActivityRecord resumedActivity = taskFrag.getResumedActivity();
|
||||||
if (resumedActivity != null
|
if (resumedActivity != null && !taskFrag.canBeResumed(resuming)) {
|
||||||
&& (taskFrag.getVisibility(resuming) != TASK_FRAGMENT_VISIBILITY_VISIBLE
|
|
||||||
|| !taskFrag.isTopActivityFocusable())) {
|
|
||||||
if (taskFrag.startPausing(false /* uiSleeping*/, resuming, "pauseBackTasks")) {
|
if (taskFrag.startPausing(false /* uiSleeping*/, resuming, "pauseBackTasks")) {
|
||||||
someActivityPaused[0]++;
|
someActivityPaused[0]++;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1359,6 +1359,17 @@ class TaskFragment extends WindowContainer<WindowContainer> {
|
|||||||
return getVisibility(starting) != TASK_FRAGMENT_VISIBILITY_INVISIBLE;
|
return getVisibility(starting) != TASK_FRAGMENT_VISIBILITY_INVISIBLE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns {@code true} is the activity in this TaskFragment can be resumed.
|
||||||
|
*
|
||||||
|
* @param starting The currently starting activity or {@code null} if there is none.
|
||||||
|
*/
|
||||||
|
boolean canBeResumed(@Nullable ActivityRecord starting) {
|
||||||
|
// No need to resume activity in TaskFragment that is not visible.
|
||||||
|
return isTopActivityFocusable()
|
||||||
|
&& getVisibility(starting) == TASK_FRAGMENT_VISIBILITY_VISIBLE;
|
||||||
|
}
|
||||||
|
|
||||||
boolean isFocusableAndVisible() {
|
boolean isFocusableAndVisible() {
|
||||||
return isTopActivityFocusable() && shouldBeVisible(null /* starting */);
|
return isTopActivityFocusable() && shouldBeVisible(null /* starting */);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -44,6 +44,7 @@ import static com.android.dx.mockito.inline.extended.ExtendedMockito.times;
|
|||||||
import static com.android.dx.mockito.inline.extended.ExtendedMockito.verify;
|
import static com.android.dx.mockito.inline.extended.ExtendedMockito.verify;
|
||||||
import static com.android.server.policy.WindowManagerPolicy.USER_ROTATION_FREE;
|
import static com.android.server.policy.WindowManagerPolicy.USER_ROTATION_FREE;
|
||||||
import static com.android.server.wm.Task.FLAG_FORCE_HIDDEN_FOR_TASK_ORG;
|
import static com.android.server.wm.Task.FLAG_FORCE_HIDDEN_FOR_TASK_ORG;
|
||||||
|
import static com.android.server.wm.TaskFragment.TASK_FRAGMENT_VISIBILITY_VISIBLE_BEHIND_TRANSLUCENT;
|
||||||
|
|
||||||
import static com.google.common.truth.Truth.assertThat;
|
import static com.google.common.truth.Truth.assertThat;
|
||||||
|
|
||||||
@@ -66,6 +67,7 @@ import static org.mockito.Mockito.clearInvocations;
|
|||||||
import static org.mockito.Mockito.never;
|
import static org.mockito.Mockito.never;
|
||||||
|
|
||||||
import android.app.ActivityManager;
|
import android.app.ActivityManager;
|
||||||
|
import android.app.ActivityOptions;
|
||||||
import android.app.TaskInfo;
|
import android.app.TaskInfo;
|
||||||
import android.app.WindowConfiguration;
|
import android.app.WindowConfiguration;
|
||||||
import android.content.ComponentName;
|
import android.content.ComponentName;
|
||||||
@@ -1424,6 +1426,29 @@ public class TaskTests extends WindowTestsBase {
|
|||||||
verify(task2).moveToFrontInner(anyString(), isNull());
|
verify(task2).moveToFrontInner(anyString(), isNull());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testResumeTask_doNotResumeTaskFragmentBehindTranslucent() {
|
||||||
|
final Task task = createTask(mDisplayContent);
|
||||||
|
final TaskFragment tfBehind = createTaskFragmentWithParentTask(
|
||||||
|
task, false /* createEmbeddedTask */);
|
||||||
|
final TaskFragment tfFront = createTaskFragmentWithParentTask(
|
||||||
|
task, false /* createEmbeddedTask */);
|
||||||
|
spyOn(tfFront);
|
||||||
|
doReturn(true).when(tfFront).isTranslucent(any());
|
||||||
|
|
||||||
|
// TaskFragment behind another translucent TaskFragment should not be resumed.
|
||||||
|
assertEquals(TASK_FRAGMENT_VISIBILITY_VISIBLE_BEHIND_TRANSLUCENT,
|
||||||
|
tfBehind.getVisibility(null /* starting */));
|
||||||
|
assertTrue(tfBehind.isFocusable());
|
||||||
|
assertFalse(tfBehind.canBeResumed(null /* starting */));
|
||||||
|
|
||||||
|
spyOn(tfBehind);
|
||||||
|
task.resumeTopActivityUncheckedLocked(null /* prev */, ActivityOptions.makeBasic(),
|
||||||
|
false /* deferPause */);
|
||||||
|
|
||||||
|
verify(tfBehind, never()).resumeTopActivity(any(), any(), anyBoolean());
|
||||||
|
}
|
||||||
|
|
||||||
private Task getTestTask() {
|
private Task getTestTask() {
|
||||||
final Task task = new TaskBuilder(mSupervisor).setCreateActivity(true).build();
|
final Task task = new TaskBuilder(mSupervisor).setCreateActivity(true).build();
|
||||||
return task.getBottomMostTask();
|
return task.getBottomMostTask();
|
||||||
|
|||||||
Reference in New Issue
Block a user