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

Commit 013a8a75 authored by Sunny Goyal's avatar Sunny Goyal
Browse files

Removing AM.getTasks call on UI thread during touch down

We maintain a cached task queue using TaskStackChangeListener.
It keeps the top RunningTaskInfo partially in sync with platfrom:
   taskInfo is only initialized when the top task changes
   but not when there are changes within the task itself.

Bug: 214581894
Bug: 220742398
Test: Manual and presubmit
Change-Id: Ifafde574040c03435b78f044350c45f3b49c4bcb
parent 998c47e5
Loading
Loading
Loading
Loading
+3 −2
Original line number Diff line number Diff line
@@ -48,8 +48,8 @@ import com.android.launcher3.states.StateAnimationConfig;
import com.android.launcher3.touch.SingleAxisSwipeDetector;
import com.android.launcher3.util.TouchController;
import com.android.quickstep.TaskUtils;
import com.android.quickstep.TopTaskTracker;
import com.android.quickstep.util.AnimatorControllerWithResistance;
import com.android.quickstep.util.AssistantUtilities;
import com.android.quickstep.util.OverviewToHomeAnim;
import com.android.quickstep.views.RecentsView;

@@ -112,7 +112,8 @@ public class NavBarToHomeTouchController implements TouchController,
            return true;
        }
        if (FeatureFlags.ASSISTANT_GIVES_LAUNCHER_FOCUS.get()
                && AssistantUtilities.isExcludedAssistantRunning()) {
                && TopTaskTracker.INSTANCE.get(mLauncher).getCachedTopTask(false)
                        .isExcludedAssistant()) {
            return true;
        }
        return false;
+8 −21
Original line number Diff line number Diff line
@@ -102,7 +102,6 @@ import com.android.quickstep.util.ActivityInitListener;
import com.android.quickstep.util.AnimatorControllerWithResistance;
import com.android.quickstep.util.InputConsumerProxy;
import com.android.quickstep.util.InputProxyHandlerFactory;
import com.android.quickstep.util.LauncherSplitScreenListener;
import com.android.quickstep.util.MotionPauseDetector;
import com.android.quickstep.util.ProtoTracer;
import com.android.quickstep.util.RecentsOrientedState;
@@ -114,6 +113,7 @@ import com.android.quickstep.util.TaskViewSimulator;
import com.android.quickstep.util.VibratorWrapper;
import com.android.quickstep.views.RecentsView;
import com.android.quickstep.views.TaskView;
import com.android.systemui.shared.recents.model.Task;
import com.android.systemui.shared.recents.model.ThumbnailData;
import com.android.systemui.shared.system.ActivityManagerWrapper;
import com.android.systemui.shared.system.InputConsumerController;
@@ -564,24 +564,12 @@ public abstract class AbsSwipeUpHandler<T extends StatefulActivity<S>,
    }

    protected void notifyGestureAnimationStartToRecents() {
        ActivityManager.RunningTaskInfo[] runningTasks;
        Task[] runningTasks;
        if (mIsSwipeForStagedSplit) {
            int[] splitTaskIds =
                    LauncherSplitScreenListener.INSTANCE.getNoCreate().getRunningSplitTaskIds();
            runningTasks = new ActivityManager.RunningTaskInfo[splitTaskIds.length];
            for (int i = 0; i < splitTaskIds.length; i++) {
                int taskId = splitTaskIds[i];
                // Order matters here, we want first indexed RunningTaskInfo to be leftTop task
                for (ActivityManager.RunningTaskInfo rti : mGestureState.getRunningTasks()) {
                    if (taskId == rti.taskId) {
                        runningTasks[i] = rti;
                        break;
                    }

                }
            }
            int[] splitTaskIds = TopTaskTracker.INSTANCE.get(mContext).getRunningSplitTaskIds();
            runningTasks = mGestureState.getRunningTask().getPlaceholderTasks(splitTaskIds);
        } else {
            runningTasks = new ActivityManager.RunningTaskInfo[]{mGestureState.getRunningTask()};
            runningTasks = mGestureState.getRunningTask().getPlaceholderTasks();
        }
        mRecentsView.onGestureAnimationStart(runningTasks, mDeviceState.getRotationTouchHelper());
    }
@@ -801,7 +789,7 @@ public abstract class AbsSwipeUpHandler<T extends StatefulActivity<S>,
            RecentsAnimationTargets targets) {
        super.onRecentsAnimationStart(controller, targets);
        ActiveGestureLog.INSTANCE.addLog("startRecentsAnimationCallback", targets.apps.length);
        mRemoteTargetHandles = mTargetGluer.assignTargetsForSplitScreen(targets);
        mRemoteTargetHandles = mTargetGluer.assignTargetsForSplitScreen(mContext, targets);
        mRecentsAnimationController = controller;
        mRecentsAnimationTargets = targets;

@@ -1380,7 +1368,7 @@ public abstract class AbsSwipeUpHandler<T extends StatefulActivity<S>,
    private SwipePipToHomeAnimator createWindowAnimationToPip(HomeAnimationFactory homeAnimFactory,
            RemoteAnimationTargetCompat runningTaskTarget, float startProgress) {
        // Directly animate the app to PiP (picture-in-picture) mode
        final ActivityManager.RunningTaskInfo taskInfo = mGestureState.getRunningTask();
        final ActivityManager.RunningTaskInfo taskInfo = runningTaskTarget.taskInfo;
        final RecentsOrientedState orientationState = mRemoteTargetHandles[0].getTaskViewSimulator()
                .getOrientationState();
        final int windowRotation = calculateWindowRotation(runningTaskTarget, orientationState);
@@ -1782,8 +1770,7 @@ public abstract class AbsSwipeUpHandler<T extends StatefulActivity<S>,
                    new PictureInPictureSurfaceTransaction.Builder()
                            .setAlpha(0f)
                            .build();
            int[] taskIds =
                        LauncherSplitScreenListener.INSTANCE.getNoCreate().getRunningSplitTaskIds();
            int[] taskIds = TopTaskTracker.INSTANCE.get(mContext).getRunningSplitTaskIds();
            for (int taskId : taskIds) {
                mRecentsAnimationController.setFinishTaskTransaction(taskId,
                        tx, null /* overlay */);
+13 −12
Original line number Diff line number Diff line
@@ -30,7 +30,7 @@ import static com.android.systemui.shared.system.RemoteAnimationTargetCompat.ACT

import android.animation.ObjectAnimator;
import android.annotation.TargetApi;
import android.app.ActivityManager;
import android.app.ActivityManager.RunningTaskInfo;
import android.app.ActivityOptions;
import android.content.ActivityNotFoundException;
import android.content.Context;
@@ -69,7 +69,6 @@ import com.android.quickstep.util.RectFSpringAnim;
import com.android.quickstep.util.TransformParams;
import com.android.quickstep.util.TransformParams.BuilderProxy;
import com.android.systemui.shared.recents.model.Task.TaskKey;
import com.android.systemui.shared.system.ActivityManagerWrapper;
import com.android.systemui.shared.system.InputConsumerController;
import com.android.systemui.shared.system.RemoteAnimationTargetCompat;
import com.android.systemui.shared.system.SyncRtSurfaceTransactionApplierCompat.SurfaceParams;
@@ -109,7 +108,7 @@ public class FallbackSwipeHandler extends
        super(context, deviceState, taskAnimationManager, gestureState, touchTimeMs,
                continuingLastGesture, inputConsumer);

        mRunningOverHome = ActivityManagerWrapper.isHomeTask(mGestureState.getRunningTask());
        mRunningOverHome = mGestureState.getRunningTask().isHomeTask();
        if (mRunningOverHome) {
            runActionOnRemoteHandles(remoteTargetHandle ->
                    remoteTargetHandle.getTransformParams().setHomeBuilderProxy(
@@ -150,16 +149,17 @@ public class FallbackSwipeHandler extends
            return new FallbackPipToHomeAnimationFactory();
        }
        mActiveAnimationFactory = new FallbackHomeAnimationFactory(duration);
        startHomeIntent(mActiveAnimationFactory);
        startHomeIntent(mActiveAnimationFactory, runningTaskTarget);
        return mActiveAnimationFactory;
    }

    private void startHomeIntent(
            @Nullable FallbackHomeAnimationFactory gestureContractAnimationFactory) {
            @Nullable FallbackHomeAnimationFactory gestureContractAnimationFactory,
            @Nullable RemoteAnimationTargetCompat runningTaskTarget) {
        ActivityOptions options = ActivityOptions.makeCustomAnimation(mContext, 0, 0);
        Intent intent = new Intent(mGestureState.getHomeIntent());
        if (gestureContractAnimationFactory != null) {
            gestureContractAnimationFactory.addGestureContract(intent);
        if (gestureContractAnimationFactory != null && runningTaskTarget != null) {
            gestureContractAnimationFactory.addGestureContract(intent, runningTaskTarget.taskInfo);
        }
        try {
            mContext.startActivity(intent, options.toBundle());
@@ -187,7 +187,8 @@ public class FallbackSwipeHandler extends
            // the PiP task appearing.
            recentsCallback = () -> {
                callback.run();
                startHomeIntent(null /* gestureContractAnimationFactory */);
                startHomeIntent(
                        null /* gestureContractAnimationFactory */, null /* runningTaskTarget */);
            };
        } else {
            recentsCallback = callback;
@@ -212,7 +213,7 @@ public class FallbackSwipeHandler extends
        if (mRunningOverHome) {
            if (DisplayController.getNavigationMode(mContext).hasGestures) {
                mRecentsView.onGestureAnimationStartOnHome(
                        new ActivityManager.RunningTaskInfo[]{mGestureState.getRunningTask()},
                        mGestureState.getRunningTask().getPlaceholderTasks(),
                        mDeviceState.getRotationTouchHelper());
            }
        } else {
@@ -396,12 +397,12 @@ public class FallbackSwipeHandler extends
            }
        }

        private void addGestureContract(Intent intent) {
            if (mRunningOverHome || mGestureState.getRunningTask() == null) {
        private void addGestureContract(Intent intent, RunningTaskInfo runningTaskInfo) {
            if (mRunningOverHome || runningTaskInfo == null) {
                return;
            }

            TaskKey key = new TaskKey(mGestureState.getRunningTask());
            TaskKey key = new TaskKey(runningTaskInfo);
            if (key.getComponent() != null) {
                if (sMessageReceiver == null) {
                    sMessageReceiver = new StaticMessageReceiver();
+6 −24
Original line number Diff line number Diff line
@@ -22,7 +22,6 @@ import static com.android.quickstep.MultiStateCallback.DEBUG_STATES;

import android.annotation.Nullable;
import android.annotation.TargetApi;
import android.app.ActivityManager;
import android.content.Intent;
import android.os.Build;

@@ -30,6 +29,7 @@ import com.android.launcher3.statemanager.BaseState;
import com.android.launcher3.statemanager.StatefulActivity;
import com.android.launcher3.tracing.GestureStateProto;
import com.android.launcher3.tracing.SwipeHandlerProto;
import com.android.quickstep.TopTaskTracker.CachedTaskInfo;
import com.android.quickstep.util.ActiveGestureLog;
import com.android.systemui.shared.recents.model.ThumbnailData;
import com.android.systemui.shared.system.RemoteAnimationTargetCompat;
@@ -135,8 +135,7 @@ public class GestureState implements RecentsAnimationCallbacks.RecentsAnimationL
    private final MultiStateCallback mStateCallback;
    private final int mGestureId;

    private ActivityManager.RunningTaskInfo mRunningTask;
    private ActivityManager.RunningTaskInfo[] mRunningTasks;
    private CachedTaskInfo mRunningTask;
    private GestureEndTarget mEndTarget;
    private RemoteAnimationTargetCompat mLastAppearedTaskTarget;
    private Set<Integer> mPreviouslyAppearedTaskIds = new HashSet<>();
@@ -232,41 +231,24 @@ public class GestureState implements RecentsAnimationCallbacks.RecentsAnimationL
    /**
     * @return the running task for this gesture.
     */
    public ActivityManager.RunningTaskInfo getRunningTask() {
    public CachedTaskInfo getRunningTask() {
        return mRunningTask;
    }

    /**
     * This will array will contain the task returned by {@link #getRunningTask()}
     * @return the running tasks for this gesture.
     */
    public ActivityManager.RunningTaskInfo[] getRunningTasks() {
        return mRunningTasks;
    }

    /**
     * @return the running task id for this gesture.
     */
    public int getRunningTaskId() {
        return mRunningTask != null ? mRunningTask.taskId : -1;
        return mRunningTask != null ? mRunningTask.getTaskId() : -1;
    }

    /**
     * Updates the running task for the gesture to be the given {@param runningTask}.
     */
    public void updateRunningTask(ActivityManager.RunningTaskInfo runningTask) {
    public void updateRunningTask(CachedTaskInfo runningTask) {
        mRunningTask = runningTask;
    }

    /**
     * TODO(b/210903248) refactor to consolidate w/ method above
     * Updates the running task for the gesture to be the given {@param runningTask}.
     */
    public void updateRunningTasks(ActivityManager.RunningTaskInfo[] runningTasks) {
        mRunningTasks = runningTasks;
        updateRunningTask(runningTasks[0]);
    }

    /**
     * Updates the last task that appeared during this gesture.
     */
@@ -339,7 +321,7 @@ public class GestureState implements RecentsAnimationCallbacks.RecentsAnimationL
     * user controlled gesture.
     */
    public void setHandlingAtomicEvent(boolean handlingAtomicEvent) {
        mHandlingAtomicEvent = true;
        mHandlingAtomicEvent = handlingAtomicEvent;
    }

    /**
+12 −27
Original line number Diff line number Diff line
@@ -45,14 +45,11 @@ import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_Q
import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_SCREEN_PINNING;
import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_STATUS_BAR_KEYGUARD_SHOWING_OCCLUDED;

import android.app.ActivityManager;
import android.app.ActivityTaskManager;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.res.Resources;
import android.graphics.Region;
import android.inputmethodservice.InputMethodService;
import android.net.Uri;
@@ -61,18 +58,17 @@ import android.os.RemoteException;
import android.os.SystemProperties;
import android.os.UserManager;
import android.provider.Settings;
import android.text.TextUtils;
import android.view.MotionEvent;

import androidx.annotation.BinderThread;

import com.android.launcher3.R;
import com.android.launcher3.Utilities;
import com.android.launcher3.util.DisplayController;
import com.android.launcher3.util.DisplayController.DisplayInfoChangeListener;
import com.android.launcher3.util.DisplayController.Info;
import com.android.launcher3.util.DisplayController.NavigationMode;
import com.android.launcher3.util.SettingsCache;
import com.android.quickstep.TopTaskTracker.CachedTaskInfo;
import com.android.quickstep.util.NavBarPosition;
import com.android.systemui.shared.system.ActivityManagerWrapper;
import com.android.systemui.shared.system.QuickStepContract;
@@ -83,7 +79,6 @@ import com.android.systemui.shared.system.TaskStackChangeListeners;

import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;

/**
 * Manages the state of the system during a swipe up gesture.
@@ -97,7 +92,6 @@ public class RecentsAnimationDeviceState implements DisplayInfoChangeListener {
    private final int mDisplayId;
    private final RotationTouchHelper mRotationTouchHelper;
    private final TaskStackChangeListener mPipListener;
    private final List<ComponentName> mGestureBlockedActivities;
    // Cache for better performance since it doesn't change at runtime.
    private final boolean mCanImeRenderGesturalNavButtons =
            InputMethodService.canImeRenderGesturalNavButtons();
@@ -129,6 +123,7 @@ public class RecentsAnimationDeviceState implements DisplayInfoChangeListener {
        }
    };

    private int mGestureBlockingTaskId = -1;
    private Region mExclusionRegion;
    private SystemGestureExclusionListenerCompat mExclusionListener;

@@ -178,22 +173,6 @@ public class RecentsAnimationDeviceState implements DisplayInfoChangeListener {
        onDisplayInfoChanged(context, mDisplayController.getInfo(), CHANGE_ALL);
        runOnDestroy(() -> mDisplayController.removeChangeListener(this));

        // Add any blocked activities
        String[] blockingActivities;
        try {
            blockingActivities =
                    context.getResources().getStringArray(R.array.gesture_blocking_activities);
        } catch (Resources.NotFoundException e) {
            blockingActivities = new String[0];
        }
        mGestureBlockedActivities = new ArrayList<>(blockingActivities.length);
        for (String blockingActivity : blockingActivities) {
            if (!TextUtils.isEmpty(blockingActivity)) {
                mGestureBlockedActivities.add(
                        ComponentName.unflattenFromString(blockingActivity));
            }
        }

        SettingsCache settingsCache = SettingsCache.INSTANCE.get(mContext);
        if (mIsOneHandedModeSupported) {
            Uri oneHandedUri = Settings.Secure.getUriFor(ONE_HANDED_ENABLED);
@@ -367,11 +346,17 @@ public class RecentsAnimationDeviceState implements DisplayInfoChangeListener {
    }

    /**
     * @return whether the given running task info matches the gesture-blocked activity.
     * Sets the task id where gestures should be blocked
     */
    public void setGestureBlockingTaskId(int taskId) {
        mGestureBlockingTaskId = taskId;
    }

    /**
     * @return whether the given running task info matches the gesture-blocked task.
     */
    public boolean isGestureBlockedActivity(ActivityManager.RunningTaskInfo runningTaskInfo) {
        return runningTaskInfo != null
                && mGestureBlockedActivities.contains(runningTaskInfo.topActivity);
    public boolean isGestureBlockedTask(CachedTaskInfo taskInfo) {
        return taskInfo != null && taskInfo.getTaskId() == mGestureBlockingTaskId;
    }

    /**
Loading