Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 package org.chromium.content.browser; | 5 package org.chromium.content.browser; |
| 6 | 6 |
| 7 import android.content.Context; | 7 import android.content.Context; |
| 8 import android.os.Handler; | 8 import android.os.Handler; |
| 9 import android.os.ResultReceiver; | 9 import android.os.ResultReceiver; |
| 10 import android.text.Editable; | 10 import android.text.Editable; |
| (...skipping 477 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 488 public static class AdapterInputConnection extends BaseInputConnection { | 488 public static class AdapterInputConnection extends BaseInputConnection { |
| 489 private static final String TAG = | 489 private static final String TAG = |
| 490 "org.chromium.content.browser.ImeAdapter$AdapterInputConnection" ; | 490 "org.chromium.content.browser.ImeAdapter$AdapterInputConnection" ; |
| 491 private static final boolean DEBUG = false; | 491 private static final boolean DEBUG = false; |
| 492 private final View mInternalView; | 492 private final View mInternalView; |
| 493 private final ImeAdapter mImeAdapter; | 493 private final ImeAdapter mImeAdapter; |
| 494 | 494 |
| 495 private boolean mSingleLine; | 495 private boolean mSingleLine; |
| 496 private int mNumNestedBatchEdits = 0; | 496 private int mNumNestedBatchEdits = 0; |
| 497 private boolean mIgnoreTextInputStateUpdates = false; | 497 private boolean mIgnoreTextInputStateUpdates = false; |
| 498 private boolean mPendingUpdate = false; | |
| 498 | 499 |
| 499 private int mLastUpdateSelectionStart = INVALID_SELECTION; | 500 private int mLastUpdateSelectionStart = INVALID_SELECTION; |
| 500 private int mLastUpdateSelectionEnd = INVALID_SELECTION; | 501 private int mLastUpdateSelectionEnd = INVALID_SELECTION; |
| 501 private int mLastUpdateCompositionStart = INVALID_COMPOSITION; | 502 private int mLastUpdateCompositionStart = INVALID_COMPOSITION; |
| 502 private int mLastUpdateCompositionEnd = INVALID_COMPOSITION; | 503 private int mLastUpdateCompositionEnd = INVALID_COMPOSITION; |
| 503 | 504 |
| 504 /** | 505 /** |
| 505 * Updates the AdapterInputConnection's internal representation of the t ext | 506 * Updates the AdapterInputConnection's internal representation of the t ext |
| 506 * being edited and its selection and composition properties. The result ing | 507 * being edited and its selection and composition properties. The result ing |
| 507 * Editable is accessible through the getEditable() method. | 508 * Editable is accessible through the getEditable() method. |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 541 editable.replace(0, editable.length(), text); | 542 editable.replace(0, editable.length(), text); |
| 542 } | 543 } |
| 543 | 544 |
| 544 if (prevSelectionStart == selectionStart && prevSelectionEnd == sele ctionEnd | 545 if (prevSelectionStart == selectionStart && prevSelectionEnd == sele ctionEnd |
| 545 && prevCompositionStart == compositionStart | 546 && prevCompositionStart == compositionStart |
| 546 && prevCompositionEnd == compositionEnd) { | 547 && prevCompositionEnd == compositionEnd) { |
| 547 // Nothing has changed; don't need to do anything | 548 // Nothing has changed; don't need to do anything |
| 548 return; | 549 return; |
| 549 } | 550 } |
| 550 | 551 |
| 551 Selection.setSelection(editable, selectionStart, selectionEnd); | 552 if (prevSelectionStart != selectionStart || prevSelectionEnd != sele ctionEnd) { |
| 552 super.setComposingRegion(compositionStart, compositionEnd); | 553 Selection.setSelection(editable, selectionStart, selectionEnd); |
| 554 } | |
| 553 | 555 |
| 554 if (mIgnoreTextInputStateUpdates) return; | 556 if (prevCompositionStart != compositionStart || prevCompositionEnd ! = compositionEnd) { |
| 557 if (compositionStart == compositionEnd) { | |
| 558 removeComposingSpans(getEditable()); | |
| 559 } else { | |
| 560 super.setComposingRegion(compositionStart, compositionEnd); | |
| 561 } | |
| 562 } | |
| 563 | |
| 564 if (mIgnoreTextInputStateUpdates) { | |
| 565 mPendingUpdate = true; | |
| 566 return; | |
| 567 } | |
| 555 updateSelection(selectionStart, selectionEnd, compositionStart, comp ositionEnd); | 568 updateSelection(selectionStart, selectionEnd, compositionStart, comp ositionEnd); |
| 556 } | 569 } |
| 557 | 570 |
| 558 @VisibleForTesting | 571 @VisibleForTesting |
| 559 protected void updateSelection( | 572 protected void updateSelection( |
| 560 int selectionStart, int selectionEnd, | 573 int selectionStart, int selectionEnd, |
| 561 int compositionStart, int compositionEnd) { | 574 int compositionStart, int compositionEnd) { |
| 575 mPendingUpdate = false; | |
|
aurimas (slooooooooow)
2013/04/09 17:09:26
Can you explain this PendingUpdate flag and why we
| |
| 562 // Avoid sending update if we sent an exact update already previousl y. | 576 // Avoid sending update if we sent an exact update already previousl y. |
| 563 if (mLastUpdateSelectionStart == selectionStart && | 577 if (mLastUpdateSelectionStart == selectionStart && |
| 564 mLastUpdateSelectionEnd == selectionEnd && | 578 mLastUpdateSelectionEnd == selectionEnd && |
| 565 mLastUpdateCompositionStart == compositionStart && | 579 mLastUpdateCompositionStart == compositionStart && |
| 566 mLastUpdateCompositionEnd == compositionEnd) { | 580 mLastUpdateCompositionEnd == compositionEnd) { |
| 567 return; | 581 return; |
| 568 } | 582 } |
| 569 if (DEBUG) { | 583 if (DEBUG) { |
| 570 Log.w(TAG, "updateSelection [" + selectionStart + " " + selectio nEnd + "] [" | 584 Log.w(TAG, "updateSelection [" + selectionStart + " " + selectio nEnd + "] [" |
| 571 + compositionStart + " " + compositionEnd + "]"); | 585 + compositionStart + " " + compositionEnd + "]"); |
| (...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 727 } | 741 } |
| 728 | 742 |
| 729 /** | 743 /** |
| 730 * Informs the InputMethodManager and InputMethodSession (i.e. the IME) that the text | 744 * Informs the InputMethodManager and InputMethodSession (i.e. the IME) that the text |
| 731 * state is no longer what the IME has and that it needs to be updated. | 745 * state is no longer what the IME has and that it needs to be updated. |
| 732 */ | 746 */ |
| 733 void restartInput() { | 747 void restartInput() { |
| 734 if (DEBUG) Log.w(TAG, "restartInput"); | 748 if (DEBUG) Log.w(TAG, "restartInput"); |
| 735 getInputMethodManagerWrapper().restartInput(mInternalView); | 749 getInputMethodManagerWrapper().restartInput(mInternalView); |
| 736 mIgnoreTextInputStateUpdates = false; | 750 mIgnoreTextInputStateUpdates = false; |
| 751 mPendingUpdate = false; | |
| 737 mNumNestedBatchEdits = 0; | 752 mNumNestedBatchEdits = 0; |
| 738 } | 753 } |
| 739 | 754 |
| 740 @Override | 755 @Override |
| 741 public boolean setComposingRegion(int start, int end) { | 756 public boolean setComposingRegion(int start, int end) { |
| 742 if (DEBUG) Log.w(TAG, "setComposingRegion [" + start + " " + end + " ]"); | 757 if (DEBUG) Log.w(TAG, "setComposingRegion [" + start + " " + end + " ]"); |
| 743 int a = Math.min(start, end); | 758 int a = Math.min(start, end); |
| 744 int b = Math.max(start, end); | 759 int b = Math.max(start, end); |
| 745 super.setComposingRegion(a, b); | 760 if (a == b) { |
| 761 removeComposingSpans(getEditable()); | |
| 762 } else { | |
| 763 super.setComposingRegion(a, b); | |
| 764 } | |
| 746 return mImeAdapter.setComposingRegion(a, b); | 765 return mImeAdapter.setComposingRegion(a, b); |
| 747 } | 766 } |
| 748 | 767 |
| 749 boolean isActive() { | 768 boolean isActive() { |
| 750 return getInputMethodManagerWrapper().isActive(mInternalView); | 769 return getInputMethodManagerWrapper().isActive(mInternalView); |
| 751 } | 770 } |
| 752 | 771 |
| 753 void setIgnoreTextInputStateUpdates(boolean shouldIgnore) { | 772 void setIgnoreTextInputStateUpdates(boolean shouldIgnore) { |
| 754 mIgnoreTextInputStateUpdates = shouldIgnore; | 773 mIgnoreTextInputStateUpdates = shouldIgnore; |
| 755 if (shouldIgnore) return; | 774 if (shouldIgnore || !mPendingUpdate) return; |
| 756 | 775 |
| 757 Editable editable = getEditable(); | 776 Editable editable = getEditable(); |
| 758 updateSelection(Selection.getSelectionStart(editable), | 777 updateSelection(Selection.getSelectionStart(editable), |
| 759 Selection.getSelectionEnd(editable), | 778 Selection.getSelectionEnd(editable), |
| 760 getComposingSpanStart(editable), | 779 getComposingSpanStart(editable), |
| 761 getComposingSpanEnd(editable)); | 780 getComposingSpanEnd(editable)); |
| 762 } | 781 } |
| 763 | 782 |
| 764 @VisibleForTesting | 783 @VisibleForTesting |
| 765 protected boolean isIgnoringTextInputStateUpdates() { | 784 protected boolean isIgnoringTextInputStateUpdates() { |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 849 int before, int after); | 868 int before, int after); |
| 850 | 869 |
| 851 private native void nativeImeBatchStateChanged(int nativeImeAdapterAndroid, boolean isBegin); | 870 private native void nativeImeBatchStateChanged(int nativeImeAdapterAndroid, boolean isBegin); |
| 852 | 871 |
| 853 private native void nativeUnselect(int nativeImeAdapterAndroid); | 872 private native void nativeUnselect(int nativeImeAdapterAndroid); |
| 854 private native void nativeSelectAll(int nativeImeAdapterAndroid); | 873 private native void nativeSelectAll(int nativeImeAdapterAndroid); |
| 855 private native void nativeCut(int nativeImeAdapterAndroid); | 874 private native void nativeCut(int nativeImeAdapterAndroid); |
| 856 private native void nativeCopy(int nativeImeAdapterAndroid); | 875 private native void nativeCopy(int nativeImeAdapterAndroid); |
| 857 private native void nativePaste(int nativeImeAdapterAndroid); | 876 private native void nativePaste(int nativeImeAdapterAndroid); |
| 858 } | 877 } |
| OLD | NEW |