From 4e2caa5b4d4857334a227611433cdc48a1b3a2eb Mon Sep 17 00:00:00 2001 From: seven332 Date: Wed, 29 Jul 2015 10:18:31 +0800 Subject: [PATCH] Update --- .../ehviewer/gallery/GalleryProvider.java | 4 + .../hippo/ehviewer/gallery/GallerySpider.java | 5 +- .../hippo/ehviewer/gallery/ImageHandler.java | 20 +-- .../hippo/ehviewer/gallery/SpiderQueen.java | 4 +- .../ehviewer/gallery/ZipGalleryProvider.java | 4 +- .../ehviewer/gallery/ui/GalleryPageView.java | 25 ++- .../ehviewer/gallery/ui/GalleryView.java | 169 ++++++++++++++---- .../gallery/ui/GestureRecognizer.java | 20 ++- .../ehviewer/gallery/ui/ScaledImageView.java | 30 +++- .../hippo/ehviewer/ui/GalleryActivity.java | 80 ++++++--- .../ehviewer/ui/scene/GalleryDetailScene.java | 13 +- .../preference/DownloadSettingsScene.java | 2 +- .../com/hippo/network/DownloadClient.java | 24 ++- unifile | 2 +- yorozuya | 2 +- 15 files changed, 292 insertions(+), 112 deletions(-) diff --git a/app/src/main/java/com/hippo/ehviewer/gallery/GalleryProvider.java b/app/src/main/java/com/hippo/ehviewer/gallery/GalleryProvider.java index dd6355138..aae583d92 100644 --- a/app/src/main/java/com/hippo/ehviewer/gallery/GalleryProvider.java +++ b/app/src/main/java/com/hippo/ehviewer/gallery/GalleryProvider.java @@ -16,6 +16,8 @@ package com.hippo.ehviewer.gallery; +import android.graphics.Bitmap; + public interface GalleryProvider { /** @@ -71,6 +73,8 @@ public interface GalleryProvider { void setPause(boolean pause); + void releaseBitmap(Bitmap bitmap); + void addGalleryProviderListener(GalleryProviderListener listener); void removeGalleryProviderListener(GalleryProviderListener listener); diff --git a/app/src/main/java/com/hippo/ehviewer/gallery/GallerySpider.java b/app/src/main/java/com/hippo/ehviewer/gallery/GallerySpider.java index 2e43aac13..8492cc473 100644 --- a/app/src/main/java/com/hippo/ehviewer/gallery/GallerySpider.java +++ b/app/src/main/java/com/hippo/ehviewer/gallery/GallerySpider.java @@ -105,7 +105,10 @@ public class GallerySpider implements GalleryProvider, SpiderQueen.SpiderListene DBUtils.addDirname(galleryBase, dirname); } - mDownloadDir = Settings.getDownloadPath().createDirectory(dirname); + UniFile dir = Settings.getImageDownloadLocation(); + if (dir != null) { + mDownloadDir = dir.createDirectory(dirname); + } if (mDownloadDir == null) { throw new IOException("Can't get download dir"); diff --git a/app/src/main/java/com/hippo/ehviewer/gallery/ImageHandler.java b/app/src/main/java/com/hippo/ehviewer/gallery/ImageHandler.java index db6d24957..34cb1ed48 100644 --- a/app/src/main/java/com/hippo/ehviewer/gallery/ImageHandler.java +++ b/app/src/main/java/com/hippo/ehviewer/gallery/ImageHandler.java @@ -233,14 +233,6 @@ public class ImageHandler { if (mMode == Mode.READ) { osPipe = getReadOutputStreamPipe(index); - } else if (mMode == Mode.DOWNLOAD) { - // Let download listener to fix filename - String filename = getImageFilename(index, "jpg"); - osPipe = getDownloadOutputStreamPipe(filename); - } - - if (osPipe == null) { - throw new IOException("Can't create OutputStreamPipe"); } if (helper.mCancel) { @@ -252,7 +244,15 @@ public class ImageHandler { helper.mRequest = request; request.setHttpClient(httpClient); request.setUrl(url); - request.setOSPipe(osPipe); + + if (mMode == Mode.READ) { + request.setOSPipe(osPipe); + } else if (mMode == Mode.DOWNLOAD) { + // Let download listener to fix filename + request.setFilename(getImageFilename(index, "jpg")); + request.setDir(mDownloadDir); + } + request.setListener(downloadListener); DownloadClient.execute(request); @@ -287,7 +287,7 @@ public class ImageHandler { } @Override - public String onFixname(String newFilename, String newExtension, String oldFilename) { + public String onFixname(String newFileFirstname, String newExtension, String oldFilename) { String filename; if (TextUtils.isEmpty(newExtension)) { filename = oldFilename; diff --git a/app/src/main/java/com/hippo/ehviewer/gallery/SpiderQueen.java b/app/src/main/java/com/hippo/ehviewer/gallery/SpiderQueen.java index 4c02a8bc4..f8b45c5a5 100644 --- a/app/src/main/java/com/hippo/ehviewer/gallery/SpiderQueen.java +++ b/app/src/main/java/com/hippo/ehviewer/gallery/SpiderQueen.java @@ -31,6 +31,7 @@ import com.hippo.httpclient.HttpResponse; import com.hippo.unifile.UniFile; import com.hippo.yorozuya.AutoExpandArray; import com.hippo.yorozuya.IOUtils; +import com.hippo.yorozuya.PriorityThread; import com.hippo.yorozuya.PriorityThreadFactory; import com.hippo.yorozuya.Say; @@ -567,8 +568,7 @@ public class SpiderQueen implements Runnable { setGetSizeFinished(false); ensureWorker(); mRender = new Render(); - Thread thread = new Thread(mRender, "Render"); - thread.setPriority(Process.THREAD_PRIORITY_BACKGROUND); + Thread thread = new PriorityThread(mRender, "Render", Process.THREAD_PRIORITY_BACKGROUND); thread.start(); // 7. tell listener pages diff --git a/app/src/main/java/com/hippo/ehviewer/gallery/ZipGalleryProvider.java b/app/src/main/java/com/hippo/ehviewer/gallery/ZipGalleryProvider.java index 928411fd0..c5fbb8a74 100644 --- a/app/src/main/java/com/hippo/ehviewer/gallery/ZipGalleryProvider.java +++ b/app/src/main/java/com/hippo/ehviewer/gallery/ZipGalleryProvider.java @@ -6,6 +6,7 @@ import android.os.Process; import com.hippo.conaco.BitmapPool; import com.hippo.yorozuya.IOUtils; +import com.hippo.yorozuya.PriorityThread; import com.hippo.yorozuya.Say; import com.hippo.yorozuya.SimpleHandler; import com.hippo.yorozuya.StringUtils; @@ -45,8 +46,7 @@ public class ZipGalleryProvider implements GalleryProvider, Runnable { public ZipGalleryProvider(File file) throws IOException { mZipFile = new ZipFile(file); - Thread thread = new Thread(this); - thread.setPriority(Process.THREAD_PRIORITY_BACKGROUND); + Thread thread = new PriorityThread(this, "ZipGalleryProvider", Process.THREAD_PRIORITY_BACKGROUND); thread.start(); } diff --git a/app/src/main/java/com/hippo/ehviewer/gallery/ui/GalleryPageView.java b/app/src/main/java/com/hippo/ehviewer/gallery/ui/GalleryPageView.java index 60de75783..3f2bb8b6a 100644 --- a/app/src/main/java/com/hippo/ehviewer/gallery/ui/GalleryPageView.java +++ b/app/src/main/java/com/hippo/ehviewer/gallery/ui/GalleryPageView.java @@ -49,7 +49,6 @@ public class GalleryPageView extends FrameView { addComponent(mLinearView, lp); } - @SuppressWarnings("ResourceType") private void updateSeen() { Rect bounds = bounds(); Rect parentBounds = mParent.bounds(); @@ -63,21 +62,13 @@ public class GalleryPageView extends FrameView { } @Override - protected void onLayout(boolean changeSize, int left, int top, int right, int bottom) { - super.onLayout(changeSize, left, top, right, bottom); + public void layout(int left, int top, int right, int bottom) { + super.layout(left, top, right, bottom); updateSeen(); } - @Override - public void offsetLeftAndRight(int offset) { - super.offsetLeftAndRight(offset); - updateSeen(); - } - - @Override - public void offsetTopAndBottom(int offset) { - super.offsetTopAndBottom(offset); - updateSeen(); + public boolean isLoaded() { + return mImageView.isLoaded(); } public void setScaleOffset(GalleryView.Scale scale, @@ -92,4 +83,12 @@ public class GalleryPageView extends FrameView { public void scale(float focusX, float focusY, float scale) { mImageView.scale(focusX, focusY, scale); } + + public float getFitScale() { + return mImageView.getFitScale(); + } + + public float getScale() { + return mImageView.getScale(); + } } diff --git a/app/src/main/java/com/hippo/ehviewer/gallery/ui/GalleryView.java b/app/src/main/java/com/hippo/ehviewer/gallery/ui/GalleryView.java index da003b53d..32c103671 100644 --- a/app/src/main/java/com/hippo/ehviewer/gallery/ui/GalleryView.java +++ b/app/src/main/java/com/hippo/ehviewer/gallery/ui/GalleryView.java @@ -4,12 +4,14 @@ import android.content.Context; import android.util.SparseArray; import android.view.MotionEvent; import android.view.animation.Interpolator; +import android.view.animation.OvershootInterpolator; import com.hippo.ehviewer.R; import com.hippo.ehviewer.gallery.anim.Animation; import com.hippo.ehviewer.gallery.glrenderer.GLCanvas; import com.hippo.ehviewer.gallery.util.GalleryUtils; import com.hippo.yorozuya.IntArray; +import com.hippo.yorozuya.MathUtils; import java.util.ArrayList; import java.util.List; @@ -26,6 +28,17 @@ public class GalleryView extends GLView implements GestureRecognizer.Listener { private static final int SEEN = 1; private static final int UNSEEN = 2; + private static final Interpolator SMOOTH_SCROLLER_INTERPOLATOR = new Interpolator() { + + @Override + public float getInterpolation(float t) { + t -= 1.0f; + return t * t * t * t * t + 1.0f; + } + }; + + private static final Interpolator SMOOTH_SCALER_INTERPOLATOR = new OvershootInterpolator(); + private boolean mEnableRequestLayout = true; private GestureRecognizer mGestureRecognizer; @@ -54,23 +67,15 @@ public class GalleryView extends GLView implements GestureRecognizer.Listener { private Mode mMode = Mode.NONE; private Mode mLastLayoutMode = Mode.NONE; - private Scale mScaleMode = Scale.FIT_HEIGHT; // TODO + private Scale mScaleMode = Scale.FIT; // TODO private StartPosition mStartPosition = StartPosition.TOP_RIGHT; // TODO - private float mLastScale = 2f; + private float mLastScale = 1f; private int mProgressSpec = MeasureSpec.makeMeasureSpec(48, MeasureSpec.EXACTLY); public int mInterval = 24; private SmoothScroller mSmoothScroller; - - private static final Interpolator sInterpolator = new Interpolator() { - - @Override - public float getInterpolation(float t) { - t -= 1.0f; - return t * t * t * t * t + 1.0f; - } - }; + private SmoothScaler mSmoothScaler; public enum Mode { NONE, // Just a progress view @@ -80,16 +85,11 @@ public class GalleryView extends GLView implements GestureRecognizer.Listener { } public enum Scale { - ORIGIN (0), - FIT_WIDTH (1), - FIT_HEIGHT (2), - FIT (3), - FIXED (4); - - Scale(int ni) { - nativeInt = ni; - } - final int nativeInt; + ORIGIN, + FIT_WIDTH, + FIT_HEIGHT, + FIT, + FIXED } public enum StartPosition { @@ -104,7 +104,9 @@ public class GalleryView extends GLView implements GestureRecognizer.Listener { mEdgeView = new EdgeView(context); mGestureRecognizer = new GestureRecognizer(context, this); mSmoothScroller = new SmoothScroller(); - mSmoothScroller.setInterpolator(sInterpolator); + mSmoothScroller.setInterpolator(SMOOTH_SCROLLER_INTERPOLATOR); + mSmoothScaler = new SmoothScaler(); + mSmoothScaler.setInterpolator(SMOOTH_SCALER_INTERPOLATOR); setBackgroundColor(GalleryUtils.intColorToFloatARGBArray(context.getResources().getColor(R.color.gallery_background))); } @@ -149,6 +151,9 @@ public class GalleryView extends GLView implements GestureRecognizer.Listener { } public void scrollToPage(int page) { + mSmoothScroller.forceStop(); + mSmoothScaler.forceStop(); + if (page < 0 || page >= mAdapter.getPages()) { return; } @@ -159,14 +164,16 @@ public class GalleryView extends GLView implements GestureRecognizer.Listener { } public void smoothScrollToPage(int page) { + mSmoothScroller.forceStop(); + mSmoothScaler.forceStop(); + // TODO } private void scrollX(int offset) { if (offset == 0 || (mMode != Mode.LEFT_TO_RIGHT && mMode != Mode.RIGHT_TO_LEFT)) { return; } - offChildsetLeftAndRight(offset); // TODO Really need it ? mLayoutOffset += offset; boolean reverse = mMode == Mode.RIGHT_TO_LEFT; @@ -209,16 +216,66 @@ public class GalleryView extends GLView implements GestureRecognizer.Listener { @Override public boolean onSingleTapUp(float x, float y) { - return false; + return true; + } + + @Override + public boolean onSingleTapConfirmed(float x, float y) { + + if (mMode == Mode.LEFT_TO_RIGHT || mMode == Mode.RIGHT_TO_LEFT) { + + if (x < getWidth() / 2) { + if (mFirstShownIndex > 0) { + scrollToPage(mFirstShownIndex - 1); + } else { + mEdgeView.onPull(getWidth() * 2, EdgeView.LEFT); + } + } else { + if (mFirstShownIndex < mAdapter.getPages() - 1) { + scrollToPage(mFirstShownIndex + 1); + } else { + mEdgeView.onPull(getWidth() * 2, EdgeView.RIGHT); + } + } + } + + return true; } @Override public boolean onDoubleTap(float x, float y) { - return false; + return true; + } + + @Override + public boolean onDoubleTapConfirmed(float x, float y) { + if (mScale) { + return false; + } + + if ((mMode == Mode.LEFT_TO_RIGHT || mMode == Mode.RIGHT_TO_LEFT) && + mLayoutOffset == 0) { + GalleryPageView page = mPageMap.get(mFirstShownIndex); + if (page != null && page.isLoaded()) { + float scale = page.getScale(); + float fitScale = page.getFitScale(); + float centerScale = (1f + fitScale) / 2; + float targetScale; + if ((fitScale > 1f && scale > centerScale) || + (fitScale < 1f && scale < centerScale)) { + targetScale = 1f; + } else { + targetScale = fitScale; + } + mSmoothScaler.startSmoothScaler(page, x, y, scale, targetScale, 500); // TODO + } + } + + return true; } // Try to scroll to make mLayoutOffset == 0 - private int onScrollX1(int dx, int totalX) { + private int onScrollX1(int dx) { int remain; int actualDx; if (mLayoutOffset > 0 && dx > 0) { @@ -246,12 +303,12 @@ public class GalleryView extends GLView implements GestureRecognizer.Listener { actualDx = dx; } - onScrollX2(actualDx, totalX); + onScrollX2(actualDx); return remain; } - private int onScrollX2(int dx, int totalX) { + private int onScrollX2(int dx) { int remain = 0; if (mMode == Mode.LEFT_TO_RIGHT) { if (mFirstShownIndex == 0 && mLayoutOffset - dx > 0) { // Start @@ -286,11 +343,10 @@ public class GalleryView extends GLView implements GestureRecognizer.Listener { int dxI = (int) dx; int dyI = (int) dy; - int totalXI = (int) totalX; if (mMode == Mode.LEFT_TO_RIGHT || mMode == Mode.RIGHT_TO_LEFT) { int remain = dxI; if (remain != 0 && mLayoutOffset != 0) { - remain = onScrollX1(dxI, totalXI); + remain = onScrollX1(dxI); } if (remain != 0 && mLayoutOffset == 0) { GalleryPageView page = mPageMap.get(mFirstShownIndex); @@ -300,7 +356,7 @@ public class GalleryView extends GLView implements GestureRecognizer.Listener { } } if (remain != 0) { - remain = onScrollX2(dxI, totalXI); + remain = onScrollX2(dxI); } if (remain == 0) { @@ -333,6 +389,10 @@ public class GalleryView extends GLView implements GestureRecognizer.Listener { @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { + // TODO + + + return false; } @@ -362,8 +422,9 @@ public class GalleryView extends GLView implements GestureRecognizer.Listener { mScale = true; GalleryPageView page = mPageMap.get(mFirstShownIndex); - if (page != null) { + if (page != null && page.isLoaded()) { page.scale(focusX, focusY, scale); + mLastScale = page.getScale(); } return true; @@ -379,6 +440,7 @@ public class GalleryView extends GLView implements GestureRecognizer.Listener { mScale = false; mScroll = false; mSmoothScroller.forceStop(); + mSmoothScaler.forceStop(); } @Override @@ -435,6 +497,7 @@ public class GalleryView extends GLView implements GestureRecognizer.Listener { @Override protected void onLayout(boolean changeSize, int left, int top, int right, int bottom) { mSmoothScroller.forceStop(); + mSmoothScaler.forceStop(); mEdgeView.layout(left, top, right, bottom); /* TODO set all seen UNKNOWN_SEEN to setScaleAndOffset @@ -499,7 +562,7 @@ public class GalleryView extends GLView implements GestureRecognizer.Listener { } mInvalidAttachedComponent.clear(); - // Fill + // Fill TODO better to avoid make load image when stop int width = getWidth(); int height = getHeight(); int widthSpec = MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY); @@ -680,11 +743,16 @@ public class GalleryView extends GLView implements GestureRecognizer.Listener { } mEnableRequestLayout = true; + + invalidate(); } @Override protected void render(GLCanvas canvas) { - if (mSmoothScroller.calculate(AnimationTime.get())) { + long time = AnimationTime.get(); + boolean invalidate = mSmoothScroller.calculate(time); + invalidate |= mSmoothScaler.calculate(time); + if (invalidate) { invalidate(); } @@ -732,6 +800,39 @@ public class GalleryView extends GLView implements GestureRecognizer.Listener { public abstract void unbindPage(GalleryPageView view, int index); } + public class SmoothScaler extends Animation { + + private GalleryPageView mPage; + private float mFocusX; + private float mFocusY; + private float mStartScale; + private float mEndScale; + private float mLastScale; + + public void startSmoothScaler(GalleryPageView page, float focusX, float focusY, + float startScale, float endScale, int duration) { + mPage = page; + mFocusX = focusX; + mFocusY = focusY; + mStartScale = startScale; + mEndScale = endScale; + mLastScale = startScale; + setDuration(duration); + start(); + invalidate(); + } + + @Override + protected void onCalculate(float progress) { + float scale = MathUtils.lerp(mStartScale, mEndScale, progress); + mPage.scale(mFocusX, mFocusY, scale / mLastScale); + mLastScale = scale; + if (progress == 1.0f) { + mPage = null; + } + } + } + public class SmoothScroller extends Animation { private int mDx; diff --git a/app/src/main/java/com/hippo/ehviewer/gallery/ui/GestureRecognizer.java b/app/src/main/java/com/hippo/ehviewer/gallery/ui/GestureRecognizer.java index 338f145b6..e80ff6eeb 100644 --- a/app/src/main/java/com/hippo/ehviewer/gallery/ui/GestureRecognizer.java +++ b/app/src/main/java/com/hippo/ehviewer/gallery/ui/GestureRecognizer.java @@ -31,7 +31,9 @@ public class GestureRecognizer { public interface Listener { boolean onSingleTapUp(float x, float y); + boolean onSingleTapConfirmed(float x, float y); boolean onDoubleTap(float x, float y); + boolean onDoubleTapConfirmed(float x, float y); boolean onScroll(float dx, float dy, float totalX, float totalY); boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY); boolean onScaleBegin(float focusX, float focusY); @@ -50,8 +52,10 @@ public class GestureRecognizer { public GestureRecognizer(Context context, Listener listener) { mListener = listener; - mGestureDetector = new GestureDetectorCompat(context, new MyGestureListener(), + MyGestureListener gestureListener = new MyGestureListener(); + mGestureDetector = new GestureDetectorCompat(context, gestureListener, null /* ignoreMultitouch */); + mGestureDetector.setOnDoubleTapListener(gestureListener); mScaleDetector = new ScaleGestureDetector( context, new MyScaleListener()); mDownUpDetector = new DownUpDetector(new MyDownUpListener()); @@ -82,6 +86,20 @@ public class GestureRecognizer { return mListener.onSingleTapUp(e.getX(), e.getY()); } + @Override + public boolean onSingleTapConfirmed(MotionEvent e) { + return mListener.onSingleTapConfirmed(e.getX(), e.getY()); + } + + @Override + public boolean onDoubleTapEvent(MotionEvent e) { + if (e.getAction() == MotionEvent.ACTION_UP) { + return mListener.onDoubleTapConfirmed(e.getX(), e.getY()); + } else { + return true; + } + } + @Override public boolean onDoubleTap(MotionEvent e) { return mListener.onDoubleTap(e.getX(), e.getY()); diff --git a/app/src/main/java/com/hippo/ehviewer/gallery/ui/ScaledImageView.java b/app/src/main/java/com/hippo/ehviewer/gallery/ui/ScaledImageView.java index ff4db1f4d..7415f1f2d 100644 --- a/app/src/main/java/com/hippo/ehviewer/gallery/ui/ScaledImageView.java +++ b/app/src/main/java/com/hippo/ehviewer/gallery/ui/ScaledImageView.java @@ -26,7 +26,7 @@ public class ScaledImageView extends GLView { private GalleryView.Scale mScaleMode; private GalleryView.StartPosition mStartPosition; private float mLastScale; - private float mScale; + private float mScale = 1f; public void setTiledTexture(TiledTexture tiledTexture) { mTiledTexture = tiledTexture; @@ -277,6 +277,34 @@ public class ScaledImageView extends GLView { invalidate(); } + public float getScale() { + return mScale; + } + + public float getFitScale() { + int screenWidth = getWidth(); + int screenHeight = getHeight(); + + if (mTiledTexture == null || screenWidth == 0 || screenHeight == 0) { + return 1f; + } + + int imageWidth = mTiledTexture.getWidth(); + int imageHeight = mTiledTexture.getHeight(); + + float scaleX = (float) screenWidth / imageWidth; + float scaleY = (float) screenHeight / imageHeight; + if (scaleX < scaleY) { + return scaleX; + } else { + return scaleY; + } + } + + public boolean isLoaded() { + return mTiledTexture != null; + } + public void setSeen(Rect seen) { mSeen.set(seen); mSeenDirty = true; 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 2ed74fe2e..9f9d52177 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/GalleryActivity.java +++ b/app/src/main/java/com/hippo/ehviewer/ui/GalleryActivity.java @@ -20,6 +20,7 @@ import android.content.Intent; import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.Typeface; +import android.net.Uri; import android.os.Bundle; import android.support.annotation.Nullable; @@ -30,6 +31,7 @@ import com.hippo.ehviewer.gallery.GalleryProvider; import com.hippo.ehviewer.gallery.GalleryProviderListener; import com.hippo.ehviewer.gallery.GallerySpider; import com.hippo.ehviewer.gallery.ImageHandler; +import com.hippo.ehviewer.gallery.ZipGalleryProvider; import com.hippo.ehviewer.gallery.glrenderer.TextTexture; import com.hippo.ehviewer.gallery.glrenderer.TiledTexture; import com.hippo.ehviewer.gallery.ui.GLRootView; @@ -39,11 +41,16 @@ import com.hippo.ehviewer.gallery.ui.GalleryView; import com.hippo.util.SystemUiHelper; import com.hippo.yorozuya.LayoutUtils; +import java.io.File; import java.io.IOException; public class GalleryActivity extends StatsActivity implements TiledTexture.OnFreeBitmapListener, GalleryProviderListener { + public static final String ACTION_GALLERY_FROM_GALLERY_BASE = "com.hippo.ehviewer.gallery.action.GALLERY_FROM_GALLERY_BASE"; + public static final String ACTION_GALLERY_FROM_ARCHIVE = "com.hippo.ehviewer.gallery.action.GALLERY_FROM_ARCHIVE"; + public static final String KEY_GALLERY_BASE = "gallery_base"; + public static final String KEY_ARCHIVE_URI = "archive_uri"; private SystemUiHelper mSystemUiHelper; @@ -57,9 +64,7 @@ public class GalleryActivity extends StatsActivity implements TiledTexture.OnFre private TextTexture mTextTexture; - private GallerySpider mGallerySpider; - - private GalleryBase mGalleryBase; + private GalleryProvider mGalleryProvider; private boolean mDieYoung; @@ -67,35 +72,47 @@ public class GalleryActivity extends StatsActivity implements TiledTexture.OnFre private int mSize; - private boolean handleIntent(Intent intent) { + private boolean getGalleryProvider(Intent intent) { if (intent != null) { - mGalleryBase = intent.getParcelableExtra(KEY_GALLERY_BASE); - return mGalleryBase != null; - } else { - return false; + String action = intent.getAction(); + if (ACTION_GALLERY_FROM_GALLERY_BASE.equals(action)) { + GalleryBase galleryBase = intent.getParcelableExtra(KEY_GALLERY_BASE); + if (galleryBase != null) { + try { + // TODO get mode + mGalleryProvider = GallerySpider.obtain(galleryBase, ImageHandler.Mode.DOWNLOAD); + return true; + } catch (IOException e) { + e.printStackTrace(); + } + } + } else if (ACTION_GALLERY_FROM_ARCHIVE.equals(action)) { + Uri uri = intent.getParcelableExtra(KEY_ARCHIVE_URI); + if (uri != null) { + try { + // TODO support other archive + mGalleryProvider = new ZipGalleryProvider(new File(uri.getPath())); + return true; + } catch (IOException e) { + e.printStackTrace(); + } + } + } } + return false; } + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - if (!handleIntent(getIntent())) { + if (!getGalleryProvider(getIntent())) { mDieYoung = true; finish(); return; } - try { - mGallerySpider = GallerySpider.obtain(mGalleryBase, ImageHandler.Mode.DOWNLOAD); - } catch (IOException e) { - e.printStackTrace(); - mDieYoung = true; - finish(); - return; - } - mGallerySpider.addGalleryProviderListener(this); - mSystemUiHelper = new SystemUiHelper(this, SystemUiHelper.LEVEL_IMMERSIVE, SystemUiHelper.FLAG_LAYOUT_IN_SCREEN_OLDER_DEVICES | SystemUiHelper.FLAG_IMMERSIVE_STICKY); mSystemUiHelper.hide(); @@ -122,12 +139,13 @@ public class GalleryActivity extends StatsActivity implements TiledTexture.OnFre mGalleryView.setProgressSize(LayoutUtils.dp2pix(this, 56)); mGalleryView.setInterval(LayoutUtils.dp2pix(this, 48)); - mSize = mGallerySpider.size(); + mSize = mGalleryProvider.size(); if (mSize <= 0) { setMode(GalleryView.Mode.NONE); } else { setMode(GalleryView.Mode.LEFT_TO_RIGHT); } + mGalleryProvider.addGalleryProviderListener(this); glRootView.setContentPane(mGalleryView); } @@ -146,9 +164,15 @@ public class GalleryActivity extends StatsActivity implements TiledTexture.OnFre mTextTexture.recycle(); TiledTexture.setOnFreeBitmapListener(null); TiledTexture.freeResources(); - mGallerySpider.removeGalleryProviderListener(this); - GallerySpider.release(mGallerySpider); - mGallerySpider = null; + mGalleryProvider.removeGalleryProviderListener(this); + + if (mGalleryProvider instanceof GallerySpider) { + GallerySpider.release((GallerySpider) mGalleryProvider); + } else if (mGalleryProvider instanceof ZipGalleryProvider) { + ((ZipGalleryProvider) mGalleryProvider).stop(); + } + + mGalleryProvider = null; } // TODO free all TileTexture in GalleryView } @@ -162,8 +186,8 @@ public class GalleryActivity extends StatsActivity implements TiledTexture.OnFre @Override public void onFreeBitmapListener(Bitmap bitmap) { - if (mGallerySpider != null) { - mGallerySpider.releaseBitmap(bitmap); + if (mGalleryProvider != null) { + mGalleryProvider.releaseBitmap(bitmap); } } @@ -195,8 +219,8 @@ public class GalleryActivity extends StatsActivity implements TiledTexture.OnFre bindBitmap(page, bitmap); } } else { - if (mGallerySpider != null) { - mGallerySpider.releaseBitmap(bitmap); + if (mGalleryProvider != null) { + mGalleryProvider.releaseBitmap(bitmap); } } } @@ -281,7 +305,7 @@ public class GalleryActivity extends StatsActivity implements TiledTexture.OnFre } private void bind(GalleryPageView view, int index) { - Object result = mGallerySpider.request(index); + Object result = mGalleryProvider.request(index); if (result instanceof Float) { bindPercent(view, (Float) result); } else if (result == GalleryProvider.RESULT_WAIT) { diff --git a/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryDetailScene.java b/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryDetailScene.java index e49e446d2..a836d4328 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryDetailScene.java +++ b/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryDetailScene.java @@ -22,7 +22,6 @@ import android.content.Intent; import android.content.res.Resources; import android.graphics.drawable.Drawable; import android.text.Html; -import android.text.TextUtils; import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; @@ -151,13 +150,7 @@ public class GalleryDetailScene extends Scene implements View.OnClickListener, Conaco conaco = EhApplication.getConaco(getStageActivity()); mThumb.load(conaco, EhCacheKeyFactory.getThumbKey(gi.gid), gi.thumb); - String title; - if (Settings.getJpnTitle()) { - title = TextUtils.isEmpty(gi.titleJpn) ? gi.title : gi.titleJpn; - } else { - title = gi.title; - } - mTitle.setText(title); + mTitle.setText(EhUtils.getSuitableTitle(gi)); mUploader.setText(gi.uploader); mCategory.setText(EhUtils.getCategory(gi.category)); mCategory.setTextColor(EhUtils.getCategoryColor(gi.category)); @@ -281,7 +274,11 @@ public class GalleryDetailScene extends Scene implements View.OnClickListener, if (v == mRead) { Intent intent = new Intent(getStageActivity(), GalleryActivity.class); + intent.setAction(GalleryActivity.ACTION_GALLERY_FROM_GALLERY_BASE); intent.putExtra(GalleryActivity.KEY_GALLERY_BASE, mGalleryDetail); + //intent.setAction(GalleryActivity.ACTION_GALLERY_FROM_ARCHIVE); + //intent.putExtra(GalleryActivity.KEY_ARCHIVE_URI, + // Uri.fromFile(new File(Environment.getExternalStorageDirectory(), "a.zip"))); getStageActivity().startActivity(intent); } else if (v == mDownload) { diff --git a/app/src/main/java/com/hippo/ehviewer/ui/scene/preference/DownloadSettingsScene.java b/app/src/main/java/com/hippo/ehviewer/ui/scene/preference/DownloadSettingsScene.java index a580fd38b..bb7bb222d 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/scene/preference/DownloadSettingsScene.java +++ b/app/src/main/java/com/hippo/ehviewer/ui/scene/preference/DownloadSettingsScene.java @@ -64,7 +64,7 @@ public class DownloadSettingsScene extends PreferenceScene implements Preference imagePreference.setOnClickListener(this); String archiveSummary; - UniFile archiveDir = Settings.getImageDownloadLocation(); + UniFile archiveDir = Settings.getArchiveDownloadLocation(); if (archiveDir == null) { archiveSummary = resources.getString(R.string.unknown); } else { diff --git a/app/src/main/java/com/hippo/network/DownloadClient.java b/app/src/main/java/com/hippo/network/DownloadClient.java index 4402080c6..52dcad025 100644 --- a/app/src/main/java/com/hippo/network/DownloadClient.java +++ b/app/src/main/java/com/hippo/network/DownloadClient.java @@ -23,6 +23,7 @@ import com.hippo.httpclient.HttpRequest; import com.hippo.httpclient.HttpResponse; import com.hippo.io.UniFileOutputStreamPipe; import com.hippo.unifile.UniFile; +import com.hippo.yorozuya.FileUtils; import com.hippo.yorozuya.Utilities; import com.hippo.yorozuya.io.OutputStreamPipe; @@ -72,6 +73,7 @@ public class DownloadClient { return; } + UniFile uniFile = null; OutputStreamPipe osPipe = null; try { // Listener @@ -96,8 +98,8 @@ public class DownloadClient { } request.mFilename = filename; - // TODO use download file name then rename - UniFile uniFile = request.mDir.createDirectory(filename); + // Use Temp filename + uniFile = request.mDir.createFile(FileUtils.ensureFilename(filename + ".download")); if (uniFile == null) { // Listener if (listener != null) { @@ -118,7 +120,14 @@ public class DownloadClient { long receivedSize = transferData(httpResponse.getInputStream(), osPipe.open(), listener); - // TODO check contentLength == receivedSize + if (contentLength > 0 && contentLength != receivedSize) { + throw new IOException("contentLength is " + contentLength + ", but receivedSize is " + receivedSize); + } + + // Rename + if (uniFile != null && request.mFilename != null) { + uniFile.renameTo(request.mFilename); + } // Listener if (listener != null) { @@ -126,11 +135,8 @@ public class DownloadClient { } } catch (Exception e) { // remove download failed file - if (request.mFilename != null && request.mDir != null) { - UniFile file = request.mDir.findFile(request.mFilename); - if (file != null) { - file.delete(); - } + if (uniFile != null) { + uniFile.delete(); } if (listener != null) { @@ -177,7 +183,7 @@ public class DownloadClient { void onStartDownloading(); - String onFixname(String filename, String extension, String oldFilename); + String onFixname(String fileFirstname, String extension, String oldFilename); void onConnect(long totalSize); diff --git a/unifile b/unifile index 532f09d53..29bf62258 160000 --- a/unifile +++ b/unifile @@ -1 +1 @@ -Subproject commit 532f09d537f38793c051f014b07ea2c197841177 +Subproject commit 29bf6225863be2e1479096720fd506839545e79f diff --git a/yorozuya b/yorozuya index 482a8c483..8a6459d77 160000 --- a/yorozuya +++ b/yorozuya @@ -1 +1 @@ -Subproject commit 482a8c4838e163b2ce2aa76df7a47691bd448330 +Subproject commit 8a6459d77e79db41f8485cc0892b5eb9a2cd4e4d