164e01baadeb624781d9d056b62679b25ea0fe5c0Tadashi G. Takaoka/*
264e01baadeb624781d9d056b62679b25ea0fe5c0Tadashi G. Takaoka * Copyright (C) 2012 The Android Open Source Project
364e01baadeb624781d9d056b62679b25ea0fe5c0Tadashi G. Takaoka *
4ce6bcdd1a547c9874f05a08074cafdfea16196d6Tadashi G. Takaoka * Licensed under the Apache License, Version 2.0 (the "License");
5ce6bcdd1a547c9874f05a08074cafdfea16196d6Tadashi G. Takaoka * you may not use this file except in compliance with the License.
6ce6bcdd1a547c9874f05a08074cafdfea16196d6Tadashi G. Takaoka * You may obtain a copy of the License at
764e01baadeb624781d9d056b62679b25ea0fe5c0Tadashi G. Takaoka *
8ce6bcdd1a547c9874f05a08074cafdfea16196d6Tadashi G. Takaoka *      http://www.apache.org/licenses/LICENSE-2.0
964e01baadeb624781d9d056b62679b25ea0fe5c0Tadashi G. Takaoka *
1064e01baadeb624781d9d056b62679b25ea0fe5c0Tadashi G. Takaoka * Unless required by applicable law or agreed to in writing, software
11ce6bcdd1a547c9874f05a08074cafdfea16196d6Tadashi G. Takaoka * distributed under the License is distributed on an "AS IS" BASIS,
12ce6bcdd1a547c9874f05a08074cafdfea16196d6Tadashi G. Takaoka * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13ce6bcdd1a547c9874f05a08074cafdfea16196d6Tadashi G. Takaoka * See the License for the specific language governing permissions and
14ce6bcdd1a547c9874f05a08074cafdfea16196d6Tadashi G. Takaoka * limitations under the License.
1564e01baadeb624781d9d056b62679b25ea0fe5c0Tadashi G. Takaoka */
1664e01baadeb624781d9d056b62679b25ea0fe5c0Tadashi G. Takaoka
1764e01baadeb624781d9d056b62679b25ea0fe5c0Tadashi G. Takaokapackage com.android.inputmethod.keyboard.internal;
1864e01baadeb624781d9d056b62679b25ea0fe5c0Tadashi G. Takaoka
1964e01baadeb624781d9d056b62679b25ea0fe5c0Tadashi G. Takaokaimport android.test.AndroidTestCase;
2064e01baadeb624781d9d056b62679b25ea0fe5c0Tadashi G. Takaoka
219342484e8d573a40f470b6a593df31c602fa4076Ken Wakasaimport com.android.inputmethod.latin.common.Constants;
229552badf3c24d2098d227b0ddca0721b928a10b1Tadashi G. Takaoka
2306bc1db017b14614353137fde035d2eed666a74fTadashi G. Takaokapublic class KeyboardStateTestsBase extends AndroidTestCase
24240871ecafde7834ebb4270cd7758fc904a5f3a7Tadashi G. Takaoka        implements MockKeyboardSwitcher.MockConstants {
2564e01baadeb624781d9d056b62679b25ea0fe5c0Tadashi G. Takaoka    protected MockKeyboardSwitcher mSwitcher;
2664e01baadeb624781d9d056b62679b25ea0fe5c0Tadashi G. Takaoka
2764e01baadeb624781d9d056b62679b25ea0fe5c0Tadashi G. Takaoka    @Override
2864e01baadeb624781d9d056b62679b25ea0fe5c0Tadashi G. Takaoka    protected void setUp() throws Exception {
2964e01baadeb624781d9d056b62679b25ea0fe5c0Tadashi G. Takaoka        super.setUp();
3064e01baadeb624781d9d056b62679b25ea0fe5c0Tadashi G. Takaoka
3164e01baadeb624781d9d056b62679b25ea0fe5c0Tadashi G. Takaoka        mSwitcher = new MockKeyboardSwitcher();
32553e2f19c1607080ff874cb642237f947809cdb3Tadashi G. Takaoka        mSwitcher.setAutoCapsMode(CAP_MODE_OFF);
3364e01baadeb624781d9d056b62679b25ea0fe5c0Tadashi G. Takaoka
3406bc1db017b14614353137fde035d2eed666a74fTadashi G. Takaoka        loadKeyboard(ALPHABET_UNSHIFTED);
3564e01baadeb624781d9d056b62679b25ea0fe5c0Tadashi G. Takaoka    }
3664e01baadeb624781d9d056b62679b25ea0fe5c0Tadashi G. Takaoka
37f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka    /**
38f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka     * Set auto caps mode.
39f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka     *
40f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka     * @param autoCaps the auto cap mode.
41f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka     */
42cc2636b4e1b2d340351324f178f7ee990d7538cbTadashi G. Takaoka    public void setAutoCapsMode(final int autoCaps) {
4364e01baadeb624781d9d056b62679b25ea0fe5c0Tadashi G. Takaoka        mSwitcher.setAutoCapsMode(autoCaps);
4464e01baadeb624781d9d056b62679b25ea0fe5c0Tadashi G. Takaoka    }
4564e01baadeb624781d9d056b62679b25ea0fe5c0Tadashi G. Takaoka
46cc2636b4e1b2d340351324f178f7ee990d7538cbTadashi G. Takaoka    private static void assertLayout(final String message, final int expected, final int actual) {
470d6d4c20ce2e6ff75901d29aa9b2ad11b8dd1118Tadashi G. Takaoka        assertTrue(message + ": expected=" + MockKeyboardSwitcher.getLayoutName(expected)
48373f452584f5a6881d496eec9beb262fccf4a2a4Tadashi G. Takaoka                + " actual=" + MockKeyboardSwitcher.getLayoutName(actual),
49373f452584f5a6881d496eec9beb262fccf4a2a4Tadashi G. Takaoka                expected == actual);
50373f452584f5a6881d496eec9beb262fccf4a2a4Tadashi G. Takaoka    }
51373f452584f5a6881d496eec9beb262fccf4a2a4Tadashi G. Takaoka
52f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka    /**
53f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka     * Emulate update keyboard shift state.
54f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka     *
55f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka     * @param afterUpdate the keyboard state after updating the keyboard shift state.
56f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka     */
57cc2636b4e1b2d340351324f178f7ee990d7538cbTadashi G. Takaoka    public void updateShiftState(final int afterUpdate) {
5864e01baadeb624781d9d056b62679b25ea0fe5c0Tadashi G. Takaoka        mSwitcher.updateShiftState();
590d6d4c20ce2e6ff75901d29aa9b2ad11b8dd1118Tadashi G. Takaoka        assertLayout("afterUpdate", afterUpdate, mSwitcher.getLayoutId());
6064e01baadeb624781d9d056b62679b25ea0fe5c0Tadashi G. Takaoka    }
6164e01baadeb624781d9d056b62679b25ea0fe5c0Tadashi G. Takaoka
62f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka    /**
63f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka     * Emulate load default keyboard.
64f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka     *
65f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka     * @param afterLoad the keyboard state after loading default keyboard.
66f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka     */
67cc2636b4e1b2d340351324f178f7ee990d7538cbTadashi G. Takaoka    public void loadKeyboard(final int afterLoad) {
68cc2636b4e1b2d340351324f178f7ee990d7538cbTadashi G. Takaoka        mSwitcher.loadKeyboard();
690d6d4c20ce2e6ff75901d29aa9b2ad11b8dd1118Tadashi G. Takaoka        mSwitcher.updateShiftState();
700d6d4c20ce2e6ff75901d29aa9b2ad11b8dd1118Tadashi G. Takaoka        assertLayout("afterLoad", afterLoad, mSwitcher.getLayoutId());
7164e01baadeb624781d9d056b62679b25ea0fe5c0Tadashi G. Takaoka    }
7264e01baadeb624781d9d056b62679b25ea0fe5c0Tadashi G. Takaoka
73f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka    /**
74f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka     * Emulate rotate device.
75f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka     *
76f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka     * @param afterRotate the keyboard state after rotating device.
77f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka     */
78cc2636b4e1b2d340351324f178f7ee990d7538cbTadashi G. Takaoka    public void rotateDevice(final int afterRotate) {
7906bc1db017b14614353137fde035d2eed666a74fTadashi G. Takaoka        mSwitcher.saveKeyboardState();
80cc2636b4e1b2d340351324f178f7ee990d7538cbTadashi G. Takaoka        mSwitcher.loadKeyboard();
810d6d4c20ce2e6ff75901d29aa9b2ad11b8dd1118Tadashi G. Takaoka        assertLayout("afterRotate", afterRotate, mSwitcher.getLayoutId());
8206bc1db017b14614353137fde035d2eed666a74fTadashi G. Takaoka    }
8306bc1db017b14614353137fde035d2eed666a74fTadashi G. Takaoka
84cc2636b4e1b2d340351324f178f7ee990d7538cbTadashi G. Takaoka    private void pressKeyWithoutTimerExpire(final int code, final boolean isSinglePointer,
85cc2636b4e1b2d340351324f178f7ee990d7538cbTadashi G. Takaoka            final int afterPress) {
8616950d65c323f99507d97cb7f0403dc653e2506cTadashi G. Takaoka        mSwitcher.onPressKey(code, isSinglePointer);
870d6d4c20ce2e6ff75901d29aa9b2ad11b8dd1118Tadashi G. Takaoka        assertLayout("afterPress", afterPress, mSwitcher.getLayoutId());
8864e01baadeb624781d9d056b62679b25ea0fe5c0Tadashi G. Takaoka    }
8964e01baadeb624781d9d056b62679b25ea0fe5c0Tadashi G. Takaoka
90f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka    /**
91f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka     * Emulate key press.
92f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka     *
93f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka     * @param code the key code to press.
94f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka     * @param afterPress the keyboard state after pressing the key.
95f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka     */
96cc2636b4e1b2d340351324f178f7ee990d7538cbTadashi G. Takaoka    public void pressKey(final int code, final int afterPress) {
970ed2d3a4491cb0f6142975a15b653be6079b6a4eTadashi G. Takaoka        mSwitcher.expireDoubleTapTimeout();
9816950d65c323f99507d97cb7f0403dc653e2506cTadashi G. Takaoka        pressKeyWithoutTimerExpire(code, true, afterPress);
990ed2d3a4491cb0f6142975a15b653be6079b6a4eTadashi G. Takaoka    }
1000ed2d3a4491cb0f6142975a15b653be6079b6a4eTadashi G. Takaoka
101f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka    /**
102f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka     * Emulate key release and register.
103f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka     *
104f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka     * @param code the key code to release and register
105f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka     * @param afterRelease the keyboard state after releasing the key.
106f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka     */
107cc2636b4e1b2d340351324f178f7ee990d7538cbTadashi G. Takaoka    public void releaseKey(final int code, final int afterRelease) {
10841016acacfa21354f59ed51db1f85ea3d99bf6a4Tadashi G. Takaoka        mSwitcher.onCodeInput(code);
10964e01baadeb624781d9d056b62679b25ea0fe5c0Tadashi G. Takaoka        mSwitcher.onReleaseKey(code, NOT_SLIDING);
1100d6d4c20ce2e6ff75901d29aa9b2ad11b8dd1118Tadashi G. Takaoka        assertLayout("afterRelease", afterRelease, mSwitcher.getLayoutId());
11164e01baadeb624781d9d056b62679b25ea0fe5c0Tadashi G. Takaoka    }
11264e01baadeb624781d9d056b62679b25ea0fe5c0Tadashi G. Takaoka
113f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka    /**
114f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka     * Emulate key press and release.
115f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka     *
116f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka     * @param code the key code to press and release.
117f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka     * @param afterPress the keyboard state after pressing the key.
118f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka     * @param afterRelease the keyboard state after releasing the key.
119f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka     */
120cc2636b4e1b2d340351324f178f7ee990d7538cbTadashi G. Takaoka    public void pressAndReleaseKey(final int code, final int afterPress, final int afterRelease) {
12164e01baadeb624781d9d056b62679b25ea0fe5c0Tadashi G. Takaoka        pressKey(code, afterPress);
12264e01baadeb624781d9d056b62679b25ea0fe5c0Tadashi G. Takaoka        releaseKey(code, afterRelease);
12364e01baadeb624781d9d056b62679b25ea0fe5c0Tadashi G. Takaoka    }
12464e01baadeb624781d9d056b62679b25ea0fe5c0Tadashi G. Takaoka
125f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka    /**
126f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka     * Emulate chording key press.
127f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka     *
128f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka     * @param code the chording key code.
129f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka     * @param afterPress the keyboard state after pressing chording key.
130f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka     */
131cc2636b4e1b2d340351324f178f7ee990d7538cbTadashi G. Takaoka    public void chordingPressKey(final int code, final int afterPress) {
13216950d65c323f99507d97cb7f0403dc653e2506cTadashi G. Takaoka        mSwitcher.expireDoubleTapTimeout();
13316950d65c323f99507d97cb7f0403dc653e2506cTadashi G. Takaoka        pressKeyWithoutTimerExpire(code, false, afterPress);
13464e01baadeb624781d9d056b62679b25ea0fe5c0Tadashi G. Takaoka    }
13564e01baadeb624781d9d056b62679b25ea0fe5c0Tadashi G. Takaoka
136f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka    /**
137f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka     * Emulate chording key release.
138f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka     *
139f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka     * @param code the cording key code.
140f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka     * @param afterRelease the keyboard state after releasing chording key.
141f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka     */
142cc2636b4e1b2d340351324f178f7ee990d7538cbTadashi G. Takaoka    public void chordingReleaseKey(final int code, final int afterRelease) {
14341016acacfa21354f59ed51db1f85ea3d99bf6a4Tadashi G. Takaoka        mSwitcher.onCodeInput(code);
14464e01baadeb624781d9d056b62679b25ea0fe5c0Tadashi G. Takaoka        mSwitcher.onReleaseKey(code, NOT_SLIDING);
1450d6d4c20ce2e6ff75901d29aa9b2ad11b8dd1118Tadashi G. Takaoka        assertLayout("afterRelease", afterRelease, mSwitcher.getLayoutId());
14664e01baadeb624781d9d056b62679b25ea0fe5c0Tadashi G. Takaoka    }
14764e01baadeb624781d9d056b62679b25ea0fe5c0Tadashi G. Takaoka
148f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka    /**
149f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka     * Emulate chording key press and release.
150f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka     *
151f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka     * @param code the chording key code.
152f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka     * @param afterPress the keyboard state after pressing chording key.
153f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka     * @param afterRelease the keyboard state after releasing chording key.
154f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka     */
155cc2636b4e1b2d340351324f178f7ee990d7538cbTadashi G. Takaoka    public void chordingPressAndReleaseKey(final int code, final int afterPress,
156cc2636b4e1b2d340351324f178f7ee990d7538cbTadashi G. Takaoka            final int afterRelease) {
15764e01baadeb624781d9d056b62679b25ea0fe5c0Tadashi G. Takaoka        chordingPressKey(code, afterPress);
15864e01baadeb624781d9d056b62679b25ea0fe5c0Tadashi G. Takaoka        chordingReleaseKey(code, afterRelease);
15964e01baadeb624781d9d056b62679b25ea0fe5c0Tadashi G. Takaoka    }
16064e01baadeb624781d9d056b62679b25ea0fe5c0Tadashi G. Takaoka
161f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka    /**
162f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka     * Emulate start of the sliding key input.
163f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka     *
164f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka     * @param code the key code to start sliding.
165f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka     * @param afterPress the keyboard state after pressing the key.
166f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka     * @param afterSlide the keyboard state after releasing the key with sliding input.
167f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka     */
168cc2636b4e1b2d340351324f178f7ee990d7538cbTadashi G. Takaoka    public void pressAndSlideFromKey(final int code, final int afterPress, final int afterSlide) {
16964e01baadeb624781d9d056b62679b25ea0fe5c0Tadashi G. Takaoka        pressKey(code, afterPress);
17064e01baadeb624781d9d056b62679b25ea0fe5c0Tadashi G. Takaoka        mSwitcher.onReleaseKey(code, SLIDING);
1710d6d4c20ce2e6ff75901d29aa9b2ad11b8dd1118Tadashi G. Takaoka        assertLayout("afterSlide", afterSlide, mSwitcher.getLayoutId());
17264e01baadeb624781d9d056b62679b25ea0fe5c0Tadashi G. Takaoka    }
17364e01baadeb624781d9d056b62679b25ea0fe5c0Tadashi G. Takaoka
174f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka    /**
175f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka     * Emulate end of the sliding key input.
176f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka     *
177f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka     * @param code the key code to stop sliding.
178f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka     * @param afterPress the keyboard state after pressing the key.
179f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka     * @param afterSlide the keyboard state after releasing the key and stop sliding.
180f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka     */
18141016acacfa21354f59ed51db1f85ea3d99bf6a4Tadashi G. Takaoka    public void stopSlidingOnKey(final int code, final int afterPress, final int afterSlide) {
18241016acacfa21354f59ed51db1f85ea3d99bf6a4Tadashi G. Takaoka        pressKey(code, afterPress);
18341016acacfa21354f59ed51db1f85ea3d99bf6a4Tadashi G. Takaoka        mSwitcher.onCodeInput(code);
18441016acacfa21354f59ed51db1f85ea3d99bf6a4Tadashi G. Takaoka        mSwitcher.onReleaseKey(code, NOT_SLIDING);
18541016acacfa21354f59ed51db1f85ea3d99bf6a4Tadashi G. Takaoka        mSwitcher.onFinishSlidingInput();
18641016acacfa21354f59ed51db1f85ea3d99bf6a4Tadashi G. Takaoka        assertLayout("afterSlide", afterSlide, mSwitcher.getLayoutId());
18741016acacfa21354f59ed51db1f85ea3d99bf6a4Tadashi G. Takaoka    }
18841016acacfa21354f59ed51db1f85ea3d99bf6a4Tadashi G. Takaoka
189f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka    /**
190f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka     * Emulate cancel the sliding key input.
191f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka     *
192f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka     * @param afterCancelSliding the keyboard state after canceling sliding input.
193f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka     */
19441016acacfa21354f59ed51db1f85ea3d99bf6a4Tadashi G. Takaoka    public void stopSlidingAndCancel(final int afterCancelSliding) {
19541016acacfa21354f59ed51db1f85ea3d99bf6a4Tadashi G. Takaoka        mSwitcher.onFinishSlidingInput();
19641016acacfa21354f59ed51db1f85ea3d99bf6a4Tadashi G. Takaoka        assertLayout("afterCancelSliding", afterCancelSliding, mSwitcher.getLayoutId());
19741016acacfa21354f59ed51db1f85ea3d99bf6a4Tadashi G. Takaoka    }
19841016acacfa21354f59ed51db1f85ea3d99bf6a4Tadashi G. Takaoka
199f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka    /**
200f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka     * Emulate long press shift key.
201f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka     *
202f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka     * @param afterPress the keyboard state after pressing shift key.
203f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka     * @param afterLongPress the keyboard state after long press fired.
204f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka     */
205f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka    public void longPressShiftKey(final int afterPress, final int afterLongPress) {
2069552badf3c24d2098d227b0ddca0721b928a10b1Tadashi G. Takaoka        // Long press shift key will register {@link Constants#CODE_CAPS_LOCK}. See
2079552badf3c24d2098d227b0ddca0721b928a10b1Tadashi G. Takaoka        // {@link R.xml#key_styles_common} and its baseForShiftKeyStyle. We thus emulate the
208f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka        // behavior that is implemented in {@link MainKeyboardView#onLongPress(PointerTracker)}.
209f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka        pressKey(Constants.CODE_SHIFT, afterPress);
210f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka        mSwitcher.onPressKey(Constants.CODE_CAPSLOCK, true /* isSinglePointer */);
211f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka        mSwitcher.onCodeInput(Constants.CODE_CAPSLOCK);
2120d6d4c20ce2e6ff75901d29aa9b2ad11b8dd1118Tadashi G. Takaoka        assertLayout("afterLongPress", afterLongPress, mSwitcher.getLayoutId());
213fb0a4ba8fd7291e1bed0ec61bb7d2b5c8f93c1adTadashi G. Takaoka    }
214fb0a4ba8fd7291e1bed0ec61bb7d2b5c8f93c1adTadashi G. Takaoka
215f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka    /**
216f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka     * Emulate long press shift key and release.
217f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka     *
218f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka     * @param afterPress the keyboard state after pressing shift key.
219f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka     * @param afterLongPress the keyboard state after long press fired.
220f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka     * @param afterRelease the keyboard state after shift key is released.
221f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka     */
222f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka    public void longPressAndReleaseShiftKey(final int afterPress, final int afterLongPress,
223f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka            final int afterRelease) {
224f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka        // Long press shift key will register {@link Constants#CODE_CAPS_LOCK}. See
225f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka        // {@link R.xml#key_styles_common} and its baseForShiftKeyStyle. We thus emulate the
226f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka        // behavior that is implemented in {@link MainKeyboardView#onLongPress(PointerTracker)}.
227f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka        longPressShiftKey(afterPress, afterLongPress);
228f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka        releaseKey(Constants.CODE_CAPSLOCK, afterRelease);
229f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka    }
230f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka
231f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka    /**
232f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka     * Emulate the second press of the double tap.
233f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka     *
234f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka     * @param code the key code to double tap.
235f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka     * @param afterPress the keyboard state after pressing the second tap.
236f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka     */
237f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka    public void secondPressKey(final int code, final int afterPress) {
23816950d65c323f99507d97cb7f0403dc653e2506cTadashi G. Takaoka        pressKeyWithoutTimerExpire(code, true, afterPress);
2399a3211802baf11e5749a080e4f451ef7b795220bTadashi G. Takaoka    }
2409a3211802baf11e5749a080e4f451ef7b795220bTadashi G. Takaoka
241f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka    /**
242f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka     * Emulate the second tap of the double tap.
243f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka     *
244f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka     * @param code the key code to double tap.
245f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka     * @param afterPress the keyboard state after pressing the second tap.
246f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka     * @param afterRelease the keyboard state after releasing the second tap.
247f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka     */
248f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka    public void secondPressAndReleaseKey(final int code, final int afterPress,
249f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka            final int afterRelease) {
2509a3211802baf11e5749a080e4f451ef7b795220bTadashi G. Takaoka        secondPressKey(code, afterPress);
2510ed2d3a4491cb0f6142975a15b653be6079b6a4eTadashi G. Takaoka        releaseKey(code, afterRelease);
25264e01baadeb624781d9d056b62679b25ea0fe5c0Tadashi G. Takaoka    }
25364e01baadeb624781d9d056b62679b25ea0fe5c0Tadashi G. Takaoka}
254