diff --git a/app/src/main/java/com/github/libretube/extensions/SetupSubscriptionButton.kt b/app/src/main/java/com/github/libretube/extensions/SetupSubscriptionButton.kt new file mode 100644 index 000000000..45e685a01 --- /dev/null +++ b/app/src/main/java/com/github/libretube/extensions/SetupSubscriptionButton.kt @@ -0,0 +1,49 @@ +package com.github.libretube.extensions + +import android.view.View +import android.widget.TextView +import com.github.libretube.R +import com.github.libretube.api.SubscriptionHelper +import com.google.android.material.button.MaterialButton +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext + +fun TextView.setupSubscriptionButton( + channelId: String?, + channelName: String?, + notificationBell: MaterialButton? = null, + isSubscribed: Boolean? = null +) { + if (channelId == null) return + + var subscribed: Boolean? = false + + CoroutineScope(Dispatchers.IO).launch { + subscribed = isSubscribed ?: SubscriptionHelper.isSubscribed(channelId) + if (subscribed == true) { + withContext(Dispatchers.Main) { + this@setupSubscriptionButton.text = context.getString(R.string.unsubscribe) + } + } else { + notificationBell?.visibility = View.GONE + } + } + + notificationBell?.setupNotificationBell(channelId) + this.setOnClickListener { + if (subscribed == true) { + SubscriptionHelper.handleUnsubscribe(context, channelId, channelName) { + this.text = context.getString(R.string.subscribe) + notificationBell?.visibility = View.GONE + subscribed = false + } + } else { + SubscriptionHelper.subscribe(channelId) + this.text = context.getString(R.string.unsubscribe) + notificationBell?.visibility = View.VISIBLE + subscribed = true + } + } +} 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 371b25ec4..2d5636d9e 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,14 +1,12 @@ 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 import androidx.fragment.app.FragmentManager import androidx.recyclerview.widget.RecyclerView import com.github.libretube.R -import com.github.libretube.api.SubscriptionHelper import com.github.libretube.api.obj.ContentItem import com.github.libretube.databinding.ChannelRowBinding import com.github.libretube.databinding.PlaylistsRowBinding @@ -16,15 +14,13 @@ import com.github.libretube.databinding.VideoRowBinding import com.github.libretube.extensions.formatShort import com.github.libretube.extensions.setFormattedDuration import com.github.libretube.extensions.setWatchProgressLength +import com.github.libretube.extensions.setupSubscriptionButton import com.github.libretube.extensions.toID import com.github.libretube.ui.sheets.PlaylistOptionsBottomSheet import com.github.libretube.ui.sheets.VideoOptionsBottomSheet import com.github.libretube.ui.viewholders.SearchViewHolder import com.github.libretube.util.ImageHelper import com.github.libretube.util.NavigationHelper -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.launch class SearchAdapter( private val searchItems: MutableList, @@ -130,37 +126,7 @@ class SearchAdapter( NavigationHelper.navigateChannel(root.context, item.url) } - isSubscribed(root.context, item, binding) - } - } - - 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) - - // if subscribed change text to unsubscribe - if (isSubscribed == true) { - binding.searchSubButton.text = binding.root.context.getString(R.string.unsubscribe) - } - - // make sub button visible and set the on click listeners to (un)subscribe - if (isSubscribed == null) return@launch - binding.searchSubButton.visibility = View.VISIBLE - - binding.searchSubButton.setOnClickListener { - if (isSubscribed == false) { - SubscriptionHelper.subscribe(channelId) - binding.searchSubButton.text = binding.root.context.getString(R.string.unsubscribe) - isSubscribed = true - } else { - SubscriptionHelper.handleUnsubscribe(context, channelId, streamItem.uploaderName) { - binding.searchSubButton.text = binding.root.context.getString(R.string.subscribe) - isSubscribed = false - } - } - } + binding.searchSubButton.setupSubscriptionButton(item.url?.toID(), item.name?.toID()) } } 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 feb47d1a0..5485e2d7c 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 @@ -1,14 +1,11 @@ package com.github.libretube.ui.adapters import android.view.LayoutInflater -import android.view.View import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView -import com.github.libretube.R -import com.github.libretube.api.SubscriptionHelper import com.github.libretube.api.obj.Subscription import com.github.libretube.databinding.ChannelSubscriptionRowBinding -import com.github.libretube.extensions.setupNotificationBell +import com.github.libretube.extensions.setupSubscriptionButton import com.github.libretube.extensions.toID import com.github.libretube.ui.viewholders.SubscriptionChannelViewHolder import com.github.libretube.util.ImageHelper @@ -31,32 +28,20 @@ class SubscriptionChannelAdapter( override fun onBindViewHolder(holder: SubscriptionChannelViewHolder, position: Int) { val subscription = subscriptions[position] - var isSubscribed = true holder.binding.apply { subscriptionChannelName.text = subscription.name ImageHelper.loadImage(subscription.avatar, subscriptionChannelImage) - subscription.url?.toID()?.let { notificationBell.setupNotificationBell(it) } - root.setOnClickListener { NavigationHelper.navigateChannel(root.context, subscription.url) } - subscriptionSubscribe.setOnClickListener { - val channelId = subscription.url!!.toID() - if (isSubscribed) { - SubscriptionHelper.handleUnsubscribe(root.context, channelId, subscription.name ?: "") { - subscriptionSubscribe.text = root.context.getString(R.string.subscribe) - notificationBell.visibility = View.GONE - isSubscribed = false - } - } else { - SubscriptionHelper.subscribe(channelId) - subscriptionSubscribe.text = root.context.getString(R.string.unsubscribe) - notificationBell.visibility = View.VISIBLE - isSubscribed = true - } - } + subscriptionSubscribe.setupSubscriptionButton( + subscription.url?.toID(), + subscription.name, + notificationBell, + true + ) } } } diff --git a/app/src/main/java/com/github/libretube/ui/fragments/ChannelFragment.kt b/app/src/main/java/com/github/libretube/ui/fragments/ChannelFragment.kt index 0cc63d135..f51ea713e 100644 --- a/app/src/main/java/com/github/libretube/ui/fragments/ChannelFragment.kt +++ b/app/src/main/java/com/github/libretube/ui/fragments/ChannelFragment.kt @@ -17,7 +17,7 @@ import com.github.libretube.databinding.FragmentChannelBinding import com.github.libretube.enums.ShareObjectType import com.github.libretube.extensions.TAG import com.github.libretube.extensions.formatShort -import com.github.libretube.extensions.setupNotificationBell +import com.github.libretube.extensions.setupSubscriptionButton import com.github.libretube.extensions.toID import com.github.libretube.obj.ShareData import com.github.libretube.ui.adapters.SearchAdapter @@ -125,27 +125,7 @@ class ChannelFragment : BaseFragment() { if (isSubscribed == null) return@launchWhenCreated runOnUiThread { - if (isSubscribed == true) { - binding.channelSubscribe.text = getString(R.string.unsubscribe) - } - - channelId?.let { binding.notificationBell.setupNotificationBell(it) } - if (isSubscribed == false) binding.notificationBell.visibility = View.GONE - - binding.channelSubscribe.setOnClickListener { - if (isSubscribed == true) { - SubscriptionHelper.handleUnsubscribe(requireContext(), channelId!!, channelName) { - isSubscribed = false - binding.channelSubscribe.text = getString(R.string.subscribe) - binding.notificationBell.visibility = View.GONE - } - } else { - SubscriptionHelper.subscribe(channelId!!) - isSubscribed = true - binding.channelSubscribe.text = getString(R.string.unsubscribe) - binding.notificationBell.visibility = View.VISIBLE - } - } + binding.channelSubscribe.setupSubscriptionButton(channelId, channelName, binding.notificationBell) binding.channelShare.setOnClickListener { val shareDialog = ShareDialog( diff --git a/app/src/main/java/com/github/libretube/ui/fragments/PlayerFragment.kt b/app/src/main/java/com/github/libretube/ui/fragments/PlayerFragment.kt index 6daac4b26..770f6f012 100644 --- a/app/src/main/java/com/github/libretube/ui/fragments/PlayerFragment.kt +++ b/app/src/main/java/com/github/libretube/ui/fragments/PlayerFragment.kt @@ -37,7 +37,6 @@ import com.fasterxml.jackson.databind.ObjectMapper import com.github.libretube.R import com.github.libretube.api.CronetHelper import com.github.libretube.api.RetrofitInstance -import com.github.libretube.api.SubscriptionHelper import com.github.libretube.api.obj.ChapterSegment import com.github.libretube.api.obj.SegmentData import com.github.libretube.constants.IntentData @@ -53,6 +52,7 @@ import com.github.libretube.extensions.awaitQuery import com.github.libretube.extensions.formatShort import com.github.libretube.extensions.hideKeyboard import com.github.libretube.extensions.query +import com.github.libretube.extensions.setupSubscriptionButton import com.github.libretube.extensions.toID import com.github.libretube.extensions.toStreamItem import com.github.libretube.models.PlayerViewModel @@ -118,7 +118,6 @@ class PlayerFragment : BaseFragment(), OnlinePlayerOptions { */ private var videoId: String? = null private var playlistId: String? = null - private var isSubscribed: Boolean? = false private var isLive = false private lateinit var streams: com.github.libretube.api.obj.Streams @@ -935,7 +934,7 @@ class PlayerFragment : BaseFragment(), OnlinePlayerOptions { } // update the subscribed state - isSubscribed() + binding.playerSubscribe.setupSubscriptionButton(streams.uploaderUrl?.toID(), streams.uploader) if (token != "") { binding.relPlayerSave.setOnClickListener { @@ -1261,33 +1260,6 @@ class PlayerFragment : BaseFragment(), OnlinePlayerOptions { nowPlayingNotification.updatePlayerNotification(videoId!!, streams) } - private fun isSubscribed() { - val channelId = streams.uploaderUrl!!.toID() - lifecycleScope.launchWhenCreated { - isSubscribed = SubscriptionHelper.isSubscribed(channelId) - - if (isSubscribed == null) return@launchWhenCreated - - runOnUiThread { - if (isSubscribed == true) { - binding.playerSubscribe.text = getString(R.string.unsubscribe) - } - binding.playerSubscribe.setOnClickListener { - if (isSubscribed == true) { - SubscriptionHelper.handleUnsubscribe(requireContext(), channelId, streams.uploader) { - binding.playerSubscribe.text = getString(R.string.subscribe) - isSubscribed = false - } - } else { - SubscriptionHelper.subscribe(channelId) - binding.playerSubscribe.text = getString(R.string.unsubscribe) - isSubscribed = true - } - } - } - } - } - private fun fetchComments() { lifecycleScope.launchWhenCreated { val commentsResponse = try {