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