diff --git a/app/src/main/java/com/github/libretube/ChannelFragment.kt b/app/src/main/java/com/github/libretube/ChannelFragment.kt index 569cd6602..62d042322 100644 --- a/app/src/main/java/com/github/libretube/ChannelFragment.kt +++ b/app/src/main/java/com/github/libretube/ChannelFragment.kt @@ -1,5 +1,7 @@ package com.github.libretube +import android.net.Uri.encode +import android.os.Build import android.os.Bundle import android.util.Log import androidx.fragment.app.Fragment @@ -7,7 +9,9 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.ImageView +import android.widget.ScrollView import android.widget.TextView +import androidx.annotation.RequiresApi import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.RecyclerView @@ -16,6 +20,8 @@ import com.github.libretube.adapters.TrendingAdapter import com.squareup.picasso.Picasso import retrofit2.HttpException import java.io.IOException +import java.net.URLEncoder +import java.nio.charset.StandardCharsets // TODO: Rename parameter arguments, choose names that match // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER @@ -30,6 +36,8 @@ class ChannelFragment : Fragment() { private var channel_id: String? = null private val TAG = "ChannelFragment" lateinit var recyclerView: RecyclerView + lateinit var nextPage: String + lateinit var channelAdapter: ChannelAdapter override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -52,7 +60,9 @@ class ChannelFragment : Fragment() { view.findViewById(R.id.channel_name).text=channel_id recyclerView = view.findViewById(R.id.channel_recView) recyclerView.layoutManager = GridLayoutManager(view.context, 1) + fetchChannel(view) + } private fun fetchChannel(view: View){ @@ -68,6 +78,7 @@ class ChannelFragment : Fragment() { Log.e(TAG, "HttpException, unexpected response") return@launchWhenCreated } + nextPage = response.nextpage!! runOnUiThread { view.findViewById(R.id.channel_name).text=response.name view.findViewById(R.id.channel_subs).text=response.subscriberCount.videoViews() + " subscribers" @@ -76,7 +87,44 @@ class ChannelFragment : Fragment() { val channelImage = view.findViewById(R.id.channel_image) Picasso.get().load(response.bannerUrl).into(bannerImage) Picasso.get().load(response.avatarUrl).into(channelImage) - recyclerView.adapter = ChannelAdapter(response.relatedStreams!!) + channelAdapter = ChannelAdapter(response.relatedStreams!!.toMutableList()) + recyclerView.adapter = channelAdapter + + val scrollView = view.findViewById(R.id.channel_scrollView) + scrollView.viewTreeObserver + .addOnScrollChangedListener { + if (scrollView.getChildAt(0).bottom + == (scrollView.height + scrollView.scrollY)) { + //scroll view is at bottom + println("suck a dick: "+channel_id+"?nextpage="+nextPage) + fetchNextPage() + + } else { + //scroll view is not at bottom + } + } + } + } + } + run() + } + private fun fetchNextPage(){ + fun run() { + lifecycleScope.launchWhenCreated { + val response = try { + RetrofitInstance.api.getChannelNextPage(channel_id!!,nextPage) + } catch (e: IOException) { + println(e) + Log.e(TAG, "IOException, you might not have internet connection") + return@launchWhenCreated + } catch (e: HttpException) { + Log.e(TAG, "HttpException, unexpected response,"+e.response()) + return@launchWhenCreated + } + nextPage = response.nextpage!! + runOnUiThread { + channelAdapter.updateItems(response.relatedStreams!!) + } } } diff --git a/app/src/main/java/com/github/libretube/PipedApi.kt b/app/src/main/java/com/github/libretube/PipedApi.kt index 6e88aa655..ea404b98e 100644 --- a/app/src/main/java/com/github/libretube/PipedApi.kt +++ b/app/src/main/java/com/github/libretube/PipedApi.kt @@ -26,4 +26,7 @@ interface PipedApi { @GET("channel/{channelId}") suspend fun getChannel(@Path("channelId") channelId: String): Channel + + @GET("nextpage/channel/{channelId}") + suspend fun getChannelNextPage(@Path("channelId") channelId: String, @Query("nextpage") nextPage: String): Channel } \ No newline at end of file diff --git a/app/src/main/java/com/github/libretube/adapters/ChannelAdapter.kt b/app/src/main/java/com/github/libretube/adapters/ChannelAdapter.kt index 170ff9f55..79f4bda15 100644 --- a/app/src/main/java/com/github/libretube/adapters/ChannelAdapter.kt +++ b/app/src/main/java/com/github/libretube/adapters/ChannelAdapter.kt @@ -16,10 +16,15 @@ import com.github.libretube.R import com.github.libretube.obj.StreamItem import com.github.libretube.videoViews -class ChannelAdapter(private val videoFeed: List): RecyclerView.Adapter() { +class ChannelAdapter(private val videoFeed: MutableList): RecyclerView.Adapter() { override fun getItemCount(): Int { return videoFeed.size } + fun updateItems(newItems: List){ + videoFeed.addAll(newItems) + println("suck another dick: "+newItems[0].title) + notifyDataSetChanged() + } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ChannelViewHolder { val layoutInflater = LayoutInflater.from(parent.context) diff --git a/app/src/main/java/com/github/libretube/obj/Playlist.kt b/app/src/main/java/com/github/libretube/obj/Playlist.kt index 495d63d88..f2fbc1690 100644 --- a/app/src/main/java/com/github/libretube/obj/Playlist.kt +++ b/app/src/main/java/com/github/libretube/obj/Playlist.kt @@ -9,5 +9,5 @@ data class Playlist( var uploaderUrl: String? = null, var uploaderAvatar: String? = null, var videos: Int = 0, - var relatedStreams: List? = null, + var relatedStreams: List? = null, ) diff --git a/app/src/main/res/layout/fragment_channel.xml b/app/src/main/res/layout/fragment_channel.xml index 8ed696fc9..f03596b74 100644 --- a/app/src/main/res/layout/fragment_channel.xml +++ b/app/src/main/res/layout/fragment_channel.xml @@ -4,7 +4,8 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" - tools:context=".ChannelFragment"> + tools:context=".ChannelFragment" + android:id="@+id/channel_scrollView">