diff --git a/.gitignore b/.gitignore index 06de402..de593ff 100644 --- a/.gitignore +++ b/.gitignore @@ -32,3 +32,9 @@ proguard/ captures/ \.idea/ + +# iml Files +*.iml +app/app.iml + +app/release/ diff --git a/README.md b/README.md index 72fef44..dec7311 100644 --- a/README.md +++ b/README.md @@ -20,14 +20,15 @@ Comming soon! - Subscribe to accounts - Show your subscripcion videos - Rate videos +- Show and make commentaries +- Splash screen ## What to do? (in next version) - Search videos -- Show and make commentaries - Share videos -- View Peertube profiles -- Splash screen +- Peertube profiles +- Infinite scroll ## Demostrations Demostration P2Play Beta 0.1: [https://peertube.video/videos/watch/2eb7b953-0b1b-4019-9300-817539f5f4e8](https://peertube.video/videos/watch/2eb7b953-0b1b-4019-9300-817539f5f4e8) diff --git a/app/app.iml b/app/app.iml deleted file mode 100644 index e1aef5e..0000000 --- a/app/app.iml +++ /dev/null @@ -1,199 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 4f37ec5..0b32c89 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -7,11 +7,11 @@ apply plugin: 'kotlin-android-extensions' android { compileSdkVersion 27 defaultConfig { - applicationId "org.libre.agosto.p2play" + applicationId "mx.agosto182.p2play" minSdkVersion 21 targetSdkVersion 27 - versionCode 2 - versionName "0.1.5" + versionCode 3 + versionName "0.2" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } buildTypes { @@ -25,6 +25,10 @@ android { sourceCompatibility JavaVersion.VERSION_1_6 targetCompatibility JavaVersion.VERSION_1_6 } + lintOptions { + checkReleaseBuilds false + abortOnError false + } } dependencies { diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 0fd316f..a8bca63 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -7,29 +7,34 @@ - + android:theme="@style/P2playTheme"> + + - + + android:label="@string/title_activity_settings" /> \ No newline at end of file diff --git a/app/src/main/java/org/libre/agosto/p2play/AboutActivity.kt b/app/src/main/java/org/libre/agosto/p2play/AboutActivity.kt index 120432f..cdb81e2 100644 --- a/app/src/main/java/org/libre/agosto/p2play/AboutActivity.kt +++ b/app/src/main/java/org/libre/agosto/p2play/AboutActivity.kt @@ -12,5 +12,7 @@ class AboutActivity : AppCompatActivity() { setContentView(R.layout.activity_about) aboutUrl.text = "https://"+ManagerSingleton.url+"/about/instance" + + aboutLabel.text = aboutLabel.text.toString() + " " + this.packageManager.getPackageInfo(this.packageName, 0).versionName } } diff --git a/app/src/main/java/org/libre/agosto/p2play/Database.kt b/app/src/main/java/org/libre/agosto/p2play/Database.kt index 200a865..af0dabe 100644 --- a/app/src/main/java/org/libre/agosto/p2play/Database.kt +++ b/app/src/main/java/org/libre/agosto/p2play/Database.kt @@ -61,12 +61,14 @@ class Database(context:Context): SQLiteOpenHelper(context,"p2play",null,1) { try { var cursor= db.rawQuery("SELECT * FROM tokens WHERE status=1 ORDER BY id DESC LIMIT 1",null) - cursor.moveToFirst() - token.token = cursor.getString(cursor.getColumnIndex("token")).toString() - token.refresh_token = cursor.getString(cursor.getColumnIndex("refresh_token")).toString() - token.status = cursor.getString(cursor.getColumnIndex("status")).toInt() + if(cursor.count != 0){ + cursor.moveToFirst() + token.token = cursor.getString(cursor.getColumnIndex("token")).toString() + token.refresh_token = cursor.getString(cursor.getColumnIndex("refresh_token")).toString() + token.status = cursor.getString(cursor.getColumnIndex("status")).toInt() + } cursor.close() return token @@ -85,15 +87,18 @@ class Database(context:Context): SQLiteOpenHelper(context,"p2play",null,1) { try { var cursor= db.rawQuery("SELECT * FROM users WHERE status=1 ORDER BY id DESC LIMIT 1",null) - cursor.moveToFirst() - user.uuid = cursor.getString(cursor.getColumnIndex("uuid")).toInt() - user.username = cursor.getString(cursor.getColumnIndex("username")).toString() - user.email = cursor.getString(cursor.getColumnIndex("email")).toString() - user.nsfw = cursor.getString(cursor.getColumnIndex("nsfw")).toBoolean() - user.followers = cursor.getString(cursor.getColumnIndex("followers")).toInt() - user.avatar = cursor.getString(cursor.getColumnIndex("avatar")).toString() - user.status = cursor.getString(cursor.getColumnIndex("status")).toInt() + if(cursor.count != 0){ + cursor.moveToFirst() + + user.uuid = cursor.getString(cursor.getColumnIndex("uuid")).toInt() + user.username = cursor.getString(cursor.getColumnIndex("username")).toString() + user.email = cursor.getString(cursor.getColumnIndex("email")).toString() + user.nsfw = cursor.getString(cursor.getColumnIndex("nsfw")).toBoolean() + user.followers = cursor.getString(cursor.getColumnIndex("followers")).toInt() + user.avatar = cursor.getString(cursor.getColumnIndex("avatar")).toString() + user.status = cursor.getString(cursor.getColumnIndex("status")).toInt() + } cursor.close() diff --git a/app/src/main/java/org/libre/agosto/p2play/HostActivity.kt b/app/src/main/java/org/libre/agosto/p2play/HostActivity.kt index ade6200..432a6e6 100644 --- a/app/src/main/java/org/libre/agosto/p2play/HostActivity.kt +++ b/app/src/main/java/org/libre/agosto/p2play/HostActivity.kt @@ -29,48 +29,21 @@ class HostActivity : AppCompatActivity() { getKeys(hostText.text.toString()) } - val host = settings.getString("hostP2play","") - val lastHost = settings.getString("last_host","") + val host = settings.getString("hostP2play", "") + val lastHost = settings.getString("last_host", "") if(host!=""){ if(lastHost!=host){ _db.logout() + ManagerSingleton.logout() getKeys(host) }else{ ManagerSingleton.url=host - checkUser() + startApp() } } } - fun checkUser(){ - val token = _db.getToken() - val user = _db.getUser() - AsyncTask.execute { - if (Looper.myLooper() == null) - Looper.prepare() - startApp() - if (token.status == 1 && user.status == 1) { - val client_id = settings.getString("client_id", "") - val client_secret = settings.getString("client_secret", "") - - val newToken = client.refreshToken(token, client_id, client_secret) - - when (token.status.toString()) { - "1" -> { - _db.newToken(newToken) - ManagerSingleton.token = newToken - ManagerSingleton.user = user - } - else -> _db.logout() - } - } else { - _db.logout() - } - - this.finish() - } - } fun saveHost(host: String){ editor.putString("last_host",host) @@ -78,7 +51,7 @@ class HostActivity : AppCompatActivity() { editor.apply() ManagerSingleton.Toast(getString(R.string.finallyMsg)) ManagerSingleton.url=host - checkUser() + startApp() } private fun getKeys(hostText: String){ @@ -112,6 +85,7 @@ class HostActivity : AppCompatActivity() { runOnUiThread { val intent = Intent(ManagerSingleton.context,MainActivity::class.java) startActivity(intent) + this.finish() } } } diff --git a/app/src/main/java/org/libre/agosto/p2play/MainActivity.kt b/app/src/main/java/org/libre/agosto/p2play/MainActivity.kt index b58ab01..3ceb1a9 100644 --- a/app/src/main/java/org/libre/agosto/p2play/MainActivity.kt +++ b/app/src/main/java/org/libre/agosto/p2play/MainActivity.kt @@ -3,6 +3,7 @@ package org.libre.agosto.p2play import android.content.Intent import android.os.AsyncTask import android.os.Bundle +import android.os.Handler import android.support.design.widget.Snackbar import android.support.design.widget.NavigationView import android.support.v4.view.GravityCompat @@ -27,11 +28,11 @@ class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelecte private lateinit var recyclerView: RecyclerView private lateinit var viewAdapter: RecyclerView.Adapter<*> private lateinit var viewManager: RecyclerView.LayoutManager - val client: Videos = Videos() + private val client: Videos = Videos() private lateinit var lastItem: MenuItem private lateinit var subItem: MenuItem lateinit var myMenu: Menu - val _db = Database(this) + private val _db = Database(this) var section: String = "" @@ -54,6 +55,7 @@ class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelecte ManagerSingleton.context = this nav_view.setNavigationItemSelectedListener(this) + viewManager = LinearLayoutManager(this) // Set data for RecyclerView @@ -64,10 +66,15 @@ class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelecte swipeContainer.setOnRefreshListener { this.refresh() } + + Handler().postDelayed({ + // Title for nav_bar + side_emailTxt?.text = getString(R.string.nav_header_subtitle) + " " + this.packageManager.getPackageInfo(this.packageName, 0).versionName + }, 2000) } // Generic function for set data to RecyclerView - fun setData(data:ArrayList){ + private fun setData(data:ArrayList){ viewAdapter = VideosAdapter(data) recyclerView = findViewById(R.id.list).apply { @@ -84,7 +91,7 @@ class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelecte swipeContainer.isRefreshing = false } - fun refresh(){ + private fun refresh(){ swipeContainer.isRefreshing = true when(section){ "local" -> this.getLocalVideos() @@ -100,7 +107,7 @@ class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelecte } } - fun getSubscriptionVideos(){ + private fun getSubscriptionVideos(){ if(ManagerSingleton.user.status != 1){ ManagerSingleton.Toast("Inicia session primero") startActivity(Intent(this, LoginActivity::class.java)) @@ -118,7 +125,7 @@ class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelecte } // Last videos - fun getLastVideos(){ + private fun getLastVideos(){ swipeContainer.isRefreshing = true section = "last" setTitle(R.string.title_recent) @@ -130,8 +137,8 @@ class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelecte } } - // - fun getPopularVideos(){ + // Popular videos + private fun getPopularVideos(){ swipeContainer.isRefreshing = true section = "popular" setTitle(R.string.title_popular) @@ -143,7 +150,8 @@ class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelecte } } - fun getLocalVideos(){ + // Local videos + private fun getLocalVideos(){ swipeContainer.isRefreshing = true section = "local" setTitle(R.string.title_local) @@ -155,7 +163,8 @@ class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelecte } } - fun getMyVideos(){ + // Videos of user + private fun getMyVideos(){ swipeContainer.isRefreshing = true section = "my_videos" setTitle(R.string.title_myVideos) @@ -266,14 +275,14 @@ class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelecte } } - fun logout(){ + private fun logout(){ if(::myMenu.isInitialized){ myMenu.findItem(R.id.action_login).isVisible = true myMenu.findItem(R.id.action_logout).isVisible = false } side_usernameTxt?.text = getString(R.string.nav_header_title) - side_emailTxt?.text = getString(R.string.nav_header_subtitle) + side_emailTxt?.text = getString(R.string.nav_header_subtitle) + " " + this.packageManager.getPackageInfo(this.packageName, 0).versionName side_imageView?.setImageResource(R.mipmap.ic_launcher_round) side_imageView?.setOnClickListener { } _db.logout() diff --git a/app/src/main/java/org/libre/agosto/p2play/ReproductorActivity.kt b/app/src/main/java/org/libre/agosto/p2play/ReproductorActivity.kt index 1877e22..206642e 100644 --- a/app/src/main/java/org/libre/agosto/p2play/ReproductorActivity.kt +++ b/app/src/main/java/org/libre/agosto/p2play/ReproductorActivity.kt @@ -1,27 +1,43 @@ package org.libre.agosto.p2play -import android.opengl.Visibility +import android.app.Activity +import android.graphics.Bitmap +import android.graphics.BitmapFactory import android.os.AsyncTask import android.support.v7.app.AppCompatActivity import android.os.Bundle import android.os.Looper import android.support.v4.content.ContextCompat +import android.support.v7.widget.LinearLayoutManager +import android.support.v7.widget.RecyclerView import android.util.Log import android.view.View +import android.webkit.WebChromeClient +import android.widget.FrameLayout import com.squareup.picasso.Picasso import kotlinx.android.synthetic.main.activity_reproductor.* +import org.libre.agosto.p2play.adapters.CommentariesAdapter import org.libre.agosto.p2play.ajax.Actions +import org.libre.agosto.p2play.ajax.Comments +import org.libre.agosto.p2play.models.CommentaryModel import org.libre.agosto.p2play.models.VideoModel class ReproductorActivity : AppCompatActivity() { lateinit var video:VideoModel private val _actions: Actions = Actions() + private val client: Comments = Comments() + + // Commentaries adapter values + private lateinit var recyclerView: RecyclerView + private lateinit var viewAdapter: RecyclerView.Adapter<*> + private lateinit var viewManager: RecyclerView.LayoutManager override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_reproductor) ManagerSingleton.context = this + videoView.webChromeClient = WebClient() videoView.settings.javaScriptEnabled = true videoView.settings.allowContentAccess = true videoView.settings.javaScriptCanOpenWindowsAutomatically = true @@ -35,26 +51,34 @@ class ReproductorActivity : AppCompatActivity() { tittleVideoTxt.text = this.video.name viewsTxt.text = this.video.views.toString() + ' ' + getString(R.string.view_text) userTxt.text = this.video.username - descriptionVideoTxt.text = this.video.description + descriptionVideoTxt.text = this.video.description.toString() + // Check if user had profile image if(this.video.userImageUrl!="") Picasso.get().load("https://"+ManagerSingleton.url+this.video.userImageUrl).into(userImg) + // Load the video videoView.loadUrl("https://"+ManagerSingleton.url+this.video.embedUrl) - Log.d("url", videoView.url) + + } catch (err:Exception){ err.printStackTrace() Log.d("Error", err?.message) } - // subscribeBtn.setOnClickListener { ManagerSingleton.Toast(getString(R.string.comming)) } + viewManager = LinearLayoutManager(this) + this.setDataComments(arrayListOf()) + + this.getComments() + subscribeBtn.setOnClickListener { subscribe() } likeLayout.setOnClickListener { rate("like") } dislikeLayout.setOnClickListener { rate("dislike") } + commentaryBtn.setOnClickListener { makeComment() } } - fun subscribe(){ - val account = this.video.userUuid+"@"+this.video.userHost + private fun subscribe(){ + val account = this.video.nameChannel+"@"+this.video.userHost AsyncTask.execute { if (Looper.myLooper() == null) Looper.prepare() @@ -68,8 +92,8 @@ class ReproductorActivity : AppCompatActivity() { } } - fun unSubscribe(){ - val account = this.video.userUuid+"@"+this.video.userHost + private fun unSubscribe(){ + val account = this.video.nameChannel+"@"+this.video.userHost AsyncTask.execute { if (Looper.myLooper() == null) Looper.prepare() @@ -83,7 +107,7 @@ class ReproductorActivity : AppCompatActivity() { } } - fun rate(rate: String){ + private fun rate(rate: String){ AsyncTask.execute { if (Looper.myLooper() == null) Looper.prepare() @@ -104,7 +128,7 @@ class ReproductorActivity : AppCompatActivity() { } } - fun getRate(){ + private fun getRate(){ AsyncTask.execute { if (Looper.myLooper() == null) Looper.prepare() @@ -128,8 +152,8 @@ class ReproductorActivity : AppCompatActivity() { } } - fun getSubscription(){ - val account = this.video.userUuid+"@"+this.video.userHost + private fun getSubscription(){ + val account = this.video.nameChannel+"@"+this.video.userHost AsyncTask.execute { if (Looper.myLooper() == null) Looper.prepare() @@ -140,7 +164,7 @@ class ReproductorActivity : AppCompatActivity() { } } - fun changeSubscribeBtn(subscribed: Boolean){ + private fun changeSubscribeBtn(subscribed: Boolean){ if(subscribed){ subscribeBtn.text = getText(R.string.unSubscribeBtn) subscribeBtn.setOnClickListener { this.unSubscribe() } @@ -151,6 +175,53 @@ class ReproductorActivity : AppCompatActivity() { } } + private fun setDataComments(data: ArrayList) { + // Set data for RecyclerView + viewAdapter = CommentariesAdapter(data) + + recyclerView = findViewById(R.id.listCommentaries).apply { + // use this setting to improve performance if you know that changes + // in content do not change the layout size of the RecyclerView + setHasFixedSize(true) + + // use a linear layout manager + layoutManager = viewManager + + // specify an viewAdapter (see also next example) + adapter = viewAdapter + } + } + + private fun getComments() { + AsyncTask.execute { + val data = this.client.getCommentaries(this.video.id) + runOnUiThread { + this.setDataComments(data) + } + } + } + + private fun makeComment() { + if(commentaryText.text.toString() == ""){ + ManagerSingleton.Toast(getString(R.string.emptyCommentaryMsg)) + return + } + val text = commentaryText.text.toString() + AsyncTask.execute { + val res = this.client.makeCommentary(ManagerSingleton.token.token, this.video.id, text) + runOnUiThread { + if (res) { + ManagerSingleton.Toast(getString(R.string.makedCommentaryMsg)) + commentaryText.text.clear() + this.getComments() + } + else { + ManagerSingleton.Toast(getString(R.string.errorCommentaryMsg)) + } + } + } + } + override fun onResume() { super.onResume() if(ManagerSingleton.user.status == 1) { @@ -158,6 +229,60 @@ class ReproductorActivity : AppCompatActivity() { this.getSubscription() actionsLayout.visibility = View.VISIBLE subscribeBtn.visibility = View.VISIBLE + commentaryLayout.visibility = View.VISIBLE + if(ManagerSingleton.user.avatar != ""){ + Picasso.get().load("https://"+ManagerSingleton.url+ManagerSingleton.user.avatar).into(userImgCom) + } } } + + internal inner class WebClient(): WebChromeClient() { + private var mCustomView: View? = null + private var mCustomViewCallback: WebChromeClient.CustomViewCallback? = null + private var mFullscreenContainer: FrameLayout? = null + private var mOriginalOrientation: Int = 0 + private var mOriginalSystemUiVisibility: Int = 0 + + fun WebClient() {} + + override fun getDefaultVideoPoster(): Bitmap? { + return if (mCustomView == null) { + null + } else BitmapFactory.decodeResource(this@ReproductorActivity.resources, 2130837573) + } + + override fun onHideCustomView() { + try { + (this@ReproductorActivity.window.decorView as FrameLayout).removeView(this.mCustomView) + this.mCustomView = null + this@ReproductorActivity.window.decorView.systemUiVisibility = this.mOriginalSystemUiVisibility + this@ReproductorActivity.requestedOrientation = this.mOriginalOrientation + this.mCustomViewCallback?.onCustomViewHidden() + this.mCustomViewCallback = null + } + catch (err: Exception){ + err.printStackTrace() + } + } + + override fun onShowCustomView(paramView: View, paramCustomViewCallback: WebChromeClient.CustomViewCallback) { + if (this.mCustomView != null) { + this.onHideCustomView() + return + } + try { + + this.mCustomView = paramView + this.mOriginalSystemUiVisibility = this@ReproductorActivity.window.decorView.systemUiVisibility + this.mOriginalOrientation = this@ReproductorActivity.requestedOrientation + this.mCustomViewCallback = paramCustomViewCallback + (this@ReproductorActivity.window.decorView as FrameLayout).addView(this.mCustomView, FrameLayout.LayoutParams(-1, -1)) + this@ReproductorActivity.window.decorView.systemUiVisibility = 3846 + } + catch (err: Exception){ + err.printStackTrace() + } + } + + } } diff --git a/app/src/main/java/org/libre/agosto/p2play/SplashActivity.kt b/app/src/main/java/org/libre/agosto/p2play/SplashActivity.kt new file mode 100644 index 0000000..fc5845c --- /dev/null +++ b/app/src/main/java/org/libre/agosto/p2play/SplashActivity.kt @@ -0,0 +1,108 @@ +package org.libre.agosto.p2play + +import android.content.Intent +import android.content.SharedPreferences +import android.os.AsyncTask +import android.support.v7.app.AppCompatActivity +import android.os.Bundle +import android.os.Handler +import android.os.Looper +import android.preference.PreferenceManager +import android.util.Log +import org.libre.agosto.p2play.ajax.Auth +import java.lang.Exception + +class SplashActivity : AppCompatActivity() { + lateinit var settings: SharedPreferences + lateinit var editor: SharedPreferences.Editor + val client: Auth = Auth() + val _db = Database(this) + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_splash) + + settings = PreferenceManager.getDefaultSharedPreferences(this) + + editor = settings.edit() + ManagerSingleton.context = this + + val host = settings.getString("hostP2play","") + val lastHost = settings.getString("last_host","") + if(host != ""){ + if(lastHost != host){ + _db.logout() + Handler().postDelayed({ + startHostActivity() + }, 2000) + }else{ + ManagerSingleton.url = host + checkUser() + } + } + else{ + Handler().postDelayed({ + startHostActivity() + }, 2000) + } + } + + private fun checkUser(){ + Log.d("was", "Chequed") + try { + val token = _db.getToken() + val user = _db.getUser() + AsyncTask.execute { + if (Looper.myLooper() == null) + Looper.prepare() + + + if (token.status == 1 && user.status == 1) { + val client_id = settings.getString("client_id", "") + val client_secret = settings.getString("client_secret", "") + + val newToken = client.refreshToken(token, client_id, client_secret) + + when (token.status.toString()) { + "1" -> { + _db.newToken(newToken) + ManagerSingleton.token = newToken + ManagerSingleton.user = user + } + else -> _db.logout() + } + } else { + _db.logout() + } + + + startApp() + Log.d("Aqui", "81") + + } + } + catch (err: Exception){ + err.printStackTrace() + Log.d("Aqui", "89") + Handler().postDelayed({ + startApp() + }, 2000) + } + } + + private fun startApp() { + runOnUiThread { + val intent = Intent(ManagerSingleton.context, MainActivity::class.java) + startActivity(intent) + this.finish() + } + } + + private fun startHostActivity() { + runOnUiThread { + val intent = Intent(ManagerSingleton.context, HostActivity::class.java) + startActivity(intent) + this.finish() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/org/libre/agosto/p2play/adapters/CommentariesAdapter.kt b/app/src/main/java/org/libre/agosto/p2play/adapters/CommentariesAdapter.kt new file mode 100644 index 0000000..7053460 --- /dev/null +++ b/app/src/main/java/org/libre/agosto/p2play/adapters/CommentariesAdapter.kt @@ -0,0 +1,71 @@ +package org.libre.agosto.p2play.adapters + +import android.app.Activity +import android.content.Intent +import android.graphics.drawable.Drawable +import android.os.AsyncTask +import android.support.v7.widget.RecyclerView +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.TextView +import com.squareup.picasso.Picasso +import org.libre.agosto.p2play.MainActivity +import org.libre.agosto.p2play.ManagerSingleton +import org.libre.agosto.p2play.R +import org.libre.agosto.p2play.ReproductorActivity +import org.libre.agosto.p2play.models.CommentaryModel +import org.libre.agosto.p2play.models.VideoModel +import java.io.InputStream +import java.io.Serializable +import java.net.URL + +class CommentariesAdapter(private val myDataset: ArrayList) : + RecyclerView.Adapter() { + + // Provide a reference to the views for each data item + // 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. + // Each data item is just a string in this case that is shown in a TextView. + class ViewHolder(val view: View) : RecyclerView.ViewHolder(view){ + val userImg: ImageView + val username: TextView + val commentary: TextView + + init { + // Define click listener for the ViewHolder's View + username = view.findViewById(R.id.userTxt) + commentary = view.findViewById(R.id.userCommentary) + userImg = view.findViewById(R.id.userCommentImg) + } + } + + + // Create new views (invoked by the layout manager) + override fun onCreateViewHolder(parent: ViewGroup, + viewType: Int): CommentariesAdapter.ViewHolder { + // create a new view + val view = LayoutInflater.from(parent.context) + .inflate(R.layout.view_commentary, parent, false) as View + // set the view's size, margins, paddings and layout parameters + return ViewHolder(view) + } + + // Replace the contents of a view (invoked by the layout manager) + override fun onBindViewHolder(holder: ViewHolder, position: Int) { + // - get element from your dataset at this position + // - replace the contents of the view with that element + holder.username.text = myDataset[position].username + + if(myDataset[position].userImageUrl!="") + Picasso.get().load("https://"+ManagerSingleton.url+myDataset[position].userImageUrl).into(holder.userImg); + + holder.commentary.text = myDataset[position].commentary + + } + + // Return the size of your dataset (invoked by the layout manager) + override fun getItemCount() = myDataset.size +} \ No newline at end of file diff --git a/app/src/main/java/org/libre/agosto/p2play/ajax/Comments.kt b/app/src/main/java/org/libre/agosto/p2play/ajax/Comments.kt new file mode 100644 index 0000000..a909a60 --- /dev/null +++ b/app/src/main/java/org/libre/agosto/p2play/ajax/Comments.kt @@ -0,0 +1,112 @@ +package org.libre.agosto.p2play.ajax + +import android.util.JsonReader +import android.util.JsonToken +import android.util.Log +import org.libre.agosto.p2play.models.CommentaryModel +import java.io.InputStreamReader + +class Comments: Client() { + + fun parseCommentaries(data: JsonReader): ArrayList { + var commentaries = arrayListOf() + data.beginObject() + while (data.hasNext()){ + when(data.nextName()) { + "data" -> { + data.beginArray() + while (data.hasNext()) { + val comment = CommentaryModel() + data.beginObject() + while (data.hasNext()) { + val key = data.nextName() + when (key.toString()) { + "id" -> comment.id = data.nextInt() + "threadId" -> comment.threadId = data.nextInt() + "text" -> comment.commentary = data.nextString() + "totalReplies" -> comment.replies = data.nextInt() + "account" -> { + data.beginObject() + while (data.hasNext()){ + val acKey = data.nextName() + when(acKey.toString()){ + "displayName"-> comment.username=data.nextString() + "avatar"-> { + if(data.peek() == JsonToken.BEGIN_OBJECT){ + data.beginObject() + while (data.hasNext()){ + val avKey = data.nextName() + when(avKey){ + "path"-> comment.userImageUrl = data.nextString() + else-> data.skipValue() + } + } + data.endObject() + } + else + data.skipValue() + + } + "uuid" -> comment.userUuid = data.nextString() + "host" -> comment.userHost = data.nextString() + else -> data.skipValue() + } + } + data.endObject() + } + else -> data.skipValue() + } + } + data.endObject() + commentaries.add(comment) + } + data.endArray() + } + else -> data.skipValue() + } + } + data.endObject() + + return commentaries + } + + fun getCommentaries(videoId: Int): ArrayList { + var commentaries = arrayListOf() + val con = this._newCon("videos/$videoId/comment-threads", "GET") + + try { + if (con.responseCode == 200) { + var response = InputStreamReader(con.inputStream) + var data = JsonReader(response) + commentaries = parseCommentaries(data) + } + } catch(err:Exception){ + err?.printStackTrace() + Log.d("TypeErr",err?.message ,err.cause) + Log.d("Error","fallo la coneccion") + } + + return commentaries + } + + fun makeCommentary(token: String, videoId: Int, text: String): Boolean { + val con = this._newCon("videos/$videoId/comment-threads", "POST", token) + val params:String= "text=$text" + con.outputStream.write(params.toByteArray()) + + try { + if (con.responseCode == 200) { + return true + } + else{ + Log.d("Status", con.responseMessage) + } + } + catch (err: Exception){ + err.printStackTrace() + } + + return false + } + +} \ No newline at end of file diff --git a/app/src/main/java/org/libre/agosto/p2play/ajax/Videos.kt b/app/src/main/java/org/libre/agosto/p2play/ajax/Videos.kt index 1b203e7..bd3f5b1 100644 --- a/app/src/main/java/org/libre/agosto/p2play/ajax/Videos.kt +++ b/app/src/main/java/org/libre/agosto/p2play/ajax/Videos.kt @@ -67,6 +67,7 @@ class Videos: Client() { } "uuid" -> video.userUuid = data.nextString() "host" -> video.userHost = data.nextString() + "name" -> video.nameChannel = data.nextString() else-> data.skipValue() } } diff --git a/app/src/main/java/org/libre/agosto/p2play/models/CommentaryModel.kt b/app/src/main/java/org/libre/agosto/p2play/models/CommentaryModel.kt new file mode 100644 index 0000000..f1b5b47 --- /dev/null +++ b/app/src/main/java/org/libre/agosto/p2play/models/CommentaryModel.kt @@ -0,0 +1,12 @@ +package org.libre.agosto.p2play.models + +class CommentaryModel ( + var id: Int = 0, + var threadId: Int = 0, + var userUuid: String = "", + var username: String = "", + var userImageUrl: String = "", + var commentary: String = "", + var userHost: String = "", + var replies: Int = 0 +) \ No newline at end of file diff --git a/app/src/main/java/org/libre/agosto/p2play/models/VideoModel.kt b/app/src/main/java/org/libre/agosto/p2play/models/VideoModel.kt index 22f7333..e7bfa95 100644 --- a/app/src/main/java/org/libre/agosto/p2play/models/VideoModel.kt +++ b/app/src/main/java/org/libre/agosto/p2play/models/VideoModel.kt @@ -13,5 +13,6 @@ class VideoModel( var username: String = "", var views: Number = 0, var userUuid: String = "", - var userHost: String = "" + var userHost: String = "", + var nameChannel: String = "" ):Serializable \ No newline at end of file diff --git a/app/src/main/res/layout/activity_host.xml b/app/src/main/res/layout/activity_host.xml index 2049a50..25f7f13 100644 --- a/app/src/main/res/layout/activity_host.xml +++ b/app/src/main/res/layout/activity_host.xml @@ -56,6 +56,7 @@