diff --git a/app/src/main/java/com/hippo/ehviewer/client/EhClient.java b/app/src/main/java/com/hippo/ehviewer/client/EhClient.java
index 587f366a3..71246a860 100644
--- a/app/src/main/java/com/hippo/ehviewer/client/EhClient.java
+++ b/app/src/main/java/com/hippo/ehviewer/client/EhClient.java
@@ -397,9 +397,10 @@ public final class EhClient {
checkResponse(response);
GalleryDetailParser parser = new GalleryDetailParser();
- parser.parse(response.body().string(),
- GalleryDetailParser.REQUEST_DETAIL | GalleryDetailParser.REQUEST_TAG |
+ parser.parse(response.body().string(), GalleryDetailParser.REQUEST_DETAIL |
+ GalleryDetailParser.REQUEST_TAG |
GalleryDetailParser.REQUEST_PREVIEW_INFO |
+ GalleryDetailParser.REQUEST_PREVIEW |
GalleryDetailParser.REQUEST_COMMENT,
source);
@@ -471,4 +472,57 @@ public final class EhClient {
public void getGalleryDetail(int source, String url, OnGetGalleryDetailListener listener) {
doBgJob(new GetGalleryDetailHelper(source, url, listener));
}
+
+
+ public abstract static class OnGetPreviewSetListener implements SimpleListener {
+ public abstract void onSuccess(PreviewSet previewSet);
+ }
+
+ private PreviewSet doGetPreviewSet(int source, String url) throws Exception {
+ Request request = new Request.Builder()
+ .url(url)
+ .build();
+ Response response = mHttpClient.newCall(request).execute();
+
+ checkResponse(response);
+
+ GalleryDetailParser parser = new GalleryDetailParser();
+ parser.parse(response.body().string(), GalleryDetailParser.REQUEST_PREVIEW,
+ source);
+
+ return parser.previewSet;
+ }
+
+ private final class GetPreviewSetHelper extends SimpleBgJobHelper {
+
+ private int mSource;
+ private String mUrl;
+ private OnGetPreviewSetListener mListener;
+
+ private PreviewSet mPreviewSet;
+
+ public GetPreviewSetHelper(int source, String url, OnGetPreviewSetListener listener) {
+ super(listener);
+ mSource = source;
+ mUrl = url;
+ mListener = listener;
+ }
+
+ @Override
+ public void doBgJob() throws Exception {
+ mPreviewSet = doGetPreviewSet(mSource, mUrl);
+ }
+
+ @Override
+ public void doSuccessCallback() {
+ mListener.onSuccess(mPreviewSet);
+ }
+ }
+
+ /**
+ * Get gallery preview set
+ */
+ public void getPreviewSet(int source, String url, OnGetPreviewSetListener listener) {
+ doBgJob(new GetPreviewSetHelper(source, url, listener));
+ }
}
diff --git a/app/src/main/java/com/hippo/ehviewer/client/GalleryDetailParser.java b/app/src/main/java/com/hippo/ehviewer/client/GalleryDetailParser.java
index b37b7fb7c..ce83e7a21 100644
--- a/app/src/main/java/com/hippo/ehviewer/client/GalleryDetailParser.java
+++ b/app/src/main/java/com/hippo/ehviewer/client/GalleryDetailParser.java
@@ -277,7 +277,7 @@ public class GalleryDetailParser {
}
// Get preview
- if ((request & REQUEST_PREVIEW_INFO) != 0) {
+ if ((request & REQUEST_PREVIEW) != 0) {
parsePreview(body);
}
diff --git a/app/src/main/java/com/hippo/ehviewer/client/data/NormalPreviewSet.java b/app/src/main/java/com/hippo/ehviewer/client/data/NormalPreviewSet.java
index e5fb984fd..9c8f71bd2 100644
--- a/app/src/main/java/com/hippo/ehviewer/client/data/NormalPreviewSet.java
+++ b/app/src/main/java/com/hippo/ehviewer/client/data/NormalPreviewSet.java
@@ -78,7 +78,9 @@ public class NormalPreviewSet extends PreviewSet {
ImageView[] imageViews = new ImageView[rowSize];
for (int j = 0; j < rowSize; j++) {
ViewGroup viewGroup = (ViewGroup) simpleGridLayout.getChildAt(i);
- imageViews[j] = (ImageView) viewGroup.getChildAt(0);
+ ImageView imageView = (ImageView) viewGroup.getChildAt(0);
+ imageView.setImageDrawable(null);
+ imageViews[j] = imageView;
((TextView) viewGroup.getChildAt(1)).setText(Integer.toString(i + getStartIndex() + 1));
i++;
}
diff --git a/app/src/main/java/com/hippo/ehviewer/client/data/PreviewSet.java b/app/src/main/java/com/hippo/ehviewer/client/data/PreviewSet.java
index 0318fea5d..4a7156b9d 100644
--- a/app/src/main/java/com/hippo/ehviewer/client/data/PreviewSet.java
+++ b/app/src/main/java/com/hippo/ehviewer/client/data/PreviewSet.java
@@ -57,10 +57,7 @@ public abstract class PreviewSet {
inflater.inflate(R.layout.item_preview, simpleGridLayout, true);
}
} else if (diff < 0) {
- diff = -diff;
- for (int i = 0; i < diff; i++) {
- simpleGridLayout.removeViews(size, diff);
- }
+ simpleGridLayout.removeViews(size, -diff);
}
}
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 025f2bfdb..d7e9f3bce 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
@@ -42,6 +42,7 @@ import com.hippo.ehviewer.client.OffensiveException;
import com.hippo.ehviewer.client.data.Comment;
import com.hippo.ehviewer.client.data.GalleryDetail;
import com.hippo.ehviewer.client.data.GalleryInfo;
+import com.hippo.ehviewer.client.data.PreviewSet;
import com.hippo.ehviewer.client.data.TagGroup;
import com.hippo.ehviewer.util.Config;
import com.hippo.ehviewer.util.EhUtils;
@@ -185,6 +186,8 @@ public class GalleryDetailScene extends Scene implements View.OnClickListener,
RippleSalon.addRipple(mShare, false);
RippleSalon.addRipple(mRate, false);
+ mPreviewLayout.setPreviewHelper(new SimplePreviewHelper());
+
} else {
Log.e("Can't get GalleryDetail");
finish();
@@ -454,6 +457,7 @@ public class GalleryDetailScene extends Scene implements View.OnClickListener,
}
mPreviewLayout.setData(galleryDetail.previewSetArray,
+ galleryDetail.gid,
getStageActivity().getLayoutInflater(),
EhApplication.getConaco(getStageActivity()));
mPreviewLayout.selectPreviewAt(0);
@@ -479,4 +483,53 @@ public class GalleryDetailScene extends Scene implements View.OnClickListener,
}
}
}
+
+ class SimplePreviewHelper implements PreviewLayout.PreviewHelper {
+
+ @Override
+ public void onRequstPreview(PreviewLayout previewLayout, final int index) {
+ int source = Config.getEhSource();
+ EhClient.getInstance().getPreviewSet(source,
+ EhClient.getDetailUrl(source, mGalleryDetail.gid, mGalleryDetail.token, index),
+ new EhClient.OnGetPreviewSetListener() {
+
+ @Override
+ public void onSuccess(PreviewSet previewSet) {
+ mPreviewLayout.onGetPreview(previewSet, index);
+ }
+
+ @Override
+ public void onFailure(Exception e) {
+ // TODO
+ e.printStackTrace();
+ }
+ });
+ }
+
+ @Override
+ public void onRequstPreviewIndex(PreviewLayout previewLayout, float x, float y) {
+ if (previewLayout.getPreviewPageCount() <= 1) {
+ return;
+ }
+
+ int count = previewLayout.getPreviewPageCount();
+ String[] array = new String[count];
+ for (int i = 0; i < count; i++) {
+ array[i] = Integer.toString(i + 1);
+ }
+
+ int[] position = new int[2];
+ ViewUtils.getLocationInAncestor(mPreviewLayout, position, getSceneView());
+
+ new SimpleDialog.Builder(getStageActivity()).setTitle("Select page")
+ .setStartPoint((int) (x + position[0]), (int) (y + position[1]))
+ .setItems(array, new SimpleDialog.OnClickListener() {
+ @Override
+ public boolean onClick(SimpleDialog dialog, int which) {
+ mPreviewLayout.selectPreviewAt(which);
+ return true;
+ }
+ }).show();
+ }
+ }
}
diff --git a/app/src/main/java/com/hippo/ehviewer/widget/PreviewLayout.java b/app/src/main/java/com/hippo/ehviewer/widget/PreviewLayout.java
index b26376db1..6ce515548 100644
--- a/app/src/main/java/com/hippo/ehviewer/widget/PreviewLayout.java
+++ b/app/src/main/java/com/hippo/ehviewer/widget/PreviewLayout.java
@@ -28,22 +28,28 @@ import android.widget.LinearLayout;
import android.widget.TextView;
import com.hippo.conaco.Conaco;
+import com.hippo.effect.ViewTransition;
import com.hippo.ehviewer.R;
import com.hippo.ehviewer.client.data.LargePreviewSet;
import com.hippo.ehviewer.client.data.PreviewSet;
import com.hippo.rippleold.RippleSalon;
+import com.hippo.util.ViewUtils;
+import com.hippo.widget.AccurateClick;
import com.hippo.widget.SimpleGridLayout;
-public final class PreviewLayout extends LinearLayout implements View.OnClickListener {
+public final class PreviewLayout extends LinearLayout implements View.OnClickListener,
+ AccurateClick.OnAccurateClickListener {
private GestureDetector mGestureDetector;
private PreviewSet[] mPreviewSets;
+ private int mGid;
private Conaco mConaco;
private LayoutInflater mInflater;
private int mPreviewSetCount;
- private int mCurrentPreviewIndex = -1;
+ private int mCurrentPreviewPage = -1;
private SimpleGridLayout mSimpleGridLayout;
+ private View mProgressBar;
private View mTopPrevious;
private TextView mTopSelection;
private View mTopNext;
@@ -51,7 +57,12 @@ public final class PreviewLayout extends LinearLayout implements View.OnClickLis
private TextView mBottomSelection;
private View mBottomNext;
+ private ViewTransition mViewTransition;
+
private int mWidth;
+ private int mPreviewSetSize = -1;
+
+ private PreviewHelper mPreviewHelper;
public PreviewLayout(Context context) {
super(context);
@@ -78,7 +89,8 @@ public final class PreviewLayout extends LinearLayout implements View.OnClickLis
mTopSelection = (TextView) viewGroup.getChildAt(2);
mTopNext = viewGroup.getChildAt(4);
mSimpleGridLayout = (SimpleGridLayout) getChildAt(1);
- viewGroup = (ViewGroup) getChildAt(2);
+ mProgressBar = getChildAt(2);
+ viewGroup = (ViewGroup) getChildAt(3);
mBottomPrevious = viewGroup.getChildAt(0);
mBottomSelection = (TextView) viewGroup.getChildAt(2);
mBottomNext = viewGroup.getChildAt(4);
@@ -91,20 +103,24 @@ public final class PreviewLayout extends LinearLayout implements View.OnClickLis
RippleSalon.addRipple(mBottomNext, false);
mTopPrevious.setOnClickListener(this);
- mTopSelection.setOnClickListener(this);
mTopNext.setOnClickListener(this);
mBottomPrevious.setOnClickListener(this);
- mBottomSelection.setOnClickListener(this);
mBottomNext.setOnClickListener(this);
+ AccurateClick.setOnAccurateClickListener(mTopSelection, this);
+ AccurateClick.setOnAccurateClickListener(mBottomSelection, this);
+
GestureListener gestureListener = new GestureListener();
mGestureDetector = new GestureDetector(context, gestureListener);
mGestureDetector.setIsLongpressEnabled(false);
+
+ mViewTransition = new ViewTransition(mSimpleGridLayout, mProgressBar);
}
- public void setData(PreviewSet[] previewSets, LayoutInflater inflater, Conaco conaco) {
+ public void setData(PreviewSet[] previewSets, int gid, LayoutInflater inflater, Conaco conaco) {
mPreviewSets = previewSets;
mPreviewSetCount = previewSets.length;
+ mGid = gid;
mInflater = inflater;
mConaco = conaco;
}
@@ -151,44 +167,100 @@ public final class PreviewLayout extends LinearLayout implements View.OnClickLis
return mGestureDetector.onTouchEvent(event);
}
+ public void setPreviewHelper(PreviewHelper previewHelper) {
+ mPreviewHelper = previewHelper;
+ }
+
public int getPreviewPageCount() {
return mPreviewSetCount;
}
- public void selectPreviewAt(int index) {
- if (index < 0 || index >= mPreviewSetCount) {
- throw new IndexOutOfBoundsException("Invalid index " + index + ", size is " + mPreviewSetCount);
+ public int getPreviewSetStartIndex(int page) {
+ if (mPreviewSetSize == -1) {
+ for (PreviewSet previewSet : mPreviewSets) {
+ if (previewSet != null) {
+ mPreviewSetSize = previewSet.size();
+ break;
+ }
+ }
}
- mCurrentPreviewIndex = index;
+ if (mPreviewSetSize == -1) {
+ return 0;
+ } else {
+ return mPreviewSetSize * page;
+ }
+ }
- PreviewSet previewSet = mPreviewSets[index];
+ public void onGetPreview(PreviewSet previewSet, int page) {
+ previewSet.setStartIndex(getPreviewSetStartIndex(page));
+ previewSet.setGid(mGid);
+ mPreviewSets[page] = previewSet;
+
+ if (mCurrentPreviewPage == page) {
+ mViewTransition.showView(0);
+
+ previewSet.bindView(mSimpleGridLayout, mInflater, mConaco);
+ }
+ }
+
+ public void selectPreviewAt(int page) {
+ if (page < 0 || page >= mPreviewSetCount) {
+ throw new IndexOutOfBoundsException("Invalid page " + page + ", size is " + mPreviewSetCount);
+ }
+
+ int oldPage = mCurrentPreviewPage;
+ mCurrentPreviewPage = page;
+
+ if (oldPage != -1) {
+ PreviewSet oldPreviewSet = mPreviewSets[oldPage];
+ if (oldPreviewSet != null) {
+ oldPreviewSet.cancelLoadTask(mSimpleGridLayout, mConaco);
+ }
+ }
+
+ PreviewSet previewSet = mPreviewSets[page];
if (previewSet != null) {
+ mViewTransition.showView(0);
previewSet.bindView(mSimpleGridLayout, mInflater, mConaco);
} else {
- // TODO
+ mViewTransition.showView(1);
+ mPreviewHelper.onRequstPreview(this, page);
}
- String showText = (index + 1) + "/" + mPreviewSetCount;
+ String showText = (page + 1) + "/" + mPreviewSetCount;
mTopSelection.setText(showText);
mBottomSelection.setText(showText);
}
public void tryNextPreview() {
- if (mCurrentPreviewIndex < mPreviewSetCount - 1) {
- selectPreviewAt(mCurrentPreviewIndex + 1);
+ if (mCurrentPreviewPage < mPreviewSetCount - 1) {
+ selectPreviewAt(mCurrentPreviewPage + 1);
}
}
public void tryPreviousPreview() {
- if (mCurrentPreviewIndex > 0) {
- selectPreviewAt(mCurrentPreviewIndex - 1);
+ if (mCurrentPreviewPage > 0) {
+ selectPreviewAt(mCurrentPreviewPage - 1);
}
}
@Override
public void onClick(View v) {
+ if (v == mTopPrevious || v == mBottomPrevious) {
+ tryPreviousPreview();
+ } else if (v == mTopNext || v == mBottomNext) {
+ tryNextPreview();
+ }
+ }
+ @Override
+ public void onAccurateClick(View v, float x, float y) {
+ if (v == mTopSelection || v == mBottomSelection) {
+ int[] position = new int[2];
+ ViewUtils.getLocationInAncestor(v, position, this);
+ mPreviewHelper.onRequstPreviewIndex(this, x + position[0], y + position[1]);
+ }
}
class GestureListener extends GestureDetector.SimpleOnGestureListener {
@@ -219,4 +291,11 @@ public final class PreviewLayout extends LinearLayout implements View.OnClickLis
}
}
}
+
+ public interface PreviewHelper {
+
+ void onRequstPreview(PreviewLayout previewLayout, int index);
+
+ void onRequstPreviewIndex(PreviewLayout previewLayout, float x, float y);
+ }
}
diff --git a/app/src/main/java/com/hippo/scene/SceneDialogView.java b/app/src/main/java/com/hippo/scene/SceneDialogView.java
index 0f502cd2b..f5c2d2ae3 100644
--- a/app/src/main/java/com/hippo/scene/SceneDialogView.java
+++ b/app/src/main/java/com/hippo/scene/SceneDialogView.java
@@ -52,7 +52,7 @@ public class SceneDialogView extends SceneView implements View.OnClickListener,
setSoundEffectsEnabled(false);
setOnClickListener(this);
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
- setOnTouchListener(new HotspotTouchHelper(this));
+ HotspotTouchHelper.setHotspotTouchHelper(this, new HotspotTouchHelper(this));
}
}
@@ -68,6 +68,8 @@ public class SceneDialogView extends SceneView implements View.OnClickListener,
@Override
public void drawableHotspotChanged(float x, float y) {
+ super.drawableHotspotChanged(x, y);
+
mHostpotX = x;
mHostpotY = y;
}
diff --git a/app/src/main/java/com/hippo/scene/SimpleDialog.java b/app/src/main/java/com/hippo/scene/SimpleDialog.java
index 0e6501e73..bb6f765e1 100644
--- a/app/src/main/java/com/hippo/scene/SimpleDialog.java
+++ b/app/src/main/java/com/hippo/scene/SimpleDialog.java
@@ -114,7 +114,8 @@ public class SimpleDialog extends SceneDialog implements View.OnClickListener,
private void bindDialog() {
ListView listView = mListView;
- if (mBuilder.mTitle == null && mBuilder.mMessage == null && mBuilder.mCustomViewResId == 0) {
+ if (mBuilder.mTitle == null && mBuilder.mMessage == null
+ && mBuilder.mItemLayoutResId == 0 && mBuilder.mCustomViewResId == 0) {
ViewUtils.setVisibility(mBody, View.GONE);
} else {
if (mBuilder.mTitle != null) {
diff --git a/app/src/main/java/com/hippo/widget/AccurateClick.java b/app/src/main/java/com/hippo/widget/AccurateClick.java
index a980b150c..099d2decc 100644
--- a/app/src/main/java/com/hippo/widget/AccurateClick.java
+++ b/app/src/main/java/com/hippo/widget/AccurateClick.java
@@ -29,7 +29,15 @@ public final class AccurateClick {
AccurateClickHelper accurateClickHelper = new AccurateClickHelper();
view.setTag(R.id.view_tag_accurate_click_helper, accurateClickHelper);
view.setTag(R.id.view_tag_on_accurate_click_listener, listener);
- view.setOnTouchListener(new HotspotTouchHelper(accurateClickHelper));
+
+ // compatible with VectorOld
+ HotspotTouchHelper helper = HotspotTouchHelper.getHotspotTouchHelper(view);
+ if (helper != null) {
+ helper.addOwner(accurateClickHelper);
+ } else {
+ HotspotTouchHelper.setHotspotTouchHelper(view, new HotspotTouchHelper(accurateClickHelper));
+ }
+
view.setOnClickListener(new DelegateClickListener());
}
diff --git a/app/src/main/java/com/hippo/widget/CheckTextView.java b/app/src/main/java/com/hippo/widget/CheckTextView.java
index b093d46cf..1911c3224 100644
--- a/app/src/main/java/com/hippo/widget/CheckTextView.java
+++ b/app/src/main/java/com/hippo/widget/CheckTextView.java
@@ -81,7 +81,7 @@ public class CheckTextView extends TextView implements OnClickListener, Hotspota
setOnClickListener(this);
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
- setOnTouchListener(new HotspotTouchHelper(this));
+ HotspotTouchHelper.setHotspotTouchHelper(this, new HotspotTouchHelper(this));
}
}
diff --git a/app/src/main/res/layout/widget_preview_layout.xml b/app/src/main/res/layout/widget_preview_layout.xml
index 8605173ed..302639e6d 100644
--- a/app/src/main/res/layout/widget_preview_layout.xml
+++ b/app/src/main/res/layout/widget_preview_layout.xml
@@ -30,6 +30,14 @@
android:paddingRight="32dp"
auto:itemMargin="8dp"/>
+
+
diff --git a/hotspot b/hotspot
index 0cddb7f7c..ac51841cf 160000
--- a/hotspot
+++ b/hotspot
@@ -1 +1 @@
-Subproject commit 0cddb7f7cad043dd6745b3e0013abdba147198a5
+Subproject commit ac51841cf8749be9dee2d1254f659a902a327602
diff --git a/rippleold b/rippleold
index 906d5bbea..665336205 160000
--- a/rippleold
+++ b/rippleold
@@ -1 +1 @@
-Subproject commit 906d5bbea8137dd514770ab76394b0ac4d2fb4d2
+Subproject commit 6653362058e3e5e92d6a9bb13b85fc9134cd2fdd