Loading app/src/main/java/app/fedilab/android/activities/FilterActivity.java +6 −1 Original line number Diff line number Diff line Loading @@ -120,6 +120,9 @@ public class FilterActivity extends BaseActivity implements FilterAdapter.Delete case "thread": popupAddFilterBinding.contextConversation.setChecked(true); break; case "account": popupAddFilterBinding.contextProfiles.setChecked(true); break; } } popupAddFilterBinding.contextWholeWord.setChecked(filter.whole_word); Loading @@ -137,7 +140,7 @@ public class FilterActivity extends BaseActivity implements FilterAdapter.Delete popupAddFilterBinding.addPhrase.setError(context.getString(R.string.cannot_be_empty)); return; } if (!popupAddFilterBinding.contextConversation.isChecked() && !popupAddFilterBinding.contextHome.isChecked() && !popupAddFilterBinding.contextPublic.isChecked() && !popupAddFilterBinding.contextNotification.isChecked()) { if (!popupAddFilterBinding.contextConversation.isChecked() && !popupAddFilterBinding.contextHome.isChecked() && !popupAddFilterBinding.contextPublic.isChecked() && !popupAddFilterBinding.contextNotification.isChecked() && !popupAddFilterBinding.contextProfiles.isChecked()) { popupAddFilterBinding.contextDescription.setError(context.getString(R.string.cannot_be_empty)); return; } Loading @@ -152,6 +155,8 @@ public class FilterActivity extends BaseActivity implements FilterAdapter.Delete contextFilter.add("notifications"); if (popupAddFilterBinding.contextConversation.isChecked()) contextFilter.add("thread"); if (popupAddFilterBinding.contextProfiles.isChecked()) contextFilter.add("account"); filterSent.context = contextFilter; filterSent.expires_at_sent = expire[0]; filterSent.phrase = popupAddFilterBinding.addPhrase.getText().toString(); Loading app/src/main/java/app/fedilab/android/helper/TimelineHelper.java +62 −48 Original line number Diff line number Diff line Loading @@ -26,6 +26,7 @@ import androidx.lifecycle.ViewModelStoreOwner; import java.io.IOException; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.concurrent.TimeUnit; import java.util.regex.Matcher; Loading Loading @@ -91,20 +92,34 @@ public class TimelineHelper { } //If there are filters: if (BaseMainActivity.mainFilters != null && BaseMainActivity.mainFilters.size() > 0 && statuses != null && statuses.size() > 0) { //Loop through filters for (Filter filter : BaseMainActivity.mainFilters) { if (filter.expires_at != null && filter.expires_at.before(new Date())) { //Expired filter continue; } for (String filterContext : filter.context) { if (filterTimeLineType.getValue().equalsIgnoreCase(filterContext)) { if (filter.whole_word) { if (filterTimeLineType == Timeline.TimeLineEnum.HOME) { if (!filter.context.contains("home")) continue; } else if (filterTimeLineType == Timeline.TimeLineEnum.NOTIFICATION) { if (!filter.context.contains("notification")) continue; } else if (filterTimeLineType == Timeline.TimeLineEnum.CONTEXT) { if (!filter.context.contains("thread")) continue; } else if (filterTimeLineType == Timeline.TimeLineEnum.ACCOUNT_TIMELINE) { if (!filter.context.contains("account")) continue; } else { if (!filter.context.contains("public")) continue; } Pattern p = Pattern.compile("\\b(" + Pattern.quote(filter.phrase) + ")\\b", Pattern.CASE_INSENSITIVE); if (filter.whole_word) { Pattern p = Pattern.compile("(^|\\W)(" + Pattern.quote(filter.phrase) + ")($|\\W)", Pattern.CASE_INSENSITIVE); for (Status status : statuses) { String content; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) content = Html.fromHtml(status.reblog != null ? status.reblog.content : status.content, Html.FROM_HTML_MODE_LEGACY).toString(); else content = Html.fromHtml(status.reblog != null ? status.reblog.content : status.content).toString(); Matcher m = p.matcher(content); if (m.find()) { statusesToRemove.add(status); Loading Loading @@ -146,8 +161,7 @@ public class TimelineHelper { } } } } } } } if (statuses != null) { Loading app/src/main/res/layout/popup_add_filter.xml +14 −0 Original line number Diff line number Diff line Loading @@ -109,6 +109,20 @@ android:text="@string/context_conversation" app:buttonTint="@color/cyanea_accent_dark_reference" /> </androidx.appcompat.widget.LinearLayoutCompat> <androidx.appcompat.widget.LinearLayoutCompat android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <com.google.android.material.checkbox.MaterialCheckBox android:id="@+id/context_profiles" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="@string/profiles" app:buttonTint="@color/cyanea_accent_dark_reference" /> </androidx.appcompat.widget.LinearLayoutCompat> </androidx.appcompat.widget.LinearLayoutCompat> <com.google.android.material.checkbox.MaterialCheckBox Loading app/src/main/res/values/strings.xml +1 −0 Original line number Diff line number Diff line Loading @@ -1984,4 +1984,5 @@ <string name="followed_tags">Followed tags</string> <string name="follow_tag">Follow tag</string> <string name="action_lists_edit">Edit list</string> <string name="profiles">Profiles</string> </resources> Loading
app/src/main/java/app/fedilab/android/activities/FilterActivity.java +6 −1 Original line number Diff line number Diff line Loading @@ -120,6 +120,9 @@ public class FilterActivity extends BaseActivity implements FilterAdapter.Delete case "thread": popupAddFilterBinding.contextConversation.setChecked(true); break; case "account": popupAddFilterBinding.contextProfiles.setChecked(true); break; } } popupAddFilterBinding.contextWholeWord.setChecked(filter.whole_word); Loading @@ -137,7 +140,7 @@ public class FilterActivity extends BaseActivity implements FilterAdapter.Delete popupAddFilterBinding.addPhrase.setError(context.getString(R.string.cannot_be_empty)); return; } if (!popupAddFilterBinding.contextConversation.isChecked() && !popupAddFilterBinding.contextHome.isChecked() && !popupAddFilterBinding.contextPublic.isChecked() && !popupAddFilterBinding.contextNotification.isChecked()) { if (!popupAddFilterBinding.contextConversation.isChecked() && !popupAddFilterBinding.contextHome.isChecked() && !popupAddFilterBinding.contextPublic.isChecked() && !popupAddFilterBinding.contextNotification.isChecked() && !popupAddFilterBinding.contextProfiles.isChecked()) { popupAddFilterBinding.contextDescription.setError(context.getString(R.string.cannot_be_empty)); return; } Loading @@ -152,6 +155,8 @@ public class FilterActivity extends BaseActivity implements FilterAdapter.Delete contextFilter.add("notifications"); if (popupAddFilterBinding.contextConversation.isChecked()) contextFilter.add("thread"); if (popupAddFilterBinding.contextProfiles.isChecked()) contextFilter.add("account"); filterSent.context = contextFilter; filterSent.expires_at_sent = expire[0]; filterSent.phrase = popupAddFilterBinding.addPhrase.getText().toString(); Loading
app/src/main/java/app/fedilab/android/helper/TimelineHelper.java +62 −48 Original line number Diff line number Diff line Loading @@ -26,6 +26,7 @@ import androidx.lifecycle.ViewModelStoreOwner; import java.io.IOException; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.concurrent.TimeUnit; import java.util.regex.Matcher; Loading Loading @@ -91,20 +92,34 @@ public class TimelineHelper { } //If there are filters: if (BaseMainActivity.mainFilters != null && BaseMainActivity.mainFilters.size() > 0 && statuses != null && statuses.size() > 0) { //Loop through filters for (Filter filter : BaseMainActivity.mainFilters) { if (filter.expires_at != null && filter.expires_at.before(new Date())) { //Expired filter continue; } for (String filterContext : filter.context) { if (filterTimeLineType.getValue().equalsIgnoreCase(filterContext)) { if (filter.whole_word) { if (filterTimeLineType == Timeline.TimeLineEnum.HOME) { if (!filter.context.contains("home")) continue; } else if (filterTimeLineType == Timeline.TimeLineEnum.NOTIFICATION) { if (!filter.context.contains("notification")) continue; } else if (filterTimeLineType == Timeline.TimeLineEnum.CONTEXT) { if (!filter.context.contains("thread")) continue; } else if (filterTimeLineType == Timeline.TimeLineEnum.ACCOUNT_TIMELINE) { if (!filter.context.contains("account")) continue; } else { if (!filter.context.contains("public")) continue; } Pattern p = Pattern.compile("\\b(" + Pattern.quote(filter.phrase) + ")\\b", Pattern.CASE_INSENSITIVE); if (filter.whole_word) { Pattern p = Pattern.compile("(^|\\W)(" + Pattern.quote(filter.phrase) + ")($|\\W)", Pattern.CASE_INSENSITIVE); for (Status status : statuses) { String content; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) content = Html.fromHtml(status.reblog != null ? status.reblog.content : status.content, Html.FROM_HTML_MODE_LEGACY).toString(); else content = Html.fromHtml(status.reblog != null ? status.reblog.content : status.content).toString(); Matcher m = p.matcher(content); if (m.find()) { statusesToRemove.add(status); Loading Loading @@ -146,8 +161,7 @@ public class TimelineHelper { } } } } } } } if (statuses != null) { Loading
app/src/main/res/layout/popup_add_filter.xml +14 −0 Original line number Diff line number Diff line Loading @@ -109,6 +109,20 @@ android:text="@string/context_conversation" app:buttonTint="@color/cyanea_accent_dark_reference" /> </androidx.appcompat.widget.LinearLayoutCompat> <androidx.appcompat.widget.LinearLayoutCompat android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <com.google.android.material.checkbox.MaterialCheckBox android:id="@+id/context_profiles" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="@string/profiles" app:buttonTint="@color/cyanea_accent_dark_reference" /> </androidx.appcompat.widget.LinearLayoutCompat> </androidx.appcompat.widget.LinearLayoutCompat> <com.google.android.material.checkbox.MaterialCheckBox Loading
app/src/main/res/values/strings.xml +1 −0 Original line number Diff line number Diff line Loading @@ -1984,4 +1984,5 @@ <string name="followed_tags">Followed tags</string> <string name="follow_tag">Follow tag</string> <string name="action_lists_edit">Edit list</string> <string name="profiles">Profiles</string> </resources>