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;
236b8e6585c672dfee5b69d3b5b2f1c030acf95a22Jean Chalardimport android.content.ContentResolver;
24afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.Context;
25afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.DialogInterface;
26f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawaimport android.content.Intent;
27afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.database.Cursor;
28afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.Bundle;
29afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.provider.UserDictionary;
30afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.text.InputType;
3199e509cc4c2057dcfba1745ae7584fc1f4047acaJean Chalardimport android.text.TextUtils;
32f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawaimport android.util.Log;
33f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawaimport android.view.LayoutInflater;
34afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.Menu;
35f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawaimport android.view.MenuInflater;
36afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.MenuItem;
37afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.View;
38f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawaimport android.view.ViewGroup;
39985f5efc8278e1a5c2170c3aba354a4c9367b741Amith Yamasaniimport android.view.WindowManager;
40afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.AlphabetIndexer;
41afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.EditText;
42e2ac72b4bc1c3dcb1540624c40ab17dfbf78a6eeAmith Yamasaniimport android.widget.ImageView;
43afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.ListAdapter;
44afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.ListView;
45afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.SectionIndexer;
46afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.SimpleCursorAdapter;
47afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.TextView;
48e98256646c0c1a8d79af5d23bf5330daafb5cf14Amith Yamasani
49be3f0faf526d628b578b1af6d975c19cfdf8637bJean Chalardimport com.android.settings.inputmethod.UserDictionaryAddWordContents;
50afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
51afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.util.Locale;
52afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
536b8e6585c672dfee5b69d3b5b2f1c030acf95a22Jean Chalardpublic class UserDictionarySettings extends ListFragment {
54f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa    private static final String TAG = "UserDictionarySettings";
55afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
56afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final String[] QUERY_PROJECTION = {
5799e509cc4c2057dcfba1745ae7584fc1f4047acaJean Chalard        UserDictionary.Words._ID, UserDictionary.Words.WORD, UserDictionary.Words.SHORTCUT
58afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    };
59e2ac72b4bc1c3dcb1540624c40ab17dfbf78a6eeAmith Yamasani
6099e509cc4c2057dcfba1745ae7584fc1f4047acaJean Chalard    // The index of the shortcut in the above array.
6199e509cc4c2057dcfba1745ae7584fc1f4047acaJean Chalard    private static final int INDEX_SHORTCUT = 2;
62e2ac72b4bc1c3dcb1540624c40ab17dfbf78a6eeAmith Yamasani
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
6571ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard    private static final String QUERY_SELECTION =
6671ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard            UserDictionary.Words.LOCALE + "=?";
6771ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard    private static final String QUERY_SELECTION_ALL_LOCALES =
6871ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard            UserDictionary.Words.LOCALE + " is null";
69afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
70657beac9bb27d8c40b5193ecd49ec2c8d46f72bbJean Chalard    private static final String DELETE_SELECTION_WITH_SHORTCUT = UserDictionary.Words.WORD
71657beac9bb27d8c40b5193ecd49ec2c8d46f72bbJean Chalard            + "=? AND " + UserDictionary.Words.SHORTCUT + "=?";
72657beac9bb27d8c40b5193ecd49ec2c8d46f72bbJean Chalard    private static final String DELETE_SELECTION_WITHOUT_SHORTCUT = UserDictionary.Words.WORD
73657beac9bb27d8c40b5193ecd49ec2c8d46f72bbJean Chalard            + "=? AND " + UserDictionary.Words.SHORTCUT + " is null OR "
74657beac9bb27d8c40b5193ecd49ec2c8d46f72bbJean Chalard            + UserDictionary.Words.SHORTCUT + "=''";
75afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
76afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final int OPTIONS_MENU_ADD = Menu.FIRST;
77afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
78afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private Cursor mCursor;
7971ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard
8071ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard    protected String mLocale;
8171ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard
82afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
83f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa    public void onCreate(Bundle savedInstanceState) {
84afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        super.onCreate(savedInstanceState);
85f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa    }
86f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa
87f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa    @Override
88b654cbb896a6e6db9ecec164476b0ac4a3e72774Jeff Sharkey    public View onCreateView(
89b654cbb896a6e6db9ecec164476b0ac4a3e72774Jeff Sharkey            LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
90b654cbb896a6e6db9ecec164476b0ac4a3e72774Jeff Sharkey        return inflater.inflate(
91b654cbb896a6e6db9ecec164476b0ac4a3e72774Jeff Sharkey                com.android.internal.R.layout.preference_list_fragment, container, false);
92b654cbb896a6e6db9ecec164476b0ac4a3e72774Jeff Sharkey    }
93b654cbb896a6e6db9ecec164476b0ac4a3e72774Jeff Sharkey
94b654cbb896a6e6db9ecec164476b0ac4a3e72774Jeff Sharkey    @Override
95f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa    public void onActivityCreated(Bundle savedInstanceState) {
96f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa        super.onActivityCreated(savedInstanceState);
97afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
98c087e35d7f9a968ea035e931aa318cf36a3e1b90Jean Chalard        final Intent intent = getActivity().getIntent();
9971ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard        final String localeFromIntent =
10071ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard                null == intent ? null : intent.getStringExtra("locale");
10171ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard
10271ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard        final Bundle arguments = getArguments();
10371ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard        final String localeFromArguments =
10471ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard                null == arguments ? null : arguments.getString("locale");
10571ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard
10671ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard        final String locale;
10771ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard        if (null != localeFromArguments) {
10871ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard            locale = localeFromArguments;
10971ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard        } else if (null != localeFromIntent) {
11071ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard            locale = localeFromIntent;
11171ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard        } else {
11271ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard            locale = null;
11371ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard        }
114c087e35d7f9a968ea035e931aa318cf36a3e1b90Jean Chalard
11571ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard        mLocale = locale;
11671ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard        mCursor = createCursor(locale);
117dcf8ba9eb233b4dadd1e198b7ec6ba413c6583c1Jeff Sharkey        TextView emptyView = (TextView) getView().findViewById(android.R.id.empty);
118afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        emptyView.setText(R.string.user_dict_settings_empty_text);
119f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa
120f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa        final ListView listView = getListView();
121f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa        listView.setAdapter(createAdapter());
122afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        listView.setFastScrollEnabled(true);
123afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        listView.setEmptyView(emptyView);
124afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
125f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa        setHasOptionsMenu(true);
126f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa
127afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
128afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
129c087e35d7f9a968ea035e931aa318cf36a3e1b90Jean Chalard    private Cursor createCursor(final String locale) {
13071ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard        // Locale can be any of:
13171ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard        // - The string representation of a locale, as returned by Locale#toString()
13271ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard        // - The empty string. This means we want a cursor returning words valid for all locales.
13371ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard        // - null. This means we want a cursor for the current locale, whatever this is.
13471ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard        // Note that this contrasts with the data inside the database, where NULL means "all
13571ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard        // locales" and there should never be an empty string. The confusion is called by the
13671ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard        // historical use of null for "all locales".
13771ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard        // TODO: it should be easy to make this more readable by making the special values
13871ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard        // human-readable, like "all_locales" and "current_locales" strings, provided they
13971ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard        // can be guaranteed not to match locales that may exist.
14071ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard        if ("".equals(locale)) {
14171ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard            // Case-insensitive sort
14271ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard            return getActivity().managedQuery(UserDictionary.Words.CONTENT_URI, QUERY_PROJECTION,
14371ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard                    QUERY_SELECTION_ALL_LOCALES, null,
14471ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard                    "UPPER(" + UserDictionary.Words.WORD + ")");
14571ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard        } else {
14671ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard            final String queryLocale = null != locale ? locale : Locale.getDefault().toString();
14771ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard            return getActivity().managedQuery(UserDictionary.Words.CONTENT_URI, QUERY_PROJECTION,
14871ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard                    QUERY_SELECTION, new String[] { queryLocale },
14971ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard                    "UPPER(" + UserDictionary.Words.WORD + ")");
15071ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard        }
151afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
152afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
153afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private ListAdapter createAdapter() {
154f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa        return new MyAdapter(getActivity(),
155e2ac72b4bc1c3dcb1540624c40ab17dfbf78a6eeAmith Yamasani                R.layout.user_dictionary_item, mCursor,
15699e509cc4c2057dcfba1745ae7584fc1f4047acaJean Chalard                new String[] { UserDictionary.Words.WORD, UserDictionary.Words.SHORTCUT },
15799e509cc4c2057dcfba1745ae7584fc1f4047acaJean Chalard                new int[] { android.R.id.text1, android.R.id.text2 }, this);
158afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
15971ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard
160afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
161f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa    public void onListItemClick(ListView l, View v, int position, long id) {
1621571c0a377f4aa94ef424da326a52fad638b3e54Jean Chalard        final String word = getWord(position);
1631571c0a377f4aa94ef424da326a52fad638b3e54Jean Chalard        final String shortcut = getShortcut(position);
164e98256646c0c1a8d79af5d23bf5330daafb5cf14Amith Yamasani        if (word != null) {
1651571c0a377f4aa94ef424da326a52fad638b3e54Jean Chalard            showAddOrEditDialog(word, shortcut);
166afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
167afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
168afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
169afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
170f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
17102cf71a5916d1b0155e8fff3f62987cdc5c2b7c3Amith Yamasani        MenuItem actionItem =
17202cf71a5916d1b0155e8fff3f62987cdc5c2b7c3Amith Yamasani                menu.add(0, OPTIONS_MENU_ADD, 0, R.string.user_dict_settings_add_menu_title)
173afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                .setIcon(R.drawable.ic_menu_add);
174162e541011e6ca716bf4af191dee419c1a712d0eGilles Debunne        actionItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM |
175162e541011e6ca716bf4af191dee419c1a712d0eGilles Debunne                MenuItem.SHOW_AS_ACTION_WITH_TEXT);
176afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
177afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
178afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
179afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    public boolean onOptionsItemSelected(MenuItem item) {
180432fafe200a84ac519b1f23484cab55007baa62aAmith Yamasani        if (item.getItemId() == OPTIONS_MENU_ADD) {
1811571c0a377f4aa94ef424da326a52fad638b3e54Jean Chalard            showAddOrEditDialog(null, null);
182432fafe200a84ac519b1f23484cab55007baa62aAmith Yamasani            return true;
183432fafe200a84ac519b1f23484cab55007baa62aAmith Yamasani        }
184432fafe200a84ac519b1f23484cab55007baa62aAmith Yamasani        return false;
185afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
186afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
1876b8e6585c672dfee5b69d3b5b2f1c030acf95a22Jean Chalard    /**
1886b8e6585c672dfee5b69d3b5b2f1c030acf95a22Jean Chalard     * Add or edit a word. If editingWord is null, it's an add; otherwise, it's an edit.
1896b8e6585c672dfee5b69d3b5b2f1c030acf95a22Jean Chalard     * @param editingWord the word to edit, or null if it's an add.
1901571c0a377f4aa94ef424da326a52fad638b3e54Jean Chalard     * @param editingShortcut the shortcut for this entry, or null if none.
1916b8e6585c672dfee5b69d3b5b2f1c030acf95a22Jean Chalard     */
1921571c0a377f4aa94ef424da326a52fad638b3e54Jean Chalard    private void showAddOrEditDialog(final String editingWord, final String editingShortcut) {
193be07e49a9292b653b923cbfa64dc5c42972ded41Jean Chalard        final Bundle args = new Bundle();
194be3f0faf526d628b578b1af6d975c19cfdf8637bJean Chalard        args.putInt(UserDictionaryAddWordContents.EXTRA_MODE, null == editingWord
195be3f0faf526d628b578b1af6d975c19cfdf8637bJean Chalard                ? UserDictionaryAddWordContents.MODE_INSERT
196be3f0faf526d628b578b1af6d975c19cfdf8637bJean Chalard                : UserDictionaryAddWordContents.MODE_EDIT);
197be3f0faf526d628b578b1af6d975c19cfdf8637bJean Chalard        args.putString(UserDictionaryAddWordContents.EXTRA_WORD, editingWord);
1981571c0a377f4aa94ef424da326a52fad638b3e54Jean Chalard        args.putString(UserDictionaryAddWordContents.EXTRA_SHORTCUT, editingShortcut);
199be3f0faf526d628b578b1af6d975c19cfdf8637bJean Chalard        args.putString(UserDictionaryAddWordContents.EXTRA_LOCALE, mLocale);
200be07e49a9292b653b923cbfa64dc5c42972ded41Jean Chalard        android.preference.PreferenceActivity pa =
201be07e49a9292b653b923cbfa64dc5c42972ded41Jean Chalard                (android.preference.PreferenceActivity)getActivity();
202be07e49a9292b653b923cbfa64dc5c42972ded41Jean Chalard        pa.startPreferencePanel(
203be07e49a9292b653b923cbfa64dc5c42972ded41Jean Chalard                com.android.settings.inputmethod.UserDictionaryAddWordFragment.class.getName(),
2047dabe4583c2bb12ed1d072139399f6bca8067994Jean Chalard                args, R.string.user_dict_settings_add_dialog_title, null, null, 0);
205afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
206f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa
2071571c0a377f4aa94ef424da326a52fad638b3e54Jean Chalard    private String getWord(final int position) {
208ea41e087f98ebc226410e3621b9bca91c1688e0aJean Chalard        if (null == mCursor) return null;
209afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mCursor.moveToPosition(position);
210e33813932474f760073f92bdb7bbf93d1b923d70Amith Yamasani        // Handle a possible race-condition
211e33813932474f760073f92bdb7bbf93d1b923d70Amith Yamasani        if (mCursor.isAfterLast()) return null;
212e33813932474f760073f92bdb7bbf93d1b923d70Amith Yamasani
213afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        return mCursor.getString(
214afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                mCursor.getColumnIndexOrThrow(UserDictionary.Words.WORD));
215afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
2161571c0a377f4aa94ef424da326a52fad638b3e54Jean Chalard
2171571c0a377f4aa94ef424da326a52fad638b3e54Jean Chalard    private String getShortcut(final int position) {
2181571c0a377f4aa94ef424da326a52fad638b3e54Jean Chalard        if (null == mCursor) return null;
2191571c0a377f4aa94ef424da326a52fad638b3e54Jean Chalard        mCursor.moveToPosition(position);
2201571c0a377f4aa94ef424da326a52fad638b3e54Jean Chalard        // Handle a possible race-condition
2211571c0a377f4aa94ef424da326a52fad638b3e54Jean Chalard        if (mCursor.isAfterLast()) return null;
2221571c0a377f4aa94ef424da326a52fad638b3e54Jean Chalard
2231571c0a377f4aa94ef424da326a52fad638b3e54Jean Chalard        return mCursor.getString(
2241571c0a377f4aa94ef424da326a52fad638b3e54Jean Chalard                mCursor.getColumnIndexOrThrow(UserDictionary.Words.SHORTCUT));
2251571c0a377f4aa94ef424da326a52fad638b3e54Jean Chalard    }
226985f5efc8278e1a5c2170c3aba354a4c9367b741Amith Yamasani
227657beac9bb27d8c40b5193ecd49ec2c8d46f72bbJean Chalard    public static void deleteWord(final String word, final String shortcut,
228657beac9bb27d8c40b5193ecd49ec2c8d46f72bbJean Chalard            final ContentResolver resolver) {
229657beac9bb27d8c40b5193ecd49ec2c8d46f72bbJean Chalard        if (TextUtils.isEmpty(shortcut)) {
230657beac9bb27d8c40b5193ecd49ec2c8d46f72bbJean Chalard            resolver.delete(
231657beac9bb27d8c40b5193ecd49ec2c8d46f72bbJean Chalard                    UserDictionary.Words.CONTENT_URI, DELETE_SELECTION_WITHOUT_SHORTCUT,
232657beac9bb27d8c40b5193ecd49ec2c8d46f72bbJean Chalard                    new String[] { word });
233657beac9bb27d8c40b5193ecd49ec2c8d46f72bbJean Chalard        } else {
234657beac9bb27d8c40b5193ecd49ec2c8d46f72bbJean Chalard            resolver.delete(
235657beac9bb27d8c40b5193ecd49ec2c8d46f72bbJean Chalard                    UserDictionary.Words.CONTENT_URI, DELETE_SELECTION_WITH_SHORTCUT,
236657beac9bb27d8c40b5193ecd49ec2c8d46f72bbJean Chalard                    new String[] { word, shortcut });
237657beac9bb27d8c40b5193ecd49ec2c8d46f72bbJean Chalard        }
238afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
239f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa
24099e509cc4c2057dcfba1745ae7584fc1f4047acaJean Chalard    private static class MyAdapter extends SimpleCursorAdapter implements SectionIndexer {
241e2ac72b4bc1c3dcb1540624c40ab17dfbf78a6eeAmith Yamasani
242e2ac72b4bc1c3dcb1540624c40ab17dfbf78a6eeAmith Yamasani        private AlphabetIndexer mIndexer;
243e2ac72b4bc1c3dcb1540624c40ab17dfbf78a6eeAmith Yamasani
244e2ac72b4bc1c3dcb1540624c40ab17dfbf78a6eeAmith Yamasani        private ViewBinder mViewBinder = new ViewBinder() {
245e2ac72b4bc1c3dcb1540624c40ab17dfbf78a6eeAmith Yamasani
246e2ac72b4bc1c3dcb1540624c40ab17dfbf78a6eeAmith Yamasani            public boolean setViewValue(View v, Cursor c, int columnIndex) {
24799e509cc4c2057dcfba1745ae7584fc1f4047acaJean Chalard                if (columnIndex == INDEX_SHORTCUT) {
24899e509cc4c2057dcfba1745ae7584fc1f4047acaJean Chalard                    final String shortcut = c.getString(INDEX_SHORTCUT);
24999e509cc4c2057dcfba1745ae7584fc1f4047acaJean Chalard                    if (TextUtils.isEmpty(shortcut)) {
25099e509cc4c2057dcfba1745ae7584fc1f4047acaJean Chalard                        v.setVisibility(View.GONE);
25199e509cc4c2057dcfba1745ae7584fc1f4047acaJean Chalard                    } else {
25299e509cc4c2057dcfba1745ae7584fc1f4047acaJean Chalard                        ((TextView)v).setText(shortcut);
25399e509cc4c2057dcfba1745ae7584fc1f4047acaJean Chalard                        v.setVisibility(View.VISIBLE);
25499e509cc4c2057dcfba1745ae7584fc1f4047acaJean Chalard                    }
25599e509cc4c2057dcfba1745ae7584fc1f4047acaJean Chalard                    v.invalidate();
256e2ac72b4bc1c3dcb1540624c40ab17dfbf78a6eeAmith Yamasani                    return true;
257e2ac72b4bc1c3dcb1540624c40ab17dfbf78a6eeAmith Yamasani                }
258e2ac72b4bc1c3dcb1540624c40ab17dfbf78a6eeAmith Yamasani
259e2ac72b4bc1c3dcb1540624c40ab17dfbf78a6eeAmith Yamasani                return false;
260e2ac72b4bc1c3dcb1540624c40ab17dfbf78a6eeAmith Yamasani            }
261e2ac72b4bc1c3dcb1540624c40ab17dfbf78a6eeAmith Yamasani        };
262e2ac72b4bc1c3dcb1540624c40ab17dfbf78a6eeAmith Yamasani
263e2ac72b4bc1c3dcb1540624c40ab17dfbf78a6eeAmith Yamasani        public MyAdapter(Context context, int layout, Cursor c, String[] from, int[] to,
264e2ac72b4bc1c3dcb1540624c40ab17dfbf78a6eeAmith Yamasani                UserDictionarySettings settings) {
265afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            super(context, layout, c, from, to);
266afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
267ea41e087f98ebc226410e3621b9bca91c1688e0aJean Chalard            if (null != c) {
268ea41e087f98ebc226410e3621b9bca91c1688e0aJean Chalard                final String alphabet = context.getString(
269ea41e087f98ebc226410e3621b9bca91c1688e0aJean Chalard                        com.android.internal.R.string.fast_scroll_alphabet);
270ea41e087f98ebc226410e3621b9bca91c1688e0aJean Chalard                final int wordColIndex = c.getColumnIndexOrThrow(UserDictionary.Words.WORD);
271ea41e087f98ebc226410e3621b9bca91c1688e0aJean Chalard                mIndexer = new AlphabetIndexer(c, wordColIndex, alphabet);
272ea41e087f98ebc226410e3621b9bca91c1688e0aJean Chalard            }
273e2ac72b4bc1c3dcb1540624c40ab17dfbf78a6eeAmith Yamasani            setViewBinder(mViewBinder);
274afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
275afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
276afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        public int getPositionForSection(int section) {
277ea41e087f98ebc226410e3621b9bca91c1688e0aJean Chalard            return null == mIndexer ? 0 : mIndexer.getPositionForSection(section);
278afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
279afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
280afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        public int getSectionForPosition(int position) {
281ea41e087f98ebc226410e3621b9bca91c1688e0aJean Chalard            return null == mIndexer ? 0 : mIndexer.getSectionForPosition(position);
282afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
283afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
284afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        public Object[] getSections() {
285ea41e087f98ebc226410e3621b9bca91c1688e0aJean Chalard            return null == mIndexer ? null : mIndexer.getSections();
286afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
287afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
288afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project}
289