From 0d30cd973ede021f3ebf59ca5a97187d164a1e5c Mon Sep 17 00:00:00 2001 From: sk Date: Wed, 25 Jan 2023 12:54:35 +0100 Subject: [PATCH] support akkoma local visibility --- .../android/fragments/ComposeFragment.java | 13 ++++++------- .../android/fragments/SettingsFragment.java | 5 ++++- .../org/joinmastodon/android/model/Instance.java | 7 +++++++ .../java/org/joinmastodon/android/model/Status.java | 1 + .../joinmastodon/android/model/StatusPrivacy.java | 4 +++- .../ExtendedFooterStatusDisplayItem.java | 1 + .../main/res/drawable/ic_fluent_eye_20_regular.xml | 3 +++ 7 files changed, 25 insertions(+), 9 deletions(-) create mode 100644 mastodon/src/main/res/drawable/ic_fluent_eye_20_regular.xml 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 2b642eea9..72e888e8e 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/ComposeFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/ComposeFragment.java @@ -470,6 +470,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); @@ -658,6 +659,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); @@ -681,6 +683,7 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr 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->{ @@ -996,7 +999,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; @@ -1844,12 +1847,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; } } @@ -1868,6 +1866,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 47d2d4be0..d641c61f2 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/SettingsFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/SettingsFragment.java @@ -257,6 +257,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)); @@ -265,13 +266,14 @@ public class SettingsFragment extends MastodonToolbarFragment{ items.add(new TextItem(R.string.sk_settings_about_instance , ()->UiUtils.launchWebBrowser(getActivity(), "https://"+session.domain+"/about"), R.drawable.ic_fluent_info_24_regular)); items.add(new TextItem(R.string.settings_tos, ()->UiUtils.launchWebBrowser(getActivity(), "https://"+session.domain+"/terms"), R.drawable.ic_fluent_open_24_regular)); items.add(new TextItem(R.string.settings_privacy_policy, ()->UiUtils.launchWebBrowser(getActivity(), "https://"+session.domain+"/terms"), R.drawable.ic_fluent_open_24_regular)); - items.add(new TextItem(R.string.log_out, this::confirmLogOut, R.drawable.ic_fluent_sign_out_24_regular)); items.add(new SwitchItem(R.string.sk_settings_support_local_only, 0, GlobalUserPreferences.accountsWithLocalOnlySupport.contains(accountID), i->{ 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(); @@ -285,6 +287,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))); items.add(new HeaderItem(R.string.sk_settings_about)); items.add(new TextItem(R.string.sk_settings_contribute, ()->UiUtils.launchWebBrowser(getActivity(), "https://github.com/sk22/megalodon"), R.drawable.ic_fluent_open_24_regular)); 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 c835c7fcd..5d786b40b 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 2dec70ed8..954989b81 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,6 +99,7 @@ public class ExtendedFooterStatusDisplayItem extends StatusDisplayItem{ 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; }); } 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 @@ + + +