Fix some issues with split screen animation
- Notify WM when the next draw after split screen happens
- Close the menu once we invoke split screen
Bug: 73118672
Change-Id: I9a42635f1f5c29e347bdec3034f6aa8be332c8d2
diff --git a/quickstep/libs/sysui_shared.jar b/quickstep/libs/sysui_shared.jar
index d5859a7..0e45791 100644
--- a/quickstep/libs/sysui_shared.jar
+++ b/quickstep/libs/sysui_shared.jar
Binary files differ
diff --git a/quickstep/src/com/android/quickstep/TaskSystemShortcut.java b/quickstep/src/com/android/quickstep/TaskSystemShortcut.java
index 75d8619..e172291 100644
--- a/quickstep/src/com/android/quickstep/TaskSystemShortcut.java
+++ b/quickstep/src/com/android/quickstep/TaskSystemShortcut.java
@@ -19,13 +19,18 @@
import android.app.ActivityOptions;
import android.content.ComponentName;
import android.content.Intent;
+import android.graphics.Bitmap;
+import android.graphics.Color;
+import android.graphics.Rect;
import android.os.Handler;
import android.os.Looper;
import android.os.RemoteException;
import android.os.UserHandle;
import android.util.Log;
import android.view.View;
+import android.view.ViewTreeObserver.OnPreDrawListener;
+import com.android.launcher3.AbstractFloatingView;
import com.android.launcher3.ItemInfo;
import com.android.launcher3.Launcher;
import com.android.launcher3.R;
@@ -34,9 +39,15 @@
import com.android.launcher3.util.InstantAppResolver;
import com.android.systemui.shared.recents.ISystemUiProxy;
import com.android.systemui.shared.recents.model.Task;
+import com.android.systemui.shared.recents.view.AppTransitionAnimationSpecCompat;
+import com.android.systemui.shared.recents.view.AppTransitionAnimationSpecsFuture;
+import com.android.systemui.shared.recents.view.RecentsTransition;
import com.android.systemui.shared.system.ActivityManagerWrapper;
import com.android.systemui.shared.system.ActivityOptionsCompat;
+import com.android.systemui.shared.system.WindowManagerWrapper;
+import java.util.Collections;
+import java.util.List;
import java.util.function.Consumer;
/**
@@ -86,9 +97,10 @@
}
}
- public static class SplitScreen extends TaskSystemShortcut {
+ public static class SplitScreen extends TaskSystemShortcut implements OnPreDrawListener {
private Handler mHandler;
+ private TaskView mTaskView;
public SplitScreen() {
super(R.drawable.ic_split_screen, R.string.recent_task_option_split_screen);
@@ -104,22 +116,55 @@
if (!task.isDockable) {
return null;
}
+ mTaskView = taskView;
return (v -> {
- final ActivityOptions options = ActivityOptionsCompat.makeSplitScreenOptions(true);
- final Consumer<Boolean> resultCallback = success -> {
- if (success) {
- launcher.<RecentsView>getOverviewPanel().removeView(taskView);
- }
- };
- ActivityManagerWrapper.getInstance().startActivityFromRecentsAsync(
- task.key, options, resultCallback, mHandler);
+ AbstractFloatingView.closeOpenViews(launcher, true,
+ AbstractFloatingView.TYPE_ALL & ~AbstractFloatingView.TYPE_REBIND_SAFE);
- // TODO improve transition; see:
- // DockedFirstAnimationFrameEvent
- // RecentsTransitionHelper#composeDockAnimationSpec
- // WindowManagerWrapper#overridePendingAppTransitionMultiThumbFuture
+ if (ActivityManagerWrapper.getInstance().startActivityFromRecents(task.key.id,
+ ActivityOptionsCompat.makeSplitScreenOptions(true))) {
+ ISystemUiProxy sysUiProxy = RecentsModel.getInstance(launcher).getSystemUiProxy();
+ try {
+ sysUiProxy.onSplitScreenInvoked();
+ } catch (RemoteException e) {
+ Log.w(TAG, "Failed to notify SysUI of split screen: ", e);
+ return;
+ }
+
+ final Runnable animStartedListener = () -> {
+ mTaskView.getViewTreeObserver().addOnPreDrawListener(SplitScreen.this);
+ launcher.<RecentsView>getOverviewPanel().removeView(taskView);
+ };
+
+ final int[] position = new int[2];
+ taskView.getLocationOnScreen(position);
+ final int width = (int) (taskView.getWidth() * taskView.getScaleX());
+ final int height = (int) (taskView.getHeight() * taskView.getScaleY());
+ final Rect taskBounds = new Rect(position[0], position[1],
+ position[0] + width, position[1] + height);
+
+ Bitmap thumbnail = RecentsTransition.drawViewIntoHardwareBitmap(
+ taskBounds.width(), taskBounds.height(), taskView, 1f, Color.BLACK);
+ AppTransitionAnimationSpecsFuture future =
+ new AppTransitionAnimationSpecsFuture(mHandler) {
+ @Override
+ public List<AppTransitionAnimationSpecCompat> composeSpecs() {
+ return Collections.singletonList(new AppTransitionAnimationSpecCompat(
+ task.key.id, thumbnail, taskBounds));
+ }
+ };
+ WindowManagerWrapper.getInstance().overridePendingAppTransitionMultiThumbFuture(
+ future, animStartedListener, mHandler, true /* scaleUp */);
+ }
});
}
+
+ @Override
+ public boolean onPreDraw() {
+ mTaskView.getViewTreeObserver().removeOnPreDrawListener(this);
+ WindowManagerWrapper.getInstance().endProlongedAnimations();
+ return true;
+ }
}
public static class Pin extends TaskSystemShortcut {