UserDictionarySettings.java revision f58090d5224fa03e8f4d8a980306952686a152f0
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.ContextMenu.ContextMenuInfo; 35f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawaimport android.view.LayoutInflater; 36afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.Menu; 37f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawaimport android.view.MenuInflater; 38afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.MenuItem; 39afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.View; 40f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawaimport android.view.ViewGroup; 41985f5efc8278e1a5c2170c3aba354a4c9367b741Amith Yamasaniimport android.view.WindowManager; 42f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawaimport android.widget.AdapterView.AdapterContextMenuInfo; 43afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.AlphabetIndexer; 44afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.EditText; 45afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.ListAdapter; 46afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.ListView; 47afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.SectionIndexer; 48afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.SimpleCursorAdapter; 49afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.TextView; 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) { 201afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project menu.add(0, OPTIONS_MENU_ADD, 0, R.string.user_dict_settings_add_menu_title) 202afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project .setIcon(R.drawable.ic_menu_add); 203afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 204afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 205afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 206afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public boolean onOptionsItemSelected(MenuItem item) { 207afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project showAddOrEditDialog(null); 208afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project return true; 209afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 210afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 211afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private void showAddOrEditDialog(String editingWord) { 212afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mDialogEditingWord = editingWord; 213afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project showDialog(DIALOG_ADD_OR_EDIT); 214afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 215f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa 216afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private String getWord(int position) { 217afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mCursor.moveToPosition(position); 218e33813932474f760073f92bdb7bbf93d1b923d70Amith Yamasani // Handle a possible race-condition 219e33813932474f760073f92bdb7bbf93d1b923d70Amith Yamasani if (mCursor.isAfterLast()) return null; 220e33813932474f760073f92bdb7bbf93d1b923d70Amith Yamasani 221afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project return mCursor.getString( 222afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mCursor.getColumnIndexOrThrow(UserDictionary.Words.WORD)); 223afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 224985f5efc8278e1a5c2170c3aba354a4c9367b741Amith Yamasani 225afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 226f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa public Dialog onCreateDialog(int id) { 227f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa final Activity activity = getActivity(); 228f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa final View content = activity.getLayoutInflater().inflate(R.layout.dialog_edittext, null); 229afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project final EditText editText = (EditText) content.findViewById(R.id.edittext); 230f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa editText.setText(mDialogEditingWord); 231afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // No prediction in soft keyboard mode. TODO: Create a better way to disable prediction 232afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project editText.setInputType(InputType.TYPE_CLASS_TEXT 233afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project | InputType.TYPE_TEXT_FLAG_AUTO_COMPLETE); 234f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa 235f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa AlertDialog dialog = new AlertDialog.Builder(activity) 23686997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project .setTitle(mDialogEditingWord != null 23786997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project ? R.string.user_dict_settings_edit_dialog_title 23886997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project : R.string.user_dict_settings_add_dialog_title) 239afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project .setView(content) 240afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { 241afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public void onClick(DialogInterface dialog, int which) { 242afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project onAddOrEditFinished(editText.getText().toString()); 243f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa if (mAutoReturn) activity.onBackPressed(); 244afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project }}) 245afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project .setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() { 246afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public void onClick(DialogInterface dialog, int which) { 247f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa if (mAutoReturn) activity.onBackPressed(); 248afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project }}) 249afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project .create(); 250985f5efc8278e1a5c2170c3aba354a4c9367b741Amith Yamasani dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE | 251985f5efc8278e1a5c2170c3aba354a4c9367b741Amith Yamasani WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE); 252985f5efc8278e1a5c2170c3aba354a4c9367b741Amith Yamasani return dialog; 253afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 254985f5efc8278e1a5c2170c3aba354a4c9367b741Amith Yamasani 255f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa private void showDialog(int dialogId) { 256f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa if (mDialogFragment != null) { 257f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa Log.e(TAG, "Old dialog fragment not null!"); 258f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa } 259f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa mDialogFragment = new SettingsDialogFragment(this, dialogId); 260f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa mDialogFragment.show(getActivity().getFragmentManager(), Integer.toString(dialogId)); 261afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 262afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 263afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private void onAddOrEditFinished(String word) { 264afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if (mDialogEditingWord != null) { 265afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // The user was editing a word, so do a delete/add 266afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project deleteWord(mDialogEditingWord); 267afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 268afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 269afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Disallow duplicates 270afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project deleteWord(word); 271afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 272afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // TODO: present UI for picking whether to add word to all locales, or current. 273f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa UserDictionary.Words.addWord(getActivity(), word.toString(), 274afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 250, UserDictionary.Words.LOCALE_TYPE_ALL); 275d334d52c47d860bb6f0c44e8c16e22199f5a62c6Vasu Nori if (!mCursor.requery()) { 276d334d52c47d860bb6f0c44e8c16e22199f5a62c6Vasu Nori throw new IllegalStateException("can't requery on already-closed cursor."); 277d334d52c47d860bb6f0c44e8c16e22199f5a62c6Vasu Nori } 278afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mAddedWordAlready = true; 279afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 280afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 281afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private void deleteWord(String word) { 282f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa getActivity().getContentResolver().delete( 283f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa UserDictionary.Words.CONTENT_URI, DELETE_SELECTION, new String[] { word }); 284afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 285f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa 286afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static class MyAdapter extends SimpleCursorAdapter implements SectionIndexer { 287afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private AlphabetIndexer mIndexer; 288afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 289afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public MyAdapter(Context context, int layout, Cursor c, String[] from, int[] to) { 290afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project super(context, layout, c, from, to); 291afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 292afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project int wordColIndex = c.getColumnIndexOrThrow(UserDictionary.Words.WORD); 293afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project String alphabet = context.getString(com.android.internal.R.string.fast_scroll_alphabet); 294afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mIndexer = new AlphabetIndexer(c, wordColIndex, alphabet); 295afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 296afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 297afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public int getPositionForSection(int section) { 298afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project return mIndexer.getPositionForSection(section); 299afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 300afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 301afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public int getSectionForPosition(int position) { 302afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project return mIndexer.getSectionForPosition(position); 303afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 304afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 305afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public Object[] getSections() { 306afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project return mIndexer.getSections(); 307afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 308afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 309afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project} 310