150f9ca4acd799c7ad2abd18fcdab2a895ed32dd7Satoshi Kataoka/* 250f9ca4acd799c7ad2abd18fcdab2a895ed32dd7Satoshi Kataoka * Copyright (C) 2013 The Android Open Source Project 350f9ca4acd799c7ad2abd18fcdab2a895ed32dd7Satoshi Kataoka * 450f9ca4acd799c7ad2abd18fcdab2a895ed32dd7Satoshi Kataoka * Licensed under the Apache License, Version 2.0 (the "License"); 550f9ca4acd799c7ad2abd18fcdab2a895ed32dd7Satoshi Kataoka * you may not use this file except in compliance with the License. 650f9ca4acd799c7ad2abd18fcdab2a895ed32dd7Satoshi Kataoka * You may obtain a copy of the License at 750f9ca4acd799c7ad2abd18fcdab2a895ed32dd7Satoshi Kataoka * 850f9ca4acd799c7ad2abd18fcdab2a895ed32dd7Satoshi Kataoka * http://www.apache.org/licenses/LICENSE-2.0 950f9ca4acd799c7ad2abd18fcdab2a895ed32dd7Satoshi Kataoka * 1050f9ca4acd799c7ad2abd18fcdab2a895ed32dd7Satoshi Kataoka * Unless required by applicable law or agreed to in writing, software 1150f9ca4acd799c7ad2abd18fcdab2a895ed32dd7Satoshi Kataoka * distributed under the License is distributed on an "AS IS" BASIS, 1250f9ca4acd799c7ad2abd18fcdab2a895ed32dd7Satoshi Kataoka * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1350f9ca4acd799c7ad2abd18fcdab2a895ed32dd7Satoshi Kataoka * See the License for the specific language governing permissions and 1450f9ca4acd799c7ad2abd18fcdab2a895ed32dd7Satoshi Kataoka * limitations under the License. 1550f9ca4acd799c7ad2abd18fcdab2a895ed32dd7Satoshi Kataoka */ 1650f9ca4acd799c7ad2abd18fcdab2a895ed32dd7Satoshi Kataoka 1750f9ca4acd799c7ad2abd18fcdab2a895ed32dd7Satoshi Kataokapackage com.android.inputmethod.compat; 1850f9ca4acd799c7ad2abd18fcdab2a895ed32dd7Satoshi Kataoka 1950f9ca4acd799c7ad2abd18fcdab2a895ed32dd7Satoshi Kataokaimport android.os.Build; 2050f9ca4acd799c7ad2abd18fcdab2a895ed32dd7Satoshi Kataokaimport android.view.inputmethod.InputMethodSubtype; 2150f9ca4acd799c7ad2abd18fcdab2a895ed32dd7Satoshi Kataoka 223895d7f8dc2e4999947f61220b86fa148f433413Yohei Yukawaimport com.android.inputmethod.annotations.UsedForTesting; 2320ddd4cff5b0cc1c016fd6d4a98a122909658213Tadashi G. Takaokaimport com.android.inputmethod.latin.Constants; 2420ddd4cff5b0cc1c016fd6d4a98a122909658213Tadashi G. Takaoka 2550f9ca4acd799c7ad2abd18fcdab2a895ed32dd7Satoshi Kataokaimport java.lang.reflect.Constructor; 2620ddd4cff5b0cc1c016fd6d4a98a122909658213Tadashi G. Takaokaimport java.lang.reflect.Method; 2750f9ca4acd799c7ad2abd18fcdab2a895ed32dd7Satoshi Kataoka 2850f9ca4acd799c7ad2abd18fcdab2a895ed32dd7Satoshi Kataokapublic final class InputMethodSubtypeCompatUtils { 2950f9ca4acd799c7ad2abd18fcdab2a895ed32dd7Satoshi Kataoka private static final String TAG = InputMethodSubtypeCompatUtils.class.getSimpleName(); 3050f9ca4acd799c7ad2abd18fcdab2a895ed32dd7Satoshi Kataoka // Note that InputMethodSubtype(int nameId, int iconId, String locale, String mode, 3150f9ca4acd799c7ad2abd18fcdab2a895ed32dd7Satoshi Kataoka // String extraValue, boolean isAuxiliary, boolean overridesImplicitlyEnabledSubtype, int id) 3250f9ca4acd799c7ad2abd18fcdab2a895ed32dd7Satoshi Kataoka // has been introduced in API level 17 (Build.VERSION_CODE.JELLY_BEAN_MR1). 3350f9ca4acd799c7ad2abd18fcdab2a895ed32dd7Satoshi Kataoka private static final Constructor<?> CONSTRUCTOR_INPUT_METHOD_SUBTYPE = 3450f9ca4acd799c7ad2abd18fcdab2a895ed32dd7Satoshi Kataoka CompatUtils.getConstructor(InputMethodSubtype.class, 3503a1c442aeddbd511be92e11465b6206d2ca976cTadashi G. Takaoka int.class, int.class, String.class, String.class, String.class, boolean.class, 3603a1c442aeddbd511be92e11465b6206d2ca976cTadashi G. Takaoka boolean.class, int.class); 3750f9ca4acd799c7ad2abd18fcdab2a895ed32dd7Satoshi Kataoka static { 3850f9ca4acd799c7ad2abd18fcdab2a895ed32dd7Satoshi Kataoka if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { 3950f9ca4acd799c7ad2abd18fcdab2a895ed32dd7Satoshi Kataoka if (CONSTRUCTOR_INPUT_METHOD_SUBTYPE == null) { 4050f9ca4acd799c7ad2abd18fcdab2a895ed32dd7Satoshi Kataoka android.util.Log.w(TAG, "Warning!!! Constructor is not defined."); 4150f9ca4acd799c7ad2abd18fcdab2a895ed32dd7Satoshi Kataoka } 4250f9ca4acd799c7ad2abd18fcdab2a895ed32dd7Satoshi Kataoka } 4350f9ca4acd799c7ad2abd18fcdab2a895ed32dd7Satoshi Kataoka } 4420ddd4cff5b0cc1c016fd6d4a98a122909658213Tadashi G. Takaoka 4520ddd4cff5b0cc1c016fd6d4a98a122909658213Tadashi G. Takaoka // Note that {@link InputMethodSubtype#isAsciiCapable()} has been introduced in API level 19 4620ddd4cff5b0cc1c016fd6d4a98a122909658213Tadashi G. Takaoka // (Build.VERSION_CODE.KITKAT). 4720ddd4cff5b0cc1c016fd6d4a98a122909658213Tadashi G. Takaoka private static final Method METHOD_isAsciiCapable = CompatUtils.getMethod( 4820ddd4cff5b0cc1c016fd6d4a98a122909658213Tadashi G. Takaoka InputMethodSubtype.class, "isAsciiCapable"); 4920ddd4cff5b0cc1c016fd6d4a98a122909658213Tadashi G. Takaoka 5050f9ca4acd799c7ad2abd18fcdab2a895ed32dd7Satoshi Kataoka private InputMethodSubtypeCompatUtils() { 5150f9ca4acd799c7ad2abd18fcdab2a895ed32dd7Satoshi Kataoka // This utility class is not publicly instantiable. 5250f9ca4acd799c7ad2abd18fcdab2a895ed32dd7Satoshi Kataoka } 5350f9ca4acd799c7ad2abd18fcdab2a895ed32dd7Satoshi Kataoka 5450f9ca4acd799c7ad2abd18fcdab2a895ed32dd7Satoshi Kataoka public static InputMethodSubtype newInputMethodSubtype(int nameId, int iconId, String locale, 5550f9ca4acd799c7ad2abd18fcdab2a895ed32dd7Satoshi Kataoka String mode, String extraValue, boolean isAuxiliary, 5650f9ca4acd799c7ad2abd18fcdab2a895ed32dd7Satoshi Kataoka boolean overridesImplicitlyEnabledSubtype, int id) { 5750f9ca4acd799c7ad2abd18fcdab2a895ed32dd7Satoshi Kataoka if (CONSTRUCTOR_INPUT_METHOD_SUBTYPE == null 5850f9ca4acd799c7ad2abd18fcdab2a895ed32dd7Satoshi Kataoka || Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1) { 5950f9ca4acd799c7ad2abd18fcdab2a895ed32dd7Satoshi Kataoka return new InputMethodSubtype(nameId, iconId, locale, mode, extraValue, isAuxiliary, 6050f9ca4acd799c7ad2abd18fcdab2a895ed32dd7Satoshi Kataoka overridesImplicitlyEnabledSubtype); 6150f9ca4acd799c7ad2abd18fcdab2a895ed32dd7Satoshi Kataoka } 6250f9ca4acd799c7ad2abd18fcdab2a895ed32dd7Satoshi Kataoka return (InputMethodSubtype) CompatUtils.newInstance(CONSTRUCTOR_INPUT_METHOD_SUBTYPE, 6350f9ca4acd799c7ad2abd18fcdab2a895ed32dd7Satoshi Kataoka nameId, iconId, locale, mode, extraValue, isAuxiliary, 6450f9ca4acd799c7ad2abd18fcdab2a895ed32dd7Satoshi Kataoka overridesImplicitlyEnabledSubtype, id); 6550f9ca4acd799c7ad2abd18fcdab2a895ed32dd7Satoshi Kataoka } 6620ddd4cff5b0cc1c016fd6d4a98a122909658213Tadashi G. Takaoka 6720ddd4cff5b0cc1c016fd6d4a98a122909658213Tadashi G. Takaoka public static boolean isAsciiCapable(final InputMethodSubtype subtype) { 683895d7f8dc2e4999947f61220b86fa148f433413Yohei Yukawa return isAsciiCapableWithAPI(subtype) 6920ddd4cff5b0cc1c016fd6d4a98a122909658213Tadashi G. Takaoka || subtype.containsExtraValueKey(Constants.Subtype.ExtraValue.ASCII_CAPABLE); 7020ddd4cff5b0cc1c016fd6d4a98a122909658213Tadashi G. Takaoka } 713895d7f8dc2e4999947f61220b86fa148f433413Yohei Yukawa 723895d7f8dc2e4999947f61220b86fa148f433413Yohei Yukawa @UsedForTesting 733895d7f8dc2e4999947f61220b86fa148f433413Yohei Yukawa public static boolean isAsciiCapableWithAPI(final InputMethodSubtype subtype) { 743895d7f8dc2e4999947f61220b86fa148f433413Yohei Yukawa return (Boolean)CompatUtils.invoke(subtype, false, METHOD_isAsciiCapable); 753895d7f8dc2e4999947f61220b86fa148f433413Yohei Yukawa } 7650f9ca4acd799c7ad2abd18fcdab2a895ed32dd7Satoshi Kataoka} 77