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 3fe069315..52a918c62 100644 --- a/app/src/main/java/com/hippo/ehviewer/client/EhEngine.java +++ b/app/src/main/java/com/hippo/ehviewer/client/EhEngine.java @@ -218,7 +218,7 @@ public class EhEngine { // Filter tag for (int i = 0, n = list.size(); i < n; i++) { GalleryInfo info = list.get(i); - if (!sEhFilter.filterTag(info)) { + if (!sEhFilter.filterTag(info) || !sEhFilter.filterTagNamespace(info)) { list.remove(i); i--; n--; @@ -616,29 +616,9 @@ public class EhEngine { throw e; } - // Filter title - for (int i = 0, n = list.size(); i < n; i++) { - GalleryInfo info = list.get(i); - if (!sEhFilter.filterTitle(info)) { - list.remove(i); - i--; - n--; - } - } - if (list.size() > 0) { // Fill by api fillGalleryListByApi(task, okHttpClient, list); - - // Filter uploader and tag - for (int i = 0, n = list.size(); i < n; i++) { - GalleryInfo info = list.get(i); - if (!sEhFilter.filterUploader(info) || !sEhFilter.filterTag(info)) { - list.remove(i); - i--; - n--; - } - } } return list; diff --git a/app/src/main/java/com/hippo/ehviewer/client/EhFilter.java b/app/src/main/java/com/hippo/ehviewer/client/EhFilter.java index 3b5a73da3..62e19e543 100644 --- a/app/src/main/java/com/hippo/ehviewer/client/EhFilter.java +++ b/app/src/main/java/com/hippo/ehviewer/client/EhFilter.java @@ -32,10 +32,12 @@ public final class EhFilter { public static final int MODE_TITLE = 0; public static final int MODE_UPLOADER = 1; public static final int MODE_TAG = 2; + public static final int MODE_TAG_NAMESPACE = 3; private final List mTitleFilterList = new ArrayList<>(); private final List mUploaderFilterList = new ArrayList<>(); private final List mTagFilterList = new ArrayList<>(); + private final List mTagNamespaceFilterList = new ArrayList<>(); private static EhFilter sInstance; @@ -62,6 +64,10 @@ public final class EhFilter { filter.text = filter.text.toLowerCase(); mTagFilterList.add(filter); break; + case MODE_TAG_NAMESPACE: + filter.text = filter.text.toLowerCase(); + mTagNamespaceFilterList.add(filter); + break; default: Log.d(TAG, "Unknown mode: " + filter.mode); break; @@ -81,6 +87,10 @@ public final class EhFilter { return mTagFilterList; } + public List getTagNamespaceFilterList() { + return mTagNamespaceFilterList; + } + public synchronized void addFilter(Filter filter) { EhDB.addFilter(filter); @@ -93,8 +103,13 @@ public final class EhFilter { mUploaderFilterList.add(filter); break; case MODE_TAG: + filter.text = filter.text.toLowerCase(); mTagFilterList.add(filter); break; + case MODE_TAG_NAMESPACE: + filter.text = filter.text.toLowerCase(); + mTagNamespaceFilterList.add(filter); + break; default: Log.d(TAG, "Unknown mode: " + filter.mode); break; @@ -114,6 +129,9 @@ public final class EhFilter { case MODE_TAG: mTagFilterList.remove(filter); break; + case MODE_TAG_NAMESPACE: + mTagNamespaceFilterList.remove(filter); + break; default: Log.d(TAG, "Unknown mode: " + filter.mode); break; @@ -121,7 +139,7 @@ public final class EhFilter { } public synchronized boolean needCallApi() { - return 0 != mTagFilterList.size(); + return 0 != mTagFilterList.size() || 0 != mTagNamespaceFilterList.size(); } public synchronized boolean filterTitle(GalleryInfo info) { @@ -220,4 +238,39 @@ public final class EhFilter { return true; } + + private boolean matchTagNamespace(String tag, String filter) { + if (null == tag || null == filter) { + return false; + } + + String tagNamespace; + int index = tag.indexOf(':'); + if (index >= 0) { + tagNamespace = tag.substring(0, index); + return tagNamespace.equals(filter); + } else { + return false; + } + } + + public synchronized boolean filterTagNamespace(GalleryInfo info) { + if (null == info) { + return false; + } + + String[] tags = info.simpleTags; + List filters = mTagNamespaceFilterList; + if (null != tags && filters.size() > 0) { + for (String tag: tags) { + for (int i = 0, n = filters.size(); i < n; i++) { + if (matchTagNamespace(tag, filters.get(i).text)) { + return false; + } + } + } + } + + return true; + } } diff --git a/app/src/main/java/com/hippo/ehviewer/ui/FilterActivity.java b/app/src/main/java/com/hippo/ehviewer/ui/FilterActivity.java index b32a9bf2e..458ddfd17 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/FilterActivity.java +++ b/app/src/main/java/com/hippo/ehviewer/ui/FilterActivity.java @@ -331,16 +331,19 @@ public class FilterActivity extends ToolbarActivity { private final List mTitleFilterList; private final List mUploaderFilterList; private final List mTagFilterList; + private final List mTagNamespaceFilterList; private Filter mTitleHeader; private Filter mUploaderHeader; private Filter mTagHeader; + private Filter mTagNamespaceHeader; public FilterList() { mEhFilter = EhFilter.getInstance(); mTitleFilterList = mEhFilter.getTitleFilterList(); mUploaderFilterList = mEhFilter.getUploaderFilterList(); mTagFilterList = mEhFilter.getTagFilterList(); + mTagNamespaceFilterList = mEhFilter.getTagNamespaceFilterList(); } public int size() { @@ -351,6 +354,8 @@ public class FilterActivity extends ToolbarActivity { count += 0 == size ? 0 : size + 1; size = mTagFilterList.size(); count += 0 == size ? 0 : size + 1; + size = mTagNamespaceFilterList.size(); + count += 0 == size ? 0 : size + 1; return count; } @@ -381,6 +386,15 @@ public class FilterActivity extends ToolbarActivity { return mTagHeader; } + private Filter getTagNamespaceHeader() { + if (null == mTagNamespaceHeader) { + mTagNamespaceHeader = new Filter(); + mTagNamespaceHeader.mode = MODE_HEADER; + mTagNamespaceHeader.text = getString(R.string.filter_tag_namespace); + } + return mTagNamespaceHeader; + } + public Filter get(int index) { int size = mTitleFilterList.size(); if (0 != size) { @@ -415,6 +429,17 @@ public class FilterActivity extends ToolbarActivity { } } + size = mTagNamespaceFilterList.size(); + if (0 != size) { + if (index == 0) { + return getTagNamespaceHeader(); + } else if (index <= size) { + return mTagNamespaceFilterList.get(index - 1); + } else { + index -= size + 1; + } + } + throw new IndexOutOfBoundsException(); } diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 2551c0477..ee1833be6 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -69,7 +69,7 @@ 509 无效链接 获取 pToken 错误 - 指定画廊的关键字应该看起来像 \"618395 0439fa3666\" + 指定画廊的关键字应该看起来像 “618395 0439fa3666” 无法创建临时文件 无法保存图片 非法数字 @@ -190,10 +190,10 @@ 移除收藏 添加收藏失败 移除收藏失败 - 屏蔽上传者:%s? - 屏蔽标签:%s? - 已屏蔽上传者 \"%s\" - 已屏蔽标签 \"%s\" + 屏蔽上传者“%s”? + 屏蔽标签“%s”? + 已屏蔽上传者“%s” + 已屏蔽标签“%s” 根本把持不住 @@ -290,9 +290,6 @@ 重命名标签 删除标签 删除“%s”? - 提示 - 添加过滤项 - 过滤项文本 这里是阅读历史 @@ -305,11 +302,15 @@ 标题 上传者 标签 - 删除标题过滤项:%s? - 删除上传者过滤项:%s? - 删除标签过滤项:%s? - 删除过滤项:%s? - 标题过滤项:排除标题含有该关键字的画廊。\n\n上传者过滤项:排除该上传者上传的画廊。\n\n标签过滤项:排除包含该关键字的画廊,这会使获取画廊列表花费更多时间。 + 标签组 + 删除标题过滤项“%s”? + 删除上传者过滤项“%s”? + 删除标签过滤项“%s”? + 删除过滤项“%s”? + 提示 + 添加过滤项 + 过滤项文本 + 标题过滤项:排除标题含有该关键字的画廊。\n\n上传者过滤项:排除该上传者上传的画廊。\n\n标签过滤项:排除包含该标签的画廊,这会使获取画廊列表花费更多时间。\n\n标签组过滤项:排除包含该标签组的画廊,这会使获取画廊列表花费更多时间。 设置图案保护 @@ -350,7 +351,7 @@ 尝试显示日文标题。这会使获取画廊列表花费更多时间 显示默认标题。一般是英文标题 过滤 - 过滤标题,上传者和标签 + 过滤标题,上传者,标签和标签组 阅读 阅读方向 @@ -379,7 +380,7 @@ 无效的下载路径 无法获取下载路径 在 KitKat 中您无法把数据写入外置 SD 卡,除非您做了奇怪的事情 - Lollipop 提供了新的写入外置 SD 卡的 API。如果您想把下载路径设置到外置 SD 卡上,点击 \"文档\" 按钮 + Lollipop 提供了新的写入外置 SD 卡的 API。如果您想把下载路径设置到外置 SD 卡上,点击“文档”按钮 文档 恢复下载项 恢复下载目录里的所有下载项 @@ -472,7 +473,7 @@ 无法获取数据文件夹 找不到任何数据 - 无法读取文件 + 无法读取文件 开源许可 diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml index 756bb09d9..01279f8ee 100644 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -69,7 +69,7 @@ 509 無效鏈接 獲取 pToken 錯誤 - 指定畫廊的關鍵字應該看起來像 \"618395 0439fa3666\" + 指定畫廊的關鍵字應該看起來像 “618395 0439fa3666” 無法創建臨時文件 無法保存圖片 非法數字 @@ -190,10 +190,10 @@ 移除收藏 添加收藏失敗 移除收藏失敗 - 屏蔽上傳者:%s? - 屏蔽標籤:%s? - 已屏蔽上傳者 \"%s\" - 已屏蔽標籤 \"%s\" + 屏蔽上傳者“%s”? + 屏蔽標籤“%s”? + 已屏蔽上傳者“%s” + 已屏蔽標籤“%s” 根本把持不住 @@ -290,9 +290,6 @@ 重命名標籤 刪除標籤 刪除“%s”? - 提示 - 添加過濾項 - 過濾項文本 這裏是閲讀歷史 @@ -305,11 +302,15 @@ 標題 上傳者 標籤 - 刪除標題過濾項:%s? - 刪除上傳者過濾項:%s? - 刪除標籤過濾項:%s? - 刪除過濾項:%s? - 標題過濾項:排除標題含有該關鍵字的畫廊。\n\n上傳者過濾項:排除該上傳者上傳的畫廊。\n\n標籤過濾項:排除包含該關鍵字的畫廊,這會使獲取畫廊列表花費更多時間。 + 標籤組 + 刪除標題過濾項“%s”? + 刪除上傳者過濾項“%s”? + 刪除標籤過濾項“%s”? + 刪除過濾項“%s”? + 提示 + 添加過濾項 + 過濾項文本 + 標題過濾項:排除標題含有該關鍵字的畫廊。\n\n上傳者過濾項:排除該上傳者上傳的畫廊。\n\n標籤過濾項:排除包含該標籤的畫廊,這會使獲取畫廊列表花費更多時間。\n\n標籤組過濾項:排除包含該標籤組的畫廊,這會使獲取畫廊列表花費更多時間。 設置圖案保護 @@ -350,7 +351,7 @@ 嘗試顯示日文標題。這會使獲取畫廊列表花費更多時間 顯示默認標題。一般是英文標題 過濾 - 過濾標題,上傳者和標籤 + 過濾標題,上傳者,標籤和標籤組 閲讀 閲讀方向 @@ -379,7 +380,7 @@ 無效的下載路徑 無法獲取下載路徑 在 KitKat 中您無法把數據寫入外置 SD 卡,除非您做了奇怪的事情 - Lollipop 提供了新的寫入外置 SD 卡的 API。如果您想把下載路徑設置到外置 SD 卡上,點擊 \"文檔\" 按鈕 + Lollipop 提供了新的寫入外置 SD 卡的 API。如果您想把下載路徑設置到外置 SD 卡上,點擊“文檔”按鈕 文檔 恢復下載項 恢復下載目錄裏的所有下載項 @@ -472,7 +473,7 @@ 無法獲取數據文件夾 找不到任何數據 - 無法讀取文件 + 無法讀取文件 開源許可 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 2dff958c7..361ac89dd 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -69,7 +69,7 @@ 509 無效連結 獲取 pToken 錯誤 - 指定畫廊的關鍵字應該看起來像 \"618395 0439fa3666\" + 指定畫廊的關鍵字應該看起來像 “618395 0439fa3666” 無法建立臨時檔案 無法儲存圖片 非法數字 @@ -190,10 +190,10 @@ 移除收藏 新增收藏失敗 移除收藏失敗 - 遮蔽上傳者:%s? - 遮蔽標籤:%s? - 已遮蔽上傳者 \"%s\" - 已遮蔽標籤 \"%s\" + 遮蔽上傳者“%s”? + 遮蔽標籤“%s”? + 已遮蔽上傳者“%s” + 已遮蔽標籤“%s” 根本把持不住 @@ -290,9 +290,6 @@ 重新命名標籤 刪除標籤 刪除“%s”? - 提示 - 新增過濾項 - 過濾項文字 這裡是閱讀歷史 @@ -305,11 +302,15 @@ 標題 上傳者 標籤 - 刪除標題過濾項:%s? - 刪除上傳者過濾項:%s? - 刪除標籤過濾項:%s? - 刪除過濾項:%s? - 標題過濾項:排除標題含有該關鍵字的畫廊。\n\n上傳者過濾項:排除該上傳者上傳的畫廊。\n\n標籤過濾項:排除包含該關鍵字的畫廊,這會使獲取畫廊列表花費更多時間。 + 標籤組 + 刪除標題過濾項“%s”? + 刪除上傳者過濾項“%s”? + 刪除標籤過濾項“%s”? + 刪除過濾項“%s”? + 提示 + 新增過濾項 + 過濾項文字 + 標題過濾項:排除標題含有該關鍵字的畫廊。\n\n上傳者過濾項:排除該上傳者上傳的畫廊。\n\n標籤過濾項:排除包含該標籤的畫廊,這會使獲取畫廊列表花費更多時間。\n\n標籤組過濾項:排除包含該標籤組的畫廊,這會使獲取畫廊列表花費更多時間。 設定圖案保護 @@ -350,7 +351,7 @@ 嘗試顯示日文標題。這會使獲取畫廊列表花費更多時間 顯示預設標題。一般是英文標題 過濾 - 過濾標題,上傳者和標籤 + 過濾標題,上傳者,標籤和標籤組 閱讀 閱讀方向 @@ -379,7 +380,7 @@ 無效的下載路徑 無法獲取下載路徑 在 KitKat 中您無法把資料寫入外接 SD 卡,除非您做了奇怪的事情 - Lollipop 提供了新的寫入外接 SD 卡的 API。如果您想把下載路徑設定到外接 SD 卡上,點選 \"文件\" 按鈕 + Lollipop 提供了新的寫入外接 SD 卡的 API。如果您想把下載路徑設定到外接 SD 卡上,點選“文件”按鈕 文件 恢復下載項 恢復下載目錄裡的所有下載項 @@ -472,7 +473,7 @@ 無法獲取資料資料夾 找不到任何資料 - 無法讀取檔案 + 無法讀取檔案 開源許可 diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml index 95d7a1c49..f6b6edb81 100644 --- a/app/src/main/res/values/arrays.xml +++ b/app/src/main/res/values/arrays.xml @@ -136,6 +136,7 @@ @string/filter_title @string/filter_uploader @string/filter_tag + @string/filter_tag_namespace diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 09f078300..115924d17 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -233,8 +233,8 @@ Removed from favorites Failed to add to favorites Failed to remove from favorites - Block the uploader: %s ? - Block the tag: %s ? + Block the uploader \"%s\"? + Block the tag \"%s\"? The uploader \"%s\" is blocked The tag \"%s\" is blocked @@ -345,14 +345,15 @@ Title Uploader Tag - Delete title filter: %s ? - Delete uploader filter: %s ? - Delete tag filter: %s ? - Delete filter: %s ? + Tag namespace + Delete title filter \"%s\"? + Delete uploader filter \"%s\"? + Delete tag filter \"%s\"? + Delete filter \"%s\"? Tip Add filter Filter text - Title Filter: exclude the gallery whose title contains the word.\n\nUploader Filter: exclude the gallery which was uploaded by the uploader.\n\nTag Filter: exclude the gallery which contain the tag, it takes more time to get gallery list. + Title Filter: exclude the gallery whose title contains the word.\n\nUploader Filter: exclude the gallery which was uploaded by the uploader.\n\nTag Filter: exclude the gallery which contain the tag, it takes more time to get gallery list.\n\nTag Namespace Filter: exclude the gallery which contain the tag namespace, it takes more time to get gallery list. Set pattern protection @@ -392,7 +393,7 @@ Try to show Japanese title. It takes more time to get gallery list Show default title. It is usually English title Filter - Filter by title, uploader and tags + Filter by title, uploader, tag and tag namespace Read Reading direction