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