Muted tags

This commit is contained in:
Thomas 2022-11-26 16:46:26 +01:00
parent 7dc57d27a4
commit d96c83a282
6 changed files with 126 additions and 3 deletions

View File

@ -34,7 +34,9 @@ import androidx.localbroadcastmanager.content.LocalBroadcastManager;
import java.util.ArrayList;
import java.util.List;
import app.fedilab.android.BaseMainActivity;
import app.fedilab.android.R;
import app.fedilab.android.client.entities.api.Filter;
import app.fedilab.android.client.entities.api.Status;
import app.fedilab.android.client.entities.app.Pinned;
import app.fedilab.android.client.entities.app.PinnedTimeline;
@ -46,6 +48,7 @@ import app.fedilab.android.exception.DBException;
import app.fedilab.android.helper.Helper;
import app.fedilab.android.helper.ThemeHelper;
import app.fedilab.android.ui.fragment.timeline.FragmentMastodonTimeline;
import app.fedilab.android.viewmodel.mastodon.FiltersVM;
import app.fedilab.android.viewmodel.mastodon.ReorderVM;
import app.fedilab.android.viewmodel.mastodon.TagVM;
import es.dmoral.toasty.Toasty;
@ -58,7 +61,9 @@ public class HashTagActivity extends BaseActivity {
private String tag;
private boolean pinnedTag;
private boolean followedTag;
private boolean mutedTag;
private TagVM tagVM;
private Filter fedilabFilter;
@Override
protected void onCreate(Bundle savedInstanceState) {
@ -75,6 +80,7 @@ public class HashTagActivity extends BaseActivity {
finish();
pinnedTag = false;
followedTag = false;
mutedTag = true;
setSupportActionBar(binding.toolbar);
ActionBar actionBar = getSupportActionBar();
//Remove title
@ -110,6 +116,26 @@ public class HashTagActivity extends BaseActivity {
}
}
});
if (MainActivity.filterFetched && MainActivity.mainFilters != null) {
for (Filter filter : MainActivity.mainFilters) {
if (filter.title.equalsIgnoreCase(Helper.FEDILAB_MUTED_HASHTAGS)) {
fedilabFilter = filter;
String fetch = tag.startsWith("#") ? tag : "#" + tag;
for (Filter.KeywordsAttributes keywordsAttributes : filter.keywords) {
if (fetch.equalsIgnoreCase(keywordsAttributes.keyword)) {
mutedTag = true;
invalidateOptionsMenu();
break;
}
}
mutedTag = false;
invalidateOptionsMenu();
break;
}
}
} else {
mutedTag = true;
}
Bundle bundle = new Bundle();
bundle.putSerializable(Helper.ARG_TIMELINE_TYPE, Timeline.TimeLineEnum.TAG);
@ -194,6 +220,21 @@ public class HashTagActivity extends BaseActivity {
invalidateOptionsMenu();
}
});
} else if (item.getItemId() == R.id.action_mute) {
Filter.FilterParams filterParams = new Filter.FilterParams();
filterParams.id = fedilabFilter.id;
filterParams.keywords = new ArrayList<>();
Filter.KeywordsParams keywordsParams = new Filter.KeywordsParams();
keywordsParams.whole_word = true;
keywordsParams.keyword = tag.startsWith("#") ? tag : "#" + tag;
filterParams.keywords.add(keywordsParams);
filterParams.context = fedilabFilter.context;
FiltersVM filtersVM = new ViewModelProvider(HashTagActivity.this).get(FiltersVM.class);
filtersVM.editFilter(BaseMainActivity.currentInstance, BaseMainActivity.currentToken, filterParams)
.observe(HashTagActivity.this, filter -> {
mutedTag = true;
invalidateOptionsMenu();
});
}
return super.onOptionsItemSelected(item);
@ -205,12 +246,14 @@ public class HashTagActivity extends BaseActivity {
getMenuInflater().inflate(R.menu.menu_hashtag, menu);
MenuItem pin = menu.findItem(R.id.action_add_timeline);
MenuItem follow = menu.findItem(R.id.action_follow_tag);
MenuItem mute = menu.findItem(R.id.action_mute);
if (pinnedTag && pin != null) {
pin.setVisible(false);
}
if (followedTag && follow != null) {
follow.setVisible(false);
}
mute.setVisible(!mutedTag);
return super.onCreateOptionsMenu(menu);
}

View File

@ -240,7 +240,7 @@ public class Helper {
public static final String ARG_ACCOUNT_ID = "ARG_ACCOUNT_ID";
public static final String ARG_ADMIN_DOMAINBLOCK = "ARG_ADMIN_DOMAINBLOCK";
public static final String ARG_ADMIN_DOMAINBLOCK_DELETE = "ARG_ADMIN_DOMAINBLOCK_DELETE";
public static final String FEDILAB_MUTED_HASHTAGS = "Fedilab muted hashtags";
public static final String ARG_REPORT = "ARG_REPORT";
public static final String ARG_ACCOUNT_MENTION = "ARG_ACCOUNT_MENTION";
public static final String ARG_MINIFIED = "ARG_MINIFIED";

View File

@ -46,6 +46,9 @@ import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog;
import androidx.core.content.ContextCompat;
import androidx.lifecycle.LifecycleOwner;
import androidx.lifecycle.ViewModelProvider;
import androidx.lifecycle.ViewModelStoreOwner;
import androidx.preference.PreferenceManager;
import com.bumptech.glide.Glide;
@ -65,17 +68,21 @@ import java.util.regex.Pattern;
import javax.net.ssl.HttpsURLConnection;
import app.fedilab.android.BaseMainActivity;
import app.fedilab.android.R;
import app.fedilab.android.activities.ContextActivity;
import app.fedilab.android.activities.HashTagActivity;
import app.fedilab.android.activities.MainActivity;
import app.fedilab.android.activities.ProfileActivity;
import app.fedilab.android.client.entities.api.Account;
import app.fedilab.android.client.entities.api.Announcement;
import app.fedilab.android.client.entities.api.Attachment;
import app.fedilab.android.client.entities.api.Emoji;
import app.fedilab.android.client.entities.api.Filter;
import app.fedilab.android.client.entities.api.Mention;
import app.fedilab.android.client.entities.api.Status;
import app.fedilab.android.databinding.PopupLinksBinding;
import app.fedilab.android.viewmodel.mastodon.FiltersVM;
import es.dmoral.toasty.Toasty;
public class SpannableHelper {
@ -764,7 +771,47 @@ public class SpannableHelper {
if (matchStart >= 0 && matchEnd <= content.toString().length() && matchEnd >= matchStart) {
URLSpan[] span = content.getSpans(matchStart, matchEnd, URLSpan.class);
content.removeSpan(span);
content.setSpan(new ClickableSpan() {
content.setSpan(new LongClickableSpan() {
@Override
public void onLongClick(View textView) {
textView.setTag(CLICKABLE_SPAN);
if (patternType == Helper.PatternType.TAG && BaseMainActivity.filterFetched && MainActivity.mainFilters != null) {
String tag = word.trim();
if (!tag.startsWith("#")) {
tag = "#" + tag;
}
Filter fedilabFilter = null;
for (Filter filter : MainActivity.mainFilters) {
if (filter.title.equals(Helper.FEDILAB_MUTED_HASHTAGS)) {
fedilabFilter = filter;
break;
}
}
//Filter for Fedilab doesn't exist we have to create it
if (fedilabFilter == null) {
Filter.FilterParams filterParams = new Filter.FilterParams();
filterParams.title = Helper.FEDILAB_MUTED_HASHTAGS;
filterParams.filter_action = "hide";
filterParams.context = new ArrayList<>();
filterParams.context.add("home");
filterParams.context.add("public");
filterParams.context.add("thread");
filterParams.context.add("account");
String finalTag = tag;
FiltersVM filtersVM = new ViewModelProvider((ViewModelStoreOwner) context).get(FiltersVM.class);
filtersVM.addFilter(BaseMainActivity.currentInstance, BaseMainActivity.currentToken, filterParams)
.observe((LifecycleOwner) context, filter -> {
if (filter != null) {
MainActivity.mainFilters.add(filter);
addTagToFilter(context, finalTag, filter);
}
});
} else {
addTagToFilter(context, tag, fedilabFilter);
}
}
}
@Override
public void onClick(@NonNull View textView) {
textView.setTag(CLICKABLE_SPAN);
@ -848,12 +895,39 @@ public class SpannableHelper {
ds.setUnderlineText(false);
ds.setColor(linkColor);
}
}, matchStart, matchEnd, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
}
}
}
}
public static void addTagToFilter(Context context, String tag, Filter filter) {
for (Filter.KeywordsAttributes keywords : filter.keywords) {
if (keywords.keyword.equalsIgnoreCase(tag)) {
return;
}
}
AlertDialog.Builder builder = new AlertDialog.Builder(context, Helper.dialogStyle());
builder.setMessage(context.getString(R.string.mute_tag, tag));
builder
.setPositiveButton(R.string.yes, (dialog, which) -> {
Filter.FilterParams filterParams = new Filter.FilterParams();
filterParams.id = filter.id;
filterParams.keywords = new ArrayList<>();
Filter.KeywordsParams keywordsParams = new Filter.KeywordsParams();
keywordsParams.whole_word = true;
keywordsParams.keyword = tag;
filterParams.keywords.add(keywordsParams);
filterParams.context = filter.context;
FiltersVM filtersVM = new ViewModelProvider((ViewModelStoreOwner) context).get(FiltersVM.class);
filtersVM.editFilter(BaseMainActivity.currentInstance, BaseMainActivity.currentToken, filterParams);
dialog.dismiss();
})
.setNegativeButton(R.string.no, (dialog, which) -> dialog.dismiss())
.show();
}
/**
* Convert HTML content to text. Also, it handles click on link
* This needs to be run asynchronously

View File

@ -2,7 +2,7 @@
android:width="24dp"
android:height="24dp"
android:autoMirrored="true"
android:tint="?attr/colorControlNormal"
android:tint="#FFFFFF"
android:viewportWidth="24"
android:viewportHeight="24">
<path

View File

@ -11,4 +11,9 @@
android:icon="@drawable/ic_baseline_add_24"
android:title="@string/add_instances"
app:showAsAction="ifRoom" />
<item
android:id="@+id/action_mute"
android:icon="@drawable/ic_baseline_volume_mute_24"
android:title="@string/mute_tag"
app:showAsAction="ifRoom" />
</menu>

View File

@ -1956,4 +1956,5 @@
<string name="admin_domainblock_public_comment">Comment about this domain limitation for the general public, if advertising the list of domain limitations is enabled.</string>
<string name="saved_changes">Changes have been saved!</string>
<string name="create_domain_block">Create domain block</string>
<string name="mute_tag">Are you sure to mute the tag %1$s?</string>
</resources>