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