summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author John Reck <jreck@google.com> 2012-02-17 17:54:15 -0800
committer John Reck <jreck@google.com> 2012-02-21 10:04:54 -0800
commit37c4a9f99a32748682b56d501cbc03c4b3c5b3cf (patch)
tree27891517fbf9385aff4d43a960e42ad940507dfd
parentc71ac98405465b75e06e48dc63984d72f3c398b8 (diff)
Improved keyboard navigation cursor rings
Change-Id: I77b974bb9eae0f9dc8e57320632e5915e8295839
-rw-r--r--core/java/android/webkit/WebView.java139
-rw-r--r--core/java/android/webkit/WebViewCore.java1
2 files changed, 119 insertions, 21 deletions
diff --git a/core/java/android/webkit/WebView.java b/core/java/android/webkit/WebView.java
index e0f4f59c8a89..95629fe4664d 100644
--- a/core/java/android/webkit/WebView.java
+++ b/core/java/android/webkit/WebView.java
@@ -16,6 +16,7 @@
package android.webkit;
+import android.animation.ObjectAnimator;
import android.annotation.Widget;
import android.app.ActivityManager;
import android.app.AlertDialog;
@@ -36,6 +37,7 @@ import android.graphics.BitmapFactory;
import android.graphics.BitmapShader;
import android.graphics.Canvas;
import android.graphics.Color;
+import android.graphics.ColorFilter;
import android.graphics.DrawFilter;
import android.graphics.Paint;
import android.graphics.PaintFlagsDrawFilter;
@@ -4598,15 +4600,7 @@ public class WebView extends AbsoluteLayout
if (mTitleBar != null) {
canvas.translate(0, getTitleHeight());
}
- boolean drawJavaRings = !mTouchHighlightRegion.isEmpty()
- && (mTouchMode == TOUCH_INIT_MODE
- || mTouchMode == TOUCH_SHORTPRESS_START_MODE
- || mTouchMode == TOUCH_SHORTPRESS_MODE
- || mTouchMode == TOUCH_DONE_MODE);
- boolean drawNativeRings = !drawJavaRings;
- if (sDisableNavcache) {
- drawNativeRings = !drawJavaRings && !isInTouchMode();
- }
+ boolean drawNativeRings = !sDisableNavcache;
drawContent(canvas, drawNativeRings);
canvas.restoreToCount(saveCount);
@@ -4619,18 +4613,13 @@ public class WebView extends AbsoluteLayout
invalidate();
}
- // paint the highlight in the end
- if (drawJavaRings) {
- long delay = System.currentTimeMillis() - mTouchHighlightRequested;
- if (delay < ViewConfiguration.getTapTimeout()) {
- Rect r = mTouchHighlightRegion.getBounds();
- postInvalidateDelayed(delay, r.left, r.top, r.right, r.bottom);
- } else {
- RegionIterator iter = new RegionIterator(mTouchHighlightRegion);
- Rect r = new Rect();
- while (iter.next(r)) {
- canvas.drawRect(r, mTouchHightlightPaint);
- }
+ if (mFocusTransition != null) {
+ mFocusTransition.draw(canvas);
+ } else if (shouldDrawHighlightRect()) {
+ RegionIterator iter = new RegionIterator(mTouchHighlightRegion);
+ Rect r = new Rect();
+ while (iter.next(r)) {
+ canvas.drawRect(r, mTouchHightlightPaint);
}
}
if (DEBUG_TOUCH_HIGHLIGHT) {
@@ -9099,10 +9088,112 @@ public class WebView extends AbsoluteLayout
}
}
+ private boolean shouldDrawHighlightRect() {
+ if (mFocusedNode == null || mInitialHitTestResult == null) {
+ return false;
+ }
+ if (mTouchHighlightRegion.isEmpty()) {
+ return false;
+ }
+ if (mFocusedNode.mHasFocus) {
+ return !mFocusedNode.mEditable;
+ }
+ if (mInitialHitTestResult.mType == HitTestResult.UNKNOWN_TYPE) {
+ return false;
+ }
+ long delay = System.currentTimeMillis() - mTouchHighlightRequested;
+ if (delay < ViewConfiguration.getTapTimeout()) {
+ Rect r = mTouchHighlightRegion.getBounds();
+ postInvalidateDelayed(delay, r.left, r.top, r.right, r.bottom);
+ return false;
+ }
+ return true;
+ }
+
+
+ private FocusTransitionDrawable mFocusTransition = null;
+ static class FocusTransitionDrawable extends Drawable {
+ Region mPreviousRegion;
+ Region mNewRegion;
+ float mProgress = 0;
+ WebView mWebView;
+ Paint mPaint;
+ int mMaxAlpha;
+ Point mTranslate;
+
+ public FocusTransitionDrawable(WebView view) {
+ mWebView = view;
+ mPaint = new Paint(mWebView.mTouchHightlightPaint);
+ mMaxAlpha = mPaint.getAlpha();
+ }
+
+ @Override
+ public void setColorFilter(ColorFilter cf) {
+ }
+
+ @Override
+ public void setAlpha(int alpha) {
+ }
+
+ @Override
+ public int getOpacity() {
+ return 0;
+ }
+
+ public void setProgress(float p) {
+ mProgress = p;
+ if (mWebView.mFocusTransition == this) {
+ if (mProgress == 1f)
+ mWebView.mFocusTransition = null;
+ mWebView.invalidate();
+ }
+ }
+
+ public float getProgress() {
+ return mProgress;
+ }
+
+ @Override
+ public void draw(Canvas canvas) {
+ if (mTranslate == null) {
+ Rect bounds = mPreviousRegion.getBounds();
+ Point from = new Point(bounds.centerX(), bounds.centerY());
+ mNewRegion.getBounds(bounds);
+ Point to = new Point(bounds.centerX(), bounds.centerY());
+ mTranslate = new Point(from.x - to.x, from.y - to.y);
+ }
+ int alpha = (int) (mProgress * mMaxAlpha);
+ RegionIterator iter = new RegionIterator(mPreviousRegion);
+ Rect r = new Rect();
+ mPaint.setAlpha(mMaxAlpha - alpha);
+ float tx = mTranslate.x * mProgress;
+ float ty = mTranslate.y * mProgress;
+ int save = canvas.save(Canvas.MATRIX_SAVE_FLAG);
+ canvas.translate(-tx, -ty);
+ while (iter.next(r)) {
+ canvas.drawRect(r, mPaint);
+ }
+ canvas.restoreToCount(save);
+ iter = new RegionIterator(mNewRegion);
+ r = new Rect();
+ mPaint.setAlpha(alpha);
+ save = canvas.save(Canvas.MATRIX_SAVE_FLAG);
+ tx = mTranslate.x - tx;
+ ty = mTranslate.y - ty;
+ canvas.translate(tx, ty);
+ while (iter.next(r)) {
+ canvas.drawRect(r, mPaint);
+ }
+ canvas.restoreToCount(save);
+ }
+ };
+
private void setTouchHighlightRects(WebKitHitTest hit) {
+ FocusTransitionDrawable transition = new FocusTransitionDrawable(this);
Rect[] rects = hit != null ? hit.mTouchRects : null;
if (!mTouchHighlightRegion.isEmpty()) {
invalidate(mTouchHighlightRegion.getBounds());
+ transition.mPreviousRegion = new Region(mTouchHighlightRegion);
mTouchHighlightRegion.setEmpty();
}
if (rects != null) {
@@ -9121,7 +9212,13 @@ public class WebView extends AbsoluteLayout
+ viewRect);
}
}
+ transition.mNewRegion = new Region(mTouchHighlightRegion);
invalidate(mTouchHighlightRegion.getBounds());
+ if (hit.mHasFocus && transition.mPreviousRegion != null) {
+ mFocusTransition = transition;
+ ObjectAnimator animator = ObjectAnimator.ofFloat(mFocusTransition, "progress", 1f);
+ animator.start();
+ }
}
}
diff --git a/core/java/android/webkit/WebViewCore.java b/core/java/android/webkit/WebViewCore.java
index b6c5612c7e6d..2cc0c7ba4219 100644
--- a/core/java/android/webkit/WebViewCore.java
+++ b/core/java/android/webkit/WebViewCore.java
@@ -887,6 +887,7 @@ public final class WebViewCore {
boolean mEditable;
int mTapHighlightColor = WebView.HIGHLIGHT_COLOR;
Rect[] mEnclosingParentRects;
+ boolean mHasFocus;
// These are the input values that produced this hit test
int mHitTestX;