diff --git a/app/src/main/java/org/houxg/leamonax/adapter/NoteAdapter.java b/app/src/main/java/org/houxg/leamonax/adapter/NoteAdapter.java index 12d2f70..91dfa69 100644 --- a/app/src/main/java/org/houxg/leamonax/adapter/NoteAdapter.java +++ b/app/src/main/java/org/houxg/leamonax/adapter/NoteAdapter.java @@ -73,7 +73,7 @@ public class NoteAdapter extends RecyclerView.Adapter { } public void setSelected(Note note, boolean isSelected) { - if (!isSelected ) { + if (!isSelected) { mSelectedNotes.remove(note.getId()); notifyDataSetChanged(); } else if (!mSelectedNotes.contains(note.getId())){ diff --git a/app/src/main/java/org/houxg/leamonax/ui/CommandDialogFragment.java b/app/src/main/java/org/houxg/leamonax/ui/CommandDialogFragment.java new file mode 100644 index 0000000..605f882 --- /dev/null +++ b/app/src/main/java/org/houxg/leamonax/ui/CommandDialogFragment.java @@ -0,0 +1,167 @@ +package org.houxg.leamonax.ui; + +import android.os.Bundle; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.support.v4.app.DialogFragment; +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.view.Gravity; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.view.WindowManager; +import android.widget.ImageView; +import android.widget.TextView; + +import org.houxg.leamonax.R; +import org.houxg.leamonax.model.Note; +import org.houxg.leamonax.utils.ScreenUtils; +import org.houxg.leamonax.utils.SkinCompatUtils; + +import java.util.ArrayList; +import java.util.List; + +import butterknife.BindView; +import butterknife.ButterKnife; + +public class CommandDialogFragment extends DialogFragment { + public static final String TAG = "CommandDialogFragment"; + public static final String ARG_NOTE = "ARG_NOTE"; + @BindView(R.id.recycler_view) + RecyclerView mRecyclerView; + private Adapter mAdapter; + private int[] resIdList = new int[]{R.drawable.ic_share_black, R.drawable.ic_folder_open_black, R.drawable.ic_delete_black}; + private int[] resIdWhiteList = new int[]{R.drawable.ic_share_white, R.drawable.ic_folder_open_white, R.drawable.ic_delete_white}; + private String[] titleList = new String[]{"分享", "移动", "删除"}; + private OnItemClickListener mOnItemClickListener; + public void setOnItemClickListener(OnItemClickListener onItemClickListener) { + mOnItemClickListener = onItemClickListener; + } + + @Nullable + @Override + public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + View view = LayoutInflater.from(getContext()).inflate(R.layout.fragment_dialog_note, container, false); + ButterKnife.bind(this, view); + return view; + } + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + mAdapter = new Adapter(); + mAdapter.setData(generateData()); + mAdapter.setOnItemClickListener(new OnItemClickListener() { + @Override + public void onItemClick(View view, int position) { + if (mOnItemClickListener != null) { + mOnItemClickListener.onItemClick(view, position); + } + dismiss(); + } + }); + mRecyclerView.setAdapter(mAdapter); + mRecyclerView.setLayoutManager(new LinearLayoutManager(getContext())); + } + + @Override + public void onStart() { + super.onStart(); + getDialog().getWindow() + .setLayout(ScreenUtils.getScreenWidth(getContext()) * 4 / 5, + WindowManager.LayoutParams.WRAP_CONTENT); + getDialog().getWindow().setGravity(Gravity.CENTER); + getDialog().setCanceledOnTouchOutside(true); + } + + @Override + public void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setStyle(DialogFragment.STYLE_NORMAL, R.style.customDialogFragment); + } + + private List generateData() { + List itemList = new ArrayList<>(); + + for (int index = 0; index < resIdList.length; index++) { + CommandItem item = new CommandItem(); + item.resId = SkinCompatUtils.isThemeNight() ? resIdWhiteList[index] : resIdList[index]; + item.title = titleList[index]; + itemList.add(item); + } + return itemList; + } + + class CommandItem { + public int resId; + public String title; + } + + class Adapter extends RecyclerView.Adapter { + List itemList = new ArrayList<>(); + OnItemClickListener onItemClickListener; + + public void setOnItemClickListener(OnItemClickListener onItemClickListener) { + this.onItemClickListener = onItemClickListener; + } + + public void setData(List dataList) { + itemList = dataList; + } + + @NonNull + @Override + + public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.view_dialog_note_item, parent, false); + return new ViewHolder(view); + } + + @Override + public void onBindViewHolder(@NonNull final RecyclerView.ViewHolder holder, int position) { + ViewHolder viewHolder = (ViewHolder) holder; + CommandItem item = itemList.get(position); + viewHolder.iconView.setImageResource(item.resId); + viewHolder.titleView.setText(item.title); + if (onItemClickListener != null) { + viewHolder.rootView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + onItemClickListener.onItemClick(v, holder.getAdapterPosition()); + } + }); + } + } + + @Override + public int getItemCount() { + return itemList.size(); + } + } + + class ViewHolder extends RecyclerView.ViewHolder { + ImageView iconView; + TextView titleView; + View rootView; + + public ViewHolder(View itemView) { + super(itemView); + iconView = itemView.findViewById(R.id.icon); + titleView = itemView.findViewById(R.id.title); + rootView = itemView.findViewById(R.id.root_view); + } + } + + interface OnItemClickListener { + void onItemClick(View view, int position); + } + + public static CommandDialogFragment newInstance(Note note) { + CommandDialogFragment fragment = new CommandDialogFragment(); + Bundle args = new Bundle(); + args.putSerializable(ARG_NOTE, note); + fragment.setArguments(args); + return fragment; + } +} 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 1594b3c..77896d5 100644 --- a/app/src/main/java/org/houxg/leamonax/ui/NoteFragment.java +++ b/app/src/main/java/org/houxg/leamonax/ui/NoteFragment.java @@ -16,7 +16,6 @@ import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; -import org.greenrobot.eventbus.EventBus; import org.houxg.leamonax.Leamonax; import org.houxg.leamonax.R; import org.houxg.leamonax.adapter.NoteAdapter; @@ -24,8 +23,6 @@ import org.houxg.leamonax.database.NoteDataStore; import org.houxg.leamonax.model.Account; import org.houxg.leamonax.model.Note; import org.houxg.leamonax.service.NoteService; -import org.houxg.leamonax.utils.ActionModeHandler; -import org.houxg.leamonax.utils.CollectionUtils; import org.houxg.leamonax.utils.NetworkUtils; import org.houxg.leamonax.utils.SharedPreferenceUtils; import org.houxg.leamonax.utils.SkinCompatUtils; @@ -47,7 +44,7 @@ import rx.android.schedulers.AndroidSchedulers; import rx.functions.Func1; import rx.schedulers.Schedulers; -public class NoteFragment extends Fragment implements NoteAdapter.NoteAdapterListener, ActionModeHandler.Callback { +public class NoteFragment extends Fragment implements NoteAdapter.NoteAdapterListener { private static final String EXT_SCROLL_POSITION = "ext_scroll_position"; private static final String SP_VIEW_TYPE = "sp_viewType"; @@ -56,7 +53,6 @@ public class NoteFragment extends Fragment implements NoteAdapter.NoteAdapterLis RecyclerView mNoteListView; List mNotes; - ActionModeHandler mActionModeHandler; NoteList mNoteList; Mode mCurrentMode; OnSearchFinishListener mOnSearchFinishListener; @@ -121,23 +117,6 @@ public class NoteFragment extends Fragment implements NoteAdapter.NoteAdapterLis return view; } - @Override - public void onActivityCreated(Bundle savedInstanceState) { - super.onActivityCreated(savedInstanceState); - mActionModeHandler = new ActionModeHandler<>(getActivity(), this, R.menu.delete); - } - - @Override - public void onResume() { - super.onResume(); - } - - @Override - public void onDestroy() { - super.onDestroy(); - EventBus.getDefault().unregister(this); - } - public void setMode(Mode mode) { mCurrentMode = mode; List notes; @@ -194,22 +173,32 @@ public class NoteFragment extends Fragment implements NoteAdapter.NoteAdapterLis @Override public void onClickNote(Note note) { - if (mActionModeHandler.isActionMode()) { - boolean isSelected = mActionModeHandler.chooseItem(note); - mNoteList.setSelected(note, isSelected); - } else { - startActivity(NotePreviewActivity.getOpenIntent(getActivity(), note.getId())); - } + startActivity(NotePreviewActivity.getOpenIntent(getActivity(), note.getId())); } @Override public void onLongClickNote(final Note note) { - boolean isSelected = mActionModeHandler.chooseItem(note); - mNoteList.setSelected(note, isSelected); + CommandDialogFragment dialogFragment = CommandDialogFragment.newInstance(note); + dialogFragment.setOnItemClickListener(new CommandDialogFragment.OnItemClickListener() { + @Override + public void onItemClick(View view, int position) { + switch (position) { + case 0: + break; + case 1: + + break; + case 2: + showAlertDialog(note); + break; + } + } + }); + dialogFragment.show(getChildFragmentManager(), CommandDialogFragment.TAG); } - private void deleteNote(List notes) { - Observable.from(notes) + private void deleteNote(Note note) { + Observable.just(note) .flatMap(new Func1>() { @Override public rx.Observable call(final Note note) { @@ -225,12 +214,11 @@ public class NoteFragment extends Fragment implements NoteAdapter.NoteAdapterLis }); } }) - .buffer(notes.size()) - .flatMap(new Func1, Observable>() { + .flatMap(new Func1>() { @Override - public Observable call(List notes) { + public Observable call(Note note) { NetworkUtils.checkNetwork(); - return Observable.from(notes); + return Observable.just(note); } }) .flatMap(new Func1>() { @@ -277,16 +265,7 @@ public class NoteFragment extends Fragment implements NoteAdapter.NoteAdapterLis setMode(mCurrentMode); } - @Override - public boolean onAction(int actionId, List pendingItems) { - if (CollectionUtils.isEmpty(pendingItems)) { - ToastUtils.show(getActivity(), R.string.no_note_was_selected); - return false; - } - final List waitToDelete = new ArrayList<>(); - for (int i = 0; i < pendingItems.size(); i++) { - waitToDelete.add(pendingItems.get(i)); - } + private void showAlertDialog(final Note note) { new AlertDialog.Builder(getActivity()) .setTitle(R.string.delete_note) .setMessage(R.string.are_you_sure_to_delete_note) @@ -295,9 +274,7 @@ public class NoteFragment extends Fragment implements NoteAdapter.NoteAdapterLis @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); - mActionModeHandler.getPendingItems().clear(); - mActionModeHandler.dismiss(); - deleteNote(waitToDelete); + deleteNote(note); } }) .setNegativeButton(R.string.no, new DialogInterface.OnClickListener() { @@ -307,14 +284,6 @@ public class NoteFragment extends Fragment implements NoteAdapter.NoteAdapterLis } }) .show(); - return true; - } - - @Override - public void onDestroy(List pendingItems) { - if (CollectionUtils.isNotEmpty(pendingItems)) { - mNoteList.invalidateAllSelected(); - } } public enum Mode { diff --git a/app/src/main/java/org/houxg/leamonax/utils/ActionModeHandler.java b/app/src/main/java/org/houxg/leamonax/utils/ActionModeHandler.java deleted file mode 100644 index fff6494..0000000 --- a/app/src/main/java/org/houxg/leamonax/utils/ActionModeHandler.java +++ /dev/null @@ -1,107 +0,0 @@ -package org.houxg.leamonax.utils; - - -import android.app.Activity; -import android.graphics.PorterDuff; -import android.graphics.drawable.Drawable; -import android.os.Build; -import android.support.annotation.MenuRes; -import android.view.ActionMode; -import android.view.Menu; -import android.view.MenuItem; - -import org.houxg.leamonax.R; - -import java.util.ArrayList; -import java.util.List; - -public class ActionModeHandler { - private List mPendingItems; - private int mMenuId; - private Callback mCallback; - private ActionMode mActionMode; - private Activity mContext; - private ActionMode.Callback mActionCallback = new ActionMode.Callback() { - @Override - public boolean onCreateActionMode(ActionMode mode, Menu menu) { - mode.getMenuInflater().inflate(mMenuId, menu); - Drawable drawable = menu.findItem(R.id.action_delete).getIcon(); - if (drawable != null) { - // If we don't mutate the drawable, then all drawable's with this id will have a color - // filter applied to it. - drawable.mutate(); - drawable.setColorFilter(mContext.getResources().getColor(R.color.colorPrimaryDark), PorterDuff.Mode.SRC_ATOP); - drawable.setAlpha(255); - } - return true; - } - - @Override - public boolean onPrepareActionMode(ActionMode mode, Menu menu) { - return false; - } - - @Override - public boolean onActionItemClicked(ActionMode mode, MenuItem item) { - return mCallback.onAction(item.getItemId(), mPendingItems); - } - - @Override - public void onDestroyActionMode(ActionMode mode) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - mContext.getWindow().setStatusBarColor(mContext.getResources().getColor(R.color.colorPrimary)); - } - mCallback.onDestroy(mPendingItems); - mActionMode = null; - mPendingItems = null; - } - }; - - public ActionModeHandler(Activity activity, Callback callback, @MenuRes int menuId) { - mContext = activity; - mMenuId = menuId; - mCallback = callback; - } - - public List getPendingItems() { - return mPendingItems; - } - - /** - * - * @param item - * @return true if the item is in pending list, false for others. - */ - public boolean chooseItem(T item) { - if (isActionMode()) { - if (mPendingItems.contains(item)) { - mPendingItems.remove(item); - return false; - } else { - mPendingItems.add(item); - return true; - } - } else { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - mContext.getWindow().setStatusBarColor(mContext.getResources().getColor(R.color.colorPrimaryDark)); - } - mActionMode = mContext.startActionMode(mActionCallback); - mPendingItems = new ArrayList<>(); - mPendingItems.add(item); - return true; - } - } - - public void dismiss() { - mActionMode.finish(); - } - - public boolean isActionMode() { - return mActionMode != null; - } - - public interface Callback { - boolean onAction(int actionId, List pendingItems); - void onDestroy(List pendingItems); - } -} diff --git a/app/src/main/java/org/houxg/leamonax/utils/ScreenUtils.java b/app/src/main/java/org/houxg/leamonax/utils/ScreenUtils.java new file mode 100644 index 0000000..d7d41b2 --- /dev/null +++ b/app/src/main/java/org/houxg/leamonax/utils/ScreenUtils.java @@ -0,0 +1,52 @@ +package org.houxg.leamonax.utils; + + +import android.content.Context; +import android.graphics.Point; +import android.os.Build; +import android.view.WindowManager; + +public final class ScreenUtils { + + private ScreenUtils() { + throw new UnsupportedOperationException("u can't instantiate me..."); + } + + /** + * Return the width of screen, in pixel. + * + * @return the width of screen, in pixel + */ + public static int getScreenWidth(Context context) { + WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); + if (wm == null) { + return context.getResources().getDisplayMetrics().widthPixels; + } + Point point = new Point(); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { + wm.getDefaultDisplay().getRealSize(point); + } else { + wm.getDefaultDisplay().getSize(point); + } + return point.x; + } + + /** + * Return the height of screen, in pixel. + * + * @return the height of screen, in pixel + */ + public static int getScreenHeight(Context context) { + WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); + if (wm == null) { + return context.getResources().getDisplayMetrics().heightPixels; + } + Point point = new Point(); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { + wm.getDefaultDisplay().getRealSize(point); + } else { + wm.getDefaultDisplay().getSize(point); + } + return point.y; + } +} \ No newline at end of file diff --git a/app/src/main/res-night/drawable/bg_shape_radius_night.xml b/app/src/main/res-night/drawable/bg_shape_radius_night.xml new file mode 100644 index 0000000..e29c686 --- /dev/null +++ b/app/src/main/res-night/drawable/bg_shape_radius_night.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res-night/drawable/ic_check_black_night.xml b/app/src/main/res-night/drawable/ic_check_black_night.xml new file mode 100644 index 0000000..cb5c914 --- /dev/null +++ b/app/src/main/res-night/drawable/ic_check_black_night.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable-xxhdpi/ic_pop_checked.png b/app/src/main/res/drawable-xxhdpi/ic_pop_checked.png deleted file mode 100644 index 0e378b6..0000000 Binary files a/app/src/main/res/drawable-xxhdpi/ic_pop_checked.png and /dev/null differ diff --git a/app/src/main/res/drawable/bg_shape_radius.xml b/app/src/main/res/drawable/bg_shape_radius.xml new file mode 100644 index 0000000..ef3a0d9 --- /dev/null +++ b/app/src/main/res/drawable/bg_shape_radius.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_check_black.xml b/app/src/main/res/drawable/ic_check_black.xml new file mode 100644 index 0000000..3c6525c --- /dev/null +++ b/app/src/main/res/drawable/ic_check_black.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_delete_black.xml b/app/src/main/res/drawable/ic_delete_black.xml new file mode 100644 index 0000000..7ba675b --- /dev/null +++ b/app/src/main/res/drawable/ic_delete_black.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_delete_white.xml b/app/src/main/res/drawable/ic_delete_white.xml new file mode 100644 index 0000000..81dd8a5 --- /dev/null +++ b/app/src/main/res/drawable/ic_delete_white.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_folder_open_black.xml b/app/src/main/res/drawable/ic_folder_open_black.xml new file mode 100644 index 0000000..7403824 --- /dev/null +++ b/app/src/main/res/drawable/ic_folder_open_black.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_folder_open_white.xml b/app/src/main/res/drawable/ic_folder_open_white.xml new file mode 100644 index 0000000..20dd8ca --- /dev/null +++ b/app/src/main/res/drawable/ic_folder_open_white.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_share_black.xml b/app/src/main/res/drawable/ic_share_black.xml new file mode 100644 index 0000000..ca27afc --- /dev/null +++ b/app/src/main/res/drawable/ic_share_black.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_share_white.xml b/app/src/main/res/drawable/ic_share_white.xml new file mode 100644 index 0000000..1a9903c --- /dev/null +++ b/app/src/main/res/drawable/ic_share_white.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/layout/fragment_dialog_note.xml b/app/src/main/res/layout/fragment_dialog_note.xml new file mode 100644 index 0000000..b7aa3d1 --- /dev/null +++ b/app/src/main/res/layout/fragment_dialog_note.xml @@ -0,0 +1,11 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/simple_list_item_1.xml b/app/src/main/res/layout/simple_list_item_1.xml index 24d6637..55ed6a8 100644 --- a/app/src/main/res/layout/simple_list_item_1.xml +++ b/app/src/main/res/layout/simple_list_item_1.xml @@ -10,7 +10,7 @@ android:id="@+id/check" android:layout_width="36dp" android:scaleType="center" - android:src="@drawable/ic_pop_checked" + android:src="@drawable/ic_check_black" android:layout_height="match_parent" /> + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 35c73b7..3ccb918 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -62,4 +62,11 @@ @color/hint_text_light + +