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 5d8c769b8..4d3f024a7 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 @@ -30,35 +30,27 @@ 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 LIMIT_PATTERN = Pattern.compile("Currently Used Favorite Slots: ([\\d,]+) / ([\\d,]+)"); - public static class Result { public String[] catArray; // Size 10 public int[] countArray; // Size 10 - public int current; // -1 for error - public int limit; // -1 for error public int pages; public List galleryInfoList; } - @SuppressWarnings("ConstantConditions") 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)); } String[] catArray = new String[10]; int[] countArray = new int[10]; - int current; - int limit; try { Document d = Jsoup.parse(body); Element ido = JsoupUtils.getElementByClass(d, "ido"); + //noinspection ConstantConditions Elements fps = ido.getElementsByClass("fp"); // Last one is "fp fps" AssertUtils.assertEqualsEx(11, fps.size()); @@ -68,15 +60,6 @@ public class FavoritesParser { countArray[i] = ParserUtils.parseInt(fp.child(0).text()); catArray[i] = ParserUtils.trim(fp.child(2).text()); } - - Matcher m = LIMIT_PATTERN.matcher(body); - if (m.find()) { - current = ParserUtils.parseInt(m.group(1)); - limit = ParserUtils.parseInt(m.group(2)); - } else { - current = -1; - limit = -1; - } } catch (Exception e) { e.printStackTrace(); throw new ParseException("Parse favorites error", body); @@ -87,8 +70,6 @@ public class FavoritesParser { Result re = new Result(); re.catArray = catArray; re.countArray = countArray; - re.current = current; - re.limit = limit; re.pages = result.pages; re.galleryInfoList = result.galleryInfoList; 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 13b7f11bd..bd177150f 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 @@ -16,6 +16,7 @@ package com.hippo.ehviewer.ui.scene; +import android.annotation.SuppressLint; import android.app.Activity; import android.content.Context; import android.content.DialogInterface; @@ -28,6 +29,7 @@ import android.support.annotation.Nullable; import android.support.design.widget.FloatingActionButton; import android.support.v4.widget.DrawerLayout; import android.support.v7.app.AlertDialog; +import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.Toolbar; import android.text.Spannable; @@ -44,6 +46,7 @@ import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.ListView; +import android.widget.TextView; import com.github.amlcurran.showcaseview.ShowcaseView; import com.github.amlcurran.showcaseview.SimpleShowcaseEventListener; @@ -52,6 +55,7 @@ import com.hippo.annotation.Implemented; import com.hippo.drawable.DrawerArrowDrawable; import com.hippo.easyrecyclerview.EasyRecyclerView; import com.hippo.easyrecyclerview.FastScroller; +import com.hippo.easyrecyclerview.LinearDividerItemDecoration; import com.hippo.ehviewer.EhApplication; import com.hippo.ehviewer.EhDB; import com.hippo.ehviewer.R; @@ -77,7 +81,9 @@ import com.hippo.widget.FabLayout; import com.hippo.widget.SearchBarMover; import com.hippo.widget.refreshlayout.RefreshLayout; import com.hippo.yorozuya.AssertUtils; +import com.hippo.yorozuya.LayoutUtils; import com.hippo.yorozuya.ObjectUtils; +import com.hippo.yorozuya.ResourcesUtils; import com.hippo.yorozuya.SimpleHandler; import com.hippo.yorozuya.ViewUtils; @@ -85,7 +91,6 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; -// TODO Bug for FavoritesScene and GalleryListScene, if list view of SearchBar expand first, RecyclerView padding top will be wrong // TODO Get favorite, modify favorite, add favorite, what a mess! public class FavoritesScene extends BaseScene implements EasyRecyclerView.OnItemClickListener, EasyRecyclerView.OnItemLongClickListener, @@ -98,8 +103,6 @@ public class FavoritesScene extends BaseScene implements private static final String KEY_SEARCH_MODE = "search_mode"; private static final String KEY_HAS_FIRST_REFRESH = "has_first_refresh"; private static final String KEY_FAV_COUNT_ARRAY = "fav_count_array"; - private static final String KEY_ALL_COUNT = "all_count"; - private static final String KEY_ALL_LIMIT = "all_limit"; @Nullable @ViewLifeCircle @@ -146,8 +149,6 @@ public class FavoritesScene extends BaseScene implements @Nullable private int[] mFavCountArray; - private int mAllCount = -1; - private int mAllLimit = -1; private boolean mHasFirstRefresh; private boolean mSearchMode; @@ -210,8 +211,6 @@ public class FavoritesScene extends BaseScene implements mSearchMode = savedInstanceState.getBoolean(KEY_SEARCH_MODE); mHasFirstRefresh = savedInstanceState.getBoolean(KEY_HAS_FIRST_REFRESH); mFavCountArray = savedInstanceState.getIntArray(KEY_FAV_COUNT_ARRAY); - mAllCount = savedInstanceState.getInt(KEY_ALL_COUNT); - mAllLimit = savedInstanceState.getInt(KEY_ALL_LIMIT); } @Override @@ -228,8 +227,6 @@ public class FavoritesScene extends BaseScene implements outState.putParcelable(KEY_URL_BUILDER, mUrlBuilder); outState.putBoolean(KEY_SEARCH_MODE, mSearchMode); outState.putIntArray(KEY_FAV_COUNT_ARRAY, mFavCountArray); - outState.putInt(KEY_ALL_COUNT, mAllCount); - outState.putInt(KEY_ALL_LIMIT, mAllLimit); } @Override @@ -420,22 +417,85 @@ public class FavoritesScene extends BaseScene implements mOldKeyword = null; } + private class InfoHolder extends RecyclerView.ViewHolder { + + private final TextView key; + private final TextView value; + + public InfoHolder(View itemView) { + super(itemView); + key = (TextView) ViewUtils.$$(itemView, R.id.key); + value = (TextView) ViewUtils.$$(itemView, R.id.value); + } + } + + private class InfoAdapter extends RecyclerView.Adapter { + + private static final int TYPE_HEADER = 0; + private static final int TYPE_DATA = 1; + + private final LayoutInflater mInflater; + + public InfoAdapter(LayoutInflater inflater) { + mInflater = inflater; + } + + @Override + public int getItemViewType(int position) { + return 0 == position ? TYPE_HEADER : TYPE_DATA; + } + + @Override + public InfoHolder onCreateViewHolder(ViewGroup parent, int viewType) { + return new InfoHolder(mInflater.inflate(TYPE_HEADER == viewType ? + R.layout.item_favorite_info_header : R.layout.item_favorite_info_data, parent, false)); + } + + @Override + @SuppressLint("SetTextI18n") + public void onBindViewHolder(InfoHolder holder, int position) { + if (0 == position) { + holder.key.setText(R.string.collections); + holder.value.setText(R.string.count); + holder.itemView.setEnabled(false); + } else { + if (null == mFavCatArray || null == mFavCountArray || + mFavCatArray.length < position || mFavCountArray.length < position) { + return; + } + holder.key.setText(mFavCatArray[position - 1]); + holder.value.setText(Integer.toString(mFavCountArray[position - 1])); + holder.itemView.setEnabled(true); + } + } + + @Override + public int getItemCount() { + return 11; + } + } + + @SuppressLint("InflateParams") private void showFavoritesInfoDialog() { Context context = getContext2(); if (null == context || null == mFavCatArray || null == mFavCountArray) { return; } - StringBuilder sb = new StringBuilder(); - sb.append(mAllCount).append("/").append(mAllLimit).append("\n"); - for (int i = 0, n = 10; i < n; i++) { - sb.append(mFavCatArray[i]).append(": ").append(mFavCountArray[i]).append("\n"); - } - - new AlertDialog.Builder(context) - .setTitle(R.string.favorites_info) - .setMessage(sb.toString()) - .show(); + AlertDialog.Builder builder = new AlertDialog.Builder(context); + context = builder.getContext(); + final LayoutInflater inflater = LayoutInflater.from(context); + EasyRecyclerView rv = (EasyRecyclerView) inflater.inflate(R.layout.dialog_favorite_info, null); + rv.setAdapter(new InfoAdapter(inflater)); + rv.setLayoutManager(new LinearLayoutManager(context)); + LinearDividerItemDecoration decoration = new LinearDividerItemDecoration( + LinearDividerItemDecoration.VERTICAL, context.getResources().getColor(R.color.divider), + LayoutUtils.dp2pix(context, 1)); + decoration.setPadding(ResourcesUtils.getAttrDimensionPixelOffset(context, R.attr.dialogPreferredPadding)); + rv.addItemDecoration(decoration); + rv.setSelector(RippleSalon.generateRippleDrawable(false)); + rv.setClipToPadding(false); + builder.setView(rv).show(); } @Override @@ -823,12 +883,6 @@ public class FavoritesScene extends BaseScene implements } mFavCountArray = result.countArray; - if (result.current != -1) { - mAllCount = result.current; - } - if (result.limit != -1) { - mAllLimit = result.limit; - } updateSearchBar(); mHelper.setPages(taskId, result.pages); diff --git a/app/src/main/res/layout/dialog_favorite_info.xml b/app/src/main/res/layout/dialog_favorite_info.xml new file mode 100644 index 000000000..d841fa7cc --- /dev/null +++ b/app/src/main/res/layout/dialog_favorite_info.xml @@ -0,0 +1,24 @@ + + + + diff --git a/app/src/main/res/layout/item_favorite_info_data.xml b/app/src/main/res/layout/item_favorite_info_data.xml new file mode 100644 index 000000000..54db768c8 --- /dev/null +++ b/app/src/main/res/layout/item_favorite_info_data.xml @@ -0,0 +1,42 @@ + + + + + + + + + + diff --git a/app/src/main/res/layout/item_favorite_info_header.xml b/app/src/main/res/layout/item_favorite_info_header.xml new file mode 100644 index 000000000..76a34584f --- /dev/null +++ b/app/src/main/res/layout/item_favorite_info_header.xml @@ -0,0 +1,42 @@ + + + + + + + + + + diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 44020a1e2..18f19ac9d 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -476,6 +476,7 @@ 让我选择 收藏信息 收藏夹 + 数量 需要登录 diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml index 5bd5a0517..3344c612d 100644 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -476,6 +476,7 @@ 讓我選擇 收藏信息 收藏夾 + 數量 需要登錄 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 118ce8429..612683c39 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -476,6 +476,7 @@ 讓我選擇 收藏資訊 收藏夾 + 數量 需要登入 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 6ae10d39e..e24e8e594 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -523,6 +523,7 @@ Let me select Favorites info Collections + Count Signing in is required diff --git a/yorozuya b/yorozuya index e9d22840d..467ca2a2d 160000 --- a/yorozuya +++ b/yorozuya @@ -1 +1 @@ -Subproject commit e9d22840d0bd36b46fe59383d482aa400f551db4 +Subproject commit 467ca2a2dd0965ee5072e4f3ae1845369dd122ac