168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)package org.chromium.content.browser.input; 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import android.app.Activity; 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import android.content.ClipData; 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import android.content.ClipboardManager; 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import android.content.Context; 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import android.test.suitebuilder.annotation.MediumTest; 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import android.test.suitebuilder.annotation.SmallTest; 1323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)import android.text.Editable; 14116680a4aac90f2aa7413d9095a592090648e557Ben Murdochimport android.text.Selection; 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import android.text.TextUtils; 16424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)import android.view.KeyEvent; 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import android.view.View; 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import android.view.inputmethod.EditorInfo; 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import org.chromium.base.ThreadUtils; 211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciimport org.chromium.base.test.util.DisabledTest; 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import org.chromium.base.test.util.Feature; 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import org.chromium.base.test.util.UrlUtils; 24c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochimport org.chromium.content.browser.ContentViewCore; 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import org.chromium.content.browser.test.util.Criteria; 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import org.chromium.content.browser.test.util.CriteriaHelper; 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import org.chromium.content.browser.test.util.DOMUtils; 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import org.chromium.content.browser.test.util.TestCallbackHelperContainer; 2990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)import org.chromium.content.browser.test.util.TestInputMethodManagerWrapper; 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import org.chromium.content_shell_apk.ContentShellTestBase; 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)import java.util.ArrayList; 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import java.util.concurrent.Callable; 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 35a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)/** 36a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Integration tests for text input using cases based on fixed regressions. 37a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */ 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)public class ImeTest extends ContentShellTestBase { 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private static final String DATA_URL = UrlUtils.encodeHtmlDataUri( 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "<html><head><meta name=\"viewport\"" + 42f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) "content=\"width=device-width, initial-scale=2.0, maximum-scale=2.0\" /></head>" + 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "<body><form action=\"about:blank\">" + 44f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) "<input id=\"input_text\" type=\"text\" /><br/>" + 454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) "<input id=\"input_radio\" type=\"radio\" style=\"width:50px;height:50px\" />" + 46a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) "<br/><textarea id=\"textarea\" rows=\"4\" cols=\"20\"></textarea>" + 471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "<br/><p><span id=\"plain_text\">This is Plain Text One</span></p>" + 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "</form></body></html>"); 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private TestAdapterInputConnection mConnection; 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private ImeAdapter mImeAdapter; 52c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 53c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch private ContentViewCore mContentViewCore; 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private TestCallbackHelperContainer mCallbackContainer; 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private TestInputMethodManagerWrapper mInputMethodManagerWrapper; 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) @Override 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public void setUp() throws Exception { 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) super.setUp(); 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) launchContentShellWithUrl(DATA_URL); 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assertTrue("Page failed to load", waitForActiveShellToBeDoneLoading()); 63c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch mContentViewCore = getContentViewCore(); 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 65c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch mInputMethodManagerWrapper = new TestInputMethodManagerWrapper(mContentViewCore); 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) getImeAdapter().setInputMethodManagerWrapper(mInputMethodManagerWrapper); 6790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) assertEquals(0, mInputMethodManagerWrapper.getShowSoftInputCounter()); 68c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch mContentViewCore.setAdapterInputConnectionFactory( 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new TestAdapterInputConnectionFactory()); 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 710529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch mCallbackContainer = new TestCallbackHelperContainer(mContentViewCore); 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // TODO(aurimas) remove this wait once crbug.com/179511 is fixed. 73f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) assertWaitForPageScaleFactorMatch(2); 74c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch assertTrue(DOMUtils.waitForNonZeroNodeBounds( 75c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch mContentViewCore, "input_text")); 760529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch DOMUtils.clickNode(this, mContentViewCore, "input_text"); 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assertWaitForKeyboardStatus(true); 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mConnection = (TestAdapterInputConnection) getAdapterInputConnection(); 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mImeAdapter = getImeAdapter(); 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) waitAndVerifyEditableCallback(mConnection.mImeUpdateQueue, 0, "", 0, 0, -1, -1); 8390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) assertEquals(1, mInputMethodManagerWrapper.getShowSoftInputCounter()); 8490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) assertEquals(0, mInputMethodManagerWrapper.getEditorInfo().initialSelStart); 8590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) assertEquals(0, mInputMethodManagerWrapper.getEditorInfo().initialSelEnd); 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) @MediumTest 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) @Feature({"TextInput", "Main"}) 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public void testKeyboardDismissedAfterClickingGo() throws Throwable { 915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) setComposingText(mConnection, "hello", 1); 92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) waitAndVerifyEditableCallback(mConnection.mImeUpdateQueue, 1, "hello", 5, 5, 0, 5); 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) performGo(getAdapterInputConnection(), mCallbackContainer); 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) waitAndVerifyEditableCallback(mConnection.mImeUpdateQueue, 2, "", 0, 0, -1, -1); 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assertWaitForKeyboardStatus(false); 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) @SmallTest 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) @Feature({"TextInput", "Main"}) 102116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch @RerunWithUpdatedContainerView 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public void testGetTextUpdatesAfterEnteringText() throws Throwable { 1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) setComposingText(mConnection, "h", 1); 105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) waitAndVerifyEditableCallback(mConnection.mImeUpdateQueue, 1, "h", 1, 1, 0, 1); 10690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) assertEquals(1, mInputMethodManagerWrapper.getShowSoftInputCounter()); 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) setComposingText(mConnection, "he", 1); 109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) waitAndVerifyEditableCallback(mConnection.mImeUpdateQueue, 2, "he", 2, 2, 0, 2); 11090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) assertEquals(1, mInputMethodManagerWrapper.getShowSoftInputCounter()); 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) setComposingText(mConnection, "hel", 1); 113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) waitAndVerifyEditableCallback(mConnection.mImeUpdateQueue, 3, "hel", 3, 3, 0, 3); 11490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) assertEquals(1, mInputMethodManagerWrapper.getShowSoftInputCounter()); 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) commitText(mConnection, "hel", 1); 117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) waitAndVerifyEditableCallback(mConnection.mImeUpdateQueue, 4, "hel", 3, 3, -1, -1); 11890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) assertEquals(1, mInputMethodManagerWrapper.getShowSoftInputCounter()); 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) @SmallTest 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) @Feature({"TextInput"}) 123116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch @RerunWithUpdatedContainerView 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public void testImeCopy() throws Exception { 1255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) commitText(mConnection, "hello", 1); 126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) waitAndVerifyEditableCallback(mConnection.mImeUpdateQueue, 1, "hello", 5, 5, -1, -1); 127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) setSelection(mConnection, 2, 5); 129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) waitAndVerifyEditableCallback(mConnection.mImeUpdateQueue, 2, "hello", 2, 5, -1, -1); 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 131a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) copy(mImeAdapter); 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assertClipboardContents(getActivity(), "llo"); 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) @SmallTest 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) @Feature({"TextInput"}) 137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public void testEnterTextAndRefocus() throws Exception { 1385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) commitText(mConnection, "hello", 1); 139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) waitAndVerifyEditableCallback(mConnection.mImeUpdateQueue, 1, "hello", 5, 5, -1, -1); 140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1410529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch DOMUtils.clickNode(this, mContentViewCore, "input_radio"); 142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) assertWaitForKeyboardStatus(false); 143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1440529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch DOMUtils.clickNode(this, mContentViewCore, "input_text"); 145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) assertWaitForKeyboardStatus(true); 14690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) assertEquals(5, mInputMethodManagerWrapper.getEditorInfo().initialSelStart); 14790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) assertEquals(5, mInputMethodManagerWrapper.getEditorInfo().initialSelEnd); 148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) @SmallTest 151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) @Feature({"TextInput"}) 152116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch public void testKeyboardNotDismissedAfterCopySelection() throws Exception { 153116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch commitText(mConnection, "Sample Text", 1); 154116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch waitAndVerifyEditableCallback(mConnection.mImeUpdateQueue, 1, 155116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch "Sample Text", 11, 11, -1, -1); 156116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DOMUtils.clickNode(this, mContentViewCore, "input_text"); 157116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch assertWaitForKeyboardStatus(true); 158116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DOMUtils.longPressNode(this, mContentViewCore, "input_text"); 159116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch selectAll(mImeAdapter); 160116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch copy(mImeAdapter); 161116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch assertWaitForKeyboardStatus(true); 162116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch assertEquals(11, Selection.getSelectionEnd(mContentViewCore.getEditableForTest())); 1631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 1641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci @SmallTest 1661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci @Feature({"TextInput"}) 1671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public void testImeNotDismissedAfterCutSelection() throws Exception { 1681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci commitText(mConnection, "Sample Text", 1); 1691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci waitAndVerifyEditableCallback(mConnection.mImeUpdateQueue, 1, 1701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "Sample Text", 11, 11, -1, -1); 1711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DOMUtils.longPressNode(this, mContentViewCore, "input_text"); 1721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci assertWaitForSelectActionBarStatus(true); 1731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci assertWaitForKeyboardStatus(true); 1741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci cut(mImeAdapter); 1751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci assertWaitForKeyboardStatus(true); 1761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci assertWaitForSelectActionBarStatus(false); 177116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 178116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 179116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch @SmallTest 180116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch @Feature({"TextInput"}) 18103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) public void testImeNotShownOnLongPressingEmptyInput() throws Exception { 18203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) DOMUtils.focusNode(mContentViewCore, "input_radio"); 18303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) DOMUtils.longPressNode(this, mContentViewCore, "input_text"); 18403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) assertWaitForKeyboardStatus(false); 18503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) commitText(mConnection, "Sample Text", 1); 18603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) DOMUtils.longPressNode(this, mContentViewCore, "input_text"); 18703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) assertWaitForKeyboardStatus(true); 18803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) } 18903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 19003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) @SmallTest 19103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) @Feature({"TextInput"}) 1921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public void testSelectActionBarShownOnLongPressingInput() throws Exception { 1931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DOMUtils.longPressNode(this, mContentViewCore, "input_text"); 1941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci assertWaitForSelectActionBarStatus(false); 1951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci commitText(mConnection, "Sample Text", 1); 1961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DOMUtils.longPressNode(this, mContentViewCore, "input_text"); 1971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci assertWaitForSelectActionBarStatus(true); 1981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 1991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* 2011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci @SmallTest 2021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci @Feature({"TextInput"}) 2031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci */ 2041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci @DisabledTest 2051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public void testSelectActionBarClearedOnTappingInput() throws Exception { 2061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci commitText(mConnection, "Sample Text", 1); 2071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DOMUtils.longPressNode(this, mContentViewCore, "input_text"); 2081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci assertWaitForKeyboardStatus(true); 2091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci assertWaitForSelectActionBarStatus(true); 2101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DOMUtils.clickNode(this, mContentViewCore, "input_text"); 2111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci assertWaitForSelectActionBarStatus(false); 2121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 2131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci @SmallTest 2151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci @Feature({"TextInput"}) 2161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public void testSelectActionBarClearedOnTappingOutsideInput() throws Exception { 2171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci commitText(mConnection, "Sample Text", 1); 2181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DOMUtils.longPressNode(this, mContentViewCore, "input_text"); 2191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci assertWaitForKeyboardStatus(true); 2201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci assertWaitForSelectActionBarStatus(true); 2211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DOMUtils.clickNode(this, mContentViewCore, "input_radio"); 2221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci assertWaitForKeyboardStatus(false); 2231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci assertWaitForSelectActionBarStatus(false); 2241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 2251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci @SmallTest 2271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci @Feature({"TextInput"}) 2281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public void testImeNotShownOnLongPressingDifferentEmptyInputs() throws Exception { 2291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DOMUtils.focusNode(mContentViewCore, "input_radio"); 2301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DOMUtils.longPressNode(this, mContentViewCore, "input_text"); 2311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci assertWaitForKeyboardStatus(false); 2321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DOMUtils.longPressNode(this, mContentViewCore, "textarea"); 2331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci assertWaitForKeyboardStatus(false); 2341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 2351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci @SmallTest 2371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci @Feature({"TextInput"}) 2381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public void testImeStaysOnLongPressingDifferentNonEmptyInputs() throws Exception { 2391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DOMUtils.focusNode(mContentViewCore, "input_text"); 2401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci assertWaitForKeyboardStatus(true); 2411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci commitText(mConnection, "Sample Text", 1); 2421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DOMUtils.focusNode(mContentViewCore, "textarea"); 2431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci commitText(mConnection, "Sample Text", 1); 2441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DOMUtils.longPressNode(this, mContentViewCore, "input_text"); 2451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci assertWaitForKeyboardStatus(true); 2461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DOMUtils.longPressNode(this, mContentViewCore, "textarea"); 2471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci assertWaitForKeyboardStatus(true); 2481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 2491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci @SmallTest 2511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci @Feature({"TextInput"}) 2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public void testImeCut() throws Exception { 2535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) commitText(mConnection, "snarful", 1); 254c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) waitAndVerifyEditableCallback(mConnection.mImeUpdateQueue, 1, "snarful", 7, 7, -1, -1); 255c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) setSelection(mConnection, 1, 5); 257c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) waitAndVerifyEditableCallback(mConnection.mImeUpdateQueue, 2, "snarful", 1, 5, -1, -1); 2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 259a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) cut(mImeAdapter); 260c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) waitAndVerifyEditableCallback(mConnection.mImeUpdateQueue, 3, "sul", 1, 1, -1, -1); 2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assertClipboardContents(getActivity(), "narf"); 2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) @SmallTest 2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) @Feature({"TextInput"}) 2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public void testImePaste() throws Exception { 2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ThreadUtils.runOnUiThreadBlocking(new Runnable() { 2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) @Override 2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public void run() { 2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ClipboardManager clipboardManager = 2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (ClipboardManager) getActivity().getSystemService( 2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Context.CLIPBOARD_SERVICE); 2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) clipboardManager.setPrimaryClip(ClipData.newPlainText("blarg", "blarg")); 2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }); 2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 278a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) paste(mImeAdapter); 279c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) waitAndVerifyEditableCallback(mConnection.mImeUpdateQueue, 1, "blarg", 5, 5, -1, -1); 2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) setSelection(mConnection, 3, 5); 282c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) waitAndVerifyEditableCallback(mConnection.mImeUpdateQueue, 2, "blarg", 3, 5, -1, -1); 2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 284a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) paste(mImeAdapter); 285c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Paste is a two step process when there is a non-zero selection. 286c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) waitAndVerifyEditableCallback(mConnection.mImeUpdateQueue, 3, "bla", 3, 3, -1, -1); 287c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) waitAndVerifyEditableCallback(mConnection.mImeUpdateQueue, 4, "blablarg", 8, 8, -1, -1); 2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 289a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) paste(mImeAdapter); 290c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) waitAndVerifyEditableCallback( 291c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) mConnection.mImeUpdateQueue, 5, "blablargblarg", 13, 13, -1, -1); 2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) @SmallTest 2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) @Feature({"TextInput"}) 2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public void testImeSelectAndUnSelectAll() throws Exception { 2975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) commitText(mConnection, "hello", 1); 298c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) waitAndVerifyEditableCallback(mConnection.mImeUpdateQueue, 1, "hello", 5, 5, -1, -1); 2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 300a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) selectAll(mImeAdapter); 301c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) waitAndVerifyEditableCallback(mConnection.mImeUpdateQueue, 2, "hello", 0, 5, -1, -1); 3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 303a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) unselect(mImeAdapter); 304c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) waitAndVerifyEditableCallback(mConnection.mImeUpdateQueue, 3, "", 0, 0, -1, -1); 3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assertWaitForKeyboardStatus(false); 3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) @SmallTest 3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) @Feature({"TextInput", "Main"}) 3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public void testShowImeIfNeeded() throws Throwable { 312116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // showImeIfNeeded() is now implicitly called by the updated focus 313116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // heuristic so no need to call explicitly. http://crbug.com/371927 3140529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch DOMUtils.focusNode(mContentViewCore, "input_radio"); 3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assertWaitForKeyboardStatus(false); 3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3170529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch DOMUtils.focusNode(mContentViewCore, "input_text"); 3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assertWaitForKeyboardStatus(true); 3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* 322c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) @SmallTest 323c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) @Feature({"TextInput", "Main"}) 3241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci */ 3251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci @DisabledTest 326c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public void testFinishComposingText() throws Throwable { 3270529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch DOMUtils.focusNode(mContentViewCore, "input_radio"); 328a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) assertWaitForKeyboardStatus(false); 3290529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch DOMUtils.focusNode(mContentViewCore, "textarea"); 330a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) assertWaitForKeyboardStatus(true); 331a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 332a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) mConnection = (TestAdapterInputConnection) getAdapterInputConnection(); 333a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) waitAndVerifyEditableCallback(mConnection.mImeUpdateQueue, 0, "", 0, 0, -1, -1); 334a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 3355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) commitText(mConnection, "hllo", 1); 336c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) waitAndVerifyEditableCallback(mConnection.mImeUpdateQueue, 1, "hllo", 4, 4, -1, -1); 337c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) commitText(mConnection, " ", 1); 339c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) waitAndVerifyEditableCallback(mConnection.mImeUpdateQueue, 2, "hllo ", 5, 5, -1, -1); 340c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) setSelection(mConnection, 1, 1); 342c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) waitAndVerifyEditableCallback(mConnection.mImeUpdateQueue, 3, "hllo ", 1, 1, -1, -1); 343c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) setComposingRegion(mConnection, 0, 4); 345c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) waitAndVerifyEditableCallback(mConnection.mImeUpdateQueue, 4, "hllo ", 1, 1, 0, 4); 346c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) finishComposingText(mConnection); 3487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch waitAndVerifyEditableCallback(mConnection.mImeUpdateQueue, 5, "hllo ", 1, 1, -1, -1); 349a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 3505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) commitText(mConnection, "\n", 1); 3517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch waitAndVerifyEditableCallback(mConnection.mImeUpdateQueue, 6, "h\nllo ", 2, 2, -1, -1); 352c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 353c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) private int getTypedKeycodeGuess(String before, String after) { 3556e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) KeyEvent ev = ImeAdapter.getTypedKeyEventGuess(before, after); 3566e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (ev == null) return -1; 3576e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return ev.getKeyCode(); 3586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 3596e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 360424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) @SmallTest 361424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) @Feature({"TextInput", "Main"}) 3626e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) public void testGuessedKeyCodeFromTyping() throws Throwable { 3636e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) assertEquals(-1, getTypedKeycodeGuess(null, "")); 3646e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) assertEquals(KeyEvent.KEYCODE_X, getTypedKeycodeGuess(null, "x")); 3656e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) assertEquals(-1, getTypedKeycodeGuess(null, "xyz")); 3666e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 3676e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) assertEquals(-1, getTypedKeycodeGuess("abc", "abc")); 3686e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) assertEquals(KeyEvent.KEYCODE_DEL, getTypedKeycodeGuess("abc", "")); 3696e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 3706e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) assertEquals(KeyEvent.KEYCODE_H, getTypedKeycodeGuess("", "h")); 3716e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) assertEquals(KeyEvent.KEYCODE_DEL, getTypedKeycodeGuess("h", "")); 3726e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) assertEquals(KeyEvent.KEYCODE_E, getTypedKeycodeGuess("h", "he")); 3736e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) assertEquals(KeyEvent.KEYCODE_L, getTypedKeycodeGuess("he", "hel")); 3746e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) assertEquals(KeyEvent.KEYCODE_O, getTypedKeycodeGuess("hel", "helo")); 3756e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) assertEquals(KeyEvent.KEYCODE_DEL, getTypedKeycodeGuess("helo", "hel")); 3766e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) assertEquals(KeyEvent.KEYCODE_L, getTypedKeycodeGuess("hel", "hell")); 3776e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) assertEquals(KeyEvent.KEYCODE_L, getTypedKeycodeGuess("hell", "helll")); 3786e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) assertEquals(KeyEvent.KEYCODE_DEL, getTypedKeycodeGuess("helll", "hell")); 3796e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) assertEquals(KeyEvent.KEYCODE_O, getTypedKeycodeGuess("hell", "hello")); 3806e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 3816e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) assertEquals(KeyEvent.KEYCODE_X, getTypedKeycodeGuess("xxx", "xxxx")); 3826e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) assertEquals(KeyEvent.KEYCODE_X, getTypedKeycodeGuess("xxx", "xxxxx")); 3836e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) assertEquals(KeyEvent.KEYCODE_DEL, getTypedKeycodeGuess("xxx", "xx")); 3846e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) assertEquals(KeyEvent.KEYCODE_DEL, getTypedKeycodeGuess("xxx", "x")); 3856e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 3866e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) assertEquals(KeyEvent.KEYCODE_Y, getTypedKeycodeGuess("xxx", "xxxy")); 3876e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) assertEquals(KeyEvent.KEYCODE_Y, getTypedKeycodeGuess("xxx", "xxxxy")); 3886e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) assertEquals(-1, getTypedKeycodeGuess("xxx", "xy")); 3896e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) assertEquals(-1, getTypedKeycodeGuess("xxx", "y")); 3906e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 3916e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) assertEquals(-1, getTypedKeycodeGuess("foo", "bar")); 3926e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) assertEquals(-1, getTypedKeycodeGuess("foo", "bars")); 3936e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) assertEquals(-1, getTypedKeycodeGuess("foo", "ba")); 3946e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 3956e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // Some characters also require modifiers so we have to check the full event. 3966e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) KeyEvent ev = ImeAdapter.getTypedKeyEventGuess(null, "!"); 3976e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) assertEquals(KeyEvent.KEYCODE_1, ev.getKeyCode()); 3986e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) assertTrue(ev.isShiftPressed()); 3995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 4005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 4011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* 4025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) @SmallTest 4035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) @Feature({"TextInput", "Main"}) 4041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci */ 4051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci @DisabledTest 4065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) public void testKeyCodesWhileComposingText() throws Throwable { 4075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DOMUtils.focusNode(mContentViewCore, "textarea"); 4085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) assertWaitForKeyboardStatus(true); 4095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 4105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // The calls below are a reflection of what the stock Google Keyboard (Android 4.4) sends 4115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // when the noted key is touched on screen. Exercise care when altering to make sure 4125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // that the test reflects reality. If this test breaks, it's possible that code has 4135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // changed and different calls need to be made instead. 4145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) mConnection = (TestAdapterInputConnection) getAdapterInputConnection(); 4155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) waitAndVerifyEditableCallback(mConnection.mImeUpdateQueue, 0, "", 0, 0, -1, -1); 4165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 4175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // H 4185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) expectUpdateStateCall(mConnection); 4195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) setComposingText(mConnection, "h", 1); 4205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) assertEquals(KeyEvent.KEYCODE_H, mImeAdapter.mLastSyntheticKeyCode); 4215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) assertUpdateStateCall(mConnection, 1000); 4225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) assertEquals("h", mConnection.getTextBeforeCursor(9, 0)); 4235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 4245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // O 4255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) expectUpdateStateCall(mConnection); 4265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) setComposingText(mConnection, "ho", 1); 4275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) assertEquals(KeyEvent.KEYCODE_O, mImeAdapter.mLastSyntheticKeyCode); 4285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) assertUpdateStateCall(mConnection, 1000); 4295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) assertEquals("ho", mConnection.getTextBeforeCursor(9, 0)); 4305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 4315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // DEL 4325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) expectUpdateStateCall(mConnection); 4335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) setComposingText(mConnection, "h", 1); 4345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) assertEquals(KeyEvent.KEYCODE_DEL, mImeAdapter.mLastSyntheticKeyCode); 4355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) assertUpdateStateCall(mConnection, 1000); 4365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) setComposingRegion(mConnection, 0, 1); // DEL calls cancelComposition() then restarts 4376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) setComposingText(mConnection, "h", 1); 4386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) assertEquals("h", mConnection.getTextBeforeCursor(9, 0)); 4395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 4405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // I 4415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) setComposingText(mConnection, "hi", 1); 4425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) assertEquals(KeyEvent.KEYCODE_I, mImeAdapter.mLastSyntheticKeyCode); 4435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) assertEquals("hi", mConnection.getTextBeforeCursor(9, 0)); 4445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 4455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // SPACE 4465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) commitText(mConnection, "hi", 1); 4476e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) assertEquals(-1, mImeAdapter.mLastSyntheticKeyCode); 4485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) commitText(mConnection, " ", 1); 4495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) assertEquals(KeyEvent.KEYCODE_SPACE, mImeAdapter.mLastSyntheticKeyCode); 4505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) assertEquals("hi ", mConnection.getTextBeforeCursor(9, 0)); 4515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 4525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // DEL 4535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) deleteSurroundingText(mConnection, 1, 0); 4545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) assertEquals(KeyEvent.KEYCODE_DEL, mImeAdapter.mLastSyntheticKeyCode); 4555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) setComposingRegion(mConnection, 0, 2); 4565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) assertEquals("hi", mConnection.getTextBeforeCursor(9, 0)); 4575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 4585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // DEL 4595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) setComposingText(mConnection, "h", 1); 4605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) assertEquals(KeyEvent.KEYCODE_DEL, mImeAdapter.mLastSyntheticKeyCode); 4615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) assertEquals("h", mConnection.getTextBeforeCursor(9, 0)); 4625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 4635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // DEL 4645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) commitText(mConnection, "", 1); 4655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) assertEquals(KeyEvent.KEYCODE_DEL, mImeAdapter.mLastSyntheticKeyCode); 4665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) assertEquals("", mConnection.getTextBeforeCursor(9, 0)); 4675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 4685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // DEL (on empty input) 4696e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) deleteSurroundingText(mConnection, 1, 0); // DEL on empty still sends 1,0 4705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) assertEquals(KeyEvent.KEYCODE_DEL, mImeAdapter.mLastSyntheticKeyCode); 4715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) assertEquals("", mConnection.getTextBeforeCursor(9, 0)); 4725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 4735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 4741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* 4751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci @SmallTest 4761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci @Feature({"TextInput", "Main"}) 4771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci */ 4781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci @DisabledTest 4791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public void testKeyCodesWhileSwipingText() throws Throwable { 4801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DOMUtils.focusNode(mContentViewCore, "textarea"); 4811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci assertWaitForKeyboardStatus(true); 4821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 4831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // The calls below are a reflection of what the stock Google Keyboard (Android 4.4) sends 4841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // when the word is swiped on the soft keyboard. Exercise care when altering to make sure 4851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // that the test reflects reality. If this test breaks, it's possible that code has 4861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // changed and different calls need to be made instead. 4871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci mConnection = (TestAdapterInputConnection) getAdapterInputConnection(); 4881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci waitAndVerifyEditableCallback(mConnection.mImeUpdateQueue, 0, "", 0, 0, -1, -1); 4891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 4901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // "three" 4911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci expectUpdateStateCall(mConnection); 4921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci setComposingText(mConnection, "three", 1); 4931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci assertEquals(KeyEvent.KEYCODE_UNKNOWN, mImeAdapter.mLastSyntheticKeyCode); 4941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci assertUpdateStateCall(mConnection, 1000); 4951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci assertEquals("three", mConnection.getTextBeforeCursor(99, 0)); 4961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 4971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // "word" 4981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci commitText(mConnection, "three", 1); 4991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci commitText(mConnection, " ", 1); 5001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci expectUpdateStateCall(mConnection); 5011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci setComposingText(mConnection, "word", 1); 5021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci assertEquals(KeyEvent.KEYCODE_UNKNOWN, mImeAdapter.mLastSyntheticKeyCode); 5031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci assertUpdateStateCall(mConnection, 1000); 5041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci assertEquals("three word", mConnection.getTextBeforeCursor(99, 0)); 5051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 5061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // "test" 5071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci commitText(mConnection, "word", 1); 5081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci commitText(mConnection, " ", 1); 5091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci expectUpdateStateCall(mConnection); 5101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci setComposingText(mConnection, "test", 1); 5111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci assertEquals(KeyEvent.KEYCODE_UNKNOWN, mImeAdapter.mLastSyntheticKeyCode); 5121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci assertUpdateStateCall(mConnection, 1000); 5131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci assertEquals("three word test", mConnection.getTextBeforeCursor(99, 0)); 5141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 5151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 5165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) @SmallTest 5175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) @Feature({"TextInput", "Main"}) 5185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) public void testKeyCodesWhileTypingText() throws Throwable { 5195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DOMUtils.focusNode(mContentViewCore, "textarea"); 5205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) assertWaitForKeyboardStatus(true); 5215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 5221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // The calls below are a reflection of what the Hacker's Keyboard sends when the noted 5235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // key is touched on screen. Exercise care when altering to make sure that the test 5245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // reflects reality. 5255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) mConnection = (TestAdapterInputConnection) getAdapterInputConnection(); 5265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) waitAndVerifyEditableCallback(mConnection.mImeUpdateQueue, 0, "", 0, 0, -1, -1); 5275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 5285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // H 5295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) expectUpdateStateCall(mConnection); 5305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) commitText(mConnection, "h", 1); 5315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) assertEquals(KeyEvent.KEYCODE_H, mImeAdapter.mLastSyntheticKeyCode); 5325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) assertEquals("h", mConnection.getTextBeforeCursor(9, 0)); 5335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) assertUpdateStateCall(mConnection, 1000); 5345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) assertEquals("h", mConnection.getTextBeforeCursor(9, 0)); 5355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 5365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // O 5375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) expectUpdateStateCall(mConnection); 5385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) commitText(mConnection, "o", 1); 5395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) assertEquals(KeyEvent.KEYCODE_O, mImeAdapter.mLastSyntheticKeyCode); 5405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) assertEquals("ho", mConnection.getTextBeforeCursor(9, 0)); 5415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) assertUpdateStateCall(mConnection, 1000); 5425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) assertEquals("ho", mConnection.getTextBeforeCursor(9, 0)); 5435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 5445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // DEL 5455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) expectUpdateStateCall(mConnection); 5465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) deleteSurroundingText(mConnection, 1, 0); 5475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) assertEquals(KeyEvent.KEYCODE_DEL, mImeAdapter.mLastSyntheticKeyCode); 5485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) assertEquals("h", mConnection.getTextBeforeCursor(9, 0)); 5495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) assertUpdateStateCall(mConnection, 1000); 5505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) assertEquals("h", mConnection.getTextBeforeCursor(9, 0)); 5515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 5525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // I 5535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) expectUpdateStateCall(mConnection); 5545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) commitText(mConnection, "i", 1); 5555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) assertEquals(KeyEvent.KEYCODE_I, mImeAdapter.mLastSyntheticKeyCode); 5565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) assertEquals("hi", mConnection.getTextBeforeCursor(9, 0)); 5575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) assertUpdateStateCall(mConnection, 1000); 5585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) assertEquals("hi", mConnection.getTextBeforeCursor(9, 0)); 5595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 5605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // SPACE 5615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) expectUpdateStateCall(mConnection); 5625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) commitText(mConnection, " ", 1); 5635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) assertEquals(KeyEvent.KEYCODE_SPACE, mImeAdapter.mLastSyntheticKeyCode); 5645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) assertEquals("hi ", mConnection.getTextBeforeCursor(9, 0)); 5655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) assertUpdateStateCall(mConnection, 1000); 5665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) assertEquals("hi ", mConnection.getTextBeforeCursor(9, 0)); 5675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 5685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // DEL 5695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) expectUpdateStateCall(mConnection); 5705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) deleteSurroundingText(mConnection, 1, 0); 5715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) assertEquals(KeyEvent.KEYCODE_DEL, mImeAdapter.mLastSyntheticKeyCode); 5725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) assertEquals("hi", mConnection.getTextBeforeCursor(9, 0)); 5735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) assertUpdateStateCall(mConnection, 1000); 5745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) assertEquals("hi", mConnection.getTextBeforeCursor(9, 0)); 5755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 5765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // DEL 5775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) expectUpdateStateCall(mConnection); 5785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) deleteSurroundingText(mConnection, 1, 0); 5795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) assertEquals(KeyEvent.KEYCODE_DEL, mImeAdapter.mLastSyntheticKeyCode); 5805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) assertEquals("h", mConnection.getTextBeforeCursor(9, 0)); 5815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) assertUpdateStateCall(mConnection, 1000); 5825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) assertEquals("h", mConnection.getTextBeforeCursor(9, 0)); 5835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 5845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // DEL 5855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) expectUpdateStateCall(mConnection); 5865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) deleteSurroundingText(mConnection, 1, 0); 5875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) assertEquals(KeyEvent.KEYCODE_DEL, mImeAdapter.mLastSyntheticKeyCode); 5885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) assertEquals("", mConnection.getTextBeforeCursor(9, 0)); 5895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) assertUpdateStateCall(mConnection, 1000); 5905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) assertEquals("", mConnection.getTextBeforeCursor(9, 0)); 5915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 5925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // DEL (on empty input) 5936e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) deleteSurroundingText(mConnection, 1, 0); // DEL on empty still sends 1,0 5945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) assertEquals(KeyEvent.KEYCODE_DEL, mImeAdapter.mLastSyntheticKeyCode); 5955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) assertEquals("", mConnection.getTextBeforeCursor(9, 0)); 5965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 5975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 5985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) @SmallTest 5995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) @Feature({"TextInput", "Main"}) 6006e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) public void testSetComposingRegionOutOfBounds() throws Throwable { 6016e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) DOMUtils.focusNode(mContentViewCore, "textarea"); 6026e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) assertWaitForKeyboardStatus(true); 6036e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 6046e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) mConnection = (TestAdapterInputConnection) getAdapterInputConnection(); 6056e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) waitAndVerifyEditableCallback(mConnection.mImeUpdateQueue, 0, "", 0, 0, -1, -1); 6066e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) setComposingText(mConnection, "hello", 1); 6076e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 6086e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) setComposingRegion(mConnection, 0, 0); 6096e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) setComposingRegion(mConnection, 0, 9); 6106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) setComposingRegion(mConnection, 9, 0); 6116e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 6126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 6131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* 6146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) @SmallTest 6156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) @Feature({"TextInput", "Main"}) 6161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci */ 6171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci @DisabledTest 618424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) public void testEnterKeyEventWhileComposingText() throws Throwable { 6190529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch DOMUtils.focusNode(mContentViewCore, "input_radio"); 620424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) assertWaitForKeyboardStatus(false); 6210529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch DOMUtils.focusNode(mContentViewCore, "textarea"); 622424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) assertWaitForKeyboardStatus(true); 623424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 624424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) mConnection = (TestAdapterInputConnection) getAdapterInputConnection(); 625424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) waitAndVerifyEditableCallback(mConnection.mImeUpdateQueue, 0, "", 0, 0, -1, -1); 626424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 6275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) setComposingText(mConnection, "hello", 1); 628424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) waitAndVerifyEditableCallback(mConnection.mImeUpdateQueue, 1, "hello", 5, 5, 0, 5); 629424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 630424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) getInstrumentation().runOnMainSync(new Runnable() { 631424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) @Override 632424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) public void run() { 633424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) mConnection.sendKeyEvent( 634424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_ENTER)); 635424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) mConnection.sendKeyEvent(new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_ENTER)); 636424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) } 637424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) }); 638424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 639424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // TODO(aurimas): remove this workaround when crbug.com/278584 is fixed. 640424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) waitAndVerifyEditableCallback(mConnection.mImeUpdateQueue, 2, "hello", 5, 5, -1, -1); 641424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // The second new line is not a user visible/editable one, it is a side-effect of Blink 642424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // using <br> internally. 643424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) waitAndVerifyEditableCallback(mConnection.mImeUpdateQueue, 3, "hello\n\n", 6, 6, -1, -1); 644424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) } 645424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 6465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) @SmallTest 6475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) @Feature({"TextInput", "Main"}) 6485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) public void testTransitionsWhileComposingText() throws Throwable { 6495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DOMUtils.focusNode(mContentViewCore, "textarea"); 6505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) assertWaitForKeyboardStatus(true); 6515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 6525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) mConnection = (TestAdapterInputConnection) getAdapterInputConnection(); 6535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) waitAndVerifyEditableCallback(mConnection.mImeUpdateQueue, 0, "", 0, 0, -1, -1); 6545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 6555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // H 6565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) expectUpdateStateCall(mConnection); 6575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) setComposingText(mConnection, "h", 1); 6585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) assertEquals(KeyEvent.KEYCODE_H, mImeAdapter.mLastSyntheticKeyCode); 6595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 6605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Simulate switch of input fields. 6615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) finishComposingText(mConnection); 6625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 6635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // H 6645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) expectUpdateStateCall(mConnection); 6655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) setComposingText(mConnection, "h", 1); 6665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) assertEquals(KeyEvent.KEYCODE_H, mImeAdapter.mLastSyntheticKeyCode); 6675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 6685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 6691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci @SmallTest 6701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci @Feature({"TextInput"}) 6711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public void testPastePopupShowOnLongPress() throws Throwable { 6721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci commitText(mConnection, "hello", 1); 6731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci waitAndVerifyEditableCallback(mConnection.mImeUpdateQueue, 1, "hello", 5, 5, -1, -1); 6741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 6751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci selectAll(mImeAdapter); 6761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci waitAndVerifyEditableCallback(mConnection.mImeUpdateQueue, 2, "hello", 0, 5, -1, -1); 6771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 6781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci cut(mImeAdapter); 6791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci waitAndVerifyEditableCallback(mConnection.mImeUpdateQueue, 0, "", 0, 0, -1, -1); 6801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 6811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DOMUtils.longPressNode(this, mContentViewCore, "input_text"); 6821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci final PastePopupMenu pastePopup = mContentViewCore.getPastePopupForTest(); 6831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci assertTrue(CriteriaHelper.pollForCriteria(new Criteria() { 6841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci @Override 6851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public boolean isSatisfied() { 6861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return pastePopup.isShowing(); 6871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 6881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci })); 6891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 6901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 6911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci @SmallTest 6921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci @Feature({"TextInput"}) 6931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public void testTextHandlesPreservedWithDpadNavigation() throws Throwable { 6941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DOMUtils.longPressNode(this, mContentViewCore, "plain_text"); 6951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci assertWaitForSelectActionBarStatus(true); 6961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci assertTrue(mContentViewCore.hasSelection()); 6971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 6981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ThreadUtils.runOnUiThreadBlocking(new Runnable() { 6991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci @Override 7001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public void run() { 7011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci final KeyEvent downKeyEvent = new KeyEvent( 7021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DPAD_DOWN); 7031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci mImeAdapter.dispatchKeyEvent(downKeyEvent); 7041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 7051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci }); 7061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 7071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci assertWaitForSelectActionBarStatus(true); 7081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci assertTrue(mContentViewCore.hasSelection()); 7091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 7101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 7112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private void performGo(final AdapterInputConnection inputConnection, 7122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestCallbackHelperContainer testCallbackHelperContainer) throws Throwable { 7132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) handleBlockingCallbackAction( 7142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) testCallbackHelperContainer.getOnPageFinishedHelper(), 7152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new Runnable() { 7162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) @Override 7172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public void run() { 7182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) inputConnection.performEditorAction(EditorInfo.IME_ACTION_GO); 7192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }); 7212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private void assertWaitForKeyboardStatus(final boolean show) throws InterruptedException { 7242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assertTrue(CriteriaHelper.pollForCriteria(new Criteria() { 7252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) @Override 7262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public boolean isSatisfied() { 7272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return show == getImeAdapter().mIsShowWithoutHideOutstanding && 7282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (!show || getAdapterInputConnection() != null); 7292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) })); 7312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci private void assertWaitForSelectActionBarStatus( 7341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci final boolean show) throws InterruptedException { 7351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci assertTrue(CriteriaHelper.pollForCriteria(new Criteria() { 7361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci @Override 7371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public boolean isSatisfied() { 7381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return show == mContentViewCore.isSelectActionBarShowing(); 7391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 7401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci })); 7411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 7421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 743c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private void waitAndVerifyEditableCallback(final ArrayList<TestImeState> states, 744c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) final int index, String text, int selectionStart, int selectionEnd, 745c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int compositionStart, int compositionEnd) throws InterruptedException { 7462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assertTrue(CriteriaHelper.pollForCriteria(new Criteria() { 7472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) @Override 7482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public boolean isSatisfied() { 749c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return states.size() > index; 7502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) })); 752c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) states.get(index).assertEqualState( 753c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) text, selectionStart, selectionEnd, compositionStart, compositionEnd); 7542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) private void expectUpdateStateCall(final TestAdapterInputConnection connection) { 7575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) connection.mImeUpdateQueue.clear(); 7585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 7595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 7605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) private void assertUpdateStateCall(final TestAdapterInputConnection connection, int maxms) 7615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) throws Exception { 7625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) while (connection.mImeUpdateQueue.size() == 0 && maxms > 0) { 7635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) try { 7645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) Thread.sleep(50); 7655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } catch (Exception e) { 7665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Not really a problem since we're just going to sleep again. 7675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 7685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) maxms -= 50; 7695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 7705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) assertTrue(connection.mImeUpdateQueue.size() > 0); 7715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 7725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 7732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private void assertClipboardContents(final Activity activity, final String expectedContents) 7742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) throws InterruptedException { 7752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assertTrue(CriteriaHelper.pollForCriteria(new Criteria() { 7762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) @Override 7772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public boolean isSatisfied() { 7782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return ThreadUtils.runOnUiThreadBlockingNoException(new Callable<Boolean>() { 7792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) @Override 7802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public Boolean call() throws Exception { 7812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ClipboardManager clipboardManager = 7822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (ClipboardManager) activity.getSystemService( 7832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Context.CLIPBOARD_SERVICE); 7842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ClipData clip = clipboardManager.getPrimaryClip(); 7852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return clip != null && clip.getItemCount() == 1 7862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) && TextUtils.equals(clip.getItemAt(0).getText(), expectedContents); 7872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }); 7892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) })); 7912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private ImeAdapter getImeAdapter() { 794c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return mContentViewCore.getImeAdapterForTest(); 7952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 797c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private AdapterInputConnection getAdapterInputConnection() { 798c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return mContentViewCore.getInputConnectionForTest(); 7992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 801a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) private void copy(final ImeAdapter adapter) { 802a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ThreadUtils.runOnUiThreadBlocking(new Runnable() { 803a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) @Override 804a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) public void run() { 805a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) adapter.copy(); 806a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 807a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) }); 808a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 809a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 810a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) private void cut(final ImeAdapter adapter) { 811a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ThreadUtils.runOnUiThreadBlocking(new Runnable() { 812a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) @Override 813a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) public void run() { 814a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) adapter.cut(); 815a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 816a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) }); 817a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 818a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 819a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) private void paste(final ImeAdapter adapter) { 820a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ThreadUtils.runOnUiThreadBlocking(new Runnable() { 821a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) @Override 822a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) public void run() { 823a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) adapter.paste(); 824a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 825a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) }); 826a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 827a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 828a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) private void selectAll(final ImeAdapter adapter) { 829a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ThreadUtils.runOnUiThreadBlocking(new Runnable() { 830a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) @Override 831a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) public void run() { 832a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) adapter.selectAll(); 833a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 834a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) }); 835a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 836a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 837a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) private void unselect(final ImeAdapter adapter) { 838a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ThreadUtils.runOnUiThreadBlocking(new Runnable() { 839a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) @Override 840a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) public void run() { 841a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) adapter.unselect(); 842a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 843a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) }); 844a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 845a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 8465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private void commitText(final AdapterInputConnection connection, final CharSequence text, 8475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) final int newCursorPosition) { 8485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ThreadUtils.runOnUiThreadBlocking(new Runnable() { 8495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) @Override 8505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public void run() { 8515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) connection.commitText(text, newCursorPosition); 8525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 8535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) }); 8545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 8555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 8565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private void setSelection(final AdapterInputConnection connection, final int start, 8575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) final int end) { 8585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ThreadUtils.runOnUiThreadBlocking(new Runnable() { 8595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) @Override 8605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public void run() { 8615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) connection.setSelection(start, end); 8625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 8635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) }); 8645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 8655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 8665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private void setComposingRegion(final AdapterInputConnection connection, final int start, 8675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) final int end) { 8685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ThreadUtils.runOnUiThreadBlocking(new Runnable() { 8695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) @Override 8705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public void run() { 8715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) connection.setComposingRegion(start, end); 8725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 8735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) }); 8745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 8755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 8765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private void setComposingText(final AdapterInputConnection connection, final CharSequence text, 8775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) final int newCursorPosition) { 8785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ThreadUtils.runOnUiThreadBlocking(new Runnable() { 8795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) @Override 8805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public void run() { 8815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) connection.setComposingText(text, newCursorPosition); 8825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 8835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) }); 8845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 8855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 8865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private void finishComposingText(final AdapterInputConnection connection) { 8875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ThreadUtils.runOnUiThreadBlocking(new Runnable() { 8885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) @Override 8895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public void run() { 8905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) connection.finishComposingText(); 8915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 8925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) }); 8935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 8945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 8955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) private void deleteSurroundingText(final AdapterInputConnection connection, final int before, 8965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) final int after) { 8975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ThreadUtils.runOnUiThreadBlocking(new Runnable() { 8985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) @Override 8995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) public void run() { 9005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) connection.deleteSurroundingText(before, after); 9015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 9025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) }); 9035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 9045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 9052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private static class TestAdapterInputConnectionFactory extends 9062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ImeAdapter.AdapterInputConnectionFactory { 9072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) @Override 9082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public AdapterInputConnection get(View view, ImeAdapter imeAdapter, 90923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) Editable editable, EditorInfo outAttrs) { 91023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) return new TestAdapterInputConnection(view, imeAdapter, editable, outAttrs); 9112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 9122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 9132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 914c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private static class TestAdapterInputConnection extends AdapterInputConnection { 9154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) private final ArrayList<TestImeState> mImeUpdateQueue = new ArrayList<TestImeState>(); 9162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 91723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) public TestAdapterInputConnection(View view, ImeAdapter imeAdapter, 91823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) Editable editable, EditorInfo outAttrs) { 91923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) super(view, imeAdapter, editable, outAttrs); 9202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 9212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) @Override 9234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public void updateState(String text, int selectionStart, int selectionEnd, 9244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) int compositionStart, int compositionEnd, boolean requiredAck) { 925c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) mImeUpdateQueue.add(new TestImeState(text, selectionStart, selectionEnd, 926c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) compositionStart, compositionEnd)); 9274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) super.updateState(text, selectionStart, selectionEnd, compositionStart, 9284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) compositionEnd, requiredAck); 9292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 9302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 9312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 932c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private static class TestImeState { 933c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private final String mText; 934c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private final int mSelectionStart; 935c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private final int mSelectionEnd; 936c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private final int mCompositionStart; 937c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private final int mCompositionEnd; 938c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 939c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public TestImeState(String text, int selectionStart, int selectionEnd, 940c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int compositionStart, int compositionEnd) { 941c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) mText = text; 942c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) mSelectionStart = selectionStart; 943c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) mSelectionEnd = selectionEnd; 944c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) mCompositionStart = compositionStart; 945c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) mCompositionEnd = compositionEnd; 946c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 947c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 948c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public void assertEqualState(String text, int selectionStart, int selectionEnd, 949c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int compositionStart, int compositionEnd) { 950a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) assertEquals("Text did not match", text, mText); 951a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) assertEquals("Selection start did not match", selectionStart, mSelectionStart); 952a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) assertEquals("Selection end did not match", selectionEnd, mSelectionEnd); 953a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) assertEquals("Composition start did not match", compositionStart, mCompositionStart); 954a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) assertEquals("Composition end did not match", compositionEnd, mCompositionEnd); 955c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 956c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 9572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 958