Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit efa67129 authored by Winson Chung's avatar Winson Chung
Browse files

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
parent e01c217b
Loading
Loading
Loading
Loading
+250 B (114 KiB)

File changed.

No diff preview for this file type.

+57 −12
Original line number Diff line number Diff line
@@ -19,13 +19,18 @@ package com.android.quickstep;
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.popup.SystemShortcut;
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 class TaskSystemShortcut<T extends SystemShortcut> extends SystemShortcut
        }
    }

    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 @@ public class TaskSystemShortcut<T extends SystemShortcut> extends SystemShortcut
            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);
                AbstractFloatingView.closeOpenViews(launcher, true,
                        AbstractFloatingView.TYPE_ALL & ~AbstractFloatingView.TYPE_REBIND_SAFE);

                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);
                    };
                ActivityManagerWrapper.getInstance().startActivityFromRecentsAsync(
                        task.key, options, resultCallback, mHandler);

                // TODO improve transition; see:
                // DockedFirstAnimationFrameEvent
                // RecentsTransitionHelper#composeDockAnimationSpec
                // WindowManagerWrapper#overridePendingAppTransitionMultiThumbFuture
                    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 {