More improvements to webtoon viewer
This commit is contained in:
parent
692d3c1b2c
commit
089b5d3326
7 changed files with 97 additions and 14 deletions
|
@ -26,6 +26,7 @@ import eu.kanade.mangafeed.data.models.MangaStorIOSQLitePutResolver;
|
||||||
import eu.kanade.mangafeed.data.resolvers.MangaWithUnreadGetResolver;
|
import eu.kanade.mangafeed.data.resolvers.MangaWithUnreadGetResolver;
|
||||||
import eu.kanade.mangafeed.data.tables.ChaptersTable;
|
import eu.kanade.mangafeed.data.tables.ChaptersTable;
|
||||||
import eu.kanade.mangafeed.data.tables.MangasTable;
|
import eu.kanade.mangafeed.data.tables.MangasTable;
|
||||||
|
import eu.kanade.mangafeed.util.ChapterRecognition;
|
||||||
import eu.kanade.mangafeed.util.PostResult;
|
import eu.kanade.mangafeed.util.PostResult;
|
||||||
import rx.Observable;
|
import rx.Observable;
|
||||||
|
|
||||||
|
@ -192,6 +193,10 @@ public class DatabaseHelper {
|
||||||
Observable<Integer> newChaptersObs = chapterList
|
Observable<Integer> newChaptersObs = chapterList
|
||||||
.flatMap(dbChapters -> Observable.from(chapters)
|
.flatMap(dbChapters -> Observable.from(chapters)
|
||||||
.filter(c -> !dbChapters.contains(c))
|
.filter(c -> !dbChapters.contains(c))
|
||||||
|
.map(c -> {
|
||||||
|
ChapterRecognition.parseChapterNumber(c, manga);
|
||||||
|
return c;
|
||||||
|
})
|
||||||
.toList()
|
.toList()
|
||||||
.flatMap(newChapters -> insertChapters(newChapters).createObservable())
|
.flatMap(newChapters -> insertChapters(newChapters).createObservable())
|
||||||
.map(PutResults::numberOfInserts));
|
.map(PutResults::numberOfInserts));
|
||||||
|
|
|
@ -78,6 +78,7 @@ public class ReaderActivity extends BaseRxActivity<ReaderPresenter> {
|
||||||
@Override
|
@Override
|
||||||
protected void onPause() {
|
protected void onPause() {
|
||||||
getPresenter().setCurrentPage(viewer.getCurrentPosition());
|
getPresenter().setCurrentPage(viewer.getCurrentPosition());
|
||||||
|
viewer.destroySubscriptions();
|
||||||
super.onPause();
|
super.onPause();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2,6 +2,7 @@ package eu.kanade.mangafeed.ui.adapter;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
|
import android.widget.ProgressBar;
|
||||||
|
|
||||||
import com.davemorrissey.labs.subscaleview.ImageSource;
|
import com.davemorrissey.labs.subscaleview.ImageSource;
|
||||||
import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView;
|
import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView;
|
||||||
|
@ -41,10 +42,16 @@ public class WebtoonAdapter extends BaseEasyRecyclerAdapter<Page> {
|
||||||
notifyDataSetChanged();
|
notifyDataSetChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
@LayoutId(R.layout.chapter_image)
|
public void addPage(Page page) {
|
||||||
|
pages.add(page);
|
||||||
|
notifyItemChanged(page.getPageNumber());
|
||||||
|
}
|
||||||
|
|
||||||
|
@LayoutId(R.layout.item_webtoon_viewer)
|
||||||
static class ImageViewHolder extends ItemViewHolder<Page> {
|
static class ImageViewHolder extends ItemViewHolder<Page> {
|
||||||
|
|
||||||
@ViewId(R.id.page_image_view) SubsamplingScaleImageView imageView;
|
@ViewId(R.id.page_image_view) SubsamplingScaleImageView imageView;
|
||||||
|
@ViewId(R.id.progress) ProgressBar progressBar;
|
||||||
|
|
||||||
public ImageViewHolder(View view) {
|
public ImageViewHolder(View view) {
|
||||||
super(view);
|
super(view);
|
||||||
|
@ -60,8 +67,10 @@ public class WebtoonAdapter extends BaseEasyRecyclerAdapter<Page> {
|
||||||
if (page.getImagePath() != null) {
|
if (page.getImagePath() != null) {
|
||||||
imageView.setVisibility(View.VISIBLE);
|
imageView.setVisibility(View.VISIBLE);
|
||||||
imageView.setImage(ImageSource.uri(page.getImagePath()).tilingDisabled());
|
imageView.setImage(ImageSource.uri(page.getImagePath()).tilingDisabled());
|
||||||
|
progressBar.setVisibility(View.GONE);
|
||||||
} else {
|
} else {
|
||||||
imageView.setVisibility(View.GONE);
|
imageView.setVisibility(View.GONE);
|
||||||
|
progressBar.setVisibility(View.VISIBLE);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,27 +11,43 @@ import eu.kanade.mangafeed.data.models.Page;
|
||||||
import eu.kanade.mangafeed.ui.activity.ReaderActivity;
|
import eu.kanade.mangafeed.ui.activity.ReaderActivity;
|
||||||
import eu.kanade.mangafeed.ui.adapter.WebtoonAdapter;
|
import eu.kanade.mangafeed.ui.adapter.WebtoonAdapter;
|
||||||
import eu.kanade.mangafeed.ui.viewer.base.BaseViewer;
|
import eu.kanade.mangafeed.ui.viewer.base.BaseViewer;
|
||||||
|
import rx.Subscription;
|
||||||
|
import rx.android.schedulers.AndroidSchedulers;
|
||||||
|
import rx.subjects.PublishSubject;
|
||||||
|
|
||||||
public class WebtoonViewer extends BaseViewer {
|
public class WebtoonViewer extends BaseViewer {
|
||||||
|
|
||||||
private RecyclerView recycler;
|
private RecyclerView recycler;
|
||||||
|
private LinearLayoutManager layoutManager;
|
||||||
private WebtoonAdapter adapter;
|
private WebtoonAdapter adapter;
|
||||||
|
private List<Page> pages;
|
||||||
|
private Subscription subscription;
|
||||||
|
|
||||||
public WebtoonViewer(ReaderActivity activity, FrameLayout container) {
|
public WebtoonViewer(ReaderActivity activity, FrameLayout container) {
|
||||||
super(activity, container);
|
super(activity, container);
|
||||||
|
|
||||||
recycler = new RecyclerView(activity);
|
recycler = new RecyclerView(activity);
|
||||||
LinearLayoutManager layoutManager = new LinearLayoutManager(activity);
|
layoutManager = new LinearLayoutManager(activity);
|
||||||
recycler.setLayoutManager(layoutManager);
|
recycler.setLayoutManager(layoutManager);
|
||||||
adapter = new WebtoonAdapter(activity);
|
adapter = new WebtoonAdapter(activity);
|
||||||
recycler.setAdapter(adapter);
|
recycler.setAdapter(adapter);
|
||||||
|
|
||||||
|
recycler.addOnScrollListener(new RecyclerView.OnScrollListener() {
|
||||||
|
@Override
|
||||||
|
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
|
||||||
|
super.onScrolled(recyclerView, dx, dy);
|
||||||
|
|
||||||
|
currentPosition = layoutManager.findFirstVisibleItemPosition();
|
||||||
|
updatePageNumber();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
container.addView(recycler);
|
container.addView(recycler);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getTotalPages() {
|
public int getTotalPages() {
|
||||||
return adapter.getItemCount();
|
return pages.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -42,11 +58,52 @@ public class WebtoonViewer extends BaseViewer {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onPageListReady(List<Page> pages) {
|
public void onPageListReady(List<Page> pages) {
|
||||||
adapter.setPages(pages);
|
this.pages = pages;
|
||||||
|
observeStatus(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean onImageTouch(MotionEvent motionEvent) {
|
public boolean onImageTouch(MotionEvent motionEvent) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void observeStatus(int position) {
|
||||||
|
if (position == pages.size())
|
||||||
|
return;
|
||||||
|
|
||||||
|
final Page page = pages.get(position);
|
||||||
|
adapter.addPage(page);
|
||||||
|
|
||||||
|
PublishSubject<Integer> statusSubject = PublishSubject.create();
|
||||||
|
page.setStatusSubject(statusSubject);
|
||||||
|
|
||||||
|
if (subscription != null && !subscription.isUnsubscribed())
|
||||||
|
subscription.unsubscribe();
|
||||||
|
|
||||||
|
subscription = statusSubject
|
||||||
|
.startWith(page.getStatus())
|
||||||
|
.observeOn(AndroidSchedulers.mainThread())
|
||||||
|
.subscribe(status -> processStatus(position, status));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void processStatus(int position, int status) {
|
||||||
|
switch (status) {
|
||||||
|
case Page.LOAD_PAGE:
|
||||||
|
break;
|
||||||
|
case Page.DOWNLOAD_IMAGE:
|
||||||
|
break;
|
||||||
|
case Page.READY:
|
||||||
|
adapter.notifyItemChanged(position);
|
||||||
|
observeStatus(position + 1);
|
||||||
|
break;
|
||||||
|
case Page.ERROR:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void destroySubscriptions() {
|
||||||
|
if (subscription != null && !subscription.isUnsubscribed())
|
||||||
|
subscription.unsubscribe();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -33,6 +33,8 @@ public abstract class BaseViewer {
|
||||||
return getCurrentPageIndex(currentPosition);
|
return getCurrentPageIndex(currentPosition);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void destroySubscriptions() {}
|
||||||
|
|
||||||
public abstract int getTotalPages();
|
public abstract int getTotalPages();
|
||||||
public abstract void setSelectedPage(int pageNumber);
|
public abstract void setSelectedPage(int pageNumber);
|
||||||
public abstract void onPageListReady(List<Page> pages);
|
public abstract void onPageListReady(List<Page> pages);
|
||||||
|
|
|
@ -1,13 +1,6 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<LinearLayout
|
<com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView
|
||||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
android:orientation="vertical"
|
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent">
|
android:layout_height="match_parent"
|
||||||
|
android:id="@+id/page_image_view" />
|
||||||
<com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="match_parent"
|
|
||||||
android:id="@+id/page_image_view" />
|
|
||||||
|
|
||||||
</LinearLayout>
|
|
||||||
|
|
16
app/src/main/res/layout/item_webtoon_viewer.xml
Normal file
16
app/src/main/res/layout/item_webtoon_viewer.xml
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<FrameLayout
|
||||||
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent">
|
||||||
|
|
||||||
|
<ProgressBar
|
||||||
|
android:id="@+id/progress"
|
||||||
|
style="?android:attr/progressBarStyleLarge"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_gravity="center_vertical|center_horizontal"/>
|
||||||
|
|
||||||
|
<include layout="@layout/chapter_image"/>
|
||||||
|
|
||||||
|
</FrameLayout>
|
Reference in a new issue