diff --git a/res/drawable-hdpi/ic_error.png b/res/drawable-hdpi/ic_error.png new file mode 100644 index 000000000..2496c5b91 Binary files /dev/null and b/res/drawable-hdpi/ic_error.png differ diff --git a/res/drawable-hdpi/ic_error_dark.png b/res/drawable-hdpi/ic_error_dark.png new file mode 100644 index 000000000..8f2a6cda2 Binary files /dev/null and b/res/drawable-hdpi/ic_error_dark.png differ diff --git a/res/drawable-mdpi/ic_error.png b/res/drawable-mdpi/ic_error.png new file mode 100644 index 000000000..16a4ea532 Binary files /dev/null and b/res/drawable-mdpi/ic_error.png differ diff --git a/res/drawable-mdpi/ic_error_dark.png b/res/drawable-mdpi/ic_error_dark.png new file mode 100644 index 000000000..502ba337d Binary files /dev/null and b/res/drawable-mdpi/ic_error_dark.png differ diff --git a/res/drawable-xhdpi/ic_error.png b/res/drawable-xhdpi/ic_error.png new file mode 100644 index 000000000..e14261d79 Binary files /dev/null and b/res/drawable-xhdpi/ic_error.png differ diff --git a/res/drawable-xhdpi/ic_error_dark.png b/res/drawable-xhdpi/ic_error_dark.png new file mode 100644 index 000000000..cb5b5e93f Binary files /dev/null and b/res/drawable-xhdpi/ic_error_dark.png differ diff --git a/res/drawable-xxhdpi/ic_error.png b/res/drawable-xxhdpi/ic_error.png new file mode 100644 index 000000000..a6f2c4fdc Binary files /dev/null and b/res/drawable-xxhdpi/ic_error.png differ diff --git a/res/drawable-xxhdpi/ic_error_dark.png b/res/drawable-xxhdpi/ic_error_dark.png new file mode 100644 index 000000000..cc06aefb7 Binary files /dev/null and b/res/drawable-xxhdpi/ic_error_dark.png differ diff --git a/res/layout/list.xml b/res/layout/list.xml index a0b80fbf7..caa83940a 100644 --- a/res/layout/list.xml +++ b/res/layout/list.xml @@ -40,7 +40,6 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" - android:onClick="buttonRefresh" android:text="@string/refresh" /> 更新 感谢 开发 - 左划更精彩 + 左划更多 \ No newline at end of file diff --git a/src/com/hippo/ehviewer/ListUrls.java b/src/com/hippo/ehviewer/ListUrls.java index 0960ae623..b36cdb2d4 100644 --- a/src/com/hippo/ehviewer/ListUrls.java +++ b/src/com/hippo/ehviewer/ListUrls.java @@ -62,8 +62,6 @@ public class ListUrls { private int mMode = NORMAL; private int page = 0; - private int numPerPage = 25; - private int max = -1; private int type = ALL_TYPE; private int advsearchType = -1; @@ -140,45 +138,14 @@ public class ListUrls { return minRating; } - public boolean isSetMax() { - return max == -1 ? false : true; - } - - public void setMax(int m) { - if (m < 1) - return; - max = m; - if(page >= m) - page = m-1; - } - - public int getMax() { - return max; - } - - public boolean setPage(int p) { - if (p < max && p >= 0) { - page = p; - return true; - } - else - return false; + public void setPage(int p) { + page = p; } public int getPage() { return page; } - public void setNumPerPage(int n) { - if (n < 1) - return; - numPerPage = n; - } - - public int getNumPerPage() { - return numPerPage; - } - public int getMode() { return mMode; } diff --git a/src/com/hippo/ehviewer/ehclient/EhClient.java b/src/com/hippo/ehviewer/ehclient/EhClient.java index c860f458f..049a162af 100644 --- a/src/com/hippo/ehviewer/ehclient/EhClient.java +++ b/src/com/hippo/ehviewer/ehclient/EhClient.java @@ -171,16 +171,16 @@ public class EhClient { } } - public static String getFavoriteUrl(int index) { - return getFavoriteUrl(Config.getMode(), index); + public static String getFavoriteUrl(int index, int page) { + return getFavoriteUrl(Config.getMode(), index, page); } - public static String getFavoriteUrl(int mode, int index) { + public static String getFavoriteUrl(int mode, int index, int page) { switch (mode) { case EX: - return EX_HEADER + "favorites.php?favcat=" + index; + return EX_HEADER + "favorites.php?favcat=" + index + "&page=" + page; default: - return G_HEADER + "favorites.php?favcat=" + index; + return G_HEADER + "favorites.php?favcat=" + index + "&page=" + page; } } @@ -1770,7 +1770,7 @@ public class EhClient { args[i] = new String[]{"modifygids[]", String.valueOf(gids[i-1])}; args[i] = new String[]{"apply", "Apply"}; - hp.post(getFavoriteUrl(srcCat), args); + hp.post(getFavoriteUrl(srcCat, 0), args); } }).start(); } diff --git a/src/com/hippo/ehviewer/network/HttpHelper.java b/src/com/hippo/ehviewer/network/HttpHelper.java index e53c566d9..837117fe0 100644 --- a/src/com/hippo/ehviewer/network/HttpHelper.java +++ b/src/com/hippo/ehviewer/network/HttpHelper.java @@ -64,6 +64,8 @@ import com.hippo.ehviewer.util.Log; */ public class HttpHelper { private static final String TAG = "HttpHelper"; + public static final String SAD_PANDA_ERROR = "Sad Panda"; + private static String DEFAULT_CHARSET = "utf-8"; private static String CHARSET_KEY = "charset="; @@ -145,7 +147,7 @@ public class HttpHelper { return "SocketException : " + e.getMessage(); else if (e instanceof SadPandaException) - return "Sad Panda"; + return SAD_PANDA_ERROR; else return e.getMessage(); diff --git a/src/com/hippo/ehviewer/ui/AbstractGalleryActivity.java b/src/com/hippo/ehviewer/ui/AbstractGalleryActivity.java index dd47e8450..7bf46de96 100644 --- a/src/com/hippo/ehviewer/ui/AbstractGalleryActivity.java +++ b/src/com/hippo/ehviewer/ui/AbstractGalleryActivity.java @@ -23,12 +23,14 @@ import com.hippo.ehviewer.AppContext; import com.hippo.ehviewer.ImageGeterManager; import com.hippo.ehviewer.R; import com.hippo.ehviewer.data.GalleryInfo; +import com.hippo.ehviewer.ehclient.EhClient; import com.hippo.ehviewer.util.Cache; import com.hippo.ehviewer.util.Ui; import com.hippo.ehviewer.widget.FswView; import com.hippo.ehviewer.widget.HfListView; import com.hippo.ehviewer.widget.LoadImageView; import com.hippo.ehviewer.widget.OnFitSystemWindowsListener; +import com.hippo.ehviewer.widget.SuperToast; import android.graphics.Bitmap; import android.graphics.Color; @@ -37,6 +39,7 @@ import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.widget.AbsListView; import android.widget.BaseAdapter; import android.widget.Button; import android.widget.ImageView; @@ -46,23 +49,208 @@ import android.widget.RatingBar; import android.widget.RelativeLayout; import android.widget.TextView; -public class AbstractGalleryActivity extends AbstractSlidingActivity { +public abstract class AbstractGalleryActivity extends AbstractSlidingActivity + implements HfListView.OnFooterRefreshListener, + HfListView.OnRefreshListener { @SuppressWarnings("unused") private static final String TAG = AbstractGalleryActivity.class.getSimpleName(); + private static final int REFRESH = 0x0; + private static final int NEXT_PAGE = 0x1; + private static final int PRE_PAGE = 0x2; + private static final int SOMEWHERE = 0x3; + protected AppContext mAppContext; + protected EhClient mClient; protected ImageGeterManager mImageGeterManager; protected List mGiList; protected GalleryAdapter mGalleryAdapter; - protected RelativeLayout mMainView; - protected HfListView mHlv; - protected ListView mList; - protected ProgressBar mWaitProgressBar; - protected Button mFreshButton; - protected TextView mNoneTextView; - protected ImageView mSadPanda; + private RelativeLayout mMainView; + private HfListView mHlv; + private ListView mList; + private ProgressBar mWaitProgressBar; + private Button mFreshButton; + private TextView mNoneTextView; + private ImageView mSadPanda; + + private long taskStamp; + + private int mFirstIndex; + private int mLastIndex; + private int mCurPage; + private int mFirstPage = 0; + private int mLastPage = 0; + private int mMaxPage; + private int mItemPerPage; + private int mGetMode; + private boolean mIsKeepPosition; + private int mTargetPage; + private String mTargetUrl; + private int mPaddingTop; + private boolean isFootRefresh = false; + + public void setNoneText(CharSequence text) { + mNoneTextView.setText(text); + } + + /** + * Get url string for very page + * + * @param targetPage + * @return + */ + protected abstract String getTargetUrl(int targetPage); + + private void getGallerys() { + setGallerysLayout(); + + taskStamp = System.currentTimeMillis(); + mClient.getMangaList(mTargetUrl, taskStamp, new ListGetListener()); + } + + @Override + public void onRefresh() { + if (mFirstPage != 0) { + getPrePage(true, true); + } else { + refresh(true); + } + } + + @Override + public boolean onFooterRefresh() { + boolean re; + isFootRefresh = true; + re = getNextPage(true, true); + isFootRefresh = false; + return re; + } + + protected void onlyShowList() { + mHlv.setVisibility(View.VISIBLE); + mWaitProgressBar.setVisibility(View.GONE); + mFreshButton.setVisibility(View.GONE); + mNoneTextView.setVisibility(View.GONE); + mSadPanda.setVisibility(View.GONE); + } + + protected void firstTimeRefresh() { + // set mHlv gone, make wait view show + mHlv.setVisibility(View.GONE); + + refresh(true); + } + + private void setGallerysLayout() { + if (mHlv.getVisibility() == View.VISIBLE) { + if (!isFootRefresh) + mHlv.setRefreshing(true); + mWaitProgressBar.setVisibility(View.GONE); + mFreshButton.setVisibility(View.GONE); + mNoneTextView.setVisibility(View.GONE); + mSadPanda.setVisibility(View.GONE); + } else { + mHlv.setVisibility(View.GONE); + mWaitProgressBar.setVisibility(View.VISIBLE); + mFreshButton.setVisibility(View.GONE); + mNoneTextView.setVisibility(View.GONE); + mSadPanda.setVisibility(View.GONE); + } + } + + /** + * If can't refresh return false, + * if force is true, must return true + * + * @param force + * @return + */ + protected boolean refresh(boolean force) { + if (!force && isRefreshing()) + return false; + + mGetMode = REFRESH; + mTargetPage = 0; + mTargetUrl = getTargetUrl(mTargetPage); + mIsKeepPosition = false; + getGallerys(); + return true; + } + + /** + * If force is true, will get page when refrshing + * @param isKeepPosition + * @param force + * @return + */ + protected boolean getPrePage(boolean isKeepPosition, boolean force) { + if (!force && isRefreshing()) + return false; + if (mFirstPage == 0) + return false; + + mGetMode = PRE_PAGE; + mTargetPage = mFirstPage - 1; + mTargetUrl = getTargetUrl(mTargetPage); + mIsKeepPosition = isKeepPosition; + getGallerys(); + return true; + } + + /** + * If force is true, will get page when refrshing + * @param isKeepPosition + * @param force + * @return + */ + protected boolean getNextPage(boolean isKeepPosition, boolean force) { + if (!force && isRefreshing()) + return false; + if (mLastPage >= mMaxPage - 1) + return false; + + mGetMode = NEXT_PAGE; + mTargetPage = mLastPage + 1; + mTargetUrl = getTargetUrl(mTargetPage); + mIsKeepPosition = isKeepPosition; + getGallerys(); + return true; + } + + protected boolean getSomewhere(int page, boolean force) { + if (!force && isRefreshing()) + return false; + if (page >= mMaxPage || page < 0) + return false; + + mGetMode = SOMEWHERE; + mTargetPage = page; + mTargetUrl = getTargetUrl(mTargetPage); + mIsKeepPosition = false; + getGallerys(); + return true; + } + + public boolean jumpTo(int page, boolean force) { + if (!force && isRefreshing()) + return false; + if (page >= mMaxPage || page < 0) + return false; + + if (page >= mFirstPage && page <= mLastPage) { + int position = (page - mFirstPage) * mItemPerPage; + setListPosition(position); + return true; + } else if (page == mFirstPage - 1) { + return getPrePage(false, force); + } else if (page == mLastPage + 1) { + return getNextPage(false, force); + } else { + return getSomewhere(page, force); + } + } @Override public void onCreate(Bundle savedInstanceState) { @@ -70,6 +258,7 @@ public class AbstractGalleryActivity extends AbstractSlidingActivity { setContentView(R.layout.list); mAppContext = (AppContext)getApplication(); + mClient = mAppContext.getEhClient(); mImageGeterManager = mAppContext.getImageGeterManager(); mGiList = new ArrayList(); @@ -83,27 +272,73 @@ public class AbstractGalleryActivity extends AbstractSlidingActivity { mNoneTextView = (TextView)findViewById(R.id.none); mSadPanda = (ImageView)findViewById(R.id.sadpanda); - mWaitProgressBar.setVisibility(View.GONE); - mFreshButton.setVisibility(View.GONE); - mNoneTextView.setVisibility(View.GONE); - mSadPanda.setVisibility(View.GONE); - FswView alignment = (FswView)findViewById(R.id.alignment); alignment.addOnFitSystemWindowsListener( new OnFitSystemWindowsListener() { @Override public void onfitSystemWindows(int paddingLeft, int paddingTop, int paddingRight, int paddingBottom) { + mPaddingTop = paddingTop; mList.setPadding(mList.getPaddingLeft(), paddingTop, mList.getPaddingRight(), paddingBottom); } }); + mHlv.setColorScheme(R.color.refresh_color_1, + R.color.refresh_color_2, + R.color.refresh_color_3, + R.color.refresh_color_4); + mHlv.setOnHeaderRefreshListener(this); + mHlv.setOnFooterRefreshListener(this); + mHlv.setFooterString(getString(R.string.footer_loading), + getString(R.string.footer_loaded), + getString(R.string.footer_fail)); + mGalleryAdapter = new GalleryAdapter(); mList.setAdapter(mGalleryAdapter); + mList.setOnScrollListener(new ScrollListener()); mList.setDivider(null); mList.setSelector(new ColorDrawable(Color.TRANSPARENT)); mList.setClipToPadding(false); + + mFreshButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + mFreshButton.setVisibility(View.GONE); + mWaitProgressBar.setVisibility(View.VISIBLE); + refresh(true); + } + }); + } + + /** + * @return list view + */ + public ListView getListView() { + return mList; + } + + public RelativeLayout getMainView() { + return mMainView; + } + + public HfListView getHlv() { + return mHlv; + } + + /** + * @return True if actionbar or footer is refreshing + */ + public boolean isRefreshing() { + return mHlv.isRefreshing(); + } + + public boolean isGetGalleryOk() { + return mHlv.getVisibility() == View.VISIBLE; + } + + public int getMaxPage() { + return mMaxPage; } protected class GalleryAdapter extends BaseAdapter { @@ -172,4 +407,148 @@ public class AbstractGalleryActivity extends AbstractSlidingActivity { return convertView; } } + + private class ScrollListener implements ListView.OnScrollListener { + @Override + public void onScroll(AbsListView view, int firstVisibleItem, + int visibleItemCount, int totalItemCount) { + mHlv.onScroll(view, firstVisibleItem, visibleItemCount, totalItemCount); + + if (visibleItemCount < 2) + return; + if (mLastIndex == 0) + mLastIndex = mItemPerPage - 1; + int pageChanged = (firstVisibleItem - mFirstIndex) + / mItemPerPage; + if (pageChanged == 0) + pageChanged = (firstVisibleItem + visibleItemCount - mLastIndex - 1) + / mItemPerPage; + + if (pageChanged != 0) { + mCurPage = mCurPage + pageChanged; + mFirstIndex += pageChanged * mItemPerPage; + mLastIndex += pageChanged * mItemPerPage; + } + } + @Override + public void onScrollStateChanged(AbsListView view, int scrollState) {} + } + + private void setListPosition(int position) { + if (position == 0) + mList.setSelectionFromTop(position, mPaddingTop); + else + mList.setSelectionFromTop(position, 0); + } + + private class ListGetListener implements EhClient.OnGetMangaListListener { + @Override + public void onSuccess(Object checkFlag, + ArrayList gis, int itemPerPage, int maxPage) { + if (taskStamp != (Long)checkFlag) + return; + + mMaxPage = maxPage; + if (mItemPerPage < itemPerPage) + mItemPerPage = itemPerPage; + + mWaitProgressBar.setVisibility(View.GONE); + mFreshButton.setVisibility(View.GONE); + mSadPanda.setVisibility(View.GONE); + + if (mMaxPage == 0) { + mNoneTextView.setVisibility(View.VISIBLE); + mHlv.setVisibility(View.GONE); + + mFirstPage = 0; + mLastPage = 0; + mGiList.clear(); + mGalleryAdapter.notifyDataSetChanged(); + } else { + mNoneTextView.setVisibility(View.GONE); + mHlv.setVisibility(View.VISIBLE); + + switch (mGetMode) { + case REFRESH: + mFirstPage = 0; + mLastPage = 0; + mGiList = gis; + mGalleryAdapter.notifyDataSetChanged(); + // For current page + mFirstIndex = 0; + mLastIndex = gis.size() - 1; + mCurPage = 0; + + setListPosition(0); + break; + + case PRE_PAGE: + mFirstPage--; + mGiList.addAll(0, gis); + mGalleryAdapter.notifyDataSetChanged(); + + if (mIsKeepPosition) { + mFirstIndex += gis.size(); + mLastIndex += gis.size(); + int position = mList.getFirstVisiblePosition() + gis.size(); + setListPosition(position); + mList.smoothScrollToPosition(position -1); + } else { + mFirstIndex = 0; + mLastIndex = gis.size()-1; + mCurPage = mTargetPage; + setListPosition(0); + } + break; + + case NEXT_PAGE: + mLastPage++; + mGiList.addAll(gis); + mGalleryAdapter.notifyDataSetChanged(); + if (!mIsKeepPosition) { + mFirstIndex = mGiList.size() - gis.size(); + mLastIndex = mGiList.size() - 1; + mCurPage = mTargetPage; + setListPosition(mFirstIndex); + } + break; + + case SOMEWHERE: + mFirstPage = mTargetPage; + mLastPage = mTargetPage; + mGiList = gis; + mGalleryAdapter.notifyDataSetChanged(); + // For current page + mFirstIndex = 0; + mLastIndex = gis.size() - 1; + mCurPage = mTargetPage; + + setListPosition(0); + } + } + + mHlv.setAnyRefreshComplete(true); + } + @Override + public void onFailure(Object checkFlag, String eMsg) { + if (taskStamp != (Long)checkFlag) + return; + + mWaitProgressBar.setVisibility(View.GONE); + mNoneTextView.setVisibility(View.GONE); + mSadPanda.setVisibility(View.GONE); + + switch (mGetMode) { + case REFRESH: + mHlv.setVisibility(View.GONE); + mFreshButton.setVisibility(View.VISIBLE); + + default: + mFreshButton.setVisibility(View.GONE); + } + new SuperToast(AbstractGalleryActivity.this, + eMsg, SuperToast.WARNING).show(); + mHlv.setAnyRefreshComplete(false); + } + } } diff --git a/src/com/hippo/ehviewer/ui/FavouriteActivity.java b/src/com/hippo/ehviewer/ui/FavouriteActivity.java index df406d8dd..67eb65017 100644 --- a/src/com/hippo/ehviewer/ui/FavouriteActivity.java +++ b/src/com/hippo/ehviewer/ui/FavouriteActivity.java @@ -51,11 +51,11 @@ import com.hippo.ehviewer.data.GalleryInfo; import com.hippo.ehviewer.ehclient.EhClient; import com.hippo.ehviewer.service.DownloadService; import com.hippo.ehviewer.service.DownloadServiceConnection; -import com.hippo.ehviewer.util.Log; import com.hippo.ehviewer.util.Ui; import com.hippo.ehviewer.widget.ActionableToastBar; import com.hippo.ehviewer.widget.DialogBuilder; import com.hippo.ehviewer.widget.FswView; +import com.hippo.ehviewer.widget.HfListView; import com.hippo.ehviewer.widget.OnFitSystemWindowsListener; import com.hippo.ehviewer.widget.ActionableToastBar.ActionClickedListener; import com.hippo.ehviewer.widget.SuperToast; @@ -71,6 +71,10 @@ public class FavouriteActivity extends AbstractGalleryActivity private Resources mResources; private EhClient mClient; + private RelativeLayout mMainView; + private HfListView mHlv; + private ListView mList; + private SlidingMenu mSlidingMenu; private ListView mMenuList; private String[] mMenuTitles; @@ -123,6 +127,12 @@ public class FavouriteActivity extends AbstractGalleryActivity mSlidingMenu.setShadowDrawable(R.drawable.shadow_right); mSlidingMenu.setShadowWidthRes(R.dimen.shadow_width); + // Get View + mMainView = getMainView(); + mHlv = getHlv(); + mList = getListView(); + mMenuList = (ListView)findViewById(R.id.favorite_menu_list); + mActionableToastBar = new ActionableToastBar(this); mActionableToastBar.setBackgroundColor(mResources.getColor(android.R.color.holo_purple)); mMainView.addView(mActionableToastBar); @@ -155,7 +165,6 @@ public class FavouriteActivity extends AbstractGalleryActivity mList.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL); mList.setMultiChoiceModeListener(this); - mMenuList = (ListView)findViewById(R.id.favorite_menu_list); mMenuList.setClipToPadding(false); mMenuList.setAdapter(new BaseAdapter() { private ShapeDrawable d; @@ -221,7 +230,7 @@ public class FavouriteActivity extends AbstractGalleryActivity } else { mHlv.setEnabledHeader(true); mHlv.setEnabledFooter(true); - mClient.getMangaList(EhClient.getFavoriteUrl(mMenuIndex - 1), + mClient.getMangaList(EhClient.getFavoriteUrl(mMenuIndex - 1, 0), null, new EhClient.OnGetMangaListListener() { @Override public void onSuccess(Object checkFlag, ArrayList lmdArray, @@ -422,4 +431,9 @@ public class FavouriteActivity extends AbstractGalleryActivity else mChoiceGiSet.remove(mGiList.get(position)); } + + @Override + protected String getTargetUrl(int targetPage) { + return EhClient.getFavoriteUrl(mMenuIndex-1, targetPage); + } } diff --git a/src/com/hippo/ehviewer/ui/MangaListActivity.java b/src/com/hippo/ehviewer/ui/MangaListActivity.java index 74dcd7a7c..eb0d73bb7 100644 --- a/src/com/hippo/ehviewer/ui/MangaListActivity.java +++ b/src/com/hippo/ehviewer/ui/MangaListActivity.java @@ -37,6 +37,7 @@ import com.hippo.ehviewer.network.Downloader; import com.hippo.ehviewer.service.DownloadService; import com.hippo.ehviewer.service.DownloadServiceConnection; import com.hippo.ehviewer.util.Config; +import com.hippo.ehviewer.util.Log; import com.hippo.ehviewer.util.Ui; import com.hippo.ehviewer.util.Util; import com.hippo.ehviewer.widget.AlertButton; @@ -132,12 +133,6 @@ public class MangaListActivity extends AbstractGalleryActivity public static final String KEY_TAG = "tag"; public static final String KEY_UPLOADER = "uploader"; - private static final int REFRESH = 0x0; - private static final int NEXT_PAGE = 0x1; - private static final int PRE_PAGE = 0x2; - private static final int SOMEWHERE = 0x3; - private static final int SET_POSITION = 0x8000; - private EhClient mEhClient; private Resources mResources; @@ -154,6 +149,8 @@ public class MangaListActivity extends AbstractGalleryActivity private Button logoutButton; private View waitloginoutView; + private ListView mList; + private TagsAdapter tagsAdapter; private ListUrls lus; @@ -174,23 +171,8 @@ public class MangaListActivity extends AbstractGalleryActivity private long curBackTime = 0; private static final int BACK_PRESSED_INTERVAL = 2000; - // - private int firstPage = 0; - private int lastPage = 0; - - private int firstIndex = 0; - private int lastIndex = 0; - private int visiblePage = 0; - private String mTitle; - private int mGetMode; - - private int mFswPaddingLeft; - private int mFswPaddingTop; - private int mFswPaddingRight; - private int mFswPaddingBottom; - private DownloadServiceConnection mServiceConn = new DownloadServiceConnection(); private void toRegister() { @@ -345,7 +327,7 @@ public class MangaListActivity extends AbstractGalleryActivity public void onClick(View v) { ListUrls backup = lus; lus = getLus(filterDialog); - if (refresh()) { + if (refresh(false)) { ((AlertButton)v).dialog.dismiss(); showContent(); @@ -356,7 +338,7 @@ public class MangaListActivity extends AbstractGalleryActivity if (search == null || search.isEmpty()) t = getString(android.R.string.search_go); else - t = getString(android.R.string.search_go) + " " + search; + t = search; break; case ListUrls.UPLOADER: t = search; @@ -550,7 +532,7 @@ public class MangaListActivity extends AbstractGalleryActivity LayoutInflater inflater = this.getLayoutInflater(); View view = inflater.inflate(R.layout.jump, null); TextView tv = (TextView)view.findViewById(R.id.list_jump_sum); - tv.setText(String.format(getString(R.string.jump_sum), lus.getMax())); + tv.setText(String.format(getString(R.string.jump_sum), getMaxPage())); // TODO tv = (TextView)view.findViewById(R.id.list_jump_to); tv.setText(R.string.jump_to); final EditText et = (EditText)view.findViewById(R.id.list_jump_edit); @@ -559,43 +541,25 @@ public class MangaListActivity extends AbstractGalleryActivity .setView(view, true) .setPositiveButton(android.R.string.ok, new View.OnClickListener() { - @Override public void onClick(View v) { + boolean error = false; + int targetPage = 0; try{ - int targetPage = Integer.parseInt(et.getText().toString()) - 1; - if (targetPage >= firstPage - && targetPage <= lastPage) { // If targetPage is in range - ((AlertButton)v).dialog.dismiss(); // Just jump there - int position = (targetPage - firstPage) * - lus.getNumPerPage(); - setMainListPosition(position); - } else{ - if (lus.setPage(targetPage)) { - ((AlertButton)v).dialog.dismiss(); - - mWaitProgressBar.setVisibility(View.GONE); - mFreshButton.setVisibility(View.GONE); - mNoneTextView.setVisibility(View.GONE); - mSadPanda.setVisibility(View.GONE); - mHlv.setRefreshing(true); - - if (targetPage == firstPage - 1) - mGetMode = PRE_PAGE; - else if (targetPage == lastPage + 1) - mGetMode = NEXT_PAGE; - else - mGetMode = SOMEWHERE; - mGetMode |= SET_POSITION; - - getList(); - } else { - new SuperToast(MangaListActivity.this, R.string.toast_invalid_page).setIcon(R.drawable.ic_warning).show(); - } - } + targetPage = Integer.parseInt(et.getText().toString()) - 1; } catch(Exception e) { - new SuperToast(MangaListActivity.this, R.string.toast_invalid_page).setIcon(R.drawable.ic_warning).show(); + error = true; } + + if (!error) { + error = !jumpTo(targetPage, true); + } + + if (error) + new SuperToast(MangaListActivity.this, R.string.toast_invalid_page, + SuperToast.ERROR).show(); + else + ((AlertButton)v).dialog.dismiss(); } }).setNegativeButton(android.R.string.cancel, new View.OnClickListener() { @@ -879,187 +843,6 @@ public class MangaListActivity extends AbstractGalleryActivity } } - private void setMainListPosition(int position) { - if (position == 0) - mList.setSelectionFromTop(position, mFswPaddingTop); - else - mList.setSelectionFromTop(position, 0); - } - - private class MangaListGetListener implements - EhClient.OnGetMangaListListener { - @Override - public void onSuccess(Object checkFlag, ArrayList newLmdArray, - int indexPerPage, int maxPage) { - - // Check no Found view later - mWaitProgressBar.setVisibility(View.GONE); - mFreshButton.setVisibility(View.GONE); - - if (maxPage == 0) { // If No hits found - mHlv.setVisibility(View.GONE); - mNoneTextView.setVisibility(View.VISIBLE); - mSadPanda.setVisibility(View.GONE); - - mTitle = mResources.getString(R.string.no_found); - setTitle(); - - mGiList.clear(); - mGalleryAdapter.notifyDataSetChanged(); - } else if (maxPage == -1) { //panda - mHlv.setVisibility(View.GONE); - mNoneTextView.setVisibility(View.GONE); - mSadPanda.setVisibility(View.VISIBLE); - - mTitle = mResources.getString(R.string.sadpanda); - setTitle(); - - mGiList.clear(); - mGalleryAdapter.notifyDataSetChanged(); - } else { - mHlv.setVisibility(View.VISIBLE); - mNoneTextView.setVisibility(View.GONE); - mSadPanda.setVisibility(View.GONE); - - // Set indexPerPage and maxPage - lus.setNumPerPage(indexPerPage); - lus.setMax(maxPage); - - // Check refresh or get more - switch (mGetMode & (~SET_POSITION)) { - case REFRESH: - firstPage = 0; - lastPage = 0; - mGiList.clear(); - mGiList.addAll(newLmdArray); - mGalleryAdapter.notifyDataSetChanged(); - - // set visible page - firstIndex = 0; - lastIndex = newLmdArray.size() - 1; - visiblePage = 0; - - // set title - setTitle(); - - // set main list positon - setMainListPosition(0); - break; - case PRE_PAGE: - firstPage -= 1; - mGiList.addAll(0, newLmdArray); - mGalleryAdapter.notifyDataSetChanged(); - - // set position if necessary and set visible page - if ((mGetMode & SET_POSITION) != 0) { - firstIndex = 0; - lastIndex = newLmdArray.size()-1; - visiblePage = lus.getPage(); - - setMainListPosition(0); - setTitle(); - } else { - firstIndex += newLmdArray.size(); - lastIndex += newLmdArray.size(); - - setMainListPosition( - mList.getFirstVisiblePosition() + newLmdArray.size()); - } - break; - case NEXT_PAGE: - lastPage += 1; - mGiList.addAll(newLmdArray); - mGalleryAdapter.notifyDataSetChanged(); - - // set position if necessary and set visible page - if ((mGetMode & SET_POSITION) != 0) { - firstIndex = mGiList.size() - newLmdArray.size(); - lastIndex = mGiList.size() - 1; - visiblePage = lus.getPage(); - - setMainListPosition(firstIndex); - setTitle(); - } - break; - case SOMEWHERE: - firstPage = lus.getPage(); - lastPage = lus.getPage(); - mGiList.clear(); - mGiList.addAll(newLmdArray); - mGalleryAdapter.notifyDataSetChanged(); - - // Get visible page - firstIndex = 0; - lastIndex = newLmdArray.size(); - visiblePage = lus.getPage(); - - setMainListPosition(0); - setTitle(); - break; - default: - break; - } - } - - mHlv.setAnyRefreshComplete(true); - } - - @Override - public void onFailure(Object checkFlag, String eMsg) { - // Check pull list view later - // Check fresh view later - mWaitProgressBar.setVisibility(View.GONE); - mNoneTextView.setVisibility(View.GONE); - mSadPanda.setVisibility(View.GONE); - - switch (mGetMode & (~SET_POSITION)) { - case REFRESH: - mHlv.setVisibility(View.GONE); - mFreshButton.setVisibility(View.VISIBLE); - - new SuperToast(MangaListActivity.this, eMsg).setIcon(R.drawable.ic_warning).show(); - mGiList.clear(); - mGalleryAdapter.notifyDataSetChanged(); - break; - default: - mFreshButton.setVisibility(View.GONE); - new SuperToast(MangaListActivity.this, eMsg).setIcon(R.drawable.ic_warning).show(); - break; - } - mHlv.setAnyRefreshComplete(false); - } - } - - private class MangaListListener implements ListView.OnScrollListener { - - @Override - public void onScroll(AbsListView view, int firstVisibleItem, - int visibleItemCount, int totalItemCount) { - mHlv.onScroll(view, firstVisibleItem, visibleItemCount, totalItemCount); - - if (lus == null || visibleItemCount < 2) - return; - if (lastIndex == 0) - lastIndex = lus.getNumPerPage() - 1; - - int pageChanged = (firstVisibleItem - firstIndex) - / lus.getNumPerPage(); - if (pageChanged == 0) - pageChanged = (firstVisibleItem + visibleItemCount - lastIndex - 1) - / lus.getNumPerPage(); - - if (pageChanged != 0) { - visiblePage = visiblePage + pageChanged; - firstIndex += pageChanged * lus.getNumPerPage(); - lastIndex += pageChanged * lus.getNumPerPage(); - setTitle(); - } - } - - @Override - public void onScrollStateChanged(AbsListView view, int scrollState) {} - } - @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); @@ -1132,12 +915,13 @@ public class MangaListActivity extends AbstractGalleryActivity @Override public void onOpened() { setTitle(R.string.app_name); + invalidateOptionsMenu(); } }); mSlidingMenu.setOnClosedListener(new SlidingMenu.OnClosedListener() { @Override public void onClosed() { - setTitle(); + setTitle(mTitle); invalidateOptionsMenu(); } }); @@ -1160,7 +944,6 @@ public class MangaListActivity extends AbstractGalleryActivity String search = intent.getStringExtra("search"); int page = intent.getIntExtra("page", 0); lus = new ListUrls(type, search, page); - visiblePage = lus.getPage(); // Init dialog loginDialog = createLoginDialog(); @@ -1179,9 +962,12 @@ public class MangaListActivity extends AbstractGalleryActivity logoutButton = (Button)mUserPanel.findViewById(R.id.logout); waitloginoutView = mUserPanel.findViewById(R.id.wait); + mList = getListView(); + loginButton.setOnClickListener(this); registerButton.setOnClickListener(this); logoutButton.setOnClickListener(this); + setNoneText(mResources.getString(R.string.no_found)); // Drawer getActionBar().setDisplayHomeAsUpEnabled(true); @@ -1233,7 +1019,7 @@ public class MangaListActivity extends AbstractGalleryActivity case 0: // Home page ListUrls backup = lus; lus = new ListUrls(ListUrls.ALL_TYPE, null, 0); - if (refresh()) { + if (refresh(false)) { mTitle = mResources.getString(R.string.homepage); setTitle(mTitle); @@ -1285,7 +1071,7 @@ public class MangaListActivity extends AbstractGalleryActivity int position, long arg3) { ListUrls backup = lus; lus = mData.getTag(position); - if (lus != null && refresh()) { + if (lus != null && refresh(false)) { mTitle = listMenuTag.get(position); setTitle(mTitle); showContent(); @@ -1321,41 +1107,7 @@ public class MangaListActivity extends AbstractGalleryActivity } }); - // Pull list view - // Setup ActionBarPullToRefresh - mHlv.setColorScheme(R.color.refresh_color_1, R.color.refresh_color_2, R.color.refresh_color_3, R.color.refresh_color_4); - mHlv.setOnRefreshListener(new SuperSwipeRefreshLayout.OnRefreshListener() { - @Override - public void onRefresh() { - if (firstPage != 0) { - lus.setPage(firstPage - 1); - mGetMode = PRE_PAGE; - getList(); - } else { - lus.setPage(0); - mGetMode = REFRESH; - getList(); - } - } - }); - mHlv.setOnFooterRefreshListener(new HfListView.OnFooterRefreshListener() { - @Override - public boolean onFooterRefresh() { - if (lus.setPage(lastPage+1)) { - mGetMode = NEXT_PAGE; - getList(); - return true; - } else { - return false; - } - } - }); - mHlv.setFooterString(getString(R.string.footer_loading), - getString(R.string.footer_loaded), - getString(R.string.footer_fail)); - // Listview - mList.setOnScrollListener(new MangaListListener()); mList.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView arg0, View arg1, @@ -1384,17 +1136,12 @@ public class MangaListActivity extends AbstractGalleryActivity @Override public void onfitSystemWindows(int paddingLeft, int paddingTop, int paddingRight, int paddingBottom) { - mFswPaddingLeft = paddingLeft; - mFswPaddingTop = paddingTop; - mFswPaddingRight = paddingRight; - mFswPaddingBottom = paddingBottom; - - mUserPanel.setPadding(mUserPanel.getPaddingLeft(), mFswPaddingTop, + mUserPanel.setPadding(mUserPanel.getPaddingLeft(), paddingTop, mUserPanel.getPaddingRight(), mUserPanel.getPaddingBottom()); itemListMenu.setPadding(itemListMenu.getPaddingLeft(), itemListMenu.getPaddingTop(), - itemListMenu.getPaddingRight(), mFswPaddingBottom); - tagListMenu.setPadding(tagListMenu.getPaddingLeft(), mFswPaddingTop, - tagListMenu.getPaddingRight(), mFswPaddingBottom); + itemListMenu.getPaddingRight(), paddingBottom); + tagListMenu.setPadding(tagListMenu.getPaddingLeft(), paddingTop, + tagListMenu.getPaddingRight(), paddingBottom); } }); @@ -1408,19 +1155,15 @@ public class MangaListActivity extends AbstractGalleryActivity // get MangeList mTitle = mResources.getString(R.string.homepage); - setTitle(); - refresh(false); - - // set layout - mHlv.setVisibility(View.GONE); - mWaitProgressBar.setVisibility(View.VISIBLE); - mFreshButton.setVisibility(View.GONE); - mNoneTextView.setVisibility(View.GONE); - mSadPanda.setVisibility(View.GONE); + setTitle(mTitle); + firstTimeRefresh(); } @Override public boolean onCreateOptionsMenu(Menu menu) { + if (mSlidingMenu!= null && mSlidingMenu.isMenuShowing()) + return true; + getMenuInflater().inflate(R.menu.main, menu); SearchManager searchManager = @@ -1441,11 +1184,11 @@ public class MangaListActivity extends AbstractGalleryActivity if (query == null || query.isEmpty()) t = getString(android.R.string.search_go); else - t = getString(android.R.string.search_go) + " " + query; + t = query; ListUrls backup = lus; lus = new ListUrls(ListUrls.ALL_TYPE, query); - if (refresh()) { + if (refresh(false)) { mTitle = t; setTitle(mTitle); } else { @@ -1565,7 +1308,7 @@ public class MangaListActivity extends AbstractGalleryActivity lus.setTag(tag); mTitle = tag; setTitle(mTitle); - refresh(); + refresh(false); break; case MODE_UPLOADER: @@ -1574,7 +1317,7 @@ public class MangaListActivity extends AbstractGalleryActivity lus.setMode(ListUrls.UPLOADER); mTitle = uploader; setTitle(mTitle); - refresh(); + refresh(false); break; } } @@ -1591,11 +1334,11 @@ public class MangaListActivity extends AbstractGalleryActivity showMenu(); return true; case R.id.action_refresh: - if (!refresh()) + if (!refresh(false)) new SuperToast(MangaListActivity.this, R.string.wait).show(); return true; case R.id.action_jump: - if (!mHlv.isRefreshing() && isGetOk()) + if (!isRefreshing() && isGetGalleryOk()) jump(); return true; default: @@ -1603,17 +1346,6 @@ public class MangaListActivity extends AbstractGalleryActivity } } - public boolean isGetOk() { - return mHlv.getVisibility() == View.VISIBLE; - } - - public void setTitle() { - if (isGetOk()) - setTitle(String.format(getString(R.string.list_title), mTitle, visiblePage + 1)); - else - setTitle(mTitle); - } - @Override protected void onDestroy() { super.onDestroy(); @@ -1739,37 +1471,13 @@ public class MangaListActivity extends AbstractGalleryActivity } } - private void getList() { - mEhClient.getMangaList(lus.getUrl(), - null, - new MangaListGetListener()); - } - - public boolean refresh() { - return refresh(true); - } - - public boolean refresh(boolean isShowProgress) { - if (!mHlv.isRefreshing() - && mWaitProgressBar.getVisibility() != View.VISIBLE) { - lus.setPage(0); - if (isShowProgress) - mHlv.setRefreshing(true); - mGetMode = REFRESH; - getList(); - return true; - } else { - return false; - } - } - - public void buttonRefresh(View arg0) { - refresh(false); - mFreshButton.setVisibility(View.GONE); - mWaitProgressBar.setVisibility(View.VISIBLE); - } - public void buttonCheckLogin(View v) { checkLogin(false); } + + @Override + protected String getTargetUrl(int targetPage) { + lus.setPage(targetPage); + return lus.getUrl(); + } } diff --git a/src/com/hippo/ehviewer/widget/HfListView.java b/src/com/hippo/ehviewer/widget/HfListView.java index 1f3d12c6a..ab35c2feb 100644 --- a/src/com/hippo/ehviewer/widget/HfListView.java +++ b/src/com/hippo/ehviewer/widget/HfListView.java @@ -92,6 +92,14 @@ public class HfListView extends SuperSwipeRefreshLayout return mListView; } + /** + * Just a alias + * @param l + */ + public void setOnHeaderRefreshListener(HfListView.OnRefreshListener l) { + super.setOnRefreshListener(l); + } + public void setOnFooterRefreshListener(OnFooterRefreshListener l) { mFooterRefreshListener = l; } diff --git a/src/com/hippo/ehviewer/widget/SuperToast.java b/src/com/hippo/ehviewer/widget/SuperToast.java index 7844a0a47..307a44691 100644 --- a/src/com/hippo/ehviewer/widget/SuperToast.java +++ b/src/com/hippo/ehviewer/widget/SuperToast.java @@ -30,6 +30,10 @@ import android.widget.Toast; public class SuperToast extends Toast { + public static final int NONE = 0; + public static final int WARNING = 1; + public static final int ERROR = 2; + private Context mContext; private LinearLayout mMainView; @@ -43,14 +47,24 @@ public class SuperToast extends Toast { init(); } + public SuperToast(Context context, int strResId) { + this(context); + setMessage(strResId); + } + public SuperToast(Context context, String mesg) { this(context); setMessage(mesg); } - public SuperToast(Context context, int strResId) { - this(context); - setMessage(strResId); + public SuperToast(Context context, int strResId, int type) { + this(context, strResId); + setTypeIcon(type); + } + + public SuperToast(Context context, String mesg, int type) { + this(context, mesg); + setTypeIcon(type); } private void init() { @@ -67,6 +81,22 @@ public class SuperToast extends Toast { setView(view); } + public SuperToast setTypeIcon(int type) { + switch(type) { + case WARNING: + setIcon(R.drawable.ic_warning); + break; + case ERROR: + setIcon(R.drawable.ic_error); + break; + case NONE: + default: + // nop + break; + } + return this; + } + public SuperToast setIcon(int resId) { return setIcon(mContext.getResources().getDrawable(resId)); }