Improve detail scene

This commit is contained in:
seven332 committed 2015-07-04 16:18:17 +08:00
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));
}
}