diff --git a/mastodon/src/main/java/org/joinmastodon/android/api/session/AccountSessionManager.java b/mastodon/src/main/java/org/joinmastodon/android/api/session/AccountSessionManager.java index 62a6dd9db..e37e2b698 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/api/session/AccountSessionManager.java +++ b/mastodon/src/main/java/org/joinmastodon/android/api/session/AccountSessionManager.java @@ -34,6 +34,7 @@ import org.joinmastodon.android.model.EmojiCategory; import org.joinmastodon.android.model.LegacyFilter; import org.joinmastodon.android.model.Instance; import org.joinmastodon.android.model.Token; +import org.joinmastodon.android.utils.UnifiedPushHelper; import org.unifiedpush.android.connector.UnifiedPush; import java.io.File; @@ -127,7 +128,7 @@ public class AccountSessionManager{ MastodonAPIController.runInBackground(()->writeInstanceInfoFile(wrapper, instance.uri)); updateMoreInstanceInfo(instance, instance.uri); - if (UnifiedPush.getAckDistributor(context) != null) { + if (UnifiedPushHelper.isUnifiedPushEnabled(context)) { UnifiedPush.register( context, session.getID(), diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/settings/SettingsNotificationsFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/settings/SettingsNotificationsFragment.java index c6c2997b5..ac22670c6 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/settings/SettingsNotificationsFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/settings/SettingsNotificationsFragment.java @@ -26,6 +26,7 @@ import org.joinmastodon.android.model.viewmodel.ListItem; import org.joinmastodon.android.ui.M3AlertDialogBuilder; import org.joinmastodon.android.ui.utils.HideableSingleViewRecyclerAdapter; import org.joinmastodon.android.ui.utils.UiUtils; +import org.joinmastodon.android.utils.UnifiedPushHelper; import org.unifiedpush.android.connector.UnifiedPush; import java.time.Instant; @@ -57,6 +58,7 @@ public class SettingsNotificationsFragment extends BaseSettingsFragment{ // MEGALODON private boolean useUnifiedPush = false; + private boolean hasAnyUnifiedPushDistrib = false; private CheckableListItem uniformIconItem, deleteItem, onlyLatestItem, unifiedPushItem; private CheckableListItem postsItem, updateItem; @@ -72,7 +74,8 @@ public class SettingsNotificationsFragment extends BaseSettingsFragment{ lp=AccountSessionManager.get(accountID).getLocalPreferences(); getPushSubscription(); - useUnifiedPush=UnifiedPush.getAckDistributor(getContext()) != null; + useUnifiedPush=UnifiedPushHelper.isUnifiedPushEnabled(getContext()); + hasAnyUnifiedPushDistrib=UnifiedPushHelper.hasAnyDistributorInstalled(getContext()); onDataLoaded(List.of( pauseItem=new CheckableListItem<>(getString(R.string.pause_all_notifications), getPauseItemSubtitle(), CheckableListItem.Style.SWITCH, false, R.drawable.ic_fluent_alert_snooze_24_regular, i->onPauseNotificationsClick(false)), @@ -94,7 +97,7 @@ public class SettingsNotificationsFragment extends BaseSettingsFragment{ )); //only enable when distributors, who can receive notifications, are available - unifiedPushItem.isEnabled=!UnifiedPush.getDistributors(getContext()).isEmpty(); + unifiedPushItem.isEnabled=hasAnyUnifiedPushDistrib; if (!unifiedPushItem.isEnabled) { unifiedPushItem.subtitleRes=R.string.sk_settings_unifiedpush_no_distributor_body; } @@ -316,12 +319,12 @@ public class SettingsNotificationsFragment extends BaseSettingsFragment{ bannerText.setText(R.string.notifications_disabled_in_system); bannerButton.setText(R.string.open_system_notification_settings); bannerButton.setOnClickListener(v->openSystemNotificationSettings()); - }else if(BuildConfig.BUILD_TYPE.equals("fdroidRelease") && UnifiedPush.getAckDistributor(getContext()) != null){ + }else if(BuildConfig.BUILD_TYPE.equals("fdroidRelease") && useUnifiedPush){ bannerAdapter.setVisible(true); bannerIcon.setImageResource(R.drawable.ic_fluent_warning_24_filled); bannerTitle.setVisibility(View.VISIBLE); bannerTitle.setText(R.string.mo_settings_unifiedpush_warning); - if(UnifiedPush.getDistributors(getContext()).isEmpty()) { + if(!hasAnyUnifiedPushDistrib) { bannerText.setText(R.string.mo_settings_unifiedpush_warning_no_distributors); bannerButton.setText(R.string.info); bannerButton.setOnClickListener(v->UiUtils.launchWebBrowser(getContext(), "https://unifiedpush.org/")); @@ -342,23 +345,15 @@ public class SettingsNotificationsFragment extends BaseSettingsFragment{ } private void onUnifiedPushClick(){ - if(UnifiedPush.getAckDistributor(getContext()) == null){ + if(!useUnifiedPush){ List distributors = UnifiedPush.getDistributors(getContext()); showUnifiedPushRegisterDialog(distributors); return; } - - for (AccountSession accountSession : AccountSessionManager.getInstance().getLoggedInAccounts()) { - UnifiedPush.unregister( - getContext(), - accountSession.getID() - ); - - //re-register to fcm - accountSession.getPushSubscriptionManager().registerAccountForPush(getPushSubscription()); - } + UnifiedPushHelper.unregisterAllAccounts(getContext()); unifiedPushItem.toggle(); rebindItem(unifiedPushItem); + useUnifiedPush = false; } private void showUnifiedPushRegisterDialog(List distributors){ @@ -366,16 +361,10 @@ public class SettingsNotificationsFragment extends BaseSettingsFragment{ (dialog, which)->{ String userDistrib = distributors.get(which); UnifiedPush.saveDistributor(getContext(), userDistrib); - for (AccountSession accountSession : AccountSessionManager.getInstance().getLoggedInAccounts()){ - UnifiedPush.register( - getContext(), - accountSession.getID(), - null, - null - ); - } + UnifiedPushHelper.registerAllAccounts(getContext()); unifiedPushItem.toggle(); rebindItem(unifiedPushItem); + useUnifiedPush = true; }).setOnCancelListener(d->rebindItem(unifiedPushItem)).show(); } diff --git a/mastodon/src/main/java/org/joinmastodon/android/utils/UnifiedPushHelper.java b/mastodon/src/main/java/org/joinmastodon/android/utils/UnifiedPushHelper.java new file mode 100644 index 000000000..aba3ca864 --- /dev/null +++ b/mastodon/src/main/java/org/joinmastodon/android/utils/UnifiedPushHelper.java @@ -0,0 +1,51 @@ +package org.joinmastodon.android.utils; + +import android.content.Context; + +import androidx.annotation.NonNull; + +import org.joinmastodon.android.api.session.AccountSession; +import org.joinmastodon.android.api.session.AccountSessionManager; +import org.unifiedpush.android.connector.UnifiedPush; + +public class UnifiedPushHelper { + + /** + * @param context + * @return `true` if UnifiedPush is used + */ + public static boolean isUnifiedPushEnabled(@NonNull Context context) { + return UnifiedPush.getAckDistributor(context) != null; + } + + /** + * If any distributor is installed on the device + * @param context + * @return `true` if at least one is installed + */ + public static boolean hasAnyDistributorInstalled(@NonNull Context context) { + return !UnifiedPush.getDistributors(context).isEmpty(); + } + + public static void registerAllAccounts(@NonNull Context context) { + for (AccountSession accountSession : AccountSessionManager.getInstance().getLoggedInAccounts()){ + UnifiedPush.register( + context, + accountSession.getID(), + null, + null + ); + } + } + + public static void unregisterAllAccounts(@NonNull Context context) { + for (AccountSession accountSession : AccountSessionManager.getInstance().getLoggedInAccounts()){ + UnifiedPush.unregister( + context, + accountSession.getID() + ); + // use FCM again + accountSession.getPushSubscriptionManager().registerAccountForPush(null); + } + } +}