From 6874a131fb286f8471e5294beb73a9021fd6a177 Mon Sep 17 00:00:00 2001 From: xingxing Date: Tue, 14 Feb 2017 22:47:05 +0800 Subject: [PATCH 1/3] fix add notebook but title is empty --- .../main/java/org/houxg/leamonax/ui/Navigation.java | 10 ++++++++-- app/src/main/res/values-zh/strings.xml | 1 + app/src/main/res/values/strings.xml | 1 + 3 files changed, 10 insertions(+), 2 deletions(-) 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 483b2d8..bfe4b27 100644 --- a/app/src/main/java/org/houxg/leamonax/ui/Navigation.java +++ b/app/src/main/java/org/houxg/leamonax/ui/Navigation.java @@ -35,6 +35,7 @@ import org.houxg.leamonax.model.User; import org.houxg.leamonax.service.AccountService; import org.houxg.leamonax.service.NotebookService; import org.houxg.leamonax.utils.DisplayUtils; +import org.houxg.leamonax.utils.ToastUtils; import org.houxg.leamonax.widget.AlphabetDrawable; import org.houxg.leamonax.widget.TriangleView; @@ -297,8 +298,13 @@ public class Navigation { .setPositiveButton(R.string.confirm, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - addNotebook(mEdit.getText().toString(), parentNotebookId); + String newName = mEdit.getText().toString(); + if (TextUtils.isEmpty(newName)) { + ToastUtils.show(mActivity, R.string.notebook_name_cant_be_empty); + } else { + dialog.dismiss(); + addNotebook(newName, parentNotebookId); + } } }) .show(); diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml index 176986a..4a0ff48 100644 --- a/app/src/main/res/values-zh/strings.xml +++ b/app/src/main/res/values-zh/strings.xml @@ -106,4 +106,5 @@ 蚂蚁笔记 糟糕,笔记冲突 登录接口地址将会是:\n%s/api/auth/login + 笔记本名称不能为空 \ 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 d9b3a21..ecc67f5 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -108,5 +108,6 @@ Generate random note Oops! Conflicts occurs For example, login api will be:\n%s/api/auth/login + Notebook\'s name can\'t be empty From d6bda6a3674b30820eefca7e79f8bcaa864b8213 Mon Sep 17 00:00:00 2001 From: houxg Date: Thu, 9 Mar 2017 15:21:18 +0800 Subject: [PATCH 2/3] fix pass null to callback.onDestroy() --- .../main/java/org/houxg/leamonax/utils/ActionModeHandler.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/org/houxg/leamonax/utils/ActionModeHandler.java b/app/src/main/java/org/houxg/leamonax/utils/ActionModeHandler.java index 0f73ce0..20e4205 100644 --- a/app/src/main/java/org/houxg/leamonax/utils/ActionModeHandler.java +++ b/app/src/main/java/org/houxg/leamonax/utils/ActionModeHandler.java @@ -48,12 +48,12 @@ public class ActionModeHandler { @Override public void onDestroyActionMode(ActionMode mode) { - mActionMode = null; - mPendingItems = null; 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; } }; From 1fff5bf9fa9823f7b2d89e30012f16e2180ee7a6 Mon Sep 17 00:00:00 2001 From: houxg Date: Thu, 9 Mar 2017 21:29:55 +0800 Subject: [PATCH 3/3] apply noteFragment in SearchActivity; add pull to push --- .../leamonax/background/NoteSyncService.java | 1 + .../leamonax/database/NoteDataStore.java | 4 - .../java/org/houxg/leamonax/model/Note.java | 9 - .../houxg/leamonax/service/NoteService.java | 23 +++ .../org/houxg/leamonax/ui/MainActivity.java | 24 +-- .../org/houxg/leamonax/ui/Navigation.java | 39 +--- .../org/houxg/leamonax/ui/NoteFragment.java | 96 ++++++++- .../org/houxg/leamonax/ui/SearchActivity.java | 186 ++---------------- .../houxg/leamonax/utils/NetworkUtils.java | 16 ++ .../org/houxg/leamonax/widget/NoteList.java | 4 + app/src/main/res/layout/activity_search.xml | 6 +- app/src/main/res/values-zh/strings.xml | 1 + app/src/main/res/values/strings.xml | 1 + 13 files changed, 163 insertions(+), 247 deletions(-) diff --git a/app/src/main/java/org/houxg/leamonax/background/NoteSyncService.java b/app/src/main/java/org/houxg/leamonax/background/NoteSyncService.java index 4d0f46f..daf89b8 100644 --- a/app/src/main/java/org/houxg/leamonax/background/NoteSyncService.java +++ b/app/src/main/java/org/houxg/leamonax/background/NoteSyncService.java @@ -59,6 +59,7 @@ public class NoteSyncService extends Service { public void call(Subscriber subscriber) { if (!subscriber.isUnsubscribed()) { NoteService.fetchFromServer(); + NoteService.pushToServer(); subscriber.onNext(null); subscriber.onCompleted(); } diff --git a/app/src/main/java/org/houxg/leamonax/database/NoteDataStore.java b/app/src/main/java/org/houxg/leamonax/database/NoteDataStore.java index ffac351..7ed4194 100644 --- a/app/src/main/java/org/houxg/leamonax/database/NoteDataStore.java +++ b/app/src/main/java/org/houxg/leamonax/database/NoteDataStore.java @@ -49,7 +49,6 @@ public class NoteDataStore { return SQLite.select() .from(Note.class) .where(Note_Table.userId.eq(userId)) - .and(Note_Table.isTrash.eq(false)) .and(Note_Table.isDeleted.eq(false)) .and(Note_Table.isTrash.eq(false)) .queryList(); @@ -59,9 +58,7 @@ public class NoteDataStore { return SQLite.select() .from(Note.class) .where(Note_Table.userId.eq(userId)) - .and(Note_Table.isTrash.eq(false)) .and(Note_Table.isDeleted.eq(false)) - .and(Note_Table.isTrash.eq(false)) .and(Note_Table.isDirty.eq(true)) .queryList(); } @@ -75,7 +72,6 @@ public class NoteDataStore { .from(Note.class) .where(Note_Table.notebookId.eq(notebook.getNotebookId())) .and(Note_Table.userId.eq(userId)) - .and(Note_Table.isTrash.eq(false)) .and(Note_Table.isDeleted.eq(false)) .and(Note_Table.isTrash.eq(false)) .queryList(); 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 596658d..f4a428e 100644 --- a/app/src/main/java/org/houxg/leamonax/model/Note.java +++ b/app/src/main/java/org/houxg/leamonax/model/Note.java @@ -96,7 +96,6 @@ public class Note extends BaseModel implements Serializable { long publicTime; @Column(name = "tags") String tags = ""; - boolean uploadSucc = true; public long getCreatedTimeVal() { return createdTime; @@ -174,14 +173,6 @@ public class Note extends BaseModel implements Serializable { return usn; } - public boolean isUploadSucc() { - return uploadSucc; - } - - public void setUploadSucc(boolean uploadSucc) { - this.uploadSucc = uploadSucc; - } - public void setUsn(int usn) { this.usn = usn; } diff --git a/app/src/main/java/org/houxg/leamonax/service/NoteService.java b/app/src/main/java/org/houxg/leamonax/service/NoteService.java index ec81e54..80f719c 100644 --- a/app/src/main/java/org/houxg/leamonax/service/NoteService.java +++ b/app/src/main/java/org/houxg/leamonax/service/NoteService.java @@ -38,6 +38,7 @@ import okhttp3.MediaType; import okhttp3.MultipartBody; import okhttp3.RequestBody; import retrofit2.Call; +import rx.Observable; public class NoteService { @@ -48,6 +49,15 @@ public class NoteService { private static final String CONFLICT_SUFFIX = "--conflict"; private static final int MAX_ENTRY = 20; + public static void pushToServer() { + List notes = NoteDataStore.getAllDirtyNotes(Account.getCurrent().getUserId()); + for (Note note : notes) { + if (!note.getTitle().endsWith(CONFLICT_SUFFIX)) { + saveNote(note.getId()); + } + } + } + public static void fetchFromServer() { //sync notebook int notebookUsn = Account.getCurrent().getNotebookUsn(); @@ -310,6 +320,7 @@ public class NoteService { requestBodyMap.put("Content", createPartFromString(content)); requestBodyMap.put("IsMarkdown", createPartFromString(getBooleanString(note.isMarkDown()))); requestBodyMap.put("IsBlog", createPartFromString(getBooleanString(note.isPublicBlog()))); + requestBodyMap.put("IsTrash", createPartFromString(getBooleanString(note.isTrash()))); requestBodyMap.put("CreatedTime", createPartFromString(TimeUtils.toServerTime(note.getCreatedTimeVal()))); requestBodyMap.put("UpdatedTime", createPartFromString(TimeUtils.toServerTime(note.getUpdatedTimeVal()))); @@ -386,6 +397,18 @@ public class NoteService { return localIds; } + public static void trashNotesOnLocal(Note note) { + note.setIsTrash(true); + note.setIsDirty(true); + note.update(); + } + + public static void trashNote(Note note) { + if (!note.isLocalNote()) { + saveNote(note.getId()); + } + } + public static void deleteNote(Note note) { if (note.isLocalNote()) { note.delete(); 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 5b6681c..1627bd7 100644 --- a/app/src/main/java/org/houxg/leamonax/ui/MainActivity.java +++ b/app/src/main/java/org/houxg/leamonax/ui/MainActivity.java @@ -21,7 +21,6 @@ import org.greenrobot.eventbus.ThreadMode; import org.houxg.leamonax.R; import org.houxg.leamonax.background.NoteSyncService; import org.houxg.leamonax.component.PullToRefresh; -import org.houxg.leamonax.database.NoteDataStore; import org.houxg.leamonax.database.NotebookDataStore; import org.houxg.leamonax.model.Account; import org.houxg.leamonax.model.Note; @@ -31,7 +30,6 @@ import org.houxg.leamonax.ui.edit.NoteEditActivity; import org.houxg.leamonax.utils.NetworkUtils; import org.houxg.leamonax.utils.ToastUtils; -import java.util.List; import java.util.Locale; import butterknife.BindView; @@ -149,8 +147,8 @@ public class MainActivity extends BaseActivity implements Navigation.Callback { Note newNote = new Note(); newNote.setUserId(account.getUserId()); Notebook notebook; - Navigation.Mode currentMode = mNavigation.getCurrentMode(); - if (currentMode == Navigation.Mode.NOTEBOOK) { + NoteFragment.Mode currentMode = mNavigation.getCurrentMode(); + if (currentMode == NoteFragment.Mode.NOTEBOOK) { notebook = NotebookDataStore.getByLocalId(currentMode.notebookId); } else { notebook = NotebookDataStore.getRecentNoteBook(Account.getCurrent().getUserId()); @@ -179,22 +177,8 @@ public class MainActivity extends BaseActivity implements Navigation.Callback { } @Override - public boolean onShowNotes(Navigation.Mode mode) { - List notes; - switch (mode) { - case RECENT_NOTES: - notes = NoteDataStore.getAllNotes(Account.getCurrent().getUserId()); - break; - case NOTEBOOK: - notes = NoteDataStore.getNotesFromNotebook(Account.getCurrent().getUserId(), mode.notebookId); - break; - case TAG: - notes = NoteDataStore.getByTagText(mode.tagText, Account.getCurrent().getUserId()); - break; - default: - return false; - } - mNoteFragment.setNotes(notes); + public boolean onShowNotes(NoteFragment.Mode mode) { + mNoteFragment.setMode(mode); return true; } 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 bfe4b27..2602975 100644 --- a/app/src/main/java/org/houxg/leamonax/ui/Navigation.java +++ b/app/src/main/java/org/houxg/leamonax/ui/Navigation.java @@ -88,7 +88,7 @@ public class Navigation { private TagAdapter mTagAdapter; private AlphabetDrawable mAlphabetDrawable = new AlphabetDrawable(); - private Mode mCurrentMode = Mode.RECENT_NOTES; + private NoteFragment.Mode mCurrentMode = NoteFragment.Mode.RECENT_NOTES; public Navigation(Callback callback) { mCallback = callback; @@ -255,7 +255,7 @@ public class Navigation { mTagAdapter.setListener(new TagAdapter.TagAdapterListener() { @Override public void onClickedTag(Tag tag) { - mCurrentMode = Mode.TAG; + mCurrentMode = NoteFragment.Mode.TAG; mCurrentMode.setTagText(tag.getText()); if (mCallback != null) { if (mCallback.onShowNotes(mCurrentMode)) { @@ -279,7 +279,7 @@ public class Navigation { mNotebookAdapter.setListener(new NotebookAdapter.NotebookAdapterListener() { @Override public void onClickedNotebook(Notebook notebook) { - mCurrentMode = Mode.NOTEBOOK; + mCurrentMode = NoteFragment.Mode.NOTEBOOK; mCurrentMode.setNotebookId(notebook.getId()); if (mCallback != null) { if (mCallback.onShowNotes(mCurrentMode)) { @@ -367,7 +367,7 @@ public class Navigation { } } - public Mode getCurrentMode() { + public NoteFragment.Mode getCurrentMode() { return mCurrentMode; } @@ -376,8 +376,8 @@ public class Navigation { mAccountAdapter.load(AccountService.getAccountList()); mTagAdapter.refresh(); mNotebookAdapter.refresh(); - if (mCurrentMode == Mode.NOTEBOOK && TextUtils.isEmpty(mNotebookAdapter.getCurrentParentId())) { - mCurrentMode = Mode.RECENT_NOTES; + if (mCurrentMode == NoteFragment.Mode.NOTEBOOK && TextUtils.isEmpty(mNotebookAdapter.getCurrentParentId())) { + mCurrentMode = NoteFragment.Mode.RECENT_NOTES; } if (mCallback != null) { if (mCallback.onShowNotes(mCurrentMode)) { @@ -458,7 +458,7 @@ public class Navigation { @OnClick(R.id.rl_recent_notes) void clickedRecent() { - mCurrentMode = Mode.RECENT_NOTES; + mCurrentMode = NoteFragment.Mode.RECENT_NOTES; if (mCallback != null) { if (mCallback.onShowNotes(mCurrentMode)) { close(); @@ -473,35 +473,12 @@ public class Navigation { * @param mode * @return true if processed */ - boolean onShowNotes(Mode mode); + boolean onShowNotes(NoteFragment.Mode mode); void onClickSetting(); void onClickAbout(); } - public 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; - } - - @Override - public String toString() { - return name() + "{" + - "notebookId=" + notebookId + - ", tagText='" + tagText + '\'' + - '}'; - } - } } 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 489dbe1..1b6dcf6 100644 --- a/app/src/main/java/org/houxg/leamonax/ui/NoteFragment.java +++ b/app/src/main/java/org/houxg/leamonax/ui/NoteFragment.java @@ -15,12 +15,16 @@ import android.view.View; import android.view.ViewGroup; import org.greenrobot.eventbus.EventBus; +import org.houxg.leamonax.Leamonax; import org.houxg.leamonax.R; import org.houxg.leamonax.adapter.NoteAdapter; +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.ToastUtils; import org.houxg.leamonax.widget.NoteList; @@ -51,6 +55,7 @@ public class NoteFragment extends Fragment implements NoteAdapter.NoteAdapterLis List mNotes; ActionModeHandler mActionModeHandler; NoteList mNoteList; + Mode mCurrentMode; public NoteFragment() { } @@ -117,7 +122,27 @@ public class NoteFragment extends Fragment implements NoteAdapter.NoteAdapterLis EventBus.getDefault().unregister(this); } - public void setNotes(List notes) { + public void setMode(Mode mode) { + mCurrentMode = mode; + List notes; + mNoteList.setHighlight(""); + switch (mode) { + case RECENT_NOTES: + notes = NoteDataStore.getAllNotes(Account.getCurrent().getUserId()); + break; + case NOTEBOOK: + notes = NoteDataStore.getNotesFromNotebook(Account.getCurrent().getUserId(), mode.notebookId); + break; + case TAG: + notes = NoteDataStore.getByTagText(mode.tagText, Account.getCurrent().getUserId()); + break; + case SEARCH: + notes = NoteDataStore.searchByTitle(mode.keywords); + mNoteList.setHighlight(mode.keywords); + break; + default: + notes = new ArrayList<>(); + } mNotes = notes; Collections.sort(mNotes, new Note.UpdateTimeComparetor()); mNoteList.render(mNotes); @@ -139,7 +164,7 @@ public class NoteFragment extends Fragment implements NoteAdapter.NoteAdapterLis mNoteList.setSelected(note, isSelected); } - private void deleteNote(final List notes) { + private void deleteNote(List notes) { Observable.from(notes) .flatMap(new Func1>() { @Override @@ -148,7 +173,30 @@ public class NoteFragment extends Fragment implements NoteAdapter.NoteAdapterLis @Override public void call(Subscriber subscriber) { if (!subscriber.isUnsubscribed()) { - NoteService.deleteNote(note); + NoteService.trashNotesOnLocal(note); + subscriber.onNext(note); + subscriber.onCompleted(); + } + } + }); + } + }) + .buffer(notes.size()) + .flatMap(new Func1, Observable>() { + @Override + public Observable call(List notes) { + NetworkUtils.checkNetwork(); + return Observable.from(notes); + } + }) + .flatMap(new Func1>() { + @Override + public Observable call(final Note note) { + return Observable.create(new Observable.OnSubscribe() { + @Override + public void call(Subscriber subscriber) { + if (!subscriber.isUnsubscribed()) { + NoteService.saveNote(note.getId()); subscriber.onNext(note); subscriber.onCompleted(); } @@ -166,8 +214,12 @@ public class NoteFragment extends Fragment implements NoteAdapter.NoteAdapterLis @Override public void onError(Throwable e) { - ToastUtils.show(getActivity(), R.string.delete_note_failed); - mNoteList.invalidateAllSelected(); + if (e instanceof NetworkUtils.NetworkUnavailableException) { + ToastUtils.show(Leamonax.getContext(), R.string.delete_network_error); + } else { + ToastUtils.show(Leamonax.getContext(), R.string.delete_note_failed); + } + refresh(); } @Override @@ -177,6 +229,9 @@ public class NoteFragment extends Fragment implements NoteAdapter.NoteAdapterLis }); } + private void refresh() { + setMode(mCurrentMode); + } @Override public boolean onAction(int actionId, List pendingItems) { @@ -217,4 +272,35 @@ public class NoteFragment extends Fragment implements NoteAdapter.NoteAdapterLis } } + public enum Mode { + RECENT_NOTES, + NOTEBOOK, + TAG, + SEARCH; + + long notebookId; + String tagText; + String keywords; + + public void setNotebookId(long notebookId) { + this.notebookId = notebookId; + } + + public void setTagText(String tagText) { + this.tagText = tagText; + } + + public void setKeywords(String keywords) { + this.keywords = keywords; + } + + @Override + public String toString() { + return name() + "{" + + "notebookId=" + notebookId + + ", tagText='" + tagText + '\'' + + '}'; + } + } + } diff --git a/app/src/main/java/org/houxg/leamonax/ui/SearchActivity.java b/app/src/main/java/org/houxg/leamonax/ui/SearchActivity.java index 8477425..2434b92 100644 --- a/app/src/main/java/org/houxg/leamonax/ui/SearchActivity.java +++ b/app/src/main/java/org/houxg/leamonax/ui/SearchActivity.java @@ -1,56 +1,27 @@ package org.houxg.leamonax.ui; -import android.app.AlertDialog; -import android.content.DialogInterface; import android.os.Bundle; -import android.support.v7.widget.DefaultItemAnimator; -import android.support.v7.widget.LinearLayoutManager; -import android.support.v7.widget.RecyclerView; +import android.support.v4.app.FragmentTransaction; import android.support.v7.widget.SearchView; import android.support.v7.widget.Toolbar; -import android.text.TextUtils; import android.transition.Slide; import android.view.Gravity; import android.view.Window; import android.widget.ImageView; import org.houxg.leamonax.R; -import org.houxg.leamonax.adapter.NoteAdapter; -import org.houxg.leamonax.database.NoteDataStore; -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.ToastUtils; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; import butterknife.BindView; import butterknife.ButterKnife; -import rx.Observable; -import rx.Observer; -import rx.Subscriber; -import rx.android.schedulers.AndroidSchedulers; -import rx.functions.Func1; -import rx.schedulers.Schedulers; -public class SearchActivity extends BaseActivity implements NoteAdapter.NoteAdapterListener, ActionModeHandler.Callback { +public class SearchActivity extends BaseActivity { - private static final String EXT_SCROLL_POSITION = "ext_scroll_position"; - - @BindView(R.id.recycler_view) - RecyclerView mNoteListView; @BindView(R.id.toolbar) Toolbar mToolbar; @BindView(R.id.search) SearchView mSearchView; - List mNotes = new ArrayList<>(); - private NoteAdapter mAdapter; - private ActionModeHandler mActionModeHandler; - private float mScrollPosition; + private NoteFragment mNoteFragment; @Override protected void onCreate(Bundle savedInstanceState) { @@ -62,27 +33,6 @@ public class SearchActivity extends BaseActivity implements NoteAdapter.NoteAdap ButterKnife.bind(this); initToolBar(mToolbar, true); setTitle(""); - mActionModeHandler = new ActionModeHandler<>(this, this, R.menu.delete); - - RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(this); - mNoteListView.setLayoutManager(layoutManager); - mNoteListView.setItemAnimator(new DefaultItemAnimator()); - - mAdapter = new NoteAdapter(this); - mNoteListView.setAdapter(mAdapter); - mNoteListView.addOnScrollListener(new RecyclerView.OnScrollListener() { - @Override - public void onScrollStateChanged(RecyclerView recyclerView, int newState) { - super.onScrollStateChanged(recyclerView, newState); - } - - @Override - public void onScrolled(RecyclerView recyclerView, int dx, int dy) { - super.onScrolled(recyclerView, dx, dy); - mScrollPosition = dy; - } - }); - mSearchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { @Override public boolean onQueryTextSubmit(String query) { @@ -91,11 +41,18 @@ public class SearchActivity extends BaseActivity implements NoteAdapter.NoteAdap @Override public boolean onQueryTextChange(String newText) { - searchTitle(newText); + NoteFragment.Mode mode = NoteFragment.Mode.SEARCH; + mode.setKeywords(newText); + mNoteFragment.setMode(mode); return true; } }); + FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); + mNoteFragment = NoteFragment.newInstance(); + transaction.add(R.id.container, mNoteFragment); + transaction.commit(); + ImageView searchCloseIcon = (ImageView) mSearchView.findViewById(android.support.v7.appcompat.R.id.search_close_btn); searchCloseIcon.setImageResource(R.drawable.ic_clear); ImageView searchIcon = (ImageView) mSearchView.findViewById(android.support.v7.appcompat.R.id.search_mag_icon); @@ -107,125 +64,4 @@ public class SearchActivity extends BaseActivity implements NoteAdapter.NoteAdap mSearchView.setIconified(false); mSearchView.setIconifiedByDefault(false); } - - @Override - protected void onRestoreInstanceState(Bundle savedInstanceState) { - super.onRestoreInstanceState(savedInstanceState); - mScrollPosition = savedInstanceState.getFloat(EXT_SCROLL_POSITION, 0); - } - - @Override - protected void onResume() { - super.onResume(); - mNoteListView.scrollTo(0, (int) mScrollPosition); - } - - @Override - public void onSaveInstanceState(Bundle outState) { - super.onSaveInstanceState(outState); - outState.putFloat(EXT_SCROLL_POSITION, mScrollPosition); - } - - private void searchTitle(String keyword) { - if (TextUtils.isEmpty(keyword)) { - mNotes = new ArrayList<>(); - } else { - mNotes = NoteDataStore.searchByTitle(keyword); - Collections.sort(mNotes, new Note.UpdateTimeComparetor()); - } - mAdapter.setHighlight(keyword); - mAdapter.load(mNotes); - } - - @Override - public void onClickNote(Note note) { - if (mActionModeHandler.isActionMode()) { - boolean isSelected = mActionModeHandler.chooseItem(note); - mAdapter.setSelected(note, isSelected); - } else { - startActivity(NotePreviewActivity.getOpenIntent(this, note.getId())); - } - } - - @Override - public void onLongClickNote(final Note note) { - boolean isSelected = mActionModeHandler.chooseItem(note); - mAdapter.setSelected(note, isSelected); - } - - private void deleteNote(final List notes) { - Observable.from(notes) - .flatMap(new Func1>() { - @Override - public rx.Observable call(final Note note) { - return Observable.create(new Observable.OnSubscribe() { - @Override - public void call(Subscriber subscriber) { - if (!subscriber.isUnsubscribed()) { - NoteService.deleteNote(note); - subscriber.onNext(note); - subscriber.onCompleted(); - } - } - }); - } - }) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(new Observer() { - @Override - public void onCompleted() { - - } - - @Override - public void onError(Throwable e) { - ToastUtils.show(SearchActivity.this, R.string.delete_note_failed); - } - - @Override - public void onNext(Note note) { - mAdapter.delete(note); - } - }); - } - - @Override - public boolean onAction(int actionId, List pendingItems) { - if (CollectionUtils.isEmpty(pendingItems)) { - ToastUtils.show(this, 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)); - } - new AlertDialog.Builder(this) - .setTitle(R.string.delete_note) - .setMessage(R.string.are_you_sure_to_delete_note) - .setCancelable(true) - .setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - mActionModeHandler.dismiss(); - deleteNote(waitToDelete); - } - }) - .setNegativeButton(R.string.no, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - } - }) - .show(); - return true; - } - - @Override - public void onDestroy(List pendingItems) { - if (CollectionUtils.isNotEmpty(pendingItems)) { - mAdapter.invalidateAllSelected(); - } - } } diff --git a/app/src/main/java/org/houxg/leamonax/utils/NetworkUtils.java b/app/src/main/java/org/houxg/leamonax/utils/NetworkUtils.java index 28ba688..9f26d67 100644 --- a/app/src/main/java/org/houxg/leamonax/utils/NetworkUtils.java +++ b/app/src/main/java/org/houxg/leamonax/utils/NetworkUtils.java @@ -7,6 +7,10 @@ import android.net.NetworkInfo; import org.houxg.leamonax.Leamonax; import org.houxg.leamonax.R; +import org.houxg.leamonax.model.Note; + +import rx.Observable; +import rx.Subscriber; public class NetworkUtils { @@ -33,6 +37,18 @@ public class NetworkUtils { } } + public Observable checkNetwork(T data) { + return Observable.create(new Observable.OnSubscribe() { + @Override + public void call(Subscriber subscriber) { + if (!isNetworkAvailable()) { + throw new NetworkUnavailableException(); + } + + } + }); + } + public static class NetworkUnavailableException extends IllegalStateException { public NetworkUnavailableException() { super(Leamonax.getContext().getResources().getString(R.string.network_is_unavailable)); diff --git a/app/src/main/java/org/houxg/leamonax/widget/NoteList.java b/app/src/main/java/org/houxg/leamonax/widget/NoteList.java index f548016..ef8be3c 100644 --- a/app/src/main/java/org/houxg/leamonax/widget/NoteList.java +++ b/app/src/main/java/org/houxg/leamonax/widget/NoteList.java @@ -66,6 +66,10 @@ public class NoteList { mAdapter.notifyDataSetChanged(); } + public void setHighlight(String keyword) { + mAdapter.setHighlight(keyword); + } + public void toggleType() { int newType = mCurrentType == TYPE_SIMPLE ? TYPE_DETAIL : TYPE_SIMPLE; setType(newType); diff --git a/app/src/main/res/layout/activity_search.xml b/app/src/main/res/layout/activity_search.xml index 6de83a9..1559677 100644 --- a/app/src/main/res/layout/activity_search.xml +++ b/app/src/main/res/layout/activity_search.xml @@ -21,9 +21,9 @@ - + android:layout_height="match_parent"/> diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml index 4a0ff48..b3afd29 100644 --- a/app/src/main/res/values-zh/strings.xml +++ b/app/src/main/res/values-zh/strings.xml @@ -107,4 +107,5 @@ 糟糕,笔记冲突 登录接口地址将会是:\n%s/api/auth/login 笔记本名称不能为空 + 网络不可用,将在下次同步时删除 \ 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 ecc67f5..10cee89 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -109,5 +109,6 @@ Oops! Conflicts occurs For example, login api will be:\n%s/api/auth/login Notebook\'s name can\'t be empty + Network is unavailable, these notes will be deleted in next sync