From d34c73c2103bb8f5a6ede66e78ad408c00d50843 Mon Sep 17 00:00:00 2001 From: sk Date: Thu, 19 Oct 2023 16:49:23 +0200 Subject: [PATCH] add options for locking account and default vis --- .../android/api/session/AccountSession.java | 2 +- .../settings/SettingsMainFragment.java | 8 +- .../settings/SettingsPrivacyFragment.java | 80 ++++++++++++++++--- .../ic_fluent_person_available_24_regular.xml | 3 + mastodon/src/main/res/values/strings_sk.xml | 2 + 5 files changed, 79 insertions(+), 16 deletions(-) create mode 100644 mastodon/src/main/res/drawable/ic_fluent_person_available_24_regular.xml diff --git a/mastodon/src/main/java/org/joinmastodon/android/api/session/AccountSession.java b/mastodon/src/main/java/org/joinmastodon/android/api/session/AccountSession.java index e75b5c6d4..3f9f1fe26 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/api/session/AccountSession.java +++ b/mastodon/src/main/java/org/joinmastodon/android/api/session/AccountSession.java @@ -218,7 +218,7 @@ public class AccountSession{ public void savePreferencesIfPending(){ if(preferencesNeedSaving){ - new UpdateAccountCredentialsPreferences(preferences, null, self.discoverable, self.source.indexable) + new UpdateAccountCredentialsPreferences(preferences, self.locked, self.discoverable, self.source.indexable) .setCallback(new Callback<>(){ @Override public void onSuccess(Account result){ diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/settings/SettingsMainFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/settings/SettingsMainFragment.java index ef6be19a1..d359a7f60 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/settings/SettingsMainFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/settings/SettingsMainFragment.java @@ -50,12 +50,13 @@ public class SettingsMainFragment extends BaseSettingsFragment{ @Override public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); - account = AccountSessionManager.get(accountID); + account=AccountSessionManager.get(accountID); setTitle(R.string.settings); setSubtitle(account.getFullUsername()); onDataLoaded(List.of( new ListItem<>(R.string.settings_behavior, 0, R.drawable.ic_fluent_settings_24_regular, this::onBehaviorClick), new ListItem<>(R.string.settings_display, 0, R.drawable.ic_fluent_color_24_regular, this::onDisplayClick), + new ListItem<>(R.string.settings_privacy, 0, R.drawable.ic_fluent_shield_24_regular, this::onPrivacyClick), new ListItem<>(R.string.settings_notifications, 0, R.drawable.ic_fluent_alert_24_regular, this::onNotificationsClick), new ListItem<>(R.string.sk_settings_instance, 0, R.drawable.ic_fluent_server_24_regular, this::onInstanceClick), new ListItem<>(getString(R.string.about_app, getString(R.string.sk_app_name)), null, R.drawable.ic_fluent_info_24_regular, this::onAboutClick, null, 0, true), @@ -63,9 +64,8 @@ public class SettingsMainFragment extends BaseSettingsFragment{ new ListItem<>(R.string.log_out, 0, R.drawable.ic_fluent_sign_out_24_regular, this::onLogOutClick, R.attr.colorM3Error, false) )); - Instance instance = AccountSessionManager.getInstance().getInstanceInfo(account.domain); - if (!instance.isAkkoma()){ - data.add(2, new ListItem<>(R.string.settings_privacy, 0, R.drawable.ic_fluent_shield_24_regular, this::onPrivacyClick)); + Instance instance=AccountSessionManager.getInstance().getInstanceInfo(account.domain); + if(!instance.isAkkoma()){ data.add(3, new ListItem<>(R.string.settings_filters, 0, R.drawable.ic_fluent_filter_24_regular, this::onFiltersClick)); } diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/settings/SettingsPrivacyFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/settings/SettingsPrivacyFragment.java index a1df2984f..6f8e76830 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/settings/SettingsPrivacyFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/settings/SettingsPrivacyFragment.java @@ -2,40 +2,98 @@ package org.joinmastodon.android.fragments.settings; import android.os.Bundle; +import androidx.annotation.StringRes; + import org.joinmastodon.android.R; +import org.joinmastodon.android.api.session.AccountSession; import org.joinmastodon.android.api.session.AccountSessionManager; import org.joinmastodon.android.model.Account; +import org.joinmastodon.android.model.Instance; +import org.joinmastodon.android.model.StatusPrivacy; import org.joinmastodon.android.model.viewmodel.CheckableListItem; +import org.joinmastodon.android.model.viewmodel.ListItem; +import org.joinmastodon.android.ui.M3AlertDialogBuilder; +import java.util.ArrayList; import java.util.List; public class SettingsPrivacyFragment extends BaseSettingsFragment{ - private CheckableListItem discoverableItem, indexableItem; + private CheckableListItem discoverableItem, indexableItem, lockedItem; + private ListItem privacyItem; + private StatusPrivacy privacy=null; + private Instance instance; @Override public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setTitle(R.string.settings_privacy); - Account self=AccountSessionManager.get(accountID).self; + AccountSession session=AccountSessionManager.get(accountID); + Account self=session.self; + instance=AccountSessionManager.getInstance().getInstanceInfo(session.domain); + privacy=self.source.privacy; onDataLoaded(List.of( - discoverableItem=new CheckableListItem<>(R.string.settings_discoverable, 0, CheckableListItem.Style.SWITCH, self.discoverable, R.drawable.ic_fluent_thumb_like_dislike_24_regular, i->toggleCheckableItem(discoverableItem)), - indexableItem=new CheckableListItem<>(R.string.settings_indexable, 0, CheckableListItem.Style.SWITCH, self.source.indexable!=null ? self.source.indexable : true, R.drawable.ic_fluent_search_24_regular, i->toggleCheckableItem(indexableItem)) + privacyItem=new ListItem<>(R.string.sk_settings_default_visibility, getPrivacyString(privacy), R.drawable.ic_fluent_eye_24_regular, this::onPrivacyClick, 0, true), + lockedItem=new CheckableListItem<>(R.string.sk_settings_lock_account, 0, CheckableListItem.Style.SWITCH, self.locked, R.drawable.ic_fluent_person_available_24_regular, i->toggleCheckableItem(lockedItem)) )); - if(self.source.indexable==null) - indexableItem.isEnabled=false; + + if(!instance.isAkkoma()){ + data.addAll(List.of( + discoverableItem=new CheckableListItem<>(R.string.settings_discoverable, 0, CheckableListItem.Style.SWITCH, self.discoverable, R.drawable.ic_fluent_thumb_like_dislike_24_regular, i->toggleCheckableItem(discoverableItem)), + indexableItem=new CheckableListItem<>(R.string.settings_indexable, 0, CheckableListItem.Style.SWITCH, self.source.indexable!=null ? self.source.indexable : true, R.drawable.ic_fluent_search_24_regular, i->toggleCheckableItem(indexableItem)) + )); + if(self.source.indexable==null) + indexableItem.isEnabled=false; + } } @Override protected void doLoadData(int offset, int count){} + private @StringRes int getPrivacyString(StatusPrivacy p){ + if(p==null) return R.string.visibility_public; + return switch(p){ + 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; + }; + } + + private void onPrivacyClick(ListItem item_){ + Account self=AccountSessionManager.get(accountID).self; + List options=new ArrayList<>(List.of(StatusPrivacy.PUBLIC, StatusPrivacy.UNLISTED, StatusPrivacy.PRIVATE, StatusPrivacy.DIRECT)); + if(instance.isAkkoma()) options.add(StatusPrivacy.LOCAL); + int selected=options.indexOf(self.source.privacy); + int[] newSelected={selected}; + new M3AlertDialogBuilder(getActivity()) + .setTitle(R.string.sk_settings_default_visibility) + .setSingleChoiceItems(options.stream().map(this::getPrivacyString).map(this::getString).toArray(String[]::new), + selected, (dlg, item)->newSelected[0]=item) + .setPositiveButton(R.string.ok, (dlg, item)->{ + privacy=options.get(newSelected[0]); + privacyItem.subtitleRes=getPrivacyString(privacy); + rebindItem(privacyItem); + }) + .setNegativeButton(R.string.cancel, null) + .show(); + } + @Override public void onPause(){ super.onPause(); - Account self=AccountSessionManager.get(accountID).self; - if(self.discoverable!=discoverableItem.checked || (self.source.indexable!=null && self.source.indexable!=indexableItem.checked)){ - self.discoverable=discoverableItem.checked; - self.source.indexable=indexableItem.checked; - AccountSessionManager.get(accountID).savePreferencesLater(); + AccountSession s=AccountSessionManager.get(accountID); + Account self=s.self; + boolean savePlease=self.locked!=lockedItem.checked + || self.source.privacy!=privacy + || (discoverableItem!=null && self.discoverable!=discoverableItem.checked) + || (indexableItem!=null && self.source.indexable!=null && self.source.indexable!=indexableItem.checked); + if(savePlease){ + if(discoverableItem!=null) self.discoverable=discoverableItem.checked; + if(indexableItem!=null) self.source.indexable=indexableItem.checked; + self.locked=lockedItem.checked; + s.preferences.postingDefaultVisibility=privacy; + s.savePreferencesLater(); } } } diff --git a/mastodon/src/main/res/drawable/ic_fluent_person_available_24_regular.xml b/mastodon/src/main/res/drawable/ic_fluent_person_available_24_regular.xml new file mode 100644 index 000000000..3473b7348 --- /dev/null +++ b/mastodon/src/main/res/drawable/ic_fluent_person_available_24_regular.xml @@ -0,0 +1,3 @@ + + + diff --git a/mastodon/src/main/res/values/strings_sk.xml b/mastodon/src/main/res/values/strings_sk.xml index 25b92cfc8..02c1286a1 100644 --- a/mastodon/src/main/res/values/strings_sk.xml +++ b/mastodon/src/main/res/values/strings_sk.xml @@ -414,4 +414,6 @@ Edit alt text Clear home timeline cache Cleared message cache + Manually approve new followers + Default posting visibility \ No newline at end of file