diff --git a/app/src/main/java/com/hippo/ehviewer/client/data/ListUrlBuilder.java b/app/src/main/java/com/hippo/ehviewer/client/data/ListUrlBuilder.java index 80893dd27..67737aa6d 100644 --- a/app/src/main/java/com/hippo/ehviewer/client/data/ListUrlBuilder.java +++ b/app/src/main/java/com/hippo/ehviewer/client/data/ListUrlBuilder.java @@ -47,6 +47,7 @@ public class ListUrlBuilder implements Cloneable, Parcelable { public static final int MODE_WHATS_HOT = 0x3; public static final int MODE_IMAGE_SEARCH = 0x4; public static final int MODE_SUBSCRIPTION = 0x5; + public static final int MODE_TOPLIST = 0x6; public static final int DEFAULT_ADVANCE = AdvanceSearchTable.SNAME | AdvanceSearchTable.STAGS; public static final int DEFAULT_MIN_RATING = 2; public static final Creator CREATOR = new Creator() { @@ -582,6 +583,18 @@ public class ListUrlBuilder implements Cloneable, Parcelable { return EhUrl.getPopularUrl(); case MODE_IMAGE_SEARCH: return EhUrl.getImageSearchUrl(); + case MODE_TOPLIST: + StringBuilder sb = new StringBuilder(EhUrl.getHost()); + sb.append("toplist.php?tl="); + try { + sb.append(URLEncoder.encode(mKeyword, "UTF-8")); + } catch (UnsupportedEncodingException e) { + // Empty + } + if (mPageIndex != 0) { + sb.append('/').append(mPageIndex); + } + return sb.toString(); } } @@ -606,7 +619,7 @@ public class ListUrlBuilder implements Cloneable, Parcelable { dest.writeByte(mShowExpunged ? (byte) 1 : (byte) 0); } - @IntDef({MODE_NORMAL, MODE_UPLOADER, MODE_TAG, MODE_WHATS_HOT, MODE_IMAGE_SEARCH, MODE_SUBSCRIPTION}) + @IntDef({MODE_NORMAL, MODE_UPLOADER, MODE_TAG, MODE_WHATS_HOT, MODE_IMAGE_SEARCH, MODE_SUBSCRIPTION, MODE_TOPLIST}) @Retention(RetentionPolicy.SOURCE) private @interface Mode { } diff --git a/app/src/main/java/com/hippo/ehviewer/client/parser/GalleryListUrlParser.java b/app/src/main/java/com/hippo/ehviewer/client/parser/GalleryListUrlParser.java index 1198c51e8..efc024344 100644 --- a/app/src/main/java/com/hippo/ehviewer/client/parser/GalleryListUrlParser.java +++ b/app/src/main/java/com/hippo/ehviewer/client/parser/GalleryListUrlParser.java @@ -16,6 +16,7 @@ package com.hippo.ehviewer.client.parser; +import android.net.Uri; import android.text.TextUtils; import com.hippo.ehviewer.client.EhUrl; @@ -34,6 +35,7 @@ public final class GalleryListUrlParser { private static final String PATH_NORMAL = "/"; private static final String PATH_UPLOADER = "/uploader/"; private static final String PATH_TAG = "/tag/"; + private static final String PATH_TOPLIST = "/toplist.php"; public static ListUrlBuilder parse(String urlStr) { URL url; @@ -59,6 +61,8 @@ public final class GalleryListUrlParser { return parseUploader(path); } else if (path.startsWith(PATH_TAG)) { return parseTag(path); + } else if (path.startsWith(PATH_TOPLIST)) { + return parseToplist(urlStr); } else if (path.startsWith("/")) { int category; try { @@ -131,4 +135,25 @@ public final class GalleryListUrlParser { builder.setKeyword(tag); return builder; } + + // TODO get page + private static ListUrlBuilder parseToplist(String path) { + Uri uri = Uri.parse(path); + + if (uri == null || TextUtils.isEmpty(uri.getQueryParameter("tl"))) { + return null; + } + + int tl = Integer.parseInt(uri.getQueryParameter("tl")); + + if (tl > 15 || tl < 11) { + return null; + } + + ListUrlBuilder builder = new ListUrlBuilder(); + builder.setMode(ListUrlBuilder.MODE_TOPLIST); + builder.setKeyword(String.valueOf(tl)); + return builder; + } + } diff --git a/app/src/main/java/com/hippo/ehviewer/ui/MainActivity.java b/app/src/main/java/com/hippo/ehviewer/ui/MainActivity.java index a33ce2925..eb0e1115f 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/MainActivity.java +++ b/app/src/main/java/com/hippo/ehviewer/ui/MainActivity.java @@ -487,6 +487,21 @@ public final class MainActivity extends StageActivity } } + public void recreateDrawerView(SceneFragment scene) { + if (scene instanceof BaseScene && mRightDrawer != null && mDrawerLayout != null) { + BaseScene baseScene = (BaseScene) scene; + mRightDrawer.removeAllViews(); + View drawerView = baseScene.createDrawerView( + baseScene.getLayoutInflater2(), mRightDrawer, null); + if (drawerView != null) { + mRightDrawer.addView(drawerView); + mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED, Gravity.RIGHT); + } else { + mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED, Gravity.RIGHT); + } + } + } + @Override public void onSceneViewDestroyed(SceneFragment scene) { super.onSceneViewDestroyed(scene); @@ -626,6 +641,11 @@ public final class MainActivity extends StageActivity args.putString(GalleryListScene.KEY_ACTION, GalleryListScene.ACTION_WHATS_HOT); startSceneFirstly(new Announcer(GalleryListScene.class) .setArgs(args)); + } else if (id == R.id.nav_toplist) { + Bundle args = new Bundle(); + args.putString(GalleryListScene.KEY_ACTION, GalleryListScene.ACTION_TOP_LIST); + startSceneFirstly(new Announcer(GalleryListScene.class) + .setArgs(args)); } else if (id == R.id.nav_favourite) { startScene(new Announcer(FavoritesScene.class)); } else if (id == R.id.nav_history) { diff --git a/app/src/main/java/com/hippo/ehviewer/ui/scene/BaseScene.java b/app/src/main/java/com/hippo/ehviewer/ui/scene/BaseScene.java index c143cf278..e4428b0be 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/scene/BaseScene.java +++ b/app/src/main/java/com/hippo/ehviewer/ui/scene/BaseScene.java @@ -151,6 +151,10 @@ public abstract class BaseScene extends SceneFragment { } } + public void recreateDrawerView() { + ((MainActivity)requireActivity()).recreateDrawerView(this); + } + public final View createDrawerView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { drawerView = onCreateDrawerView(inflater, container, savedInstanceState); 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 2126d0a3a..1ae511117 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 @@ -126,6 +126,7 @@ public final class GalleryListScene extends BaseScene public final static String ACTION_HOMEPAGE = "action_homepage"; public final static String ACTION_SUBSCRIPTION = "action_subscription"; public final static String ACTION_WHATS_HOT = "action_whats_hot"; + public final static String ACTION_TOP_LIST = "action_top_list"; public final static String ACTION_LIST_URL_BUILDER = "action_list_url_builder"; public final static String KEY_LIST_URL_BUILDER = "list_url_builder"; public final static String KEY_HAS_FIRST_REFRESH = "has_first_refresh"; @@ -218,6 +219,7 @@ public final class GalleryListScene extends BaseScene private DownloadManager.DownloadInfoListener mDownloadInfoListener; private FavouriteStatusRouter mFavouriteStatusRouter; private FavouriteStatusRouter.Listener mFavouriteStatusRouterListener; + private boolean mIsTopList = false; @Nullable private static String getSuitableTitleForUrlBuilder( @@ -243,6 +245,18 @@ public final class GalleryListScene extends BaseScene return resources.getString(R.string.subscription); } else if (ListUrlBuilder.MODE_WHATS_HOT == urlBuilder.getMode()) { return resources.getString(R.string.whats_hot); + } else if (ListUrlBuilder.MODE_TOPLIST == urlBuilder.getMode()) { + switch (urlBuilder.getKeyword()) { + case "11": + return resources.getString(R.string.toplist_alltime); + case "12": + return resources.getString(R.string.toplist_pastyear); + case "13": + return resources.getString(R.string.toplist_pastmonth); + case "15": + return resources.getString(R.string.toplist_yesterday); + } + return null; } else if (!TextUtils.isEmpty(keyword)) { return keyword; } else if (MathUtils.hammingWeight(category) == 1) { @@ -282,6 +296,10 @@ public final class GalleryListScene extends BaseScene } else if (ACTION_WHATS_HOT.equals(action)) { mUrlBuilder.reset(); mUrlBuilder.setMode(ListUrlBuilder.MODE_WHATS_HOT); + } else if (ACTION_TOP_LIST.equals(action)) { + mUrlBuilder.reset(); + mUrlBuilder.setMode(ListUrlBuilder.MODE_TOPLIST); + mUrlBuilder.setKeyword("11"); } else if (ACTION_LIST_URL_BUILDER.equals(action)) { ListUrlBuilder builder = args.getParcelable(KEY_LIST_URL_BUILDER); if (builder != null) { @@ -472,13 +490,19 @@ public final class GalleryListScene extends BaseScene String keyword = builder.getKeyword(); int category = builder.getCategory(); + boolean isTopList = builder.getMode() == ListUrlBuilder.MODE_TOPLIST; + if (isTopList != mIsTopList) { + mIsTopList = isTopList; + recreateDrawerView(); + } + // Update normal search mode mSearchLayout.setNormalSearchMode(builder.getMode() == ListUrlBuilder.MODE_SUBSCRIPTION ? R.id.search_subscription_search : R.id.search_normal_search); // Update search edit text - if (!TextUtils.isEmpty(keyword) && null != mSearchBar) { + if (!TextUtils.isEmpty(keyword) && null != mSearchBar && !mIsTopList) { if (builder.getMode() == ListUrlBuilder.MODE_TAG) { keyword = wrapTagKeyword(keyword); } @@ -505,6 +529,8 @@ public final class GalleryListScene extends BaseScene checkedItemId = R.id.nav_subscription; } else if (ListUrlBuilder.MODE_WHATS_HOT == builder.getMode()) { checkedItemId = R.id.nav_whats_hot; + } else if (ListUrlBuilder.MODE_TOPLIST == builder.getMode()) { + checkedItemId = R.id.nav_toplist; } else { checkedItemId = 0; } @@ -777,8 +803,12 @@ public final class GalleryListScene extends BaseScene dragDropManager.attachRecyclerView(recyclerView); mQuickSearchList = EhDB.getAllQuickSearch(); tip.setText(R.string.quick_search_tip); - toolbar.setTitle(R.string.quick_search); - toolbar.inflateMenu(R.menu.drawer_gallery_list); + if (mIsTopList) { + toolbar.setTitle(R.string.toplist); + } else { + toolbar.setTitle(R.string.quick_search); + } + if (!mIsTopList) toolbar.inflateMenu(R.menu.drawer_gallery_list); toolbar.setOnMenuItemClickListener(item -> { int id = item.getItemId(); if (id == R.id.action_add) { @@ -791,7 +821,7 @@ public final class GalleryListScene extends BaseScene return true; }); - if (0 == mQuickSearchList.size()) { + if (0 == mQuickSearchList.size() && !mIsTopList) { tip.setVisibility(View.VISIBLE); recyclerView.setVisibility(View.GONE); } else { @@ -1526,7 +1556,7 @@ public final class GalleryListScene extends BaseScene @Override public void onBindViewHolder(@NonNull QsDrawerHolder holder, int position) { - if (mQuickSearchList != null) { + if (mQuickSearchList != null && !mIsTopList) { holder.key.setText(mQuickSearchList.get(position).getName()); holder.itemView.setOnClickListener(v -> { if (null == mHelper || null == mUrlBuilder) { @@ -1568,22 +1598,39 @@ public final class GalleryListScene extends BaseScene }); return true; }); + } else { + int[] keywords = {11, 12, 13, 15}; + int[] toplists = {R.string.toplist_alltime, R.string.toplist_pastyear, R.string.toplist_pastmonth, R.string.toplist_yesterday}; + holder.key.setText(getString(toplists[position])); + holder.option.setVisibility(View.GONE); + holder.itemView.setOnClickListener(v -> { + if (null == mHelper || null == mUrlBuilder) { + return; + } + + mUrlBuilder.setKeyword(String.valueOf(keywords[position])); + mUrlBuilder.setPageIndex(0); + onUpdateUrlBuilder(); + mHelper.refresh(); + setState(STATE_NORMAL); + closeDrawer(Gravity.RIGHT); + }); } } @Override public long getItemId(int position) { - return mQuickSearchList != null ? mQuickSearchList.get(position).getId() : 0; + return !mIsTopList ? mQuickSearchList != null ? mQuickSearchList.get(position).getId() : 0 : position; } @Override public int getItemCount() { - return mQuickSearchList != null ? mQuickSearchList.size() : 0; + return !mIsTopList ? mQuickSearchList != null ? mQuickSearchList.size() : 0 : 4; } @Override public boolean onCheckCanStartDrag(@NonNull QsDrawerHolder holder, int position, int x, int y) { - return x > holder.option.getX() && y > holder.option.getY(); + return !mIsTopList && x > holder.option.getX() && y > holder.option.getY(); } @Override @@ -1652,8 +1699,8 @@ public final class GalleryListScene extends BaseScene } private class GalleryDetailUrlSuggestion extends UrlSuggestion { - private long mGid; - private String mToken; + private final long mGid; + private final String mToken; private GalleryDetailUrlSuggestion(long gid, String token) { mGid = gid; @@ -1671,9 +1718,9 @@ public final class GalleryListScene extends BaseScene } private class GalleryPageUrlSuggestion extends UrlSuggestion { - private long mGid; - private String mPToken; - private int mPage; + private final long mGid; + private final String mPToken; + private final int mPage; private GalleryPageUrlSuggestion(long gid, String pToken, int page) { mGid = gid; diff --git a/app/src/main/res/drawable/ic_baseline_format_list_numbered_24.xml b/app/src/main/res/drawable/ic_baseline_format_list_numbered_24.xml new file mode 100644 index 000000000..c089156f5 --- /dev/null +++ b/app/src/main/res/drawable/ic_baseline_format_list_numbered_24.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/menu/nav_drawer_main.xml b/app/src/main/res/menu/nav_drawer_main.xml index 52dd71f29..badd86d53 100644 --- a/app/src/main/res/menu/nav_drawer_main.xml +++ b/app/src/main/res/menu/nav_drawer_main.xml @@ -32,6 +32,11 @@ android:icon="@drawable/v_fire_black_x24" android:title="@string/whats_hot" /> + + 全部开始(倒序) 下载延时 每次下载延时 %s 毫秒 + + 请安装一个浏览器。 + 从始至终 + 过去一年 + 过去一个月 + 昨日 + 排行 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 98fe68d0a..36d7d81a6 100755 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -787,4 +787,9 @@ Start all (reversed) Just install a browser please. + All-Time + Past Year + Past Month + Yesterday + Toplist