aboutsummaryrefslogtreecommitdiffstats
path: root/java/src/com/android/inputmethod/latin/userdictionary/UserDictionarySettings.java
diff options
context:
space:
mode:
authorJatin Matani <jatinm@google.com>2015-07-01 13:54:44 -0700
committerJatin Matani <jatinm@google.com>2015-07-06 17:32:13 -0700
commit8c2591eec80dbe44158b1613cd96056057a41139 (patch)
tree431b6133b34e992d82cc44eb7701ca35221fc9e6 /java/src/com/android/inputmethod/latin/userdictionary/UserDictionarySettings.java
parentd23dd5978d60322613c0148556032cbce37e81b7 (diff)
downloadlatinime-8c2591eec80dbe44158b1613cd96056057a41139.tar.gz
latinime-8c2591eec80dbe44158b1613cd96056057a41139.tar.xz
latinime-8c2591eec80dbe44158b1613cd96056057a41139.zip
Bring back shortcuts and add to dictionary UI
For JB and lower devices, the UI is surfaced by the IME. Bug: 22200135 Change-Id: Icca08500ee0683e2ceb5357b0bc430cd1712220e
Diffstat (limited to 'java/src/com/android/inputmethod/latin/userdictionary/UserDictionarySettings.java')
-rw-r--r--java/src/com/android/inputmethod/latin/userdictionary/UserDictionarySettings.java194
1 files changed, 148 insertions, 46 deletions
diff --git a/java/src/com/android/inputmethod/latin/userdictionary/UserDictionarySettings.java b/java/src/com/android/inputmethod/latin/userdictionary/UserDictionarySettings.java
index bd3572340..d9339d965 100644
--- a/java/src/com/android/inputmethod/latin/userdictionary/UserDictionarySettings.java
+++ b/java/src/com/android/inputmethod/latin/userdictionary/UserDictionarySettings.java
@@ -16,12 +16,6 @@
package com.android.inputmethod.latin.userdictionary;
-import static com.android.inputmethod.latin.userdictionary.UserDictionaryAddWordContents.EXTRA_LOCALE;
-import static com.android.inputmethod.latin.userdictionary.UserDictionaryAddWordContents.EXTRA_MODE;
-import static com.android.inputmethod.latin.userdictionary.UserDictionaryAddWordContents.EXTRA_WORD;
-import static com.android.inputmethod.latin.userdictionary.UserDictionaryAddWordContents.MODE_EDIT;
-import static com.android.inputmethod.latin.userdictionary.UserDictionaryAddWordContents.MODE_INSERT;
-
import com.android.inputmethod.latin.R;
import android.app.ListFragment;
@@ -31,7 +25,7 @@ import android.content.Intent;
import android.database.Cursor;
import android.os.Build;
import android.os.Bundle;
-import android.provider.UserDictionary.Words;
+import android.provider.UserDictionary;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.Menu;
@@ -54,8 +48,62 @@ import java.util.Locale;
public class UserDictionarySettings extends ListFragment {
+ public static final boolean IS_SHORTCUT_API_SUPPORTED =
+ Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN;
+
+ private static final String[] QUERY_PROJECTION_SHORTCUT_UNSUPPORTED =
+ { UserDictionary.Words._ID, UserDictionary.Words.WORD};
+ private static final String[] QUERY_PROJECTION_SHORTCUT_SUPPORTED =
+ { UserDictionary.Words._ID, UserDictionary.Words.WORD, UserDictionary.Words.SHORTCUT};
+ private static final String[] QUERY_PROJECTION =
+ IS_SHORTCUT_API_SUPPORTED ?
+ QUERY_PROJECTION_SHORTCUT_SUPPORTED : QUERY_PROJECTION_SHORTCUT_UNSUPPORTED;
+
+ // The index of the shortcut in the above array.
+ private static final int INDEX_SHORTCUT = 2;
+
+ private static final String[] ADAPTER_FROM_SHORTCUT_UNSUPPORTED = {
+ UserDictionary.Words.WORD,
+ };
+
+ private static final String[] ADAPTER_FROM_SHORTCUT_SUPPORTED = {
+ UserDictionary.Words.WORD, UserDictionary.Words.SHORTCUT
+ };
+
+ private static final String[] ADAPTER_FROM = IS_SHORTCUT_API_SUPPORTED ?
+ ADAPTER_FROM_SHORTCUT_SUPPORTED : ADAPTER_FROM_SHORTCUT_UNSUPPORTED;
+
+ private static final int[] ADAPTER_TO_SHORTCUT_UNSUPPORTED = {
+ android.R.id.text1,
+ };
+
+ private static final int[] ADAPTER_TO_SHORTCUT_SUPPORTED = {
+ android.R.id.text1, android.R.id.text2
+ };
+
+ private static final int[] ADAPTER_TO = IS_SHORTCUT_API_SUPPORTED ?
+ ADAPTER_TO_SHORTCUT_SUPPORTED : ADAPTER_TO_SHORTCUT_UNSUPPORTED;
+
+ // Either the locale is empty (means the word is applicable to all locales)
+ // or the word equals our current locale
+ private static final String QUERY_SELECTION =
+ UserDictionary.Words.LOCALE + "=?";
+ private static final String QUERY_SELECTION_ALL_LOCALES =
+ UserDictionary.Words.LOCALE + " is null";
+
+ private static final String DELETE_SELECTION_WITH_SHORTCUT = UserDictionary.Words.WORD
+ + "=? AND " + UserDictionary.Words.SHORTCUT + "=?";
+ private static final String DELETE_SELECTION_WITHOUT_SHORTCUT = UserDictionary.Words.WORD
+ + "=? AND " + UserDictionary.Words.SHORTCUT + " is null OR "
+ + UserDictionary.Words.SHORTCUT + "=''";
+ private static final String DELETE_SELECTION_SHORTCUT_UNSUPPORTED =
+ UserDictionary.Words.WORD + "=?";
+
+ private static final int OPTIONS_MENU_ADD = Menu.FIRST;
+
private Cursor mCursor;
- private String mLocale;
+
+ protected String mLocale;
@Override
public void onCreate(Bundle savedInstanceState) {
@@ -112,6 +160,19 @@ public class UserDictionarySettings extends ListFragment {
UserDictionarySettingsUtils.getLocaleDisplayName(getActivity(), mLocale));
}
+ @Override
+ public void onResume() {
+ super.onResume();
+ ListAdapter adapter = getListView().getAdapter();
+ if (adapter != null && adapter instanceof MyAdapter) {
+ // The list view is forced refreshed here. This allows the changes done
+ // in UserDictionaryAddWordFragment (update/delete/insert) to be seen when
+ // user goes back to this view.
+ MyAdapter listAdapter = (MyAdapter) adapter;
+ listAdapter.notifyDataSetChanged();
+ }
+ }
+
@SuppressWarnings("deprecation")
private Cursor createCursor(final String locale) {
// Locale can be any of:
@@ -124,60 +185,54 @@ public class UserDictionarySettings extends ListFragment {
// TODO: it should be easy to make this more readable by making the special values
// human-readable, like "all_locales" and "current_locales" strings, provided they
// can be guaranteed not to match locales that may exist.
- if (TextUtils.isEmpty(locale)) {
+ if ("".equals(locale)) {
// Case-insensitive sort
- return getActivity().managedQuery(
- Words.CONTENT_URI,
- new String[] { Words._ID, Words.WORD },
- Words.LOCALE + " is null",
- null,
- "UPPER(" + Words.WORD + ")");
+ return getActivity().managedQuery(UserDictionary.Words.CONTENT_URI, QUERY_PROJECTION,
+ QUERY_SELECTION_ALL_LOCALES, null,
+ "UPPER(" + UserDictionary.Words.WORD + ")");
}
- return getActivity().managedQuery(
- Words.CONTENT_URI,
- new String[] { Words._ID, Words.WORD },
- Words.LOCALE + "=?",
- new String[] { locale },
- "UPPER(" + Words.WORD + ")");
+ final String queryLocale = null != locale ? locale : Locale.getDefault().toString();
+ return getActivity().managedQuery(UserDictionary.Words.CONTENT_URI, QUERY_PROJECTION,
+ QUERY_SELECTION, new String[] { queryLocale },
+ "UPPER(" + UserDictionary.Words.WORD + ")");
}
private ListAdapter createAdapter() {
- return new MyAdapter(
- getActivity(),
- R.layout.user_dictionary_item,
- mCursor,
- new String[] { Words.WORD },
- new int[] { android.R.id.text1 });
+ return new MyAdapter(getActivity(), R.layout.user_dictionary_item, mCursor,
+ ADAPTER_FROM, ADAPTER_TO);
}
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
final String word = getWord(position);
+ final String shortcut = getShortcut(position);
if (word != null) {
- showAddOrEditDialog(word);
+ showAddOrEditDialog(word, shortcut);
}
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
- if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
+ if (!UserDictionarySettings.IS_SHORTCUT_API_SUPPORTED) {
final Locale systemLocale = getResources().getConfiguration().locale;
if (!TextUtils.isEmpty(mLocale) && !mLocale.equals(systemLocale.toString())) {
// Hide the add button for ICS because it doesn't support specifying a locale
- // for an entry.
+ // for an entry. This new "locale"-aware API has been added in conjunction
+ // with the shortcut API.
return;
}
}
- menu.add(0, Menu.FIRST, 0, R.string.user_dict_settings_add_menu_title)
- .setIcon(R.drawable.ic_menu_add)
- .setShowAsAction(
- MenuItem.SHOW_AS_ACTION_IF_ROOM | MenuItem.SHOW_AS_ACTION_WITH_TEXT);
+ MenuItem actionItem =
+ menu.add(0, OPTIONS_MENU_ADD, 0, R.string.user_dict_settings_add_menu_title)
+ .setIcon(R.drawable.ic_menu_add);
+ actionItem.setShowAsAction(
+ MenuItem.SHOW_AS_ACTION_IF_ROOM | MenuItem.SHOW_AS_ACTION_WITH_TEXT);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
- if (item.getItemId() == Menu.FIRST) {
- showAddOrEditDialog(null);
+ if (item.getItemId() == OPTIONS_MENU_ADD) {
+ showAddOrEditDialog(null, null);
return true;
}
return false;
@@ -186,13 +241,20 @@ public class UserDictionarySettings extends ListFragment {
/**
* Add or edit a word. If editingWord is null, it's an add; otherwise, it's an edit.
* @param editingWord the word to edit, or null if it's an add.
+ * @param editingShortcut the shortcut for this entry, or null if none.
*/
- private void showAddOrEditDialog(final String editingWord) {
+ private void showAddOrEditDialog(final String editingWord, final String editingShortcut) {
final Bundle args = new Bundle();
- args.putInt(EXTRA_MODE, editingWord == null ? MODE_INSERT : MODE_EDIT);
- args.putString(EXTRA_WORD, editingWord);
- args.putString(EXTRA_LOCALE, mLocale);
- getActivity();
+ args.putInt(UserDictionaryAddWordContents.EXTRA_MODE, null == editingWord
+ ? UserDictionaryAddWordContents.MODE_INSERT
+ : UserDictionaryAddWordContents.MODE_EDIT);
+ args.putString(UserDictionaryAddWordContents.EXTRA_WORD, editingWord);
+ args.putString(UserDictionaryAddWordContents.EXTRA_SHORTCUT, editingShortcut);
+ args.putString(UserDictionaryAddWordContents.EXTRA_LOCALE, mLocale);
+ android.preference.PreferenceActivity pa =
+ (android.preference.PreferenceActivity)getActivity();
+ pa.startPreferencePanel(UserDictionaryAddWordFragment.class.getName(),
+ args, R.string.user_dict_settings_add_dialog_title, null, null, 0);
}
private String getWord(final int position) {
@@ -201,11 +263,35 @@ public class UserDictionarySettings extends ListFragment {
// Handle a possible race-condition
if (mCursor.isAfterLast()) return null;
- return mCursor.getString(mCursor.getColumnIndexOrThrow(Words.WORD));
+ return mCursor.getString(
+ mCursor.getColumnIndexOrThrow(UserDictionary.Words.WORD));
+ }
+
+ private String getShortcut(final int position) {
+ if (!IS_SHORTCUT_API_SUPPORTED) return null;
+ if (null == mCursor) return null;
+ mCursor.moveToPosition(position);
+ // Handle a possible race-condition
+ if (mCursor.isAfterLast()) return null;
+
+ return mCursor.getString(
+ mCursor.getColumnIndexOrThrow(UserDictionary.Words.SHORTCUT));
}
- public static void deleteWord(final String word, final ContentResolver resolver) {
- resolver.delete(Words.CONTENT_URI, Words.WORD + "=?", new String[] { word });
+ public static void deleteWord(final String word, final String shortcut,
+ final ContentResolver resolver) {
+ if (!IS_SHORTCUT_API_SUPPORTED) {
+ resolver.delete(UserDictionary.Words.CONTENT_URI, DELETE_SELECTION_SHORTCUT_UNSUPPORTED,
+ new String[] { word });
+ } else if (TextUtils.isEmpty(shortcut)) {
+ resolver.delete(
+ UserDictionary.Words.CONTENT_URI, DELETE_SELECTION_WITHOUT_SHORTCUT,
+ new String[] { word });
+ } else {
+ resolver.delete(
+ UserDictionary.Words.CONTENT_URI, DELETE_SELECTION_WITH_SHORTCUT,
+ new String[] { word, shortcut });
+ }
}
private static class MyAdapter extends SimpleCursorAdapter implements SectionIndexer {
@@ -215,7 +301,22 @@ public class UserDictionarySettings extends ListFragment {
@Override
public boolean setViewValue(final View v, final Cursor c, final int columnIndex) {
- // just let SimpleCursorAdapter set the view values
+ if (!IS_SHORTCUT_API_SUPPORTED) {
+ // just let SimpleCursorAdapter set the view values
+ return false;
+ }
+ if (columnIndex == INDEX_SHORTCUT) {
+ final String shortcut = c.getString(INDEX_SHORTCUT);
+ if (TextUtils.isEmpty(shortcut)) {
+ v.setVisibility(View.GONE);
+ } else {
+ ((TextView)v).setText(shortcut);
+ v.setVisibility(View.VISIBLE);
+ }
+ v.invalidate();
+ return true;
+ }
+
return false;
}
};
@@ -226,7 +327,7 @@ public class UserDictionarySettings extends ListFragment {
if (null != c) {
final String alphabet = context.getString(R.string.user_dict_fast_scroll_alphabet);
- final int wordColIndex = c.getColumnIndexOrThrow(Words.WORD);
+ final int wordColIndex = c.getColumnIndexOrThrow(UserDictionary.Words.WORD);
mIndexer = new AlphabetIndexer(c, wordColIndex, alphabet);
}
setViewBinder(mViewBinder);
@@ -248,3 +349,4 @@ public class UserDictionarySettings extends ListFragment {
}
}
}
+