summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--services/java/com/android/server/accessibility/ScreenMagnifier.java106
1 files changed, 46 insertions, 60 deletions
diff --git a/services/java/com/android/server/accessibility/ScreenMagnifier.java b/services/java/com/android/server/accessibility/ScreenMagnifier.java
index 62d410b..7aba667 100644
--- a/services/java/com/android/server/accessibility/ScreenMagnifier.java
+++ b/services/java/com/android/server/accessibility/ScreenMagnifier.java
@@ -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;
@@ -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);
@@ -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);
@@ -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;
@@ -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;
@@ -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);
}
@@ -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;
@@ -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;
- }
+ mPrevScaleFactor *= mCurrScaleFactor;
+ mCurrScale = Float.NaN;
+ mPrevPan += mCurrPan;
+ mPrevFocus.x = mInitialFocus.x = detector.getFocusX();
+ mPrevFocus.y = mInitialFocus.y = detector.getFocusY();
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;
@@ -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());
@@ -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;
@@ -513,7 +499,7 @@ public final class ScreenMagnifier implements EventStreamTransformation {
mScaleFocusY = detector.getFocusY();
}
mMagnificationController.setScale(normalizedNewScale, mScaleFocusX,
- mScaleFocusY, animate);
+ mScaleFocusY, false);
}
}
@@ -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) {
@@ -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();