Support filter comments

Resolve #516
This commit is contained in:
小白-白 authored and tarsin committed 2022-12-31 16:47:02 +08:00
1 parent b549acc1de
commit f0f79a52b8
8 files changed
+197 -47

No files matched your search

@@ -24,6 +24,8 @@ import com.hippo.ehviewer.dao.Filter;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public final class EhFilter {
@@ -31,36 +33,38 @@ public final class EhFilter {
public static final int MODE_UPLOADER = 1;
public static final int MODE_TAG = 2;
public static final int MODE_TAG_NAMESPACE = 3;
public static final int MODE_COMMENTER = 4;
public static final int MODE_COMMENT = 5;
private static final String TAG = EhFilter.class.getSimpleName();
private static EhFilter sInstance;
private final List<Filter> mTitleFilterList = new ArrayList<>();
private final List<Filter> mUploaderFilterList = new ArrayList<>();
private final List<Filter> mTagFilterList = new ArrayList<>();
private final List<Filter> mTagNamespaceFilterList = new ArrayList<>();
private final List<Filter> mCommenterFilterList = new ArrayList<>();
private final List<Filter> mCommentFilterList = new ArrayList<>();
private EhFilter() {
List<Filter> list = EhDB.getAllFilter();
for (int i = 0, n = list.size(); i < n; i++) {
Filter filter = list.get(i);
switch (filter.mode) {
case MODE_TITLE:
case MODE_TITLE -> {
filter.text = filter.text.toLowerCase();
mTitleFilterList.add(filter);
break;
case MODE_UPLOADER:
mUploaderFilterList.add(filter);
break;
case MODE_TAG:
}
case MODE_TAG -> {
filter.text = filter.text.toLowerCase();
mTagFilterList.add(filter);
break;
case MODE_TAG_NAMESPACE:
}
case MODE_TAG_NAMESPACE -> {
filter.text = filter.text.toLowerCase();
mTagNamespaceFilterList.add(filter);
break;
default:
Log.d(TAG, "Unknown mode: " + filter.mode);
break;
}
case MODE_UPLOADER -> mUploaderFilterList.add(filter);
case MODE_COMMENTER -> mCommenterFilterList.add(filter);
case MODE_COMMENT -> mCommentFilterList.add(filter);
default -> Log.d(TAG, "Unknown mode: " + filter.mode);
}
}
}
@@ -88,30 +92,36 @@ public final class EhFilter {
return mTagNamespaceFilterList;
}
public List<Filter> getCommenterFilterList() {
return mCommenterFilterList;
}
public List<Filter> getCommentFilterList() {
return mCommentFilterList;
}
public synchronized boolean addFilter(Filter filter) {
// enable filter by default before it is added to database
filter.enable = true;
if (!EhDB.addFilter(filter)) return false;
switch (filter.mode) {
case MODE_TITLE:
case MODE_TITLE -> {
filter.text = filter.text.toLowerCase();
mTitleFilterList.add(filter);
break;
case MODE_UPLOADER:
mUploaderFilterList.add(filter);
break;
case MODE_TAG:
}
case MODE_TAG -> {
filter.text = filter.text.toLowerCase();
mTagFilterList.add(filter);
break;
case MODE_TAG_NAMESPACE:
}
case MODE_TAG_NAMESPACE -> {
filter.text = filter.text.toLowerCase();
mTagNamespaceFilterList.add(filter);
break;
default:
Log.d(TAG, "Unknown mode: " + filter.mode);
break;
}
case MODE_UPLOADER -> mUploaderFilterList.add(filter);
case MODE_COMMENTER -> mCommenterFilterList.add(filter);
case MODE_COMMENT -> mCommentFilterList.add(filter);
default -> Log.d(TAG, "Unknown mode: " + filter.mode);
}
return true;
}
@@ -124,21 +134,13 @@ public final class EhFilter {
EhDB.deleteFilter(filter);
switch (filter.mode) {
case MODE_TITLE:
mTitleFilterList.remove(filter);
break;
case MODE_UPLOADER:
mUploaderFilterList.remove(filter);
break;
case MODE_TAG:
mTagFilterList.remove(filter);
break;
case MODE_TAG_NAMESPACE:
mTagNamespaceFilterList.remove(filter);
break;
default:
Log.d(TAG, "Unknown mode: " + filter.mode);
break;
case MODE_TITLE -> mTitleFilterList.remove(filter);
case MODE_TAG -> mTagFilterList.remove(filter);
case MODE_TAG_NAMESPACE -> mTagNamespaceFilterList.remove(filter);
case MODE_UPLOADER -> mUploaderFilterList.remove(filter);
case MODE_COMMENTER -> mCommenterFilterList.remove(filter);
case MODE_COMMENT -> mCommentFilterList.remove(filter);
default -> Log.d(TAG, "Unknown mode: " + filter.mode);
}
}
@@ -272,4 +274,40 @@ public final class EhFilter {
return true;
}
public synchronized boolean filterCommenter(String commenter) {
if (null == commenter) {
return false;
}
List<Filter> filters = mCommenterFilterList;
if (filters.size() > 0) {
for (int i = 0, n = filters.size(); i < n; i++) {
if (filters.get(i).enable && commenter.equals(filters.get(i).text)) {
return false;
}
}
}
return true;
}
public synchronized boolean filterComment(String comment) {
if (null == comment) {
return false;
}
List<Filter> filters = mCommentFilterList;
if (filters.size() > 0) {
for (int i = 0, n = filters.size(); i < n; i++) {
if (filters.get(i).enable) {
Pattern p = Pattern.compile(filters.get(i).text);
Matcher m = p.matcher(comment);
if (m.find()) return false;
}
}
}
return true;
}
}
@@ -20,6 +20,7 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.hippo.ehviewer.EhDB;
import com.hippo.ehviewer.client.EhFilter;
import com.hippo.ehviewer.client.EhUtils;
import com.hippo.ehviewer.client.data.GalleryComment;
import com.hippo.ehviewer.client.data.GalleryCommentList;
@@ -473,6 +474,13 @@ public class GalleryDetailParser {
comment.user = c3.child(0).text();
// comment
comment.comment = JsoupUtils.getElementByClass(element, "c6").html();
// filter comment
if (!comment.uploader) {
EhFilter sEhFilter = EhFilter.getInstance();
if (!sEhFilter.filterCommenter(comment.user) || !sEhFilter.filterComment(comment.comment)) {
return null;
}
}
// last edited
Element c8 = JsoupUtils.getElementByClass(element, "c8");
if (c8 != null) {
@@ -264,10 +264,14 @@ class FilterFragment : BaseFragment() {
private val mUploaderFilterList: List<Filter> = mEhFilter.uploaderFilterList
private val mTagFilterList: List<Filter> = mEhFilter.tagFilterList
private val mTagNamespaceFilterList: List<Filter> = mEhFilter.tagNamespaceFilterList
private val mCommenterFilterList: List<Filter> = mEhFilter.commenterFilterList
private val mCommentFilterList: List<Filter> = mEhFilter.commentFilterList
private var mTitleHeader: Filter? = null
private var mUploaderHeader: Filter? = null
private var mTagHeader: Filter? = null
private var mTagNamespaceHeader: Filter? = null
private var mCommenterHeader: Filter? = null
private var mCommentHeader: Filter? = null
fun size(): Int {
var count = 0
var size = mTitleFilterList.size
@@ -278,6 +282,10 @@ class FilterFragment : BaseFragment() {
count += if (0 == size) 0 else size + 1
size = mTagNamespaceFilterList.size
count += if (0 == size) 0 else size + 1
size = mCommenterFilterList.size;
count += if (0 == size) 0 else size + 1
size = mCommentFilterList.size;
count += if (0 == size) 0 else size + 1
return count
}
@@ -317,6 +325,24 @@ class FilterFragment : BaseFragment() {
}
return mTagNamespaceHeader!!
}
private val commenterHeader: Filter
get() {
if (null == mCommenterHeader) {
mCommenterHeader = Filter()
mCommenterHeader!!.mode = MODE_HEADER
mCommenterHeader!!.text = getString(R.string.filter_commenter)
}
return mCommenterHeader!!
}
private val commentHeader: Filter
get() {
if (null == mCommentHeader) {
mCommentHeader = Filter()
mCommentHeader!!.mode = MODE_HEADER
mCommentHeader!!.text = getString(R.string.filter_comment)
}
return mCommentHeader!!
}
operator fun get(index: Int): Filter {
var index1 = index
@@ -356,6 +382,26 @@ class FilterFragment : BaseFragment() {
return tagNamespaceHeader
} else if (index1 <= size) {
return mTagNamespaceFilterList[index1 - 1]
} else {
size + 1
}
}
size = mCommenterFilterList.size
if (0 != size) {
index1 -= if (index1 == 0) {
return commenterHeader
} else if (index1 <= size) {
return mCommenterFilterList[index1 - 1]
} else {
size + 1
}
}
size = mCommentFilterList.size
if (0 != size) {
if (index1 == 0) {
return commentHeader
} else if (index1 <= size) {
return mCommentFilterList[index1 - 1]
}
}
throw IndexOutOfBoundsException()
@@ -62,6 +62,7 @@ import com.hippo.ehviewer.R;
import com.hippo.ehviewer.UrlOpener;
import com.hippo.ehviewer.WindowInsetsAnimationHelper;
import com.hippo.ehviewer.client.EhClient;
import com.hippo.ehviewer.client.EhFilter;
import com.hippo.ehviewer.client.EhRequest;
import com.hippo.ehviewer.client.EhUrl;
import com.hippo.ehviewer.client.data.GalleryComment;
@@ -69,6 +70,7 @@ import com.hippo.ehviewer.client.data.GalleryCommentList;
import com.hippo.ehviewer.client.data.GalleryDetail;
import com.hippo.ehviewer.client.data.ListUrlBuilder;
import com.hippo.ehviewer.client.parser.VoteCommentParser;
import com.hippo.ehviewer.dao.Filter;
import com.hippo.ehviewer.ui.MainActivity;
import com.hippo.scene.SceneFragment;
import com.hippo.text.URLImageGetter;
@@ -265,6 +267,45 @@ public final class GalleryCommentsScene extends ToolbarScene
onBackPressed();
}
private void showFilterCommenterDialog(String commenter, int position) {
Context context = getContext();
if (context == null || commenter == null) {
return;
}
new BaseDialogBuilder(context)
.setMessage(getString(R.string.filter_the_commenter, commenter))
.setPositiveButton(android.R.string.ok, (dialog, which) -> {
Filter filter = new Filter();
filter.mode = EhFilter.MODE_COMMENTER;
filter.text = commenter;
EhFilter.getInstance().addFilter(filter);
hideComment(position);
showTip(R.string.filter_added, LENGTH_SHORT);
})
.setNegativeButton(android.R.string.cancel, null)
.show();
}
private void hideComment(int position) {
if (mGalleryDetail == null || mGalleryDetail.comments == null || mGalleryDetail.comments.comments == null) {
return;
}
GalleryComment[] oldCommentsList = mGalleryDetail.comments.comments;
GalleryComment[] newCommentsList = new GalleryComment[oldCommentsList.length - 1];
for (int i = 0, j = 0; i < oldCommentsList.length; i++) {
if (i != position) {
newCommentsList[j] = oldCommentsList[i];
j++;
}
}
mGalleryDetail.comments.comments = newCommentsList;
mAdapter.notifyDataSetChanged();
updateView(true);
}
private void voteComment(long id, int vote) {
Context context = getContext();
MainActivity activity = getMainActivity();
@@ -339,6 +380,10 @@ public final class GalleryCommentsScene extends ToolbarScene
menu.add(resources.getString(R.string.copy_comment_text));
menuId.add(R.id.copy);
if (!comment.uploader && !comment.editable) {
menu.add(resources.getString(R.string.block_commenter));
menuId.add(R.id.block_commenter);
}
if (comment.editable) {
menu.add(resources.getString(R.string.edit_comment));
menuId.add(R.id.edit_comment);
@@ -364,6 +409,8 @@ public final class GalleryCommentsScene extends ToolbarScene
int id = menuId.get(which);
if (id == R.id.copy) {
ClipboardUtilKt.addTextToClipboard(requireActivity(), comment.comment, false);
} else if (id == R.id.block_commenter) {
showFilterCommenterDialog(comment.user, position);
} else if (id == R.id.vote_up) {
voteComment(comment.id, 1);
} else if (id == R.id.vote_down) {