Просмотр исходного кода

More improvements to webtoon viewer

inorichi 9 лет назад
Родитель
Сommit
089b5d3326

+ 5 - 0
app/src/main/java/eu/kanade/mangafeed/data/helpers/DatabaseHelper.java

@@ -26,6 +26,7 @@ import eu.kanade.mangafeed.data.models.MangaStorIOSQLitePutResolver;
 import eu.kanade.mangafeed.data.resolvers.MangaWithUnreadGetResolver;
 import eu.kanade.mangafeed.data.tables.ChaptersTable;
 import eu.kanade.mangafeed.data.tables.MangasTable;
+import eu.kanade.mangafeed.util.ChapterRecognition;
 import eu.kanade.mangafeed.util.PostResult;
 import rx.Observable;
 
@@ -192,6 +193,10 @@ public class DatabaseHelper {
         Observable<Integer> newChaptersObs = chapterList
                 .flatMap(dbChapters -> Observable.from(chapters)
                         .filter(c -> !dbChapters.contains(c))
+                        .map(c -> {
+                            ChapterRecognition.parseChapterNumber(c, manga);
+                            return c;
+                        })
                         .toList()
                         .flatMap(newChapters -> insertChapters(newChapters).createObservable())
                         .map(PutResults::numberOfInserts));

+ 1 - 0
app/src/main/java/eu/kanade/mangafeed/ui/activity/ReaderActivity.java

@@ -78,6 +78,7 @@ public class ReaderActivity extends BaseRxActivity<ReaderPresenter> {
     @Override
     protected void onPause() {
         getPresenter().setCurrentPage(viewer.getCurrentPosition());
+        viewer.destroySubscriptions();
         super.onPause();
     }
 

+ 10 - 1
app/src/main/java/eu/kanade/mangafeed/ui/adapter/WebtoonAdapter.java

@@ -2,6 +2,7 @@ package eu.kanade.mangafeed.ui.adapter;
 
 import android.content.Context;
 import android.view.View;
+import android.widget.ProgressBar;
 
 import com.davemorrissey.labs.subscaleview.ImageSource;
 import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView;
@@ -41,10 +42,16 @@ public class WebtoonAdapter extends BaseEasyRecyclerAdapter<Page> {
         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> {
 
         @ViewId(R.id.page_image_view) SubsamplingScaleImageView imageView;
+        @ViewId(R.id.progress) ProgressBar progressBar;
 
         public ImageViewHolder(View view) {
             super(view);
@@ -60,8 +67,10 @@ public class WebtoonAdapter extends BaseEasyRecyclerAdapter<Page> {
             if (page.getImagePath() != null) {
                 imageView.setVisibility(View.VISIBLE);
                 imageView.setImage(ImageSource.uri(page.getImagePath()).tilingDisabled());
+                progressBar.setVisibility(View.GONE);
             } else {
                 imageView.setVisibility(View.GONE);
+                progressBar.setVisibility(View.VISIBLE);
             }
 
         }

+ 60 - 3
app/src/main/java/eu/kanade/mangafeed/ui/viewer/WebtoonViewer.java

@@ -11,27 +11,43 @@ import eu.kanade.mangafeed.data.models.Page;
 import eu.kanade.mangafeed.ui.activity.ReaderActivity;
 import eu.kanade.mangafeed.ui.adapter.WebtoonAdapter;
 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 {
 
     private RecyclerView recycler;
+    private LinearLayoutManager layoutManager;
     private WebtoonAdapter adapter;
+    private List<Page> pages;
+    private Subscription subscription;
 
     public WebtoonViewer(ReaderActivity activity, FrameLayout container) {
         super(activity, container);
 
         recycler = new RecyclerView(activity);
-        LinearLayoutManager layoutManager = new LinearLayoutManager(activity);
+        layoutManager = new LinearLayoutManager(activity);
         recycler.setLayoutManager(layoutManager);
         adapter = new WebtoonAdapter(activity);
         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);
     }
 
     @Override
     public int getTotalPages() {
-        return adapter.getItemCount();
+        return pages.size();
     }
 
     @Override
@@ -42,11 +58,52 @@ public class WebtoonViewer extends BaseViewer {
 
     @Override
     public void onPageListReady(List<Page> pages) {
-        adapter.setPages(pages);
+        this.pages = pages;
+        observeStatus(0);
     }
 
     @Override
     public boolean onImageTouch(MotionEvent motionEvent) {
         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();
+    }
 }

+ 2 - 0
app/src/main/java/eu/kanade/mangafeed/ui/viewer/base/BaseViewer.java

@@ -33,6 +33,8 @@ public abstract class BaseViewer {
         return getCurrentPageIndex(currentPosition);
     }
 
+    public void destroySubscriptions() {}
+
     public abstract int getTotalPages();
     public abstract void setSelectedPage(int pageNumber);
     public abstract void onPageListReady(List<Page> pages);

+ 3 - 10
app/src/main/res/layout/chapter_image.xml

@@ -1,13 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
-<LinearLayout
+<com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView
     xmlns:android="http://schemas.android.com/apk/res/android"
-    android:orientation="vertical"
     android:layout_width="match_parent"
-    android:layout_height="match_parent">
-
-    <com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"
-        android:id="@+id/page_image_view" />
-
-</LinearLayout>
+    android:layout_height="match_parent"
+    android:id="@+id/page_image_view" />

+ 16 - 0
app/src/main/res/layout/item_webtoon_viewer.xml

@@ -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>