Let the framework position a window when switching to freeform

When "freeform" button is tapped, the current Recents implementation
puts the window into the left top corner, and sets window size
to the size of the window snapshot as it is displayed in Recents. This
is confusing.

This patch lets the ActivityManager decide on the window bounds.
The first "freeformed" window is put at the center, and subsequent
windows are nicely cascaded.

Bug: 28316396
Bug: 28312983
Change-Id: I3e305df3ab1e1f715e1f4f94e0ed2a8a1bbd2f22
This commit is contained in:
Vladislav Kaznacheev
2016-05-04 17:18:56 -07:00
parent 946d86558e
commit 1f6b709ca6
6 changed files with 27 additions and 15 deletions

View File

@@ -17,6 +17,7 @@
package com.android.systemui.recents;
import static android.app.ActivityManager.StackId.FREEFORM_WORKSPACE_STACK_ID;
import static android.app.ActivityManager.StackId.INVALID_STACK_ID;
import static android.view.View.MeasureSpec;
import android.app.ActivityManager;
@@ -443,7 +444,8 @@ public class RecentsImpl implements ActivityOptions.OnAnimationFinishedListener
}
// Launch the task
ssp.startActivityFromRecents(mContext, toTask.key, toTask.title, launchOpts);
ssp.startActivityFromRecents(
mContext, toTask.key, toTask.title, launchOpts, INVALID_STACK_ID);
}
/**
@@ -515,7 +517,8 @@ public class RecentsImpl implements ActivityOptions.OnAnimationFinishedListener
MetricsLogger.count(mContext, "overview_affiliated_task_launch", 1);
// Launch the task
ssp.startActivityFromRecents(mContext, toTask.key, toTask.title, launchOpts);
ssp.startActivityFromRecents(
mContext, toTask.key, toTask.title, launchOpts, INVALID_STACK_ID);
}
public void showNextAffiliatedTask() {

View File

@@ -20,6 +20,7 @@ import static android.app.ActivityManager.StackId.DOCKED_STACK_ID;
import static android.app.ActivityManager.StackId.FREEFORM_WORKSPACE_STACK_ID;
import static android.app.ActivityManager.StackId.FULLSCREEN_WORKSPACE_STACK_ID;
import static android.app.ActivityManager.StackId.HOME_STACK_ID;
import static android.app.ActivityManager.StackId.INVALID_STACK_ID;
import static android.app.ActivityManager.StackId.PINNED_STACK_ID;
import static android.provider.Settings.Global.DEVELOPMENT_ENABLE_FREEFORM_WINDOWS_SUPPORT;
@@ -940,7 +941,7 @@ public class SystemServicesProxy {
/** Starts an activity from recents. */
public boolean startActivityFromRecents(Context context, Task.TaskKey taskKey, String taskName,
ActivityOptions options) {
ActivityOptions options, int stackId) {
if (mIam != null) {
try {
if (taskKey.stackId == DOCKED_STACK_ID) {
@@ -950,6 +951,11 @@ public class SystemServicesProxy {
options = ActivityOptions.makeBasic();
}
options.setLaunchStackId(FULLSCREEN_WORKSPACE_STACK_ID);
} else if (stackId != INVALID_STACK_ID){
if (options == null) {
options = ActivityOptions.makeBasic();
}
options.setLaunchStackId(stackId);
}
mIam.startActivityFromRecents(
taskKey.id, options == null ? null : options.toBundle());

View File

@@ -34,6 +34,8 @@ import com.android.systemui.recents.misc.SystemServicesProxy;
import com.android.systemui.recents.model.Task;
import com.android.systemui.recents.model.TaskStack;
import static android.app.ActivityManager.StackId.INVALID_STACK_ID;
public class RecentsTvTransitionHelper {
private static final String TAG = "RecentsTvTransitionHelper";
@@ -90,7 +92,7 @@ public class RecentsTvTransitionHelper {
private void startTaskActivity(TaskStack stack, Task task, @Nullable TaskCardView taskView,
ActivityOptions opts,final ActivityOptions.OnAnimationStartedListener animStartedListener) {
SystemServicesProxy ssp = Recents.getSystemServices();
if (ssp.startActivityFromRecents(mContext, task.key, task.title, opts)) {
if (ssp.startActivityFromRecents(mContext, task.key, task.title, opts, INVALID_STACK_ID)) {
// Keep track of the index of the task launch
int taskIndexFromFront = 0;
int taskIndex = stack.indexOfStackTask(task);

View File

@@ -140,7 +140,8 @@ public class RecentsTvView extends FrameLayout {
private void launchTaskFomRecents(final Task task, boolean animate) {
if (!animate) {
SystemServicesProxy ssp = Recents.getSystemServices();
ssp.startActivityFromRecents(getContext(), task.key, task.title, null);
ssp.startActivityFromRecents(getContext(), task.key, task.title, null,
INVALID_STACK_ID);
return;
}
mTaskStackHorizontalView.requestFocus();
@@ -164,7 +165,8 @@ public class RecentsTvView extends FrameLayout {
// task with no animation.
Log.e(TAG, "Card view for task : " + task + ", returned null.");
SystemServicesProxy ssp = Recents.getSystemServices();
ssp.startActivityFromRecents(getContext(), task.key, task.title, null);
ssp.startActivityFromRecents(getContext(), task.key, task.title, null,
INVALID_STACK_ID);
}
mTaskStackHorizontalView.removeOnScrollListener(mScrollListener);
}

View File

@@ -149,7 +149,8 @@ public class RecentsTransitionHelper {
if (taskView == null) {
// If there is no task view, then we do not need to worry about animating out occluding
// task views, and we can launch immediately
startTaskActivity(stack, task, taskView, opts, transitionFuture, animStartedListener);
startTaskActivity(stack, task, taskView, opts, transitionFuture, animStartedListener,
destinationStack);
} else {
LaunchTaskStartedEvent launchStartedEvent = new LaunchTaskStartedEvent(taskView,
screenPinningRequested);
@@ -158,14 +159,14 @@ public class RecentsTransitionHelper {
@Override
public void run() {
startTaskActivity(stack, task, taskView, opts, transitionFuture,
animStartedListener);
animStartedListener, destinationStack);
}
});
EventBus.getDefault().send(launchStartedEvent);
} else {
EventBus.getDefault().send(launchStartedEvent);
startTaskActivity(stack, task, taskView, opts, transitionFuture,
animStartedListener);
animStartedListener, destinationStack);
}
}
Recents.getSystemServices().sendCloseSystemWindows(
@@ -194,12 +195,13 @@ public class RecentsTransitionHelper {
*
* @param taskView this is the {@link TaskView} that we are launching from. This can be null if
* we are toggling recents and the launch-to task is now offscreen.
* @param destinationStack id of the stack to put the task into.
*/
private void startTaskActivity(TaskStack stack, Task task, @Nullable TaskView taskView,
ActivityOptions opts, IAppTransitionAnimationSpecsFuture transitionFuture,
final ActivityOptions.OnAnimationStartedListener animStartedListener) {
final OnAnimationStartedListener animStartedListener, int destinationStack) {
SystemServicesProxy ssp = Recents.getSystemServices();
if (ssp.startActivityFromRecents(mContext, task.key, task.title, opts)) {
if (ssp.startActivityFromRecents(mContext, task.key, task.title, opts, destinationStack)) {
// Keep track of the index of the task launch
int taskIndexFromFront = 0;
int taskIndex = stack.indexOfStackTask(task);

View File

@@ -600,10 +600,7 @@ public class TaskViewHeader extends FrameLayout
Constants.Metrics.DismissSourceHeaderButton);
} else if (v == mMoveTaskButton) {
TaskView tv = Utilities.findParent(this, TaskView.class);
Rect bounds = mMoveTaskTargetStackId == FREEFORM_WORKSPACE_STACK_ID
? new Rect(mTaskViewRect)
: new Rect();
EventBus.getDefault().send(new LaunchTaskEvent(tv, mTask, bounds,
EventBus.getDefault().send(new LaunchTaskEvent(tv, mTask, null,
mMoveTaskTargetStackId, false));
} else if (v == mAppInfoView) {
EventBus.getDefault().send(new ShowApplicationInfoEvent(mTask));