mirror of
https://codeberg.org/tom79/Fedilab.git
synced 2025-01-07 00:20:08 +02:00
Muted tags
This commit is contained in:
parent
7dc57d27a4
commit
d96c83a282
6 changed files with 126 additions and 3 deletions
|
@ -34,7 +34,9 @@ import androidx.localbroadcastmanager.content.LocalBroadcastManager;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
import app.fedilab.android.BaseMainActivity;
|
||||||
import app.fedilab.android.R;
|
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.api.Status;
|
||||||
import app.fedilab.android.client.entities.app.Pinned;
|
import app.fedilab.android.client.entities.app.Pinned;
|
||||||
import app.fedilab.android.client.entities.app.PinnedTimeline;
|
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.Helper;
|
||||||
import app.fedilab.android.helper.ThemeHelper;
|
import app.fedilab.android.helper.ThemeHelper;
|
||||||
import app.fedilab.android.ui.fragment.timeline.FragmentMastodonTimeline;
|
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.ReorderVM;
|
||||||
import app.fedilab.android.viewmodel.mastodon.TagVM;
|
import app.fedilab.android.viewmodel.mastodon.TagVM;
|
||||||
import es.dmoral.toasty.Toasty;
|
import es.dmoral.toasty.Toasty;
|
||||||
|
@ -58,7 +61,9 @@ public class HashTagActivity extends BaseActivity {
|
||||||
private String tag;
|
private String tag;
|
||||||
private boolean pinnedTag;
|
private boolean pinnedTag;
|
||||||
private boolean followedTag;
|
private boolean followedTag;
|
||||||
|
private boolean mutedTag;
|
||||||
private TagVM tagVM;
|
private TagVM tagVM;
|
||||||
|
private Filter fedilabFilter;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onCreate(Bundle savedInstanceState) {
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
|
@ -75,6 +80,7 @@ public class HashTagActivity extends BaseActivity {
|
||||||
finish();
|
finish();
|
||||||
pinnedTag = false;
|
pinnedTag = false;
|
||||||
followedTag = false;
|
followedTag = false;
|
||||||
|
mutedTag = true;
|
||||||
setSupportActionBar(binding.toolbar);
|
setSupportActionBar(binding.toolbar);
|
||||||
ActionBar actionBar = getSupportActionBar();
|
ActionBar actionBar = getSupportActionBar();
|
||||||
//Remove title
|
//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 bundle = new Bundle();
|
||||||
bundle.putSerializable(Helper.ARG_TIMELINE_TYPE, Timeline.TimeLineEnum.TAG);
|
bundle.putSerializable(Helper.ARG_TIMELINE_TYPE, Timeline.TimeLineEnum.TAG);
|
||||||
|
@ -194,6 +220,21 @@ public class HashTagActivity extends BaseActivity {
|
||||||
invalidateOptionsMenu();
|
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);
|
return super.onOptionsItemSelected(item);
|
||||||
|
@ -205,12 +246,14 @@ public class HashTagActivity extends BaseActivity {
|
||||||
getMenuInflater().inflate(R.menu.menu_hashtag, menu);
|
getMenuInflater().inflate(R.menu.menu_hashtag, menu);
|
||||||
MenuItem pin = menu.findItem(R.id.action_add_timeline);
|
MenuItem pin = menu.findItem(R.id.action_add_timeline);
|
||||||
MenuItem follow = menu.findItem(R.id.action_follow_tag);
|
MenuItem follow = menu.findItem(R.id.action_follow_tag);
|
||||||
|
MenuItem mute = menu.findItem(R.id.action_mute);
|
||||||
if (pinnedTag && pin != null) {
|
if (pinnedTag && pin != null) {
|
||||||
pin.setVisible(false);
|
pin.setVisible(false);
|
||||||
}
|
}
|
||||||
if (followedTag && follow != null) {
|
if (followedTag && follow != null) {
|
||||||
follow.setVisible(false);
|
follow.setVisible(false);
|
||||||
}
|
}
|
||||||
|
mute.setVisible(!mutedTag);
|
||||||
return super.onCreateOptionsMenu(menu);
|
return super.onCreateOptionsMenu(menu);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -240,7 +240,7 @@ public class Helper {
|
||||||
public static final String ARG_ACCOUNT_ID = "ARG_ACCOUNT_ID";
|
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 = "ARG_ADMIN_DOMAINBLOCK";
|
||||||
public static final String ARG_ADMIN_DOMAINBLOCK_DELETE = "ARG_ADMIN_DOMAINBLOCK_DELETE";
|
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_REPORT = "ARG_REPORT";
|
||||||
public static final String ARG_ACCOUNT_MENTION = "ARG_ACCOUNT_MENTION";
|
public static final String ARG_ACCOUNT_MENTION = "ARG_ACCOUNT_MENTION";
|
||||||
public static final String ARG_MINIFIED = "ARG_MINIFIED";
|
public static final String ARG_MINIFIED = "ARG_MINIFIED";
|
||||||
|
|
|
@ -46,6 +46,9 @@ import android.widget.Toast;
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.appcompat.app.AlertDialog;
|
import androidx.appcompat.app.AlertDialog;
|
||||||
import androidx.core.content.ContextCompat;
|
import androidx.core.content.ContextCompat;
|
||||||
|
import androidx.lifecycle.LifecycleOwner;
|
||||||
|
import androidx.lifecycle.ViewModelProvider;
|
||||||
|
import androidx.lifecycle.ViewModelStoreOwner;
|
||||||
import androidx.preference.PreferenceManager;
|
import androidx.preference.PreferenceManager;
|
||||||
|
|
||||||
import com.bumptech.glide.Glide;
|
import com.bumptech.glide.Glide;
|
||||||
|
@ -65,17 +68,21 @@ import java.util.regex.Pattern;
|
||||||
|
|
||||||
import javax.net.ssl.HttpsURLConnection;
|
import javax.net.ssl.HttpsURLConnection;
|
||||||
|
|
||||||
|
import app.fedilab.android.BaseMainActivity;
|
||||||
import app.fedilab.android.R;
|
import app.fedilab.android.R;
|
||||||
import app.fedilab.android.activities.ContextActivity;
|
import app.fedilab.android.activities.ContextActivity;
|
||||||
import app.fedilab.android.activities.HashTagActivity;
|
import app.fedilab.android.activities.HashTagActivity;
|
||||||
|
import app.fedilab.android.activities.MainActivity;
|
||||||
import app.fedilab.android.activities.ProfileActivity;
|
import app.fedilab.android.activities.ProfileActivity;
|
||||||
import app.fedilab.android.client.entities.api.Account;
|
import app.fedilab.android.client.entities.api.Account;
|
||||||
import app.fedilab.android.client.entities.api.Announcement;
|
import app.fedilab.android.client.entities.api.Announcement;
|
||||||
import app.fedilab.android.client.entities.api.Attachment;
|
import app.fedilab.android.client.entities.api.Attachment;
|
||||||
import app.fedilab.android.client.entities.api.Emoji;
|
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.Mention;
|
||||||
import app.fedilab.android.client.entities.api.Status;
|
import app.fedilab.android.client.entities.api.Status;
|
||||||
import app.fedilab.android.databinding.PopupLinksBinding;
|
import app.fedilab.android.databinding.PopupLinksBinding;
|
||||||
|
import app.fedilab.android.viewmodel.mastodon.FiltersVM;
|
||||||
import es.dmoral.toasty.Toasty;
|
import es.dmoral.toasty.Toasty;
|
||||||
|
|
||||||
public class SpannableHelper {
|
public class SpannableHelper {
|
||||||
|
@ -764,7 +771,47 @@ public class SpannableHelper {
|
||||||
if (matchStart >= 0 && matchEnd <= content.toString().length() && matchEnd >= matchStart) {
|
if (matchStart >= 0 && matchEnd <= content.toString().length() && matchEnd >= matchStart) {
|
||||||
URLSpan[] span = content.getSpans(matchStart, matchEnd, URLSpan.class);
|
URLSpan[] span = content.getSpans(matchStart, matchEnd, URLSpan.class);
|
||||||
content.removeSpan(span);
|
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
|
@Override
|
||||||
public void onClick(@NonNull View textView) {
|
public void onClick(@NonNull View textView) {
|
||||||
textView.setTag(CLICKABLE_SPAN);
|
textView.setTag(CLICKABLE_SPAN);
|
||||||
|
@ -848,12 +895,39 @@ public class SpannableHelper {
|
||||||
ds.setUnderlineText(false);
|
ds.setUnderlineText(false);
|
||||||
ds.setColor(linkColor);
|
ds.setColor(linkColor);
|
||||||
}
|
}
|
||||||
|
|
||||||
}, matchStart, matchEnd, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
|
}, 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
|
* Convert HTML content to text. Also, it handles click on link
|
||||||
* This needs to be run asynchronously
|
* This needs to be run asynchronously
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
android:width="24dp"
|
android:width="24dp"
|
||||||
android:height="24dp"
|
android:height="24dp"
|
||||||
android:autoMirrored="true"
|
android:autoMirrored="true"
|
||||||
android:tint="?attr/colorControlNormal"
|
android:tint="#FFFFFF"
|
||||||
android:viewportWidth="24"
|
android:viewportWidth="24"
|
||||||
android:viewportHeight="24">
|
android:viewportHeight="24">
|
||||||
<path
|
<path
|
||||||
|
|
|
@ -11,4 +11,9 @@
|
||||||
android:icon="@drawable/ic_baseline_add_24"
|
android:icon="@drawable/ic_baseline_add_24"
|
||||||
android:title="@string/add_instances"
|
android:title="@string/add_instances"
|
||||||
app:showAsAction="ifRoom" />
|
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>
|
</menu>
|
|
@ -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="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="saved_changes">Changes have been saved!</string>
|
||||||
<string name="create_domain_block">Create domain block</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>
|
</resources>
|
Loading…
Reference in a new issue