package com.hippo.ehviewer.activity; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.LinkedList; import java.util.AbstractMap.SimpleEntry; import java.util.List; import java.util.Map.Entry; import com.hippo.ehviewer.AppContext; import com.hippo.ehviewer.ImageGeterManager; import com.hippo.ehviewer.R; import com.hippo.ehviewer.data.Comment; import com.hippo.ehviewer.data.Data; import com.hippo.ehviewer.data.GalleryDetail; import com.hippo.ehviewer.data.GalleryInfo; import com.hippo.ehviewer.data.PreviewList; import com.hippo.ehviewer.ehclient.DetailParser; import com.hippo.ehviewer.ehclient.EhClient; import com.hippo.ehviewer.util.Cache; import com.hippo.ehviewer.util.Log; import com.hippo.ehviewer.util.Ui; import com.hippo.ehviewer.util.Util; import com.hippo.ehviewer.widget.AlertButton; import com.hippo.ehviewer.widget.AutoWrapLayout; import com.hippo.ehviewer.widget.ButtonsDialogBuilder; import com.hippo.ehviewer.widget.DialogBuilder; import com.hippo.ehviewer.widget.FswView; import com.hippo.ehviewer.widget.LoadImageView; import com.hippo.ehviewer.widget.OlScrollView; import com.hippo.ehviewer.widget.OnFitSystemWindowsListener; import com.hippo.ehviewer.widget.OnLayoutListener; import com.hippo.ehviewer.widget.ProgressiveRatingBar; import android.app.AlertDialog; import android.content.Context; import android.content.Intent; import android.content.res.ColorStateList; import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.Color; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.ColorDrawable; import android.os.Bundle; import android.support.v4.app.Fragment; import android.util.TypedValue; import android.view.ContextThemeWrapper; import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.View.OnClickListener; import android.view.ViewGroup.LayoutParams; import android.widget.AdapterView; import android.widget.BaseAdapter; import android.widget.Button; import android.widget.LinearLayout; import android.widget.ProgressBar; import android.widget.RatingBar; import android.widget.TextSwitcher; import android.widget.TextView; import android.widget.Toast; import android.widget.ViewSwitcher.ViewFactory; public class DetailSectionFragment extends Fragment implements View.OnClickListener { private static final String TAG = "DetailSectionFragment"; private AppContext mAppContext; private MangaDetailActivity mActivity; private EhClient mClient; private Data mData; private GalleryDetail mGalleryDetail; private String mUrl; private View mRootView; private OlScrollView mScrollView; private Button mReadButton; private Button mRateButton; private ProgressBar mWaitPb; private Button mRefreshButton; private ViewGroup mNormalView; private ViewGroup mOffensiveView; private ViewGroup mPiningView; private ViewGroup mPreviewListMain; private AutoWrapLayout mPreviewListLayout; private ProgressBar mWaitPreviewList; private Button mPreviewRefreshButton; private View mBottomPanel; private TextView mPreviewNumText; private View mCancelButton; private View mOnceButton; private View mEveryButton; private View mBackButton; private View mFrontButton; private View mKnownButton; private View mDivider; private AlertDialog mGoToDialog; private int mCurPage; private boolean mShowPreview = false; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { mActivity = (MangaDetailActivity)getActivity(); mAppContext = (AppContext)mActivity.getApplication(); mClient = mAppContext.getEhClient(); mData = mAppContext.getData(); GalleryInfo galleryInfo = mActivity.getGalleryInfo(); boolean getFromCache = true; mGalleryDetail = Cache.mdCache.get(String.valueOf(galleryInfo.gid)); if (mGalleryDetail == null) { getFromCache = false; mGalleryDetail = new GalleryDetail(galleryInfo); } mUrl = EhClient.getDetailUrl( mGalleryDetail.gid, mGalleryDetail.token); mRootView = inflater.inflate( R.layout.detail, container, false); mScrollView = (OlScrollView)mRootView.findViewById(R.id.manga_detail_scrollview); mReadButton = (Button)mRootView.findViewById(R.id.detail_read); mRateButton = (Button)mRootView.findViewById(R.id.detail_do_rate); mWaitPb = (ProgressBar)mRootView.findViewById(R.id.detail_wait); mRefreshButton = (Button)mRootView.findViewById(R.id.detail_refresh); mNormalView = (ViewGroup)mRootView.findViewById(R.id.manga_detail_normal); mOffensiveView = (ViewGroup)mRootView.findViewById(R.id.manga_detail_offensive); mPiningView = (ViewGroup)mRootView.findViewById(R.id.manga_detail_pining); mPreviewListMain = (ViewGroup)mRootView.findViewById(R.id.page_list); mPreviewListLayout = (AutoWrapLayout)mRootView.findViewById(R.id.paper_list_layout); mWaitPreviewList = (ProgressBar)mRootView.findViewById(R.id.paper_list_wait); mPreviewRefreshButton = (Button)mRootView.findViewById(R.id.preview_button_refresh); mBottomPanel = (View)mRootView.findViewById(R.id.bottom_panel); mPreviewNumText = (TextView)mBottomPanel.findViewById(R.id.preview_num); mCancelButton = mOffensiveView.findViewById(R.id.detail_button_cancel); mOnceButton = mOffensiveView.findViewById(R.id.detail_button_once); mEveryButton = mOffensiveView.findViewById(R.id.detail_button_every); mKnownButton = mPiningView.findViewById(R.id.detail_button_known); mBackButton = mPreviewListMain.findViewById(R.id.back); mFrontButton = mPreviewListMain.findViewById(R.id.front); mDivider = mNormalView.findViewById(R.id.divider); mRefreshButton.setOnClickListener(this); FswView align = (FswView)mActivity.findViewById(R.id.alignment); int paddingLeft = align.getPaddingLeft(); int paddingTop = align.getPaddingTop(); int paddingRight = align.getPaddingRight(); int paddingBottom = align.getPaddingBottom(); if (paddingTop != 0 || paddingBottom != 0) { mScrollView.setPadding(paddingLeft, paddingTop, paddingRight, paddingBottom); } align.addOnFitSystemWindowsListener(new OnFitSystemWindowsListener() { @Override public void onfitSystemWindows(int paddingLeft, int paddingTop, int paddingRight, int paddingBottom) { mScrollView.setPadding(paddingLeft, paddingTop, paddingRight, paddingBottom); } }); mScrollView.setOnLayoutListener(new OnLayoutListener() { @Override public void onLayout() { if (mShowPreview) { mShowPreview = false; mScrollView.scrollTo(0, mNormalView.getTop() + mDivider.getTop()); } } }); LoadImageView thumb = (LoadImageView)mRootView.findViewById(R.id.detail_cover); Bitmap bmp = null; if (Cache.memoryCache != null && (bmp = Cache.memoryCache.get(String.valueOf(mGalleryDetail.gid))) != null) { thumb.setLoadInfo(mGalleryDetail.thumb, String.valueOf(mGalleryDetail.gid)); thumb.setImageBitmap(bmp); thumb.setState(LoadImageView.LOADED); } else { thumb.setImageDrawable(null); thumb.setLoadInfo(mGalleryDetail.thumb, String.valueOf(mGalleryDetail.gid)); thumb.setState(LoadImageView.NONE); mAppContext.getImageGeterManager().add(mGalleryDetail.thumb, String.valueOf(mGalleryDetail.gid), ImageGeterManager.DISK_CACHE | ImageGeterManager.DOWNLOAD, new LoadImageView.SimpleImageGetListener(thumb)); } TextView title = (TextView)mRootView.findViewById(R.id.detail_title); title.setText(mGalleryDetail.title); TextView uploader = (TextView)mRootView.findViewById(R.id.detail_uploader); uploader.setText(mGalleryDetail.uploader); TextView category = (TextView)mRootView.findViewById(R.id.detail_category); category.setText(Ui.getCategoryText(mGalleryDetail.category)); category.setBackgroundColor(Ui.getCategoryColor(mGalleryDetail.category)); // Make rate and read button same width // Disable them for temp Ui.measureView(mReadButton); Ui.measureView(mRateButton); int readbw = mReadButton.getMeasuredWidth(); int ratebw = mRateButton.getMeasuredWidth(); if (readbw > ratebw) { mRateButton.setWidth(readbw); } else if (ratebw > readbw) { mReadButton.setWidth(ratebw); } mReadButton.setEnabled(false); mRateButton.setEnabled(false); // get from cache if (getFromCache) layout(mGalleryDetail); else mClient.getMangaDetail(mUrl, mGalleryDetail, new MangaDetailGetListener()); return mRootView; } private void addPageItem(int page) { if (mActivity.isFinishing()) return; if (page != mCurPage) return; mWaitPreviewList.setVisibility(View.GONE); mPreviewRefreshButton.setVisibility(View.GONE); PreviewList pageList = mGalleryDetail.previewLists[page]; if (pageList == null) { Log.d(TAG, "WTF, I may check mangaDetail.pageLists[page] is not null"); Toast.makeText(mActivity, "WTF, I may check mangaDetail.pageLists[page] is not null", Toast.LENGTH_SHORT).show(); return; } int index = page * mGalleryDetail.previewPerPage + 1; int rowIndex = 0; for (PreviewList.Row row : pageList.rowArray) { for (PreviewList.Row.Item item : row.itemArray) { TextViewWithUrl tvu = new TextViewWithUrl(mActivity, item.url); tvu.setGravity(Gravity.CENTER); tvu.setText(String.valueOf(index)); final int index1 = index; tvu.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // Add to read in Data mData.addRead(mGalleryDetail); Intent intent = new Intent(mActivity, MangaActivity.class); intent.putExtra("url", ((TextViewWithUrl) v).url); intent.putExtra("gid", mGalleryDetail.gid); intent.putExtra("title", mGalleryDetail.title); intent.putExtra("firstPage", index1 - 1); intent.putExtra("pageSum", mGalleryDetail.pages); startActivity(intent); } }); // Set white drawable for temp ColorDrawable white = new ColorDrawable(Color.TRANSPARENT); white.setBounds(0, 0, item.width, item.height); tvu.setCompoundDrawables(null, white, null, null); AutoWrapLayout.LayoutParams lp = new AutoWrapLayout.LayoutParams(); lp.leftMargin = Ui.dp2pix(8); lp.topMargin = Ui.dp2pix(8); lp.rightMargin = Ui.dp2pix(8); lp.bottomMargin = Ui.dp2pix(8); mPreviewListLayout.addView(tvu, lp); index++; } // Download pic EhClient.getImage(row.imageUrl, mGalleryDetail.gid + "-preview-" + mCurPage + "-" + rowIndex, Util.getResourcesType(row.imageUrl), Cache.memoryCache, Cache.cpCache, new int[]{page, rowIndex}, new PageImageGetListener()); rowIndex ++; } } private void refreshPageList() { mPreviewListLayout.removeAllViews(); mWaitPreviewList.setVisibility(View.VISIBLE); mPreviewRefreshButton.setVisibility(View.GONE); mPreviewNumText.setText(String.format("%d / %d", mCurPage+1, mGalleryDetail.previewSum)); PreviewList pageList = mGalleryDetail.previewLists[mCurPage]; if (pageList == null) { String tempUrl = mUrl; if (!mUrl.endsWith("/")) tempUrl += "/"; tempUrl += "?p=" + mCurPage; mClient.getPageList(tempUrl, mCurPage, new EhClient.OnGetPageListListener() { @Override public void onSuccess(Object checkFlag, PreviewList pageList) { if (mActivity.isFinishing()) return; int page = (Integer)checkFlag; mGalleryDetail.previewLists[page] = pageList; addPageItem(page); mShowPreview = true; } @Override public void onFailure(Object checkFlag, String eMsg) { if (mActivity.isFinishing()) return; int page = (Integer)checkFlag; if (page == mCurPage) { Toast.makeText(mActivity, eMsg, Toast.LENGTH_SHORT).show(); mWaitPreviewList.setVisibility(View.GONE); mPreviewRefreshButton.setVisibility(View.VISIBLE); } } }); } else { addPageItem(mCurPage); mShowPreview = true; } } private AlertDialog createGoToDialog() { return new DialogBuilder(mActivity).setTitle(R.string.jump) .setAdapter(new BaseAdapter() { @Override public int getCount() { return mGalleryDetail.previewSum; } @Override public Object getItem(int position) { return position; } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { LayoutInflater inflater = mActivity.getLayoutInflater(); View view = (View)inflater.inflate(R.layout.list_item_text, null); TextView tv = (TextView)view.findViewById(android.R.id.text1); tv.setText(String.format(getString(R.string.some_page), position + 1)); return tv; } }, new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView arg0, View arg1, int position, long arg3) { mGoToDialog.dismiss(); if (position != mCurPage) { mCurPage = position; refreshPageList(); } } }).setNegativeButton(android.R.string.cancel, new View.OnClickListener() { @Override public void onClick(View paramView) { mGoToDialog.dismiss(); } }).create(); } private void addTags() { LinearLayout tagsLayout = (LinearLayout)mRootView.findViewById(R.id.tags_layout); LinkedHashMap>> tagGroups = mGalleryDetail.tags; tagsLayout.removeAllViews(); int x = Ui.dp2pix(4); int y = Ui.dp2pix(4); Resources resources = getResources(); // Get tag view resources int tagTextSize = resources.getDimensionPixelOffset(R.dimen.button_small_size); ColorStateList tagTextColor = resources.getColorStateList(R.color.blue_bn_text); int tagPaddingX = resources.getDimensionPixelOffset(R.dimen.button_tag_padding_x); int tagPaddingY = resources.getDimensionPixelOffset(R.dimen.button_tag_padding_y); for (Entry>> tagGroup : tagGroups.entrySet()) { LinearLayout tagGroupLayout = new LinearLayout(mActivity); tagGroupLayout.setOrientation(LinearLayout.HORIZONTAL); AutoWrapLayout tagLayout = new AutoWrapLayout(mActivity); // Group name final String groupName = tagGroup.getKey(); TextView groupNameView = new TextView(new ContextThemeWrapper(mActivity, R.style.TextTag)); groupNameView.setText(groupName); LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); lp.setMargins(x, y, x, y); tagGroupLayout.addView(groupNameView, lp); // tags for (SimpleEntry tag : tagGroup.getValue()) { final String tagText = tag.getKey(); Button tagView = new Button(mActivity); tagView.setTextSize(TypedValue.COMPLEX_UNIT_PX, tagTextSize); tagView.setText(String.format("%s (%d)", tagText, tag.getValue())); tagView.setTextColor(tagTextColor); tagView.setBackgroundResource(R.drawable.blue_bn_bg); tagView.setPadding(tagPaddingX, tagPaddingY, tagPaddingX, tagPaddingY); tagView.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { AlertButton voteUp = new AlertButton(mActivity); voteUp.setText(getString(R.string.vote_up)); voteUp.setOnClickListener(new SimpleVote(groupName, tagText, true)); AlertButton voteDown = new AlertButton(mActivity); voteDown.setText(getString(R.string.vote_down)); voteDown.setOnClickListener(new SimpleVote(groupName, tagText, false)); AlertButton showTagged = new AlertButton(mActivity); showTagged.setText(getString(R.string.show_tagged)); new ButtonsDialogBuilder(mActivity).setTitle(tagText) .addButton(voteUp).addButton(voteDown).addButton(showTagged) .create().show(); } }); AutoWrapLayout.LayoutParams alp = new AutoWrapLayout.LayoutParams(); alp.setMargins(x, y, x, y); tagLayout.addView(tagView, alp); } tagGroupLayout.addView(tagLayout); tagsLayout.addView(tagGroupLayout); } // Add tag Button addtagView = new Button(mActivity); addtagView.setTextSize(TypedValue.COMPLEX_UNIT_PX, tagTextSize); addtagView.setText("+"); addtagView.setTextColor(tagTextColor); addtagView.setBackgroundResource(R.drawable.blue_bn_bg); addtagView.setPadding(tagPaddingX, tagPaddingY, tagPaddingX, tagPaddingY); LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams( LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT); lp.gravity = Gravity.RIGHT; lp.setMargins(x, y, x, y); tagsLayout.addView(addtagView, lp); } private void layout(GalleryDetail md) { if (mActivity.isFinishing()) return; // Delete progress bar mWaitPb.setVisibility(View.GONE); // Check offensive or not if (md.firstPage.equals("offensive")) { mOffensiveView.setVisibility(View.VISIBLE); mCancelButton.setOnClickListener(this); mOnceButton.setOnClickListener(this); mEveryButton.setOnClickListener(this); } // Check pining or not else if (md.firstPage.equals("pining")) { mPiningView.setVisibility(View.VISIBLE); mKnownButton.setOnClickListener(this); } else { // Enable button mReadButton.setEnabled(true); mReadButton.setOnClickListener(this); mRateButton.setEnabled(true); mRateButton.setOnClickListener(this); RatingBar rate = (RatingBar)mRootView.findViewById(R.id.detail_rate); rate.setRating(mGalleryDetail.rating); TextSwitcher averagePeople = (TextSwitcher)mRootView.findViewById(R.id.detail_average_people); averagePeople.setFactory(new ViewFactory() { @Override public View makeView() { LayoutInflater inflater = LayoutInflater.from(mActivity); return inflater.inflate(R.layout.detail_avg_text, null); } }); averagePeople.setCurrentText(String.format("%.2f (%d)", mGalleryDetail.rating, mGalleryDetail.people)); TextView posted = (TextView)mRootView.findViewById(R.id.detail_posted); posted.setText(mGalleryDetail.posted); TextView language = (TextView)mRootView.findViewById(R.id.detail_language); language.setText(String.format(getString(R.string.detail_language), mGalleryDetail.language)); TextView pagesSize = (TextView)mRootView.findViewById(R.id.detail_pages_size); pagesSize.setText(String.format(getString(R.string.detail_pages_size), mGalleryDetail.pages, mGalleryDetail.size)); // TODO addTags(); mNormalView.setVisibility(View.VISIBLE); // paper list if (mGalleryDetail.previewLists[0] != null) { mPreviewListMain.setVisibility(View.VISIBLE); // preview num mBottomPanel.setVisibility(View.VISIBLE); mPreviewNumText.setText(String.format("%d / %d", 1, mGalleryDetail.previewSum)); mPreviewRefreshButton.setOnClickListener(this); // Init go to dialog or disable it if (mGalleryDetail.previewSum > 1) { mGoToDialog = createGoToDialog(); mPreviewNumText.setOnClickListener(this); mBackButton.setOnClickListener(this); mFrontButton.setOnClickListener(this); } else { mPreviewNumText.setClickable(false); mBackButton.setClickable(false); mFrontButton.setClickable(false); } mCurPage = 0; addPageItem(0); } else Toast.makeText(mActivity, getString(R.string.detail_preview_error), Toast.LENGTH_SHORT) .show(); // Set comments mActivity.setComments(mGalleryDetail.comments); } } @Override public void onClick(View v) { if (v == mRateButton) { rate(mGalleryDetail.rating); } else if (v == mReadButton) { mData.addRead(mGalleryDetail); Intent intent = new Intent(mActivity, MangaActivity.class); intent.putExtra("url", mGalleryDetail.firstPage); intent.putExtra("gid", mGalleryDetail.gid); intent.putExtra("title", mGalleryDetail.title); intent.putExtra("firstPage", 0); intent.putExtra("pageSum", mGalleryDetail.pages); startActivity(intent); } else if (v == mRefreshButton) { MangaDetailGetListener listener = new MangaDetailGetListener(); mClient.getMangaDetail(mUrl, mGalleryDetail, listener); // Delete refresh button mRefreshButton.setVisibility(View.GONE); // Add progressBar mWaitPb.setVisibility(View.VISIBLE); } else if (v == mCancelButton | v == mKnownButton) { mActivity.finish(); } else if (v == mOnceButton) { if (mUrl.endsWith("nw=session")) { } else if (mUrl.endsWith("nw=always")) mUrl.replace("nw=always", "nw=session"); else { if (!mUrl.endsWith("/")) mUrl += "/"; mUrl += "?nw=session"; } MangaDetailGetListener listener = new MangaDetailGetListener(); mClient.getMangaDetail(mUrl, mGalleryDetail, listener); // Delete offensiveView mOffensiveView.setVisibility(View.GONE); // Add progressBar mWaitPb.setVisibility(View.VISIBLE); } else if (v == mEveryButton) { if (mUrl.endsWith("nw=always")) { } else if (mUrl.endsWith("nw=session")) mUrl.replace("nw=session", "nw=always"); else { if (!mUrl.endsWith("/")) mUrl += "/"; mUrl += "?nw=always"; } MangaDetailGetListener listener = new MangaDetailGetListener(); mClient.getMangaDetail(mUrl, mGalleryDetail, listener); // Delete offensiveView mOffensiveView.setVisibility(View.GONE); // Add progressBar mWaitPb.setVisibility(View.VISIBLE); } else if (v == mBackButton) { if (mCurPage <= 0) return; mCurPage--; refreshPageList(); } else if (v == mFrontButton) { if (mCurPage >= mGalleryDetail.previewSum - 1) return; mCurPage++; refreshPageList(); } else if (v == mPreviewRefreshButton) { refreshPageList(); } else if (v == mPreviewNumText) { mGoToDialog.show(); } } private int getSendableRating(float ratingFloat) { float dr = ratingFloat*2; return (int)(dr + 0.5); } public void rate(float defaultRating) { View view = mActivity.getLayoutInflater().inflate(R.layout.rate, null); final TextView tv = (TextView)view.findViewById(R.id.rate_text); final ProgressiveRatingBar rb = (ProgressiveRatingBar)view.findViewById(R.id.rate); rb.setOnDrawListener(new ProgressiveRatingBar.OnDrawListener() { @Override public void onDraw(float rating) { int textId = getResources().getIdentifier(mAppContext.getPackageName() + ":string/rating" + getSendableRating(rating), null, null); if (textId == 0) textId = R.string.rating0; tv.setText(textId); } }); rb.setRating(defaultRating); new DialogBuilder(mActivity).setTitle(R.string.rate) .setView(view, true) .setPositiveButton(android.R.string.ok, new OnClickListener() { @Override public void onClick(View v) { int rating = getSendableRating(rb.getRating()); if (rating <= 0 || rating > 10) Toast.makeText(mActivity, "非法评分", Toast.LENGTH_SHORT).show(); // TODO else { ((AlertButton)v).dialog.dismiss(); mClient.rate(mGalleryDetail.gid, mGalleryDetail.token, rating, new EhClient.OnRateListener() { @Override public void onSuccess(float ratingAvg, int ratingCnt) { mGalleryDetail.rating = ratingAvg; mGalleryDetail.people = ratingCnt; if (!mActivity.isFinishing()) { //Reset start RatingBar rate = (RatingBar)mRootView.findViewById(R.id.detail_rate); rate.setRating(mGalleryDetail.rating); TextSwitcher averagePeople = (TextSwitcher) mRootView.findViewById(R.id.detail_average_people); averagePeople.setText(String.format("%.2f (%d)", mGalleryDetail.rating, mGalleryDetail.people)); } Toast.makeText(mActivity, "评价成功", Toast.LENGTH_SHORT).show(); // TODO } @Override public void onFailure(String eMsg) { Toast.makeText(mActivity, "评价失败\n" + eMsg, Toast.LENGTH_SHORT).show(); // TODO } }); } } }).setNegativeButton(android.R.string.cancel, new OnClickListener(){ @Override public void onClick(View v) { ((AlertButton)v).dialog.dismiss(); } }).create().show(); } public List getComments() { if (mGalleryDetail == null) return null; else return mGalleryDetail.comments; } private class TextViewWithUrl extends TextView { private String url; public TextViewWithUrl(Context context, String url) { super(context); this.url = url; } } private class MangaDetailGetListener implements EhClient.OnGetMangaDetailListener { @Override public void onSuccess(GalleryDetail md) { Cache.mdCache.put(String.valueOf(mGalleryDetail.gid), md); layout(md); } @Override public void onFailure(String eMsg) { // Delete progress bar // Show refresh button mWaitPb.setVisibility(View.GONE); mRefreshButton.setVisibility(View.VISIBLE); Toast.makeText(mActivity, eMsg, Toast.LENGTH_SHORT).show(); } } private class PageImageGetListener implements EhClient.OnGetImageListener { @Override public void onSuccess(Object checkFlag, Object res) { if (res instanceof Bitmap && checkFlag instanceof int[]) { int[] indexs = (int[])checkFlag; addPageImage(indexs[0], indexs[1], (Bitmap) res); } else { Log.e(TAG, "WTF? PageImageGetListener is error !"); mWaitPreviewList.setVisibility(View.GONE); mPreviewRefreshButton.setVisibility(View.VISIBLE); } } @Override public void onFailure(int errorMessageId) { mWaitPreviewList.setVisibility(View.GONE); mPreviewRefreshButton.setVisibility(View.VISIBLE); } private void addPageImage(int page, int rowIndex, Bitmap bitmap) { if (mActivity.isFinishing()) return; if (page != mCurPage) return; PreviewList pageList = mGalleryDetail.previewLists[page]; if (pageList == null) { Log.d(TAG, "WTF, I may check mangaDetail.pageLists[page] is not null"); return; } int maxWidth = bitmap.getWidth(); int maxHeight = bitmap.getHeight(); PreviewList.Row row = pageList.rowArray.get(rowIndex); ArrayList items = row.itemArray; int startIndex = row.startIndex; int endIndex = startIndex + items.size(); for(int i = startIndex ; i < endIndex; i++) { PreviewList.Row.Item item = items.get(i - startIndex); if (item.xOffset + item.width > maxWidth) item.width = maxWidth - item.xOffset; if (item.yOffset + item.height > maxHeight) item.height = maxHeight - item.yOffset; BitmapDrawable bitmapDrawable = new BitmapDrawable( getResources(), Bitmap.createBitmap(bitmap, item.xOffset, item.yOffset, item.width, item.height)); bitmapDrawable.setBounds(0, 0, item.width, item.height); TextViewWithUrl tvu = (TextViewWithUrl)mPreviewListLayout.getChildAt(i); tvu.setCompoundDrawables(null, bitmapDrawable, null, null); } } } private class SimpleVote implements View.OnClickListener { private String groupName; private String tagText; private boolean isUp; public SimpleVote(String groupName, String tagText, boolean isUp) { this.groupName = groupName; this.tagText = tagText; this.isUp = isUp; } @Override public void onClick(View v) { ((AlertButton)v).dialog.dismiss(); mClient.vote(mGalleryDetail.gid, mGalleryDetail.token, groupName, tagText, isUp, new SimpleVoteListener()); } } private class SimpleVoteListener implements EhClient.OnVoteListener { @Override public void onSuccess(String tagPane) { Toast.makeText(mActivity, "投票成功", Toast.LENGTH_SHORT).show(); // TODO DetailParser parser = new DetailParser(); parser.setMode(DetailParser.TAG); if (parser.parser(tagPane) == DetailParser.TAG) { mGalleryDetail.tags = parser.tags; // TODO Only change target text view addTags(); } else { Toast.makeText(mActivity, getString(R.string.em_parser_error), Toast.LENGTH_SHORT).show(); } } @Override public void onFailure(String eMsg) { Toast.makeText(mActivity, "投票失败\n" + eMsg, Toast.LENGTH_SHORT).show(); // TODO } } }