From 37dc39552f981f3ff2104bdc6d7fc40d5f0a606a Mon Sep 17 00:00:00 2001 From: hiroshi Date: Sun, 23 Oct 2016 21:11:13 +0800 Subject: [PATCH 01/15] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 4 +- .../com/hiroshi/cimoc/CimocApplication.java | 3 + .../java/com/hiroshi/cimoc/core/Manga.java | 13 +-- .../java/com/hiroshi/cimoc/core/Update.java | 2 +- .../cimoc/core/manager/PreferenceManager.java | 2 + .../cimoc/presenter/DetailPresenter.java | 24 ++--- .../cimoc/presenter/DownloadPresenter.java | 12 +-- .../cimoc/presenter/FavoritePresenter.java | 87 ++++++++----------- .../cimoc/presenter/HistoryPresenter.java | 12 +-- .../com/hiroshi/cimoc/rx/ToAnotherList.java | 30 +++++++ .../java/com/hiroshi/cimoc/source/Dmzj.java | 13 +-- .../cimoc/ui/activity/MainActivity.java | 22 ++++- .../cimoc/ui/activity/TagComicActivity.java | 3 +- .../hiroshi/cimoc/ui/adapter/BaseAdapter.java | 4 + .../classical/grid/FavoriteFragment.java | 26 +++++- .../classical/grid/HistoryFragment.java | 3 +- .../com/hiroshi/cimoc/ui/view/DetailView.java | 1 - .../hiroshi/cimoc/ui/view/FavoriteView.java | 11 ++- app/src/main/res/values/strings.xml | 7 +- build.gradle | 4 +- gradle.properties | 2 + 21 files changed, 166 insertions(+), 119 deletions(-) create mode 100644 app/src/main/java/com/hiroshi/cimoc/rx/ToAnotherList.java diff --git a/app/build.gradle b/app/build.gradle index c8a28bbe..70e4057b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -11,7 +11,7 @@ android { minSdkVersion 15 targetSdkVersion 24 versionCode 1 - versionName "1.4.3" + versionName "1.4.3.1" resConfigs "en", "zh" } buildTypes { @@ -35,7 +35,7 @@ dependencies { compile "com.android.support:design:${SUPPORT_LIB_VERSION}" compile 'com.jakewharton:butterknife:8.4.0' apt 'com.jakewharton:butterknife-compiler:8.4.0' - compile 'org.greenrobot:greendao:3.1.1' + compile 'org.greenrobot:greendao:3.2.0' compile 'com.squareup.okhttp3:okhttp:3.4.1' compile 'com.facebook.fresco:fresco:0.14.1' compile 'org.jsoup:jsoup:1.9.2' diff --git a/app/src/main/java/com/hiroshi/cimoc/CimocApplication.java b/app/src/main/java/com/hiroshi/cimoc/CimocApplication.java index 91376526..f8e1e906 100644 --- a/app/src/main/java/com/hiroshi/cimoc/CimocApplication.java +++ b/app/src/main/java/com/hiroshi/cimoc/CimocApplication.java @@ -23,6 +23,9 @@ */ public class CimocApplication extends Application { + // 1.04.03.001 + public static final int VERSION = 10403001; + private static DaoSession daoSession; private static OkHttpClient httpClient; diff --git a/app/src/main/java/com/hiroshi/cimoc/core/Manga.java b/app/src/main/java/com/hiroshi/cimoc/core/Manga.java index 24c61d28..e39d5801 100644 --- a/app/src/main/java/com/hiroshi/cimoc/core/Manga.java +++ b/app/src/main/java/com/hiroshi/cimoc/core/Manga.java @@ -7,6 +7,7 @@ import com.hiroshi.cimoc.model.Chapter; import com.hiroshi.cimoc.model.Comic; import com.hiroshi.cimoc.model.ImageUrl; +import com.hiroshi.cimoc.rx.RxObject; import java.io.IOException; import java.util.LinkedList; @@ -159,14 +160,16 @@ public void call(Subscriber subscriber) { }).subscribeOn(Schedulers.io()); } - public static Observable check(final List list) { - return Observable.create(new Observable.OnSubscribe() { + public static Observable check(final List list) { + return Observable.create(new Observable.OnSubscribe() { @Override - public void call(Subscriber subscriber) { + public void call(Subscriber subscriber) { OkHttpClient client = new OkHttpClient.Builder() .connectTimeout(500, TimeUnit.MILLISECONDS) .readTimeout(1000, TimeUnit.MILLISECONDS) .build(); + int size = list.size(); + int count = 0; for (Comic comic : list) { int source = comic.getSource(); if (source < 100) { @@ -177,14 +180,14 @@ public void call(Subscriber subscriber) { if (comic.getUpdate() != null && !comic.getUpdate().equals(update)) { comic.setUpdate(update); comic.setHighlight(true); - subscriber.onNext(comic); + subscriber.onNext(new RxObject(comic, ++count, size)); continue; } } catch (Exception e) { e.printStackTrace(); } } - subscriber.onNext(null); + subscriber.onNext(new RxObject(null, ++count, size)); } subscriber.onCompleted(); } diff --git a/app/src/main/java/com/hiroshi/cimoc/core/Update.java b/app/src/main/java/com/hiroshi/cimoc/core/Update.java index 4a89706f..ceae3c33 100644 --- a/app/src/main/java/com/hiroshi/cimoc/core/Update.java +++ b/app/src/main/java/com/hiroshi/cimoc/core/Update.java @@ -20,7 +20,7 @@ public static Observable check() { return Observable.create(new Observable.OnSubscribe() { @Override public void call(Subscriber subscriber) { - String url = "http://pan.baidu.com/share/list?uk=223062232&shareid=2388458898&dir=/updateComicIndex"; + String url = "http://pan.baidu.com/share/list?uk=223062232&shareid=2388458898&dir=/update"; OkHttpClient client = CimocApplication.getHttpClient(); Request request = new Request.Builder().url(url).build(); try { diff --git a/app/src/main/java/com/hiroshi/cimoc/core/manager/PreferenceManager.java b/app/src/main/java/com/hiroshi/cimoc/core/manager/PreferenceManager.java index 348f19c4..ef919e20 100644 --- a/app/src/main/java/com/hiroshi/cimoc/core/manager/PreferenceManager.java +++ b/app/src/main/java/com/hiroshi/cimoc/core/manager/PreferenceManager.java @@ -25,6 +25,8 @@ public class PreferenceManager { public static final String PREF_MAIN_NOTICE = "pref_main_notice"; + public static final String PREF_VERSION = "pref_version"; + public static final String PREF_READER_MODE = "pref_reader_mode"; public static final String PREF_READER_KEEP_ON = "pref_reader_keep_on"; public static final String PREF_READER_HIDE_INFO = "pref_reader_hide_info"; diff --git a/app/src/main/java/com/hiroshi/cimoc/presenter/DetailPresenter.java b/app/src/main/java/com/hiroshi/cimoc/presenter/DetailPresenter.java index 8ba10ef1..b1a4a9fe 100644 --- a/app/src/main/java/com/hiroshi/cimoc/presenter/DetailPresenter.java +++ b/app/src/main/java/com/hiroshi/cimoc/presenter/DetailPresenter.java @@ -14,6 +14,7 @@ import com.hiroshi.cimoc.model.Task; import com.hiroshi.cimoc.rx.RxBus; import com.hiroshi.cimoc.rx.RxEvent; +import com.hiroshi.cimoc.rx.ToAnotherList; import com.hiroshi.cimoc.ui.fragment.ComicFragment; import com.hiroshi.cimoc.ui.view.DetailView; @@ -107,19 +108,12 @@ public void call(Throwable throwable) { public void loadTag() { mTagSet.clear(); mCompositeSubscription.add(mTagManager.listByComic(mComic.getId()) - .flatMap(new Func1, Observable>() { - @Override - public Observable call(List tagRefs) { - return Observable.from(tagRefs); - } - }) - .map(new Func1() { + .compose(new ToAnotherList<>(new Func1() { @Override public Long call(TagRef ref) { return ref.getTid(); } - }) - .toList() + })) .flatMap(new Func1, Observable>>() { @Override public Observable> call(List list) { @@ -127,19 +121,12 @@ public Observable> call(List list) { return mTagManager.list(); } }) - .flatMap(new Func1, Observable>() { - @Override - public Observable call(List list) { - return Observable.from(list); - } - }) - .map(new Func1() { + .compose(new ToAnotherList<>(new Func1() { @Override public Selectable call(Tag tag) { return new Selectable(false, mTagSet.contains(tag.getId()), tag.getId(), tag.getTitle()); } - }) - .toList() + })) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Action1>() { @Override @@ -149,7 +136,6 @@ public void call(List list) { }, new Action1() { @Override public void call(Throwable throwable) { - throwable.printStackTrace(); mBaseView.onTagLoadFail(); } })); diff --git a/app/src/main/java/com/hiroshi/cimoc/presenter/DownloadPresenter.java b/app/src/main/java/com/hiroshi/cimoc/presenter/DownloadPresenter.java index d7209e05..2c7e725f 100644 --- a/app/src/main/java/com/hiroshi/cimoc/presenter/DownloadPresenter.java +++ b/app/src/main/java/com/hiroshi/cimoc/presenter/DownloadPresenter.java @@ -7,6 +7,7 @@ import com.hiroshi.cimoc.model.MiniComic; import com.hiroshi.cimoc.model.Task; import com.hiroshi.cimoc.rx.RxEvent; +import com.hiroshi.cimoc.rx.ToAnotherList; import com.hiroshi.cimoc.ui.fragment.ComicFragment; import com.hiroshi.cimoc.ui.view.DownloadView; @@ -108,19 +109,12 @@ public void call(Throwable throwable) { public void loadComic() { mCompositeSubscription.add(mComicManager.listDownload() - .flatMap(new Func1, Observable>() { - @Override - public Observable call(List list) { - return Observable.from(list); - } - }) - .map(new Func1() { + .compose(new ToAnotherList<>(new Func1() { @Override public MiniComic call(Comic comic) { return new MiniComic(comic); } - }) - .toList() + })) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Action1>() { @Override diff --git a/app/src/main/java/com/hiroshi/cimoc/presenter/FavoritePresenter.java b/app/src/main/java/com/hiroshi/cimoc/presenter/FavoritePresenter.java index 8dea1ec9..35e29122 100644 --- a/app/src/main/java/com/hiroshi/cimoc/presenter/FavoritePresenter.java +++ b/app/src/main/java/com/hiroshi/cimoc/presenter/FavoritePresenter.java @@ -9,6 +9,8 @@ import com.hiroshi.cimoc.model.MiniComic; import com.hiroshi.cimoc.model.TagRef; import com.hiroshi.cimoc.rx.RxEvent; +import com.hiroshi.cimoc.rx.RxObject; +import com.hiroshi.cimoc.rx.ToAnotherList; import com.hiroshi.cimoc.ui.fragment.ComicFragment; import com.hiroshi.cimoc.ui.view.FavoriteView; @@ -79,7 +81,9 @@ public void call(RxEvent rxEvent) { for (MiniComic comic : list) { mComicArray.put(comic.getId(), comic); } - mBaseView.OnComicRestore(list); + if (mTagId != -1) { + mBaseView.OnComicRestore(list); + } } }); addSubscription(RxEvent.EVENT_COMIC_READ, new Action1() { @@ -96,9 +100,7 @@ public void call(RxEvent rxEvent) { @Override public void call(RxEvent rxEvent) { int type = (int) rxEvent.getData(); - if (type == TagManager.TAG_NORMAL) { - mTagId = (long) rxEvent.getData(1); - } + mTagId = type == TagManager.TAG_NORMAL ? (long) rxEvent.getData(1): -1; filter(type); } }); @@ -111,12 +113,14 @@ public void call(RxEvent rxEvent) { addSubscription(RxEvent.EVENT_TAG_UPDATE, new Action1() { @Override public void call(RxEvent rxEvent) { - List deleteList = (List) rxEvent.getData(1); - List insertList = (List) rxEvent.getData(2); - if (deleteList.contains(mTagId)) { - mBaseView.OnComicUnFavorite(((MiniComic) rxEvent.getData()).getId()); - } else if (insertList.contains(mTagId)) { - mBaseView.OnComicFavorite((MiniComic) rxEvent.getData()); + if (mTagId != -1) { + List deleteList = (List) rxEvent.getData(1); + List insertList = (List) rxEvent.getData(2); + if (deleteList.contains(mTagId)) { + mBaseView.onComicDelete((MiniComic) rxEvent.getData()); + } else if (insertList.contains(mTagId)) { + mBaseView.onComicInsert((MiniComic) rxEvent.getData()); + } } } }); @@ -124,21 +128,14 @@ public void call(RxEvent rxEvent) { public void loadComic() { mCompositeSubscription.add(mComicManager.listFavorite() - .flatMap(new Func1, Observable>() { - @Override - public Observable call(List list) { - return Observable.from(list); - } - }) - .map(new Func1() { + .compose(new ToAnotherList<>(new Func1() { @Override public MiniComic call(Comic comic) { MiniComic ret = new MiniComic(comic); mComicArray.put(ret.getId(), ret); return ret; } - }) - .toList() + })) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Action1>() { @Override @@ -156,25 +153,12 @@ public void call(Throwable throwable) { private void filter(int type) { if (type == TagManager.TAG_NORMAL) { mCompositeSubscription.add(mTagManager.listByTag(mTagId) - .flatMap(new Func1, Observable>() { - @Override - public Observable call(List tagRefs) { - return Observable.from(tagRefs); - } - }) - .map(new Func1() { + .compose(new ToAnotherList<>(new Func1() { @Override public MiniComic call(TagRef ref) { return mComicArray.get(ref.getCid()); } - }) - .filter(new Func1() { - @Override - public Boolean call(MiniComic comic) { - return comic != null; - } - }) - .toList() + })) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Action1>() { @Override @@ -206,41 +190,44 @@ public void call(Throwable throwable) { } } - private int size; - public void checkUpdate() { mCompositeSubscription.add(mComicManager.listFavorite() - .flatMap(new Func1, Observable>() { + .flatMap(new Func1, Observable>() { @Override - public Observable call(List list) { - size = list.size(); + public Observable call(List list) { return Manga.check(list); } }) - .doOnNext(new Action1() { + .doOnNext(new Action1() { @Override - public void call(Comic comic) { - if (comic != null) { - mComicManager.update(comic); + public void call(RxObject object) { + if (object.getData() != null) { + mComicManager.update((Comic) object.getData()); } } }) .onBackpressureBuffer() .observeOn(AndroidSchedulers.mainThread()) - .subscribe(new Observer() { - private int count = 0; - + .subscribe(new Observer() { @Override public void onCompleted() { - mBaseView.onCheckComplete(); + mBaseView.onComicCheckComplete(); } @Override - public void onError(Throwable e) {} + public void onError(Throwable e) { + mBaseView.onComicCheckFail(); + } @Override - public void onNext(Comic comic) { - mBaseView.onComicUpdate(comic, ++count, size); + public void onNext(RxObject object) { + if (object.getData() == null) { + mBaseView.onComicCheckSuccess(null, (int) object.getData(1), (int) object.getData(2)); + } else { + long id = ((Comic) object.getData()).getId(); + mComicArray.get(id).setHighlight(true); + mBaseView.onComicCheckSuccess(mComicArray.get(id), (int) object.getData(1), (int) object.getData(2)); + } } })); } diff --git a/app/src/main/java/com/hiroshi/cimoc/presenter/HistoryPresenter.java b/app/src/main/java/com/hiroshi/cimoc/presenter/HistoryPresenter.java index b61c472f..c878d66c 100644 --- a/app/src/main/java/com/hiroshi/cimoc/presenter/HistoryPresenter.java +++ b/app/src/main/java/com/hiroshi/cimoc/presenter/HistoryPresenter.java @@ -4,6 +4,7 @@ import com.hiroshi.cimoc.model.Comic; import com.hiroshi.cimoc.model.MiniComic; import com.hiroshi.cimoc.rx.RxEvent; +import com.hiroshi.cimoc.rx.ToAnotherList; import com.hiroshi.cimoc.ui.view.HistoryView; import java.util.List; @@ -43,19 +44,12 @@ public void call(RxEvent rxEvent) { public void loadComic() { mCompositeSubscription.add(mComicManager.listHistory() - .flatMap(new Func1, Observable>() { - @Override - public Observable call(List list) { - return Observable.from(list); - } - }) - .map(new Func1() { + .compose(new ToAnotherList<>(new Func1() { @Override public MiniComic call(Comic comic) { return new MiniComic(comic); } - }) - .toList() + })) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Action1>() { @Override diff --git a/app/src/main/java/com/hiroshi/cimoc/rx/ToAnotherList.java b/app/src/main/java/com/hiroshi/cimoc/rx/ToAnotherList.java new file mode 100644 index 00000000..f40e1475 --- /dev/null +++ b/app/src/main/java/com/hiroshi/cimoc/rx/ToAnotherList.java @@ -0,0 +1,30 @@ +package com.hiroshi.cimoc.rx; + +import java.util.List; + +import rx.Observable; +import rx.functions.Func1; + +/** + * Created by Hiroshi on 2016/10/23. + */ + +public class ToAnotherList implements Observable.Transformer, List> { + + private Func1 func; + + public ToAnotherList(Func1 func) { + this.func = func; + } + + @Override + public Observable> call(Observable> observable) { + return observable.flatMap(new Func1, Observable>() { + @Override + public Observable call(List list) { + return Observable.from(list); + } + }).map(func).toList(); + } + +} diff --git a/app/src/main/java/com/hiroshi/cimoc/source/Dmzj.java b/app/src/main/java/com/hiroshi/cimoc/source/Dmzj.java index 1f59c7a5..12d79269 100644 --- a/app/src/main/java/com/hiroshi/cimoc/source/Dmzj.java +++ b/app/src/main/java/com/hiroshi/cimoc/source/Dmzj.java @@ -88,16 +88,19 @@ public String parseInfo(String html, Comic comic) { @Override public List parseChapter(String html) { - String jsonString = StringUtils.match("\"data\":(\\[.*?\\])", html, 1); + String jsonString = StringUtils.match("initIntroData\\((.*?)\\);", html, 1); List list = new LinkedList<>(); if (jsonString != null) { try { JSONArray array = new JSONArray(jsonString); for (int i = 0; i != array.length(); ++i) { - JSONObject object = array.getJSONObject(i); - String title = object.getString("chapter_name"); - String path = object.getString("id"); - list.add(new Chapter(title, path)); + JSONArray data = array.getJSONObject(i).getJSONArray("data"); + for (int j = 0; j != data.length(); ++j) { + JSONObject object = data.getJSONObject(j); + String title = object.getString("chapter_name"); + String path = object.getString("id"); + list.add(new Chapter(title, path)); + } } } catch (Exception e) { e.printStackTrace(); diff --git a/app/src/main/java/com/hiroshi/cimoc/ui/activity/MainActivity.java b/app/src/main/java/com/hiroshi/cimoc/ui/activity/MainActivity.java index e921e194..80051db5 100644 --- a/app/src/main/java/com/hiroshi/cimoc/ui/activity/MainActivity.java +++ b/app/src/main/java/com/hiroshi/cimoc/ui/activity/MainActivity.java @@ -24,7 +24,6 @@ import com.hiroshi.cimoc.CimocApplication; import com.hiroshi.cimoc.R; import com.hiroshi.cimoc.core.manager.PreferenceManager; -import com.hiroshi.cimoc.model.Comic; import com.hiroshi.cimoc.presenter.MainPresenter; import com.hiroshi.cimoc.ui.fragment.BaseFragment; import com.hiroshi.cimoc.ui.fragment.ComicFragment; @@ -43,6 +42,9 @@ public class MainActivity extends BaseActivity implements MainView, NavigationView.OnNavigationItemSelectedListener, MessageDialogFragment.MessageDialogListener { + private static final int TYPE_NOTICE = 0; + private static final int TYPE_UPDATE_LOG = 1; + private static final int FRAGMENT_NUM = 4; @BindView(R.id.main_layout) DrawerLayout mDrawerLayout; @@ -79,7 +81,10 @@ protected void initView() { protected void initData() { mPresenter.loadLast(); if (!mPreference.getBoolean(PreferenceManager.PREF_MAIN_NOTICE, false)) { - MessageDialogFragment fragment = MessageDialogFragment.newInstance(R.string.main_notice, R.string.main_notice_content, false); + MessageDialogFragment fragment = MessageDialogFragment.newInstance(R.string.main_notice, R.string.main_notice_content, false, TYPE_NOTICE); + fragment.show(getFragmentManager(), null); + } else if (mPreference.getInt(PreferenceManager.PREF_VERSION, 0) != CimocApplication.VERSION) { + MessageDialogFragment fragment = MessageDialogFragment.newInstance(R.string.main_update_log, R.string.main_update_log_content, false, TYPE_UPDATE_LOG); fragment.show(getFragmentManager(), null); } } @@ -233,7 +238,18 @@ public boolean onNavigationItemSelected(@NonNull MenuItem item) { @Override public void onMessagePositiveClick(int type) { - mPreference.putBoolean(PreferenceManager.PREF_MAIN_NOTICE, true); + switch (type) { + case TYPE_NOTICE: + mPreference.putBoolean(PreferenceManager.PREF_MAIN_NOTICE, true); + if (mPreference.getInt(PreferenceManager.PREF_VERSION, 0) != CimocApplication.VERSION) { + MessageDialogFragment fragment = MessageDialogFragment.newInstance(R.string.main_update_log, R.string.main_update_log_content, false, TYPE_UPDATE_LOG); + fragment.show(getFragmentManager(), null); + } + break; + case TYPE_UPDATE_LOG: + mPreference.putInt(PreferenceManager.PREF_VERSION, CimocApplication.VERSION); + break; + } } @Override diff --git a/app/src/main/java/com/hiroshi/cimoc/ui/activity/TagComicActivity.java b/app/src/main/java/com/hiroshi/cimoc/ui/activity/TagComicActivity.java index 248b0890..d25f1bb2 100644 --- a/app/src/main/java/com/hiroshi/cimoc/ui/activity/TagComicActivity.java +++ b/app/src/main/java/com/hiroshi/cimoc/ui/activity/TagComicActivity.java @@ -107,7 +107,6 @@ public void onMessagePositiveClick(int type) { long cid = mGridAdapter.getItem(mTempPosition).getId(); mPresenter.delete(tid, cid); mGridAdapter.remove(mTempPosition); - mTempPosition = -1; showSnackbar(R.string.common_delete_success); } @@ -207,7 +206,7 @@ public void onTagUpdateInsert(MiniComic comic) { @Override protected String getDefaultTitle() { - return getString(R.string.tag_comic); + return getIntent().getStringExtra(EXTRA_TITLE); } @Override diff --git a/app/src/main/java/com/hiroshi/cimoc/ui/adapter/BaseAdapter.java b/app/src/main/java/com/hiroshi/cimoc/ui/adapter/BaseAdapter.java index 00bacdcb..e328a85a 100644 --- a/app/src/main/java/com/hiroshi/cimoc/ui/adapter/BaseAdapter.java +++ b/app/src/main/java/com/hiroshi/cimoc/ui/adapter/BaseAdapter.java @@ -72,6 +72,10 @@ public void removeAll(Collection collection) { notifyDataSetChanged(); } + public boolean contains(T data) { + return mDataSet.contains(data); + } + public void clear() { mDataSet.clear(); notifyDataSetChanged(); diff --git a/app/src/main/java/com/hiroshi/cimoc/ui/fragment/classical/grid/FavoriteFragment.java b/app/src/main/java/com/hiroshi/cimoc/ui/fragment/classical/grid/FavoriteFragment.java index 77b3e759..2ffb817f 100644 --- a/app/src/main/java/com/hiroshi/cimoc/ui/fragment/classical/grid/FavoriteFragment.java +++ b/app/src/main/java/com/hiroshi/cimoc/ui/fragment/classical/grid/FavoriteFragment.java @@ -7,7 +7,6 @@ import android.view.View; import com.hiroshi.cimoc.R; -import com.hiroshi.cimoc.model.Comic; import com.hiroshi.cimoc.model.MiniComic; import com.hiroshi.cimoc.presenter.FavoritePresenter; import com.hiroshi.cimoc.ui.activity.DetailActivity; @@ -121,21 +120,40 @@ public void onComicFilterFail() { } @Override - public void onComicUpdate(Comic comic, int progress, int max) { + public void onComicCheckSuccess(MiniComic comic, int progress, int max) { if (comic != null) { - mGridAdapter.update(new MiniComic(comic), false); + mGridAdapter.update(comic, false); } mBuilder.setProgress(max, progress, false); NotificationUtils.notifyBuilder(0, mManager, mBuilder); } @Override - public void onCheckComplete() { + public void onComicCheckFail() { + NotificationUtils.setBuilder(getActivity(), mBuilder, R.string.favorite_check_update_fail, false); + NotificationUtils.notifyBuilder(0, mManager, mBuilder); + mBuilder = null; + } + + @Override + public void onComicCheckComplete() { NotificationUtils.setBuilder(getActivity(), mBuilder, R.string.favorite_check_update_done, false); NotificationUtils.notifyBuilder(0, mManager, mBuilder); mBuilder = null; } + @Override + public void onComicInsert(MiniComic comic) { + if (!mGridAdapter.contains(comic)) { + mGridAdapter.addAfterHighlight(comic); + } + } + + @Override + public void onComicDelete(MiniComic comic) { + mGridAdapter.remove(comic); + } + @Override protected int getImageRes() { return R.drawable.ic_sync_white_24dp; diff --git a/app/src/main/java/com/hiroshi/cimoc/ui/fragment/classical/grid/HistoryFragment.java b/app/src/main/java/com/hiroshi/cimoc/ui/fragment/classical/grid/HistoryFragment.java index f6483412..6519c78c 100644 --- a/app/src/main/java/com/hiroshi/cimoc/ui/fragment/classical/grid/HistoryFragment.java +++ b/app/src/main/java/com/hiroshi/cimoc/ui/fragment/classical/grid/HistoryFragment.java @@ -66,7 +66,6 @@ public void onMessagePositiveClick(int type) { case TYPE_LONG_CLICK: mPresenter.delete(mGridAdapter.getItem(mTempPosition)); mGridAdapter.remove(mTempPosition); - mTempPosition = -1; showSnackbar(R.string.common_delete_success); break; } @@ -75,7 +74,7 @@ public void onMessagePositiveClick(int type) { @Override protected void onActionButtonClick() { MessageDialogFragment fragment = MessageDialogFragment.newInstance(R.string.dialog_confirm, - R.string.history_clear_confirm, true); + R.string.history_clear_confirm, true, TYPE_ACTION_BUTTON); fragment.setTargetFragment(this, 0); fragment.show(getFragmentManager(), null); } diff --git a/app/src/main/java/com/hiroshi/cimoc/ui/view/DetailView.java b/app/src/main/java/com/hiroshi/cimoc/ui/view/DetailView.java index 0baa42dd..cece9538 100644 --- a/app/src/main/java/com/hiroshi/cimoc/ui/view/DetailView.java +++ b/app/src/main/java/com/hiroshi/cimoc/ui/view/DetailView.java @@ -7,7 +7,6 @@ import java.util.ArrayList; import java.util.List; -import java.util.Set; /** * Created by Hiroshi on 2016/8/21. diff --git a/app/src/main/java/com/hiroshi/cimoc/ui/view/FavoriteView.java b/app/src/main/java/com/hiroshi/cimoc/ui/view/FavoriteView.java index 47336bc2..f04c2736 100644 --- a/app/src/main/java/com/hiroshi/cimoc/ui/view/FavoriteView.java +++ b/app/src/main/java/com/hiroshi/cimoc/ui/view/FavoriteView.java @@ -1,6 +1,5 @@ package com.hiroshi.cimoc.ui.view; -import com.hiroshi.cimoc.model.Comic; import com.hiroshi.cimoc.model.MiniComic; import java.util.List; @@ -16,9 +15,11 @@ public interface FavoriteView extends GridView { void OnComicUnFavorite(long id); - void onComicUpdate(Comic comic, int progress, int max); + void onComicCheckSuccess(MiniComic comic, int progress, int max); - void onCheckComplete(); + void onComicCheckFail(); + + void onComicCheckComplete(); void onComicRead(MiniComic comic); @@ -26,4 +27,8 @@ public interface FavoriteView extends GridView { void onComicFilterFail(); + void onComicInsert(MiniComic comic); + + void onComicDelete(MiniComic comic); + } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index b26901d5..adaa021d 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -15,7 +15,9 @@ 读取最后阅读失败 作者声明 由于应用不够完善,遇到一些不正常的问题属于正常现象!\n使用过程中有什么建议或者遇到什么问题,欢迎邮件反馈!\n电子邮箱:cimoc_app@163.com\n如果问题比较严重,我会尽量在第二时间解决!\n最后,请不要在公开场合传播本应用,谢谢合作! - + 更新日志 + v1.4.3.1\n- 修复更新标签出错\n- 修复动漫之家数据抓取不完整\n- 修复清除历史记录失效 + 图源 关键字为空 请输入关键字 @@ -53,6 +55,7 @@ 标签选择 检查更新 + 检查更新失败 是否检查更新 正在检查更新 检查更新完成 @@ -138,7 +141,7 @@ 恢复成功 恢复失败 - version: 1.4.3 + version: 1.4.3.1 源代码 https://github.com/Arachnid-27/Cimoc 支持作者 diff --git a/build.gradle b/build.gradle index 6334c279..d286f48c 100644 --- a/build.gradle +++ b/build.gradle @@ -5,12 +5,12 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:2.2.1' + classpath 'com.android.tools.build:gradle:2.2.2' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8' - classpath 'org.greenrobot:greendao-gradle-plugin:3.1.1' + classpath 'org.greenrobot:greendao-gradle-plugin:3.2.0' } } diff --git a/gradle.properties b/gradle.properties index d2b19d3a..e6a1bc07 100644 --- a/gradle.properties +++ b/gradle.properties @@ -16,6 +16,8 @@ org.gradle.jvmargs=-Xmx2048M systemProp.http.proxyHost=127.0.0.1 systemProp.http.proxyPort=1080 +systemProp.https.proxyHost=127.0.0.1 +systemProp.https.proxyPort=1080 SUPPORT_LIB_VERSION=24.2.1 From 006be1241d3dfe23661616eb4e785977d50acc82 Mon Sep 17 00:00:00 2001 From: hiroshi Date: Thu, 1 Dec 2016 00:26:01 +0800 Subject: [PATCH 02/15] =?UTF-8?q?=E6=94=AF=E6=8C=81API25=20=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0Chuiyao=E6=BC=AB=E7=94=BB=20=E5=88=86=E7=A6=BB?= =?UTF-8?q?=E4=B8=8B=E8=BD=BD=E7=AB=A0=E8=8A=82Activity=20=E5=8A=A0?= =?UTF-8?q?=E5=85=A5=E9=98=B2=E6=AD=A2=E5=BF=AB=E9=80=9F=E7=82=B9=E5=87=BB?= =?UTF-8?q?=20=E4=BF=AE=E6=94=B9Activity=E5=85=B1=E4=BA=AB=E6=BC=AB?= =?UTF-8?q?=E7=94=BB=E6=96=B9=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 22 +- .../com/hiroshi/cimoc/CimocApplication.java | 4 +- .../java/com/hiroshi/cimoc/core/Download.java | 8 +- .../java/com/hiroshi/cimoc/core/Manga.java | 4 +- .../cimoc/core/manager/PreferenceManager.java | 1 + .../cimoc/core/manager/SourceManager.java | 9 + .../fresco/ImagePipelineFactoryBuilder.java | 2 + .../com/hiroshi/cimoc/global/FastClick.java | 20 ++ .../com/hiroshi/cimoc/global/SharedComic.java | 118 +++++++++++ .../java/com/hiroshi/cimoc/model/Chapter.java | 16 +- .../cimoc/presenter/AboutPresenter.java | 1 - .../cimoc/presenter/ChapterListPresenter.java | 106 ++++++++++ .../cimoc/presenter/DetailPresenter.java | 180 +++++------------ .../cimoc/presenter/DownloadPresenter.java | 9 - .../cimoc/presenter/FavoritePresenter.java | 4 +- .../cimoc/presenter/ReaderPresenter.java | 69 +++---- .../cimoc/presenter/TaskPresenter.java | 3 +- .../cimoc/service/DownloadService.java | 2 +- .../java/com/hiroshi/cimoc/soup/Node.java | 111 +++++++--- .../java/com/hiroshi/cimoc/source/CCTuku.java | 20 +- .../com/hiroshi/cimoc/source/Chuiyao.java | 133 ++++++++++++ .../java/com/hiroshi/cimoc/source/DM5.java | 10 +- .../java/com/hiroshi/cimoc/source/Dmzj.java | 10 +- .../com/hiroshi/cimoc/source/EHentai.java | 26 ++- .../com/hiroshi/cimoc/source/ExHentai.java | 22 +- .../java/com/hiroshi/cimoc/source/HHAAZZ.java | 22 +- .../java/com/hiroshi/cimoc/source/HHSSEE.java | 24 +-- .../com/hiroshi/cimoc/source/IKanman.java | 15 +- .../java/com/hiroshi/cimoc/source/MH57.java | 8 +- .../com/hiroshi/cimoc/source/MiaoWoo.java | 8 + .../com/hiroshi/cimoc/source/NHentai.java | 10 +- .../java/com/hiroshi/cimoc/source/Pic177.java | 12 +- .../java/com/hiroshi/cimoc/source/U17.java | 42 ++-- .../com/hiroshi/cimoc/source/Webtoon.java | 50 ++--- .../java/com/hiroshi/cimoc/source/Wnacg.java | 12 +- .../cimoc/ui/activity/BackupActivity.java | 58 ++---- .../ui/activity/ChapterListActivity.java | 159 +++++++++++++++ .../cimoc/ui/activity/DetailActivity.java | 190 ++++++------------ .../cimoc/ui/activity/MainActivity.java | 64 +++++- .../cimoc/ui/activity/ReaderActivity.java | 13 +- .../cimoc/ui/activity/ResultActivity.java | 2 +- .../cimoc/ui/activity/SettingsActivity.java | 22 +- .../cimoc/ui/activity/TagComicActivity.java | 2 +- .../cimoc/ui/activity/TaskActivity.java | 5 +- .../hiroshi/cimoc/ui/adapter/BaseAdapter.java | 4 +- .../cimoc/ui/adapter/ChapterListAdapter.java | 36 ++++ .../cimoc/ui/adapter/DetailAdapter.java | 2 +- .../cimoc/ui/adapter/ReaderAdapter.java | 8 +- .../cimoc/ui/adapter/SelectAdapter.java | 28 +-- .../cimoc/ui/fragment/ComicFragment.java | 4 - .../classical/grid/DownloadFragment.java | 5 - .../classical/grid/FavoriteFragment.java | 3 +- .../classical/grid/HistoryFragment.java | 2 +- .../cimoc/ui/view/ChapterListView.java | 26 +++ .../com/hiroshi/cimoc/ui/view/DetailView.java | 8 - .../hiroshi/cimoc/ui/view/DownloadView.java | 2 - .../hiroshi/cimoc/utils/PermissionUtils.java | 11 +- .../com/hiroshi/cimoc/utils/StringUtils.java | 17 +- .../main/res/layout/activity_chapter_list.xml | 32 +++ app/src/main/res/layout/activity_settings.xml | 22 ++ app/src/main/res/values/strings.xml | 13 +- gradle.properties | 2 +- 62 files changed, 1186 insertions(+), 667 deletions(-) create mode 100644 app/src/main/java/com/hiroshi/cimoc/global/FastClick.java create mode 100644 app/src/main/java/com/hiroshi/cimoc/global/SharedComic.java create mode 100644 app/src/main/java/com/hiroshi/cimoc/presenter/ChapterListPresenter.java create mode 100644 app/src/main/java/com/hiroshi/cimoc/source/Chuiyao.java create mode 100644 app/src/main/java/com/hiroshi/cimoc/source/MiaoWoo.java create mode 100644 app/src/main/java/com/hiroshi/cimoc/ui/activity/ChapterListActivity.java create mode 100644 app/src/main/java/com/hiroshi/cimoc/ui/adapter/ChapterListAdapter.java create mode 100644 app/src/main/java/com/hiroshi/cimoc/ui/view/ChapterListView.java create mode 100644 app/src/main/res/layout/activity_chapter_list.xml diff --git a/app/build.gradle b/app/build.gradle index 70e4057b..f3bf6c01 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -3,15 +3,15 @@ apply plugin: 'com.android.application' apply plugin: 'android-apt' android { - compileSdkVersion 24 - buildToolsVersion "24.0.3" + compileSdkVersion 25 + buildToolsVersion "25.0.1" defaultConfig { applicationId "com.hiroshi.cimoc" minSdkVersion 15 - targetSdkVersion 24 + targetSdkVersion 25 versionCode 1 - versionName "1.4.3.1" + versionName "1.4.4" resConfigs "en", "zh" } buildTypes { @@ -21,6 +21,14 @@ android { proguardFiles 'proguard-rules.pro' } } + splits { + abi { + enable true + reset() + include 'x86', 'x86_64', 'arm64-v8a', 'armeabi-v7a' + universalApk false + } + } } greendao { @@ -36,10 +44,10 @@ dependencies { compile 'com.jakewharton:butterknife:8.4.0' apt 'com.jakewharton:butterknife-compiler:8.4.0' compile 'org.greenrobot:greendao:3.2.0' - compile 'com.squareup.okhttp3:okhttp:3.4.1' + compile 'com.squareup.okhttp3:okhttp:3.4.2' compile 'com.facebook.fresco:fresco:0.14.1' - compile 'org.jsoup:jsoup:1.9.2' + compile 'org.jsoup:jsoup:1.10.1' compile 'org.adw.library:discrete-seekbar:1.0.1' - compile 'io.reactivex:rxjava:1.2.1' + compile 'io.reactivex:rxjava:1.2.3' compile 'io.reactivex:rxandroid:1.2.1' } diff --git a/app/src/main/java/com/hiroshi/cimoc/CimocApplication.java b/app/src/main/java/com/hiroshi/cimoc/CimocApplication.java index f8e1e906..d068def8 100644 --- a/app/src/main/java/com/hiroshi/cimoc/CimocApplication.java +++ b/app/src/main/java/com/hiroshi/cimoc/CimocApplication.java @@ -23,8 +23,8 @@ */ public class CimocApplication extends Application { - // 1.04.03.001 - public static final int VERSION = 10403001; + // 1.04.04.000 + public static final int VERSION = 10404000; private static DaoSession daoSession; private static OkHttpClient httpClient; diff --git a/app/src/main/java/com/hiroshi/cimoc/core/Download.java b/app/src/main/java/com/hiroshi/cimoc/core/Download.java index 27c6f777..1057af37 100644 --- a/app/src/main/java/com/hiroshi/cimoc/core/Download.java +++ b/app/src/main/java/com/hiroshi/cimoc/core/Download.java @@ -2,6 +2,7 @@ import com.hiroshi.cimoc.core.manager.SourceManager; import com.hiroshi.cimoc.model.Chapter; +import com.hiroshi.cimoc.model.Comic; import com.hiroshi.cimoc.model.ImageUrl; import com.hiroshi.cimoc.utils.FileUtils; @@ -22,8 +23,11 @@ */ public class Download { - public static Observable updateComicIndex(final List list, final int source, final String cid, - final String title, final String cover) { + public static Observable updateComicIndex(final List list, Comic comic) { + final int source = comic.getSource(); + final String cid = comic.getCid(); + final String title = comic.getTitle(); + final String cover = comic.getCover(); return Observable.create(new Observable.OnSubscribe() { @Override public void call(Subscriber subscriber) { diff --git a/app/src/main/java/com/hiroshi/cimoc/core/Manga.java b/app/src/main/java/com/hiroshi/cimoc/core/Manga.java index e39d5801..7563c408 100644 --- a/app/src/main/java/com/hiroshi/cimoc/core/Manga.java +++ b/app/src/main/java/com/hiroshi/cimoc/core/Manga.java @@ -56,8 +56,8 @@ public void call(Subscriber subscriber) { }).subscribeOn(Schedulers.io()); } - public static Observable> info(final int source, final Comic comic) { - final Parser parser = SourceManager.getParser(source); + public static Observable> info(final Comic comic) { + final Parser parser = SourceManager.getParser(comic.getSource()); return Observable.create(new Observable.OnSubscribe>() { @Override public void call(Subscriber> subscriber) { diff --git a/app/src/main/java/com/hiroshi/cimoc/core/manager/PreferenceManager.java b/app/src/main/java/com/hiroshi/cimoc/core/manager/PreferenceManager.java index ef919e20..aadc91ac 100644 --- a/app/src/main/java/com/hiroshi/cimoc/core/manager/PreferenceManager.java +++ b/app/src/main/java/com/hiroshi/cimoc/core/manager/PreferenceManager.java @@ -75,6 +75,7 @@ public class PreferenceManager { public static final String PREF_OTHER_LAUNCH = "pref_other_launch"; public static final String PREF_DOWNLOAD_CONNECTION = "pref_download_connection"; + public static final String PREF_DOWNLOAD_ORDER = "pref_download_order"; private static final String PREFERENCES_NAME = "cimoc_preferences"; diff --git a/app/src/main/java/com/hiroshi/cimoc/core/manager/SourceManager.java b/app/src/main/java/com/hiroshi/cimoc/core/manager/SourceManager.java index 3a567762..27db8c61 100644 --- a/app/src/main/java/com/hiroshi/cimoc/core/manager/SourceManager.java +++ b/app/src/main/java/com/hiroshi/cimoc/core/manager/SourceManager.java @@ -8,6 +8,7 @@ import com.hiroshi.cimoc.model.SourceDao; import com.hiroshi.cimoc.model.SourceDao.Properties; import com.hiroshi.cimoc.source.CCTuku; +import com.hiroshi.cimoc.source.Chuiyao; import com.hiroshi.cimoc.source.DM5; import com.hiroshi.cimoc.source.Dmzj; import com.hiroshi.cimoc.source.HHAAZZ; @@ -35,6 +36,7 @@ public class SourceManager { public static final int SOURCE_WEBTOON = 6; public static final int SOURCE_HHSSEE = 7; public static final int SOURCE_57MH = 8; + public static final int SOURCE_CHUIYAO = 9; public static final int SOURCE_EHENTAI = 100; public static final int SOURCE_EXHENTAI = 101; @@ -97,6 +99,8 @@ public static String getTitle(int id) { return "汗汗漫画"; case SOURCE_57MH: return "57漫画"; + case SOURCE_CHUIYAO: + return "吹妖漫画"; /* case SOURCE_EHENTAI: return "E-Hentai"; case SOURCE_EXHENTAI: @@ -131,6 +135,8 @@ public static Source getSource(String key) { return new Source(null, "汗汗漫画", SOURCE_HHSSEE, false); case "57MH": return new Source(null, "57漫画", SOURCE_57MH, false); + case "Chuiyao": + return new Source(null, "吹妖漫画", SOURCE_CHUIYAO, false); /* case "EHentai": return new Source(null, "E-Hentai", SOURCE_EHENTAI, false); case "ExHentai": @@ -178,6 +184,9 @@ public static Parser getParser(int source) { case SOURCE_57MH: parser = new MH57(); break; + case SOURCE_CHUIYAO: + parser = new Chuiyao(); + break; /* case SOURCE_EHENTAI: parser = new EHentai(); break; diff --git a/app/src/main/java/com/hiroshi/cimoc/fresco/ImagePipelineFactoryBuilder.java b/app/src/main/java/com/hiroshi/cimoc/fresco/ImagePipelineFactoryBuilder.java index 41d0825a..a27029f9 100644 --- a/app/src/main/java/com/hiroshi/cimoc/fresco/ImagePipelineFactoryBuilder.java +++ b/app/src/main/java/com/hiroshi/cimoc/fresco/ImagePipelineFactoryBuilder.java @@ -45,6 +45,8 @@ public static Headers getHeaders(int id) { return Headers.of("Referer", "http://www.hhssee.com"); case SourceManager.SOURCE_57MH: return Headers.of("Referer", "http://m.57mh.com"); + case SourceManager.SOURCE_CHUIYAO: + return Headers.of("Referer", "http://m.chuiyao.com"); /* case SourceManager.SOURCE_EHENTAI: return Headers.of("Referer", "http://g.e-hentai.org"); case SourceManager.SOURCE_EXHENTAI: diff --git a/app/src/main/java/com/hiroshi/cimoc/global/FastClick.java b/app/src/main/java/com/hiroshi/cimoc/global/FastClick.java new file mode 100644 index 00000000..7b6ef956 --- /dev/null +++ b/app/src/main/java/com/hiroshi/cimoc/global/FastClick.java @@ -0,0 +1,20 @@ +package com.hiroshi.cimoc.global; + +/** + * Created by Hiroshi on 2016/12/1. + */ + +public class FastClick { + + private static long last = 0; + + public static boolean isClickValid() { + long cur = System.currentTimeMillis(); + boolean valid = cur - last > 1200; + if (valid) { + last = cur; + } + return valid; + } + +} diff --git a/app/src/main/java/com/hiroshi/cimoc/global/SharedComic.java b/app/src/main/java/com/hiroshi/cimoc/global/SharedComic.java new file mode 100644 index 00000000..4b023461 --- /dev/null +++ b/app/src/main/java/com/hiroshi/cimoc/global/SharedComic.java @@ -0,0 +1,118 @@ +package com.hiroshi.cimoc.global; + +import com.hiroshi.cimoc.core.manager.ComicManager; +import com.hiroshi.cimoc.model.Comic; +import com.hiroshi.cimoc.model.MiniComic; + +/** + * Created by Hiroshi on 2016/11/14. + */ + +public class SharedComic { + + private static SharedComic instance; + + private Comic mCurrentComic; + private ComicManager mComicManager; + + private SharedComic() { + mComicManager = ComicManager.getInstance(); + } + + public MiniComic minify() { + return new MiniComic(mCurrentComic); + } + + public Comic get() { + return mCurrentComic; + } + + public String last() { + return mCurrentComic.getLast(); + } + + public Integer page() { + return mCurrentComic.getPage(); + } + + public int source() { + return mCurrentComic.getSource(); + } + + public String cid() { + return mCurrentComic.getCid(); + } + + public String title() { + return mCurrentComic.getTitle(); + } + + public boolean isDownload() { + return mCurrentComic.getDownload() != null; + } + + public boolean isFavorite() { + return mCurrentComic.getFavorite() != null; + } + + public boolean isHistory() { + return mCurrentComic.getHistory() != null; + } + + public boolean isHighLight() { + return mCurrentComic.getHighlight(); + } + + public Long id() { + return mCurrentComic.getId(); + } + + public void open(long id) { + mCurrentComic = mComicManager.load(id); + } + + public void open(int source, String cid) { + mCurrentComic = mComicManager.load(source, cid); + } + + public void open(Comic comic) { + mCurrentComic = comic; + } + + public void insert() { + if (mCurrentComic.getId() == null) { + long id = mComicManager.insert(mCurrentComic); + mCurrentComic.setId(id); + } + } + + public void delete() { + if (!isDownload() && !isHistory() && !isFavorite()) { + mComicManager.delete(mCurrentComic); + mCurrentComic.setId(null); + } + } + + public void update() { + if (mCurrentComic.getId() != null) { + mComicManager.update(mCurrentComic); + } + } + + public void updateOrInsert() { + if (mCurrentComic.getId() != null) { + mComicManager.update(mCurrentComic); + } else { + long id = mComicManager.insert(mCurrentComic); + mCurrentComic.setId(id); + } + } + + public static SharedComic getInstance() { + if (instance == null) { + instance = new SharedComic(); + } + return instance; + } + +} diff --git a/app/src/main/java/com/hiroshi/cimoc/model/Chapter.java b/app/src/main/java/com/hiroshi/cimoc/model/Chapter.java index 1bd0f0a1..23a4eb55 100644 --- a/app/src/main/java/com/hiroshi/cimoc/model/Chapter.java +++ b/app/src/main/java/com/hiroshi/cimoc/model/Chapter.java @@ -11,13 +11,15 @@ public class Chapter implements Parcelable { private String title; private String path; private int count; + private boolean complete; private boolean download; - public Chapter(String title, String path, int count, boolean download) { + public Chapter(String title, String path, int count, boolean complete) { this.title = title; this.path = path; this.count = count; - this.download = download; + this.complete = complete; + this.download = false; } public Chapter(String title, String path) { @@ -44,6 +46,14 @@ public void setCount(int count) { this.count = count; } + public boolean isComplete() { + return complete; + } + + public void setComplete(boolean complete) { + this.complete = complete; + } + public boolean isDownload() { return download; } @@ -72,7 +82,7 @@ public void writeToParcel(Parcel dest, int flags) { dest.writeString(title); dest.writeString(path); dest.writeInt(count); - dest.writeByte((byte) (download ? 1 : 0)); + dest.writeByte((byte) (complete ? 1 : 0)); } public final static Parcelable.Creator CREATOR = new Parcelable.Creator() { diff --git a/app/src/main/java/com/hiroshi/cimoc/presenter/AboutPresenter.java b/app/src/main/java/com/hiroshi/cimoc/presenter/AboutPresenter.java index 03a71db9..88cb42bc 100644 --- a/app/src/main/java/com/hiroshi/cimoc/presenter/AboutPresenter.java +++ b/app/src/main/java/com/hiroshi/cimoc/presenter/AboutPresenter.java @@ -31,5 +31,4 @@ public void call(Throwable throwable) { })); } - } diff --git a/app/src/main/java/com/hiroshi/cimoc/presenter/ChapterListPresenter.java b/app/src/main/java/com/hiroshi/cimoc/presenter/ChapterListPresenter.java new file mode 100644 index 00000000..4fd77cba --- /dev/null +++ b/app/src/main/java/com/hiroshi/cimoc/presenter/ChapterListPresenter.java @@ -0,0 +1,106 @@ +package com.hiroshi.cimoc.presenter; + +import com.hiroshi.cimoc.core.Download; +import com.hiroshi.cimoc.global.SharedComic; +import com.hiroshi.cimoc.core.manager.ComicManager; +import com.hiroshi.cimoc.core.manager.TaskManager; +import com.hiroshi.cimoc.model.Chapter; +import com.hiroshi.cimoc.model.Task; +import com.hiroshi.cimoc.rx.RxBus; +import com.hiroshi.cimoc.rx.RxEvent; +import com.hiroshi.cimoc.ui.view.ChapterListView; + +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; +import java.util.concurrent.Callable; + +import rx.android.schedulers.AndroidSchedulers; +import rx.functions.Action1; + +/** + * Created by Hiroshi on 2016/11/14. + */ + +public class ChapterListPresenter extends BasePresenter { + + private ComicManager mComicManager; + private TaskManager mTaskManager; + private SharedComic mSharedComic; + + public ChapterListPresenter() { + mComicManager = ComicManager.getInstance(); + mTaskManager = TaskManager.getInstance(); + mSharedComic = SharedComic.getInstance(); + } + + public void loadDownload() { + if (mSharedComic.isDownload()) { + mCompositeSubscription.add(mTaskManager.list(mSharedComic.id()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Action1>() { + @Override + public void call(List list) { + mBaseView.onDownloadLoadSuccess(list); + } + }, new Action1() { + @Override + public void call(Throwable throwable) { + mBaseView.onDownloadLoadFail(); + } + })); + } else { + mBaseView.onDownloadLoadSuccess(new LinkedList()); + } + } + + public void addTask(final List list) { + mCompositeSubscription.add(mComicManager.callInRx(new Callable>() { + @Override + public ArrayList call() throws Exception { + Long key = mSharedComic.id(); + mSharedComic.get().setDownload(System.currentTimeMillis()); + mSharedComic.updateOrInsert(); + ArrayList taskList = new ArrayList<>(list.size()); + for (Chapter chapter : list) { + Task task = new Task(null, key, chapter.getPath(), chapter.getTitle(), 0, 0); + long id = mTaskManager.insert(task); + task.setId(id); + task.setInfo(mSharedComic.source(), mSharedComic.cid(), mSharedComic.title()); + task.setState(Task.STATE_WAIT); + taskList.add(task); + } + RxBus.getInstance().post(new RxEvent(RxEvent.EVENT_TASK_INSERT, mSharedComic.minify(), taskList)); + return taskList; + } + }).observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Action1>() { + @Override + public void call(ArrayList list) { + mBaseView.onTaskAddSuccess(list); + } + }, new Action1() { + @Override + public void call(Throwable throwable) { + mBaseView.onTaskAddFail(); + } + })); + } + + public void updateIndex(List list) { + mCompositeSubscription.add(Download.updateComicIndex(list, mSharedComic.get()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Action1() { + @Override + public void call(Void aVoid) { + mBaseView.onUpdateIndexSuccess(); + } + }, new Action1() { + @Override + public void call(Throwable throwable) { + mBaseView.onUpdateIndexFail(); + } + })); + } + +} diff --git a/app/src/main/java/com/hiroshi/cimoc/presenter/DetailPresenter.java b/app/src/main/java/com/hiroshi/cimoc/presenter/DetailPresenter.java index b1a4a9fe..22b5c272 100644 --- a/app/src/main/java/com/hiroshi/cimoc/presenter/DetailPresenter.java +++ b/app/src/main/java/com/hiroshi/cimoc/presenter/DetailPresenter.java @@ -1,13 +1,11 @@ package com.hiroshi.cimoc.presenter; -import com.hiroshi.cimoc.core.Download; import com.hiroshi.cimoc.core.Manga; -import com.hiroshi.cimoc.core.manager.ComicManager; +import com.hiroshi.cimoc.global.SharedComic; import com.hiroshi.cimoc.core.manager.TagManager; import com.hiroshi.cimoc.core.manager.TaskManager; import com.hiroshi.cimoc.model.Chapter; import com.hiroshi.cimoc.model.Comic; -import com.hiroshi.cimoc.model.MiniComic; import com.hiroshi.cimoc.model.Selectable; import com.hiroshi.cimoc.model.Tag; import com.hiroshi.cimoc.model.TagRef; @@ -15,15 +13,12 @@ import com.hiroshi.cimoc.rx.RxBus; import com.hiroshi.cimoc.rx.RxEvent; import com.hiroshi.cimoc.rx.ToAnotherList; -import com.hiroshi.cimoc.ui.fragment.ComicFragment; import com.hiroshi.cimoc.ui.view.DetailView; -import java.util.ArrayList; import java.util.HashSet; import java.util.LinkedList; import java.util.List; import java.util.Set; -import java.util.concurrent.Callable; import rx.Observable; import rx.Subscriber; @@ -37,16 +32,15 @@ */ public class DetailPresenter extends BasePresenter { - private ComicManager mComicManager; private TaskManager mTaskManager; private TagManager mTagManager; - private Comic mComic; + private SharedComic mSharedComic; private Set mTagSet; public DetailPresenter() { - mComicManager = ComicManager.getInstance(); mTaskManager = TaskManager.getInstance(); mTagManager = TagManager.getInstance(); + mSharedComic = SharedComic.getInstance(); mTagSet = new HashSet<>(); } @@ -55,47 +49,43 @@ protected void initSubscription() { addSubscription(RxEvent.EVENT_COMIC_CHAPTER_CHANGE, new Action1() { @Override public void call(RxEvent rxEvent) { - String last = (String) rxEvent.getData(); - int page = (int) rxEvent.getData(1); - mComic.setHistory(System.currentTimeMillis()); - mComic.setLast(last); - mComic.setPage(page); - mBaseView.onChapterChange(last); - } - }); - addSubscription(RxEvent.EVENT_COMIC_PAGE_CHANGE, new Action1() { - @Override - public void call(RxEvent rxEvent) { - mComic.setPage((Integer) rxEvent.getData()); - if (mComic.getId() != null) { - mComicManager.update(mComic); - } + mBaseView.onChapterChange(mSharedComic.last()); } }); } - public void loadDetail(long id, final int source, final String cid) { - mComic = id == -1 ? mComicManager.load(source, cid) : mComicManager.load(id); - if (mComic == null) { - mComic = new Comic(source, cid); - } if (mComic.getHighlight()) { - mComic.setHighlight(false); - mComic.setFavorite(System.currentTimeMillis()); - mComicManager.update(mComic); + public void loadDetail(int source, String cid) { + mSharedComic.open(source, cid); + if (mSharedComic.get() == null) { + mSharedComic.open(new Comic(source, cid)); + } + loadDetail(); + } + + public void loadDetail(long id) { + mSharedComic.open(id); + loadDetail(); + } + + public void loadDetail() { + if (mSharedComic.isHighLight()) { + mSharedComic.get().setHighlight(false); + mSharedComic.get().setFavorite(System.currentTimeMillis()); + mSharedComic.update(); } - mCompositeSubscription.add(Manga.info(source, mComic) + mCompositeSubscription.add(Manga.info(mSharedComic.get()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Action1>() { @Override public void call(List list) { - mBaseView.onComicLoadSuccess(mComic); + mBaseView.onComicLoadSuccess(mSharedComic.get()); mBaseView.onChapterLoadSuccess(list); mBaseView.onDetailLoadSuccess(); } }, new Action1() { @Override public void call(Throwable throwable) { - mBaseView.onComicLoadSuccess(mComic); + mBaseView.onComicLoadSuccess(mSharedComic.get()); if (throwable instanceof Manga.NetworkErrorException) { mBaseView.onNetworkError(); } else { @@ -107,7 +97,7 @@ public void call(Throwable throwable) { public void loadTag() { mTagSet.clear(); - mCompositeSubscription.add(mTagManager.listByComic(mComic.getId()) + mCompositeSubscription.add(mTagManager.listByComic(mSharedComic.id()) .compose(new ToAnotherList<>(new Func1() { @Override public Long call(TagRef ref) { @@ -153,14 +143,14 @@ public void call(Subscriber subscriber) { @Override public void run() { for (Long tid : deleteList) { - mTagManager.delete(tid, mComic.getId()); + mTagManager.delete(tid, mSharedComic.id()); } for (Long tid : insertList) { - mTagManager.insert(new TagRef(null, tid, mComic.getId())); + mTagManager.insert(new TagRef(null, tid, mSharedComic.id())); } } }); - RxBus.getInstance().post(new RxEvent(RxEvent.EVENT_TAG_UPDATE, new MiniComic(mComic), deleteList, insertList)); + RxBus.getInstance().post(new RxEvent(RxEvent.EVENT_TAG_UPDATE, mSharedComic.minify(), deleteList, insertList)); } subscriber.onNext(null); subscriber.onCompleted(); @@ -180,25 +170,9 @@ public void call(Throwable throwable) { })); } - public void updateIndex(List list) { - mCompositeSubscription.add(Download.updateComicIndex(list, mComic.getSource(), mComic.getCid(), mComic.getTitle(), mComic.getCover()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(new Action1() { - @Override - public void call(Void aVoid) { - mBaseView.onUpdateIndexSuccess(); - } - }, new Action1() { - @Override - public void call(Throwable throwable) { - mBaseView.onUpdateIndexFail(); - } - })); - } - public void loadDownload() { - if (mComic.getDownload() != null) { - mCompositeSubscription.add(mTaskManager.list(mComic.getId()) + if (mSharedComic.isDownload()) { + mCompositeSubscription.add(mTaskManager.list(mSharedComic.id()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Action1>() { @Override @@ -216,90 +190,42 @@ public void call(Throwable throwable) { } } - public void addTask(final List list) { - mCompositeSubscription.add(mComicManager.callInRx(new Callable>() { - @Override - public ArrayList call() throws Exception { - Long key = mComic.getId(); - mComic.setDownload(System.currentTimeMillis()); - if (key != null) { - mComicManager.update(mComic); - } else { - key = mComicManager.insert(mComic); - mComic.setId(key); - } - ArrayList taskList = new ArrayList<>(list.size()); - for (Chapter chapter : list) { - Task task = new Task(null, key, chapter.getPath(), chapter.getTitle(), 0, 0); - long id = mTaskManager.insert(task); - task.setId(id); - task.setInfo(mComic.getSource(), mComic.getCid(), mComic.getTitle()); - task.setState(Task.STATE_WAIT); - taskList.add(task); - } - RxBus.getInstance().post(new RxEvent(RxEvent.EVENT_TASK_INSERT, new MiniComic(mComic), taskList)); - return taskList; - } - }).observeOn(AndroidSchedulers.mainThread()) - .subscribe(new Action1>() { - @Override - public void call(ArrayList list) { - mBaseView.onTaskAddSuccess(list); - } - }, new Action1() { - @Override - public void call(Throwable throwable) { - mBaseView.onTaskAddFail(); - } - })); - } - - public long updateLast(String last, int type) { - if (type == ComicFragment.TYPE_FAVORITE) { - mComic.setFavorite(System.currentTimeMillis()); + public void updateLast(String last, boolean favorite) { + if (favorite) { + mSharedComic.get().setFavorite(System.currentTimeMillis()); } - mComic.setHistory(System.currentTimeMillis()); - if (!last.equals(mComic.getLast())) { - mComic.setLast(last); - mComic.setPage(1); + mSharedComic.get().setHistory(System.currentTimeMillis()); + if (!last.equals(mSharedComic.get().getLast())) { + mSharedComic.get().setLast(last); + mSharedComic.get().setPage(1); } - if (mComic.getId() != null) { - mComicManager.update(mComic); + if (mSharedComic.id() != null) { + mSharedComic.update(); } else { - long id = mComicManager.insert(mComic); - mComic.setId(id); + mSharedComic.insert(); } - RxBus.getInstance().post(new RxEvent(RxEvent.EVENT_COMIC_READ, new MiniComic(mComic), type)); - return mComic.getId(); + RxBus.getInstance().post(new RxEvent(RxEvent.EVENT_COMIC_READ, mSharedComic.minify(), favorite)); } - public void updateComic() { - if (mComic.getId() != null) { - mComicManager.update(mComic); - } + public boolean isFavorite() { + return mSharedComic.isFavorite(); } - public Comic getComic() { - return mComic; + public String getLast() { + return mSharedComic.last(); } public void favoriteComic() { - mComic.setFavorite(System.currentTimeMillis()); - if (mComic.getId() == null) { - long id = mComicManager.insert(mComic); - mComic.setId(id); - } - RxBus.getInstance().post(new RxEvent(RxEvent.EVENT_COMIC_FAVORITE, new MiniComic(mComic))); + mSharedComic.get().setFavorite(System.currentTimeMillis()); + mSharedComic.insert(); + RxBus.getInstance().post(new RxEvent(RxEvent.EVENT_COMIC_FAVORITE, mSharedComic.minify())); } public void unfavoriteComic() { - long id = mComic.getId(); - mComic.setFavorite(null); - mTagManager.deleteByComic(mComic.getId()); - if (mComic.getHistory() == null && mComic.getDownload() == null) { - mComicManager.deleteByKey(id); - mComic.setId(null); - } + long id = mSharedComic.id(); + mSharedComic.get().setFavorite(null); + mTagManager.deleteByComic(id); + mSharedComic.delete(); RxBus.getInstance().post(new RxEvent(RxEvent.EVENT_COMIC_UNFAVORITE, id)); } diff --git a/app/src/main/java/com/hiroshi/cimoc/presenter/DownloadPresenter.java b/app/src/main/java/com/hiroshi/cimoc/presenter/DownloadPresenter.java index 2c7e725f..accb2bdb 100644 --- a/app/src/main/java/com/hiroshi/cimoc/presenter/DownloadPresenter.java +++ b/app/src/main/java/com/hiroshi/cimoc/presenter/DownloadPresenter.java @@ -8,7 +8,6 @@ import com.hiroshi.cimoc.model.Task; import com.hiroshi.cimoc.rx.RxEvent; import com.hiroshi.cimoc.rx.ToAnotherList; -import com.hiroshi.cimoc.ui.fragment.ComicFragment; import com.hiroshi.cimoc.ui.view.DownloadView; import java.util.ArrayList; @@ -60,14 +59,6 @@ public void call(RxEvent rxEvent) { mBaseView.onDownloadStop(); } }); - addSubscription(RxEvent.EVENT_COMIC_READ, new Action1() { - @Override - public void call(RxEvent rxEvent) { - if ((int) rxEvent.getData(1) == ComicFragment.TYPE_DOWNLOAD) { - mBaseView.onComicRead((MiniComic) rxEvent.getData()); - } - } - }); addSubscription(RxEvent.EVENT_THEME_CHANGE, new Action1() { @Override public void call(RxEvent rxEvent) { diff --git a/app/src/main/java/com/hiroshi/cimoc/presenter/FavoritePresenter.java b/app/src/main/java/com/hiroshi/cimoc/presenter/FavoritePresenter.java index 35e29122..597de807 100644 --- a/app/src/main/java/com/hiroshi/cimoc/presenter/FavoritePresenter.java +++ b/app/src/main/java/com/hiroshi/cimoc/presenter/FavoritePresenter.java @@ -81,7 +81,7 @@ public void call(RxEvent rxEvent) { for (MiniComic comic : list) { mComicArray.put(comic.getId(), comic); } - if (mTagId != -1) { + if (mTagId == -1) { mBaseView.OnComicRestore(list); } } @@ -89,7 +89,7 @@ public void call(RxEvent rxEvent) { addSubscription(RxEvent.EVENT_COMIC_READ, new Action1() { @Override public void call(RxEvent rxEvent) { - if ((int) rxEvent.getData(1) == ComicFragment.TYPE_FAVORITE) { + if ((boolean) rxEvent.getData(1)) { MiniComic comic = (MiniComic) rxEvent.getData(); mComicArray.put(comic.getId(), comic); mBaseView.onComicRead(comic); diff --git a/app/src/main/java/com/hiroshi/cimoc/presenter/ReaderPresenter.java b/app/src/main/java/com/hiroshi/cimoc/presenter/ReaderPresenter.java index 557ef932..179a6cff 100644 --- a/app/src/main/java/com/hiroshi/cimoc/presenter/ReaderPresenter.java +++ b/app/src/main/java/com/hiroshi/cimoc/presenter/ReaderPresenter.java @@ -2,10 +2,9 @@ import com.hiroshi.cimoc.core.Download; import com.hiroshi.cimoc.core.Manga; +import com.hiroshi.cimoc.global.SharedComic; import com.hiroshi.cimoc.core.Storage; -import com.hiroshi.cimoc.core.manager.ComicManager; import com.hiroshi.cimoc.model.Chapter; -import com.hiroshi.cimoc.model.Comic; import com.hiroshi.cimoc.model.ImageUrl; import com.hiroshi.cimoc.rx.RxBus; import com.hiroshi.cimoc.rx.RxEvent; @@ -30,24 +29,19 @@ public class ReaderPresenter extends BasePresenter { private final static int LOAD_NEXT = 3; private PreloadAdapter mPreloadAdapter; - private ComicManager mComicManager; - private Comic mComic; + private SharedComic mSharedComic; - private boolean isShowNext; - private boolean isShowPrev; - private int count; - - private int status; + private boolean isShowNext = true; + private boolean isShowPrev = true; + private int count = 0; + private int status = LOAD_INIT; public ReaderPresenter() { - mComicManager = ComicManager.getInstance(); - this.isShowNext = true; - this.isShowPrev = true; - this.count = 0; + mSharedComic = SharedComic.getInstance(); } public void lazyLoad(final ImageUrl imageUrl) { - mCompositeSubscription.add(Manga.load(mComic.getSource(), imageUrl.getFirstUrl()) + mCompositeSubscription.add(Manga.load(mSharedComic.source(), imageUrl.getFirstUrl()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Action1() { @Override @@ -66,16 +60,14 @@ public void call(Throwable throwable) { })); } - public void loadInit(long id, Chapter[] array) { - status = LOAD_INIT; - mComic = mComicManager.load(id); + public void loadInit(Chapter[] array) { for (int i = 0; i != array.length; ++i) { - if (array[i].getPath().equals(mComic.getLast())) { + if (array[i].getPath().equals(mSharedComic.last())) { this.mPreloadAdapter = new PreloadAdapter(array, i); Chapter chapter = array[i]; - images(chapter.isDownload() ? - Download.images(mComic.getSource(), mComic.getTitle(), chapter.getTitle()) : - Manga.images(mComic.getSource(), mComic.getCid(), chapter.getPath())); + images(chapter.isComplete() ? + Download.images(mSharedComic.source(), mSharedComic.title(), chapter.getTitle()) : + Manga.images(mSharedComic.source(), mSharedComic.cid(), chapter.getPath())); } } } @@ -85,9 +77,9 @@ public void loadNext() { Chapter chapter = mPreloadAdapter.getNextChapter(); if (chapter != null) { status = LOAD_NEXT; - images(chapter.isDownload() ? - Download.images(mComic.getSource(), mComic.getTitle(), chapter.getTitle()) : - Manga.images(mComic.getSource(), mComic.getCid(), chapter.getPath())); + images(chapter.isComplete() ? + Download.images(mSharedComic.source(), mSharedComic.title(), chapter.getTitle()) : + Manga.images(mSharedComic.source(), mSharedComic.cid(), chapter.getPath())); mBaseView.onNextLoading(); } else { isShowNext = false; @@ -101,9 +93,9 @@ public void loadPrev() { Chapter chapter = mPreloadAdapter.getPrevChapter(); if (chapter != null) { status = LOAD_PREV; - images(chapter.isDownload() ? - Download.images(mComic.getSource(), mComic.getTitle(), chapter.getTitle()) : - Manga.images(mComic.getSource(), mComic.getCid(), chapter.getPath())); + images(chapter.isComplete() ? + Download.images(mSharedComic.source(), mSharedComic.title(), chapter.getTitle()) : + Manga.images(mSharedComic.source(), mSharedComic.cid(), chapter.getPath())); mBaseView.onPrevLoading(); } else { isShowPrev = false; @@ -116,10 +108,10 @@ public void toNextChapter() { Chapter chapter = mPreloadAdapter.nextChapter(); if (chapter != null) { mBaseView.onChapterChange(chapter); - mComic.setLast(chapter.getPath()); - mComic.setPage(1); - mComicManager.update(mComic); - RxBus.getInstance().post(new RxEvent(RxEvent.EVENT_COMIC_CHAPTER_CHANGE, chapter.getPath(), chapter.getCount())); + mSharedComic.get().setLast(chapter.getPath()); + mSharedComic.get().setPage(1); + mSharedComic.update(); + RxBus.getInstance().post(new RxEvent(RxEvent.EVENT_COMIC_CHAPTER_CHANGE)); } } @@ -127,10 +119,10 @@ public void toPrevChapter() { Chapter chapter = mPreloadAdapter.prevChapter(); if (chapter != null) { mBaseView.onChapterChange(chapter); - mComic.setLast(chapter.getPath()); - mComic.setPage(chapter.getCount()); - mComicManager.update(mComic); - RxBus.getInstance().post(new RxEvent(RxEvent.EVENT_COMIC_CHAPTER_CHANGE, chapter.getPath(), chapter.getCount())); + mSharedComic.get().setLast(chapter.getPath()); + mSharedComic.get().setPage(chapter.getCount()); + mSharedComic.update(); + RxBus.getInstance().post(new RxEvent(RxEvent.EVENT_COMIC_CHAPTER_CHANGE)); } } @@ -152,9 +144,8 @@ public void call(Throwable throwable) { public void updateComic(int page) { if (status != LOAD_INIT) { - mComic.setPage(page); - mComicManager.update(mComic); - RxBus.getInstance().post(new RxEvent(RxEvent.EVENT_COMIC_CHAPTER_CHANGE, mComic.getLast(), page)); + mSharedComic.get().setPage(page); + mSharedComic.update(); } } @@ -170,7 +161,7 @@ public void call(List list) { chapter = mPreloadAdapter.moveNext(); chapter.setCount(list.size()); mBaseView.onChapterChange(chapter); - mBaseView.onInitLoadSuccess(list, mComic.getPage(), mComic.getSource()); + mBaseView.onInitLoadSuccess(list, mSharedComic.page(), mSharedComic.source()); break; case LOAD_PREV: chapter = mPreloadAdapter.movePrev(); diff --git a/app/src/main/java/com/hiroshi/cimoc/presenter/TaskPresenter.java b/app/src/main/java/com/hiroshi/cimoc/presenter/TaskPresenter.java index 603d5237..1b72bd66 100644 --- a/app/src/main/java/com/hiroshi/cimoc/presenter/TaskPresenter.java +++ b/app/src/main/java/com/hiroshi/cimoc/presenter/TaskPresenter.java @@ -8,7 +8,6 @@ import com.hiroshi.cimoc.model.Task; import com.hiroshi.cimoc.rx.RxBus; import com.hiroshi.cimoc.rx.RxEvent; -import com.hiroshi.cimoc.ui.fragment.ComicFragment; import com.hiroshi.cimoc.ui.view.TaskView; import java.util.Collections; @@ -192,7 +191,7 @@ public long updateLast(String last) { long id = mComicManager.insert(mComic); mComic.setId(id); } - RxBus.getInstance().post(new RxEvent(RxEvent.EVENT_COMIC_READ, new MiniComic(mComic), ComicFragment.TYPE_DOWNLOAD)); + RxBus.getInstance().post(new RxEvent(RxEvent.EVENT_COMIC_READ, new MiniComic(mComic))); return mComic.getId(); } diff --git a/app/src/main/java/com/hiroshi/cimoc/service/DownloadService.java b/app/src/main/java/com/hiroshi/cimoc/service/DownloadService.java index 1b983e87..491cc561 100644 --- a/app/src/main/java/com/hiroshi/cimoc/service/DownloadService.java +++ b/app/src/main/java/com/hiroshi/cimoc/service/DownloadService.java @@ -233,7 +233,7 @@ private void onDownloadProgress(int progress) { } private boolean writeToFile(InputStream byteStream, int count, String url) { - String suffix = StringUtils.getSplit(url, "\\.", -1); + String suffix = StringUtils.split(url, "\\.", -1); if (suffix == null) { suffix = "jpg"; } else { diff --git a/app/src/main/java/com/hiroshi/cimoc/soup/Node.java b/app/src/main/java/com/hiroshi/cimoc/soup/Node.java index 8de2e888..1359352c 100644 --- a/app/src/main/java/com/hiroshi/cimoc/soup/Node.java +++ b/app/src/main/java/com/hiroshi/cimoc/soup/Node.java @@ -1,5 +1,7 @@ package com.hiroshi.cimoc.soup; +import com.hiroshi.cimoc.utils.StringUtils; + import org.jsoup.Jsoup; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; @@ -36,65 +38,120 @@ public List list(String cssQuery) { } public String text() { - return element.text(); + return element.text().trim(); } public String text(String cssQuery) { try { - return element.select(cssQuery).first().text(); + return element.select(cssQuery).first().text().trim(); } catch (Exception e) { e.printStackTrace(); } return null; } - public String text(String cssQuery, int start, int end) { - String s = text(cssQuery); - if (s == null) { - return null; - } - if (end < 0) { - return s.substring(start, s.length() + 1 + end); - } - return s.substring(start, end); + public String textWithSubstring(String cssQuery, int start, int end) { + return StringUtils.substring(text(cssQuery), start, end); } - public String text(String cssQuery, int start) { - return text(cssQuery, start, -1); + public String textWithSubstring(String cssQuery, int start) { + return textWithSubstring(cssQuery, start, -1); } - public String text(String cssQuery, String regex, int index) { - String s = text(cssQuery); - if (s != null) { - return s.split(regex)[index]; - } - return null; + public String textWithSplit(String cssQuery, String regex, int index) { + return StringUtils.split(text(cssQuery), regex, index); } public String attr(String attr) { try { - return element.attr(attr); + return element.attr(attr).trim(); } catch (Exception e) { e.printStackTrace(); } return null; } - public String attr(String attr, String regex, int index) { - return attr(attr).split(regex)[index]; - } - public String attr(String cssQuery, String attr) { try { - return element.select(cssQuery).first().attr(attr); + return element.select(cssQuery).first().attr(attr).trim(); } catch (Exception e) { e.printStackTrace(); } return null; } - public String attr(String cssQuery, String attr, String regex, int index) { - return attr(cssQuery, attr).split(regex)[index]; + public String attrWithSubString(String attr, int start, int end) { + return StringUtils.substring(attr(attr), start, end); + } + + public String attrWithSubString(String attr, int start) { + return attrWithSubString(attr, start, -1); + } + + public String attrWithSubString(String cssQuery, String attr, int start, int end) { + return StringUtils.substring(attr(cssQuery, attr), start, end); + } + + public String attrWithSubString(String cssQuery, String attr, int start) { + return attrWithSubString(cssQuery, attr, start, -1); + } + + public String attrWithSplit(String attr, String regex, int index) { + return StringUtils.split(attr(attr), regex, index); + } + + public String attrWithSplit(String cssQuery, String attr, String regex, int index) { + return StringUtils.split(attr(cssQuery, attr), regex, index); + } + + public String src() { + return attr("src"); + } + + public String src(String cssQuery) { + return attr(cssQuery, "src"); + } + + public String href() { + return attr("href"); + } + + public String href(String cssQuery) { + return attr(cssQuery, "href"); + } + + public String hrefWithSubString(int start, int end) { + return attrWithSubString("href", start, end); + } + + public String hrefWithSubString(int start) { + return hrefWithSubString(start, -1); + } + + public String hrefWithSubString(String cssQuery, int start, int end) { + return attrWithSubString(cssQuery, "href", start, end); + } + + public String hrefWithSubString(String cssQuery, int start) { + return hrefWithSubString(cssQuery, start, -1); + } + + public String hrefWithSplit(int index) { + return splitHref(href(), index); + } + + public String hrefWithSplit(String cssQuery, int index) { + return splitHref(href(cssQuery), index); + } + + private String splitHref(String str, int index) { + if (str == null) { + return null; + } + str = str.replaceFirst(".*\\..*?/", ""); + str = str.replaceAll("[/\\.=\\?]", " "); + str = str.trim(); + return StringUtils.split(str, "\\s+", index); } } diff --git a/app/src/main/java/com/hiroshi/cimoc/source/CCTuku.java b/app/src/main/java/com/hiroshi/cimoc/source/CCTuku.java index 0e2e8701..8bbe89df 100644 --- a/app/src/main/java/com/hiroshi/cimoc/source/CCTuku.java +++ b/app/src/main/java/com/hiroshi/cimoc/source/CCTuku.java @@ -37,9 +37,9 @@ public SearchIterator getSearchIterator(String html, int page) { return new NodeIterator(body.list("div.main-list > div > div > div")) { @Override protected Comic parse(Node node) { - String cid = node.attr("div:eq(1) > div:eq(0) > a", "href", "/", 2); + String cid = node.hrefWithSplit("div:eq(1) > div:eq(0) > a", 1); String title = node.text("div:eq(1) > div:eq(0) > a"); - String cover = node.attr("div:eq(0) > a > img", "src"); + String cover = node.src("div:eq(0) > a > img"); String update = node.text("div:eq(1) > div:eq(1) > dl:eq(3) > dd > font"); String author = node.text("div:eq(1) > div:eq(1) > dl:eq(1) > dd > a"); return new Comic(SourceManager.SOURCE_CCTUKU, cid, title, cover, update, author); @@ -56,12 +56,12 @@ public Request getInfoRequest(String cid) { @Override public String parseInfo(String html, Comic comic) { Node body = new Node(html); - String title = body.text("div.title-banner > div.book-title > h1", 0, -3); - String cover = body.attr("div.book > div > div.row > div:eq(0) > a > img", "src"); - String update = body.text("div.book > div > div.row > div:eq(1) > div > dl:eq(5) > dd > font", 0, 10); + String title = body.textWithSubstring("div.title-banner > div.book-title > h1", 0, -3); + String cover = body.src("div.book > div > div.row > div:eq(0) > a > img"); + String update = body.textWithSubstring("div.book > div > div.row > div:eq(1) > div > dl:eq(5) > dd > font", 0, 10); String author = body.text("div.book > div > div.row > div:eq(1) > div > dl:eq(1) > dd > a"); String intro = body.text("div.book-details > p:eq(1)"); - boolean status = "完结".equals(body.text("div.book > div > div.row > div:eq(0) > div")); + boolean status = body.text("div.book > div > div.row > div:eq(0) > div").contains("完结"); comic.setInfo(title, cover, update, intro, author, status); return null; @@ -73,7 +73,7 @@ public List parseChapter(String html) { Node body = new Node(html); for (Node node : body.list("ul.list-body > li > a")) { String title = node.text(); - String path = node.attr("href", "/", 3); + String path = node.hrefWithSplit(2); list.add(new Chapter(title, path)); } return list; @@ -121,9 +121,9 @@ public List parseRecent(String html, int page) { int total = Integer.parseInt(StringUtils.match("\\d+", body.text("div.title-banner > div > h1"), 0)); if (page <= total) { for (Node node : body.list("div.main-list > div > div > div")) { - String cid = node.attr("div:eq(1) > div:eq(0) > a", "href", "/", 2); + String cid = node.hrefWithSplit("div:eq(1) > div:eq(0) > a", 1); String title = node.text("div:eq(1) > div:eq(0) > a"); - String cover = node.attr("div:eq(0) > a > img", "src"); + String cover = node.src("div:eq(0) > a > img"); String update = node.text("div:eq(1) > div:eq(1) > dl:eq(3) > dd > font"); String author = node.text("div:eq(1) > div:eq(1) > dl:eq(1) > dd > a"); list.add(new Comic(SourceManager.SOURCE_CCTUKU, cid, title, cover, update, author)); @@ -139,7 +139,7 @@ public Request getCheckRequest(String cid) { @Override public String parseCheck(String html) { - return new Node(html).text("div.book > div > div:eq(0) > div:eq(1) > div > dl:eq(5) > dd > font", 0, 10); + return new Node(html).textWithSubstring("div.book > div > div.row > div:eq(1) > div > dl:eq(5) > dd > font", 0, 10); } } diff --git a/app/src/main/java/com/hiroshi/cimoc/source/Chuiyao.java b/app/src/main/java/com/hiroshi/cimoc/source/Chuiyao.java new file mode 100644 index 00000000..f4bcda30 --- /dev/null +++ b/app/src/main/java/com/hiroshi/cimoc/source/Chuiyao.java @@ -0,0 +1,133 @@ +package com.hiroshi.cimoc.source; + +import com.hiroshi.cimoc.core.manager.SourceManager; +import com.hiroshi.cimoc.core.parser.MangaParser; +import com.hiroshi.cimoc.core.parser.NodeIterator; +import com.hiroshi.cimoc.core.parser.SearchIterator; +import com.hiroshi.cimoc.model.Chapter; +import com.hiroshi.cimoc.model.Comic; +import com.hiroshi.cimoc.model.ImageUrl; +import com.hiroshi.cimoc.soup.Node; +import com.hiroshi.cimoc.utils.StringUtils; + +import org.json.JSONArray; + +import java.util.LinkedList; +import java.util.List; + +import okhttp3.Request; + +/** + * Created by Hiroshi on 2016/11/28. + */ + +public class Chuiyao extends MangaParser { + + @Override + public Request getSearchRequest(String keyword, int page) { + String url = StringUtils.format("http://m.chuiyao.com/search/?page=%d&ajax=1&key=%s&act=search&order=1", page, keyword); + return new Request.Builder().url(url).build(); + } + + @Override + public SearchIterator getSearchIterator(String html, int page) { + Node body = new Node(html); + return new NodeIterator(body.list("li > a")) { + @Override + protected Comic parse(Node node) { + String cid = node.hrefWithSplit(1); + String title = node.text("h3"); + String cover = node.attr("div > img", "data-src"); + String update = node.text("dl:eq(5) > dd"); + String author = node.text("dl:eq(2) > dd"); + return new Comic(SourceManager.SOURCE_CHUIYAO, cid, title, cover, update, author); + } + }; + } + + @Override + public Request getInfoRequest(String cid) { + String url = "http://m.chuiyao.com/manhua/".concat(cid); + return new Request.Builder().url(url).build(); + } + + @Override + public String parseInfo(String html, Comic comic) { + Node body = new Node(html); + String title = body.text("div.main-bar > h1"); + String cover = body.src("div.book-detail > div.cont-list > div.thumb > img"); + String update = body.text("div.book-detail > div.cont-list > dl:eq(2) > dd"); + String author = body.attr("div.book-detail > div.cont-list > dl:eq(3) > dd > a", "title"); + String intro = body.text("#bookIntro"); + boolean status = body.text("div.book-detail > div.cont-list > div.thumb > i").contains("完结"); + comic.setInfo(title, cover, update, intro, author, status); + + return null; + } + + @Override + public List parseChapter(String html) { + List list = new LinkedList<>(); + for (Node node : new Node(html).list("#chapterList > ul > li > a")) { + String title = node.attr("title"); + String path = node.hrefWithSplit(2); + list.add(new Chapter(title, path)); + } + return list; + } + + @Override + public Request getImagesRequest(String cid, String path) { + String url = StringUtils.format("http://m.chuiyao.com/manhua/%s/%s.html", cid, path); + return new Request.Builder().url(url).build(); + } + + @Override + public List parseImages(String html) { + List list = new LinkedList<>(); + String str = StringUtils.match("parseJSON\\('(.*?)'\\)", html, 1); + if (str != null) { + try { + JSONArray array = new JSONArray(str); + for (int i = 0; i != array.length(); ++i) { + list.add(new ImageUrl(i + 1, array.getString(i), false)); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + return list; + } + + @Override + public Request getRecentRequest(int page) { + String url = StringUtils.format("http://m.chuiyao.com/act/?act=list&page=%d&catid=0&ajax=1&order=1", page); + return new Request.Builder().url(url).build(); + } + + @Override + public List parseRecent(String html, int page) { + List list = new LinkedList<>(); + Node body = new Node(html); + for (Node node : body.list("li > a")) { + String cid = node.hrefWithSplit(1); + String title = node.text("h3"); + String cover = node.attr("div > img", "data-src"); + String update = node.text("dl:eq(5) > dd"); + String author = node.text("dl:eq(2) > dd"); + list.add(new Comic(SourceManager.SOURCE_CHUIYAO, cid, title, cover, update, author)); + } + return list; + } + + @Override + public Request getCheckRequest(String cid) { + return getInfoRequest(cid); + } + + @Override + public String parseCheck(String html) { + return new Node(html).text("div.book-detail > div.cont-list > dl:eq(2) > dd"); + } + +} diff --git a/app/src/main/java/com/hiroshi/cimoc/source/DM5.java b/app/src/main/java/com/hiroshi/cimoc/source/DM5.java index 0d1011ca..40b98db0 100644 --- a/app/src/main/java/com/hiroshi/cimoc/source/DM5.java +++ b/app/src/main/java/com/hiroshi/cimoc/source/DM5.java @@ -78,11 +78,11 @@ public Request getInfoRequest(String cid) { public String parseInfo(String html, Comic comic) { Node body = new Node(html); String title = body.text("#mhinfo > div.inbt > h1.new_h2"); - String cover = body.attr("#mhinfo > div.innr9 > div.innr90 > div.innr91 > img", "src"); - String update = body.text("#mhinfo > div.innr9 > div.innr90 > div.innr92 > span:eq(9)", 5, -10); + String cover = body.src("#mhinfo > div.innr9 > div.innr90 > div.innr91 > img"); + String update = body.textWithSubstring("#mhinfo > div.innr9 > div.innr90 > div.innr92 > span:eq(9)", 5, -10); String author = body.text("#mhinfo > div.innr9 > div.innr90 > div.innr92 > span:eq(2) > a"); String intro = body.text("#mhinfo > div.innr9 > div.mhjj > p").replace("[+展开]", "").replace("[-折叠]", ""); - boolean status = "已完结".equals(body.text("#mhinfo > div.innr9 > div.innr90 > div.innr92 > span:eq(6)", 5)); + boolean status = body.textWithSubstring("#mhinfo > div.innr9 > div.innr90 > div.innr92 > span:eq(6)", 5).contains("完结"); comic.setInfo(title, cover, update, intro, author, status); return StringUtils.match("var DM5_COMIC_MID=(\\d+?);", html, 1); @@ -100,7 +100,7 @@ public List parseChapter(String html) { Node body = new Node(html); for (Node node : body.list("ul.nr6 > li > a[title]")) { String title = node.text(); - String path = node.attr("href", "/", 1); + String path = node.hrefWithSplit(0); set.add(new Chapter(title, path)); } return new LinkedList<>(set); @@ -197,7 +197,7 @@ public Request getCheckRequest(String cid) { @Override public String parseCheck(String html) { - return new Node(html).text("#mhinfo > div.innr9 > div.innr90 > div.innr92 > span:eq(9)", 5, -10); + return new Node(html).textWithSubstring("#mhinfo > div.innr9 > div.innr90 > div.innr92 > span:eq(9)", 5, -10); } } diff --git a/app/src/main/java/com/hiroshi/cimoc/source/Dmzj.java b/app/src/main/java/com/hiroshi/cimoc/source/Dmzj.java index 12d79269..6d736a54 100644 --- a/app/src/main/java/com/hiroshi/cimoc/source/Dmzj.java +++ b/app/src/main/java/com/hiroshi/cimoc/source/Dmzj.java @@ -75,12 +75,12 @@ public Request getInfoRequest(String cid) { @Override public String parseInfo(String html, Comic comic) { Node body = new Node(html); - String intro = body.text("p.txtDesc", 3); + String intro = body.textWithSubstring("p.txtDesc", 3); String title = body.attr("#Cover > img", "title"); - String cover = body.attr("#Cover > img", "src"); + String cover = body.src("#Cover > img"); String author = body.text("div.Introduct_Sub > div.sub_r > p:eq(0) > a"); - boolean status = "已完结".equals(body.text("div.Introduct_Sub > div.sub_r > p:eq(2) > a:eq(3)")); - String update = body.text("div.Introduct_Sub > div.sub_r > p:eq(3) > span.date", 0, 10); + String update = body.textWithSubstring("div.Introduct_Sub > div.sub_r > p:eq(3) > span.date", 0, 10); + boolean status = body.text("div.Introduct_Sub > div.sub_r > p:eq(2) > a:eq(3)").contains("完结"); comic.setInfo(title, cover, update, intro, author, status); return null; @@ -173,7 +173,7 @@ public Request getCheckRequest(String cid) { @Override public String parseCheck(String html) { - return new Node(html).text("div.Introduct_Sub > .sub_r > p:eq(3) > .date", 0, 10); + return new Node(html).textWithSubstring("div.Introduct_Sub > div.sub_r > p:eq(3) > span.date", 0, 10); } } diff --git a/app/src/main/java/com/hiroshi/cimoc/source/EHentai.java b/app/src/main/java/com/hiroshi/cimoc/source/EHentai.java index a3034000..d36df818 100644 --- a/app/src/main/java/com/hiroshi/cimoc/source/EHentai.java +++ b/app/src/main/java/com/hiroshi/cimoc/source/EHentai.java @@ -32,15 +32,14 @@ public SearchIterator getSearchIterator(String html, int page) { return new NodeIterator(body.list("div.ido > div > table.itg > tbody > tr[class^=gtr]")) { @Override protected Comic parse(Node node) { - String cid = node.attr("td:eq(2) > div > div:eq(2) > a", "href"); - cid = cid.substring(24, cid.length() - 1); + String cid = node.hrefWithSubString("td:eq(2) > div > div:eq(2) > a", 24, -2); String title = node.text("td:eq(2) > div > div:eq(2) > a"); - String cover = node.attr("td:eq(2) > div > div:eq(0) > img", "src"); + String cover = node.src("td:eq(2) > div > div:eq(0) > img"); if (cover == null) { - String temp = node.text("td:eq(2) > div > div:eq(0)", 14).split("~", 2)[0]; + String temp = node.textWithSubstring("td:eq(2) > div > div:eq(0)", 14).split("~", 2)[0]; cover = "http://ehgt.org/".concat(temp); } - String update = node.text("td:eq(1)", 0, 10); + String update = node.textWithSubstring("td:eq(1)", 0, 10); String author = StringUtils.match("\\[(.*?)\\]", title, 1); title = title.replaceFirst("\\[.*?\\]\\s*", ""); return new Comic(SourceManager.SOURCE_EHENTAI, cid, title, cover, update, author); @@ -57,11 +56,11 @@ public Request getInfoRequest(String cid) { @Override public String parseInfo(String html, Comic comic) { Node body = new Node(html); - String update = body.text("#gdd > table > tbody > tr:eq(0) > td:eq(1)", 0, 10); + String update = body.textWithSubstring("#gdd > table > tbody > tr:eq(0) > td:eq(1)", 0, 10); String title = body.text("#gn"); String intro = body.text("#gj"); String author = body.text("#taglist > table > tbody > tr > td:eq(1) > div > a[id^=ta_artist]"); - String cover = body.attr("#gd1 > img", "src"); + String cover = body.src("#gd1 > img"); comic.setInfo(title, cover, update, intro, author, true); return null; @@ -71,7 +70,7 @@ public String parseInfo(String html, Comic comic) { public List parseChapter(String html) { List list = new LinkedList<>(); Node body = new Node(html); - String length = body.text("#gdd > table > tbody > tr:eq(5) > td:eq(1)", " ", 0); + String length = body.textWithSplit("#gdd > table > tbody > tr:eq(5) > td:eq(1)", " ", 0); int size = Integer.parseInt(length) % 40 == 0 ? Integer.parseInt(length) / 40 : Integer.parseInt(length) / 40 + 1; for (int i = 0; i != size; ++i) { list.add(0, new Chapter("Ch" + i, String.valueOf(i))); @@ -90,15 +89,14 @@ public List parseRecent(String html, int page) { List list = new LinkedList<>(); Node body = new Node(html); for (Node node : body.list("table.itg > tbody > tr[class^=gtr]")) { - String cid = node.attr("td:eq(2) > div > div:eq(2) > a", "href"); - cid = cid.substring(24, cid.length() - 1); + String cid = node.hrefWithSubString("td:eq(2) > div > div:eq(2) > a", 24, -2); String title = node.text("td:eq(2) > div > div:eq(2) > a"); String cover = node.attr("td:eq(2) > div > div:eq(0) > img", "src"); if (cover == null) { - String temp = node.text("td:eq(2) > div > div:eq(0)", 14).split("~", 2)[0]; + String temp = node.textWithSubstring("td:eq(2) > div > div:eq(0)", 14).split("~", 2)[0]; cover = "http://ehgt.org/".concat(temp); } - String update = node.text("td:eq(1)", 0, 10); + String update = node.textWithSubstring("td:eq(1)", 0, 10); String author = StringUtils.match("\\[(.*?)\\]", title, 1); title = title.replaceFirst("\\[.*?\\]\\s*", ""); list.add(new Comic(SourceManager.SOURCE_EHENTAI, cid, title, cover, update, author)); @@ -118,7 +116,7 @@ public List parseImages(String html) { Node body = new Node(html); int count = 0; for (Node node : body.list("#gdt > div > div > a")) { - list.add(new ImageUrl(++count, node.attr("href"), true)); + list.add(new ImageUrl(++count, node.href(), true)); } return list; } @@ -130,7 +128,7 @@ public Request getLazyRequest(String url) { @Override public String parseLazy(String html, String url) { - return new Node(html).attr("a > img[style]", "src"); + return new Node(html).src("a > img[style]"); } } diff --git a/app/src/main/java/com/hiroshi/cimoc/source/ExHentai.java b/app/src/main/java/com/hiroshi/cimoc/source/ExHentai.java index 0490ef22..77381194 100644 --- a/app/src/main/java/com/hiroshi/cimoc/source/ExHentai.java +++ b/app/src/main/java/com/hiroshi/cimoc/source/ExHentai.java @@ -32,15 +32,14 @@ public SearchIterator getSearchIterator(String html, int page) { return new NodeIterator(body.list("table.itg > tbody > tr[class^=gtr]")) { @Override protected Comic parse(Node node) { - String cid = node.attr("td:eq(2) > div > div:eq(2) > a", "href"); - cid = cid.substring(23, cid.length() - 1); + String cid = node.hrefWithSubString("td:eq(2) > div > div:eq(2) > a", 23, -2); String title = node.text("td:eq(2) > div > div:eq(2) > a"); - String cover = node.attr("td:eq(2) > div > div:eq(0) > img", "src"); + String cover = node.src("td:eq(2) > div > div:eq(0) > img"); if (cover == null) { - String temp = node.text("td:eq(2) > div > div:eq(0)", 19).split("~", 2)[0]; + String temp = node.textWithSubstring("td:eq(2) > div > div:eq(0)", 19).split("~", 2)[0]; cover = "https://exhentai.org/".concat(temp); } - String update = node.text("td:eq(1)", 0, 10); + String update = node.textWithSubstring("td:eq(1)", 0, 10); String author = StringUtils.match("\\[(.*?)\\]", title, 1); title = title.replaceFirst("\\[.*?\\]\\s*", ""); return new Comic(SourceManager.SOURCE_EXHENTAI, cid, title, cover, update, author); @@ -57,7 +56,7 @@ public Request getInfoRequest(String cid) { @Override public String parseInfo(String html, Comic comic) { Node body = new Node(html); - String update = body.text("#gdd > table > tbody > tr:eq(0) > td:eq(1)", 0, 10); + String update = body.textWithSubstring("#gdd > table > tbody > tr:eq(0) > td:eq(1)", 0, 10); String title = body.text("#gn"); String intro = body.text("#gj"); String author = body.text("#taglist > table > tbody > tr > td:eq(1) > div > a[id^=ta_artist]"); @@ -71,7 +70,7 @@ public String parseInfo(String html, Comic comic) { public List parseChapter(String html) { List list = new LinkedList<>(); Node body = new Node(html); - String length = body.text("#gdd > table > tbody > tr:eq(5) > td:eq(1)", " ", 0); + String length = body.textWithSplit("#gdd > table > tbody > tr:eq(5) > td:eq(1)", " ", 0); int size = Integer.parseInt(length) % 40 == 0 ? Integer.parseInt(length) / 40 : Integer.parseInt(length) / 40 + 1; for (int i = 0; i != size; ++i) { list.add(0, new Chapter("Ch" + i, String.valueOf(i))); @@ -90,15 +89,14 @@ public List parseRecent(String html, int page) { List list = new LinkedList<>(); Node body = new Node(html); for (Node node : body.list("table.itg > tbody > tr[class^=gtr]")) { - String cid = node.attr("td:eq(2) > div > div:eq(2) > a", "href"); - cid = cid.substring(23, cid.length() - 1); + String cid = node.hrefWithSubString("td:eq(2) > div > div:eq(2) > a", 23, -2); String title = node.text("td:eq(2) > div > div:eq(2) > a"); - String cover = node.attr("td:eq(2) > div > div:eq(0) > img", "src"); + String cover = node.src("td:eq(2) > div > div:eq(0) > img"); if (cover == null) { - String temp = node.text("td:eq(2) > div > div:eq(0)", 19).split("~", 2)[0]; + String temp = node.textWithSubstring("td:eq(2) > div > div:eq(0)", 19).split("~", 2)[0]; cover = "https://exhentai.org/".concat(temp); } - String update = node.text("td:eq(1)", 0, 10); + String update = node.textWithSubstring("td:eq(1)", 0, 10); String author = StringUtils.match("\\[(.*?)\\]", title, 1); title = title.replaceFirst("\\[.*?\\]\\s*", ""); list.add(new Comic(SourceManager.SOURCE_EXHENTAI, cid, title, cover, update, author)); diff --git a/app/src/main/java/com/hiroshi/cimoc/source/HHAAZZ.java b/app/src/main/java/com/hiroshi/cimoc/source/HHAAZZ.java index 5ddca1b9..03dc1087 100644 --- a/app/src/main/java/com/hiroshi/cimoc/source/HHAAZZ.java +++ b/app/src/main/java/com/hiroshi/cimoc/source/HHAAZZ.java @@ -35,10 +35,10 @@ public SearchIterator getSearchIterator(String html, int page) { return new NodeIterator(body.list("ul.se-list > li")) { @Override protected Comic parse(Node node) { - String cid = node.attr("a.pic", "href", "/", 4); + String cid = node.hrefWithSplit("a.pic", 1); String title = node.text("a.pic > div > h3"); - String cover = node.attr("a.pic > img", "src"); - String update = node.text("a.pic > div > p:eq(4) > span", 0, 10); + String cover = node.src("a.pic > img"); + String update = node.textWithSubstring("a.pic > div > p:eq(4) > span", 0, 10); String author = node.text("a.pic > div > p:eq(1)"); // boolean status = node.text("a.tool > span.h").contains("完结"); return new Comic(SourceManager.SOURCE_HHAAZZ, cid, title, cover, update, author); @@ -56,9 +56,9 @@ public Request getInfoRequest(String cid) { public String parseInfo(String html, Comic comic) { Node body = new Node(html); String title = body.text("div.main > div > div.pic > div.con > h3"); - String cover = body.attr("div.main > div > div.pic > img", "src"); - String update = body.text("div.main > div > div.pic > div.con > p:eq(5)", 5); - String author = body.text("div.main > div > div.pic > div.con > p:eq(1)", 3); + String cover = body.src("div.main > div > div.pic > img"); + String update = body.textWithSubstring("div.main > div > div.pic > div.con > p:eq(5)", 5); + String author = body.textWithSubstring("div.main > div > div.pic > div.con > p:eq(1)", 3); String intro = body.text("#detail_block > div > p"); boolean status = body.text("div.main > div > div.pic > div.con > p:eq(4)").contains("完结"); comic.setInfo(title, cover, update, intro, author, status); @@ -72,7 +72,7 @@ public List parseChapter(String html) { Node body = new Node(html); for (Node node : body.list("#sort_div_p > a")) { String title = node.attr("title"); - String path = node.attr("href").substring(17); + String path = node.hrefWithSubString(17); list.add(new Chapter(title, path)); } return list; @@ -89,10 +89,10 @@ public List parseRecent(String html, int page) { List list = new LinkedList<>(); Node body = new Node(html); for (Node node : body.list("li > a.pic")) { - String cid = node.attr("href", "/", 4); + String cid = node.hrefWithSplit(3); String title = node.text("div.con > h3"); - String cover = node.attr("img", "src"); - String update = node.text("div.con > p > span", 0, 10); + String cover = node.src("img"); + String update = node.textWithSubstring("div.con > p > span", 0, 10); String author = node.text("div.con > p:eq(1)"); list.add(new Comic(SourceManager.SOURCE_HHAAZZ, cid, title, cover, update, author)); } @@ -161,7 +161,7 @@ public Request getCheckRequest(String cid) { @Override public String parseCheck(String html) { - return new Node(html).text("div.main > div > div.pic > div:eq(1) > p:eq(5)", 5); + return new Node(html).textWithSubstring("div.main > div > div.pic > div.con > p:eq(5)", 5); } } diff --git a/app/src/main/java/com/hiroshi/cimoc/source/HHSSEE.java b/app/src/main/java/com/hiroshi/cimoc/source/HHSSEE.java index e791f731..4e68fa2c 100644 --- a/app/src/main/java/com/hiroshi/cimoc/source/HHSSEE.java +++ b/app/src/main/java/com/hiroshi/cimoc/source/HHSSEE.java @@ -36,10 +36,9 @@ public SearchIterator getSearchIterator(String html, int page) { return new NodeIterator(body.list("#list > div.cComicList > li > a")) { @Override protected Comic parse(Node node) { - String cid = node.attr("href"); - cid = cid.substring(7, cid.length() - 5); + String cid = node.hrefWithSubString(7, -6); String title = node.text(); - String cover = node.attr("img", "src"); + String cover = node.src("img"); return new Comic(SourceManager.SOURCE_HHSSEE, cid, title, cover, null, null); } }; @@ -54,13 +53,13 @@ public Request getInfoRequest(String cid) { @Override public String parseInfo(String html, Comic comic) { Node body = new Node(html); - String title = body.text("#about_kit > ul > li:eq(0) > h1").trim(); - String cover = body.attr("#about_style > img", "src"); - String[] args = body.text("#about_kit > ul > li:eq(4)", 3).split("\\D"); + String title = body.text("#about_kit > ul > li:eq(0) > h1"); + String cover = body.src("#about_style > img"); + String[] args = body.textWithSubstring("#about_kit > ul > li:eq(4)", 3).split("\\D"); String update = StringUtils.format("%4d-%02d-%02d", Integer.parseInt(args[0]), Integer.parseInt(args[1]), Integer.parseInt(args[2])); - String author = body.text("#about_kit > ul > li:eq(1)", 3); - String intro = body.text("#about_kit > ul > li:eq(7)", 3); + String author = body.textWithSubstring("#about_kit > ul > li:eq(1)", 3); + String intro = body.textWithSubstring("#about_kit > ul > li:eq(7)", 3); boolean status = body.text("#about_kit > ul > li:eq(2)").contains("完结"); comic.setInfo(title, cover, update, intro, author, status); @@ -100,11 +99,10 @@ public List parseRecent(String html, int page) { List list = new LinkedList<>(); Node body = new Node(html); for (Node node : body.list("#list > div.cTopComicList > div.cComicItem")) { - String cid = node.attr("div.cListSlt > a", "href"); - cid = cid.substring(7, cid.length() - 5); + String cid = node.hrefWithSubString("div.cListSlt > a", 7, -6); String title = node.text("a > span.cComicTitle"); - String cover = node.attr("div.cListSlt > a > img", "src"); - String[] args = node.text("span.cComicRating", 5).split("\\D"); + String cover = node.src("div.cListSlt > a > img"); + String[] args = node.textWithSubstring("span.cComicRating", 5).split("\\D"); String update = StringUtils.format("%4d-%02d-%02d", Integer.parseInt(args[0]), Integer.parseInt(args[1]), Integer.parseInt(args[2])); String author = node.text("span.cComicAuthor"); @@ -154,7 +152,7 @@ public Request getCheckRequest(String cid) { @Override public String parseCheck(String html) { - String[] args = new Node(html).text("span.cComicRating", 5).split("\\D"); + String[] args = new Node(html).textWithSubstring("span.cComicRating", 5).split("\\D"); return StringUtils.format("%4d-%02d-%02d", Integer.parseInt(args[0]), Integer.parseInt(args[1]), Integer.parseInt(args[2])); } diff --git a/app/src/main/java/com/hiroshi/cimoc/source/IKanman.java b/app/src/main/java/com/hiroshi/cimoc/source/IKanman.java index fa77772e..2c461381 100644 --- a/app/src/main/java/com/hiroshi/cimoc/source/IKanman.java +++ b/app/src/main/java/com/hiroshi/cimoc/source/IKanman.java @@ -25,8 +25,7 @@ public class IKanman extends MangaParser { public IKanman() { - server = new String[]{ "http://p.3qfm.com", "http://i.hamreus.com:8080", - "http://idx0.hamreus.com:8080", "http://ilt2.hamreus.com:8080"}; + server = new String[]{ "http://p.yogajx.com", "http://idx0.hamreus.com:8080", "http://ilt2.hamreus.com:8080"}; } @Override @@ -41,7 +40,7 @@ public SearchIterator getSearchIterator(String html, int page) { return new NodeIterator(body.list("li > a")) { @Override protected Comic parse(Node node) { - String cid = node.attr("href", "/", 2); + String cid = node.hrefWithSplit(1); String title = node.text("h3"); String cover = node.attr("div > img", "data-src"); String update = node.text("dl:eq(5) > dd"); @@ -62,11 +61,11 @@ public Request getInfoRequest(String cid) { public String parseInfo(String html, Comic comic) { Node body = new Node(html); String title = body.text("div.main-bar > h1"); - String cover = body.attr("div.book-detail > div.cont-list > div.thumb > img", "src"); + String cover = body.src("div.book-detail > div.cont-list > div.thumb > img"); String update = body.text("div.book-detail > div.cont-list > dl:eq(2) > dd"); String author = body.attr("div.book-detail > div.cont-list > dl:eq(3) > dd > a", "title"); String intro = body.text("#bookIntro"); - boolean status = "完结".equals(body.text("div.book-detail > div.cont-list > div.thumb > i")); + boolean status = body.text("div.book-detail > div.cont-list > div.thumb > i").contains("完结"); comic.setInfo(title, cover, update, intro, author, status); return comic.getCid(); @@ -88,7 +87,7 @@ public List parseChapter(String html) { List liList = new LinkedList<>(); for (Node li : ul.list("li > a")) { String title = li.attr("title"); - String path = li.attr("href", "/|\\.", 3); + String path = li.hrefWithSplit(2); liList.add(new Chapter(title, path)); } ulList.addAll(0, liList); @@ -138,7 +137,7 @@ public List parseRecent(String html, int page) { List list = new LinkedList<>(); Node body = new Node(html); for (Node node : body.list("li > a")) { - String cid = node.attr("href", "/", 2); + String cid = node.hrefWithSplit(1); String title = node.text("h3"); String cover = node.attr("div > img", "data-src"); String update = node.text("dl:eq(5) > dd"); @@ -155,7 +154,7 @@ public Request getCheckRequest(String cid) { @Override public String parseCheck(String html) { - return new Node(html).text("div.book-detail > div:eq(0) > dl:eq(2) > dd"); + return new Node(html).text("div.book-detail > div.cont-list > dl:eq(2) > dd"); } } diff --git a/app/src/main/java/com/hiroshi/cimoc/source/MH57.java b/app/src/main/java/com/hiroshi/cimoc/source/MH57.java index 9b917d56..50053087 100644 --- a/app/src/main/java/com/hiroshi/cimoc/source/MH57.java +++ b/app/src/main/java/com/hiroshi/cimoc/source/MH57.java @@ -49,7 +49,7 @@ public SearchIterator getSearchIterator(String html, int page) { return new NodeIterator(body.list("#data_list > li")) { @Override protected Comic parse(Node node) { - String cid = node.attr("a:eq(0)", "href", "/", 1); + String cid = node.hrefWithSplit("a:eq(0)", 0); String title = node.text("a:eq(0) > h3"); String cover = node.attr("a:eq(0) > div.thumb > img", "data-src"); String update = node.text("dl:eq(4) > dd"); @@ -69,7 +69,7 @@ public Request getInfoRequest(String cid) { public String parseInfo(String html, Comic comic) { Node body = new Node(html); String title = body.text("div.main-bar > h1"); - String cover = body.attr("div.book-detail > div.cont-list > div.thumb > img", "src"); + String cover = body.src("div.book-detail > div.cont-list > div.thumb > img"); String update = body.text("div.book-detail > div.cont-list > dl:eq(7) > dd"); String author = body.text("div.book-detail > div.cont-list > dl:eq(3) > dd"); String intro = body.text("#bookIntro"); @@ -85,7 +85,7 @@ public List parseChapter(String html) { Node body = new Node(html); for (Node node : body.list("#chapterList > ul > li > a")) { String title = node.text(); - String path = node.attr("href", "/|\\.", 2); + String path = node.hrefWithSplit(1); list.add(new Chapter(title, path)); } return list; @@ -105,7 +105,7 @@ public List parseRecent(String html, int page) { List list = new LinkedList<>(); Node body = new Node(html); for (Node node : body.list("#data_list > li")) { - String cid = node.attr("a:eq(1)", "href", "/", 1); + String cid = node.hrefWithSplit("a:eq(1)", 0); String title = node.text("a:eq(1) > h3"); String cover = node.attr("a:eq(1) > div.thumb > img", "data-src"); String update = node.text("dl:eq(6) > dd"); diff --git a/app/src/main/java/com/hiroshi/cimoc/source/MiaoWoo.java b/app/src/main/java/com/hiroshi/cimoc/source/MiaoWoo.java new file mode 100644 index 00000000..7373b1c8 --- /dev/null +++ b/app/src/main/java/com/hiroshi/cimoc/source/MiaoWoo.java @@ -0,0 +1,8 @@ +package com.hiroshi.cimoc.source; + +/** + * Created by Hiroshi on 2016/11/30. + */ + +public class MiaoWoo { +} diff --git a/app/src/main/java/com/hiroshi/cimoc/source/NHentai.java b/app/src/main/java/com/hiroshi/cimoc/source/NHentai.java index d1f8038c..71f1f7f2 100644 --- a/app/src/main/java/com/hiroshi/cimoc/source/NHentai.java +++ b/app/src/main/java/com/hiroshi/cimoc/source/NHentai.java @@ -32,11 +32,11 @@ public SearchIterator getSearchIterator(String html, int page) { return new NodeIterator(body.list("#content > div.index-container > div > a")) { @Override protected Comic parse(Node node) { - String cid = node.attr("href", "/", 2); + String cid = node.hrefWithSplit(1); String title = node.text("div.caption"); String author = StringUtils.match("\\[(.*?)\\]", title, 1); title = title.replaceFirst("\\[.*?\\]\\s*", ""); - String cover = "https:".concat(node.attr("img", "src")); + String cover = "https:".concat(node.src("img")); return new Comic(SourceManager.SOURCE_NHENTAI, cid, title, cover, null, author); } }; @@ -54,7 +54,7 @@ public String parseInfo(String html, Comic comic) { String title = body.text("#info > h1"); String intro = body.text("#info > h2"); String author = body.text("#tags > div > span > a[href^=/artist/]"); - String cover = "https:".concat(body.attr("#cover > a > img", "src")); + String cover = "https:".concat(body.src("#cover > a > img")); comic.setInfo(title, cover, null, intro, author, true); return null; @@ -78,11 +78,11 @@ public List parseRecent(String html, int page) { List list = new LinkedList<>(); Node body = new Node(html); for (Node node : body.list("#content > div.index-container > div > a")) { - String cid = node.attr("href", "/", 2); + String cid = node.hrefWithSplit(1); String title = node.text("div.caption"); String author = StringUtils.match("\\[(.*?)\\]", title, 1); title = title.replaceFirst("\\[.*?\\]\\s*", ""); - String cover = "https:".concat(node.attr("img", "src")); + String cover = "https:".concat(node.src("img")); list.add(new Comic(SourceManager.SOURCE_NHENTAI, cid, title, cover, null, author)); } return list; diff --git a/app/src/main/java/com/hiroshi/cimoc/source/Pic177.java b/app/src/main/java/com/hiroshi/cimoc/source/Pic177.java index 17670db6..0a53bbc5 100644 --- a/app/src/main/java/com/hiroshi/cimoc/source/Pic177.java +++ b/app/src/main/java/com/hiroshi/cimoc/source/Pic177.java @@ -19,7 +19,7 @@ * Created by Hiroshi on 2016/10/5. */ -public class Pic177 extends MangaParser { +public class Pic177 extends MangaParser { @Override public Request getSearchRequest(String keyword, int page) { @@ -33,13 +33,13 @@ public SearchIterator getSearchIterator(String html, int page) { return new NodeIterator(body.list("#content > div.post_box")) { @Override protected Comic parse(Node node) { - String cid = node.attr("div.tit > h2 > a", "href").substring(29); + String cid = node.hrefWithSubString("div.tit > h2 > a", 29); String title = node.text("div.tit > h2 > a"); String author = StringUtils.match("(\\[中文\\])?\\[(.*?)\\]", title, 2); if (author != null) { title = title.replaceFirst("(\\[中文\\])?\\[(.*?)\\]\\s*", ""); } - String cover = node.attr("div.c-con > a > img", "src"); + String cover = node.src("div.c-con > a > img"); String update = node.text("div.c-top > div.datetime").replace(" ", "-"); return new Comic(SourceManager.SOURCE_177PIC, cid, title, cover, update, author); } @@ -60,7 +60,7 @@ public String parseInfo(String html, Comic comic) { if (author != null) { title = title.replaceFirst("(\\[中文\\])?\\[(.*?)\\]\\s*", ""); } - String cover = body.attr("#content > div.post > div.entry-content > p > img", "src"); + String cover = body.src("#content > div.post > div.entry-content > p > img"); String update = body.text("#content > div.post > div.c-top2 > div.datetime"); comic.setInfo(title, cover, update, null, author, true); @@ -89,13 +89,13 @@ public List parseRecent(String html, int page) { List list = new LinkedList<>(); Node body = new Node(html); for (Node node : body.list("div.conter > div.main > div.post_box")) { - String cid = node.attr("div.tit > h2 > a", "href").substring(29); + String cid = node.hrefWithSubString("div.tit > h2 > a", 29); String title = node.text("div.tit > h2 > a"); String author = StringUtils.match("(\\[中文\\])?\\[(.*?)\\]", title, 2); if (author != null) { title = title.replaceFirst("(\\[中文\\])?\\[(.*?)\\]\\s*", ""); } - String cover = node.attr("div.c-con > a > img", "src"); + String cover = node.src("div.c-con > a > img"); String update = node.text("div.c-top > div.datetime").replace(" ", "-"); list.add(new Comic(SourceManager.SOURCE_177PIC, cid, title, cover, update, author)); } diff --git a/app/src/main/java/com/hiroshi/cimoc/source/U17.java b/app/src/main/java/com/hiroshi/cimoc/source/U17.java index 7515450e..406e3c9e 100644 --- a/app/src/main/java/com/hiroshi/cimoc/source/U17.java +++ b/app/src/main/java/com/hiroshi/cimoc/source/U17.java @@ -8,7 +8,6 @@ import com.hiroshi.cimoc.model.Comic; import com.hiroshi.cimoc.model.ImageUrl; import com.hiroshi.cimoc.soup.Node; -import com.hiroshi.cimoc.utils.DecryptionUtils; import com.hiroshi.cimoc.utils.StringUtils; import org.json.JSONArray; @@ -40,10 +39,10 @@ public SearchIterator getSearchIterator(String html, int page) { return new NodeIterator(body.list("#comiclist > div.search_list > div.comiclist > ul > li > div")) { @Override protected Comic parse(Node node) { - String cid = node.attr("div:eq(1) > h3 > strong > a", "href", "/|\\.", 6); + String cid = node.hrefWithSplit("div:eq(1) > h3 > strong > a", 1); String title = node.attr("div:eq(1) > h3 > strong > a", "title"); - String cover = node.attr("div:eq(0) > a > img", "src"); - String update = node.text("div:eq(1) > h3 > span.fr", 7); + String cover = node.src("div:eq(0) > a > img"); + String update = node.textWithSubstring("div:eq(1) > h3 > span.fr", 7); String author = node.text("div:eq(1) > h3 > a[title]"); // String[] array = node.text("div:eq(1) > p.cf > i.fl").split("/"); // boolean status = "已完结".equals(array[array.length - 1].trim()); @@ -61,12 +60,12 @@ public Request getInfoRequest(String cid) { @Override public String parseInfo(String html, Comic comic) { Node body = new Node(html); - String title = body.text("div.comic_info > div.left > h1.fl").trim(); - String cover = body.attr("#cover > a > img", "src"); + String title = body.text("div.comic_info > div.left > h1.fl"); + String cover = body.src("#cover > a > img"); String author = body.text("div.comic_info > div.right > div.author_info > div.info > a.name"); - String intro = body.text("div.comic_info > div.left > div.info > #words").trim(); - boolean status = "已完结".equals(body.text("div.main > div.info > div.fl > span.eq(2)")); - String update = body.text("div.main > div.chapterlist > div.chapterlist_box > div.bot > div.fl > span", 7); + String intro = body.text("div.comic_info > div.left > div.info > #words"); + boolean status = body.text("div.comic_info > div.left > div.info > div.top > div.line1 > span:eq(2)").contains("完结"); + String update = body.textWithSubstring("div.main > div.chapterlist > div.chapterlist_box > div.bot > div.fl > span", 7); comic.setInfo(title, cover, update, intro, author, status); return null; @@ -74,11 +73,12 @@ public String parseInfo(String html, Comic comic) { @Override public List parseChapter(String html) { + // http://m.u17.com/chapter/list?comicId=%s List list = new LinkedList<>(); Node body = new Node(html); for (Node node : body.list("#chapter > li > a")) { - String title = node.text().trim(); - String path = node.attr("href", "/|\\.", 6); + String title = node.text(); + String path = node.hrefWithSplit(1); list.add(0, new Chapter(title, path)); } return list; @@ -118,23 +118,21 @@ public List parseRecent(String html, int page) { @Override public Request getImagesRequest(String cid, String path) { - String url = StringUtils.format("http://www.u17.com/chapter/%s.html", path); + String url = StringUtils.format("http://m.u17.com/image/list?comicId=%s&chapterId=%s", cid, path); return new Request.Builder().url(url).build(); } @Override public List parseImages(String html) { List list = new LinkedList<>(); - List result = StringUtils.matchAll("\"src\":\"(.*?)\"", html, 1); - if (!result.isEmpty()) { - try { - int count = 0; - for (String str : result) { - list.add(new ImageUrl(++count, DecryptionUtils.base64Decrypt(str), false)); - } - } catch (Exception e) { - e.printStackTrace(); + try { + JSONArray array = new JSONObject(html).getJSONObject("data").getJSONArray("list"); + for (int i = 0; i != array.length(); ++i) { + JSONObject object = array.getJSONObject(i); + list.add(new ImageUrl(i + 1, object.getString("location"), false)); } + } catch (JSONException e) { + e.printStackTrace(); } return list; } @@ -146,7 +144,7 @@ public Request getCheckRequest(String cid) { @Override public String parseCheck(String html) { - return new Node(html).text("div.main > div.chapterlist > div.chapterlist_box > div.bot > div.fl > span", 7); + return new Node(html).textWithSubstring("div.main > div.chapterlist > div.chapterlist_box > div.bot > div.fl > span", 7); } } diff --git a/app/src/main/java/com/hiroshi/cimoc/source/Webtoon.java b/app/src/main/java/com/hiroshi/cimoc/source/Webtoon.java index 9635db6a..5c27f557 100644 --- a/app/src/main/java/com/hiroshi/cimoc/source/Webtoon.java +++ b/app/src/main/java/com/hiroshi/cimoc/source/Webtoon.java @@ -1,8 +1,11 @@ package com.hiroshi.cimoc.source; +import android.util.Log; + import com.hiroshi.cimoc.core.manager.SourceManager; import com.hiroshi.cimoc.core.parser.JsonIterator; import com.hiroshi.cimoc.core.parser.MangaParser; +import com.hiroshi.cimoc.core.parser.NodeIterator; import com.hiroshi.cimoc.core.parser.SearchIterator; import com.hiroshi.cimoc.model.Chapter; import com.hiroshi.cimoc.model.Comic; @@ -33,7 +36,7 @@ public class Webtoon extends MangaParser { @Override public Request getSearchRequest(String keyword, int page) { if (page == 1) { - String url = "http://m.webtoons.com/search"; + String url = "http://m.webtoons.com/zh-hans/search"; RequestBody body = new FormBody.Builder().add("keyword", keyword).add("searchType", "ALL").build(); return new Request.Builder().url(url).post(body).addHeader("Referer", "http://m.webtoons.com").build(); } @@ -42,28 +45,17 @@ public Request getSearchRequest(String keyword, int page) { @Override public SearchIterator getSearchIterator(String html, int page) { - try { - JSONObject object = new JSONObject(html); - return new JsonIterator(object.getJSONObject("webtoonResult").getJSONArray("titleList")) { - @Override - protected Comic parse(JSONObject object) { - try { - String cid = object.getString("titleNo"); - String title = object.getString("title"); - String cover = "http://mwebtoon.phinf.naver.net/".concat(object.getString("thumbnailMobile")); - long time = object.getLong("lastEpisodeRegisterYmdt"); - String update = new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault()).format(new Date(time)); - String author = object.getString("pictureAuthorName"); - return new Comic(SourceManager.SOURCE_WEBTOON, cid, title, cover, update, author); - } catch (JSONException e) { - e.printStackTrace(); - } - return null; - } - }; - } catch (JSONException e) { - return null; - } + Node body = new Node(html); + return new NodeIterator(body.list("#ct > div._searchResultArea > ul._searchResultList > li > a")) { + @Override + protected Comic parse(Node node) { + String cid = node.hrefWithSplit(-1); + String title = node.text("div.row > div.info > p.subj > span"); + String cover = node.src("div.row > div.pic > img"); + String author = node.text("div.row > div.info > p.author"); + return new Comic(SourceManager.SOURCE_WEBTOON, cid, title, cover, null, author); + } + }; } @Override @@ -76,8 +68,8 @@ public Request getInfoRequest(String cid) { public String parseInfo(String html, Comic comic) { Node body = new Node(html); String title = body.text("#ct > div.detail_info > a._btnInfo > p.subj"); - String cover = body.attr("#_episodeList > li > a > div.row > div.pic > img", "src"); - String[] args = body.text("#_episodeList > li > a > div.row > div.info > p.date").trim().split("\\D"); + String cover = body.src("#_episodeList > li > a > div.row > div.pic > img"); + String[] args = body.text("#_episodeList > li > a > div.row > div.info > p.date").split("\\D"); String update = StringUtils.format("%4d-%02d-%02d", Integer.parseInt(args[0]), Integer.parseInt(args[1]), Integer.parseInt(args[2])); String author = body.text("#ct > div.detail_info > a._btnInfo > p.author"); @@ -94,7 +86,7 @@ public List parseChapter(String html) { Node body = new Node(html); for (Node node : body.list("#_episodeList > li > a")) { String title = node.text("div.row > div.info > p.sub_title > span"); - String path = node.attr("href").substring(30); + String path = node.hrefWithSubString(30); list.add(new Chapter(title, path)); } return list; @@ -114,9 +106,9 @@ public List parseRecent(String html, int page) { List list = new LinkedList<>(); Node body = new Node(html); for (Node node : body.list("#ct > ul > li > a")) { - String cid = node.attr("href", "=", 1); + String cid = node.hrefWithSplit(-1); String title = node.text("div.info > p.subj > span"); - String cover = node.attr("div.pic", "style", "\\(|\\)", 1); + String cover = node.attrWithSplit("div.pic", "style", "\\(|\\)", 1); list.add(new Comic(SourceManager.SOURCE_WEBTOON, cid, title, cover, null, null)); } return list; @@ -154,7 +146,7 @@ public Request getCheckRequest(String cid) { @Override public String parseCheck(String html) { - String[] args = new Node(html).text("#_episodeList > li > a > div.row > div.info > p.date").trim().split("\\D"); + String[] args = new Node(html).text("#_episodeList > li > a > div.row > div.info > p.date").split("\\D"); return StringUtils.format("%4d-%02d-%02d", Integer.parseInt(args[0]), Integer.parseInt(args[1]), Integer.parseInt(args[2])); } diff --git a/app/src/main/java/com/hiroshi/cimoc/source/Wnacg.java b/app/src/main/java/com/hiroshi/cimoc/source/Wnacg.java index 4bfdb64f..3633a24f 100644 --- a/app/src/main/java/com/hiroshi/cimoc/source/Wnacg.java +++ b/app/src/main/java/com/hiroshi/cimoc/source/Wnacg.java @@ -32,12 +32,12 @@ public SearchIterator getSearchIterator(String html, int page) { return new NodeIterator(body.list("#bodywrap > div.grid > div > ul > li")) { @Override protected Comic parse(Node node) { - String cid = node.attr("div.info > div.title > a", "href", "-|\\.", 3); + String cid = node.hrefWithSplit("div.info > div.title > a", 3); String title = node.text("div.info > div.title > a"); String author = StringUtils.match("\\[(.*?)\\]", title, 1); title = title.replaceFirst("\\[.*?\\]\\s*", ""); String cover = node.attr("div.pic_box > a > img", "data-original"); - String update = node.text("div.info > div.info_col").trim(); + String update = node.text("div.info > div.info_col"); update = StringUtils.match("\\d{4}-\\d{2}-\\d{2}", update, 0); return new Comic(SourceManager.SOURCE_WNACG, cid, title, cover, update, author); } @@ -54,7 +54,7 @@ public Request getInfoRequest(String cid) { public String parseInfo(String html, Comic comic) { Node body = new Node(html); String title = body.text("#bodywrap > h2"); - String intro = body.text("#bodywrap > div > div.uwconn > p", 3); + String intro = body.textWithSubstring("#bodywrap > div > div.uwconn > p", 3); String author = body.text("#bodywrap > div > div.uwuinfo > p"); String cover = body.attr("#bodywrap > div > div.uwthumb > img", "data-original"); comic.setInfo(title, cover, null, intro, author, true); @@ -66,7 +66,7 @@ public String parseInfo(String html, Comic comic) { public List parseChapter(String html) { List list = new LinkedList<>(); Node body = new Node(html); - String length = body.text("#bodywrap > div > div.uwconn > label:eq(1)", 3, -2); + String length = body.textWithSubstring("#bodywrap > div > div.uwconn > label:eq(1)", 3, -2); int size = Integer.parseInt(length) % 12 == 0 ? Integer.parseInt(length) / 12 : Integer.parseInt(length) / 12 + 1; for (int i = 1; i <= size; ++i) { list.add(0, new Chapter("Ch" + i, String.valueOf(i))); @@ -85,12 +85,12 @@ public List parseRecent(String html, int page) { List list = new LinkedList<>(); Node body = new Node(html); for (Node node : body.list("#bodywrap > div.grid > div > ul > li")) { - String cid = node.attr("div.info > div.title > a", "href", "-|\\.", 3); + String cid = node.hrefWithSplit("div.info > div.title > a", 3); String title = node.text("div.info > div.title > a"); String author = StringUtils.match("\\[(.*?)\\]", title, 1); title = title.replaceFirst("\\[.*?\\]\\s*", ""); String cover = node.attr("div.pic_box > a > img", "data-original"); - String update = node.text("div.info > div.info_col").trim(); + String update = node.text("div.info > div.info_col"); update = StringUtils.match("\\d{4}-\\d{2}-\\d{2}", update, 0); list.add(new Comic(SourceManager.SOURCE_WNACG, cid, title, cover, update, author)); } diff --git a/app/src/main/java/com/hiroshi/cimoc/ui/activity/BackupActivity.java b/app/src/main/java/com/hiroshi/cimoc/ui/activity/BackupActivity.java index 0a96cf0f..a9b6d321 100644 --- a/app/src/main/java/com/hiroshi/cimoc/ui/activity/BackupActivity.java +++ b/app/src/main/java/com/hiroshi/cimoc/ui/activity/BackupActivity.java @@ -1,7 +1,5 @@ package com.hiroshi.cimoc.ui.activity; -import android.content.pm.PackageManager; -import android.support.annotation.NonNull; import android.view.View; import com.hiroshi.cimoc.R; @@ -24,11 +22,6 @@ public class BackupActivity extends BackActivity implements BackupView, ChoiceDi private static final int TYPE_TAG_FILE = 1; private static final int TYPE_TAG = 2; - private static final int REQUEST_LOAD_FAVORITE = 0; - private static final int REQUEST_LOAD_TAG = 1; - private static final int REQUEST_SAVE_FAVORITE = 2; - private static final int REQUEST_SAVE_TAG = 3; - @BindView(R.id.backup_layout) View mLayoutView; private BackupPresenter mPresenter; @@ -48,64 +41,37 @@ protected void onDestroy() { @OnClick(R.id.backup_save_favorite_btn) void onSaveFavoriteClick() { showProgressDialog(); - if (PermissionUtils.requestPermission(this, REQUEST_SAVE_FAVORITE)) { + if (PermissionUtils.hasStoragePermission(this)) { mPresenter.saveFavorite(); + } else { + onFileLoadFail(); } } @OnClick(R.id.backup_save_tag_btn) void onSaveTagClick() { showProgressDialog(); - if (PermissionUtils.requestPermission(this, REQUEST_SAVE_TAG)) { + if (PermissionUtils.hasStoragePermission(this)) { mPresenter.loadTag(); + } else { + onFileLoadFail(); } } @OnClick(R.id.backup_restore_favorite_btn) void onRestoreFavoriteClick() { showProgressDialog(); - if (PermissionUtils.requestPermission(this, REQUEST_LOAD_FAVORITE)) { + if (PermissionUtils.hasStoragePermission(this)) { mPresenter.loadFavoriteFile(); + } else { + onFileLoadFail(); } } @OnClick(R.id.backup_restore_tag_btn) void onRestoreTagClick() { showProgressDialog(); - if (PermissionUtils.requestPermission(this, REQUEST_LOAD_TAG)) { + if (PermissionUtils.hasStoragePermission(this)) { mPresenter.loadTagFile(); - } - } - - @Override - public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { - super.onRequestPermissionsResult(requestCode, permissions, grantResults); - switch (requestCode) { - case REQUEST_LOAD_FAVORITE: - if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { - mPresenter.loadFavoriteFile(); - } else { - onFileLoadFail(); - } - break; - case REQUEST_LOAD_TAG: - if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { - mPresenter.loadTagFile(); - } else { - onFileLoadFail(); - } - break; - case REQUEST_SAVE_FAVORITE: - if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { - mPresenter.saveFavorite(); - } else { - onBackupSaveFail(); - } - break; - case REQUEST_SAVE_TAG: - if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { - mPresenter.loadTag(); - } else { - onBackupSaveFail(); - } - break; + } else { + onFileLoadFail(); } } diff --git a/app/src/main/java/com/hiroshi/cimoc/ui/activity/ChapterListActivity.java b/app/src/main/java/com/hiroshi/cimoc/ui/activity/ChapterListActivity.java new file mode 100644 index 00000000..56e6e300 --- /dev/null +++ b/app/src/main/java/com/hiroshi/cimoc/ui/activity/ChapterListActivity.java @@ -0,0 +1,159 @@ +package com.hiroshi.cimoc.ui.activity; + +import android.content.Context; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.support.annotation.NonNull; +import android.support.v7.widget.RecyclerView; +import android.view.View; + +import com.hiroshi.cimoc.R; +import com.hiroshi.cimoc.model.Chapter; +import com.hiroshi.cimoc.model.Selectable; +import com.hiroshi.cimoc.model.Task; +import com.hiroshi.cimoc.presenter.ChapterListPresenter; +import com.hiroshi.cimoc.service.DownloadService; +import com.hiroshi.cimoc.ui.adapter.ChapterListAdapter; +import com.hiroshi.cimoc.ui.fragment.dialog.SelectDialogFragment; +import com.hiroshi.cimoc.ui.view.ChapterListView; +import com.hiroshi.cimoc.utils.PermissionUtils; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.LinkedList; +import java.util.List; +import java.util.Set; + +import butterknife.BindView; + +/** + * Created by Hiroshi on 2016/11/14. + */ + +public class ChapterListActivity extends BackActivity implements ChapterListView { + + @BindView(R.id.chapter_list_layout) View mLayoutView; + @BindView(R.id.chapter_list_recycler_view) RecyclerView mRecyclerView; + + private List mDownloadList; + private ChapterListPresenter mPresenter; + private ChapterListAdapter mChapterAdapter; + + @Override + protected void initPresenter() { + mPresenter = new ChapterListPresenter(); + mPresenter.attachView(this); + } + + @Override + protected void initView() { + super.initView(); + List list = getIntent().getParcelableArrayListExtra(EXTRA_CHAPTER); + mChapterAdapter = new ChapterListAdapter(this, list); + } + + @Override + protected void initData() { + mPresenter.loadDownload(); + mDownloadList = new ArrayList<>(); + } + + @Override + protected void onDestroy() { + mPresenter.detachView(); + mPresenter = null; + super.onDestroy(); + } + + /*download(false, list); + download(true, list);*/ + + /** + * download: load download -> select chapter -> check permission -> update index -> add task + */ + + private void download(boolean neutral, List list) { + for (int i = 0; i != list.size(); ++i) { + if ((neutral || list.get(i).isChecked()) && !list.get(i).isDisable()) { + mDownloadList.add(mChapterAdapter.getItem(i)); + } + } + + if (!mDownloadList.isEmpty()) { + showProgressDialog(); + if (PermissionUtils.hasStoragePermission(this)) { + mPresenter.updateIndex(mChapterAdapter.getDateSet()); + } else { + onUpdateIndexFail(); + } + } + } + + @Override + public void onUpdateIndexSuccess() { + mPresenter.addTask(mDownloadList); + } + + @Override + public void onUpdateIndexFail() { + showSnackbar(R.string.detail_download_queue_fail); + hideProgressDialog(); + } + + @Override + public void onTaskAddSuccess(ArrayList list) { + Intent intent = DownloadService.createIntent(this, list); + startService(intent); + showSnackbar(R.string.detail_download_queue_success); + hideProgressDialog(); + } + + @Override + public void onTaskAddFail() { + showSnackbar(R.string.detail_download_queue_fail); + hideProgressDialog(); + } + + @Override + public void onDownloadLoadSuccess(List list) { + Set set = new HashSet<>(); + for (Task task : list) { + set.add(task.getPath()); + } + for (Chapter chapter : mChapterAdapter.getDateSet()) { + chapter.setDownload(set.contains(chapter.getPath())); + } + mChapterAdapter.notifyDataSetChanged(); + hideProgressDialog(); + } + + @Override + public void onDownloadLoadFail() { + showSnackbar(R.string.detail_download_load_fail); + hideProgressBar(); + } + + @Override + protected int getLayoutRes() { + return R.layout.activity_chapter_list; + } + + @Override + protected View getLayoutView() { + return mLayoutView; + } + + @Override + protected String getDefaultTitle() { + return getString(R.string.chapter_list); + } + + private static String EXTRA_CHAPTER = "a"; + + public static Intent createIntent(Context context, ArrayList list) { + Intent intent = new Intent(context, ChapterListActivity.class); + intent.putExtra(EXTRA_CHAPTER, list); + return intent; + } + +} diff --git a/app/src/main/java/com/hiroshi/cimoc/ui/activity/DetailActivity.java b/app/src/main/java/com/hiroshi/cimoc/ui/activity/DetailActivity.java index b9209151..62220199 100644 --- a/app/src/main/java/com/hiroshi/cimoc/ui/activity/DetailActivity.java +++ b/app/src/main/java/com/hiroshi/cimoc/ui/activity/DetailActivity.java @@ -2,9 +2,6 @@ import android.content.Context; import android.content.Intent; -import android.content.pm.PackageManager; -import android.support.annotation.NonNull; -import android.support.design.widget.CoordinatorLayout; import android.support.design.widget.FloatingActionButton; import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.RecyclerView; @@ -19,13 +16,10 @@ import com.hiroshi.cimoc.model.Selectable; import com.hiroshi.cimoc.model.Task; import com.hiroshi.cimoc.presenter.DetailPresenter; -import com.hiroshi.cimoc.service.DownloadService; import com.hiroshi.cimoc.ui.adapter.BaseAdapter; import com.hiroshi.cimoc.ui.adapter.DetailAdapter; -import com.hiroshi.cimoc.ui.fragment.ComicFragment; import com.hiroshi.cimoc.ui.fragment.dialog.SelectDialogFragment; import com.hiroshi.cimoc.ui.view.DetailView; -import com.hiroshi.cimoc.utils.PermissionUtils; import java.util.ArrayList; import java.util.HashSet; @@ -42,18 +36,12 @@ public class DetailActivity extends BackActivity implements DetailView, DetailAdapter.OnTitleClickListener, SelectDialogFragment.SelectDialogListener, BaseAdapter.OnItemClickListener { - private static final int REQUEST_DOWNLOAD = 0; - - private static final int TYPE_SELECT_DOWNLOAD = 0; - private static final int TYPE_SELECT_TAG = 1; - @BindView(R.id.detail_recycler_view) RecyclerView mRecyclerView; - @BindView(R.id.detail_layout) CoordinatorLayout mCoordinatorLayout; - @BindView(R.id.detail_action_button) FloatingActionButton mStarButton; + @BindView(R.id.detail_layout) View mLayoutView; + @BindView(R.id.detail_action_button) FloatingActionButton mActionButton; private DetailAdapter mDetailAdapter; private DetailPresenter mPresenter; - private List mDownloadList; @Override protected void initPresenter() { @@ -73,16 +61,22 @@ protected void initView() { @Override protected void initData() { - mDownloadList = new ArrayList<>(); long id = getIntent().getLongExtra(EXTRA_ID, -1); - int source = getIntent().getIntExtra(EXTRA_SOURCE, -1); - String cid = getIntent().getStringExtra(EXTRA_CID); - mPresenter.loadDetail(id, source, cid); + if (id == -1) { + int source = getIntent().getIntExtra(EXTRA_SOURCE, -1); + String cid = getIntent().getStringExtra(EXTRA_CID); + if (source == -1 || cid == null) { + mPresenter.loadDetail(); + } else { + mPresenter.loadDetail(source, cid); + } + } else { + mPresenter.loadDetail(id); + } } @Override protected void onDestroy() { - mPresenter.updateComic(); mPresenter.detachView(); mPresenter = null; super.onDestroy(); @@ -99,11 +93,11 @@ public boolean onOptionsItemSelected(MenuItem item) { if (!isProgressBarShown()) { switch (item.getItemId()) { case R.id.detail_download: - showProgressDialog(); - mPresenter.loadDownload(); + Intent intent = ChapterListActivity.createIntent(this, new ArrayList<>(mDetailAdapter.getDateSet())); + startActivity(intent); break; case R.id.detail_tag: - if (mPresenter.getComic().getFavorite() != null) { + if (mPresenter.isFavorite()) { showProgressDialog(); mPresenter.loadTag(); } else { @@ -116,13 +110,13 @@ public boolean onOptionsItemSelected(MenuItem item) { } @OnClick(R.id.detail_action_button) void onActionButtonClick() { - if (mPresenter.getComic().getFavorite() != null) { + if (mPresenter.isFavorite()) { mPresenter.unfavoriteComic(); - mStarButton.setImageResource(R.drawable.ic_favorite_border_white_24dp); + mActionButton.setImageResource(R.drawable.ic_favorite_border_white_24dp); showSnackbar(R.string.detail_unfavorite); } else { mPresenter.favoriteComic(); - mStarButton.setImageResource(R.drawable.ic_favorite_white_24dp); + mActionButton.setImageResource(R.drawable.ic_favorite_white_24dp); showSnackbar(R.string.detail_favorite); } } @@ -131,27 +125,25 @@ public boolean onOptionsItemSelected(MenuItem item) { public void onItemClick(View view, int position) { if (position != 0) { String last = mDetailAdapter.getItem(position - 1).getPath(); - int type = getIntent().getIntExtra(EXTRA_TYPE, ComicFragment.TYPE_HISTORY); - long id = mPresenter.updateLast(last, type); + mPresenter.updateLast(last, getIntent().getBooleanExtra(EXTRA_FAVORITE, false)); mDetailAdapter.setLast(last); int mode = mPreference.getInt(PreferenceManager.PREF_READER_MODE, PreferenceManager.READER_MODE_PAGE); - Intent intent = ReaderActivity.createIntent(this, id, mode, mDetailAdapter.getDateSet()); + Intent intent = ReaderActivity.createIntent(this, mode, mDetailAdapter.getDateSet()); startActivity(intent); } } @Override public void onTitleClick() { - String last = mPresenter.getComic().getLast(); + String last = mPresenter.getLast(); List list = mDetailAdapter.getDateSet(); if (last == null) { last = mDetailAdapter.getItem(list.size() - 1).getPath(); mDetailAdapter.setLast(last); } - int type = getIntent().getIntExtra(EXTRA_TYPE, ComicFragment.TYPE_HISTORY); - mPresenter.updateLast(last, type); + mPresenter.updateLast(last, getIntent().getBooleanExtra(EXTRA_FAVORITE, false)); int mode = mPreference.getInt(PreferenceManager.PREF_READER_MODE, PreferenceManager.READER_MODE_PAGE); - Intent intent = ReaderActivity.createIntent(DetailActivity.this, mPresenter.getComic().getId(), mode, list); + Intent intent = ReaderActivity.createIntent(DetailActivity.this, mode, list); startActivity(intent); } @@ -165,7 +157,7 @@ public void onTagLoadSuccess(List list) { hideProgressDialog(); if (!list.isEmpty()) { SelectDialogFragment fragment = - SelectDialogFragment.newInstance(new ArrayList<>(list), R.string.detail_select_tag, -1, TYPE_SELECT_TAG); + SelectDialogFragment.newInstance(new ArrayList<>(list), R.string.detail_select_tag, -1); fragment.show(getFragmentManager(), null); } else { showSnackbar(R.string.backup_save_tag_not_found); @@ -192,82 +184,18 @@ public void onTagUpdateFail() { @Override public void onSelectPositiveClick(int type, List list) { - if (type == TYPE_SELECT_TAG) { - showProgressDialog(); - List newTagList = new LinkedList<>(); - for (Selectable selectable : list) { - if (selectable.isChecked()) { - newTagList.add(selectable.getId()); - } + showProgressDialog(); + List newTagList = new LinkedList<>(); + for (Selectable selectable : list) { + if (selectable.isChecked()) { + newTagList.add(selectable.getId()); } - mPresenter.updateRef(newTagList); - } else { - download(false, list); } + mPresenter.updateRef(newTagList); } @Override - public void onSelectNeutralClick(int type, List list) { - download(true, list); - } - - /** - * download: load download -> select chapter -> check permission -> update index -> add task - */ - - private void download(boolean neutral, List list) { - for (int i = 0; i != list.size(); ++i) { - if ((neutral || list.get(i).isChecked()) && !list.get(i).isDisable()) { - mDownloadList.add(mDetailAdapter.getItem(i)); - } - } - - if (!mDownloadList.isEmpty()) { - showProgressDialog(); - if (PermissionUtils.requestPermission(this, REQUEST_DOWNLOAD)) { - mPresenter.updateIndex(mDetailAdapter.getDateSet()); - } - } - } - - @Override - public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { - super.onRequestPermissionsResult(requestCode, permissions, grantResults); - switch (requestCode) { - case REQUEST_DOWNLOAD: - if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { - mPresenter.updateIndex(mDetailAdapter.getDateSet()); - } else { - onUpdateIndexFail(); - } - break; - } - } - - @Override - public void onUpdateIndexSuccess() { - mPresenter.addTask(mDownloadList); - } - - @Override - public void onUpdateIndexFail() { - showSnackbar(R.string.detail_download_queue_fail); - hideProgressDialog(); - } - - @Override - public void onTaskAddSuccess(ArrayList list) { - Intent intent = DownloadService.createIntent(DetailActivity.this, list); - startService(intent); - showSnackbar(R.string.detail_download_queue_success); - hideProgressDialog(); - } - - @Override - public void onTaskAddFail() { - showSnackbar(R.string.detail_download_queue_fail); - hideProgressDialog(); - } + public void onSelectNeutralClick(int type, List list) {} /** * init: load comic -> load chapter -> load download @@ -281,8 +209,8 @@ public void onComicLoadSuccess(Comic comic) { if (comic.getTitle() != null && comic.getCover() != null) { int resId = comic.getFavorite() != null ? R.drawable.ic_favorite_white_24dp : R.drawable.ic_favorite_border_white_24dp; - mStarButton.setImageResource(resId); - mStarButton.setVisibility(View.VISIBLE); + mActionButton.setImageResource(resId); + mActionButton.setVisibility(View.VISIBLE); } } @@ -302,28 +230,14 @@ public void onDetailLoadSuccess() { public void onDownloadLoadSuccess(List list) { Set set = new HashSet<>(); for (Task task : list) { - if (!isProgressBarShown() || task.isFinish()) { + if (task.isFinish()) { set.add(task.getPath()); } } - - if (isProgressBarShown()) { - for (Chapter chapter : mDetailAdapter.getDateSet()) { - chapter.setDownload(set.contains(chapter.getPath())); - } - hideProgressBar(); - } else { - mDownloadList.clear(); - ArrayList result = new ArrayList<>(); - for (Chapter chapter : mDetailAdapter.getDateSet()) { - boolean download = set.contains(chapter.getPath()); - result.add(new Selectable(download, download, chapter.getTitle())); - } - hideProgressDialog(); - SelectDialogFragment fragment = SelectDialogFragment.newInstance(result, R.string.detail_select_chapter, - R.string.detail_download_all, TYPE_SELECT_DOWNLOAD); - fragment.show(getFragmentManager(), null); + for (Chapter chapter : mDetailAdapter.getDateSet()) { + chapter.setComplete(set.contains(chapter.getPath())); } + hideProgressBar(); } @Override @@ -344,10 +258,6 @@ public void onParseError() { hideProgressBar(); } - /** - * method we don't care - */ - @Override protected int getLayoutRes() { return R.layout.activity_detail; @@ -360,24 +270,36 @@ protected String getDefaultTitle() { @Override protected View getLayoutView() { - return mCoordinatorLayout; + return mLayoutView; } public static final String EXTRA_ID = "a"; public static final String EXTRA_SOURCE = "b"; public static final String EXTRA_CID = "c"; - public static final String EXTRA_TYPE = "d"; + public static final String EXTRA_FAVORITE = "d"; + + public static Intent createIntent(Context context) { + return createIntent(context, null, -1, null, false); + } + + public static Intent createIntent(Context context, Long id) { + return createIntent(context, id, -1, null, false); + } + + public static Intent createIntent(Context context, int source, String cid) { + return createIntent(context, null, source, cid, false); + } - public static Intent createIntent(Context context, Long id, int source, String cid) { - return createIntent(context, id, source, cid, ComicFragment.TYPE_HISTORY); + public static Intent createIntent(Context context, Long id, boolean favorite) { + return createIntent(context, id, -1, null, favorite); } - public static Intent createIntent(Context context, Long id, int source, String cid, int type) { + public static Intent createIntent(Context context, Long id, int source, String cid, boolean favorite) { Intent intent = new Intent(context, DetailActivity.class); intent.putExtra(EXTRA_ID, id); intent.putExtra(EXTRA_SOURCE, source); intent.putExtra(EXTRA_CID, cid); - intent.putExtra(EXTRA_TYPE, type); + intent.putExtra(EXTRA_FAVORITE, favorite); return intent; } diff --git a/app/src/main/java/com/hiroshi/cimoc/ui/activity/MainActivity.java b/app/src/main/java/com/hiroshi/cimoc/ui/activity/MainActivity.java index 80051db5..005711e3 100644 --- a/app/src/main/java/com/hiroshi/cimoc/ui/activity/MainActivity.java +++ b/app/src/main/java/com/hiroshi/cimoc/ui/activity/MainActivity.java @@ -1,6 +1,8 @@ package com.hiroshi.cimoc.ui.activity; +import android.Manifest; import android.content.Intent; +import android.content.pm.PackageManager; import android.content.res.ColorStateList; import android.graphics.Color; import android.os.Bundle; @@ -9,6 +11,7 @@ import android.support.annotation.Nullable; import android.support.annotation.StyleRes; import android.support.design.widget.NavigationView; +import android.support.v4.app.ActivityCompat; import android.support.v4.content.ContextCompat; import android.support.v4.view.GravityCompat; import android.support.v4.widget.DrawerLayout; @@ -32,6 +35,7 @@ import com.hiroshi.cimoc.ui.fragment.classical.TagFragment; import com.hiroshi.cimoc.ui.fragment.dialog.MessageDialogFragment; import com.hiroshi.cimoc.ui.view.MainView; +import com.hiroshi.cimoc.utils.PermissionUtils; import butterknife.BindView; import butterknife.ButterKnife; @@ -44,6 +48,7 @@ public class MainActivity extends BaseActivity implements MainView, NavigationVi private static final int TYPE_NOTICE = 0; private static final int TYPE_UPDATE_LOG = 1; + private static final int TYPE_PERMISSION = 2; private static final int FRAGMENT_NUM = 4; @@ -80,12 +85,8 @@ protected void initView() { @Override protected void initData() { mPresenter.loadLast(); - if (!mPreference.getBoolean(PreferenceManager.PREF_MAIN_NOTICE, false)) { - MessageDialogFragment fragment = MessageDialogFragment.newInstance(R.string.main_notice, R.string.main_notice_content, false, TYPE_NOTICE); - fragment.show(getFragmentManager(), null); - } else if (mPreference.getInt(PreferenceManager.PREF_VERSION, 0) != CimocApplication.VERSION) { - MessageDialogFragment fragment = MessageDialogFragment.newInstance(R.string.main_update_log, R.string.main_update_log_content, false, TYPE_UPDATE_LOG); - fragment.show(getFragmentManager(), null); + if (!showAuthorNotice() && !showUpdateLog()) { + showPermission(); } } @@ -115,7 +116,7 @@ private void initNavigation() { @Override public void onClick(View v) { if (mLastSource != -1 && mLastCid != null) { - Intent intent = DetailActivity.createIntent(MainActivity.this, null, mLastSource, mLastCid); + Intent intent = DetailActivity.createIntent(MainActivity.this, mLastSource, mLastCid); startActivity(intent); } } @@ -241,14 +242,30 @@ public void onMessagePositiveClick(int type) { switch (type) { case TYPE_NOTICE: mPreference.putBoolean(PreferenceManager.PREF_MAIN_NOTICE, true); - if (mPreference.getInt(PreferenceManager.PREF_VERSION, 0) != CimocApplication.VERSION) { - MessageDialogFragment fragment = MessageDialogFragment.newInstance(R.string.main_update_log, R.string.main_update_log_content, false, TYPE_UPDATE_LOG); - fragment.show(getFragmentManager(), null); - } break; case TYPE_UPDATE_LOG: mPreference.putInt(PreferenceManager.PREF_VERSION, CimocApplication.VERSION); break; + case TYPE_PERMISSION: + ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 0); + break; + } + if (!showAuthorNotice() && !showUpdateLog()) { + showPermission(); + } + } + + @Override + public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults); + switch (requestCode) { + case 0: + if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { + showSnackbar(R.string.main_permission_success); + } else { + showSnackbar(R.string.main_permission_fail); + } + break; } } @@ -289,6 +306,31 @@ public void onThemeChange(@StyleRes int theme, @ColorRes int primary, @ColorRes } } + private boolean showAuthorNotice() { + if (!mPreference.getBoolean(PreferenceManager.PREF_MAIN_NOTICE, false)) { + MessageDialogFragment fragment = MessageDialogFragment.newInstance(R.string.main_notice, R.string.main_notice_content, false, TYPE_NOTICE); + fragment.show(getFragmentManager(), null); + return true; + } + return false; + } + + private boolean showUpdateLog() { + if (mPreference.getInt(PreferenceManager.PREF_VERSION, 0) != CimocApplication.VERSION) { + MessageDialogFragment fragment = MessageDialogFragment.newInstance(R.string.main_update_log, R.string.main_update_log_content, false, TYPE_UPDATE_LOG); + fragment.show(getFragmentManager(), null); + return true; + } + return false; + } + + private void showPermission() { + if (!PermissionUtils.hasStoragePermission(this)) { + MessageDialogFragment fragment = MessageDialogFragment.newInstance(R.string.main_permission, R.string.main_permission_content, false, TYPE_PERMISSION); + fragment.show(getFragmentManager(), null); + } + } + @Override protected String getDefaultTitle() { int home = mPreference.getInt(PreferenceManager.PREF_OTHER_LAUNCH, PreferenceManager.HOME_SEARCH); diff --git a/app/src/main/java/com/hiroshi/cimoc/ui/activity/ReaderActivity.java b/app/src/main/java/com/hiroshi/cimoc/ui/activity/ReaderActivity.java index 96d96454..ca2f857b 100644 --- a/app/src/main/java/com/hiroshi/cimoc/ui/activity/ReaderActivity.java +++ b/app/src/main/java/com/hiroshi/cimoc/ui/activity/ReaderActivity.java @@ -148,8 +148,7 @@ protected void initData() { for (int i = 0; i != array.length; ++i) { chapter[i] = (Chapter) array[i]; } - long id = getIntent().getLongExtra(EXTRA_ID, -1); - mPresenter.loadInit(id, chapter); + mPresenter.loadInit(chapter); } @Override @@ -408,7 +407,7 @@ protected void savePicture() { String[] urls = mReaderAdapter.getItem(position).getUrl(); try { for (String url : urls) { - String suffix = StringUtils.getSplit(url, "\\.", -1); + String suffix = StringUtils.split(url, "\\.", -1); if (suffix == null) { suffix = "jpg"; } else { @@ -492,13 +491,11 @@ protected void switchControl() { } } - private static final String EXTRA_ID = "a"; - private static final String EXTRA_CHAPTER = "b"; - private static final String EXTRA_MODE = "c"; + private static final String EXTRA_CHAPTER = "a"; + private static final String EXTRA_MODE = "b"; - public static Intent createIntent(Context context, long id, int mode, List list) { + public static Intent createIntent(Context context, int mode, List list) { Intent intent = getIntent(context, mode); - intent.putExtra(EXTRA_ID, id); intent.putExtra(EXTRA_CHAPTER, list.toArray(new Chapter[list.size()])); intent.putExtra(EXTRA_MODE, mode); return intent; diff --git a/app/src/main/java/com/hiroshi/cimoc/ui/activity/ResultActivity.java b/app/src/main/java/com/hiroshi/cimoc/ui/activity/ResultActivity.java index e97ac07d..7bafbe37 100644 --- a/app/src/main/java/com/hiroshi/cimoc/ui/activity/ResultActivity.java +++ b/app/src/main/java/com/hiroshi/cimoc/ui/activity/ResultActivity.java @@ -83,7 +83,7 @@ protected void onDestroy() { @Override public void onItemClick(View view, int position) { Comic comic = mResultAdapter.getItem(position); - Intent intent = DetailActivity.createIntent(this, comic.getId(), comic.getSource(), comic.getCid()); + Intent intent = DetailActivity.createIntent(this, comic.getSource(), comic.getCid()); startActivity(intent); } diff --git a/app/src/main/java/com/hiroshi/cimoc/ui/activity/SettingsActivity.java b/app/src/main/java/com/hiroshi/cimoc/ui/activity/SettingsActivity.java index 958c2e9f..4ff883aa 100644 --- a/app/src/main/java/com/hiroshi/cimoc/ui/activity/SettingsActivity.java +++ b/app/src/main/java/com/hiroshi/cimoc/ui/activity/SettingsActivity.java @@ -1,10 +1,8 @@ package com.hiroshi.cimoc.ui.activity; import android.content.Intent; -import android.content.pm.PackageManager; import android.content.res.ColorStateList; import android.os.Environment; -import android.support.annotation.NonNull; import android.support.v4.content.ContextCompat; import android.support.v7.widget.AppCompatCheckBox; import android.view.View; @@ -36,8 +34,6 @@ public class SettingsActivity extends BackActivity implements SettingsView, EditorDialogFragment.EditorDialogListener, SliderDialogFragment.SliderDialogListener, ChoiceDialogFragment.ChoiceDialogListener { - private static final int REQUEST_MOVE_FILE = 0; - private static final int TYPE_OTHER_LAUNCH = 0; private static final int TYPE_READER_MODE = 1; private static final int TYPE_OTHER_THEME = 2; @@ -82,20 +78,6 @@ public void onDestroy() { super.onDestroy(); } - @Override - public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { - super.onRequestPermissionsResult(requestCode, permissions, grantResults); - switch (requestCode) { - case REQUEST_MOVE_FILE: - if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { - mPresenter.moveFiles(mTempPath); - } else { - onFileMoveFail(); - } - break; - } - } - @OnClick({R.id.settings_reader_bright_btn, R.id.settings_reader_hide_btn}) void onCheckBoxClick(View view) { switch (view.getId()) { @@ -187,8 +169,10 @@ public void onEditorPositiveClick(String text) { stopService(new Intent(this, DownloadService.class)); showProgressDialog(); mTempPath = text.trim(); - if (PermissionUtils.requestPermission(this, REQUEST_MOVE_FILE)) { + if (PermissionUtils.hasStoragePermission(this)) { mPresenter.moveFiles(mTempPath); + } else { + onFileMoveFail(); } } } diff --git a/app/src/main/java/com/hiroshi/cimoc/ui/activity/TagComicActivity.java b/app/src/main/java/com/hiroshi/cimoc/ui/activity/TagComicActivity.java index d25f1bb2..0d2b9f4c 100644 --- a/app/src/main/java/com/hiroshi/cimoc/ui/activity/TagComicActivity.java +++ b/app/src/main/java/com/hiroshi/cimoc/ui/activity/TagComicActivity.java @@ -89,7 +89,7 @@ protected void onDestroy() { @Override public void onItemClick(View view, int position) { MiniComic comic = mGridAdapter.getItem(position); - Intent intent = DetailActivity.createIntent(this, comic.getId(), comic.getSource(), comic.getCid()); + Intent intent = DetailActivity.createIntent(this, comic.getId()); startActivity(intent); } diff --git a/app/src/main/java/com/hiroshi/cimoc/ui/activity/TaskActivity.java b/app/src/main/java/com/hiroshi/cimoc/ui/activity/TaskActivity.java index 1fd6b852..636e76d4 100644 --- a/app/src/main/java/com/hiroshi/cimoc/ui/activity/TaskActivity.java +++ b/app/src/main/java/com/hiroshi/cimoc/ui/activity/TaskActivity.java @@ -22,6 +22,7 @@ import com.hiroshi.cimoc.service.DownloadService.DownloadServiceBinder; import com.hiroshi.cimoc.ui.adapter.BaseAdapter; import com.hiroshi.cimoc.ui.adapter.TaskAdapter; +import com.hiroshi.cimoc.ui.fragment.ComicFragment; import com.hiroshi.cimoc.ui.fragment.dialog.MessageDialogFragment; import com.hiroshi.cimoc.ui.fragment.dialog.SelectDialogFragment; import com.hiroshi.cimoc.ui.view.TaskView; @@ -98,7 +99,7 @@ public boolean onCreateOptionsMenu(Menu menu) { @OnClick(R.id.task_launch_btn) void onLaunchClick() { Comic comic = mPresenter.getComic(); - Intent intent = DetailActivity.createIntent(this, comic.getId(), comic.getSource(), comic.getCid()); + Intent intent = DetailActivity.createIntent(this, comic.getId()); startActivity(intent); } @@ -135,7 +136,7 @@ public void call(final List list) { mTaskAdapter.setLast(last); long id = mPresenter.updateLast(last); int mode = mPreference.getInt(PreferenceManager.PREF_READER_MODE, PreferenceManager.READER_MODE_PAGE); - Intent readerIntent = ReaderActivity.createIntent(TaskActivity.this, id, mode, list); + Intent readerIntent = ReaderActivity.createIntent(TaskActivity.this, mode, list); startActivity(readerIntent); break; } diff --git a/app/src/main/java/com/hiroshi/cimoc/ui/adapter/BaseAdapter.java b/app/src/main/java/com/hiroshi/cimoc/ui/adapter/BaseAdapter.java index e328a85a..c1706730 100644 --- a/app/src/main/java/com/hiroshi/cimoc/ui/adapter/BaseAdapter.java +++ b/app/src/main/java/com/hiroshi/cimoc/ui/adapter/BaseAdapter.java @@ -5,6 +5,8 @@ import android.view.LayoutInflater; import android.view.View; +import com.hiroshi.cimoc.global.FastClick; + import java.util.Collection; import java.util.List; @@ -123,7 +125,7 @@ public void onBindViewHolder(final RecyclerView.ViewHolder holder, int position) holder.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - if (mClickListener != null) { + if (mClickListener != null && FastClick.isClickValid()) { mClickListener.onItemClick(v, holder.getAdapterPosition()); } } diff --git a/app/src/main/java/com/hiroshi/cimoc/ui/adapter/ChapterListAdapter.java b/app/src/main/java/com/hiroshi/cimoc/ui/adapter/ChapterListAdapter.java new file mode 100644 index 00000000..8af56d7f --- /dev/null +++ b/app/src/main/java/com/hiroshi/cimoc/ui/adapter/ChapterListAdapter.java @@ -0,0 +1,36 @@ +package com.hiroshi.cimoc.ui.adapter; + +import android.content.Context; +import android.support.v7.widget.RecyclerView; +import android.view.ViewGroup; + +import com.hiroshi.cimoc.model.Chapter; + +import java.util.List; + +/** + * Created by Hiroshi on 2016/11/15. + */ + +public class ChapterListAdapter extends BaseAdapter { + + public ChapterListAdapter(Context context, List list) { + super(context, list); + } + + @Override + public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + return null; + } + + @Override + public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { + super.onBindViewHolder(holder, position); + } + + @Override + public RecyclerView.ItemDecoration getItemDecoration() { + return null; + } + +} diff --git a/app/src/main/java/com/hiroshi/cimoc/ui/adapter/DetailAdapter.java b/app/src/main/java/com/hiroshi/cimoc/ui/adapter/DetailAdapter.java index 414ca373..e7a9b5d7 100644 --- a/app/src/main/java/com/hiroshi/cimoc/ui/adapter/DetailAdapter.java +++ b/app/src/main/java/com/hiroshi/cimoc/ui/adapter/DetailAdapter.java @@ -142,7 +142,7 @@ public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { Chapter chapter = mDataSet.get(position - 1); ViewHolder viewHolder = (ViewHolder) holder; viewHolder.chapterButton.setText(chapter.getTitle()); - viewHolder.chapterButton.setDownload(chapter.isDownload()); + viewHolder.chapterButton.setDownload(chapter.isComplete()); if (chapter.getPath().equals(last)) { viewHolder.chapterButton.setSelected(true); } else if (viewHolder.chapterButton.isSelected()) { diff --git a/app/src/main/java/com/hiroshi/cimoc/ui/adapter/ReaderAdapter.java b/app/src/main/java/com/hiroshi/cimoc/ui/adapter/ReaderAdapter.java index f79e88dd..f6b1dc82 100644 --- a/app/src/main/java/com/hiroshi/cimoc/ui/adapter/ReaderAdapter.java +++ b/app/src/main/java/com/hiroshi/cimoc/ui/adapter/ReaderAdapter.java @@ -8,7 +8,6 @@ import android.support.v7.widget.RecyclerView; import android.view.View; import android.view.ViewGroup; -import android.widget.ImageView; import com.facebook.drawee.backends.pipeline.PipelineDraweeControllerBuilder; import com.facebook.drawee.backends.pipeline.PipelineDraweeControllerBuilderSupplier; @@ -97,19 +96,16 @@ public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { PipelineDraweeControllerBuilder builder = mControllerSupplier.get(); switch (reader) { case READER_PAGE: - draweeView.setScaleType(ImageView.ScaleType.FIT_CENTER); builder.setControllerListener(new BaseControllerListener() { @Override public void onFinalImageSet(String id, ImageInfo imageInfo, Animatable animatable) { - if (imageInfo == null) { - return; + if (imageInfo != null) { + draweeView.update(imageInfo.getWidth(), imageInfo.getHeight()); } - draweeView.update(imageInfo.getWidth(), imageInfo.getHeight()); } }); break; case READER_STREAM: - draweeView.setScaleType(ImageView.ScaleType.CENTER_CROP); builder.setControllerListener(new BaseControllerListener() { @Override public void onIntermediateImageSet(String id, ImageInfo imageInfo) { diff --git a/app/src/main/java/com/hiroshi/cimoc/ui/adapter/SelectAdapter.java b/app/src/main/java/com/hiroshi/cimoc/ui/adapter/SelectAdapter.java index de34de46..5c552919 100644 --- a/app/src/main/java/com/hiroshi/cimoc/ui/adapter/SelectAdapter.java +++ b/app/src/main/java/com/hiroshi/cimoc/ui/adapter/SelectAdapter.java @@ -10,7 +10,6 @@ import com.hiroshi.cimoc.R; import com.hiroshi.cimoc.model.Selectable; -import java.util.LinkedList; import java.util.List; import butterknife.BindView; @@ -20,7 +19,7 @@ */ public class SelectAdapter extends BaseAdapter { - class SelectHolder extends BaseAdapter.BaseViewHolder { + static class SelectHolder extends BaseAdapter.BaseViewHolder { @BindView(R.id.item_select_title) TextView chapterTitle; @BindView(R.id.item_select_checkbox) CheckBox chapterChoice; @@ -54,29 +53,4 @@ public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { viewHolder.chapterChoice.setChecked(selectable.isChecked()); } - public List getCheckedList() { - List list = new LinkedList<>(); - int size = mDataSet.size(); - for (int i = 0; i != size; ++i) { - if (mDataSet.get(i).isChecked() && !mDataSet.get(i).isDisable()) { - list.add(i); - } - } - return list; - } - - public void checkAll() { - for (Selectable selectable : mDataSet) { - selectable.setChecked(true); - } - } - - public void refreshChecked() { - for (Selectable selectable : mDataSet) { - if (selectable.isChecked() && !selectable.isDisable()) { - selectable.setDisable(true); - } - } - } - } diff --git a/app/src/main/java/com/hiroshi/cimoc/ui/fragment/ComicFragment.java b/app/src/main/java/com/hiroshi/cimoc/ui/fragment/ComicFragment.java index 2d8f944d..69a90615 100644 --- a/app/src/main/java/com/hiroshi/cimoc/ui/fragment/ComicFragment.java +++ b/app/src/main/java/com/hiroshi/cimoc/ui/fragment/ComicFragment.java @@ -31,10 +31,6 @@ public class ComicFragment extends BaseFragment implements ComicView, ChoiceDialogFragment.ChoiceDialogListener { - public static final int TYPE_HISTORY = 1; - public static final int TYPE_FAVORITE = 2; - public static final int TYPE_DOWNLOAD = 3; - @BindView(R.id.comic_tab_layout) TabLayout mTabLayout; @BindView(R.id.comic_view_pager) ViewPager mViewPager; diff --git a/app/src/main/java/com/hiroshi/cimoc/ui/fragment/classical/grid/DownloadFragment.java b/app/src/main/java/com/hiroshi/cimoc/ui/fragment/classical/grid/DownloadFragment.java index 183a7c9e..311e5828 100644 --- a/app/src/main/java/com/hiroshi/cimoc/ui/fragment/classical/grid/DownloadFragment.java +++ b/app/src/main/java/com/hiroshi/cimoc/ui/fragment/classical/grid/DownloadFragment.java @@ -160,11 +160,6 @@ public void onDownloadStop() { } } - @Override - public void onComicRead(MiniComic comic) { - mGridAdapter.update(comic, false); - } - @Override public void onDownloadDeleteSuccess() { hideProgressDialog(); diff --git a/app/src/main/java/com/hiroshi/cimoc/ui/fragment/classical/grid/FavoriteFragment.java b/app/src/main/java/com/hiroshi/cimoc/ui/fragment/classical/grid/FavoriteFragment.java index 2ffb817f..998f5311 100644 --- a/app/src/main/java/com/hiroshi/cimoc/ui/fragment/classical/grid/FavoriteFragment.java +++ b/app/src/main/java/com/hiroshi/cimoc/ui/fragment/classical/grid/FavoriteFragment.java @@ -84,8 +84,7 @@ public void onItemClick(View view, int position) { comic.setHighlight(false); mGridAdapter.update(comic, false); } - Intent intent = DetailActivity.createIntent(getActivity(), comic.getId(), - comic.getSource(), comic.getCid(), ComicFragment.TYPE_FAVORITE); + Intent intent = DetailActivity.createIntent(getActivity(), comic.getId()); startActivity(intent); } diff --git a/app/src/main/java/com/hiroshi/cimoc/ui/fragment/classical/grid/HistoryFragment.java b/app/src/main/java/com/hiroshi/cimoc/ui/fragment/classical/grid/HistoryFragment.java index 6519c78c..48ccd903 100644 --- a/app/src/main/java/com/hiroshi/cimoc/ui/fragment/classical/grid/HistoryFragment.java +++ b/app/src/main/java/com/hiroshi/cimoc/ui/fragment/classical/grid/HistoryFragment.java @@ -43,7 +43,7 @@ public void onDestroyView() { @Override public void onItemClick(View view, int position) { MiniComic comic = mGridAdapter.getItem(position); - Intent intent = DetailActivity.createIntent(getActivity(), comic.getId(), comic.getSource(), comic.getCid()); + Intent intent = DetailActivity.createIntent(getActivity(), comic.getId()); startActivity(intent); } diff --git a/app/src/main/java/com/hiroshi/cimoc/ui/view/ChapterListView.java b/app/src/main/java/com/hiroshi/cimoc/ui/view/ChapterListView.java new file mode 100644 index 00000000..a5cb4a7b --- /dev/null +++ b/app/src/main/java/com/hiroshi/cimoc/ui/view/ChapterListView.java @@ -0,0 +1,26 @@ +package com.hiroshi.cimoc.ui.view; + +import com.hiroshi.cimoc.model.Task; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by Hiroshi on 2016/11/14. + */ + +public interface ChapterListView extends BaseView { + + void onTaskAddSuccess(ArrayList list); + + void onTaskAddFail(); + + void onDownloadLoadSuccess(List list); + + void onDownloadLoadFail(); + + void onUpdateIndexSuccess(); + + void onUpdateIndexFail(); + +} diff --git a/app/src/main/java/com/hiroshi/cimoc/ui/view/DetailView.java b/app/src/main/java/com/hiroshi/cimoc/ui/view/DetailView.java index cece9538..2d2d24e7 100644 --- a/app/src/main/java/com/hiroshi/cimoc/ui/view/DetailView.java +++ b/app/src/main/java/com/hiroshi/cimoc/ui/view/DetailView.java @@ -33,14 +33,6 @@ public interface DetailView extends BaseView { void onTagUpdateFail(); - void onTaskAddSuccess(ArrayList list); - - void onTaskAddFail(); - - void onUpdateIndexSuccess(); - - void onUpdateIndexFail(); - void onParseError(); void onNetworkError(); diff --git a/app/src/main/java/com/hiroshi/cimoc/ui/view/DownloadView.java b/app/src/main/java/com/hiroshi/cimoc/ui/view/DownloadView.java index 086c0340..6c1ed241 100644 --- a/app/src/main/java/com/hiroshi/cimoc/ui/view/DownloadView.java +++ b/app/src/main/java/com/hiroshi/cimoc/ui/view/DownloadView.java @@ -26,6 +26,4 @@ public interface DownloadView extends GridView { void onDownloadDeleteFail(); - void onComicRead(MiniComic comic); - } diff --git a/app/src/main/java/com/hiroshi/cimoc/utils/PermissionUtils.java b/app/src/main/java/com/hiroshi/cimoc/utils/PermissionUtils.java index 7f3ca032..4f52f761 100644 --- a/app/src/main/java/com/hiroshi/cimoc/utils/PermissionUtils.java +++ b/app/src/main/java/com/hiroshi/cimoc/utils/PermissionUtils.java @@ -3,7 +3,6 @@ import android.Manifest; import android.app.Activity; import android.content.pm.PackageManager; -import android.support.v4.app.ActivityCompat; import android.support.v4.content.ContextCompat; /** @@ -12,13 +11,9 @@ public class PermissionUtils { - public static boolean requestPermission(Activity activity, int requestCode) { - if (ContextCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE) - != PackageManager.PERMISSION_GRANTED) { - ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, requestCode); - return false; - } - return true; + public static boolean hasStoragePermission(Activity activity) { + return ContextCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE) + == PackageManager.PERMISSION_GRANTED; } } diff --git a/app/src/main/java/com/hiroshi/cimoc/utils/StringUtils.java b/app/src/main/java/com/hiroshi/cimoc/utils/StringUtils.java index 76eb7971..4c564320 100644 --- a/app/src/main/java/com/hiroshi/cimoc/utils/StringUtils.java +++ b/app/src/main/java/com/hiroshi/cimoc/utils/StringUtils.java @@ -22,12 +22,25 @@ public static boolean isEmpty(String... args) { return false; } - public static String getSplit(String str, String regex, int position) { + public static String split(String str, String regex, int position) { + if (str == null) { + return null; + } String[] array = str.split(regex); if (position < 0) { position = array.length + position; } - return position < 0 && position >= array.length ? null : array[position]; + return position < 0 || position >= array.length ? null : array[position]; + } + + public static String substring(String str, int start, int end) { + if (str == null) { + return null; + } + if (end < 0) { + end = str.length() + 1 + end; + } + return str.substring(start, end); } public static String format(String format, Object... args) { diff --git a/app/src/main/res/layout/activity_chapter_list.xml b/app/src/main/res/layout/activity_chapter_list.xml new file mode 100644 index 00000000..0b0374bf --- /dev/null +++ b/app/src/main/res/layout/activity_chapter_list.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_settings.xml b/app/src/main/res/layout/activity_settings.xml index f2259265..08a0169e 100644 --- a/app/src/main/res/layout/activity_settings.xml +++ b/app/src/main/res/layout/activity_settings.xml @@ -178,6 +178,28 @@ android:textSize="14sp" android:text="@string/settings_download_connection_summary"/> + + + + 作者声明 由于应用不够完善,遇到一些不正常的问题属于正常现象!\n使用过程中有什么建议或者遇到什么问题,欢迎邮件反馈!\n电子邮箱:cimoc_app@163.com\n如果问题比较严重,我会尽量在第二时间解决!\n最后,请不要在公开场合传播本应用,谢谢合作! 更新日志 - v1.4.3.1\n- 修复更新标签出错\n- 修复动漫之家数据抓取不完整\n- 修复清除历史记录失效 + v1.4.4\n + 权限请求 + 下载、备份还原与保存图片功能需要访问SD卡的权限!\n请在之后的弹出框中确定授予权限! + 授权成功 + 授权失败 图源 关键字为空 @@ -46,6 +50,8 @@ 选择章节 选择标签 + 章节列表 + 收藏 历史 下载 @@ -109,6 +115,8 @@ 下载设置 自动重试次数 单页下载错误时最大自动重试次数 + 正序显示下载章节 + 默认逆序显示 应用设置 启动页 选择默认启动页 @@ -122,7 +130,6 @@ 清除成功 清除失败 - 备份 备份收藏 备份收藏的漫画 @@ -141,7 +148,7 @@ 恢复成功 恢复失败 - version: 1.4.3.1 + version: 1.4.3.2 源代码 https://github.com/Arachnid-27/Cimoc 支持作者 diff --git a/gradle.properties b/gradle.properties index e6a1bc07..faf32af6 100644 --- a/gradle.properties +++ b/gradle.properties @@ -19,5 +19,5 @@ systemProp.http.proxyPort=1080 systemProp.https.proxyHost=127.0.0.1 systemProp.https.proxyPort=1080 -SUPPORT_LIB_VERSION=24.2.1 +SUPPORT_LIB_VERSION=25.0.1 From 252668ed3bfc9828879b6546073a30691b37d3b2 Mon Sep 17 00:00:00 2001 From: hiroshi Date: Fri, 2 Dec 2016 22:28:19 +0800 Subject: [PATCH 03/15] update --- app/build.gradle | 4 +- app/src/main/AndroidManifest.xml | 8 + .../com/hiroshi/cimoc/core/DBOpenHelper.java | 35 +-- .../java/com/hiroshi/cimoc/core/Download.java | 39 ++- .../java/com/hiroshi/cimoc/core/Update.java | 4 +- .../cimoc/core/manager/ComicManager.java | 41 ++- .../cimoc/core/manager/PreferenceManager.java | 2 - .../cimoc/core/manager/TagManager.java | 10 +- .../cimoc/core/manager/TaskManager.java | 12 +- .../com/hiroshi/cimoc/global/FastClick.java | 2 +- .../com/hiroshi/cimoc/global/SharedComic.java | 118 --------- .../java/com/hiroshi/cimoc/model/Chapter.java | 9 +- .../java/com/hiroshi/cimoc/model/Pair.java | 21 ++ .../com/hiroshi/cimoc/model/Selectable.java | 97 ------- .../java/com/hiroshi/cimoc/model/Source.java | 14 ++ .../cimoc/presenter/BackupPresenter.java | 10 +- .../cimoc/presenter/ChapterListPresenter.java | 106 -------- .../cimoc/presenter/ChapterPresenter.java | 82 ++++++ .../cimoc/presenter/ComicPresenter.java | 34 +-- .../cimoc/presenter/DetailPresenter.java | 238 +++++++----------- .../cimoc/presenter/DownloadPresenter.java | 10 +- .../cimoc/presenter/FavoritePresenter.java | 98 +------- .../cimoc/presenter/HistoryPresenter.java | 10 +- .../cimoc/presenter/ReaderPresenter.java | 59 ++--- .../cimoc/presenter/SearchPresenter.java | 6 - .../cimoc/presenter/SourcePresenter.java | 19 -- .../cimoc/presenter/TagComicPresenter.java | 109 ++++---- .../cimoc/presenter/TagEditorPresenter.java | 131 ++++++++++ .../hiroshi/cimoc/presenter/TagPresenter.java | 13 +- .../cimoc/presenter/TaskPresenter.java | 59 ++--- .../java/com/hiroshi/cimoc/rx/RxEvent.java | 5 +- .../com/hiroshi/cimoc/source/Webtoon.java | 6 - .../cimoc/ui/activity/ChapterActivity.java | 160 ++++++++++++ .../ui/activity/ChapterListActivity.java | 159 ------------ .../ui/activity/CoordinatorActivity.java | 40 +++ .../cimoc/ui/activity/DetailActivity.java | 183 ++++---------- .../cimoc/ui/activity/MainActivity.java | 32 +-- .../cimoc/ui/activity/ReaderActivity.java | 21 +- .../cimoc/ui/activity/ResultActivity.java | 22 +- .../cimoc/ui/activity/TagComicActivity.java | 120 ++------- .../cimoc/ui/activity/TagEditorActivity.java | 125 +++++++++ .../cimoc/ui/activity/TaskActivity.java | 120 +++------ .../hiroshi/cimoc/ui/adapter/BaseAdapter.java | 6 +- ...SelectAdapter.java => ChapterAdapter.java} | 41 +-- .../cimoc/ui/adapter/ChapterListAdapter.java | 36 --- .../cimoc/ui/adapter/TagEditorAdapter.java | 62 +++++ .../cimoc/ui/custom/ChapterButton.java | 4 +- .../cimoc/ui/fragment/ComicFragment.java | 92 ++----- .../cimoc/ui/fragment/SearchFragment.java | 46 ++-- .../fragment/classical/ClassicalFragment.java | 71 ------ .../coordinator/CoordinatorFragment.java | 69 +++++ .../SourceFragment.java | 79 ++---- .../TagFragment.java | 39 ++- .../grid/DownloadFragment.java | 7 +- .../grid/FavoriteFragment.java | 32 +-- .../grid/GridFragment.java | 35 +-- .../grid/HistoryFragment.java | 9 +- .../fragment/dialog/ItemDialogFragment.java | 51 ++++ .../fragment/dialog/MultiDialogFragment.java | 64 +++++ .../fragment/dialog/SelectDialogFragment.java | 115 --------- ...{ChapterListView.java => ChapterView.java} | 11 +- .../com/hiroshi/cimoc/ui/view/ComicView.java | 10 +- .../com/hiroshi/cimoc/ui/view/DetailView.java | 21 +- .../hiroshi/cimoc/ui/view/FavoriteView.java | 8 - .../com/hiroshi/cimoc/ui/view/GridView.java | 6 +- .../com/hiroshi/cimoc/ui/view/SearchView.java | 6 +- .../com/hiroshi/cimoc/ui/view/SourceView.java | 6 +- .../hiroshi/cimoc/ui/view/TagComicView.java | 12 +- .../hiroshi/cimoc/ui/view/TagEditorView.java | 24 ++ .../com/hiroshi/cimoc/ui/view/TagView.java | 6 +- .../com/hiroshi/cimoc/ui/view/TaskView.java | 4 - .../com/hiroshi/cimoc/ui/view/ThemeView.java | 13 + .../hiroshi/cimoc/utils/CollectionUtils.java | 18 ++ .../drawable-hdpi/ic_done_all_white_24dp.png | Bin 0 -> 275 bytes .../res/drawable-hdpi/ic_done_white_24dp.png | Bin 0 -> 188 bytes .../drawable-xhdpi/ic_done_all_white_24dp.png | Bin 0 -> 300 bytes .../res/drawable-xhdpi/ic_done_white_24dp.png | Bin 0 -> 199 bytes .../ic_done_all_white_24dp.png | Bin 0 -> 398 bytes .../drawable-xxhdpi/ic_done_white_24dp.png | Bin 0 -> 255 bytes .../main/res/layout/activity_chapter_list.xml | 32 --- ...tag_comic.xml => activity_coordinator.xml} | 12 +- app/src/main/res/layout/activity_detail.xml | 33 --- app/src/main/res/layout/activity_task.xml | 32 --- app/src/main/res/layout/activtiy_result.xml | 19 -- app/src/main/res/layout/dialog_select.xml | 8 - ...classical.xml => fragment_coordinator.xml} | 5 +- app/src/main/res/layout/item_select.xml | 8 +- app/src/main/res/menu/chapter_menu.xml | 9 + app/src/main/res/values/strings.xml | 36 ++- build.gradle | 2 +- 90 files changed, 1479 insertions(+), 2113 deletions(-) delete mode 100644 app/src/main/java/com/hiroshi/cimoc/global/SharedComic.java create mode 100644 app/src/main/java/com/hiroshi/cimoc/model/Pair.java delete mode 100644 app/src/main/java/com/hiroshi/cimoc/model/Selectable.java delete mode 100644 app/src/main/java/com/hiroshi/cimoc/presenter/ChapterListPresenter.java create mode 100644 app/src/main/java/com/hiroshi/cimoc/presenter/ChapterPresenter.java create mode 100644 app/src/main/java/com/hiroshi/cimoc/presenter/TagEditorPresenter.java create mode 100644 app/src/main/java/com/hiroshi/cimoc/ui/activity/ChapterActivity.java delete mode 100644 app/src/main/java/com/hiroshi/cimoc/ui/activity/ChapterListActivity.java create mode 100644 app/src/main/java/com/hiroshi/cimoc/ui/activity/CoordinatorActivity.java create mode 100644 app/src/main/java/com/hiroshi/cimoc/ui/activity/TagEditorActivity.java rename app/src/main/java/com/hiroshi/cimoc/ui/adapter/{SelectAdapter.java => ChapterAdapter.java} (55%) delete mode 100644 app/src/main/java/com/hiroshi/cimoc/ui/adapter/ChapterListAdapter.java create mode 100644 app/src/main/java/com/hiroshi/cimoc/ui/adapter/TagEditorAdapter.java delete mode 100644 app/src/main/java/com/hiroshi/cimoc/ui/fragment/classical/ClassicalFragment.java create mode 100644 app/src/main/java/com/hiroshi/cimoc/ui/fragment/coordinator/CoordinatorFragment.java rename app/src/main/java/com/hiroshi/cimoc/ui/fragment/{classical => coordinator}/SourceFragment.java (51%) rename app/src/main/java/com/hiroshi/cimoc/ui/fragment/{classical => coordinator}/TagFragment.java (87%) rename app/src/main/java/com/hiroshi/cimoc/ui/fragment/{classical => coordinator}/grid/DownloadFragment.java (97%) rename app/src/main/java/com/hiroshi/cimoc/ui/fragment/{classical => coordinator}/grid/FavoriteFragment.java (85%) rename app/src/main/java/com/hiroshi/cimoc/ui/fragment/{classical => coordinator}/grid/GridFragment.java (75%) rename app/src/main/java/com/hiroshi/cimoc/ui/fragment/{classical => coordinator}/grid/HistoryFragment.java (94%) create mode 100644 app/src/main/java/com/hiroshi/cimoc/ui/fragment/dialog/ItemDialogFragment.java create mode 100644 app/src/main/java/com/hiroshi/cimoc/ui/fragment/dialog/MultiDialogFragment.java delete mode 100644 app/src/main/java/com/hiroshi/cimoc/ui/fragment/dialog/SelectDialogFragment.java rename app/src/main/java/com/hiroshi/cimoc/ui/view/{ChapterListView.java => ChapterView.java} (50%) create mode 100644 app/src/main/java/com/hiroshi/cimoc/ui/view/TagEditorView.java create mode 100644 app/src/main/java/com/hiroshi/cimoc/ui/view/ThemeView.java create mode 100644 app/src/main/java/com/hiroshi/cimoc/utils/CollectionUtils.java create mode 100644 app/src/main/res/drawable-hdpi/ic_done_all_white_24dp.png create mode 100644 app/src/main/res/drawable-hdpi/ic_done_white_24dp.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_done_all_white_24dp.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_done_white_24dp.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_done_all_white_24dp.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_done_white_24dp.png delete mode 100644 app/src/main/res/layout/activity_chapter_list.xml rename app/src/main/res/layout/{activity_tag_comic.xml => activity_coordinator.xml} (79%) delete mode 100644 app/src/main/res/layout/activity_detail.xml delete mode 100644 app/src/main/res/layout/activity_task.xml delete mode 100644 app/src/main/res/layout/activtiy_result.xml delete mode 100644 app/src/main/res/layout/dialog_select.xml rename app/src/main/res/layout/{fragment_classical.xml => fragment_coordinator.xml} (87%) create mode 100644 app/src/main/res/menu/chapter_menu.xml diff --git a/app/build.gradle b/app/build.gradle index f3bf6c01..6a024efe 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -11,7 +11,7 @@ android { minSdkVersion 15 targetSdkVersion 25 versionCode 1 - versionName "1.4.4" + versionName "1.4.4.0" resConfigs "en", "zh" } buildTypes { @@ -44,7 +44,7 @@ dependencies { compile 'com.jakewharton:butterknife:8.4.0' apt 'com.jakewharton:butterknife-compiler:8.4.0' compile 'org.greenrobot:greendao:3.2.0' - compile 'com.squareup.okhttp3:okhttp:3.4.2' + compile 'com.squareup.okhttp3:okhttp:3.5.0' compile 'com.facebook.fresco:fresco:0.14.1' compile 'org.jsoup:jsoup:1.10.1' compile 'org.adw.library:discrete-seekbar:1.0.1' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 46f6b4bd..c2239f91 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -31,6 +31,14 @@ android:name=".ui.activity.DetailActivity" android:screenOrientation="portrait"/> + + + + diff --git a/app/src/main/java/com/hiroshi/cimoc/core/DBOpenHelper.java b/app/src/main/java/com/hiroshi/cimoc/core/DBOpenHelper.java index bbc85868..48f688ad 100644 --- a/app/src/main/java/com/hiroshi/cimoc/core/DBOpenHelper.java +++ b/app/src/main/java/com/hiroshi/cimoc/core/DBOpenHelper.java @@ -2,7 +2,6 @@ import android.content.Context; import android.database.sqlite.SQLiteDatabase; -import android.os.Environment; import com.hiroshi.cimoc.core.manager.SourceManager; import com.hiroshi.cimoc.model.ComicDao; @@ -16,7 +15,6 @@ import org.greenrobot.greendao.database.Database; -import java.io.File; import java.util.ArrayList; import java.util.List; @@ -57,41 +55,16 @@ public void onUpgrade(Database db, int oldVersion, int newVersion) { TagDao.createTable(db, false); TagRefDao.createTable(db, false); initSource(db); - renameDownload(); - } - } - - private void renameDownload() { - try { - File[] sourceDirs = - FileUtils.listFiles(FileUtils.getPath(Environment.getExternalStorageDirectory().getAbsolutePath(), "Cimoc", "download")); - for (File sourceDir : sourceDirs) { - if (sourceDir.isDirectory()) { - for (File comicDir : FileUtils.listFiles(sourceDir)) { - if (comicDir.isDirectory()) { - String filter = FileUtils.filterFilename(comicDir.getName()); - if (!filter.equals(comicDir.getName())) { - String newPath = FileUtils.getPath(sourceDir.getAbsolutePath(), filter); - comicDir.renameTo(new File(newPath)); - } - } - } - } - } - } catch (Exception e) { - e.printStackTrace(); } } private void initSource(Database db) { - String[] title = { "看漫画", "动漫之家", "手机汗汗", "CC图库", - "有妖气", "动漫屋", "Webtoon", "汗汗漫画", "57漫画"}; int[] type = { SourceManager.SOURCE_IKANMAN, SourceManager.SOURCE_DMZJ, SourceManager.SOURCE_HHAAZZ, SourceManager.SOURCE_CCTUKU, SourceManager.SOURCE_U17, SourceManager.SOURCE_DM5, - SourceManager.SOURCE_WEBTOON, SourceManager.SOURCE_HHSSEE, SourceManager.SOURCE_57MH}; - List list = new ArrayList<>(title.length); - for (int i = 0; i != title.length; ++i) { - list.add(new Source(null, title[i], type[i], true)); + SourceManager.SOURCE_WEBTOON, SourceManager.SOURCE_HHSSEE, SourceManager.SOURCE_57MH, SourceManager.SOURCE_CHUIYAO}; + List list = new ArrayList<>(type.length); + for (int i = 0; i != type.length; ++i) { + list.add(new Source(null, SourceManager.getTitle(type[i]), type[i], true)); } new DaoMaster(db).newSession().getSourceDao().insertInTx(list); } diff --git a/app/src/main/java/com/hiroshi/cimoc/core/Download.java b/app/src/main/java/com/hiroshi/cimoc/core/Download.java index 1057af37..b3751108 100644 --- a/app/src/main/java/com/hiroshi/cimoc/core/Download.java +++ b/app/src/main/java/com/hiroshi/cimoc/core/Download.java @@ -63,7 +63,7 @@ private static String writeComicToJson(List list, int source, String ci temp.put("path", chapter.getPath()); array.put(temp); } - object.put("list", array); + object.put("listInRx", array); return object.toString(); } @@ -86,37 +86,26 @@ public static boolean updateChapterIndex(int source, String comic, String title, } } - public static Observable> getComicIndex(final int source, final String comic) { - return Observable.create(new Observable.OnSubscribe>() { - @Override - public void call(Subscriber> subscriber) { - String dir = buildPath(source, comic); - char[] magic = FileUtils.readCharFromFile(dir, "index.cdif", 5); - if (!Arrays.equals(magic, "cimoc".toCharArray())) { - subscriber.onError(new Exception()); - } else { - String jsonString = FileUtils.readSingleLineFromFile(dir, "index.cdif"); - if (jsonString != null) { - try { - List list = readPathFromJson(jsonString.substring(5)); - subscriber.onNext(list); - subscriber.onCompleted(); - } catch (Exception e) { - e.printStackTrace(); - subscriber.onError(new Exception()); - } - } else { - subscriber.onError(new Exception()); - } + public static List getComicIndex(final int source, final String comic) { + String dir = buildPath(source, comic); + char[] magic = FileUtils.readCharFromFile(dir, "index.cdif", 5); + if (Arrays.equals(magic, "cimoc".toCharArray())) { + String jsonString = FileUtils.readSingleLineFromFile(dir, "index.cdif"); + if (jsonString != null) { + try { + return readPathFromJson(jsonString.substring(5)); + } catch (Exception e) { + e.printStackTrace(); } } - }).observeOn(Schedulers.io()); + } + return null; } private static List readPathFromJson(String jsonString) throws JSONException { JSONObject jsonObject = new JSONObject(jsonString); // We use "c" as the key in old version - JSONArray array = jsonObject.has("list") ? jsonObject.getJSONArray("list") : jsonObject.getJSONArray("c"); + JSONArray array = jsonObject.has("listInRx") ? jsonObject.getJSONArray("listInRx") : jsonObject.getJSONArray("c"); int size = array.length(); List list = new ArrayList<>(size); for (int i = 0; i != size; ++i) { diff --git a/app/src/main/java/com/hiroshi/cimoc/core/Update.java b/app/src/main/java/com/hiroshi/cimoc/core/Update.java index ceae3c33..015f8079 100644 --- a/app/src/main/java/com/hiroshi/cimoc/core/Update.java +++ b/app/src/main/java/com/hiroshi/cimoc/core/Update.java @@ -20,14 +20,14 @@ public static Observable check() { return Observable.create(new Observable.OnSubscribe() { @Override public void call(Subscriber subscriber) { - String url = "http://pan.baidu.com/share/list?uk=223062232&shareid=2388458898&dir=/update"; + String url = "http://pan.baidu.com/share/listInRx?uk=223062232&shareid=2388458898&dir=/update"; OkHttpClient client = CimocApplication.getHttpClient(); Request request = new Request.Builder().url(url).build(); try { Response response = client.newCall(request).execute(); if (response.isSuccessful()) { String json = response.body().string(); - JSONObject object = new JSONObject(json).getJSONArray("list").getJSONObject(0); + JSONObject object = new JSONObject(json).getJSONArray("listInRx").getJSONObject(0); String version = object.getString("server_filename"); subscriber.onNext(version); } else { diff --git a/app/src/main/java/com/hiroshi/cimoc/core/manager/ComicManager.java b/app/src/main/java/com/hiroshi/cimoc/core/manager/ComicManager.java index f4109d15..43e53d47 100644 --- a/app/src/main/java/com/hiroshi/cimoc/core/manager/ComicManager.java +++ b/app/src/main/java/com/hiroshi/cimoc/core/manager/ComicManager.java @@ -5,6 +5,7 @@ import com.hiroshi.cimoc.model.ComicDao; import com.hiroshi.cimoc.model.ComicDao.Properties; +import java.util.Collection; import java.util.List; import java.util.concurrent.Callable; @@ -39,7 +40,14 @@ public void runInTx(Runnable runnable) { mComicDao.getSession().runInTx(runnable); } - public Observable> listFavorite() { + public List listFavorite() { + return mComicDao.queryBuilder() + .where(Properties.Favorite.isNotNull()) + .orderDesc(Properties.Highlight, Properties.Favorite) + .list(); + } + + public Observable> listFavoriteInRx() { return mComicDao.queryBuilder() .where(Properties.Favorite.isNotNull()) .orderDesc(Properties.Highlight, Properties.Favorite) @@ -47,7 +55,7 @@ public Observable> listFavorite() { .list(); } - public Observable> listHistory() { + public Observable> listHistoryInRx() { return mComicDao.queryBuilder() .where(Properties.History.isNotNull()) .orderDesc(Properties.History) @@ -55,7 +63,7 @@ public Observable> listHistory() { .list(); } - public Observable> listDownload() { + public Observable> listDownloadInRx() { return mComicDao.queryBuilder() .where(Properties.Download.isNotNull()) .orderDesc(Properties.Download) @@ -73,6 +81,11 @@ public Comic load(int source, String cid) { .unique(); } + public Comic loadOrCreate(int source, String cid) { + Comic comic = load(source, cid); + return comic == null ? new Comic(source, cid) : comic; + } + public Observable loadLast() { return mComicDao.queryBuilder() .where(Properties.History.isNotNull()) @@ -82,20 +95,28 @@ public Observable loadLast() { .unique(); } + public void updateOrInsert(Comic comic) { + if (comic.getId() == null) { + insert(comic); + } else { + update(comic); + } + } + public void update(Comic comic) { mComicDao.update(comic); } public void delete(Comic comic) { - mComicDao.delete(comic); - } - - public void deleteByKey(long id) { - mComicDao.deleteByKey(id); + if (comic.getFavorite() == null && comic.getHistory() == null && comic.getDownload() == null) { + mComicDao.delete(comic); + comic.setId(null); + } } - public long insert(Comic comic) { - return mComicDao.insert(comic); + public void insert(Comic comic) { + long id = mComicDao.insert(comic); + comic.setId(id); } public static ComicManager getInstance() { diff --git a/app/src/main/java/com/hiroshi/cimoc/core/manager/PreferenceManager.java b/app/src/main/java/com/hiroshi/cimoc/core/manager/PreferenceManager.java index aadc91ac..f6fa8814 100644 --- a/app/src/main/java/com/hiroshi/cimoc/core/manager/PreferenceManager.java +++ b/app/src/main/java/com/hiroshi/cimoc/core/manager/PreferenceManager.java @@ -25,8 +25,6 @@ public class PreferenceManager { public static final String PREF_MAIN_NOTICE = "pref_main_notice"; - public static final String PREF_VERSION = "pref_version"; - public static final String PREF_READER_MODE = "pref_reader_mode"; public static final String PREF_READER_KEEP_ON = "pref_reader_keep_on"; public static final String PREF_READER_HIDE_INFO = "pref_reader_hide_info"; diff --git a/app/src/main/java/com/hiroshi/cimoc/core/manager/TagManager.java b/app/src/main/java/com/hiroshi/cimoc/core/manager/TagManager.java index f2c11dc8..9b9f3ba7 100644 --- a/app/src/main/java/com/hiroshi/cimoc/core/manager/TagManager.java +++ b/app/src/main/java/com/hiroshi/cimoc/core/manager/TagManager.java @@ -16,11 +16,6 @@ public class TagManager { - public static final int TAG_ALL = 100; - public static final int TAG_CONTINUE = 101; - public static final int TAG_END = 102; - public static final int TAG_NORMAL = 103; - private static TagManager mTagManager; private TagDao mTagDao; @@ -39,7 +34,7 @@ public void runInTx(Runnable runnable) { mRefDao.getSession().runInTx(runnable); } - public Observable> list() { + public Observable> listInRx() { return mTagDao.queryBuilder() .rx() .list(); @@ -52,10 +47,9 @@ public Observable> listByTag(long id) { .list(); } - public Observable> listByComic(long cid) { + public List listByComic(long cid) { return mRefDao.queryBuilder() .where(TagRefDao.Properties.Cid.eq(cid)) - .rx() .list(); } diff --git a/app/src/main/java/com/hiroshi/cimoc/core/manager/TaskManager.java b/app/src/main/java/com/hiroshi/cimoc/core/manager/TaskManager.java index 3027a417..61517d42 100644 --- a/app/src/main/java/com/hiroshi/cimoc/core/manager/TaskManager.java +++ b/app/src/main/java/com/hiroshi/cimoc/core/manager/TaskManager.java @@ -22,14 +22,18 @@ private TaskManager() { mTaskDao = CimocApplication.getDaoSession().getTaskDao(); } - public Observable> list(long key) { + public List list(long key) { + return mTaskDao.queryBuilder().where(Properties.Key.eq(key)).list(); + } + + public Observable> listInRx(long key) { return mTaskDao.queryBuilder() .where(Properties.Key.eq(key)) .rx() .list(); } - public Observable> list() { + public Observable> listInRx() { return mTaskDao.queryBuilder() .rx() .list(); @@ -51,6 +55,10 @@ public void deleteInTx(Iterable entities) { mTaskDao.deleteInTx(entities); } + public void deleteByKeyInTx(Iterable keys) { + mTaskDao.deleteByKeyInTx(keys); + } + public static TaskManager getInstance() { if (mTaskManager == null) { mTaskManager = new TaskManager(); diff --git a/app/src/main/java/com/hiroshi/cimoc/global/FastClick.java b/app/src/main/java/com/hiroshi/cimoc/global/FastClick.java index 7b6ef956..6acff0ad 100644 --- a/app/src/main/java/com/hiroshi/cimoc/global/FastClick.java +++ b/app/src/main/java/com/hiroshi/cimoc/global/FastClick.java @@ -10,7 +10,7 @@ public class FastClick { public static boolean isClickValid() { long cur = System.currentTimeMillis(); - boolean valid = cur - last > 1200; + boolean valid = cur - last > 800; if (valid) { last = cur; } diff --git a/app/src/main/java/com/hiroshi/cimoc/global/SharedComic.java b/app/src/main/java/com/hiroshi/cimoc/global/SharedComic.java deleted file mode 100644 index 4b023461..00000000 --- a/app/src/main/java/com/hiroshi/cimoc/global/SharedComic.java +++ /dev/null @@ -1,118 +0,0 @@ -package com.hiroshi.cimoc.global; - -import com.hiroshi.cimoc.core.manager.ComicManager; -import com.hiroshi.cimoc.model.Comic; -import com.hiroshi.cimoc.model.MiniComic; - -/** - * Created by Hiroshi on 2016/11/14. - */ - -public class SharedComic { - - private static SharedComic instance; - - private Comic mCurrentComic; - private ComicManager mComicManager; - - private SharedComic() { - mComicManager = ComicManager.getInstance(); - } - - public MiniComic minify() { - return new MiniComic(mCurrentComic); - } - - public Comic get() { - return mCurrentComic; - } - - public String last() { - return mCurrentComic.getLast(); - } - - public Integer page() { - return mCurrentComic.getPage(); - } - - public int source() { - return mCurrentComic.getSource(); - } - - public String cid() { - return mCurrentComic.getCid(); - } - - public String title() { - return mCurrentComic.getTitle(); - } - - public boolean isDownload() { - return mCurrentComic.getDownload() != null; - } - - public boolean isFavorite() { - return mCurrentComic.getFavorite() != null; - } - - public boolean isHistory() { - return mCurrentComic.getHistory() != null; - } - - public boolean isHighLight() { - return mCurrentComic.getHighlight(); - } - - public Long id() { - return mCurrentComic.getId(); - } - - public void open(long id) { - mCurrentComic = mComicManager.load(id); - } - - public void open(int source, String cid) { - mCurrentComic = mComicManager.load(source, cid); - } - - public void open(Comic comic) { - mCurrentComic = comic; - } - - public void insert() { - if (mCurrentComic.getId() == null) { - long id = mComicManager.insert(mCurrentComic); - mCurrentComic.setId(id); - } - } - - public void delete() { - if (!isDownload() && !isHistory() && !isFavorite()) { - mComicManager.delete(mCurrentComic); - mCurrentComic.setId(null); - } - } - - public void update() { - if (mCurrentComic.getId() != null) { - mComicManager.update(mCurrentComic); - } - } - - public void updateOrInsert() { - if (mCurrentComic.getId() != null) { - mComicManager.update(mCurrentComic); - } else { - long id = mComicManager.insert(mCurrentComic); - mCurrentComic.setId(id); - } - } - - public static SharedComic getInstance() { - if (instance == null) { - instance = new SharedComic(); - } - return instance; - } - -} diff --git a/app/src/main/java/com/hiroshi/cimoc/model/Chapter.java b/app/src/main/java/com/hiroshi/cimoc/model/Chapter.java index 23a4eb55..c9e6a4b3 100644 --- a/app/src/main/java/com/hiroshi/cimoc/model/Chapter.java +++ b/app/src/main/java/com/hiroshi/cimoc/model/Chapter.java @@ -14,20 +14,20 @@ public class Chapter implements Parcelable { private boolean complete; private boolean download; - public Chapter(String title, String path, int count, boolean complete) { + public Chapter(String title, String path, int count, boolean complete, boolean download) { this.title = title; this.path = path; this.count = count; this.complete = complete; - this.download = false; + this.download = download; } public Chapter(String title, String path) { - this(title, path, 0, false); + this(title, path, 0, false, false); } public Chapter(Parcel source) { - this(source.readString(), source.readString(), source.readInt(), source.readByte() == 1); + this(source.readString(), source.readString(), source.readInt(), source.readByte() == 1, source.readByte() == 1); } public String getTitle() { @@ -83,6 +83,7 @@ public void writeToParcel(Parcel dest, int flags) { dest.writeString(path); dest.writeInt(count); dest.writeByte((byte) (complete ? 1 : 0)); + dest.writeByte((byte) (download ? 1 : 0)); } public final static Parcelable.Creator CREATOR = new Parcelable.Creator() { diff --git a/app/src/main/java/com/hiroshi/cimoc/model/Pair.java b/app/src/main/java/com/hiroshi/cimoc/model/Pair.java new file mode 100644 index 00000000..bb8de15a --- /dev/null +++ b/app/src/main/java/com/hiroshi/cimoc/model/Pair.java @@ -0,0 +1,21 @@ +package com.hiroshi.cimoc.model; + +/** + * Created by Hiroshi on 2016/12/1. + */ + +public class Pair { + + public F first; + public S second; + + private Pair(F first, S second) { + this.first = first; + this.second = second; + } + + public static Pair create(F first, S second) { + return new Pair<>(first, second); + } + +} diff --git a/app/src/main/java/com/hiroshi/cimoc/model/Selectable.java b/app/src/main/java/com/hiroshi/cimoc/model/Selectable.java deleted file mode 100644 index f11e12dc..00000000 --- a/app/src/main/java/com/hiroshi/cimoc/model/Selectable.java +++ /dev/null @@ -1,97 +0,0 @@ -package com.hiroshi.cimoc.model; - -import android.os.Parcel; -import android.os.Parcelable; - -/** - * Created by Hiroshi on 2016/10/11. - */ - -public class Selectable implements Parcelable, Cloneable { - - private boolean disable; - private boolean checked; - private long id; - private String title; - - public Selectable(Parcel source) { - this.disable = source.readByte() == 1; - this.checked = source.readByte() == 1; - this.id = source.readLong(); - this.title = source.readString(); - } - - public Selectable(boolean disable, boolean checked, long id, String title) { - this.disable = disable; - this.checked = checked; - this.id = id; - this.title = title; - } - - public Selectable(boolean disable, boolean checked, String title) { - this(disable, checked, -1, title); - } - - public boolean isDisable() { - return disable; - } - - public void setDisable(boolean disable) { - this.disable = disable; - } - - public boolean isChecked() { - return checked; - } - - public void setChecked(boolean checked) { - this.checked = checked; - } - - public String getTitle() { - return title; - } - - public void setTitle(String title) { - this.title = title; - } - - public long getId() { - return id; - } - - public void setId(long id) { - this.id = id; - } - - @Override - public int describeContents() { - return 0; - } - - @Override - public void writeToParcel(Parcel dest, int flags) { - dest.writeByte((byte) (disable ? 1 : 0)); - dest.writeByte((byte) (checked ? 1 : 0)); - dest.writeLong(id); - dest.writeString(title); - } - - public final static Parcelable.Creator CREATOR = new Parcelable.Creator() { - @Override - public Selectable createFromParcel(Parcel source) { - return new Selectable(source); - } - - @Override - public Selectable[] newArray(int size) { - return new Selectable[size]; - } - }; - - @Override - public Object clone() throws CloneNotSupportedException { - return super.clone(); - } - -} diff --git a/app/src/main/java/com/hiroshi/cimoc/model/Source.java b/app/src/main/java/com/hiroshi/cimoc/model/Source.java index 7ff272c0..abf8302e 100644 --- a/app/src/main/java/com/hiroshi/cimoc/model/Source.java +++ b/app/src/main/java/com/hiroshi/cimoc/model/Source.java @@ -3,7 +3,9 @@ import org.greenrobot.greendao.annotation.Entity; import org.greenrobot.greendao.annotation.Generated; import org.greenrobot.greendao.annotation.Id; +import org.greenrobot.greendao.annotation.Keep; import org.greenrobot.greendao.annotation.NotNull; +import org.greenrobot.greendao.annotation.Transient; import org.greenrobot.greendao.annotation.Unique; /** @@ -17,12 +19,16 @@ public class Source { @Unique private int type; @NotNull private boolean enable; + @Transient private boolean check; + + @Keep @Generated(hash = 1339691905) public Source(Long id, @NotNull String title, int type, boolean enable) { this.id = id; this.title = title; this.type = type; this.enable = enable; + this.check = enable; } @Generated(hash = 615387317) @@ -71,4 +77,12 @@ public void setEnable(boolean enable) { this.enable = enable; } + public boolean getCheck() { + return check; + } + + public void setCheck(boolean check) { + this.check = check; + } + } diff --git a/app/src/main/java/com/hiroshi/cimoc/presenter/BackupPresenter.java b/app/src/main/java/com/hiroshi/cimoc/presenter/BackupPresenter.java index 24fbdc9b..959e8944 100644 --- a/app/src/main/java/com/hiroshi/cimoc/presenter/BackupPresenter.java +++ b/app/src/main/java/com/hiroshi/cimoc/presenter/BackupPresenter.java @@ -69,7 +69,7 @@ public void call(Throwable throwable) { } public void loadTag() { - mCompositeSubscription.add(mTagManager.list() + mCompositeSubscription.add(mTagManager.listInRx() .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Action1>() { @Override @@ -90,7 +90,7 @@ public void call(Throwable throwable) { } public void saveFavorite() { - mCompositeSubscription.add(mComicManager.listFavorite() + mCompositeSubscription.add(mComicManager.listFavoriteInRx() .flatMap(new Func1, Observable>() { @Override public Observable call(List list) { @@ -163,8 +163,7 @@ public List call() throws Exception { Comic temp = mComicManager.load(comic.getSource(), comic.getCid()); if (temp == null) { comic.setFavorite(favorite); - long id = mComicManager.insert(comic); - comic.setId(id); + mComicManager.insert(comic); result.add(new MiniComic(comic)); } else if (temp.getFavorite() == null) { temp.setFavorite(favorite); @@ -220,8 +219,7 @@ public RxObject call() throws Exception { if (temp == null) { temp = comic; comic.setFavorite(favorite); - long cid = mComicManager.insert(comic); - comic.setId(cid); + mComicManager.insert(comic); } else if (temp.getFavorite() == null) { temp.setFavorite(favorite); mComicManager.update(temp); diff --git a/app/src/main/java/com/hiroshi/cimoc/presenter/ChapterListPresenter.java b/app/src/main/java/com/hiroshi/cimoc/presenter/ChapterListPresenter.java deleted file mode 100644 index 4fd77cba..00000000 --- a/app/src/main/java/com/hiroshi/cimoc/presenter/ChapterListPresenter.java +++ /dev/null @@ -1,106 +0,0 @@ -package com.hiroshi.cimoc.presenter; - -import com.hiroshi.cimoc.core.Download; -import com.hiroshi.cimoc.global.SharedComic; -import com.hiroshi.cimoc.core.manager.ComicManager; -import com.hiroshi.cimoc.core.manager.TaskManager; -import com.hiroshi.cimoc.model.Chapter; -import com.hiroshi.cimoc.model.Task; -import com.hiroshi.cimoc.rx.RxBus; -import com.hiroshi.cimoc.rx.RxEvent; -import com.hiroshi.cimoc.ui.view.ChapterListView; - -import java.util.ArrayList; -import java.util.LinkedList; -import java.util.List; -import java.util.concurrent.Callable; - -import rx.android.schedulers.AndroidSchedulers; -import rx.functions.Action1; - -/** - * Created by Hiroshi on 2016/11/14. - */ - -public class ChapterListPresenter extends BasePresenter { - - private ComicManager mComicManager; - private TaskManager mTaskManager; - private SharedComic mSharedComic; - - public ChapterListPresenter() { - mComicManager = ComicManager.getInstance(); - mTaskManager = TaskManager.getInstance(); - mSharedComic = SharedComic.getInstance(); - } - - public void loadDownload() { - if (mSharedComic.isDownload()) { - mCompositeSubscription.add(mTaskManager.list(mSharedComic.id()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(new Action1>() { - @Override - public void call(List list) { - mBaseView.onDownloadLoadSuccess(list); - } - }, new Action1() { - @Override - public void call(Throwable throwable) { - mBaseView.onDownloadLoadFail(); - } - })); - } else { - mBaseView.onDownloadLoadSuccess(new LinkedList()); - } - } - - public void addTask(final List list) { - mCompositeSubscription.add(mComicManager.callInRx(new Callable>() { - @Override - public ArrayList call() throws Exception { - Long key = mSharedComic.id(); - mSharedComic.get().setDownload(System.currentTimeMillis()); - mSharedComic.updateOrInsert(); - ArrayList taskList = new ArrayList<>(list.size()); - for (Chapter chapter : list) { - Task task = new Task(null, key, chapter.getPath(), chapter.getTitle(), 0, 0); - long id = mTaskManager.insert(task); - task.setId(id); - task.setInfo(mSharedComic.source(), mSharedComic.cid(), mSharedComic.title()); - task.setState(Task.STATE_WAIT); - taskList.add(task); - } - RxBus.getInstance().post(new RxEvent(RxEvent.EVENT_TASK_INSERT, mSharedComic.minify(), taskList)); - return taskList; - } - }).observeOn(AndroidSchedulers.mainThread()) - .subscribe(new Action1>() { - @Override - public void call(ArrayList list) { - mBaseView.onTaskAddSuccess(list); - } - }, new Action1() { - @Override - public void call(Throwable throwable) { - mBaseView.onTaskAddFail(); - } - })); - } - - public void updateIndex(List list) { - mCompositeSubscription.add(Download.updateComicIndex(list, mSharedComic.get()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(new Action1() { - @Override - public void call(Void aVoid) { - mBaseView.onUpdateIndexSuccess(); - } - }, new Action1() { - @Override - public void call(Throwable throwable) { - mBaseView.onUpdateIndexFail(); - } - })); - } - -} diff --git a/app/src/main/java/com/hiroshi/cimoc/presenter/ChapterPresenter.java b/app/src/main/java/com/hiroshi/cimoc/presenter/ChapterPresenter.java new file mode 100644 index 00000000..01941041 --- /dev/null +++ b/app/src/main/java/com/hiroshi/cimoc/presenter/ChapterPresenter.java @@ -0,0 +1,82 @@ +package com.hiroshi.cimoc.presenter; + +import com.hiroshi.cimoc.core.Download; +import com.hiroshi.cimoc.core.manager.ComicManager; +import com.hiroshi.cimoc.core.manager.TaskManager; +import com.hiroshi.cimoc.model.Chapter; +import com.hiroshi.cimoc.model.Comic; +import com.hiroshi.cimoc.model.MiniComic; +import com.hiroshi.cimoc.model.Task; +import com.hiroshi.cimoc.rx.RxBus; +import com.hiroshi.cimoc.rx.RxEvent; +import com.hiroshi.cimoc.ui.view.ChapterView; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.Callable; + +import rx.Observable; +import rx.android.schedulers.AndroidSchedulers; +import rx.functions.Action1; +import rx.functions.Func1; + +/** + * Created by Hiroshi on 2016/11/14. + */ + +public class ChapterPresenter extends BasePresenter { + + private ComicManager mComicManager; + private TaskManager mTaskManager; + private Comic mComic; + + public ChapterPresenter() { + mComicManager = ComicManager.getInstance(); + mTaskManager = TaskManager.getInstance(); + } + + public void load(long id) { + mComic = mComicManager.load(id); + } + + public void addTask(List cList, final List dList) { + mCompositeSubscription.add(Download.updateComicIndex(cList, mComic) + .flatMap(new Func1>>() { + @Override + public Observable> call(Void v) { + return mComicManager.callInRx(new Callable>() { + @Override + public ArrayList call() throws Exception { + Long key = mComic.getId(); + mComic.setDownload(System.currentTimeMillis()); + mComicManager.updateOrInsert(mComic); + ArrayList result = new ArrayList<>(); + for (Chapter chapter : dList) { + Task task = new Task(null, key, chapter.getPath(), chapter.getTitle(), 0, 0); + long id = mTaskManager.insert(task); + task.setId(id); + task.setInfo(mComic.getSource(), mComic.getCid(), mComic.getTitle()); + task.setState(Task.STATE_WAIT); + result.add(task); + } + return result; + } + }); + } + }) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Action1>() { + @Override + public void call(ArrayList list) { + RxBus.getInstance().post(new RxEvent(RxEvent.EVENT_TASK_INSERT, new MiniComic(mComic), list)); + mBaseView.onTaskAddSuccess(list); + } + }, new Action1() { + @Override + public void call(Throwable throwable) { + mBaseView.onTaskAddFail(); + } + })); + } + +} diff --git a/app/src/main/java/com/hiroshi/cimoc/presenter/ComicPresenter.java b/app/src/main/java/com/hiroshi/cimoc/presenter/ComicPresenter.java index fea9e8ca..e6d8803d 100644 --- a/app/src/main/java/com/hiroshi/cimoc/presenter/ComicPresenter.java +++ b/app/src/main/java/com/hiroshi/cimoc/presenter/ComicPresenter.java @@ -2,8 +2,6 @@ import com.hiroshi.cimoc.core.manager.TagManager; import com.hiroshi.cimoc.model.Tag; -import com.hiroshi.cimoc.rx.RxBus; -import com.hiroshi.cimoc.rx.RxEvent; import com.hiroshi.cimoc.ui.view.ComicView; import java.util.List; @@ -23,30 +21,8 @@ public ComicPresenter() { mTagManager = TagManager.getInstance(); } - @Override - protected void initSubscription() { - addSubscription(RxEvent.EVENT_TAG_DELETE, new Action1() { - @Override - public void call(RxEvent rxEvent) { - mBaseView.onTagDelete((Tag) rxEvent.getData()); - } - }); - addSubscription(RxEvent.EVENT_TAG_INSERT, new Action1() { - @Override - public void call(RxEvent rxEvent) { - mBaseView.onTagInsert((Tag) rxEvent.getData()); - } - }); - addSubscription(RxEvent.EVENT_THEME_CHANGE, new Action1() { - @Override - public void call(RxEvent rxEvent) { - mBaseView.onThemeChange((int) rxEvent.getData(1), (int) rxEvent.getData(2)); - } - }); - } - public void load() { - mCompositeSubscription.add(mTagManager.list() + mCompositeSubscription.add(mTagManager.listInRx() .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Action1>() { @Override @@ -61,12 +37,4 @@ public void call(Throwable throwable) { })); } - public void filter(int type, long id) { - if (type != TagManager.TAG_NORMAL) { - RxBus.getInstance().post(new RxEvent(RxEvent.EVENT_COMIC_FILTER, type)); - } else { - RxBus.getInstance().post(new RxEvent(RxEvent.EVENT_COMIC_FILTER, TagManager.TAG_NORMAL, id)); - } - } - } diff --git a/app/src/main/java/com/hiroshi/cimoc/presenter/DetailPresenter.java b/app/src/main/java/com/hiroshi/cimoc/presenter/DetailPresenter.java index 22b5c272..a0527358 100644 --- a/app/src/main/java/com/hiroshi/cimoc/presenter/DetailPresenter.java +++ b/app/src/main/java/com/hiroshi/cimoc/presenter/DetailPresenter.java @@ -1,47 +1,38 @@ package com.hiroshi.cimoc.presenter; import com.hiroshi.cimoc.core.Manga; -import com.hiroshi.cimoc.global.SharedComic; +import com.hiroshi.cimoc.core.manager.ComicManager; import com.hiroshi.cimoc.core.manager.TagManager; import com.hiroshi.cimoc.core.manager.TaskManager; import com.hiroshi.cimoc.model.Chapter; import com.hiroshi.cimoc.model.Comic; -import com.hiroshi.cimoc.model.Selectable; -import com.hiroshi.cimoc.model.Tag; -import com.hiroshi.cimoc.model.TagRef; +import com.hiroshi.cimoc.model.MiniComic; import com.hiroshi.cimoc.model.Task; import com.hiroshi.cimoc.rx.RxBus; import com.hiroshi.cimoc.rx.RxEvent; -import com.hiroshi.cimoc.rx.ToAnotherList; import com.hiroshi.cimoc.ui.view.DetailView; -import java.util.HashSet; -import java.util.LinkedList; +import java.util.HashMap; import java.util.List; -import java.util.Set; +import java.util.Map; -import rx.Observable; -import rx.Subscriber; import rx.android.schedulers.AndroidSchedulers; import rx.functions.Action1; -import rx.functions.Func1; -import rx.schedulers.Schedulers; /** * Created by Hiroshi on 2016/7/4. */ public class DetailPresenter extends BasePresenter { + private ComicManager mComicManager; private TaskManager mTaskManager; private TagManager mTagManager; - private SharedComic mSharedComic; - private Set mTagSet; + private Comic mComic; public DetailPresenter() { + mComicManager = ComicManager.getInstance(); mTaskManager = TaskManager.getInstance(); mTagManager = TagManager.getInstance(); - mSharedComic = SharedComic.getInstance(); - mTagSet = new HashSet<>(); } @Override @@ -49,43 +40,62 @@ protected void initSubscription() { addSubscription(RxEvent.EVENT_COMIC_CHAPTER_CHANGE, new Action1() { @Override public void call(RxEvent rxEvent) { - mBaseView.onChapterChange(mSharedComic.last()); + mComic = mComicManager.load(mComic.getId()); + mBaseView.onChapterChange(mComic.getLast()); + } + }); + addSubscription(RxEvent.EVENT_TASK_INSERT, new Action1() { + @Override + public void call(RxEvent rxEvent) { + mComic = mComicManager.load(((MiniComic) rxEvent.getData()).getId()); } }); } public void loadDetail(int source, String cid) { - mSharedComic.open(source, cid); - if (mSharedComic.get() == null) { - mSharedComic.open(new Comic(source, cid)); - } + mComic = mComicManager.loadOrCreate(source, cid); + updateHighlight(); loadDetail(); } public void loadDetail(long id) { - mSharedComic.open(id); + mComic = mComicManager.load(id); + updateHighlight(); loadDetail(); } - public void loadDetail() { - if (mSharedComic.isHighLight()) { - mSharedComic.get().setHighlight(false); - mSharedComic.get().setFavorite(System.currentTimeMillis()); - mSharedComic.update(); - } - mCompositeSubscription.add(Manga.info(mSharedComic.get()) + private void loadDetail() { + mCompositeSubscription.add(Manga.info(mComic) + .doOnNext(new Action1>() { + @Override + public void call(List list) { + if (mComic.getId() != null) { + Map map = new HashMap<>(); + for (Task task : mTaskManager.list(mComic.getId())) { + map.put(task.getPath(), task.isFinish()); + } + if (!map.isEmpty()) { + for (Chapter chapter : list) { + if (map.containsKey(chapter.getPath())) { + chapter.setDownload(true); + chapter.setComplete(map.get(chapter.getPath())); + } + } + } + } + } + }) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Action1>() { @Override public void call(List list) { - mBaseView.onComicLoadSuccess(mSharedComic.get()); + mBaseView.onComicLoadSuccess(mComic); mBaseView.onChapterLoadSuccess(list); - mBaseView.onDetailLoadSuccess(); } }, new Action1() { @Override public void call(Throwable throwable) { - mBaseView.onComicLoadSuccess(mSharedComic.get()); + mBaseView.onComicLoadSuccess(mComic); if (throwable instanceof Manga.NetworkErrorException) { mBaseView.onNetworkError(); } else { @@ -95,138 +105,74 @@ public void call(Throwable throwable) { })); } - public void loadTag() { - mTagSet.clear(); - mCompositeSubscription.add(mTagManager.listByComic(mSharedComic.id()) - .compose(new ToAnotherList<>(new Func1() { - @Override - public Long call(TagRef ref) { - return ref.getTid(); - } - })) - .flatMap(new Func1, Observable>>() { - @Override - public Observable> call(List list) { - mTagSet.addAll(list); - return mTagManager.list(); - } - }) - .compose(new ToAnotherList<>(new Func1() { - @Override - public Selectable call(Tag tag) { - return new Selectable(false, mTagSet.contains(tag.getId()), tag.getId(), tag.getTitle()); - } - })) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(new Action1>() { - @Override - public void call(List list) { - mBaseView.onTagLoadSuccess(list); - } - }, new Action1() { - @Override - public void call(Throwable throwable) { - mBaseView.onTagLoadFail(); - } - })); + private void updateHighlight() { + if (mComic.getHighlight()) { + mComic.setHighlight(false); + mComic.setFavorite(System.currentTimeMillis()); + mComicManager.update(mComic); + } } - public void updateRef(final List insertList) { - mCompositeSubscription.add(Observable.create(new Observable.OnSubscribe() { - @Override - public void call(Subscriber subscriber) { - final List deleteList = new LinkedList<>(mTagSet); - deleteList.removeAll(insertList); - insertList.removeAll(mTagSet); - if (!deleteList.isEmpty() || !insertList.isEmpty()) { - mTagManager.runInTx(new Runnable() { - @Override - public void run() { - for (Long tid : deleteList) { - mTagManager.delete(tid, mSharedComic.id()); - } - for (Long tid : insertList) { - mTagManager.insert(new TagRef(null, tid, mSharedComic.id())); - } - } - }); - RxBus.getInstance().post(new RxEvent(RxEvent.EVENT_TAG_UPDATE, mSharedComic.minify(), deleteList, insertList)); - } - subscriber.onNext(null); - subscriber.onCompleted(); - } - }).subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(new Action1() { - @Override - public void call(Void v) { - mBaseView.onTagUpdateSuccess(); - } - }, new Action1() { - @Override - public void call(Throwable throwable) { - mBaseView.onTagUpdateFail(); - } - })); + /** + * 更新最后阅读 + * @param path 最后阅读 + * @param favorite 是否从收藏界面进入 + */ + public void updateLast(String path, boolean favorite) { + if (favorite && mComic.getFavorite() != null) { // 从收藏界面进入且没有取消收藏 + mComic.setFavorite(System.currentTimeMillis()); + } + mComic.setHistory(System.currentTimeMillis()); + if (!path.equals(mComic.getLast())) { + mComic.setLast(path); + mComic.setPage(1); + } + mComicManager.updateOrInsert(mComic); + RxBus.getInstance().post(new RxEvent(RxEvent.EVENT_COMIC_READ, new MiniComic(mComic), favorite)); } - public void loadDownload() { - if (mSharedComic.isDownload()) { - mCompositeSubscription.add(mTaskManager.list(mSharedComic.id()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(new Action1>() { - @Override - public void call(List list) { - mBaseView.onDownloadLoadSuccess(list); - } - }, new Action1() { - @Override - public void call(Throwable throwable) { - mBaseView.onDownloadLoadFail(); - } - })); - } else { - mBaseView.onDownloadLoadSuccess(new LinkedList()); - } + public long getId() { + return mComic.getId() == null ? -1 : mComic.getId(); } - public void updateLast(String last, boolean favorite) { - if (favorite) { - mSharedComic.get().setFavorite(System.currentTimeMillis()); - } - mSharedComic.get().setHistory(System.currentTimeMillis()); - if (!last.equals(mSharedComic.get().getLast())) { - mSharedComic.get().setLast(last); - mSharedComic.get().setPage(1); - } - if (mSharedComic.id() != null) { - mSharedComic.update(); + public void onFavoriteClick() { + if (mComic.getFavorite() != null) { + unfavoriteComic(); } else { - mSharedComic.insert(); + favoriteComic(); } - RxBus.getInstance().post(new RxEvent(RxEvent.EVENT_COMIC_READ, mSharedComic.minify(), favorite)); } - public boolean isFavorite() { - return mSharedComic.isFavorite(); + public void onTagClick() { + if (mComic.getFavorite() != null) { + mBaseView.onTagOpenSuccess(); + } else { + mBaseView.onTagOpenFail(); + } } - public String getLast() { - return mSharedComic.last(); + public void onTitleClick(String path, boolean favorite) { + if (mComic.getLast() != null) { + path = mComic.getLast(); + } + updateLast(path, favorite); + mBaseView.onLastOpenSuccess(path); } - public void favoriteComic() { - mSharedComic.get().setFavorite(System.currentTimeMillis()); - mSharedComic.insert(); - RxBus.getInstance().post(new RxEvent(RxEvent.EVENT_COMIC_FAVORITE, mSharedComic.minify())); + private void favoriteComic() { + mComic.setFavorite(System.currentTimeMillis()); + mComicManager.updateOrInsert(mComic); + RxBus.getInstance().post(new RxEvent(RxEvent.EVENT_COMIC_FAVORITE, new MiniComic(mComic))); + mBaseView.onFavoriteSuccess(); } - public void unfavoriteComic() { - long id = mSharedComic.id(); - mSharedComic.get().setFavorite(null); + private void unfavoriteComic() { + long id = mComic.getId(); + mComic.setFavorite(null); mTagManager.deleteByComic(id); - mSharedComic.delete(); + mComicManager.delete(mComic); RxBus.getInstance().post(new RxEvent(RxEvent.EVENT_COMIC_UNFAVORITE, id)); + mBaseView.onUnfavoriteSuccess(); } } diff --git a/app/src/main/java/com/hiroshi/cimoc/presenter/DownloadPresenter.java b/app/src/main/java/com/hiroshi/cimoc/presenter/DownloadPresenter.java index accb2bdb..3a0f9122 100644 --- a/app/src/main/java/com/hiroshi/cimoc/presenter/DownloadPresenter.java +++ b/app/src/main/java/com/hiroshi/cimoc/presenter/DownloadPresenter.java @@ -59,12 +59,6 @@ public void call(RxEvent rxEvent) { mBaseView.onDownloadStop(); } }); - addSubscription(RxEvent.EVENT_THEME_CHANGE, new Action1() { - @Override - public void call(RxEvent rxEvent) { - mBaseView.onThemeChange((int) rxEvent.getData(1), (int) rxEvent.getData(2)); - } - }); } public void deleteComic(final long id) { @@ -99,7 +93,7 @@ public void call(Throwable throwable) { } public void loadComic() { - mCompositeSubscription.add(mComicManager.listDownload() + mCompositeSubscription.add(mComicManager.listDownloadInRx() .compose(new ToAnotherList<>(new Func1() { @Override public MiniComic call(Comic comic) { @@ -121,7 +115,7 @@ public void call(Throwable throwable) { } public void loadTask() { - mCompositeSubscription.add(mTaskManager.list() + mCompositeSubscription.add(mTaskManager.listInRx() .flatMap(new Func1, Observable>() { @Override public Observable call(List list) { diff --git a/app/src/main/java/com/hiroshi/cimoc/presenter/FavoritePresenter.java b/app/src/main/java/com/hiroshi/cimoc/presenter/FavoritePresenter.java index 597de807..6e4a63eb 100644 --- a/app/src/main/java/com/hiroshi/cimoc/presenter/FavoritePresenter.java +++ b/app/src/main/java/com/hiroshi/cimoc/presenter/FavoritePresenter.java @@ -4,19 +4,13 @@ import com.hiroshi.cimoc.core.Manga; import com.hiroshi.cimoc.core.manager.ComicManager; -import com.hiroshi.cimoc.core.manager.TagManager; import com.hiroshi.cimoc.model.Comic; import com.hiroshi.cimoc.model.MiniComic; -import com.hiroshi.cimoc.model.TagRef; import com.hiroshi.cimoc.rx.RxEvent; import com.hiroshi.cimoc.rx.RxObject; import com.hiroshi.cimoc.rx.ToAnotherList; -import com.hiroshi.cimoc.ui.fragment.ComicFragment; import com.hiroshi.cimoc.ui.view.FavoriteView; -import java.util.Collections; -import java.util.Comparator; -import java.util.LinkedList; import java.util.List; import rx.Observable; @@ -31,27 +25,11 @@ public class FavoritePresenter extends BasePresenter { private ComicManager mComicManager; - private TagManager mTagManager; private LongSparseArray mComicArray; - private long mTagId = -1; - private Comparator mComparator; public FavoritePresenter() { mComicManager = ComicManager.getInstance(); - mTagManager = TagManager.getInstance(); mComicArray = new LongSparseArray<>(); - mComparator = new Comparator() { - @Override - public int compare(MiniComic o1, MiniComic o2) { - if (o1.isHighlight() && !o2.isHighlight()) { - return -1; - } else if (!o1.isHighlight() && o2.isHighlight()) { - return 1; - } else { - return o1.getFavorite() - o2.getFavorite() > 0L ? -1 : 1; - } - } - }; } @SuppressWarnings("unchecked") @@ -81,9 +59,7 @@ public void call(RxEvent rxEvent) { for (MiniComic comic : list) { mComicArray.put(comic.getId(), comic); } - if (mTagId == -1) { - mBaseView.OnComicRestore(list); - } + mBaseView.OnComicRestore(list); } }); addSubscription(RxEvent.EVENT_COMIC_READ, new Action1() { @@ -96,38 +72,10 @@ public void call(RxEvent rxEvent) { } } }); - addSubscription(RxEvent.EVENT_COMIC_FILTER, new Action1() { - @Override - public void call(RxEvent rxEvent) { - int type = (int) rxEvent.getData(); - mTagId = type == TagManager.TAG_NORMAL ? (long) rxEvent.getData(1): -1; - filter(type); - } - }); - addSubscription(RxEvent.EVENT_THEME_CHANGE, new Action1() { - @Override - public void call(RxEvent rxEvent) { - mBaseView.onThemeChange((int) rxEvent.getData(1), (int) rxEvent.getData(2)); - } - }); - addSubscription(RxEvent.EVENT_TAG_UPDATE, new Action1() { - @Override - public void call(RxEvent rxEvent) { - if (mTagId != -1) { - List deleteList = (List) rxEvent.getData(1); - List insertList = (List) rxEvent.getData(2); - if (deleteList.contains(mTagId)) { - mBaseView.onComicDelete((MiniComic) rxEvent.getData()); - } else if (insertList.contains(mTagId)) { - mBaseView.onComicInsert((MiniComic) rxEvent.getData()); - } - } - } - }); } public void loadComic() { - mCompositeSubscription.add(mComicManager.listFavorite() + mCompositeSubscription.add(mComicManager.listFavoriteInRx() .compose(new ToAnotherList<>(new Func1() { @Override public MiniComic call(Comic comic) { @@ -150,48 +98,8 @@ public void call(Throwable throwable) { })); } - private void filter(int type) { - if (type == TagManager.TAG_NORMAL) { - mCompositeSubscription.add(mTagManager.listByTag(mTagId) - .compose(new ToAnotherList<>(new Func1() { - @Override - public MiniComic call(TagRef ref) { - return mComicArray.get(ref.getCid()); - } - })) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(new Action1>() { - @Override - public void call(List list) { - Collections.sort(list, mComparator); - mBaseView.onComicFilterSuccess(list); - } - }, new Action1() { - @Override - public void call(Throwable throwable) { - mBaseView.onComicFilterFail(); - } - })); - } else { - List list = new LinkedList<>(); - for (int i = 0; i != mComicArray.size(); ++i) { - if (type != TagManager.TAG_ALL) { - Boolean finish = mComicArray.valueAt(i).isFinish(); - if (type == TagManager.TAG_CONTINUE && (finish == null || !finish) || - type == TagManager.TAG_END && finish != null && finish) { - list.add(mComicArray.valueAt(i)); - } - } else { - list.add(mComicArray.valueAt(i)); - } - } - Collections.sort(list, mComparator); - mBaseView.onComicFilterSuccess(list); - } - } - public void checkUpdate() { - mCompositeSubscription.add(mComicManager.listFavorite() + mCompositeSubscription.add(mComicManager.listFavoriteInRx() .flatMap(new Func1, Observable>() { @Override public Observable call(List list) { diff --git a/app/src/main/java/com/hiroshi/cimoc/presenter/HistoryPresenter.java b/app/src/main/java/com/hiroshi/cimoc/presenter/HistoryPresenter.java index c878d66c..7a4c8efb 100644 --- a/app/src/main/java/com/hiroshi/cimoc/presenter/HistoryPresenter.java +++ b/app/src/main/java/com/hiroshi/cimoc/presenter/HistoryPresenter.java @@ -34,16 +34,10 @@ public void call(RxEvent rxEvent) { mBaseView.onItemUpdate((MiniComic) rxEvent.getData()); } }); - addSubscription(RxEvent.EVENT_THEME_CHANGE, new Action1() { - @Override - public void call(RxEvent rxEvent) { - mBaseView.onThemeChange((int) rxEvent.getData(1), (int) rxEvent.getData(2)); - } - }); } public void loadComic() { - mCompositeSubscription.add(mComicManager.listHistory() + mCompositeSubscription.add(mComicManager.listHistoryInRx() .compose(new ToAnotherList<>(new Func1() { @Override public MiniComic call(Comic comic) { @@ -75,7 +69,7 @@ public void delete(MiniComic history) { } public void clear() { - mCompositeSubscription.add(mComicManager.listHistory() + mCompositeSubscription.add(mComicManager.listHistoryInRx() .flatMap(new Func1, Observable>() { @Override public Observable call(final List list) { diff --git a/app/src/main/java/com/hiroshi/cimoc/presenter/ReaderPresenter.java b/app/src/main/java/com/hiroshi/cimoc/presenter/ReaderPresenter.java index 179a6cff..3e76b3ae 100644 --- a/app/src/main/java/com/hiroshi/cimoc/presenter/ReaderPresenter.java +++ b/app/src/main/java/com/hiroshi/cimoc/presenter/ReaderPresenter.java @@ -2,9 +2,10 @@ import com.hiroshi.cimoc.core.Download; import com.hiroshi.cimoc.core.Manga; -import com.hiroshi.cimoc.global.SharedComic; import com.hiroshi.cimoc.core.Storage; +import com.hiroshi.cimoc.core.manager.ComicManager; import com.hiroshi.cimoc.model.Chapter; +import com.hiroshi.cimoc.model.Comic; import com.hiroshi.cimoc.model.ImageUrl; import com.hiroshi.cimoc.rx.RxBus; import com.hiroshi.cimoc.rx.RxEvent; @@ -29,7 +30,8 @@ public class ReaderPresenter extends BasePresenter { private final static int LOAD_NEXT = 3; private PreloadAdapter mPreloadAdapter; - private SharedComic mSharedComic; + private ComicManager mComicManager; + private Comic mComic; private boolean isShowNext = true; private boolean isShowPrev = true; @@ -37,11 +39,11 @@ public class ReaderPresenter extends BasePresenter { private int status = LOAD_INIT; public ReaderPresenter() { - mSharedComic = SharedComic.getInstance(); + mComicManager = ComicManager.getInstance(); } public void lazyLoad(final ImageUrl imageUrl) { - mCompositeSubscription.add(Manga.load(mSharedComic.source(), imageUrl.getFirstUrl()) + mCompositeSubscription.add(Manga.load(mComic.getSource(), imageUrl.getFirstUrl()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Action1() { @Override @@ -60,14 +62,12 @@ public void call(Throwable throwable) { })); } - public void loadInit(Chapter[] array) { + public void loadInit(long id, Chapter[] array) { + mComic = mComicManager.load(id); for (int i = 0; i != array.length; ++i) { - if (array[i].getPath().equals(mSharedComic.last())) { + if (array[i].getPath().equals(mComic.getLast())) { this.mPreloadAdapter = new PreloadAdapter(array, i); - Chapter chapter = array[i]; - images(chapter.isComplete() ? - Download.images(mSharedComic.source(), mSharedComic.title(), chapter.getTitle()) : - Manga.images(mSharedComic.source(), mSharedComic.cid(), chapter.getPath())); + images(getObservable(array[i])); } } } @@ -77,9 +77,7 @@ public void loadNext() { Chapter chapter = mPreloadAdapter.getNextChapter(); if (chapter != null) { status = LOAD_NEXT; - images(chapter.isComplete() ? - Download.images(mSharedComic.source(), mSharedComic.title(), chapter.getTitle()) : - Manga.images(mSharedComic.source(), mSharedComic.cid(), chapter.getPath())); + images(getObservable(chapter)); mBaseView.onNextLoading(); } else { isShowNext = false; @@ -93,9 +91,7 @@ public void loadPrev() { Chapter chapter = mPreloadAdapter.getPrevChapter(); if (chapter != null) { status = LOAD_PREV; - images(chapter.isComplete() ? - Download.images(mSharedComic.source(), mSharedComic.title(), chapter.getTitle()) : - Manga.images(mSharedComic.source(), mSharedComic.cid(), chapter.getPath())); + images(getObservable(chapter)); mBaseView.onPrevLoading(); } else { isShowPrev = false; @@ -104,28 +100,33 @@ public void loadPrev() { } } + private Observable> getObservable(Chapter chapter) { + return chapter.isComplete() ? Download.images(mComic.getSource(), mComic.getTitle(), chapter.getTitle()) : + Manga.images(mComic.getSource(), mComic.getCid(), chapter.getPath()); + } + public void toNextChapter() { Chapter chapter = mPreloadAdapter.nextChapter(); if (chapter != null) { - mBaseView.onChapterChange(chapter); - mSharedComic.get().setLast(chapter.getPath()); - mSharedComic.get().setPage(1); - mSharedComic.update(); - RxBus.getInstance().post(new RxEvent(RxEvent.EVENT_COMIC_CHAPTER_CHANGE)); + updateChapter(chapter, true); } } public void toPrevChapter() { Chapter chapter = mPreloadAdapter.prevChapter(); if (chapter != null) { - mBaseView.onChapterChange(chapter); - mSharedComic.get().setLast(chapter.getPath()); - mSharedComic.get().setPage(chapter.getCount()); - mSharedComic.update(); - RxBus.getInstance().post(new RxEvent(RxEvent.EVENT_COMIC_CHAPTER_CHANGE)); + updateChapter(chapter, false); } } + private void updateChapter(Chapter chapter, boolean isNext) { + mBaseView.onChapterChange(chapter); + mComic.setLast(chapter.getPath()); + mComic.setPage(isNext ? 1 : chapter.getCount()); + mComicManager.update(mComic); + RxBus.getInstance().post(new RxEvent(RxEvent.EVENT_COMIC_CHAPTER_CHANGE)); + } + public void savePicture(InputStream inputStream, String suffix) { mCompositeSubscription.add(Storage.savePicture(inputStream, suffix) .observeOn(AndroidSchedulers.mainThread()) @@ -144,8 +145,8 @@ public void call(Throwable throwable) { public void updateComic(int page) { if (status != LOAD_INIT) { - mSharedComic.get().setPage(page); - mSharedComic.update(); + mComic.setPage(page); + mComicManager.update(mComic); // 不用更新父界面的数据,因为这父界面不关心页数 } } @@ -161,7 +162,7 @@ public void call(List list) { chapter = mPreloadAdapter.moveNext(); chapter.setCount(list.size()); mBaseView.onChapterChange(chapter); - mBaseView.onInitLoadSuccess(list, mSharedComic.page(), mSharedComic.source()); + mBaseView.onInitLoadSuccess(list, mComic.getPage(), mComic.getSource()); break; case LOAD_PREV: chapter = mPreloadAdapter.movePrev(); diff --git a/app/src/main/java/com/hiroshi/cimoc/presenter/SearchPresenter.java b/app/src/main/java/com/hiroshi/cimoc/presenter/SearchPresenter.java index ae0620f8..32168be2 100644 --- a/app/src/main/java/com/hiroshi/cimoc/presenter/SearchPresenter.java +++ b/app/src/main/java/com/hiroshi/cimoc/presenter/SearchPresenter.java @@ -36,12 +36,6 @@ public void call(RxEvent rxEvent) { mBaseView.onSourceDisable((Source) rxEvent.getData()); } }); - addSubscription(RxEvent.EVENT_THEME_CHANGE, new Action1() { - @Override - public void call(RxEvent rxEvent) { - mBaseView.onThemeChange((int) rxEvent.getData(1), (int) rxEvent.getData(2)); - } - }); } public void load() { diff --git a/app/src/main/java/com/hiroshi/cimoc/presenter/SourcePresenter.java b/app/src/main/java/com/hiroshi/cimoc/presenter/SourcePresenter.java index 4585aa47..62f8627a 100644 --- a/app/src/main/java/com/hiroshi/cimoc/presenter/SourcePresenter.java +++ b/app/src/main/java/com/hiroshi/cimoc/presenter/SourcePresenter.java @@ -22,16 +22,6 @@ public SourcePresenter() { mSourceManager = SourceManager.getInstance(); } - @Override - protected void initSubscription() { - addSubscription(RxEvent.EVENT_THEME_CHANGE, new Action1() { - @Override - public void call(RxEvent rxEvent) { - mBaseView.onThemeChange((int) rxEvent.getData(1), (int) rxEvent.getData(2)); - } - }); - } - public void load() { mCompositeSubscription.add(mSourceManager.list() .observeOn(AndroidSchedulers.mainThread()) @@ -48,19 +38,10 @@ public void call(Throwable throwable) { })); } - public void insert(Source source) { - long id = mSourceManager.insert(source); - source.setId(id); - } - public void update(Source source) { mSourceManager.update(source); int type = source.getEnable() ? RxEvent.EVENT_SOURCE_ENABLE : RxEvent.EVENT_SOURCE_DISABLE; RxBus.getInstance().post(new RxEvent(type, source)); } - public void delete(final long id) { - mSourceManager.deleteByKey(id); - } - } diff --git a/app/src/main/java/com/hiroshi/cimoc/presenter/TagComicPresenter.java b/app/src/main/java/com/hiroshi/cimoc/presenter/TagComicPresenter.java index da9507ae..84e1b857 100644 --- a/app/src/main/java/com/hiroshi/cimoc/presenter/TagComicPresenter.java +++ b/app/src/main/java/com/hiroshi/cimoc/presenter/TagComicPresenter.java @@ -1,5 +1,7 @@ package com.hiroshi.cimoc.presenter; +import android.support.v4.util.LongSparseArray; + import com.hiroshi.cimoc.core.manager.ComicManager; import com.hiroshi.cimoc.core.manager.TagManager; import com.hiroshi.cimoc.model.Comic; @@ -9,6 +11,8 @@ import com.hiroshi.cimoc.rx.RxEvent; import com.hiroshi.cimoc.ui.view.TagComicView; +import java.util.ArrayList; +import java.util.HashSet; import java.util.LinkedList; import java.util.List; import java.util.Set; @@ -28,6 +32,7 @@ public class TagComicPresenter extends BasePresenter { private ComicManager mComicManager; private TagManager mTagManager; private Tag mTag; + private LongSparseArray mComicArray; public TagComicPresenter() { mComicManager = ComicManager.getInstance(); @@ -46,18 +51,20 @@ public void call(RxEvent rxEvent) { addSubscription(RxEvent.EVENT_COMIC_FAVORITE, new Action1() { @Override public void call(RxEvent rxEvent) { - mBaseView.onComicFavorite((MiniComic) rxEvent.getData()); + mComicArray.remove(((MiniComic) rxEvent.getData()).getId()); } }); addSubscription(RxEvent.EVENT_TAG_UPDATE, new Action1() { @Override public void call(RxEvent rxEvent) { - List deleteList = (List) rxEvent.getData(1); - List insertList = (List) rxEvent.getData(2); - if (deleteList.contains(mTag.getId())) { - mBaseView.onTagUpdateDelete((MiniComic) rxEvent.getData()); - } else if (insertList.contains(mTag.getId())) { - mBaseView.onTagUpdateInsert((MiniComic) rxEvent.getData()); + // Todo + MiniComic comic = (MiniComic) rxEvent.getData(); + if (mComicArray.get(comic.getId()) != null) { + mComicArray.remove(comic.getId()); + mBaseView.onTagComicInsert(comic); + } else { + mComicArray.put(comic.getId(), comic); + mBaseView.onTagComicDelete(comic); } } }); @@ -81,41 +88,19 @@ public List call() throws Exception { }); } }) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(new Action1>() { + .doOnNext(new Action1>() { @Override public void call(List list) { - mBaseView.onTagComicLoadSuccess(list); - } - }, new Action1() { - @Override - public void call(Throwable throwable) { - mBaseView.onTagComicLoadFail(); - } - })); - } - - public void loadComic(final Set set) { - mCompositeSubscription.add(mComicManager.listFavorite() - .flatMap(new Func1, Observable>() { - @Override - public Observable call(List list) { - return Observable.from(list); - } - }) - .map(new Func1() { - @Override - public MiniComic call(Comic comic) { - return new MiniComic(comic); - } - }) - .filter(new Func1() { - @Override - public Boolean call(MiniComic comic) { - return !set.contains(comic); + mComicArray = new LongSparseArray<>(); + Set set = new HashSet<>(list); + for (Comic comic : mComicManager.listFavorite()) { + MiniComic mc = new MiniComic(comic); + if (!set.contains(mc)) { + mComicArray.put(mc.getId(), mc); + } + } } }) - .toList() .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Action1>() { @Override @@ -130,31 +115,33 @@ public void call(Throwable throwable) { })); } - public void insert(long tid, long cid) { - mTagManager.insert(new TagRef(null, tid, cid)); + public List getComicList() { + List list = new ArrayList<>(); + int size = mComicArray.size(); + for (int i = 0; i < size; ++i) { + list.add(mComicArray.valueAt(i)); + } + return list; } - public void insert(final long tid, List list) { - Observable.from(list) - .map(new Func1() { - @Override - public TagRef call(MiniComic comic) { - return new TagRef(null, tid, comic.getId()); - } - }) - .toList() - .subscribe(new Action1>() { - @Override - public void call(List tagRefs) { - mTagManager.insert(tagRefs); - mBaseView.onComicInsertSuccess(); - } - }, new Action1() { - @Override - public void call(Throwable throwable) { - mBaseView.onComicInsertFail(); - } - }); + public void insert(long id) { + mTagManager.insert(new TagRef(null, mTag.getId(), id)); + } + + public void insert(boolean[] check) { + int size = mComicArray.size(); + List rList = new ArrayList<>(); + List cList = new ArrayList<>(); + for (int i = 0; i < size; ++i) { + if (check[i]) { + MiniComic comic = mComicArray.valueAt(i); + rList.add(new TagRef(null, mTag.getId(), comic.getId())); + cList.add(comic); + mComicArray.remove(comic.getId()); + } + } + mTagManager.insert(rList); + mBaseView.onComicInsertSuccess(cList); } public void delete(long tid, long cid) { diff --git a/app/src/main/java/com/hiroshi/cimoc/presenter/TagEditorPresenter.java b/app/src/main/java/com/hiroshi/cimoc/presenter/TagEditorPresenter.java new file mode 100644 index 00000000..a40851c2 --- /dev/null +++ b/app/src/main/java/com/hiroshi/cimoc/presenter/TagEditorPresenter.java @@ -0,0 +1,131 @@ +package com.hiroshi.cimoc.presenter; + +import com.hiroshi.cimoc.core.manager.ComicManager; +import com.hiroshi.cimoc.core.manager.TagManager; +import com.hiroshi.cimoc.model.MiniComic; +import com.hiroshi.cimoc.model.Pair; +import com.hiroshi.cimoc.model.Tag; +import com.hiroshi.cimoc.model.TagRef; +import com.hiroshi.cimoc.rx.RxBus; +import com.hiroshi.cimoc.rx.RxEvent; +import com.hiroshi.cimoc.ui.view.TagEditorView; +import com.hiroshi.cimoc.utils.CollectionUtils; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import rx.Observable; +import rx.Subscriber; +import rx.android.schedulers.AndroidSchedulers; +import rx.functions.Action1; +import rx.functions.Func1; +import rx.schedulers.Schedulers; + +/** + * Created by Hiroshi on 2016/12/2. + */ + +public class TagEditorPresenter extends BasePresenter { + + private TagManager mTagManager; + private ComicManager mComicManager; + private MiniComic mMiniComic; + private Set mTagSet; + + public TagEditorPresenter() { + mTagManager = TagManager.getInstance(); + mComicManager = ComicManager.getInstance(); + } + + public void load(long id) { + mMiniComic = new MiniComic(mComicManager.load(id)); + mCompositeSubscription.add(mTagManager.listInRx() + .map(new Func1, List>>() { + @Override + public List> call(List list) { + initTagSet(); + List> result = new ArrayList<>(); + for (Tag tag : list) { + result.add(Pair.create(tag, mTagSet.contains(tag.getId()))); + } + return result; + } + }) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Action1>>() { + @Override + public void call(List> list) { + mBaseView.onTagLoadSuccess(list); + } + }, new Action1() { + @Override + public void call(Throwable throwable) { + mBaseView.onTagLoadFail(); + } + })); + } + + private void initTagSet() { + mTagSet = new HashSet<>(); + for (TagRef ref : mTagManager.listByComic(mMiniComic.getId())) { + mTagSet.add(ref.getTid()); + } + } + + private void updateInTx(final List dList, final List iList) { + mTagManager.runInTx(new Runnable() { + @Override + public void run() { + for (Long id : dList) { + mTagManager.delete(id, mMiniComic.getId()); + } + for (Long id : iList) { + mTagManager.insert(new TagRef(null, id, mMiniComic.getId())); + } + } + }); + } + + private void updateTagSet(final List dList, final List iList) { + mTagSet.removeAll(dList); + mTagSet.addAll(iList); + } + + public void updateRef(final List list) { + mCompositeSubscription.add(Observable.create(new Observable.OnSubscribe() { + @Override + public void call(Subscriber subscriber) { + List dList = new ArrayList<>(CollectionUtils.minus(mTagSet, list)); + List iList = new ArrayList<>(CollectionUtils.minus(list, mTagSet)); + if (!dList.isEmpty() || !iList.isEmpty()) { + updateInTx(dList, iList); + updateTagSet(dList, iList); + RxBus.getInstance().post(new RxEvent(RxEvent.EVENT_TAG_UPDATE, mMiniComic)); + subscriber.onNext(true); + } else { + subscriber.onNext(false); + } + subscriber.onCompleted(); + } + }).subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Action1() { + @Override + public void call(Boolean flag) { + if (flag) { + mBaseView.onTagUpdateSuccess(); + } else { + mBaseView.onTagUpdateInvalid(); + } + } + }, new Action1() { + @Override + public void call(Throwable throwable) { + mBaseView.onTagUpdateFail(); + } + })); + } + +} diff --git a/app/src/main/java/com/hiroshi/cimoc/presenter/TagPresenter.java b/app/src/main/java/com/hiroshi/cimoc/presenter/TagPresenter.java index 89ffdd9e..b8da524c 100644 --- a/app/src/main/java/com/hiroshi/cimoc/presenter/TagPresenter.java +++ b/app/src/main/java/com/hiroshi/cimoc/presenter/TagPresenter.java @@ -23,18 +23,8 @@ public TagPresenter() { mTagManager = TagManager.getInstance(); } - @Override - protected void initSubscription() { - addSubscription(RxEvent.EVENT_THEME_CHANGE, new Action1() { - @Override - public void call(RxEvent rxEvent) { - mBaseView.onThemeChange((int) rxEvent.getData(1), (int) rxEvent.getData(2)); - } - }); - } - public void load() { - mCompositeSubscription.add(mTagManager.list() + mCompositeSubscription.add(mTagManager.listInRx() .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Action1>() { @Override @@ -75,7 +65,6 @@ public void call(Throwable throwable) { mBaseView.onTagDeleteFail(); } })); - } public void update(Tag tag) { diff --git a/app/src/main/java/com/hiroshi/cimoc/presenter/TaskPresenter.java b/app/src/main/java/com/hiroshi/cimoc/presenter/TaskPresenter.java index 1b72bd66..afc80b77 100644 --- a/app/src/main/java/com/hiroshi/cimoc/presenter/TaskPresenter.java +++ b/app/src/main/java/com/hiroshi/cimoc/presenter/TaskPresenter.java @@ -92,11 +92,10 @@ public Comic getComic() { return mComic; } - public void load(final long key) { - mComic = mComicManager.load(key); - mCompositeSubscription.add(mTaskManager.list(key) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(new Action1>() { + public void load(long id) { + mComic = mComicManager.load(id); + mCompositeSubscription.add(mTaskManager.listInRx(id) + .doOnNext(new Action1>() { @Override public void call(List list) { for (Task task : list) { @@ -104,34 +103,27 @@ public void call(List list) { task.setInfo(mComic.getSource(), mComic.getCid(), mComic.getTitle()); task.setState(state); } - mBaseView.onTaskLoadSuccess(list); - } - }, new Action1() { - @Override - public void call(Throwable throwable) { - mBaseView.onTaskLoadFail(); + final List sList = Download.getComicIndex(mComic.getSource(), mComic.getTitle()); + if (sList != null) { + Collections.sort(list, new Comparator() { + @Override + public int compare(Task lhs, Task rhs) { + return sList.indexOf(lhs.getPath()) - sList.indexOf(rhs.getPath()); + } + }); + } } - })); - } - - public void sortTask(final List list) { - mCompositeSubscription.add(Download.getComicIndex(mComic.getSource(), mComic.getTitle()) + }) .observeOn(AndroidSchedulers.mainThread()) - .subscribe(new Action1>() { + .subscribe(new Action1>() { @Override - public void call(final List paths) { - Collections.sort(list, new Comparator() { - @Override - public int compare(Task lhs, Task rhs) { - return paths.indexOf(lhs.getPath()) - paths.indexOf(rhs.getPath()); - } - }); - mBaseView.onSortSuccess(list); + public void call(List list) { + mBaseView.onTaskLoadSuccess(list); } }, new Action1() { @Override public void call(Throwable throwable) { - mBaseView.onLoadIndexFail(); + mBaseView.onTaskLoadFail(); } })); } @@ -179,19 +171,14 @@ public void call(Throwable throwable) { })); } - public long updateLast(String last) { + public long updateLast(String path) { mComic.setHistory(System.currentTimeMillis()); - if (!last.equals(mComic.getLast())) { - mComic.setLast(last); + if (!path.equals(mComic.getLast())) { + mComic.setLast(path); mComic.setPage(1); } - if (mComic.getId() != null) { - mComicManager.update(mComic); - } else { - long id = mComicManager.insert(mComic); - mComic.setId(id); - } - RxBus.getInstance().post(new RxEvent(RxEvent.EVENT_COMIC_READ, new MiniComic(mComic))); + mComicManager.update(mComic); + RxBus.getInstance().post(new RxEvent(RxEvent.EVENT_COMIC_READ, new MiniComic(mComic), false)); return mComic.getId(); } diff --git a/app/src/main/java/com/hiroshi/cimoc/rx/RxEvent.java b/app/src/main/java/com/hiroshi/cimoc/rx/RxEvent.java index 5c9d1f4f..b2acb0ff 100644 --- a/app/src/main/java/com/hiroshi/cimoc/rx/RxEvent.java +++ b/app/src/main/java/com/hiroshi/cimoc/rx/RxEvent.java @@ -15,8 +15,7 @@ public class RxEvent { public static final int EVENT_COMIC_READ = 3; public static final int EVENT_COMIC_PAGE_CHANGE = 4; public static final int EVENT_COMIC_CHAPTER_CHANGE = 5; - public static final int EVENT_COMIC_FILTER = 6; - public static final int EVENT_COMIC_FAVORITE_RESTORE = 7; + public static final int EVENT_COMIC_FAVORITE_RESTORE = 6; public static final int EVENT_TASK_STATE_CHANGE = 21; public static final int EVENT_TASK_PROCESS = 22; @@ -37,7 +36,7 @@ public class RxEvent { @IntDef({EVENT_COMIC_FAVORITE, EVENT_COMIC_UNFAVORITE, EVENT_COMIC_READ, EVENT_COMIC_PAGE_CHANGE, EVENT_COMIC_CHAPTER_CHANGE, EVENT_COMIC_FAVORITE_RESTORE, EVENT_TASK_STATE_CHANGE, EVENT_TASK_PROCESS, EVENT_TASK_INSERT, EVENT_DOWNLOAD_REMOVE, - EVENT_DOWNLOAD_START, EVENT_DOWNLOAD_STOP, EVENT_COMIC_FILTER, EVENT_SOURCE_ENABLE, EVENT_SOURCE_DISABLE, EVENT_TAG_DELETE, + EVENT_DOWNLOAD_START, EVENT_DOWNLOAD_STOP, EVENT_SOURCE_ENABLE, EVENT_SOURCE_DISABLE, EVENT_TAG_DELETE, EVENT_TAG_INSERT, EVENT_THEME_CHANGE, EVENT_TAG_UPDATE}) @Retention(RetentionPolicy.SOURCE) public @interface EventType {} diff --git a/app/src/main/java/com/hiroshi/cimoc/source/Webtoon.java b/app/src/main/java/com/hiroshi/cimoc/source/Webtoon.java index 5c27f557..2eed8865 100644 --- a/app/src/main/java/com/hiroshi/cimoc/source/Webtoon.java +++ b/app/src/main/java/com/hiroshi/cimoc/source/Webtoon.java @@ -1,9 +1,6 @@ package com.hiroshi.cimoc.source; -import android.util.Log; - import com.hiroshi.cimoc.core.manager.SourceManager; -import com.hiroshi.cimoc.core.parser.JsonIterator; import com.hiroshi.cimoc.core.parser.MangaParser; import com.hiroshi.cimoc.core.parser.NodeIterator; import com.hiroshi.cimoc.core.parser.SearchIterator; @@ -17,11 +14,8 @@ import org.json.JSONException; import org.json.JSONObject; -import java.text.SimpleDateFormat; -import java.util.Date; import java.util.LinkedList; import java.util.List; -import java.util.Locale; import okhttp3.FormBody; import okhttp3.Request; diff --git a/app/src/main/java/com/hiroshi/cimoc/ui/activity/ChapterActivity.java b/app/src/main/java/com/hiroshi/cimoc/ui/activity/ChapterActivity.java new file mode 100644 index 00000000..bfc7f7eb --- /dev/null +++ b/app/src/main/java/com/hiroshi/cimoc/ui/activity/ChapterActivity.java @@ -0,0 +1,160 @@ +package com.hiroshi.cimoc.ui.activity; + +import android.content.Context; +import android.content.Intent; +import android.support.v7.widget.LinearLayoutManager; +import android.view.Menu; +import android.view.MenuItem; +import android.view.View; + +import com.hiroshi.cimoc.R; +import com.hiroshi.cimoc.model.Chapter; +import com.hiroshi.cimoc.model.Pair; +import com.hiroshi.cimoc.model.Task; +import com.hiroshi.cimoc.presenter.ChapterPresenter; +import com.hiroshi.cimoc.service.DownloadService; +import com.hiroshi.cimoc.ui.adapter.ChapterAdapter; +import com.hiroshi.cimoc.ui.view.ChapterView; +import com.hiroshi.cimoc.utils.PermissionUtils; + +import java.util.ArrayList; +import java.util.List; + +import butterknife.OnClick; + +/** + * Created by Hiroshi on 2016/11/14. + */ + +public class ChapterActivity extends CoordinatorActivity implements ChapterView { + + private ChapterPresenter mPresenter; + private ChapterAdapter mChapterAdapter; + + @Override + protected void initPresenter() { + mPresenter = new ChapterPresenter(); + mPresenter.attachView(this); + } + + @Override + protected void initView() { + super.initView(); + mChapterAdapter = new ChapterAdapter(this, getAdapterList()); + mChapterAdapter.setOnItemClickListener(this); + mRecyclerView.setLayoutManager(new LinearLayoutManager(this)); + mRecyclerView.setHasFixedSize(true); + mRecyclerView.setAdapter(mChapterAdapter); + mActionButton.setImageResource(R.drawable.ic_done_white_24dp); + mActionButton.show(); + hideProgressBar(); + } + + @Override + protected void initData() { + long id = getIntent().getLongExtra(EXTRA_ID, -1); + mPresenter.load(id); + } + + private List> getAdapterList() { + List list = getIntent().getParcelableArrayListExtra(EXTRA_CHAPTER); + List> result = new ArrayList<>(list.size()); + for (int i = 0; i < list.size(); ++i) { + result.add(Pair.create(list.get(i), list.get(i).isDownload())); + } + return result; + } + + @Override + protected void onDestroy() { + mPresenter.detachView(); + mPresenter = null; + super.onDestroy(); + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + getMenuInflater().inflate(R.menu.chapter_menu, menu); + return super.onCreateOptionsMenu(menu); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + if (!isProgressBarShown()) { + switch (item.getItemId()) { + case R.id.chapter_all: + for (Pair pair : mChapterAdapter.getDateSet()) { + pair.second = true; + } + mChapterAdapter.notifyDataSetChanged(); + break; + } + } + return super.onOptionsItemSelected(item); + } + + @Override + public void onItemClick(View view, int position) { + Pair pair = mChapterAdapter.getItem(position); + if (!pair.first.isDownload()) { + pair.second = !pair.second; + mChapterAdapter.notifyItemChanged(position); + } + } + + @OnClick(R.id.coordinator_action_button) void onActionButtonClick() { + List cList = new ArrayList<>(); + List dList = new ArrayList<>(); + for (Pair pair : mChapterAdapter.getDateSet()) { + cList.add(pair.first); + if (!pair.first.isDownload() && pair.second) { + dList.add(pair.first); + } + } + + if (dList.isEmpty()) { + showSnackbar(R.string.chapter_download_empty); + } else if (PermissionUtils.hasStoragePermission(this)) { + showProgressDialog(); + mPresenter.addTask(cList, dList); + } else { + onTaskAddFail(); + } + } + + @Override + public void onTaskAddSuccess(ArrayList list) { + Intent intent = DownloadService.createIntent(this, list); + startService(intent); + for (Pair pair : mChapterAdapter.getDateSet()) { + if (pair.second && !pair.first.isDownload()) { + pair.first.setDownload(true); + } + } + mChapterAdapter.notifyDataSetChanged(); + showSnackbar(R.string.chapter_download_queue_success); + hideProgressDialog(); + } + + @Override + public void onTaskAddFail() { + hideProgressDialog(); + showSnackbar(R.string.chapter_download_queue_fail); + } + + @Override + protected String getDefaultTitle() { + return getString(R.string.chapter); + } + + private static String EXTRA_ID = "a"; + private static String EXTRA_CHAPTER = "b"; + + public static Intent createIntent(Context context, long id, ArrayList list) { + Intent intent = new Intent(context, ChapterActivity.class); + intent.putExtra(EXTRA_ID, id); + intent.putExtra(EXTRA_CHAPTER, list); + return intent; + } + +} diff --git a/app/src/main/java/com/hiroshi/cimoc/ui/activity/ChapterListActivity.java b/app/src/main/java/com/hiroshi/cimoc/ui/activity/ChapterListActivity.java deleted file mode 100644 index 56e6e300..00000000 --- a/app/src/main/java/com/hiroshi/cimoc/ui/activity/ChapterListActivity.java +++ /dev/null @@ -1,159 +0,0 @@ -package com.hiroshi.cimoc.ui.activity; - -import android.content.Context; -import android.content.Intent; -import android.content.pm.PackageManager; -import android.support.annotation.NonNull; -import android.support.v7.widget.RecyclerView; -import android.view.View; - -import com.hiroshi.cimoc.R; -import com.hiroshi.cimoc.model.Chapter; -import com.hiroshi.cimoc.model.Selectable; -import com.hiroshi.cimoc.model.Task; -import com.hiroshi.cimoc.presenter.ChapterListPresenter; -import com.hiroshi.cimoc.service.DownloadService; -import com.hiroshi.cimoc.ui.adapter.ChapterListAdapter; -import com.hiroshi.cimoc.ui.fragment.dialog.SelectDialogFragment; -import com.hiroshi.cimoc.ui.view.ChapterListView; -import com.hiroshi.cimoc.utils.PermissionUtils; - -import java.util.ArrayList; -import java.util.HashSet; -import java.util.LinkedList; -import java.util.List; -import java.util.Set; - -import butterknife.BindView; - -/** - * Created by Hiroshi on 2016/11/14. - */ - -public class ChapterListActivity extends BackActivity implements ChapterListView { - - @BindView(R.id.chapter_list_layout) View mLayoutView; - @BindView(R.id.chapter_list_recycler_view) RecyclerView mRecyclerView; - - private List mDownloadList; - private ChapterListPresenter mPresenter; - private ChapterListAdapter mChapterAdapter; - - @Override - protected void initPresenter() { - mPresenter = new ChapterListPresenter(); - mPresenter.attachView(this); - } - - @Override - protected void initView() { - super.initView(); - List list = getIntent().getParcelableArrayListExtra(EXTRA_CHAPTER); - mChapterAdapter = new ChapterListAdapter(this, list); - } - - @Override - protected void initData() { - mPresenter.loadDownload(); - mDownloadList = new ArrayList<>(); - } - - @Override - protected void onDestroy() { - mPresenter.detachView(); - mPresenter = null; - super.onDestroy(); - } - - /*download(false, list); - download(true, list);*/ - - /** - * download: load download -> select chapter -> check permission -> update index -> add task - */ - - private void download(boolean neutral, List list) { - for (int i = 0; i != list.size(); ++i) { - if ((neutral || list.get(i).isChecked()) && !list.get(i).isDisable()) { - mDownloadList.add(mChapterAdapter.getItem(i)); - } - } - - if (!mDownloadList.isEmpty()) { - showProgressDialog(); - if (PermissionUtils.hasStoragePermission(this)) { - mPresenter.updateIndex(mChapterAdapter.getDateSet()); - } else { - onUpdateIndexFail(); - } - } - } - - @Override - public void onUpdateIndexSuccess() { - mPresenter.addTask(mDownloadList); - } - - @Override - public void onUpdateIndexFail() { - showSnackbar(R.string.detail_download_queue_fail); - hideProgressDialog(); - } - - @Override - public void onTaskAddSuccess(ArrayList list) { - Intent intent = DownloadService.createIntent(this, list); - startService(intent); - showSnackbar(R.string.detail_download_queue_success); - hideProgressDialog(); - } - - @Override - public void onTaskAddFail() { - showSnackbar(R.string.detail_download_queue_fail); - hideProgressDialog(); - } - - @Override - public void onDownloadLoadSuccess(List list) { - Set set = new HashSet<>(); - for (Task task : list) { - set.add(task.getPath()); - } - for (Chapter chapter : mChapterAdapter.getDateSet()) { - chapter.setDownload(set.contains(chapter.getPath())); - } - mChapterAdapter.notifyDataSetChanged(); - hideProgressDialog(); - } - - @Override - public void onDownloadLoadFail() { - showSnackbar(R.string.detail_download_load_fail); - hideProgressBar(); - } - - @Override - protected int getLayoutRes() { - return R.layout.activity_chapter_list; - } - - @Override - protected View getLayoutView() { - return mLayoutView; - } - - @Override - protected String getDefaultTitle() { - return getString(R.string.chapter_list); - } - - private static String EXTRA_CHAPTER = "a"; - - public static Intent createIntent(Context context, ArrayList list) { - Intent intent = new Intent(context, ChapterListActivity.class); - intent.putExtra(EXTRA_CHAPTER, list); - return intent; - } - -} diff --git a/app/src/main/java/com/hiroshi/cimoc/ui/activity/CoordinatorActivity.java b/app/src/main/java/com/hiroshi/cimoc/ui/activity/CoordinatorActivity.java new file mode 100644 index 00000000..0f6d0bde --- /dev/null +++ b/app/src/main/java/com/hiroshi/cimoc/ui/activity/CoordinatorActivity.java @@ -0,0 +1,40 @@ +package com.hiroshi.cimoc.ui.activity; + +import android.support.design.widget.CoordinatorLayout; +import android.support.design.widget.FloatingActionButton; +import android.support.v7.widget.RecyclerView; +import android.view.View; + +import com.hiroshi.cimoc.R; +import com.hiroshi.cimoc.ui.adapter.BaseAdapter; + +import butterknife.BindView; + +/** + * Created by Hiroshi on 2016/12/1. + */ + +public abstract class CoordinatorActivity extends BackActivity implements + BaseAdapter.OnItemClickListener, BaseAdapter.OnItemLongClickListener { + + @BindView(R.id.coordinator_action_button) FloatingActionButton mActionButton; + @BindView(R.id.coordinator_recycler_view) RecyclerView mRecyclerView; + @BindView(R.id.coordinator_layout) CoordinatorLayout mLayoutView; + + @Override + public void onItemClick(View view, int position) {} + + @Override + public void onItemLongClick(View view, int position) {} + + @Override + protected int getLayoutRes() { + return R.layout.activity_coordinator; + } + + @Override + protected View getLayoutView() { + return mLayoutView; + } + +} diff --git a/app/src/main/java/com/hiroshi/cimoc/ui/activity/DetailActivity.java b/app/src/main/java/com/hiroshi/cimoc/ui/activity/DetailActivity.java index 62220199..68e94acf 100644 --- a/app/src/main/java/com/hiroshi/cimoc/ui/activity/DetailActivity.java +++ b/app/src/main/java/com/hiroshi/cimoc/ui/activity/DetailActivity.java @@ -2,9 +2,7 @@ import android.content.Context; import android.content.Intent; -import android.support.design.widget.FloatingActionButton; import android.support.v7.widget.GridLayoutManager; -import android.support.v7.widget.RecyclerView; import android.view.Menu; import android.view.MenuItem; import android.view.View; @@ -13,32 +11,20 @@ import com.hiroshi.cimoc.core.manager.PreferenceManager; import com.hiroshi.cimoc.model.Chapter; import com.hiroshi.cimoc.model.Comic; -import com.hiroshi.cimoc.model.Selectable; -import com.hiroshi.cimoc.model.Task; import com.hiroshi.cimoc.presenter.DetailPresenter; -import com.hiroshi.cimoc.ui.adapter.BaseAdapter; import com.hiroshi.cimoc.ui.adapter.DetailAdapter; -import com.hiroshi.cimoc.ui.fragment.dialog.SelectDialogFragment; import com.hiroshi.cimoc.ui.view.DetailView; import java.util.ArrayList; -import java.util.HashSet; import java.util.LinkedList; import java.util.List; -import java.util.Set; -import butterknife.BindView; import butterknife.OnClick; /** * Created by Hiroshi on 2016/7/2. */ -public class DetailActivity extends BackActivity implements DetailView, DetailAdapter.OnTitleClickListener, - SelectDialogFragment.SelectDialogListener, BaseAdapter.OnItemClickListener { - - @BindView(R.id.detail_recycler_view) RecyclerView mRecyclerView; - @BindView(R.id.detail_layout) View mLayoutView; - @BindView(R.id.detail_action_button) FloatingActionButton mActionButton; +public class DetailActivity extends CoordinatorActivity implements DetailView, DetailAdapter.OnTitleClickListener { private DetailAdapter mDetailAdapter; private DetailPresenter mPresenter; @@ -57,6 +43,7 @@ protected void initView() { mRecyclerView.setLayoutManager(new GridLayoutManager(this, 4)); mRecyclerView.setAdapter(mDetailAdapter); mRecyclerView.addItemDecoration(mDetailAdapter.getItemDecoration()); + mRecyclerView.setOverScrollMode(View.OVER_SCROLL_NEVER); } @Override @@ -65,11 +52,7 @@ protected void initData() { if (id == -1) { int source = getIntent().getIntExtra(EXTRA_SOURCE, -1); String cid = getIntent().getStringExtra(EXTRA_CID); - if (source == -1 || cid == null) { - mPresenter.loadDetail(); - } else { - mPresenter.loadDetail(source, cid); - } + mPresenter.loadDetail(source, cid); } else { mPresenter.loadDetail(id); } @@ -93,115 +76,77 @@ public boolean onOptionsItemSelected(MenuItem item) { if (!isProgressBarShown()) { switch (item.getItemId()) { case R.id.detail_download: - Intent intent = ChapterListActivity.createIntent(this, new ArrayList<>(mDetailAdapter.getDateSet())); + Intent intent = ChapterActivity.createIntent(this, mPresenter.getId(), new ArrayList<>(mDetailAdapter.getDateSet())); startActivity(intent); break; case R.id.detail_tag: - if (mPresenter.isFavorite()) { - showProgressDialog(); - mPresenter.loadTag(); - } else { - showSnackbar(R.string.detail_tag_favorite); - } + mPresenter.onTagClick(); break; } } return super.onOptionsItemSelected(item); } - @OnClick(R.id.detail_action_button) void onActionButtonClick() { - if (mPresenter.isFavorite()) { - mPresenter.unfavoriteComic(); - mActionButton.setImageResource(R.drawable.ic_favorite_border_white_24dp); - showSnackbar(R.string.detail_unfavorite); - } else { - mPresenter.favoriteComic(); - mActionButton.setImageResource(R.drawable.ic_favorite_white_24dp); - showSnackbar(R.string.detail_favorite); - } + @OnClick(R.id.coordinator_action_button) void onActionButtonClick() { + mPresenter.onFavoriteClick(); } @Override - public void onItemClick(View view, int position) { - if (position != 0) { - String last = mDetailAdapter.getItem(position - 1).getPath(); - mPresenter.updateLast(last, getIntent().getBooleanExtra(EXTRA_FAVORITE, false)); - mDetailAdapter.setLast(last); - int mode = mPreference.getInt(PreferenceManager.PREF_READER_MODE, PreferenceManager.READER_MODE_PAGE); - Intent intent = ReaderActivity.createIntent(this, mode, mDetailAdapter.getDateSet()); - startActivity(intent); - } + public void onTagOpenFail() { + showSnackbar(R.string.detail_tag_favorite); } @Override - public void onTitleClick() { - String last = mPresenter.getLast(); - List list = mDetailAdapter.getDateSet(); - if (last == null) { - last = mDetailAdapter.getItem(list.size() - 1).getPath(); - mDetailAdapter.setLast(last); - } - mPresenter.updateLast(last, getIntent().getBooleanExtra(EXTRA_FAVORITE, false)); - int mode = mPreference.getInt(PreferenceManager.PREF_READER_MODE, PreferenceManager.READER_MODE_PAGE); - Intent intent = ReaderActivity.createIntent(DetailActivity.this, mode, list); + public void onTagOpenSuccess() { + Intent intent = TagEditorActivity.createIntent(this, mPresenter.getId()); startActivity(intent); } @Override - public void onChapterChange(String last) { - mDetailAdapter.setLast(last); + public void onFavoriteSuccess() { + mActionButton.setImageResource(R.drawable.ic_favorite_white_24dp); + showSnackbar(R.string.detail_favorite); } @Override - public void onTagLoadSuccess(List list) { - hideProgressDialog(); - if (!list.isEmpty()) { - SelectDialogFragment fragment = - SelectDialogFragment.newInstance(new ArrayList<>(list), R.string.detail_select_tag, -1); - fragment.show(getFragmentManager(), null); - } else { - showSnackbar(R.string.backup_save_tag_not_found); - } + public void onUnfavoriteSuccess() { + mActionButton.setImageResource(R.drawable.ic_favorite_border_white_24dp); + showSnackbar(R.string.detail_unfavorite); } @Override - public void onTagLoadFail() { - showSnackbar(R.string.detail_tag_load_fail); - hideProgressDialog(); + public void onItemClick(View view, int position) { + if (position != 0) { + String last = mDetailAdapter.getItem(position - 1).getPath(); + mPresenter.updateLast(last, getIntent().getBooleanExtra(EXTRA_FAVORITE, false)); + mDetailAdapter.setLast(last); + int mode = mPreference.getInt(PreferenceManager.PREF_READER_MODE, PreferenceManager.READER_MODE_PAGE); + Intent intent = ReaderActivity.createIntent(this, mPresenter.getId(), mDetailAdapter.getDateSet(), mode); + startActivity(intent); + } } @Override - public void onTagUpdateSuccess() { - showSnackbar(R.string.detail_tag_update_success); - hideProgressDialog(); + public void onTitleClick() { + String path = mDetailAdapter.getItem(mDetailAdapter.getDateSet().size() - 1).getPath(); + boolean favorite = getIntent().getBooleanExtra(EXTRA_FAVORITE, false); + mPresenter.onTitleClick(path, favorite); } @Override - public void onTagUpdateFail() { - showSnackbar(R.string.detail_tag_update_fail); - hideProgressDialog(); + public void onLastOpenSuccess(String path) { + mDetailAdapter.setLast(path); + List list = mDetailAdapter.getDateSet(); + int mode = mPreference.getInt(PreferenceManager.PREF_READER_MODE, PreferenceManager.READER_MODE_PAGE); + Intent intent = ReaderActivity.createIntent(DetailActivity.this, mPresenter.getId(), list, mode); + startActivity(intent); } @Override - public void onSelectPositiveClick(int type, List list) { - showProgressDialog(); - List newTagList = new LinkedList<>(); - for (Selectable selectable : list) { - if (selectable.isChecked()) { - newTagList.add(selectable.getId()); - } - } - mPresenter.updateRef(newTagList); + public void onChapterChange(String last) { + mDetailAdapter.setLast(last); } - @Override - public void onSelectNeutralClick(int type, List list) {} - - /** - * init: load comic -> load chapter -> load download - * if load download fail, we still show the layout - */ - @Override public void onComicLoadSuccess(Comic comic) { mDetailAdapter.setInfo(comic.getSource(), comic.getCover(), comic.getTitle(), comic.getAuthor(), @@ -216,51 +161,28 @@ public void onComicLoadSuccess(Comic comic) { @Override public void onChapterLoadSuccess(List list) { + hideProgressBar(); mDetailAdapter.setOnItemClickListener(this); mDetailAdapter.setOnTitleClickListener(this); mDetailAdapter.addAll(list); } - @Override - public void onDetailLoadSuccess() { - mPresenter.loadDownload(); - } - - @Override - public void onDownloadLoadSuccess(List list) { - Set set = new HashSet<>(); - for (Task task : list) { - if (task.isFinish()) { - set.add(task.getPath()); - } - } - for (Chapter chapter : mDetailAdapter.getDateSet()) { - chapter.setComplete(set.contains(chapter.getPath())); - } - hideProgressBar(); - } - @Override public void onDownloadLoadFail() { - showSnackbar(R.string.detail_download_load_fail); hideProgressBar(); + showSnackbar(R.string.detail_download_load_fail); } @Override public void onNetworkError() { - showSnackbar(R.string.common_network_error); hideProgressBar(); + showSnackbar(R.string.common_network_error); } @Override public void onParseError() { - showSnackbar(R.string.common_parse_error); hideProgressBar(); - } - - @Override - protected int getLayoutRes() { - return R.layout.activity_detail; + showSnackbar(R.string.common_parse_error); } @Override @@ -268,32 +190,11 @@ protected String getDefaultTitle() { return getString(R.string.detail); } - @Override - protected View getLayoutView() { - return mLayoutView; - } - public static final String EXTRA_ID = "a"; public static final String EXTRA_SOURCE = "b"; public static final String EXTRA_CID = "c"; public static final String EXTRA_FAVORITE = "d"; - public static Intent createIntent(Context context) { - return createIntent(context, null, -1, null, false); - } - - public static Intent createIntent(Context context, Long id) { - return createIntent(context, id, -1, null, false); - } - - public static Intent createIntent(Context context, int source, String cid) { - return createIntent(context, null, source, cid, false); - } - - public static Intent createIntent(Context context, Long id, boolean favorite) { - return createIntent(context, id, -1, null, favorite); - } - public static Intent createIntent(Context context, Long id, int source, String cid, boolean favorite) { Intent intent = new Intent(context, DetailActivity.class); intent.putExtra(EXTRA_ID, id); diff --git a/app/src/main/java/com/hiroshi/cimoc/ui/activity/MainActivity.java b/app/src/main/java/com/hiroshi/cimoc/ui/activity/MainActivity.java index 005711e3..da2ce66f 100644 --- a/app/src/main/java/com/hiroshi/cimoc/ui/activity/MainActivity.java +++ b/app/src/main/java/com/hiroshi/cimoc/ui/activity/MainActivity.java @@ -31,10 +31,11 @@ import com.hiroshi.cimoc.ui.fragment.BaseFragment; import com.hiroshi.cimoc.ui.fragment.ComicFragment; import com.hiroshi.cimoc.ui.fragment.SearchFragment; -import com.hiroshi.cimoc.ui.fragment.classical.SourceFragment; -import com.hiroshi.cimoc.ui.fragment.classical.TagFragment; +import com.hiroshi.cimoc.ui.fragment.coordinator.SourceFragment; +import com.hiroshi.cimoc.ui.fragment.coordinator.TagFragment; import com.hiroshi.cimoc.ui.fragment.dialog.MessageDialogFragment; import com.hiroshi.cimoc.ui.view.MainView; +import com.hiroshi.cimoc.ui.view.ThemeView; import com.hiroshi.cimoc.utils.PermissionUtils; import butterknife.BindView; @@ -47,8 +48,7 @@ public class MainActivity extends BaseActivity implements MainView, NavigationVi MessageDialogFragment.MessageDialogListener { private static final int TYPE_NOTICE = 0; - private static final int TYPE_UPDATE_LOG = 1; - private static final int TYPE_PERMISSION = 2; + private static final int TYPE_PERMISSION = 1; private static final int FRAGMENT_NUM = 4; @@ -85,7 +85,7 @@ protected void initView() { @Override protected void initData() { mPresenter.loadLast(); - if (!showAuthorNotice() && !showUpdateLog()) { + if (!showAuthorNotice()) { showPermission(); } } @@ -116,7 +116,7 @@ private void initNavigation() { @Override public void onClick(View v) { if (mLastSource != -1 && mLastCid != null) { - Intent intent = DetailActivity.createIntent(MainActivity.this, mLastSource, mLastCid); + Intent intent = DetailActivity.createIntent(MainActivity.this, null, mLastSource, mLastCid, false); startActivity(intent); } } @@ -242,17 +242,12 @@ public void onMessagePositiveClick(int type) { switch (type) { case TYPE_NOTICE: mPreference.putBoolean(PreferenceManager.PREF_MAIN_NOTICE, true); - break; - case TYPE_UPDATE_LOG: - mPreference.putInt(PreferenceManager.PREF_VERSION, CimocApplication.VERSION); + showPermission(); break; case TYPE_PERMISSION: ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 0); break; } - if (!showAuthorNotice() && !showUpdateLog()) { - showPermission(); - } } @Override @@ -304,6 +299,10 @@ public void onThemeChange(@StyleRes int theme, @ColorRes int primary, @ColorRes if (mToolbar != null) { mToolbar.setBackgroundColor(ContextCompat.getColor(this, primary)); } + + for (int i = 0; i < mFragmentArray.size(); ++i) { + ((ThemeView) mFragmentArray.valueAt(i)).onThemeChange(primary, accent); + } } private boolean showAuthorNotice() { @@ -315,15 +314,6 @@ private boolean showAuthorNotice() { return false; } - private boolean showUpdateLog() { - if (mPreference.getInt(PreferenceManager.PREF_VERSION, 0) != CimocApplication.VERSION) { - MessageDialogFragment fragment = MessageDialogFragment.newInstance(R.string.main_update_log, R.string.main_update_log_content, false, TYPE_UPDATE_LOG); - fragment.show(getFragmentManager(), null); - return true; - } - return false; - } - private void showPermission() { if (!PermissionUtils.hasStoragePermission(this)) { MessageDialogFragment fragment = MessageDialogFragment.newInstance(R.string.main_permission, R.string.main_permission_content, false, TYPE_PERMISSION); diff --git a/app/src/main/java/com/hiroshi/cimoc/ui/activity/ReaderActivity.java b/app/src/main/java/com/hiroshi/cimoc/ui/activity/ReaderActivity.java index ca2f857b..65002a5a 100644 --- a/app/src/main/java/com/hiroshi/cimoc/ui/activity/ReaderActivity.java +++ b/app/src/main/java/com/hiroshi/cimoc/ui/activity/ReaderActivity.java @@ -8,7 +8,6 @@ import android.graphics.Point; import android.media.MediaScannerConnection; import android.net.Uri; -import android.os.Parcelable; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.view.KeyEvent; @@ -44,6 +43,7 @@ import java.io.IOException; import java.io.InputStream; +import java.util.ArrayList; import java.util.LinkedList; import java.util.List; @@ -143,12 +143,9 @@ protected void initData() { EventUtils.getPageClickEventChoice(mPreference) : EventUtils.getStreamClickEventChoice(mPreference); mLongClickArray = mode == PreferenceManager.READER_MODE_PAGE ? EventUtils.getPageLongClickEventChoice(mPreference) : EventUtils.getStreamLongClickEventChoice(mPreference); - Parcelable[] array = getIntent().getParcelableArrayExtra(EXTRA_CHAPTER); - Chapter[] chapter = new Chapter[array.length]; - for (int i = 0; i != array.length; ++i) { - chapter[i] = (Chapter) array[i]; - } - mPresenter.loadInit(chapter); + long id = getIntent().getLongExtra(EXTRA_ID, -1); + List list = getIntent().getParcelableArrayListExtra(EXTRA_CHAPTER); + mPresenter.loadInit(id, list.toArray(new Chapter[list.size()])); } @Override @@ -491,12 +488,14 @@ protected void switchControl() { } } - private static final String EXTRA_CHAPTER = "a"; - private static final String EXTRA_MODE = "b"; + private static final String EXTRA_ID = "a"; + private static final String EXTRA_CHAPTER = "b"; + private static final String EXTRA_MODE = "c"; - public static Intent createIntent(Context context, int mode, List list) { + public static Intent createIntent(Context context, long id, List list, int mode) { Intent intent = getIntent(context, mode); - intent.putExtra(EXTRA_CHAPTER, list.toArray(new Chapter[list.size()])); + intent.putExtra(EXTRA_ID, id); + intent.putExtra(EXTRA_CHAPTER, new ArrayList<>(list)); intent.putExtra(EXTRA_MODE, mode); return intent; } diff --git a/app/src/main/java/com/hiroshi/cimoc/ui/activity/ResultActivity.java b/app/src/main/java/com/hiroshi/cimoc/ui/activity/ResultActivity.java index 7bafbe37..b60eb0e5 100644 --- a/app/src/main/java/com/hiroshi/cimoc/ui/activity/ResultActivity.java +++ b/app/src/main/java/com/hiroshi/cimoc/ui/activity/ResultActivity.java @@ -5,13 +5,11 @@ import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.view.View; -import android.widget.LinearLayout; import com.hiroshi.cimoc.R; import com.hiroshi.cimoc.fresco.ControllerBuilderProvider; import com.hiroshi.cimoc.model.Comic; import com.hiroshi.cimoc.presenter.ResultPresenter; -import com.hiroshi.cimoc.ui.adapter.BaseAdapter; import com.hiroshi.cimoc.ui.adapter.ResultAdapter; import com.hiroshi.cimoc.ui.view.ResultView; @@ -19,15 +17,10 @@ import java.util.LinkedList; import java.util.List; -import butterknife.BindView; - /** * Created by Hiroshi on 2016/7/3. */ -public class ResultActivity extends BackActivity implements ResultView, BaseAdapter.OnItemClickListener { - - @BindView(R.id.result_recycler_view) RecyclerView mRecyclerView; - @BindView(R.id.result_layout) LinearLayout mLinearLayout; +public class ResultActivity extends CoordinatorActivity implements ResultView { private ResultAdapter mResultAdapter; private LinearLayoutManager mLayoutManager; @@ -62,6 +55,7 @@ public void onScrolled(RecyclerView recyclerView, int dx, int dy) { } }); mRecyclerView.setAdapter(mResultAdapter); + mLayoutView.removeView(mActionButton); } @Override @@ -83,7 +77,7 @@ protected void onDestroy() { @Override public void onItemClick(View view, int position) { Comic comic = mResultAdapter.getItem(position); - Intent intent = DetailActivity.createIntent(this, comic.getSource(), comic.getCid()); + Intent intent = DetailActivity.createIntent(this, null, comic.getSource(), comic.getCid(), false); startActivity(intent); } @@ -117,16 +111,6 @@ public void onSearchError() { showSnackbar(R.string.result_error); } - @Override - protected int getLayoutRes() { - return R.layout.activtiy_result; - } - - @Override - protected View getLayoutView() { - return mLinearLayout; - } - @Override protected String getDefaultTitle() { return getIntent().getStringExtra(EXTRA_KEYWORD) == null ? getString(R.string.result_recent) : getString(R.string.result); diff --git a/app/src/main/java/com/hiroshi/cimoc/ui/activity/TagComicActivity.java b/app/src/main/java/com/hiroshi/cimoc/ui/activity/TagComicActivity.java index 0d2b9f4c..63633fc9 100644 --- a/app/src/main/java/com/hiroshi/cimoc/ui/activity/TagComicActivity.java +++ b/app/src/main/java/com/hiroshi/cimoc/ui/activity/TagComicActivity.java @@ -2,45 +2,32 @@ import android.content.Context; import android.content.Intent; -import android.support.v4.util.LongSparseArray; import android.support.v7.widget.GridLayoutManager; -import android.support.v7.widget.RecyclerView; import android.view.View; import com.hiroshi.cimoc.CimocApplication; import com.hiroshi.cimoc.R; import com.hiroshi.cimoc.model.MiniComic; -import com.hiroshi.cimoc.model.Selectable; import com.hiroshi.cimoc.presenter.TagComicPresenter; -import com.hiroshi.cimoc.ui.adapter.BaseAdapter; import com.hiroshi.cimoc.ui.adapter.GridAdapter; import com.hiroshi.cimoc.ui.fragment.dialog.MessageDialogFragment; -import com.hiroshi.cimoc.ui.fragment.dialog.SelectDialogFragment; +import com.hiroshi.cimoc.ui.fragment.dialog.MultiDialogFragment; import com.hiroshi.cimoc.ui.view.TagComicView; -import java.util.ArrayList; -import java.util.HashSet; import java.util.LinkedList; import java.util.List; -import butterknife.BindView; import butterknife.OnClick; /** * Created by Hiroshi on 2016/10/11. */ -public class TagComicActivity extends BackActivity implements TagComicView, - BaseAdapter.OnItemClickListener, BaseAdapter.OnItemLongClickListener, - SelectDialogFragment.SelectDialogListener, MessageDialogFragment.MessageDialogListener { - - @BindView(R.id.tag_comic_layout) View mLayoutView; - @BindView(R.id.tag_comic_recycler_view) RecyclerView mRecyclerView; +public class TagComicActivity extends CoordinatorActivity implements TagComicView, + MultiDialogFragment.MultiDialogListener, MessageDialogFragment.MessageDialogListener { private TagComicPresenter mPresenter; private GridAdapter mGridAdapter; - private LongSparseArray mComicArray; - private List mTempList; private int mTempPosition = -1; @Override @@ -65,7 +52,6 @@ protected void initView() { @Override protected void initData() { - mTempList = new LinkedList<>(); long id = getIntent().getLongExtra(EXTRA_ID, -1); String title = getIntent().getStringExtra(EXTRA_TITLE); mPresenter.loadTagComic(id, title); @@ -78,18 +64,23 @@ protected void onDestroy() { super.onDestroy(); } - @OnClick(R.id.tag_comic_action_button) void onActionButtonClick() { - if (mComicArray == null) { - mPresenter.loadComic(new HashSet<>(mGridAdapter.getDateSet())); - } else { - showSelectDialog(); + @OnClick(R.id.coordinator_action_button) void onActionButtonClick() { + List list = mPresenter.getComicList(); + int size = list.size(); + String[] arr1 = new String[size]; + boolean[] arr2 = new boolean[size]; + for (int i = 0; i < size; ++i) { + arr1[i] = list.get(i).getTitle(); + arr2[i] = false; } + MultiDialogFragment fragment = MultiDialogFragment.newInstance(R.string.tag_comic_select, arr1, arr2, -1); + fragment.show(getFragmentManager(), null); } @Override public void onItemClick(View view, int position) { MiniComic comic = mGridAdapter.getItem(position); - Intent intent = DetailActivity.createIntent(this, comic.getId()); + Intent intent = DetailActivity.createIntent(this, comic.getId(), -1, null, true); startActivity(intent); } @@ -111,70 +102,34 @@ public void onMessagePositiveClick(int type) { } @Override - public void onSelectPositiveClick(int type, List list) { - for (int i = 0; i != list.size(); ++i) { - if (list.get(i).isChecked()) { - mTempList.add(mComicArray.valueAt(i)); - } - } - if (!mTempList.isEmpty()) { - long id = getIntent().getLongExtra(EXTRA_ID, -1); - mPresenter.insert(id, mTempList); - } - } - - @Override - public void onSelectNeutralClick(int type, List list) {} - - @Override - public void onTagComicLoadFail() { - showSnackbar(R.string.common_data_load_fail); - hideProgressBar(); - } - - @Override - public void onTagComicLoadSuccess(List list) { - mGridAdapter.addAll(list); - hideProgressBar(); + public void onMultiPositiveClick(int type, boolean[] check) { + showProgressDialog(); + mPresenter.insert(check); } @Override public void onComicLoadFail() { + hideProgressBar(); showSnackbar(R.string.common_data_load_fail); } @Override public void onComicLoadSuccess(List list) { - mComicArray = new LongSparseArray<>(); - for (MiniComic comic : list) { - mComicArray.put(comic.getId(), comic); - } - showSelectDialog(); - } - - private void showSelectDialog() { - int size = mComicArray.size(); - ArrayList list = new ArrayList<>(size); - for (int i = 0; i != size; ++i) { - list.add(new Selectable(false, false, mComicArray.keyAt(i), mComicArray.valueAt(i).getTitle())); - } - SelectDialogFragment fragment = SelectDialogFragment.newInstance(list, R.string.tag_comic_select); - fragment.show(getFragmentManager(), null); + hideProgressBar(); + mGridAdapter.addAll(list); + mActionButton.setImageResource(R.drawable.ic_add_white_24dp); + mActionButton.show(); } @Override - public void onComicInsertSuccess() { - for (MiniComic comic : mTempList) { - mComicArray.remove(comic.getId()); - } - mGridAdapter.addAll(mTempList); - mTempList.clear(); + public void onComicInsertSuccess(List list) { + hideProgressDialog(); + mGridAdapter.addAll(list); showSnackbar(R.string.common_add_success); } @Override public void onComicInsertFail() { - mTempList.clear(); showSnackbar(R.string.common_add_fail); } @@ -184,24 +139,13 @@ public void onComicUnFavorite(long id) { } @Override - public void onComicFavorite(MiniComic comic) { - mComicArray.put(comic.getId(), comic); - } - - @Override - public void onTagUpdateDelete(MiniComic comic) { + public void onTagComicDelete(MiniComic comic) { mGridAdapter.remove(comic); - if (mComicArray != null) { - mComicArray.put(comic.getId(), comic); - } } @Override - public void onTagUpdateInsert(MiniComic comic) { + public void onTagComicInsert(MiniComic comic) { mGridAdapter.add(0, comic); - if (mComicArray != null) { - mComicArray.remove(comic.getId()); - } } @Override @@ -209,16 +153,6 @@ protected String getDefaultTitle() { return getIntent().getStringExtra(EXTRA_TITLE); } - @Override - protected int getLayoutRes() { - return R.layout.activity_tag_comic; - } - - @Override - protected View getLayoutView() { - return mLayoutView; - } - private static final String EXTRA_ID = "a"; private static final String EXTRA_TITLE = "b"; diff --git a/app/src/main/java/com/hiroshi/cimoc/ui/activity/TagEditorActivity.java b/app/src/main/java/com/hiroshi/cimoc/ui/activity/TagEditorActivity.java new file mode 100644 index 00000000..e823470c --- /dev/null +++ b/app/src/main/java/com/hiroshi/cimoc/ui/activity/TagEditorActivity.java @@ -0,0 +1,125 @@ +package com.hiroshi.cimoc.ui.activity; + +import android.content.Context; +import android.content.Intent; +import android.support.v7.widget.LinearLayoutManager; +import android.view.View; + +import com.hiroshi.cimoc.R; +import com.hiroshi.cimoc.model.Pair; +import com.hiroshi.cimoc.model.Tag; +import com.hiroshi.cimoc.presenter.TagEditorPresenter; +import com.hiroshi.cimoc.ui.adapter.TagEditorAdapter; +import com.hiroshi.cimoc.ui.view.TagEditorView; + +import java.util.ArrayList; +import java.util.List; + +import butterknife.OnClick; + +/** + * Created by Hiroshi on 2016/12/2. + */ + +public class TagEditorActivity extends CoordinatorActivity implements TagEditorView { + + TagEditorPresenter mPresenter; + TagEditorAdapter mTagAdapter; + + @Override + protected void initPresenter() { + mPresenter = new TagEditorPresenter(); + mPresenter.attachView(this); + } + + @Override + protected void initView() { + super.initView(); + mTagAdapter = new TagEditorAdapter(this, new ArrayList>()); + mTagAdapter.setOnItemClickListener(this); + mRecyclerView.setLayoutManager(new LinearLayoutManager(this)); + mRecyclerView.setHasFixedSize(true); + mRecyclerView.setAdapter(mTagAdapter); + mActionButton.setImageResource(R.drawable.ic_done_white_24dp); + mActionButton.show(); + } + + @Override + protected void initData() { + long id = getIntent().getLongExtra(EXTRA_ID, -1); + mPresenter.load(id); + } + + @Override + protected void onDestroy() { + mPresenter.detachView(); + mPresenter = null; + super.onDestroy(); + } + + @Override + public void onTagLoadSuccess(List> list) { + hideProgressBar(); + if (list.isEmpty()) { + showSnackbar(R.string.tag_editor_load_empty); + } else { + mTagAdapter.addAll(list); + } + } + + @Override + public void onTagLoadFail() { + hideProgressDialog(); + showSnackbar(R.string.tag_editor_load_fail); + } + + @Override + public void onTagUpdateInvalid() { + hideProgressDialog(); + showSnackbar(R.string.tag_editor_update_invalid); + } + + @Override + public void onTagUpdateSuccess() { + hideProgressDialog(); + showSnackbar(R.string.tag_editor_update_success); + } + + @Override + public void onTagUpdateFail() { + hideProgressDialog(); + showSnackbar(R.string.tag_editor_update_fail); + } + + @Override + public void onItemClick(View view, int position) { + Pair pair = mTagAdapter.getItem(position); + pair.second = !pair.second; + mTagAdapter.notifyItemChanged(position); + } + + @OnClick(R.id.coordinator_action_button) void onActionButtonClick() { + showProgressDialog(); + List list = new ArrayList<>(); + for (Pair pair : mTagAdapter.getDateSet()) { + if (pair.second) { + list.add(pair.first.getId()); + } + } + mPresenter.updateRef(list); + } + + @Override + protected String getDefaultTitle() { + return getString(R.string.tag_editor); + } + + private static final String EXTRA_ID = "a"; + + public static Intent createIntent(Context context, long id) { + Intent intent = new Intent(context, TagEditorActivity.class); + intent.putExtra(EXTRA_ID, id); + return intent; + } + +} diff --git a/app/src/main/java/com/hiroshi/cimoc/ui/activity/TaskActivity.java b/app/src/main/java/com/hiroshi/cimoc/ui/activity/TaskActivity.java index 636e76d4..4fb8cbba 100644 --- a/app/src/main/java/com/hiroshi/cimoc/ui/activity/TaskActivity.java +++ b/app/src/main/java/com/hiroshi/cimoc/ui/activity/TaskActivity.java @@ -6,7 +6,6 @@ import android.content.ServiceConnection; import android.os.IBinder; import android.support.v7.widget.LinearLayoutManager; -import android.support.v7.widget.RecyclerView; import android.view.Menu; import android.view.MenuItem; import android.view.View; @@ -15,16 +14,12 @@ import com.hiroshi.cimoc.core.manager.PreferenceManager; import com.hiroshi.cimoc.model.Chapter; import com.hiroshi.cimoc.model.Comic; -import com.hiroshi.cimoc.model.Selectable; import com.hiroshi.cimoc.model.Task; import com.hiroshi.cimoc.presenter.TaskPresenter; import com.hiroshi.cimoc.service.DownloadService; import com.hiroshi.cimoc.service.DownloadService.DownloadServiceBinder; -import com.hiroshi.cimoc.ui.adapter.BaseAdapter; import com.hiroshi.cimoc.ui.adapter.TaskAdapter; -import com.hiroshi.cimoc.ui.fragment.ComicFragment; -import com.hiroshi.cimoc.ui.fragment.dialog.MessageDialogFragment; -import com.hiroshi.cimoc.ui.fragment.dialog.SelectDialogFragment; +import com.hiroshi.cimoc.ui.fragment.dialog.MultiDialogFragment; import com.hiroshi.cimoc.ui.view.TaskView; import com.hiroshi.cimoc.utils.ThemeUtils; @@ -32,7 +27,6 @@ import java.util.LinkedList; import java.util.List; -import butterknife.BindView; import butterknife.OnClick; import rx.Observable; import rx.functions.Action1; @@ -41,18 +35,12 @@ /** * Created by Hiroshi on 2016/9/7. */ -public class TaskActivity extends BackActivity implements TaskView, BaseAdapter.OnItemClickListener, - BaseAdapter.OnItemLongClickListener, MessageDialogFragment.MessageDialogListener, - SelectDialogFragment.SelectDialogListener { - - @BindView(R.id.task_layout) View mTaskLayout; - @BindView(R.id.task_recycler_view) RecyclerView mRecyclerView; +public class TaskActivity extends CoordinatorActivity implements TaskView, MultiDialogFragment.MultiDialogListener { private TaskAdapter mTaskAdapter; private TaskPresenter mPresenter; private ServiceConnection mConnection; private DownloadServiceBinder mBinder; - private List mTempList; @Override protected void initPresenter() { @@ -70,11 +58,13 @@ protected void initView() { mRecyclerView.setItemAnimator(null); mRecyclerView.setLayoutManager(new LinearLayoutManager(this)); mRecyclerView.addItemDecoration(mTaskAdapter.getItemDecoration()); + mRecyclerView.setAdapter(mTaskAdapter); + mActionButton.setImageResource(R.drawable.ic_launch_white_24dp); + mActionButton.show(); } @Override protected void initData() { - mTempList = new LinkedList<>(); long key = getIntent().getLongExtra(EXTRA_KEY, -1); mPresenter.load(key); } @@ -97,9 +87,9 @@ public boolean onCreateOptionsMenu(Menu menu) { return super.onCreateOptionsMenu(menu); } - @OnClick(R.id.task_launch_btn) void onLaunchClick() { + @OnClick(R.id.coordinator_action_button) void onActionButtonClick() { Comic comic = mPresenter.getComic(); - Intent intent = DetailActivity.createIntent(this, comic.getId()); + Intent intent = DetailActivity.createIntent(this, comic.getId(), -1, null, false); startActivity(intent); } @@ -124,7 +114,7 @@ public Boolean call(Task task) { .map(new Func1() { @Override public Chapter call(Task task) { - return new Chapter(task.getTitle(), task.getPath(), task.getMax(), true); + return new Chapter(task.getTitle(), task.getPath(), task.getMax(), true, true); } }) .toList() @@ -136,7 +126,7 @@ public void call(final List list) { mTaskAdapter.setLast(last); long id = mPresenter.updateLast(last); int mode = mPreference.getInt(PreferenceManager.PREF_READER_MODE, PreferenceManager.READER_MODE_PAGE); - Intent readerIntent = ReaderActivity.createIntent(TaskActivity.this, mode, list); + Intent readerIntent = ReaderActivity.createIntent(TaskActivity.this, id, list, mode); startActivity(readerIntent); break; } @@ -161,19 +151,18 @@ public void call(final List list) { } } - /** - * delete task - */ - @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.task_delete_multi: - ArrayList list = new ArrayList<>(mTaskAdapter.getItemCount()); - for (Task task : mTaskAdapter.getDateSet()) { - list.add(new Selectable(false, false, task.getTitle())); + int size = mTaskAdapter.getItemCount(); + String[] arr1 = new String[size]; + boolean[] arr2 = new boolean[size]; + for (int i = 0; i < size; ++i) { + arr1[i] = mTaskAdapter.getItem(i).getTitle(); + arr2[i] = false; } - SelectDialogFragment fragment = SelectDialogFragment.newInstance(list, R.string.task_delete_multi); + MultiDialogFragment fragment = MultiDialogFragment.newInstance(R.string.task_delete_multi, arr1, arr2, -1); fragment.show(getFragmentManager(), null); break; } @@ -181,87 +170,48 @@ public boolean onOptionsItemSelected(MenuItem item) { } @Override - public void onSelectPositiveClick(int type, List list) { - for (int i = 0; i != list.size(); ++i) { - if (list.get(i).isChecked()) { - mTempList.add(mTaskAdapter.getItem(i)); + public void onMultiPositiveClick(int type, boolean[] check) { + showProgressDialog(); + int size = mTaskAdapter.getItemCount(); + List result = new ArrayList<>(); + for (int i = 0; i < size; ++i) { + if (check[i]) { + result.add(mTaskAdapter.getItem(i)); } } - deleteTask(); - } - - @Override - public void onSelectNeutralClick(int type, List list) { - mTempList = mTaskAdapter.getDateSet(); - deleteTask(); - } - - @Override - public void onItemLongClick(View view, int position) { - MessageDialogFragment fragment = MessageDialogFragment.newInstance(R.string.dialog_confirm, - R.string.task_delete_confirm, true); - Task task = mTaskAdapter.getItem(position); - mTempList.add(task); - fragment.show(getFragmentManager(), null); - } - - @Override - public void onMessagePositiveClick(int type) { - deleteTask(); - } - - private void deleteTask() { - if (!mTempList.isEmpty()) { + if (!result.isEmpty()) { showProgressDialog(); - for (Task task : mTempList) { + for (Task task : result) { mBinder.getService().removeDownload(task.getId()); } - mPresenter.deleteTask(mTempList, mTaskAdapter.getItemCount() == mTempList.size()); + mPresenter.deleteTask(result, mTaskAdapter.getItemCount() == result.size()); + } else { + showSnackbar("未选择任务"); } } @Override public void onTaskDeleteSuccess() { - mTaskAdapter.removeAll(mTempList); - mTempList.clear(); hideProgressDialog(); showSnackbar(R.string.common_delete_success); } @Override public void onTaskDeleteFail() { - mTempList.clear(); hideProgressDialog(); showSnackbar(R.string.common_delete_fail); } - /** - * init: load task -> sort task - */ - @Override public void onTaskLoadSuccess(final List list) { mTaskAdapter.setColorId(ThemeUtils.getResourceId(this, R.attr.colorAccent)); mTaskAdapter.setLast(mPresenter.getComic().getLast()); mTaskAdapter.addAll(list); - mPresenter.sortTask(list); - } - - @Override - public void onTaskLoadFail() { - hideProgressBar(); - showSnackbar(R.string.task_load_task_fail); - } - - @Override - public void onSortSuccess(final List list) { mConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { mBinder = (DownloadServiceBinder) service; mBinder.getService().initTask(mTaskAdapter.getDateSet()); - mTaskAdapter.setData(list); - mRecyclerView.setAdapter(mTaskAdapter); hideProgressBar(); } @@ -272,9 +222,9 @@ public void onServiceDisconnected(ComponentName name) {} } @Override - public void onLoadIndexFail() { + public void onTaskLoadFail() { hideProgressBar(); - showSnackbar(R.string.task_load_index_fail); + showSnackbar(R.string.task_load_task_fail); } @Override @@ -331,16 +281,6 @@ protected String getDefaultTitle() { return getString(R.string.task_list); } - @Override - protected int getLayoutRes() { - return R.layout.activity_task; - } - - @Override - protected View getLayoutView() { - return mTaskLayout; - } - public static final String EXTRA_KEY = "a"; public static Intent createIntent(Context context, Long id) { diff --git a/app/src/main/java/com/hiroshi/cimoc/ui/adapter/BaseAdapter.java b/app/src/main/java/com/hiroshi/cimoc/ui/adapter/BaseAdapter.java index c1706730..947baef0 100644 --- a/app/src/main/java/com/hiroshi/cimoc/ui/adapter/BaseAdapter.java +++ b/app/src/main/java/com/hiroshi/cimoc/ui/adapter/BaseAdapter.java @@ -125,7 +125,7 @@ public void onBindViewHolder(final RecyclerView.ViewHolder holder, int position) holder.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - if (mClickListener != null && FastClick.isClickValid()) { + if (mClickListener != null && isClickValid()) { mClickListener.onItemClick(v, holder.getAdapterPosition()); } } @@ -142,6 +142,10 @@ public boolean onLongClick(View v) { }); } + protected boolean isClickValid() { + return FastClick.isClickValid(); + } + static class BaseViewHolder extends RecyclerView.ViewHolder { BaseViewHolder(View view) { super(view); diff --git a/app/src/main/java/com/hiroshi/cimoc/ui/adapter/SelectAdapter.java b/app/src/main/java/com/hiroshi/cimoc/ui/adapter/ChapterAdapter.java similarity index 55% rename from app/src/main/java/com/hiroshi/cimoc/ui/adapter/SelectAdapter.java rename to app/src/main/java/com/hiroshi/cimoc/ui/adapter/ChapterAdapter.java index 5c552919..3105c055 100644 --- a/app/src/main/java/com/hiroshi/cimoc/ui/adapter/SelectAdapter.java +++ b/app/src/main/java/com/hiroshi/cimoc/ui/adapter/ChapterAdapter.java @@ -8,49 +8,56 @@ import android.widget.TextView; import com.hiroshi.cimoc.R; -import com.hiroshi.cimoc.model.Selectable; +import com.hiroshi.cimoc.model.Chapter; +import com.hiroshi.cimoc.model.Pair; import java.util.List; import butterknife.BindView; /** - * Created by Hiroshi on 2016/9/4. + * Created by Hiroshi on 2016/11/15. */ -public class SelectAdapter extends BaseAdapter { - static class SelectHolder extends BaseAdapter.BaseViewHolder { +public class ChapterAdapter extends BaseAdapter> { + + static class ChapterHolder extends BaseAdapter.BaseViewHolder { @BindView(R.id.item_select_title) TextView chapterTitle; @BindView(R.id.item_select_checkbox) CheckBox chapterChoice; - SelectHolder(View view) { + ChapterHolder(View view) { super(view); } } - public SelectAdapter(Context context, List list) { + public ChapterAdapter(Context context, List> list) { super(context, list); } - @Override - public RecyclerView.ItemDecoration getItemDecoration() { - return null; - } - @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = mInflater.inflate(R.layout.item_select, parent, false); - return new SelectHolder(view); + return new ChapterHolder(view); } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { super.onBindViewHolder(holder, position); - SelectHolder viewHolder = (SelectHolder) holder; - Selectable selectable = mDataSet.get(position); - viewHolder.chapterTitle.setText(selectable.getTitle()); - viewHolder.chapterChoice.setEnabled(!selectable.isDisable()); - viewHolder.chapterChoice.setChecked(selectable.isChecked()); + ChapterHolder viewHolder = (ChapterHolder) holder; + Pair pair = mDataSet.get(position); + viewHolder.chapterTitle.setText(pair.first.getTitle()); + viewHolder.chapterChoice.setEnabled(!pair.first.isDownload()); + viewHolder.chapterChoice.setChecked(pair.second); + } + + @Override + public RecyclerView.ItemDecoration getItemDecoration() { + return null; + } + + @Override + protected boolean isClickValid() { + return true; } } diff --git a/app/src/main/java/com/hiroshi/cimoc/ui/adapter/ChapterListAdapter.java b/app/src/main/java/com/hiroshi/cimoc/ui/adapter/ChapterListAdapter.java deleted file mode 100644 index 8af56d7f..00000000 --- a/app/src/main/java/com/hiroshi/cimoc/ui/adapter/ChapterListAdapter.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.hiroshi.cimoc.ui.adapter; - -import android.content.Context; -import android.support.v7.widget.RecyclerView; -import android.view.ViewGroup; - -import com.hiroshi.cimoc.model.Chapter; - -import java.util.List; - -/** - * Created by Hiroshi on 2016/11/15. - */ - -public class ChapterListAdapter extends BaseAdapter { - - public ChapterListAdapter(Context context, List list) { - super(context, list); - } - - @Override - public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { - return null; - } - - @Override - public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { - super.onBindViewHolder(holder, position); - } - - @Override - public RecyclerView.ItemDecoration getItemDecoration() { - return null; - } - -} diff --git a/app/src/main/java/com/hiroshi/cimoc/ui/adapter/TagEditorAdapter.java b/app/src/main/java/com/hiroshi/cimoc/ui/adapter/TagEditorAdapter.java new file mode 100644 index 00000000..e1f9f749 --- /dev/null +++ b/app/src/main/java/com/hiroshi/cimoc/ui/adapter/TagEditorAdapter.java @@ -0,0 +1,62 @@ +package com.hiroshi.cimoc.ui.adapter; + +import android.content.Context; +import android.support.v7.widget.RecyclerView; +import android.view.View; +import android.view.ViewGroup; +import android.widget.CheckBox; +import android.widget.TextView; + +import com.hiroshi.cimoc.R; +import com.hiroshi.cimoc.model.Pair; +import com.hiroshi.cimoc.model.Tag; + +import java.util.List; + +import butterknife.BindView; + +/** + * Created by Hiroshi on 2016/12/2. + */ + +public class TagEditorAdapter extends BaseAdapter> { + + static class TagHolder extends BaseAdapter.BaseViewHolder { + @BindView(R.id.item_select_title) TextView tagTitle; + @BindView(R.id.item_select_checkbox) CheckBox tagChoice; + + TagHolder(View view) { + super(view); + } + } + + public TagEditorAdapter(Context context, List> list) { + super(context, list); + } + + @Override + public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + View view = mInflater.inflate(R.layout.item_select, parent, false); + return new TagHolder(view); + } + + @Override + public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { + super.onBindViewHolder(holder, position); + TagHolder viewHolder = (TagHolder) holder; + Pair pair = mDataSet.get(position); + viewHolder.tagTitle.setText(pair.first.getTitle()); + viewHolder.tagChoice.setChecked(pair.second); + } + + @Override + public RecyclerView.ItemDecoration getItemDecoration() { + return null; + } + + @Override + protected boolean isClickValid() { + return true; + } + +} diff --git a/app/src/main/java/com/hiroshi/cimoc/ui/custom/ChapterButton.java b/app/src/main/java/com/hiroshi/cimoc/ui/custom/ChapterButton.java index e769570e..8af867de 100644 --- a/app/src/main/java/com/hiroshi/cimoc/ui/custom/ChapterButton.java +++ b/app/src/main/java/com/hiroshi/cimoc/ui/custom/ChapterButton.java @@ -44,7 +44,7 @@ private void init(Context context, AttributeSet attrs) { accentColor = typedArray.getColor(R.styleable.ChapterButton_selected_color, Color.BLACK); typedArray.recycle(); - normalColor = download ? accentColor : 0x8A000000; + normalColor = 0x8A000000; setClickable(true); download = false; @@ -78,7 +78,7 @@ private void initDrawableState() { public void setDownload(boolean download) { if (this.download != download) { this.download = download; - normalColor = download ? accentColor : normalColor; + normalColor = download ? accentColor : 0x8A000000; initColorDrawableState(); initDrawableState(); } diff --git a/app/src/main/java/com/hiroshi/cimoc/ui/fragment/ComicFragment.java b/app/src/main/java/com/hiroshi/cimoc/ui/fragment/ComicFragment.java index 69a90615..b418a5a3 100644 --- a/app/src/main/java/com/hiroshi/cimoc/ui/fragment/ComicFragment.java +++ b/app/src/main/java/com/hiroshi/cimoc/ui/fragment/ComicFragment.java @@ -1,5 +1,6 @@ package com.hiroshi.cimoc.ui.fragment; +import android.content.Intent; import android.support.annotation.ColorRes; import android.support.design.widget.TabLayout; import android.support.v4.content.ContextCompat; @@ -9,16 +10,17 @@ import android.view.MenuItem; import com.hiroshi.cimoc.R; -import com.hiroshi.cimoc.core.manager.TagManager; import com.hiroshi.cimoc.model.Tag; import com.hiroshi.cimoc.presenter.ComicPresenter; +import com.hiroshi.cimoc.ui.activity.TagComicActivity; import com.hiroshi.cimoc.ui.adapter.TabPagerAdapter; -import com.hiroshi.cimoc.ui.fragment.classical.grid.DownloadFragment; -import com.hiroshi.cimoc.ui.fragment.classical.grid.FavoriteFragment; -import com.hiroshi.cimoc.ui.fragment.classical.grid.GridFragment; -import com.hiroshi.cimoc.ui.fragment.classical.grid.HistoryFragment; -import com.hiroshi.cimoc.ui.fragment.dialog.ChoiceDialogFragment; +import com.hiroshi.cimoc.ui.fragment.coordinator.grid.DownloadFragment; +import com.hiroshi.cimoc.ui.fragment.coordinator.grid.FavoriteFragment; +import com.hiroshi.cimoc.ui.fragment.coordinator.grid.GridFragment; +import com.hiroshi.cimoc.ui.fragment.coordinator.grid.HistoryFragment; +import com.hiroshi.cimoc.ui.fragment.dialog.ItemDialogFragment; import com.hiroshi.cimoc.ui.view.ComicView; +import com.hiroshi.cimoc.ui.view.ThemeView; import com.hiroshi.cimoc.utils.HintUtils; import java.util.List; @@ -29,7 +31,7 @@ * Created by Hiroshi on 2016/10/11. */ -public class ComicFragment extends BaseFragment implements ComicView, ChoiceDialogFragment.ChoiceDialogListener { +public class ComicFragment extends BaseFragment implements ComicView, ItemDialogFragment.ItemDialogListener{ @BindView(R.id.comic_tab_layout) TabLayout mTabLayout; @BindView(R.id.comic_view_pager) ViewPager mViewPager; @@ -37,7 +39,6 @@ public class ComicFragment extends BaseFragment implements ComicView, ChoiceDial private ComicPresenter mPresenter; private TabPagerAdapter mTabAdapter; private List mTagList; - private int mFilterChoice; @Override protected void initPresenter() { @@ -78,47 +79,17 @@ public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.comic_filter: - if (mTagList == null) { - showProgressDialog(); - mPresenter.load(); - } else { - showTagList(); - } + showProgressDialog(); + mPresenter.load(); break; } return super.onOptionsItemSelected(item); } - private void showTagList() { - String[] item = new String[mTagList.size() + 3]; - item[0] = "全部漫画"; - item[1] = "连载中"; - item[2] = "已完结"; - for (int i = 0; i != mTagList.size(); ++i) { - item[i + 3] = mTagList.get(i).getTitle(); - } - ChoiceDialogFragment fragment = ChoiceDialogFragment.newInstance(R.string.comic_filter, item, mFilterChoice, -1); - fragment.setTargetFragment(this, 0); - fragment.show(getFragmentManager(), null); - } - @Override - public void onChoicePositiveClick(int type, int choice, String value) { - mFilterChoice = choice; - switch (mFilterChoice) { - case 0: - mPresenter.filter(TagManager.TAG_ALL, 0); - break; - case 1: - mPresenter.filter(TagManager.TAG_CONTINUE, 0); - break; - case 2: - mPresenter.filter(TagManager.TAG_END, 0); - break; - default: - mPresenter.filter(TagManager.TAG_NORMAL, mTagList.get(mFilterChoice - 3).getId()); - break; - } + public void onItemPositiveClick(int type, int index) { + Intent intent = TagComicActivity.createIntent(getActivity(), mTagList.get(index).getId(), mTagList.get(index).getTitle()); + startActivity(intent); } @Override @@ -126,41 +97,32 @@ public void showSnackbar(String msg) { HintUtils.showSnackbar(mTabAdapter.getItem(mViewPager.getCurrentItem()).getView(), msg); } - @Override - public void onTagInsert(Tag tag) { - if (mTagList != null) { - mTagList.add(tag); - } - } - - @Override - public void onTagDelete(Tag tag) { - if (mTagList != null) { - int index = mTagList.indexOf(tag); - mTagList.remove(tag); - if (index != -1 && index == mFilterChoice - 3) { - mFilterChoice = 0; - mPresenter.filter(TagManager.TAG_ALL, 0); - } - } - } - @Override public void onTagLoadSuccess(List list) { hideProgressDialog(); - mFilterChoice = 0; mTagList = list; - showTagList(); + int size = list.size(); + String[] item = new String[size]; + for (int i = 0; i < size; ++i) { + item[i] = list.get(i).getTitle(); + } + ItemDialogFragment fragment = ItemDialogFragment.newInstance(R.string.comic_tag_select, item, -1); + fragment.setTargetFragment(this, 0); + fragment.show(getFragmentManager(), null); } @Override public void onTagLoadFail() { - showSnackbar(R.string.comic_load_filter_fail); + showSnackbar(R.string.comic_load_tag_fail); } @Override public void onThemeChange(@ColorRes int primary, @ColorRes int accent) { mTabLayout.setBackgroundColor(ContextCompat.getColor(getActivity(), primary)); + + for (int i = 0; i < 3; ++i) { + ((ThemeView) mTabAdapter.getItem(i)).onThemeChange(primary, accent); + } } @Override diff --git a/app/src/main/java/com/hiroshi/cimoc/ui/fragment/SearchFragment.java b/app/src/main/java/com/hiroshi/cimoc/ui/fragment/SearchFragment.java index b18ab925..f9ac5760 100644 --- a/app/src/main/java/com/hiroshi/cimoc/ui/fragment/SearchFragment.java +++ b/app/src/main/java/com/hiroshi/cimoc/ui/fragment/SearchFragment.java @@ -16,17 +16,14 @@ import android.widget.TextView; import com.hiroshi.cimoc.R; -import com.hiroshi.cimoc.model.Selectable; import com.hiroshi.cimoc.model.Source; import com.hiroshi.cimoc.presenter.SearchPresenter; import com.hiroshi.cimoc.ui.activity.ResultActivity; -import com.hiroshi.cimoc.ui.fragment.dialog.SelectDialogFragment; +import com.hiroshi.cimoc.ui.fragment.dialog.MultiDialogFragment; import com.hiroshi.cimoc.ui.view.SearchView; import java.util.ArrayList; -import java.util.HashSet; import java.util.List; -import java.util.Set; import butterknife.BindView; import butterknife.OnClick; @@ -36,7 +33,7 @@ */ public class SearchFragment extends BaseFragment implements SearchView, - TextView.OnEditorActionListener, SelectDialogFragment.SelectDialogListener { + TextView.OnEditorActionListener, MultiDialogFragment.MultiDialogListener { @BindView(R.id.search_frame_layout) View mFrameLayout; @BindView(R.id.search_text_layout) TextInputLayout mInputLayout; @@ -45,7 +42,6 @@ public class SearchFragment extends BaseFragment implements SearchView, private SearchPresenter mPresenter; private List mSourceList; - private Set mFilterSet; @Override protected void initPresenter() { @@ -108,11 +104,15 @@ public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.search_menu_source: - ArrayList list = new ArrayList<>(); - for (Source source : mSourceList) { - list.add(new Selectable(false, mFilterSet.contains(source), source.getTitle())); + int size = mSourceList.size(); + String[] arr1 = new String[size]; + boolean[] arr2 = new boolean[size]; + for (int i = 0; i < size; ++i) { + arr1[i] = mSourceList.get(i).getTitle(); + arr2[i] = mSourceList.get(i).getCheck(); } - SelectDialogFragment fragment = SelectDialogFragment.newInstance(list, R.string.search_source_select); + MultiDialogFragment fragment = + MultiDialogFragment.newInstance(R.string.search_source_select, arr1, arr2, -1); fragment.setTargetFragment(this, 0); fragment.show(getFragmentManager(), null); break; @@ -121,19 +121,13 @@ public boolean onOptionsItemSelected(MenuItem item) { } @Override - public void onSelectPositiveClick(int type, List list) { - for (int i = 0; i != list.size(); ++i) { - if (list.get(i).isChecked()) { - mFilterSet.add(mSourceList.get(i)); - } else { - mFilterSet.remove(mSourceList.get(i)); - } + public void onMultiPositiveClick(int type, boolean[] check) { + int size = mSourceList.size(); + for (int i = 0; i < size; ++i) { + mSourceList.get(i).setCheck(check[i]); } } - @Override - public void onSelectNeutralClick(int type, List list) {} - @Override public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { if (actionId == EditorInfo.IME_ACTION_SEARCH) { @@ -150,7 +144,7 @@ public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { } else { ArrayList list = new ArrayList<>(); for (Source source : mSourceList) { - if (mFilterSet.contains(source)) { + if (source.getCheck()) { list.add(source.getType()); } } @@ -164,20 +158,14 @@ public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { @Override public void onSourceLoadSuccess(List list) { - mSourceList = list; - mFilterSet = new HashSet<>(); - for (Source source : list) { - if (source.getType() < 100) { - mFilterSet.add(source); - } - } + mSourceList = new ArrayList<>(list); hideProgressBar(); } @Override public void onSourceLoadFail() { - showSnackbar(R.string.search_source_load_fail); hideProgressBar(); + showSnackbar(R.string.search_source_load_fail); } @Override diff --git a/app/src/main/java/com/hiroshi/cimoc/ui/fragment/classical/ClassicalFragment.java b/app/src/main/java/com/hiroshi/cimoc/ui/fragment/classical/ClassicalFragment.java deleted file mode 100644 index 4b480a1f..00000000 --- a/app/src/main/java/com/hiroshi/cimoc/ui/fragment/classical/ClassicalFragment.java +++ /dev/null @@ -1,71 +0,0 @@ -package com.hiroshi.cimoc.ui.fragment.classical; - -import android.support.design.widget.FloatingActionButton; -import android.support.v7.widget.RecyclerView; -import android.view.View; - -import com.hiroshi.cimoc.R; -import com.hiroshi.cimoc.ui.adapter.BaseAdapter; -import com.hiroshi.cimoc.ui.fragment.BaseFragment; - -import butterknife.BindView; -import butterknife.OnClick; - -/** - * Created by Hiroshi on 2016/10/11. - */ - -public abstract class ClassicalFragment extends BaseFragment implements BaseAdapter.OnItemClickListener, - BaseAdapter.OnItemLongClickListener { - - @BindView(R.id.classical_recycler_view) protected RecyclerView mRecyclerView; - @BindView(R.id.classical_action_button) protected FloatingActionButton mActionButton; - - @Override - protected void initView() { - mActionButton.setImageResource(getImageRes()); - mRecyclerView.setHasFixedSize(true); - mRecyclerView.setItemAnimator(null); - mRecyclerView.setLayoutManager(getLayoutManager()); - BaseAdapter adapter = getAdapter(); - if (adapter != null) { - adapter.setOnItemClickListener(this); - adapter.setOnItemLongClickListener(this); - mRecyclerView.addItemDecoration(adapter.getItemDecoration()); - mRecyclerView.setAdapter(getAdapter()); - } - } - - @OnClick(R.id.classical_action_button) void onFloatActionButtonClick() { - onActionButtonClick(); - } - - @Override - public void onHiddenChanged(boolean hidden) { - if (hidden) { - mActionButton.hide(); - } else { - mActionButton.show(); - } - } - - @Override - public void onItemClick(View view, int position) {} - - @Override - public void onItemLongClick(View view, int position) {} - - @Override - protected int getLayoutRes() { - return R.layout.fragment_classical; - } - - protected abstract void onActionButtonClick(); - - protected abstract int getImageRes(); - - protected abstract RecyclerView.LayoutManager getLayoutManager(); - - protected abstract BaseAdapter getAdapter(); - -} diff --git a/app/src/main/java/com/hiroshi/cimoc/ui/fragment/coordinator/CoordinatorFragment.java b/app/src/main/java/com/hiroshi/cimoc/ui/fragment/coordinator/CoordinatorFragment.java new file mode 100644 index 00000000..4eb634c5 --- /dev/null +++ b/app/src/main/java/com/hiroshi/cimoc/ui/fragment/coordinator/CoordinatorFragment.java @@ -0,0 +1,69 @@ +package com.hiroshi.cimoc.ui.fragment.coordinator; + +import android.support.design.widget.CoordinatorLayout; +import android.support.design.widget.FloatingActionButton; +import android.support.v7.widget.RecyclerView; +import android.view.View; + +import com.hiroshi.cimoc.R; +import com.hiroshi.cimoc.ui.activity.CoordinatorActivity; +import com.hiroshi.cimoc.ui.adapter.BaseAdapter; +import com.hiroshi.cimoc.ui.fragment.BaseFragment; + +import butterknife.BindView; + +/** + * Created by Hiroshi on 2016/10/11. + */ + +public abstract class CoordinatorFragment extends BaseFragment implements BaseAdapter.OnItemClickListener, + BaseAdapter.OnItemLongClickListener { + + @BindView(R.id.coordinator_recycler_view) protected RecyclerView mRecyclerView; + @BindView(R.id.coordinator_action_button) protected FloatingActionButton mActionButton; + @BindView(R.id.coordinator_layout) protected CoordinatorLayout mLayoutView; + + @Override + protected void initView() { + mRecyclerView.setHasFixedSize(true); + mRecyclerView.setItemAnimator(null); + mRecyclerView.setLayoutManager(initLayoutManager()); + BaseAdapter adapter = initAdapter(); + if (adapter != null) { + adapter.setOnItemClickListener(this); + adapter.setOnItemLongClickListener(this); + mRecyclerView.addItemDecoration(adapter.getItemDecoration()); + mRecyclerView.setAdapter(adapter); + } + initActionButton(); + } + + abstract protected BaseAdapter initAdapter(); + + protected abstract RecyclerView.LayoutManager initLayoutManager(); + + abstract protected void initActionButton(); + + @Override + public void onHiddenChanged(boolean hidden) { + if (mActionButton != null) { + if (hidden) { + mActionButton.hide(); + } else { + mActionButton.show(); + } + } + } + + @Override + public void onItemClick(View view, int position) {} + + @Override + public void onItemLongClick(View view, int position) {} + + @Override + protected int getLayoutRes() { + return R.layout.fragment_coordinator; + } + +} diff --git a/app/src/main/java/com/hiroshi/cimoc/ui/fragment/classical/SourceFragment.java b/app/src/main/java/com/hiroshi/cimoc/ui/fragment/coordinator/SourceFragment.java similarity index 51% rename from app/src/main/java/com/hiroshi/cimoc/ui/fragment/classical/SourceFragment.java rename to app/src/main/java/com/hiroshi/cimoc/ui/fragment/coordinator/SourceFragment.java index 087ad5de..12f16497 100644 --- a/app/src/main/java/com/hiroshi/cimoc/ui/fragment/classical/SourceFragment.java +++ b/app/src/main/java/com/hiroshi/cimoc/ui/fragment/coordinator/SourceFragment.java @@ -1,4 +1,4 @@ -package com.hiroshi.cimoc.ui.fragment.classical; +package com.hiroshi.cimoc.ui.fragment.coordinator; import android.content.Intent; import android.support.annotation.ColorRes; @@ -8,14 +8,11 @@ import android.view.View; import com.hiroshi.cimoc.R; -import com.hiroshi.cimoc.core.manager.SourceManager; import com.hiroshi.cimoc.model.Source; import com.hiroshi.cimoc.presenter.SourcePresenter; import com.hiroshi.cimoc.ui.activity.ResultActivity; import com.hiroshi.cimoc.ui.adapter.BaseAdapter; import com.hiroshi.cimoc.ui.adapter.SourceAdapter; -import com.hiroshi.cimoc.ui.fragment.dialog.EditorDialogFragment; -import com.hiroshi.cimoc.ui.fragment.dialog.MessageDialogFragment; import com.hiroshi.cimoc.ui.view.SourceView; import java.util.ArrayList; @@ -24,12 +21,10 @@ /** * Created by Hiroshi on 2016/8/11. */ -public class SourceFragment extends ClassicalFragment implements SourceView, SourceAdapter.OnItemCheckedListener, - MessageDialogFragment.MessageDialogListener, EditorDialogFragment.EditorDialogListener { +public class SourceFragment extends CoordinatorFragment implements SourceView, SourceAdapter.OnItemCheckedListener { private SourcePresenter mPresenter; private SourceAdapter mSourceAdapter; - private int mTempPosition = -1; @Override protected void initPresenter() { @@ -38,11 +33,20 @@ protected void initPresenter() { } @Override - protected void initView() { + protected BaseAdapter initAdapter() { mSourceAdapter = new SourceAdapter(getActivity(), new ArrayList()); - mSourceAdapter.setOnItemLongClickListener(this); - mSourceAdapter.setOnItemCheckedListener(this); - super.initView(); + return mSourceAdapter; + } + + @Override + protected RecyclerView.LayoutManager initLayoutManager() { + return new GridLayoutManager(getActivity(), 2); + } + + @Override + protected void initActionButton() { + mLayoutView.removeView(mActionButton); + mActionButton = null; } @Override @@ -63,23 +67,6 @@ public void onItemClick(View view, int position) { startActivity(intent); } - @Override - public void onItemLongClick(View view, final int position) { - MessageDialogFragment fragment = MessageDialogFragment.newInstance(R.string.dialog_confirm, - R.string.source_delete_confirm, true); - mTempPosition = position; - fragment.setTargetFragment(this, 0); - fragment.show(getFragmentManager(), null); - } - - @Override - public void onMessagePositiveClick(int type) { - Source source = mSourceAdapter.getItem(mTempPosition); - mPresenter.delete(source.getId()); - mSourceAdapter.remove(mTempPosition); - showSnackbar(R.string.common_delete_success); - } - @Override public void onItemCheckedListener(boolean isChecked, int position) { Source source = mSourceAdapter.getItem(position); @@ -87,27 +74,6 @@ public void onItemCheckedListener(boolean isChecked, int position) { mPresenter.update(source); } - @Override - protected void onActionButtonClick() { - EditorDialogFragment fragment = EditorDialogFragment.newInstance(R.string.source_add); - fragment.setTargetFragment(this, 0); - fragment.show(getFragmentManager(), null); - } - - @Override - public void onEditorPositiveClick(String text) { - Source source = SourceManager.getSource(text); - if (source == null) { - showSnackbar(R.string.common_add_fail); - } else if (mSourceAdapter.contain(source.getType())) { - showSnackbar(R.string.source_add_exist); - } else { - mPresenter.insert(source); - mSourceAdapter.add(source); - showSnackbar(R.string.common_add_success); - } - } - @Override public void onSourceLoadSuccess(List list) { mSourceAdapter.addAll(list); @@ -127,19 +93,4 @@ public void onThemeChange(@ColorRes int primary, @ColorRes int accent) { mSourceAdapter.notifyDataSetChanged(); } - @Override - protected int getImageRes() { - return R.drawable.ic_add_white_24dp; - } - - @Override - protected BaseAdapter getAdapter() { - return mSourceAdapter; - } - - @Override - protected RecyclerView.LayoutManager getLayoutManager() { - return new GridLayoutManager(getActivity(), 2); - } - } diff --git a/app/src/main/java/com/hiroshi/cimoc/ui/fragment/classical/TagFragment.java b/app/src/main/java/com/hiroshi/cimoc/ui/fragment/coordinator/TagFragment.java similarity index 87% rename from app/src/main/java/com/hiroshi/cimoc/ui/fragment/classical/TagFragment.java rename to app/src/main/java/com/hiroshi/cimoc/ui/fragment/coordinator/TagFragment.java index 45110c49..8b4d3363 100644 --- a/app/src/main/java/com/hiroshi/cimoc/ui/fragment/classical/TagFragment.java +++ b/app/src/main/java/com/hiroshi/cimoc/ui/fragment/coordinator/TagFragment.java @@ -1,4 +1,4 @@ -package com.hiroshi.cimoc.ui.fragment.classical; +package com.hiroshi.cimoc.ui.fragment.coordinator; import android.content.Intent; import android.support.annotation.ColorRes; @@ -21,11 +21,13 @@ import java.util.ArrayList; import java.util.List; +import butterknife.OnClick; + /** * Created by Hiroshi on 2016/10/10. */ -public class TagFragment extends ClassicalFragment implements TagView, EditorDialogFragment.EditorDialogListener, +public class TagFragment extends CoordinatorFragment implements TagView, EditorDialogFragment.EditorDialogListener, MessageDialogFragment.MessageDialogListener { private TagPresenter mPresenter; @@ -39,10 +41,19 @@ protected void initPresenter() { } @Override - protected void initView() { + protected BaseAdapter initAdapter() { mTagAdapter = new TagAdapter(getActivity(), new ArrayList()); - mTagAdapter.setOnItemLongClickListener(this); - super.initView(); + return mTagAdapter; + } + + @Override + protected RecyclerView.LayoutManager initLayoutManager() { + return new StaggeredGridLayoutManager(3, StaggeredGridLayoutManager.VERTICAL); + } + + @Override + protected void initActionButton() { + mActionButton.setImageResource(R.drawable.ic_add_white_24dp); } @Override @@ -78,8 +89,7 @@ public void onMessagePositiveClick(int type) { mPresenter.delete(mTagAdapter.getItem(mTempPosition)); } - @Override - protected void onActionButtonClick() { + @OnClick(R.id.coordinator_action_button) void onActionButtonClick() { EditorDialogFragment fragment = EditorDialogFragment.newInstance(R.string.tag_add); fragment.setTargetFragment(this, 0); fragment.show(getFragmentManager(), null); @@ -127,19 +137,4 @@ public void onThemeChange(@ColorRes int primary, @ColorRes int accent) { mTagAdapter.notifyDataSetChanged(); } - @Override - protected int getImageRes() { - return R.drawable.ic_add_white_24dp; - } - - @Override - protected BaseAdapter getAdapter() { - return mTagAdapter; - } - - @Override - protected RecyclerView.LayoutManager getLayoutManager() { - return new StaggeredGridLayoutManager(3, StaggeredGridLayoutManager.VERTICAL); - } - } diff --git a/app/src/main/java/com/hiroshi/cimoc/ui/fragment/classical/grid/DownloadFragment.java b/app/src/main/java/com/hiroshi/cimoc/ui/fragment/coordinator/grid/DownloadFragment.java similarity index 97% rename from app/src/main/java/com/hiroshi/cimoc/ui/fragment/classical/grid/DownloadFragment.java rename to app/src/main/java/com/hiroshi/cimoc/ui/fragment/coordinator/grid/DownloadFragment.java index 311e5828..eee1e3a3 100644 --- a/app/src/main/java/com/hiroshi/cimoc/ui/fragment/classical/grid/DownloadFragment.java +++ b/app/src/main/java/com/hiroshi/cimoc/ui/fragment/coordinator/grid/DownloadFragment.java @@ -1,4 +1,4 @@ -package com.hiroshi.cimoc.ui.fragment.classical.grid; +package com.hiroshi.cimoc.ui.fragment.coordinator.grid; import android.app.ActivityManager; import android.content.Context; @@ -16,6 +16,8 @@ import java.util.ArrayList; +import butterknife.OnClick; + /** * Created by Hiroshi on 2016/9/1. */ @@ -53,8 +55,7 @@ public void onDestroyView() { super.onDestroyView(); } - @Override - protected void onActionButtonClick() { + @OnClick(R.id.coordinator_action_button) void onActionButtonClick() { MessageDialogFragment fragment = MessageDialogFragment.newInstance(R.string.dialog_confirm, R.string.download_action_confirm, true, TYPE_PAUSE); fragment.setTargetFragment(this, 0); diff --git a/app/src/main/java/com/hiroshi/cimoc/ui/fragment/classical/grid/FavoriteFragment.java b/app/src/main/java/com/hiroshi/cimoc/ui/fragment/coordinator/grid/FavoriteFragment.java similarity index 85% rename from app/src/main/java/com/hiroshi/cimoc/ui/fragment/classical/grid/FavoriteFragment.java rename to app/src/main/java/com/hiroshi/cimoc/ui/fragment/coordinator/grid/FavoriteFragment.java index 998f5311..2db4b3ed 100644 --- a/app/src/main/java/com/hiroshi/cimoc/ui/fragment/classical/grid/FavoriteFragment.java +++ b/app/src/main/java/com/hiroshi/cimoc/ui/fragment/coordinator/grid/FavoriteFragment.java @@ -1,4 +1,4 @@ -package com.hiroshi.cimoc.ui.fragment.classical.grid; +package com.hiroshi.cimoc.ui.fragment.coordinator.grid; import android.app.Notification; import android.app.NotificationManager; @@ -10,13 +10,14 @@ import com.hiroshi.cimoc.model.MiniComic; import com.hiroshi.cimoc.presenter.FavoritePresenter; import com.hiroshi.cimoc.ui.activity.DetailActivity; -import com.hiroshi.cimoc.ui.fragment.ComicFragment; import com.hiroshi.cimoc.ui.fragment.dialog.MessageDialogFragment; import com.hiroshi.cimoc.ui.view.FavoriteView; import com.hiroshi.cimoc.utils.NotificationUtils; import java.util.List; +import butterknife.OnClick; + /** * Created by Hiroshi on 2016/7/1. */ @@ -68,8 +69,7 @@ public void onMessagePositiveClick(int type) { } } - @Override - protected void onActionButtonClick() { + @OnClick(R.id.coordinator_action_button) void onActionButtonClick() { MessageDialogFragment fragment = MessageDialogFragment.newInstance(R.string.dialog_confirm, R.string.favorite_check_update_confirm, true); fragment.setTargetFragment(this, 0); @@ -84,7 +84,7 @@ public void onItemClick(View view, int position) { comic.setHighlight(false); mGridAdapter.update(comic, false); } - Intent intent = DetailActivity.createIntent(getActivity(), comic.getId()); + Intent intent = DetailActivity.createIntent(getActivity(), comic.getId(), -1, null, true); startActivity(intent); } @@ -108,16 +108,6 @@ public void onComicRead(MiniComic comic) { mGridAdapter.update(comic, false); } - @Override - public void onComicFilterSuccess(List list) { - mGridAdapter.setData(list); - } - - @Override - public void onComicFilterFail() { - showSnackbar(R.string.comic_filter_fail); - } - @Override public void onComicCheckSuccess(MiniComic comic, int progress, int max) { if (comic != null) { @@ -141,18 +131,6 @@ public void onComicCheckComplete() { mBuilder = null; } - @Override - public void onComicInsert(MiniComic comic) { - if (!mGridAdapter.contains(comic)) { - mGridAdapter.addAfterHighlight(comic); - } - } - - @Override - public void onComicDelete(MiniComic comic) { - mGridAdapter.remove(comic); - } - @Override protected int getImageRes() { return R.drawable.ic_sync_white_24dp; diff --git a/app/src/main/java/com/hiroshi/cimoc/ui/fragment/classical/grid/GridFragment.java b/app/src/main/java/com/hiroshi/cimoc/ui/fragment/coordinator/grid/GridFragment.java similarity index 75% rename from app/src/main/java/com/hiroshi/cimoc/ui/fragment/classical/grid/GridFragment.java rename to app/src/main/java/com/hiroshi/cimoc/ui/fragment/coordinator/grid/GridFragment.java index d210746f..65492816 100644 --- a/app/src/main/java/com/hiroshi/cimoc/ui/fragment/classical/grid/GridFragment.java +++ b/app/src/main/java/com/hiroshi/cimoc/ui/fragment/coordinator/grid/GridFragment.java @@ -1,6 +1,7 @@ -package com.hiroshi.cimoc.ui.fragment.classical.grid; +package com.hiroshi.cimoc.ui.fragment.coordinator.grid; import android.support.annotation.ColorRes; +import android.support.annotation.DrawableRes; import android.support.v4.content.ContextCompat; import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.RecyclerView; @@ -10,7 +11,7 @@ import com.hiroshi.cimoc.model.MiniComic; import com.hiroshi.cimoc.ui.adapter.BaseAdapter; import com.hiroshi.cimoc.ui.adapter.GridAdapter; -import com.hiroshi.cimoc.ui.fragment.classical.ClassicalFragment; +import com.hiroshi.cimoc.ui.fragment.coordinator.CoordinatorFragment; import com.hiroshi.cimoc.ui.fragment.dialog.MessageDialogFragment; import com.hiroshi.cimoc.ui.view.GridView; @@ -21,16 +22,28 @@ * Created by Hiroshi on 2016/9/22. */ -public abstract class GridFragment extends ClassicalFragment implements GridView, MessageDialogFragment.MessageDialogListener { +public abstract class GridFragment extends CoordinatorFragment implements GridView, MessageDialogFragment.MessageDialogListener { protected GridAdapter mGridAdapter; @Override - protected void initView() { + protected BaseAdapter initAdapter() { mGridAdapter = new GridAdapter(getActivity(), new LinkedList()); mGridAdapter.setProvider(((CimocApplication) getActivity().getApplication()).getBuilderProvider()); mRecyclerView.setRecycledViewPool(((CimocApplication) getActivity().getApplication()).getGridRecycledPool()); - super.initView(); + return mGridAdapter; + } + + @Override + protected RecyclerView.LayoutManager initLayoutManager() { + GridLayoutManager manager = new GridLayoutManager(getActivity(), 3); + manager.setRecycleChildrenOnDetach(true); + return manager; + } + + @Override + protected void initActionButton() { + mActionButton.setImageResource(getImageRes()); } @Override @@ -50,16 +63,6 @@ public void onThemeChange(@ColorRes int primary, @ColorRes int accent) { mActionButton.setBackgroundTintList(ContextCompat.getColorStateList(getActivity(), accent)); } - @Override - protected BaseAdapter getAdapter() { - return mGridAdapter; - } - - @Override - protected RecyclerView.LayoutManager getLayoutManager() { - GridLayoutManager manager = new GridLayoutManager(getActivity(), 3); - manager.setRecycleChildrenOnDetach(true); - return manager; - } + protected abstract @DrawableRes int getImageRes(); } diff --git a/app/src/main/java/com/hiroshi/cimoc/ui/fragment/classical/grid/HistoryFragment.java b/app/src/main/java/com/hiroshi/cimoc/ui/fragment/coordinator/grid/HistoryFragment.java similarity index 94% rename from app/src/main/java/com/hiroshi/cimoc/ui/fragment/classical/grid/HistoryFragment.java rename to app/src/main/java/com/hiroshi/cimoc/ui/fragment/coordinator/grid/HistoryFragment.java index 48ccd903..106952c1 100644 --- a/app/src/main/java/com/hiroshi/cimoc/ui/fragment/classical/grid/HistoryFragment.java +++ b/app/src/main/java/com/hiroshi/cimoc/ui/fragment/coordinator/grid/HistoryFragment.java @@ -1,4 +1,4 @@ -package com.hiroshi.cimoc.ui.fragment.classical.grid; +package com.hiroshi.cimoc.ui.fragment.coordinator.grid; import android.content.Intent; import android.view.View; @@ -11,6 +11,8 @@ import com.hiroshi.cimoc.ui.view.HistoryView; import com.hiroshi.cimoc.utils.StringUtils; +import butterknife.OnClick; + /** * Created by Hiroshi on 2016/7/1. */ @@ -43,7 +45,7 @@ public void onDestroyView() { @Override public void onItemClick(View view, int position) { MiniComic comic = mGridAdapter.getItem(position); - Intent intent = DetailActivity.createIntent(getActivity(), comic.getId()); + Intent intent = DetailActivity.createIntent(getActivity(), comic.getId(), -1, null, false); startActivity(intent); } @@ -71,8 +73,7 @@ public void onMessagePositiveClick(int type) { } } - @Override - protected void onActionButtonClick() { + @OnClick(R.id.coordinator_action_button) void onActionButtonClick() { MessageDialogFragment fragment = MessageDialogFragment.newInstance(R.string.dialog_confirm, R.string.history_clear_confirm, true, TYPE_ACTION_BUTTON); fragment.setTargetFragment(this, 0); diff --git a/app/src/main/java/com/hiroshi/cimoc/ui/fragment/dialog/ItemDialogFragment.java b/app/src/main/java/com/hiroshi/cimoc/ui/fragment/dialog/ItemDialogFragment.java new file mode 100644 index 00000000..c32eb1a3 --- /dev/null +++ b/app/src/main/java/com/hiroshi/cimoc/ui/fragment/dialog/ItemDialogFragment.java @@ -0,0 +1,51 @@ +package com.hiroshi.cimoc.ui.fragment.dialog; + +import android.app.Dialog; +import android.app.DialogFragment; +import android.content.DialogInterface; +import android.os.Bundle; +import android.support.v7.app.AlertDialog; + +/** + * Created by Hiroshi on 2016/12/2. + */ + +public class ItemDialogFragment extends DialogFragment implements DialogInterface.OnClickListener { + + @Override + public Dialog onCreateDialog(Bundle savedInstanceState) { + AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); + String[] item = getArguments().getStringArray(EXTRA_ITEM); + builder.setTitle(getArguments().getInt(EXTRA_TITLE)) + .setItems(item, this); + return builder.create(); + } + + @Override + public void onClick(DialogInterface dialogInterface, int index) { + if (getTargetFragment() != null) { + ((ItemDialogListener) getTargetFragment()).onItemPositiveClick(getArguments().getInt(EXTRA_TYPE), index); + } else { + ((ItemDialogListener) getActivity()).onItemPositiveClick(getArguments().getInt(EXTRA_TYPE), index); + } + } + + public interface ItemDialogListener { + void onItemPositiveClick(int type, int index); + } + + private static final String EXTRA_TITLE = "a"; + private static final String EXTRA_ITEM = "b"; + private static final String EXTRA_TYPE = "c"; + + public static ItemDialogFragment newInstance(int title, String[] item, int type) { + ItemDialogFragment fragment = new ItemDialogFragment(); + Bundle bundle = new Bundle(); + bundle.putInt(EXTRA_TITLE, title); + bundle.putStringArray(EXTRA_ITEM, item); + bundle.putInt(EXTRA_TYPE, type); + fragment.setArguments(bundle); + return fragment; + } + +} diff --git a/app/src/main/java/com/hiroshi/cimoc/ui/fragment/dialog/MultiDialogFragment.java b/app/src/main/java/com/hiroshi/cimoc/ui/fragment/dialog/MultiDialogFragment.java new file mode 100644 index 00000000..f998546f --- /dev/null +++ b/app/src/main/java/com/hiroshi/cimoc/ui/fragment/dialog/MultiDialogFragment.java @@ -0,0 +1,64 @@ +package com.hiroshi.cimoc.ui.fragment.dialog; + +import android.app.Dialog; +import android.app.DialogFragment; +import android.content.DialogInterface; +import android.os.Bundle; +import android.support.v7.app.AlertDialog; + +import com.hiroshi.cimoc.R; + +/** + * Created by Hiroshi on 2016/12/2. + */ + +public class MultiDialogFragment extends DialogFragment implements DialogInterface.OnClickListener { + + private boolean[] check; + + @Override + public Dialog onCreateDialog(Bundle savedInstanceState) { + AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); + String[] item = getArguments().getStringArray(EXTRA_ITEM); + check = getArguments().getBooleanArray(EXTRA_CHECK); + builder.setTitle(getArguments().getInt(EXTRA_TITLE)) + .setMultiChoiceItems(item, check, new DialogInterface.OnMultiChoiceClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int index, boolean value) { + check[index] = value; + } + }) + .setPositiveButton(R.string.dialog_positive, this); + return builder.create(); + } + + @Override + public void onClick(DialogInterface dialogInterface, int which) { + if (getTargetFragment() != null) { + ((MultiDialogListener) getTargetFragment()).onMultiPositiveClick(getArguments().getInt(EXTRA_TYPE), check); + } else { + ((MultiDialogListener) getActivity()).onMultiPositiveClick(getArguments().getInt(EXTRA_TYPE), check); + } + } + + public interface MultiDialogListener { + void onMultiPositiveClick(int type, boolean[] check); + } + + private static final String EXTRA_TITLE = "a"; + private static final String EXTRA_ITEM = "b"; + private static final String EXTRA_CHECK = "c"; + private static final String EXTRA_TYPE = "d"; + + public static MultiDialogFragment newInstance(int title, String[] item, boolean[] check, int type) { + MultiDialogFragment fragment = new MultiDialogFragment(); + Bundle bundle = new Bundle(); + bundle.putInt(EXTRA_TITLE, title); + bundle.putStringArray(EXTRA_ITEM, item); + bundle.putBooleanArray(EXTRA_CHECK, check); + bundle.putInt(EXTRA_TYPE, type); + fragment.setArguments(bundle); + return fragment; + } + +} diff --git a/app/src/main/java/com/hiroshi/cimoc/ui/fragment/dialog/SelectDialogFragment.java b/app/src/main/java/com/hiroshi/cimoc/ui/fragment/dialog/SelectDialogFragment.java deleted file mode 100644 index a5ce7009..00000000 --- a/app/src/main/java/com/hiroshi/cimoc/ui/fragment/dialog/SelectDialogFragment.java +++ /dev/null @@ -1,115 +0,0 @@ -package com.hiroshi.cimoc.ui.fragment.dialog; - -import android.app.Dialog; -import android.app.DialogFragment; -import android.content.DialogInterface; -import android.os.Bundle; -import android.support.v7.app.AlertDialog; -import android.support.v7.widget.LinearLayoutManager; -import android.support.v7.widget.RecyclerView; -import android.view.View; - -import com.hiroshi.cimoc.R; -import com.hiroshi.cimoc.model.Selectable; -import com.hiroshi.cimoc.ui.adapter.BaseAdapter; -import com.hiroshi.cimoc.ui.adapter.SelectAdapter; - -import java.util.ArrayList; -import java.util.List; - -import butterknife.ButterKnife; - -/** - * Created by Hiroshi on 2016/10/13. - */ - -public class SelectDialogFragment extends DialogFragment implements BaseAdapter.OnItemClickListener { - - private SelectAdapter mSelectAdapter; - - @Override - public Dialog onCreateDialog(Bundle savedInstanceState) { - AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); - builder.setTitle(getArguments().getInt(EXTRA_TITLE)) - .setView(initView()) - .setPositiveButton(R.string.dialog_positive, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - if (getTargetFragment() != null) { - ((SelectDialogListener) getTargetFragment()) - .onSelectPositiveClick(getArguments().getInt(EXTRA_TYPE), mSelectAdapter.getDateSet()); - } else { - ((SelectDialogListener) getActivity()) - .onSelectPositiveClick(getArguments().getInt(EXTRA_TYPE), mSelectAdapter.getDateSet()); - } - } - }); - if (getArguments().getInt(EXTRA_NEUTRAL) != -1) { - builder.setNeutralButton(getArguments().getInt(EXTRA_NEUTRAL), new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - if (getTargetFragment() != null) { - ((SelectDialogListener) getTargetFragment()) - .onSelectNeutralClick(getArguments().getInt(EXTRA_TYPE), mSelectAdapter.getDateSet()); - } else { - ((SelectDialogListener) getActivity()) - .onSelectNeutralClick(getArguments().getInt(EXTRA_TYPE), mSelectAdapter.getDateSet()); - } - } - }); - } - return builder.create(); - } - - private View initView() { - View view = getActivity().getLayoutInflater().inflate(R.layout.dialog_select, null); - List list = getArguments().getParcelableArrayList(EXTRA_LIST); - mSelectAdapter = new SelectAdapter(getActivity(), list); - mSelectAdapter.setOnItemClickListener(this); - RecyclerView recyclerView = ButterKnife.findById(view, R.id.dialog_select_recycler_view); - recyclerView.setLayoutManager(new LinearLayoutManager(getActivity())); - recyclerView.setHasFixedSize(true); - recyclerView.setAdapter(mSelectAdapter); - return view; - } - - @Override - public void onItemClick(View view, int position) { - Selectable selectable = mSelectAdapter.getItem(position); - if (!selectable.isDisable()) { - boolean checked = !selectable.isChecked(); - selectable.setChecked(checked); - mSelectAdapter.notifyItemChanged(position); - } - } - - public interface SelectDialogListener { - void onSelectPositiveClick(int type, List list); - void onSelectNeutralClick(int type, List list); - } - - private static final String EXTRA_LIST = "a"; - private static final String EXTRA_TITLE = "b"; - private static final String EXTRA_NEUTRAL = "c"; - private static final String EXTRA_TYPE = "d"; - - public static SelectDialogFragment newInstance(ArrayList list, int title) { - return newInstance(list, title, -1); - } - - public static SelectDialogFragment newInstance(ArrayList list, int title, int neutral) { - return newInstance(list, title, neutral, -1); - } - - public static SelectDialogFragment newInstance(ArrayList list, int title, int neutral, int type) { - SelectDialogFragment fragment = new SelectDialogFragment(); - Bundle bundle = new Bundle(); - bundle.putParcelableArrayList(EXTRA_LIST, list); - bundle.putInt(EXTRA_TITLE, title); - bundle.putInt(EXTRA_NEUTRAL, neutral); - bundle.putInt(EXTRA_TYPE, type); - fragment.setArguments(bundle); - return fragment; - } - -} diff --git a/app/src/main/java/com/hiroshi/cimoc/ui/view/ChapterListView.java b/app/src/main/java/com/hiroshi/cimoc/ui/view/ChapterView.java similarity index 50% rename from app/src/main/java/com/hiroshi/cimoc/ui/view/ChapterListView.java rename to app/src/main/java/com/hiroshi/cimoc/ui/view/ChapterView.java index a5cb4a7b..8e3f2e27 100644 --- a/app/src/main/java/com/hiroshi/cimoc/ui/view/ChapterListView.java +++ b/app/src/main/java/com/hiroshi/cimoc/ui/view/ChapterView.java @@ -3,24 +3,15 @@ import com.hiroshi.cimoc.model.Task; import java.util.ArrayList; -import java.util.List; /** * Created by Hiroshi on 2016/11/14. */ -public interface ChapterListView extends BaseView { +public interface ChapterView extends BaseView { void onTaskAddSuccess(ArrayList list); void onTaskAddFail(); - void onDownloadLoadSuccess(List list); - - void onDownloadLoadFail(); - - void onUpdateIndexSuccess(); - - void onUpdateIndexFail(); - } diff --git a/app/src/main/java/com/hiroshi/cimoc/ui/view/ComicView.java b/app/src/main/java/com/hiroshi/cimoc/ui/view/ComicView.java index 1628d834..b798f832 100644 --- a/app/src/main/java/com/hiroshi/cimoc/ui/view/ComicView.java +++ b/app/src/main/java/com/hiroshi/cimoc/ui/view/ComicView.java @@ -1,7 +1,5 @@ package com.hiroshi.cimoc.ui.view; -import android.support.annotation.ColorRes; - import com.hiroshi.cimoc.model.Tag; import java.util.List; @@ -10,16 +8,10 @@ * Created by Hiroshi on 2016/10/11. */ -public interface ComicView extends BaseView { +public interface ComicView extends BaseView, ThemeView { void onTagLoadSuccess(List list); void onTagLoadFail(); - void onTagInsert(Tag tag); - - void onTagDelete(Tag tag); - - void onThemeChange(@ColorRes int primary, @ColorRes int accent); - } diff --git a/app/src/main/java/com/hiroshi/cimoc/ui/view/DetailView.java b/app/src/main/java/com/hiroshi/cimoc/ui/view/DetailView.java index 2d2d24e7..5981ab75 100644 --- a/app/src/main/java/com/hiroshi/cimoc/ui/view/DetailView.java +++ b/app/src/main/java/com/hiroshi/cimoc/ui/view/DetailView.java @@ -2,10 +2,7 @@ import com.hiroshi.cimoc.model.Chapter; import com.hiroshi.cimoc.model.Comic; -import com.hiroshi.cimoc.model.Selectable; -import com.hiroshi.cimoc.model.Task; -import java.util.ArrayList; import java.util.List; /** @@ -13,28 +10,26 @@ */ public interface DetailView extends BaseView { - void onDetailLoadSuccess(); - void onComicLoadSuccess(Comic comic); void onChapterLoadSuccess(List list); void onChapterChange(String chapter); - void onDownloadLoadSuccess(List list); - void onDownloadLoadFail(); - void onTagLoadSuccess(List list); + void onParseError(); - void onTagLoadFail(); + void onNetworkError(); - void onTagUpdateSuccess(); + void onTagOpenSuccess(); - void onTagUpdateFail(); + void onTagOpenFail(); - void onParseError(); + void onLastOpenSuccess(String path); - void onNetworkError(); + void onFavoriteSuccess(); + + void onUnfavoriteSuccess(); } diff --git a/app/src/main/java/com/hiroshi/cimoc/ui/view/FavoriteView.java b/app/src/main/java/com/hiroshi/cimoc/ui/view/FavoriteView.java index f04c2736..20332f5c 100644 --- a/app/src/main/java/com/hiroshi/cimoc/ui/view/FavoriteView.java +++ b/app/src/main/java/com/hiroshi/cimoc/ui/view/FavoriteView.java @@ -23,12 +23,4 @@ public interface FavoriteView extends GridView { void onComicRead(MiniComic comic); - void onComicFilterSuccess(List list); - - void onComicFilterFail(); - - void onComicInsert(MiniComic comic); - - void onComicDelete(MiniComic comic); - } diff --git a/app/src/main/java/com/hiroshi/cimoc/ui/view/GridView.java b/app/src/main/java/com/hiroshi/cimoc/ui/view/GridView.java index 69ed2010..49f3f013 100644 --- a/app/src/main/java/com/hiroshi/cimoc/ui/view/GridView.java +++ b/app/src/main/java/com/hiroshi/cimoc/ui/view/GridView.java @@ -1,7 +1,5 @@ package com.hiroshi.cimoc.ui.view; -import android.support.annotation.ColorRes; - import com.hiroshi.cimoc.model.MiniComic; import java.util.List; @@ -10,12 +8,10 @@ * Created by Hiroshi on 2016/9/30. */ -public interface GridView extends BaseView { +public interface GridView extends BaseView, ThemeView { void onComicLoadSuccess(List list); void onComicLoadFail(); - void onThemeChange(@ColorRes int primary, @ColorRes int accent); - } diff --git a/app/src/main/java/com/hiroshi/cimoc/ui/view/SearchView.java b/app/src/main/java/com/hiroshi/cimoc/ui/view/SearchView.java index 7f7eada2..6ddebf1a 100644 --- a/app/src/main/java/com/hiroshi/cimoc/ui/view/SearchView.java +++ b/app/src/main/java/com/hiroshi/cimoc/ui/view/SearchView.java @@ -1,7 +1,5 @@ package com.hiroshi.cimoc.ui.view; -import android.support.annotation.ColorRes; - import com.hiroshi.cimoc.model.Source; import java.util.List; @@ -10,7 +8,7 @@ * Created by Hiroshi on 2016/10/11. */ -public interface SearchView extends BaseView { +public interface SearchView extends BaseView, ThemeView { void onSourceLoadSuccess(List list); @@ -20,6 +18,4 @@ public interface SearchView extends BaseView { void onSourceDisable(Source source); - void onThemeChange(@ColorRes int primary, @ColorRes int accent); - } diff --git a/app/src/main/java/com/hiroshi/cimoc/ui/view/SourceView.java b/app/src/main/java/com/hiroshi/cimoc/ui/view/SourceView.java index 7f5dc213..e771542b 100644 --- a/app/src/main/java/com/hiroshi/cimoc/ui/view/SourceView.java +++ b/app/src/main/java/com/hiroshi/cimoc/ui/view/SourceView.java @@ -1,7 +1,5 @@ package com.hiroshi.cimoc.ui.view; -import android.support.annotation.ColorRes; - import com.hiroshi.cimoc.model.Source; import java.util.List; @@ -9,12 +7,10 @@ /** * Created by Hiroshi on 2016/8/21. */ -public interface SourceView extends BaseView { +public interface SourceView extends BaseView, ThemeView { void onSourceLoadSuccess(List list); void onSourceLoadFail(); - void onThemeChange(@ColorRes int primary, @ColorRes int accent); - } diff --git a/app/src/main/java/com/hiroshi/cimoc/ui/view/TagComicView.java b/app/src/main/java/com/hiroshi/cimoc/ui/view/TagComicView.java index e982ab9c..eef6ff8c 100644 --- a/app/src/main/java/com/hiroshi/cimoc/ui/view/TagComicView.java +++ b/app/src/main/java/com/hiroshi/cimoc/ui/view/TagComicView.java @@ -10,24 +10,18 @@ public interface TagComicView extends BaseView { - void onTagComicLoadSuccess(List list); - - void onTagComicLoadFail(); - void onComicLoadSuccess(List list); void onComicLoadFail(); - void onComicInsertSuccess(); + void onComicInsertSuccess(List list); void onComicInsertFail(); void onComicUnFavorite(long id); - void onComicFavorite(MiniComic comic); - - void onTagUpdateInsert(MiniComic comic); + void onTagComicInsert(MiniComic comic); - void onTagUpdateDelete(MiniComic comic); + void onTagComicDelete(MiniComic comic); } diff --git a/app/src/main/java/com/hiroshi/cimoc/ui/view/TagEditorView.java b/app/src/main/java/com/hiroshi/cimoc/ui/view/TagEditorView.java new file mode 100644 index 00000000..9145129f --- /dev/null +++ b/app/src/main/java/com/hiroshi/cimoc/ui/view/TagEditorView.java @@ -0,0 +1,24 @@ +package com.hiroshi.cimoc.ui.view; + +import com.hiroshi.cimoc.model.Pair; +import com.hiroshi.cimoc.model.Tag; + +import java.util.List; + +/** + * Created by Hiroshi on 2016/12/2. + */ + +public interface TagEditorView extends BaseView { + + void onTagLoadSuccess(List> list); + + void onTagLoadFail(); + + void onTagUpdateSuccess(); + + void onTagUpdateInvalid(); + + void onTagUpdateFail(); + +} diff --git a/app/src/main/java/com/hiroshi/cimoc/ui/view/TagView.java b/app/src/main/java/com/hiroshi/cimoc/ui/view/TagView.java index fa063029..8cd27ff7 100644 --- a/app/src/main/java/com/hiroshi/cimoc/ui/view/TagView.java +++ b/app/src/main/java/com/hiroshi/cimoc/ui/view/TagView.java @@ -1,7 +1,5 @@ package com.hiroshi.cimoc.ui.view; -import android.support.annotation.ColorRes; - import com.hiroshi.cimoc.model.Tag; import java.util.List; @@ -10,7 +8,7 @@ * Created by Hiroshi on 2016/10/10. */ -public interface TagView extends BaseView { +public interface TagView extends BaseView, ThemeView { void onTagLoadSuccess(List list); @@ -20,6 +18,4 @@ public interface TagView extends BaseView { void onTagDeleteFail(); - void onThemeChange(@ColorRes int primary, @ColorRes int accent); - } diff --git a/app/src/main/java/com/hiroshi/cimoc/ui/view/TaskView.java b/app/src/main/java/com/hiroshi/cimoc/ui/view/TaskView.java index 2797e0e7..d149e5d1 100644 --- a/app/src/main/java/com/hiroshi/cimoc/ui/view/TaskView.java +++ b/app/src/main/java/com/hiroshi/cimoc/ui/view/TaskView.java @@ -13,12 +13,8 @@ public interface TaskView extends BaseView { void onTaskLoadFail(); - void onSortSuccess(List list); - void onChapterChange(String last); - void onLoadIndexFail(); - void onTaskAdd(List list); void onTaskParse(long id); diff --git a/app/src/main/java/com/hiroshi/cimoc/ui/view/ThemeView.java b/app/src/main/java/com/hiroshi/cimoc/ui/view/ThemeView.java new file mode 100644 index 00000000..683e2477 --- /dev/null +++ b/app/src/main/java/com/hiroshi/cimoc/ui/view/ThemeView.java @@ -0,0 +1,13 @@ +package com.hiroshi.cimoc.ui.view; + +import android.support.annotation.ColorRes; + +/** + * Created by Hiroshi on 2016/12/2. + */ + +public interface ThemeView { + + void onThemeChange(@ColorRes int primary, @ColorRes int accent); + +} diff --git a/app/src/main/java/com/hiroshi/cimoc/utils/CollectionUtils.java b/app/src/main/java/com/hiroshi/cimoc/utils/CollectionUtils.java new file mode 100644 index 00000000..709c636d --- /dev/null +++ b/app/src/main/java/com/hiroshi/cimoc/utils/CollectionUtils.java @@ -0,0 +1,18 @@ +package com.hiroshi.cimoc.utils; + +import java.util.ArrayList; +import java.util.Collection; + +/** + * Created by Hiroshi on 2016/12/2. + */ + +public class CollectionUtils { + + public static Collection minus(Collection lhs, Collection rhs) { + Collection collection = new ArrayList<>(lhs); + lhs.removeAll(rhs); + return collection; + } + +} diff --git a/app/src/main/res/drawable-hdpi/ic_done_all_white_24dp.png b/app/src/main/res/drawable-hdpi/ic_done_all_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..8c83ff91c01a8c8298df10577d710cce90f99929 GIT binary patch literal 275 zcmV+u0qp*XP)8{Ak@VRh%KH&5X7pR&Ys0V@HlSONsykxQLQI%)8g`XNk4_QZ!0L+XG=(a zByT>Hs#E6+VT6@v8!XB&Q+&LL!e9?9rOX5$05`z^^kvKgfD2}dk*p|W&efRlk22jV zjQtsAsF_m%1_K8>(KBO1Qz@nBaV^TUH~{yEV$KtALdq?)DLQx%r&#IXnhMvQR~xK1 zYOSYi1FB$&^C-bdWl%fXq65#MZo+$$L5Z(lKpknMDDl^2;RTN&MoAe>nW>&Z38v0} Z|k0wldT1B8K8v!{z=h{y4_R}8rt40u`}^1XVn zvWkOUU-^j{pVq65HqD1Oi)r3+T*LWdLcQO)Q$gY0SWi# mI0*h{o5b;0Guz~Cq_l|d_dwzLnQwv4VeoYIb6Mw<&;$SqxI>Tt literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/ic_done_all_white_24dp.png b/app/src/main/res/drawable-xhdpi/ic_done_all_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..6ace20eecf0075cb2fe020d91f3290dbc95e6b19 GIT binary patch literal 300 zcmV+{0n`48P) zI}QO+6o>KKDG-mPXgm|ku>uK&P$R~MCQ&JWRm-@Ey4#B$VF)TMF8In=6kA!p{S2$fuJRfXKsI0np;|`+OxM z`DUi`4bK0_?=z9FDe{z9QIELK7zCfI9Fpff;Pg%~2M7_?`5d1A&{+~pgD*>>XPGy~ z7$(7kf}qPSObE*6)!Gu`eZ>9cybz7gM1s5xkuV>ZP~<~IGmhdV05a26EH^Do>3VzkAd1j7p1$9mlKEvS8<$lOjC~rtLv7=+%qJ9CEuV( zSEHe6nx<)*rU}Pk{Y6Ypiv{D#MVl4ZDLH_jM4J@=Hz_$@(l-a-HYLYN+TsB8Q*vOm zgChx2PEAhdcR54lDCd802Fm#nXRVyS!8x)xSu_qEUO1~9dvU}=qQ|CKOfAw=Y|bSgrDIE*M32wXV#(VVG#2;9V!lm^$_XYl#W;baVj;qDlIHu6 z#5f+3ad~;LNU~q_0Fv|rqZUc#y=}0*5fKp)HP1G&I6Iqc zjKz5rgEVtukiIy2Qo_-K;J|?c2M!!K@i?}(lWik$uJ;4aeo|e|;mI*SsV?U@bDX5g zSJ{Te;g>S0!OODIPipkgGo)TTcRZxVWAGnIFqKOr(UM3=(~BhBSvit;g=R?Vjh>M7 zAB+M?!6}eboF615Cqq(m7NiKA4^kA)n-qydL_|cirW>R3em?os7vTT^002ovPDHLk FV1hF8Y9jyu literal 0 HcmV?d00001 diff --git a/app/src/main/res/layout/activity_chapter_list.xml b/app/src/main/res/layout/activity_chapter_list.xml deleted file mode 100644 index 0b0374bf..00000000 --- a/app/src/main/res/layout/activity_chapter_list.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/activity_tag_comic.xml b/app/src/main/res/layout/activity_coordinator.xml similarity index 79% rename from app/src/main/res/layout/activity_tag_comic.xml rename to app/src/main/res/layout/activity_coordinator.xml index 011562eb..2d23381c 100644 --- a/app/src/main/res/layout/activity_tag_comic.xml +++ b/app/src/main/res/layout/activity_coordinator.xml @@ -1,7 +1,8 @@ + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_detail.xml b/app/src/main/res/layout/activity_detail.xml deleted file mode 100644 index dbcc836b..00000000 --- a/app/src/main/res/layout/activity_detail.xml +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/activity_task.xml b/app/src/main/res/layout/activity_task.xml deleted file mode 100644 index 0a434097..00000000 --- a/app/src/main/res/layout/activity_task.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/activtiy_result.xml b/app/src/main/res/layout/activtiy_result.xml deleted file mode 100644 index ef138dcd..00000000 --- a/app/src/main/res/layout/activtiy_result.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - diff --git a/app/src/main/res/layout/dialog_select.xml b/app/src/main/res/layout/dialog_select.xml deleted file mode 100644 index 6aadf899..00000000 --- a/app/src/main/res/layout/dialog_select.xml +++ /dev/null @@ -1,8 +0,0 @@ - - \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_classical.xml b/app/src/main/res/layout/fragment_coordinator.xml similarity index 87% rename from app/src/main/res/layout/fragment_classical.xml rename to app/src/main/res/layout/fragment_coordinator.xml index a58d4d31..d011fb49 100644 --- a/app/src/main/res/layout/fragment_classical.xml +++ b/app/src/main/res/layout/fragment_coordinator.xml @@ -2,10 +2,11 @@ + + + \ 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 e7bb37fc..ecf1fc92 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -15,8 +15,6 @@ 读取最后阅读失败 作者声明 由于应用不够完善,遇到一些不正常的问题属于正常现象!\n使用过程中有什么建议或者遇到什么问题,欢迎邮件反馈!\n电子邮箱:cimoc_app@163.com\n如果问题比较严重,我会尽量在第二时间解决!\n最后,请不要在公开场合传播本应用,谢谢合作! - 更新日志 - v1.4.4\n 权限请求 下载、备份还原与保存图片功能需要访问SD卡的权限!\n请在之后的弹出框中确定授予权限! 授权成功 @@ -38,26 +36,28 @@ 收藏成功 取消收藏成功 标签 - 读取标签失败 - 更新标签成功 - 更新标签失败 请先收藏漫画 下载 读取下载列表失败 - 下载全部 - 已加入下载队列 - 加入下载队列失败 - 选择章节 - 选择标签 - 章节列表 + 标签编辑 + 没有找到标签 + 读取标签失败 + 更新标签成功 + 更新标签失败 + 标签未改变 + + 章节列表 + 全选 + 未选择章节 + 已加入下载队列 + 加入下载队列失败 收藏 历史 下载 过滤 - 过滤失败 - 读取标签失败 + 读取标签失败 标签选择 检查更新 @@ -148,7 +148,7 @@ 恢复成功 恢复失败 - version: 1.4.3.2 + version: 1.4.4.0 源代码 https://github.com/Arachnid-27/Cimoc 支持作者 @@ -165,16 +165,14 @@ 正在检查更新 检查更新失败 打开网页失败 + 更新日志 + v1.4.4\n 操作确认 确定 取消 正在执行中 - 是否删除该图源\n相关的漫画不会被删除 - 添加图源 - 图源已存在 - 添加标签 标签名称不能为空 是否删除标签 @@ -201,10 +199,8 @@ 下载错误 任务列表 读取任务失败 - 找不到索引文件 批量删除 删除所有 - 是否删除下载内容 事件选择 diff --git a/build.gradle b/build.gradle index d286f48c..94ed075c 100644 --- a/build.gradle +++ b/build.gradle @@ -10,7 +10,7 @@ buildscript { // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8' - classpath 'org.greenrobot:greendao-gradle-plugin:3.2.0' + classpath 'org.greenrobot:greendao-gradle-plugin:3.2.1' } } From ac1c8b0a3dc14c104f0adab3d682727af28d8205 Mon Sep 17 00:00:00 2001 From: hiroshi Date: Sun, 4 Dec 2016 23:29:45 +0800 Subject: [PATCH 04/15] =?UTF-8?q?=E4=BF=AE=E6=94=B9=20DialogFragment=20?= =?UTF-8?q?=E5=9B=9E=E8=B0=83=E6=96=B9=E5=BC=8F=20=E4=B8=8B=E8=BD=BD?= =?UTF-8?q?=E6=94=B9=E7=94=A8=20DocumentFile?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/markdown-navigator.xml | 67 ++++++++++ .../markdown-navigator/profiles_settings.xml | 3 + README.md | 2 +- app/src/main/AndroidManifest.xml | 2 +- .../com/hiroshi/cimoc/CimocApplication.java | 15 +++ .../java/com/hiroshi/cimoc/core/Backup.java | 55 +++++---- .../java/com/hiroshi/cimoc/core/Download.java | 87 ++++++++----- .../java/com/hiroshi/cimoc/core/Storage.java | 52 ++++++-- .../java/com/hiroshi/cimoc/core/Update.java | 4 +- .../cimoc/core/manager/ComicManager.java | 10 +- .../cimoc/core/manager/PreferenceManager.java | 4 + .../cimoc/core/manager/TagManager.java | 7 +- .../cimoc/core/manager/TaskManager.java | 4 - .../java/com/hiroshi/cimoc/model/Comic.java | 1 - .../java/com/hiroshi/cimoc/model/Task.java | 29 +++-- .../cimoc/presenter/BackupPresenter.java | 7 +- .../cimoc/presenter/ChapterPresenter.java | 17 ++- .../cimoc/presenter/DetailPresenter.java | 8 +- .../cimoc/presenter/DownloadPresenter.java | 3 +- .../cimoc/presenter/FavoritePresenter.java | 24 +--- .../cimoc/presenter/HistoryPresenter.java | 10 +- ...senter.java => PartFavoritePresenter.java} | 41 +++---- .../cimoc/presenter/ReaderPresenter.java | 7 +- .../cimoc/presenter/TagEditorPresenter.java | 16 +-- .../hiroshi/cimoc/presenter/TagPresenter.java | 12 +- .../java/com/hiroshi/cimoc/rx/RxEvent.java | 5 +- .../cimoc/service/DownloadService.java | 114 ++++++++++-------- .../cimoc/ui/activity/BackupActivity.java | 42 ++++--- .../cimoc/ui/activity/MainActivity.java | 19 ++- ...ctivity.java => PartFavoriteActivity.java} | 67 +++++----- .../cimoc/ui/activity/ReaderActivity.java | 11 +- .../cimoc/ui/activity/SettingsActivity.java | 86 ++++++++----- .../cimoc/ui/activity/TaskActivity.java | 46 ++++--- .../settings/EventSettingsActivity.java | 15 ++- .../cimoc/ui/adapter/PreloadAdapter.java | 4 - .../cimoc/ui/adapter/SourceAdapter.java | 9 -- .../hiroshi/cimoc/ui/adapter/TaskAdapter.java | 9 -- .../cimoc/ui/fragment/ComicFragment.java | 21 ++-- .../cimoc/ui/fragment/SearchFragment.java | 19 ++- .../fragment/config/PageConfigFragment.java | 45 +++---- .../fragment/config/StreamConfigFragment.java | 31 +++-- .../coordinator/CoordinatorFragment.java | 1 - .../fragment/coordinator/SourceFragment.java | 1 + .../ui/fragment/coordinator/TagFragment.java | 57 +++++---- .../coordinator/grid/DownloadFragment.java | 40 +++--- .../coordinator/grid/FavoriteFragment.java | 38 +++--- .../coordinator/grid/GridFragment.java | 2 +- .../coordinator/grid/HistoryFragment.java | 34 +++--- .../fragment/dialog/ChoiceDialogFragment.java | 58 ++++----- .../fragment/dialog/EditorDialogFragment.java | 45 +++---- .../fragment/dialog/ItemDialogFragment.java | 34 +++--- .../dialog/MessageDialogFragment.java | 50 +++----- .../fragment/dialog/MultiDialogFragment.java | 42 +++---- .../fragment/dialog/SliderDialogFragment.java | 52 ++++---- .../com/hiroshi/cimoc/ui/view/BackupView.java | 2 +- .../com/hiroshi/cimoc/ui/view/ComicView.java | 2 +- .../com/hiroshi/cimoc/ui/view/DialogView.java | 24 ++++ .../hiroshi/cimoc/ui/view/DownloadView.java | 2 +- .../com/hiroshi/cimoc/ui/view/GridView.java | 2 +- .../com/hiroshi/cimoc/ui/view/MainView.java | 2 +- ...agComicView.java => PartFavoriteView.java} | 8 +- .../com/hiroshi/cimoc/ui/view/SearchView.java | 2 +- .../hiroshi/cimoc/ui/view/SettingsView.java | 2 +- .../com/hiroshi/cimoc/ui/view/TagView.java | 4 +- .../com/hiroshi/cimoc/ui/view/TaskView.java | 2 +- .../hiroshi/cimoc/utils/DocumentUtils.java | 110 +++++++++++++++++ .../com/hiroshi/cimoc/utils/FileUtils.java | 52 -------- .../cimoc/utils/NotificationUtils.java | 4 + .../com/hiroshi/cimoc/utils/ServiceUtils.java | 29 +++++ .../res/layout/activity_part_favorite.xml | 33 +++++ 70 files changed, 1035 insertions(+), 729 deletions(-) create mode 100644 .idea/markdown-navigator.xml create mode 100644 .idea/markdown-navigator/profiles_settings.xml rename app/src/main/java/com/hiroshi/cimoc/presenter/{TagComicPresenter.java => PartFavoritePresenter.java} (80%) rename app/src/main/java/com/hiroshi/cimoc/ui/activity/{TagComicActivity.java => PartFavoriteActivity.java} (70%) create mode 100644 app/src/main/java/com/hiroshi/cimoc/ui/view/DialogView.java rename app/src/main/java/com/hiroshi/cimoc/ui/view/{TagComicView.java => PartFavoriteView.java} (64%) create mode 100644 app/src/main/java/com/hiroshi/cimoc/utils/DocumentUtils.java create mode 100644 app/src/main/java/com/hiroshi/cimoc/utils/ServiceUtils.java create mode 100644 app/src/main/res/layout/activity_part_favorite.xml diff --git a/.idea/markdown-navigator.xml b/.idea/markdown-navigator.xml new file mode 100644 index 00000000..d327c939 --- /dev/null +++ b/.idea/markdown-navigator.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/markdown-navigator/profiles_settings.xml b/.idea/markdown-navigator/profiles_settings.xml new file mode 100644 index 00000000..674a5916 --- /dev/null +++ b/.idea/markdown-navigator/profiles_settings.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/README.md b/README.md index 4ca6fc3b..279e014f 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,7 @@ Online manga reader based on Android - [57漫画](http://m.57mh.com) # 可添加图源 -- IKanman、DMZJ、HHAAZZ、CCTuku、U17、DM5、Webtoon、HHSSEE、57MH +- IKanman、DMZJ、HHAAZZ、CCTuku、U17、DM5、Webtoon、HHSSEE、57MH、Chuiyao # 感谢以下的开源项目及作者 - [Android Open Source Project](http://source.android.com/) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index c2239f91..ae8a585a 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -60,7 +60,7 @@ android:screenOrientation="portrait"/> load(final String... suffix) { return Observable.create(new Observable.OnSubscribe() { @Override public void call(Subscriber subscriber) { - String[] files = FileUtils.listFilesNameHaveSuffix(FileUtils.getPath(Storage.STORAGE_DIR, FOLDER_NAME), suffix); + String[] files = FileUtils.listFilesNameHaveSuffix(FileUtils.getPath(Storage.STORAGE_DIR, BACKUP), suffix); if (files != null) { Arrays.sort(files); if (files.length == 0) { @@ -84,48 +88,51 @@ public void call(Subscriber subscriber) { }).subscribeOn(Schedulers.io()); } - public static Observable saveFavorite(final List list) { + public static Observable saveFavorite(final ContentResolver resolver, final DocumentFile root, final List list) { return Observable.create(new Observable.OnSubscribe() { @Override public void call(Subscriber subscriber) { try { - JSONObject result = new JSONObject(); - result.put(JSON_KEY_VERSION, 1); - result.put(JSON_KEY_COMIC_ARRAY, buildComicArray(list)); - String filename = StringUtils.getDateStringWithSuffix(SUFFIX_CFBF); - String path = FileUtils.getPath(Storage.STORAGE_DIR, FOLDER_NAME); - if (FileUtils.writeStringToFile(path, filename, result.toString())) { + DocumentFile dir = DocumentUtils.getOrCreateSubDirectory(root, BACKUP); + if (dir != null) { + JSONObject result = new JSONObject(); + result.put(JSON_KEY_VERSION, 1); + result.put(JSON_KEY_COMIC_ARRAY, buildComicArray(list)); + String filename = StringUtils.getDateStringWithSuffix(SUFFIX_CFBF); + DocumentFile file = dir.createFile("", filename); + DocumentUtils.writeStringToFile(resolver, file, result.toString()); subscriber.onNext(list.size()); subscriber.onCompleted(); - } else { - subscriber.onError(new Exception()); } } catch (Exception e) { - subscriber.onError(e); + e.printStackTrace(); } + subscriber.onError(new Exception()); } }).subscribeOn(Schedulers.io()); } - public static Observable saveTag(final Tag tag, final List list) { + public static Observable saveTag(final ContentResolver resolver, final DocumentFile root, final Tag tag, final List list) { return Observable.create(new Observable.OnSubscribe() { @Override public void call(Subscriber subscriber) { try { - JSONObject result = new JSONObject(); - result.put(JSON_KEY_VERSION, 1); - result.put(JSON_KEY_TAG_OBJECT, buildTagObject(tag)); - result.put(JSON_KEY_COMIC_ARRAY, buildComicArray(list)); - String filename = tag.getTitle().concat(".").concat(SUFFIX_CTBF); - if (FileUtils.writeStringToFile(FileUtils.getPath(Storage.STORAGE_DIR, FOLDER_NAME), filename, result.toString())) { + DocumentFile dir = DocumentUtils.getOrCreateSubDirectory(root, BACKUP); + if (dir != null) { + JSONObject result = new JSONObject(); + result.put(JSON_KEY_VERSION, 1); + result.put(JSON_KEY_TAG_OBJECT, buildTagObject(tag)); + result.put(JSON_KEY_COMIC_ARRAY, buildComicArray(list)); + String filename = tag.getTitle().concat(".").concat(SUFFIX_CTBF); + DocumentFile file = dir.createFile("", filename); + DocumentUtils.writeStringToFile(resolver, file, result.toString()); subscriber.onNext(list.size()); subscriber.onCompleted(); - } else { - subscriber.onError(new Exception()); } } catch (Exception e) { - subscriber.onError(e); + e.printStackTrace(); } + subscriber.onError(new Exception()); } }).subscribeOn(Schedulers.io()); } @@ -158,7 +165,7 @@ public static Observable restoreTag(final String filename) { @Override public void call(Subscriber subscriber) { try { - String json = FileUtils.readSingleLineFromFile(FileUtils.getPath(Storage.STORAGE_DIR, FOLDER_NAME), filename); + String json = FileUtils.readSingleLineFromFile(FileUtils.getPath(Storage.STORAGE_DIR, BACKUP), filename); JSONObject object = new JSONObject(json); List list = loadComicArray(object.getJSONArray(JSON_KEY_COMIC_ARRAY), SUFFIX_CTBF); subscriber.onNext(new RxObject(object.getJSONObject(JSON_KEY_TAG_OBJECT).getString(JSON_KEY_TAG_TITLE), list)); @@ -175,7 +182,7 @@ public static Observable> restoreFavorite(final String filename) { @Override public void call(Subscriber> subscriber) { try { - String json = FileUtils.readSingleLineFromFile(FileUtils.getPath(Storage.STORAGE_DIR, FOLDER_NAME), filename); + String json = FileUtils.readSingleLineFromFile(FileUtils.getPath(Storage.STORAGE_DIR, BACKUP), filename); List list = new LinkedList<>(); if (filename.endsWith(SUFFIX_CIMOC)) { list.addAll(loadComicArray(new JSONArray(json), SUFFIX_CIMOC)); diff --git a/app/src/main/java/com/hiroshi/cimoc/core/Download.java b/app/src/main/java/com/hiroshi/cimoc/core/Download.java index b3751108..9e589b07 100644 --- a/app/src/main/java/com/hiroshi/cimoc/core/Download.java +++ b/app/src/main/java/com/hiroshi/cimoc/core/Download.java @@ -1,9 +1,14 @@ package com.hiroshi.cimoc.core; +import android.content.ContentResolver; +import android.support.v4.provider.DocumentFile; + import com.hiroshi.cimoc.core.manager.SourceManager; import com.hiroshi.cimoc.model.Chapter; import com.hiroshi.cimoc.model.Comic; import com.hiroshi.cimoc.model.ImageUrl; +import com.hiroshi.cimoc.model.Task; +import com.hiroshi.cimoc.utils.DocumentUtils; import com.hiroshi.cimoc.utils.FileUtils; import org.json.JSONArray; @@ -23,24 +28,35 @@ */ public class Download { - public static Observable updateComicIndex(final List list, Comic comic) { - final int source = comic.getSource(); - final String cid = comic.getCid(); - final String title = comic.getTitle(); - final String cover = comic.getCover(); + private static final String DOWNLOAD = "download"; + private static final String COMIC_INDEX = "index.cdif"; + private static final String NO_MEDIA = ".nomedia"; + + private static void createNoMedia(DocumentFile root) { + DocumentFile home = DocumentUtils.getOrCreateSubDirectory(root, DOWNLOAD); + DocumentUtils.createFile(home, "", NO_MEDIA); + } + + private static DocumentFile createComicIndex(DocumentFile root, Comic comic) { + DocumentFile source = DocumentUtils.getOrCreateSubDirectory(root, String.valueOf(comic.getSource())); + DocumentFile dir = DocumentUtils.getOrCreateSubDirectory(source, comic.getCid()); + if (dir != null) { + return dir.createFile("", COMIC_INDEX); + } + return null; + } + + public static Observable updateComicIndex(final ContentResolver resolver, final DocumentFile root, final List list, final Comic comic) { return Observable.create(new Observable.OnSubscribe() { @Override public void call(Subscriber subscriber) { try { - FileUtils.createFile(FileUtils.getPath(Storage.STORAGE_DIR, "download"), ".nomedia"); - String jsonString = writeComicToJson(list, source, cid, title, cover); - String dir = buildPath(source, title); - if (FileUtils.writeStringToFile(dir, "index.cdif", "cimoc".concat(jsonString))) { - subscriber.onNext(null); - subscriber.onCompleted(); - } else { - subscriber.onError(new Exception()); - } + createNoMedia(root); + String jsonString = getJsonFromComic(list, comic); + DocumentFile file = createComicIndex(root, comic); + DocumentUtils.writeStringToFile(resolver, file, "cimoc".concat(jsonString)); + subscriber.onNext(null); + subscriber.onCompleted(); } catch (Exception e) { subscriber.onError(new Exception()); } @@ -48,14 +64,14 @@ public void call(Subscriber subscriber) { }).observeOn(Schedulers.io()); } - private static String writeComicToJson(List list, int source, String cid, String title, String cover) throws JSONException { + private static String getJsonFromComic(List list, Comic comic) throws JSONException { JSONObject object = new JSONObject(); object.put("version", "1"); object.put("type", "comic"); - object.put("source", source); - object.put("cid", cid); - object.put("title", title); - object.put("cover", cover); + object.put("source", comic.getSource()); + object.put("cid", comic.getCid()); + object.put("title", comic.getTitle()); + object.put("cover", comic.getCover()); JSONArray array = new JSONArray(); for (Chapter chapter : list) { JSONObject temp = new JSONObject(); @@ -63,11 +79,28 @@ private static String writeComicToJson(List list, int source, String ci temp.put("path", chapter.getPath()); array.put(temp); } - object.put("listInRx", array); + object.put("list", array); return object.toString(); } - private static String writeChapterToJson(String title, String path) throws JSONException { + public static DocumentFile updateChapterIndex(ContentResolver resolver, DocumentFile root, Task task) { + try { + String jsonString = getJsonFromChapter(task.getTitle(), task.getPath()); + DocumentFile dir1 = DocumentUtils.getOrCreateSubDirectory(root, String.valueOf(task.getSource())); + DocumentFile dir2 = DocumentUtils.getOrCreateSubDirectory(dir1, task.getCid()); + DocumentFile dir3 = DocumentUtils.getOrCreateSubDirectory(dir2, task.getPath()); + if (dir3 != null) { + DocumentFile file = dir3.createFile("", COMIC_INDEX); + DocumentUtils.writeStringToFile(resolver, file, "cimoc".concat(jsonString)); + return dir3; + } + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + private static String getJsonFromChapter(String title, String path) throws JSONException { JSONObject object = new JSONObject(); object.put("version", "1"); object.put("type", "chapter"); @@ -76,16 +109,6 @@ private static String writeChapterToJson(String title, String path) throws JSONE return object.toString(); } - public static boolean updateChapterIndex(int source, String comic, String title, String path) { - try { - String jsonString = writeChapterToJson(title, path); - String dir = buildPath(source, comic, title); - return FileUtils.writeStringToFile(dir, "index.cdif", "cimoc".concat(jsonString)); - } catch (JSONException e) { - return false; - } - } - public static List getComicIndex(final int source, final String comic) { String dir = buildPath(source, comic); char[] magic = FileUtils.readCharFromFile(dir, "index.cdif", 5); @@ -105,7 +128,7 @@ public static List getComicIndex(final int source, final String comic) { private static List readPathFromJson(String jsonString) throws JSONException { JSONObject jsonObject = new JSONObject(jsonString); // We use "c" as the key in old version - JSONArray array = jsonObject.has("listInRx") ? jsonObject.getJSONArray("listInRx") : jsonObject.getJSONArray("c"); + JSONArray array = jsonObject.has("list") ? jsonObject.getJSONArray("list") : jsonObject.getJSONArray("c"); int size = array.length(); List list = new ArrayList<>(size); for (int i = 0; i != size; ++i) { diff --git a/app/src/main/java/com/hiroshi/cimoc/core/Storage.java b/app/src/main/java/com/hiroshi/cimoc/core/Storage.java index 8db493c3..1f6b5e27 100644 --- a/app/src/main/java/com/hiroshi/cimoc/core/Storage.java +++ b/app/src/main/java/com/hiroshi/cimoc/core/Storage.java @@ -1,8 +1,18 @@ package com.hiroshi.cimoc.core; +import android.content.ContentResolver; +import android.content.Context; +import android.net.Uri; +import android.os.Environment; +import android.support.v4.provider.DocumentFile; + +import com.hiroshi.cimoc.CimocApplication; +import com.hiroshi.cimoc.utils.DocumentUtils; import com.hiroshi.cimoc.utils.FileUtils; import com.hiroshi.cimoc.utils.StringUtils; +import java.io.File; +import java.io.IOException; import java.io.InputStream; import rx.Observable; @@ -16,6 +26,18 @@ public class Storage { public static String STORAGE_DIR; + public static String PICTURE = "picture"; + + public static DocumentFile getRootDocumentFile(Context context) { + String uri = CimocApplication.getStorageUri(); + if (uri == null) { + return DocumentFile.fromFile(new File(FileUtils.getPath(Environment.getExternalStorageDirectory().getAbsolutePath(), "Cimoc"))); + } else if (uri.startsWith("content")) { + return DocumentFile.fromTreeUri(context, Uri.parse(uri)); + } else { + return DocumentFile.fromFile(new File(Uri.parse(uri).getPath())); + } + } public static Observable moveFolder(final String path) { return Observable.create(new Observable.OnSubscribe() { @@ -38,18 +60,32 @@ public void call(Subscriber subscriber) { }).subscribeOn(Schedulers.io()); } - public static Observable savePicture(final InputStream inputStream, final String suffix) { + private static String buildFileName(String filename) { + String suffix = StringUtils.split(filename, "\\.", -1); + if (suffix == null) { + suffix = "jpg"; + } else { + suffix = suffix.split("\\?")[0]; + } + return StringUtils.getDateStringWithSuffix(suffix); + } + + public static Observable savePicture(final ContentResolver resolver, final DocumentFile root, final InputStream stream, final String url) { return Observable.create(new Observable.OnSubscribe() { @Override public void call(Subscriber subscriber) { - String filename = StringUtils.getDateStringWithSuffix(suffix); - String path = FileUtils.getPath(STORAGE_DIR, "picture", filename); - if (FileUtils.writeBinaryToFile(FileUtils.getPath(STORAGE_DIR, "picture"), filename, inputStream)) { - subscriber.onNext(path); - subscriber.onCompleted(); - } else { - subscriber.onError(new Exception()); + try { + DocumentFile dir = DocumentUtils.getOrCreateSubDirectory(root, PICTURE); + if (dir != null) { + DocumentFile file = dir.createFile("image/jpeg", buildFileName(url)); + DocumentUtils.writeBinaryToFile(resolver, file, stream); + subscriber.onNext(file.getUri().getPath()); // Todo 需要改 + subscriber.onCompleted(); + } + } catch (IOException e) { + e.printStackTrace(); } + subscriber.onError(new Exception()); } }).subscribeOn(Schedulers.io()); } diff --git a/app/src/main/java/com/hiroshi/cimoc/core/Update.java b/app/src/main/java/com/hiroshi/cimoc/core/Update.java index 015f8079..ceae3c33 100644 --- a/app/src/main/java/com/hiroshi/cimoc/core/Update.java +++ b/app/src/main/java/com/hiroshi/cimoc/core/Update.java @@ -20,14 +20,14 @@ public static Observable check() { return Observable.create(new Observable.OnSubscribe() { @Override public void call(Subscriber subscriber) { - String url = "http://pan.baidu.com/share/listInRx?uk=223062232&shareid=2388458898&dir=/update"; + String url = "http://pan.baidu.com/share/list?uk=223062232&shareid=2388458898&dir=/update"; OkHttpClient client = CimocApplication.getHttpClient(); Request request = new Request.Builder().url(url).build(); try { Response response = client.newCall(request).execute(); if (response.isSuccessful()) { String json = response.body().string(); - JSONObject object = new JSONObject(json).getJSONArray("listInRx").getJSONObject(0); + JSONObject object = new JSONObject(json).getJSONArray("list").getJSONObject(0); String version = object.getString("server_filename"); subscriber.onNext(version); } else { diff --git a/app/src/main/java/com/hiroshi/cimoc/core/manager/ComicManager.java b/app/src/main/java/com/hiroshi/cimoc/core/manager/ComicManager.java index 43e53d47..439fcb52 100644 --- a/app/src/main/java/com/hiroshi/cimoc/core/manager/ComicManager.java +++ b/app/src/main/java/com/hiroshi/cimoc/core/manager/ComicManager.java @@ -5,7 +5,6 @@ import com.hiroshi.cimoc.model.ComicDao; import com.hiroshi.cimoc.model.ComicDao.Properties; -import java.util.Collection; import java.util.List; import java.util.concurrent.Callable; @@ -107,6 +106,15 @@ public void update(Comic comic) { mComicDao.update(comic); } + public void updateOrDelete(Comic comic) { + if (comic.getFavorite() == null && comic.getHistory() == null && comic.getDownload() == null) { + mComicDao.delete(comic); + comic.setId(null); + } else { + update(comic); + } + } + public void delete(Comic comic) { if (comic.getFavorite() == null && comic.getHistory() == null && comic.getDownload() == null) { mComicDao.delete(comic); diff --git a/app/src/main/java/com/hiroshi/cimoc/core/manager/PreferenceManager.java b/app/src/main/java/com/hiroshi/cimoc/core/manager/PreferenceManager.java index f6fa8814..4df8f602 100644 --- a/app/src/main/java/com/hiroshi/cimoc/core/manager/PreferenceManager.java +++ b/app/src/main/java/com/hiroshi/cimoc/core/manager/PreferenceManager.java @@ -83,6 +83,10 @@ public PreferenceManager(Context context) { mSharedPreferences = context.getSharedPreferences(PREFERENCES_NAME, Context.MODE_PRIVATE); } + public String getString(String key) { + return getString(key, null); + } + public String getString(String key, String defValue) { return mSharedPreferences.getString(key, defValue); } diff --git a/app/src/main/java/com/hiroshi/cimoc/core/manager/TagManager.java b/app/src/main/java/com/hiroshi/cimoc/core/manager/TagManager.java index 9b9f3ba7..df7ff96a 100644 --- a/app/src/main/java/com/hiroshi/cimoc/core/manager/TagManager.java +++ b/app/src/main/java/com/hiroshi/cimoc/core/manager/TagManager.java @@ -67,15 +67,16 @@ public TagRef load(long tid, long cid) { .unique(); } - public long insert(Tag tag) { - return mTagDao.insert(tag); + public void insert(Tag tag) { + long id = mTagDao.insert(tag); + tag.setId(id); } public long insert(TagRef ref) { return mRefDao.insert(ref); } - public void insert(Iterable entities) { + public void insertInTx(Iterable entities) { mRefDao.insertInTx(entities); } diff --git a/app/src/main/java/com/hiroshi/cimoc/core/manager/TaskManager.java b/app/src/main/java/com/hiroshi/cimoc/core/manager/TaskManager.java index 61517d42..a01f6437 100644 --- a/app/src/main/java/com/hiroshi/cimoc/core/manager/TaskManager.java +++ b/app/src/main/java/com/hiroshi/cimoc/core/manager/TaskManager.java @@ -55,10 +55,6 @@ public void deleteInTx(Iterable entities) { mTaskDao.deleteInTx(entities); } - public void deleteByKeyInTx(Iterable keys) { - mTaskDao.deleteByKeyInTx(keys); - } - public static TaskManager getInstance() { if (mTaskManager == null) { mTaskManager = new TaskManager(); diff --git a/app/src/main/java/com/hiroshi/cimoc/model/Comic.java b/app/src/main/java/com/hiroshi/cimoc/model/Comic.java index e794cef7..b3349a19 100644 --- a/app/src/main/java/com/hiroshi/cimoc/model/Comic.java +++ b/app/src/main/java/com/hiroshi/cimoc/model/Comic.java @@ -65,7 +65,6 @@ public Comic(Long id, int source, @NotNull String cid, @NotNull String title, @N @Generated(hash = 1347984162) public Comic() { } - @Override public boolean equals(Object o) { diff --git a/app/src/main/java/com/hiroshi/cimoc/model/Task.java b/app/src/main/java/com/hiroshi/cimoc/model/Task.java index 74a8223d..eeab040a 100644 --- a/app/src/main/java/com/hiroshi/cimoc/model/Task.java +++ b/app/src/main/java/com/hiroshi/cimoc/model/Task.java @@ -28,10 +28,10 @@ public class Task implements Parcelable { @NotNull private String title; @NotNull private int progress; @NotNull private int max; + private String uri; @Transient private int source; @Transient private String cid; - @Transient private String comic; @Transient private int state; public Task(Parcel source) { @@ -43,19 +43,19 @@ public Task(Parcel source) { this.max = source.readInt(); this.source = source.readInt(); this.cid = source.readString(); - this.comic = source.readString(); this.state = source.readInt(); } - @Generated(hash = 1668809946) + @Generated(hash = 1827750566) public Task(Long id, long key, @NotNull String path, @NotNull String title, int progress, - int max) { + int max, String uri) { this.id = id; this.key = key; this.path = path; this.title = title; this.progress = progress; this.max = max; + this.uri = uri; } @Generated(hash = 733837707) @@ -120,6 +120,14 @@ public void setMax(int max) { this.max = max; } + public String getUri() { + return this.uri; + } + + public void setUri(String uri) { + this.uri = uri; + } + public int getState() { return this.state; } @@ -132,18 +140,16 @@ public int getSource() { return this.source; } - public String getCid() { - return cid; + public void setSource(int source) { + this.source = source; } - public String getComic() { - return comic; + public String getCid() { + return cid; } - public void setInfo(int source, String cid, String comic) { - this.source = source; + public void setCid(String cid) { this.cid = cid; - this.comic = comic; } public boolean isFinish() { @@ -165,7 +171,6 @@ public void writeToParcel(Parcel dest, int flags) { dest.writeInt(max); dest.writeInt(source); dest.writeString(cid); - dest.writeString(comic); dest.writeInt(state); } diff --git a/app/src/main/java/com/hiroshi/cimoc/presenter/BackupPresenter.java b/app/src/main/java/com/hiroshi/cimoc/presenter/BackupPresenter.java index 959e8944..bad5f35b 100644 --- a/app/src/main/java/com/hiroshi/cimoc/presenter/BackupPresenter.java +++ b/app/src/main/java/com/hiroshi/cimoc/presenter/BackupPresenter.java @@ -207,8 +207,7 @@ public RxObject call() throws Exception { if (tag == null) { insert = true; tag = new Tag(null, title); - long tid = mTagManager.insert(tag); - tag.setId(tid); + mTagManager.insert(tag); } List list = (List) object.getData(1); @@ -242,10 +241,6 @@ public RxObject call() throws Exception { .subscribe(new Action1() { @Override public void call(RxObject object) { - Object tag = object.getData(); - if (tag != null) { - RxBus.getInstance().post(new RxEvent(RxEvent.EVENT_TAG_INSERT, tag)); - } List list = (List) object.getData(1); RxBus.getInstance().post(new RxEvent(RxEvent.EVENT_COMIC_FAVORITE_RESTORE, list)); mBaseView.onBackupRestoreSuccess(); diff --git a/app/src/main/java/com/hiroshi/cimoc/presenter/ChapterPresenter.java b/app/src/main/java/com/hiroshi/cimoc/presenter/ChapterPresenter.java index 01941041..16a1cfaa 100644 --- a/app/src/main/java/com/hiroshi/cimoc/presenter/ChapterPresenter.java +++ b/app/src/main/java/com/hiroshi/cimoc/presenter/ChapterPresenter.java @@ -1,5 +1,8 @@ package com.hiroshi.cimoc.presenter; +import android.content.ContentResolver; +import android.support.v4.provider.DocumentFile; + import com.hiroshi.cimoc.core.Download; import com.hiroshi.cimoc.core.manager.ComicManager; import com.hiroshi.cimoc.core.manager.TaskManager; @@ -39,8 +42,13 @@ public void load(long id) { mComic = mComicManager.load(id); } - public void addTask(List cList, final List dList) { - mCompositeSubscription.add(Download.updateComicIndex(cList, mComic) + /** + * 添加任务到数据库 + * @param cList 所有章节列表,用于写索引文件 + * @param dList 下载章节列表 + */ + public void addTask(ContentResolver resolver, DocumentFile root, List cList, final List dList) { + mCompositeSubscription.add(Download.updateComicIndex(resolver, root, cList, mComic) .flatMap(new Func1>>() { @Override public Observable> call(Void v) { @@ -52,10 +60,11 @@ public ArrayList call() throws Exception { mComicManager.updateOrInsert(mComic); ArrayList result = new ArrayList<>(); for (Chapter chapter : dList) { - Task task = new Task(null, key, chapter.getPath(), chapter.getTitle(), 0, 0); + Task task = new Task(null, key, chapter.getPath(), chapter.getTitle(), 0, 0, null); long id = mTaskManager.insert(task); task.setId(id); - task.setInfo(mComic.getSource(), mComic.getCid(), mComic.getTitle()); + task.setSource(mComic.getSource()); + task.setCid(mComic.getCid()); task.setState(Task.STATE_WAIT); result.add(task); } diff --git a/app/src/main/java/com/hiroshi/cimoc/presenter/DetailPresenter.java b/app/src/main/java/com/hiroshi/cimoc/presenter/DetailPresenter.java index a0527358..72518d87 100644 --- a/app/src/main/java/com/hiroshi/cimoc/presenter/DetailPresenter.java +++ b/app/src/main/java/com/hiroshi/cimoc/presenter/DetailPresenter.java @@ -54,13 +54,13 @@ public void call(RxEvent rxEvent) { public void loadDetail(int source, String cid) { mComic = mComicManager.loadOrCreate(source, cid); - updateHighlight(); + cancelHighlight(); loadDetail(); } public void loadDetail(long id) { mComic = mComicManager.load(id); - updateHighlight(); + cancelHighlight(); loadDetail(); } @@ -105,7 +105,7 @@ public void call(Throwable throwable) { })); } - private void updateHighlight() { + private void cancelHighlight() { if (mComic.getHighlight()) { mComic.setHighlight(false); mComic.setFavorite(System.currentTimeMillis()); @@ -170,7 +170,7 @@ private void unfavoriteComic() { long id = mComic.getId(); mComic.setFavorite(null); mTagManager.deleteByComic(id); - mComicManager.delete(mComic); + mComicManager.updateOrDelete(mComic); RxBus.getInstance().post(new RxEvent(RxEvent.EVENT_COMIC_UNFAVORITE, id)); mBaseView.onUnfavoriteSuccess(); } diff --git a/app/src/main/java/com/hiroshi/cimoc/presenter/DownloadPresenter.java b/app/src/main/java/com/hiroshi/cimoc/presenter/DownloadPresenter.java index 3a0f9122..cf207ee1 100644 --- a/app/src/main/java/com/hiroshi/cimoc/presenter/DownloadPresenter.java +++ b/app/src/main/java/com/hiroshi/cimoc/presenter/DownloadPresenter.java @@ -81,12 +81,11 @@ public void call(Subscriber subscriber) { .subscribe(new Action1() { @Override public void call(Void v) { - mBaseView.onDownloadDeleteSuccess(); + mBaseView.onDownloadDeleteSuccess(id); } }, new Action1() { @Override public void call(Throwable throwable) { - throwable.printStackTrace(); mBaseView.onDownloadDeleteFail(); } })); diff --git a/app/src/main/java/com/hiroshi/cimoc/presenter/FavoritePresenter.java b/app/src/main/java/com/hiroshi/cimoc/presenter/FavoritePresenter.java index 6e4a63eb..9dfcbf60 100644 --- a/app/src/main/java/com/hiroshi/cimoc/presenter/FavoritePresenter.java +++ b/app/src/main/java/com/hiroshi/cimoc/presenter/FavoritePresenter.java @@ -1,7 +1,5 @@ package com.hiroshi.cimoc.presenter; -import android.support.v4.util.LongSparseArray; - import com.hiroshi.cimoc.core.Manga; import com.hiroshi.cimoc.core.manager.ComicManager; import com.hiroshi.cimoc.model.Comic; @@ -25,11 +23,9 @@ public class FavoritePresenter extends BasePresenter { private ComicManager mComicManager; - private LongSparseArray mComicArray; public FavoritePresenter() { mComicManager = ComicManager.getInstance(); - mComicArray = new LongSparseArray<>(); } @SuppressWarnings("unchecked") @@ -40,25 +36,19 @@ protected void initSubscription() { @Override public void call(RxEvent rxEvent) { MiniComic comic = (MiniComic) rxEvent.getData(); - mComicArray.put(comic.getId(), comic); mBaseView.OnComicFavorite(comic); } }); addSubscription(RxEvent.EVENT_COMIC_UNFAVORITE, new Action1() { @Override public void call(RxEvent rxEvent) { - long id = (long) rxEvent.getData(); - mComicArray.remove(id); - mBaseView.OnComicUnFavorite(id); + mBaseView.OnComicUnFavorite((long) rxEvent.getData()); } }); addSubscription(RxEvent.EVENT_COMIC_FAVORITE_RESTORE, new Action1() { @Override public void call(RxEvent rxEvent) { List list = (List) rxEvent.getData(); - for (MiniComic comic : list) { - mComicArray.put(comic.getId(), comic); - } mBaseView.OnComicRestore(list); } }); @@ -67,21 +57,18 @@ public void call(RxEvent rxEvent) { public void call(RxEvent rxEvent) { if ((boolean) rxEvent.getData(1)) { MiniComic comic = (MiniComic) rxEvent.getData(); - mComicArray.put(comic.getId(), comic); mBaseView.onComicRead(comic); } } }); } - public void loadComic() { + public void load() { mCompositeSubscription.add(mComicManager.listFavoriteInRx() .compose(new ToAnotherList<>(new Func1() { @Override public MiniComic call(Comic comic) { - MiniComic ret = new MiniComic(comic); - mComicArray.put(ret.getId(), ret); - return ret; + return new MiniComic(comic); } })) .observeOn(AndroidSchedulers.mainThread()) @@ -132,9 +119,8 @@ public void onNext(RxObject object) { if (object.getData() == null) { mBaseView.onComicCheckSuccess(null, (int) object.getData(1), (int) object.getData(2)); } else { - long id = ((Comic) object.getData()).getId(); - mComicArray.get(id).setHighlight(true); - mBaseView.onComicCheckSuccess(mComicArray.get(id), (int) object.getData(1), (int) object.getData(2)); + Comic comic = (Comic) object.getData(); + mBaseView.onComicCheckSuccess(new MiniComic(comic), (int) object.getData(1), (int) object.getData(2)); } } })); diff --git a/app/src/main/java/com/hiroshi/cimoc/presenter/HistoryPresenter.java b/app/src/main/java/com/hiroshi/cimoc/presenter/HistoryPresenter.java index 7a4c8efb..2ec669f8 100644 --- a/app/src/main/java/com/hiroshi/cimoc/presenter/HistoryPresenter.java +++ b/app/src/main/java/com/hiroshi/cimoc/presenter/HistoryPresenter.java @@ -36,7 +36,7 @@ public void call(RxEvent rxEvent) { }); } - public void loadComic() { + public void load() { mCompositeSubscription.add(mComicManager.listHistoryInRx() .compose(new ToAnotherList<>(new Func1() { @Override @@ -60,12 +60,8 @@ public void call(Throwable throwable) { public void delete(MiniComic history) { Comic comic = mComicManager.load(history.getId()); - if (comic.getFavorite() == null && comic.getDownload() == null) { - mComicManager.delete(comic); - } else { - comic.setHistory(null); - mComicManager.update(comic); - } + comic.setHistory(null); + mComicManager.updateOrDelete(comic); } public void clear() { diff --git a/app/src/main/java/com/hiroshi/cimoc/presenter/TagComicPresenter.java b/app/src/main/java/com/hiroshi/cimoc/presenter/PartFavoritePresenter.java similarity index 80% rename from app/src/main/java/com/hiroshi/cimoc/presenter/TagComicPresenter.java rename to app/src/main/java/com/hiroshi/cimoc/presenter/PartFavoritePresenter.java index 84e1b857..a255a32a 100644 --- a/app/src/main/java/com/hiroshi/cimoc/presenter/TagComicPresenter.java +++ b/app/src/main/java/com/hiroshi/cimoc/presenter/PartFavoritePresenter.java @@ -9,7 +9,7 @@ import com.hiroshi.cimoc.model.Tag; import com.hiroshi.cimoc.model.TagRef; import com.hiroshi.cimoc.rx.RxEvent; -import com.hiroshi.cimoc.ui.view.TagComicView; +import com.hiroshi.cimoc.ui.view.PartFavoriteView; import java.util.ArrayList; import java.util.HashSet; @@ -27,14 +27,14 @@ * Created by Hiroshi on 2016/10/11. */ -public class TagComicPresenter extends BasePresenter { +public class PartFavoritePresenter extends BasePresenter { private ComicManager mComicManager; private TagManager mTagManager; private Tag mTag; private LongSparseArray mComicArray; - public TagComicPresenter() { + public PartFavoritePresenter() { mComicManager = ComicManager.getInstance(); mTagManager = TagManager.getInstance(); } @@ -45,32 +45,29 @@ protected void initSubscription() { addSubscription(RxEvent.EVENT_COMIC_UNFAVORITE, new Action1() { @Override public void call(RxEvent rxEvent) { - mBaseView.onComicUnFavorite((long) rxEvent.getData()); - } - }); - addSubscription(RxEvent.EVENT_COMIC_FAVORITE, new Action1() { - @Override - public void call(RxEvent rxEvent) { - mComicArray.remove(((MiniComic) rxEvent.getData()).getId()); + mBaseView.onComicRemove((long) rxEvent.getData()); } }); addSubscription(RxEvent.EVENT_TAG_UPDATE, new Action1() { @Override public void call(RxEvent rxEvent) { - // Todo - MiniComic comic = (MiniComic) rxEvent.getData(); - if (mComicArray.get(comic.getId()) != null) { - mComicArray.remove(comic.getId()); - mBaseView.onTagComicInsert(comic); - } else { - mComicArray.put(comic.getId(), comic); - mBaseView.onTagComicDelete(comic); + long id = (long) rxEvent.getData(); + List dList = (List) rxEvent.getData(1); + List iList = (List) rxEvent.getData(2); + if (dList.contains(mTag.getId())) { + MiniComic comic = new MiniComic(mComicManager.load(id)); + mComicArray.put(id, comic); + mBaseView.onComicRemove(id); + } else if (iList.contains(mTag.getId())) { + MiniComic comic = mComicArray.get(id); + mComicArray.remove(id); + mBaseView.onComicAdd(comic); } } }); } - public void loadTagComic(long id, String title) { + public void load(long id, String title) { mTag = new Tag(id, title); mCompositeSubscription.add(mTagManager.listByTag(id) .flatMap(new Func1, Observable>>() { @@ -124,10 +121,6 @@ public List getComicList() { return list; } - public void insert(long id) { - mTagManager.insert(new TagRef(null, mTag.getId(), id)); - } - public void insert(boolean[] check) { int size = mComicArray.size(); List rList = new ArrayList<>(); @@ -140,7 +133,7 @@ public void insert(boolean[] check) { mComicArray.remove(comic.getId()); } } - mTagManager.insert(rList); + mTagManager.insertInTx(rList); mBaseView.onComicInsertSuccess(cList); } diff --git a/app/src/main/java/com/hiroshi/cimoc/presenter/ReaderPresenter.java b/app/src/main/java/com/hiroshi/cimoc/presenter/ReaderPresenter.java index 3e76b3ae..483330bb 100644 --- a/app/src/main/java/com/hiroshi/cimoc/presenter/ReaderPresenter.java +++ b/app/src/main/java/com/hiroshi/cimoc/presenter/ReaderPresenter.java @@ -1,5 +1,8 @@ package com.hiroshi.cimoc.presenter; +import android.content.ContentResolver; +import android.support.v4.provider.DocumentFile; + import com.hiroshi.cimoc.core.Download; import com.hiroshi.cimoc.core.Manga; import com.hiroshi.cimoc.core.Storage; @@ -127,8 +130,8 @@ private void updateChapter(Chapter chapter, boolean isNext) { RxBus.getInstance().post(new RxEvent(RxEvent.EVENT_COMIC_CHAPTER_CHANGE)); } - public void savePicture(InputStream inputStream, String suffix) { - mCompositeSubscription.add(Storage.savePicture(inputStream, suffix) + public void savePicture(ContentResolver resolver, DocumentFile root, InputStream inputStream, String url) { + mCompositeSubscription.add(Storage.savePicture(resolver, root, inputStream, url) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Action1() { @Override diff --git a/app/src/main/java/com/hiroshi/cimoc/presenter/TagEditorPresenter.java b/app/src/main/java/com/hiroshi/cimoc/presenter/TagEditorPresenter.java index a40851c2..0a72c25a 100644 --- a/app/src/main/java/com/hiroshi/cimoc/presenter/TagEditorPresenter.java +++ b/app/src/main/java/com/hiroshi/cimoc/presenter/TagEditorPresenter.java @@ -1,8 +1,6 @@ package com.hiroshi.cimoc.presenter; -import com.hiroshi.cimoc.core.manager.ComicManager; import com.hiroshi.cimoc.core.manager.TagManager; -import com.hiroshi.cimoc.model.MiniComic; import com.hiroshi.cimoc.model.Pair; import com.hiroshi.cimoc.model.Tag; import com.hiroshi.cimoc.model.TagRef; @@ -30,17 +28,15 @@ public class TagEditorPresenter extends BasePresenter { private TagManager mTagManager; - private ComicManager mComicManager; - private MiniComic mMiniComic; + private long mComicId; private Set mTagSet; public TagEditorPresenter() { mTagManager = TagManager.getInstance(); - mComicManager = ComicManager.getInstance(); } public void load(long id) { - mMiniComic = new MiniComic(mComicManager.load(id)); + mComicId = id; mCompositeSubscription.add(mTagManager.listInRx() .map(new Func1, List>>() { @Override @@ -69,7 +65,7 @@ public void call(Throwable throwable) { private void initTagSet() { mTagSet = new HashSet<>(); - for (TagRef ref : mTagManager.listByComic(mMiniComic.getId())) { + for (TagRef ref : mTagManager.listByComic(mComicId)) { mTagSet.add(ref.getTid()); } } @@ -79,10 +75,10 @@ private void updateInTx(final List dList, final List iList) { @Override public void run() { for (Long id : dList) { - mTagManager.delete(id, mMiniComic.getId()); + mTagManager.delete(id, mComicId); } for (Long id : iList) { - mTagManager.insert(new TagRef(null, id, mMiniComic.getId())); + mTagManager.insert(new TagRef(null, id, mComicId)); } } }); @@ -102,7 +98,7 @@ public void call(Subscriber subscriber) { if (!dList.isEmpty() || !iList.isEmpty()) { updateInTx(dList, iList); updateTagSet(dList, iList); - RxBus.getInstance().post(new RxEvent(RxEvent.EVENT_TAG_UPDATE, mMiniComic)); + RxBus.getInstance().post(new RxEvent(RxEvent.EVENT_TAG_UPDATE, mComicId, dList, iList)); subscriber.onNext(true); } else { subscriber.onNext(false); diff --git a/app/src/main/java/com/hiroshi/cimoc/presenter/TagPresenter.java b/app/src/main/java/com/hiroshi/cimoc/presenter/TagPresenter.java index b8da524c..2851e864 100644 --- a/app/src/main/java/com/hiroshi/cimoc/presenter/TagPresenter.java +++ b/app/src/main/java/com/hiroshi/cimoc/presenter/TagPresenter.java @@ -40,9 +40,7 @@ public void call(Throwable throwable) { } public void insert(Tag tag) { - long id = mTagManager.insert(tag); - tag.setId(id); - RxBus.getInstance().post(new RxEvent(RxEvent.EVENT_TAG_INSERT, tag)); + mTagManager.insert(tag); } public void delete(final Tag tag) { @@ -51,13 +49,13 @@ public void delete(final Tag tag) { public void run() { mTagManager.deleteByTag(tag.getId()); mTagManager.delete(tag); - RxBus.getInstance().post(new RxEvent(RxEvent.EVENT_TAG_DELETE, tag)); } }).observeOn(AndroidSchedulers.mainThread()) .subscribe(new Action1() { @Override public void call(Void aVoid) { - mBaseView.onTagDeleteSuccess(); + RxBus.getInstance().post(new RxEvent(RxEvent.EVENT_TAG_DELETE, tag)); + mBaseView.onTagDeleteSuccess(tag); } }, new Action1() { @Override @@ -67,8 +65,4 @@ public void call(Throwable throwable) { })); } - public void update(Tag tag) { - mTagManager.update(tag); - } - } diff --git a/app/src/main/java/com/hiroshi/cimoc/rx/RxEvent.java b/app/src/main/java/com/hiroshi/cimoc/rx/RxEvent.java index b2acb0ff..0bff61bc 100644 --- a/app/src/main/java/com/hiroshi/cimoc/rx/RxEvent.java +++ b/app/src/main/java/com/hiroshi/cimoc/rx/RxEvent.java @@ -29,15 +29,14 @@ public class RxEvent { public static final int EVENT_SOURCE_DISABLE = 62; public static final int EVENT_TAG_DELETE = 81; - public static final int EVENT_TAG_INSERT = 82; - public static final int EVENT_TAG_UPDATE = 83; + public static final int EVENT_TAG_UPDATE = 82; public static final int EVENT_THEME_CHANGE = 101; @IntDef({EVENT_COMIC_FAVORITE, EVENT_COMIC_UNFAVORITE, EVENT_COMIC_READ, EVENT_COMIC_PAGE_CHANGE, EVENT_COMIC_CHAPTER_CHANGE, EVENT_COMIC_FAVORITE_RESTORE, EVENT_TASK_STATE_CHANGE, EVENT_TASK_PROCESS, EVENT_TASK_INSERT, EVENT_DOWNLOAD_REMOVE, EVENT_DOWNLOAD_START, EVENT_DOWNLOAD_STOP, EVENT_SOURCE_ENABLE, EVENT_SOURCE_DISABLE, EVENT_TAG_DELETE, - EVENT_TAG_INSERT, EVENT_THEME_CHANGE, EVENT_TAG_UPDATE}) + EVENT_THEME_CHANGE, EVENT_TAG_UPDATE}) @Retention(RetentionPolicy.SOURCE) public @interface EventType {} diff --git a/app/src/main/java/com/hiroshi/cimoc/service/DownloadService.java b/app/src/main/java/com/hiroshi/cimoc/service/DownloadService.java index 491cc561..ffdbf438 100644 --- a/app/src/main/java/com/hiroshi/cimoc/service/DownloadService.java +++ b/app/src/main/java/com/hiroshi/cimoc/service/DownloadService.java @@ -3,16 +3,19 @@ import android.app.Notification; import android.app.NotificationManager; import android.app.Service; +import android.content.ContentResolver; import android.content.Context; import android.content.Intent; import android.os.Binder; import android.os.IBinder; import android.support.annotation.Nullable; +import android.support.v4.provider.DocumentFile; import com.hiroshi.cimoc.CimocApplication; import com.hiroshi.cimoc.R; import com.hiroshi.cimoc.core.Download; import com.hiroshi.cimoc.core.Manga; +import com.hiroshi.cimoc.core.Storage; import com.hiroshi.cimoc.core.manager.PreferenceManager; import com.hiroshi.cimoc.core.manager.TaskManager; import com.hiroshi.cimoc.fresco.ImagePipelineFactoryBuilder; @@ -20,12 +23,11 @@ import com.hiroshi.cimoc.model.Task; import com.hiroshi.cimoc.rx.RxBus; import com.hiroshi.cimoc.rx.RxEvent; -import com.hiroshi.cimoc.utils.FileUtils; +import com.hiroshi.cimoc.utils.DocumentUtils; import com.hiroshi.cimoc.utils.NotificationUtils; import com.hiroshi.cimoc.utils.StringUtils; import java.io.IOException; -import java.io.InputStream; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -51,6 +53,8 @@ public class DownloadService extends Service { private Notification.Builder builder; private NotificationManager notification; private TaskManager manager; + private ContentResolver resolver; + private DocumentFile root; @Nullable @Override @@ -65,6 +69,8 @@ public void onCreate() { executor = Executors.newSingleThreadExecutor(); client = new OkHttpClient(); manager = TaskManager.getInstance(); + resolver = getContentResolver(); + root = Storage.getRootDocumentFile(this); } @Override @@ -171,53 +177,32 @@ public void run() { List list = Manga.downloadImages(client, source, task.getCid(), task.getPath()); int size = list.size(); - if (size != 0 && Download.updateChapterIndex(task.getSource(), task.getComic(), task.getTitle(), task.getPath())) { - task.setMax(size); - task.setState(Task.STATE_DOING); - for (int i = task.getProgress(); i != size; ++i) { - int count = 0; // page download error - while (count <= connect) { - boolean success = false; // url download success - onDownloadProgress(i); - ImageUrl image = list.get(i); - for (String url : image.getUrl()) { - url = image.isLazy() ? Manga.downloadLazy(client, source, url) : url; - if (url != null) { - Request request = new Request.Builder() - .cacheControl(new CacheControl.Builder().noStore().build()) - .headers(headers) - .url(url) - .get() - .build(); - Response response = null; - try { - response = client.newCall(request).execute(); - if (response.isSuccessful() && writeToFile(response.body().byteStream(), i + 1, url)) { - success = true; - if (i + 1 == size) { - onDownloadProgress(size); - } - break; - } - } catch (IOException e) { - e.printStackTrace(); - } finally { - if (response != null) { - response.close(); - } + if (size != 0) { + DocumentFile dir = Download.updateChapterIndex(resolver, root, task); + if (dir != null) { + task.setMax(size); + task.setState(Task.STATE_DOING); + for (int i = task.getProgress(); i < size; ++i) { + int count = 0; // page download error + boolean success = false; // url download success + while (count++ <= connect && !success) { + onDownloadProgress(i); + ImageUrl image = list.get(i); + for (String url : image.getUrl()) { + url = image.isLazy() ? Manga.downloadLazy(client, source, url) : url; + if (url != null) { + Request request = buildRequest(headers, url); + success = RequestAndWrite(dir, request, i + 1, url); } } } - if (!success) { - ++count; - } else { + if (count == connect + 1) { // page download error + RxBus.getInstance().post(new RxEvent(RxEvent.EVENT_TASK_STATE_CHANGE, Task.STATE_ERROR, task.getId())); break; + } else if (success && i + 1 == size) { + onDownloadProgress(size); } } - if (count == connect + 1) { // page download error - RxBus.getInstance().post(new RxEvent(RxEvent.EVENT_TASK_STATE_CHANGE, Task.STATE_ERROR, task.getId())); - break; - } } } else { RxBus.getInstance().post(new RxEvent(RxEvent.EVENT_TASK_STATE_CHANGE, Task.STATE_ERROR, task.getId())); @@ -226,21 +211,50 @@ public void run() { removeDownload(task.getId()); } - private void onDownloadProgress(int progress) { - task.setProgress(progress); - manager.update(task); - RxBus.getInstance().post(new RxEvent(RxEvent.EVENT_TASK_PROCESS, task.getId(), progress, task.getMax())); + private boolean RequestAndWrite(DocumentFile parent, Request request, int num, String url) { + Response response = null; + try { + response = client.newCall(request).execute(); + if (response.isSuccessful()) { + String mimeType = response.header("Content-Type", "image/jpeg"); + String displayName = buildFileName(num, url); + DocumentFile file = parent.createFile(mimeType, displayName); + DocumentUtils.writeBinaryToFile(resolver, file, response.body().byteStream()); + return true; + } + } catch (IOException e) { + e.printStackTrace(); + } finally { + if (response != null) { + response.close(); + } + } + return false; } - private boolean writeToFile(InputStream byteStream, int count, String url) { + private Request buildRequest(Headers headers, String url) { + return new Request.Builder() + .cacheControl(new CacheControl.Builder().noStore().build()) + .headers(headers) + .url(url) + .get() + .build(); + } + + private String buildFileName(int num, String url) { String suffix = StringUtils.split(url, "\\.", -1); if (suffix == null) { suffix = "jpg"; } else { suffix = suffix.split("\\?")[0]; } - String dir = Download.buildPath(task.getSource(), task.getComic(), task.getTitle()); - return FileUtils.writeBinaryToFile(dir, StringUtils.format("%03d.%s", count, suffix), byteStream); + return StringUtils.format("%03d.%s", num, suffix); + } + + private void onDownloadProgress(int progress) { + task.setProgress(progress); + manager.update(task); + RxBus.getInstance().post(new RxEvent(RxEvent.EVENT_TASK_PROCESS, task.getId(), progress, task.getMax())); } } diff --git a/app/src/main/java/com/hiroshi/cimoc/ui/activity/BackupActivity.java b/app/src/main/java/com/hiroshi/cimoc/ui/activity/BackupActivity.java index a9b6d321..feedba46 100644 --- a/app/src/main/java/com/hiroshi/cimoc/ui/activity/BackupActivity.java +++ b/app/src/main/java/com/hiroshi/cimoc/ui/activity/BackupActivity.java @@ -1,5 +1,6 @@ package com.hiroshi.cimoc.ui.activity; +import android.os.Bundle; import android.view.View; import com.hiroshi.cimoc.R; @@ -16,11 +17,11 @@ * Created by Hiroshi on 2016/10/19. */ -public class BackupActivity extends BackActivity implements BackupView, ChoiceDialogFragment.ChoiceDialogListener { +public class BackupActivity extends BackActivity implements BackupView { - private static final int TYPE_FAVORITE_FILE = 0; - private static final int TYPE_TAG_FILE = 1; - private static final int TYPE_TAG = 2; + private static final int DIALOG_REQUEST_RESTORE_FAVORITE = 0; + private static final int DIALOG_REQUEST_RESTORE_TAG = 1; + private static final int DIALOG_REQUEST_SAVE_TAG = 2; @BindView(R.id.backup_layout) View mLayoutView; @@ -76,18 +77,23 @@ protected void onDestroy() { } @Override - public void onChoicePositiveClick(int type, int choice, String value) { - switch (type) { - case TYPE_FAVORITE_FILE: + public void onDialogResult(int requestCode, Bundle bundle) { + int choice; + String value; + switch (requestCode) { + case DIALOG_REQUEST_RESTORE_FAVORITE: showProgressDialog(); + value = bundle.getString(EXTRA_DIALOG_RESULT_VALUE); mPresenter.restoreFavorite(value); break; - case TYPE_TAG_FILE: + case DIALOG_REQUEST_RESTORE_TAG: showProgressDialog(); + value = bundle.getString(EXTRA_DIALOG_RESULT_VALUE); mPresenter.restoreTag(value); break; - case TYPE_TAG: + case DIALOG_REQUEST_SAVE_TAG: showProgressDialog(); + choice = bundle.getInt(EXTRA_DIALOG_RESULT_INDEX); mPresenter.saveTag(choice); break; } @@ -96,7 +102,7 @@ public void onChoicePositiveClick(int type, int choice, String value) { @Override public void onTagLoadSuccess(String[] tag) { if (tag.length != 0) { - showChoiceDialog(R.string.backup_save_tag, tag, TYPE_TAG); + showChoiceDialog(R.string.backup_save_tag, tag, DIALOG_REQUEST_SAVE_TAG); } else { showSnackbar(R.string.backup_save_tag_not_found); hideProgressDialog(); @@ -105,12 +111,12 @@ public void onTagLoadSuccess(String[] tag) { @Override public void onFavoriteFileLoadSuccess(String[] file) { - showChoiceDialog(R.string.backup_restore_favorite, file, TYPE_FAVORITE_FILE); + showChoiceDialog(R.string.backup_restore_favorite, file, DIALOG_REQUEST_RESTORE_FAVORITE); } @Override public void onTagFileLoadSuccess(String[] file) { - showChoiceDialog(R.string.backup_restore_tag, file, TYPE_TAG_FILE); + showChoiceDialog(R.string.backup_restore_tag, file, DIALOG_REQUEST_RESTORE_TAG); } private void showChoiceDialog(int title, String[] item, int type) { @@ -121,38 +127,38 @@ private void showChoiceDialog(int title, String[] item, int type) { @Override public void onTagLoadFail() { - showSnackbar(R.string.backup_save_tag_load_fail); hideProgressDialog(); + showSnackbar(R.string.backup_save_tag_load_fail); } @Override public void onFileLoadFail() { - showSnackbar(R.string.backup_restore_not_found); hideProgressDialog(); + showSnackbar(R.string.backup_restore_not_found); } @Override public void onBackupRestoreSuccess() { - showSnackbar(R.string.backup_restore_success); hideProgressDialog(); + showSnackbar(R.string.backup_restore_success); } @Override public void onBackupRestoreFail() { - showSnackbar(R.string.backup_restore_fail); hideProgressDialog(); + showSnackbar(R.string.backup_restore_fail); } @Override public void onBackupSaveSuccess(int size) { - showSnackbar(StringUtils.format(getString(R.string.backup_save_success), size)); hideProgressDialog(); + showSnackbar(StringUtils.format(getString(R.string.backup_save_success), size)); } @Override public void onBackupSaveFail() { - showSnackbar(R.string.backup_save_fail); hideProgressDialog(); + showSnackbar(R.string.backup_save_fail); } @Override diff --git a/app/src/main/java/com/hiroshi/cimoc/ui/activity/MainActivity.java b/app/src/main/java/com/hiroshi/cimoc/ui/activity/MainActivity.java index da2ce66f..1fa8d0a6 100644 --- a/app/src/main/java/com/hiroshi/cimoc/ui/activity/MainActivity.java +++ b/app/src/main/java/com/hiroshi/cimoc/ui/activity/MainActivity.java @@ -44,11 +44,10 @@ /** * Created by Hiroshi on 2016/7/1. */ -public class MainActivity extends BaseActivity implements MainView, NavigationView.OnNavigationItemSelectedListener, - MessageDialogFragment.MessageDialogListener { +public class MainActivity extends BaseActivity implements MainView, NavigationView.OnNavigationItemSelectedListener { - private static final int TYPE_NOTICE = 0; - private static final int TYPE_PERMISSION = 1; + private static final int DIALOG_REQUEST_NOTICE = 0; + private static final int DIALOG_REQUEST_PERMISSION = 1; private static final int FRAGMENT_NUM = 4; @@ -238,13 +237,13 @@ public boolean onNavigationItemSelected(@NonNull MenuItem item) { } @Override - public void onMessagePositiveClick(int type) { - switch (type) { - case TYPE_NOTICE: + public void onDialogResult(int requestCode, Bundle bundle) { + switch (requestCode) { + case DIALOG_REQUEST_NOTICE: mPreference.putBoolean(PreferenceManager.PREF_MAIN_NOTICE, true); showPermission(); break; - case TYPE_PERMISSION: + case DIALOG_REQUEST_PERMISSION: ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 0); break; } @@ -307,7 +306,7 @@ public void onThemeChange(@StyleRes int theme, @ColorRes int primary, @ColorRes private boolean showAuthorNotice() { if (!mPreference.getBoolean(PreferenceManager.PREF_MAIN_NOTICE, false)) { - MessageDialogFragment fragment = MessageDialogFragment.newInstance(R.string.main_notice, R.string.main_notice_content, false, TYPE_NOTICE); + MessageDialogFragment fragment = MessageDialogFragment.newInstance(R.string.main_notice, R.string.main_notice_content, false, null, DIALOG_REQUEST_NOTICE); fragment.show(getFragmentManager(), null); return true; } @@ -316,7 +315,7 @@ private boolean showAuthorNotice() { private void showPermission() { if (!PermissionUtils.hasStoragePermission(this)) { - MessageDialogFragment fragment = MessageDialogFragment.newInstance(R.string.main_permission, R.string.main_permission_content, false, TYPE_PERMISSION); + MessageDialogFragment fragment = MessageDialogFragment.newInstance(R.string.main_permission, R.string.main_permission_content, false, null, DIALOG_REQUEST_PERMISSION); fragment.show(getFragmentManager(), null); } } diff --git a/app/src/main/java/com/hiroshi/cimoc/ui/activity/TagComicActivity.java b/app/src/main/java/com/hiroshi/cimoc/ui/activity/PartFavoriteActivity.java similarity index 70% rename from app/src/main/java/com/hiroshi/cimoc/ui/activity/TagComicActivity.java rename to app/src/main/java/com/hiroshi/cimoc/ui/activity/PartFavoriteActivity.java index 63633fc9..dfe2b401 100644 --- a/app/src/main/java/com/hiroshi/cimoc/ui/activity/TagComicActivity.java +++ b/app/src/main/java/com/hiroshi/cimoc/ui/activity/PartFavoriteActivity.java @@ -2,17 +2,18 @@ import android.content.Context; import android.content.Intent; +import android.os.Bundle; import android.support.v7.widget.GridLayoutManager; import android.view.View; import com.hiroshi.cimoc.CimocApplication; import com.hiroshi.cimoc.R; import com.hiroshi.cimoc.model.MiniComic; -import com.hiroshi.cimoc.presenter.TagComicPresenter; +import com.hiroshi.cimoc.presenter.PartFavoritePresenter; import com.hiroshi.cimoc.ui.adapter.GridAdapter; import com.hiroshi.cimoc.ui.fragment.dialog.MessageDialogFragment; import com.hiroshi.cimoc.ui.fragment.dialog.MultiDialogFragment; -import com.hiroshi.cimoc.ui.view.TagComicView; +import com.hiroshi.cimoc.ui.view.PartFavoriteView; import java.util.LinkedList; import java.util.List; @@ -23,16 +24,17 @@ * Created by Hiroshi on 2016/10/11. */ -public class TagComicActivity extends CoordinatorActivity implements TagComicView, - MultiDialogFragment.MultiDialogListener, MessageDialogFragment.MessageDialogListener { +public class PartFavoriteActivity extends CoordinatorActivity implements PartFavoriteView { - private TagComicPresenter mPresenter; + private static final int DIALOG_REQUEST_DELETE = 0; + private static final int DIALOG_REQUEST_ADD = 1; + + private PartFavoritePresenter mPresenter; private GridAdapter mGridAdapter; - private int mTempPosition = -1; @Override protected void initPresenter() { - mPresenter = new TagComicPresenter(); + mPresenter = new PartFavoritePresenter(); mPresenter.attachView(this); } @@ -54,7 +56,7 @@ protected void initView() { protected void initData() { long id = getIntent().getLongExtra(EXTRA_ID, -1); String title = getIntent().getStringExtra(EXTRA_TITLE); - mPresenter.loadTagComic(id, title); + mPresenter.load(id, title); } @Override @@ -86,25 +88,30 @@ public void onItemClick(View view, int position) { @Override public void onItemLongClick(View view, int position) { + Bundle bundle = new Bundle(); + bundle.putInt(EXTRA_DIALOG_BUNDLE_INT, position); MessageDialogFragment fragment = MessageDialogFragment.newInstance(R.string.dialog_confirm, - R.string.tag_comic_delete_confirm, true); - mTempPosition = position; + R.string.tag_comic_delete_confirm, true, bundle, DIALOG_REQUEST_DELETE); fragment.show(getFragmentManager(), null); } @Override - public void onMessagePositiveClick(int type) { - long tid = getIntent().getLongExtra(EXTRA_ID, -1); - long cid = mGridAdapter.getItem(mTempPosition).getId(); - mPresenter.delete(tid, cid); - mGridAdapter.remove(mTempPosition); - showSnackbar(R.string.common_delete_success); - } - - @Override - public void onMultiPositiveClick(int type, boolean[] check) { - showProgressDialog(); - mPresenter.insert(check); + public void onDialogResult(int requestCode, Bundle bundle) { + switch (requestCode) { + case DIALOG_REQUEST_DELETE: + int pos = bundle.getBundle(EXTRA_DIALOG_BUNDLE).getInt(EXTRA_DIALOG_BUNDLE_INT); + long tid = getIntent().getLongExtra(EXTRA_ID, -1); + long cid = mGridAdapter.getItem(pos).getId(); + mPresenter.delete(tid, cid); + mGridAdapter.remove(pos); + showSnackbar(R.string.common_delete_success); + break; + case DIALOG_REQUEST_ADD: + boolean[] check = bundle.getBooleanArray(EXTRA_DIALOG_RESULT_VALUE); + showProgressDialog(); + mPresenter.insert(check); + break; + } } @Override @@ -134,17 +141,12 @@ public void onComicInsertFail() { } @Override - public void onComicUnFavorite(long id) { + public void onComicRemove(long id) { mGridAdapter.removeItemById(id); } @Override - public void onTagComicDelete(MiniComic comic) { - mGridAdapter.remove(comic); - } - - @Override - public void onTagComicInsert(MiniComic comic) { + public void onComicAdd(MiniComic comic) { mGridAdapter.add(0, comic); } @@ -153,11 +155,16 @@ protected String getDefaultTitle() { return getIntent().getStringExtra(EXTRA_TITLE); } + @Override + protected int getLayoutRes() { + return R.layout.activity_part_favorite; + } + private static final String EXTRA_ID = "a"; private static final String EXTRA_TITLE = "b"; public static Intent createIntent(Context context, long id, String title) { - Intent intent = new Intent(context, TagComicActivity.class); + Intent intent = new Intent(context, PartFavoriteActivity.class); intent.putExtra(EXTRA_ID, id); intent.putExtra(EXTRA_TITLE, title); return intent; diff --git a/app/src/main/java/com/hiroshi/cimoc/ui/activity/ReaderActivity.java b/app/src/main/java/com/hiroshi/cimoc/ui/activity/ReaderActivity.java index 65002a5a..83c2adf0 100644 --- a/app/src/main/java/com/hiroshi/cimoc/ui/activity/ReaderActivity.java +++ b/app/src/main/java/com/hiroshi/cimoc/ui/activity/ReaderActivity.java @@ -19,6 +19,7 @@ import com.facebook.cache.common.SimpleCacheKey; import com.facebook.imagepipeline.core.ImagePipelineFactory; import com.hiroshi.cimoc.R; +import com.hiroshi.cimoc.core.Storage; import com.hiroshi.cimoc.core.manager.PreferenceManager; import com.hiroshi.cimoc.fresco.ControllerBuilderSupplierFactory; import com.hiroshi.cimoc.fresco.ImagePipelineFactoryBuilder; @@ -404,20 +405,14 @@ protected void savePicture() { String[] urls = mReaderAdapter.getItem(position).getUrl(); try { for (String url : urls) { - String suffix = StringUtils.split(url, "\\.", -1); - if (suffix == null) { - suffix = "jpg"; - } else { - suffix = suffix.split("\\?")[0]; - } if (url.startsWith("file")) { InputStream inputStream = FileUtils.getInputStream(url.replace("file://", ".")); - mPresenter.savePicture(inputStream, suffix); + mPresenter.savePicture(getContentResolver(), Storage.getRootDocumentFile(this), inputStream, url); break; } else { BinaryResource resource = mImagePipelineFactory.getMainFileCache().getResource(new SimpleCacheKey(url)); if (resource != null) { - mPresenter.savePicture(resource.openStream(), suffix); + mPresenter.savePicture(getContentResolver(), Storage.getRootDocumentFile(this), resource.openStream(), url); break; } } diff --git a/app/src/main/java/com/hiroshi/cimoc/ui/activity/SettingsActivity.java b/app/src/main/java/com/hiroshi/cimoc/ui/activity/SettingsActivity.java index 4ff883aa..59a5de67 100644 --- a/app/src/main/java/com/hiroshi/cimoc/ui/activity/SettingsActivity.java +++ b/app/src/main/java/com/hiroshi/cimoc/ui/activity/SettingsActivity.java @@ -1,7 +1,11 @@ package com.hiroshi.cimoc.ui.activity; +import android.app.Activity; import android.content.Intent; import android.content.res.ColorStateList; +import android.net.Uri; +import android.os.Build; +import android.os.Bundle; import android.os.Environment; import android.support.v4.content.ContextCompat; import android.support.v7.widget.AppCompatCheckBox; @@ -15,7 +19,6 @@ import com.hiroshi.cimoc.service.DownloadService; import com.hiroshi.cimoc.ui.activity.settings.ReaderConfigActivity; import com.hiroshi.cimoc.ui.fragment.dialog.ChoiceDialogFragment; -import com.hiroshi.cimoc.ui.fragment.dialog.EditorDialogFragment; import com.hiroshi.cimoc.ui.fragment.dialog.SliderDialogFragment; import com.hiroshi.cimoc.ui.view.SettingsView; import com.hiroshi.cimoc.utils.PermissionUtils; @@ -31,12 +34,12 @@ * Created by Hiroshi on 2016/9/21. */ -public class SettingsActivity extends BackActivity implements SettingsView, EditorDialogFragment.EditorDialogListener, - SliderDialogFragment.SliderDialogListener, ChoiceDialogFragment.ChoiceDialogListener { +public class SettingsActivity extends BackActivity implements SettingsView { - private static final int TYPE_OTHER_LAUNCH = 0; - private static final int TYPE_READER_MODE = 1; - private static final int TYPE_OTHER_THEME = 2; + private static final int DIALOG_REQUEST_OTHER_LAUNCH = 0; + private static final int DIALOG_REQUEST_READER_MODE = 1; + private static final int DIALOG_REQUEST_OTHER_THEME = 2; + private static final int DIALOG_REQUEST_DOWNLOAD_CONN = 3; @BindViews({R.id.settings_reader_title, R.id.settings_download_title, R.id.settings_other_title}) List mTitleList; @@ -103,38 +106,42 @@ private void checkedAndSave(CheckBox box, String key) { @OnClick(R.id.settings_reader_mode_btn) void onReaderModeClick() { ChoiceDialogFragment fragment = ChoiceDialogFragment.newInstance(R.string.settings_reader_mode, - getResources().getStringArray(R.array.reader_mode_items), mReaderModeChoice, TYPE_READER_MODE); + getResources().getStringArray(R.array.reader_mode_items), mReaderModeChoice, DIALOG_REQUEST_READER_MODE); fragment.show(getFragmentManager(), null); } @OnClick(R.id.settings_other_launch_btn) void onOtherLaunchClick() { ChoiceDialogFragment fragment = ChoiceDialogFragment.newInstance(R.string.settings_other_launch, - getResources().getStringArray(R.array.home_items), mLaunchChoice, TYPE_OTHER_LAUNCH); + getResources().getStringArray(R.array.home_items), mLaunchChoice, DIALOG_REQUEST_OTHER_LAUNCH); fragment.show(getFragmentManager(), null); } @OnClick(R.id.settings_other_theme_btn) void onOtherThemeBtnClick() { ChoiceDialogFragment fragment = ChoiceDialogFragment.newInstance(R.string.settings_other_theme, - getResources().getStringArray(R.array.theme_items), mThemeChoice, TYPE_OTHER_THEME); + getResources().getStringArray(R.array.theme_items), mThemeChoice, DIALOG_REQUEST_OTHER_THEME); fragment.show(getFragmentManager(), null); } @Override - public void onChoicePositiveClick(int type, int choice, String value) { - switch (type) { - case TYPE_OTHER_LAUNCH: - mPreference.putInt(PreferenceManager.PREF_OTHER_LAUNCH, choice); - mLaunchChoice = choice; + public void onDialogResult(int requestCode, Bundle bundle) { + int index; + switch (requestCode) { + case DIALOG_REQUEST_READER_MODE: + index = bundle.getInt(EXTRA_DIALOG_RESULT_INDEX); + mPreference.putInt(PreferenceManager.PREF_READER_MODE, index); + mReaderModeChoice = index; break; - case TYPE_READER_MODE: - mPreference.putInt(PreferenceManager.PREF_READER_MODE, choice); - mReaderModeChoice = choice; + case DIALOG_REQUEST_OTHER_LAUNCH: + index = bundle.getInt(EXTRA_DIALOG_RESULT_INDEX); + mPreference.putInt(PreferenceManager.PREF_OTHER_LAUNCH, index); + mLaunchChoice = index; break; - case TYPE_OTHER_THEME: - if (mThemeChoice != choice) { - mPreference.putInt(PreferenceManager.PREF_OTHER_THEME, choice); - mThemeChoice = choice; - int theme = ThemeUtils.getThemeById(choice); + case DIALOG_REQUEST_OTHER_THEME: + index = bundle.getInt(EXTRA_DIALOG_RESULT_INDEX); + if (mThemeChoice != index) { + mPreference.putInt(PreferenceManager.PREF_OTHER_THEME, index); + mThemeChoice = index; + int theme = ThemeUtils.getThemeById(index); setTheme(theme); int primary = ThemeUtils.getResourceId(this, R.attr.colorPrimary); int accent = ThemeUtils.getResourceId(this, R.attr.colorAccent); @@ -142,6 +149,11 @@ public void onChoicePositiveClick(int type, int choice, String value) { mPresenter.changeTheme(theme, primary, accent); } break; + case DIALOG_REQUEST_DOWNLOAD_CONN: + int value = bundle.getInt(EXTRA_DIALOG_RESULT_VALUE); + mPreference.putInt(PreferenceManager.PREF_DOWNLOAD_CONNECTION, value); + mConnectionValue = value; + break; } } @@ -159,11 +171,29 @@ private void changeTheme(int primary, int accent) { } @OnClick(R.id.settings_other_storage_btn) void onOtherStorageClick() { - EditorDialogFragment fragment = EditorDialogFragment.newInstance(R.string.settings_other_storage, mStoragePath); - fragment.show(getFragmentManager(), null); + /* EditorDialogFragment fragment = EditorDialogFragment.newInstance(R.string.settings_other_storage, mStoragePath); + fragment.show(getFragmentManager(), null); */ + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE); + startActivityForResult(intent, 0); + } } @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + super.onActivityResult(requestCode, resultCode, data); + if (resultCode != Activity.RESULT_OK) return; + switch (requestCode) { + case 0: + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + Uri uri = data.getData(); + final int takeFlags = data.getFlags() & (Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION); + getContentResolver().takePersistableUriPermission(uri, takeFlags); + mPreference.putString(PreferenceManager.PREF_OTHER_STORAGE, uri.toString()); + } + } + } + public void onEditorPositiveClick(String text) { if (text != null) { stopService(new Intent(this, DownloadService.class)); @@ -179,16 +209,10 @@ public void onEditorPositiveClick(String text) { @OnClick(R.id.settings_download_connection_btn) void onDownloadConnectionClick() { SliderDialogFragment fragment = - SliderDialogFragment.newInstance(R.string.settings_download_connection, 0, 10, mConnectionValue); + SliderDialogFragment.newInstance(R.string.settings_download_connection, 0, 10, mConnectionValue, DIALOG_REQUEST_DOWNLOAD_CONN); fragment.show(getFragmentManager(), null); } - @Override - public void onSliderPositiveClick(int value) { - mPreference.putInt(PreferenceManager.PREF_DOWNLOAD_CONNECTION, value); - mConnectionValue = value; - } - @OnClick(R.id.settings_other_cache_btn) void onOtherCacheClick() { showProgressDialog(); mPresenter.clearCache(); diff --git a/app/src/main/java/com/hiroshi/cimoc/ui/activity/TaskActivity.java b/app/src/main/java/com/hiroshi/cimoc/ui/activity/TaskActivity.java index 4fb8cbba..41866cfe 100644 --- a/app/src/main/java/com/hiroshi/cimoc/ui/activity/TaskActivity.java +++ b/app/src/main/java/com/hiroshi/cimoc/ui/activity/TaskActivity.java @@ -4,6 +4,7 @@ import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; +import android.os.Bundle; import android.os.IBinder; import android.support.v7.widget.LinearLayoutManager; import android.view.Menu; @@ -35,7 +36,9 @@ /** * Created by Hiroshi on 2016/9/7. */ -public class TaskActivity extends CoordinatorActivity implements TaskView, MultiDialogFragment.MultiDialogListener { +public class TaskActivity extends CoordinatorActivity implements TaskView { + + private static final int DIALOG_REQUEST_DELETE = 0; private TaskAdapter mTaskAdapter; private TaskPresenter mPresenter; @@ -162,7 +165,7 @@ public boolean onOptionsItemSelected(MenuItem item) { arr1[i] = mTaskAdapter.getItem(i).getTitle(); arr2[i] = false; } - MultiDialogFragment fragment = MultiDialogFragment.newInstance(R.string.task_delete_multi, arr1, arr2, -1); + MultiDialogFragment fragment = MultiDialogFragment.newInstance(R.string.task_delete_multi, arr1, arr2, DIALOG_REQUEST_DELETE); fragment.show(getFragmentManager(), null); break; } @@ -170,23 +173,28 @@ public boolean onOptionsItemSelected(MenuItem item) { } @Override - public void onMultiPositiveClick(int type, boolean[] check) { - showProgressDialog(); - int size = mTaskAdapter.getItemCount(); - List result = new ArrayList<>(); - for (int i = 0; i < size; ++i) { - if (check[i]) { - result.add(mTaskAdapter.getItem(i)); - } - } - if (!result.isEmpty()) { - showProgressDialog(); - for (Task task : result) { - mBinder.getService().removeDownload(task.getId()); - } - mPresenter.deleteTask(result, mTaskAdapter.getItemCount() == result.size()); - } else { - showSnackbar("未选择任务"); + public void onDialogResult(int requestCode, Bundle bundle) { + switch (requestCode) { + case DIALOG_REQUEST_DELETE: + showProgressDialog(); + boolean[] check = bundle.getBooleanArray(EXTRA_DIALOG_RESULT_VALUE); + int size = mTaskAdapter.getItemCount(); + List result = new ArrayList<>(); + for (int i = 0; i < size; ++i) { + if (check[i]) { + result.add(mTaskAdapter.getItem(i)); + } + } + if (!result.isEmpty()) { + showProgressDialog(); + for (Task task : result) { + mBinder.getService().removeDownload(task.getId()); + } + mPresenter.deleteTask(result, mTaskAdapter.getItemCount() == result.size()); + } else { + showSnackbar("未选择任务"); + } + break; } } diff --git a/app/src/main/java/com/hiroshi/cimoc/ui/activity/settings/EventSettingsActivity.java b/app/src/main/java/com/hiroshi/cimoc/ui/activity/settings/EventSettingsActivity.java index 4255319e..c7cc39d5 100644 --- a/app/src/main/java/com/hiroshi/cimoc/ui/activity/settings/EventSettingsActivity.java +++ b/app/src/main/java/com/hiroshi/cimoc/ui/activity/settings/EventSettingsActivity.java @@ -3,6 +3,7 @@ import android.content.Context; import android.content.Intent; import android.content.pm.ActivityInfo; +import android.os.Bundle; import android.view.KeyEvent; import android.view.View; import android.view.WindowManager; @@ -11,6 +12,7 @@ import com.hiroshi.cimoc.R; import com.hiroshi.cimoc.ui.activity.BaseActivity; import com.hiroshi.cimoc.ui.fragment.dialog.ChoiceDialogFragment; +import com.hiroshi.cimoc.ui.view.DialogView; import com.hiroshi.cimoc.utils.EventUtils; import java.util.List; @@ -21,7 +23,7 @@ * Created by Hiroshi on 2016/10/9. */ -public class EventSettingsActivity extends BaseActivity implements ChoiceDialogFragment.ChoiceDialogListener { +public class EventSettingsActivity extends BaseActivity implements DialogView { @BindViews({ R.id.event_left, R.id.event_top, R.id.event_middle, R.id.event_bottom, R.id.event_right }) List