1afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project/** 286997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project * Copyright (C) 2009 Google Inc. 3afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * 4afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * use this file except in compliance with the License. You may obtain a copy 6afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * of the License at 7afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * 8afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * 10afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * License for the specific language governing permissions and limitations 14afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * under the License. 15afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */ 16afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 17afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectpackage com.android.settings; 18afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 19f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawaimport android.app.Activity; 20afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.app.AlertDialog; 21afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.app.Dialog; 22f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawaimport android.app.ListFragment; 236b8e6585c672dfee5b69d3b5b2f1c030acf95a22Jean Chalardimport android.content.ContentResolver; 24afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.Context; 25afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.DialogInterface; 26f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawaimport android.content.Intent; 27afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.database.Cursor; 28afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.Bundle; 29afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.provider.UserDictionary; 30afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.text.InputType; 3199e509cc4c2057dcfba1745ae7584fc1f4047acaJean Chalardimport android.text.TextUtils; 32f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawaimport android.util.Log; 33f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawaimport android.view.LayoutInflater; 34afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.Menu; 35f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawaimport android.view.MenuInflater; 36afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.MenuItem; 37afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.View; 38f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawaimport android.view.ViewGroup; 39985f5efc8278e1a5c2170c3aba354a4c9367b741Amith Yamasaniimport android.view.WindowManager; 40afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.AlphabetIndexer; 41afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.EditText; 42e2ac72b4bc1c3dcb1540624c40ab17dfbf78a6eeAmith Yamasaniimport android.widget.ImageView; 43afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.ListAdapter; 44afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.ListView; 45afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.SectionIndexer; 46afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.SimpleCursorAdapter; 47afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.TextView; 48e98256646c0c1a8d79af5d23bf5330daafb5cf14Amith Yamasani 49be3f0faf526d628b578b1af6d975c19cfdf8637bJean Chalardimport com.android.settings.inputmethod.UserDictionaryAddWordContents; 50afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 51afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.util.Locale; 52afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 536b8e6585c672dfee5b69d3b5b2f1c030acf95a22Jean Chalardpublic class UserDictionarySettings extends ListFragment { 54f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa private static final String TAG = "UserDictionarySettings"; 55afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 56afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final String[] QUERY_PROJECTION = { 5799e509cc4c2057dcfba1745ae7584fc1f4047acaJean Chalard UserDictionary.Words._ID, UserDictionary.Words.WORD, UserDictionary.Words.SHORTCUT 58afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project }; 59e2ac72b4bc1c3dcb1540624c40ab17dfbf78a6eeAmith Yamasani 6099e509cc4c2057dcfba1745ae7584fc1f4047acaJean Chalard // The index of the shortcut in the above array. 6199e509cc4c2057dcfba1745ae7584fc1f4047acaJean Chalard private static final int INDEX_SHORTCUT = 2; 62e2ac72b4bc1c3dcb1540624c40ab17dfbf78a6eeAmith Yamasani 63afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Either the locale is empty (means the word is applicable to all locales) 64afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // or the word equals our current locale 6571ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard private static final String QUERY_SELECTION = 6671ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard UserDictionary.Words.LOCALE + "=?"; 6771ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard private static final String QUERY_SELECTION_ALL_LOCALES = 6871ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard UserDictionary.Words.LOCALE + " is null"; 69afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 70657beac9bb27d8c40b5193ecd49ec2c8d46f72bbJean Chalard private static final String DELETE_SELECTION_WITH_SHORTCUT = UserDictionary.Words.WORD 71657beac9bb27d8c40b5193ecd49ec2c8d46f72bbJean Chalard + "=? AND " + UserDictionary.Words.SHORTCUT + "=?"; 72657beac9bb27d8c40b5193ecd49ec2c8d46f72bbJean Chalard private static final String DELETE_SELECTION_WITHOUT_SHORTCUT = UserDictionary.Words.WORD 73657beac9bb27d8c40b5193ecd49ec2c8d46f72bbJean Chalard + "=? AND " + UserDictionary.Words.SHORTCUT + " is null OR " 74657beac9bb27d8c40b5193ecd49ec2c8d46f72bbJean Chalard + UserDictionary.Words.SHORTCUT + "=''"; 75afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 76afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final int OPTIONS_MENU_ADD = Menu.FIRST; 77afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 78afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private Cursor mCursor; 7971ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard 8071ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard protected String mLocale; 8171ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard 82afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 83f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa public void onCreate(Bundle savedInstanceState) { 84afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project super.onCreate(savedInstanceState); 85f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa } 86f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa 87f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa @Override 88b654cbb896a6e6db9ecec164476b0ac4a3e72774Jeff Sharkey public View onCreateView( 89b654cbb896a6e6db9ecec164476b0ac4a3e72774Jeff Sharkey LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 90b654cbb896a6e6db9ecec164476b0ac4a3e72774Jeff Sharkey return inflater.inflate( 91b654cbb896a6e6db9ecec164476b0ac4a3e72774Jeff Sharkey com.android.internal.R.layout.preference_list_fragment, container, false); 92b654cbb896a6e6db9ecec164476b0ac4a3e72774Jeff Sharkey } 93b654cbb896a6e6db9ecec164476b0ac4a3e72774Jeff Sharkey 94b654cbb896a6e6db9ecec164476b0ac4a3e72774Jeff Sharkey @Override 95f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa public void onActivityCreated(Bundle savedInstanceState) { 96f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa super.onActivityCreated(savedInstanceState); 97afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 98c087e35d7f9a968ea035e931aa318cf36a3e1b90Jean Chalard final Intent intent = getActivity().getIntent(); 9971ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard final String localeFromIntent = 10071ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard null == intent ? null : intent.getStringExtra("locale"); 10171ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard 10271ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard final Bundle arguments = getArguments(); 10371ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard final String localeFromArguments = 10471ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard null == arguments ? null : arguments.getString("locale"); 10571ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard 10671ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard final String locale; 10771ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard if (null != localeFromArguments) { 10871ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard locale = localeFromArguments; 10971ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard } else if (null != localeFromIntent) { 11071ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard locale = localeFromIntent; 11171ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard } else { 11271ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard locale = null; 11371ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard } 114c087e35d7f9a968ea035e931aa318cf36a3e1b90Jean Chalard 11571ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard mLocale = locale; 11671ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard mCursor = createCursor(locale); 117dcf8ba9eb233b4dadd1e198b7ec6ba413c6583c1Jeff Sharkey TextView emptyView = (TextView) getView().findViewById(android.R.id.empty); 118afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project emptyView.setText(R.string.user_dict_settings_empty_text); 119f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa 120f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa final ListView listView = getListView(); 121f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa listView.setAdapter(createAdapter()); 122afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project listView.setFastScrollEnabled(true); 123afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project listView.setEmptyView(emptyView); 124afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 125f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa setHasOptionsMenu(true); 126f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa 127afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 128afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 129c087e35d7f9a968ea035e931aa318cf36a3e1b90Jean Chalard private Cursor createCursor(final String locale) { 13071ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard // Locale can be any of: 13171ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard // - The string representation of a locale, as returned by Locale#toString() 13271ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard // - The empty string. This means we want a cursor returning words valid for all locales. 13371ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard // - null. This means we want a cursor for the current locale, whatever this is. 13471ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard // Note that this contrasts with the data inside the database, where NULL means "all 13571ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard // locales" and there should never be an empty string. The confusion is called by the 13671ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard // historical use of null for "all locales". 13771ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard // TODO: it should be easy to make this more readable by making the special values 13871ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard // human-readable, like "all_locales" and "current_locales" strings, provided they 13971ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard // can be guaranteed not to match locales that may exist. 14071ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard if ("".equals(locale)) { 14171ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard // Case-insensitive sort 14271ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard return getActivity().managedQuery(UserDictionary.Words.CONTENT_URI, QUERY_PROJECTION, 14371ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard QUERY_SELECTION_ALL_LOCALES, null, 14471ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard "UPPER(" + UserDictionary.Words.WORD + ")"); 14571ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard } else { 14671ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard final String queryLocale = null != locale ? locale : Locale.getDefault().toString(); 14771ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard return getActivity().managedQuery(UserDictionary.Words.CONTENT_URI, QUERY_PROJECTION, 14871ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard QUERY_SELECTION, new String[] { queryLocale }, 14971ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard "UPPER(" + UserDictionary.Words.WORD + ")"); 15071ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard } 151afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 152afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 153afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private ListAdapter createAdapter() { 154f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa return new MyAdapter(getActivity(), 155e2ac72b4bc1c3dcb1540624c40ab17dfbf78a6eeAmith Yamasani R.layout.user_dictionary_item, mCursor, 15699e509cc4c2057dcfba1745ae7584fc1f4047acaJean Chalard new String[] { UserDictionary.Words.WORD, UserDictionary.Words.SHORTCUT }, 15799e509cc4c2057dcfba1745ae7584fc1f4047acaJean Chalard new int[] { android.R.id.text1, android.R.id.text2 }, this); 158afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 15971ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard 160afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 161f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa public void onListItemClick(ListView l, View v, int position, long id) { 1621571c0a377f4aa94ef424da326a52fad638b3e54Jean Chalard final String word = getWord(position); 1631571c0a377f4aa94ef424da326a52fad638b3e54Jean Chalard final String shortcut = getShortcut(position); 164e98256646c0c1a8d79af5d23bf5330daafb5cf14Amith Yamasani if (word != null) { 1651571c0a377f4aa94ef424da326a52fad638b3e54Jean Chalard showAddOrEditDialog(word, shortcut); 166afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 167afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 168afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 169afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 170f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 17102cf71a5916d1b0155e8fff3f62987cdc5c2b7c3Amith Yamasani MenuItem actionItem = 17202cf71a5916d1b0155e8fff3f62987cdc5c2b7c3Amith Yamasani menu.add(0, OPTIONS_MENU_ADD, 0, R.string.user_dict_settings_add_menu_title) 173afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project .setIcon(R.drawable.ic_menu_add); 174162e541011e6ca716bf4af191dee419c1a712d0eGilles Debunne actionItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM | 175162e541011e6ca716bf4af191dee419c1a712d0eGilles Debunne MenuItem.SHOW_AS_ACTION_WITH_TEXT); 176afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 177afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 178afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 179afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public boolean onOptionsItemSelected(MenuItem item) { 180432fafe200a84ac519b1f23484cab55007baa62aAmith Yamasani if (item.getItemId() == OPTIONS_MENU_ADD) { 1811571c0a377f4aa94ef424da326a52fad638b3e54Jean Chalard showAddOrEditDialog(null, null); 182432fafe200a84ac519b1f23484cab55007baa62aAmith Yamasani return true; 183432fafe200a84ac519b1f23484cab55007baa62aAmith Yamasani } 184432fafe200a84ac519b1f23484cab55007baa62aAmith Yamasani return false; 185afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 186afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 1876b8e6585c672dfee5b69d3b5b2f1c030acf95a22Jean Chalard /** 1886b8e6585c672dfee5b69d3b5b2f1c030acf95a22Jean Chalard * Add or edit a word. If editingWord is null, it's an add; otherwise, it's an edit. 1896b8e6585c672dfee5b69d3b5b2f1c030acf95a22Jean Chalard * @param editingWord the word to edit, or null if it's an add. 1901571c0a377f4aa94ef424da326a52fad638b3e54Jean Chalard * @param editingShortcut the shortcut for this entry, or null if none. 1916b8e6585c672dfee5b69d3b5b2f1c030acf95a22Jean Chalard */ 1921571c0a377f4aa94ef424da326a52fad638b3e54Jean Chalard private void showAddOrEditDialog(final String editingWord, final String editingShortcut) { 193be07e49a9292b653b923cbfa64dc5c42972ded41Jean Chalard final Bundle args = new Bundle(); 194be3f0faf526d628b578b1af6d975c19cfdf8637bJean Chalard args.putInt(UserDictionaryAddWordContents.EXTRA_MODE, null == editingWord 195be3f0faf526d628b578b1af6d975c19cfdf8637bJean Chalard ? UserDictionaryAddWordContents.MODE_INSERT 196be3f0faf526d628b578b1af6d975c19cfdf8637bJean Chalard : UserDictionaryAddWordContents.MODE_EDIT); 197be3f0faf526d628b578b1af6d975c19cfdf8637bJean Chalard args.putString(UserDictionaryAddWordContents.EXTRA_WORD, editingWord); 1981571c0a377f4aa94ef424da326a52fad638b3e54Jean Chalard args.putString(UserDictionaryAddWordContents.EXTRA_SHORTCUT, editingShortcut); 199be3f0faf526d628b578b1af6d975c19cfdf8637bJean Chalard args.putString(UserDictionaryAddWordContents.EXTRA_LOCALE, mLocale); 200be07e49a9292b653b923cbfa64dc5c42972ded41Jean Chalard android.preference.PreferenceActivity pa = 201be07e49a9292b653b923cbfa64dc5c42972ded41Jean Chalard (android.preference.PreferenceActivity)getActivity(); 202be07e49a9292b653b923cbfa64dc5c42972ded41Jean Chalard pa.startPreferencePanel( 203be07e49a9292b653b923cbfa64dc5c42972ded41Jean Chalard com.android.settings.inputmethod.UserDictionaryAddWordFragment.class.getName(), 2047dabe4583c2bb12ed1d072139399f6bca8067994Jean Chalard args, R.string.user_dict_settings_add_dialog_title, null, null, 0); 205afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 206f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa 2071571c0a377f4aa94ef424da326a52fad638b3e54Jean Chalard private String getWord(final int position) { 208ea41e087f98ebc226410e3621b9bca91c1688e0aJean Chalard if (null == mCursor) return null; 209afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mCursor.moveToPosition(position); 210e33813932474f760073f92bdb7bbf93d1b923d70Amith Yamasani // Handle a possible race-condition 211e33813932474f760073f92bdb7bbf93d1b923d70Amith Yamasani if (mCursor.isAfterLast()) return null; 212e33813932474f760073f92bdb7bbf93d1b923d70Amith Yamasani 213afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project return mCursor.getString( 214afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mCursor.getColumnIndexOrThrow(UserDictionary.Words.WORD)); 215afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 2161571c0a377f4aa94ef424da326a52fad638b3e54Jean Chalard 2171571c0a377f4aa94ef424da326a52fad638b3e54Jean Chalard private String getShortcut(final int position) { 2181571c0a377f4aa94ef424da326a52fad638b3e54Jean Chalard if (null == mCursor) return null; 2191571c0a377f4aa94ef424da326a52fad638b3e54Jean Chalard mCursor.moveToPosition(position); 2201571c0a377f4aa94ef424da326a52fad638b3e54Jean Chalard // Handle a possible race-condition 2211571c0a377f4aa94ef424da326a52fad638b3e54Jean Chalard if (mCursor.isAfterLast()) return null; 2221571c0a377f4aa94ef424da326a52fad638b3e54Jean Chalard 2231571c0a377f4aa94ef424da326a52fad638b3e54Jean Chalard return mCursor.getString( 2241571c0a377f4aa94ef424da326a52fad638b3e54Jean Chalard mCursor.getColumnIndexOrThrow(UserDictionary.Words.SHORTCUT)); 2251571c0a377f4aa94ef424da326a52fad638b3e54Jean Chalard } 226985f5efc8278e1a5c2170c3aba354a4c9367b741Amith Yamasani 227657beac9bb27d8c40b5193ecd49ec2c8d46f72bbJean Chalard public static void deleteWord(final String word, final String shortcut, 228657beac9bb27d8c40b5193ecd49ec2c8d46f72bbJean Chalard final ContentResolver resolver) { 229657beac9bb27d8c40b5193ecd49ec2c8d46f72bbJean Chalard if (TextUtils.isEmpty(shortcut)) { 230657beac9bb27d8c40b5193ecd49ec2c8d46f72bbJean Chalard resolver.delete( 231657beac9bb27d8c40b5193ecd49ec2c8d46f72bbJean Chalard UserDictionary.Words.CONTENT_URI, DELETE_SELECTION_WITHOUT_SHORTCUT, 232657beac9bb27d8c40b5193ecd49ec2c8d46f72bbJean Chalard new String[] { word }); 233657beac9bb27d8c40b5193ecd49ec2c8d46f72bbJean Chalard } else { 234657beac9bb27d8c40b5193ecd49ec2c8d46f72bbJean Chalard resolver.delete( 235657beac9bb27d8c40b5193ecd49ec2c8d46f72bbJean Chalard UserDictionary.Words.CONTENT_URI, DELETE_SELECTION_WITH_SHORTCUT, 236657beac9bb27d8c40b5193ecd49ec2c8d46f72bbJean Chalard new String[] { word, shortcut }); 237657beac9bb27d8c40b5193ecd49ec2c8d46f72bbJean Chalard } 238afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 239f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa 24099e509cc4c2057dcfba1745ae7584fc1f4047acaJean Chalard private static class MyAdapter extends SimpleCursorAdapter implements SectionIndexer { 241e2ac72b4bc1c3dcb1540624c40ab17dfbf78a6eeAmith Yamasani 242e2ac72b4bc1c3dcb1540624c40ab17dfbf78a6eeAmith Yamasani private AlphabetIndexer mIndexer; 243e2ac72b4bc1c3dcb1540624c40ab17dfbf78a6eeAmith Yamasani 244e2ac72b4bc1c3dcb1540624c40ab17dfbf78a6eeAmith Yamasani private ViewBinder mViewBinder = new ViewBinder() { 245e2ac72b4bc1c3dcb1540624c40ab17dfbf78a6eeAmith Yamasani 246e2ac72b4bc1c3dcb1540624c40ab17dfbf78a6eeAmith Yamasani public boolean setViewValue(View v, Cursor c, int columnIndex) { 24799e509cc4c2057dcfba1745ae7584fc1f4047acaJean Chalard if (columnIndex == INDEX_SHORTCUT) { 24899e509cc4c2057dcfba1745ae7584fc1f4047acaJean Chalard final String shortcut = c.getString(INDEX_SHORTCUT); 24999e509cc4c2057dcfba1745ae7584fc1f4047acaJean Chalard if (TextUtils.isEmpty(shortcut)) { 25099e509cc4c2057dcfba1745ae7584fc1f4047acaJean Chalard v.setVisibility(View.GONE); 25199e509cc4c2057dcfba1745ae7584fc1f4047acaJean Chalard } else { 25299e509cc4c2057dcfba1745ae7584fc1f4047acaJean Chalard ((TextView)v).setText(shortcut); 25399e509cc4c2057dcfba1745ae7584fc1f4047acaJean Chalard v.setVisibility(View.VISIBLE); 25499e509cc4c2057dcfba1745ae7584fc1f4047acaJean Chalard } 25599e509cc4c2057dcfba1745ae7584fc1f4047acaJean Chalard v.invalidate(); 256e2ac72b4bc1c3dcb1540624c40ab17dfbf78a6eeAmith Yamasani return true; 257e2ac72b4bc1c3dcb1540624c40ab17dfbf78a6eeAmith Yamasani } 258e2ac72b4bc1c3dcb1540624c40ab17dfbf78a6eeAmith Yamasani 259e2ac72b4bc1c3dcb1540624c40ab17dfbf78a6eeAmith Yamasani return false; 260e2ac72b4bc1c3dcb1540624c40ab17dfbf78a6eeAmith Yamasani } 261e2ac72b4bc1c3dcb1540624c40ab17dfbf78a6eeAmith Yamasani }; 262e2ac72b4bc1c3dcb1540624c40ab17dfbf78a6eeAmith Yamasani 263e2ac72b4bc1c3dcb1540624c40ab17dfbf78a6eeAmith Yamasani public MyAdapter(Context context, int layout, Cursor c, String[] from, int[] to, 264e2ac72b4bc1c3dcb1540624c40ab17dfbf78a6eeAmith Yamasani UserDictionarySettings settings) { 265afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project super(context, layout, c, from, to); 266afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 267ea41e087f98ebc226410e3621b9bca91c1688e0aJean Chalard if (null != c) { 268ea41e087f98ebc226410e3621b9bca91c1688e0aJean Chalard final String alphabet = context.getString( 269ea41e087f98ebc226410e3621b9bca91c1688e0aJean Chalard com.android.internal.R.string.fast_scroll_alphabet); 270ea41e087f98ebc226410e3621b9bca91c1688e0aJean Chalard final int wordColIndex = c.getColumnIndexOrThrow(UserDictionary.Words.WORD); 271ea41e087f98ebc226410e3621b9bca91c1688e0aJean Chalard mIndexer = new AlphabetIndexer(c, wordColIndex, alphabet); 272ea41e087f98ebc226410e3621b9bca91c1688e0aJean Chalard } 273e2ac72b4bc1c3dcb1540624c40ab17dfbf78a6eeAmith Yamasani setViewBinder(mViewBinder); 274afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 275afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 276afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public int getPositionForSection(int section) { 277ea41e087f98ebc226410e3621b9bca91c1688e0aJean Chalard return null == mIndexer ? 0 : mIndexer.getPositionForSection(section); 278afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 279afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 280afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public int getSectionForPosition(int position) { 281ea41e087f98ebc226410e3621b9bca91c1688e0aJean Chalard return null == mIndexer ? 0 : mIndexer.getSectionForPosition(position); 282afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 283afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 284afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public Object[] getSections() { 285ea41e087f98ebc226410e3621b9bca91c1688e0aJean Chalard return null == mIndexer ? null : mIndexer.getSections(); 286afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 287afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 288afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project} 289