diff options
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); + } + } } |