Loading core/java/android/webkit/WebView.java +118 −21 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package android.webkit; import android.animation.ObjectAnimator; import android.annotation.Widget; import android.app.ActivityManager; import android.app.AlertDialog; Loading @@ -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; Loading Loading @@ -4621,15 +4623,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); Loading @@ -4642,20 +4636,15 @@ 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 { 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) { if (getSettings().getNavDump()) { if ((mTouchHighlightX | mTouchHighlightY) != 0) { Loading Loading @@ -9123,10 +9112,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) { Loading @@ -9145,7 +9236,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(); } } } Loading core/java/android/webkit/WebViewCore.java +1 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading
core/java/android/webkit/WebView.java +118 −21 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package android.webkit; import android.animation.ObjectAnimator; import android.annotation.Widget; import android.app.ActivityManager; import android.app.AlertDialog; Loading @@ -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; Loading Loading @@ -4621,15 +4623,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); Loading @@ -4642,20 +4636,15 @@ 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 { 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) { if (getSettings().getNavDump()) { if ((mTouchHighlightX | mTouchHighlightY) != 0) { Loading Loading @@ -9123,10 +9112,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) { Loading @@ -9145,7 +9236,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(); } } } Loading
core/java/android/webkit/WebViewCore.java +1 −0 Original line number Diff line number Diff line Loading @@ -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; Loading