From cd21704a49cbf6bccc96077d8e612b57b42b0f6a Mon Sep 17 00:00:00 2001 From: ivan agosto Date: Wed, 10 Oct 2018 10:13:35 -0500 Subject: [PATCH 1/6] Solved bug when the account dont have avatar --- .../java/org/libre/agosto/p2play/ajax/Auth.kt | 22 ++++++++++++------- build.gradle | 2 +- gradle/wrapper/gradle-wrapper.properties | 4 ++-- 3 files changed, 17 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/org/libre/agosto/p2play/ajax/Auth.kt b/app/src/main/java/org/libre/agosto/p2play/ajax/Auth.kt index 6383f0d..bba67ec 100644 --- a/app/src/main/java/org/libre/agosto/p2play/ajax/Auth.kt +++ b/app/src/main/java/org/libre/agosto/p2play/ajax/Auth.kt @@ -1,7 +1,8 @@ package org.libre.agosto.p2play.ajax -import android.support.design.widget.Snackbar +// import android.support.design.widget.Snackbar import android.util.JsonReader +import android.util.JsonToken import android.util.Log import org.libre.agosto.p2play.ManagerSingleton import org.libre.agosto.p2play.models.TokenModel @@ -133,15 +134,20 @@ class Auth: Client() { when(l.toString()){ "followersCount" -> user.followers = data.nextInt() "avatar" -> { - data.beginObject() - while (data.hasNext()){ - val m = data.nextName() - when (m.toString()){ - "path" -> user.avatar = data.nextString() - else -> data.skipValue() + if(data.peek() == JsonToken.BEGIN_OBJECT) { + data.beginObject() + while (data.hasNext()) { + val m = data.nextName() + when (m.toString()) { + "path" -> user.avatar = data.nextString() + else -> data.skipValue() + } } + data.endObject() + } + else{ + data.skipValue() } - data.endObject() } else -> data.skipValue() } diff --git a/build.gradle b/build.gradle index d2e510b..ea5d34b 100644 --- a/build.gradle +++ b/build.gradle @@ -7,7 +7,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:3.1.4' + classpath 'com.android.tools.build:gradle:3.2.0' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" // NOTE: Do not place your application dependencies here; they belong diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index b1a92c3..6d915f0 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Wed Jul 11 18:31:20 CDT 2018 +#Sun Sep 30 14:50:40 CDT 2018 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.4-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-4.6-all.zip From df04a0b9d9f0fc9edca1beca1051ee6e06f595fd Mon Sep 17 00:00:00 2001 From: ivan agosto Date: Wed, 10 Oct 2018 10:14:10 -0500 Subject: [PATCH 2/6] Subscriptions library and subcribe action --- app/app.iml | 72 ++++++++++--------- app/build.gradle | 10 +-- .../org/libre/agosto/p2play/MainActivity.kt | 22 ++++++ .../agosto/p2play/ReproductorActivity.kt | 27 ++++++- .../libre/agosto/p2play/ajax/Subscriptions.kt | 23 ++++++ .../org/libre/agosto/p2play/ajax/Videos.kt | 25 ++++++- .../libre/agosto/p2play/models/VideoModel.kt | 18 ++--- .../drawable/ic_video_library_black_24dp.xml | 9 +++ .../main/res/layout/activity_reproductor.xml | 3 +- .../main/res/menu/activity_main_drawer.xml | 4 ++ app/src/main/res/values/mainActivity.xml | 1 + app/src/main/res/values/menu.xml | 1 + .../main/res/values/reproductorActivity.xml | 3 + 13 files changed, 167 insertions(+), 51 deletions(-) create mode 100644 app/src/main/java/org/libre/agosto/p2play/ajax/Subscriptions.kt create mode 100644 app/src/main/res/drawable/ic_video_library_black_24dp.xml diff --git a/app/app.iml b/app/app.iml index 534d63c..233e049 100644 --- a/app/app.iml +++ b/app/app.iml @@ -50,19 +50,19 @@ - - + + - + - + @@ -97,13 +97,6 @@ - - - - - - - @@ -111,32 +104,46 @@ - + + + + + + + + + + - + + - - + + + - + - + + + + - + @@ -145,36 +152,37 @@ - - + - - - + + + - + + + - - - + + + - + + - + + - - - + diff --git a/app/build.gradle b/app/build.gradle index 9e7dcdb..0830b1d 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -20,7 +20,7 @@ android { proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } - buildToolsVersion '27.0.3' + buildToolsVersion '28.0.2' compileOptions { sourceCompatibility JavaVersion.VERSION_1_6 targetCompatibility JavaVersion.VERSION_1_6 @@ -29,11 +29,11 @@ android { dependencies { implementation fileTree(include: ['*.jar'], dir: 'libs') - implementation "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version" - implementation 'com.android.support:appcompat-v7:27.1.1' + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" + implementation 'com.android.support:appcompat-v7:27.1.0' implementation 'com.android.support.constraint:constraint-layout:1.1.2' - implementation 'com.android.support:support-v4:27.1.1' - implementation 'com.android.support:design:27.1.1' + implementation 'com.android.support:support-v4:27.1.0' + implementation 'com.android.support:design:27.1.0' implementation 'com.squareup.picasso:picasso:2.71828' testImplementation 'junit:junit:4.12' androidTestImplementation 'com.android.support.test:runner:1.0.2' 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 11617e0..b58ab01 100644 --- a/app/src/main/java/org/libre/agosto/p2play/MainActivity.kt +++ b/app/src/main/java/org/libre/agosto/p2play/MainActivity.kt @@ -29,6 +29,7 @@ class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelecte private lateinit var viewManager: RecyclerView.LayoutManager val client: Videos = Videos() private lateinit var lastItem: MenuItem + private lateinit var subItem: MenuItem lateinit var myMenu: Menu val _db = Database(this) var section: String = "" @@ -89,6 +90,7 @@ class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelecte "local" -> this.getLocalVideos() "popular" -> this.getPopularVideos() "last" -> this.getLastVideos() + "sub" -> this.getSubscriptionVideos() "my_videos" -> { if(ManagerSingleton.token.token != "") this.getMyVideos() @@ -98,6 +100,23 @@ class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelecte } } + fun getSubscriptionVideos(){ + if(ManagerSingleton.user.status != 1){ + ManagerSingleton.Toast("Inicia session primero") + startActivity(Intent(this, LoginActivity::class.java)) + return + } + swipeContainer.isRefreshing = true + section = "sub" + setTitle(R.string.title_subscriptions) + AsyncTask.execute { + val videos = client.videoSubscriptions(ManagerSingleton.token.token) + runOnUiThread { + this.setData(videos) + } + } + } + // Last videos fun getLastVideos(){ swipeContainer.isRefreshing = true @@ -202,6 +221,9 @@ class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelecte lastItem = item // item.isChecked = true when (item.itemId) { + R.id.nav_subscriptions->{ + getSubscriptionVideos() + } R.id.nav_popular-> { getPopularVideos() } 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 47b2dc3..042e0ea 100644 --- a/app/src/main/java/org/libre/agosto/p2play/ReproductorActivity.kt +++ b/app/src/main/java/org/libre/agosto/p2play/ReproductorActivity.kt @@ -1,14 +1,18 @@ package org.libre.agosto.p2play +import android.os.AsyncTask import android.support.v7.app.AppCompatActivity import android.os.Bundle +import android.os.Looper import android.util.Log import com.squareup.picasso.Picasso import kotlinx.android.synthetic.main.activity_reproductor.* +import org.libre.agosto.p2play.ajax.Subscriptions import org.libre.agosto.p2play.models.VideoModel class ReproductorActivity : AppCompatActivity() { lateinit var video:VideoModel + private val _subsciption: Subscriptions = Subscriptions() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -17,6 +21,12 @@ class ReproductorActivity : AppCompatActivity() { videoView.settings.javaScriptEnabled = true videoView.settings.allowContentAccess = true + videoView.settings.javaScriptCanOpenWindowsAutomatically = true + videoView.settings.allowFileAccess = true + videoView.settings.allowFileAccessFromFileURLs = true + videoView.settings.allowUniversalAccessFromFileURLs = true + videoView.settings.domStorageEnabled = true + try { this.video = this.intent.extras.getSerializable("video") as VideoModel tittleVideoTxt.text = this.video.name @@ -34,6 +44,21 @@ class ReproductorActivity : AppCompatActivity() { Log.d("Error", err?.message) } - subscribeBtn.setOnClickListener { ManagerSingleton.Toast(getString(R.string.comming)) } + // subscribeBtn.setOnClickListener { ManagerSingleton.Toast(getString(R.string.comming)) } + subscribeBtn.setOnClickListener { subscribe() } + } + + fun subscribe(){ + val account = this.video.userUuid+"@"+this.video.userHost + AsyncTask.execute { + if (Looper.myLooper() == null) + Looper.prepare() + val res = this._subsciption.subscribe(ManagerSingleton.token.token, account) + if (res == 1) { + runOnUiThread { + ManagerSingleton.Toast(getString(R.string.subscribeMsg)) + } + } + } } } diff --git a/app/src/main/java/org/libre/agosto/p2play/ajax/Subscriptions.kt b/app/src/main/java/org/libre/agosto/p2play/ajax/Subscriptions.kt new file mode 100644 index 0000000..b0f0cc5 --- /dev/null +++ b/app/src/main/java/org/libre/agosto/p2play/ajax/Subscriptions.kt @@ -0,0 +1,23 @@ +package org.libre.agosto.p2play.ajax + +class Subscriptions: Client() { + + fun subscribe(token: String, account: String):Int{ + var con=this._newCon("users/me/subscriptions","POST", token) + val params:String= "uri=$account" + con.outputStream.write(params.toByteArray()) + var response = 0 + + try { + if (con.responseCode == 204) { + response = 1 + } + } + catch (err: Exception){ + err.printStackTrace() + response = -1 + } + + return response + } +} \ 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 7f87afa..7f11381 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 @@ -42,13 +42,13 @@ class Videos: Client() { "views"->{ video.views = data.nextInt() } - "account"->{ + "channel"->{ data.beginObject() while (data.hasNext()){ val acKey = data.nextName() when(acKey.toString()){ - "name"->video.username=data.nextString() - "avatar"->{ + "displayName"-> video.username=data.nextString() + "avatar"-> { if(data.peek() == JsonToken.BEGIN_OBJECT){ data.beginObject() while (data.hasNext()){ @@ -64,6 +64,8 @@ class Videos: Client() { data.skipValue() } + "uuid" -> video.userUuid = data.nextString() + "host" -> video.userHost = data.nextString() else-> data.skipValue() } } @@ -133,4 +135,21 @@ class Videos: Client() { } return videos } + + fun videoSubscriptions(token: String): ArrayList{ + var con=this._newCon("users/me/subscriptions/videos","GET", token) + var videos = arrayListOf() + try { + if (con.responseCode == 200) { + var response = InputStreamReader(con.inputStream) + var data = JsonReader(response) + videos = parseVideos(data) + } + } catch(err:Exception){ + err?.printStackTrace() + Log.d("TypeErr",err?.message ,err.cause) + Log.d("Error","fallo la coneccion") + } + return videos + } } \ 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 0513e56..f7abe52 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 @@ -3,12 +3,14 @@ package org.libre.agosto.p2play.models import java.io.Serializable class VideoModel( - var name:String="", - var description:String="", - var thumbUrl:String="", - var userImageUrl:String="", - var embedUrl:String="", - var duration:Number=0, - var username:String="", - var views:Number=0 + var name: String = "", + var description: String = "", + var thumbUrl: String = "", + var userImageUrl: String = "", + var embedUrl: String = "", + var duration: Number = 0, + var username: String = "", + var views: Number = 0, + var userUuid: String = "", + var userHost: String = "" ):Serializable \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_video_library_black_24dp.xml b/app/src/main/res/drawable/ic_video_library_black_24dp.xml new file mode 100644 index 0000000..f808aee --- /dev/null +++ b/app/src/main/res/drawable/ic_video_library_black_24dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/layout/activity_reproductor.xml b/app/src/main/res/layout/activity_reproductor.xml index 21f44ad..427aa4f 100644 --- a/app/src/main/res/layout/activity_reproductor.xml +++ b/app/src/main/res/layout/activity_reproductor.xml @@ -111,8 +111,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" - android:text="@string/subscribeBtn" - android:visibility="invisible" /> + android:text="@string/subscribeBtn" /> + + Subscriptions Recent videos Popular videos Local videos diff --git a/app/src/main/res/values/menu.xml b/app/src/main/res/values/menu.xml index 23b18fd..c25957e 100644 --- a/app/src/main/res/values/menu.xml +++ b/app/src/main/res/values/menu.xml @@ -1,5 +1,6 @@ + Subscriptions Popular Recent Local diff --git a/app/src/main/res/values/reproductorActivity.xml b/app/src/main/res/values/reproductorActivity.xml index fc859c8..05cd86b 100644 --- a/app/src/main/res/values/reproductorActivity.xml +++ b/app/src/main/res/values/reproductorActivity.xml @@ -5,5 +5,8 @@ Dislike Share Report + + Subscribe + You are subscribed to this channel \ No newline at end of file From a92064552e024993eb4bc45da1b4108c621b1b6d Mon Sep 17 00:00:00 2001 From: ivan agosto Date: Wed, 10 Oct 2018 12:24:35 -0500 Subject: [PATCH 3/6] Rate video actions --- app/app.iml | 1 + .../agosto/p2play/ReproductorActivity.kt | 40 ++++++++++- .../ajax/{Subscriptions.kt => Actions.kt} | 21 +++++- .../org/libre/agosto/p2play/ajax/Videos.kt | 1 + .../libre/agosto/p2play/models/VideoModel.kt | 1 + app/src/main/res/drawable/ic_dislike.xml | 21 ++++++ app/src/main/res/drawable/ic_like.xml | 21 ++++++ .../main/res/layout/activity_reproductor.xml | 69 +++++++++++++++---- app/src/main/res/values/colors.xml | 2 + .../main/res/values/reproductorActivity.xml | 8 ++- 10 files changed, 165 insertions(+), 20 deletions(-) rename app/src/main/java/org/libre/agosto/p2play/ajax/{Subscriptions.kt => Actions.kt} (50%) create mode 100644 app/src/main/res/drawable/ic_dislike.xml create mode 100644 app/src/main/res/drawable/ic_like.xml diff --git a/app/app.iml b/app/app.iml index 233e049..65d65c4 100644 --- a/app/app.iml +++ b/app/app.iml @@ -126,6 +126,7 @@ + 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 042e0ea..60ab82c 100644 --- a/app/src/main/java/org/libre/agosto/p2play/ReproductorActivity.kt +++ b/app/src/main/java/org/libre/agosto/p2play/ReproductorActivity.kt @@ -1,18 +1,21 @@ package org.libre.agosto.p2play +import android.opengl.Visibility 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.util.Log +import android.view.View import com.squareup.picasso.Picasso import kotlinx.android.synthetic.main.activity_reproductor.* -import org.libre.agosto.p2play.ajax.Subscriptions +import org.libre.agosto.p2play.ajax.Actions import org.libre.agosto.p2play.models.VideoModel class ReproductorActivity : AppCompatActivity() { lateinit var video:VideoModel - private val _subsciption: Subscriptions = Subscriptions() + private val _actions: Actions = Actions() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -46,6 +49,8 @@ class ReproductorActivity : AppCompatActivity() { // subscribeBtn.setOnClickListener { ManagerSingleton.Toast(getString(R.string.comming)) } subscribeBtn.setOnClickListener { subscribe() } + likeLayout.setOnClickListener { rate("like") } + dislikeLayout.setOnClickListener { rate("dislike") } } fun subscribe(){ @@ -53,7 +58,7 @@ class ReproductorActivity : AppCompatActivity() { AsyncTask.execute { if (Looper.myLooper() == null) Looper.prepare() - val res = this._subsciption.subscribe(ManagerSingleton.token.token, account) + val res = this._actions.subscribe(ManagerSingleton.token.token, account) if (res == 1) { runOnUiThread { ManagerSingleton.Toast(getString(R.string.subscribeMsg)) @@ -61,4 +66,33 @@ class ReproductorActivity : AppCompatActivity() { } } } + + fun rate(rate: String){ + AsyncTask.execute { + if (Looper.myLooper() == null) + Looper.prepare() + val res = this._actions.rate(ManagerSingleton.token.token, this.video.id, rate) + if (res == 1) { + runOnUiThread { + ManagerSingleton.Toast(getString(R.string.rateMsg)) + if(rate=="like"){ + likeLayout.setBackgroundColor(ContextCompat.getColor(this, R.color.colorLike)) + dislikeLayout.background = null + } + else if(rate=="dislike"){ + dislikeLayout.setBackgroundColor(ContextCompat.getColor(this, R.color.colorDislike)) + likeLayout.background = null + } + } + } + } + } + + override fun onResume() { + super.onResume() + if(ManagerSingleton.user.status == 1) { + actionsLayout.visibility = View.VISIBLE + subscribeBtn.visibility = View.VISIBLE + } + } } diff --git a/app/src/main/java/org/libre/agosto/p2play/ajax/Subscriptions.kt b/app/src/main/java/org/libre/agosto/p2play/ajax/Actions.kt similarity index 50% rename from app/src/main/java/org/libre/agosto/p2play/ajax/Subscriptions.kt rename to app/src/main/java/org/libre/agosto/p2play/ajax/Actions.kt index b0f0cc5..f2b1bb4 100644 --- a/app/src/main/java/org/libre/agosto/p2play/ajax/Subscriptions.kt +++ b/app/src/main/java/org/libre/agosto/p2play/ajax/Actions.kt @@ -1,6 +1,6 @@ package org.libre.agosto.p2play.ajax -class Subscriptions: Client() { +class Actions: Client() { fun subscribe(token: String, account: String):Int{ var con=this._newCon("users/me/subscriptions","POST", token) @@ -20,4 +20,23 @@ class Subscriptions: Client() { return response } + + fun rate(token: String, id_video: Int, rate: String):Int{ + var con=this._newCon("videos/$id_video/rate","PUT", token) + val params:String= "rating=$rate" + con.outputStream.write(params.toByteArray()) + var response = 0 + + try { + if (con.responseCode == 204) { + response = 1 + } + } + catch (err: Exception){ + err.printStackTrace() + response = -1 + } + + return response + } } \ 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 7f11381..1444323 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 @@ -21,6 +21,7 @@ class Videos: Client() { while (data.hasNext()){ val key = data.nextName() when (key.toString()) { + "id"-> video.id = data.nextInt() "name"->{ video.name= data.nextString() } 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 f7abe52..22f7333 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 @@ -3,6 +3,7 @@ package org.libre.agosto.p2play.models import java.io.Serializable class VideoModel( + var id: Int = 0, var name: String = "", var description: String = "", var thumbUrl: String = "", diff --git a/app/src/main/res/drawable/ic_dislike.xml b/app/src/main/res/drawable/ic_dislike.xml new file mode 100644 index 0000000..af897f3 --- /dev/null +++ b/app/src/main/res/drawable/ic_dislike.xml @@ -0,0 +1,21 @@ + + + + diff --git a/app/src/main/res/drawable/ic_like.xml b/app/src/main/res/drawable/ic_like.xml new file mode 100644 index 0000000..f1ad7c0 --- /dev/null +++ b/app/src/main/res/drawable/ic_like.xml @@ -0,0 +1,21 @@ + + + + diff --git a/app/src/main/res/layout/activity_reproductor.xml b/app/src/main/res/layout/activity_reproductor.xml index 427aa4f..3eeb428 100644 --- a/app/src/main/res/layout/activity_reproductor.xml +++ b/app/src/main/res/layout/activity_reproductor.xml @@ -45,38 +45,78 @@ android:textSize="12sp" /> -