Merge branch 'feature/threads' into 'master'
Feature/threads See merge request agosto182/p2play!16
This commit is contained in:
		| @@ -69,7 +69,7 @@ class LoginActivity : AppCompatActivity() { | |||||||
|                 "-2" -> { |                 "-2" -> { | ||||||
|                     // TODO: Start 2FA modal |                     // TODO: Start 2FA modal | ||||||
|                     runOnUiThread { |                     runOnUiThread { | ||||||
|                         val builder = AlertDialog.Builder(this) |                         val builder = AlertDialog.Builder(this, R.style.Widget_Material3_MaterialCalendar_Fullscreen) | ||||||
|                         val dialog = layoutInflater.inflate(R.layout.two_factor_dialog, null) |                         val dialog = layoutInflater.inflate(R.layout.two_factor_dialog, null) | ||||||
|  |  | ||||||
|                         val inputTwoFactor = dialog.findViewById<EditText>(R.id.twoFactorText) |                         val inputTwoFactor = dialog.findViewById<EditText>(R.id.twoFactorText) | ||||||
|   | |||||||
| @@ -368,6 +368,7 @@ class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelecte | |||||||
|             mini_player_title.text = PlaybackSingleton.video!!.name |             mini_player_title.text = PlaybackSingleton.video!!.name | ||||||
|             mini_player_author.text = PlaybackSingleton.video!!.username |             mini_player_author.text = PlaybackSingleton.video!!.username | ||||||
|             Picasso.get().load("https://${ManagerSingleton.url}${PlaybackSingleton.video!!.thumbUrl}").into(mini_player_image) |             Picasso.get().load("https://${ManagerSingleton.url}${PlaybackSingleton.video!!.thumbUrl}").into(mini_player_image) | ||||||
|  |             mini_play_pause.setImageResource(R.drawable.ic_pause_24) | ||||||
|             mini.visibility = View.VISIBLE |             mini.visibility = View.VISIBLE | ||||||
|         } else { |         } else { | ||||||
|             mini.visibility = View.GONE |             mini.visibility = View.GONE | ||||||
|   | |||||||
| @@ -28,6 +28,10 @@ import androidx.recyclerview.widget.LinearLayoutManager | |||||||
| import androidx.recyclerview.widget.RecyclerView | import androidx.recyclerview.widget.RecyclerView | ||||||
| import com.squareup.picasso.Picasso | import com.squareup.picasso.Picasso | ||||||
| import kotlinx.android.synthetic.main.activity_reproductor.* | import kotlinx.android.synthetic.main.activity_reproductor.* | ||||||
|  | import kotlinx.android.synthetic.main.comment_component.commentaryBtn | ||||||
|  | import kotlinx.android.synthetic.main.comment_component.commentaryLayout | ||||||
|  | import kotlinx.android.synthetic.main.comment_component.commentaryText | ||||||
|  | import kotlinx.android.synthetic.main.comment_component.userImgCom | ||||||
| import org.libre.agosto.p2play.adapters.CommentariesAdapter | import org.libre.agosto.p2play.adapters.CommentariesAdapter | ||||||
| import org.libre.agosto.p2play.ajax.Actions | import org.libre.agosto.p2play.ajax.Actions | ||||||
| import org.libre.agosto.p2play.ajax.Comments | import org.libre.agosto.p2play.ajax.Comments | ||||||
| @@ -275,7 +279,7 @@ class ReproductorActivity : AppCompatActivity() { | |||||||
|  |  | ||||||
|     private fun setDataComments(data: ArrayList<CommentaryModel>) { |     private fun setDataComments(data: ArrayList<CommentaryModel>) { | ||||||
|         // Set data for RecyclerView |         // Set data for RecyclerView | ||||||
|         viewAdapter = CommentariesAdapter(data) |         viewAdapter = CommentariesAdapter(data).setFragmentManager(supportFragmentManager) | ||||||
|  |  | ||||||
|         recyclerView = findViewById<RecyclerView>(R.id.listCommentaries).apply { |         recyclerView = findViewById<RecyclerView>(R.id.listCommentaries).apply { | ||||||
|             // use this setting to improve performance if you know that changes |             // use this setting to improve performance if you know that changes | ||||||
| @@ -330,10 +334,12 @@ class ReproductorActivity : AppCompatActivity() { | |||||||
|             if (ManagerSingleton.user.avatar != "") { |             if (ManagerSingleton.user.avatar != "") { | ||||||
|                 Picasso.get().load("https://" + ManagerSingleton.url + ManagerSingleton.user.avatar).into(userImgCom) |                 Picasso.get().load("https://" + ManagerSingleton.url + ManagerSingleton.user.avatar).into(userImgCom) | ||||||
|             } |             } | ||||||
|  |         } else { | ||||||
|  |             commentaryLayout.visibility = View.GONE | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     fun getDescription() { |     private fun getDescription() { | ||||||
|         AsyncTask.execute { |         AsyncTask.execute { | ||||||
|             val fullDescription = this.videos.fullDescription(this.video.id) |             val fullDescription = this.videos.fullDescription(this.video.id) | ||||||
|             runOnUiThread { |             runOnUiThread { | ||||||
|   | |||||||
| @@ -1,22 +1,35 @@ | |||||||
| package org.libre.agosto.p2play.adapters | package org.libre.agosto.p2play.adapters | ||||||
|  |  | ||||||
| import android.content.Context | import android.content.Context | ||||||
|  | import android.content.Intent | ||||||
|  | import android.os.Bundle | ||||||
| import android.text.Html | import android.text.Html | ||||||
| import android.view.LayoutInflater | import android.view.LayoutInflater | ||||||
| import android.view.View | import android.view.View | ||||||
| import android.view.ViewGroup | import android.view.ViewGroup | ||||||
| import android.widget.ImageView | import android.widget.ImageView | ||||||
| import android.widget.TextView | import android.widget.TextView | ||||||
|  | import androidx.fragment.app.FragmentManager | ||||||
|  | import androidx.fragment.app.FragmentTransaction | ||||||
| import androidx.recyclerview.widget.RecyclerView | import androidx.recyclerview.widget.RecyclerView | ||||||
| import com.squareup.picasso.Picasso | import com.squareup.picasso.Picasso | ||||||
| import org.libre.agosto.p2play.ManagerSingleton | import org.libre.agosto.p2play.ManagerSingleton | ||||||
| import org.libre.agosto.p2play.R | import org.libre.agosto.p2play.R | ||||||
|  | import org.libre.agosto.p2play.ajax.Comments | ||||||
|  | import org.libre.agosto.p2play.dialogs.ThreadDialog | ||||||
| import org.libre.agosto.p2play.models.CommentaryModel | import org.libre.agosto.p2play.models.CommentaryModel | ||||||
|  | import java.io.Serializable | ||||||
|  |  | ||||||
| @Suppress("DEPRECATION") |  | ||||||
| class CommentariesAdapter(private val myDataset: ArrayList<CommentaryModel>) : | class CommentariesAdapter(private val myDataset: ArrayList<CommentaryModel>) : | ||||||
|     RecyclerView.Adapter<CommentariesAdapter.ViewHolder>() { |     RecyclerView.Adapter<CommentariesAdapter.ViewHolder>() { | ||||||
|  |  | ||||||
|  |        private lateinit var fragmentManager: FragmentManager | ||||||
|  |  | ||||||
|  |        fun setFragmentManager (manager: FragmentManager): CommentariesAdapter { | ||||||
|  |            this.fragmentManager = manager | ||||||
|  |            return this | ||||||
|  |        } | ||||||
|  |  | ||||||
|     // Provide a reference to the views for each data item |     // Provide a reference to the views for each data item | ||||||
|     // Complex data items may need more than one view per item, and |     // Complex data items may need more than one view per item, and | ||||||
|     // you provide access to all the views for a data item in a view holder. |     // you provide access to all the views for a data item in a view holder. | ||||||
| @@ -25,6 +38,7 @@ class CommentariesAdapter(private val myDataset: ArrayList<CommentaryModel>) : | |||||||
|         val userImg: ImageView |         val userImg: ImageView | ||||||
|         val username: TextView |         val username: TextView | ||||||
|         val commentary: TextView |         val commentary: TextView | ||||||
|  |         val replyBtn: TextView | ||||||
|         val context: Context |         val context: Context | ||||||
|  |  | ||||||
|         init { |         init { | ||||||
| @@ -32,6 +46,7 @@ class CommentariesAdapter(private val myDataset: ArrayList<CommentaryModel>) : | |||||||
|             username = view.findViewById(R.id.userTxt) |             username = view.findViewById(R.id.userTxt) | ||||||
|             commentary = view.findViewById(R.id.userCommentary) |             commentary = view.findViewById(R.id.userCommentary) | ||||||
|             userImg = view.findViewById(R.id.userCommentImg) |             userImg = view.findViewById(R.id.userCommentImg) | ||||||
|  |             replyBtn = view.findViewById(R.id.replyBtn) | ||||||
|             context = view.context |             context = view.context | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| @@ -40,7 +55,7 @@ class CommentariesAdapter(private val myDataset: ArrayList<CommentaryModel>) : | |||||||
|     override fun onCreateViewHolder( |     override fun onCreateViewHolder( | ||||||
|         parent: ViewGroup, |         parent: ViewGroup, | ||||||
|         viewType: Int, |         viewType: Int, | ||||||
|     ): CommentariesAdapter.ViewHolder { |     ): ViewHolder { | ||||||
|         // create a new view |         // create a new view | ||||||
|         val view = LayoutInflater.from(parent.context) |         val view = LayoutInflater.from(parent.context) | ||||||
|             .inflate(R.layout.view_commentary, parent, false) as View |             .inflate(R.layout.view_commentary, parent, false) as View | ||||||
| @@ -66,6 +81,11 @@ class CommentariesAdapter(private val myDataset: ArrayList<CommentaryModel>) : | |||||||
|         } |         } | ||||||
|  |  | ||||||
|         holder.commentary.text = Html.fromHtml(myDataset[position].commentary) |         holder.commentary.text = Html.fromHtml(myDataset[position].commentary) | ||||||
|  |         holder.replyBtn.setOnClickListener { this.initRepliesDialog(myDataset[position]) } | ||||||
|  |  | ||||||
|  |         if (myDataset[position].replies > 0) { | ||||||
|  |             holder.replyBtn.text = holder.itemView.context.getString(R.string.see_replies, myDataset[position].replies) | ||||||
|  |         } | ||||||
|  |  | ||||||
|         // TODO: Support for view and account (is different than a video channel) |         // TODO: Support for view and account (is different than a video channel) | ||||||
|         // holder.userImg.setOnClickListener { |         // holder.userImg.setOnClickListener { | ||||||
| @@ -77,4 +97,23 @@ class CommentariesAdapter(private val myDataset: ArrayList<CommentaryModel>) : | |||||||
|  |  | ||||||
|     // Return the size of your dataset (invoked by the layout manager) |     // Return the size of your dataset (invoked by the layout manager) | ||||||
|     override fun getItemCount() = myDataset.size |     override fun getItemCount() = myDataset.size | ||||||
|  |  | ||||||
|  |     private fun initRepliesDialog (commentData: CommentaryModel) { | ||||||
|  |         val dialog = ThreadDialog() | ||||||
|  |         val bundle = Bundle() | ||||||
|  |         bundle.putSerializable("comment", commentData as Serializable) | ||||||
|  |  | ||||||
|  |         dialog.arguments = bundle | ||||||
|  |         dialog.fragmentManager2 = this.fragmentManager | ||||||
|  |         val transaction = fragmentManager.beginTransaction() | ||||||
|  |         // For a polished look, specify a transition animation. | ||||||
|  |         transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN) | ||||||
|  |         // To make it fullscreen, use the 'content' root view as the container | ||||||
|  |         // for the fragment, which is always the root view for the activity. | ||||||
|  |         transaction | ||||||
|  |             .add(android.R.id.content, dialog) | ||||||
|  |             .addToBackStack("comments") | ||||||
|  |             .commit() | ||||||
|  |  | ||||||
|  |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -6,7 +6,6 @@ import org.libre.agosto.p2play.models.CommentaryModel | |||||||
| import java.io.InputStreamReader | import java.io.InputStreamReader | ||||||
|  |  | ||||||
| class Comments : Client() { | class Comments : Client() { | ||||||
|  |  | ||||||
|     private fun parseCommentaries(data: JsonReader): ArrayList<CommentaryModel> { |     private fun parseCommentaries(data: JsonReader): ArrayList<CommentaryModel> { | ||||||
|         val commentaries = arrayListOf<CommentaryModel>() |         val commentaries = arrayListOf<CommentaryModel>() | ||||||
|         data.beginObject() |         data.beginObject() | ||||||
| @@ -70,4 +69,68 @@ class Comments : Client() { | |||||||
|         con.disconnect() |         con.disconnect() | ||||||
|         return response |         return response | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     fun getCommentariesThread(videoId: Int, threadId: Int): ArrayList<CommentaryModel> { | ||||||
|  |         var commentaries = arrayListOf<CommentaryModel>() | ||||||
|  |         val con = this.newCon("videos/$videoId/comment-threads/${threadId}", "GET") | ||||||
|  |  | ||||||
|  |         try { | ||||||
|  |             if (con.responseCode == 200) { | ||||||
|  |                 val response = InputStreamReader(con.inputStream) | ||||||
|  |                 val data = JsonReader(response) | ||||||
|  |                 data.beginObject() | ||||||
|  |                 while (data.hasNext()) { | ||||||
|  |                     when (data.nextName()) { | ||||||
|  |                         "children" -> { | ||||||
|  |                             data.beginArray() | ||||||
|  |                             while (data.hasNext()) { | ||||||
|  |                                 data.beginObject() | ||||||
|  |                                 while (data.hasNext()) { | ||||||
|  |                                     when(data.nextName()) { | ||||||
|  |                                         "comment" -> { | ||||||
|  |                                             val comment = CommentaryModel() | ||||||
|  |                                             comment.parseCommentary(data) | ||||||
|  |                                             commentaries.add(comment) | ||||||
|  |                                         } | ||||||
|  |                                         else -> data.skipValue() | ||||||
|  |                                     } | ||||||
|  |                                 } | ||||||
|  |                                 data.endObject() | ||||||
|  |                             } | ||||||
|  |                             data.endArray() | ||||||
|  |                         } | ||||||
|  |                         else -> data.skipValue() | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |                 data.endObject() | ||||||
|  |                 data.close() | ||||||
|  |             } | ||||||
|  |         } catch (err: Exception) { | ||||||
|  |             err.printStackTrace() | ||||||
|  |         } | ||||||
|  |         con.disconnect() | ||||||
|  |         return commentaries | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     fun replyThread(token: String, videoId: Int, threadId: Int , text: String): Boolean { | ||||||
|  |         val con = this.newCon("videos/$videoId/comments/${threadId}", "POST", token) | ||||||
|  |         val params = "text=$text" | ||||||
|  |         con.outputStream.write(params.toByteArray()) | ||||||
|  |  | ||||||
|  |         val response: Boolean = try { | ||||||
|  |             if (con.responseCode == 200) { | ||||||
|  |                 con.disconnect() | ||||||
|  |                 true | ||||||
|  |             } else { | ||||||
|  |                 Log.d("Status", con.responseMessage) | ||||||
|  |                 false | ||||||
|  |             } | ||||||
|  |         } catch (err: Exception) { | ||||||
|  |             err.printStackTrace() | ||||||
|  |             false | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         con.disconnect() | ||||||
|  |         return response | ||||||
|  |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -0,0 +1,136 @@ | |||||||
|  | package org.libre.agosto.p2play.dialogs | ||||||
|  |  | ||||||
|  | import android.app.Dialog | ||||||
|  | import android.content.AsyncQueryHandler | ||||||
|  | import android.content.Context | ||||||
|  | import android.os.AsyncTask | ||||||
|  | import android.os.Bundle | ||||||
|  | import android.util.Log | ||||||
|  | import android.view.LayoutInflater | ||||||
|  | import android.view.View | ||||||
|  | import android.view.ViewGroup | ||||||
|  | import android.view.Window | ||||||
|  | import android.view.inputmethod.InputMethodManager | ||||||
|  | import androidx.fragment.app.DialogFragment | ||||||
|  | import androidx.fragment.app.FragmentManager | ||||||
|  | import androidx.recyclerview.widget.LinearLayoutManager | ||||||
|  | import androidx.recyclerview.widget.RecyclerView | ||||||
|  | import com.squareup.picasso.Picasso | ||||||
|  | import kotlinx.android.synthetic.main.comment_component.commentaryLayout | ||||||
|  | import kotlinx.android.synthetic.main.comment_component.commentaryText | ||||||
|  | import kotlinx.android.synthetic.main.comment_component.userImgCom | ||||||
|  | import kotlinx.android.synthetic.main.comment_component.view.commentaryBtn | ||||||
|  | import kotlinx.android.synthetic.main.comment_component.view.commentaryLayout | ||||||
|  | import kotlinx.android.synthetic.main.comment_component.view.commentaryText | ||||||
|  | import kotlinx.android.synthetic.main.comment_component.view.userImgCom | ||||||
|  | import kotlinx.android.synthetic.main.dialog_thread.view.materialToolbar | ||||||
|  | import kotlinx.android.synthetic.main.two_factor_dialog.twoFactorText | ||||||
|  | import kotlinx.android.synthetic.main.view_commentary.view.replyBtn | ||||||
|  | import kotlinx.android.synthetic.main.view_commentary.view.userCommentImg | ||||||
|  | import kotlinx.android.synthetic.main.view_commentary.view.userCommentary | ||||||
|  | import kotlinx.android.synthetic.main.view_commentary.view.userTxt | ||||||
|  | import org.libre.agosto.p2play.ManagerSingleton | ||||||
|  | import org.libre.agosto.p2play.R | ||||||
|  | import org.libre.agosto.p2play.adapters.CommentariesAdapter | ||||||
|  | import org.libre.agosto.p2play.ajax.Comments | ||||||
|  | import org.libre.agosto.p2play.models.CommentaryModel | ||||||
|  |  | ||||||
|  | class ThreadDialog : DialogFragment() { | ||||||
|  |     private lateinit var comment: CommentaryModel | ||||||
|  |     lateinit var fragmentManager2: FragmentManager | ||||||
|  |     private val client: Comments = Comments() | ||||||
|  |     // The system calls this to get the DialogFragment's layout, regardless of | ||||||
|  |     // whether it's being displayed as a dialog or an embedded fragment. | ||||||
|  |     override fun onCreateView( | ||||||
|  |         inflater: LayoutInflater, | ||||||
|  |         container: ViewGroup?, | ||||||
|  |         savedInstanceState: Bundle? | ||||||
|  |     ): View { | ||||||
|  |         // Inflate the layout to use as a dialog or embedded fragment. | ||||||
|  |         val view = inflater.inflate(R.layout.dialog_thread, container, false) | ||||||
|  |         comment = arguments?.getSerializable("comment") as CommentaryModel | ||||||
|  |  | ||||||
|  |         view.userTxt.text = comment.username | ||||||
|  |         view.userCommentary.text = comment.commentary | ||||||
|  |         Picasso.get().load("https://${ManagerSingleton.url}${comment.userImageUrl}").into(view.userCommentImg) | ||||||
|  |         view.replyBtn.visibility = View.GONE | ||||||
|  |  | ||||||
|  |         if (ManagerSingleton.user.status == 1) { | ||||||
|  |             view.commentaryText.setText("${comment.username}@${comment.userHost} ") | ||||||
|  |             if (ManagerSingleton.user.avatar != "") { | ||||||
|  |                 Picasso.get().load("https://${ManagerSingleton.url}${ManagerSingleton.user.avatar}").into(view.userImgCom) | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             view.commentaryText.requestFocus() | ||||||
|  |             view.commentaryBtn.setOnClickListener { this.replyThread() } | ||||||
|  |         } else { | ||||||
|  |             view.commentaryLayout.visibility = View.GONE | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         view.materialToolbar.setTitle("Thread") | ||||||
|  |         view.materialToolbar.setNavigationIcon(R.drawable.baseline_arrow_back_24) | ||||||
|  |         view.materialToolbar.setNavigationOnClickListener { | ||||||
|  |             dismiss() | ||||||
|  |             this.fragmentManager2.popBackStack() | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         this.getComments() | ||||||
|  |  | ||||||
|  |         return view | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     // The system calls this only when creating the layout in a dialog. | ||||||
|  |     override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { | ||||||
|  |         val dialog = super.onCreateDialog(savedInstanceState) | ||||||
|  |         dialog.requestWindowFeature(Window.FEATURE_NO_TITLE) | ||||||
|  |         return dialog | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     private fun getComments() { | ||||||
|  |         AsyncTask.execute { | ||||||
|  |             val data = | ||||||
|  |                 this.client.getCommentariesThread(this.comment.videoId, this.comment.id) | ||||||
|  |             activity?.runOnUiThread { | ||||||
|  |                 this.setDataComments(data) | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     private fun setDataComments(data: ArrayList<CommentaryModel>) { | ||||||
|  |         // Set data for RecyclerView | ||||||
|  |         val viewAdapter = CommentariesAdapter(data).setFragmentManager(this.fragmentManager2) | ||||||
|  |  | ||||||
|  |         view?.findViewById<RecyclerView>(R.id.listCommentaries)?.let { | ||||||
|  |             // use this setting to improve performance if you know that changes | ||||||
|  |             // in content do not change the layout size of the RecyclerView | ||||||
|  |             it.setHasFixedSize(true) | ||||||
|  |             // use a linear layout manager | ||||||
|  |             it.layoutManager = LinearLayoutManager(activity) | ||||||
|  |  | ||||||
|  |             // specify an viewAdapter (see also next example) | ||||||
|  |             it.adapter = viewAdapter | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     private fun replyThread() { | ||||||
|  |         val commentary = view?.commentaryText?.text.toString() | ||||||
|  |  | ||||||
|  |         if (commentary == "") { | ||||||
|  |             ManagerSingleton.toast(getString(R.string.emptyCommentaryMsg), requireActivity()) | ||||||
|  |             return | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         AsyncTask.execute { | ||||||
|  |             val res = this.client.replyThread(ManagerSingleton.token.token, this.comment.videoId, this.comment.id, commentary) | ||||||
|  |             activity?.runOnUiThread { | ||||||
|  |                 if (res) { | ||||||
|  |                     ManagerSingleton.toast(getString(R.string.makedCommentaryMsg), requireActivity()) | ||||||
|  |                     commentaryText.text?.clear() | ||||||
|  |                     this.getComments() | ||||||
|  |                 } else { | ||||||
|  |                     ManagerSingleton.toast(getString(R.string.errorCommentaryMsg), requireActivity()) | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -2,6 +2,7 @@ package org.libre.agosto.p2play.models | |||||||
|  |  | ||||||
| import android.util.JsonReader | import android.util.JsonReader | ||||||
| import android.util.JsonToken | import android.util.JsonToken | ||||||
|  | import java.io.Serializable | ||||||
|  |  | ||||||
| class CommentaryModel( | class CommentaryModel( | ||||||
|     var id: Int = 0, |     var id: Int = 0, | ||||||
| @@ -13,7 +14,8 @@ class CommentaryModel( | |||||||
|     var userHost: String = "", |     var userHost: String = "", | ||||||
|     var replies: Int = 0, |     var replies: Int = 0, | ||||||
|     var nameChannel: String = "", |     var nameChannel: String = "", | ||||||
| ) { |     var videoId: Int = 0 | ||||||
|  | ): Serializable { | ||||||
|     fun parseCommentary(data: JsonReader) { |     fun parseCommentary(data: JsonReader) { | ||||||
|         data.beginObject() |         data.beginObject() | ||||||
|         while (data.hasNext()) { |         while (data.hasNext()) { | ||||||
| @@ -23,6 +25,7 @@ class CommentaryModel( | |||||||
|                 "threadId" -> this.threadId = data.nextInt() |                 "threadId" -> this.threadId = data.nextInt() | ||||||
|                 "text" -> this.commentary = data.nextString() |                 "text" -> this.commentary = data.nextString() | ||||||
|                 "totalReplies" -> this.replies = data.nextInt() |                 "totalReplies" -> this.replies = data.nextInt() | ||||||
|  |                 "videoId" -> this.videoId = data.nextInt() | ||||||
|                 "account" -> { |                 "account" -> { | ||||||
|                     data.beginObject() |                     data.beginObject() | ||||||
|                     while (data.hasNext()) { |                     while (data.hasNext()) { | ||||||
|   | |||||||
							
								
								
									
										5
									
								
								app/src/main/res/drawable/baseline_arrow_back_24.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								app/src/main/res/drawable/baseline_arrow_back_24.xml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,5 @@ | |||||||
|  | <vector xmlns:android="http://schemas.android.com/apk/res/android" android:autoMirrored="true" android:height="24dp" android:tint="#000000" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp"> | ||||||
|  |        | ||||||
|  |     <path android:fillColor="@android:color/white" android:pathData="M20,11H7.83l5.59,-5.59L12,4l-8,8 8,8 1.41,-1.41L7.83,13H20v-2z"/> | ||||||
|  |      | ||||||
|  | </vector> | ||||||
| @@ -220,15 +220,16 @@ | |||||||
|                 android:layout_width="match_parent" |                 android:layout_width="match_parent" | ||||||
|                 android:layout_height="60dp" |                 android:layout_height="60dp" | ||||||
|                 android:layout_weight="1" |                 android:layout_weight="1" | ||||||
|  |                 android:gravity="center|center_vertical" | ||||||
|                 android:orientation="horizontal"> |                 android:orientation="horizontal"> | ||||||
|  |  | ||||||
|                 <ImageView |                 <ImageView | ||||||
|                     android:id="@+id/userImg" |                     android:id="@+id/userImg" | ||||||
|                     android:layout_width="40dp" |                     android:layout_width="35dp" | ||||||
|                     android:layout_height="match_parent" |                     android:layout_height="wrap_content" | ||||||
|                     android:layout_margin="0dp" |                     android:layout_margin="0dp" | ||||||
|                     android:layout_weight="1" |                     android:layout_weight="1" | ||||||
|                     android:adjustViewBounds="false" |                     android:adjustViewBounds="true" | ||||||
|                     android:cropToPadding="false" |                     android:cropToPadding="false" | ||||||
|                     android:padding="5dp" |                     android:padding="5dp" | ||||||
|                     android:scaleType="fitCenter" |                     android:scaleType="fitCenter" | ||||||
| @@ -236,7 +237,7 @@ | |||||||
|  |  | ||||||
|                 <LinearLayout |                 <LinearLayout | ||||||
|                     android:layout_width="wrap_content" |                     android:layout_width="wrap_content" | ||||||
|                     android:layout_height="match_parent" |                     android:layout_height="wrap_content" | ||||||
|                     android:layout_weight="3" |                     android:layout_weight="3" | ||||||
|                     android:orientation="vertical"> |                     android:orientation="vertical"> | ||||||
|  |  | ||||||
| @@ -244,6 +245,7 @@ | |||||||
|                         android:id="@+id/userTxt" |                         android:id="@+id/userTxt" | ||||||
|                         android:layout_width="match_parent" |                         android:layout_width="match_parent" | ||||||
|                         android:layout_height="wrap_content" |                         android:layout_height="wrap_content" | ||||||
|  |                         android:maxWidth="300dp" | ||||||
|                         android:textAppearance="@android:style/TextAppearance.Material.Large" |                         android:textAppearance="@android:style/TextAppearance.Material.Large" | ||||||
|                         android:textSize="18sp" |                         android:textSize="18sp" | ||||||
|                         android:textStyle="bold" /> |                         android:textStyle="bold" /> | ||||||
| @@ -323,50 +325,7 @@ | |||||||
|                 android:layout_width="match_parent" |                 android:layout_width="match_parent" | ||||||
|                 android:layout_height="20dp" /> |                 android:layout_height="20dp" /> | ||||||
|  |  | ||||||
|             <androidx.appcompat.widget.LinearLayoutCompat |             <include layout="@layout/comment_component" /> | ||||||
|                 android:id="@+id/commentaryLayout" |  | ||||||
|                 android:layout_width="match_parent" |  | ||||||
|                 android:layout_height="wrap_content" |  | ||||||
|                 android:orientation="vertical" |  | ||||||
|                 android:visibility="gone"> |  | ||||||
|  |  | ||||||
|                 <LinearLayout |  | ||||||
|                     android:layout_width="match_parent" |  | ||||||
|                     android:layout_height="wrap_content" |  | ||||||
|                     android:orientation="horizontal"> |  | ||||||
|  |  | ||||||
|                     <ImageView |  | ||||||
|                         android:id="@+id/userImgCom" |  | ||||||
|                         android:layout_width="10dp" |  | ||||||
|                         android:layout_height="60dp" |  | ||||||
|                         android:layout_weight="1" |  | ||||||
|                         app:srcCompat="@drawable/default_avatar" /> |  | ||||||
|  |  | ||||||
|                     <com.google.android.material.textfield.TextInputLayout |  | ||||||
|                         android:layout_width="wrap_content" |  | ||||||
|                         android:layout_height="wrap_content" |  | ||||||
|                         android:layout_margin="4dp" |  | ||||||
|                         android:layout_weight="3" |  | ||||||
|                         android:hint="@string/commentHolder"> |  | ||||||
|  |  | ||||||
|                         <com.google.android.material.textfield.TextInputEditText |  | ||||||
|                             android:id="@+id/commentaryText" |  | ||||||
|                             android:layout_width="match_parent" |  | ||||||
|                             android:layout_height="match_parent" |  | ||||||
|                             android:ems="10" |  | ||||||
|                             android:inputType="textMultiLine" /> |  | ||||||
|                     </com.google.android.material.textfield.TextInputLayout> |  | ||||||
|  |  | ||||||
|                 </LinearLayout> |  | ||||||
|  |  | ||||||
|                 <com.google.android.material.button.MaterialButton |  | ||||||
|                     android:id="@+id/commentaryBtn" |  | ||||||
|                     android:layout_width="match_parent" |  | ||||||
|                     android:layout_height="match_parent" |  | ||||||
|                     android:layout_weight="1" |  | ||||||
|                     android:text="@string/commentaryText" /> |  | ||||||
|  |  | ||||||
|             </androidx.appcompat.widget.LinearLayoutCompat> |  | ||||||
|  |  | ||||||
|             <androidx.recyclerview.widget.RecyclerView |             <androidx.recyclerview.widget.RecyclerView | ||||||
|                 android:id="@+id/listCommentaries" |                 android:id="@+id/listCommentaries" | ||||||
|   | |||||||
							
								
								
									
										46
									
								
								app/src/main/res/layout/comment_component.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								app/src/main/res/layout/comment_component.xml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,46 @@ | |||||||
|  | <?xml version="1.0" encoding="utf-8"?> | ||||||
|  | <androidx.appcompat.widget.LinearLayoutCompat | ||||||
|  |     xmlns:android="http://schemas.android.com/apk/res/android" | ||||||
|  |     xmlns:app="http://schemas.android.com/apk/res-auto" | ||||||
|  |     android:id="@+id/commentaryLayout" | ||||||
|  |     android:layout_width="match_parent" | ||||||
|  |     android:layout_height="wrap_content" | ||||||
|  |     android:orientation="vertical"> | ||||||
|  |  | ||||||
|  |     <LinearLayout | ||||||
|  |         android:layout_width="match_parent" | ||||||
|  |         android:layout_height="wrap_content" | ||||||
|  |         android:orientation="horizontal"> | ||||||
|  |  | ||||||
|  |         <ImageView | ||||||
|  |             android:id="@+id/userImgCom" | ||||||
|  |             android:layout_width="5dp" | ||||||
|  |             android:layout_height="57dp" | ||||||
|  |             android:layout_weight="1" | ||||||
|  |             app:srcCompat="@drawable/default_avatar" /> | ||||||
|  |  | ||||||
|  |         <com.google.android.material.textfield.TextInputLayout | ||||||
|  |             android:layout_width="wrap_content" | ||||||
|  |             android:layout_height="wrap_content" | ||||||
|  |             android:layout_margin="4dp" | ||||||
|  |             android:layout_weight="3" | ||||||
|  |             android:hint="@string/commentHolder"> | ||||||
|  |  | ||||||
|  |             <com.google.android.material.textfield.TextInputEditText | ||||||
|  |                 android:id="@+id/commentaryText" | ||||||
|  |                 android:layout_width="match_parent" | ||||||
|  |                 android:layout_height="match_parent" | ||||||
|  |                 android:ems="10" | ||||||
|  |                 android:inputType="textMultiLine" /> | ||||||
|  |         </com.google.android.material.textfield.TextInputLayout> | ||||||
|  |  | ||||||
|  |     </LinearLayout> | ||||||
|  |  | ||||||
|  |     <com.google.android.material.button.MaterialButton | ||||||
|  |         android:id="@+id/commentaryBtn" | ||||||
|  |         android:layout_width="match_parent" | ||||||
|  |         android:layout_height="match_parent" | ||||||
|  |         android:layout_weight="1" | ||||||
|  |         android:text="@string/commentaryText" /> | ||||||
|  |  | ||||||
|  | </androidx.appcompat.widget.LinearLayoutCompat> | ||||||
							
								
								
									
										50
									
								
								app/src/main/res/layout/dialog_thread.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										50
									
								
								app/src/main/res/layout/dialog_thread.xml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,50 @@ | |||||||
|  | <?xml version="1.0" encoding="utf-8"?> | ||||||
|  | <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" | ||||||
|  |     xmlns:app="http://schemas.android.com/apk/res-auto" | ||||||
|  |     xmlns:tools="http://schemas.android.com/tools" | ||||||
|  |     android:background="?attr/colorSurface" | ||||||
|  |     android:layout_width="match_parent" | ||||||
|  |     android:layout_height="match_parent"> | ||||||
|  |  | ||||||
|  |     <LinearLayout | ||||||
|  |         android:id="@+id/linearLayout3" | ||||||
|  |         android:layout_width="match_parent" | ||||||
|  |         android:layout_height="0dp" | ||||||
|  |         android:layout_marginBottom="130dp" | ||||||
|  |         android:orientation="vertical" | ||||||
|  |         app:layout_constraintBottom_toBottomOf="parent" | ||||||
|  |         app:layout_constraintEnd_toEndOf="parent" | ||||||
|  |         app:layout_constraintStart_toStartOf="parent" | ||||||
|  |         app:layout_constraintTop_toTopOf="parent"> | ||||||
|  |  | ||||||
|  |         <androidx.appcompat.widget.Toolbar | ||||||
|  |             android:id="@+id/materialToolbar" | ||||||
|  |             android:layout_width="match_parent" | ||||||
|  |             android:layout_height="wrap_content" | ||||||
|  |             android:minHeight="?attr/actionBarSize" /> | ||||||
|  |  | ||||||
|  |         <include | ||||||
|  |             layout="@layout/view_commentary" | ||||||
|  |             android:layout_width="match_parent" | ||||||
|  |             android:layout_height="wrap_content" /> | ||||||
|  |  | ||||||
|  |         <View | ||||||
|  |             android:layout_width="match_parent" | ||||||
|  |             android:layout_height="1dp" | ||||||
|  |             android:background="?android:attr/listDivider" /> | ||||||
|  |  | ||||||
|  |         <androidx.recyclerview.widget.RecyclerView | ||||||
|  |             android:id="@+id/listCommentaries" | ||||||
|  |             android:layout_width="match_parent" | ||||||
|  |             android:layout_height="match_parent" | ||||||
|  |              android:layout_marginStart="10dp"/> | ||||||
|  |  | ||||||
|  |     </LinearLayout> | ||||||
|  |  | ||||||
|  |     <include | ||||||
|  |         layout="@layout/comment_component" | ||||||
|  |         android:layout_width="match_parent" | ||||||
|  |         android:layout_height="wrap_content" | ||||||
|  |         app:layout_constraintBottom_toBottomOf="parent" /> | ||||||
|  |  | ||||||
|  | </androidx.constraintlayout.widget.ConstraintLayout> | ||||||
| @@ -7,6 +7,7 @@ | |||||||
|     <LinearLayout |     <LinearLayout | ||||||
|         android:layout_width="match_parent" |         android:layout_width="match_parent" | ||||||
|         android:layout_height="wrap_content" |         android:layout_height="wrap_content" | ||||||
|  |         android:layout_marginBottom="8dp" | ||||||
|         android:orientation="horizontal" |         android:orientation="horizontal" | ||||||
|         android:paddingLeft="10dp" |         android:paddingLeft="10dp" | ||||||
|         android:paddingRight="10dp" |         android:paddingRight="10dp" | ||||||
| @@ -46,6 +47,14 @@ | |||||||
|                 android:linksClickable="true" |                 android:linksClickable="true" | ||||||
|                 android:maxLength="1000" |                 android:maxLength="1000" | ||||||
|                 android:maxLines="10" /> |                 android:maxLines="10" /> | ||||||
|  |  | ||||||
|  |             <TextView | ||||||
|  |                 android:id="@+id/replyBtn" | ||||||
|  |                 android:layout_width="match_parent" | ||||||
|  |                 android:layout_height="wrap_content" | ||||||
|  |                 android:text="@string/reply" | ||||||
|  |                 android:textColor="?attr/colorSecondary" | ||||||
|  |                 android:textStyle="bold" /> | ||||||
|         </LinearLayout> |         </LinearLayout> | ||||||
|     </LinearLayout> |     </LinearLayout> | ||||||
| </androidx.constraintlayout.widget.ConstraintLayout> | </androidx.constraintlayout.widget.ConstraintLayout> | ||||||
| @@ -73,7 +73,7 @@ | |||||||
|                 android:layout_width="120dp" |                 android:layout_width="120dp" | ||||||
|                 android:layout_height="match_parent" |                 android:layout_height="match_parent" | ||||||
|                 android:layout_weight="1" |                 android:layout_weight="1" | ||||||
|                 android:adjustViewBounds="false" |                 android:adjustViewBounds="true" | ||||||
|                 android:clickable="false" |                 android:clickable="false" | ||||||
|                 android:cropToPadding="false" |                 android:cropToPadding="false" | ||||||
|                 android:padding="5dp" |                 android:padding="5dp" | ||||||
|   | |||||||
| @@ -95,6 +95,9 @@ | |||||||
|     <string name="unSubscribeBtn">Unsubscribe</string> |     <string name="unSubscribeBtn">Unsubscribe</string> | ||||||
|     <string name="commentaryText">Comment</string> |     <string name="commentaryText">Comment</string> | ||||||
|     <string name="showMore">Show more</string> |     <string name="showMore">Show more</string> | ||||||
|  |     <!-- Comments --> | ||||||
|  |     <string name="reply">Reply</string> | ||||||
|  |     <string name="see_replies">See replies (%1$d)</string> | ||||||
|     <!-- Messages --> |     <!-- Messages --> | ||||||
|     <string name="subscribeMsg">You have subscribed to this channel</string> |     <string name="subscribeMsg">You have subscribed to this channel</string> | ||||||
|     <string name="rateMsg">You have rated the video</string> |     <string name="rateMsg">You have rated the video</string> | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user