From 9a537eb0ec3d7cfd80c81f818430c5ee762f2a35 Mon Sep 17 00:00:00 2001 From: Bnyro Date: Tue, 15 Apr 2025 15:08:21 +0200 Subject: [PATCH] fix: subscription button state not updated after starting next video --- .../libretube/api/SubscriptionHelper.kt | 27 ------ .../ui/extensions/SetupSubscriptionButton.kt | 82 +++++++++++++------ 2 files changed, 57 insertions(+), 52 deletions(-) diff --git a/app/src/main/java/com/github/libretube/api/SubscriptionHelper.kt b/app/src/main/java/com/github/libretube/api/SubscriptionHelper.kt index 464abdfce..a6554fc13 100644 --- a/app/src/main/java/com/github/libretube/api/SubscriptionHelper.kt +++ b/app/src/main/java/com/github/libretube/api/SubscriptionHelper.kt @@ -61,31 +61,4 @@ object SubscriptionHelper { suspend fun submitFeedItemChange(feedItem: SubscriptionsFeedItem) = feedRepository.submitFeedItemChange(feedItem) - - fun handleUnsubscribe( - context: Context, - channelId: String, - channelName: String?, - onUnsubscribe: () -> Unit - ) { - if (!PreferenceHelper.getBoolean(PreferenceKeys.CONFIRM_UNSUBSCRIBE, false)) { - runBlocking { - unsubscribe(channelId) - onUnsubscribe() - } - return - } - - MaterialAlertDialogBuilder(context) - .setTitle(R.string.unsubscribe) - .setMessage(context.getString(R.string.confirm_unsubscribe, channelName)) - .setPositiveButton(R.string.unsubscribe) { _, _ -> - runBlocking { - unsubscribe(channelId) - onUnsubscribe() - } - } - .setNegativeButton(R.string.cancel, null) - .show() - } } diff --git a/app/src/main/java/com/github/libretube/ui/extensions/SetupSubscriptionButton.kt b/app/src/main/java/com/github/libretube/ui/extensions/SetupSubscriptionButton.kt index 6d40e3aa7..dee847f2f 100644 --- a/app/src/main/java/com/github/libretube/ui/extensions/SetupSubscriptionButton.kt +++ b/app/src/main/java/com/github/libretube/ui/extensions/SetupSubscriptionButton.kt @@ -1,13 +1,14 @@ package com.github.libretube.ui.extensions +import android.content.Context import android.widget.TextView -import androidx.core.view.isGone import androidx.core.view.isVisible import com.github.libretube.R import com.github.libretube.api.SubscriptionHelper import com.github.libretube.constants.PreferenceKeys import com.github.libretube.helpers.PreferenceHelper import com.google.android.material.button.MaterialButton +import com.google.android.material.dialog.MaterialAlertDialogBuilder import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch @@ -24,47 +25,78 @@ fun TextView.setupSubscriptionButton( ) { if (channelId == null) return + val notificationsEnabled = PreferenceHelper + .getBoolean(PreferenceKeys.NOTIFICATION_ENABLED, true) var subscribed: Boolean? = false + fun updateUIStateAndNotifyObservers() { + subscribed?.let { subscribed -> onIsSubscribedChange(subscribed) } + + this@setupSubscriptionButton.text = + if (subscribed == true) context.getString(R.string.unsubscribe) + else context.getString(R.string.subscribe) + + notificationBell?.isVisible = subscribed == true && notificationsEnabled + this@setupSubscriptionButton.isVisible = true + } + CoroutineScope(Dispatchers.IO).launch { subscribed = isSubscribed ?: SubscriptionHelper.isSubscribed(channelId) withContext(Dispatchers.Main) { - subscribed?.let { subscribed -> onIsSubscribedChange(subscribed) } - - if (subscribed == true) { - this@setupSubscriptionButton.text = context.getString(R.string.unsubscribe) - } else { - notificationBell?.isGone = true - } - this@setupSubscriptionButton.isVisible = true + updateUIStateAndNotifyObservers() } } notificationBell?.setupNotificationBell(channelId) setOnClickListener { - if (subscribed == true) { - SubscriptionHelper.handleUnsubscribe(context, channelId, channelName) { - text = context.getString(R.string.subscribe) - notificationBell?.isGone = true + CoroutineScope(Dispatchers.Main).launch { + if (subscribed == true) { + val unsubscribeAction: (suspend () -> Unit) = { + withContext(Dispatchers.IO) { + SubscriptionHelper.unsubscribe(channelId) + } + subscribed = false - subscribed = false - onIsSubscribedChange(false) - } - } else { - CoroutineScope(Dispatchers.Main).launch { - withContext(Dispatchers.IO) { - SubscriptionHelper.subscribe(channelId, channelName, channelAvatar, channelVerified) + updateUIStateAndNotifyObservers() } - text = context.getString(R.string.unsubscribe) - notificationBell?.isVisible = PreferenceHelper - .getBoolean(PreferenceKeys.NOTIFICATION_ENABLED, true) - + if (!PreferenceHelper.getBoolean(PreferenceKeys.CONFIRM_UNSUBSCRIBE, false)) { + showUnsubscribeDialog(context, channelName) { + CoroutineScope(Dispatchers.Main).launch { unsubscribeAction() } + } + } else { + unsubscribeAction() + } + } else { + withContext(Dispatchers.IO) { + SubscriptionHelper.subscribe( + channelId, + channelName, + channelAvatar, + channelVerified + ) + } subscribed = true - onIsSubscribedChange(true) + + updateUIStateAndNotifyObservers() } } } } + +fun showUnsubscribeDialog( + context: Context, + channelName: String?, + onUnsubscribe: () -> Unit +) { + MaterialAlertDialogBuilder(context) + .setTitle(R.string.unsubscribe) + .setMessage(context.getString(R.string.confirm_unsubscribe, channelName)) + .setPositiveButton(R.string.unsubscribe) { _, _ -> + onUnsubscribe() + } + .setNegativeButton(R.string.cancel, null) + .show() +} \ No newline at end of file