aboutsummaryrefslogtreecommitdiff
path: root/src/main
diff options
context:
space:
mode:
authorMenny Even Danan <menny@evendanan.net>2013-11-08 04:59:31 +0000
committerMenny Even Danan <menny@evendanan.net>2013-11-08 04:59:31 +0000
commit7fcbdfc3a7935fa28414984ef3e110468c0ff0c1 (patch)
tree9a4daf5698a31f8490a89163340a6ef50fa6f654 /src/main
parent8e5c2f603ebbf57deec3a72588f0e0632699caf3 (diff)
downloadAnySoftKeyboard-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')
-rw-r--r--src/main/java/com/anysoftkeyboard/devicespecific/DeviceSpecific.java4
-rw-r--r--src/main/java/com/anysoftkeyboard/devicespecific/DeviceSpecific_V3.java7
-rw-r--r--src/main/java/com/anysoftkeyboard/devicespecific/DeviceSpecific_V8.java6
-rw-r--r--src/main/java/com/anysoftkeyboard/ui/settings/DictionariesFragment.java1
-rw-r--r--src/main/java/com/anysoftkeyboard/ui/settings/wordseditor/BackupUserWordsAsyncTask.java (renamed from src/main/java/com/anysoftkeyboard/ui/settings/BackupUserWordsAsyncTask.java)6
-rw-r--r--src/main/java/com/anysoftkeyboard/ui/settings/wordseditor/DictionaryLocale.java45
-rw-r--r--src/main/java/com/anysoftkeyboard/ui/settings/wordseditor/RestoreUserWordsAsyncTask.java (renamed from src/main/java/com/anysoftkeyboard/ui/settings/RestoreUserWordsAsyncTask.java)3
-rw-r--r--src/main/java/com/anysoftkeyboard/ui/settings/wordseditor/UserDictionaryEditorFragment.java (renamed from src/main/java/com/anysoftkeyboard/ui/settings/UserDictionaryEditorFragment.java)208
-rw-r--r--src/main/java/com/anysoftkeyboard/ui/settings/wordseditor/UserWordsEditorAsyncTask.java (renamed from src/main/java/com/anysoftkeyboard/ui/settings/UserWordsEditorAsyncTask.java)2
-rw-r--r--src/main/java/com/anysoftkeyboard/ui/settings/wordseditor/UserWordsListAdapter.java136
-rw-r--r--src/main/res/layout/user_dictionary_word_row.xml49
-rw-r--r--src/main/res/layout/user_dictionary_word_row_add.xml9
-rw-r--r--src/main/res/layout/user_dictionary_word_row_edit.xml27
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