From 1097396c52abb02076fe2b45f70407850fd83e4d Mon Sep 17 00:00:00 2001 From: seven332 Date: Mon, 22 Feb 2016 17:09:50 +0800 Subject: [PATCH] Improve gallery --- .../java/com/hippo/ehviewer/Settings.java | 16 ++ .../ehviewer/gallery/gl/GalleryView.java | 102 ++++++++++-- .../gallery/gl/PagerLayoutManager.java | 115 +++++++++++++ .../gallery/gl/ScrollLayoutManager.java | 81 +++++++++ .../hippo/ehviewer/ui/GalleryActivity.java | 156 +++++++++++++++--- app/src/main/res/layout/activity_gallery.xml | 11 +- app/src/main/res/values/arrays.xml | 12 ++ app/src/main/res/values/strings.xml | 4 + app/src/main/res/values/styles.xml | 9 + app/src/main/res/xml/read_settings.xml | 8 + 10 files changed, 475 insertions(+), 39 deletions(-) diff --git a/app/src/main/java/com/hippo/ehviewer/Settings.java b/app/src/main/java/com/hippo/ehviewer/Settings.java index a14562c4a..a5c473dc8 100644 --- a/app/src/main/java/com/hippo/ehviewer/Settings.java +++ b/app/src/main/java/com/hippo/ehviewer/Settings.java @@ -24,6 +24,7 @@ import android.support.annotation.NonNull; import android.support.annotation.Nullable; import com.hippo.ehviewer.client.EhConfig; +import com.hippo.ehviewer.gallery.gl.GalleryView; import com.hippo.unifile.UniFile; import com.hippo.yorozuya.NumberUtils; @@ -132,6 +133,21 @@ public class Settings { /******************** ****** Read ********************/ + private static final String KEY_READING_DIRECTION = "reading_direction"; + private static final int DEFAULT_READING_DIRECTION = GalleryView.LAYOUT_MODE_RIGHT_TO_LEFT; + + @SuppressWarnings("WrongConstant") + @GalleryView.LayoutMode + public static int getReadingDirection() { + int value = getIntFromStr(KEY_READING_DIRECTION, DEFAULT_READING_DIRECTION); + if (value != GalleryView.LAYOUT_MODE_LEFT_TO_RIGHT && + value != GalleryView.LAYOUT_MODE_RIGHT_TO_LEFT && + value != GalleryView.LAYOUT_MODE_TOP_TO_BOTTOM) { + value = GalleryView.LAYOUT_MODE_RIGHT_TO_LEFT; + } + return value; + } + private static final String KEY_VOLUME_PAGE = "volume_page"; private static final boolean DEFAULT_VOLUME_PAGE = false; diff --git a/app/src/main/java/com/hippo/ehviewer/gallery/gl/GalleryView.java b/app/src/main/java/com/hippo/ehviewer/gallery/gl/GalleryView.java index 5921f9cd2..d51dff0f6 100644 --- a/app/src/main/java/com/hippo/ehviewer/gallery/gl/GalleryView.java +++ b/app/src/main/java/com/hippo/ehviewer/gallery/gl/GalleryView.java @@ -45,6 +45,7 @@ import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.util.ArrayList; import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; public class GalleryView extends GLView implements GestureRecognizer.Listener { @@ -59,7 +60,7 @@ public class GalleryView extends GLView implements GestureRecognizer.Listener { @IntDef({LAYOUT_MODE_LEFT_TO_RIGHT, LAYOUT_MODE_RIGHT_TO_LEFT, LAYOUT_MODE_TOP_TO_BOTTOM}) @Retention(RetentionPolicy.SOURCE) - private @interface LayoutMode {} + public @interface LayoutMode {} public static final int BACKGROUND_COLOR = 0xff212121; private static final int PROGRESS_SIZE_IN_DP = 48; @@ -83,7 +84,8 @@ public class GalleryView extends GLView implements GestureRecognizer.Listener { private static final float[] LEFT_AREA = {0.0f, 0.0f, 1.0f / 3.0f, 1f}; private static final float[] RIGHT_AREA = {2.0f / 3.0f, 0.0f, 1.0f, 1f}; - private static final float[] CENTER_AREA = {1.0f / 3.0f, 2.0f / 5.0f, 2.0f / 3.0f, 3.0f / 5.0f}; + private static final float[] MENU_AREA = {1.0f / 3.0f, 0.0f, 2.0f / 3.0f, 3.0f / 4.0f}; + private static final float[] SLIDER_AREA = {1.0f / 3.0f, 3.0f / 4.0f, 2.0f / 3.0f, 1.0f}; private static final int METHOD_ON_SINGLE_TAP_UP = 0; private static final int METHOD_ON_SINGLE_TAP_CONFIRMED = 1; @@ -99,6 +101,7 @@ public class GalleryView extends GLView implements GestureRecognizer.Listener { private static final int METHOD_ON_POINTER_DOWN = 11; private static final int METHOD_ON_POINTER_UP = 12; private static final int METHOD_SET_LAYOUT_MODE = 13; + private static final int METHOD_CURRENT_PAGE = 14; private final Context mContext; private MovableTextTexture mPageTextTexture; @@ -130,28 +133,32 @@ public class GalleryView extends GLView implements GestureRecognizer.Listener { private final Rect mLeftArea = new Rect(); private final Rect mRightArea = new Rect(); - private final Rect mCenterArea = new Rect(); + private final Rect mMenuArea = new Rect(); + private final Rect mSliderArea = new Rect(); private final String mDefaultErrorStr; private final String mEmptyStr; @LayoutMode private int mLayoutMode = LAYOUT_MODE_RIGHT_TO_LEFT; + private int mIndex; @Scale private int mScaleMode = SCALE_FIT; @StartPosition private int mStartPosition = START_POSITION_TOP_LEFT; - private final ActionListener mListener; + private final Listener mListener; private final List mMethodList = new ArrayList<>(5); private final List mArgsList = new ArrayList<>(5); private final List mMethodListTemp = new ArrayList<>(5); private final List mArgsListTemp = new ArrayList<>(5); + private final AtomicInteger mCurrentIndex = new AtomicInteger(GalleryPageView.INVALID_INDEX); + public GalleryView(@NonNull Context context, @NonNull Adapter adapter, - ActionListener listener, @LayoutMode int layoutMode) { + Listener listener, @LayoutMode int layoutMode) { mContext = context; mAdapter = adapter; mListener = listener; @@ -200,6 +207,7 @@ public class GalleryView extends GLView implements GestureRecognizer.Listener { ensurePagerLayoutManager(); mPagerLayoutManager.setMode(PagerLayoutManager.MODE_LEFT_TO_RIGHT); mPagerLayoutManager.onAttach(mAdapter); + mPagerLayoutManager.setCurrentIndex(mIndex); mAdapter = null; mLayoutManager = mPagerLayoutManager; break; @@ -207,12 +215,14 @@ public class GalleryView extends GLView implements GestureRecognizer.Listener { ensurePagerLayoutManager(); mPagerLayoutManager.setMode(PagerLayoutManager.MODE_RIGHT_TO_LEFT); mPagerLayoutManager.onAttach(mAdapter); + mPagerLayoutManager.setCurrentIndex(mIndex); mAdapter = null; mLayoutManager = mPagerLayoutManager; break; case LAYOUT_MODE_TOP_TO_BOTTOM: ensureScrollLayoutManager(); mScrollLayoutManager.onAttach(mAdapter); + mScrollLayoutManager.setCurrentIndex(mIndex); mAdapter = null; mLayoutManager = mScrollLayoutManager; break; @@ -226,6 +236,7 @@ public class GalleryView extends GLView implements GestureRecognizer.Listener { super.onDetachFromRoot(); mEdgeView.onDetachFromRoot(); + mIndex = mLayoutManager.getInternalCurrentIndex(); mAdapter = mLayoutManager.onDetach(); mLayoutManager = null; @@ -233,6 +244,14 @@ public class GalleryView extends GLView implements GestureRecognizer.Listener { mPageTextTexture = null; } + public int getLayoutMode() { + return mLayoutMode; + } + + public int getCurrentIndex() { + return mCurrentIndex.get(); + } + @Override public void requestLayout() { // Do not need requestLayout, because the size will not change @@ -285,6 +304,10 @@ public class GalleryView extends GLView implements GestureRecognizer.Listener { postMethod(METHOD_SET_LAYOUT_MODE, layoutMode); } + public void setCurrentPage(int page) { + postMethod(METHOD_CURRENT_PAGE, page); + } + @Override public boolean onSingleTapUp(float x, float y) { postMethod(METHOD_ON_SINGLE_TAP_UP, x, y); @@ -293,7 +316,13 @@ public class GalleryView extends GLView implements GestureRecognizer.Listener { @Override public boolean onSingleTapConfirmed(float x, float y) { - postMethod(METHOD_ON_SINGLE_TAP_CONFIRMED, x, y); + if (mSliderArea.contains((int) x, (int) y)) { + mListener.onTapSliderArea(); + } else if (mMenuArea.contains((int) x, (int) y)) { + mListener.onTapMenuArea(); + } else { + postMethod(METHOD_ON_SINGLE_TAP_CONFIRMED, x, y); + } return true; } @@ -371,8 +400,10 @@ public class GalleryView extends GLView implements GestureRecognizer.Listener { (int) (LEFT_AREA[2] * width), (int) (LEFT_AREA[3] * height)); mRightArea.set((int) (RIGHT_AREA[0] * width), (int) (RIGHT_AREA[1] * height), (int) (RIGHT_AREA[2] * width), (int) (RIGHT_AREA[3] * height)); - mCenterArea.set((int) (CENTER_AREA[0] * width), (int) (CENTER_AREA[1] * height), - (int) (CENTER_AREA[2] * width), (int) (CENTER_AREA[3] * height)); + mMenuArea.set((int) (MENU_AREA[0] * width), (int) (MENU_AREA[1] * height), + (int) (MENU_AREA[2] * width), (int) (MENU_AREA[3] * height)); + mSliderArea.set((int) (SLIDER_AREA[0] * width), (int) (SLIDER_AREA[1] * height), + (int) (SLIDER_AREA[2] * width), (int) (SLIDER_AREA[3] * height)); } } @@ -389,6 +420,15 @@ public class GalleryView extends GLView implements GestureRecognizer.Listener { } private void onSingleTapConfirmedInternal(float x, float y) { + if (mLayoutManager == null) { + return; + } + + if (mLeftArea.contains((int) x, (int) y)) { + mLayoutManager.onPageLeft(); + } else if (mRightArea.contains((int) x, (int) y)) { + mLayoutManager.onPageRight(); + } } private void onDoubleTapInternal(float x, float y) { @@ -483,7 +523,9 @@ public class GalleryView extends GLView implements GestureRecognizer.Listener { } else { ensurePagerLayoutManager(); mPagerLayoutManager.setMode(PagerLayoutManager.MODE_LEFT_TO_RIGHT); + int index = mLayoutManager.getInternalCurrentIndex(); mPagerLayoutManager.onAttach(mLayoutManager.onDetach()); + mPagerLayoutManager.setCurrentIndex(index); mLayoutManager = mPagerLayoutManager; } break; @@ -494,13 +536,17 @@ public class GalleryView extends GLView implements GestureRecognizer.Listener { } else { ensurePagerLayoutManager(); mPagerLayoutManager.setMode(PagerLayoutManager.MODE_RIGHT_TO_LEFT); + int index = mLayoutManager.getInternalCurrentIndex(); mPagerLayoutManager.onAttach(mLayoutManager.onDetach()); + mPagerLayoutManager.setCurrentIndex(index); mLayoutManager = mPagerLayoutManager; } break; case LAYOUT_MODE_TOP_TO_BOTTOM: ensureScrollLayoutManager(); + int index = mLayoutManager.getInternalCurrentIndex(); mScrollLayoutManager.onAttach(mLayoutManager.onDetach()); + mScrollLayoutManager.setCurrentIndex(index); mLayoutManager = mScrollLayoutManager; break; } @@ -508,6 +554,14 @@ public class GalleryView extends GLView implements GestureRecognizer.Listener { requestFill(); } + private void setCurrentPageInternal(int page) { + if (mLayoutManager != null) { + mLayoutManager.setCurrentIndex(page); + } else { + mIndex = page; + } + } + @RenderThread void forceFill() { mRequestFill = true; @@ -594,6 +648,8 @@ public class GalleryView extends GLView implements GestureRecognizer.Listener { case METHOD_SET_LAYOUT_MODE: setLayoutModeInternal((Integer) args[0]); break; + case METHOD_CURRENT_PAGE: + setCurrentPageInternal((Integer) args[0]); } } @@ -603,6 +659,8 @@ public class GalleryView extends GLView implements GestureRecognizer.Listener { @Override public void render(GLCanvas canvas) { + int oldCurrentIndex = mCurrentIndex.get(); + // Dispatch method dispatchMethod(); @@ -615,6 +673,18 @@ public class GalleryView extends GLView implements GestureRecognizer.Listener { super.render(canvas); mEdgeView.render(canvas); + + int newCurrentIndex; + if (mLayoutManager != null) { + newCurrentIndex = mLayoutManager.getCurrentIndex(); + } else { + newCurrentIndex = GalleryPageView.INVALID_INDEX; + } + mCurrentIndex.lazySet(newCurrentIndex); + + if (oldCurrentIndex != newCurrentIndex) { + mListener.onUpdateCurrentIndex(newCurrentIndex); + } } @RenderThread @@ -762,6 +832,10 @@ public class GalleryView extends GLView implements GestureRecognizer.Listener { public abstract void onDataChanged(); + public abstract void onPageLeft(); + + public abstract void onPageRight(); + public abstract GalleryPageView findPageByIndex(int index); /** @@ -769,6 +843,10 @@ public class GalleryView extends GLView implements GestureRecognizer.Listener { */ public abstract int getCurrentIndex(); + public abstract void setCurrentIndex(int index); + + abstract int getInternalCurrentIndex(); + protected void placeCenter(GLView view) { int spec = GLView.MeasureSpec.makeMeasureSpec(GLView.LayoutParams.WRAP_CONTENT, GLView.LayoutParams.WRAP_CONTENT); @@ -781,10 +859,12 @@ public class GalleryView extends GLView implements GestureRecognizer.Listener { } } - public interface ActionListener { + public interface Listener { - void onTapCenter(); + void onUpdateCurrentIndex(int index); - void onScrollToPage(int page, boolean internal); + void onTapSliderArea(); + + void onTapMenuArea(); } } diff --git a/app/src/main/java/com/hippo/ehviewer/gallery/gl/PagerLayoutManager.java b/app/src/main/java/com/hippo/ehviewer/gallery/gl/PagerLayoutManager.java index 3a477f6be..ed05ecaa7 100644 --- a/app/src/main/java/com/hippo/ehviewer/gallery/gl/PagerLayoutManager.java +++ b/app/src/main/java/com/hippo/ehviewer/gallery/gl/PagerLayoutManager.java @@ -639,6 +639,66 @@ public class PagerLayoutManager extends GalleryView.LayoutManager { mGalleryView.requestFill(); } + @Override + public void onPageLeft() { + int size = mAdapter.size(); + if (size <= 0 || mCurrent == null) { + return; + } + + if (mMode == MODE_LEFT_TO_RIGHT) { + if (mIndex == 0) { + GalleryView galleryView = mGalleryView; + GLEdgeView edgeView = galleryView.getEdgeView(); + edgeView.onPull(galleryView.getWidth(), + galleryView.getHeight() / 2, GLEdgeView.LEFT); + edgeView.onRelease(GLEdgeView.LEFT); + } else { + setCurrentIndex(mIndex - 1); + } + } else { + if (mIndex >= size - 1) { + GalleryView galleryView = mGalleryView; + GLEdgeView edgeView = galleryView.getEdgeView(); + edgeView.onPull(galleryView.getWidth(), + galleryView.getHeight() / 2, GLEdgeView.LEFT); + edgeView.onRelease(GLEdgeView.LEFT); + } else { + setCurrentIndex(mIndex + 1); + } + } + } + + @Override + public void onPageRight() { + int size = mAdapter.size(); + if (size <= 0 || mCurrent == null) { + return; + } + + if (mMode == MODE_LEFT_TO_RIGHT) { + if (mIndex >= size - 1) { + GalleryView galleryView = mGalleryView; + GLEdgeView edgeView = galleryView.getEdgeView(); + edgeView.onPull(galleryView.getWidth(), + galleryView.getHeight() / 2, GLEdgeView.RIGHT); + edgeView.onRelease(GLEdgeView.RIGHT); + } else { + setCurrentIndex(mIndex + 1); + } + } else { + if (mIndex == 0) { + GalleryView galleryView = mGalleryView; + GLEdgeView edgeView = galleryView.getEdgeView(); + edgeView.onPull(galleryView.getWidth(), + galleryView.getHeight() / 2, GLEdgeView.RIGHT); + edgeView.onRelease(GLEdgeView.RIGHT); + } else { + setCurrentIndex(mIndex - 1); + } + } + } + @Override public GalleryPageView findPageByIndex(int index) { if (mCurrent != null && mCurrent.getIndex() == index) { @@ -662,6 +722,61 @@ public class PagerLayoutManager extends GalleryView.LayoutManager { } } + @Override + public void setCurrentIndex(int index) { + int size = mAdapter.size(); + if (size <= 0) { + // Can't get size now, assume size is MAX + size = Integer.MAX_VALUE; + } + if (index == mIndex || index < 0 || index >= size) { + return; + } + if (mCurrent == null) { + mIndex = index; + } else if (index == mIndex - 1) { + // Cancel all animations + cancelAllAnimations(); + // Reset parameters + resetParameters(); + // Go to previous + pagePrevious(); + // Request fill + mGalleryView.requestFill(); + } else if (index == mIndex + 1) { + // Cancel all animations + cancelAllAnimations(); + // Reset parameters + resetParameters(); + // Go to next + pageNext(); + // Request fill + mGalleryView.requestFill(); + } else { + mIndex = index; + // It is attached, refill + // Cancel all animations + cancelAllAnimations(); + // Remove all view + removeProgress(); + removeErrorView(); + removeAllPages(); + // Reset parameters + resetParameters(); + // Request fill + mGalleryView.requestFill(); + } + } + + @Override + int getInternalCurrentIndex() { + int currentIndex = getCurrentIndex(); + if (currentIndex == GalleryPageView.INVALID_INDEX) { + currentIndex = mIndex; + } + return currentIndex; + } + class SmoothScroller extends Animation { private int mDx; diff --git a/app/src/main/java/com/hippo/ehviewer/gallery/gl/ScrollLayoutManager.java b/app/src/main/java/com/hippo/ehviewer/gallery/gl/ScrollLayoutManager.java index 211f9ed0d..604e1a41c 100644 --- a/app/src/main/java/com/hippo/ehviewer/gallery/gl/ScrollLayoutManager.java +++ b/app/src/main/java/com/hippo/ehviewer/gallery/gl/ScrollLayoutManager.java @@ -643,6 +643,28 @@ public class ScrollLayoutManager extends GalleryView.LayoutManager { mGalleryView.requestFill(); } + @Override + public void onPageLeft() { + /* + int size = mAdapter.size(); + if (size <= 0 || mPages.isEmpty()) { + return; + } + */ + // TODO + } + + @Override + public void onPageRight() { + /* + int size = mAdapter.size(); + if (size <= 0 || mPages.isEmpty()) { + return; + } + */ + // TODO + } + @Override public GalleryPageView findPageByIndex(int index) { for (GalleryPageView page : mPages) { @@ -667,6 +689,65 @@ public class ScrollLayoutManager extends GalleryView.LayoutManager { return GalleryPageView.INVALID_INDEX; } + @Override + public void setCurrentIndex(int index) { + int size = mAdapter.size(); + if (size <= 0) { + // Can't get size now, assume size is MAX + size = Integer.MAX_VALUE; + } + if (index == mIndex || index < 0 || index >= size) { + return; + } + if (mPages.isEmpty()) { + mIndex = index; + } else { + mIndex = index; + // Fix the index page + GalleryPageView targetPage = null; + for (GalleryPageView page : mPages) { + if (page.getIndex() == index) { + targetPage =page; + break; + } + } + + if (targetPage != null) { + // Cancel all animations + cancelAllAnimations(); + mOffset -= targetPage.bounds().top; + // Backup offset + int offset = mOffset; + // Reset parameters + resetParameters(); + // Restore offset + mOffset = offset; + // Request fill + mGalleryView.requestFill(); + } else { + // Cancel all animations + cancelAllAnimations(); + // Remove all view + removeProgress(); + removeErrorView(); + removeAllPages(); + // Reset parameters + resetParameters(); + // Request fill + mGalleryView.requestFill(); + } + } + } + + @Override + int getInternalCurrentIndex() { + int currentIndex = getCurrentIndex(); + if (currentIndex == GalleryPageView.INVALID_INDEX) { + currentIndex = mIndex; + } + return currentIndex; + } + class PageFling extends Fling { private int mVelocityX; diff --git a/app/src/main/java/com/hippo/ehviewer/ui/GalleryActivity.java b/app/src/main/java/com/hippo/ehviewer/ui/GalleryActivity.java index fc8239a4a..c01916be5 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/GalleryActivity.java +++ b/app/src/main/java/com/hippo/ehviewer/ui/GalleryActivity.java @@ -16,6 +16,8 @@ package com.hippo.ehviewer.ui; +import android.animation.Animator; +import android.annotation.SuppressLint; import android.content.Intent; import android.os.Bundle; import android.support.annotation.NonNull; @@ -25,6 +27,8 @@ import android.view.KeyEvent; import android.view.View; import android.widget.TextView; +import com.hippo.anani.AnimationUtils; +import com.hippo.anani.SimpleAnimatorListener; import com.hippo.ehviewer.R; import com.hippo.ehviewer.Settings; import com.hippo.ehviewer.client.data.GalleryInfo; @@ -40,11 +44,14 @@ import com.hippo.gl.view.GLRootView; import com.hippo.image.Image; import com.hippo.util.SystemUiHelper; import com.hippo.widget.Slider; +import com.hippo.yorozuya.ConcurrentPool; +import com.hippo.yorozuya.SimpleHandler; import java.io.File; public class GalleryActivity extends AppCompatActivity - implements GalleryProviderListener, Slider.OnSetProgressListener { + implements GalleryProviderListener, Slider.OnSetProgressListener, + GalleryView.Listener { public static final String ACTION_DIR = "dir"; public static final String ACTION_ZIP = "zip"; @@ -80,6 +87,30 @@ public class GalleryActivity extends AppCompatActivity @Nullable private Slider mSlider; + private int mLayoutMode; + private int mSize; + private int mCurrentIndex; + + private final ConcurrentPool mNotifyTaskPool = new ConcurrentPool<>(3); + + private final Runnable mRequestLayoutSliderTask = new Runnable() { + @Override + public void run() { + if (mSliderPanel != null) { + mSliderPanel.requestLayout(); + } + } + }; + + private final SimpleAnimatorListener mHideSliderListener = new SimpleAnimatorListener() { + @Override + public void onAnimationEnd(Animator animation) { + if (mSliderPanel != null) { + mSliderPanel.setVisibility(View.INVISIBLE); + } + } + }; + private void buildProvider() { if (mGalleryProvider != null) { return; @@ -153,7 +184,7 @@ public class GalleryActivity extends AppCompatActivity mUploader = new ImageTexture.Uploader(glRootView); mGalleryView = new GalleryView(this, new GalleryAdapter(), - null, GalleryView.LAYOUT_MODE_TOP_TO_BOTTOM); + this, Settings.getReadingDirection()); glRootView.setContentPane(mGalleryView); // System UI helper @@ -167,13 +198,16 @@ public class GalleryActivity extends AppCompatActivity mSystemUiShowing = true; } - /* mSliderPanel = findViewById(R.id.slider_panel); mLeftText = (TextView) mSliderPanel.findViewById(R.id.left); mRightText = (TextView) mSliderPanel.findViewById(R.id.right); mSlider = (Slider) mSliderPanel.findViewById(R.id.slider); mSlider.setOnSetProgressListener(this); - */ + + mSize = mGalleryProvider.size(); + mCurrentIndex = mGalleryView.getCurrentIndex(); + mLayoutMode = mGalleryView.getLayoutMode(); + updateSlider(); } @Override @@ -190,6 +224,7 @@ public class GalleryActivity extends AppCompatActivity mGalleryProvider = null; } + mSliderPanel = null; mLeftText = null; mRightText = null; mSlider = null; @@ -289,18 +324,27 @@ public class GalleryActivity extends AppCompatActivity } } - private void updateSlider(int size) { - if (mSlider == null) { + @SuppressLint("SetTextI18n") + private void updateSlider() { + if (mSlider == null || mRightText == null || mLeftText == null || mSize <= 0 || mCurrentIndex < 0) { return; } - if (size >= 0) { - mSlider.setRange(1, size); - - + TextView start; + TextView end; + if (mLayoutMode == GalleryView.LAYOUT_MODE_RIGHT_TO_LEFT) { + start = mRightText; + end = mLeftText; + mSlider.setReverse(true); } else { - // TODO hide slider + start = mLeftText; + end = mRightText; + mSlider.setReverse(false); } + start.setText(Integer.toString(mCurrentIndex + 1)); + end.setText(Integer.toString(mSize)); + mSlider.setRange(1, mSize); + mSlider.setProgress(mCurrentIndex + 1); } @Override @@ -308,16 +352,16 @@ public class GalleryActivity extends AppCompatActivity if (mGalleryView != null) { mGalleryView.onDataChanged(); } - /* - SimpleHandler.getInstance().post(new Runnable() { - @Override - public void run() { - if (mGalleryProvider != null) { - updateSlider(mGalleryProvider.size()); - } + + if (mGalleryProvider != null) { + int size = mGalleryProvider.size(); + NotifyTask task = mNotifyTaskPool.pop(); + if (task == null) { + task = new NotifyTask(); } - }); - */ + task.setData(NotifyTask.KEY_SIZE, size); + SimpleHandler.getInstance().post(task); + } } @Override @@ -369,8 +413,76 @@ public class GalleryActivity extends AppCompatActivity @Override public void onSetProgress(Slider slider, int newProgress, int oldProgress, boolean byUser, boolean confirm) { - if (confirm && mGalleryView != null) { - //mGalleryView.goToPage(newProgress); + if (confirm && byUser && mGalleryView != null) { + mGalleryView.setCurrentPage(newProgress - 1); + } + } + + @Override + public void onUpdateCurrentIndex(int index) { + NotifyTask task = mNotifyTaskPool.pop(); + if (task == null) { + task = new NotifyTask(); + } + task.setData(NotifyTask.KEY_CURRENT_INDEX, index); + SimpleHandler.getInstance().post(task); + } + + @Override + public void onTapSliderArea() { + if (mSliderPanel == null || mSize <= 0 || mCurrentIndex < 0) { + return; + } + + if (mSliderPanel.getVisibility() == View.VISIBLE) { + mSliderPanel.animate().translationY(mSliderPanel.getHeight()).setDuration(300) + .setInterpolator(AnimationUtils.SLOW_FAST_INTERPOLATOR) + .setListener(mHideSliderListener).start(); + } else { + mSliderPanel.setTranslationY(mSliderPanel.getHeight()); + mSliderPanel.setVisibility(View.VISIBLE); + mSliderPanel.animate().translationY(0.0f).setDuration(300) + .setInterpolator(AnimationUtils.SLOW_FAST_INTERPOLATOR) + .setListener(null).start(); + // Request layout ensure show it + SimpleHandler.getInstance().post(mRequestLayoutSliderTask); + } + } + + @Override + public void onTapMenuArea() { + + } + + private class NotifyTask implements Runnable { + + public static final int KEY_LAYOUT_MODE = 0; + public static final int KEY_SIZE = 1; + public static final int KEY_CURRENT_INDEX = 2; + + private int mKey; + private int mValue; + + public void setData(int key, int value) { + mKey = key; + mValue = value; + } + + @Override + public void run() { + switch (mKey) { + case KEY_LAYOUT_MODE: + GalleryActivity.this.mLayoutMode = mValue; + break; + case KEY_SIZE: + GalleryActivity.this.mSize = mValue; + break; + case KEY_CURRENT_INDEX: + GalleryActivity.this.mCurrentIndex = mValue; + break; + } + updateSlider(); + mNotifyTaskPool.push(this); } } diff --git a/app/src/main/res/layout/activity_gallery.xml b/app/src/main/res/layout/activity_gallery.xml index 785b83ef1..cb4415a48 100644 --- a/app/src/main/res/layout/activity_gallery.xml +++ b/app/src/main/res/layout/activity_gallery.xml @@ -46,17 +46,16 @@ app:color="@color/secondary_text_dark" app:warningColor="@color/red_500"/> - + diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml index 9f11c5b46..ebc938094 100644 --- a/app/src/main/res/values/arrays.xml +++ b/app/src/main/res/values/arrays.xml @@ -24,4 +24,16 @@ @string/star_5 + + @string/settings_read_reading_direction_left_to_right + @string/settings_read_reading_direction_right_to_Left + @string/settings_read_reading_direction_top_to_bottom + + + + 0 + 1 + 2 + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index fef302870..eb3d82324 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -218,6 +218,10 @@ Show default title. It is usually English title Read + Reading direction + Left to right + Right to left + Top to bottom Use volume key to turn pages diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 9b7cc7519..085dceb63 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -111,4 +111,13 @@ false + + diff --git a/app/src/main/res/xml/read_settings.xml b/app/src/main/res/xml/read_settings.xml index 20846f4cb..3af79229b 100644 --- a/app/src/main/res/xml/read_settings.xml +++ b/app/src/main/res/xml/read_settings.xml @@ -18,6 +18,14 @@ + +