summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Linus Tufvesson <lus@google.com> 2022-03-22 10:01:28 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2022-03-22 10:01:28 +0000
commita9abd2bfbfb090b3d5dafcb88826fecf08538f98 (patch)
tree4539ea2bca131ba4f58a03274f53da04f64ce85a
parent26e122a5f76e3580e0669bfd3eb8da678967ec99 (diff)
parent84705ae31fa6aa0e849430222347a7c8d57baa54 (diff)
Merge "Move touch blocking into InputDispatcher" into tm-dev
-rw-r--r--services/core/java/com/android/server/wm/ActivityRecordInputSink.java80
1 files changed, 5 insertions, 75 deletions
diff --git a/services/core/java/com/android/server/wm/ActivityRecordInputSink.java b/services/core/java/com/android/server/wm/ActivityRecordInputSink.java
index 8622bd32fc68..ce49a8675890 100644
--- a/services/core/java/com/android/server/wm/ActivityRecordInputSink.java
+++ b/services/core/java/com/android/server/wm/ActivityRecordInputSink.java
@@ -18,20 +18,11 @@ package com.android.server.wm;
import android.app.compat.CompatChanges;
import android.compat.annotation.ChangeId;
-import android.os.IBinder;
import android.os.InputConfig;
-import android.os.InputConstants;
-import android.os.Looper;
import android.os.Process;
-import android.util.Slog;
-import android.view.InputChannel;
-import android.view.InputEvent;
-import android.view.InputEventReceiver;
import android.view.InputWindowHandle;
-import android.view.MotionEvent;
import android.view.SurfaceControl;
import android.view.WindowManager;
-import android.widget.Toast;
/**
* Creates a InputWindowHandle that catches all touches that would otherwise pass through an
@@ -45,20 +36,12 @@ class ActivityRecordInputSink {
@ChangeId
static final long ENABLE_TOUCH_OPAQUE_ACTIVITIES = 194480991L;
- private static final String TAG = "ActivityRecordInputSink";
- private static final int NUMBER_OF_TOUCHES_TO_DISABLE = 3;
- private static final long TOAST_COOL_DOWN_MILLIS = 3000L;
-
private final ActivityRecord mActivityRecord;
private final boolean mIsCompatEnabled;
private final String mName;
- // Hold on to InputEventReceiver to prevent it from getting GCd.
- private InputEventReceiver mInputEventReceiver;
private InputWindowHandleWrapper mInputWindowHandleWrapper;
private SurfaceControl mSurfaceControl;
- private int mRapidTouchCount = 0;
- private IBinder mToken;
private boolean mDisabled = false;
ActivityRecordInputSink(ActivityRecord activityRecord) {
@@ -66,7 +49,7 @@ class ActivityRecordInputSink {
mIsCompatEnabled = CompatChanges.isChangeEnabled(ENABLE_TOUCH_OPAQUE_ACTIVITIES,
mActivityRecord.getUid());
mName = Integer.toHexString(System.identityHashCode(this)) + " ActivityRecordInputSink "
- + mActivityRecord.mActivityComponent.getShortClassName();
+ + mActivityRecord.mActivityComponent.flattenToShortString();
}
public void applyChangesToSurfaceIfChanged(SurfaceControl.Transaction transaction) {
@@ -93,16 +76,13 @@ class ActivityRecordInputSink {
private InputWindowHandleWrapper getInputWindowHandleWrapper() {
if (mInputWindowHandleWrapper == null) {
mInputWindowHandleWrapper = new InputWindowHandleWrapper(createInputWindowHandle());
- InputChannel inputChannel =
- mActivityRecord.mWmService.mInputManager.createInputChannel(mName);
- mToken = inputChannel.getToken();
- mInputEventReceiver = createInputEventReceiver(inputChannel);
}
if (mDisabled || !mIsCompatEnabled || mActivityRecord.isInTransition()) {
// TODO(b/208662670): Investigate if we can have feature active during animations.
- mInputWindowHandleWrapper.setToken(null);
+ mInputWindowHandleWrapper.setInputConfigMasked(InputConfig.NOT_TOUCHABLE,
+ InputConfig.NOT_TOUCHABLE);
} else {
- mInputWindowHandleWrapper.setToken(mToken);
+ mInputWindowHandleWrapper.setInputConfigMasked(0, InputConfig.NOT_TOUCHABLE);
}
return mInputWindowHandleWrapper;
}
@@ -115,58 +95,8 @@ class ActivityRecordInputSink {
inputWindowHandle.layoutParamsType = WindowManager.LayoutParams.TYPE_INPUT_CONSUMER;
inputWindowHandle.ownerUid = Process.myUid();
inputWindowHandle.ownerPid = Process.myPid();
- inputWindowHandle.dispatchingTimeoutMillis =
- InputConstants.DEFAULT_DISPATCHING_TIMEOUT_MILLIS;
- inputWindowHandle.inputConfig = InputConfig.NOT_FOCUSABLE;
+ inputWindowHandle.inputConfig = InputConfig.NOT_FOCUSABLE | InputConfig.NO_INPUT_CHANNEL;
return inputWindowHandle;
}
- private InputEventReceiver createInputEventReceiver(InputChannel inputChannel) {
- return new SinkInputEventReceiver(inputChannel,
- mActivityRecord.mAtmService.mUiHandler.getLooper());
- }
-
- private void showAsToastAndLog(String message) {
- Toast.makeText(mActivityRecord.mAtmService.mUiContext, message,
- Toast.LENGTH_LONG).show();
- Slog.wtf(TAG, message + " " + mActivityRecord.mActivityComponent);
- }
-
- private class SinkInputEventReceiver extends InputEventReceiver {
- private long mLastToast = 0;
-
- SinkInputEventReceiver(InputChannel inputChannel, Looper looper) {
- super(inputChannel, looper);
- }
-
- public void onInputEvent(InputEvent event) {
- if (!(event instanceof MotionEvent)) {
- Slog.wtf(TAG,
- "Received InputEvent that was not a MotionEvent");
- finishInputEvent(event, true);
- return;
- }
- MotionEvent motionEvent = (MotionEvent) event;
- if (motionEvent.getAction() != MotionEvent.ACTION_DOWN) {
- finishInputEvent(event, true);
- return;
- }
-
- if (event.getEventTime() - mLastToast > TOAST_COOL_DOWN_MILLIS) {
- String message = "go/activity-touch-opaque - "
- + mActivityRecord.mActivityComponent.getPackageName()
- + " blocked the touch!";
- showAsToastAndLog(message);
- mLastToast = event.getEventTime();
- mRapidTouchCount = 1;
- } else if (++mRapidTouchCount >= NUMBER_OF_TOUCHES_TO_DISABLE && !mDisabled) {
- // Disable touch blocking until Activity Record is recreated.
- String message = "Disabled go/activity-touch-opaque - "
- + mActivityRecord.mActivityComponent.getPackageName();
- showAsToastAndLog(message);
- mDisabled = true;
- }
- finishInputEvent(event, true);
- }
- }
}