From dbef1c5f4566708cab9b313f9a213413b697c87b Mon Sep 17 00:00:00 2001 From: George Mount Date: Wed, 28 Mar 2012 14:17:13 -0700 Subject: [PATCH] Support batching input changes to remove flicker. Bug 6245151 Change-Id: I642d1487d488ac69a9dedf5c8099d14db559dc0a --- core/java/android/webkit/WebViewClassic.java | 60 +++++++++++++++++--- core/java/android/webkit/WebViewCore.java | 8 +++ 2 files changed, 61 insertions(+), 7 deletions(-) diff --git a/core/java/android/webkit/WebViewClassic.java b/core/java/android/webkit/WebViewClassic.java index 7ddff8e1bd298..1c0aee81b9a55 100644 --- a/core/java/android/webkit/WebViewClassic.java +++ b/core/java/android/webkit/WebViewClassic.java @@ -386,6 +386,7 @@ public final class WebViewClassic implements WebViewProvider, WebViewProvider.Sc private boolean mIsAutoFillable; private boolean mIsAutoCompleteEnabled; private String mName; + private int mBatchLevel; public WebViewInputConnection() { super(mWebView, true); @@ -404,6 +405,24 @@ public final class WebViewClassic implements WebViewProvider, WebViewProvider.Sc } } + @Override + public boolean beginBatchEdit() { + if (mBatchLevel == 0) { + beginTextBatch(); + } + mBatchLevel++; + return false; + } + + @Override + public boolean endBatchEdit() { + mBatchLevel--; + if (mBatchLevel == 0) { + commitTextBatch(); + } + return false; + } + public boolean getIsAutoFillable() { return mIsAutoFillable; } @@ -879,6 +898,8 @@ public final class WebViewClassic implements WebViewProvider, WebViewProvider.Sc Rect mEditTextContent = new Rect(); int mEditTextLayerId; boolean mIsEditingText = false; + ArrayList mBatchedTextChanges = new ArrayList(); + boolean mIsBatchingTextChanges = false; private static class OnTrimMemoryListener implements ComponentCallbacks2 { private static OnTrimMemoryListener sInstance = null; @@ -5095,8 +5116,8 @@ public final class WebViewClassic implements WebViewProvider, WebViewProvider.Sc // send complex characters to webkit for use by JS and plugins if (keyCode == KeyEvent.KEYCODE_UNKNOWN && event.getCharacters() != null) { // pass the key to DOM - mWebViewCore.sendMessage(EventHub.KEY_DOWN, event); - mWebViewCore.sendMessage(EventHub.KEY_UP, event); + sendBatchableInputMessage(EventHub.KEY_DOWN, 0, 0, event); + sendBatchableInputMessage(EventHub.KEY_UP, 0, 0, event); // return true as DOM handles the key return true; } @@ -5162,7 +5183,7 @@ public final class WebViewClassic implements WebViewProvider, WebViewProvider.Sc // if an accessibility script is injected we delegate to it the key handling. // this script is a screen reader which is a fully fledged solution for blind // users to navigate in and interact with web pages. - mWebViewCore.sendMessage(EventHub.KEY_DOWN, event); + sendBatchableInputMessage(EventHub.KEY_DOWN, 0, 0, event); return true; } else { // Clean up if accessibility was disabled after loading the current URL. @@ -5289,7 +5310,7 @@ public final class WebViewClassic implements WebViewProvider, WebViewProvider.Sc // if an accessibility script is injected we delegate to it the key handling. // this script is a screen reader which is a fully fledged solution for blind // users to navigate in and interact with web pages. - mWebViewCore.sendMessage(EventHub.KEY_UP, event); + sendBatchableInputMessage(EventHub.KEY_UP, 0, 0, event); return true; } else { // Clean up if accessibility was disabled after loading the current URL. @@ -7543,7 +7564,7 @@ public final class WebViewClassic implements WebViewProvider, WebViewProvider.Sc arg.mNewEnd = newEnd; mTextGeneration++; arg.mTextGeneration = mTextGeneration; - mWebViewCore.sendMessage(EventHub.REPLACE_TEXT, oldStart, oldEnd, arg); + sendBatchableInputMessage(EventHub.REPLACE_TEXT, oldStart, oldEnd, arg); } /* package */ void passToJavaScript(String currentText, KeyEvent event) { @@ -8512,7 +8533,7 @@ public final class WebViewClassic implements WebViewProvider, WebViewProvider.Sc break; case KEY_PRESS: - mWebViewCore.sendMessage(EventHub.KEY_PRESS, msg.arg1); + sendBatchableInputMessage(EventHub.KEY_PRESS, msg.arg1, 0, null); break; case RELOCATE_AUTO_COMPLETE_POPUP: @@ -8898,6 +8919,31 @@ public final class WebViewClassic implements WebViewProvider, WebViewProvider.Sc TEXT_SCROLL_ANIMATION_DELAY_MS); } + private void beginTextBatch() { + mIsBatchingTextChanges = true; + } + + private void commitTextBatch() { + if (mWebViewCore != null) { + mWebViewCore.sendMessages(mBatchedTextChanges); + } + mBatchedTextChanges.clear(); + mIsBatchingTextChanges = false; + } + + private void sendBatchableInputMessage(int what, int arg1, int arg2, + Object obj) { + if (mWebViewCore == null) { + return; + } + Message message = Message.obtain(null, what, arg1, arg2, obj); + if (mIsBatchingTextChanges) { + mBatchedTextChanges.add(message); + } else { + mWebViewCore.sendMessage(message); + } + } + // Class used to use a dropdown for a