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 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- generateDebugSources
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ 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 @@
diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml
index 3135acc..8ce0137 100644
--- a/app/src/main/res/layout/activity_login.xml
+++ b/app/src/main/res/layout/activity_login.xml
@@ -76,6 +76,7 @@