Improve detail scene
This commit is contained in:
1 parent
8aa6695e1b
commit
96ed9d3952
13 files changed
+235
-31
No files matched your search
@@ -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));
|
||||
}
|
||||
}
|
||||
@@ -277,7 +277,7 @@ public class GalleryDetailParser {
|
||||
}
|
||||
|
||||
// Get preview
|
||||
if ((request & REQUEST_PREVIEW_INFO) != 0) {
|
||||
if ((request & REQUEST_PREVIEW) != 0) {
|
||||
parsePreview(body);
|
||||
}
|
||||
|
||||
|
||||
@@ -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++;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user