InputMethodSubtype.java revision 7265d9bd6d80c5bedaa6de2b80f6619a301a07c8
1ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok/* 2ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok * Copyright (C) 2010 The Android Open Source Project 3ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok * 4ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok * Licensed under the Apache License, Version 2.0 (the "License"); 5ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok * you may not use this file except in compliance with the License. 6ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok * You may obtain a copy of the License at 7ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok * 8ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok * http://www.apache.org/licenses/LICENSE-2.0 9ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok * 10ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok * Unless required by applicable law or agreed to in writing, software 11ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok * distributed under the License is distributed on an "AS IS" BASIS, 12ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok * See the License for the specific language governing permissions and 14ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok * limitations under the License. 15ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok */ 16ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok 17ab751aa085433e9f735d2e7603459c6c7e9d2fb0satokpackage android.view.inputmethod; 18ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok 197265d9bd6d80c5bedaa6de2b80f6619a301a07c8satokimport android.content.Context; 20ab751aa085433e9f735d2e7603459c6c7e9d2fb0satokimport android.os.Parcel; 21ab751aa085433e9f735d2e7603459c6c7e9d2fb0satokimport android.os.Parcelable; 22ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok 237265d9bd6d80c5bedaa6de2b80f6619a301a07c8satokimport java.util.ArrayList; 24ab751aa085433e9f735d2e7603459c6c7e9d2fb0satokimport java.util.Arrays; 257265d9bd6d80c5bedaa6de2b80f6619a301a07c8satokimport java.util.HashSet; 267265d9bd6d80c5bedaa6de2b80f6619a301a07c8satokimport java.util.List; 27ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok 28ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok/** 29e31e9424554d5f032f578830556913b4ba78f7f9Ken Wakasa * This class is used to specify meta information of a subtype contained in an input method. 30e31e9424554d5f032f578830556913b4ba78f7f9Ken Wakasa * Subtype can describe locale (e.g. en_US, fr_FR...) and mode (e.g. voice, keyboard...), and is 31e31e9424554d5f032f578830556913b4ba78f7f9Ken Wakasa * used for IME switch and settings. The input method subtype allows the system to bring up the 32e31e9424554d5f032f578830556913b4ba78f7f9Ken Wakasa * specified subtype of the designated input method directly. 33ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok */ 34ab751aa085433e9f735d2e7603459c6c7e9d2fb0satokpublic final class InputMethodSubtype implements Parcelable { 35ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok private final int mSubtypeNameResId; 36ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok private final int mSubtypeIconResId; 37ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok private final String mSubtypeLocale; 389ef0283bdcd9534cc09ae37eb2b78771b95247b5satok private final String mSubtypeMode; 39ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok private final String mSubtypeExtraValue; 40ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok private final int mSubtypeHashCode; 41ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok 42ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok /** 43ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok * Constructor 44ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok * @param nameId The name of the subtype 45ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok * @param iconId The icon of the subtype 46ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok * @param locale The locale supported by the subtype 47ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok * @param modeId The mode supported by the subtype 48ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok * @param extraValue The extra value of the subtype 49ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok */ 509ef0283bdcd9534cc09ae37eb2b78771b95247b5satok InputMethodSubtype(int nameId, int iconId, String locale, String mode, String extraValue) { 51ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok mSubtypeNameResId = nameId; 52ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok mSubtypeIconResId = iconId; 53af4bf400abab86baee44dacbcdf13444d06ee46esatok mSubtypeLocale = locale != null ? locale : ""; 54af4bf400abab86baee44dacbcdf13444d06ee46esatok mSubtypeMode = mode != null ? mode : ""; 55af4bf400abab86baee44dacbcdf13444d06ee46esatok mSubtypeExtraValue = extraValue != null ? extraValue : ""; 56ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok mSubtypeHashCode = hashCodeInternal(mSubtypeNameResId, mSubtypeIconResId, mSubtypeLocale, 579ef0283bdcd9534cc09ae37eb2b78771b95247b5satok mSubtypeMode, mSubtypeExtraValue); 58ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok } 59ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok 60ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok InputMethodSubtype(Parcel source) { 61af4bf400abab86baee44dacbcdf13444d06ee46esatok String s; 62ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok mSubtypeNameResId = source.readInt(); 63ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok mSubtypeIconResId = source.readInt(); 64af4bf400abab86baee44dacbcdf13444d06ee46esatok s = source.readString(); 65af4bf400abab86baee44dacbcdf13444d06ee46esatok mSubtypeLocale = s != null ? s : ""; 66af4bf400abab86baee44dacbcdf13444d06ee46esatok s = source.readString(); 67af4bf400abab86baee44dacbcdf13444d06ee46esatok mSubtypeMode = s != null ? s : ""; 68af4bf400abab86baee44dacbcdf13444d06ee46esatok s = source.readString(); 69af4bf400abab86baee44dacbcdf13444d06ee46esatok mSubtypeExtraValue = s != null ? s : ""; 70ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok mSubtypeHashCode = hashCodeInternal(mSubtypeNameResId, mSubtypeIconResId, mSubtypeLocale, 719ef0283bdcd9534cc09ae37eb2b78771b95247b5satok mSubtypeMode, mSubtypeExtraValue); 72ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok } 73ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok 74ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok /** 75ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok * @return the name of the subtype 76ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok */ 77ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok public int getNameResId() { 78ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok return mSubtypeNameResId; 79ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok } 80ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok 81ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok /** 82ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok * @return the icon of the subtype 83ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok */ 84ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok public int getIconResId() { 85ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok return mSubtypeIconResId; 86ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok } 87ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok 88ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok /** 89ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok * @return the locale of the subtype 90ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok */ 91ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok public String getLocale() { 92ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok return mSubtypeLocale; 93ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok } 94ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok 95ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok /** 96ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok * @return the mode of the subtype 97ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok */ 989ef0283bdcd9534cc09ae37eb2b78771b95247b5satok public String getMode() { 999ef0283bdcd9534cc09ae37eb2b78771b95247b5satok return mSubtypeMode; 100ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok } 101ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok 102ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok /** 103ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok * @return the extra value of the subtype 104ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok */ 105ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok public String getExtraValue() { 106ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok return mSubtypeExtraValue; 107ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok } 108ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok 109ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok @Override 110ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok public int hashCode() { 111ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok return mSubtypeHashCode; 112ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok } 113ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok 114ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok @Override 115ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok public boolean equals(Object o) { 116ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok if (o instanceof InputMethodSubtype) { 117ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok InputMethodSubtype subtype = (InputMethodSubtype) o; 118af4bf400abab86baee44dacbcdf13444d06ee46esatok return (subtype.hashCode() == hashCode()) 119af4bf400abab86baee44dacbcdf13444d06ee46esatok && (subtype.getNameResId() == getNameResId()) 120af4bf400abab86baee44dacbcdf13444d06ee46esatok && (subtype.getMode().equals(getMode())) 121ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok && (subtype.getIconResId() == getIconResId()) 122ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok && (subtype.getLocale().equals(getLocale())) 123ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok && (subtype.getExtraValue().equals(getExtraValue())); 124ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok } 125ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok return false; 126ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok } 127ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok 128ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok public int describeContents() { 129ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok return 0; 130ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok } 131ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok 132ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok public void writeToParcel(Parcel dest, int parcelableFlags) { 133ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok dest.writeInt(mSubtypeNameResId); 134ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok dest.writeInt(mSubtypeIconResId); 135ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok dest.writeString(mSubtypeLocale); 1369ef0283bdcd9534cc09ae37eb2b78771b95247b5satok dest.writeString(mSubtypeMode); 137ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok dest.writeString(mSubtypeExtraValue); 138ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok } 139ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok 140ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok public static final Parcelable.Creator<InputMethodSubtype> CREATOR 141ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok = new Parcelable.Creator<InputMethodSubtype>() { 142ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok public InputMethodSubtype createFromParcel(Parcel source) { 143ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok return new InputMethodSubtype(source); 144ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok } 145ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok 146ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok public InputMethodSubtype[] newArray(int size) { 147ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok return new InputMethodSubtype[size]; 148ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok } 149ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok }; 150ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok 151ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok private static int hashCodeInternal(int nameResId, int iconResId, String locale, 1529ef0283bdcd9534cc09ae37eb2b78771b95247b5satok String mode, String extraValue) { 1539ef0283bdcd9534cc09ae37eb2b78771b95247b5satok return Arrays.hashCode(new Object[] {nameResId, iconResId, locale, mode, extraValue}); 154ab751aa085433e9f735d2e7603459c6c7e9d2fb0satok } 1557265d9bd6d80c5bedaa6de2b80f6619a301a07c8satok 1567265d9bd6d80c5bedaa6de2b80f6619a301a07c8satok /** 1577265d9bd6d80c5bedaa6de2b80f6619a301a07c8satok * Sort the list of InputMethodSubtype 1587265d9bd6d80c5bedaa6de2b80f6619a301a07c8satok * @param context Context will be used for getting localized strings from IME 1597265d9bd6d80c5bedaa6de2b80f6619a301a07c8satok * @param flags Flags for the sort order 1607265d9bd6d80c5bedaa6de2b80f6619a301a07c8satok * @param imi InputMethodInfo of which subtypes are subject to be sorted 1617265d9bd6d80c5bedaa6de2b80f6619a301a07c8satok * @param subtypeList List of InputMethodSubtype which will be sorted 1627265d9bd6d80c5bedaa6de2b80f6619a301a07c8satok * @return Sorted list of subtypes 1637265d9bd6d80c5bedaa6de2b80f6619a301a07c8satok * @hide 1647265d9bd6d80c5bedaa6de2b80f6619a301a07c8satok */ 1657265d9bd6d80c5bedaa6de2b80f6619a301a07c8satok public static List<InputMethodSubtype> sort(Context context, int flags, InputMethodInfo imi, 1667265d9bd6d80c5bedaa6de2b80f6619a301a07c8satok List<InputMethodSubtype> subtypeList) { 1677265d9bd6d80c5bedaa6de2b80f6619a301a07c8satok if (imi == null) return subtypeList; 1687265d9bd6d80c5bedaa6de2b80f6619a301a07c8satok final HashSet<InputMethodSubtype> inputSubtypesSet = new HashSet<InputMethodSubtype>( 1697265d9bd6d80c5bedaa6de2b80f6619a301a07c8satok subtypeList); 1707265d9bd6d80c5bedaa6de2b80f6619a301a07c8satok final ArrayList<InputMethodSubtype> sortedList = new ArrayList<InputMethodSubtype>(); 1717265d9bd6d80c5bedaa6de2b80f6619a301a07c8satok int N = imi.getSubtypeCount(); 1727265d9bd6d80c5bedaa6de2b80f6619a301a07c8satok for (int i = 0; i < N; ++i) { 1737265d9bd6d80c5bedaa6de2b80f6619a301a07c8satok InputMethodSubtype subtype = imi.getSubtypeAt(i); 1747265d9bd6d80c5bedaa6de2b80f6619a301a07c8satok if (inputSubtypesSet.contains(subtype)) { 1757265d9bd6d80c5bedaa6de2b80f6619a301a07c8satok sortedList.add(subtype); 1767265d9bd6d80c5bedaa6de2b80f6619a301a07c8satok inputSubtypesSet.remove(subtype); 1777265d9bd6d80c5bedaa6de2b80f6619a301a07c8satok } 1787265d9bd6d80c5bedaa6de2b80f6619a301a07c8satok } 1797265d9bd6d80c5bedaa6de2b80f6619a301a07c8satok // If subtypes in inputSubtypesSet remain, that means these subtypes are not 1807265d9bd6d80c5bedaa6de2b80f6619a301a07c8satok // contained in imi, so the remaining subtypes will be appended. 1817265d9bd6d80c5bedaa6de2b80f6619a301a07c8satok for (InputMethodSubtype subtype: inputSubtypesSet) { 1827265d9bd6d80c5bedaa6de2b80f6619a301a07c8satok sortedList.add(subtype); 1837265d9bd6d80c5bedaa6de2b80f6619a301a07c8satok } 1847265d9bd6d80c5bedaa6de2b80f6619a301a07c8satok return sortedList; 1857265d9bd6d80c5bedaa6de2b80f6619a301a07c8satok } 186af4bf400abab86baee44dacbcdf13444d06ee46esatok} 187