From c11ef57f80a1152282c860c3300d3f124ce4d1c3 Mon Sep 17 00:00:00 2001 From: nuclearfog Date: Sat, 18 Mar 2023 22:04:39 +0100 Subject: [PATCH] added status text blur, added spoiler warning --- .../twidda/config/GlobalSettings.java | 23 ++++++++++++ .../twidda/ui/activities/StatusActivity.java | 37 ++++++++++++++++--- .../ui/adapter/holder/StatusHolder.java | 9 +++++ app/src/main/res/drawable/exclamation.xml | 8 ++++ app/src/main/res/layout/page_status.xml | 33 ++++++++++++++++- app/src/main/res/values-de-rDE/strings.xml | 2 + app/src/main/res/values/strings.xml | 2 + 7 files changed, 108 insertions(+), 6 deletions(-) create mode 100644 app/src/main/res/drawable/exclamation.xml diff --git a/app/src/main/java/org/nuclearfog/twidda/config/GlobalSettings.java b/app/src/main/java/org/nuclearfog/twidda/config/GlobalSettings.java index bfeeeec3..3f7a2401 100644 --- a/app/src/main/java/org/nuclearfog/twidda/config/GlobalSettings.java +++ b/app/src/main/java/org/nuclearfog/twidda/config/GlobalSettings.java @@ -98,6 +98,7 @@ public class GlobalSettings { private static final String ENABLE_TWITTER_ALT = "twitter_alt_set"; private static final String FILTER_RESULTS = "filter_results"; private static final String MASTODON_LOCAL_TIMELINE = "mastodon_local_timeline"; + private static final String HIDE_SENSITIVE = "hide_sensitive"; // current login preferences private static final String LOGGED_IN = "login"; @@ -148,6 +149,7 @@ public class GlobalSettings { private boolean enableLike; private boolean twitterAlt; private boolean localOnly; + private boolean hideSensitive; private int background_color; private int font_color; private int highlight_color; @@ -526,6 +528,26 @@ public class GlobalSettings { edit.apply(); } + /** + * @return true to hide sensitivee/spoiler content by default + */ + public boolean hideSensitiveEnabled() { + return hideSensitive; + } + + /** + * enable hiding sensitive/spoiler content by default + * + * @param enable true to hide sensitivee/spoiler content by default + */ + public void hideSensitive(boolean enable) { + hideSensitive = enable; + + Editor edit = settings.edit(); + edit.putBoolean(HIDE_SENSITIVE, enable); + edit.apply(); + } + /** * get selected location information * @@ -996,6 +1018,7 @@ public class GlobalSettings { enableLike = settings.getBoolean(ENABLE_LIKE, false); twitterAlt = settings.getBoolean(ENABLE_TWITTER_ALT, false); localOnly = settings.getBoolean(MASTODON_LOCAL_TIMELINE, false); + hideSensitive = settings.getBoolean(HIDE_SENSITIVE, true); proxyHost = settings.getString(PROXY_ADDR, ""); proxyPort = settings.getString(PROXY_PORT, ""); proxyUser = settings.getString(PROXY_USER, ""); diff --git a/app/src/main/java/org/nuclearfog/twidda/ui/activities/StatusActivity.java b/app/src/main/java/org/nuclearfog/twidda/ui/activities/StatusActivity.java index 7d4f48de..b9ab99a4 100644 --- a/app/src/main/java/org/nuclearfog/twidda/ui/activities/StatusActivity.java +++ b/app/src/main/java/org/nuclearfog/twidda/ui/activities/StatusActivity.java @@ -17,6 +17,7 @@ import android.content.ClipData; import android.content.ClipboardManager; import android.content.Context; import android.content.Intent; +import android.graphics.BlurMaskFilter; import android.net.Uri; import android.os.Bundle; import android.text.Spannable; @@ -198,7 +199,7 @@ public class StatusActivity extends AppCompatActivity implements OnClickListener private NestedScrollView container; private ViewGroup root, body; - private TextView statusApi, createdAt, statusText, screenName, userName, locationName, sensitive_media; + private TextView statusApi, createdAt, statusText, screenName, userName, locationName, sensitive, spoiler, spoilerHint; private Button replyButton, repostButton, likeButton, replyName, locationButton, repostNameButton; private ImageView profileImage; private RecyclerView cardList; @@ -237,8 +238,10 @@ public class StatusActivity extends AppCompatActivity implements OnClickListener statusApi = findViewById(R.id.page_status_api); locationName = findViewById(R.id.page_status_location_name); locationButton = findViewById(R.id.page_status_location_coordinates); - sensitive_media = findViewById(R.id.page_status_sensitive); + sensitive = findViewById(R.id.page_status_sensitive); + spoiler = findViewById(R.id.page_status_spoiler); repostNameButton = findViewById(R.id.page_status_reposter_reference); + spoilerHint = findViewById(R.id.page_status_text_sensitive_hint); cardList = findViewById(R.id.page_status_cards); statusAsync = new StatusAction(this); @@ -252,7 +255,8 @@ public class StatusActivity extends AppCompatActivity implements OnClickListener replyButton.setCompoundDrawablesWithIntrinsicBounds(R.drawable.answer, 0, 0, 0); repostButton.setCompoundDrawablesWithIntrinsicBounds(R.drawable.repost, 0, 0, 0); locationButton.setCompoundDrawablesWithIntrinsicBounds(R.drawable.location, 0, 0, 0); - sensitive_media.setCompoundDrawablesWithIntrinsicBounds(R.drawable.sensitive, 0, 0, 0); + sensitive.setCompoundDrawablesWithIntrinsicBounds(R.drawable.sensitive, 0, 0, 0); + spoiler.setCompoundDrawablesWithIntrinsicBounds(R.drawable.exclamation, 0, 0, 0); replyName.setCompoundDrawablesWithIntrinsicBounds(R.drawable.back, 0, 0, 0); repostNameButton.setCompoundDrawablesWithIntrinsicBounds(R.drawable.repost, 0, 0, 0); statusText.setMovementMethod(LinkAndScrollMovement.getInstance()); @@ -336,6 +340,7 @@ public class StatusActivity extends AppCompatActivity implements OnClickListener likeButton.setOnLongClickListener(this); repostNameButton.setOnLongClickListener(this); locationButton.setOnLongClickListener(this); + statusText.setOnClickListener(this); } @@ -581,6 +586,14 @@ public class StatusActivity extends AppCompatActivity implements OnClickListener intent.putExtra(ProfileActivity.KEY_PROFILE_USER, this.status.getAuthor()); startActivity(intent); } + // unblur text on click + else if (v.getId() == R.id.page_status_text) { + // remove blur if any + if (statusText.getPaint().getMaskFilter() != null) { + statusText.getPaint().setMaskFilter(null); + spoilerHint.setVisibility(View.INVISIBLE); + } + } } } @@ -832,9 +845,23 @@ public class StatusActivity extends AppCompatActivity implements OnClickListener replyName.setVisibility(View.GONE); } if (status.isSensitive()) { - sensitive_media.setVisibility(View.VISIBLE); + sensitive.setVisibility(View.VISIBLE); } else { - sensitive_media.setVisibility(View.GONE); + sensitive.setVisibility(View.GONE); + } + if (status.isSpoiler()) { + spoiler.setVisibility(View.VISIBLE); + if (settings.hideSensitiveEnabled() && statusText.getPaint().getMaskFilter() == null) { + spoilerHint.setVisibility(View.VISIBLE); + statusText.setLayerType(View.LAYER_TYPE_SOFTWARE, null); + float radius = statusText.getTextSize() / 3; + BlurMaskFilter filter = new BlurMaskFilter(radius, BlurMaskFilter.Blur.NORMAL); + statusText.getPaint().setMaskFilter(filter); + } else { + spoilerHint.setVisibility(View.INVISIBLE); + } + } else { + spoiler.setVisibility(View.GONE); } String profileImageUrl = author.getProfileImageThumbnailUrl(); if (settings.imagesEnabled() && !profileImageUrl.isEmpty()) { diff --git a/app/src/main/java/org/nuclearfog/twidda/ui/adapter/holder/StatusHolder.java b/app/src/main/java/org/nuclearfog/twidda/ui/adapter/holder/StatusHolder.java index b1a59cae..a1371975 100644 --- a/app/src/main/java/org/nuclearfog/twidda/ui/adapter/holder/StatusHolder.java +++ b/app/src/main/java/org/nuclearfog/twidda/ui/adapter/holder/StatusHolder.java @@ -4,6 +4,7 @@ import static androidx.recyclerview.widget.RecyclerView.HORIZONTAL; import static androidx.recyclerview.widget.RecyclerView.NO_POSITION; import android.content.res.Resources; +import android.graphics.BlurMaskFilter; import android.graphics.Color; import android.text.Spanned; import android.view.LayoutInflater; @@ -143,6 +144,14 @@ public class StatusHolder extends ViewHolder implements OnClickListener { } else { text.setVisibility(View.GONE); } + if (settings.hideSensitiveEnabled() && status.isSpoiler()) { + text.setLayerType(View.LAYER_TYPE_SOFTWARE, null); + float radius = text.getTextSize() / 3; + BlurMaskFilter filter = new BlurMaskFilter(radius, BlurMaskFilter.Blur.NORMAL); + text.getPaint().setMaskFilter(filter); + } else { + text.getPaint().setMaskFilter(null); + } if (status.isReposted()) { repostIcon.setColorFilter(settings.getRepostIconColor()); } else { diff --git a/app/src/main/res/drawable/exclamation.xml b/app/src/main/res/drawable/exclamation.xml new file mode 100644 index 00000000..741e810d --- /dev/null +++ b/app/src/main/res/drawable/exclamation.xml @@ -0,0 +1,8 @@ + + + diff --git a/app/src/main/res/layout/page_status.xml b/app/src/main/res/layout/page_status.xml index 02d3405c..b7b4bbe8 100644 --- a/app/src/main/res/layout/page_status.xml +++ b/app/src/main/res/layout/page_status.xml @@ -151,6 +151,19 @@ app:layout_constraintTop_toBottomOf="@id/page_status_text_barrier" app:layout_constraintEnd_toEndOf="parent" /> + + + + + app:layout_constraintHorizontal_bias="0.0"/> Falsche Proxykonfiguration! Änderung verwerfen? Link konnte nicht geöffnet werden! Sensible Inhalte + Zum Anzeigen tippen 4 Schritte zum Login öffne Twitter login Seite. Bitte warten In Twitter einloggen @@ -291,4 +292,5 @@ Inhalt als sensibel markieren Inhalt als Spoiler markieren Sichtbarkeit + Spoiler! \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 7dbcb53f..6f24bed3 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -266,6 +266,8 @@ enable proxy enable proxy authentication sensitive content + Spoiler! + Tap to view 4 steps to login 1. 2.