summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/android/os/Handler.java3
-rw-r--r--services/accessibility/java/com/android/server/accessibility/MagnificationGestureHandler.java20
-rw-r--r--services/tests/servicestests/src/com/android/server/accessibility/MagnificationGestureHandlerTest.java33
3 files changed, 45 insertions, 11 deletions
diff --git a/core/java/android/os/Handler.java b/core/java/android/os/Handler.java
index 5c5e351d2eeb..fc88e9006639 100644
--- a/core/java/android/os/Handler.java
+++ b/core/java/android/os/Handler.java
@@ -202,7 +202,8 @@ public class Handler {
mLooper = Looper.myLooper();
if (mLooper == null) {
throw new RuntimeException(
- "Can't create handler inside thread that has not called Looper.prepare()");
+ "Can't create handler inside thread " + Thread.currentThread()
+ + " that has not called Looper.prepare()");
}
mQueue = mLooper.mQueue;
mCallback = callback;
diff --git a/services/accessibility/java/com/android/server/accessibility/MagnificationGestureHandler.java b/services/accessibility/java/com/android/server/accessibility/MagnificationGestureHandler.java
index 0a03b7fc85b3..0bc95f40bfcf 100644
--- a/services/accessibility/java/com/android/server/accessibility/MagnificationGestureHandler.java
+++ b/services/accessibility/java/com/android/server/accessibility/MagnificationGestureHandler.java
@@ -37,7 +37,9 @@ import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Handler;
+import android.os.Looper;
import android.os.Message;
+import android.util.Log;
import android.util.MathUtils;
import android.util.Slog;
import android.util.TypedValue;
@@ -154,6 +156,12 @@ class MagnificationGestureHandler extends BaseEventStreamTransformation {
MagnificationController magnificationController,
boolean detectTripleTap,
boolean detectShortcutTrigger) {
+ if (DEBUG_ALL) {
+ Log.i(LOG_TAG,
+ "MagnificationGestureHandler(detectTripleTap = " + detectTripleTap
+ + ", detectShortcutTrigger = " + detectShortcutTrigger + ")");
+ }
+
mMagnificationController = magnificationController;
mDelegatingState = new DelegatingState();
@@ -581,7 +589,7 @@ class MagnificationGestureHandler extends BaseEventStreamTransformation {
@VisibleForTesting boolean mShortcutTriggered;
- Handler mHandler = new Handler(this);
+ @VisibleForTesting Handler mHandler = new Handler(this);
public DetectingState(Context context) {
mLongTapMinDelay = ViewConfiguration.getLongPressTimeout();
@@ -756,11 +764,14 @@ class MagnificationGestureHandler extends BaseEventStreamTransformation {
@Override
public void clear() {
setShortcutTriggered(false);
- mHandler.removeMessages(MESSAGE_ON_TRIPLE_TAP_AND_HOLD);
- mHandler.removeMessages(MESSAGE_TRANSITION_TO_DELEGATING_STATE);
+ removePendingDelayedMessages();
clearDelayedMotionEvents();
}
+ private void removePendingDelayedMessages() {
+ mHandler.removeMessages(MESSAGE_ON_TRIPLE_TAP_AND_HOLD);
+ mHandler.removeMessages(MESSAGE_TRANSITION_TO_DELEGATING_STATE);
+ }
private void cacheDelayedMotionEvent(MotionEvent event, MotionEvent rawEvent,
int policyFlags) {
@@ -811,7 +822,7 @@ class MagnificationGestureHandler extends BaseEventStreamTransformation {
void transitionToDelegatingStateAndClear() {
transitionTo(mDelegatingState);
sendDelayedMotionEvents();
- clear();
+ removePendingDelayedMessages();
}
private void onTripleTap(MotionEvent up) {
@@ -860,6 +871,7 @@ class MagnificationGestureHandler extends BaseEventStreamTransformation {
if (mShortcutTriggered == state) {
return;
}
+ if (DEBUG_DETECTING) Slog.i(LOG_TAG, "setShortcutTriggered(" + state + ")");
mShortcutTriggered = state;
mMagnificationController.setForceShowMagnifiableBounds(state);
diff --git a/services/tests/servicestests/src/com/android/server/accessibility/MagnificationGestureHandlerTest.java b/services/tests/servicestests/src/com/android/server/accessibility/MagnificationGestureHandlerTest.java
index 8d5556eac447..07262e17c752 100644
--- a/services/tests/servicestests/src/com/android/server/accessibility/MagnificationGestureHandlerTest.java
+++ b/services/tests/servicestests/src/com/android/server/accessibility/MagnificationGestureHandlerTest.java
@@ -23,6 +23,8 @@ import static android.view.MotionEvent.ACTION_POINTER_UP;
import static com.android.server.testutils.TestUtils.strictMock;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyInt;
@@ -32,6 +34,7 @@ import static org.mockito.Mockito.verify;
import android.annotation.NonNull;
import android.content.Context;
+import android.os.Handler;
import android.os.Message;
import android.support.test.InstrumentationRegistry;
import android.support.test.runner.AndroidJUnit4;
@@ -46,7 +49,9 @@ import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
+import java.util.concurrent.CompletableFuture;
import java.util.function.IntConsumer;
+import java.util.function.Supplier;
/**
@@ -130,7 +135,7 @@ public class MagnificationGestureHandlerTest {
}
@NonNull
- public MagnificationGestureHandler newInstance(boolean detectTripleTap,
+ private MagnificationGestureHandler newInstance(boolean detectTripleTap,
boolean detectShortcutTrigger) {
MagnificationGestureHandler h = new MagnificationGestureHandler(
mContext, mMagnificationController,
@@ -192,6 +197,16 @@ public class MagnificationGestureHandlerTest {
});
}
+ @Test
+ public void testTransitionToDelegatingStateAndClear_preservesShortcutTriggeredState() {
+ mMgh.mDetectingState.transitionToDelegatingStateAndClear();
+ assertFalse(mMgh.mDetectingState.mShortcutTriggered);
+
+ goFromStateIdleTo(STATE_SHORTCUT_TRIGGERED);
+ mMgh.mDetectingState.transitionToDelegatingStateAndClear();
+ assertTrue(mMgh.mDetectingState.mShortcutTriggered);
+ }
+
/**
* Covers edges of the graph not covered by "canonical" transitions specified in
* {@link #goFromStateIdleTo} and {@link #returnToNormalFrom}
@@ -510,14 +525,20 @@ public class MagnificationGestureHandlerTest {
fastForward(1);
}
+ private static MotionEvent fromTouchscreen(MotionEvent ev) {
+ ev.setSource(InputDevice.SOURCE_TOUCHSCREEN);
+ return ev;
+ }
+
private MotionEvent moveEvent(float x, float y) {
- return MotionEvent.obtain(mLastDownTime, mClock.now(), ACTION_MOVE, x, y, 0);
+ return fromTouchscreen(
+ MotionEvent.obtain(mLastDownTime, mClock.now(), ACTION_MOVE, x, y, 0));
}
private MotionEvent downEvent() {
mLastDownTime = mClock.now();
- return MotionEvent.obtain(mLastDownTime, mLastDownTime,
- ACTION_DOWN, DEFAULT_X, DEFAULT_Y, 0);
+ return fromTouchscreen(MotionEvent.obtain(mLastDownTime, mLastDownTime,
+ ACTION_DOWN, DEFAULT_X, DEFAULT_Y, 0));
}
private MotionEvent upEvent() {
@@ -525,8 +546,8 @@ public class MagnificationGestureHandlerTest {
}
private MotionEvent upEvent(long downTime) {
- return MotionEvent.obtain(downTime, mClock.now(),
- MotionEvent.ACTION_UP, DEFAULT_X, DEFAULT_Y, 0);
+ return fromTouchscreen(MotionEvent.obtain(downTime, mClock.now(),
+ MotionEvent.ACTION_UP, DEFAULT_X, DEFAULT_Y, 0));
}
private MotionEvent pointerEvent(int action, float x, float y) {