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

Commit 54885b8d authored by Vaibhav Devmurari's avatar Vaibhav Devmurari
Browse files

Shift back gesture handling to Shell BackAnimationController

Flag: com.android.window.flags.delegate_back_gesture_to_shell
Bug: 394599430
Test: atest KeyGestureEventTests
Change-Id: I5b44172af1d7b6dc489d7c2d65cadb329d060ee0
parent 0698161c
Loading
Loading
Loading
Loading
+0 −5
Original line number Diff line number Diff line
@@ -368,11 +368,6 @@ interface IActivityTaskManager {
    android.window.BackNavigationInfo startBackNavigation(
            in RemoteCallback navigationObserver, in BackAnimationAdapter adaptor);

    /**
     * Registers a callback to be invoked when the system server requests a back gesture.
     */
    void registerBackGestureDelegate(in RemoteCallback monitor);

    /**
     * registers a callback to be invoked when a background activity launch is aborted.
     *
+18 −18
Original line number Diff line number Diff line
@@ -45,6 +45,7 @@ import android.content.res.Configuration;
import android.graphics.Point;
import android.graphics.Rect;
import android.hardware.input.InputManager;
import android.hardware.input.KeyGestureEvent;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
@@ -95,6 +96,7 @@ import com.android.wm.shell.transition.Transitions;

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

/**
@@ -138,6 +140,7 @@ public class BackAnimationController implements RemoteCallable<BackAnimationCont
    private final ShellExecutor mShellExecutor;
    private final WindowManager mWindowManager;
    private final Transitions mTransitions;
    private final InputManager mInputManager;
    @VisibleForTesting
    final BackTransitionHandler mBackTransitionHandler;
    @VisibleForTesting
@@ -271,6 +274,7 @@ public class BackAnimationController implements RemoteCallable<BackAnimationCont
        mLatencyTracker = LatencyTracker.getInstance(mContext);
        mShellCommandHandler = shellCommandHandler;
        mWindowManager = context.getSystemService(WindowManager.class);
        mInputManager = context.getSystemService(InputManager.class);
        mTransitions = transitions;
        mBackTransitionHandler = new BackTransitionHandler(mTransitions);
        mTransitions.addHandler(mBackTransitionHandler);
@@ -1153,10 +1157,9 @@ public class BackAnimationController implements RemoteCallable<BackAnimationCont
        if (!Flags.delegateBackGestureToShell()) {
            return;
        }
        final RemoteCallback requestBackMonitor = new RemoteCallback(
                new RemoteCallback.OnResultListener() {
                    @Override
                    public void onResult(@Nullable Bundle result) {
        mInputManager.registerKeyGestureEventHandler(List.of(KeyGestureEvent.KEY_GESTURE_TYPE_BACK),
                (event, focussedToken) -> {
                    if (event.getKeyGestureType() == KeyGestureEvent.KEY_GESTURE_TYPE_BACK) {
                        mShellExecutor.execute(() -> {
                            if (mBackGestureStarted) {
                                Log.w(TAG, "Back gesture is running, ignore request");
@@ -1166,13 +1169,10 @@ public class BackAnimationController implements RemoteCallable<BackAnimationCont
                            setTriggerBack(true);
                            onMotionEvent(0, 0, KeyEvent.ACTION_UP, EDGE_NONE);
                        });
                    } else {
                        Log.w(TAG, "Unsupported gesture " + event + " received!");
                    }
                });
        try {
            mActivityTaskManager.registerBackGestureDelegate(requestBackMonitor);
        } catch (RemoteException remoteException) {
            Log.w(TAG, "Failed register back gesture request ", remoteException);
        }
    }

    /**
+6 −5
Original line number Diff line number Diff line
@@ -107,6 +107,7 @@ import static com.android.server.wm.WindowManagerPolicyProto.ROTATION_MODE;
import static com.android.server.wm.WindowManagerPolicyProto.SCREEN_ON_FULLY;
import static com.android.server.wm.WindowManagerPolicyProto.WINDOW_MANAGER_DRAW_COMPLETE;
import static com.android.systemui.shared.Flags.enableLppAssistInvocationEffect;
import static com.android.window.flags.Flags.delegateBackGestureToShell;

import android.accessibilityservice.AccessibilityService;
import android.annotation.Nullable;
@@ -255,6 +256,7 @@ import com.android.server.wm.DisplayPolicy;
import com.android.server.wm.DisplayRotation;
import com.android.server.wm.WindowManagerInternal;
import com.android.server.wm.WindowManagerInternal.AppTransitionListener;
import com.android.window.flags.Flags;

import java.io.File;
import java.io.FileNotFoundException;
@@ -3618,7 +3620,6 @@ public class PhoneWindowManager implements WindowManagerPolicy {
                KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_NOTIFICATION_PANEL,
                KeyGestureEvent.KEY_GESTURE_TYPE_TAKE_SCREENSHOT,
                KeyGestureEvent.KEY_GESTURE_TYPE_TRIGGER_BUG_REPORT,
                KeyGestureEvent.KEY_GESTURE_TYPE_BACK,
                KeyGestureEvent.KEY_GESTURE_TYPE_MULTI_WINDOW_NAVIGATION,
                KeyGestureEvent.KEY_GESTURE_TYPE_DESKTOP_MODE,
                KeyGestureEvent.KEY_GESTURE_TYPE_SPLIT_SCREEN_NAVIGATION_LEFT,
@@ -3638,6 +3639,9 @@ public class PhoneWindowManager implements WindowManagerPolicy {
                KeyGestureEvent.KEY_GESTURE_TYPE_GLOBAL_ACTIONS,
                KeyGestureEvent.KEY_GESTURE_TYPE_TV_TRIGGER_BUG_REPORT
        ));
        if (!delegateBackGestureToShell()) {
            supportedGestures.add(KeyGestureEvent.KEY_GESTURE_TYPE_BACK);
        }
        if (enableTalkbackAndMagnifierKeyGestures()) {
            supportedGestures.add(KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_TALKBACK);
        }
@@ -3729,7 +3733,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
                }
                break;
            case KeyGestureEvent.KEY_GESTURE_TYPE_BACK:
                if (complete) {
                if (!delegateBackGestureToShell() && complete) {
                    injectBackGesture(SystemClock.uptimeMillis());
                }
                break;
@@ -3960,9 +3964,6 @@ public class PhoneWindowManager implements WindowManagerPolicy {

    @SuppressLint("MissingPermission")
    private void injectBackGesture(long downtime) {
        if (mActivityTaskManagerInternal.requestBackGesture()) {
            return;
        }
        // Create and inject down event
        KeyEvent downEvent = new KeyEvent(downtime, downtime, KeyEvent.ACTION_DOWN,
                KeyEvent.KEYCODE_BACK, 0 /* repeat */, 0 /* metaState */,
+0 −6
Original line number Diff line number Diff line
@@ -803,10 +803,4 @@ public abstract class ActivityTaskManagerInternal {

    /** Returns whether assist data is allowed. */
    public abstract boolean isAssistDataAllowed();

    /**
     * Delegate back gesture request from shell.
     * Returns true if the back gesture request was successful, false otherwise.
     */
    public abstract boolean requestBackGesture();
}
+0 −17
Original line number Diff line number Diff line
@@ -1902,18 +1902,6 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
        }
    }

    @Override
    public void registerBackGestureDelegate(RemoteCallback requestObserver) {
        mAmInternal.enforceCallingPermission(START_TASKS_FROM_RECENTS,
                "registerBackGestureDelegate()");
        final long origId = Binder.clearCallingIdentity();
        try {
            mBackNavigationController.registerBackGestureDelegate(requestObserver);
        } finally {
            Binder.restoreCallingIdentity(origId);
        }
    }

    /**
     * Public API to check if the client is allowed to start an activity on specified display.
     *
@@ -7605,11 +7593,6 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
        public boolean isAssistDataAllowed() {
            return ActivityTaskManagerService.this.isAssistDataAllowed();
        }

        @Override
        public boolean requestBackGesture() {
            return mBackNavigationController.requestBackGesture();
        }
    }

    /** Cache the return value for {@link #isPip2ExperimentEnabled()} */
Loading