From 42760f76c21a1a588901afea4d3a733ec35deeaa Mon Sep 17 00:00:00 2001 From: rimthekid Date: Fri, 4 Feb 2022 22:55:05 +0400 Subject: [PATCH] channel fragment --- .../com/github/libretube/ChannelFragment.kt | 82 +++++++++++++++++++ .../main/java/com/github/libretube/Home.kt | 4 +- .../java/com/github/libretube/PipedApi.kt | 4 + .../com/github/libretube/PlayerFragment.kt | 12 ++- .../com/github/libretube/SearchFragment.kt | 4 +- .../libretube/adapters/SearchAdapter.kt | 7 ++ .../libretube/adapters/TrendingAdapter.kt | 7 +- .../com/github/libretube/obj/Channel.java | 23 ------ .../java/com/github/libretube/obj/Channel.kt | 13 +++ app/src/main/res/layout/fragment_channel.xml | 67 +++++++++++++++ app/src/main/res/layout/fragment_player.xml | 3 +- .../main/res/layout/playlist_search_row.xml | 71 ++++++++-------- app/src/main/res/layout/video_search_row.xml | 2 +- app/src/main/res/navigation/nav.xml | 9 ++ 14 files changed, 242 insertions(+), 66 deletions(-) create mode 100644 app/src/main/java/com/github/libretube/ChannelFragment.kt delete mode 100644 app/src/main/java/com/github/libretube/obj/Channel.java create mode 100644 app/src/main/java/com/github/libretube/obj/Channel.kt create mode 100644 app/src/main/res/layout/fragment_channel.xml diff --git a/app/src/main/java/com/github/libretube/ChannelFragment.kt b/app/src/main/java/com/github/libretube/ChannelFragment.kt new file mode 100644 index 000000000..f76c89203 --- /dev/null +++ b/app/src/main/java/com/github/libretube/ChannelFragment.kt @@ -0,0 +1,82 @@ +package com.github.libretube + +import android.os.Bundle +import android.util.Log +import androidx.fragment.app.Fragment +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.TextView +import androidx.lifecycle.lifecycleScope +import com.github.libretube.adapters.TrendingAdapter +import com.squareup.picasso.Picasso +import retrofit2.HttpException +import java.io.IOException + +// TODO: Rename parameter arguments, choose names that match +// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER + +/** + * A simple [Fragment] subclass. + * Use the [ChannelFragment.newInstance] factory method to + * create an instance of this fragment. + */ +class ChannelFragment : Fragment() { + // TODO: Rename and change types of parameters + private var channel_id: String? = null + private val TAG = "ChannelFragment" + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + arguments?.let { + channel_id = it.getString("channel_id") + } + } + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + // Inflate the layout for this fragment + return inflater.inflate(R.layout.fragment_channel, container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + channel_id = channel_id!!.replace("/channel/","") + view.findViewById(R.id.channel_name).text=channel_id + fetchChannel(view) + } + + private fun fetchChannel(view: View){ + fun run() { + lifecycleScope.launchWhenCreated { + val response = try { + RetrofitInstance.api.getChannel(channel_id!!) + }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") + return@launchWhenCreated + } + runOnUiThread { + view.findViewById(R.id.channel_name).text=response.name + view.findViewById(R.id.channel_subs).text=response.subscriberCount.videoViews() + " subscribers" + view.findViewById(R.id.channel_description).text=response.description + val bannerImage = view.findViewById(R.id.channel_banner) + val channelImage = view.findViewById(R.id.channel_image) + Picasso.get().load(response.bannerUrl).into(bannerImage) + Picasso.get().load(response.avatarUrl).into(channelImage) + } + } + } + run() + } + private fun Fragment?.runOnUiThread(action: () -> Unit) { + this ?: return + if (!isAdded) return // Fragment not attached to an Activity + activity?.runOnUiThread(action) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/github/libretube/Home.kt b/app/src/main/java/com/github/libretube/Home.kt index ef5acca3b..f4ee09582 100644 --- a/app/src/main/java/com/github/libretube/Home.kt +++ b/app/src/main/java/com/github/libretube/Home.kt @@ -21,7 +21,7 @@ import java.io.IOException // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER private const val ARG_PARAM1 = "param1" private const val ARG_PARAM2 = "param2" -const val TAG = "HomeFragment" + /** * A simple [Fragment] subclass. * Use the [Home.newInstance] factory method to @@ -31,7 +31,7 @@ class Home : Fragment() { // TODO: Rename and change types of parameters private var param1: String? = null private var param2: String? = null - + private val TAG = "HomeFragment" override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) arguments?.let { diff --git a/app/src/main/java/com/github/libretube/PipedApi.kt b/app/src/main/java/com/github/libretube/PipedApi.kt index fe42fd2e3..6e88aa655 100644 --- a/app/src/main/java/com/github/libretube/PipedApi.kt +++ b/app/src/main/java/com/github/libretube/PipedApi.kt @@ -1,5 +1,6 @@ package com.github.libretube +import com.github.libretube.obj.Channel import retrofit2.http.GET import retrofit2.http.Path import retrofit2.http.Query @@ -22,4 +23,7 @@ interface PipedApi { @GET("suggestions") suspend fun getSuggestions(@Query("query") query: String): List + + @GET("channel/{channelId}") + suspend fun getChannel(@Path("channelId") channelId: String): Channel } \ No newline at end of file diff --git a/app/src/main/java/com/github/libretube/PlayerFragment.kt b/app/src/main/java/com/github/libretube/PlayerFragment.kt index 70e194774..120647201 100644 --- a/app/src/main/java/com/github/libretube/PlayerFragment.kt +++ b/app/src/main/java/com/github/libretube/PlayerFragment.kt @@ -51,6 +51,7 @@ import android.text.Html import android.util.Log import androidx.appcompat.app.AlertDialog import androidx.constraintlayout.widget.ConstraintLayout +import androidx.core.os.bundleOf import androidx.core.text.PrecomputedTextCompat import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.GridLayoutManager @@ -88,6 +89,7 @@ private const val ARG_PARAM2 = "param2" */ class PlayerFragment : Fragment() { // TODO: Rename and change types of parameters + private val TAG = "PlayerFragment" private var videoId: String? = null private var param2: String? = null private var lastProgress: Float = 0.toFloat() @@ -267,7 +269,7 @@ class PlayerFragment : Fragment() { lifecycleScope.launchWhenCreated { val response = try { RetrofitInstance.api.getStreams(videoId!!) - }catch(e: IOException) { + } catch(e: IOException) { println(e) Log.e(TAG, "IOException, you might not have internet connection") return@launchWhenCreated @@ -383,6 +385,14 @@ class PlayerFragment : Fragment() { val channelImage = view.findViewById(R.id.player_channelImage) Picasso.get().load(response.uploaderAvatar).into(channelImage) view.findViewById(R.id.player_channelName).text=response.uploader + view.findViewById(R.id.player_channel).setOnClickListener { + + val activity = view.context as MainActivity + val bundle = bundleOf("channel_id" to response.uploaderUrl) + activity.navController.navigate(R.id.channel,bundle) + activity.findViewById(R.id.mainMotionLayout).transitionToEnd() + view.findViewById(R.id.playerMotionLayout).transitionToEnd() + } } } diff --git a/app/src/main/java/com/github/libretube/SearchFragment.kt b/app/src/main/java/com/github/libretube/SearchFragment.kt index 8144f4bd9..e980c4100 100644 --- a/app/src/main/java/com/github/libretube/SearchFragment.kt +++ b/app/src/main/java/com/github/libretube/SearchFragment.kt @@ -32,6 +32,8 @@ private const val ARG_PARAM2 = "param2" */ class SearchFragment : Fragment() { // TODO: Rename and change types of parameters + private val TAG = "SearchFragment" + private var param1: String? = null private var param2: String? = null @@ -96,7 +98,7 @@ class SearchFragment : Fragment() { Log.e(TAG, "HttpException, unexpected response") return@launchWhenCreated } - val adapter = ArrayAdapter(context!!, android.R.layout.simple_list_item_1, response) + val adapter = ArrayAdapter(requireContext(), android.R.layout.simple_list_item_1, response) autoTextView.setAdapter(adapter) } } diff --git a/app/src/main/java/com/github/libretube/adapters/SearchAdapter.kt b/app/src/main/java/com/github/libretube/adapters/SearchAdapter.kt index 153db64ba..e7adbae28 100644 --- a/app/src/main/java/com/github/libretube/adapters/SearchAdapter.kt +++ b/app/src/main/java/com/github/libretube/adapters/SearchAdapter.kt @@ -10,7 +10,9 @@ import android.widget.TextView import android.widget.VideoView import androidx.appcompat.app.AppCompatActivity import androidx.constraintlayout.widget.ConstraintLayout +import androidx.core.os.bundleOf import androidx.recyclerview.widget.RecyclerView +import com.github.libretube.MainActivity import com.squareup.picasso.Picasso import com.github.libretube.PlayerFragment import com.github.libretube.R @@ -83,6 +85,11 @@ class CustomViewHolder1(private val v: View): RecyclerView.ViewHolder(v){ channelName.text = item.name val channelViews = v.findViewById(R.id.search_views) channelViews.text = item.subscribers.videoViews() + "subscribers • "+ item.videos + " videos" + v.setOnClickListener { + val activity = v.context as MainActivity + val bundle = bundleOf("channel_id" to item.url) + activity.navController.navigate(R.id.channel,bundle) + } //todo sub button } private fun bindPlaylist(item: SearchItem) { diff --git a/app/src/main/java/com/github/libretube/adapters/TrendingAdapter.kt b/app/src/main/java/com/github/libretube/adapters/TrendingAdapter.kt index 10d0f7523..f3ffbc5e1 100644 --- a/app/src/main/java/com/github/libretube/adapters/TrendingAdapter.kt +++ b/app/src/main/java/com/github/libretube/adapters/TrendingAdapter.kt @@ -7,7 +7,9 @@ import android.view.ViewGroup import android.widget.ImageView import android.widget.TextView import androidx.appcompat.app.AppCompatActivity +import androidx.core.os.bundleOf import androidx.recyclerview.widget.RecyclerView +import com.github.libretube.MainActivity import com.squareup.picasso.Picasso import com.github.libretube.PlayerFragment import com.github.libretube.R @@ -32,8 +34,9 @@ class TrendingAdapter(private val videoFeed: List): RecyclerView.Ada val thumbnailImage = holder.v.findViewById(R.id.thumbnail) val channelImage = holder.v.findViewById(R.id.channel_image) channelImage.setOnClickListener{ - println("channel clicked") - //TODO + val activity = holder.v.context as MainActivity + val bundle = bundleOf("channel_id" to trending.uploaderUrl) + activity.navController.navigate(R.id.channel, bundle) } Picasso.get().load(trending.thumbnail).into(thumbnailImage) Picasso.get().load(trending.uploaderAvatar).into(channelImage) diff --git a/app/src/main/java/com/github/libretube/obj/Channel.java b/app/src/main/java/com/github/libretube/obj/Channel.java deleted file mode 100644 index 03fc61bb4..000000000 --- a/app/src/main/java/com/github/libretube/obj/Channel.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.github.libretube.obj; - -import java.util.List; - -public class Channel { - public String id, name, avatarUrl, bannerUrl, description, nextpage; - public long subscriberCount; - public boolean verified; - public List relatedStreams; - - public Channel(String id, String name, String avatarUrl, String bannerUrl, String description, long subscriberCount, - boolean verified, String nextpage, List relatedStreams) { - this.id = id; - this.name = name; - this.avatarUrl = avatarUrl; - this.bannerUrl = bannerUrl; - this.description = description; - this.subscriberCount = subscriberCount; - this.verified = verified; - this.nextpage = nextpage; - this.relatedStreams = relatedStreams; - } -} diff --git a/app/src/main/java/com/github/libretube/obj/Channel.kt b/app/src/main/java/com/github/libretube/obj/Channel.kt new file mode 100644 index 000000000..92db3ecfe --- /dev/null +++ b/app/src/main/java/com/github/libretube/obj/Channel.kt @@ -0,0 +1,13 @@ +package com.github.libretube.obj + +data class Channel( + var id: String? = null, + var name: String? = null, + var avatarUrl: String? = null, + var bannerUrl: String? = null, + var description: String? = null, + var nextpage: String? = null, + var subscriberCount: Long = 0, + var verified: Boolean = false, + var relatedStreams: List? = null +) diff --git a/app/src/main/res/layout/fragment_channel.xml b/app/src/main/res/layout/fragment_channel.xml new file mode 100644 index 000000000..8ed696fc9 --- /dev/null +++ b/app/src/main/res/layout/fragment_channel.xml @@ -0,0 +1,67 @@ + + + + + + + +