Loading core/java/com/android/internal/accessibility/util/AccessibilityStatsLogUtils.java +12 −0 Original line number Diff line number Diff line Loading @@ -178,6 +178,18 @@ public final class AccessibilityStatsLogUtils { duration); } /** * 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. Loading services/accessibility/java/com/android/server/accessibility/magnification/MagnificationGesturesObserver.java +1 −1 Original line number Diff line number Diff line Loading @@ -193,6 +193,6 @@ class MagnificationGesturesObserver implements GesturesObserver.Listener { @Override public String toString() { return "MagnificationGesturesObserver{" + ", mDelayedEventQueue=" + mDelayedEventQueue + '}'; + "mDelayedEventQueue=" + mDelayedEventQueue + '}'; } } services/accessibility/java/com/android/server/accessibility/magnification/WindowMagnificationGestureHandler.java +32 −5 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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, Loading Loading @@ -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); } Loading Loading @@ -370,8 +398,7 @@ public class WindowMagnificationGestureHandler extends MagnificationGestureHandl case ACTION_UP: case ACTION_CANCEL: { mWindowMagnificationMgr.disableWindowMagnification(mDisplayId, true); transitionTo(mDetectingState); releaseTripleTapAndHold(); } break; } Loading Loading @@ -447,7 +474,7 @@ public class WindowMagnificationGestureHandler extends MagnificationGestureHandl @Override public String toString() { return "DetectingState{" + ", mGestureTimeoutObserver =" + mGesturesObserver + "mGestureTimeoutObserver=" + mGesturesObserver + '}'; } Loading services/tests/servicestests/src/com/android/server/accessibility/magnification/WindowMagnificationGestureHandlerTest.java +48 −2 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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 Loading @@ -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)); } Loading Loading @@ -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); Loading Loading @@ -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); } } } Loading
core/java/com/android/internal/accessibility/util/AccessibilityStatsLogUtils.java +12 −0 Original line number Diff line number Diff line Loading @@ -178,6 +178,18 @@ public final class AccessibilityStatsLogUtils { duration); } /** * 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. Loading
services/accessibility/java/com/android/server/accessibility/magnification/MagnificationGesturesObserver.java +1 −1 Original line number Diff line number Diff line Loading @@ -193,6 +193,6 @@ class MagnificationGesturesObserver implements GesturesObserver.Listener { @Override public String toString() { return "MagnificationGesturesObserver{" + ", mDelayedEventQueue=" + mDelayedEventQueue + '}'; + "mDelayedEventQueue=" + mDelayedEventQueue + '}'; } }
services/accessibility/java/com/android/server/accessibility/magnification/WindowMagnificationGestureHandler.java +32 −5 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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, Loading Loading @@ -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); } Loading Loading @@ -370,8 +398,7 @@ public class WindowMagnificationGestureHandler extends MagnificationGestureHandl case ACTION_UP: case ACTION_CANCEL: { mWindowMagnificationMgr.disableWindowMagnification(mDisplayId, true); transitionTo(mDetectingState); releaseTripleTapAndHold(); } break; } Loading Loading @@ -447,7 +474,7 @@ public class WindowMagnificationGestureHandler extends MagnificationGestureHandl @Override public String toString() { return "DetectingState{" + ", mGestureTimeoutObserver =" + mGesturesObserver + "mGestureTimeoutObserver=" + mGesturesObserver + '}'; } Loading
services/tests/servicestests/src/com/android/server/accessibility/magnification/WindowMagnificationGestureHandlerTest.java +48 −2 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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 Loading @@ -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)); } Loading Loading @@ -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); Loading Loading @@ -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); } } }