From 9beba839c13bd6e4f6eab579fec65f2a12fab599 Mon Sep 17 00:00:00 2001 From: houxg Date: Wed, 30 Nov 2016 14:40:29 +0800 Subject: [PATCH] support show notes by tag --- .../leamonax/adapter/NotebookAdapter.java | 14 +-- .../houxg/leamonax/adapter/TagAdapter.java | 92 ++++++++++++++++++ .../houxg/leamonax/database/AppDataBase.java | 24 +++++ .../org/houxg/leamonax/ui/MainActivity.java | 76 +++++++++++---- .../org/houxg/leamonax/ui/NoteFragment.java | 60 +++++++++--- app/src/main/res/drawable-xxhdpi/ic_add.png | Bin 0 -> 1183 bytes app/src/main/res/drawable-xxhdpi/ic_tag.png | Bin 0 -> 545 bytes .../main/res/drawable-xxhdpi/ic_tag_book.png | Bin 0 -> 631 bytes app/src/main/res/layout/item_tag.xml | 29 ++++++ app/src/main/res/layout/navigation.xml | 64 ++++++++++-- app/src/main/res/values/strings.xml | 1 + 11 files changed, 311 insertions(+), 49 deletions(-) create mode 100644 app/src/main/java/org/houxg/leamonax/adapter/TagAdapter.java create mode 100644 app/src/main/res/drawable-xxhdpi/ic_add.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_tag.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_tag_book.png create mode 100644 app/src/main/res/layout/item_tag.xml 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 b076757..56c18ae 100644 --- a/app/src/main/java/org/houxg/leamonax/adapter/NotebookAdapter.java +++ b/app/src/main/java/org/houxg/leamonax/adapter/NotebookAdapter.java @@ -25,7 +25,7 @@ public class NotebookAdapter extends RecyclerView.Adapter mStack; + private Stack mStack = new Stack<>(); private List mData; private NotebookAdapterListener mListener; @@ -33,21 +33,15 @@ public class NotebookAdapter extends RecyclerView.Adapter(); - notifyDataSetChanged(); - } - - public void reload() { + public void refresh() { if (mStack.isEmpty()) { - init(); + mData = AppDataBase.getRootNotebooks(AccountService.getCurrent().getUserId()); } else { Notebook parent = mData.get(0); mData = AppDataBase.getChildNotebook(mStack.peek(), AccountService.getCurrent().getUserId()); mData.add(0, parent); - notifyDataSetChanged(); } + notifyDataSetChanged(); } private String getCurrentParentId() { diff --git a/app/src/main/java/org/houxg/leamonax/adapter/TagAdapter.java b/app/src/main/java/org/houxg/leamonax/adapter/TagAdapter.java new file mode 100644 index 0000000..7dfd325 --- /dev/null +++ b/app/src/main/java/org/houxg/leamonax/adapter/TagAdapter.java @@ -0,0 +1,92 @@ +package org.houxg.leamonax.adapter; + + +import android.support.v7.widget.RecyclerView; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import org.houxg.leamonax.R; +import org.houxg.leamonax.database.AppDataBase; +import org.houxg.leamonax.model.Tag; +import org.houxg.leamonax.service.AccountService; + +import java.util.ArrayList; +import java.util.List; + +import butterknife.BindView; +import butterknife.ButterKnife; + +public class TagAdapter extends RecyclerView.Adapter { + + private List mData; + private TagAdapterListener mListener; + + public void setListener(TagAdapterListener listener) { + mListener = listener; + } + + public void refresh() { + mData = AppDataBase.getAllTags(AccountService.getCurrent().getUserId()); + notifyDataSetChanged(); + } + + public void toggle() { + int size = getItemCount(); + if (size == 0) { + mData = AppDataBase.getAllTags(AccountService.getCurrent().getUserId()); + int newSize = getItemCount(); + if (newSize != 0) { + notifyItemRangeInserted(0, newSize); + } else { + notifyDataSetChanged(); + } + } else { + mData = new ArrayList<>(); + notifyItemRangeRemoved(0, size); + } + } + + @Override + public TagHolder onCreateViewHolder(ViewGroup parent, int viewType) { + View view; + view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_tag, parent, false); + return new TagHolder(view); + } + + @Override + public void onBindViewHolder(TagHolder holder, int position) { + final Tag tag = mData.get(position); + holder.titleTv.setText(tag.getText()); + holder.titleTv.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (mListener != null) { + mListener.onClickedTag(tag); + } + } + }); + } + + @Override + public int getItemCount() { + return mData == null ? 0 : mData.size(); + } + + public interface TagAdapterListener { + void onClickedTag(Tag tag); + } + + static class TagHolder extends RecyclerView.ViewHolder { + View itemView; + @BindView(R.id.tv_title) + TextView titleTv; + + public TagHolder(View itemView) { + super(itemView); + this.itemView = itemView; + ButterKnife.bind(this, itemView); + } + } +} \ No newline at end of file diff --git a/app/src/main/java/org/houxg/leamonax/database/AppDataBase.java b/app/src/main/java/org/houxg/leamonax/database/AppDataBase.java index d26fc36..0a232e1 100644 --- a/app/src/main/java/org/houxg/leamonax/database/AppDataBase.java +++ b/app/src/main/java/org/houxg/leamonax/database/AppDataBase.java @@ -9,6 +9,7 @@ import com.raizlabs.android.dbflow.annotation.Migration; import com.raizlabs.android.dbflow.sql.language.Join; import com.raizlabs.android.dbflow.sql.language.NameAlias; import com.raizlabs.android.dbflow.sql.language.SQLite; +import com.raizlabs.android.dbflow.sql.language.property.IProperty; import com.raizlabs.android.dbflow.sql.migration.BaseMigration; import com.raizlabs.android.dbflow.structure.database.DatabaseWrapper; @@ -115,6 +116,14 @@ public class AppDataBase { .queryList(); } + public static List getNotesByTagText(String tagText, String userId) { + Tag tag = getTagByText(tagText, userId); + if (tag == null) { + return new ArrayList<>(); + } + return getNotesByTagId(tag.getId()); + } + public static List getAllNotes(String userId) { return SQLite.select() .from(Note.class) @@ -225,6 +234,21 @@ public class AppDataBase { .queryList(); } + public static List getNotesByTagId(long tagId) { + IProperty[] properties = Note_Table.ALL_COLUMN_PROPERTIES; + NameAlias nameAlias = NameAlias.builder("N").build(); + for (int i = 0; i < properties.length; i++) { + properties[i] = properties[i].withTable(nameAlias); + } + return SQLite.select(properties) + .from(Note.class).as("N") + .join(RelationshipOfNoteTag.class, Join.JoinType.INNER).as("R") + .on(Tag_Table.id.withTable(NameAlias.builder("N").build()) + .eq(RelationshipOfNoteTag_Table.noteLocalId.withTable(NameAlias.builder("R").build()))) + .where(RelationshipOfNoteTag_Table.tagLocalId.withTable(NameAlias.builder("R").build()).eq(tagId)) + .queryList(); + } + public static RelationshipOfNoteTag getRelationShip(long noteLocalId, long tagId, String userId) { return SQLite.select() .from(RelationshipOfNoteTag.class) diff --git a/app/src/main/java/org/houxg/leamonax/ui/MainActivity.java b/app/src/main/java/org/houxg/leamonax/ui/MainActivity.java index 1982fb1..ba525fe 100644 --- a/app/src/main/java/org/houxg/leamonax/ui/MainActivity.java +++ b/app/src/main/java/org/houxg/leamonax/ui/MainActivity.java @@ -29,10 +29,12 @@ import org.greenrobot.eventbus.Subscribe; import org.greenrobot.eventbus.ThreadMode; import org.houxg.leamonax.R; import org.houxg.leamonax.adapter.NotebookAdapter; +import org.houxg.leamonax.adapter.TagAdapter; import org.houxg.leamonax.model.Account; import org.houxg.leamonax.model.Note; import org.houxg.leamonax.model.Notebook; import org.houxg.leamonax.model.SyncEvent; +import org.houxg.leamonax.model.Tag; import org.houxg.leamonax.model.User; import org.houxg.leamonax.service.AccountService; import org.houxg.leamonax.service.NotebookService; @@ -48,7 +50,7 @@ import rx.Subscriber; import rx.android.schedulers.AndroidSchedulers; import rx.schedulers.Schedulers; -public class MainActivity extends BaseActivity implements NotebookAdapter.NotebookAdapterListener { +public class MainActivity extends BaseActivity implements NotebookAdapter.NotebookAdapterListener, TagAdapter.TagAdapterListener { private static final String EXT_SHOULD_RELOAD = "ext_should_reload"; private static final String TAG_NOTE_FRAGMENT = "tag_note_fragment"; @@ -69,6 +71,10 @@ public class MainActivity extends BaseActivity implements NotebookAdapter.Notebo View mNotebookTriangle; @BindView(R.id.rl_notebook_list) View mNotebookPanel; + @BindView(R.id.rv_tag) + RecyclerView mTagRv; + @BindView(R.id.iv_tag_triangle) + View mTagTriangle; public static Intent getOpenIntent(Context context, boolean shouldReload) { Intent intent = new Intent(context, MainActivity.class); @@ -91,23 +97,36 @@ public class MainActivity extends BaseActivity implements NotebookAdapter.Notebo } else { mNoteFragment = (NoteFragment) getFragmentManager().findFragmentByTag(TAG_NOTE_FRAGMENT); } - - mNotebookRv.setLayoutManager(new LinearLayoutManager(this)); - NotebookAdapter adapter = new NotebookAdapter(); - adapter.setListener(this); - mNotebookRv.setAdapter(adapter); - adapter.init(); mEmailTv.setText(AccountService.getCurrent().getEmail()); - mNotebookTriangle.setTag(false); + initNotebookPanel(); + initTagPanel(); + refreshInfo(); fetchInfo(); EventBus.getDefault().register(this); } + private void initTagPanel() { + mTagRv.setLayoutManager(new LinearLayoutManager(this)); + TagAdapter tagAdapter = new TagAdapter(); + tagAdapter.setListener(this); + mTagRv.setAdapter(tagAdapter); + mTagTriangle.setTag(false); + } + + private void initNotebookPanel() { + mNotebookRv.setLayoutManager(new LinearLayoutManager(this)); + NotebookAdapter notebookAdapter = new NotebookAdapter(); + notebookAdapter.setListener(this); + mNotebookRv.setAdapter(notebookAdapter); + notebookAdapter.refresh(); + mNotebookTriangle.setTag(false); + } + @Override protected void onResume() { super.onResume(); - ((NotebookAdapter) mNotebookRv.getAdapter()).reload(); + ((NotebookAdapter) mNotebookRv.getAdapter()).refresh(); } @Override @@ -185,7 +204,7 @@ public class MainActivity extends BaseActivity implements NotebookAdapter.Notebo @Override public void onClickedNotebook(Notebook notebook) { - mNoteFragment.loadNoteFromLocal(notebook.getId()); + mNoteFragment.loadFromNotebook(notebook.getId()); mDrawerLayout.closeDrawer(GravityCompat.START, true); } @@ -233,7 +252,7 @@ public class MainActivity extends BaseActivity implements NotebookAdapter.Notebo @Override public void onNext(Void isSucceed) { - ((NotebookAdapter) mNotebookRv.getAdapter()).reload(); + ((NotebookAdapter) mNotebookRv.getAdapter()).refresh(); } }); } @@ -251,7 +270,7 @@ public class MainActivity extends BaseActivity implements NotebookAdapter.Notebo @OnClick(R.id.rl_recent_notes) void showRecentNote() { - mNoteFragment.loadNoteFromLocal(NoteFragment.RECENT_NOTES); + mNoteFragment.loadRecentNotes(); mDrawerLayout.closeDrawer(GravityCompat.START, true); } @@ -271,25 +290,44 @@ public class MainActivity extends BaseActivity implements NotebookAdapter.Notebo void toggleNotebook() { boolean shouldShowNotebook = (boolean) mNotebookTriangle.getTag(); shouldShowNotebook = !shouldShowNotebook; - if (shouldShowNotebook) { - mNotebookTriangle.animate() - .rotation(180) + animateTriangle(mNotebookTriangle, shouldShowNotebook); + mNotebookPanel.setVisibility(shouldShowNotebook ? View.VISIBLE : View.GONE); + mNotebookTriangle.setTag(shouldShowNotebook); + } + + @OnClick(R.id.rl_tag) + void toggleTag() { + boolean shouldShowTag = (boolean) mTagTriangle.getTag(); + shouldShowTag = !shouldShowTag; + animateTriangle(mTagTriangle, shouldShowTag); + ((TagAdapter) mTagRv.getAdapter()).toggle(); + mTagTriangle.setTag(shouldShowTag); + } + + private void animateTriangle(View triangle, boolean isOpen) { + if (isOpen) { + triangle.animate() + .rotation(-180) .setDuration(200) .setInterpolator(new AccelerateDecelerateInterpolator()) .start(); } else { - mNotebookTriangle.animate() + triangle.animate() .rotation(0) .setDuration(200) .setInterpolator(new AccelerateDecelerateInterpolator()) .start(); } - mNotebookPanel.setVisibility(shouldShowNotebook ? View.VISIBLE : View.GONE); - mNotebookTriangle.setTag(shouldShowNotebook); } @Subscribe(threadMode = ThreadMode.MAIN) public void onEvent(SyncEvent event) { - ((NotebookAdapter) mNotebookRv.getAdapter()).reload(); + ((NotebookAdapter) mNotebookRv.getAdapter()).refresh(); + } + + @Override + public void onClickedTag(Tag tag) { + mNoteFragment.loadFromTag(tag.getText()); + mDrawerLayout.closeDrawer(GravityCompat.START, true); } } 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 41339ab..1307cf4 100644 --- a/app/src/main/java/org/houxg/leamonax/ui/NoteFragment.java +++ b/app/src/main/java/org/houxg/leamonax/ui/NoteFragment.java @@ -48,7 +48,7 @@ public class NoteFragment extends Fragment implements NoteAdapter.NoteAdapterLis private static final String EXT_SCROLL_POSITION = "ext_scroll_position"; private static final String EXT_SHOULD_FETCH_NOTES = "ext_should_fetch_notes"; - public static final int RECENT_NOTES = -1; + Mode mCurrentMode = Mode.RECENT_NOTES; @BindView(R.id.recycler_view) RecyclerView mNoteListView; @@ -58,7 +58,6 @@ public class NoteFragment extends Fragment implements NoteAdapter.NoteAdapterLis List mNotes; private NoteAdapter mAdapter; - private long mCurrentNotebookId = RECENT_NOTES; private float mScrollPosition; public NoteFragment() { @@ -123,7 +122,7 @@ public class NoteFragment extends Fragment implements NoteAdapter.NoteAdapterLis super.onActivityCreated(savedInstanceState); EventBus.getDefault().register(this); if (savedInstanceState == null) { - loadNoteFromLocal(RECENT_NOTES); + refreshNotes(); if (getArguments().getBoolean(EXT_SHOULD_FETCH_NOTES, false)) { mSwipeRefresh.postDelayed(new Runnable() { @Override @@ -144,7 +143,7 @@ public class NoteFragment extends Fragment implements NoteAdapter.NoteAdapterLis public void onResume() { super.onResume(); mNoteListView.scrollTo(0, (int) mScrollPosition); - loadNoteFromLocal(mCurrentNotebookId); + refreshNotes(); } @Override @@ -159,13 +158,33 @@ public class NoteFragment extends Fragment implements NoteAdapter.NoteAdapterLis EventBus.getDefault().unregister(this); } - public void loadNoteFromLocal(long notebookLocalId) { - if (notebookLocalId < 0) { - mCurrentNotebookId = RECENT_NOTES; - mNotes = AppDataBase.getAllNotes(AccountService.getCurrent().getUserId()); - } else { - mCurrentNotebookId = notebookLocalId; - mNotes = AppDataBase.getNotesFromNotebook(AccountService.getCurrent().getUserId(), notebookLocalId); + public void loadRecentNotes() { + mCurrentMode = Mode.RECENT_NOTES; + refreshNotes(); + } + + public void loadFromNotebook(long notebookId) { + mCurrentMode = Mode.NOTEBOOK; + mCurrentMode.notebookId = notebookId; + refreshNotes(); + } + + public void loadFromTag(String tagText) { + mCurrentMode = Mode.TAG; + mCurrentMode.tagText = tagText; + refreshNotes(); + } + + private void refreshNotes() { + switch (mCurrentMode) { + case RECENT_NOTES: + mNotes = AppDataBase.getAllNotes(AccountService.getCurrent().getUserId()); + break; + case NOTEBOOK: + mNotes = AppDataBase.getNotesFromNotebook(AccountService.getCurrent().getUserId(), mCurrentMode.notebookId); + break; + case TAG: + mNotes = AppDataBase.getNotesByTagText(mCurrentMode.tagText, AccountService.getCurrent().getUserId()); } Collections.sort(mNotes, new Note.UpdateTimeComparetor()); mAdapter.load(mNotes); @@ -225,10 +244,27 @@ public class NoteFragment extends Fragment implements NoteAdapter.NoteAdapterLis Log.i(TAG, "RequestNotes rcv: isSucceed=" + event.isSucceed()); if (isAdded()) { mSwipeRefresh.setRefreshing(false); - loadNoteFromLocal(mCurrentNotebookId); + refreshNotes(); if (!event.isSucceed()) { ToastUtils.show(getActivity(), R.string.sync_notes_failed); } } } + + private enum Mode { + RECENT_NOTES, + NOTEBOOK, + TAG; + + long notebookId; + String tagText; + + public void setNotebookId(long notebookId) { + this.notebookId = notebookId; + } + + public void setTagText(String tagText) { + this.tagText = tagText; + } + } } diff --git a/app/src/main/res/drawable-xxhdpi/ic_add.png b/app/src/main/res/drawable-xxhdpi/ic_add.png new file mode 100644 index 0000000000000000000000000000000000000000..bfadffd770124a3899ccbd59ff44b07bdd5fac44 GIT binary patch literal 1183 zcmV;Q1YrA#P)Px(SxH1eRA>d=TE9yiK@|4ZO+Zjft9Y0~1Y?m#Fi0T!CrG?PMX)fWP0BQ4lhSk{ z#6l3YxCH+M4FpL*ixg2J7KSsGr3ykgy?o!^%rbkovp>$g?9L9HGy7)d&G+rRH_pzR zLPs0Y`ucibXJ_Z5o12>shs0ohlRxlXxDEqZfUS&}YZC?d_SFnJ;**#p&7HK?s$ zU2I|-8ynBz7jL0#&`)6-WGC>&H*<4ypX2C`ObljsA7=Lf$`|4ckYL+2nCDBF=iewg zBN5{&2ea6Q!tp3d+t_9gCOQ>m6}7@ZY;JBoMw@;7(k4Zy#IP?g@mZS!XN(HqPhT-x z-C7MPRAAPw;CD}FXJ>!thSw6K`JvN3NELOR)0Bf;1>=wE%+l8sxlqujvPz0Cl-P)o zSp8nGFEO$DWx=QXFsrh0fmM|`?n@FA<2Kf-{BA3 zCbFZE4X{%1Ur;rb%$cBI=M~4bCRSwKxzdJ?y&$YOw%A&R>!_$c~D?~FZH-S z#tkh%EXfMfa$+Y3iQ6T{T{_-kTQ;&62T~` z@2NCjPQTz%C&n+|G|?nEw&dc>7#wdhN#$wkl3XnDNfPUfB2D07W5dUW$%!*I64uzj z`Vk9L$0M>_C33PcbptK1;x=g|Na1~_6h{Fztbfqnv(3`=7u&B`#GtE}J|<6Sb-GQI_c+VFiO9n+lNis^^Oi2@V+;_) zN^s78+J2NyTquN3xy|u0`v8l_6IT#W;8+3Gx~dBs3&C%6)-}+{$IvIz_mo)uJPQR$ zMeVNx5F$Ut3$=cQG%~K5;VFypDdUib0467k=W;Mdo^#|PkqbFF%RTIUCl{tPjNwrb^Bj>GO7u){seeJkF1g;X8cIfmy(+lWiLr(;UkK0DRwk8+og5@) z#}xU%KsFq2Syq^q6T2FW_Z)E_930#`L;|TKPlHoA;`R{ZEafFA;hLf}JrT87lg|d^ zYmJc>Vs0WvA*1ui_E^q%+7notVEPi{l>@9YygpQE>X8uvu@R&0dPI|tskluJuKUiI zB*&;cqw`ssIbsRBF+lu*#MnSwIT%GT3qD5-qe0goh?yzS6zfgue;J(@f$RlU{vXT9 zUpZ32=kAi2N-mez`c#69`HJx9BIK={CaLOVIlYUR5`oOI0nOLdSxKxhXM75>5iHF^ xAU%LG;{)<2-MQ?HIv)ESL;jOz6vz`z{{VV@-9RBo#B%@u002ovPDHLkV1i+NG|&J5 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_tag.png b/app/src/main/res/drawable-xxhdpi/ic_tag.png new file mode 100644 index 0000000000000000000000000000000000000000..a89cd5b00297c8c5cc97374f1947651d55fbe11f GIT binary patch literal 545 zcmV++0^a?JP)Px$+et)0R9Fe^S-(reKos_pYFpf#ihqG*QK8hXZX&MjlI%LU*gwF@$*GefI22-` zoptmNC6CM8LK_`Q-yX)MVrv_0e(x*_ zg&mH^XnR7b&?63uD3cr-P3K^=vlV z2B1Hg34vY%;Em^b72MrlVuBK9l2nX^(zH#}tlPHTNjpIZ+(kS-C%7eC-4nnHh}cRR zBMI0%xst|>wTBCGz+x?p%=3UH$`zYAr6aA(zrYriDPx%F-b&0RA>e5nmtbfK@f(y0|^8ROFyVA?MzIJC6x^n6kJ0BiT(gfEiJY52WSEb z%~?=DV?}LZ0*$Q=_)%I&AjpUB7|&c*V8va`lFTL-c4l^V-+OK@VJ~Y1e63tAue96k z>XPkeU4==8ZcxKudl^ALDYFK5Sf6ZmV z^Ty4DnXo{BOF{sm-DJYrkqQ$sVF8GClL>1_Don_P1t8kZ&@3}zvzo+CvzdRT8CAX%oAN3Kpzj3$%rQ{-@1m^PX-%hlp9`m`b=-t3_I^)^WezKf$CC z|HKf!3A=(Dsp5mjQ8t@>@W0AY$-hYi!WhfOtibUZJ%N64z9UThaP7d zVS4@BswTAqrC)X(Nq+Pr-E317B5Auph~3Sfe8}Dbh%~zR&!Su?UBhJ^ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/navigation.xml b/app/src/main/res/layout/navigation.xml index db2aa78..47f326b 100644 --- a/app/src/main/res/layout/navigation.xml +++ b/app/src/main/res/layout/navigation.xml @@ -1,8 +1,8 @@ + android:textSize="14sp" + tools:text="exercitation" /> + android:textSize="14sp" + tools:text="quis@incididunt.com" /> @@ -89,16 +89,17 @@ android:layout_height="wrap_content" android:layout_alignParentStart="true" android:layout_centerVertical="true" - android:src="@drawable/ic_folder" /> + android:src="@drawable/ic_folder" + android:visibility="gone" /> @@ -126,10 +127,57 @@ + + + + + + + + + + + + + + + Change password successful Change user name successful Search + Notebooks