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