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 86c241d7f..42af1e63f 100644 --- a/app/src/main/java/com/github/libretube/api/SubscriptionHelper.kt +++ b/app/src/main/java/com/github/libretube/api/SubscriptionHelper.kt @@ -1,12 +1,16 @@ package com.github.libretube.api +import android.content.Context import android.util.Log +import com.github.libretube.R +import com.github.libretube.constants.PreferenceKeys import com.github.libretube.db.DatabaseHolder.Companion.Database import com.github.libretube.db.obj.LocalSubscription import com.github.libretube.extensions.TAG import com.github.libretube.extensions.awaitQuery import com.github.libretube.extensions.query import com.github.libretube.util.PreferenceHelper +import com.google.android.material.dialog.MaterialAlertDialogBuilder import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch @@ -55,6 +59,24 @@ object SubscriptionHelper { } } + fun handleUnsubscribe(context: Context, channelId: String, channelName: String?, onUnsubscribe: () -> Unit) { + if (!PreferenceHelper.getBoolean(PreferenceKeys.CONFIRM_UNSUBSCRIBE, false)) { + unsubscribe(channelId) + onUnsubscribe.invoke() + return + } + + MaterialAlertDialogBuilder(context) + .setTitle(R.string.unsubscribe) + .setMessage(context.getString(R.string.confirm_unsubscribe, channelName)) + .setPositiveButton(R.string.unsubscribe) { _, _ -> + unsubscribe(channelId) + onUnsubscribe.invoke() + } + .setNegativeButton(R.string.cancel, null) + .show() + } + suspend fun isSubscribed(channelId: String): Boolean? { if (PreferenceHelper.getToken() != "") { val isSubscribed = try { @@ -99,7 +121,7 @@ object SubscriptionHelper { } } - fun getLocalSubscriptions(): List { + private fun getLocalSubscriptions(): List { return awaitQuery { Database.localSubscriptionDao().getAll() } @@ -107,6 +129,6 @@ object SubscriptionHelper { fun getFormattedLocalSubscriptions(): String { val localSubscriptions = getLocalSubscriptions() - return localSubscriptions.map { it.channelId }.joinToString(",") + return localSubscriptions.joinToString(",") { it.channelId } } } diff --git a/app/src/main/java/com/github/libretube/constants/PreferenceKeys.kt b/app/src/main/java/com/github/libretube/constants/PreferenceKeys.kt index 738a0f6e8..f29f5716b 100644 --- a/app/src/main/java/com/github/libretube/constants/PreferenceKeys.kt +++ b/app/src/main/java/com/github/libretube/constants/PreferenceKeys.kt @@ -104,6 +104,7 @@ object PreferenceKeys { const val CLEAR_WATCH_HISTORY = "clear_watch_history" const val CLEAR_WATCH_POSITIONS = "clear_watch_positions" const val SHARE_WITH_TIME_CODE = "share_with_time_code" + const val CONFIRM_UNSUBSCRIBE = "confirm_unsubscribing" /** * History diff --git a/app/src/main/java/com/github/libretube/ui/adapters/SearchAdapter.kt b/app/src/main/java/com/github/libretube/ui/adapters/SearchAdapter.kt index 02c570010..371b25ec4 100644 --- a/app/src/main/java/com/github/libretube/ui/adapters/SearchAdapter.kt +++ b/app/src/main/java/com/github/libretube/ui/adapters/SearchAdapter.kt @@ -1,6 +1,7 @@ package com.github.libretube.ui.adapters import android.annotation.SuppressLint +import android.content.Context import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -128,13 +129,13 @@ class SearchAdapter( root.setOnClickListener { NavigationHelper.navigateChannel(root.context, item.url) } - val channelId = item.url!!.toID() - isSubscribed(channelId, binding) + isSubscribed(root.context, item, binding) } } - private fun isSubscribed(channelId: String, binding: ChannelRowBinding) { + private fun isSubscribed(context: Context, streamItem: ContentItem, binding: ChannelRowBinding) { + val channelId = streamItem.url!!.toID() // check whether the user subscribed to the channel CoroutineScope(Dispatchers.Main).launch { var isSubscribed = SubscriptionHelper.isSubscribed(channelId) @@ -151,14 +152,13 @@ class SearchAdapter( binding.searchSubButton.setOnClickListener { if (isSubscribed == false) { SubscriptionHelper.subscribe(channelId) - binding.searchSubButton.text = - binding.root.context.getString(R.string.unsubscribe) + binding.searchSubButton.text = binding.root.context.getString(R.string.unsubscribe) isSubscribed = true } else { - SubscriptionHelper.unsubscribe(channelId) - binding.searchSubButton.text = - binding.root.context.getString(R.string.subscribe) - isSubscribed = false + SubscriptionHelper.handleUnsubscribe(context, channelId, streamItem.uploaderName) { + binding.searchSubButton.text = binding.root.context.getString(R.string.subscribe) + isSubscribed = false + } } } } diff --git a/app/src/main/java/com/github/libretube/ui/adapters/SubscriptionChannelAdapter.kt b/app/src/main/java/com/github/libretube/ui/adapters/SubscriptionChannelAdapter.kt index ca792802d..86f5f9b24 100644 --- a/app/src/main/java/com/github/libretube/ui/adapters/SubscriptionChannelAdapter.kt +++ b/app/src/main/java/com/github/libretube/ui/adapters/SubscriptionChannelAdapter.kt @@ -38,13 +38,14 @@ class SubscriptionChannelAdapter(private val subscriptions: MutableList + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index fd274b7cd..6ee7f5fb4 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -356,6 +356,9 @@ Alternative videos layout Default light Playlist cloned + Are you sure you want to unsubscribe %1$s? + Confirm unsubscribing + Show a confirmation dialog before unsubscribing. Download Service diff --git a/app/src/main/res/xml/advanced_settings.xml b/app/src/main/res/xml/advanced_settings.xml index 02f1f0a27..6d195c52d 100644 --- a/app/src/main/res/xml/advanced_settings.xml +++ b/app/src/main/res/xml/advanced_settings.xml @@ -36,6 +36,12 @@ app:key="save_feed" app:title="@string/save_feed" /> + +