Loading services/java/com/android/server/accessibility/ScreenMagnifier.java +46 −60 Original line number Diff line number Diff line Loading @@ -114,17 +114,15 @@ public final class ScreenMagnifier implements EventStreamTransformation { private static final boolean DEBUG_VIEWPORT_WINDOW = false; private static final boolean DEBUG_WINDOW_TRANSITIONS = false; private static final boolean DEBUG_ROTATION = false; private static final boolean DEBUG_GESTURE_DETECTOR = false; private static final boolean DEBUG_SCALE_GESTURE_DETECTOR = false; private static final boolean DEBUG_MAGNIFICATION_CONTROLLER = false; private static final String LOG_TAG = ScreenMagnifier.class.getSimpleName(); private static final int STATE_DELEGATING = 1; private static final int STATE_DETECTING = 2; private static final int STATE_SCALING = 3; private static final int STATE_VIEWPORT_DRAGGING = 4; private static final int STATE_PANNING = 5; private static final int STATE_DECIDE_PAN_OR_SCALE = 6; private static final int STATE_MAGNIFIED_INTERACTION = 6; private static final float DEFAULT_MAGNIFICATION_SCALE = 2.0f; private static final int DEFAULT_SCREEN_MAGNIFICATION_AUTO_UPDATE = 1; Loading Loading @@ -203,12 +201,10 @@ public final class ScreenMagnifier implements EventStreamTransformation { case STATE_VIEWPORT_DRAGGING: { mStateViewportDraggingHandler.onMotionEvent(event, policyFlags); } break; case STATE_SCALING: case STATE_PANNING: case STATE_DECIDE_PAN_OR_SCALE: { case STATE_MAGNIFIED_INTERACTION: { // Handled by the gesture detector. Since the detector // needs all touch events to work properly we cannot // call it only for these states. // call it only for this state. } break; default: { throw new IllegalStateException("Unknown state: " + mCurrentState); Loading Loading @@ -326,14 +322,8 @@ public final class ScreenMagnifier implements EventStreamTransformation { case STATE_VIEWPORT_DRAGGING: { Slog.i(LOG_TAG, "mCurrentState: STATE_VIEWPORT_DRAGGING"); } break; case STATE_SCALING: { Slog.i(LOG_TAG, "mCurrentState: STATE_SCALING"); } break; case STATE_PANNING: { Slog.i(LOG_TAG, "mCurrentState: STATE_PANNING"); } break; case STATE_DECIDE_PAN_OR_SCALE: { Slog.i(LOG_TAG, "mCurrentState: STATE_DECIDE_PAN_OR_SCALE"); case STATE_MAGNIFIED_INTERACTION: { Slog.i(LOG_TAG, "mCurrentState: STATE_MAGNIFIED_INTERACTION"); } break; default: { throw new IllegalArgumentException("Unknown state: " + state); Loading @@ -347,7 +337,7 @@ public final class ScreenMagnifier implements EventStreamTransformation { private static final float MIN_SCALE = 1.3f; private static final float MAX_SCALE = 5.0f; private static final float DETECT_SCALING_THRESHOLD = 0.25f; private static final float DETECT_SCALING_THRESHOLD = 0.30f; private static final int DETECT_PANNING_THRESHOLD_DIP = 30; private final float mScaledDetectPanningThreshold; Loading @@ -366,6 +356,9 @@ public final class ScreenMagnifier implements EventStreamTransformation { private float mScaleFocusX = Float.NaN; private float mScaleFocusY = Float.NaN; private boolean mScaling; private boolean mPanning; public GestureDetector(Context context) { final float density = context.getResources().getDisplayMetrics().density; mScaledDetectPanningThreshold = DETECT_PANNING_THRESHOLD_DIP * density; Loading @@ -383,8 +376,9 @@ public final class ScreenMagnifier implements EventStreamTransformation { } if (event.getActionMasked() == MotionEvent.ACTION_UP) { clear(); if (mCurrentState == STATE_SCALING) { persistScale(mMagnificationController.getScale()); final float scale = mMagnificationController.getScale(); if (scale != getPersistedScale()) { persistScale(scale); } transitionToState(STATE_DETECTING); } Loading @@ -398,38 +392,36 @@ public final class ScreenMagnifier implements EventStreamTransformation { case STATE_VIEWPORT_DRAGGING: { return true; } case STATE_DECIDE_PAN_OR_SCALE: { case STATE_MAGNIFIED_INTERACTION: { mCurrScaleFactor = mScaleGestureDetector.getScaleFactor(); final float scaleDelta = Math.abs(1.0f - mCurrScaleFactor * mPrevScaleFactor); if (DEBUG_GESTURE_DETECTOR) { if (DEBUG_SCALE_GESTURE_DETECTOR) { Slog.i(LOG_TAG, "scaleDelta: " + scaleDelta); } if (scaleDelta > DETECT_SCALING_THRESHOLD) { performScale(detector, true); clear(); transitionToState(STATE_SCALING); if (!mScaling && scaleDelta > DETECT_SCALING_THRESHOLD) { mScaling = true; clearContextualState(); return true; } if (mScaling) { performScale(detector); } mCurrPan = (float) MathUtils.dist( mScaleGestureDetector.getFocusX(), mScaleGestureDetector.getFocusY(), mInitialFocus.x, mInitialFocus.y); final float panDelta = mCurrPan + mPrevPan; if (DEBUG_GESTURE_DETECTOR) { if (DEBUG_SCALE_GESTURE_DETECTOR) { Slog.i(LOG_TAG, "panDelta: " + panDelta); } if (panDelta > mScaledDetectPanningThreshold) { performPan(detector, true); clear(); transitionToState(STATE_PANNING); if (!mPanning && panDelta > mScaledDetectPanningThreshold) { mPanning = true; clearContextualState(); return true; } } break; case STATE_SCALING: { performScale(detector, false); } break; case STATE_PANNING: { performPan(detector, false); if (mPanning) { performPan(detector); } } break; } return false; Loading @@ -437,32 +429,26 @@ public final class ScreenMagnifier implements EventStreamTransformation { @Override public boolean onScaleBegin(ScaleGestureDetector detector) { switch (mCurrentState) { case STATE_DECIDE_PAN_OR_SCALE: { mPrevScaleFactor *= mCurrScaleFactor; mPrevPan += mCurrPan; mPrevFocus.x = mInitialFocus.x = detector.getFocusX(); mPrevFocus.y = mInitialFocus.y = detector.getFocusY(); } break; case STATE_SCALING: { mPrevScaleFactor = 1.0f; mCurrScale = Float.NaN; } break; case STATE_PANNING: { mPrevPan += mCurrPan; mPrevFocus.x = mInitialFocus.x = detector.getFocusX(); mPrevFocus.y = mInitialFocus.y = detector.getFocusY(); } break; } return true; } @Override public void onScaleEnd(ScaleGestureDetector detector) { clear(); clearContextualState(); } public void clear() { clearContextualState(); mScaling = false; mPanning = false; } private void clearContextualState() { mCurrScaleFactor = 1.0f; mPrevScaleFactor = 1.0f; mPrevPan = 0; Loading @@ -474,7 +460,7 @@ public final class ScreenMagnifier implements EventStreamTransformation { mScaleFocusY = Float.NaN; } private void performPan(ScaleGestureDetector detector, boolean animate) { private void performPan(ScaleGestureDetector detector) { if (Float.compare(mPrevFocus.x, Float.NaN) == 0 && Float.compare(mPrevFocus.y, Float.NaN) == 0) { mPrevFocus.set(detector.getFocusX(), detector.getFocusY()); Loading @@ -491,11 +477,11 @@ public final class ScreenMagnifier implements EventStreamTransformation { Slog.i(LOG_TAG, "Panned content by scrollX: " + scrollX + " scrollY: " + scrollY); } mMagnificationController.setMagnifiedRegionCenter(centerX, centerY, animate); mMagnificationController.setMagnifiedRegionCenter(centerX, centerY, false); mPrevFocus.set(detector.getFocusX(), detector.getFocusY()); } private void performScale(ScaleGestureDetector detector, boolean animate) { private void performScale(ScaleGestureDetector detector) { if (Float.compare(mCurrScale, Float.NaN) == 0) { mCurrScale = mMagnificationController.getScale(); return; Loading @@ -513,7 +499,7 @@ public final class ScreenMagnifier implements EventStreamTransformation { mScaleFocusY = detector.getFocusY(); } mMagnificationController.setScale(normalizedNewScale, mScaleFocusX, mScaleFocusY, animate); mScaleFocusY, false); } } Loading @@ -528,7 +514,7 @@ public final class ScreenMagnifier implements EventStreamTransformation { } case MotionEvent.ACTION_POINTER_DOWN: { clear(); transitionToState(STATE_SCALING); transitionToState(STATE_MAGNIFIED_INTERACTION); } break; case MotionEvent.ACTION_MOVE: { if (event.getPointerCount() != 1) { Loading Loading @@ -632,7 +618,7 @@ public final class ScreenMagnifier implements EventStreamTransformation { } break; case MotionEvent.ACTION_POINTER_DOWN: { if (mMagnificationController.isMagnifying()) { transitionToState(STATE_DECIDE_PAN_OR_SCALE); transitionToState(STATE_MAGNIFIED_INTERACTION); clear(); } else { transitionToDelegatingStateAndClear(); Loading Loading
services/java/com/android/server/accessibility/ScreenMagnifier.java +46 −60 Original line number Diff line number Diff line Loading @@ -114,17 +114,15 @@ public final class ScreenMagnifier implements EventStreamTransformation { private static final boolean DEBUG_VIEWPORT_WINDOW = false; private static final boolean DEBUG_WINDOW_TRANSITIONS = false; private static final boolean DEBUG_ROTATION = false; private static final boolean DEBUG_GESTURE_DETECTOR = false; private static final boolean DEBUG_SCALE_GESTURE_DETECTOR = false; private static final boolean DEBUG_MAGNIFICATION_CONTROLLER = false; private static final String LOG_TAG = ScreenMagnifier.class.getSimpleName(); private static final int STATE_DELEGATING = 1; private static final int STATE_DETECTING = 2; private static final int STATE_SCALING = 3; private static final int STATE_VIEWPORT_DRAGGING = 4; private static final int STATE_PANNING = 5; private static final int STATE_DECIDE_PAN_OR_SCALE = 6; private static final int STATE_MAGNIFIED_INTERACTION = 6; private static final float DEFAULT_MAGNIFICATION_SCALE = 2.0f; private static final int DEFAULT_SCREEN_MAGNIFICATION_AUTO_UPDATE = 1; Loading Loading @@ -203,12 +201,10 @@ public final class ScreenMagnifier implements EventStreamTransformation { case STATE_VIEWPORT_DRAGGING: { mStateViewportDraggingHandler.onMotionEvent(event, policyFlags); } break; case STATE_SCALING: case STATE_PANNING: case STATE_DECIDE_PAN_OR_SCALE: { case STATE_MAGNIFIED_INTERACTION: { // Handled by the gesture detector. Since the detector // needs all touch events to work properly we cannot // call it only for these states. // call it only for this state. } break; default: { throw new IllegalStateException("Unknown state: " + mCurrentState); Loading Loading @@ -326,14 +322,8 @@ public final class ScreenMagnifier implements EventStreamTransformation { case STATE_VIEWPORT_DRAGGING: { Slog.i(LOG_TAG, "mCurrentState: STATE_VIEWPORT_DRAGGING"); } break; case STATE_SCALING: { Slog.i(LOG_TAG, "mCurrentState: STATE_SCALING"); } break; case STATE_PANNING: { Slog.i(LOG_TAG, "mCurrentState: STATE_PANNING"); } break; case STATE_DECIDE_PAN_OR_SCALE: { Slog.i(LOG_TAG, "mCurrentState: STATE_DECIDE_PAN_OR_SCALE"); case STATE_MAGNIFIED_INTERACTION: { Slog.i(LOG_TAG, "mCurrentState: STATE_MAGNIFIED_INTERACTION"); } break; default: { throw new IllegalArgumentException("Unknown state: " + state); Loading @@ -347,7 +337,7 @@ public final class ScreenMagnifier implements EventStreamTransformation { private static final float MIN_SCALE = 1.3f; private static final float MAX_SCALE = 5.0f; private static final float DETECT_SCALING_THRESHOLD = 0.25f; private static final float DETECT_SCALING_THRESHOLD = 0.30f; private static final int DETECT_PANNING_THRESHOLD_DIP = 30; private final float mScaledDetectPanningThreshold; Loading @@ -366,6 +356,9 @@ public final class ScreenMagnifier implements EventStreamTransformation { private float mScaleFocusX = Float.NaN; private float mScaleFocusY = Float.NaN; private boolean mScaling; private boolean mPanning; public GestureDetector(Context context) { final float density = context.getResources().getDisplayMetrics().density; mScaledDetectPanningThreshold = DETECT_PANNING_THRESHOLD_DIP * density; Loading @@ -383,8 +376,9 @@ public final class ScreenMagnifier implements EventStreamTransformation { } if (event.getActionMasked() == MotionEvent.ACTION_UP) { clear(); if (mCurrentState == STATE_SCALING) { persistScale(mMagnificationController.getScale()); final float scale = mMagnificationController.getScale(); if (scale != getPersistedScale()) { persistScale(scale); } transitionToState(STATE_DETECTING); } Loading @@ -398,38 +392,36 @@ public final class ScreenMagnifier implements EventStreamTransformation { case STATE_VIEWPORT_DRAGGING: { return true; } case STATE_DECIDE_PAN_OR_SCALE: { case STATE_MAGNIFIED_INTERACTION: { mCurrScaleFactor = mScaleGestureDetector.getScaleFactor(); final float scaleDelta = Math.abs(1.0f - mCurrScaleFactor * mPrevScaleFactor); if (DEBUG_GESTURE_DETECTOR) { if (DEBUG_SCALE_GESTURE_DETECTOR) { Slog.i(LOG_TAG, "scaleDelta: " + scaleDelta); } if (scaleDelta > DETECT_SCALING_THRESHOLD) { performScale(detector, true); clear(); transitionToState(STATE_SCALING); if (!mScaling && scaleDelta > DETECT_SCALING_THRESHOLD) { mScaling = true; clearContextualState(); return true; } if (mScaling) { performScale(detector); } mCurrPan = (float) MathUtils.dist( mScaleGestureDetector.getFocusX(), mScaleGestureDetector.getFocusY(), mInitialFocus.x, mInitialFocus.y); final float panDelta = mCurrPan + mPrevPan; if (DEBUG_GESTURE_DETECTOR) { if (DEBUG_SCALE_GESTURE_DETECTOR) { Slog.i(LOG_TAG, "panDelta: " + panDelta); } if (panDelta > mScaledDetectPanningThreshold) { performPan(detector, true); clear(); transitionToState(STATE_PANNING); if (!mPanning && panDelta > mScaledDetectPanningThreshold) { mPanning = true; clearContextualState(); return true; } } break; case STATE_SCALING: { performScale(detector, false); } break; case STATE_PANNING: { performPan(detector, false); if (mPanning) { performPan(detector); } } break; } return false; Loading @@ -437,32 +429,26 @@ public final class ScreenMagnifier implements EventStreamTransformation { @Override public boolean onScaleBegin(ScaleGestureDetector detector) { switch (mCurrentState) { case STATE_DECIDE_PAN_OR_SCALE: { mPrevScaleFactor *= mCurrScaleFactor; mPrevPan += mCurrPan; mPrevFocus.x = mInitialFocus.x = detector.getFocusX(); mPrevFocus.y = mInitialFocus.y = detector.getFocusY(); } break; case STATE_SCALING: { mPrevScaleFactor = 1.0f; mCurrScale = Float.NaN; } break; case STATE_PANNING: { mPrevPan += mCurrPan; mPrevFocus.x = mInitialFocus.x = detector.getFocusX(); mPrevFocus.y = mInitialFocus.y = detector.getFocusY(); } break; } return true; } @Override public void onScaleEnd(ScaleGestureDetector detector) { clear(); clearContextualState(); } public void clear() { clearContextualState(); mScaling = false; mPanning = false; } private void clearContextualState() { mCurrScaleFactor = 1.0f; mPrevScaleFactor = 1.0f; mPrevPan = 0; Loading @@ -474,7 +460,7 @@ public final class ScreenMagnifier implements EventStreamTransformation { mScaleFocusY = Float.NaN; } private void performPan(ScaleGestureDetector detector, boolean animate) { private void performPan(ScaleGestureDetector detector) { if (Float.compare(mPrevFocus.x, Float.NaN) == 0 && Float.compare(mPrevFocus.y, Float.NaN) == 0) { mPrevFocus.set(detector.getFocusX(), detector.getFocusY()); Loading @@ -491,11 +477,11 @@ public final class ScreenMagnifier implements EventStreamTransformation { Slog.i(LOG_TAG, "Panned content by scrollX: " + scrollX + " scrollY: " + scrollY); } mMagnificationController.setMagnifiedRegionCenter(centerX, centerY, animate); mMagnificationController.setMagnifiedRegionCenter(centerX, centerY, false); mPrevFocus.set(detector.getFocusX(), detector.getFocusY()); } private void performScale(ScaleGestureDetector detector, boolean animate) { private void performScale(ScaleGestureDetector detector) { if (Float.compare(mCurrScale, Float.NaN) == 0) { mCurrScale = mMagnificationController.getScale(); return; Loading @@ -513,7 +499,7 @@ public final class ScreenMagnifier implements EventStreamTransformation { mScaleFocusY = detector.getFocusY(); } mMagnificationController.setScale(normalizedNewScale, mScaleFocusX, mScaleFocusY, animate); mScaleFocusY, false); } } Loading @@ -528,7 +514,7 @@ public final class ScreenMagnifier implements EventStreamTransformation { } case MotionEvent.ACTION_POINTER_DOWN: { clear(); transitionToState(STATE_SCALING); transitionToState(STATE_MAGNIFIED_INTERACTION); } break; case MotionEvent.ACTION_MOVE: { if (event.getPointerCount() != 1) { Loading Loading @@ -632,7 +618,7 @@ public final class ScreenMagnifier implements EventStreamTransformation { } break; case MotionEvent.ACTION_POINTER_DOWN: { if (mMagnificationController.isMagnifying()) { transitionToState(STATE_DECIDE_PAN_OR_SCALE); transitionToState(STATE_MAGNIFIED_INTERACTION); clear(); } else { transitionToDelegatingStateAndClear(); Loading