diff --git a/app/src/main/java/org/houxg/leamonax/model/Note.java b/app/src/main/java/org/houxg/leamonax/model/Note.java index 2f03bd0..47db184 100644 --- a/app/src/main/java/org/houxg/leamonax/model/Note.java +++ b/app/src/main/java/org/houxg/leamonax/model/Note.java @@ -342,7 +342,7 @@ public class Note extends BaseModel implements Serializable { return msg; } - public static class UpdateTimeComparetor implements Comparator { + public static class UpdateTimeDescComparetor implements Comparator { @Override public int compare(Note lhs, Note rhs) { long lTime = lhs.getUpdatedTimeVal(); @@ -356,4 +356,68 @@ public class Note extends BaseModel implements Serializable { } } } + + public static class UpdateTimeAscComparetor implements Comparator { + @Override + public int compare(Note lhs, Note rhs) { + long lTime = lhs.getUpdatedTimeVal(); + long rTime = rhs.getUpdatedTimeVal(); + if (lTime > rTime) { + return 1; + } else if (lTime < rTime) { + return -1; + } else { + return 0; + } + } + } + + public static class CreateTimeDescComparetor implements Comparator { + @Override + public int compare(Note lhs, Note rhs) { + long lTime = lhs.getCreatedTimeVal(); + long rTime = rhs.getCreatedTimeVal(); + if (lTime > rTime) { + return -1; + } else if (lTime < rTime) { + return 1; + } else { + return 0; + } + } + } + + public static class CreateTimeAscComparetor implements Comparator { + @Override + public int compare(Note lhs, Note rhs) { + long lTime = lhs.getCreatedTimeVal(); + long rTime = rhs.getCreatedTimeVal(); + if (lTime > rTime) { + return 1; + } else if (lTime < rTime) { + return -1; + } else { + return 0; + } + } + } + + public static class TitleDescComparetor implements Comparator { + @Override + public int compare(Note lhs, Note rhs) { + String lTitle = lhs.getTitle(); + String rTitle = rhs.getTitle(); + return lTitle.compareTo(rTitle); + } + } + + public static class TitleAscComparetor implements Comparator { + @Override + public int compare(Note lhs, Note rhs) { + String lTitle = lhs.getTitle(); + String rTitle = rhs.getTitle(); + return rTitle.compareTo(lTitle); + } + } + } diff --git a/app/src/main/java/org/houxg/leamonax/ui/BaseActivity.java b/app/src/main/java/org/houxg/leamonax/ui/BaseActivity.java index 4bf4e9e..b706c30 100644 --- a/app/src/main/java/org/houxg/leamonax/ui/BaseActivity.java +++ b/app/src/main/java/org/houxg/leamonax/ui/BaseActivity.java @@ -13,6 +13,7 @@ import org.houxg.leamonax.R; public class BaseActivity extends AppCompatActivity { + private Toolbar mToolbar; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -26,8 +27,13 @@ public class BaseActivity extends AppCompatActivity { initToolBar(toolbar, false); } + public Toolbar getToolbar() { + return mToolbar; + } + protected void initToolBar(Toolbar toolbar, boolean hasBackArrow) { if (toolbar != null) { + mToolbar = toolbar; setSupportActionBar(toolbar); toolbar.setTitleTextColor(0xffFAFAFA); toolbar.setTitle(getTitle()); diff --git a/app/src/main/java/org/houxg/leamonax/ui/NoteFragment.java b/app/src/main/java/org/houxg/leamonax/ui/NoteFragment.java index e4efda3..23f9064 100644 --- a/app/src/main/java/org/houxg/leamonax/ui/NoteFragment.java +++ b/app/src/main/java/org/houxg/leamonax/ui/NoteFragment.java @@ -7,12 +7,14 @@ import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.support.v7.widget.RecyclerView; +import android.support.v7.widget.Toolbar; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; +import android.widget.AdapterView; import org.greenrobot.eventbus.EventBus; import org.houxg.leamonax.Leamonax; @@ -28,9 +30,11 @@ import org.houxg.leamonax.utils.NetworkUtils; import org.houxg.leamonax.utils.SharedPreferenceUtils; import org.houxg.leamonax.utils.ToastUtils; import org.houxg.leamonax.widget.NoteList; +import org.houxg.leamonax.widget.SelectPopupWindow; import java.util.ArrayList; import java.util.Collections; +import java.util.Comparator; import java.util.List; import butterknife.BindView; @@ -57,6 +61,7 @@ public class NoteFragment extends Fragment implements NoteAdapter.NoteAdapterLis NoteList mNoteList; Mode mCurrentMode; OnSearchFinishListener mOnSearchFinishListener; + private int mSortType = -1; public void setOnSearchFinishListener(OnSearchFinishListener onSearchFinishListener) { this.mOnSearchFinishListener = onSearchFinishListener; @@ -72,6 +77,7 @@ public class NoteFragment extends Fragment implements NoteAdapter.NoteAdapterLis @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); + mSortType = SharedPreferenceUtils.read(SharedPreferenceUtils.CONFIG, SelectPopupWindow.SP_SORT_TYPE, -1); setHasOptionsMenu(true); } @@ -86,10 +92,26 @@ public class NoteFragment extends Fragment implements NoteAdapter.NoteAdapterLis if (item.getItemId() == R.id.action_view_type) { mNoteList.toggleType(); SharedPreferenceUtils.write(SharedPreferenceUtils.CONFIG, SP_VIEW_TYPE, mNoteList.getType()); + } else if (item.getItemId() == R.id.action_view_more) { + final SelectPopupWindow popupWindow = new SelectPopupWindow(getContext()); + if (getActivity() instanceof BaseActivity) { + Toolbar toolbar = ((BaseActivity) getActivity()).getToolbar(); + popupWindow.setOnItemClickListener(new SelectPopupWindow.OnItemClickListener() { + @Override + public void onItemClick(AdapterView parent, View view, int value) { + mSortType = value; + renderNotes(); + popupWindow.dismiss(); + } + }); + popupWindow.showPopWindow(toolbar); + } } return super.onOptionsItemSelected(item); } + + @Nullable @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { @@ -148,13 +170,38 @@ public class NoteFragment extends Fragment implements NoteAdapter.NoteAdapterLis notes = new ArrayList<>(); } mNotes = notes; - Collections.sort(mNotes, new Note.UpdateTimeComparetor()); + renderNotes(); + } + + private void renderNotes() { + Collections.sort(mNotes, getComparatorBySortType(mSortType)); mNoteList.render(mNotes); if (mNotes.size() == 0 && mOnSearchFinishListener != null) { mOnSearchFinishListener.doSearchFinish(); } } + private Comparator getComparatorBySortType(int sortType) { + switch (sortType) { + case 1: + return new Note.CreateTimeAscComparetor(); + case 2: + return new Note.CreateTimeDescComparetor(); + case 3: + return new Note.UpdateTimeAscComparetor(); + case 4: + return new Note.UpdateTimeDescComparetor(); + case 5: + return new Note.TitleAscComparetor(); + case 6: + return new Note.TitleDescComparetor(); + default: + return new Note.UpdateTimeDescComparetor(); + } + + } + + @Override public void onClickNote(Note note) { if (mActionModeHandler.isActionMode()) { diff --git a/app/src/main/java/org/houxg/leamonax/widget/SelectPopupWindow.java b/app/src/main/java/org/houxg/leamonax/widget/SelectPopupWindow.java new file mode 100644 index 0000000..74a9768 --- /dev/null +++ b/app/src/main/java/org/houxg/leamonax/widget/SelectPopupWindow.java @@ -0,0 +1,115 @@ +package org.houxg.leamonax.widget; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.support.v7.widget.ListPopupWindow; +import android.view.Gravity; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.AdapterView; +import android.widget.BaseAdapter; +import android.widget.ImageView; +import android.widget.TextView; + +import org.houxg.leamonax.R; +import org.houxg.leamonax.utils.DisplayUtils; +import org.houxg.leamonax.utils.SharedPreferenceUtils; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class SelectPopupWindow extends ListPopupWindow { + public static final String SP_SORT_TYPE = "sp_sort_type"; + private Context mContext; + private OnItemClickListener mOnItemClickListener; + private Adapter mAdapter; + private int mChecked = -1; + + public void setOnItemClickListener(OnItemClickListener onItemClickListener) { + this.mOnItemClickListener = onItemClickListener; + } + + public SelectPopupWindow(Context context) { + super(context); + this.mContext = context; + } + + @SuppressLint("RestrictedApi") + public void showPopWindow(View anchorView) { + String[] selectKey = mContext.getResources().getStringArray(R.array.select_key); + final String[] selectValue = mContext.getResources().getStringArray(R.array.select_value); + mAdapter = new Adapter(); + mAdapter.setDatas(new ArrayList<>(Arrays.asList(selectKey))); + mChecked = SharedPreferenceUtils.read(SharedPreferenceUtils.CONFIG, SP_SORT_TYPE, mChecked); + mAdapter.setChecked(mChecked); + setAdapter(mAdapter); + setWidth(DisplayUtils.dp2px(180)); + setHeight(ViewGroup.LayoutParams.WRAP_CONTENT); + setDropDownGravity(Gravity.END); + setAnchorView(anchorView); + setOverlapAnchor(true); + setModal(true); + setOnItemClickListener(new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView parent, View view, int position, long id) { + int value = Integer.valueOf(selectValue[position]); + SharedPreferenceUtils.write(SharedPreferenceUtils.CONFIG, SP_SORT_TYPE, value); + if (mOnItemClickListener != null) { + mOnItemClickListener.onItemClick(parent, view, value); + } + } + }); + show(); + } + + class Adapter extends BaseAdapter { + List datas = new ArrayList<>(); + private int checked = -1; + + void setDatas(List datas) { + this.datas = datas; + } + + @Override + public int getCount() { + return datas.size(); + } + + @Override + public String getItem(int position) { + return datas.get(position); + } + + @Override + public long getItemId(int position) { + return position; + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + if (convertView == null) { + convertView = LayoutInflater.from(parent.getContext()).inflate(R.layout.simple_list_item_1, parent, false); + } + ImageView checkView = convertView.findViewById(R.id.check); + TextView textView = convertView.findViewById(android.R.id.text1); + if (checked == (position + 1)) { + checkView.setVisibility(View.VISIBLE); + } else { + checkView.setVisibility(View.INVISIBLE); + } + textView.setText(getItem(position)); + return convertView; + } + + public void setChecked(int checked) { + this.checked = checked; + } + } + + public interface OnItemClickListener { + void onItemClick(AdapterView parent, View view, int value); + } + +} diff --git a/app/src/main/res/drawable-xxhdpi/ic_menu_more.png b/app/src/main/res/drawable-xxhdpi/ic_menu_more.png new file mode 100644 index 0000000..9f6fcec Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_menu_more.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_pop_checked.png b/app/src/main/res/drawable-xxhdpi/ic_pop_checked.png new file mode 100644 index 0000000..0e378b6 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_pop_checked.png differ diff --git a/app/src/main/res/layout/simple_list_item_1.xml b/app/src/main/res/layout/simple_list_item_1.xml new file mode 100644 index 0000000..22606a2 --- /dev/null +++ b/app/src/main/res/layout/simple_list_item_1.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + diff --git a/app/src/main/res/menu/note.xml b/app/src/main/res/menu/note.xml index 46f0eff..3d0a1c9 100644 --- a/app/src/main/res/menu/note.xml +++ b/app/src/main/res/menu/note.xml @@ -7,4 +7,10 @@ android:icon="@drawable/ic_view_type" android:title="@string/view_type" app:showAsAction="always"/> + + \ No newline at end of file diff --git a/app/src/main/res/values-zh/arrays.xml b/app/src/main/res/values-zh/arrays.xml new file mode 100644 index 0000000..0a57899 --- /dev/null +++ b/app/src/main/res/values-zh/arrays.xml @@ -0,0 +1,20 @@ + + + + 按创建时间-升序 + 按创建时间-降序 + 按更新时间-升序 + 按更新时间-降序 + 按标题-升序 + 按标题-降序 + + + + 1 + 2 + 3 + 4 + 5 + 6 + + \ No newline at end of file diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml new file mode 100644 index 0000000..12f694c --- /dev/null +++ b/app/src/main/res/values/arrays.xml @@ -0,0 +1,20 @@ + + + + Date Created-ASC + Date Created-DESC + Date Updated-ASC + Date Updated-DESC + Title-ASC + Title-DESC + + + + 1 + 2 + 3 + 4 + 5 + 6 + + \ No newline at end of file