From 7fdb7b3ee6548c5fd4b85b6c2aac196eefb2a2ea Mon Sep 17 00:00:00 2001 From: 0xd9a <0xd9a@noreply.codeberg.org> Date: Wed, 26 Nov 2025 01:19:54 +0530 Subject: [PATCH] Add options to hide 'sensitive content' and 'media description' indicators (close #925) --- .../mastodon/ui/drawer/StatusAdapter.java | 60 ++++++++++++------- app/src/main/res/values/strings.xml | 6 ++ app/src/main/res/xml/pref_timelines.xml | 14 +++++ 3 files changed, 59 insertions(+), 21 deletions(-) diff --git a/app/src/main/java/app/fedilab/android/mastodon/ui/drawer/StatusAdapter.java b/app/src/main/java/app/fedilab/android/mastodon/ui/drawer/StatusAdapter.java index 0321bd5f..5e821de2 100644 --- a/app/src/main/java/app/fedilab/android/mastodon/ui/drawer/StatusAdapter.java +++ b/app/src/main/java/app/fedilab/android/mastodon/ui/drawer/StatusAdapter.java @@ -260,6 +260,8 @@ public class StatusAdapter extends RecyclerView.Adapter private static boolean autoplaygif; private static int video_cache; private static int timeout; + private static boolean sensitiveIndicator; + private static boolean mediaDescriptionIndicator; private static int iconSize; private static int dp6; @@ -1974,10 +1976,14 @@ public class StatusAdapter extends RecyclerView.Adapter context.startActivity(mediaIntent, options.toBundle()); }); }); - layoutMediaBinding.viewHide.setOnClickListener(v -> { - statusToDeal.sensitive = !statusToDeal.sensitive; - adapter.notifyItemChanged(holder.getBindingAdapterPosition()); - }); + if (sensitiveIndicator) { + layoutMediaBinding.viewHide.setOnClickListener(v -> { + statusToDeal.sensitive = !statusToDeal.sensitive; + adapter.notifyItemChanged(holder.getBindingAdapterPosition()); + }); + } else { + layoutMediaBinding.viewHide.setVisibility(View.GONE); + } ViewCompat.addAccessibilityAction( layoutMediaBinding.mediaVideo, context.getString(statusToDeal.sensitive ? R.string.cd_show_media : R.string.cd_hide_media), @@ -2062,10 +2068,14 @@ public class StatusAdapter extends RecyclerView.Adapter context.startActivity(mediaIntent, options.toBundle()); }); }); - layoutMediaBinding.viewHide.setOnClickListener(v -> { - statusToDeal.sensitive = !statusToDeal.sensitive; - adapter.notifyItemChanged(holder.getBindingAdapterPosition()); - }); + if (sensitiveIndicator) { + layoutMediaBinding.viewHide.setOnClickListener(v -> { + statusToDeal.sensitive = !statusToDeal.sensitive; + adapter.notifyItemChanged(holder.getBindingAdapterPosition()); + }); + } else { + layoutMediaBinding.viewHide.setVisibility(View.GONE); + } ViewCompat.addAccessibilityAction( layoutMediaBinding.mediaVideo, context.getString(statusToDeal.sensitive ? R.string.cd_show_media : R.string.cd_hide_media), @@ -3135,24 +3145,34 @@ public class StatusAdapter extends RecyclerView.Adapter } else { layoutMediaBinding.playMusic.setVisibility(View.GONE); } - if (attachment.description != null && !attachment.description.isEmpty()) { + if (mediaDescriptionIndicator && (attachment.description != null && !attachment.description.isEmpty())) { layoutMediaBinding.viewDescription.setVisibility(View.VISIBLE); } else { layoutMediaBinding.viewDescription.setVisibility(View.GONE); } RequestBuilder requestBuilder = prepareRequestBuilder(context, attachment, mediaW * ratio, mediaH * ratio, focusX, focusY, statusToDeal.sensitive, false); - if (!statusToDeal.sensitive || expand_media) { - layoutMediaBinding.viewHide.setIconResource(R.drawable.ic_baseline_visibility_24); + if (sensitiveIndicator) { + if (!statusToDeal.sensitive || expand_media) { + layoutMediaBinding.viewHide.setIconResource(R.drawable.ic_baseline_visibility_24); + } else { + layoutMediaBinding.viewHide.setIconResource(R.drawable.ic_baseline_visibility_off_24); + } + + if (statusToDeal.sensitive) { + Helper.changeDrawableColor(context, layoutMediaBinding.viewHide, ThemeHelper.getAttColor(context, R.attr.colorError)); + } else { + Helper.changeDrawableColor(context, layoutMediaBinding.viewHide, R.color.white); + } + + layoutMediaBinding.viewHide.setOnClickListener(v -> { + statusToDeal.sensitive = !statusToDeal.sensitive; + adapter.notifyItemChanged(holder.getBindingAdapterPosition()); + }); } else { - layoutMediaBinding.viewHide.setIconResource(R.drawable.ic_baseline_visibility_off_24); + layoutMediaBinding.viewHide.setVisibility(View.GONE); } requestBuilder.load(attachment.preview_url).into(layoutMediaBinding.media); - if (statusToDeal.sensitive) { - Helper.changeDrawableColor(context, layoutMediaBinding.viewHide, ThemeHelper.getAttColor(context, R.attr.colorError)); - } else { - Helper.changeDrawableColor(context, layoutMediaBinding.viewHide, R.color.white); - } layoutMediaBinding.media.setOnClickListener(v -> { if (statusToDeal.sensitive && !expand_media) { @@ -3186,10 +3206,6 @@ public class StatusAdapter extends RecyclerView.Adapter context.startActivity(mediaIntent, options.toBundle()); }); }); - layoutMediaBinding.viewHide.setOnClickListener(v -> { - statusToDeal.sensitive = !statusToDeal.sensitive; - adapter.notifyItemChanged(holder.getBindingAdapterPosition()); - }); ViewCompat.addAccessibilityAction( layoutMediaBinding.media, context.getString(statusToDeal.sensitive ? R.string.cd_show_media : R.string.cd_hide_media), @@ -3452,6 +3468,8 @@ public class StatusAdapter extends RecyclerView.Adapter video_cache = sharedpreferences.getInt(context.getString(R.string.SET_VIDEO_CACHE), Helper.DEFAULT_VIDEO_CACHE_MB); timeout = sharedpreferences.getInt(context.getString(R.string.SET_NSFW_TIMEOUT), 5); video_cache = sharedpreferences.getInt(context.getString(R.string.SET_VIDEO_CACHE), Helper.DEFAULT_VIDEO_CACHE_MB); + sensitiveIndicator = sharedpreferences.getBoolean(context.getString(R.string.SET_SENSITIVE_INDICATOR), true); + mediaDescriptionIndicator = sharedpreferences.getBoolean(context.getString(R.string.SET_MEDIA_DESCRIPTION_INDICATOR), true); iconSize = (int) (Helper.convertDpToPixel(28, context) * scaleIcon); dp6 = (int) Helper.convertDpToPixel(6, context); diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index cd8ff271..e32c61f5 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1327,6 +1327,8 @@ SET_DISPLAY_TRANSLATE SET_TRANSLATE_BUTTON SET_QUOTE_BUTTON + SET_SENSITIVE_INDICATOR + SET_MEDIA_DESCRIPTION_INDICATOR SET_POST_FORMAT SET_COMPOSE_LOCAL_ONLY @@ -2134,6 +2136,10 @@ Icons for extra features If your instance does not accept some extra features, you can hide these icons Quote button + Sensitive indicator + Display an indicator for sensitive media + Media description indicator + Display an indicator for media with a description Display \"Reactions\" buttons Bubble Exclude visibility diff --git a/app/src/main/res/xml/pref_timelines.xml b/app/src/main/res/xml/pref_timelines.xml index d1dd459f..770472c0 100644 --- a/app/src/main/res/xml/pref_timelines.xml +++ b/app/src/main/res/xml/pref_timelines.xml @@ -156,6 +156,20 @@ app:icon="@drawable/ic_baseline_format_quote_24" app:key="@string/SET_QUOTE_BUTTON" app:useSimpleSummaryProvider="true" /> + +