Take enabled boards into account when applying filters

Remove synchronizing by copying the Filters on the main thread.
multisite
Floens 10 years ago
parent 82a64ddb96
commit b7766723c5
  1. 27
      Clover/app/src/main/java/org/floens/chan/core/manager/FilterEngine.java
  2. 16
      Clover/app/src/main/java/org/floens/chan/core/model/Filter.java
  3. 54
      Clover/app/src/main/java/org/floens/chan/core/net/ChanReaderRequest.java

@ -130,7 +130,7 @@ public class FilterEngine {
}
/**
* Get all enabled filters, thread safe if locked on {@link #getEnabledFiltersLock()}.
* Get all enabled filters.
*
* @return List of enabled filters
*/
@ -138,15 +138,6 @@ public class FilterEngine {
return enabledFilters;
}
/**
* Lock for usage of {@link #getEnabledFilters()}
*
* @return Object to call synchronized on
*/
public Object getEnabledFiltersLock() {
return enabledFilters;
}
public boolean matches(Filter filter, Post post) {
// Post has not been finish()ed yet, account for invalid values
String text = null;
@ -179,16 +170,14 @@ public class FilterEngine {
FilterType type = FilterType.forId(filter.type);
if (type.isRegex) {
Matcher matcher = null;
synchronized (filter.compiledMatcherLock) {
if (!forceCompile) {
matcher = filter.compiledMatcher;
}
if (!forceCompile) {
matcher = filter.compiledMatcher;
}
if (matcher == null) {
Pattern compiledPattern = compile(filter.pattern);
matcher = filter.compiledMatcher = compiledPattern.matcher("");
Logger.d(TAG, "Resulting pattern: " + filter.compiledMatcher);
}
if (matcher == null) {
Pattern compiledPattern = compile(filter.pattern);
matcher = filter.compiledMatcher = compiledPattern.matcher("");
Logger.d(TAG, "Resulting pattern: " + filter.compiledMatcher);
}
if (matcher != null) {

@ -50,11 +50,8 @@ public class Filter {
@DatabaseField(canBeNull = false)
public int color;
public final Object compiledMatcherLock = new Object();
/**
* Cached version of {@link #pattern} compiled by {@link org.floens.chan.core.manager.FilterEngine#compile(String)}.
* Thread safe when synchronized on {@link #compiledMatcherLock}
*/
public Matcher compiledMatcher;
@ -67,4 +64,17 @@ public class Filter {
action = filter.action;
color = filter.color;
}
public Filter copy() {
Filter copy = new Filter();
copy.id = id;
copy.enabled = enabled;
copy.type = type;
copy.pattern = pattern;
copy.allBoards = allBoards;
copy.boards = boards;
copy.action = action;
copy.color = color;
return copy;
}
}

@ -26,6 +26,7 @@ import org.floens.chan.Chan;
import org.floens.chan.chan.ChanUrls;
import org.floens.chan.core.database.DatabaseManager;
import org.floens.chan.core.manager.FilterEngine;
import org.floens.chan.core.model.Board;
import org.floens.chan.core.model.Filter;
import org.floens.chan.core.model.Loadable;
import org.floens.chan.core.model.Post;
@ -42,6 +43,7 @@ public class ChanReaderRequest extends JsonReaderRequest<ChanReaderRequest.ChanR
private Post op;
private FilterEngine filterEngine;
private DatabaseManager databaseManager;
private List<Filter> filters;
private ChanReaderRequest(String url, Listener<ChanReaderResponse> listener, ErrorListener errorListener) {
super(url, listener, errorListener);
@ -66,6 +68,17 @@ public class ChanReaderRequest extends JsonReaderRequest<ChanReaderRequest.ChanR
request.loadable = loadable.copy();
request.cached = new ArrayList<>(cached);
request.filters = new ArrayList<>();
for (Filter filter : request.filterEngine.getEnabledFilters()) {
List<Board> boards = request.filterEngine.getBoardsForFilter(filter);
for (Board board : boards) {
if (board.value.equals(loadable.board)) {
request.filters.add(filter.copy());
break;
}
}
}
return request;
}
@ -344,28 +357,25 @@ public class ChanReaderRequest extends JsonReaderRequest<ChanReaderRequest.ChanR
}
private void processPostFilter(Post post) {
synchronized (filterEngine.getEnabledFiltersLock()) {
List<Filter> filters = filterEngine.getEnabledFilters();
int filterSize = filters.size();
for (int i = 0; i < filterSize; i++) {
Filter filter = filters.get(i);
if (filterEngine.matches(filter, post)) {
FilterEngine.FilterAction action = FilterEngine.FilterAction.forId(filter.action);
switch (action) {
case COLOR:
post.filterHighlightedColor = filter.color;
break;
case HIDE:
if (!loadable.isThreadMode()) {
post.filterStub = true;
}
break;
case REMOVE:
if (!loadable.isThreadMode()) {
post.filterRemove = true;
}
break;
}
int filterSize = filters.size();
for (int i = 0; i < filterSize; i++) {
Filter filter = filters.get(i);
if (filterEngine.matches(filter, post)) {
FilterEngine.FilterAction action = FilterEngine.FilterAction.forId(filter.action);
switch (action) {
case COLOR:
post.filterHighlightedColor = filter.color;
break;
case HIDE:
if (!loadable.isThreadMode()) {
post.filterStub = true;
}
break;
case REMOVE:
if (!loadable.isThreadMode()) {
post.filterRemove = true;
}
break;
}
}
}

Loading…
Cancel
Save