From b287af4824a9098acae9ac4e57c79089d55b7d03 Mon Sep 17 00:00:00 2001 From: FooIbar <118464521+FooIbar@users.noreply.github.com> Date: Wed, 21 Dec 2022 13:41:22 +0800 Subject: [PATCH] Refactor getPageData --- .../client/data/FavListUrlBuilder.java | 22 ++- .../ehviewer/client/data/ListUrlBuilder.kt | 134 ++++++------------ .../client/parser/FavoritesParser.java | 28 +--- .../client/parser/GalleryListParser.java | 49 ++++--- .../ui/fragment/AdvancedFragment.java | 5 +- .../ehviewer/ui/scene/FavoritesScene.java | 71 ++-------- .../ehviewer/ui/scene/GalleryListScene.java | 60 +++----- .../ui/scene/GalleryPreviewsScene.java | 4 +- .../widget/GalleryInfoContentHelper.kt | 36 +---- .../java/com/hippo/widget/ContentLayout.java | 60 +++++--- 10 files changed, 166 insertions(+), 303 deletions(-) diff --git a/app/src/main/java/com/hippo/ehviewer/client/data/FavListUrlBuilder.java b/app/src/main/java/com/hippo/ehviewer/client/data/FavListUrlBuilder.java index 834544d05..b23ebcb93 100644 --- a/app/src/main/java/com/hippo/ehviewer/client/data/FavListUrlBuilder.java +++ b/app/src/main/java/com/hippo/ehviewer/client/data/FavListUrlBuilder.java @@ -32,7 +32,7 @@ public class FavListUrlBuilder implements Parcelable { public static final int FAV_CAT_ALL = -1; public static final int FAV_CAT_LOCAL = -2; - public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { + public static final Parcelable.Creator CREATOR = new Parcelable.Creator<>() { @Override public FavListUrlBuilder createFromParcel(Parcel source) { @@ -66,12 +66,14 @@ public class FavListUrlBuilder implements Parcelable { return favCat >= 0 && favCat <= 9; } - public void setPrev(String prev) { - mPrev = prev; - } - - public void setNext(String next) { - mNext = next; + public void setIndex(String index, boolean isNext) { + if (isNext) { + mNext = index; + mPrev = null; + } else { + mPrev = index; + mNext = null; + } } public void setJumpTo(String jumpTo) { @@ -115,12 +117,6 @@ public class FavListUrlBuilder implements Parcelable { e.printStackTrace(); } } - // Name - ub.addQuery("sn", "on"); - // Tags - ub.addQuery("st", "on"); - // Note - ub.addQuery("sf", "on"); } if (mPrev != null && !mPrev.isEmpty()) { ub.addQuery("prev", mPrev); diff --git a/app/src/main/java/com/hippo/ehviewer/client/data/ListUrlBuilder.kt b/app/src/main/java/com/hippo/ehviewer/client/data/ListUrlBuilder.kt index 25d1f8e18..8c5a29475 100644 --- a/app/src/main/java/com/hippo/ehviewer/client/data/ListUrlBuilder.kt +++ b/app/src/main/java/com/hippo/ehviewer/client/data/ListUrlBuilder.kt @@ -36,8 +36,8 @@ open class ListUrlBuilder : Cloneable, Parcelable { @get:Mode @Mode var mode = MODE_NORMAL - private var mPrevGid = 0 - private var mNextGid = 0 + private var mPrev: String? = null + private var mNext: String? = null private var mJumpTo: String? = null var category = EhUtils.NONE private var mKeyword: String? = null @@ -54,8 +54,8 @@ open class ListUrlBuilder : Cloneable, Parcelable { constructor() protected constructor(parcel: Parcel) { mode = parcel.readInt() - mPrevGid = parcel.readInt() - mNextGid = parcel.readInt() + mPrev = parcel.readString() + mNext = parcel.readString() mJumpTo = parcel.readString() this.category = parcel.readInt() mKeyword = parcel.readString() @@ -72,8 +72,8 @@ open class ListUrlBuilder : Cloneable, Parcelable { fun reset() { mode = MODE_NORMAL - mPrevGid = 0 - mNextGid = 0 + mPrev = null + mNext = null mJumpTo = null this.category = EhUtils.NONE mKeyword = null @@ -96,12 +96,14 @@ open class ListUrlBuilder : Cloneable, Parcelable { } } - fun setPrevGid(prevGid: Int) { - mPrevGid = prevGid - } - - fun setNextGid(nextGid: Int) { - mNextGid = nextGid + fun setIndex(index: String?, isNext: Boolean = true) { + if (isNext) { + mNext = index + mPrev = null + } else { + mPrev = index + mNext = null + } } fun setJumpTo(jumpTo: String?) { @@ -121,8 +123,8 @@ open class ListUrlBuilder : Cloneable, Parcelable { */ fun set(lub: ListUrlBuilder) { mode = lub.mode - mPrevGid = lub.mPrevGid - mNextGid = lub.mNextGid + mPrev = lub.mPrev + mNext = lub.mNext mJumpTo = lub.mJumpTo this.category = lub.category mKeyword = lub.mKeyword @@ -196,7 +198,7 @@ open class ListUrlBuilder : Cloneable, Parcelable { if (TextUtils.isEmpty(query)) { return } - val querys = StringUtils.split(query, '&') + val queries = StringUtils.split(query, '&') var category = 0 var keyword: String? = null var enableAdvanceSearch = false @@ -206,7 +208,7 @@ open class ListUrlBuilder : Cloneable, Parcelable { var enablePage = false var pageFrom = -1 var pageTo = -1 - for (str in querys) { + for (str in queries) { val index = str.indexOf('=') if (index < 0) { continue @@ -348,19 +350,19 @@ open class ListUrlBuilder : Cloneable, Parcelable { } } } - if (mSHash != null) { - ub.addQuery("f_shash", mSHash!!) + mSHash?.let { + ub.addQuery("f_shash", it) } mJumpTo?.let { - ub.addQuery("seek", mJumpTo!!) - mPrevGid = 0 - mNextGid = 0 + ub.addQuery("seek", it) + mPrev = null + mNext = null } - if (mPrevGid != 0) { - ub.addQuery("prev", mPrevGid) + mPrev?.let { + ub.addQuery("prev", it) } - if (mNextGid != 0) { - ub.addQuery("next", mNextGid) + mNext?.let { + ub.addQuery("next", it) } // Advance search if (advanceSearch != -1) { @@ -393,14 +395,14 @@ open class ListUrlBuilder : Cloneable, Parcelable { } catch (e: UnsupportedEncodingException) { // Empty } - if (mPrevGid != 0) { - sb.append("?prev=").append(mPrevGid) + mPrev?.let { + sb.append("?prev=").append(it) } - if (mNextGid != 0) { - sb.append("?next=").append(mNextGid) + mNext?.let { + sb.append("?next=").append(it) } - if (mJumpTo != null) { - sb.append("&seek=").append(mJumpTo) + mJumpTo?.let { + sb.append("&seek=").append(it) } sb.toString() } @@ -413,14 +415,14 @@ open class ListUrlBuilder : Cloneable, Parcelable { } catch (e: UnsupportedEncodingException) { // Empty } - if (mPrevGid != 0) { - sb.append("?prev=").append(mPrevGid) + mPrev?.let { + sb.append("?prev=").append(it) } - if (mNextGid != 0) { - sb.append("?next=").append(mNextGid) + mNext?.let { + sb.append("?next=").append(it) } - if (mJumpTo != null) { - sb.append("&seek=").append(mJumpTo) + mJumpTo?.let { + sb.append("&seek=").append(it) } sb.toString() } @@ -433,61 +435,15 @@ open class ListUrlBuilder : Cloneable, Parcelable { try { sb.append(URLEncoder.encode(mKeyword, "UTF-8")) } catch (e: UnsupportedEncodingException) { - // Empty + e.printStackTrace() } - if (mNextGid != 0) { - sb.append("&p=").append(mNextGid) + mJumpTo?.let { + sb.append("&p=").append(it) } sb.toString() } - else -> { - val url: String = if (mode == MODE_NORMAL) { - EhUrl.getHost() - } else { - EhUrl.getWatchedUrl() - } - val ub = UrlBuilder(url) - if (this.category != EhUtils.NONE) { - ub.addQuery("f_cats", category.inv() and EhConfig.ALL_CATEGORY) - } - if (mKeyword != null) { - val keyword = mKeyword!!.trim { it <= ' ' } - if (keyword.isNotEmpty()) { - try { - ub.addQuery("f_search", URLEncoder.encode(mKeyword, "UTF-8")) - } catch (_: UnsupportedEncodingException) { - } - } - } - if (mSHash != null) { - ub.addQuery("f_shash", mSHash!!) - } - if (mPrevGid != 0) { - ub.addQuery("prev", mPrevGid) - } - if (mNextGid != 0) { - ub.addQuery("next", mNextGid) - } - if (advanceSearch != -1) { - ub.addQuery("advsearch", "1") - if (advanceSearch and AdvanceSearchTable.SH != 0) ub.addQuery("f_sh", "on") - if (advanceSearch and AdvanceSearchTable.STO != 0) ub.addQuery("f_sto", "on") - if (advanceSearch and AdvanceSearchTable.SFL != 0) ub.addQuery("f_sfl", "on") - if (advanceSearch and AdvanceSearchTable.SFU != 0) ub.addQuery("f_sfu", "on") - if (advanceSearch and AdvanceSearchTable.SFT != 0) ub.addQuery("f_sft", "on") - if (minRating != -1) { - ub.addQuery("f_sr", "on") - ub.addQuery("f_srdd", minRating) - } - if (pageFrom != -1 || pageTo != -1) { - ub.addQuery("f_sp", "on") - ub.addQuery("f_spf", if (pageFrom != -1) pageFrom.toString() else "") - ub.addQuery("f_spt", if (pageTo != -1) pageTo.toString() else "") - } - } - ub.build() - } + else -> throw java.lang.IllegalStateException("Unexpected value: $mode") } } @@ -497,8 +453,8 @@ open class ListUrlBuilder : Cloneable, Parcelable { override fun writeToParcel(dest: Parcel, flags: Int) { dest.writeInt(mode) - dest.writeInt(mPrevGid) - dest.writeInt(mNextGid) + dest.writeString(mPrev) + dest.writeString(mNext) dest.writeString(mJumpTo) dest.writeInt(this.category) dest.writeString(mKeyword) diff --git a/app/src/main/java/com/hippo/ehviewer/client/parser/FavoritesParser.java b/app/src/main/java/com/hippo/ehviewer/client/parser/FavoritesParser.java index fea25f709..09450a73e 100644 --- a/app/src/main/java/com/hippo/ehviewer/client/parser/FavoritesParser.java +++ b/app/src/main/java/com/hippo/ehviewer/client/parser/FavoritesParser.java @@ -31,22 +31,17 @@ import org.jsoup.nodes.Element; import org.jsoup.select.Elements; import java.util.List; -import java.util.regex.Matcher; -import java.util.regex.Pattern; public class FavoritesParser { - private static final Pattern PATTERN_PREV_PAGE = Pattern.compile("prev=(\\d+(-\\d+)?)"); - private static final Pattern PATTERN_NEXT_PAGE = Pattern.compile("next=(\\d+(-\\d+)?)"); public static Result parse(String body) throws Exception { if (body.contains("This page requires you to log on.

")) { throw new EhException(GetText.getString(R.string.need_sign_in)); } - Document d = Jsoup.parse(body); - String[] catArray = new String[10]; int[] countArray = new int[10]; try { + Document d = Jsoup.parse(body); Element ido = JsoupUtils.getElementByClass(d, "ido"); //noinspection ConstantConditions Elements fps = ido.getElementsByClass("fp"); @@ -64,24 +59,13 @@ public class FavoritesParser { throw new ParseException("Parse favorites error", body); } - Result re = new Result(); - try { - Element prev = d.getElementById("uprev"); - Element next = d.getElementById("unext"); - assert prev != null; - assert next != null; - Matcher matcherPrev = PATTERN_PREV_PAGE.matcher(prev.attr("href")); - Matcher matcherNext = PATTERN_NEXT_PAGE.matcher(next.attr("href")); - if (matcherPrev.find()) re.prevPage = matcherPrev.group(1); - if (matcherNext.find()) re.nextPage = matcherNext.group(1); - } catch (Throwable e) { - e.printStackTrace(); - } - GalleryListParser.Result result = GalleryListParser.parse(body); + Result re = new Result(); re.catArray = catArray; re.countArray = countArray; + re.prev = result.prev; + re.next = result.next; re.galleryInfoList = result.galleryInfoList; return re; @@ -90,8 +74,8 @@ public class FavoritesParser { public static class Result { public String[] catArray; // Size 10 public int[] countArray; // Size 10 - public String prevPage; - public String nextPage; + public String prev; + public String next; public List galleryInfoList; } } diff --git a/app/src/main/java/com/hippo/ehviewer/client/parser/GalleryListParser.java b/app/src/main/java/com/hippo/ehviewer/client/parser/GalleryListParser.java index 2f9ae3225..033a1362e 100644 --- a/app/src/main/java/com/hippo/ehviewer/client/parser/GalleryListParser.java +++ b/app/src/main/java/com/hippo/ehviewer/client/parser/GalleryListParser.java @@ -50,8 +50,8 @@ public class GalleryListParser { private static final Pattern PATTERN_THUMB_SIZE = Pattern.compile("height:(\\d+)px;width:(\\d+)px"); private static final Pattern PATTERN_FAVORITE_SLOT = Pattern.compile("background-color:rgba\\((\\d+),(\\d+),(\\d+),"); private static final Pattern PATTERN_PAGES = Pattern.compile("(\\d+) page"); - private static final Pattern PATTERN_PREV_PAGE = Pattern.compile("prev=(\\d+)"); - private static final Pattern PATTERN_NEXT_PAGE = Pattern.compile("next=(\\d+)"); + private static final Pattern PATTERN_PREV_PAGE = Pattern.compile("prev=(\\d+(-\\d+)?)"); + private static final Pattern PATTERN_NEXT_PAGE = Pattern.compile("next=(\\d+(-\\d+)?)"); private static final String[][] FAVORITE_SLOT_RGB = new String[][]{ new String[]{"0", "0", "0"}, @@ -256,11 +256,7 @@ public class GalleryListParser { if (div != null) { gi.disowned = div.attr("style").contains("opacity:0.5"); Element a = div.children().first(); - if (a != null) { - gi.uploader = a.text().trim(); - } else { - gi.uploader = div.text().trim(); - } + gi.uploader = a == null ? div.text().trim() : a.text().trim(); } } if (children.size() > pagesIndex) { @@ -299,25 +295,41 @@ public class GalleryListParser { Matcher matcherPrev = PATTERN_PREV_PAGE.matcher(prev.attr("href")); Matcher matcherNext = PATTERN_NEXT_PAGE.matcher(next.attr("href")); if (matcherPrev.find()) - result.prevGid = NumberUtils.parseIntSafely(matcherPrev.group(1), 0); + result.prev = matcherPrev.group(1); if (matcherNext.find()) - result.nextGid = NumberUtils.parseIntSafely(matcherNext.group(1), 0); - result.founds = Integer.MAX_VALUE; + result.next = matcherNext.group(1); } catch (Throwable e) { ExceptionUtils.throwIfFatal(e); result.noWatchedTags = body.contains("

You do not have any watched tags"); if (body.contains("No hits found

")) { - result.founds = 0; //noinspection unchecked result.galleryInfoList = Collections.EMPTY_LIST; return result; - } else if (d.getElementsByClass("ptt").isEmpty()) { - result.founds = 1; - } else { - result.founds = Integer.MAX_VALUE; } } + try { // For toplists + Element ptt = d.getElementsByClass("ptt").first(); + if (ptt != null) { + Elements es = ptt.child(0).child(0).children(); + result.pages = Integer.parseInt(es.get(es.size() - 2).text().trim()); + + Element e = es.get(es.size() - 1); + if (e != null) { + e = e.children().first(); + if (e != null) { + String href = e.attr("href"); + Matcher matcher = PATTERN_NEXT_PAGE.matcher(href); + if (matcher.find()) { + result.nextPage = NumberUtils.parseIntSafely(matcher.group(1), 0); + } + } + } + } + } catch (Throwable e) { + e.printStackTrace(); + } + try { Element itg = d.getElementsByClass("itg").first(); Elements es; @@ -350,9 +362,10 @@ public class GalleryListParser { } public static class Result { - public int founds; - public int prevGid; - public int nextGid; + public int pages; + public int nextPage; + public String prev; + public String next; public boolean noWatchedTags; public List galleryInfoList; } diff --git a/app/src/main/java/com/hippo/ehviewer/ui/fragment/AdvancedFragment.java b/app/src/main/java/com/hippo/ehviewer/ui/fragment/AdvancedFragment.java index 38713f1be..a8c4d3d0d 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/fragment/AdvancedFragment.java +++ b/app/src/main/java/com/hippo/ehviewer/ui/fragment/AdvancedFragment.java @@ -19,7 +19,6 @@ package com.hippo.ehviewer.ui.fragment; import android.annotation.SuppressLint; import android.app.Activity; import android.content.Intent; -import android.content.res.Resources; import android.net.Uri; import android.os.Build; import android.os.Bundle; @@ -333,14 +332,14 @@ public class AdvancedFragment extends BasePreferenceFragment { Log.d("LocalFavorites", "now backup page " + status); EhDB.putLocalFavorites(result.galleryInfoList); - if (result.nextPage != null) { + if (result.next != null) { try { Thread.sleep(Settings.getDownloadDelay()); } catch (InterruptedException e) { e.printStackTrace(); } favIndex++; - favListUrlBuilder.setNext(result.nextPage); + favListUrlBuilder.setIndex(result.next, true); request.setArgs(favListUrlBuilder.build()); mClient.execute(request); } else { diff --git a/app/src/main/java/com/hippo/ehviewer/ui/scene/FavoritesScene.java b/app/src/main/java/com/hippo/ehviewer/ui/scene/FavoritesScene.java index d5b186f64..856769ee3 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/scene/FavoritesScene.java +++ b/app/src/main/java/com/hippo/ehviewer/ui/scene/FavoritesScene.java @@ -588,7 +588,7 @@ public class FavoritesScene extends SearchBarScene implements // Refresh case 1 -> mHelper.refresh(); // Last page - case 2 -> mHelper.goToPage(Integer.MAX_VALUE - 1); + case 2 -> mHelper.goTo("1-0", false); } view.setExpanded(false); return; @@ -734,28 +734,7 @@ public class FavoritesScene extends SearchBarScene implements } updateSearchBar(); - - int pages; - if (result.nextPage == null) - pages = mHelper.pgCounter + 1; - else - pages = Integer.MAX_VALUE; - - String prev = result.prevPage, next = result.nextPage; - switch (mHelper.operation) { - case -1: - if (prev != null) mHelper.upperPage = prev; - break; - case 1: - if (next != null) mHelper.lowerPage = next; - break; - default: - mHelper.upperPage = prev; - mHelper.lowerPage = next; - break; - } - - mHelper.onGetPageData(taskId, pages, mHelper.pgCounter + 1, result.galleryInfoList); + mHelper.onGetPageData(taskId, 0, 0, result.prev, result.next, result.galleryInfoList); if (mDrawerAdapter != null) { mDrawerAdapter.notifyDataSetChanged(); @@ -780,9 +759,9 @@ public class FavoritesScene extends SearchBarScene implements } if (list.size() == 0) { - mHelper.onGetPageData(taskId, 0, 0, Collections.EMPTY_LIST); + mHelper.onGetPageData(taskId, 0, 0, null, null, Collections.EMPTY_LIST); } else { - mHelper.onGetPageData(taskId, 1, 0, list); + mHelper.onGetPageData(taskId, 1, 0, null, null, list); } if (TextUtils.isEmpty(keyword)) { @@ -1073,18 +1052,13 @@ public class FavoritesScene extends SearchBarScene implements } private class FavoritesHelper extends GalleryInfoContentHelper { - public String upperPage = null; - public String lowerPage = null; - public int operation = 0; - public int pgCounter = 0; @Override - protected void getPageData(final int taskId, int type, int page) { + protected void getPageData(final int taskId, int type, int page, String index, boolean isNext) { MainActivity activity = getMainActivity(); if (null == activity || null == mUrlBuilder || null == mClient) { return; } - pgCounter = page; if (mEnableModify) { mEnableModify = false; @@ -1123,7 +1097,7 @@ public class FavoritesScene extends SearchBarScene implements url = mUrlBuilder.build(); } - mUrlBuilder.setNext(lowerPage); + mUrlBuilder.setIndex(index, true); EhRequest request = new EhRequest(); request.setMethod(EhClient.METHOD_MODIFY_FAVORITES); request.setCallback(new GetFavoritesListener(getContext(), @@ -1136,28 +1110,8 @@ public class FavoritesScene extends SearchBarScene implements final String keyword = mUrlBuilder.getKeyword(); SimpleHandler.getInstance().post(() -> onGetFavoritesLocal(keyword, taskId)); } else { - String prev = null, next = null; - if (page == Integer.MAX_VALUE - 1) { - prev = "1-0"; - jumpTo = null; - } else if (jumpTo != null) { - next = Integer.toString(minGid); - operation = 0; - } else if (page != 0 && mHelper != null) { - if (page >= mHelper.getPageForTop()) { - next = lowerPage; - operation = 1; - } else { - prev = upperPage; - operation = -1; - } - } - mUrlBuilder.setPrev(prev); - mUrlBuilder.setNext(next); - + mUrlBuilder.setIndex(index, isNext); mUrlBuilder.setJumpTo(jumpTo); - jumpTo = null; - String url = mUrlBuilder.build(); EhRequest request = new EhRequest(); request.setMethod(EhClient.METHOD_GET_FAVORITES); @@ -1225,26 +1179,17 @@ public class FavoritesScene extends SearchBarScene implements @Override protected void beforeRefresh() { super.beforeRefresh(); - upperPage = null; - lowerPage = null; - operation = 0; } @NonNull @Override protected Parcelable saveInstanceState(@NonNull Parcelable superState) { - Bundle bundle = (Bundle) super.saveInstanceState(superState); - bundle.putString(KEY_UPPER_PAGE, upperPage); - bundle.putString(KEY_LOWER_PAGE, lowerPage); - return bundle; + return (Bundle) super.saveInstanceState(superState); } @NonNull @Override protected Parcelable restoreInstanceState(@NonNull Parcelable state) { - Bundle bundle = (Bundle) state; - upperPage = bundle.getString(KEY_UPPER_PAGE); - lowerPage = bundle.getString(KEY_LOWER_PAGE); return super.restoreInstanceState(state); } } diff --git a/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryListScene.java b/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryListScene.java index 8658c65f5..3842d8c97 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryListScene.java +++ b/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryListScene.java @@ -828,9 +828,9 @@ public final class GalleryListScene extends SearchBarScene return; } - if (ListUrlBuilder.MODE_TOPLIST == mUrlBuilder.getMode()) { + if (mIsTopList) { final int page = mHelper.getPageForTop() + 1; - final int pages = 200; + final int pages = mHelper.getPages(); String hint = getString(R.string.go_to_hint, page, pages); final EditTextDialogBuilder builder = new EditTextDialogBuilder(context, null, hint); builder.getEditText().setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_DECIMAL); @@ -856,7 +856,7 @@ public final class GalleryListScene extends SearchBarScene return; } builder.setError(null); - mHelper.goToPage(goTo); + mHelper.goTo(goTo); dialog.dismiss(); }); } else { @@ -897,7 +897,7 @@ public final class GalleryListScene extends SearchBarScene // Refresh case 1 -> mHelper.refresh(); // Last page - case 2 -> mHelper.goToPage(Integer.MAX_VALUE - 1); + case 2 -> mHelper.goTo("1", false); } view.setExpanded(false); @@ -1258,16 +1258,11 @@ public final class GalleryListScene extends SearchBarScene ? R.string.gallery_list_empty_hit_subscription : R.string.gallery_list_empty_hit); mHelper.setEmptyString(emptyString); - - int pages; - if (mIsTopList) - pages = 200; - else if (result.nextGid == 0) - pages = mHelper.pgCounter + 1; - else - pages = result.founds; - - mHelper.onGetPageData(taskId, pages, mHelper.pgCounter + 1, result.galleryInfoList); + if (mIsTopList) { + mHelper.onGetPageData(taskId, result.pages, result.nextPage, null, null, result.galleryInfoList); + } else { + mHelper.onGetPageData(taskId, 0, 0, result.prev, result.next, result.galleryInfoList); + } } } @@ -1439,7 +1434,8 @@ public final class GalleryListScene extends SearchBarScene } mUrlBuilder.set(mQuickSearchList.get(position)); - mUrlBuilder.setNextGid(0); + mUrlBuilder.setIndex(null, true); + mUrlBuilder.setJumpTo(null); onUpdateUrlBuilder(); mHelper.refresh(); setState(STATE_NORMAL); @@ -1456,7 +1452,8 @@ public final class GalleryListScene extends SearchBarScene } mUrlBuilder.setKeyword(String.valueOf(keywords[position])); - mUrlBuilder.setNextGid(0); + mUrlBuilder.setIndex(null, true); + mUrlBuilder.setJumpTo(null); onUpdateUrlBuilder(); mHelper.refresh(); setState(STATE_NORMAL); @@ -1586,41 +1583,20 @@ public final class GalleryListScene extends SearchBarScene } private class GalleryListHelper extends GalleryInfoContentHelper { - public int pgCounter = 0; @Override - protected void getPageData(int taskId, int type, int page) { - pgCounter = page; + protected void getPageData(int taskId, int type, int page, String index, boolean isNext) { MainActivity activity = getMainActivity(); if (null == activity || null == mClient || null == mHelper || null == mUrlBuilder) { return; } - int prevGid = 0, nextGid = 0; if (mIsTopList) { - if (jumpTo != null) { - pgCounter = Integer.parseInt(jumpTo); - nextGid = pgCounter; - } else { - nextGid = page; - } - } else if (page == Integer.MAX_VALUE - 1) { - prevGid = 1; - jumpTo = null; - } else if (jumpTo != null) { - nextGid = minGid; - } else if (page != 0) { - if (page >= mHelper.getPageForTop()) - nextGid = minGid; - else - prevGid = maxGid; + mUrlBuilder.setJumpTo(String.valueOf(page)); + } else { + mUrlBuilder.setIndex(index, isNext); + mUrlBuilder.setJumpTo(jumpTo); } - mUrlBuilder.setPrevGid(prevGid); - mUrlBuilder.setNextGid(nextGid); - - mUrlBuilder.setJumpTo(jumpTo); - jumpTo = null; - if (ListUrlBuilder.MODE_IMAGE_SEARCH == mUrlBuilder.getMode()) { EhRequest request = new EhRequest(); request.setMethod(EhClient.METHOD_IMAGE_SEARCH); diff --git a/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryPreviewsScene.java b/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryPreviewsScene.java index e3528d52e..689229696 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryPreviewsScene.java +++ b/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryPreviewsScene.java @@ -247,7 +247,7 @@ public class GalleryPreviewsScene extends ToolbarScene { list.add(previewSet.getGalleryPreview(mGalleryInfo.gid, i)); } - mHelper.onGetPageData(taskId, result.second, 0, list); + mHelper.onGetPageData(taskId, result.second, 0, null, null, list); } } @@ -343,7 +343,7 @@ public class GalleryPreviewsScene extends ToolbarScene { private class GalleryPreviewHelper extends ContentLayout.ContentHelper { @Override - protected void getPageData(final int taskId, int type, int page) { + protected void getPageData(final int taskId, int type, int page, String index, boolean isNext) { MainActivity activity = getMainActivity(); if (null == activity || null == mClient || null == mGalleryInfo) { onGetException(taskId, new EhException(getString(R.string.error_cannot_find_gallery))); diff --git a/app/src/main/java/com/hippo/ehviewer/widget/GalleryInfoContentHelper.kt b/app/src/main/java/com/hippo/ehviewer/widget/GalleryInfoContentHelper.kt index 9784ea20f..8a1a610b8 100644 --- a/app/src/main/java/com/hippo/ehviewer/widget/GalleryInfoContentHelper.kt +++ b/app/src/main/java/com/hippo/ehviewer/widget/GalleryInfoContentHelper.kt @@ -27,16 +27,8 @@ import java.time.Instant import java.time.ZoneOffset import java.time.format.DateTimeFormatter import java.util.Locale -import kotlin.math.max -import kotlin.math.min abstract class GalleryInfoContentHelper : ContentHelper() { - @JvmField - var maxGid = -1 - - @JvmField - var minGid = -1 - @JvmField var jumpTo: String? = null private val listener: FavouriteStatusRouter.Listener @@ -65,10 +57,6 @@ abstract class GalleryInfoContentHelper : ContentHelper() { override fun onAddData(data: List) { for (info in data) { info?.let { - if (maxGid == -1) maxGid = info.gid.toInt() - if (minGid == -1) minGid = info.gid.toInt() - maxGid = max(maxGid.toLong(), info.gid).toInt() - minGid = min(minGid.toLong(), info.gid).toInt() map[info.gid] = info } } @@ -86,14 +74,6 @@ abstract class GalleryInfoContentHelper : ContentHelper() { override fun onClearData() { map.clear() - maxGid = -1 - minGid = -1 - } - - override fun beforeRefresh() { - super.beforeRefresh() - maxGid = -1 - minGid = -1 } override fun saveInstanceState(superState: Parcelable): Parcelable { @@ -103,8 +83,6 @@ abstract class GalleryInfoContentHelper : ContentHelper() { val router = EhApplication.favouriteStatusRouter val id = router.saveDataMap(map) bundle.putInt(KEY_DATA_MAP, id) - bundle.putInt(KEY_MIN_GID, minGid) - bundle.putInt(KEY_MAX_GID, maxGid) return bundle } @@ -118,8 +96,6 @@ abstract class GalleryInfoContentHelper : ContentHelper() { this.map = map } } - minGid = bundle.getInt(KEY_MIN_GID) - maxGid = bundle.getInt(KEY_MAX_GID) return super.restoreInstanceState(state) } @@ -127,19 +103,11 @@ abstract class GalleryInfoContentHelper : ContentHelper() { val formatter = DateTimeFormatter .ofPattern("yyyy-MM-dd", Locale.US).withZone(ZoneOffset.UTC) jumpTo = formatter.format(Instant.ofEpochMilli(time)) - doGoToPage(Int.MAX_VALUE / 2) - } - - fun goToPage(page: Int) { - jumpTo = page.toString() - doGoToPage(page) + doRefresh() + jumpTo = null } companion object { private const val KEY_DATA_MAP = "data_map" - private const val KEY_MAX_GID = "max_gid" - private const val KEY_MIN_GID = "min_gid" - const val KEY_UPPER_PAGE = "upper_page" - const val KEY_LOWER_PAGE = "lower_page" } } \ No newline at end of file diff --git a/app/src/main/java/com/hippo/widget/ContentLayout.java b/app/src/main/java/com/hippo/widget/ContentLayout.java index 6b8ffc4a7..a11558804 100644 --- a/app/src/main/java/com/hippo/widget/ContentLayout.java +++ b/app/src/main/java/com/hippo/widget/ContentLayout.java @@ -192,6 +192,8 @@ public class ContentLayout extends FrameLayout { private static final String KEY_START_PAGE = "start_page"; private static final String KEY_END_PAGE = "end_page"; private static final String KEY_PAGES = "pages"; + private static final String KEY_PREV = "prev"; + private static final String KEY_NEXT = "next"; /** * Generate task id */ @@ -227,17 +229,23 @@ public class ContentLayout extends FrameLayout { */ private int mPages; private int mNextPage; + private String mPrev; + private String mNext; private int mCurrentTaskId; private int mCurrentTaskType; private int mCurrentTaskPage; private final SwipeRefreshLayout.OnRefreshListener mOnRefreshListener = new SwipeRefreshLayout.OnRefreshListener() { @Override public void onRefresh() { - if (mStartPage > 0) { + if (mPrev != null) { + mCurrentTaskId = mIdGenerator.nextId(); + mCurrentTaskType = TYPE_PRE_PAGE_KEEP_POS; + getPageData(mCurrentTaskId, mCurrentTaskType, mCurrentTaskPage, mPrev, false); + } else if (mStartPage > 0) { mCurrentTaskId = mIdGenerator.nextId(); mCurrentTaskType = TYPE_PRE_PAGE_KEEP_POS; mCurrentTaskPage = mStartPage - 1; - getPageData(mCurrentTaskId, mCurrentTaskType, mCurrentTaskPage); + getPageData(mCurrentTaskId, mCurrentTaskType, mCurrentTaskPage, null, true); } else { doRefresh(); } @@ -248,28 +256,32 @@ public class ContentLayout extends FrameLayout { private final RecyclerView.OnScrollListener mOnScrollListener = new RecyclerView.OnScrollListener() { @Override public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) { - if (!mRefreshLayout.isRefreshing() && !recyclerView.canScrollVertically(1) && mEndPage < mPages) { + if (!mRefreshLayout.isRefreshing() && !recyclerView.canScrollVertically(1)) { // Get next page mBottomProgress.show(); - if (mEndPage < mPages) { + if (mNext != null) { + mCurrentTaskId = mIdGenerator.nextId(); + mCurrentTaskType = TYPE_NEXT_PAGE_KEEP_POS; + getPageData(mCurrentTaskId, mCurrentTaskType, mCurrentTaskPage, mNext, true); + } else if (mEndPage < mPages) { // Get next page // Fill pages before NextPage with empty list while (mNextPage > mEndPage && mEndPage < mPages) { mCurrentTaskId = mIdGenerator.nextId(); mCurrentTaskType = TYPE_NEXT_PAGE_KEEP_POS; mCurrentTaskPage = mEndPage; - onGetPageData(mCurrentTaskId, mPages, mNextPage, Collections.emptyList()); + onGetPageData(mCurrentTaskId, mPages, mNextPage, null, null, Collections.emptyList()); } mCurrentTaskId = mIdGenerator.nextId(); mCurrentTaskType = TYPE_NEXT_PAGE_KEEP_POS; mCurrentTaskPage = mEndPage; - getPageData(mCurrentTaskId, mCurrentTaskType, mCurrentTaskPage); + getPageData(mCurrentTaskId, mCurrentTaskType, mCurrentTaskPage, null, true); } else if (mEndPage == mPages) { // Refresh last page mCurrentTaskId = mIdGenerator.nextId(); mCurrentTaskType = TYPE_REFRESH_PAGE; mCurrentTaskPage = mEndPage - 1; - getPageData(mCurrentTaskId, mCurrentTaskType, mCurrentTaskPage); + getPageData(mCurrentTaskId, mCurrentTaskType, mCurrentTaskPage, null, true); } else { Log.e(TAG, "Try to footer refresh, but mEndPage = " + mEndPage + ", mPages = " + mPages); mBottomProgress.hide(); @@ -304,12 +316,14 @@ public class ContentLayout extends FrameLayout { } /** - * Call {@link #onGetPageData(int, int, int, List)} when get data + * Call {@link #onGetPageData(int, int, int, String, String, List)} when get data * * @param taskId task id * @param page the page to get + * @param index the index to get + * @param isNext the index is next or prev */ - protected abstract void getPageData(int taskId, int type, int page); + protected abstract void getPageData(int taskId, int type, int page, String index, boolean isNext); protected abstract Context getContext(); @@ -398,7 +412,7 @@ public class ContentLayout extends FrameLayout { protected void onClearData() { } - public void onGetPageData(int taskId, int pages, int nextPage, List data) { + public void onGetPageData(int taskId, int pages, int nextPage, String prev, String next, List data) { if (mCurrentTaskId == taskId) { int dataSize; @@ -408,6 +422,8 @@ public class ContentLayout extends FrameLayout { mEndPage = 1; mPages = pages; mNextPage = nextPage; + mPrev = prev; + mNext = next; mPageDivider.clear(); mPageDivider.add(data.size()); if (data.isEmpty()) { @@ -449,6 +465,7 @@ public class ContentLayout extends FrameLayout { mPageDivider.add(0, dataSize); mStartPage--; mPages = Math.max(mEndPage, pages); + mPrev = prev; // assert mStartPage >= 0 if (data.isEmpty()) { @@ -504,6 +521,7 @@ public class ContentLayout extends FrameLayout { mEndPage++; mNextPage = nextPage; mPages = Math.max(mEndPage, pages); + mNext = next; if (data.isEmpty()) { // OK, that's all if (mData.isEmpty()) { @@ -551,6 +569,8 @@ public class ContentLayout extends FrameLayout { mEndPage = mCurrentTaskPage + 1; mNextPage = nextPage; mPages = pages; + mPrev = prev; + mNext = next; mPageDivider.clear(); mPageDivider.add(data.size()); if (data.isEmpty()) { @@ -684,7 +704,7 @@ public class ContentLayout extends FrameLayout { mCurrentTaskId = mIdGenerator.nextId(); mCurrentTaskType = TYPE_REFRESH; mCurrentTaskPage = 0; - getPageData(mCurrentTaskId, mCurrentTaskType, mCurrentTaskPage); + getPageData(mCurrentTaskId, mCurrentTaskType, mCurrentTaskPage, null, true); } /** @@ -763,7 +783,7 @@ public class ContentLayout extends FrameLayout { mCurrentTaskId = mIdGenerator.nextId(); mCurrentTaskType = TYPE_PRE_PAGE; mCurrentTaskPage = page; - getPageData(mCurrentTaskId, mCurrentTaskType, mCurrentTaskPage); + getPageData(mCurrentTaskId, mCurrentTaskType, mCurrentTaskPage, null, true); } else if (page == mEndPage) { mRefreshLayout.setRefreshing(false); mBottomProgress.hide(); @@ -771,7 +791,7 @@ public class ContentLayout extends FrameLayout { mCurrentTaskId = mIdGenerator.nextId(); mCurrentTaskType = TYPE_NEXT_PAGE; mCurrentTaskPage = page; - getPageData(mCurrentTaskId, mCurrentTaskType, mCurrentTaskPage); + getPageData(mCurrentTaskId, mCurrentTaskType, mCurrentTaskPage, null, true); } else { mRefreshLayout.setRefreshing(false); mBottomProgress.hide(); @@ -779,17 +799,17 @@ public class ContentLayout extends FrameLayout { mCurrentTaskId = mIdGenerator.nextId(); mCurrentTaskType = TYPE_SOMEWHERE; mCurrentTaskPage = page; - getPageData(mCurrentTaskId, mCurrentTaskType, mCurrentTaskPage); + getPageData(mCurrentTaskId, mCurrentTaskType, mCurrentTaskPage, null, true); } } - protected void doGoToPage(int page) { + public void goTo(String index, boolean isNext) { mRefreshLayout.setRefreshing(false); mBottomProgress.hide(); mCurrentTaskId = mIdGenerator.nextId(); mCurrentTaskType = TYPE_SOMEWHERE; - mCurrentTaskPage = page; - getPageData(mCurrentTaskId, mCurrentTaskType, mCurrentTaskPage); + mCurrentTaskPage = 0; + getPageData(mCurrentTaskId, mCurrentTaskType, mCurrentTaskPage, index, isNext); } protected Parcelable saveInstanceState(Parcelable superState) { @@ -813,6 +833,8 @@ public class ContentLayout extends FrameLayout { bundle.putInt(KEY_START_PAGE, mStartPage); bundle.putInt(KEY_END_PAGE, mEndPage); bundle.putInt(KEY_PAGES, mPages); + bundle.putString(KEY_PREV, mPrev); + bundle.putString(KEY_NEXT, mNext); return bundle; } @@ -837,6 +859,8 @@ public class ContentLayout extends FrameLayout { mStartPage = bundle.getInt(KEY_START_PAGE); mEndPage = bundle.getInt(KEY_END_PAGE); mPages = bundle.getInt(KEY_PAGES); + mPrev = bundle.getString(KEY_PREV); + mNext = bundle.getString(KEY_NEXT); notifyDataSetChanged(); @@ -845,6 +869,8 @@ public class ContentLayout extends FrameLayout { mStartPage = 0; mEndPage = 0; mPages = 0; + mPrev = null; + mNext = null; firstRefresh(); }