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

Commit 9602145f authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

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

parents 35a0a5e0 ea8c0b4d
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);
        }
    }
}