summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/com/android/internal/accessibility/util/AccessibilityStatsLogUtils.java12
-rw-r--r--services/accessibility/java/com/android/server/accessibility/magnification/MagnificationGesturesObserver.java2
-rw-r--r--services/accessibility/java/com/android/server/accessibility/magnification/WindowMagnificationGestureHandler.java37
-rw-r--r--services/tests/servicestests/src/com/android/server/accessibility/magnification/WindowMagnificationGestureHandlerTest.java50
4 files changed, 93 insertions, 8 deletions
diff --git a/core/java/com/android/internal/accessibility/util/AccessibilityStatsLogUtils.java b/core/java/com/android/internal/accessibility/util/AccessibilityStatsLogUtils.java
index a611d65d6260..3c902396d9fe 100644
--- a/core/java/com/android/internal/accessibility/util/AccessibilityStatsLogUtils.java
+++ b/core/java/com/android/internal/accessibility/util/AccessibilityStatsLogUtils.java
@@ -168,6 +168,18 @@ public final class AccessibilityStatsLogUtils {
}
/**
+ * Logs the duration for the magnification session which is activated by the triple tap and
+ * hold gesture.
+ *
+ * @param duration The duration of a triple-tap-and-hold activation session.
+ */
+ public static void logMagnificationTripleTapAndHoldSession(long duration) {
+ FrameworkStatsLog.write(
+ FrameworkStatsLog.MAGNIFICATION_TRIPLE_TAP_AND_HOLD_ACTIVATED_SESSION_REPORTED,
+ duration);
+ }
+
+ /**
* Logs the warning status of the non-a11yTool service. Calls this when the warning status is
* changed.
*
diff --git a/services/accessibility/java/com/android/server/accessibility/magnification/MagnificationGesturesObserver.java b/services/accessibility/java/com/android/server/accessibility/magnification/MagnificationGesturesObserver.java
index 23cded771cae..35a1508317c9 100644
--- a/services/accessibility/java/com/android/server/accessibility/magnification/MagnificationGesturesObserver.java
+++ b/services/accessibility/java/com/android/server/accessibility/magnification/MagnificationGesturesObserver.java
@@ -193,6 +193,6 @@ class MagnificationGesturesObserver implements GesturesObserver.Listener {
@Override
public String toString() {
return "MagnificationGesturesObserver{"
- + ", mDelayedEventQueue=" + mDelayedEventQueue + '}';
+ + "mDelayedEventQueue=" + mDelayedEventQueue + '}';
}
}
diff --git a/services/accessibility/java/com/android/server/accessibility/magnification/WindowMagnificationGestureHandler.java b/services/accessibility/java/com/android/server/accessibility/magnification/WindowMagnificationGestureHandler.java
index 9ff51eecba1d..cf30a5acb030 100644
--- a/services/accessibility/java/com/android/server/accessibility/magnification/WindowMagnificationGestureHandler.java
+++ b/services/accessibility/java/com/android/server/accessibility/magnification/WindowMagnificationGestureHandler.java
@@ -28,12 +28,14 @@ import android.annotation.Nullable;
import android.annotation.UiContext;
import android.content.Context;
import android.graphics.Point;
+import android.os.SystemClock;
import android.provider.Settings;
import android.util.MathUtils;
import android.util.Slog;
import android.view.Display;
import android.view.MotionEvent;
+import com.android.internal.accessibility.util.AccessibilityStatsLogUtils;
import com.android.internal.annotations.VisibleForTesting;
import com.android.server.accessibility.AccessibilityTraceManager;
import com.android.server.accessibility.EventStreamTransformation;
@@ -91,6 +93,8 @@ public class WindowMagnificationGestureHandler extends MagnificationGestureHandl
private final Context mContext;
private final Point mTempPoint = new Point();
+ private long mTripleTapAndHoldStartedTime = 0;
+
public WindowMagnificationGestureHandler(@UiContext Context context,
WindowMagnificationManager windowMagnificationMgr,
AccessibilityTraceManager trace,
@@ -213,15 +217,39 @@ public class WindowMagnificationGestureHandler extends MagnificationGestureHandl
WindowMagnificationManager.WINDOW_POSITION_AT_CENTER);
}
- private void onTripleTapAndHold(MotionEvent up) {
+ @VisibleForTesting
+ void onTripleTapAndHold(MotionEvent up) {
if (DEBUG_DETECTING) {
Slog.i(mLogTag, "onTripleTapAndHold()");
}
enableWindowMagnifier(up.getX(), up.getY(),
WindowMagnificationManager.WINDOW_POSITION_AT_TOP_LEFT);
+ mTripleTapAndHoldStartedTime = SystemClock.uptimeMillis();
transitionTo(mViewportDraggingState);
}
+ @VisibleForTesting
+ void releaseTripleTapAndHold() {
+ mWindowMagnificationMgr.disableWindowMagnification(mDisplayId, true);
+ transitionTo(mDetectingState);
+ if (mTripleTapAndHoldStartedTime != 0) {
+ final long duration = SystemClock.uptimeMillis() - mTripleTapAndHoldStartedTime;
+ logMagnificationTripleTapAndHoldSession(duration);
+ mTripleTapAndHoldStartedTime = 0;
+ }
+ }
+
+ /**
+ * Logs the duration for the magnification session which is activated by the triple tap and
+ * hold gesture.
+ *
+ * @param duration The duration of a triple-tap-and-hold activation session.
+ */
+ @VisibleForTesting
+ void logMagnificationTripleTapAndHoldSession(long duration) {
+ AccessibilityStatsLogUtils.logMagnificationTripleTapAndHoldSession(duration);
+ }
+
void resetToDetectState() {
transitionTo(mDetectingState);
}
@@ -310,7 +338,7 @@ public class WindowMagnificationGestureHandler extends MagnificationGestureHandl
@Override
public String toString() {
return "PanningScalingState{"
- + "mPanningScalingHandler =" + mPanningScalingHandler + '}';
+ + "mPanningScalingHandler=" + mPanningScalingHandler + '}';
}
}
@@ -370,8 +398,7 @@ public class WindowMagnificationGestureHandler extends MagnificationGestureHandl
case ACTION_UP:
case ACTION_CANCEL: {
- mWindowMagnificationMgr.disableWindowMagnification(mDisplayId, true);
- transitionTo(mDetectingState);
+ releaseTripleTapAndHold();
}
break;
}
@@ -447,7 +474,7 @@ public class WindowMagnificationGestureHandler extends MagnificationGestureHandl
@Override
public String toString() {
return "DetectingState{"
- + ", mGestureTimeoutObserver =" + mGesturesObserver
+ + "mGestureTimeoutObserver=" + mGesturesObserver
+ '}';
}
diff --git a/services/tests/servicestests/src/com/android/server/accessibility/magnification/WindowMagnificationGestureHandlerTest.java b/services/tests/servicestests/src/com/android/server/accessibility/magnification/WindowMagnificationGestureHandlerTest.java
index e9f0bd9db9fe..8890070c5821 100644
--- a/services/tests/servicestests/src/com/android/server/accessibility/magnification/WindowMagnificationGestureHandlerTest.java
+++ b/services/tests/servicestests/src/com/android/server/accessibility/magnification/WindowMagnificationGestureHandlerTest.java
@@ -19,8 +19,12 @@ package com.android.server.accessibility.magnification;
import static com.android.server.testutils.TestUtils.strictMock;
import static org.junit.Assert.fail;
+import static org.mockito.ArgumentMatchers.anyLong;
import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import android.annotation.UiContext;
+import android.content.Context;
import android.graphics.PointF;
import android.graphics.Rect;
import android.os.RemoteException;
@@ -76,7 +80,8 @@ public class WindowMagnificationGestureHandlerTest {
private WindowMagnificationManager mWindowMagnificationManager;
private MockWindowMagnificationConnection mMockConnection;
- private WindowMagnificationGestureHandler mWindowMagnificationGestureHandler;
+ private SpyWindowMagnificationGestureHandler mWindowMagnificationGestureHandler;
+ private WindowMagnificationGestureHandler mMockWindowMagnificationGestureHandler;
@Mock
MagnificationGestureHandler.Callback mMockCallback;
@Mock
@@ -89,9 +94,11 @@ public class WindowMagnificationGestureHandlerTest {
mock(WindowMagnificationManager.Callback.class), mMockTrace,
new MagnificationScaleProvider(mContext));
mMockConnection = new MockWindowMagnificationConnection();
- mWindowMagnificationGestureHandler = new WindowMagnificationGestureHandler(
+ mWindowMagnificationGestureHandler = new SpyWindowMagnificationGestureHandler(
mContext, mWindowMagnificationManager, mMockTrace, mMockCallback,
/** detectTripleTap= */true, /** detectShortcutTrigger= */true, DISPLAY_0);
+ mMockWindowMagnificationGestureHandler =
+ mWindowMagnificationGestureHandler.getMockGestureHandler();
mWindowMagnificationManager.setConnection(mMockConnection.getConnection());
mWindowMagnificationGestureHandler.setNext(strictMock(EventStreamTransformation.class));
}
@@ -154,6 +161,18 @@ public class WindowMagnificationGestureHandlerTest {
});
}
+ @Test
+ public void testTripleTapAndHold_logSessionDuration() {
+ // perform triple tap on spy gesture handler
+ goFromStateIdleTo(STATE_SHOW_MAGNIFIER_TRIPLE_TAP_AND_HOLD);
+
+ // perform up event on spy gesture handler
+ returnToNormalFrom(STATE_SHOW_MAGNIFIER_TRIPLE_TAP_AND_HOLD);
+
+ verify(mMockWindowMagnificationGestureHandler)
+ .logMagnificationTripleTapAndHoldSession(anyLong());
+ }
+
private void forEachState(IntConsumer action) {
for (int state = FIRST_STATE; state <= LAST_STATE; state++) {
action.accept(state);
@@ -335,4 +354,31 @@ public class WindowMagnificationGestureHandlerTest {
private String stateDump() {
return "\nCurrent state dump:\n" + mWindowMagnificationGestureHandler.mCurrentState;
}
+
+ private static class SpyWindowMagnificationGestureHandler
+ extends WindowMagnificationGestureHandler {
+
+ private final WindowMagnificationGestureHandler mMockWindowMagnificationGestureHandler;
+
+ SpyWindowMagnificationGestureHandler(@UiContext Context context,
+ WindowMagnificationManager windowMagnificationMgr,
+ AccessibilityTraceManager trace,
+ Callback callback,
+ boolean detectTripleTap, boolean detectShortcutTrigger, int displayId) {
+ super(context, windowMagnificationMgr, trace, callback, detectTripleTap,
+ detectShortcutTrigger, displayId);
+ mMockWindowMagnificationGestureHandler = mock(WindowMagnificationGestureHandler.class);
+ }
+
+ WindowMagnificationGestureHandler getMockGestureHandler() {
+ return mMockWindowMagnificationGestureHandler;
+ }
+
+ @Override
+ void logMagnificationTripleTapAndHoldSession(long duration) {
+ super.logMagnificationTripleTapAndHoldSession(duration);
+ mMockWindowMagnificationGestureHandler
+ .logMagnificationTripleTapAndHoldSession(duration);
+ }
+ }
}