More improvements to webtoon viewer
This commit is contained in:
		
							parent
							
								
									692d3c1b2c
								
							
						
					
					
						commit
						089b5d3326
					
				| @ -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_height="match_parent"> |  | ||||||
| 
 |  | ||||||
|     <com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView |  | ||||||
|     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" /> |     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> | ||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 inorichi
						inorichi