19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.provider; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Locale; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ContentResolver; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ContentValues; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.Uri; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.text.TextUtils; 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * A provider of user defined words for input methods to use for predictive text input. 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Applications and input methods may add words into the dictionary. Words can have associated 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * frequency information and locale information. 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class UserDictionary { 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Authority string for this provider. */ 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String AUTHORITY = "user_dictionary"; 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The content:// style URL for this provider 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final Uri CONTENT_URI = 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uri.parse("content://" + AUTHORITY); 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4396c804af0b4eef79f6d3cdb0f20682e243f1b73dJean Chalard private static final int FREQUENCY_MIN = 0; 4496c804af0b4eef79f6d3cdb0f20682e243f1b73dJean Chalard private static final int FREQUENCY_MAX = 255; 4596c804af0b4eef79f6d3cdb0f20682e243f1b73dJean Chalard 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Contains the user defined words. 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static class Words implements BaseColumns { 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The content:// style URL for this table 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final Uri CONTENT_URI = 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uri.parse("content://" + AUTHORITY + "/words"); 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The MIME type of {@link #CONTENT_URI} providing a directory of words. 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String CONTENT_TYPE = "vnd.android.cursor.dir/vnd.google.userword"; 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The MIME type of a {@link #CONTENT_URI} sub-directory of a single word. 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/vnd.google.userword"; 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String _ID = BaseColumns._ID; 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The word column. 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>TYPE: TEXT</p> 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String WORD = "word"; 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The frequency column. A value between 1 and 255. Higher values imply higher frequency. 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>TYPE: INTEGER</p> 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String FREQUENCY = "frequency"; 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The locale that this word belongs to. Null if it pertains to all 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * locales. Locale is as defined by the string returned by Locale.toString(). 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>TYPE: TEXT</p> 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String LOCALE = "locale"; 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The uid of the application that inserted the word. 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>TYPE: INTEGER</p> 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String APP_ID = "appid"; 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9396c804af0b4eef79f6d3cdb0f20682e243f1b73dJean Chalard /** 9496c804af0b4eef79f6d3cdb0f20682e243f1b73dJean Chalard * An optional shortcut for this word. When the shortcut is typed, supporting IMEs should 9596c804af0b4eef79f6d3cdb0f20682e243f1b73dJean Chalard * suggest the word in this row as an alternate spelling too. 9696c804af0b4eef79f6d3cdb0f20682e243f1b73dJean Chalard */ 9796c804af0b4eef79f6d3cdb0f20682e243f1b73dJean Chalard public static final String SHORTCUT = "shortcut"; 9896c804af0b4eef79f6d3cdb0f20682e243f1b73dJean Chalard 9996c804af0b4eef79f6d3cdb0f20682e243f1b73dJean Chalard /** 10096c804af0b4eef79f6d3cdb0f20682e243f1b73dJean Chalard * @deprecated Use {@link #addWord(Context, String, int, String, Locale)}. 10196c804af0b4eef79f6d3cdb0f20682e243f1b73dJean Chalard */ 10296c804af0b4eef79f6d3cdb0f20682e243f1b73dJean Chalard @Deprecated 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int LOCALE_TYPE_ALL = 0; 10496c804af0b4eef79f6d3cdb0f20682e243f1b73dJean Chalard 10596c804af0b4eef79f6d3cdb0f20682e243f1b73dJean Chalard /** 10696c804af0b4eef79f6d3cdb0f20682e243f1b73dJean Chalard * @deprecated Use {@link #addWord(Context, String, int, String, Locale)}. 10796c804af0b4eef79f6d3cdb0f20682e243f1b73dJean Chalard */ 10896c804af0b4eef79f6d3cdb0f20682e243f1b73dJean Chalard @Deprecated 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int LOCALE_TYPE_CURRENT = 1; 11096c804af0b4eef79f6d3cdb0f20682e243f1b73dJean Chalard 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sort by descending order of frequency. 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String DEFAULT_SORT_ORDER = FREQUENCY + " DESC"; 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Adds a word to the dictionary, with the given frequency and the specified 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * specified locale type. 11896c804af0b4eef79f6d3cdb0f20682e243f1b73dJean Chalard * 11996c804af0b4eef79f6d3cdb0f20682e243f1b73dJean Chalard * @deprecated Please use 12096c804af0b4eef79f6d3cdb0f20682e243f1b73dJean Chalard * {@link #addWord(Context, String, int, String, Locale)} instead. 12196c804af0b4eef79f6d3cdb0f20682e243f1b73dJean Chalard * 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param context the current application context 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param word the word to add to the dictionary. This should not be null or 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * empty. 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param localeType the locale type for this word. It should be one of 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #LOCALE_TYPE_ALL} or {@link #LOCALE_TYPE_CURRENT}. 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 12896c804af0b4eef79f6d3cdb0f20682e243f1b73dJean Chalard @Deprecated 12996c804af0b4eef79f6d3cdb0f20682e243f1b73dJean Chalard public static void addWord(Context context, String word, 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int frequency, int localeType) { 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13296c804af0b4eef79f6d3cdb0f20682e243f1b73dJean Chalard if (localeType != LOCALE_TYPE_ALL && localeType != LOCALE_TYPE_CURRENT) { 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13696c804af0b4eef79f6d3cdb0f20682e243f1b73dJean Chalard final Locale locale; 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (localeType == LOCALE_TYPE_CURRENT) { 13996c804af0b4eef79f6d3cdb0f20682e243f1b73dJean Chalard locale = Locale.getDefault(); 14096c804af0b4eef79f6d3cdb0f20682e243f1b73dJean Chalard } else { 14196c804af0b4eef79f6d3cdb0f20682e243f1b73dJean Chalard locale = null; 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14396c804af0b4eef79f6d3cdb0f20682e243f1b73dJean Chalard 14496c804af0b4eef79f6d3cdb0f20682e243f1b73dJean Chalard addWord(context, word, frequency, null, locale); 14596c804af0b4eef79f6d3cdb0f20682e243f1b73dJean Chalard } 14696c804af0b4eef79f6d3cdb0f20682e243f1b73dJean Chalard 14796c804af0b4eef79f6d3cdb0f20682e243f1b73dJean Chalard /** Adds a word to the dictionary, with the given frequency and the specified 14896c804af0b4eef79f6d3cdb0f20682e243f1b73dJean Chalard * locale type. 14996c804af0b4eef79f6d3cdb0f20682e243f1b73dJean Chalard * 15096c804af0b4eef79f6d3cdb0f20682e243f1b73dJean Chalard * @param context the current application context 15196c804af0b4eef79f6d3cdb0f20682e243f1b73dJean Chalard * @param word the word to add to the dictionary. This should not be null or 15296c804af0b4eef79f6d3cdb0f20682e243f1b73dJean Chalard * empty. 15396c804af0b4eef79f6d3cdb0f20682e243f1b73dJean Chalard * @param shortcut optional shortcut spelling for this word. When the shortcut 15496c804af0b4eef79f6d3cdb0f20682e243f1b73dJean Chalard * is typed, the word may be suggested by applications that support it. May be null. 15596c804af0b4eef79f6d3cdb0f20682e243f1b73dJean Chalard * @param locale the locale to insert the word for, or null to insert the word 15696c804af0b4eef79f6d3cdb0f20682e243f1b73dJean Chalard * for all locales. 15796c804af0b4eef79f6d3cdb0f20682e243f1b73dJean Chalard */ 15896c804af0b4eef79f6d3cdb0f20682e243f1b73dJean Chalard public static void addWord(Context context, String word, 15996c804af0b4eef79f6d3cdb0f20682e243f1b73dJean Chalard int frequency, String shortcut, Locale locale) { 16096c804af0b4eef79f6d3cdb0f20682e243f1b73dJean Chalard final ContentResolver resolver = context.getContentResolver(); 16196c804af0b4eef79f6d3cdb0f20682e243f1b73dJean Chalard 16296c804af0b4eef79f6d3cdb0f20682e243f1b73dJean Chalard if (TextUtils.isEmpty(word)) { 16396c804af0b4eef79f6d3cdb0f20682e243f1b73dJean Chalard return; 16496c804af0b4eef79f6d3cdb0f20682e243f1b73dJean Chalard } 16596c804af0b4eef79f6d3cdb0f20682e243f1b73dJean Chalard 16696c804af0b4eef79f6d3cdb0f20682e243f1b73dJean Chalard if (frequency < FREQUENCY_MIN) frequency = FREQUENCY_MIN; 16796c804af0b4eef79f6d3cdb0f20682e243f1b73dJean Chalard if (frequency > FREQUENCY_MAX) frequency = FREQUENCY_MAX; 16896c804af0b4eef79f6d3cdb0f20682e243f1b73dJean Chalard 16996c804af0b4eef79f6d3cdb0f20682e243f1b73dJean Chalard final int COLUMN_COUNT = 5; 17096c804af0b4eef79f6d3cdb0f20682e243f1b73dJean Chalard ContentValues values = new ContentValues(COLUMN_COUNT); 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project values.put(WORD, word); 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project values.put(FREQUENCY, frequency); 17496c804af0b4eef79f6d3cdb0f20682e243f1b73dJean Chalard values.put(LOCALE, null == locale ? null : locale.toString()); 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project values.put(APP_ID, 0); // TODO: Get App UID 17696c804af0b4eef79f6d3cdb0f20682e243f1b73dJean Chalard values.put(SHORTCUT, shortcut); 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uri result = resolver.insert(CONTENT_URI, values); 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // It's ok if the insert doesn't succeed because the word 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // already exists. 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 184