Ver código fonte

Decouple viewer from the reader activity

inorichi 9 anos atrás
pai
commit
d3c83f0bf2

+ 2 - 2
app/src/main/java/eu/kanade/mangafeed/presenter/ReaderPresenter.java

@@ -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);
                     }

+ 23 - 69
app/src/main/java/eu/kanade/mangafeed/ui/activity/ReaderActivity.java

@@ -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);
-    }
-
-    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 ReaderViewPager getViewPager() {
-        return viewPager;
-    }
-
-
-    public void onPageList(List<Page> pages) {
-        adapter.setPages(pages);
-        updatePageNumber();
+    public void onPageListReady(List<Page> pages) {
+        viewer.onPageListReady(pages);
     }
 
-    public void onPageDownloaded(Page page) {
-        adapter.replacePage(page.getPageNumber(), page);
+    public void onImageReady(Page page) {
+        viewer.onImageReady(page);
     }
 
-    public void setCurrentPage(int position) {
-        viewPager.setCurrentItem(position);
+    public void onPageChanged(int currentPage, int totalPages) {
+        String page = currentPage + "/" + totalPages;
+        pageNumber.setText(page);
     }
 
-    private void updatePageNumber() {
-        String page = (currentPage+1) + "/" + adapter.getCount();
-        pageNumber.setText(page);
+    public void setCurrentPage(int page) {
+        currentPage = 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);
-        }
-
+        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);
+    }
 }

+ 1 - 1
app/src/main/java/eu/kanade/mangafeed/ui/fragment/ReaderPageFragment.java

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

+ 24 - 0
app/src/main/java/eu/kanade/mangafeed/ui/viewer/LeftToRightViewer.java

@@ -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() {
+
+    }
+
+}

+ 47 - 0
app/src/main/java/eu/kanade/mangafeed/ui/viewer/RightToLeftViewer.java

@@ -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() {
+
+    }
+
+}

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

@@ -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);
+}

+ 81 - 0
app/src/main/java/eu/kanade/mangafeed/ui/viewer/base/ViewPagerViewer.java

@@ -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();
+
+}

+ 6 - 6
app/src/main/java/eu/kanade/mangafeed/widget/ReaderViewPager.java

@@ -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 - 3
app/src/main/res/layout/activity_reader.xml

@@ -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 - 0
app/src/main/res/layout/viewer_viewpager.xml

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