UserDictionarySettings.java revision c087e35d7f9a968ea035e931aa318cf36a3e1b90
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; 23afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.Context; 24afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.DialogInterface; 25f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawaimport android.content.Intent; 26afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.database.Cursor; 27afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.Bundle; 28afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.provider.UserDictionary; 29afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.text.InputType; 30f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawaimport android.util.Log; 31f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawaimport android.view.LayoutInflater; 32afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.Menu; 33f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawaimport android.view.MenuInflater; 34afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.MenuItem; 35afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.View; 36f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawaimport android.view.ViewGroup; 37985f5efc8278e1a5c2170c3aba354a4c9367b741Amith Yamasaniimport android.view.WindowManager; 38afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.AlphabetIndexer; 39afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.EditText; 40e2ac72b4bc1c3dcb1540624c40ab17dfbf78a6eeAmith Yamasaniimport android.widget.ImageView; 41afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.ListAdapter; 42afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.ListView; 43afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.SectionIndexer; 44afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.SimpleCursorAdapter; 45afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.TextView; 46e98256646c0c1a8d79af5d23bf5330daafb5cf14Amith Yamasani 47e98256646c0c1a8d79af5d23bf5330daafb5cf14Amith Yamasaniimport com.android.settings.SettingsPreferenceFragment.SettingsDialogFragment; 48afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 49afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.util.Locale; 50afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 51f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawapublic class UserDictionarySettings extends ListFragment implements DialogCreatable { 52f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa private static final String TAG = "UserDictionarySettings"; 53afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 54afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final String INSTANCE_KEY_DIALOG_EDITING_WORD = "DIALOG_EDITING_WORD"; 55afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final String INSTANCE_KEY_ADDED_WORD = "DIALOG_ADDED_WORD"; 56afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 57afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final String[] QUERY_PROJECTION = { 58afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project UserDictionary.Words._ID, UserDictionary.Words.WORD 59afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project }; 60e2ac72b4bc1c3dcb1540624c40ab17dfbf78a6eeAmith Yamasani 61e2ac72b4bc1c3dcb1540624c40ab17dfbf78a6eeAmith Yamasani private static final int INDEX_ID = 0; 62e2ac72b4bc1c3dcb1540624c40ab17dfbf78a6eeAmith Yamasani private static final int INDEX_WORD = 1; 63e2ac72b4bc1c3dcb1540624c40ab17dfbf78a6eeAmith Yamasani 64afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Either the locale is empty (means the word is applicable to all locales) 65afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // or the word equals our current locale 66afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final String QUERY_SELECTION = UserDictionary.Words.LOCALE + "=? OR " 67afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project + UserDictionary.Words.LOCALE + " is null"; 68afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 69afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final String DELETE_SELECTION = UserDictionary.Words.WORD + "=?"; 70afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 71afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final String EXTRA_WORD = "word"; 72afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 73afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final int OPTIONS_MENU_ADD = Menu.FIRST; 74afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 75afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final int DIALOG_ADD_OR_EDIT = 0; 76afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 77afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project /** The word being edited in the dialog (null means the user is adding a word). */ 78afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private String mDialogEditingWord; 79f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa 80f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa private View mView; 81afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private Cursor mCursor; 82afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 83afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private boolean mAddedWordAlready; 84afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private boolean mAutoReturn; 85f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa 86f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa private SettingsDialogFragment mDialogFragment; 87f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa 88afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 89f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa public void onCreate(Bundle savedInstanceState) { 90afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project super.onCreate(savedInstanceState); 91f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa } 92f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa 93f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa @Override 94f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa public View onCreateView(LayoutInflater inflater, ViewGroup container, 95f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa Bundle savedInstanceState) { 96f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa mView = inflater.inflate(R.layout.list_content_with_empty_view, container, false); 97f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa return mView; 98f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa } 99f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa 100f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa @Override 101f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa public void onActivityCreated(Bundle savedInstanceState) { 102f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa super.onActivityCreated(savedInstanceState); 103afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 104c087e35d7f9a968ea035e931aa318cf36a3e1b90Jean Chalard final Intent intent = getActivity().getIntent(); 105c087e35d7f9a968ea035e931aa318cf36a3e1b90Jean Chalard final String locale = intent.getStringExtra("locale"); 106c087e35d7f9a968ea035e931aa318cf36a3e1b90Jean Chalard 107c087e35d7f9a968ea035e931aa318cf36a3e1b90Jean Chalard mCursor = createCursor(null != locale ? locale : Locale.getDefault().toString()); 108f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa TextView emptyView = (TextView)mView.findViewById(R.id.empty); 109afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project emptyView.setText(R.string.user_dict_settings_empty_text); 110f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa 111f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa final ListView listView = getListView(); 112f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa listView.setAdapter(createAdapter()); 113afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project listView.setFastScrollEnabled(true); 114afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project listView.setEmptyView(emptyView); 115afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 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 } 123c087e35d7f9a968ea035e931aa318cf36a3e1b90Jean Chalard 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(); 128c087e35d7f9a968ea035e931aa318cf36a3e1b90Jean Chalard 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 145c087e35d7f9a968ea035e931aa318cf36a3e1b90Jean Chalard private Cursor createCursor(final String locale) { 146afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Case-insensitive sort 147f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa return getActivity().managedQuery(UserDictionary.Words.CONTENT_URI, QUERY_PROJECTION, 148c087e35d7f9a968ea035e931aa318cf36a3e1b90Jean Chalard QUERY_SELECTION, new String[] { locale }, 149afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project "UPPER(" + UserDictionary.Words.WORD + ")"); 150afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 151afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 152afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private ListAdapter createAdapter() { 153f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa return new MyAdapter(getActivity(), 154e2ac72b4bc1c3dcb1540624c40ab17dfbf78a6eeAmith Yamasani R.layout.user_dictionary_item, mCursor, 155e2ac72b4bc1c3dcb1540624c40ab17dfbf78a6eeAmith Yamasani new String[] { UserDictionary.Words.WORD, UserDictionary.Words._ID }, 156e2ac72b4bc1c3dcb1540624c40ab17dfbf78a6eeAmith Yamasani new int[] { android.R.id.text1, R.id.delete_button }, this); 157afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 158afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 159afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 160f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa public void onListItemClick(ListView l, View v, int position, long id) { 161e98256646c0c1a8d79af5d23bf5330daafb5cf14Amith Yamasani String word = getWord(position); 162e98256646c0c1a8d79af5d23bf5330daafb5cf14Amith Yamasani if (word != null) { 163e98256646c0c1a8d79af5d23bf5330daafb5cf14Amith Yamasani showAddOrEditDialog(word); 164afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 165afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 166afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 167afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 168f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 16902cf71a5916d1b0155e8fff3f62987cdc5c2b7c3Amith Yamasani MenuItem actionItem = 17002cf71a5916d1b0155e8fff3f62987cdc5c2b7c3Amith Yamasani menu.add(0, OPTIONS_MENU_ADD, 0, R.string.user_dict_settings_add_menu_title) 171afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project .setIcon(R.drawable.ic_menu_add); 17202cf71a5916d1b0155e8fff3f62987cdc5c2b7c3Amith Yamasani actionItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); 173afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 174afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 175afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 176afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public boolean onOptionsItemSelected(MenuItem item) { 177afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project showAddOrEditDialog(null); 178afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project return true; 179afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 180afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 181afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private void showAddOrEditDialog(String editingWord) { 182afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mDialogEditingWord = editingWord; 183afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project showDialog(DIALOG_ADD_OR_EDIT); 184afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 185f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa 186afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private String getWord(int position) { 187afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mCursor.moveToPosition(position); 188e33813932474f760073f92bdb7bbf93d1b923d70Amith Yamasani // Handle a possible race-condition 189e33813932474f760073f92bdb7bbf93d1b923d70Amith Yamasani if (mCursor.isAfterLast()) return null; 190e33813932474f760073f92bdb7bbf93d1b923d70Amith Yamasani 191afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project return mCursor.getString( 192afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mCursor.getColumnIndexOrThrow(UserDictionary.Words.WORD)); 193afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 194985f5efc8278e1a5c2170c3aba354a4c9367b741Amith Yamasani 195afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 196f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa public Dialog onCreateDialog(int id) { 197f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa final Activity activity = getActivity(); 198e98256646c0c1a8d79af5d23bf5330daafb5cf14Amith Yamasani final AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(activity); 199e98256646c0c1a8d79af5d23bf5330daafb5cf14Amith Yamasani final LayoutInflater inflater = LayoutInflater.from(dialogBuilder.getContext()); 200e98256646c0c1a8d79af5d23bf5330daafb5cf14Amith Yamasani final View content = inflater.inflate(R.layout.dialog_edittext, null); 201afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project final EditText editText = (EditText) content.findViewById(R.id.edittext); 202f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa editText.setText(mDialogEditingWord); 203afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // No prediction in soft keyboard mode. TODO: Create a better way to disable prediction 204afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project editText.setInputType(InputType.TYPE_CLASS_TEXT 205afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project | InputType.TYPE_TEXT_FLAG_AUTO_COMPLETE); 206f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa 207e98256646c0c1a8d79af5d23bf5330daafb5cf14Amith Yamasani AlertDialog dialog = dialogBuilder 20886997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project .setTitle(mDialogEditingWord != null 20986997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project ? R.string.user_dict_settings_edit_dialog_title 21086997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project : R.string.user_dict_settings_add_dialog_title) 211afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project .setView(content) 212afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { 213afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public void onClick(DialogInterface dialog, int which) { 214afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project onAddOrEditFinished(editText.getText().toString()); 215f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa if (mAutoReturn) activity.onBackPressed(); 216afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project }}) 217afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project .setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() { 218afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public void onClick(DialogInterface dialog, int which) { 219f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa if (mAutoReturn) activity.onBackPressed(); 220afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project }}) 221afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project .create(); 222985f5efc8278e1a5c2170c3aba354a4c9367b741Amith Yamasani dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE | 223985f5efc8278e1a5c2170c3aba354a4c9367b741Amith Yamasani WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE); 224985f5efc8278e1a5c2170c3aba354a4c9367b741Amith Yamasani return dialog; 225afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 226985f5efc8278e1a5c2170c3aba354a4c9367b741Amith Yamasani 227f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa private void showDialog(int dialogId) { 228f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa if (mDialogFragment != null) { 229f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa Log.e(TAG, "Old dialog fragment not null!"); 230f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa } 231f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa mDialogFragment = new SettingsDialogFragment(this, dialogId); 232f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa mDialogFragment.show(getActivity().getFragmentManager(), Integer.toString(dialogId)); 233afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 234afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 235afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private void onAddOrEditFinished(String word) { 236afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if (mDialogEditingWord != null) { 237afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // The user was editing a word, so do a delete/add 238afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project deleteWord(mDialogEditingWord); 239afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 240afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 241afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Disallow duplicates 242afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project deleteWord(word); 243afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 244afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // TODO: present UI for picking whether to add word to all locales, or current. 245f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa UserDictionary.Words.addWord(getActivity(), word.toString(), 246afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 250, UserDictionary.Words.LOCALE_TYPE_ALL); 247d334d52c47d860bb6f0c44e8c16e22199f5a62c6Vasu Nori if (!mCursor.requery()) { 248d334d52c47d860bb6f0c44e8c16e22199f5a62c6Vasu Nori throw new IllegalStateException("can't requery on already-closed cursor."); 249d334d52c47d860bb6f0c44e8c16e22199f5a62c6Vasu Nori } 250afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mAddedWordAlready = true; 251afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 252afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 253afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private void deleteWord(String word) { 254f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa getActivity().getContentResolver().delete( 255f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa UserDictionary.Words.CONTENT_URI, DELETE_SELECTION, new String[] { word }); 256afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 257f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa 258e2ac72b4bc1c3dcb1540624c40ab17dfbf78a6eeAmith Yamasani private static class MyAdapter extends SimpleCursorAdapter implements SectionIndexer, 259e2ac72b4bc1c3dcb1540624c40ab17dfbf78a6eeAmith Yamasani View.OnClickListener { 260e2ac72b4bc1c3dcb1540624c40ab17dfbf78a6eeAmith Yamasani 261e2ac72b4bc1c3dcb1540624c40ab17dfbf78a6eeAmith Yamasani private AlphabetIndexer mIndexer; 262e2ac72b4bc1c3dcb1540624c40ab17dfbf78a6eeAmith Yamasani private UserDictionarySettings mSettings; 263e2ac72b4bc1c3dcb1540624c40ab17dfbf78a6eeAmith Yamasani 264e2ac72b4bc1c3dcb1540624c40ab17dfbf78a6eeAmith Yamasani private ViewBinder mViewBinder = new ViewBinder() { 265e2ac72b4bc1c3dcb1540624c40ab17dfbf78a6eeAmith Yamasani 266e2ac72b4bc1c3dcb1540624c40ab17dfbf78a6eeAmith Yamasani public boolean setViewValue(View v, Cursor c, int columnIndex) { 267e2ac72b4bc1c3dcb1540624c40ab17dfbf78a6eeAmith Yamasani if (v instanceof ImageView && columnIndex == INDEX_ID) { 268e2ac72b4bc1c3dcb1540624c40ab17dfbf78a6eeAmith Yamasani v.setOnClickListener(MyAdapter.this); 269e2ac72b4bc1c3dcb1540624c40ab17dfbf78a6eeAmith Yamasani v.setTag(c.getString(INDEX_WORD)); 270e2ac72b4bc1c3dcb1540624c40ab17dfbf78a6eeAmith Yamasani return true; 271e2ac72b4bc1c3dcb1540624c40ab17dfbf78a6eeAmith Yamasani } 272e2ac72b4bc1c3dcb1540624c40ab17dfbf78a6eeAmith Yamasani 273e2ac72b4bc1c3dcb1540624c40ab17dfbf78a6eeAmith Yamasani return false; 274e2ac72b4bc1c3dcb1540624c40ab17dfbf78a6eeAmith Yamasani } 275e2ac72b4bc1c3dcb1540624c40ab17dfbf78a6eeAmith Yamasani }; 276e2ac72b4bc1c3dcb1540624c40ab17dfbf78a6eeAmith Yamasani 277e2ac72b4bc1c3dcb1540624c40ab17dfbf78a6eeAmith Yamasani public MyAdapter(Context context, int layout, Cursor c, String[] from, int[] to, 278e2ac72b4bc1c3dcb1540624c40ab17dfbf78a6eeAmith Yamasani UserDictionarySettings settings) { 279afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project super(context, layout, c, from, to); 280afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 281e2ac72b4bc1c3dcb1540624c40ab17dfbf78a6eeAmith Yamasani mSettings = settings; 282afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project int wordColIndex = c.getColumnIndexOrThrow(UserDictionary.Words.WORD); 283e2ac72b4bc1c3dcb1540624c40ab17dfbf78a6eeAmith Yamasani String alphabet = context.getString( 284e2ac72b4bc1c3dcb1540624c40ab17dfbf78a6eeAmith Yamasani com.android.internal.R.string.fast_scroll_alphabet); 285e2ac72b4bc1c3dcb1540624c40ab17dfbf78a6eeAmith Yamasani mIndexer = new AlphabetIndexer(c, wordColIndex, alphabet); 286e2ac72b4bc1c3dcb1540624c40ab17dfbf78a6eeAmith Yamasani setViewBinder(mViewBinder); 287afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 288afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 289afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public int getPositionForSection(int section) { 290afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project return mIndexer.getPositionForSection(section); 291afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 292afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 293afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public int getSectionForPosition(int position) { 294afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project return mIndexer.getSectionForPosition(position); 295afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 296afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 297afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public Object[] getSections() { 298afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project return mIndexer.getSections(); 299afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 300e2ac72b4bc1c3dcb1540624c40ab17dfbf78a6eeAmith Yamasani 301e2ac72b4bc1c3dcb1540624c40ab17dfbf78a6eeAmith Yamasani public void onClick(View v) { 302e2ac72b4bc1c3dcb1540624c40ab17dfbf78a6eeAmith Yamasani mSettings.deleteWord((String) v.getTag()); 303e2ac72b4bc1c3dcb1540624c40ab17dfbf78a6eeAmith Yamasani } 304afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 305afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project} 306