Merge "Logs the activated session duration for magnification. (1/2)" into tm-qpr-dev

This commit is contained in:
TreeHugger Robot
2022-08-19 00:32:18 +00:00
committed by Android (Google) Code Review
4 changed files with 93 additions and 8 deletions

View File

@@ -167,6 +167,18 @@ public final class AccessibilityStatsLogUtils {
convertToLoggingMagnificationMode(mode)); convertToLoggingMagnificationMode(mode));
} }
/**
* 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 * Logs the warning status of the non-a11yTool service. Calls this when the warning status is
* changed. * changed.

View File

@@ -193,6 +193,6 @@ class MagnificationGesturesObserver implements GesturesObserver.Listener {
@Override @Override
public String toString() { public String toString() {
return "MagnificationGesturesObserver{" return "MagnificationGesturesObserver{"
+ ", mDelayedEventQueue=" + mDelayedEventQueue + '}'; + "mDelayedEventQueue=" + mDelayedEventQueue + '}';
} }
} }

View File

@@ -28,12 +28,14 @@ import android.annotation.Nullable;
import android.annotation.UiContext; import android.annotation.UiContext;
import android.content.Context; import android.content.Context;
import android.graphics.Point; import android.graphics.Point;
import android.os.SystemClock;
import android.provider.Settings; import android.provider.Settings;
import android.util.MathUtils; import android.util.MathUtils;
import android.util.Slog; import android.util.Slog;
import android.view.Display; import android.view.Display;
import android.view.MotionEvent; import android.view.MotionEvent;
import com.android.internal.accessibility.util.AccessibilityStatsLogUtils;
import com.android.internal.annotations.VisibleForTesting; import com.android.internal.annotations.VisibleForTesting;
import com.android.server.accessibility.AccessibilityTraceManager; import com.android.server.accessibility.AccessibilityTraceManager;
import com.android.server.accessibility.EventStreamTransformation; import com.android.server.accessibility.EventStreamTransformation;
@@ -91,6 +93,8 @@ public class WindowMagnificationGestureHandler extends MagnificationGestureHandl
private final Context mContext; private final Context mContext;
private final Point mTempPoint = new Point(); private final Point mTempPoint = new Point();
private long mTripleTapAndHoldStartedTime = 0;
public WindowMagnificationGestureHandler(@UiContext Context context, public WindowMagnificationGestureHandler(@UiContext Context context,
WindowMagnificationManager windowMagnificationMgr, WindowMagnificationManager windowMagnificationMgr,
AccessibilityTraceManager trace, AccessibilityTraceManager trace,
@@ -213,15 +217,39 @@ public class WindowMagnificationGestureHandler extends MagnificationGestureHandl
WindowMagnificationManager.WINDOW_POSITION_AT_CENTER); WindowMagnificationManager.WINDOW_POSITION_AT_CENTER);
} }
private void onTripleTapAndHold(MotionEvent up) { @VisibleForTesting
void onTripleTapAndHold(MotionEvent up) {
if (DEBUG_DETECTING) { if (DEBUG_DETECTING) {
Slog.i(mLogTag, "onTripleTapAndHold()"); Slog.i(mLogTag, "onTripleTapAndHold()");
} }
enableWindowMagnifier(up.getX(), up.getY(), enableWindowMagnifier(up.getX(), up.getY(),
WindowMagnificationManager.WINDOW_POSITION_AT_TOP_LEFT); WindowMagnificationManager.WINDOW_POSITION_AT_TOP_LEFT);
mTripleTapAndHoldStartedTime = SystemClock.uptimeMillis();
transitionTo(mViewportDraggingState); 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() { void resetToDetectState() {
transitionTo(mDetectingState); transitionTo(mDetectingState);
} }
@@ -370,8 +398,7 @@ public class WindowMagnificationGestureHandler extends MagnificationGestureHandl
case ACTION_UP: case ACTION_UP:
case ACTION_CANCEL: { case ACTION_CANCEL: {
mWindowMagnificationMgr.disableWindowMagnification(mDisplayId, true); releaseTripleTapAndHold();
transitionTo(mDetectingState);
} }
break; break;
} }
@@ -447,7 +474,7 @@ public class WindowMagnificationGestureHandler extends MagnificationGestureHandl
@Override @Override
public String toString() { public String toString() {
return "DetectingState{" return "DetectingState{"
+ ", mGestureTimeoutObserver =" + mGesturesObserver + "mGestureTimeoutObserver=" + mGesturesObserver
+ '}'; + '}';
} }

View File

@@ -19,8 +19,12 @@ package com.android.server.accessibility.magnification;
import static com.android.server.testutils.TestUtils.strictMock; import static com.android.server.testutils.TestUtils.strictMock;
import static org.junit.Assert.fail; import static org.junit.Assert.fail;
import static org.mockito.ArgumentMatchers.anyLong;
import static org.mockito.Mockito.mock; 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.PointF;
import android.graphics.Rect; import android.graphics.Rect;
import android.os.RemoteException; import android.os.RemoteException;
@@ -76,7 +80,8 @@ public class WindowMagnificationGestureHandlerTest {
private WindowMagnificationManager mWindowMagnificationManager; private WindowMagnificationManager mWindowMagnificationManager;
private MockWindowMagnificationConnection mMockConnection; private MockWindowMagnificationConnection mMockConnection;
private WindowMagnificationGestureHandler mWindowMagnificationGestureHandler; private SpyWindowMagnificationGestureHandler mWindowMagnificationGestureHandler;
private WindowMagnificationGestureHandler mMockWindowMagnificationGestureHandler;
@Mock @Mock
MagnificationGestureHandler.Callback mMockCallback; MagnificationGestureHandler.Callback mMockCallback;
@Mock @Mock
@@ -89,9 +94,11 @@ public class WindowMagnificationGestureHandlerTest {
mock(WindowMagnificationManager.Callback.class), mMockTrace, mock(WindowMagnificationManager.Callback.class), mMockTrace,
new MagnificationScaleProvider(mContext)); new MagnificationScaleProvider(mContext));
mMockConnection = new MockWindowMagnificationConnection(); mMockConnection = new MockWindowMagnificationConnection();
mWindowMagnificationGestureHandler = new WindowMagnificationGestureHandler( mWindowMagnificationGestureHandler = new SpyWindowMagnificationGestureHandler(
mContext, mWindowMagnificationManager, mMockTrace, mMockCallback, mContext, mWindowMagnificationManager, mMockTrace, mMockCallback,
/** detectTripleTap= */true, /** detectShortcutTrigger= */true, DISPLAY_0); /** detectTripleTap= */true, /** detectShortcutTrigger= */true, DISPLAY_0);
mMockWindowMagnificationGestureHandler =
mWindowMagnificationGestureHandler.getMockGestureHandler();
mWindowMagnificationManager.setConnection(mMockConnection.getConnection()); mWindowMagnificationManager.setConnection(mMockConnection.getConnection());
mWindowMagnificationGestureHandler.setNext(strictMock(EventStreamTransformation.class)); 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) { private void forEachState(IntConsumer action) {
for (int state = FIRST_STATE; state <= LAST_STATE; state++) { for (int state = FIRST_STATE; state <= LAST_STATE; state++) {
action.accept(state); action.accept(state);
@@ -335,4 +354,31 @@ public class WindowMagnificationGestureHandlerTest {
private String stateDump() { private String stateDump() {
return "\nCurrent state dump:\n" + mWindowMagnificationGestureHandler.mCurrentState; 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);
}
}
} }