diff options
| author | Menny Even Danan <menny@evendanan.net> | 2013-11-08 04:59:31 +0000 |
|---|---|---|
| committer | Menny Even Danan <menny@evendanan.net> | 2013-11-08 04:59:31 +0000 |
| commit | 7fcbdfc3a7935fa28414984ef3e110468c0ff0c1 (patch) | |
| tree | 9a4daf5698a31f8490a89163340a6ef50fa6f654 /src/main | |
| parent | 8e5c2f603ebbf57deec3a72588f0e0632699caf3 (diff) | |
| download | AnySoftKeyboard-7fcbdfc3a7935fa28414984ef3e110468c0ff0c1.tar.gz AnySoftKeyboard-7fcbdfc3a7935fa28414984ef3e110468c0ff0c1.tar.bz2 | |
revisting the word-editor (not done yet). This include issue #216, issue #214, issue #222, and issue #213
Diffstat (limited to 'src/main')
13 files changed, 354 insertions, 149 deletions
diff --git a/src/main/java/com/anysoftkeyboard/devicespecific/DeviceSpecific.java b/src/main/java/com/anysoftkeyboard/devicespecific/DeviceSpecific.java index 821e92733..34ef44839 100644 --- a/src/main/java/com/anysoftkeyboard/devicespecific/DeviceSpecific.java +++ b/src/main/java/com/anysoftkeyboard/devicespecific/DeviceSpecific.java @@ -19,6 +19,8 @@ package com.anysoftkeyboard.devicespecific; import android.content.Context; import android.view.GestureDetector; import android.view.inputmethod.InputConnection; +import android.widget.AbsListView; + import com.anysoftkeyboard.WordComposer; public interface DeviceSpecific { @@ -30,4 +32,6 @@ public interface DeviceSpecific { public GestureDetector createGestureDetector(Context appContext, AskOnGestureListener listener); public void commitCorrectionToInputConnection(InputConnection ic, WordComposer word); + + public void performListScrollToPosition(AbsListView listView, int position); } diff --git a/src/main/java/com/anysoftkeyboard/devicespecific/DeviceSpecific_V3.java b/src/main/java/com/anysoftkeyboard/devicespecific/DeviceSpecific_V3.java index 351280a2b..7e8e4b720 100644 --- a/src/main/java/com/anysoftkeyboard/devicespecific/DeviceSpecific_V3.java +++ b/src/main/java/com/anysoftkeyboard/devicespecific/DeviceSpecific_V3.java @@ -21,6 +21,8 @@ import android.annotation.TargetApi; import android.content.Context; import android.view.GestureDetector; import android.view.inputmethod.InputConnection; +import android.widget.AbsListView; + import com.anysoftkeyboard.WordComposer; @TargetApi(3) @@ -44,4 +46,9 @@ public class DeviceSpecific_V3 implements DeviceSpecific { public void commitCorrectionToInputConnection(InputConnection ic, WordComposer word) { ic.commitText(word.getPreferredWord(), 1); } + + @Override + public void performListScrollToPosition(AbsListView listView, int position) { + listView.setSelection(position); + } }
\ No newline at end of file diff --git a/src/main/java/com/anysoftkeyboard/devicespecific/DeviceSpecific_V8.java b/src/main/java/com/anysoftkeyboard/devicespecific/DeviceSpecific_V8.java index be123ff4c..2c2837ece 100644 --- a/src/main/java/com/anysoftkeyboard/devicespecific/DeviceSpecific_V8.java +++ b/src/main/java/com/anysoftkeyboard/devicespecific/DeviceSpecific_V8.java @@ -20,6 +20,7 @@ import android.annotation.TargetApi; import android.content.Context; import android.content.pm.PackageManager; import android.view.GestureDetector; +import android.widget.AbsListView; @TargetApi(8) public class DeviceSpecific_V8 extends DeviceSpecific_V7 { @@ -51,4 +52,9 @@ public class DeviceSpecific_V8 extends DeviceSpecific_V7 { return new AskV8GestureDetector(appContext, listener, null, ignoreMultitouch); } + + @Override + public void performListScrollToPosition(AbsListView listView, int position) { + listView.smoothScrollToPosition(position); + } }
\ No newline at end of file diff --git a/src/main/java/com/anysoftkeyboard/ui/settings/DictionariesFragment.java b/src/main/java/com/anysoftkeyboard/ui/settings/DictionariesFragment.java index 86447e65c..b1192cc21 100644 --- a/src/main/java/com/anysoftkeyboard/ui/settings/DictionariesFragment.java +++ b/src/main/java/com/anysoftkeyboard/ui/settings/DictionariesFragment.java @@ -22,6 +22,7 @@ import android.os.Bundle; import android.preference.Preference; import android.support.v4.preference.PreferenceFragment; +import com.anysoftkeyboard.ui.settings.wordseditor.UserDictionaryEditorFragment; import com.menny.android.anysoftkeyboard.R; import net.evendanan.pushingpixels.FragmentChauffeurActivity; diff --git a/src/main/java/com/anysoftkeyboard/ui/settings/BackupUserWordsAsyncTask.java b/src/main/java/com/anysoftkeyboard/ui/settings/wordseditor/BackupUserWordsAsyncTask.java index 69d5d479f..f09ad7445 100644 --- a/src/main/java/com/anysoftkeyboard/ui/settings/BackupUserWordsAsyncTask.java +++ b/src/main/java/com/anysoftkeyboard/ui/settings/wordseditor/BackupUserWordsAsyncTask.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.anysoftkeyboard.ui.settings; +package com.anysoftkeyboard.ui.settings.wordseditor; import android.content.Context; import android.database.Cursor; @@ -54,8 +54,8 @@ final class BackupUserWordsAsyncTask extends UserWordsEditorAsyncTask { if (a == null) return; // I can access the UI object in the UI thread. - for (int i = 0; i < a.mLangs.getCount(); i++) { - final String locale = ((UserDictionaryEditorFragment.DictionaryLocale) a.mLangs.getItemAtPosition(i)).getLocale(); + for (int i = 0; i < a.mLanguagesSpinner.getCount(); i++) { + final String locale = ((DictionaryLocale) a.mLanguagesSpinner.getItemAtPosition(i)).getLocale(); if (!TextUtils.isEmpty(locale)) { mLocalesToSave.add(locale); Log.d(TAG, "Found a locale to backup: " + locale); diff --git a/src/main/java/com/anysoftkeyboard/ui/settings/wordseditor/DictionaryLocale.java b/src/main/java/com/anysoftkeyboard/ui/settings/wordseditor/DictionaryLocale.java new file mode 100644 index 000000000..a47d8b8a0 --- /dev/null +++ b/src/main/java/com/anysoftkeyboard/ui/settings/wordseditor/DictionaryLocale.java @@ -0,0 +1,45 @@ +package com.anysoftkeyboard.ui.settings.wordseditor; + +/** +* This will hold the data about locales in the Languages Spinner view +*/ +final class DictionaryLocale { + private final String mLocale; + private final String mLocaleName; + + public DictionaryLocale(String locale, String name) { + mLocale = locale; + mLocaleName = name; + } + + public String getLocale() { + return mLocale; + } + + @Override + public String toString() { + return String.format("%s - (%s)", mLocaleName, mLocale); + } + + @Override + public int hashCode() { + return mLocale == null ? 0 : mLocale.hashCode(); + } + + @Override + public boolean equals(Object o) { + if (o instanceof DictionaryLocale) { + String otherLocale = ((DictionaryLocale) o).getLocale(); + if (otherLocale == null && mLocale == null) + return true; + else if (otherLocale == null) + return false; + else if (mLocale == null) + return false; + else + return mLocale.equals(otherLocale); + } else { + return false; + } + } +} diff --git a/src/main/java/com/anysoftkeyboard/ui/settings/RestoreUserWordsAsyncTask.java b/src/main/java/com/anysoftkeyboard/ui/settings/wordseditor/RestoreUserWordsAsyncTask.java index fb7c1d6ea..5d0fe376e 100644 --- a/src/main/java/com/anysoftkeyboard/ui/settings/RestoreUserWordsAsyncTask.java +++ b/src/main/java/com/anysoftkeyboard/ui/settings/wordseditor/RestoreUserWordsAsyncTask.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.anysoftkeyboard.ui.settings; +package com.anysoftkeyboard.ui.settings.wordseditor; import android.content.Context; import android.os.Environment; @@ -23,6 +23,7 @@ import android.view.WindowManager.BadTokenException; import android.widget.Toast; import com.anysoftkeyboard.dictionaries.UserDictionary; +import com.anysoftkeyboard.ui.settings.wordseditor.UserWordsEditorAsyncTask; import com.anysoftkeyboard.utils.Log; import com.menny.android.anysoftkeyboard.AnyApplication; import com.menny.android.anysoftkeyboard.R; diff --git a/src/main/java/com/anysoftkeyboard/ui/settings/UserDictionaryEditorFragment.java b/src/main/java/com/anysoftkeyboard/ui/settings/wordseditor/UserDictionaryEditorFragment.java index ab8f36b9c..4e6b9daeb 100644 --- a/src/main/java/com/anysoftkeyboard/ui/settings/UserDictionaryEditorFragment.java +++ b/src/main/java/com/anysoftkeyboard/ui/settings/wordseditor/UserDictionaryEditorFragment.java @@ -14,14 +14,14 @@ * limitations under the License. */ -package com.anysoftkeyboard.ui.settings; +package com.anysoftkeyboard.ui.settings.wordseditor; import android.app.AlertDialog; import android.app.Dialog; import android.content.DialogInterface; import android.database.Cursor; import android.os.Bundle; -import android.support.v4.app.ListFragment; +import android.support.v4.app.Fragment; import android.support.v7.app.ActionBar; import android.text.TextUtils; import android.view.LayoutInflater; @@ -31,11 +31,10 @@ import android.view.MenuItem; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; +import android.widget.AbsListView; import android.widget.AdapterView; import android.widget.AdapterView.OnItemSelectedListener; import android.widget.ArrayAdapter; -import android.widget.ListView; -import android.widget.SimpleCursorAdapter; import android.widget.Spinner; import android.widget.TextView; @@ -51,50 +50,13 @@ import net.evendanan.pushingpixels.AsyncTaskWithProgressWindow; import net.evendanan.pushingpixels.FragmentChauffeurActivity; import java.util.ArrayList; +import java.util.List; -public class UserDictionaryEditorFragment extends ListFragment implements AsyncTaskWithProgressWindow.AsyncTaskOwner { +public class UserDictionaryEditorFragment extends Fragment + implements AsyncTaskWithProgressWindow.AsyncTaskOwner, AdapterView.OnItemClickListener, UserWordsListAdapter.AdapterCallbacks { private Dialog mDialog; - static final class DictionaryLocale { - private final String mLocale; - private final String mLocaleName; - - public DictionaryLocale(String locale, String name) { - mLocale = locale; - mLocaleName = name; - } - - public String getLocale() { return mLocale; } - - @Override - public String toString() { - return String.format("%s - (%s)", mLocaleName, mLocale); - } - - @Override - public int hashCode() { - return mLocale == null? 0 : mLocale.hashCode(); - } - - @Override - public boolean equals(Object o) { - if (o instanceof DictionaryLocale) { - String otherLocale = ((DictionaryLocale)o).getLocale(); - if (otherLocale == null && mLocale == null) - return true; - else if (otherLocale == null) - return false; - else if (mLocale == null) - return false; - else - return mLocale.equals(otherLocale); - } else { - return false; - } - } - } - public static final String ASK_USER_WORDS_SDCARD_FILENAME = "UserWords.xml"; static final int DIALOG_SAVE_SUCCESS = 10; @@ -105,12 +67,14 @@ public class UserDictionaryEditorFragment extends ListFragment implements AsyncT static final String TAG = "ASK_UDE"; - Spinner mLangs; + Spinner mLanguagesSpinner; WordsCursor mCursor; private String mSelectedLocale = null; UserDictionary mCurrentDictionary; + AbsListView mWordsListView;//this may be either ListView or GridView (in tablets) + @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { setHasOptionsMenu(true); @@ -119,7 +83,7 @@ public class UserDictionaryEditorFragment extends ListFragment implements AsyncT actionBar.setDisplayShowCustomEnabled(true); actionBar.setDisplayShowTitleEnabled(false); View v = inflater.inflate(R.layout.words_editor_actionbar_view, null); - mLangs = (Spinner) v.findViewById(R.id.user_dictionay_langs); + mLanguagesSpinner = (Spinner) v.findViewById(R.id.user_dictionay_langs); actionBar.setCustomView(v); return inflater.inflate(R.layout.user_dictionary_editor, container, false); @@ -128,8 +92,7 @@ public class UserDictionaryEditorFragment extends ListFragment implements AsyncT @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); - - mLangs.setOnItemSelectedListener(new OnItemSelectedListener() { + mLanguagesSpinner.setOnItemSelectedListener(new OnItemSelectedListener() { public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) { mSelectedLocale = ((DictionaryLocale) arg0.getItemAtPosition(arg2)).getLocale(); @@ -150,9 +113,11 @@ public class UserDictionaryEditorFragment extends ListFragment implements AsyncT } }); - ListView listView = getListView(); - listView.setFastScrollEnabled(true); - listView.setEmptyView(emptyView); + mWordsListView = (AbsListView) view.findViewById(android.R.id.list); + mWordsListView.setFastScrollEnabled(true); + //this is for the "empty state" - it will allow the user to quickly add the first word. + mWordsListView.setEmptyView(emptyView); + mWordsListView.setOnItemClickListener(this); } @Override @@ -164,7 +129,7 @@ public class UserDictionaryEditorFragment extends ListFragment implements AsyncT @Override public boolean onOptionsItemSelected(MenuItem item) { - switch(item.getItemId()) { + switch (item.getItemId()) { case R.id.add_user_word: createEmptyItemForAdd(); return true; @@ -180,7 +145,11 @@ public class UserDictionaryEditorFragment extends ListFragment implements AsyncT } private void createEmptyItemForAdd() { - //TODO: will create an empty item on the list, and put it in EDIT mode. + UserWordsListAdapter adapter = (UserWordsListAdapter) mWordsListView.getAdapter(); + final int addWordItemIndex = adapter.getCount()-1; + //will use smooth scrolling on API8+ + AnyApplication.getDeviceSpecific().performListScrollToPosition(mWordsListView, addWordItemIndex); + adapter.onItemClicked(addWordItemIndex); } @Override @@ -215,11 +184,20 @@ public class UserDictionaryEditorFragment extends ListFragment implements AsyncT void fillLanguagesSpinner() { new UserWordsEditorAsyncTask(this) { - private ArrayList<DictionaryLocale> mLanguagesList; + private ArrayAdapter<DictionaryLocale> mAdapter; + + @Override + protected void onPreExecute() { + super.onPreExecute(); + //creating in the UI thread + mAdapter = new ArrayAdapter<>( + getActivity(), + android.R.layout.simple_spinner_item); + } @Override protected Void doAsyncTask(Void[] params) throws Exception { - mLanguagesList = new ArrayList<DictionaryLocale>(); + ArrayList<DictionaryLocale> languagesList = new ArrayList<>(); ArrayList<KeyboardAddOnAndBuilder> keyboards = KeyboardFactory .getAllAvailableKeyboards(getActivity().getApplicationContext()); @@ -230,28 +208,23 @@ public class UserDictionaryEditorFragment extends ListFragment implements AsyncT DictionaryLocale dictionaryLocale = new DictionaryLocale(locale, kbd.getName()); //Don't worry, DictionaryLocale equals any DictionaryLocale with the same locale (no matter what its name is) - if (mLanguagesList.contains(dictionaryLocale)) + if (languagesList.contains(dictionaryLocale)) continue; Log.d(TAG, "Adding locale " + locale + " to editor."); - mLanguagesList.add(dictionaryLocale); + languagesList.add(dictionaryLocale); } + + mAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + for (DictionaryLocale lang : languagesList) + mAdapter.add(lang); + return null; } @Override - protected void applyResults(Void result, - Exception backgroundException) { - ArrayAdapter<DictionaryLocale> adapter = new ArrayAdapter<DictionaryLocale>( - getActivity(), - android.R.layout.simple_spinner_item); - adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); - for (DictionaryLocale lang : mLanguagesList) - adapter.add(lang); - - mLangs.setAdapter(adapter); + protected void applyResults(Void result, Exception backgroundException) { + mLanguagesSpinner.setAdapter(mAdapter); } - - ; }.execute(); } @@ -292,17 +265,12 @@ public class UserDictionaryEditorFragment extends ListFragment implements AsyncT return dialog; } - private void onAddOrEditFinished(String word) { - if (!TextUtils.isEmpty(word)) { - // Disallow duplicates - deleteWord(word); - - mCurrentDictionary.addWord(word, 128); - } - fillWordsList(); + private void addWord(String word) { + deleteWord(word);// Disallow duplicates + mCurrentDictionary.addWord(word, 128); } - void deleteWord(String word) { + private void deleteWord(String word) { mCurrentDictionary.deleteWord(word); } @@ -310,6 +278,7 @@ public class UserDictionaryEditorFragment extends ListFragment implements AsyncT Log.d(TAG, "Selected locale is " + mSelectedLocale); new UserWordsEditorAsyncTask(this) { private UserDictionary mNewDictionary; + private List<String> mWordsList; @Override protected void onPreExecute() { @@ -328,55 +297,66 @@ public class UserDictionaryEditorFragment extends ListFragment implements AsyncT mCurrentDictionary = mNewDictionary; mCurrentDictionary.loadDictionary(); mCursor = mCurrentDictionary.getWordsCursor(); + Cursor cursor = mCursor.getCursor(); + mWordsList = new ArrayList<>(mCursor.getCursor().getCount()); + cursor.moveToFirst(); + while(!cursor.isAfterLast()) { + mWordsList.add(mCursor.getCurrentWord()); + cursor.moveToNext(); + } return null; } protected void applyResults(Void result, Exception backgroundException) { if (AnyApplication.DEBUG) - Log.d(TAG, "Creating a new MyAdapter for the words editor"); - MyAdapter adapter = new MyAdapter(); - setListAdapter(adapter); + Log.d(TAG, "Creating a new UserWordsListAdapter for the words editor"); + UserWordsListAdapter adapter = new UserWordsListAdapter( + UserDictionaryEditorFragment.this.getActivity(), + mWordsList, + UserDictionaryEditorFragment.this); + mWordsListView.setAdapter(adapter); } }.execute(); } - private class MyAdapter extends SimpleCursorAdapter /* - * implements - * SectionIndexer - * (removed because of - * issue 903) - */ { - // private AlphabetIndexer mIndexer; - private final int mWordColumnIndex; - - public MyAdapter() { - super(getActivity(), R.layout.user_dictionary_word_row, - mCursor.getCursor(), - new String[]{android.provider.UserDictionary.Words.WORD}, - new int[]{android.R.id.text1}); - - mWordColumnIndex = mCursor.getCursor().getColumnIndexOrThrow( - android.provider.UserDictionary.Words.WORD); - } + @Override + public void onItemClick(AdapterView<?> parent, View view, int position, long id) { + ((UserWordsListAdapter) mWordsListView.getAdapter()).onItemClicked(position); + } - @Override - public View getView(int position, View convertView, ViewGroup parent) { - ViewGroup v = (ViewGroup) super.getView(position, convertView, - parent); - final String word = ((Cursor) getItem(position)) - .getString(mWordColumnIndex); + @Override + public void onWordDeleted(final String word) { + new UserWordsEditorAsyncTask(this) { + @Override + protected Void doAsyncTask(Void[] params) throws Exception { + deleteWord(word); + return null; + } - v.findViewById(R.id.delete_user_word).setOnClickListener( - new OnClickListener() { - public void onClick(View v) { - deleteWord(word); + @Override + protected void applyResults(Void aVoid, Exception backgroundException) { + fillWordsList(); + } + }.execute(); + } - fillWordsList(); - } - }); + @Override + public void onWordUpdated(final String oldWord, final String newWord) { - return v; - } + new UserWordsEditorAsyncTask(this) { + @Override + protected Void doAsyncTask(Void[] params) throws Exception { + if (!TextUtils.isEmpty(oldWord))//it can be empty in case it's a new word. + deleteWord(oldWord); + addWord(newWord); + return null; + } + + @Override + protected void applyResults(Void aVoid, Exception backgroundException) { + fillWordsList(); + } + }.execute(); } } diff --git a/src/main/java/com/anysoftkeyboard/ui/settings/UserWordsEditorAsyncTask.java b/src/main/java/com/anysoftkeyboard/ui/settings/wordseditor/UserWordsEditorAsyncTask.java index c332f9bcd..9da5b8e38 100644 --- a/src/main/java/com/anysoftkeyboard/ui/settings/UserWordsEditorAsyncTask.java +++ b/src/main/java/com/anysoftkeyboard/ui/settings/wordseditor/UserWordsEditorAsyncTask.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.anysoftkeyboard.ui.settings; +package com.anysoftkeyboard.ui.settings.wordseditor; /*Using this import require an Android Library reference from https://github.com/menny/PushingPixels*/ import net.evendanan.pushingpixels.AsyncTaskWithProgressWindow; diff --git a/src/main/java/com/anysoftkeyboard/ui/settings/wordseditor/UserWordsListAdapter.java b/src/main/java/com/anysoftkeyboard/ui/settings/wordseditor/UserWordsListAdapter.java new file mode 100644 index 000000000..0757eb678 --- /dev/null +++ b/src/main/java/com/anysoftkeyboard/ui/settings/wordseditor/UserWordsListAdapter.java @@ -0,0 +1,136 @@ +package com.anysoftkeyboard.ui.settings.wordseditor; + +import android.content.Context; +import android.text.TextUtils; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ArrayAdapter; +import android.widget.EditText; +import android.widget.TextView; + +import com.menny.android.anysoftkeyboard.R; + +import java.util.List; + +/** +* Created by menny on 11/7/13. +*/ +class UserWordsListAdapter extends ArrayAdapter<String> { + + public static interface AdapterCallbacks { + void onWordDeleted(String word); + void onWordUpdated(String oldWord, String newWord); + } + + private final LayoutInflater mInflater; + private AdapterCallbacks mCallbacksListener; + + private final int NONE_POSITION = -1; + private int mCurrentlyEditPosition = NONE_POSITION; + + private final int TYPE_NORMAL = 0; + private final int TYPE_EDIT = 1; + private final int TYPE_ADD = 2; + + public UserWordsListAdapter(Context context, List<String> words, AdapterCallbacks callbacks) { + super(context, R.id.word_view, words); + mCallbacksListener = callbacks; + mInflater = LayoutInflater.from(context); + } + + @Override + public int getViewTypeCount() { + //one for normal, and the second type is "editing" + //it will inflate the same layout on both occasions, but will allow use to stop re-creation and re-use of the EDIT view. + //the third one is for the "add new word" + return 3; + } + + @Override + public int getCount() { + final int baseCount = super.getCount(); + if (baseCount == 0) + return 0;//in the case that there are no words, I have a special "empty state" + + return super.getCount()+1;//the plus one is for the "Add new"; + } + + @Override + public int getItemViewType(int position) { + if (mCurrentlyEditPosition == position) + return TYPE_EDIT; + else if (position == super.getCount())//this is the last item, which is an "Add word" item. + return TYPE_ADD; + else + return TYPE_NORMAL; + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + final int viewType = getItemViewType(position); + if (convertView == null) { + switch (viewType) { + case TYPE_NORMAL: + convertView = mInflater.inflate(R.layout.user_dictionary_word_row, parent, false); + convertView.findViewById(R.id.delete_user_word).setOnClickListener(mOnDeleteWordClickListener); + break; + case TYPE_EDIT: + convertView = mInflater.inflate(R.layout.user_dictionary_word_row_edit, parent, false); + convertView.findViewById(R.id.approve_user_word).setOnClickListener(mOnWordEditApprovedClickListener); + break; + case TYPE_ADD: + convertView = mInflater.inflate(R.layout.user_dictionary_word_row_add, parent, false); + break; + default: + throw new IllegalArgumentException("Unknown view type!"); + } + } + + //why to check the position against the super.getCount, and not the view type? + //good question! In the state where we adding a new word, the underling array is still one short, + //so the view type will be "EDIT", but the count will still be one less. + if (position == super.getCount()) { + convertView.setTag(""/*empty word*/); + } else { + final String word = getItem(position); + ((TextView)convertView.findViewById(R.id.word_view)).setText(word); + convertView.setTag(word); + } + return convertView; + } + + public void onItemClicked(int position) { + if (mCurrentlyEditPosition == NONE_POSITION) { + //nothing was in edit mode, so we start a new one + mCurrentlyEditPosition = position; + } else { + //there was an edit in progress. Clicking out side will cause DISCARD. + mCurrentlyEditPosition = NONE_POSITION; + } + notifyDataSetChanged(); + } + + private final View.OnClickListener mOnDeleteWordClickListener = new View.OnClickListener() { + public void onClick(View v) { + final String word = ((View)v.getParent()).getTag().toString(); + mCallbacksListener.onWordDeleted(word); + } + }; + + private final View.OnClickListener mOnWordEditApprovedClickListener = new View.OnClickListener() { + public void onClick(View v) { + View parent = ((View)v.getParent()); + final String oldWord = parent.getTag().toString(); + EditText editBox = (EditText)parent.findViewById(R.id.word_view); + final String newWord = editBox.getText().toString(); + if (TextUtils.isEmpty(newWord)) { + //this is weird.. The user wanted the word to be deleted? + //why not clicking on the delete icon?! + //I'm ignoring. + } else { + mCallbacksListener.onWordUpdated(oldWord, newWord); + } + } + }; +} diff --git a/src/main/res/layout/user_dictionary_word_row.xml b/src/main/res/layout/user_dictionary_word_row.xml index a240f60c6..c62c5e30c 100644 --- a/src/main/res/layout/user_dictionary_word_row.xml +++ b/src/main/res/layout/user_dictionary_word_row.xml @@ -1,39 +1,28 @@ <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="fill_parent" - android:layout_height="wrap_content" - android:orientation="horizontal" - android:paddingLeft="8dp" - android:paddingRight="8dp" - android:weightSum="1"> + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:orientation="horizontal" + android:paddingLeft="8dp" + android:paddingRight="8dp" + android:weightSum="1"> <TextView style="@style/Ask.Text.Title" - android:id="@android:id/text1" - android:layout_width="0px" - android:layout_height="wrap_content" - android:layout_weight="1" - android:gravity="center_vertical" - android:minHeight="?android:attr/listPreferredItemHeight"/> + android:id="@+id/word_view" + android:layout_width="0px" + android:layout_height="wrap_content" + android:layout_weight="1" + android:gravity="center_vertical" /> <ImageView - android:id="@+id/edit_user_word" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="center_vertical" - android:layout_marginLeft="8dp" - android:adjustViewBounds="true" - android:scaleType="centerInside" - android:src="@android:drawable/ic_menu_edit"/> - - <ImageView - android:id="@+id/delete_user_word" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="center_vertical" - android:layout_marginLeft="8dp" - android:adjustViewBounds="true" - android:scaleType="centerInside" - android:src="@android:drawable/ic_menu_delete"/> + android:id="@+id/delete_user_word" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="center_vertical" + android:layout_marginLeft="8dp" + android:adjustViewBounds="true" + android:scaleType="centerInside" + android:src="@android:drawable/ic_menu_delete" /> </LinearLayout>
\ No newline at end of file diff --git a/src/main/res/layout/user_dictionary_word_row_add.xml b/src/main/res/layout/user_dictionary_word_row_add.xml new file mode 100644 index 000000000..3905c6735 --- /dev/null +++ b/src/main/res/layout/user_dictionary_word_row_add.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="utf-8"?> +<ImageView xmlns:android="http://schemas.android.com/apk/res/android" + android:id="@+id/add_new_word" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_gravity="center" + android:adjustViewBounds="true" + android:scaleType="centerInside" + android:src="@android:drawable/ic_menu_add" />
\ No newline at end of file diff --git a/src/main/res/layout/user_dictionary_word_row_edit.xml b/src/main/res/layout/user_dictionary_word_row_edit.xml new file mode 100644 index 000000000..4bb1df190 --- /dev/null +++ b/src/main/res/layout/user_dictionary_word_row_edit.xml @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="utf-8"?> +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:orientation="horizontal" + android:paddingLeft="8dp" + android:paddingRight="8dp" + android:weightSum="1"> + + <EditText + style="@style/Ask.Text.Title" + android:id="@+id/word_view" + android:layout_width="0px" + android:layout_height="wrap_content" + android:layout_weight="1" + android:gravity="center_vertical" /> + + <ImageView + android:id="@+id/approve_user_word" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="center_vertical" + android:layout_marginLeft="8dp" + android:adjustViewBounds="true" + android:scaleType="centerInside" + android:src="@android:drawable/ic_menu_save" /> +</LinearLayout>
\ No newline at end of file |
