diff --git a/app/build.gradle b/app/build.gradle index b1954c3..f4db04c 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -104,4 +104,6 @@ dependencies { compile 'com.elvishew:xlog:1.3.0' compile 'com.github.piasy:BigImageViewer:1.2.5' compile 'com.github.piasy:GlideImageLoader:1.2.5' + compile 'com.weiwangcn.betterspinner:library-material:1.1.0' + } diff --git a/app/src/main/java/org/houxg/leamonax/adapter/NotebookAdapter.java b/app/src/main/java/org/houxg/leamonax/adapter/NotebookAdapter.java index 3500ea5..2850d3b 100644 --- a/app/src/main/java/org/houxg/leamonax/adapter/NotebookAdapter.java +++ b/app/src/main/java/org/houxg/leamonax/adapter/NotebookAdapter.java @@ -101,7 +101,7 @@ public class NotebookAdapter extends RecyclerView.Adapter notebooks); void onEditNotebook(Notebook notebook); } diff --git a/app/src/main/java/org/houxg/leamonax/ui/Navigation.java b/app/src/main/java/org/houxg/leamonax/ui/Navigation.java index 9e13c76..dd4b7cb 100644 --- a/app/src/main/java/org/houxg/leamonax/ui/Navigation.java +++ b/app/src/main/java/org/houxg/leamonax/ui/Navigation.java @@ -6,18 +6,13 @@ import android.app.Activity; import android.app.AlertDialog; import android.content.DialogInterface; import android.content.Intent; -import android.content.res.ColorStateList; import android.graphics.drawable.Drawable; -import android.graphics.drawable.RippleDrawable; import android.os.Build; import android.support.v4.view.GravityCompat; -import android.support.v4.view.ViewGroupCompat; import android.support.v4.widget.DrawerLayout; -import android.support.v7.graphics.drawable.DrawableWrapper; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.text.TextUtils; -import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -27,9 +22,8 @@ import android.widget.ImageView; import android.widget.TextView; import com.bumptech.glide.Glide; -import com.elvishew.xlog.XLog; -import com.tencent.bugly.Bugly; import com.tencent.bugly.crashreport.CrashReport; +import com.weiwangcn.betterspinner.library.material.MaterialBetterSpinner; import org.houxg.leamonax.R; import org.houxg.leamonax.adapter.AccountAdapter; @@ -41,11 +35,17 @@ import org.houxg.leamonax.model.Tag; import org.houxg.leamonax.model.User; import org.houxg.leamonax.service.AccountService; import org.houxg.leamonax.service.NotebookService; +import org.houxg.leamonax.utils.CollectionUtils; import org.houxg.leamonax.utils.DisplayUtils; import org.houxg.leamonax.utils.OpenUtils; import org.houxg.leamonax.utils.ToastUtils; import org.houxg.leamonax.widget.AlphabetDrawable; import org.houxg.leamonax.widget.TriangleView; +import org.houxg.leamonax.widget.spinner.SpinnerArrayAdapter; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; import butterknife.BindView; import butterknife.ButterKnife; @@ -298,9 +298,24 @@ public class Navigation { } @Override - public void onClickedAddNotebook(final String parentNotebookId) { - View view = LayoutInflater.from(mActivity).inflate(R.layout.dialog_sigle_edittext, null); + public void onClickedAddNotebook(final String parentNotebookId, List notebooks) { + View view = LayoutInflater.from(mActivity).inflate(R.layout.dialog_add_notebook, null); final EditText mEdit = (EditText) view.findViewById(R.id.edit); + final MaterialBetterSpinner spinner = (MaterialBetterSpinner) view.findViewById(R.id.spinner); + final List tempNotebooks = new ArrayList<>(); + tempNotebooks.clear(); + tempNotebooks.addAll(notebooks); + Notebook rootNoteBook = new Notebook(); + rootNoteBook.setTitle(mActivity.getString(R.string.notebook_default_root_notebook_title)); + tempNotebooks.add(0, rootNoteBook); + SpinnerArrayAdapter adapter = new SpinnerArrayAdapter(view.getContext(), tempNotebooks) { + @Override + public String itemToString(Notebook item) { + return item.getTitle(); + } + }; + spinner.setAdapter(adapter); + spinner.setText(rootNoteBook.getTitle()); new AlertDialog.Builder(mActivity) .setTitle(R.string.add_notebook) .setView(view) @@ -308,12 +323,21 @@ public class Navigation { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); - addNotebook(mEdit.getText().toString(), parentNotebookId); + addNotebook(mEdit.getText().toString(), getNotebookId(tempNotebooks, spinner.getText().toString())); } }) .show(); } + private String getNotebookId(List notebooks, String title) { + for (Notebook notebook : notebooks) { + if (TextUtils.equals(notebook.getTitle(), title)) { + return notebook.getNotebookId(); + } + } + return ""; + } + @Override public void onEditNotebook(final Notebook notebook) { View view = LayoutInflater.from(mActivity).inflate(R.layout.dialog_sigle_edittext, null); diff --git a/app/src/main/java/org/houxg/leamonax/utils/DialogUtils.java b/app/src/main/java/org/houxg/leamonax/utils/DialogUtils.java index bd2dd99..7bdb2c4 100644 --- a/app/src/main/java/org/houxg/leamonax/utils/DialogUtils.java +++ b/app/src/main/java/org/houxg/leamonax/utils/DialogUtils.java @@ -15,6 +15,8 @@ import org.houxg.leamonax.R; import org.houxg.leamonax.adapter.NotebookAdapter; import org.houxg.leamonax.model.Notebook; +import java.util.List; + public class DialogUtils { public static void editLink(Context context, String title, String link, @NonNull final ChangedListener listener) { @@ -72,7 +74,7 @@ public class DialogUtils { } @Override - public void onClickedAddNotebook(String parentNotebookId) { + public void onClickedAddNotebook(String parentNotebookId, List notebooks) { } diff --git a/app/src/main/java/org/houxg/leamonax/widget/spinner/SpinnerArrayAdapter.java b/app/src/main/java/org/houxg/leamonax/widget/spinner/SpinnerArrayAdapter.java new file mode 100644 index 0000000..02a6142 --- /dev/null +++ b/app/src/main/java/org/houxg/leamonax/widget/spinner/SpinnerArrayAdapter.java @@ -0,0 +1,181 @@ +package org.houxg.leamonax.widget.spinner; + + +import android.content.Context; +import android.os.Build; +import android.widget.ArrayAdapter; +import android.widget.Filter; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class SpinnerArrayAdapter extends ArrayAdapter.ItemProxy> { + + private NoFilter noFilter; + + public SpinnerArrayAdapter(Context context) { + this(context, new ArrayList()); + } + + public SpinnerArrayAdapter(Context context, List objects) { + super(context, android.R.layout.simple_spinner_dropdown_item); + setNotifyOnChange(false); + addAll(objects); + notifyDataSetChanged(); + } + + public SpinnerArrayAdapter(Context context, T[] objects) { + this(context, Arrays.asList(objects)); + } + + /** + *

For default, the ArrayAdapter uses toString() for item view, in somes cases when uses a framework like Realm Database, is not possible to overrides the toString() in model classes. + * Then, the proxy solutions has implemented. + *

This method encapsulates the original object into a proxy.

+ * + * @param objects + * @return + */ + private List wrapItems(List objects) { + List proxies = new ArrayList<>(objects.size()); + for (T item : objects) { + ItemProxy proxy = new ItemProxy(item); + proxies.add(proxy); + } + return proxies; + } + + /** + *

Converts the item to String.

+ *

Overrides this method for cutomize the text view.

+ * + * @param item + * @return + */ + public String itemToString(T item) { + return item.toString(); + } + + /** + *

Converts a String in object.

+ *

This method can be used to get selected item.

+ *

Example:

+ * + *
+     *
+     * MaterialBetterSpinner spPeople;
+     * SpinnerArrayAdapter adapterPeople;
+     * ....
+     * People pSelected = adapterPeople.stringToItem(spPeople.getText())
+     *
+     * 
+ *
+ * + * @param toString Selected text. + * @return Object converted from selected text. + */ + public T stringToItem(String toString) { + for (int i = 0; i < getCount(); i++) { + T item = getItem(i).object; + if (itemToString(item).equals(toString)) { + return item; + } + } + return null; + } + + /** + *

Converts a String in object.

+ *

This method can be used to get selected item.

+ *

Example:

+ * + *
+     *
+     * MaterialBetterSpinner spPeople;
+     * SpinnerArrayAdapter adapterPeople;
+     * ....
+     * People pSelected = adapterPeople.stringToItem(spPeople.getText())
+     *
+     * 
+ *
+ * + * @param toString Selected text. + * @return Object converted from selected text. + */ + public T stringToItem(CharSequence toString) { + return stringToItem(toString.toString()); + } + + public void addAll(List objects) { + clear(); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { + addAll(wrapItems(objects)); + } else { + for (ItemProxy p : wrapItems(objects)) { + add(p); + } + } + } + + /** + * Proxy for generic SpinnerArrayAdapter. + */ + public class ItemProxy { + public final T object; + + protected ItemProxy(T object) { + this.object = object; + } + + @Override + public String toString() { + return itemToString(object); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof SpinnerArrayAdapter.ItemProxy)) return false; + + ItemProxy itemProxy = (ItemProxy) o; + + return !(object != null ? !object.equals(itemProxy.object) : itemProxy.object != null); + } + + @Override + public int hashCode() { + return object != null ? object.hashCode() : 0; + } + } + + /** + * Override ArrayAdapter.getFilter() to return our own filtering. + */ + @Override + public Filter getFilter() { + if (noFilter == null) { + noFilter = new NoFilter(); + } + return noFilter; + } + + /** + * Class which does not perform any filtering. + * Filtering is already done by the web service when asking for the list, + * so there is no need to do any more as well. + * This way, ArrayAdapter.mOriginalValues is not used when calling e.g. + * ArrayAdapter.add(), but instead ArrayAdapter.mObjects is updated directly + * and methods like getCount() return the expected result. + */ + private class NoFilter extends Filter { + protected FilterResults performFiltering(CharSequence prefix) { + return new FilterResults(); + } + + protected void publishResults(CharSequence constraint, + FilterResults results) { + // Do nothing + } + } +} \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_add_notebook.xml b/app/src/main/res/layout/dialog_add_notebook.xml new file mode 100644 index 0000000..ebe934f --- /dev/null +++ b/app/src/main/res/layout/dialog_add_notebook.xml @@ -0,0 +1,21 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml index 0e2a310..64d2fee 100644 --- a/app/src/main/res/values-zh/strings.xml +++ b/app/src/main/res/values-zh/strings.xml @@ -110,4 +110,6 @@ 蚂蚁笔记探索 笔记本的名称不能为空 修改笔记本的名称 + 选择该笔记本所在的上一级笔记本目录 + 空目录(最顶层目录) \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 49c3a92..c4bae07 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -112,4 +112,6 @@ Leanote Explore the notebook title can\'t empty Update notebook title + 选择该笔记本所在的上一级笔记本目录 Choose current Notebook \'s parentNotebook directory + Empty directory