diff --git a/app/src/main/java/org/schabi/newpipe/database/subscription/SubscriptionEntity.kt b/app/src/main/java/org/schabi/newpipe/database/subscription/SubscriptionEntity.kt index 7df9830e4..336d96e0f 100644 --- a/app/src/main/java/org/schabi/newpipe/database/subscription/SubscriptionEntity.kt +++ b/app/src/main/java/org/schabi/newpipe/database/subscription/SubscriptionEntity.kt @@ -83,5 +83,17 @@ data class SubscriptionEntity( subscriberCount = info.subscriberCount ) } + + @Ignore + fun from(info: ChannelInfoItem): SubscriptionEntity { + return SubscriptionEntity( + serviceId = info.serviceId, + url = info.url, + name = info.name, + avatarUrl = ImageStrategy.imageListToDbUrl(info.thumbnails), + description = info.description, + subscriberCount = info.subscriberCount + ) + } } } diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/BaseListFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/BaseListFragment.java index 371e10934..d1dd835ed 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/BaseListFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/BaseListFragment.java @@ -30,6 +30,7 @@ import org.schabi.newpipe.fragments.BaseStateFragment; import org.schabi.newpipe.fragments.OnScrollBelowItemsListener; import org.schabi.newpipe.info_list.InfoListAdapter; import org.schabi.newpipe.info_list.ItemViewMode; +import org.schabi.newpipe.local.subscription.SubscriptionManager; import org.schabi.newpipe.player.playqueue.PlayQueue; import org.schabi.newpipe.ui.components.menu.LongPressAction; import org.schabi.newpipe.ui.components.menu.LongPressable; @@ -293,11 +294,14 @@ public abstract class BaseListFragment extends BaseStateFragment } @Override - public void held(final ChannelInfoItem selectedItem) { + public void held(final ChannelInfoItem item) { + final boolean isSubscribed = new SubscriptionManager(requireContext()) + .blockingIsSubscribed(item.getServiceId(), item.getUrl()); + openLongPressMenuInActivity( requireActivity(), - LongPressable.fromChannelInfoItem(selectedItem), - LongPressAction.fromChannelInfoItem(selectedItem, false) + LongPressable.fromChannelInfoItem(item), + LongPressAction.fromChannelInfoItem(item, isSubscribed) ); } }); diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/channel/ChannelFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/channel/ChannelFragment.java index be7e6efba..73cfe8920 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/channel/ChannelFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/channel/ChannelFragment.java @@ -361,13 +361,7 @@ public class ChannelFragment extends BaseStateFragment if (DEBUG) { Log.d(TAG, "No subscription to this channel!"); } - final SubscriptionEntity channel = new SubscriptionEntity(); - channel.setServiceId(info.getServiceId()); - channel.setUrl(info.getUrl()); - channel.setName(info.getName()); - channel.setAvatarUrl(ImageStrategy.imageListToDbUrl(info.getAvatars())); - channel.setDescription(info.getDescription()); - channel.setSubscriberCount(info.getSubscriberCount()); + final SubscriptionEntity channel = SubscriptionEntity.from(info); channelSubscription = null; updateNotifyButton(null); subscribeButtonMonitor = monitorSubscribeButton(mapOnSubscribe(channel)); diff --git a/app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionManager.kt b/app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionManager.kt index 5cf378cc3..cea29a1a6 100644 --- a/app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionManager.kt +++ b/app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionManager.kt @@ -119,6 +119,10 @@ class SubscriptionManager(context: Context) { subscriptionTable.delete(subscriptionEntity) } + fun blockingIsSubscribed(serviceId: Int, url: String): Boolean { + return !subscriptionTable.getSubscription(serviceId, url).isEmpty.blockingGet() + } + /** * Fetches the list of videos for the provided channel and saves them in the database, so that * they will be considered as "old"/"already seen" streams and the user will never be notified diff --git a/app/src/main/java/org/schabi/newpipe/ui/components/menu/LongPressAction.kt b/app/src/main/java/org/schabi/newpipe/ui/components/menu/LongPressAction.kt index e720c0492..084f59687 100644 --- a/app/src/main/java/org/schabi/newpipe/ui/components/menu/LongPressAction.kt +++ b/app/src/main/java/org/schabi/newpipe/ui/components/menu/LongPressAction.kt @@ -8,6 +8,7 @@ import androidx.annotation.StringRes import androidx.appcompat.app.AlertDialog import androidx.compose.material.icons.Icons import androidx.compose.material.icons.automirrored.filled.PlaylistAdd +import androidx.compose.material.icons.filled.AddCircle import androidx.compose.material.icons.filled.AddToQueue import androidx.compose.material.icons.filled.Cast import androidx.compose.material.icons.filled.Delete @@ -23,6 +24,7 @@ import androidx.compose.material.icons.filled.Person import androidx.compose.material.icons.filled.PictureInPicture import androidx.compose.material.icons.filled.PlayArrow import androidx.compose.material.icons.filled.QueuePlayNext +import androidx.compose.material.icons.filled.RemoveCircle import androidx.compose.material.icons.filled.Share import androidx.compose.ui.graphics.vector.ImageVector import androidx.core.net.toUri @@ -40,6 +42,7 @@ import org.schabi.newpipe.database.playlist.PlaylistStreamEntry import org.schabi.newpipe.database.playlist.model.PlaylistRemoteEntity import org.schabi.newpipe.database.stream.StreamStatisticsEntry import org.schabi.newpipe.database.stream.model.StreamEntity +import org.schabi.newpipe.database.subscription.SubscriptionEntity import org.schabi.newpipe.databinding.DialogEditTextBinding import org.schabi.newpipe.download.DownloadDialog import org.schabi.newpipe.extractor.InfoItem @@ -105,9 +108,10 @@ data class LongPressAction( Rename(19, R.string.rename, Icons.Default.Edit), SetAsPlaylistThumbnail(20, R.string.set_as_playlist_thumbnail, Icons.Default.Image), UnsetPlaylistThumbnail(21, R.string.unset_playlist_thumbnail, Icons.Default.HideImage), - Delete(22, R.string.delete, Icons.Default.Delete), - Unsubscribe(23, R.string.unsubscribe, Icons.Default.Delete), - Remove(24, R.string.play_queue_remove, Icons.Default.Delete); + Subscribe(22, R.string.subscribe_button_title, Icons.Default.AddCircle), + Unsubscribe(23, R.string.unsubscribe, Icons.Default.RemoveCircle), + Delete(24, R.string.delete, Icons.Default.Delete), + Remove(25, R.string.play_queue_remove, Icons.Default.Delete); fun buildAction( enabled: () -> Boolean = { true }, @@ -465,7 +469,7 @@ data class LongPressAction( @JvmStatic fun fromChannelInfoItem( item: ChannelInfoItem, - showUnsubscribe: Boolean + isSubscribed: Boolean ): List { return buildPlayerActionList { ChannelTabPlayQueue(item.serviceId, item.url) } + buildPlayerShuffledActionList { ChannelTabPlayQueue(item.serviceId, item.url) } + @@ -480,7 +484,7 @@ data class LongPressAction( ) } ) + - if (showUnsubscribe) { + if (isSubscribed) { listOf( Type.Unsubscribe.buildAction { context -> withContext(Dispatchers.IO) { @@ -496,7 +500,19 @@ data class LongPressAction( } ) } else { - listOf() + listOf( + Type.Subscribe.buildAction { context -> + withContext(Dispatchers.IO) { + SubscriptionManager(context) + .insertSubscription(SubscriptionEntity.from(item)) + } + Toast.makeText( + context, + context.getString(R.string.subscribed_button_title), + Toast.LENGTH_SHORT + ).show() + } + ) } } diff --git a/app/src/main/java/org/schabi/newpipe/ui/components/menu/LongPressMenuSettings.kt b/app/src/main/java/org/schabi/newpipe/ui/components/menu/LongPressMenuSettings.kt index f6d4621b9..a32606e4d 100644 --- a/app/src/main/java/org/schabi/newpipe/ui/components/menu/LongPressMenuSettings.kt +++ b/app/src/main/java/org/schabi/newpipe/ui/components/menu/LongPressMenuSettings.kt @@ -22,6 +22,7 @@ import org.schabi.newpipe.ui.components.menu.LongPressAction.Type.Rename import org.schabi.newpipe.ui.components.menu.LongPressAction.Type.SetAsPlaylistThumbnail import org.schabi.newpipe.ui.components.menu.LongPressAction.Type.Share import org.schabi.newpipe.ui.components.menu.LongPressAction.Type.ShowDetails +import org.schabi.newpipe.ui.components.menu.LongPressAction.Type.Subscribe import org.schabi.newpipe.ui.components.menu.LongPressAction.Type.UnsetPlaylistThumbnail import org.schabi.newpipe.ui.components.menu.LongPressAction.Type.Unsubscribe @@ -43,9 +44,9 @@ fun storeIsHeaderEnabledToSettings(context: Context, enabled: Boolean) { // also be done by clicking on the uploader name in the long press menu header. // PlayWithKodi is only added by default if it is enabled in settings. private val DefaultEnabledActions: List = listOf( - ShowDetails, Enqueue, EnqueueNext, Background, Popup, BackgroundFromHere, - BackgroundShuffled, Download, AddToPlaylist, Share, OpenInBrowser, MarkAsWatched, - Rename, SetAsPlaylistThumbnail, UnsetPlaylistThumbnail, Delete, Unsubscribe, Remove + ShowDetails, Enqueue, EnqueueNext, Background, Popup, BackgroundFromHere, BackgroundShuffled, + Download, AddToPlaylist, Share, OpenInBrowser, MarkAsWatched, Rename, SetAsPlaylistThumbnail, + UnsetPlaylistThumbnail, Subscribe, Unsubscribe, Delete, Remove ) private fun getShowPlayWithKodi(context: Context): Boolean {