diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/ComposeFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/ComposeFragment.java index f1e4876ae..d8744ef9a 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/ComposeFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/ComposeFragment.java @@ -491,6 +491,7 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr case UNLISTED -> R.id.vis_unlisted; case PRIVATE -> R.id.vis_followers; case DIRECT -> R.id.vis_private; + case LOCAL -> R.id.local_only; }).setChecked(true); visibilityPopup.getMenu().findItem(R.id.local_only).setChecked(localOnly); @@ -679,6 +680,7 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr case UNLISTED -> R.drawable.ic_fluent_people_community_20_regular; case PRIVATE -> R.drawable.ic_fluent_people_checkmark_20_regular; case DIRECT -> R.drawable.ic_fluent_mention_20_regular; + case LOCAL -> R.drawable.ic_fluent_eye_20_regular; }); ImageView moreBtn = view.findViewById(R.id.more); moreBtn.setImageDrawable(visibilityIcon); @@ -697,7 +699,14 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr else view.findViewById(R.id.display_item_text).setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, V.dp(16))); replyText.setText(getString(R.string.in_reply_to, replyTo.account.displayName)); - replyText.setContentDescription(getString(R.string.in_reply_to, replyTo.account.displayName) + ". " + getString(R.string.post_visibility) + ": " + UiUtils.getVisibilityText(replyTo)); + int visibilityNameRes = switch (replyTo.visibility) { + case PUBLIC -> R.string.visibility_public; + case UNLISTED -> R.string.sk_visibility_unlisted; + case PRIVATE -> R.string.visibility_followers_only; + case DIRECT -> R.string.visibility_private; + case LOCAL -> R.string.sk_local_only; + }; + replyText.setContentDescription(getString(R.string.in_reply_to, replyTo.account.displayName) + ". " + getString(R.string.post_visibility) + ": " + getString(visibilityNameRes)); replyText.setOnClickListener(v->{ scrollView.smoothScrollTo(0, 0); }); @@ -1041,7 +1050,7 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr } req.status=text; req.localOnly=localOnly; - req.visibility=statusVisibility; + req.visibility=localOnly && instance.pleroma != null ? StatusPrivacy.LOCAL : statusVisibility; req.sensitive=sensitive; req.language=language; req.scheduledAt = scheduledAt; @@ -1901,12 +1910,7 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr // (and we're not replying to ourselves, or not at all) if (prefs.postingDefaultVisibility.isLessVisibleThan(statusVisibility) && (replyTo == null || !asm.isSelf(accountID, replyTo.account))) { - statusVisibility = switch (prefs.postingDefaultVisibility) { - case PUBLIC -> StatusPrivacy.PUBLIC; - case UNLISTED -> StatusPrivacy.UNLISTED; - case PRIVATE -> StatusPrivacy.PRIVATE; - case DIRECT -> StatusPrivacy.DIRECT; - }; + statusVisibility = prefs.postingDefaultVisibility; } } @@ -1925,6 +1929,7 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr case UNLISTED -> R.drawable.ic_fluent_people_community_24_regular; case PRIVATE -> R.drawable.ic_fluent_people_checkmark_24_regular; case DIRECT -> R.drawable.ic_fluent_mention_24_regular; + case LOCAL -> R.drawable.ic_fluent_eye_24_regular; }); } diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/SettingsFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/SettingsFragment.java index f227e3aef..996672126 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/SettingsFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/SettingsFragment.java @@ -278,6 +278,7 @@ public class SettingsFragment extends MastodonToolbarFragment{ items.add(new TextItem(R.string.sk_settings_auth, ()->UiUtils.launchWebBrowser(getActivity(), "https://"+session.domain+"/auth/edit"), R.drawable.ic_fluent_open_24_regular)); items.add(new HeaderItem(instanceName)); + items.add(new TextItem(R.string.log_out, this::confirmLogOut, R.drawable.ic_fluent_sign_out_24_regular)); items.add(new TextItem(R.string.sk_settings_rules, ()->{ Bundle args=new Bundle(); args.putParcelable("instance", Parcels.wrap(instance)); @@ -292,8 +293,10 @@ public class SettingsFragment extends MastodonToolbarFragment{ glitchModeItem.enabled = i.checked; if (i.checked) { GlobalUserPreferences.accountsWithLocalOnlySupport.add(accountID); + if (instance.pleroma == null) GlobalUserPreferences.accountsInGlitchMode.add(accountID); } else { GlobalUserPreferences.accountsWithLocalOnlySupport.remove(accountID); + GlobalUserPreferences.accountsInGlitchMode.remove(accountID); } if (list.findViewHolderForAdapterPosition(items.indexOf(glitchModeItem)) instanceof SwitchViewHolder svh) svh.rebind(); GlobalUserPreferences.save(); @@ -307,6 +310,7 @@ public class SettingsFragment extends MastodonToolbarFragment{ GlobalUserPreferences.save(); })); glitchModeItem.enabled = GlobalUserPreferences.accountsWithLocalOnlySupport.contains(accountID); + items.add(new SmallTextItem(getString(R.string.sk_settings_local_only_explanation))); boolean translationAvailable = instance.v2 != null && instance.v2.configuration.translation != null && instance.v2.configuration.translation.enabled; diff --git a/mastodon/src/main/java/org/joinmastodon/android/model/Instance.java b/mastodon/src/main/java/org/joinmastodon/android/model/Instance.java index 7b546e0ab..3db9d1433 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/model/Instance.java +++ b/mastodon/src/main/java/org/joinmastodon/android/model/Instance.java @@ -84,6 +84,8 @@ public class Instance extends BaseModel{ public V2 v2; + public Pleroma pleroma; + @Override public void postprocess() throws ObjectValidationException{ super.postprocess(); @@ -193,4 +195,9 @@ public class Instance extends BaseModel{ public boolean enabled; } } + + @Parcel + public static class Pleroma extends BaseModel { + // metadata etc + } } diff --git a/mastodon/src/main/java/org/joinmastodon/android/model/Status.java b/mastodon/src/main/java/org/joinmastodon/android/model/Status.java index b84e0ac57..df14a8f34 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/model/Status.java +++ b/mastodon/src/main/java/org/joinmastodon/android/model/Status.java @@ -84,6 +84,7 @@ public class Status extends BaseModel implements DisplayItemsParent{ reblog.postprocess(); spoilerRevealed=GlobalUserPreferences.alwaysExpandContentWarnings || !sensitive; + if (visibility.equals(StatusPrivacy.LOCAL)) localOnly = true; } @Override diff --git a/mastodon/src/main/java/org/joinmastodon/android/model/StatusPrivacy.java b/mastodon/src/main/java/org/joinmastodon/android/model/StatusPrivacy.java index cb8d6a0e5..dcb0c4e1b 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/model/StatusPrivacy.java +++ b/mastodon/src/main/java/org/joinmastodon/android/model/StatusPrivacy.java @@ -10,7 +10,9 @@ public enum StatusPrivacy{ @SerializedName("private") PRIVATE(2), @SerializedName("direct") - DIRECT(3); + DIRECT(3), + @SerializedName("local") + LOCAL(4); // akkoma private int privacy; diff --git a/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/ExtendedFooterStatusDisplayItem.java b/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/ExtendedFooterStatusDisplayItem.java index 40641f36c..b1907960a 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/ExtendedFooterStatusDisplayItem.java +++ b/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/ExtendedFooterStatusDisplayItem.java @@ -99,7 +99,8 @@ public class ExtendedFooterStatusDisplayItem extends StatusDisplayItem{ case PUBLIC -> R.drawable.ic_fluent_earth_20_regular; case UNLISTED -> R.drawable.ic_fluent_people_community_20_regular; case PRIVATE -> R.drawable.ic_fluent_people_checkmark_20_regular; - case DIRECT -> R.drawable.ic_fluent_mention_24_regular; + case DIRECT -> R.drawable.ic_fluent_mention_20_regular; + case LOCAL -> R.drawable.ic_fluent_eye_20_regular; }); visibility.setContentDescription(UiUtils.getVisibilityText(s)); diff --git a/mastodon/src/main/res/drawable/ic_fluent_eye_20_regular.xml b/mastodon/src/main/res/drawable/ic_fluent_eye_20_regular.xml new file mode 100644 index 000000000..b00799b9f --- /dev/null +++ b/mastodon/src/main/res/drawable/ic_fluent_eye_20_regular.xml @@ -0,0 +1,3 @@ + + +