Merge "Inform receivers of restart attempt previous visibility" into rvc-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
756662fb2f
@@ -43,9 +43,10 @@ oneway interface ITaskStackListener {
|
||||
* @param homeVisible whether or not the home task is visible
|
||||
* @param clearedTask whether or not the launch activity also cleared the task as a part of
|
||||
* starting
|
||||
* @param wasVisible whether the activity was visible before the restart attempt
|
||||
*/
|
||||
void onActivityRestartAttempt(in ActivityManager.RunningTaskInfo task, boolean homeTaskVisible,
|
||||
boolean clearedTask);
|
||||
boolean clearedTask, boolean wasVisible);
|
||||
|
||||
/**
|
||||
* Called when we launched an activity that we forced to be resizable.
|
||||
|
||||
@@ -55,7 +55,7 @@ public abstract class TaskStackListener extends ITaskStackListener.Stub {
|
||||
@Override
|
||||
@UnsupportedAppUsage
|
||||
public void onActivityRestartAttempt(RunningTaskInfo task, boolean homeTaskVisible,
|
||||
boolean clearedTask) throws RemoteException {
|
||||
boolean clearedTask, boolean wasVisible) throws RemoteException {
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -38,7 +38,7 @@ public abstract class TaskStackChangeListener {
|
||||
public void onActivityPinned(String packageName, int userId, int taskId, int stackId) { }
|
||||
public void onActivityUnpinned() { }
|
||||
public void onActivityRestartAttempt(RunningTaskInfo task, boolean homeTaskVisible,
|
||||
boolean clearedTask) { }
|
||||
boolean clearedTask, boolean wasVisible) { }
|
||||
public void onActivityForcedResizable(String packageName, int taskId, int reason) { }
|
||||
public void onActivityDismissingDockedStack() { }
|
||||
public void onActivityLaunchOnSecondaryDisplayFailed() { }
|
||||
|
||||
@@ -122,11 +122,12 @@ public class TaskStackChangeListeners extends TaskStackListener {
|
||||
|
||||
@Override
|
||||
public void onActivityRestartAttempt(RunningTaskInfo task, boolean homeTaskVisible,
|
||||
boolean clearedTask) throws RemoteException {
|
||||
boolean clearedTask, boolean wasVisible) throws RemoteException {
|
||||
final SomeArgs args = SomeArgs.obtain();
|
||||
args.arg1 = task;
|
||||
args.argi1 = homeTaskVisible ? 1 : 0;
|
||||
args.argi2 = clearedTask ? 1 : 0;
|
||||
args.argi3 = wasVisible ? 1 : 0;
|
||||
mHandler.removeMessages(H.ON_ACTIVITY_RESTART_ATTEMPT);
|
||||
mHandler.obtainMessage(H.ON_ACTIVITY_RESTART_ATTEMPT, args).sendToTarget();
|
||||
}
|
||||
@@ -305,9 +306,10 @@ public class TaskStackChangeListeners extends TaskStackListener {
|
||||
final RunningTaskInfo task = (RunningTaskInfo) args.arg1;
|
||||
final boolean homeTaskVisible = args.argi1 != 0;
|
||||
final boolean clearedTask = args.argi2 != 0;
|
||||
final boolean wasVisible = args.argi3 != 0;
|
||||
for (int i = mTaskStackListeners.size() - 1; i >= 0; i--) {
|
||||
mTaskStackListeners.get(i).onActivityRestartAttempt(task,
|
||||
homeTaskVisible, clearedTask);
|
||||
homeTaskVisible, clearedTask, wasVisible);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -1236,7 +1236,7 @@ public class BubbleController implements ConfigurationController.ConfigurationLi
|
||||
|
||||
@Override
|
||||
public void onActivityRestartAttempt(RunningTaskInfo task, boolean homeTaskVisible,
|
||||
boolean clearedTask) {
|
||||
boolean clearedTask, boolean wasVisible) {
|
||||
for (Bubble b : mBubbleData.getBubbles()) {
|
||||
if (b.getDisplayId() == task.displayId) {
|
||||
expandStackAndSelectBubble(b.getKey());
|
||||
|
||||
@@ -135,8 +135,8 @@ public class PipManager implements BasePipManager, PipTaskOrganizer.PipTransitio
|
||||
|
||||
@Override
|
||||
public void onActivityRestartAttempt(ActivityManager.RunningTaskInfo task,
|
||||
boolean homeTaskVisible, boolean clearedTask) {
|
||||
if (task.configuration.windowConfiguration.getWindowingMode()
|
||||
boolean homeTaskVisible, boolean clearedTask, boolean wasVisible) {
|
||||
if (!wasVisible || task.configuration.windowConfiguration.getWindowingMode()
|
||||
!= WINDOWING_MODE_PINNED) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -715,8 +715,8 @@ public class PipManager implements BasePipManager, PipTaskOrganizer.PipTransitio
|
||||
|
||||
@Override
|
||||
public void onActivityRestartAttempt(RunningTaskInfo task, boolean homeTaskVisible,
|
||||
boolean clearedTask) {
|
||||
if (task.configuration.windowConfiguration.getWindowingMode()
|
||||
boolean clearedTask, boolean wasVisible) {
|
||||
if (!wasVisible || task.configuration.windowConfiguration.getWindowingMode()
|
||||
!= WINDOWING_MODE_PINNED) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -20,8 +20,6 @@ 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 com.android.systemui.shared.system.WindowManagerWrapper.WINDOWING_MODE_SPLIT_SCREEN_PRIMARY;
|
||||
|
||||
import android.annotation.Nullable;
|
||||
import android.app.ActivityManager;
|
||||
import android.app.trust.TrustManager;
|
||||
@@ -39,7 +37,6 @@ import com.android.systemui.Dependency;
|
||||
import com.android.systemui.R;
|
||||
import com.android.systemui.shared.recents.IOverviewProxy;
|
||||
import com.android.systemui.shared.system.ActivityManagerWrapper;
|
||||
import com.android.systemui.shared.system.TaskStackChangeListener;
|
||||
import com.android.systemui.stackdivider.Divider;
|
||||
import com.android.systemui.statusbar.phone.StatusBar;
|
||||
|
||||
@@ -66,22 +63,6 @@ public class OverviewProxyRecentsImpl implements RecentsImplementation {
|
||||
private TrustManager mTrustManager;
|
||||
private OverviewProxyService mOverviewProxyService;
|
||||
|
||||
private TaskStackChangeListener mListener = new TaskStackChangeListener() {
|
||||
@Override
|
||||
public void onActivityRestartAttempt(ActivityManager.RunningTaskInfo task,
|
||||
boolean homeTaskVisible, boolean clearedTask) {
|
||||
if (task.configuration.windowConfiguration.getWindowingMode()
|
||||
!= WINDOWING_MODE_SPLIT_SCREEN_PRIMARY || !mDividerOptional.isPresent()) {
|
||||
return;
|
||||
}
|
||||
|
||||
final Divider divider = mDividerOptional.get();
|
||||
if (divider.isMinimized()) {
|
||||
divider.onUndockingTask();
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
@SuppressWarnings("OptionalUsedAsFieldOrParameterType")
|
||||
@Inject
|
||||
public OverviewProxyRecentsImpl(Optional<Lazy<StatusBar>> statusBarLazy,
|
||||
@@ -96,7 +77,6 @@ public class OverviewProxyRecentsImpl implements RecentsImplementation {
|
||||
mHandler = new Handler();
|
||||
mTrustManager = (TrustManager) context.getSystemService(Context.TRUST_SERVICE);
|
||||
mOverviewProxyService = Dependency.get(OverviewProxyService.class);
|
||||
ActivityManagerWrapper.getInstance().registerTaskStackListener(mListener);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -21,23 +21,25 @@ import static android.content.res.Configuration.SCREEN_HEIGHT_DP_UNDEFINED;
|
||||
import static android.content.res.Configuration.SCREEN_WIDTH_DP_UNDEFINED;
|
||||
import static android.view.Display.DEFAULT_DISPLAY;
|
||||
|
||||
import static com.android.systemui.shared.system.WindowManagerWrapper.WINDOWING_MODE_SPLIT_SCREEN_PRIMARY;
|
||||
|
||||
import android.animation.Animator;
|
||||
import android.animation.AnimatorListenerAdapter;
|
||||
import android.animation.ValueAnimator;
|
||||
import android.app.ActivityManager;
|
||||
import android.app.ActivityTaskManager;
|
||||
import android.content.Context;
|
||||
import android.content.res.Configuration;
|
||||
import android.graphics.Rect;
|
||||
import android.os.Handler;
|
||||
import android.os.RemoteException;
|
||||
import android.provider.Settings;
|
||||
import android.util.Slog;
|
||||
import android.window.TaskOrganizer;
|
||||
import android.window.WindowContainerToken;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.SurfaceControl;
|
||||
import android.view.SurfaceSession;
|
||||
import android.view.View;
|
||||
import android.window.TaskOrganizer;
|
||||
import android.window.WindowContainerToken;
|
||||
import android.window.WindowContainerTransaction;
|
||||
import android.window.WindowOrganizer;
|
||||
|
||||
@@ -48,6 +50,8 @@ import com.android.systemui.R;
|
||||
import com.android.systemui.SystemUI;
|
||||
import com.android.systemui.TransactionPool;
|
||||
import com.android.systemui.recents.Recents;
|
||||
import com.android.systemui.shared.system.ActivityManagerWrapper;
|
||||
import com.android.systemui.shared.system.TaskStackChangeListener;
|
||||
import com.android.systemui.statusbar.policy.KeyguardStateController;
|
||||
import com.android.systemui.wm.DisplayChangeController;
|
||||
import com.android.systemui.wm.DisplayController;
|
||||
@@ -415,6 +419,21 @@ public class Divider extends SystemUI implements DividerView.DividerCallbacks,
|
||||
}
|
||||
private final DividerImeController mImePositionProcessor = new DividerImeController();
|
||||
|
||||
private TaskStackChangeListener mActivityRestartListener = new TaskStackChangeListener() {
|
||||
@Override
|
||||
public void onActivityRestartAttempt(ActivityManager.RunningTaskInfo task,
|
||||
boolean homeTaskVisible, boolean clearedTask, boolean wasVisible) {
|
||||
if (!wasVisible || task.configuration.windowConfiguration.getWindowingMode()
|
||||
!= WINDOWING_MODE_SPLIT_SCREEN_PRIMARY || !mSplits.isSplitScreenSupported()) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (isMinimized()) {
|
||||
onUndockingTask();
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
public Divider(Context context, Optional<Lazy<Recents>> recentsOptionalLazy,
|
||||
DisplayController displayController, SystemWindows systemWindows,
|
||||
DisplayImeController imeController, Handler handler,
|
||||
@@ -485,6 +504,7 @@ public class Divider extends SystemUI implements DividerView.DividerCallbacks,
|
||||
removeDivider();
|
||||
return;
|
||||
}
|
||||
ActivityManagerWrapper.getInstance().registerTaskStackListener(mActivityRestartListener);
|
||||
update(mDisplayController.getDisplayContext(displayId).getResources().getConfiguration());
|
||||
}
|
||||
|
||||
|
||||
@@ -1384,7 +1384,8 @@ class ActivityStarter {
|
||||
final ActivityStack homeStack = targetTask.getDisplayArea().getRootHomeTask();
|
||||
final boolean homeTaskVisible = homeStack != null && homeStack.shouldBeVisible(null);
|
||||
mService.getTaskChangeNotificationController().notifyActivityRestartAttempt(
|
||||
targetTask.getTaskInfo(), homeTaskVisible, clearedTask);
|
||||
targetTask.getTaskInfo(), homeTaskVisible, clearedTask,
|
||||
targetTask.getTopNonFinishingActivity().isVisible());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -123,7 +123,7 @@ class TaskChangeNotificationController {
|
||||
private final TaskStackConsumer mNotifyActivityRestartAttempt = (l, m) -> {
|
||||
SomeArgs args = (SomeArgs) m.obj;
|
||||
l.onActivityRestartAttempt((RunningTaskInfo) args.arg1, args.argi1 != 0,
|
||||
args.argi2 != 0);
|
||||
args.argi2 != 0, args.argi3 != 0);
|
||||
};
|
||||
|
||||
private final TaskStackConsumer mNotifyActivityForcedResizable = (l, m) -> {
|
||||
@@ -368,12 +368,13 @@ class TaskChangeNotificationController {
|
||||
* running, but the task is either brought to the front or a new Intent is delivered to it.
|
||||
*/
|
||||
void notifyActivityRestartAttempt(RunningTaskInfo task, boolean homeTaskVisible,
|
||||
boolean clearedTask) {
|
||||
boolean clearedTask, boolean wasVisible) {
|
||||
mHandler.removeMessages(NOTIFY_ACTIVITY_RESTART_ATTEMPT_LISTENERS_MSG);
|
||||
final SomeArgs args = SomeArgs.obtain();
|
||||
args.arg1 = task;
|
||||
args.argi1 = homeTaskVisible ? 1 : 0;
|
||||
args.argi2 = clearedTask ? 1 : 0;
|
||||
args.argi3 = wasVisible ? 1 : 0;
|
||||
final Message msg = mHandler.obtainMessage(NOTIFY_ACTIVITY_RESTART_ATTEMPT_LISTENERS_MSG,
|
||||
args);
|
||||
forAllLocalListeners(mNotifyActivityRestartAttempt, msg);
|
||||
|
||||
@@ -808,6 +808,41 @@ public class ActivityStarterTests extends ActivityTestsBase {
|
||||
verify(secondaryTaskContainer, times(2)).createStack(anyInt(), anyInt(), anyBoolean());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testWasVisibleInRestartAttempt() {
|
||||
final ActivityStarter starter = prepareStarter(
|
||||
FLAG_ACTIVITY_RESET_TASK_IF_NEEDED | FLAG_ACTIVITY_SINGLE_TOP, false);
|
||||
final ActivityRecord reusableActivity =
|
||||
new ActivityBuilder(mService).setCreateTask(true).build();
|
||||
final ActivityRecord topActivity =
|
||||
new ActivityBuilder(mService).setCreateTask(true).build();
|
||||
|
||||
// Make sure topActivity is on top
|
||||
topActivity.getRootTask().moveToFront("testWasVisibleInRestartAttempt");
|
||||
reusableActivity.setVisible(false);
|
||||
|
||||
final TaskChangeNotificationController taskChangeNotifier =
|
||||
mService.getTaskChangeNotificationController();
|
||||
spyOn(taskChangeNotifier);
|
||||
|
||||
Task task = topActivity.getTask();
|
||||
starter.postStartActivityProcessing(
|
||||
task.getTopNonFinishingActivity(), START_DELIVERED_TO_TOP, task.getStack());
|
||||
|
||||
verify(taskChangeNotifier).notifyActivityRestartAttempt(
|
||||
any(), anyBoolean(), anyBoolean(), anyBoolean());
|
||||
verify(taskChangeNotifier).notifyActivityRestartAttempt(
|
||||
any(), anyBoolean(), anyBoolean(), eq(true));
|
||||
|
||||
Task task2 = reusableActivity.getTask();
|
||||
starter.postStartActivityProcessing(
|
||||
task2.getTopNonFinishingActivity(), START_TASK_TO_FRONT, task.getStack());
|
||||
verify(taskChangeNotifier, times(2)).notifyActivityRestartAttempt(
|
||||
any(), anyBoolean(), anyBoolean(), anyBoolean());
|
||||
verify(taskChangeNotifier).notifyActivityRestartAttempt(
|
||||
any(), anyBoolean(), anyBoolean(), eq(false));
|
||||
}
|
||||
|
||||
private ActivityRecord createSingleTaskActivityOn(ActivityStack stack) {
|
||||
final ComponentName componentName = ComponentName.createRelative(
|
||||
DEFAULT_COMPONENT_PACKAGE_NAME,
|
||||
|
||||
Reference in New Issue
Block a user