1dfbe254de6f0bf722d9cb5a3ab6dc97d135c73d5Tadashi G. Takaoka/*
260c4594ee6415b266b3418e46d09e6a5b3ed23e1Tadashi G. Takaoka * Copyright (C) 2012 The Android Open Source Project
3dfbe254de6f0bf722d9cb5a3ab6dc97d135c73d5Tadashi 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
7dfbe254de6f0bf722d9cb5a3ab6dc97d135c73d5Tadashi G. Takaoka *
8ce6bcdd1a547c9874f05a08074cafdfea16196d6Tadashi G. Takaoka *      http://www.apache.org/licenses/LICENSE-2.0
9dfbe254de6f0bf722d9cb5a3ab6dc97d135c73d5Tadashi G. Takaoka *
10dfbe254de6f0bf722d9cb5a3ab6dc97d135c73d5Tadashi 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.
15dfbe254de6f0bf722d9cb5a3ab6dc97d135c73d5Tadashi G. Takaoka */
16dfbe254de6f0bf722d9cb5a3ab6dc97d135c73d5Tadashi G. Takaoka
17dfbe254de6f0bf722d9cb5a3ab6dc97d135c73d5Tadashi G. Takaokapackage com.android.inputmethod.keyboard.internal;
18dfbe254de6f0bf722d9cb5a3ab6dc97d135c73d5Tadashi G. Takaoka
19b4598f7d05d6afd01ddc7ea0bed71dda837d1debTadashi G. Takaokaimport android.test.suitebuilder.annotation.SmallTest;
20b4598f7d05d6afd01ddc7ea0bed71dda837d1debTadashi G. Takaoka
21b4598f7d05d6afd01ddc7ea0bed71dda837d1debTadashi G. Takaoka@SmallTest
2260c4594ee6415b266b3418e46d09e6a5b3ed23e1Tadashi G. Takaokapublic class KeyboardStateMultiTouchTests extends KeyboardStateTestsBase {
23373f452584f5a6881d496eec9beb262fccf4a2a4Tadashi G. Takaoka    // Chording input in alphabet.
24373f452584f5a6881d496eec9beb262fccf4a2a4Tadashi G. Takaoka    public void testChordingAlphabet() {
256d5c9c9edceddb70b03728aca21fed48d01bd973Tadashi G. Takaoka        // Press shift key and hold, enter into choring shift state.
2664e01baadeb624781d9d056b62679b25ea0fe5c0Tadashi G. Takaoka        pressKey(CODE_SHIFT, ALPHABET_MANUAL_SHIFTED);
27373f452584f5a6881d496eec9beb262fccf4a2a4Tadashi G. Takaoka        // Press/release letter key.
2864e01baadeb624781d9d056b62679b25ea0fe5c0Tadashi G. Takaoka        chordingPressAndReleaseKey('Z', ALPHABET_MANUAL_SHIFTED, ALPHABET_MANUAL_SHIFTED);
2906bc1db017b14614353137fde035d2eed666a74fTadashi G. Takaoka        // Release shift key, switch back to alphabet.
3064e01baadeb624781d9d056b62679b25ea0fe5c0Tadashi G. Takaoka        releaseKey(CODE_SHIFT, ALPHABET_UNSHIFTED);
3106bc1db017b14614353137fde035d2eed666a74fTadashi G. Takaoka
32373f452584f5a6881d496eec9beb262fccf4a2a4Tadashi G. Takaoka        // Press "?123" key and hold, enter into choring symbols state.
33e3150664ae4d8d007b8571b5bd0fd2259aac3a20Satoshi Kataoka        pressKey(CODE_SYMBOL, SYMBOLS_UNSHIFTED);
34373f452584f5a6881d496eec9beb262fccf4a2a4Tadashi G. Takaoka        // Press/release symbol letter key.
35e3150664ae4d8d007b8571b5bd0fd2259aac3a20Satoshi Kataoka        chordingPressAndReleaseKey('1', SYMBOLS_UNSHIFTED, SYMBOLS_UNSHIFTED);
36373f452584f5a6881d496eec9beb262fccf4a2a4Tadashi G. Takaoka        // Release "ABC" key, switch back to alphabet.
3706bc1db017b14614353137fde035d2eed666a74fTadashi G. Takaoka        releaseKey(CODE_SYMBOL, ALPHABET_UNSHIFTED);
3806bc1db017b14614353137fde035d2eed666a74fTadashi G. Takaoka    }
3906bc1db017b14614353137fde035d2eed666a74fTadashi G. Takaoka
402972ccb85175d5211aa8f5c78d453efd628af8d3Tadashi G. Takaoka    // Chording input in shifted.
412972ccb85175d5211aa8f5c78d453efd628af8d3Tadashi G. Takaoka    public void testChordingShifted() {
422972ccb85175d5211aa8f5c78d453efd628af8d3Tadashi G. Takaoka        // Press shift key, enter alphabet shifted.
432972ccb85175d5211aa8f5c78d453efd628af8d3Tadashi G. Takaoka        pressAndReleaseKey(CODE_SHIFT, ALPHABET_MANUAL_SHIFTED, ALPHABET_MANUAL_SHIFTED);
442972ccb85175d5211aa8f5c78d453efd628af8d3Tadashi G. Takaoka
452972ccb85175d5211aa8f5c78d453efd628af8d3Tadashi G. Takaoka        // Press shift key and hold, enter into choring shift state.
462972ccb85175d5211aa8f5c78d453efd628af8d3Tadashi G. Takaoka        pressKey(CODE_SHIFT, ALPHABET_MANUAL_SHIFTED);
472972ccb85175d5211aa8f5c78d453efd628af8d3Tadashi G. Takaoka        // Press/release letter key.
482972ccb85175d5211aa8f5c78d453efd628af8d3Tadashi G. Takaoka        chordingPressAndReleaseKey('Z', ALPHABET_MANUAL_SHIFTED, ALPHABET_MANUAL_SHIFTED);
492972ccb85175d5211aa8f5c78d453efd628af8d3Tadashi G. Takaoka        // Release shift key, switch back to alphabet shifted.
502972ccb85175d5211aa8f5c78d453efd628af8d3Tadashi G. Takaoka        releaseKey(CODE_SHIFT, ALPHABET_MANUAL_SHIFTED);
512972ccb85175d5211aa8f5c78d453efd628af8d3Tadashi G. Takaoka
522972ccb85175d5211aa8f5c78d453efd628af8d3Tadashi G. Takaoka        // Press "?123" key and hold, enter into choring symbols state.
53e3150664ae4d8d007b8571b5bd0fd2259aac3a20Satoshi Kataoka        pressKey(CODE_SYMBOL, SYMBOLS_UNSHIFTED);
542972ccb85175d5211aa8f5c78d453efd628af8d3Tadashi G. Takaoka        // Press/release symbol letter key.
55e3150664ae4d8d007b8571b5bd0fd2259aac3a20Satoshi Kataoka        chordingPressAndReleaseKey('1', SYMBOLS_UNSHIFTED, SYMBOLS_UNSHIFTED);
567d045829b8cd613ab43cb88b4cf0d4f492827996Tadashi G. Takaoka        // Release "123?" key, switch back to alphabet unshifted.
572972ccb85175d5211aa8f5c78d453efd628af8d3Tadashi G. Takaoka        releaseKey(CODE_SYMBOL, ALPHABET_UNSHIFTED);
582972ccb85175d5211aa8f5c78d453efd628af8d3Tadashi G. Takaoka    }
592972ccb85175d5211aa8f5c78d453efd628af8d3Tadashi G. Takaoka
60373f452584f5a6881d496eec9beb262fccf4a2a4Tadashi G. Takaoka    // Chording input in shift locked.
61373f452584f5a6881d496eec9beb262fccf4a2a4Tadashi G. Takaoka    public void testChordingShiftLocked() {
6206bc1db017b14614353137fde035d2eed666a74fTadashi G. Takaoka        // Long press shift key, enter alphabet shift locked.
63f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka        longPressAndReleaseShiftKey(ALPHABET_MANUAL_SHIFTED, ALPHABET_MANUAL_SHIFTED,
640d6d4c20ce2e6ff75901d29aa9b2ad11b8dd1118Tadashi G. Takaoka                ALPHABET_SHIFT_LOCKED);
6506bc1db017b14614353137fde035d2eed666a74fTadashi G. Takaoka
6606bc1db017b14614353137fde035d2eed666a74fTadashi G. Takaoka        // Press shift key and hold, enter into choring shift state.
67757f8d96eea3dfb5951243d2ebb4b763db868471Tadashi G. Takaoka        pressKey(CODE_SHIFT, ALPHABET_SHIFT_LOCK_SHIFTED);
68373f452584f5a6881d496eec9beb262fccf4a2a4Tadashi G. Takaoka        // Press/release letter key.
69757f8d96eea3dfb5951243d2ebb4b763db868471Tadashi G. Takaoka        chordingPressAndReleaseKey('Z', ALPHABET_SHIFT_LOCK_SHIFTED, ALPHABET_SHIFT_LOCK_SHIFTED);
70d26d63b35d34333a8f6737572b1c306b774eebd0Tadashi G. Takaoka        // Release shift key, switch back to alphabet shift locked.
71d26d63b35d34333a8f6737572b1c306b774eebd0Tadashi G. Takaoka        releaseKey(CODE_SHIFT, ALPHABET_SHIFT_LOCKED);
72d26d63b35d34333a8f6737572b1c306b774eebd0Tadashi G. Takaoka
73373f452584f5a6881d496eec9beb262fccf4a2a4Tadashi G. Takaoka        // Press "?123" key and hold, enter into choring symbols state.
74e3150664ae4d8d007b8571b5bd0fd2259aac3a20Satoshi Kataoka        pressKey(CODE_SYMBOL, SYMBOLS_UNSHIFTED);
75373f452584f5a6881d496eec9beb262fccf4a2a4Tadashi G. Takaoka        // Press/release symbol letter key.
76e3150664ae4d8d007b8571b5bd0fd2259aac3a20Satoshi Kataoka        chordingPressAndReleaseKey('1', SYMBOLS_UNSHIFTED, SYMBOLS_UNSHIFTED);
77373f452584f5a6881d496eec9beb262fccf4a2a4Tadashi G. Takaoka        // Release "123?" key, switch back to alphabet shift locked.
78d26d63b35d34333a8f6737572b1c306b774eebd0Tadashi G. Takaoka        releaseKey(CODE_SYMBOL, ALPHABET_SHIFT_LOCKED);
79dfbe254de6f0bf722d9cb5a3ab6dc97d135c73d5Tadashi G. Takaoka    }
80dfbe254de6f0bf722d9cb5a3ab6dc97d135c73d5Tadashi G. Takaoka
81373f452584f5a6881d496eec9beb262fccf4a2a4Tadashi G. Takaoka    // Chording input in symbols.
82373f452584f5a6881d496eec9beb262fccf4a2a4Tadashi G. Takaoka    public void testChordingSymbols() {
83373f452584f5a6881d496eec9beb262fccf4a2a4Tadashi G. Takaoka        // Press/release "?123" key, enter symbols.
84e3150664ae4d8d007b8571b5bd0fd2259aac3a20Satoshi Kataoka        pressAndReleaseKey(CODE_SYMBOL, SYMBOLS_UNSHIFTED, SYMBOLS_UNSHIFTED);
85e3150664ae4d8d007b8571b5bd0fd2259aac3a20Satoshi Kataoka
86e3150664ae4d8d007b8571b5bd0fd2259aac3a20Satoshi Kataoka        // Press "=\<" key and hold, enter into choring symbols shifted state.
87e3150664ae4d8d007b8571b5bd0fd2259aac3a20Satoshi Kataoka        pressKey(CODE_SHIFT, SYMBOLS_SHIFTED);
88e3150664ae4d8d007b8571b5bd0fd2259aac3a20Satoshi Kataoka        // Press/release symbol letter key.
89e3150664ae4d8d007b8571b5bd0fd2259aac3a20Satoshi Kataoka        chordingPressAndReleaseKey('1', SYMBOLS_SHIFTED, SYMBOLS_SHIFTED);
90e3150664ae4d8d007b8571b5bd0fd2259aac3a20Satoshi Kataoka        // Release "=\<" key, switch back to symbols.
91e3150664ae4d8d007b8571b5bd0fd2259aac3a20Satoshi Kataoka        releaseKey(CODE_SHIFT, SYMBOLS_UNSHIFTED);
9206bc1db017b14614353137fde035d2eed666a74fTadashi G. Takaoka
9306bc1db017b14614353137fde035d2eed666a74fTadashi G. Takaoka        // Press "ABC" key and hold, enter into choring alphabet state.
9406bc1db017b14614353137fde035d2eed666a74fTadashi G. Takaoka        pressKey(CODE_SYMBOL, ALPHABET_UNSHIFTED);
95373f452584f5a6881d496eec9beb262fccf4a2a4Tadashi G. Takaoka        // Press/release letter key.
9606bc1db017b14614353137fde035d2eed666a74fTadashi G. Takaoka        chordingPressAndReleaseKey('a', ALPHABET_UNSHIFTED, ALPHABET_UNSHIFTED);
9706bc1db017b14614353137fde035d2eed666a74fTadashi G. Takaoka        // Release "ABC" key, switch back to symbols.
98e3150664ae4d8d007b8571b5bd0fd2259aac3a20Satoshi Kataoka        releaseKey(CODE_SYMBOL, SYMBOLS_UNSHIFTED);
99f057b25cddb3e5e18bc56e8ddaab541044c6ba58Tadashi G. Takaoka
100f057b25cddb3e5e18bc56e8ddaab541044c6ba58Tadashi G. Takaoka        // Alphabet shifted -> symbols -> "ABC" key + letter -> symbols
101f057b25cddb3e5e18bc56e8ddaab541044c6ba58Tadashi G. Takaoka        // -> alphabet.
102f057b25cddb3e5e18bc56e8ddaab541044c6ba58Tadashi G. Takaoka        // Load keyboard
103f057b25cddb3e5e18bc56e8ddaab541044c6ba58Tadashi G. Takaoka        loadKeyboard(ALPHABET_UNSHIFTED);
104f057b25cddb3e5e18bc56e8ddaab541044c6ba58Tadashi G. Takaoka        // Press/release shift key, enter alphabet shifted.
105f057b25cddb3e5e18bc56e8ddaab541044c6ba58Tadashi G. Takaoka        pressAndReleaseKey(CODE_SHIFT, ALPHABET_MANUAL_SHIFTED, ALPHABET_MANUAL_SHIFTED);
106f057b25cddb3e5e18bc56e8ddaab541044c6ba58Tadashi G. Takaoka        // Press/release "?123" key, enter into symbols.
107e3150664ae4d8d007b8571b5bd0fd2259aac3a20Satoshi Kataoka        pressAndReleaseKey(CODE_SYMBOL, SYMBOLS_UNSHIFTED, SYMBOLS_UNSHIFTED);
108f057b25cddb3e5e18bc56e8ddaab541044c6ba58Tadashi G. Takaoka        // Press "ABC" key, enter into chording alphabet state.
109f057b25cddb3e5e18bc56e8ddaab541044c6ba58Tadashi G. Takaoka        pressKey(CODE_SYMBOL, ALPHABET_UNSHIFTED);
110f057b25cddb3e5e18bc56e8ddaab541044c6ba58Tadashi G. Takaoka        // Enter/release letter key.
111f057b25cddb3e5e18bc56e8ddaab541044c6ba58Tadashi G. Takaoka        chordingPressAndReleaseKey('a', ALPHABET_UNSHIFTED, ALPHABET_UNSHIFTED);
112f057b25cddb3e5e18bc56e8ddaab541044c6ba58Tadashi G. Takaoka        // Release "ABC" key, switch back to symbols.
113e3150664ae4d8d007b8571b5bd0fd2259aac3a20Satoshi Kataoka        releaseKey(CODE_SYMBOL, SYMBOLS_UNSHIFTED);
114f057b25cddb3e5e18bc56e8ddaab541044c6ba58Tadashi G. Takaoka        // Press/release "ABC" key, switch to alphabet (not alphabet shifted).
115f057b25cddb3e5e18bc56e8ddaab541044c6ba58Tadashi G. Takaoka        pressAndReleaseKey(CODE_SYMBOL, ALPHABET_UNSHIFTED, ALPHABET_UNSHIFTED);
116f057b25cddb3e5e18bc56e8ddaab541044c6ba58Tadashi G. Takaoka
117f057b25cddb3e5e18bc56e8ddaab541044c6ba58Tadashi G. Takaoka        // Alphabet shift locked -> symbols -> "ABC" key + letter -> symbols ->
118f057b25cddb3e5e18bc56e8ddaab541044c6ba58Tadashi G. Takaoka        // alphabet shift locked.
119f057b25cddb3e5e18bc56e8ddaab541044c6ba58Tadashi G. Takaoka        // Load keyboard
120f057b25cddb3e5e18bc56e8ddaab541044c6ba58Tadashi G. Takaoka        loadKeyboard(ALPHABET_UNSHIFTED);
121f057b25cddb3e5e18bc56e8ddaab541044c6ba58Tadashi G. Takaoka        // Long press shift key, enter alphabet shift locked.
122f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka        longPressAndReleaseShiftKey(ALPHABET_MANUAL_SHIFTED, ALPHABET_MANUAL_SHIFTED,
1230d6d4c20ce2e6ff75901d29aa9b2ad11b8dd1118Tadashi G. Takaoka                ALPHABET_SHIFT_LOCKED);
124f057b25cddb3e5e18bc56e8ddaab541044c6ba58Tadashi G. Takaoka        // Press/release "?123" key, enter into symbols.
125e3150664ae4d8d007b8571b5bd0fd2259aac3a20Satoshi Kataoka        pressAndReleaseKey(CODE_SYMBOL, SYMBOLS_UNSHIFTED, SYMBOLS_UNSHIFTED);
126f057b25cddb3e5e18bc56e8ddaab541044c6ba58Tadashi G. Takaoka        // Press "ABC" key, enter into chording alphabet shift locked.
127f057b25cddb3e5e18bc56e8ddaab541044c6ba58Tadashi G. Takaoka        pressKey(CODE_SYMBOL, ALPHABET_SHIFT_LOCKED);
128f057b25cddb3e5e18bc56e8ddaab541044c6ba58Tadashi G. Takaoka        // Enter/release letter key.
129f057b25cddb3e5e18bc56e8ddaab541044c6ba58Tadashi G. Takaoka        chordingPressAndReleaseKey('A', ALPHABET_SHIFT_LOCKED, ALPHABET_SHIFT_LOCKED);
130f057b25cddb3e5e18bc56e8ddaab541044c6ba58Tadashi G. Takaoka        // Release "ABC" key, switch back to symbols.
131e3150664ae4d8d007b8571b5bd0fd2259aac3a20Satoshi Kataoka        releaseKey(CODE_SYMBOL, SYMBOLS_UNSHIFTED);
132e3150664ae4d8d007b8571b5bd0fd2259aac3a20Satoshi Kataoka        // Press/release "ABC" key, switch to alphabet shift locked.
133e3150664ae4d8d007b8571b5bd0fd2259aac3a20Satoshi Kataoka        pressAndReleaseKey(CODE_SYMBOL, ALPHABET_SHIFT_LOCKED, ALPHABET_SHIFT_LOCKED);
134e3150664ae4d8d007b8571b5bd0fd2259aac3a20Satoshi Kataoka
135e3150664ae4d8d007b8571b5bd0fd2259aac3a20Satoshi Kataoka        // Alphabet shift locked -> symbols -> "=\<" key + letter -> symbols ->
136e3150664ae4d8d007b8571b5bd0fd2259aac3a20Satoshi Kataoka        // alphabet shift locked.
137e3150664ae4d8d007b8571b5bd0fd2259aac3a20Satoshi Kataoka        // Load keyboard
138e3150664ae4d8d007b8571b5bd0fd2259aac3a20Satoshi Kataoka        loadKeyboard(ALPHABET_UNSHIFTED);
139e3150664ae4d8d007b8571b5bd0fd2259aac3a20Satoshi Kataoka        // Long press shift key, enter alphabet shift locked.
140e3150664ae4d8d007b8571b5bd0fd2259aac3a20Satoshi Kataoka        longPressAndReleaseShiftKey(ALPHABET_MANUAL_SHIFTED, ALPHABET_MANUAL_SHIFTED,
141e3150664ae4d8d007b8571b5bd0fd2259aac3a20Satoshi Kataoka                ALPHABET_SHIFT_LOCKED);
142e3150664ae4d8d007b8571b5bd0fd2259aac3a20Satoshi Kataoka        // Press/release "?123" key, enter into symbols.
143e3150664ae4d8d007b8571b5bd0fd2259aac3a20Satoshi Kataoka        pressAndReleaseKey(CODE_SYMBOL, SYMBOLS_UNSHIFTED, SYMBOLS_UNSHIFTED);
144e3150664ae4d8d007b8571b5bd0fd2259aac3a20Satoshi Kataoka        // Press "=\<" key, enter into symbols shifted chording state.
145e3150664ae4d8d007b8571b5bd0fd2259aac3a20Satoshi Kataoka        pressKey(CODE_SHIFT, SYMBOLS_SHIFTED);
146e3150664ae4d8d007b8571b5bd0fd2259aac3a20Satoshi Kataoka        // Enter/release symbols shift letter key.
147e3150664ae4d8d007b8571b5bd0fd2259aac3a20Satoshi Kataoka        chordingPressAndReleaseKey('~', SYMBOLS_SHIFTED, SYMBOLS_SHIFTED);
148e3150664ae4d8d007b8571b5bd0fd2259aac3a20Satoshi Kataoka        // Release "=\<" key, switch back to symbols.
149e3150664ae4d8d007b8571b5bd0fd2259aac3a20Satoshi Kataoka        releaseKey(CODE_SHIFT, SYMBOLS_UNSHIFTED);
150e3150664ae4d8d007b8571b5bd0fd2259aac3a20Satoshi Kataoka        // Press/release "ABC" key, switch to alphabet shift locked.
151e3150664ae4d8d007b8571b5bd0fd2259aac3a20Satoshi Kataoka        pressAndReleaseKey(CODE_SYMBOL, ALPHABET_SHIFT_LOCKED, ALPHABET_SHIFT_LOCKED);
152e3150664ae4d8d007b8571b5bd0fd2259aac3a20Satoshi Kataoka    }
153e3150664ae4d8d007b8571b5bd0fd2259aac3a20Satoshi Kataoka
154e3150664ae4d8d007b8571b5bd0fd2259aac3a20Satoshi Kataoka    // Chording input in symbol shifted.
155e3150664ae4d8d007b8571b5bd0fd2259aac3a20Satoshi Kataoka    public void testChordingSymbolsShifted() {
156e3150664ae4d8d007b8571b5bd0fd2259aac3a20Satoshi Kataoka        // Press/release "?123" key, enter symbols.
157e3150664ae4d8d007b8571b5bd0fd2259aac3a20Satoshi Kataoka        pressAndReleaseKey(CODE_SYMBOL, SYMBOLS_UNSHIFTED, SYMBOLS_UNSHIFTED);
158e3150664ae4d8d007b8571b5bd0fd2259aac3a20Satoshi Kataoka        // Press/release "=\<" key, enter symbols shifted.
159e3150664ae4d8d007b8571b5bd0fd2259aac3a20Satoshi Kataoka        pressAndReleaseKey(CODE_SHIFT, SYMBOLS_SHIFTED, SYMBOLS_SHIFTED);
160e3150664ae4d8d007b8571b5bd0fd2259aac3a20Satoshi Kataoka
161e3150664ae4d8d007b8571b5bd0fd2259aac3a20Satoshi Kataoka        // Press "?123" key and hold, enter into chording symbols state.
162e3150664ae4d8d007b8571b5bd0fd2259aac3a20Satoshi Kataoka        pressKey(CODE_SHIFT, SYMBOLS_UNSHIFTED);
163e3150664ae4d8d007b8571b5bd0fd2259aac3a20Satoshi Kataoka        // Press/release symbol letter key.
164e3150664ae4d8d007b8571b5bd0fd2259aac3a20Satoshi Kataoka        chordingPressAndReleaseKey('1', SYMBOLS_UNSHIFTED, SYMBOLS_UNSHIFTED);
165e3150664ae4d8d007b8571b5bd0fd2259aac3a20Satoshi Kataoka        // Release "=\<" key, switch back to symbols shifted state.
166e3150664ae4d8d007b8571b5bd0fd2259aac3a20Satoshi Kataoka        releaseKey(CODE_SHIFT, SYMBOLS_SHIFTED);
167e3150664ae4d8d007b8571b5bd0fd2259aac3a20Satoshi Kataoka
168e3150664ae4d8d007b8571b5bd0fd2259aac3a20Satoshi Kataoka        // Press "ABC" key and hold, enter into choring alphabet state.
169e3150664ae4d8d007b8571b5bd0fd2259aac3a20Satoshi Kataoka        pressKey(CODE_SYMBOL, ALPHABET_UNSHIFTED);
170e3150664ae4d8d007b8571b5bd0fd2259aac3a20Satoshi Kataoka        // Press/release letter key.
171e3150664ae4d8d007b8571b5bd0fd2259aac3a20Satoshi Kataoka        chordingPressAndReleaseKey('a', ALPHABET_UNSHIFTED, ALPHABET_UNSHIFTED);
172e3150664ae4d8d007b8571b5bd0fd2259aac3a20Satoshi Kataoka        // Release "ABC" key, switch back to symbols.
173e3150664ae4d8d007b8571b5bd0fd2259aac3a20Satoshi Kataoka        releaseKey(CODE_SYMBOL, SYMBOLS_SHIFTED);
174e3150664ae4d8d007b8571b5bd0fd2259aac3a20Satoshi Kataoka
175e3150664ae4d8d007b8571b5bd0fd2259aac3a20Satoshi Kataoka        // Alphabet shifted -> symbols shifted -> "ABC" key + letter -> symbols shifted ->
176e3150664ae4d8d007b8571b5bd0fd2259aac3a20Satoshi Kataoka        // alphabet.
177e3150664ae4d8d007b8571b5bd0fd2259aac3a20Satoshi Kataoka        // Load keyboard
178e3150664ae4d8d007b8571b5bd0fd2259aac3a20Satoshi Kataoka        loadKeyboard(ALPHABET_UNSHIFTED);
179e3150664ae4d8d007b8571b5bd0fd2259aac3a20Satoshi Kataoka        // Press/release shift key, enter alphabet shifted.
180e3150664ae4d8d007b8571b5bd0fd2259aac3a20Satoshi Kataoka        pressAndReleaseKey(CODE_SHIFT, ALPHABET_MANUAL_SHIFTED, ALPHABET_MANUAL_SHIFTED);
181e3150664ae4d8d007b8571b5bd0fd2259aac3a20Satoshi Kataoka        // Press/release "?123" key, enter into symbols.
182e3150664ae4d8d007b8571b5bd0fd2259aac3a20Satoshi Kataoka        pressAndReleaseKey(CODE_SYMBOL, SYMBOLS_UNSHIFTED, SYMBOLS_UNSHIFTED);
183e3150664ae4d8d007b8571b5bd0fd2259aac3a20Satoshi Kataoka        // Press/release "=\<" key, enter symbols shifted.
184e3150664ae4d8d007b8571b5bd0fd2259aac3a20Satoshi Kataoka        pressAndReleaseKey(CODE_SHIFT, SYMBOLS_SHIFTED, SYMBOLS_SHIFTED);
185e3150664ae4d8d007b8571b5bd0fd2259aac3a20Satoshi Kataoka        // Press "ABC" key, enter into chording alphabet state.
186e3150664ae4d8d007b8571b5bd0fd2259aac3a20Satoshi Kataoka        pressKey(CODE_SYMBOL, ALPHABET_UNSHIFTED);
187e3150664ae4d8d007b8571b5bd0fd2259aac3a20Satoshi Kataoka        // Enter/release letter key.
188e3150664ae4d8d007b8571b5bd0fd2259aac3a20Satoshi Kataoka        chordingPressAndReleaseKey('a', ALPHABET_UNSHIFTED, ALPHABET_UNSHIFTED);
189e3150664ae4d8d007b8571b5bd0fd2259aac3a20Satoshi Kataoka        // Release "ABC" key, switch back to symbols shifted.
190e3150664ae4d8d007b8571b5bd0fd2259aac3a20Satoshi Kataoka        releaseKey(CODE_SYMBOL, SYMBOLS_SHIFTED);
191e3150664ae4d8d007b8571b5bd0fd2259aac3a20Satoshi Kataoka        // Press/release "ABC" key, switch to alphabet (not alphabet shifted).
192e3150664ae4d8d007b8571b5bd0fd2259aac3a20Satoshi Kataoka        pressAndReleaseKey(CODE_SYMBOL, ALPHABET_UNSHIFTED, ALPHABET_UNSHIFTED);
193e3150664ae4d8d007b8571b5bd0fd2259aac3a20Satoshi Kataoka
194e3150664ae4d8d007b8571b5bd0fd2259aac3a20Satoshi Kataoka        // Alphabet shift locked -> symbols shifted -> "ABC" key + letter -> symbols shifted
195e3150664ae4d8d007b8571b5bd0fd2259aac3a20Satoshi Kataoka        // -> alphabet shift locked.
196e3150664ae4d8d007b8571b5bd0fd2259aac3a20Satoshi Kataoka        // Load keyboard
197e3150664ae4d8d007b8571b5bd0fd2259aac3a20Satoshi Kataoka        loadKeyboard(ALPHABET_UNSHIFTED);
198e3150664ae4d8d007b8571b5bd0fd2259aac3a20Satoshi Kataoka        // Long press shift key, enter alphabet shift locked.
199e3150664ae4d8d007b8571b5bd0fd2259aac3a20Satoshi Kataoka        longPressAndReleaseShiftKey(ALPHABET_MANUAL_SHIFTED, ALPHABET_MANUAL_SHIFTED,
200e3150664ae4d8d007b8571b5bd0fd2259aac3a20Satoshi Kataoka                ALPHABET_SHIFT_LOCKED);
201e3150664ae4d8d007b8571b5bd0fd2259aac3a20Satoshi Kataoka        // Press/release "?123" key, enter into symbols.
202e3150664ae4d8d007b8571b5bd0fd2259aac3a20Satoshi Kataoka        pressAndReleaseKey(CODE_SYMBOL, SYMBOLS_UNSHIFTED, SYMBOLS_UNSHIFTED);
203e3150664ae4d8d007b8571b5bd0fd2259aac3a20Satoshi Kataoka        // Press/release "=\<" key, enter symbols shifted.
204e3150664ae4d8d007b8571b5bd0fd2259aac3a20Satoshi Kataoka        pressAndReleaseKey(CODE_SHIFT, SYMBOLS_SHIFTED, SYMBOLS_SHIFTED);
205e3150664ae4d8d007b8571b5bd0fd2259aac3a20Satoshi Kataoka        // Press "ABC" key, enter into chording alphabet shift locked.
206e3150664ae4d8d007b8571b5bd0fd2259aac3a20Satoshi Kataoka        pressKey(CODE_SYMBOL, ALPHABET_SHIFT_LOCKED);
207e3150664ae4d8d007b8571b5bd0fd2259aac3a20Satoshi Kataoka        // Enter/release letter key.
208e3150664ae4d8d007b8571b5bd0fd2259aac3a20Satoshi Kataoka        chordingPressAndReleaseKey('A', ALPHABET_SHIFT_LOCKED, ALPHABET_SHIFT_LOCKED);
209e3150664ae4d8d007b8571b5bd0fd2259aac3a20Satoshi Kataoka        // Release "ABC" key, switch back to symbols shifted.
210e3150664ae4d8d007b8571b5bd0fd2259aac3a20Satoshi Kataoka        releaseKey(CODE_SYMBOL, SYMBOLS_SHIFTED);
211e3150664ae4d8d007b8571b5bd0fd2259aac3a20Satoshi Kataoka        // Press/release "ABC" key, switch to alphabet shift locked.
212e3150664ae4d8d007b8571b5bd0fd2259aac3a20Satoshi Kataoka        pressAndReleaseKey(CODE_SYMBOL, ALPHABET_SHIFT_LOCKED, ALPHABET_SHIFT_LOCKED);
213e3150664ae4d8d007b8571b5bd0fd2259aac3a20Satoshi Kataoka
214e3150664ae4d8d007b8571b5bd0fd2259aac3a20Satoshi Kataoka        // Alphabet shift locked -> symbols shifted -> "=\<" key + letter -> symbols shifted
215e3150664ae4d8d007b8571b5bd0fd2259aac3a20Satoshi Kataoka        // -> alphabet shift locked.
216e3150664ae4d8d007b8571b5bd0fd2259aac3a20Satoshi Kataoka        // Load keyboard
217e3150664ae4d8d007b8571b5bd0fd2259aac3a20Satoshi Kataoka        loadKeyboard(ALPHABET_UNSHIFTED);
218e3150664ae4d8d007b8571b5bd0fd2259aac3a20Satoshi Kataoka        // Long press shift key, enter alphabet shift locked.
219e3150664ae4d8d007b8571b5bd0fd2259aac3a20Satoshi Kataoka        longPressAndReleaseShiftKey(ALPHABET_MANUAL_SHIFTED, ALPHABET_MANUAL_SHIFTED,
220e3150664ae4d8d007b8571b5bd0fd2259aac3a20Satoshi Kataoka                ALPHABET_SHIFT_LOCKED);
221e3150664ae4d8d007b8571b5bd0fd2259aac3a20Satoshi Kataoka        // Press/release "?123" key, enter into symbols.
222e3150664ae4d8d007b8571b5bd0fd2259aac3a20Satoshi Kataoka        pressAndReleaseKey(CODE_SYMBOL, SYMBOLS_UNSHIFTED, SYMBOLS_UNSHIFTED);
223e3150664ae4d8d007b8571b5bd0fd2259aac3a20Satoshi Kataoka        // Press/release "=\<" key, enter symbols shifted.
224e3150664ae4d8d007b8571b5bd0fd2259aac3a20Satoshi Kataoka        pressAndReleaseKey(CODE_SHIFT, SYMBOLS_SHIFTED, SYMBOLS_SHIFTED);
225e3150664ae4d8d007b8571b5bd0fd2259aac3a20Satoshi Kataoka        // Press "=\<" key, enter into symbols chording state.
226e3150664ae4d8d007b8571b5bd0fd2259aac3a20Satoshi Kataoka        pressKey(CODE_SHIFT, SYMBOLS_UNSHIFTED);
227e3150664ae4d8d007b8571b5bd0fd2259aac3a20Satoshi Kataoka        // Enter/release symbols letter key.
228e3150664ae4d8d007b8571b5bd0fd2259aac3a20Satoshi Kataoka        chordingPressAndReleaseKey('1', SYMBOLS_UNSHIFTED, SYMBOLS_UNSHIFTED);
229e3150664ae4d8d007b8571b5bd0fd2259aac3a20Satoshi Kataoka        // Release "=\<" key, switch back to symbols shifted.
230e3150664ae4d8d007b8571b5bd0fd2259aac3a20Satoshi Kataoka        releaseKey(CODE_SHIFT, SYMBOLS_SHIFTED);
231f057b25cddb3e5e18bc56e8ddaab541044c6ba58Tadashi G. Takaoka        // Press/release "ABC" key, switch to alphabet shift locked.
232f057b25cddb3e5e18bc56e8ddaab541044c6ba58Tadashi G. Takaoka        pressAndReleaseKey(CODE_SYMBOL, ALPHABET_SHIFT_LOCKED, ALPHABET_SHIFT_LOCKED);
2336d5c9c9edceddb70b03728aca21fed48d01bd973Tadashi G. Takaoka    }
2346d5c9c9edceddb70b03728aca21fed48d01bd973Tadashi G. Takaoka
235373f452584f5a6881d496eec9beb262fccf4a2a4Tadashi G. Takaoka    // Chording input in automatic upper case.
236373f452584f5a6881d496eec9beb262fccf4a2a4Tadashi G. Takaoka    public void testChordingAutomaticUpperCase() {
237553e2f19c1607080ff874cb642237f947809cdb3Tadashi G. Takaoka        // Set capitalize the first character of all words mode.
238553e2f19c1607080ff874cb642237f947809cdb3Tadashi G. Takaoka        setAutoCapsMode(CAP_MODE_WORDS);
23964e01baadeb624781d9d056b62679b25ea0fe5c0Tadashi G. Takaoka
2406d5c9c9edceddb70b03728aca21fed48d01bd973Tadashi G. Takaoka        // Update shift state with auto caps enabled.
241373f452584f5a6881d496eec9beb262fccf4a2a4Tadashi G. Takaoka        pressAndReleaseKey(CODE_AUTO_CAPS_TRIGGER, ALPHABET_UNSHIFTED, ALPHABET_AUTOMATIC_SHIFTED);
24206bc1db017b14614353137fde035d2eed666a74fTadashi G. Takaoka        // Press shift key and hold, enter into chording shift state.
24364e01baadeb624781d9d056b62679b25ea0fe5c0Tadashi G. Takaoka        pressKey(CODE_SHIFT, ALPHABET_MANUAL_SHIFTED);
244373f452584f5a6881d496eec9beb262fccf4a2a4Tadashi G. Takaoka        // Press/release letter key.
24564e01baadeb624781d9d056b62679b25ea0fe5c0Tadashi G. Takaoka        chordingPressAndReleaseKey('Z', ALPHABET_MANUAL_SHIFTED, ALPHABET_MANUAL_SHIFTED);
24606bc1db017b14614353137fde035d2eed666a74fTadashi G. Takaoka        // Release shift key, switch back to alphabet.
24764e01baadeb624781d9d056b62679b25ea0fe5c0Tadashi G. Takaoka        releaseKey(CODE_SHIFT, ALPHABET_UNSHIFTED);
24864e01baadeb624781d9d056b62679b25ea0fe5c0Tadashi G. Takaoka
2496d5c9c9edceddb70b03728aca21fed48d01bd973Tadashi G. Takaoka        // Update shift state with auto caps enabled.
250373f452584f5a6881d496eec9beb262fccf4a2a4Tadashi G. Takaoka        pressAndReleaseKey(CODE_AUTO_CAPS_TRIGGER, ALPHABET_UNSHIFTED, ALPHABET_AUTOMATIC_SHIFTED);
25106bc1db017b14614353137fde035d2eed666a74fTadashi G. Takaoka        // Press "123?" key and hold, enter into chording symbols state.
252e3150664ae4d8d007b8571b5bd0fd2259aac3a20Satoshi Kataoka        pressKey(CODE_SYMBOL, SYMBOLS_UNSHIFTED);
253373f452584f5a6881d496eec9beb262fccf4a2a4Tadashi G. Takaoka        // Press/release symbol letter key.
254e3150664ae4d8d007b8571b5bd0fd2259aac3a20Satoshi Kataoka        chordingPressAndReleaseKey('1', SYMBOLS_UNSHIFTED, SYMBOLS_UNSHIFTED);
25506bc1db017b14614353137fde035d2eed666a74fTadashi G. Takaoka        // Release "123?" key, switch back to alphabet.
25664e01baadeb624781d9d056b62679b25ea0fe5c0Tadashi G. Takaoka        releaseKey(CODE_SYMBOL, ALPHABET_UNSHIFTED);
2576d5c9c9edceddb70b03728aca21fed48d01bd973Tadashi G. Takaoka    }
258beb08b398fa73a26f2d42d6feec87e34a96ca2d9Tadashi G. Takaoka
259beb08b398fa73a26f2d42d6feec87e34a96ca2d9Tadashi G. Takaoka    // Chording letter key with shift key.
260beb08b398fa73a26f2d42d6feec87e34a96ca2d9Tadashi G. Takaoka    public void testChordingLetterAndShiftKey() {
261beb08b398fa73a26f2d42d6feec87e34a96ca2d9Tadashi G. Takaoka        // Press letter key and hold.
262beb08b398fa73a26f2d42d6feec87e34a96ca2d9Tadashi G. Takaoka        pressKey('z', ALPHABET_UNSHIFTED);
263beb08b398fa73a26f2d42d6feec87e34a96ca2d9Tadashi G. Takaoka        // Press shift key, {@link PointerTracker} will fire a phantom release letter key.
264beb08b398fa73a26f2d42d6feec87e34a96ca2d9Tadashi G. Takaoka        chordingReleaseKey('z', ALPHABET_UNSHIFTED);
265beb08b398fa73a26f2d42d6feec87e34a96ca2d9Tadashi G. Takaoka        chordingPressKey(CODE_SHIFT, ALPHABET_MANUAL_SHIFTED);
266beb08b398fa73a26f2d42d6feec87e34a96ca2d9Tadashi G. Takaoka        // Press another letter key and hold.
267beb08b398fa73a26f2d42d6feec87e34a96ca2d9Tadashi G. Takaoka        chordingPressAndReleaseKey('J', ALPHABET_MANUAL_SHIFTED, ALPHABET_MANUAL_SHIFTED);
268beb08b398fa73a26f2d42d6feec87e34a96ca2d9Tadashi G. Takaoka        // Release shift key
269beb08b398fa73a26f2d42d6feec87e34a96ca2d9Tadashi G. Takaoka        releaseKey(CODE_SHIFT, ALPHABET_UNSHIFTED);
270beb08b398fa73a26f2d42d6feec87e34a96ca2d9Tadashi G. Takaoka    }
2712972ccb85175d5211aa8f5c78d453efd628af8d3Tadashi G. Takaoka
2722972ccb85175d5211aa8f5c78d453efd628af8d3Tadashi G. Takaoka    // Multi touch input in manual shifted.
2732972ccb85175d5211aa8f5c78d453efd628af8d3Tadashi G. Takaoka    public void testMultiTouchManualShifted() {
2742972ccb85175d5211aa8f5c78d453efd628af8d3Tadashi G. Takaoka        // Press/release shift key, enter into alphabet shifted.
2752972ccb85175d5211aa8f5c78d453efd628af8d3Tadashi G. Takaoka        pressAndReleaseKey(CODE_SHIFT, ALPHABET_MANUAL_SHIFTED, ALPHABET_MANUAL_SHIFTED);
2762972ccb85175d5211aa8f5c78d453efd628af8d3Tadashi G. Takaoka
2772972ccb85175d5211aa8f5c78d453efd628af8d3Tadashi G. Takaoka        // Press 'X' key and hold
2782972ccb85175d5211aa8f5c78d453efd628af8d3Tadashi G. Takaoka        pressKey('X', ALPHABET_MANUAL_SHIFTED);
27916950d65c323f99507d97cb7f0403dc653e2506cTadashi G. Takaoka        // Press 'z' key and hold, switch back to alphabet unshifted.
28016950d65c323f99507d97cb7f0403dc653e2506cTadashi G. Takaoka        chordingPressKey('z', ALPHABET_UNSHIFTED);
28116950d65c323f99507d97cb7f0403dc653e2506cTadashi G. Takaoka        // Release 'X' key
28216950d65c323f99507d97cb7f0403dc653e2506cTadashi G. Takaoka        releaseKey('X', ALPHABET_UNSHIFTED);
28316950d65c323f99507d97cb7f0403dc653e2506cTadashi G. Takaoka        // Release 'z' key
28416950d65c323f99507d97cb7f0403dc653e2506cTadashi G. Takaoka        releaseKey('z', ALPHABET_UNSHIFTED);
2852972ccb85175d5211aa8f5c78d453efd628af8d3Tadashi G. Takaoka    }
2862972ccb85175d5211aa8f5c78d453efd628af8d3Tadashi G. Takaoka
2872972ccb85175d5211aa8f5c78d453efd628af8d3Tadashi G. Takaoka    // Multi touch input in automatic upper case.
2882972ccb85175d5211aa8f5c78d453efd628af8d3Tadashi G. Takaoka    public void testMultiTouchAutomaticUpperCase() {
2892972ccb85175d5211aa8f5c78d453efd628af8d3Tadashi G. Takaoka        // Set auto word caps mode on.
2902972ccb85175d5211aa8f5c78d453efd628af8d3Tadashi G. Takaoka        setAutoCapsMode(CAP_MODE_WORDS);
2912972ccb85175d5211aa8f5c78d453efd628af8d3Tadashi G. Takaoka        // Update shift state with auto caps enabled.
2922972ccb85175d5211aa8f5c78d453efd628af8d3Tadashi G. Takaoka        pressAndReleaseKey(CODE_AUTO_CAPS_TRIGGER, ALPHABET_UNSHIFTED, ALPHABET_AUTOMATIC_SHIFTED);
2932972ccb85175d5211aa8f5c78d453efd628af8d3Tadashi G. Takaoka
2942972ccb85175d5211aa8f5c78d453efd628af8d3Tadashi G. Takaoka        // Press 'X' key and hold
2952972ccb85175d5211aa8f5c78d453efd628af8d3Tadashi G. Takaoka        pressKey('X', ALPHABET_AUTOMATIC_SHIFTED);
29616950d65c323f99507d97cb7f0403dc653e2506cTadashi G. Takaoka        // Press 'z' key and hold, switch back to alphabet unshifted.
29716950d65c323f99507d97cb7f0403dc653e2506cTadashi G. Takaoka        chordingPressKey('z', ALPHABET_UNSHIFTED);
29816950d65c323f99507d97cb7f0403dc653e2506cTadashi G. Takaoka        // Release 'X' key
29916950d65c323f99507d97cb7f0403dc653e2506cTadashi G. Takaoka        releaseKey('X', ALPHABET_UNSHIFTED);
30016950d65c323f99507d97cb7f0403dc653e2506cTadashi G. Takaoka        // Release 'z' key
30116950d65c323f99507d97cb7f0403dc653e2506cTadashi G. Takaoka        releaseKey('z', ALPHABET_UNSHIFTED);
3022972ccb85175d5211aa8f5c78d453efd628af8d3Tadashi G. Takaoka    }
3032972ccb85175d5211aa8f5c78d453efd628af8d3Tadashi G. Takaoka
3042972ccb85175d5211aa8f5c78d453efd628af8d3Tadashi G. Takaoka    // Multi touch input in capitalize character mode.
3052972ccb85175d5211aa8f5c78d453efd628af8d3Tadashi G. Takaoka    public void testMultiTouchCapModeCharacter() {
3062972ccb85175d5211aa8f5c78d453efd628af8d3Tadashi G. Takaoka        // Set auto character caps mode on.
3072972ccb85175d5211aa8f5c78d453efd628af8d3Tadashi G. Takaoka        setAutoCapsMode(CAP_MODE_CHARACTERS);
3082972ccb85175d5211aa8f5c78d453efd628af8d3Tadashi G. Takaoka        // Update shift state with auto caps enabled.
3092972ccb85175d5211aa8f5c78d453efd628af8d3Tadashi G. Takaoka        pressAndReleaseKey(CODE_AUTO_CAPS_TRIGGER, ALPHABET_UNSHIFTED, ALPHABET_AUTOMATIC_SHIFTED);
3102972ccb85175d5211aa8f5c78d453efd628af8d3Tadashi G. Takaoka
3112972ccb85175d5211aa8f5c78d453efd628af8d3Tadashi G. Takaoka        // Press 'X' key and hold
3122972ccb85175d5211aa8f5c78d453efd628af8d3Tadashi G. Takaoka        pressKey('X', ALPHABET_AUTOMATIC_SHIFTED);
3132972ccb85175d5211aa8f5c78d453efd628af8d3Tadashi G. Takaoka        // Press 'Z' key and hold, stay in automatic shifted mode.
3142972ccb85175d5211aa8f5c78d453efd628af8d3Tadashi G. Takaoka        chordingPressKey('Z', ALPHABET_AUTOMATIC_SHIFTED);
3152972ccb85175d5211aa8f5c78d453efd628af8d3Tadashi G. Takaoka        // Release 'X' key
3162972ccb85175d5211aa8f5c78d453efd628af8d3Tadashi G. Takaoka        releaseKey('X', ALPHABET_AUTOMATIC_SHIFTED);
3172972ccb85175d5211aa8f5c78d453efd628af8d3Tadashi G. Takaoka        // Release 'Z' key
3182972ccb85175d5211aa8f5c78d453efd628af8d3Tadashi G. Takaoka        releaseKey('Z', ALPHABET_AUTOMATIC_SHIFTED);
3192972ccb85175d5211aa8f5c78d453efd628af8d3Tadashi G. Takaoka    }
3202972ccb85175d5211aa8f5c78d453efd628af8d3Tadashi G. Takaoka
3212972ccb85175d5211aa8f5c78d453efd628af8d3Tadashi G. Takaoka    // Multi touch shift chording input in manual shifted.
3222972ccb85175d5211aa8f5c78d453efd628af8d3Tadashi G. Takaoka    public void testMultiTouchShiftChordingManualShifted() {
3232972ccb85175d5211aa8f5c78d453efd628af8d3Tadashi G. Takaoka        // Press/release shift key, enter into alphabet shifted.
3242972ccb85175d5211aa8f5c78d453efd628af8d3Tadashi G. Takaoka        pressAndReleaseKey(CODE_SHIFT, ALPHABET_MANUAL_SHIFTED, ALPHABET_MANUAL_SHIFTED);
3252972ccb85175d5211aa8f5c78d453efd628af8d3Tadashi G. Takaoka
3262972ccb85175d5211aa8f5c78d453efd628af8d3Tadashi G. Takaoka        // Press shift key and hold, stays in alphabet shifted.
3272972ccb85175d5211aa8f5c78d453efd628af8d3Tadashi G. Takaoka        pressKey(CODE_SHIFT, ALPHABET_MANUAL_SHIFTED);
3282972ccb85175d5211aa8f5c78d453efd628af8d3Tadashi G. Takaoka        // Press 'X' key and hold
3292972ccb85175d5211aa8f5c78d453efd628af8d3Tadashi G. Takaoka        chordingPressKey('X', ALPHABET_MANUAL_SHIFTED);
3302972ccb85175d5211aa8f5c78d453efd628af8d3Tadashi G. Takaoka        // Press 'Z' key and hold, stays in alphabet shifted.
3312972ccb85175d5211aa8f5c78d453efd628af8d3Tadashi G. Takaoka        chordingPressKey('Z', ALPHABET_MANUAL_SHIFTED);
3322972ccb85175d5211aa8f5c78d453efd628af8d3Tadashi G. Takaoka        // Release 'X' key
3332972ccb85175d5211aa8f5c78d453efd628af8d3Tadashi G. Takaoka        releaseKey('X', ALPHABET_MANUAL_SHIFTED);
3342972ccb85175d5211aa8f5c78d453efd628af8d3Tadashi G. Takaoka        // Release 'Z' key
3352972ccb85175d5211aa8f5c78d453efd628af8d3Tadashi G. Takaoka        releaseKey('Z', ALPHABET_MANUAL_SHIFTED);
3367d045829b8cd613ab43cb88b4cf0d4f492827996Tadashi G. Takaoka        // Release shift key, switch back to alphabet shifted.
3372972ccb85175d5211aa8f5c78d453efd628af8d3Tadashi G. Takaoka        releaseKey(CODE_SHIFT, ALPHABET_MANUAL_SHIFTED);
3382972ccb85175d5211aa8f5c78d453efd628af8d3Tadashi G. Takaoka    }
3392972ccb85175d5211aa8f5c78d453efd628af8d3Tadashi G. Takaoka
3402972ccb85175d5211aa8f5c78d453efd628af8d3Tadashi G. Takaoka    // Multi touch shift chording input in automatic upper case.
3412972ccb85175d5211aa8f5c78d453efd628af8d3Tadashi G. Takaoka    public void testMultiTouchShiftChordingAutomaticUpperCase() {
3422972ccb85175d5211aa8f5c78d453efd628af8d3Tadashi G. Takaoka        // Set auto word caps mode on.
3432972ccb85175d5211aa8f5c78d453efd628af8d3Tadashi G. Takaoka        setAutoCapsMode(CAP_MODE_WORDS);
3442972ccb85175d5211aa8f5c78d453efd628af8d3Tadashi G. Takaoka        // Update shift state with auto caps enabled.
3452972ccb85175d5211aa8f5c78d453efd628af8d3Tadashi G. Takaoka        pressAndReleaseKey(CODE_AUTO_CAPS_TRIGGER, ALPHABET_UNSHIFTED, ALPHABET_AUTOMATIC_SHIFTED);
3462972ccb85175d5211aa8f5c78d453efd628af8d3Tadashi G. Takaoka
3472972ccb85175d5211aa8f5c78d453efd628af8d3Tadashi G. Takaoka        // Press shift key and hold, switch to alphabet shifted.
3482972ccb85175d5211aa8f5c78d453efd628af8d3Tadashi G. Takaoka        pressKey(CODE_SHIFT, ALPHABET_MANUAL_SHIFTED);
3492972ccb85175d5211aa8f5c78d453efd628af8d3Tadashi G. Takaoka        // Press 'X' key and hold
3502972ccb85175d5211aa8f5c78d453efd628af8d3Tadashi G. Takaoka        chordingPressKey('X', ALPHABET_MANUAL_SHIFTED);
3512972ccb85175d5211aa8f5c78d453efd628af8d3Tadashi G. Takaoka        // Press 'Z' key and hold, stays in alphabet shifted.
3522972ccb85175d5211aa8f5c78d453efd628af8d3Tadashi G. Takaoka        chordingPressKey('Z', ALPHABET_MANUAL_SHIFTED);
3532972ccb85175d5211aa8f5c78d453efd628af8d3Tadashi G. Takaoka        // Release 'X' key
3542972ccb85175d5211aa8f5c78d453efd628af8d3Tadashi G. Takaoka        releaseKey('X', ALPHABET_MANUAL_SHIFTED);
3552972ccb85175d5211aa8f5c78d453efd628af8d3Tadashi G. Takaoka        // Release 'Z' key
3562972ccb85175d5211aa8f5c78d453efd628af8d3Tadashi G. Takaoka        releaseKey('Z', ALPHABET_MANUAL_SHIFTED);
3577d045829b8cd613ab43cb88b4cf0d4f492827996Tadashi G. Takaoka        // Release shift key, updated to alphabet unshifted.
3582972ccb85175d5211aa8f5c78d453efd628af8d3Tadashi G. Takaoka        releaseKey(CODE_SHIFT, ALPHABET_UNSHIFTED);
3597d045829b8cd613ab43cb88b4cf0d4f492827996Tadashi G. Takaoka
3607d045829b8cd613ab43cb88b4cf0d4f492827996Tadashi G. Takaoka        // Update shift state with auto caps enabled.
3617d045829b8cd613ab43cb88b4cf0d4f492827996Tadashi G. Takaoka        pressAndReleaseKey(CODE_AUTO_CAPS_TRIGGER, ALPHABET_UNSHIFTED, ALPHABET_AUTOMATIC_SHIFTED);
3627d045829b8cd613ab43cb88b4cf0d4f492827996Tadashi G. Takaoka
3637d045829b8cd613ab43cb88b4cf0d4f492827996Tadashi G. Takaoka        // Press shift key and hold, switch to alphabet shifted.
3647d045829b8cd613ab43cb88b4cf0d4f492827996Tadashi G. Takaoka        pressKey(CODE_SHIFT, ALPHABET_MANUAL_SHIFTED);
3657d045829b8cd613ab43cb88b4cf0d4f492827996Tadashi G. Takaoka        // Press 'X' key and hold
3667d045829b8cd613ab43cb88b4cf0d4f492827996Tadashi G. Takaoka        chordingPressKey('X', ALPHABET_MANUAL_SHIFTED);
3677d045829b8cd613ab43cb88b4cf0d4f492827996Tadashi G. Takaoka        // Release 'X' key
3687d045829b8cd613ab43cb88b4cf0d4f492827996Tadashi G. Takaoka        releaseKey('X', ALPHABET_MANUAL_SHIFTED);
3697d045829b8cd613ab43cb88b4cf0d4f492827996Tadashi G. Takaoka        // Press  key and hold, stays in alphabet shifted.
3707d045829b8cd613ab43cb88b4cf0d4f492827996Tadashi G. Takaoka        chordingPressKey(CODE_AUTO_CAPS_TRIGGER, ALPHABET_MANUAL_SHIFTED);
3717d045829b8cd613ab43cb88b4cf0d4f492827996Tadashi G. Takaoka        // Release 'Z' key
3727d045829b8cd613ab43cb88b4cf0d4f492827996Tadashi G. Takaoka        releaseKey(CODE_AUTO_CAPS_TRIGGER, ALPHABET_MANUAL_SHIFTED);
3737d045829b8cd613ab43cb88b4cf0d4f492827996Tadashi G. Takaoka        // Release shift key, updated to alphabet automatic shifted.
3747d045829b8cd613ab43cb88b4cf0d4f492827996Tadashi G. Takaoka        releaseKey(CODE_SHIFT, ALPHABET_AUTOMATIC_SHIFTED);
3752972ccb85175d5211aa8f5c78d453efd628af8d3Tadashi G. Takaoka    }
3762972ccb85175d5211aa8f5c78d453efd628af8d3Tadashi G. Takaoka
3772972ccb85175d5211aa8f5c78d453efd628af8d3Tadashi G. Takaoka    // Multi touch shift chording input in capitalize character mode.
3782972ccb85175d5211aa8f5c78d453efd628af8d3Tadashi G. Takaoka    public void testMultiTouchShiftChordingCapModeCharacter() {
3792972ccb85175d5211aa8f5c78d453efd628af8d3Tadashi G. Takaoka        // Set auto character caps mode on.
3802972ccb85175d5211aa8f5c78d453efd628af8d3Tadashi G. Takaoka        setAutoCapsMode(CAP_MODE_CHARACTERS);
3812972ccb85175d5211aa8f5c78d453efd628af8d3Tadashi G. Takaoka        // Update shift state with auto caps enabled.
3822972ccb85175d5211aa8f5c78d453efd628af8d3Tadashi G. Takaoka        pressAndReleaseKey(CODE_AUTO_CAPS_TRIGGER, ALPHABET_UNSHIFTED, ALPHABET_AUTOMATIC_SHIFTED);
3832972ccb85175d5211aa8f5c78d453efd628af8d3Tadashi G. Takaoka
3842972ccb85175d5211aa8f5c78d453efd628af8d3Tadashi G. Takaoka        // Press shift key and hold, switch to alphabet shifted.
3852972ccb85175d5211aa8f5c78d453efd628af8d3Tadashi G. Takaoka        pressKey(CODE_SHIFT, ALPHABET_MANUAL_SHIFTED);
3862972ccb85175d5211aa8f5c78d453efd628af8d3Tadashi G. Takaoka        // Press 'X' key and hold
3872972ccb85175d5211aa8f5c78d453efd628af8d3Tadashi G. Takaoka        chordingPressKey('X', ALPHABET_MANUAL_SHIFTED);
3882972ccb85175d5211aa8f5c78d453efd628af8d3Tadashi G. Takaoka        // Press 'Z' key and hold, stay in automatic shifted mode.
3892972ccb85175d5211aa8f5c78d453efd628af8d3Tadashi G. Takaoka        chordingPressKey('Z', ALPHABET_MANUAL_SHIFTED);
3902972ccb85175d5211aa8f5c78d453efd628af8d3Tadashi G. Takaoka        // Release 'X' key
3912972ccb85175d5211aa8f5c78d453efd628af8d3Tadashi G. Takaoka        releaseKey('X', ALPHABET_MANUAL_SHIFTED);
3922972ccb85175d5211aa8f5c78d453efd628af8d3Tadashi G. Takaoka        // Release 'Z' key
3932972ccb85175d5211aa8f5c78d453efd628af8d3Tadashi G. Takaoka        releaseKey('Z', ALPHABET_MANUAL_SHIFTED);
3947d045829b8cd613ab43cb88b4cf0d4f492827996Tadashi G. Takaoka        // Release shift key, updated to alphabet automatic shifted.
3957d045829b8cd613ab43cb88b4cf0d4f492827996Tadashi G. Takaoka        releaseKey(CODE_SHIFT, ALPHABET_AUTOMATIC_SHIFTED);
3962972ccb85175d5211aa8f5c78d453efd628af8d3Tadashi G. Takaoka    }
397fb0a4ba8fd7291e1bed0ec61bb7d2b5c8f93c1adTadashi G. Takaoka
398fb0a4ba8fd7291e1bed0ec61bb7d2b5c8f93c1adTadashi G. Takaoka    public void testLongPressShiftAndChording() {
3992959fc0f13ec29e05eda2c4a1e9a728350a80557Tadashi G. Takaoka        // Long press shift key, enter maybe shift locked.
400f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka        longPressShiftKey(ALPHABET_MANUAL_SHIFTED, ALPHABET_MANUAL_SHIFTED);
4012959fc0f13ec29e05eda2c4a1e9a728350a80557Tadashi G. Takaoka        // Press/release letter key, remain in manual shifted.
4022959fc0f13ec29e05eda2c4a1e9a728350a80557Tadashi G. Takaoka        chordingPressAndReleaseKey('A', ALPHABET_MANUAL_SHIFTED, ALPHABET_MANUAL_SHIFTED);
4032959fc0f13ec29e05eda2c4a1e9a728350a80557Tadashi G. Takaoka        // Release shift key, back to alphabet (not shift locked).
4042959fc0f13ec29e05eda2c4a1e9a728350a80557Tadashi G. Takaoka        releaseKey(CODE_SHIFT, ALPHABET_UNSHIFTED);
4052959fc0f13ec29e05eda2c4a1e9a728350a80557Tadashi G. Takaoka
4062959fc0f13ec29e05eda2c4a1e9a728350a80557Tadashi G. Takaoka        // Long press shift key, enter alphabet shift locked.
407f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka        longPressAndReleaseShiftKey(ALPHABET_MANUAL_SHIFTED, ALPHABET_MANUAL_SHIFTED,
4082959fc0f13ec29e05eda2c4a1e9a728350a80557Tadashi G. Takaoka                ALPHABET_SHIFT_LOCKED);
4092959fc0f13ec29e05eda2c4a1e9a728350a80557Tadashi G. Takaoka        // Long press shift key, enter maybe alphabet.
410f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka        longPressShiftKey(ALPHABET_SHIFT_LOCK_SHIFTED, ALPHABET_SHIFT_LOCK_SHIFTED);
4112959fc0f13ec29e05eda2c4a1e9a728350a80557Tadashi G. Takaoka        // Press/release letter key, remain in manual shifted.
4122959fc0f13ec29e05eda2c4a1e9a728350a80557Tadashi G. Takaoka        chordingPressAndReleaseKey('A', ALPHABET_SHIFT_LOCK_SHIFTED, ALPHABET_SHIFT_LOCK_SHIFTED);
4132959fc0f13ec29e05eda2c4a1e9a728350a80557Tadashi G. Takaoka        // Release shift key, back to shift locked (not alphabet).
4142959fc0f13ec29e05eda2c4a1e9a728350a80557Tadashi G. Takaoka        releaseKey(CODE_SHIFT, ALPHABET_SHIFT_LOCKED);
4152959fc0f13ec29e05eda2c4a1e9a728350a80557Tadashi G. Takaoka        // Long press shift key, enter alphabet
416f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka        longPressAndReleaseShiftKey(ALPHABET_SHIFT_LOCK_SHIFTED, ALPHABET_SHIFT_LOCK_SHIFTED,
4172959fc0f13ec29e05eda2c4a1e9a728350a80557Tadashi G. Takaoka                ALPHABET_UNSHIFTED);
4182959fc0f13ec29e05eda2c4a1e9a728350a80557Tadashi G. Takaoka
4192959fc0f13ec29e05eda2c4a1e9a728350a80557Tadashi G. Takaoka        // Press/release shift key, enter alphabet shifted.
4202959fc0f13ec29e05eda2c4a1e9a728350a80557Tadashi G. Takaoka        pressAndReleaseKey(CODE_SHIFT, ALPHABET_MANUAL_SHIFTED, ALPHABET_MANUAL_SHIFTED);
4212959fc0f13ec29e05eda2c4a1e9a728350a80557Tadashi G. Takaoka        // Long press shift key, enter maybe alphabet.
422f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka        longPressShiftKey(ALPHABET_MANUAL_SHIFTED, ALPHABET_MANUAL_SHIFTED);
4232959fc0f13ec29e05eda2c4a1e9a728350a80557Tadashi G. Takaoka        // Press/release letter key, remain in manual shifted.
4242959fc0f13ec29e05eda2c4a1e9a728350a80557Tadashi G. Takaoka        chordingPressAndReleaseKey('A', ALPHABET_MANUAL_SHIFTED, ALPHABET_MANUAL_SHIFTED);
4252959fc0f13ec29e05eda2c4a1e9a728350a80557Tadashi G. Takaoka        // Release shift key, back to alphabet shifted (not alphabet).
4262959fc0f13ec29e05eda2c4a1e9a728350a80557Tadashi G. Takaoka        releaseKey(CODE_SHIFT, ALPHABET_MANUAL_SHIFTED);
4272959fc0f13ec29e05eda2c4a1e9a728350a80557Tadashi G. Takaoka
4282959fc0f13ec29e05eda2c4a1e9a728350a80557Tadashi G. Takaoka        // Set capitalize the first character of all words mode.
4292959fc0f13ec29e05eda2c4a1e9a728350a80557Tadashi G. Takaoka        setAutoCapsMode(CAP_MODE_WORDS);
4302959fc0f13ec29e05eda2c4a1e9a728350a80557Tadashi G. Takaoka        // Load keyboard, should be in automatic shifted.
4312959fc0f13ec29e05eda2c4a1e9a728350a80557Tadashi G. Takaoka        loadKeyboard(ALPHABET_AUTOMATIC_SHIFTED);
4322959fc0f13ec29e05eda2c4a1e9a728350a80557Tadashi G. Takaoka        // Long press shift key, enter maybe shift locked.
433f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka        longPressShiftKey(ALPHABET_MANUAL_SHIFTED, ALPHABET_MANUAL_SHIFTED);
4342959fc0f13ec29e05eda2c4a1e9a728350a80557Tadashi G. Takaoka        // Press/release letter key, remain in manual shifted.
4352959fc0f13ec29e05eda2c4a1e9a728350a80557Tadashi G. Takaoka        chordingPressAndReleaseKey('A', ALPHABET_MANUAL_SHIFTED, ALPHABET_MANUAL_SHIFTED);
4362959fc0f13ec29e05eda2c4a1e9a728350a80557Tadashi G. Takaoka        // Release shift key, back to alphabet (not shift locked).
4372959fc0f13ec29e05eda2c4a1e9a728350a80557Tadashi G. Takaoka        releaseKey(CODE_SHIFT, ALPHABET_UNSHIFTED);
438fb0a4ba8fd7291e1bed0ec61bb7d2b5c8f93c1adTadashi G. Takaoka    }
4399a3211802baf11e5749a080e4f451ef7b795220bTadashi G. Takaoka
4409a3211802baf11e5749a080e4f451ef7b795220bTadashi G. Takaoka    public void testDoubleTapShiftAndChording() {
4419a3211802baf11e5749a080e4f451ef7b795220bTadashi G. Takaoka        // TODO: The following tests fail due to bug. Temporarily commented.
4420cc425bd9c476d3cb6708554282a3242019eb317Tadashi G. Takaoka//        // First shift key tap.
4430cc425bd9c476d3cb6708554282a3242019eb317Tadashi G. Takaoka//        pressAndReleaseKey(CODE_SHIFT, ALPHABET_MANUAL_SHIFTED, ALPHABET_MANUAL_SHIFTED);
4440cc425bd9c476d3cb6708554282a3242019eb317Tadashi G. Takaoka//        // Second shift key tap, maybe shift locked.
4450cc425bd9c476d3cb6708554282a3242019eb317Tadashi G. Takaoka//        secondPressKey(CODE_SHIFT, ALPHABET_MANUAL_SHIFTED);
4460cc425bd9c476d3cb6708554282a3242019eb317Tadashi G. Takaoka//        // Press/release letter key, remain in manual shifted.
4470cc425bd9c476d3cb6708554282a3242019eb317Tadashi G. Takaoka//        chordingPressAndReleaseKey('A', ALPHABET_MANUAL_SHIFTED, ALPHABET_MANUAL_SHIFTED);
4480cc425bd9c476d3cb6708554282a3242019eb317Tadashi G. Takaoka//        // Release shift key, back to alphabet shifted (not shift locked).
4490cc425bd9c476d3cb6708554282a3242019eb317Tadashi G. Takaoka//        releaseKey(CODE_SHIFT, ALPHABET_MANUAL_SHIFTED);
4500cc425bd9c476d3cb6708554282a3242019eb317Tadashi G. Takaoka//
4510cc425bd9c476d3cb6708554282a3242019eb317Tadashi G. Takaoka//        // Long press shift key, enter alphabet shift locked.
452f87e8f7ec1efb93398d909c67468d716b0248fe7Tadashi G. Takaoka//        longPressAndReleaseShiftKey(ALPHABET_MANUAL_SHIFTED, ALPHABET_MANUAL_SHIFTED,
4530cc425bd9c476d3cb6708554282a3242019eb317Tadashi G. Takaoka//                ALPHABET_SHIFT_LOCKED);
4540cc425bd9c476d3cb6708554282a3242019eb317Tadashi G. Takaoka//        // First shift key tap.
4550cc425bd9c476d3cb6708554282a3242019eb317Tadashi G. Takaoka//        pressAndReleaseKey(CODE_SHIFT, ALPHABET_MANUAL_SHIFTED, ALPHABET_UNSHIFTED);
4560cc425bd9c476d3cb6708554282a3242019eb317Tadashi G. Takaoka//        // Second shift key tap, maybe shift unlocked.
4570cc425bd9c476d3cb6708554282a3242019eb317Tadashi G. Takaoka//        secondPressKey(CODE_SHIFT, ALPHABET_MANUAL_SHIFTED);
4580cc425bd9c476d3cb6708554282a3242019eb317Tadashi G. Takaoka//        // Press/release letter key, remain in manual shifted.
4590cc425bd9c476d3cb6708554282a3242019eb317Tadashi G. Takaoka//        chordingPressAndReleaseKey('A', ALPHABET_MANUAL_SHIFTED, ALPHABET_MANUAL_SHIFTED);
4600cc425bd9c476d3cb6708554282a3242019eb317Tadashi G. Takaoka//        // Release shift key, back to alphabet (not shift locked).
4610cc425bd9c476d3cb6708554282a3242019eb317Tadashi G. Takaoka//        releaseKey(CODE_SHIFT, ALPHABET_UNSHIFTED);
4620cc425bd9c476d3cb6708554282a3242019eb317Tadashi G. Takaoka//
4630cc425bd9c476d3cb6708554282a3242019eb317Tadashi G. Takaoka//        // Set capitalize the first character of all words mode.
4640cc425bd9c476d3cb6708554282a3242019eb317Tadashi G. Takaoka//        setAutoCapsMode(CAP_MODE_WORDS);
4650cc425bd9c476d3cb6708554282a3242019eb317Tadashi G. Takaoka//        // Load keyboard, should be in automatic shifted.
4660cc425bd9c476d3cb6708554282a3242019eb317Tadashi G. Takaoka//        loadKeyboard(ALPHABET_AUTOMATIC_SHIFTED);
4670cc425bd9c476d3cb6708554282a3242019eb317Tadashi G. Takaoka//        // First shift key tap.
4680cc425bd9c476d3cb6708554282a3242019eb317Tadashi G. Takaoka//        pressAndReleaseKey(CODE_SHIFT, ALPHABET_MANUAL_SHIFTED, ALPHABET_UNSHIFTED);
4690cc425bd9c476d3cb6708554282a3242019eb317Tadashi G. Takaoka//        // Second shift key tap, maybe shift locked.
4700cc425bd9c476d3cb6708554282a3242019eb317Tadashi G. Takaoka//        secondPressKey(CODE_SHIFT, ALPHABET_MANUAL_SHIFTED);
4710cc425bd9c476d3cb6708554282a3242019eb317Tadashi G. Takaoka//        // Press/release letter key, remain in manual shifted.
4720cc425bd9c476d3cb6708554282a3242019eb317Tadashi G. Takaoka//        chordingPressAndReleaseKey('A', ALPHABET_MANUAL_SHIFTED, ALPHABET_MANUAL_SHIFTED);
4730cc425bd9c476d3cb6708554282a3242019eb317Tadashi G. Takaoka//        // Release shift key, back to alphabet (not shift locked).
4740cc425bd9c476d3cb6708554282a3242019eb317Tadashi G. Takaoka//        releaseKey(CODE_SHIFT, ALPHABET_UNSHIFTED);
4759a3211802baf11e5749a080e4f451ef7b795220bTadashi G. Takaoka    }
476dfbe254de6f0bf722d9cb5a3ab6dc97d135c73d5Tadashi G. Takaoka}
477