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