From 20b15b87946b34274dbd84ed799993db85335ae6 Mon Sep 17 00:00:00 2001 From: NekoInverter <42698724+NekoInverter@users.noreply.github.com> Date: Sun, 1 Nov 2020 12:49:52 +0800 Subject: [PATCH] Support voting gallery tags --- .../com/hippo/ehviewer/client/EhClient.java | 3 + .../com/hippo/ehviewer/client/EhEngine.java | 42 ++++++++++ .../ehviewer/client/parser/VoteTagParser.java | 19 +++++ .../ehviewer/ui/scene/GalleryDetailScene.java | 81 ++++++++++++++++++- app/src/main/res/values-zh-rCN/strings.xml | 5 +- app/src/main/res/values/ids.xml | 2 + app/src/main/res/values/strings.xml | 3 + 7 files changed, 150 insertions(+), 5 deletions(-) create mode 100644 app/src/main/java/com/hippo/ehviewer/client/parser/VoteTagParser.java diff --git a/app/src/main/java/com/hippo/ehviewer/client/EhClient.java b/app/src/main/java/com/hippo/ehviewer/client/EhClient.java index 8b0335f03..cf999a386 100644 --- a/app/src/main/java/com/hippo/ehviewer/client/EhClient.java +++ b/app/src/main/java/com/hippo/ehviewer/client/EhClient.java @@ -54,6 +54,7 @@ public class EhClient { public static final int METHOD_IMAGE_SEARCH = 16; public static final int METHOD_ARCHIVE_LIST = 17; public static final int METHOD_DOWNLOAD_ARCHIVE = 18; + public static final int METHOD_VOTE_TAG = 19; private final ThreadPoolExecutor mRequestThreadPool; private final OkHttpClient mOkHttpClient; @@ -175,6 +176,8 @@ public class EhClient { return EhEngine.getArchiveList(this, mOkHttpClient, (String) params[0], (Long) params[1], (String) params[2]); case METHOD_DOWNLOAD_ARCHIVE: return EhEngine.downloadArchive(this, mOkHttpClient, (Long) params[0], (String) params[1], (String) params[2], (String) params[3]); + case METHOD_VOTE_TAG: + return EhEngine.voteTag(this, mOkHttpClient, (Long) params[0], (String) params[1], (Long) params[2], (String) params[3], (String) params[4], (Integer) params[5]); default: return new IllegalStateException("Can't detect method " + mMethod); } diff --git a/app/src/main/java/com/hippo/ehviewer/client/EhEngine.java b/app/src/main/java/com/hippo/ehviewer/client/EhEngine.java index 0a2eb8fe5..9e1b3ff41 100644 --- a/app/src/main/java/com/hippo/ehviewer/client/EhEngine.java +++ b/app/src/main/java/com/hippo/ehviewer/client/EhEngine.java @@ -48,6 +48,7 @@ import com.hippo.ehviewer.client.parser.RateGalleryParser; import com.hippo.ehviewer.client.parser.SignInParser; import com.hippo.ehviewer.client.parser.TorrentParser; import com.hippo.ehviewer.client.parser.VoteCommentParser; +import com.hippo.ehviewer.client.parser.VoteTagParser; import com.hippo.network.StatusCodeException; import com.hippo.util.ExceptionUtils; import com.hippo.yorozuya.AssertUtils; @@ -852,6 +853,47 @@ public class EhEngine { } } + public static VoteTagParser.Result voteTag(@Nullable EhClient.Task task, OkHttpClient okHttpClient, + long apiUid, String apiKey, long gid, String token, String tags, int vote) throws Throwable { + final JSONObject json = new JSONObject(); + json.put("method", "taggallery"); + json.put("apiuid", apiUid); + json.put("apikey", apiKey); + json.put("gid", gid); + json.put("token", token); + json.put("tags", tags); + json.put("vote", vote); + final RequestBody requestBody = RequestBody.create(MEDIA_TYPE_JSON, json.toString()); + String url = EhUrl.getApiUrl(); + String referer = EhUrl.getReferer(); + String origin = EhUrl.getOrigin(); + Log.d(TAG, url); + Request request = new EhRequestBuilder(url, referer, origin) + .post(requestBody) + .build(); + Call call = okHttpClient.newCall(request); + + // Put call + if (null != task) { + task.setCall(call); + } + + String body = null; + Headers headers = null; + int code = -1; + try { + Response response = call.execute(); + code = response.code(); + headers = response.headers(); + body = response.body().string(); + return VoteTagParser.parse(body); + } catch (Throwable e) { + ExceptionUtils.throwIfFatal(e); + throwException(call, code, headers, body, e); + throw e; + } + } + /** * @param image Must be jpeg */ diff --git a/app/src/main/java/com/hippo/ehviewer/client/parser/VoteTagParser.java b/app/src/main/java/com/hippo/ehviewer/client/parser/VoteTagParser.java new file mode 100644 index 000000000..2fc67b1e2 --- /dev/null +++ b/app/src/main/java/com/hippo/ehviewer/client/parser/VoteTagParser.java @@ -0,0 +1,19 @@ +package com.hippo.ehviewer.client.parser; + +import org.json.JSONException; +import org.json.JSONObject; + +public class VoteTagParser { + + // {"error":"The tag \"neko\" is not allowed. Use character:neko or artist:neko"} + public static VoteTagParser.Result parse(String body) throws JSONException { + VoteTagParser.Result result = new VoteTagParser.Result(); + JSONObject jo = new JSONObject(body); + result.error = jo.getString("error"); + return result; + } + + public static class Result { + public String error; + } +} diff --git a/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryDetailScene.java b/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryDetailScene.java index db78b1feb..b4b18722f 100755 --- a/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryDetailScene.java +++ b/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryDetailScene.java @@ -86,6 +86,7 @@ import com.hippo.ehviewer.client.data.ListUrlBuilder; import com.hippo.ehviewer.client.data.PreviewSet; import com.hippo.ehviewer.client.exception.NoHAtHClientException; import com.hippo.ehviewer.client.parser.RateGalleryParser; +import com.hippo.ehviewer.client.parser.VoteTagParser; import com.hippo.ehviewer.dao.DownloadInfo; import com.hippo.ehviewer.dao.Filter; import com.hippo.ehviewer.ui.CommonOperations; @@ -114,6 +115,7 @@ import com.hippo.yorozuya.IOUtils; import com.hippo.yorozuya.IntIdGenerator; import com.hippo.yorozuya.SimpleHandler; import com.hippo.yorozuya.ViewUtils; +import com.hippo.yorozuya.collect.IntList; import java.io.File; import java.io.FileNotFoundException; @@ -1417,20 +1419,58 @@ public class GalleryDetailScene extends BaseScene implements View.OnClickListene } final String tag2 = temp; + List menu = new ArrayList<>(); + final IntList menuId = new IntList(); + Resources resources = context.getResources(); + + menu.add(resources.getString(R.string.show_definition)); + menuId.add(R.id.show_definition); + menu.add(resources.getString(R.string.add_filter)); + menuId.add(R.id.add_filter); + menu.add(resources.getString(R.string.tag_vote_up)); + menuId.add(R.id.vote_up); + menu.add(resources.getString(R.string.tag_vote_down)); + menuId.add(R.id.vote_down); + new MaterialAlertDialogBuilder(context) .setTitle(tag) - .setItems(R.array.tag_menu_entries, (dialog, which) -> { - switch (which) { - case 0: + .setItems(menu.toArray(new String[0]), (dialog, which) -> { + if (which < 0 || which >= menuId.size()) { + return; + } + int id = menuId.get(which); + switch (id) { + case R.id.vote_up: + voteTag(tag2, 1); + break; + case R.id.vote_down: + voteTag(tag2, -1); + break; + case R.id.show_definition: UrlOpener.openUrl(context, EhUrl.getTagDefinitionUrl(tag2), false); break; - case 1: + case R.id.add_filter: showFilterTagDialog(tag); break; } }).show(); } + private void voteTag(String tag, int vote) { + Context context = getContext2(); + MainActivity activity = getActivity2(); + if (null == context || null == activity) { + return; + } + + EhRequest request = new EhRequest() + .setMethod(EhClient.METHOD_VOTE_TAG) + .setArgs(mGalleryDetail.apiUid, mGalleryDetail.apiKey, mGid, mToken, tag, vote) + .setCallback(new VoteTagListener(context, + activity.getStageId(), getTag(), mGid)); + EhApplication.getEhClient(context).execute(request); + } + @Override public boolean onLongClick(View v) { MainActivity activity = getActivity2(); @@ -1716,6 +1756,39 @@ public class GalleryDetailScene extends BaseScene implements View.OnClickListene } } + private static class VoteTagListener extends EhCallback { + + private final long mGid; + + public VoteTagListener(Context context, int stageId, String sceneTag, long gid) { + super(context, stageId, sceneTag); + mGid = gid; + } + + @Override + public void onSuccess(VoteTagParser.Result result) { + if (!TextUtils.isEmpty(result.error)) { + showTip(result.error, LENGTH_SHORT); + } else { + showTip(R.string.tag_vote_successfully, LENGTH_SHORT); + } + } + + @Override + public void onFailure(Exception e) { + showTip(R.string.vote_failed, LENGTH_LONG); + } + + @Override + public void onCancel() { + } + + @Override + public boolean isInstance(SceneFragment scene) { + return scene instanceof GalleryDetailScene; + } + } + private static class RateGalleryListener extends EhCallback { private final long mGid; diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index c8317482f..51e0c0aac 100755 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -406,7 +406,7 @@ @string/refresh @string/share 保存 - 保存到... + 保存到… 添加书签 菜单 分享图片 @@ -728,4 +728,7 @@ 过去一个月 昨日 排行 + 坏耶 + 好耶 + 投票成功 diff --git a/app/src/main/res/values/ids.xml b/app/src/main/res/values/ids.xml index 797276dc4..f2b80efe2 100644 --- a/app/src/main/res/values/ids.xml +++ b/app/src/main/res/values/ids.xml @@ -26,6 +26,8 @@ + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 36d7d81a6..053fe13f9 100755 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -792,4 +792,7 @@ Past Month Yesterday Toplist + Vote down + Vote up + Vote successfully