diff options
| author | 2022-08-02 12:22:57 +0000 | |
|---|---|---|
| committer | 2022-08-02 12:22:57 +0000 | |
| commit | 83c72c89b7fd07fdd2f7b5aed62ce79cd3e92e3c (patch) | |
| tree | 74e5ce64a3ff755cf3e3951df3776250acafc2fa /libs | |
| parent | 016675bcabc8ae96b95929778ff82fc964952871 (diff) | |
| parent | 23c3dd02948ddd0373e13c61c1cb3567405b8528 (diff) | |
Merge "Inject back key events if no focus window found." into tm-qpr-dev am: 117bab591c am: 23c3dd0294
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/19144840
Change-Id: I678242b3a7b6164c6782b82040d386417971f8dc
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
Diffstat (limited to 'libs')
| -rw-r--r-- | libs/WindowManager/Shell/src/com/android/wm/shell/back/BackAnimationController.java | 40 |
1 files changed, 38 insertions, 2 deletions
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/back/BackAnimationController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/back/BackAnimationController.java index 80cf8c3d2de4..d3dc7e8c70a3 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/back/BackAnimationController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/back/BackAnimationController.java @@ -30,15 +30,20 @@ import android.database.ContentObserver; import android.graphics.Point; import android.graphics.PointF; import android.hardware.HardwareBuffer; +import android.hardware.input.InputManager; import android.net.Uri; import android.os.Handler; import android.os.IBinder; import android.os.RemoteException; +import android.os.SystemClock; import android.os.SystemProperties; import android.os.UserHandle; import android.provider.Settings.Global; import android.util.Log; import android.view.IWindowFocusObserver; +import android.view.InputDevice; +import android.view.KeyCharacterMap; +import android.view.KeyEvent; import android.view.MotionEvent; import android.view.RemoteAnimationTarget; import android.view.SurfaceControl; @@ -295,6 +300,9 @@ public class BackAnimationController implements RemoteCallable<BackAnimationCont } else if (keyAction == MotionEvent.ACTION_UP || keyAction == MotionEvent.ACTION_CANCEL) { ProtoLog.d(WM_SHELL_BACK_PREVIEW, "Finishing gesture with event action: %d", keyAction); + if (keyAction == MotionEvent.ACTION_CANCEL) { + mTriggerBack = false; + } onGestureFinished(true); } } @@ -324,7 +332,6 @@ public class BackAnimationController implements RemoteCallable<BackAnimationCont ProtoLog.d(WM_SHELL_BACK_PREVIEW, "Received backNavigationInfo:%s", backNavigationInfo); if (backNavigationInfo == null) { Log.e(TAG, "Received BackNavigationInfo is null."); - finishAnimation(); return; } int backType = backNavigationInfo.getType(); @@ -400,6 +407,25 @@ public class BackAnimationController implements RemoteCallable<BackAnimationCont dispatchOnBackProgressed(targetCallback, backEvent); } + private void injectBackKey() { + sendBackEvent(KeyEvent.ACTION_DOWN); + sendBackEvent(KeyEvent.ACTION_UP); + } + + private void sendBackEvent(int action) { + final long when = SystemClock.uptimeMillis(); + final KeyEvent ev = new KeyEvent(when, when, action, KeyEvent.KEYCODE_BACK, 0 /* repeat */, + 0 /* metaState */, KeyCharacterMap.VIRTUAL_KEYBOARD, 0 /* scancode */, + KeyEvent.FLAG_FROM_SYSTEM | KeyEvent.FLAG_VIRTUAL_HARD_KEY, + InputDevice.SOURCE_KEYBOARD); + + ev.setDisplayId(mContext.getDisplay().getDisplayId()); + if (!InputManager.getInstance() + .injectInputEvent(ev, InputManager.INJECT_INPUT_EVENT_MODE_ASYNC)) { + Log.e(TAG, "Inject input event fail"); + } + } + private void onGestureFinished(boolean fromTouch) { ProtoLog.d(WM_SHELL_BACK_PREVIEW, "onGestureFinished() mTriggerBack == %s", mTriggerBack); if (fromTouch) { @@ -408,7 +434,17 @@ public class BackAnimationController implements RemoteCallable<BackAnimationCont mBackGestureStarted = false; } - if (mTransitionInProgress || mBackNavigationInfo == null) { + if (mTransitionInProgress) { + return; + } + + if (mBackNavigationInfo == null) { + // No focus window found or core are running recents animation, inject back key as + // legacy behavior. + if (mTriggerBack) { + injectBackKey(); + } + finishAnimation(); return; } |