Decouple viewer from the reader activity
This commit is contained in:
parent
ef7613f7ad
commit
d3c83f0bf2
10 changed files with 233 additions and 82 deletions
|
@ -46,13 +46,13 @@ public class ReaderPresenter extends BasePresenter<ReaderActivity> {
|
|||
.doOnNext(pages -> pageList = pages)
|
||||
.doOnCompleted(() -> start(GET_PAGE_IMAGES)),
|
||||
(view, pages) -> {
|
||||
view.onPageList(pages);
|
||||
view.onPageListReady(pages);
|
||||
});
|
||||
|
||||
restartableReplay(GET_PAGE_IMAGES,
|
||||
this::getPageImagesObservable,
|
||||
(view, page) -> {
|
||||
view.onPageDownloaded(page);
|
||||
view.onImageReady(page);
|
||||
if (page.getPageNumber() == savedSelectedPage) {
|
||||
view.setCurrentPage(savedSelectedPage);
|
||||
}
|
||||
|
|
|
@ -2,11 +2,11 @@ package eu.kanade.mangafeed.ui.activity;
|
|||
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
import android.support.v4.view.ViewPager;
|
||||
import android.view.MotionEvent;
|
||||
import android.view.View;
|
||||
import android.view.WindowManager;
|
||||
import android.widget.FrameLayout;
|
||||
import android.widget.TextView;
|
||||
|
||||
import java.util.List;
|
||||
|
@ -17,18 +17,18 @@ import eu.kanade.mangafeed.R;
|
|||
import eu.kanade.mangafeed.data.models.Page;
|
||||
import eu.kanade.mangafeed.presenter.ReaderPresenter;
|
||||
import eu.kanade.mangafeed.ui.activity.base.BaseRxActivity;
|
||||
import eu.kanade.mangafeed.ui.adapter.ReaderPageAdapter;
|
||||
import eu.kanade.mangafeed.widget.ReaderViewPager;
|
||||
import eu.kanade.mangafeed.ui.viewer.LeftToRightViewer;
|
||||
import eu.kanade.mangafeed.ui.viewer.base.BaseViewer;
|
||||
import nucleus.factory.RequiresPresenter;
|
||||
|
||||
@RequiresPresenter(ReaderPresenter.class)
|
||||
public class ReaderActivity extends BaseRxActivity<ReaderPresenter> {
|
||||
|
||||
@Bind(R.id.view_pager) ReaderViewPager viewPager;
|
||||
@Bind(R.id.page_number) TextView pageNumber;
|
||||
@Bind(R.id.viewer) FrameLayout container;
|
||||
|
||||
private ReaderPageAdapter adapter;
|
||||
private int currentPage;
|
||||
private BaseViewer viewer;
|
||||
|
||||
public static Intent newInstance(Context context) {
|
||||
return new Intent(context, ReaderActivity.class);
|
||||
|
@ -40,8 +40,8 @@ public class ReaderActivity extends BaseRxActivity<ReaderPresenter> {
|
|||
setContentView(R.layout.activity_reader);
|
||||
ButterKnife.bind(this);
|
||||
|
||||
createAdapter();
|
||||
setupViewPager();
|
||||
viewer = new LeftToRightViewer(this, container);
|
||||
|
||||
enableHardwareAcceleration();
|
||||
}
|
||||
|
||||
|
@ -51,76 +51,27 @@ public class ReaderActivity extends BaseRxActivity<ReaderPresenter> {
|
|||
super.onDestroy();
|
||||
}
|
||||
|
||||
private void createAdapter() {
|
||||
adapter = new ReaderPageAdapter(getSupportFragmentManager());
|
||||
viewPager.setAdapter(adapter);
|
||||
public void onPageListReady(List<Page> pages) {
|
||||
viewer.onPageListReady(pages);
|
||||
}
|
||||
|
||||
private void setupViewPager() {
|
||||
viewPager.setOffscreenPageLimit(3);
|
||||
viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
|
||||
@Override
|
||||
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPageSelected(int position) {
|
||||
currentPage = position;
|
||||
updatePageNumber();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPageScrollStateChanged(int state) {
|
||||
|
||||
}
|
||||
});
|
||||
viewPager.setOnChapterBoundariesOutListener(new ReaderViewPager.OnChapterBoundariesOutListener() {
|
||||
@Override
|
||||
public void onFirstPageOut() {
|
||||
// TODO load previous chapter
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onLastPageOut() {
|
||||
// TODO load next chapter
|
||||
}
|
||||
});
|
||||
public void onImageReady(Page page) {
|
||||
viewer.onImageReady(page);
|
||||
}
|
||||
|
||||
public ReaderViewPager getViewPager() {
|
||||
return viewPager;
|
||||
}
|
||||
|
||||
|
||||
public void onPageList(List<Page> pages) {
|
||||
adapter.setPages(pages);
|
||||
updatePageNumber();
|
||||
}
|
||||
|
||||
public void onPageDownloaded(Page page) {
|
||||
adapter.replacePage(page.getPageNumber(), page);
|
||||
}
|
||||
|
||||
public void setCurrentPage(int position) {
|
||||
viewPager.setCurrentItem(position);
|
||||
}
|
||||
|
||||
private void updatePageNumber() {
|
||||
String page = (currentPage+1) + "/" + adapter.getCount();
|
||||
public void onPageChanged(int currentPage, int totalPages) {
|
||||
String page = currentPage + "/" + totalPages;
|
||||
pageNumber.setText(page);
|
||||
}
|
||||
|
||||
public void hideStatusBar() {
|
||||
if (Build.VERSION.SDK_INT < 16) {
|
||||
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
|
||||
WindowManager.LayoutParams.FLAG_FULLSCREEN);
|
||||
} else {
|
||||
View decorView = getWindow().getDecorView();
|
||||
int uiOptions = View.SYSTEM_UI_FLAG_FULLSCREEN;
|
||||
decorView.setSystemUiVisibility(uiOptions);
|
||||
}
|
||||
public void setCurrentPage(int page) {
|
||||
currentPage = page;
|
||||
}
|
||||
|
||||
public void hideStatusBar() {
|
||||
View decorView = getWindow().getDecorView();
|
||||
int uiOptions = View.SYSTEM_UI_FLAG_FULLSCREEN;
|
||||
decorView.setSystemUiVisibility(uiOptions);
|
||||
}
|
||||
|
||||
public void enableHardwareAcceleration() {
|
||||
|
@ -129,4 +80,7 @@ public class ReaderActivity extends BaseRxActivity<ReaderPresenter> {
|
|||
WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
|
||||
}
|
||||
|
||||
public boolean onImageTouch(MotionEvent motionEvent) {
|
||||
return viewer.onImageTouch(motionEvent);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -71,7 +71,7 @@ public class ReaderPageFragment extends Fragment {
|
|||
imageView.setPanLimit(SubsamplingScaleImageView.PAN_LIMIT_INSIDE);
|
||||
imageView.setMinimumScaleType(SubsamplingScaleImageView.SCALE_TYPE_CENTER_INSIDE);
|
||||
imageView.setOnTouchListener((v, motionEvent) ->
|
||||
((ReaderActivity) getActivity()).getViewPager().onImageTouch(motionEvent));
|
||||
((ReaderActivity) getActivity()).onImageTouch(motionEvent));
|
||||
|
||||
progressBar.setVisibility(View.VISIBLE);
|
||||
|
||||
|
|
|
@ -0,0 +1,24 @@
|
|||
package eu.kanade.mangafeed.ui.viewer;
|
||||
|
||||
import android.widget.FrameLayout;
|
||||
|
||||
import eu.kanade.mangafeed.ui.activity.ReaderActivity;
|
||||
import eu.kanade.mangafeed.ui.viewer.base.ViewPagerViewer;
|
||||
|
||||
public class LeftToRightViewer extends ViewPagerViewer {
|
||||
|
||||
public LeftToRightViewer(ReaderActivity activity, FrameLayout container) {
|
||||
super(activity, container);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFirstPageOut() {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onLastPageOut() {
|
||||
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,47 @@
|
|||
package eu.kanade.mangafeed.ui.viewer;
|
||||
|
||||
import android.widget.FrameLayout;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
import eu.kanade.mangafeed.data.models.Page;
|
||||
import eu.kanade.mangafeed.ui.activity.ReaderActivity;
|
||||
import eu.kanade.mangafeed.ui.viewer.base.ViewPagerViewer;
|
||||
|
||||
public class RightToLeftViewer extends ViewPagerViewer {
|
||||
|
||||
public RightToLeftViewer(ReaderActivity activity, FrameLayout container) {
|
||||
super(activity, container);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPageListReady(List<Page> pages) {
|
||||
ArrayList<Page> inversedPages = new ArrayList<>(pages);
|
||||
Collections.reverse(inversedPages);
|
||||
adapter.setPages(inversedPages);
|
||||
viewPager.setCurrentItem(adapter.getCount()-1);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getCurrentPageFromPos(int position) {
|
||||
return getTotalPages() - position;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getPosFromPage(Page page) {
|
||||
return getTotalPages() - (page.getPageNumber() + 1);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFirstPageOut() {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onLastPageOut() {
|
||||
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,38 @@
|
|||
package eu.kanade.mangafeed.ui.viewer.base;
|
||||
|
||||
import android.view.MotionEvent;
|
||||
import android.widget.FrameLayout;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import eu.kanade.mangafeed.data.models.Page;
|
||||
import eu.kanade.mangafeed.ui.activity.ReaderActivity;
|
||||
|
||||
public abstract class BaseViewer {
|
||||
|
||||
protected ReaderActivity activity;
|
||||
protected FrameLayout container;
|
||||
protected int currentPosition;
|
||||
|
||||
public BaseViewer(ReaderActivity activity, FrameLayout container) {
|
||||
this.activity = activity;
|
||||
this.container = container;
|
||||
}
|
||||
|
||||
public void updatePageNumber() {
|
||||
activity.onPageChanged(getCurrentPageFromPos(currentPosition), getTotalPages());
|
||||
}
|
||||
|
||||
public int getCurrentPageFromPos(int position) {
|
||||
return position + 1;
|
||||
}
|
||||
|
||||
public int getPosFromPage(Page page) {
|
||||
return page.getPageNumber();
|
||||
}
|
||||
|
||||
public abstract int getTotalPages();
|
||||
public abstract void onImageReady(Page page);
|
||||
public abstract void onPageListReady(List<Page> pages);
|
||||
public abstract boolean onImageTouch(MotionEvent motionEvent);
|
||||
}
|
|
@ -0,0 +1,81 @@
|
|||
package eu.kanade.mangafeed.ui.viewer.base;
|
||||
|
||||
import android.view.MotionEvent;
|
||||
import android.widget.FrameLayout;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import eu.kanade.mangafeed.R;
|
||||
import eu.kanade.mangafeed.data.models.Page;
|
||||
import eu.kanade.mangafeed.ui.activity.ReaderActivity;
|
||||
import eu.kanade.mangafeed.ui.adapter.ReaderPageAdapter;
|
||||
import eu.kanade.mangafeed.widget.ReaderViewPager;
|
||||
|
||||
public abstract class ViewPagerViewer extends BaseViewer {
|
||||
|
||||
protected ReaderViewPager viewPager;
|
||||
protected ReaderPageAdapter adapter;
|
||||
|
||||
public ViewPagerViewer(ReaderActivity activity, FrameLayout container) {
|
||||
super(activity, container);
|
||||
activity.getLayoutInflater().inflate(R.layout.viewer_viewpager, container);
|
||||
|
||||
adapter = new ReaderPageAdapter(activity.getSupportFragmentManager());
|
||||
viewPager = (ReaderViewPager) activity.findViewById(R.id.view_pager);
|
||||
viewPager.setAdapter(adapter);
|
||||
viewPager.setOffscreenPageLimit(3);
|
||||
viewPager.addOnPageChangeListener(new ReaderViewPager.OnPageChangeListener() {
|
||||
@Override
|
||||
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPageSelected(int position) {
|
||||
currentPosition = position;
|
||||
updatePageNumber();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPageScrollStateChanged(int state) {
|
||||
|
||||
}
|
||||
});
|
||||
viewPager.setOnChapterBoundariesOutListener(new ReaderViewPager.OnChapterBoundariesOutListener() {
|
||||
@Override
|
||||
public void onFirstPageOutEvent() {
|
||||
onFirstPageOut();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onLastPageOutEvent() {
|
||||
onLastPageOut();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getTotalPages() {
|
||||
return adapter.getCount();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPageListReady(List<Page> pages) {
|
||||
adapter.setPages(pages);
|
||||
updatePageNumber();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onImageReady(Page page) {
|
||||
adapter.replacePage(getPosFromPage(page), page);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onImageTouch(MotionEvent motionEvent) {
|
||||
return viewPager.onImageTouch(motionEvent);
|
||||
}
|
||||
|
||||
public abstract void onFirstPageOut();
|
||||
public abstract void onLastPageOut();
|
||||
|
||||
}
|
|
@ -51,7 +51,7 @@ public class ReaderViewPager extends ViewPager {
|
|||
float displacement = ev.getX() - startDragX;
|
||||
|
||||
if (ev.getX() > startDragX && displacement > getWidth() * SWIPE_TOLERANCE) {
|
||||
mOnChapterBoundariesOutListener.onFirstPageOut();
|
||||
mOnChapterBoundariesOutListener.onFirstPageOutEvent();
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -62,7 +62,7 @@ public class ReaderViewPager extends ViewPager {
|
|||
float displacement = startDragX - ev.getX();
|
||||
|
||||
if (ev.getX() < startDragX && displacement > getWidth() * SWIPE_TOLERANCE) {
|
||||
mOnChapterBoundariesOutListener.onLastPageOut();
|
||||
mOnChapterBoundariesOutListener.onLastPageOutEvent();
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -84,9 +84,9 @@ public class ReaderViewPager extends ViewPager {
|
|||
}
|
||||
|
||||
public interface OnChapterBoundariesOutListener {
|
||||
public void onFirstPageOut();
|
||||
public void onFirstPageOutEvent();
|
||||
|
||||
public void onLastPageOut();
|
||||
public void onLastPageOutEvent();
|
||||
}
|
||||
|
||||
public interface OnChapterSingleTapListener {
|
||||
|
@ -114,7 +114,7 @@ public class ReaderViewPager extends ViewPager {
|
|||
setCurrentItem(position - 1, true);
|
||||
} else {
|
||||
if (mOnChapterBoundariesOutListener != null) {
|
||||
mOnChapterBoundariesOutListener.onFirstPageOut();
|
||||
mOnChapterBoundariesOutListener.onFirstPageOutEvent();
|
||||
}
|
||||
}
|
||||
} else if (positionX > getWidth() * RIGHT_REGION) {
|
||||
|
@ -122,7 +122,7 @@ public class ReaderViewPager extends ViewPager {
|
|||
setCurrentItem(position + 1, true);
|
||||
} else {
|
||||
if (mOnChapterBoundariesOutListener != null) {
|
||||
mOnChapterBoundariesOutListener.onLastPageOut();
|
||||
mOnChapterBoundariesOutListener.onLastPageOutEvent();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -3,11 +3,11 @@
|
|||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
|
||||
<eu.kanade.mangafeed.widget.ReaderViewPager
|
||||
android:id="@+id/view_pager"
|
||||
<FrameLayout
|
||||
android:id="@+id/viewer"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content">
|
||||
</eu.kanade.mangafeed.widget.ReaderViewPager>
|
||||
</FrameLayout>
|
||||
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
|
|
7
app/src/main/res/layout/viewer_viewpager.xml
Normal file
7
app/src/main/res/layout/viewer_viewpager.xml
Normal file
|
@ -0,0 +1,7 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<eu.kanade.mangafeed.widget.ReaderViewPager
|
||||
android:id="@+id/view_pager"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
</eu.kanade.mangafeed.widget.ReaderViewPager>
|
Reference in a new issue