Update activity visibility for all users

The visibility of the activities of a background user was not
updated because the #topRunningActivity only returns the top
activity that can be shown to the current user.

This issue should have existed since commit 232ec86.

Bug: 217271185
Test: Switch user while having activity embedded
Test: Start embedded activities and back
Test: atest ActivityRecordTests
Change-Id: Ia89e39a0ce7e569a820a2b5637a70597861e9666
This commit is contained in:
Louis Chang
2022-02-08 17:44:43 +08:00
parent 472bc8d932
commit 3f7b02d826
2 changed files with 26 additions and 1 deletions

View File

@@ -104,7 +104,8 @@ class EnsureActivitiesVisibleHelper {
for (int i = mTaskFragment.mChildren.size() - 1; i >= 0; --i) {
final WindowContainer child = mTaskFragment.mChildren.get(i);
final TaskFragment childTaskFragment = child.asTaskFragment();
if (childTaskFragment != null && childTaskFragment.topRunningActivity() != null) {
if (childTaskFragment != null
&& childTaskFragment.getTopNonFinishingActivity() != null) {
childTaskFragment.updateActivityVisibilities(starting, configChanges,
preserveWindows, notifyClients);
mBehindFullyOccludedContainer |=

View File

@@ -121,6 +121,7 @@ import android.content.res.Configuration;
import android.content.res.Resources;
import android.graphics.Point;
import android.graphics.Rect;
import android.os.Binder;
import android.os.Build;
import android.os.Bundle;
import android.os.PersistableBundle;
@@ -3358,6 +3359,29 @@ public class ActivityRecordTests extends WindowTestsBase {
noProcActivity.mInputDispatchingTimeoutMillis);
}
@Test
public void testEnsureActivitiesVisibleAnotherUserTasks() {
// Create an activity with hierarchy:
// RootTask
// - TaskFragment
// - Activity
DisplayContent display = createNewDisplay();
Task rootTask = createTask(display);
ActivityRecord activity = createActivityRecord(rootTask);
final TaskFragment taskFragment = new TaskFragment(mAtm, new Binder(),
true /* createdByOrganizer */, true /* isEmbedded */);
activity.getTask().addChild(taskFragment, POSITION_TOP);
activity.reparent(taskFragment, POSITION_TOP);
// Ensure the activity visibility is updated even it is not shown to current user.
activity.mVisibleRequested = true;
doReturn(false).when(activity).showToCurrentUser();
spyOn(taskFragment);
doReturn(false).when(taskFragment).shouldBeVisible(any());
display.ensureActivitiesVisible(null, 0, false, false);
assertFalse(activity.mVisibleRequested);
}
private ICompatCameraControlCallback getCompatCameraControlCallback() {
return new ICompatCameraControlCallback.Stub() {
@Override