From a82151517578be81bd4fb8b503983ea7f2ece9c6 Mon Sep 17 00:00:00 2001 From: Bnyro Date: Sun, 5 Jun 2022 15:42:51 +0200 Subject: [PATCH] codebase --- .../libretube/adapters/CommentsAdapter.kt | 53 ++++++++- .../libretube/adapters/RepliesAdapter.kt | 79 ++++++++++++++ .../libretube/fragments/PlayerFragment.kt | 2 +- app/src/main/res/layout/comments_row.xml | 13 +++ app/src/main/res/layout/replies_row.xml | 101 ++++++++++++++++++ 5 files changed, 245 insertions(+), 3 deletions(-) create mode 100644 app/src/main/java/com/github/libretube/adapters/RepliesAdapter.kt create mode 100644 app/src/main/res/layout/replies_row.xml diff --git a/app/src/main/java/com/github/libretube/adapters/CommentsAdapter.kt b/app/src/main/java/com/github/libretube/adapters/CommentsAdapter.kt index f2d75cd99..e35984299 100644 --- a/app/src/main/java/com/github/libretube/adapters/CommentsAdapter.kt +++ b/app/src/main/java/com/github/libretube/adapters/CommentsAdapter.kt @@ -1,5 +1,6 @@ package com.github.libretube.adapters +import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -12,10 +13,24 @@ import com.github.libretube.MainActivity import com.github.libretube.R import com.github.libretube.formatShort import com.github.libretube.obj.Comment +import com.github.libretube.obj.CommentsPage +import com.github.libretube.util.RetrofitInstance import com.squareup.picasso.Picasso +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import retrofit2.HttpException +import java.io.IOException -class CommentsAdapter(private val comments: MutableList) : - RecyclerView.Adapter() { +class CommentsAdapter( + private val videoId: String, + private val comments: MutableList +) : RecyclerView.Adapter() { + + private val TAG = "CommentsAdapter" + private var isLoading = false + private var nextPage = "" + private lateinit var repliesRecView: RecyclerView fun updateItems(newItems: List) { var commentsSize = comments.size @@ -61,11 +76,45 @@ class CommentsAdapter(private val comments: MutableList) : } catch (e: Exception) { } } + repliesRecView = holder.v.findViewById(R.id.replies_recView) + // repliesRecView.layoutManager = LinearLayoutManager(holder.v.context) + holder.v.setOnClickListener { + if (repliesRecView.visibility == View.GONE) { + repliesRecView.visibility = View.VISIBLE + nextPage = comments[position].repliesPage!! + repliesRecView.adapter = CommentsAdapter(videoId, comments) + // fetchReplies() + } else { + repliesRecView.visibility = View.GONE + } + } } override fun getItemCount(): Int { return comments.size } + + private fun fetchReplies() { + CoroutineScope(Dispatchers.IO).launch { + if (!isLoading && nextPage != null) { + var response = CommentsPage() + isLoading = true + try { + response = RetrofitInstance.api.getCommentsNextPage(videoId!!, nextPage!!) + } catch (e: IOException) { + println(e) + Log.e(TAG, "IOException, you might not have internet connection") + } catch (e: HttpException) { + Log.e(TAG, "HttpException, unexpected response," + e.response()) + } + nextPage = if (response.nextpage != null) response.nextpage!! + else "" + // commentsAdapter?.updateItems(response.comments) + repliesRecView.adapter = RepliesAdapter(response.comments) + isLoading = false + } + } + } } class CommentsViewHolder(val v: View) : RecyclerView.ViewHolder(v) { diff --git a/app/src/main/java/com/github/libretube/adapters/RepliesAdapter.kt b/app/src/main/java/com/github/libretube/adapters/RepliesAdapter.kt new file mode 100644 index 000000000..261c890b3 --- /dev/null +++ b/app/src/main/java/com/github/libretube/adapters/RepliesAdapter.kt @@ -0,0 +1,79 @@ +package com.github.libretube.adapters + +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.TextView +import androidx.constraintlayout.motion.widget.MotionLayout +import androidx.core.os.bundleOf +import androidx.recyclerview.widget.RecyclerView +import com.github.libretube.MainActivity +import com.github.libretube.R +import com.github.libretube.formatShort +import com.github.libretube.obj.Comment +import com.squareup.picasso.Picasso + +class RepliesAdapter( + private val replies: MutableList +) : RecyclerView.Adapter() { + + private val TAG = "RepliesAdapter" + private var isLoading = false + private var nextPage = "" + + fun updateItems(newItems: List) { + var repliesSize = replies.size + replies.addAll(newItems) + notifyItemRangeInserted(repliesSize, newItems.size) + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RepliesViewHolder { + var repliesView = + LayoutInflater.from(parent.context).inflate(R.layout.replies_row, parent, false) + return RepliesViewHolder(repliesView) + } + + override fun onBindViewHolder(holder: RepliesViewHolder, position: Int) { + holder.v.findViewById(R.id.comment_infos).text = + replies[position].author.toString() + + " • " + replies[position].commentedTime.toString() + holder.v.findViewById(R.id.comment_text).text = + replies[position].commentText.toString() + val channelImage = holder.v.findViewById(R.id.commentor_image) + Picasso.get().load(replies[position].thumbnail).fit().centerCrop().into(channelImage) + holder.v.findViewById(R.id.likes_textView).text = + replies[position].likeCount?.toLong().formatShort() + if (replies[position].verified == true) { + holder.v.findViewById(R.id.verified_imageView).visibility = View.VISIBLE + } + if (replies[position].pinned == true) { + holder.v.findViewById(R.id.pinned_imageView).visibility = View.VISIBLE + } + if (replies[position].hearted == true) { + holder.v.findViewById(R.id.hearted_imageView).visibility = View.VISIBLE + } + channelImage.setOnClickListener { + val activity = holder.v.context as MainActivity + val bundle = bundleOf("channel_id" to replies[position].commentorUrl) + activity.navController.navigate(R.id.channel, bundle) + try { + val mainMotionLayout = activity.findViewById(R.id.mainMotionLayout) + if (mainMotionLayout.progress == 0.toFloat()) { + mainMotionLayout.transitionToEnd() + activity.findViewById(R.id.playerMotionLayout).transitionToEnd() + } + } catch (e: Exception) { + } + } + } + + override fun getItemCount(): Int { + return replies.size + } +} + +class RepliesViewHolder(val v: View) : RecyclerView.ViewHolder(v) { + init { + } +} diff --git a/app/src/main/java/com/github/libretube/fragments/PlayerFragment.kt b/app/src/main/java/com/github/libretube/fragments/PlayerFragment.kt index 8a75223aa..b4093d67a 100644 --- a/app/src/main/java/com/github/libretube/fragments/PlayerFragment.kt +++ b/app/src/main/java/com/github/libretube/fragments/PlayerFragment.kt @@ -943,7 +943,7 @@ class PlayerFragment : Fragment() { Toast.makeText(context, R.string.server_error, Toast.LENGTH_SHORT).show() return@launchWhenCreated } - commentsAdapter = CommentsAdapter(commentsResponse.comments) + commentsAdapter = CommentsAdapter(videoId!!, commentsResponse.comments) commentsRecView.adapter = commentsAdapter nextPage = commentsResponse.nextpage commentsLoaded = true diff --git a/app/src/main/res/layout/comments_row.xml b/app/src/main/res/layout/comments_row.xml index 2c8f21637..97b0471f9 100644 --- a/app/src/main/res/layout/comments_row.xml +++ b/app/src/main/res/layout/comments_row.xml @@ -5,6 +5,10 @@ android:background="?android:attr/selectableItemBackground" android:layout_height="wrap_content"> + + + diff --git a/app/src/main/res/layout/replies_row.xml b/app/src/main/res/layout/replies_row.xml new file mode 100644 index 000000000..2c8f21637 --- /dev/null +++ b/app/src/main/res/layout/replies_row.xml @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +