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