Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ea8c0b4d authored by Daniel Hsieh's avatar Daniel Hsieh
Browse files

Logs the activated session duration for magnification. (1/2)

Uses the atom MagnificationTripleTapAndHoldActivatedSessionReported in
westworld to log the activated session duration for the window magnifier
which is triggered by the triple-tap-and-hold gesture.

The duration is from the window magnifier's enabled time to its disabled
time.

Bug: 216733714
Test: atest WindowMagnificationGestureHandlerTest
      m statsd_testdrive & statsd_testdrive 452
Change-Id: I423ac39c167c89b0b2db931a616cdd34d6eb151c
parent 46f1dd65
Loading
Loading
Loading
Loading
+12 −0
Original line number Diff line number Diff line
@@ -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.
+1 −1
Original line number Diff line number Diff line
@@ -193,6 +193,6 @@ class MagnificationGesturesObserver implements GesturesObserver.Listener {
    @Override
    public String toString() {
        return "MagnificationGesturesObserver{"
                + ", mDelayedEventQueue=" + mDelayedEventQueue + '}';
                + "mDelayedEventQueue=" + mDelayedEventQueue + '}';
    }
}
+32 −5
Original line number Diff line number Diff line
@@ -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);
    }
@@ -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
                    + '}';
        }

+48 −2
Original line number Diff line number Diff line
@@ -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);
        }
    }
}