1b2707856aba4fc9b063f26305f1fb603b19c1701satok/*
2b2707856aba4fc9b063f26305f1fb603b19c1701satok * Copyright (C) 2011 The Android Open Source Project
3b2707856aba4fc9b063f26305f1fb603b19c1701satok *
4b2707856aba4fc9b063f26305f1fb603b19c1701satok * Licensed under the Apache License, Version 2.0 (the "License");
5b2707856aba4fc9b063f26305f1fb603b19c1701satok * you may not use this file except in compliance with the License.
6b2707856aba4fc9b063f26305f1fb603b19c1701satok * You may obtain a copy of the License at
7b2707856aba4fc9b063f26305f1fb603b19c1701satok *
8b2707856aba4fc9b063f26305f1fb603b19c1701satok *      http://www.apache.org/licenses/LICENSE-2.0
9b2707856aba4fc9b063f26305f1fb603b19c1701satok *
10b2707856aba4fc9b063f26305f1fb603b19c1701satok * Unless required by applicable law or agreed to in writing, software
11b2707856aba4fc9b063f26305f1fb603b19c1701satok * distributed under the License is distributed on an "AS IS" BASIS,
12b2707856aba4fc9b063f26305f1fb603b19c1701satok * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13b2707856aba4fc9b063f26305f1fb603b19c1701satok * See the License for the specific language governing permissions and
14b2707856aba4fc9b063f26305f1fb603b19c1701satok * limitations under the License.
15b2707856aba4fc9b063f26305f1fb603b19c1701satok */
16b2707856aba4fc9b063f26305f1fb603b19c1701satok
17b2707856aba4fc9b063f26305f1fb603b19c1701satokpackage com.android.inputmethod.compat;
18b2707856aba4fc9b063f26305f1fb603b19c1701satok
19b2707856aba4fc9b063f26305f1fb603b19c1701satokimport android.view.inputmethod.EditorInfo;
20b2707856aba4fc9b063f26305f1fb603b19c1701satok
21b2707856aba4fc9b063f26305f1fb603b19c1701satokimport java.lang.reflect.Field;
22b2707856aba4fc9b063f26305f1fb603b19c1701satok
23b2707856aba4fc9b063f26305f1fb603b19c1701satokpublic class EditorInfoCompatUtils {
24fde7efd87710dcc9e8376e3ef6db287e254c65fcTadashi G. Takaoka    // EditorInfo.IME_FLAG_FORCE_ASCII has been introduced since API#16 (JellyBean).
251ef6fc7e1519cedec9e84a64968bfba4212d0436Tadashi G. Takaoka    private static final Field FIELD_IME_FLAG_FORCE_ASCII = CompatUtils.getField(
261ef6fc7e1519cedec9e84a64968bfba4212d0436Tadashi G. Takaoka            EditorInfo.class, "IME_FLAG_FORCE_ASCII");
271ef6fc7e1519cedec9e84a64968bfba4212d0436Tadashi G. Takaoka    private static final Integer OBJ_IME_FLAG_FORCE_ASCII = (Integer) CompatUtils
281ef6fc7e1519cedec9e84a64968bfba4212d0436Tadashi G. Takaoka            .getFieldValue(null, null, FIELD_IME_FLAG_FORCE_ASCII);
29b2707856aba4fc9b063f26305f1fb603b19c1701satok
30fde7efd87710dcc9e8376e3ef6db287e254c65fcTadashi G. Takaoka    private EditorInfoCompatUtils() {
31fde7efd87710dcc9e8376e3ef6db287e254c65fcTadashi G. Takaoka        // This utility class is not publicly instantiable.
32fde7efd87710dcc9e8376e3ef6db287e254c65fcTadashi G. Takaoka    }
33fde7efd87710dcc9e8376e3ef6db287e254c65fcTadashi G. Takaoka
341ef6fc7e1519cedec9e84a64968bfba4212d0436Tadashi G. Takaoka    public static boolean hasFlagForceAscii(int imeOptions) {
351ef6fc7e1519cedec9e84a64968bfba4212d0436Tadashi G. Takaoka        if (OBJ_IME_FLAG_FORCE_ASCII == null)
361ef6fc7e1519cedec9e84a64968bfba4212d0436Tadashi G. Takaoka            return false;
371ef6fc7e1519cedec9e84a64968bfba4212d0436Tadashi G. Takaoka        return (imeOptions & OBJ_IME_FLAG_FORCE_ASCII) != 0;
381ef6fc7e1519cedec9e84a64968bfba4212d0436Tadashi G. Takaoka    }
391ef6fc7e1519cedec9e84a64968bfba4212d0436Tadashi G. Takaoka
407a39bd4454664b5c37b30e9b5362ddbcdce3b374Tadashi G. Takaoka    public static String imeActionName(int imeOptions) {
41f1a81f5eb37df4170de2cf6327c860e3d64dc2f8satok        final int actionId = imeOptions & EditorInfo.IME_MASK_ACTION;
42f1a81f5eb37df4170de2cf6327c860e3d64dc2f8satok        switch (actionId) {
437a39bd4454664b5c37b30e9b5362ddbcdce3b374Tadashi G. Takaoka        case EditorInfo.IME_ACTION_UNSPECIFIED:
447a39bd4454664b5c37b30e9b5362ddbcdce3b374Tadashi G. Takaoka            return "actionUnspecified";
457a39bd4454664b5c37b30e9b5362ddbcdce3b374Tadashi G. Takaoka        case EditorInfo.IME_ACTION_NONE:
467a39bd4454664b5c37b30e9b5362ddbcdce3b374Tadashi G. Takaoka            return "actionNone";
477a39bd4454664b5c37b30e9b5362ddbcdce3b374Tadashi G. Takaoka        case EditorInfo.IME_ACTION_GO:
487a39bd4454664b5c37b30e9b5362ddbcdce3b374Tadashi G. Takaoka            return "actionGo";
497a39bd4454664b5c37b30e9b5362ddbcdce3b374Tadashi G. Takaoka        case EditorInfo.IME_ACTION_SEARCH:
507a39bd4454664b5c37b30e9b5362ddbcdce3b374Tadashi G. Takaoka            return "actionSearch";
517a39bd4454664b5c37b30e9b5362ddbcdce3b374Tadashi G. Takaoka        case EditorInfo.IME_ACTION_SEND:
527a39bd4454664b5c37b30e9b5362ddbcdce3b374Tadashi G. Takaoka            return "actionSend";
537a39bd4454664b5c37b30e9b5362ddbcdce3b374Tadashi G. Takaoka        case EditorInfo.IME_ACTION_NEXT:
547a39bd4454664b5c37b30e9b5362ddbcdce3b374Tadashi G. Takaoka            return "actionNext";
557a39bd4454664b5c37b30e9b5362ddbcdce3b374Tadashi G. Takaoka        case EditorInfo.IME_ACTION_DONE:
567a39bd4454664b5c37b30e9b5362ddbcdce3b374Tadashi G. Takaoka            return "actionDone";
570d1a5d5b9710dd8fbdae18b0e69bccb53c7b9207Tadashi G. Takaoka        case EditorInfo.IME_ACTION_PREVIOUS:
580d1a5d5b9710dd8fbdae18b0e69bccb53c7b9207Tadashi G. Takaoka            return "actionPrevious";
597a39bd4454664b5c37b30e9b5362ddbcdce3b374Tadashi G. Takaoka        default:
600d1a5d5b9710dd8fbdae18b0e69bccb53c7b9207Tadashi G. Takaoka            return "actionUnknown(" + actionId + ")";
61f1a81f5eb37df4170de2cf6327c860e3d64dc2f8satok        }
627a39bd4454664b5c37b30e9b5362ddbcdce3b374Tadashi G. Takaoka    }
637a39bd4454664b5c37b30e9b5362ddbcdce3b374Tadashi G. Takaoka
647a39bd4454664b5c37b30e9b5362ddbcdce3b374Tadashi G. Takaoka    public static String imeOptionsName(int imeOptions) {
657a39bd4454664b5c37b30e9b5362ddbcdce3b374Tadashi G. Takaoka        final String action = imeActionName(imeOptions);
661ef6fc7e1519cedec9e84a64968bfba4212d0436Tadashi G. Takaoka        final StringBuilder flags = new StringBuilder();
67f1a81f5eb37df4170de2cf6327c860e3d64dc2f8satok        if ((imeOptions & EditorInfo.IME_FLAG_NO_ENTER_ACTION) != 0) {
681ef6fc7e1519cedec9e84a64968bfba4212d0436Tadashi G. Takaoka            flags.append("flagNoEnterAction|");
691ef6fc7e1519cedec9e84a64968bfba4212d0436Tadashi G. Takaoka        }
700d1a5d5b9710dd8fbdae18b0e69bccb53c7b9207Tadashi G. Takaoka        if ((imeOptions & EditorInfo.IME_FLAG_NAVIGATE_NEXT) != 0) {
711ef6fc7e1519cedec9e84a64968bfba4212d0436Tadashi G. Takaoka            flags.append("flagNavigateNext|");
721ef6fc7e1519cedec9e84a64968bfba4212d0436Tadashi G. Takaoka        }
730d1a5d5b9710dd8fbdae18b0e69bccb53c7b9207Tadashi G. Takaoka        if ((imeOptions & EditorInfo.IME_FLAG_NAVIGATE_PREVIOUS) != 0) {
741ef6fc7e1519cedec9e84a64968bfba4212d0436Tadashi G. Takaoka            flags.append("flagNavigatePrevious|");
751ef6fc7e1519cedec9e84a64968bfba4212d0436Tadashi G. Takaoka        }
761ef6fc7e1519cedec9e84a64968bfba4212d0436Tadashi G. Takaoka        if (hasFlagForceAscii(imeOptions)) {
771ef6fc7e1519cedec9e84a64968bfba4212d0436Tadashi G. Takaoka            flags.append("flagForceAscii|");
78f1a81f5eb37df4170de2cf6327c860e3d64dc2f8satok        }
797a39bd4454664b5c37b30e9b5362ddbcdce3b374Tadashi G. Takaoka        return (action != null) ? flags + action : flags.toString();
80f1a81f5eb37df4170de2cf6327c860e3d64dc2f8satok    }
81b2707856aba4fc9b063f26305f1fb603b19c1701satok}
82