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 * @return List of enabled filters
*/ */
@ -138,15 +138,6 @@ public class FilterEngine {
return enabledFilters; 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) { public boolean matches(Filter filter, Post post) {
// Post has not been finish()ed yet, account for invalid values // Post has not been finish()ed yet, account for invalid values
String text = null; String text = null;
@ -179,16 +170,14 @@ public class FilterEngine {
FilterType type = FilterType.forId(filter.type); FilterType type = FilterType.forId(filter.type);
if (type.isRegex) { if (type.isRegex) {
Matcher matcher = null; Matcher matcher = null;
synchronized (filter.compiledMatcherLock) { if (!forceCompile) {
if (!forceCompile) { matcher = filter.compiledMatcher;
matcher = filter.compiledMatcher; }
}
if (matcher == null) { if (matcher == null) {
Pattern compiledPattern = compile(filter.pattern); Pattern compiledPattern = compile(filter.pattern);
matcher = filter.compiledMatcher = compiledPattern.matcher(""); matcher = filter.compiledMatcher = compiledPattern.matcher("");
Logger.d(TAG, "Resulting pattern: " + filter.compiledMatcher); Logger.d(TAG, "Resulting pattern: " + filter.compiledMatcher);
}
} }
if (matcher != null) { if (matcher != null) {

@ -50,11 +50,8 @@ public class Filter {
@DatabaseField(canBeNull = false) @DatabaseField(canBeNull = false)
public int color; 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)}. * 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; public Matcher compiledMatcher;
@ -67,4 +64,17 @@ public class Filter {
action = filter.action; action = filter.action;
color = filter.color; 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.chan.ChanUrls;
import org.floens.chan.core.database.DatabaseManager; import org.floens.chan.core.database.DatabaseManager;
import org.floens.chan.core.manager.FilterEngine; 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.Filter;
import org.floens.chan.core.model.Loadable; import org.floens.chan.core.model.Loadable;
import org.floens.chan.core.model.Post; import org.floens.chan.core.model.Post;
@ -42,6 +43,7 @@ public class ChanReaderRequest extends JsonReaderRequest<ChanReaderRequest.ChanR
private Post op; private Post op;
private FilterEngine filterEngine; private FilterEngine filterEngine;
private DatabaseManager databaseManager; private DatabaseManager databaseManager;
private List<Filter> filters;
private ChanReaderRequest(String url, Listener<ChanReaderResponse> listener, ErrorListener errorListener) { private ChanReaderRequest(String url, Listener<ChanReaderResponse> listener, ErrorListener errorListener) {
super(url, listener, errorListener); super(url, listener, errorListener);
@ -66,6 +68,17 @@ public class ChanReaderRequest extends JsonReaderRequest<ChanReaderRequest.ChanR
request.loadable = loadable.copy(); request.loadable = loadable.copy();
request.cached = new ArrayList<>(cached); 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; return request;
} }
@ -344,28 +357,25 @@ public class ChanReaderRequest extends JsonReaderRequest<ChanReaderRequest.ChanR
} }
private void processPostFilter(Post post) { private void processPostFilter(Post post) {
synchronized (filterEngine.getEnabledFiltersLock()) { int filterSize = filters.size();
List<Filter> filters = filterEngine.getEnabledFilters(); for (int i = 0; i < filterSize; i++) {
int filterSize = filters.size(); Filter filter = filters.get(i);
for (int i = 0; i < filterSize; i++) { if (filterEngine.matches(filter, post)) {
Filter filter = filters.get(i); FilterEngine.FilterAction action = FilterEngine.FilterAction.forId(filter.action);
if (filterEngine.matches(filter, post)) { switch (action) {
FilterEngine.FilterAction action = FilterEngine.FilterAction.forId(filter.action); case COLOR:
switch (action) { post.filterHighlightedColor = filter.color;
case COLOR: break;
post.filterHighlightedColor = filter.color; case HIDE:
break; if (!loadable.isThreadMode()) {
case HIDE: post.filterStub = true;
if (!loadable.isThreadMode()) { }
post.filterStub = true; break;
} case REMOVE:
break; if (!loadable.isThreadMode()) {
case REMOVE: post.filterRemove = true;
if (!loadable.isThreadMode()) { }
post.filterRemove = true; break;
}
break;
}
} }
} }
} }

Loading…
Cancel
Save