Add functionality to open channel shorts in shorts fragment

Changelog: changed
This commit is contained in:
Kai 2025-06-12 14:01:11 -05:00
commit cf96bd1ec0
No known key found for this signature in database
6 changed files with 136 additions and 58 deletions

View file

@ -25,6 +25,7 @@ import com.futo.platformplayer.api.media.structures.IReplacerPager
import com.futo.platformplayer.api.media.structures.MultiPager import com.futo.platformplayer.api.media.structures.MultiPager
import com.futo.platformplayer.constructs.Event1 import com.futo.platformplayer.constructs.Event1
import com.futo.platformplayer.constructs.Event2 import com.futo.platformplayer.constructs.Event2
import com.futo.platformplayer.constructs.Event3
import com.futo.platformplayer.constructs.TaskHandler import com.futo.platformplayer.constructs.TaskHandler
import com.futo.platformplayer.dp import com.futo.platformplayer.dp
import com.futo.platformplayer.engine.exceptions.PluginException import com.futo.platformplayer.engine.exceptions.PluginException
@ -61,7 +62,7 @@ class ChannelContentsFragment(private val subType: String? = null) : Fragment(),
private var _query: String? = null private var _query: String? = null
private var _searchView: SearchView? = null private var _searchView: SearchView? = null
val onContentClicked = Event2<IPlatformContent, Long>(); val onContentClicked = Event3<IPlatformContent, Long, Pair<IPager<IPlatformContent>, ArrayList<IPlatformContent>>?>();
val onContentUrlClicked = Event2<String, ContentType>(); val onContentUrlClicked = Event2<String, ContentType>();
val onUrlClicked = Event1<String>(); val onUrlClicked = Event1<String>();
val onChannelClicked = Event1<PlatformAuthorLink>(); val onChannelClicked = Event1<PlatformAuthorLink>();
@ -211,7 +212,10 @@ class ChannelContentsFragment(private val subType: String? = null) : Fragment(),
_adapterResults = PreviewContentListAdapter(view.context, FeedStyle.THUMBNAIL, _results, null, Settings.instance.channel.progressBar, viewsToPrepend = arrayListOf(searchView)).apply { _adapterResults = PreviewContentListAdapter(view.context, FeedStyle.THUMBNAIL, _results, null, Settings.instance.channel.progressBar, viewsToPrepend = arrayListOf(searchView)).apply {
this.onContentUrlClicked.subscribe(this@ChannelContentsFragment.onContentUrlClicked::emit); this.onContentUrlClicked.subscribe(this@ChannelContentsFragment.onContentUrlClicked::emit);
this.onUrlClicked.subscribe(this@ChannelContentsFragment.onUrlClicked::emit); this.onUrlClicked.subscribe(this@ChannelContentsFragment.onUrlClicked::emit);
this.onContentClicked.subscribe(this@ChannelContentsFragment.onContentClicked::emit); this.onContentClicked.subscribe { content, num ->
val results = ArrayList(_results)
this@ChannelContentsFragment.onContentClicked.emit(content, num, Pair(_pager!!, results))
}
this.onChannelClicked.subscribe(this@ChannelContentsFragment.onChannelClicked::emit); this.onChannelClicked.subscribe(this@ChannelContentsFragment.onChannelClicked::emit);
this.onAddToClicked.subscribe(this@ChannelContentsFragment.onAddToClicked::emit); this.onAddToClicked.subscribe(this@ChannelContentsFragment.onAddToClicked::emit);
this.onAddToQueueClicked.subscribe(this@ChannelContentsFragment.onAddToQueueClicked::emit); this.onAddToQueueClicked.subscribe(this@ChannelContentsFragment.onAddToQueueClicked::emit);

View file

@ -392,7 +392,7 @@ class MenuBottomBarFragment : MainActivityFragment() {
ButtonDefinition(2, R.drawable.ic_creators, R.drawable.ic_creators_filled, R.string.creators, canToggle = false, { it.currentMain is CreatorsFragment }, { it.navigate<CreatorsFragment>(withHistory = false) }), ButtonDefinition(2, R.drawable.ic_creators, R.drawable.ic_creators_filled, R.string.creators, canToggle = false, { it.currentMain is CreatorsFragment }, { it.navigate<CreatorsFragment>(withHistory = false) }),
ButtonDefinition(3, R.drawable.ic_sources, R.drawable.ic_sources_filled, R.string.sources, canToggle = false, { it.currentMain is SourcesFragment }, { it.navigate<SourcesFragment>(withHistory = false) }), ButtonDefinition(3, R.drawable.ic_sources, R.drawable.ic_sources_filled, R.string.sources, canToggle = false, { it.currentMain is SourcesFragment }, { it.navigate<SourcesFragment>(withHistory = false) }),
ButtonDefinition(4, R.drawable.ic_playlist, R.drawable.ic_playlist_filled, R.string.playlists, canToggle = false, { it.currentMain is PlaylistsFragment }, { it.navigate<PlaylistsFragment>(withHistory = false) }), ButtonDefinition(4, R.drawable.ic_playlist, R.drawable.ic_playlist_filled, R.string.playlists, canToggle = false, { it.currentMain is PlaylistsFragment }, { it.navigate<PlaylistsFragment>(withHistory = false) }),
ButtonDefinition(5, R.drawable.ic_smart_display, R.drawable.ic_smart_display_filled, R.string.shorts, canToggle = true, { it.currentMain is ShortsFragment }, { it.navigate<ShortsFragment>(withHistory = false) }), ButtonDefinition(5, R.drawable.ic_smart_display, R.drawable.ic_smart_display_filled, R.string.shorts, canToggle = true, { it.currentMain is ShortsFragment && !(it.currentMain as ShortsFragment).isChannelShortsMode }, { it.navigate<ShortsFragment>(withHistory = false) }),
ButtonDefinition(6, R.drawable.ic_history, R.drawable.ic_history, R.string.history, canToggle = false, { it.currentMain is HistoryFragment }, { it.navigate<HistoryFragment>(withHistory = false) }), ButtonDefinition(6, R.drawable.ic_history, R.drawable.ic_history, R.string.history, canToggle = false, { it.currentMain is HistoryFragment }, { it.navigate<HistoryFragment>(withHistory = false) }),
ButtonDefinition(7, R.drawable.ic_download, R.drawable.ic_download, R.string.downloads, canToggle = false, { it.currentMain is DownloadsFragment }, { it.navigate<DownloadsFragment>(withHistory = false) }), ButtonDefinition(7, R.drawable.ic_download, R.drawable.ic_download, R.string.downloads, canToggle = false, { it.currentMain is DownloadsFragment }, { it.navigate<DownloadsFragment>(withHistory = false) }),
ButtonDefinition(8, R.drawable.ic_chat, R.drawable.ic_chat_filled, R.string.comments, canToggle = true, { it.currentMain is CommentsFragment }, { it.navigate<CommentsFragment>(withHistory = false) }), ButtonDefinition(8, R.drawable.ic_chat, R.drawable.ic_chat_filled, R.string.comments, canToggle = true, { it.currentMain is CommentsFragment }, { it.navigate<CommentsFragment>(withHistory = false) }),

View file

@ -211,6 +211,14 @@ class ChannelFragment : MainFragment() {
} }
} }
} }
adapter.onShortClicked.subscribe { v, _, pagerPair ->
when (v) {
is IPlatformVideo -> {
StatePlayer.instance.clearQueue()
fragment.navigate<ShortsFragment>(Triple(v, pagerPair!!.first, pagerPair.second))
}
}
}
adapter.onAddToClicked.subscribe { content -> adapter.onAddToClicked.subscribe { content ->
_overlayContainer.let { _overlayContainer.let {
if (content is IPlatformVideo) _slideUpOverlay = if (content is IPlatformVideo) _slideUpOverlay =

View file

@ -160,10 +160,10 @@ class ShortView : FrameLayout {
null null
val onResetTriggered = Event0() val onResetTriggered = Event0()
val onPlayingToggled = Event1<Boolean>() private val onPlayingToggled = Event1<Boolean>()
val onLikesLoaded = Event3<RatingLikeDislikes, Boolean, Boolean>() private val onLikesLoaded = Event3<RatingLikeDislikes, Boolean, Boolean>()
val onLikeDislikeUpdated = Event1<OnLikeDislikeUpdatedArgs>() private val onLikeDislikeUpdated = Event1<OnLikeDislikeUpdatedArgs>()
val onVideoUpdated = Event1<IPlatformVideo?>() private val onVideoUpdated = Event1<IPlatformVideo?>()
private val bottomSheet: CommentsModalBottomSheet = CommentsModalBottomSheet() private val bottomSheet: CommentsModalBottomSheet = CommentsModalBottomSheet()
@ -447,8 +447,7 @@ class ShortView : FrameLayout {
overlay.visibility = VISIBLE overlay.visibility = VISIBLE
overlay.animate().alpha(1f).scaleX(1f).scaleY(1f).setDuration(400) overlay.animate().alpha(1f).scaleX(1f).scaleY(1f).setDuration(400)
.setInterpolator(OvershootInterpolator(1.2f)) .setInterpolator(OvershootInterpolator(1.2f)).start()
.start()
overlay.postDelayed({ overlay.postDelayed({
hidePlayPauseIcon() hidePlayPauseIcon()
@ -783,11 +782,11 @@ class ShortView : FrameLayout {
mainFragment.lifecycleScope.launch(Dispatchers.IO) { mainFragment.lifecycleScope.launch(Dispatchers.IO) {
try { try {
Logger.i(CommentsModalBottomSheet.Companion.TAG, "Started backfill") Logger.i(CommentsModalBottomSheet.TAG, "Started backfill")
args.processHandle.fullyBackfillServersAnnounceExceptions() args.processHandle.fullyBackfillServersAnnounceExceptions()
Logger.i(CommentsModalBottomSheet.Companion.TAG, "Finished backfill") Logger.i(CommentsModalBottomSheet.TAG, "Finished backfill")
} catch (e: Throwable) { } catch (e: Throwable) {
Logger.e(CommentsModalBottomSheet.Companion.TAG, "Failed to backfill servers", e) Logger.e(CommentsModalBottomSheet.TAG, "Failed to backfill servers", e)
} }
} }
@ -832,13 +831,13 @@ class ShortView : FrameLayout {
Logger.w(TAG, "exception<ScriptLoginRequiredException>", e) Logger.w(TAG, "exception<ScriptLoginRequiredException>", e)
UIDialogs.showDialog( UIDialogs.showDialog(
context, R.drawable.ic_security, "Authentication", e.message, null, 0, UIDialogs.Action("Cancel", {}), UIDialogs.Action("Login", { context, R.drawable.ic_security, "Authentication", e.message, null, 0, UIDialogs.Action("Cancel", {}), UIDialogs.Action("Login", {
val id = e.config.let { if (it is SourcePluginConfig) it.id else null } val id = e.config.let { if (it is SourcePluginConfig) it.id else null }
val didLogin = val didLogin =
if (id == null) false else StatePlugins.instance.loginPlugin(context, id) { if (id == null) false else StatePlugins.instance.loginPlugin(context, id) {
loadVideo(url) loadVideo(url)
} }
if (!didLogin) UIDialogs.showDialogOk(context, R.drawable.ic_error_pred, "Failed to login") if (!didLogin) UIDialogs.showDialogOk(context, R.drawable.ic_error_pred, "Failed to login")
}, UIDialogs.ActionStyle.PRIMARY) }, UIDialogs.ActionStyle.PRIMARY)
) )
}.exception<ContentNotAvailableYetException> { }.exception<ContentNotAvailableYetException> {
Logger.w(TAG, "exception<ContentNotAvailableYetException>", it) Logger.w(TAG, "exception<ContentNotAvailableYetException>", it)
@ -924,7 +923,7 @@ class ShortView : FrameLayout {
const val TAG = "VideoDetailView" const val TAG = "VideoDetailView"
} }
class CommentsModalBottomSheet() : BottomSheetDialogFragment() { class CommentsModalBottomSheet : BottomSheetDialogFragment() {
var mainFragment: MainFragment? = null var mainFragment: MainFragment? = null
private lateinit var containerContent: FrameLayout private lateinit var containerContent: FrameLayout
@ -968,7 +967,7 @@ class ShortView : FrameLayout {
private lateinit var behavior: BottomSheetBehavior<FrameLayout> private lateinit var behavior: BottomSheetBehavior<FrameLayout>
private val _taskLoadPolycentricProfile = private val _taskLoadPolycentricProfile =
TaskHandler<PlatformID, PolycentricProfile?>(StateApp.instance.scopeGetter, { ApiMethods.getPolycentricProfileByClaim(ApiMethods.SERVER, ApiMethods.FUTO_TRUST_ROOT, it.claimFieldType.toLong(), it.claimType.toLong(), it.value!!) }).success { it -> setPolycentricProfile(it, animate = true) } TaskHandler<PlatformID, PolycentricProfile?>(StateApp.instance.scopeGetter, { ApiMethods.getPolycentricProfileByClaim(ApiMethods.SERVER, ApiMethods.FUTO_TRUST_ROOT, it.claimFieldType.toLong(), it.claimType.toLong(), it.value!!) }).success { setPolycentricProfile(it, animate = true) }
.exception<Throwable> { .exception<Throwable> {
Logger.w(TAG, "Failed to load claims.", it) Logger.w(TAG, "Failed to load claims.", it)
} }
@ -1024,7 +1023,7 @@ class ShortView : FrameLayout {
val id = c.author.id.value val id = c.author.id.value
Logger.i(TAG, "onAuthorClick: $id") Logger.i(TAG, "onAuthorClick: $id")
if (id != null && id.startsWith("polycentric://") == true) { if (id != null && id.startsWith("polycentric://")) {
val navUrl = "https://harbor.social/" + id.substring("polycentric://".length) val navUrl = "https://harbor.social/" + id.substring("polycentric://".length)
mainFragment!!.startActivity(Intent(Intent.ACTION_VIEW, navUrl.toUri())) mainFragment!!.startActivity(Intent(Intent.ACTION_VIEW, navUrl.toUri()))
} }
@ -1229,15 +1228,21 @@ class ShortView : FrameLayout {
buttonPlatform.setTextColor(resources.getColor(if (index == 1) R.color.white else R.color.gray_ac, null)) buttonPlatform.setTextColor(resources.getColor(if (index == 1) R.color.white else R.color.gray_ac, null))
buttonPolycentric.setTextColor(resources.getColor(if (index == 0) R.color.white else R.color.gray_ac, null)) buttonPolycentric.setTextColor(resources.getColor(if (index == 0) R.color.white else R.color.gray_ac, null))
if (index == null) { when (index) {
addCommentView.visibility = GONE null -> {
commentsList.clear() addCommentView.visibility = GONE
} else if (index == 0) { commentsList.clear()
addCommentView.visibility = VISIBLE }
fetchPolycentricComments()
} else if (index == 1) { 0 -> {
addCommentView.visibility = GONE addCommentView.visibility = VISIBLE
fetchComments() fetchPolycentricComments()
}
1 -> {
addCommentView.visibility = GONE
fetchComments()
}
} }
} }
@ -1252,7 +1257,7 @@ class ShortView : FrameLayout {
Logger.i(TAG, "fetchPolycentricComments") Logger.i(TAG, "fetchPolycentricComments")
val video = video val video = video
val idValue = video.id.value val idValue = video.id.value
if (video.url.isEmpty() != false) { if (video.url.isEmpty()) {
Logger.w(TAG, "Failed to fetch polycentric comments because url was null") Logger.w(TAG, "Failed to fetch polycentric comments because url was null")
commentsList.clear() commentsList.clear()
return return

View file

@ -31,8 +31,19 @@ class ShortsFragment : MainFragment() {
private var loadPagerTask: TaskHandler<ShortsFragment, IPager<IPlatformVideo>>? = null private var loadPagerTask: TaskHandler<ShortsFragment, IPager<IPlatformVideo>>? = null
private var nextPageTask: TaskHandler<ShortsFragment, List<IPlatformVideo>>? = null private var nextPageTask: TaskHandler<ShortsFragment, List<IPlatformVideo>>? = null
private var shortsPager: IPager<IPlatformVideo>? = null private var mainShortsPager: IPager<IPlatformVideo>? = null
private val videos: MutableList<IPlatformVideo> = mutableListOf() private val mainShorts: MutableList<IPlatformVideo> = mutableListOf()
// the pager to call next on
private var currentShortsPager: IPager<IPlatformVideo>? = null
// the shorts array bound to the ViewPager2 adapter
private val currentShorts: MutableList<IPlatformVideo> = mutableListOf()
private var channelShortsPager: IPager<IPlatformVideo>? = null
private val channelShorts: MutableList<IPlatformVideo> = mutableListOf()
val isChannelShortsMode: Boolean
get() = channelShortsPager != null
private var viewPager: ViewPager2? = null private var viewPager: ViewPager2? = null
private lateinit var overlayLoading: FrameLayout private lateinit var overlayLoading: FrameLayout
@ -44,6 +55,47 @@ class ShortsFragment : MainFragment() {
loadPager() loadPager()
} }
// we just completely reset the data structure so we want to tell the adapter that
@SuppressLint("NotifyDataSetChanged")
override fun onShown(parameter: Any?, isBack: Boolean) {
super.onShown(parameter, isBack)
if (parameter is Triple<*, *, *>) {
setLoading(false)
channelShorts.clear()
@Suppress("UNCHECKED_CAST") // TODO replace with a strongly typed parameter
channelShorts.addAll(parameter.third as ArrayList<IPlatformVideo>)
@Suppress("UNCHECKED_CAST") // TODO replace with a strongly typed parameter
channelShortsPager = parameter.second as IPager<IPlatformVideo>
currentShorts.clear()
currentShorts.addAll(channelShorts)
currentShortsPager = channelShortsPager
viewPager?.adapter?.notifyDataSetChanged()
viewPager?.post {
viewPager?.currentItem = channelShorts.indexOfFirst {
return@indexOfFirst (parameter.first as IPlatformVideo).id == it.id
}
}
} else if (isChannelShortsMode) {
channelShortsPager = null
channelShorts.clear()
currentShorts.clear()
if (loadPagerTask == null) {
currentShorts.addAll(mainShorts)
currentShortsPager = mainShortsPager
} else {
setLoading(true)
}
viewPager?.adapter?.notifyDataSetChanged()
viewPager?.currentItem = 0
}
}
override fun onCreateMainView( override fun onCreateMainView(
inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?
): View { ): View {
@ -62,8 +114,8 @@ class ShortsFragment : MainFragment() {
Logger.i(TAG, "Creating adapter") Logger.i(TAG, "Creating adapter")
val customViewAdapter = val customViewAdapter =
CustomViewAdapter(videos, layoutInflater, this@ShortsFragment, overlayQualityContainer) { CustomViewAdapter(currentShorts, layoutInflater, this@ShortsFragment, overlayQualityContainer) {
if (!shortsPager!!.hasMorePages()) { if (!currentShortsPager!!.hasMorePages()) {
return@CustomViewAdapter return@CustomViewAdapter
} }
nextPage() nextPage()
@ -81,19 +133,16 @@ class ShortsFragment : MainFragment() {
this.customViewAdapter = customViewAdapter this.customViewAdapter = customViewAdapter
if (loadPagerTask == null && videos.isEmpty()) { if (loadPagerTask == null && currentShorts.isEmpty()) {
loadPager() loadPager()
loadPagerTask!!.success { loadPagerTask!!.success {
applyData() setLoading(false)
} }
} else { } else {
applyData() setLoading(false)
} }
}
private fun applyData() {
val viewPager = viewPager!!
viewPager.registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() { viewPager.registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() {
fun play(adapter: CustomViewAdapter, position: Int) { fun play(adapter: CustomViewAdapter, position: Int) {
val recycler = (viewPager.getChildAt(0) as RecyclerView) val recycler = (viewPager.getChildAt(0) as RecyclerView)
@ -126,17 +175,13 @@ class ShortsFragment : MainFragment() {
super.onPageScrollStateChanged(state) super.onPageScrollStateChanged(state)
if (state == ViewPager2.SCROLL_STATE_IDLE) { if (state == ViewPager2.SCROLL_STATE_IDLE) {
val adapter = (viewPager.adapter as CustomViewAdapter) val adapter = (viewPager.adapter as CustomViewAdapter)
val position = adapter.newPosition val position = adapter.newPosition ?: return
if (position == null) {
return
}
adapter.newPosition = null adapter.newPosition = null
play(adapter, position) play(adapter, position)
} }
} }
}) })
setLoading(false)
} }
private fun nextPage() { private fun nextPage() {
@ -144,12 +189,17 @@ class ShortsFragment : MainFragment() {
val nextPageTask = val nextPageTask =
TaskHandler<ShortsFragment, List<IPlatformVideo>>(StateApp.instance.scopeGetter, { TaskHandler<ShortsFragment, List<IPlatformVideo>>(StateApp.instance.scopeGetter, {
shortsPager!!.nextPage() currentShortsPager!!.nextPage()
return@TaskHandler shortsPager!!.getResults() return@TaskHandler currentShortsPager!!.getResults()
}).success { newVideos -> }).success { newVideos ->
val prevCount = customViewAdapter!!.itemCount val prevCount = customViewAdapter!!.itemCount
videos.addAll(newVideos) currentShorts.addAll(newVideos)
if (isChannelShortsMode) {
channelShorts.addAll(newVideos)
} else {
mainShorts.addAll(newVideos)
}
customViewAdapter!!.notifyItemRangeInserted(prevCount, newVideos.size) customViewAdapter!!.notifyItemRangeInserted(prevCount, newVideos.size)
nextPageTask = null nextPageTask = null
} }
@ -170,13 +220,19 @@ class ShortsFragment : MainFragment() {
return@TaskHandler pager return@TaskHandler pager
}).success { pager -> }).success { pager ->
videos.clear() mainShorts.clear()
videos.addAll(pager.getResults()) mainShorts.addAll(pager.getResults())
shortsPager = pager mainShortsPager = pager
// if the view pager exists go back to the beginning if (!isChannelShortsMode) {
viewPager?.adapter?.notifyDataSetChanged() currentShorts.clear()
viewPager?.currentItem = 0 currentShorts.addAll(mainShorts)
currentShortsPager = pager
// if the view pager exists go back to the beginning
viewPager?.adapter?.notifyDataSetChanged()
viewPager?.currentItem = 0
}
loadPagerTask = null loadPagerTask = null
}.exception<Throwable> { err -> }.exception<Throwable> { err ->

View file

@ -9,8 +9,10 @@ import com.futo.platformplayer.api.media.models.ResultCapabilities
import com.futo.platformplayer.api.media.models.channels.IPlatformChannel import com.futo.platformplayer.api.media.models.channels.IPlatformChannel
import com.futo.platformplayer.api.media.models.contents.ContentType import com.futo.platformplayer.api.media.models.contents.ContentType
import com.futo.platformplayer.api.media.models.contents.IPlatformContent import com.futo.platformplayer.api.media.models.contents.IPlatformContent
import com.futo.platformplayer.api.media.structures.IPager
import com.futo.platformplayer.constructs.Event1 import com.futo.platformplayer.constructs.Event1
import com.futo.platformplayer.constructs.Event2 import com.futo.platformplayer.constructs.Event2
import com.futo.platformplayer.constructs.Event3
import com.futo.platformplayer.fragment.channel.tab.ChannelAboutFragment import com.futo.platformplayer.fragment.channel.tab.ChannelAboutFragment
import com.futo.platformplayer.fragment.channel.tab.ChannelContentsFragment import com.futo.platformplayer.fragment.channel.tab.ChannelContentsFragment
import com.futo.platformplayer.fragment.channel.tab.ChannelListFragment import com.futo.platformplayer.fragment.channel.tab.ChannelListFragment
@ -38,6 +40,7 @@ class ChannelViewPagerAdapter(fragmentManager: FragmentManager, lifecycle: Lifec
val onContentUrlClicked = Event2<String, ContentType>() val onContentUrlClicked = Event2<String, ContentType>()
val onUrlClicked = Event1<String>() val onUrlClicked = Event1<String>()
val onContentClicked = Event2<IPlatformContent, Long>() val onContentClicked = Event2<IPlatformContent, Long>()
val onShortClicked = Event3<IPlatformContent, Long, Pair<IPager<IPlatformContent>, ArrayList<IPlatformContent>>?>()
val onChannelClicked = Event1<PlatformAuthorLink>() val onChannelClicked = Event1<PlatformAuthorLink>()
val onAddToClicked = Event1<IPlatformContent>() val onAddToClicked = Event1<IPlatformContent>()
val onAddToQueueClicked = Event1<IPlatformContent>() val onAddToQueueClicked = Event1<IPlatformContent>()
@ -81,7 +84,9 @@ class ChannelViewPagerAdapter(fragmentManager: FragmentManager, lifecycle: Lifec
when (_tabs[position]) { when (_tabs[position]) {
ChannelTab.VIDEOS -> { ChannelTab.VIDEOS -> {
fragment = ChannelContentsFragment.newInstance().apply { fragment = ChannelContentsFragment.newInstance().apply {
onContentClicked.subscribe(this@ChannelViewPagerAdapter.onContentClicked::emit) onContentClicked.subscribe { video, num, _ ->
this@ChannelViewPagerAdapter.onContentClicked.emit(video, num)
}
onContentUrlClicked.subscribe(this@ChannelViewPagerAdapter.onContentUrlClicked::emit) onContentUrlClicked.subscribe(this@ChannelViewPagerAdapter.onContentUrlClicked::emit)
onUrlClicked.subscribe(this@ChannelViewPagerAdapter.onUrlClicked::emit) onUrlClicked.subscribe(this@ChannelViewPagerAdapter.onUrlClicked::emit)
onChannelClicked.subscribe(this@ChannelViewPagerAdapter.onChannelClicked::emit) onChannelClicked.subscribe(this@ChannelViewPagerAdapter.onChannelClicked::emit)
@ -94,7 +99,7 @@ class ChannelViewPagerAdapter(fragmentManager: FragmentManager, lifecycle: Lifec
ChannelTab.SHORTS -> { ChannelTab.SHORTS -> {
fragment = ChannelContentsFragment.newInstance(ResultCapabilities.TYPE_SHORTS).apply { fragment = ChannelContentsFragment.newInstance(ResultCapabilities.TYPE_SHORTS).apply {
onContentClicked.subscribe(this@ChannelViewPagerAdapter.onContentClicked::emit) onContentClicked.subscribe(this@ChannelViewPagerAdapter.onShortClicked::emit)
onContentUrlClicked.subscribe(this@ChannelViewPagerAdapter.onContentUrlClicked::emit) onContentUrlClicked.subscribe(this@ChannelViewPagerAdapter.onContentUrlClicked::emit)
onUrlClicked.subscribe(this@ChannelViewPagerAdapter.onUrlClicked::emit) onUrlClicked.subscribe(this@ChannelViewPagerAdapter.onUrlClicked::emit)
onChannelClicked.subscribe(this@ChannelViewPagerAdapter.onChannelClicked::emit) onChannelClicked.subscribe(this@ChannelViewPagerAdapter.onChannelClicked::emit)