UserDictionarySettings.java revision 02cf71a5916d1b0155e8fff3f62987cdc5c2b7c3
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 com.android.settings.SettingsPreferenceFragment.SettingsDialogFragment; 20f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa 21f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawaimport android.app.Activity; 22afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.app.AlertDialog; 23afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.app.Dialog; 24f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawaimport android.app.ListFragment; 25afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.Context; 26afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.DialogInterface; 27f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawaimport android.content.Intent; 28afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.database.Cursor; 29afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.Bundle; 30afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.provider.UserDictionary; 31afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.text.InputType; 32f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawaimport android.util.Log; 33afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.ContextMenu; 34f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawaimport android.view.LayoutInflater; 35afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.Menu; 36f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawaimport android.view.MenuInflater; 37afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.MenuItem; 38afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.View; 39f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawaimport android.view.ViewGroup; 40985f5efc8278e1a5c2170c3aba354a4c9367b741Amith Yamasaniimport android.view.WindowManager; 4102cf71a5916d1b0155e8fff3f62987cdc5c2b7c3Amith Yamasaniimport android.view.ContextMenu.ContextMenuInfo; 42afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.AlphabetIndexer; 43afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.EditText; 44afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.ListAdapter; 45afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.ListView; 46afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.SectionIndexer; 47afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.SimpleCursorAdapter; 48afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.TextView; 4902cf71a5916d1b0155e8fff3f62987cdc5c2b7c3Amith Yamasaniimport android.widget.AdapterView.AdapterContextMenuInfo; 50afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 51afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.util.Locale; 52afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 53f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawapublic class UserDictionarySettings extends ListFragment implements DialogCreatable { 54f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa private static final String TAG = "UserDictionarySettings"; 55afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 56afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final String INSTANCE_KEY_DIALOG_EDITING_WORD = "DIALOG_EDITING_WORD"; 57afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final String INSTANCE_KEY_ADDED_WORD = "DIALOG_ADDED_WORD"; 58afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 59afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final String[] QUERY_PROJECTION = { 60afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project UserDictionary.Words._ID, UserDictionary.Words.WORD 61afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project }; 62afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 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 65afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final String QUERY_SELECTION = UserDictionary.Words.LOCALE + "=? OR " 66afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project + UserDictionary.Words.LOCALE + " is null"; 67afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 68afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final String DELETE_SELECTION = UserDictionary.Words.WORD + "=?"; 69afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 70afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final String EXTRA_WORD = "word"; 71afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 72afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final int CONTEXT_MENU_EDIT = Menu.FIRST; 73afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final int CONTEXT_MENU_DELETE = Menu.FIRST + 1; 74afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 75afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final int OPTIONS_MENU_ADD = Menu.FIRST; 76afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 77afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final int DIALOG_ADD_OR_EDIT = 0; 78afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 79afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project /** The word being edited in the dialog (null means the user is adding a word). */ 80afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private String mDialogEditingWord; 81f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa 82f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa private View mView; 83afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private Cursor mCursor; 84afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 85afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private boolean mAddedWordAlready; 86afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private boolean mAutoReturn; 87f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa 88f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa private SettingsDialogFragment mDialogFragment; 89f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa 90afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 91f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa public void onCreate(Bundle savedInstanceState) { 92afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project super.onCreate(savedInstanceState); 93f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa } 94f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa 95f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa @Override 96f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa public View onCreateView(LayoutInflater inflater, ViewGroup container, 97f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa Bundle savedInstanceState) { 98f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa mView = inflater.inflate(R.layout.list_content_with_empty_view, container, false); 99f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa return mView; 100f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa } 101f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa 102f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa @Override 103f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa public void onActivityCreated(Bundle savedInstanceState) { 104f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa super.onActivityCreated(savedInstanceState); 105afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 106afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mCursor = createCursor(); 107f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa TextView emptyView = (TextView)mView.findViewById(R.id.empty); 108afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project emptyView.setText(R.string.user_dict_settings_empty_text); 109f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa 110f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa final ListView listView = getListView(); 111f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa listView.setAdapter(createAdapter()); 112afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project listView.setFastScrollEnabled(true); 113afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project listView.setEmptyView(emptyView); 114afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 115afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project registerForContextMenu(listView); 116f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa setHasOptionsMenu(true); 117f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa 118f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa if (savedInstanceState != null) { 119f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa mDialogEditingWord = savedInstanceState.getString(INSTANCE_KEY_DIALOG_EDITING_WORD); 120f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa mAddedWordAlready = savedInstanceState.getBoolean(INSTANCE_KEY_ADDED_WORD, false); 121f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa } 122afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 123afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 124afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 125f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa public void onResume() { 126afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project super.onResume(); 127f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa final Intent intent = getActivity().getIntent(); 128afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if (!mAddedWordAlready 129f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa && intent.getAction().equals("com.android.settings.USER_DICTIONARY_INSERT")) { 130f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa final String word = intent.getStringExtra(EXTRA_WORD); 131afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mAutoReturn = true; 132afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if (word != null) { 133afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project showAddOrEditDialog(word); 134afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 135afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 136afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 137afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 138afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 139f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa public void onSaveInstanceState(Bundle outState) { 140afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project super.onSaveInstanceState(outState); 141afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project outState.putString(INSTANCE_KEY_DIALOG_EDITING_WORD, mDialogEditingWord); 142afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project outState.putBoolean(INSTANCE_KEY_ADDED_WORD, mAddedWordAlready); 143afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 144afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 145afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private Cursor createCursor() { 146afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project String currentLocale = Locale.getDefault().toString(); 147afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Case-insensitive sort 148f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa return getActivity().managedQuery(UserDictionary.Words.CONTENT_URI, QUERY_PROJECTION, 149afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project QUERY_SELECTION, new String[] { currentLocale }, 150afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project "UPPER(" + UserDictionary.Words.WORD + ")"); 151afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 152afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 153afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private ListAdapter createAdapter() { 154f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa return new MyAdapter(getActivity(), 155afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project android.R.layout.simple_list_item_1, mCursor, 156afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project new String[] { UserDictionary.Words.WORD }, 157afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project new int[] { android.R.id.text1 }); 158afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 159afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 160afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 161f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa public void onListItemClick(ListView l, View v, int position, long id) { 162f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa getActivity().openContextMenu(v); 163afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 164afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 165afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 166afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { 167afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if (!(menuInfo instanceof AdapterContextMenuInfo)) return; 168afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 169afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project AdapterContextMenuInfo adapterMenuInfo = (AdapterContextMenuInfo) menuInfo; 170afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project menu.setHeaderTitle(getWord(adapterMenuInfo.position)); 17186997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project menu.add(0, CONTEXT_MENU_EDIT, 0, 17286997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project R.string.user_dict_settings_context_menu_edit_title); 17386997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project menu.add(0, CONTEXT_MENU_DELETE, 0, 17486997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project R.string.user_dict_settings_context_menu_delete_title); 175afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 176afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 177afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 178afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public boolean onContextItemSelected(MenuItem item) { 179afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project ContextMenuInfo menuInfo = item.getMenuInfo(); 180afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if (!(menuInfo instanceof AdapterContextMenuInfo)) return false; 181afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 182afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project AdapterContextMenuInfo adapterMenuInfo = (AdapterContextMenuInfo) menuInfo; 183afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project String word = getWord(adapterMenuInfo.position); 184e33813932474f760073f92bdb7bbf93d1b923d70Amith Yamasani if (word == null) return true; 185e33813932474f760073f92bdb7bbf93d1b923d70Amith Yamasani 186afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project switch (item.getItemId()) { 187afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project case CONTEXT_MENU_DELETE: 188afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project deleteWord(word); 189afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project return true; 190afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 191afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project case CONTEXT_MENU_EDIT: 192afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project showAddOrEditDialog(word); 193afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project return true; 194afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 195afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 196afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project return false; 197afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 198afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 199afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 200f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 20102cf71a5916d1b0155e8fff3f62987cdc5c2b7c3Amith Yamasani MenuItem actionItem = 20202cf71a5916d1b0155e8fff3f62987cdc5c2b7c3Amith Yamasani menu.add(0, OPTIONS_MENU_ADD, 0, R.string.user_dict_settings_add_menu_title) 203afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project .setIcon(R.drawable.ic_menu_add); 20402cf71a5916d1b0155e8fff3f62987cdc5c2b7c3Amith Yamasani actionItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); 205afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 206afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 207afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 208afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public boolean onOptionsItemSelected(MenuItem item) { 209afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project showAddOrEditDialog(null); 210afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project return true; 211afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 212afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 213afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private void showAddOrEditDialog(String editingWord) { 214afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mDialogEditingWord = editingWord; 215afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project showDialog(DIALOG_ADD_OR_EDIT); 216afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 217f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa 218afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private String getWord(int position) { 219afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mCursor.moveToPosition(position); 220e33813932474f760073f92bdb7bbf93d1b923d70Amith Yamasani // Handle a possible race-condition 221e33813932474f760073f92bdb7bbf93d1b923d70Amith Yamasani if (mCursor.isAfterLast()) return null; 222e33813932474f760073f92bdb7bbf93d1b923d70Amith Yamasani 223afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project return mCursor.getString( 224afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mCursor.getColumnIndexOrThrow(UserDictionary.Words.WORD)); 225afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 226985f5efc8278e1a5c2170c3aba354a4c9367b741Amith Yamasani 227afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 228f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa public Dialog onCreateDialog(int id) { 229f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa final Activity activity = getActivity(); 230f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa final View content = activity.getLayoutInflater().inflate(R.layout.dialog_edittext, null); 231afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project final EditText editText = (EditText) content.findViewById(R.id.edittext); 232f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa editText.setText(mDialogEditingWord); 233afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // No prediction in soft keyboard mode. TODO: Create a better way to disable prediction 234afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project editText.setInputType(InputType.TYPE_CLASS_TEXT 235afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project | InputType.TYPE_TEXT_FLAG_AUTO_COMPLETE); 236f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa 237f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa AlertDialog dialog = new AlertDialog.Builder(activity) 23886997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project .setTitle(mDialogEditingWord != null 23986997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project ? R.string.user_dict_settings_edit_dialog_title 24086997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project : R.string.user_dict_settings_add_dialog_title) 241afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project .setView(content) 242afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { 243afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public void onClick(DialogInterface dialog, int which) { 244afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project onAddOrEditFinished(editText.getText().toString()); 245f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa if (mAutoReturn) activity.onBackPressed(); 246afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project }}) 247afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project .setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() { 248afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public void onClick(DialogInterface dialog, int which) { 249f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa if (mAutoReturn) activity.onBackPressed(); 250afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project }}) 251afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project .create(); 252985f5efc8278e1a5c2170c3aba354a4c9367b741Amith Yamasani dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE | 253985f5efc8278e1a5c2170c3aba354a4c9367b741Amith Yamasani WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE); 254985f5efc8278e1a5c2170c3aba354a4c9367b741Amith Yamasani return dialog; 255afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 256985f5efc8278e1a5c2170c3aba354a4c9367b741Amith Yamasani 257f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa private void showDialog(int dialogId) { 258f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa if (mDialogFragment != null) { 259f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa Log.e(TAG, "Old dialog fragment not null!"); 260f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa } 261f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa mDialogFragment = new SettingsDialogFragment(this, dialogId); 262f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa mDialogFragment.show(getActivity().getFragmentManager(), Integer.toString(dialogId)); 263afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 264afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 265afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private void onAddOrEditFinished(String word) { 266afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if (mDialogEditingWord != null) { 267afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // The user was editing a word, so do a delete/add 268afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project deleteWord(mDialogEditingWord); 269afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 270afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 271afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Disallow duplicates 272afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project deleteWord(word); 273afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 274afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // TODO: present UI for picking whether to add word to all locales, or current. 275f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa UserDictionary.Words.addWord(getActivity(), word.toString(), 276afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 250, UserDictionary.Words.LOCALE_TYPE_ALL); 277d334d52c47d860bb6f0c44e8c16e22199f5a62c6Vasu Nori if (!mCursor.requery()) { 278d334d52c47d860bb6f0c44e8c16e22199f5a62c6Vasu Nori throw new IllegalStateException("can't requery on already-closed cursor."); 279d334d52c47d860bb6f0c44e8c16e22199f5a62c6Vasu Nori } 280afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mAddedWordAlready = true; 281afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 282afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 283afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private void deleteWord(String word) { 284f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa getActivity().getContentResolver().delete( 285f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa UserDictionary.Words.CONTENT_URI, DELETE_SELECTION, new String[] { word }); 286afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 287f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa 288afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static class MyAdapter extends SimpleCursorAdapter implements SectionIndexer { 289afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private AlphabetIndexer mIndexer; 290afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 291afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public MyAdapter(Context context, int layout, Cursor c, String[] from, int[] to) { 292afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project super(context, layout, c, from, to); 293afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 294afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project int wordColIndex = c.getColumnIndexOrThrow(UserDictionary.Words.WORD); 295afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project String alphabet = context.getString(com.android.internal.R.string.fast_scroll_alphabet); 296afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mIndexer = new AlphabetIndexer(c, wordColIndex, alphabet); 297afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 298afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 299afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public int getPositionForSection(int section) { 300afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project return mIndexer.getPositionForSection(section); 301afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 302afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 303afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public int getSectionForPosition(int position) { 304afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project return mIndexer.getSectionForPosition(position); 305afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 306afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 307afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public Object[] getSections() { 308afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project return mIndexer.getSections(); 309afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 310afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 311afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project} 312