1
0
mirror of https://gitlab.com/agosto182/p2play synced 2025-02-08 16:08:39 +01:00

Merge branch 'development' into 'master'

Development

See merge request agosto182/p2play!5
This commit is contained in:
Ivan Agosto 2019-02-27 15:22:19 +00:00
commit 23dfb98a67
27 changed files with 1087 additions and 267 deletions

View File

@ -23,7 +23,7 @@ Comming soon!
## Features ## Features
- Show recent, popular and local list of videos. - Show recent, popular and local list of videos.
- Reproduce videos (very simple) - Reproduce videos
- Login and register in your instance - Login and register in your instance
- Pull to refresh - Pull to refresh
- Show uploaded videos - Show uploaded videos
@ -34,12 +34,12 @@ Comming soon!
- Splash screen - Splash screen
- Search videos - Search videos
- Infinite scroll - Infinite scroll
## What to do? (in next version)
- Share videos - Share videos
- Report videos - Report videos
- Peertube profiles - Peertube profiles
## What to do? (in next version)
- History of videos watched - History of videos watched
- Notifications - Notifications

View File

@ -7,11 +7,12 @@ apply plugin: 'kotlin-android-extensions'
android { android {
compileSdkVersion 27 compileSdkVersion 27
defaultConfig { defaultConfig {
applicationId "mx.agosto182.p2play" applicationId "org.libre.agosto.p2play"
minSdkVersion 21 minSdkVersion 21
//noinspection OldTargetApi
targetSdkVersion 27 targetSdkVersion 27
versionCode 4 versionCode 5
versionName "0.3" versionName "0.4"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
} }
buildTypes { buildTypes {

View File

@ -12,6 +12,8 @@
android:roundIcon="@mipmap/ic_p2play" android:roundIcon="@mipmap/ic_p2play"
android:supportsRtl="true" android:supportsRtl="true"
android:theme="@style/P2playTheme"> android:theme="@style/P2playTheme">
<activity android:name=".ChannelActivity"
android:theme="@style/P2playTheme.noBar"></activity>
<activity <activity
android:name=".SplashActivity" android:name=".SplashActivity"
android:theme="@style/Theme.AppCompat.Light.NoActionBar"> android:theme="@style/Theme.AppCompat.Light.NoActionBar">
@ -27,8 +29,9 @@
android:theme="@style/P2playTheme.NoActionBar" /> android:theme="@style/P2playTheme.NoActionBar" />
<activity <activity
android:name=".ReproductorActivity" android:name=".ReproductorActivity"
android:configChanges="orientation|screenSize"
android:hardwareAccelerated="true" android:hardwareAccelerated="true"
android:configChanges="orientation|screenSize"/> android:theme="@style/P2playTheme.noBar" />
<activity android:name=".LoginActivity" /> <activity android:name=".LoginActivity" />
<activity android:name=".RegisterActivity" /> <activity android:name=".RegisterActivity" />
<activity android:name=".AboutActivity" /> <activity android:name=".AboutActivity" />

View File

@ -0,0 +1,149 @@
package org.libre.agosto.p2play
import android.os.AsyncTask
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.support.v7.widget.LinearLayoutManager
import android.support.v7.widget.RecyclerView
import android.view.View
import com.squareup.picasso.Picasso
import kotlinx.android.synthetic.main.activity_channel.*
import org.libre.agosto.p2play.adapters.VideosAdapter
import org.libre.agosto.p2play.ajax.Actions
import org.libre.agosto.p2play.ajax.Channels
import org.libre.agosto.p2play.ajax.Videos
import org.libre.agosto.p2play.models.ChannelModel
import org.libre.agosto.p2play.models.VideoModel
class ChannelActivity : AppCompatActivity() {
private lateinit var channelId: String
private lateinit var channel: ChannelModel
private var isSubcribed: Boolean = false
private val _channel = Channels()
private val _videos = Videos()
private val _actions = Actions()
private lateinit var recyclerView: RecyclerView
private lateinit var viewAdapter: RecyclerView.Adapter<VideosAdapter.ViewHolder>
private lateinit var viewManager: RecyclerView.LayoutManager
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_channel)
channelId = this.intent.extras.getString("channel")
viewManager = LinearLayoutManager(this)
subcriptionBtn.setOnClickListener {
subscribeAction()
}
}
override fun onResume() {
super.onResume()
getChannel()
getSubscription()
getVideos()
if(ManagerSingleton.user.status == 1) {
subcriptionBtn.visibility = View.VISIBLE
getSubscription()
}
}
private fun getChannel() {
AsyncTask.execute {
channel = _channel.getChannelInfo(channelId)
runOnUiThread {
usernameProfile.text = channel.name
hostTxt.text = channel.host
subcriptionsTxt.text = channel.followers.toString()
if(channel.channelImg != "")
Picasso.get().load("https://${ManagerSingleton.url}${channel.channelImg}").into(channelImg)
}
}
}
private fun subscribe() {
AsyncTask.execute {
val res = _actions.subscribe(ManagerSingleton.token.token, channel.getAccount())
runOnUiThread {
if(res == 1){
subcriptionBtn.text = getString(R.string.unSubscribeBtn)
ManagerSingleton.Toast(getString(R.string.subscribeMsg), this)
getSubscription()
}
else {
ManagerSingleton.Toast(getString(R.string.errorMsg), this)
}
}
}
}
private fun unSubscribe() {
AsyncTask.execute {
val res = _actions.unSubscribe(ManagerSingleton.token.token, channel.getAccount())
runOnUiThread {
if(res == 1){
subcriptionBtn.text = getString(R.string.subscribeBtn)
ManagerSingleton.Toast(getString(R.string.unSubscribeMsg), this)
getSubscription()
}
else {
ManagerSingleton.Toast(getString(R.string.errorMsg), this)
}
}
}
}
private fun subscribeAction() {
if(isSubcribed)
unSubscribe()
else
subscribe()
}
private fun getSubscription() {
AsyncTask.execute {
isSubcribed = _actions.getSubscription(ManagerSingleton.token.token, channel.getAccount())
runOnUiThread {
if(isSubcribed){
subcriptionBtn.text = getText(R.string.unSubscribeBtn)
}
else {
subcriptionBtn.text = getText(R.string.subscribeBtn)
}
}
}
}
private fun getVideos() {
AsyncTask.execute {
val videos = _videos.channelVideos(channel.getAccount(), 0)
runOnUiThread {
initRecycler(videos)
}
}
}
// Generic function for set data to RecyclerView
private fun initRecycler(data: ArrayList<VideoModel>){
// val data = arrayListOf<VideoModel>()
viewAdapter = VideosAdapter(data)
recyclerView = findViewById<RecyclerView>(R.id.listVideosChannel).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
}
// swipeContainer.isRefreshing = false
}
}

View File

@ -60,7 +60,7 @@ class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelecte
// Init RecyclerView // Init RecyclerView
this.initRecycler() this.initRecycler()
this.getLastVideos() this.getTrengindVideos()
swipeContainer.setOnRefreshListener { swipeContainer.setOnRefreshListener {
this.refresh() this.refresh()
@ -127,6 +127,7 @@ class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelecte
when(section){ when(section){
"local" -> this.getLocalVideos() "local" -> this.getLocalVideos()
"popular" -> this.getPopularVideos() "popular" -> this.getPopularVideos()
"trending" -> this.getTrengindVideos()
"last" -> this.getLastVideos() "last" -> this.getLastVideos()
"sub" -> this.getSubscriptionVideos() "sub" -> this.getSubscriptionVideos()
"search" -> this.searchVideos() "search" -> this.searchVideos()
@ -182,6 +183,19 @@ class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelecte
} }
} }
// Trending videos
private fun getTrengindVideos(){
swipeContainer.isRefreshing = true
section = "trending"
setTitle(R.string.title_trending)
AsyncTask.execute {
val videos = client.getTrendingVideos(this.pagination)
runOnUiThread {
this.addVideos(videos)
}
}
}
// Local videos // Local videos
private fun getLocalVideos(){ private fun getLocalVideos(){
swipeContainer.isRefreshing = true swipeContainer.isRefreshing = true
@ -286,19 +300,12 @@ class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelecte
// item.isChecked = true // item.isChecked = true
when (item.itemId) { when (item.itemId) {
R.id.nav_subscriptions->{ R.id.nav_subscriptions -> getSubscriptionVideos()
getSubscriptionVideos() R.id.nav_popular -> getPopularVideos()
} R.id.nav_trending -> getTrengindVideos()
R.id.nav_popular-> { R.id.nav_recent -> getLastVideos()
getPopularVideos() R.id.nav_local -> getLocalVideos()
} R.id.nav_about -> {
R.id.nav_recent-> {
getLastVideos()
}
R.id.nav_local-> {
getLocalVideos()
}
R.id.nav_about-> {
val intent = Intent(this, AboutActivity::class.java) val intent = Intent(this, AboutActivity::class.java)
startActivity(intent) startActivity(intent)
} }
@ -320,6 +327,7 @@ class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelecte
if(ManagerSingleton.user.avatar!="" && side_imageView != null) if(ManagerSingleton.user.avatar!="" && side_imageView != null)
Picasso.get().load("https://"+ManagerSingleton.url+ManagerSingleton.user.avatar).into(side_imageView) Picasso.get().load("https://"+ManagerSingleton.url+ManagerSingleton.user.avatar).into(side_imageView)
side_imageView?.setOnClickListener { side_imageView?.setOnClickListener {
pagination = 0
getMyVideos() getMyVideos()
drawer_layout.closeDrawer(GravityCompat.START) drawer_layout.closeDrawer(GravityCompat.START)
} }
@ -355,6 +363,7 @@ class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelecte
when(section){ when(section){
"local" -> this.getLocalVideos() "local" -> this.getLocalVideos()
"popular" -> this.getPopularVideos() "popular" -> this.getPopularVideos()
"trending" -> this.getTrengindVideos()
"last" -> this.getLastVideos() "last" -> this.getLastVideos()
"sub" -> this.getSubscriptionVideos() "sub" -> this.getSubscriptionVideos()
"search" -> this.searchVideos() "search" -> this.searchVideos()

View File

@ -1,6 +1,10 @@
package org.libre.agosto.p2play package org.libre.agosto.p2play
import android.annotation.SuppressLint
import android.app.Activity import android.app.Activity
import android.content.DialogInterface
import android.content.Intent
import android.content.pm.ActivityInfo
import android.graphics.Bitmap import android.graphics.Bitmap
import android.graphics.BitmapFactory import android.graphics.BitmapFactory
import android.os.AsyncTask import android.os.AsyncTask
@ -8,30 +12,40 @@ import android.support.v7.app.AppCompatActivity
import android.os.Bundle import android.os.Bundle
import android.os.Looper import android.os.Looper
import android.support.v4.content.ContextCompat import android.support.v4.content.ContextCompat
import android.support.v7.app.AlertDialog
import android.support.v7.widget.LinearLayoutManager import android.support.v7.widget.LinearLayoutManager
import android.support.v7.widget.RecyclerView import android.support.v7.widget.RecyclerView
import android.util.Log import android.util.Log
import android.view.View import android.view.View
import android.view.WindowManager
import android.webkit.WebChromeClient import android.webkit.WebChromeClient
import android.widget.EditText
import android.widget.FrameLayout import android.widget.FrameLayout
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 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
import org.libre.agosto.p2play.ajax.Videos
import org.libre.agosto.p2play.models.CommentaryModel import org.libre.agosto.p2play.models.CommentaryModel
import org.libre.agosto.p2play.models.VideoModel import org.libre.agosto.p2play.models.VideoModel
class ReproductorActivity : AppCompatActivity() { class ReproductorActivity : AppCompatActivity() {
lateinit var video:VideoModel lateinit var video: VideoModel
private val _actions: Actions = Actions() private val _actions: Actions = Actions()
private val client: Comments = Comments() private val client: Comments = Comments()
private val videos: Videos = Videos()
// Commentaries adapter values // Commentaries adapter values
private lateinit var recyclerView: RecyclerView private lateinit var recyclerView: RecyclerView
private lateinit var viewAdapter: RecyclerView.Adapter<*> private lateinit var viewAdapter: RecyclerView.Adapter<*>
private lateinit var viewManager: RecyclerView.LayoutManager private lateinit var viewManager: RecyclerView.LayoutManager
@SuppressLint("SetJavaScriptEnabled", "SetTextI18n")
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
setContentView(R.layout.activity_reproductor) setContentView(R.layout.activity_reproductor)
@ -46,24 +60,25 @@ class ReproductorActivity : AppCompatActivity() {
videoView.settings.domStorageEnabled = true videoView.settings.domStorageEnabled = true
try { try {
this.video = this.intent.extras.getSerializable("video") as VideoModel this.video = this.intent.extras.getSerializable("video") as VideoModel
tittleVideoTxt.text = this.video.name tittleVideoTxt.text = this.video.name
viewsTxt.text = this.video.views.toString() + ' ' + getString(R.string.view_text) viewsTxt.text = "${this.video.views} ${getString(R.string.view_text)}"
userTxt.text = this.video.username userTxt.text = this.video.username
descriptionVideoTxt.text = this.video.description.toString() descriptionVideoTxt.text = this.video.description
hostTxt.text = this.video.userHost.toString() val haveDescription = this.video.description.endsWith("...")
if (haveDescription) {
showMoreBtn.visibility = View.VISIBLE
}
hostTxt.text = this.video.userHost
// Check if user had profile image // Check if user had profile image
if(this.video.userImageUrl!="") if (this.video.userImageUrl != "")
Picasso.get().load("https://"+ManagerSingleton.url+this.video.userImageUrl).into(userImg) Picasso.get().load("https://" + ManagerSingleton.url + this.video.userImageUrl).into(userImg)
// Load the video // Load the video
videoView.loadUrl("https://"+ManagerSingleton.url+this.video.embedUrl) videoView.loadUrl("https://" + ManagerSingleton.url + this.video.embedUrl)
} catch (err: Exception) {
}
catch (err:Exception){
err.printStackTrace() err.printStackTrace()
Log.d("Error", err?.message)
} }
viewManager = LinearLayoutManager(this) viewManager = LinearLayoutManager(this)
@ -75,14 +90,22 @@ class ReproductorActivity : AppCompatActivity() {
likeLayout.setOnClickListener { rate("like") } likeLayout.setOnClickListener { rate("like") }
dislikeLayout.setOnClickListener { rate("dislike") } dislikeLayout.setOnClickListener { rate("dislike") }
commentaryBtn.setOnClickListener { makeComment() } commentaryBtn.setOnClickListener { makeComment() }
showMoreBtn.setOnClickListener { getDescription() }
shareLayout.setOnClickListener { shareIntent() }
reportLayout.setOnClickListener { reportIntent() }
userImg.setOnClickListener {
val intent = Intent(this, ChannelActivity::class.java)
intent.putExtra("channel", video.getAccount())
startActivity(intent)
}
} }
private fun subscribe(){ private fun subscribe() {
val account = this.video.nameChannel+"@"+this.video.userHost
AsyncTask.execute { AsyncTask.execute {
if (Looper.myLooper() == null) if (Looper.myLooper() == null)
Looper.prepare() Looper.prepare()
val res = this._actions.subscribe(ManagerSingleton.token.token, account) val res = this._actions.subscribe(ManagerSingleton.token.token, video.getAccount())
if (res == 1) { if (res == 1) {
runOnUiThread { runOnUiThread {
ManagerSingleton.Toast(getString(R.string.subscribeMsg), this) ManagerSingleton.Toast(getString(R.string.subscribeMsg), this)
@ -92,12 +115,11 @@ class ReproductorActivity : AppCompatActivity() {
} }
} }
private fun unSubscribe(){ private fun unSubscribe() {
val account = this.video.nameChannel+"@"+this.video.userHost
AsyncTask.execute { AsyncTask.execute {
if (Looper.myLooper() == null) if (Looper.myLooper() == null)
Looper.prepare() Looper.prepare()
val res = this._actions.unSubscribe(ManagerSingleton.token.token, account) val res = this._actions.unSubscribe(ManagerSingleton.token.token, video.getAccount())
if (res == 1) { if (res == 1) {
runOnUiThread { runOnUiThread {
ManagerSingleton.Toast(getString(R.string.unSubscribeMsg), this) ManagerSingleton.Toast(getString(R.string.unSubscribeMsg), this)
@ -107,7 +129,7 @@ class ReproductorActivity : AppCompatActivity() {
} }
} }
private fun rate(rate: String){ private fun rate(rate: String) {
AsyncTask.execute { AsyncTask.execute {
if (Looper.myLooper() == null) if (Looper.myLooper() == null)
Looper.prepare() Looper.prepare()
@ -115,11 +137,10 @@ class ReproductorActivity : AppCompatActivity() {
if (res == 1) { if (res == 1) {
runOnUiThread { runOnUiThread {
ManagerSingleton.Toast(getString(R.string.rateMsg), this) ManagerSingleton.Toast(getString(R.string.rateMsg), this)
if(rate=="like"){ if (rate == "like") {
textViewLike.setTextColor(ContextCompat.getColor(this, R.color.colorLike)) textViewLike.setTextColor(ContextCompat.getColor(this, R.color.colorLike))
textViewDislike.setTextColor(ContextCompat.getColor(this, R.color.primary_dark_material_light)) textViewDislike.setTextColor(ContextCompat.getColor(this, R.color.primary_dark_material_light))
} } else if (rate == "dislike") {
else if(rate=="dislike"){
textViewDislike.setTextColor(ContextCompat.getColor(this, R.color.colorDislike)) textViewDislike.setTextColor(ContextCompat.getColor(this, R.color.colorDislike))
textViewLike.setTextColor(ContextCompat.getColor(this, R.color.primary_dark_material_light)) textViewLike.setTextColor(ContextCompat.getColor(this, R.color.primary_dark_material_light))
} }
@ -128,13 +149,13 @@ class ReproductorActivity : AppCompatActivity() {
} }
} }
private fun getRate(){ private fun getRate() {
AsyncTask.execute { AsyncTask.execute {
if (Looper.myLooper() == null) if (Looper.myLooper() == null)
Looper.prepare() Looper.prepare()
val rate = this._actions.getRate(ManagerSingleton.token.token, this.video.id) val rate = this._actions.getRate(ManagerSingleton.token.token, this.video.id)
runOnUiThread { runOnUiThread {
when (rate){ when (rate) {
"like" -> { "like" -> {
textViewLike.setTextColor(ContextCompat.getColor(this, R.color.colorLike)) textViewLike.setTextColor(ContextCompat.getColor(this, R.color.colorLike))
textViewDislike.setTextColor(ContextCompat.getColor(this, R.color.primary_dark_material_light)) textViewDislike.setTextColor(ContextCompat.getColor(this, R.color.primary_dark_material_light))
@ -152,8 +173,8 @@ class ReproductorActivity : AppCompatActivity() {
} }
} }
private fun getSubscription(){ private fun getSubscription() {
val account = this.video.nameChannel+"@"+this.video.userHost val account = this.video.nameChannel + "@" + this.video.userHost
AsyncTask.execute { AsyncTask.execute {
if (Looper.myLooper() == null) if (Looper.myLooper() == null)
Looper.prepare() Looper.prepare()
@ -164,12 +185,11 @@ class ReproductorActivity : AppCompatActivity() {
} }
} }
private fun changeSubscribeBtn(subscribed: Boolean){ private fun changeSubscribeBtn(subscribed: Boolean) {
if(subscribed){ if (subscribed) {
subscribeBtn.text = getText(R.string.unSubscribeBtn) subscribeBtn.text = getText(R.string.unSubscribeBtn)
subscribeBtn.setOnClickListener { this.unSubscribe() } subscribeBtn.setOnClickListener { this.unSubscribe() }
} } else {
else{
subscribeBtn.text = getText(R.string.subscribeBtn) subscribeBtn.text = getText(R.string.subscribeBtn)
subscribeBtn.setOnClickListener { this.subscribe() } subscribeBtn.setOnClickListener { this.subscribe() }
} }
@ -202,7 +222,7 @@ class ReproductorActivity : AppCompatActivity() {
} }
private fun makeComment() { private fun makeComment() {
if(commentaryText.text.toString() == ""){ if (commentaryText.text.toString() == "") {
ManagerSingleton.Toast(getString(R.string.emptyCommentaryMsg), this) ManagerSingleton.Toast(getString(R.string.emptyCommentaryMsg), this)
return return
} }
@ -214,8 +234,7 @@ class ReproductorActivity : AppCompatActivity() {
ManagerSingleton.Toast(getString(R.string.makedCommentaryMsg), this) ManagerSingleton.Toast(getString(R.string.makedCommentaryMsg), this)
commentaryText.text.clear() commentaryText.text.clear()
this.getComments() this.getComments()
} } else {
else {
ManagerSingleton.Toast(getString(R.string.errorCommentaryMsg), this) ManagerSingleton.Toast(getString(R.string.errorCommentaryMsg), this)
} }
} }
@ -224,14 +243,70 @@ class ReproductorActivity : AppCompatActivity() {
override fun onResume() { override fun onResume() {
super.onResume() super.onResume()
if(ManagerSingleton.user.status == 1) { if (ManagerSingleton.user.status == 1) {
this.getRate() this.getRate()
this.getSubscription() this.getSubscription()
actionsLayout.visibility = View.VISIBLE actionsLayout.visibility = View.VISIBLE
subscribeBtn.visibility = View.VISIBLE subscribeBtn.visibility = View.VISIBLE
commentaryLayout.visibility = View.VISIBLE commentaryLayout.visibility = View.VISIBLE
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)
}
}
}
fun getDescription() {
AsyncTask.execute {
val fullDescription = this.videos.fullDescription(this.video.id)
runOnUiThread {
descriptionVideoTxt.text = fullDescription
showMoreBtn.visibility = View.GONE
}
}
}
private fun shareIntent() {
val sendIntent: Intent = Intent().apply {
action = Intent.ACTION_SEND
putExtra(Intent.EXTRA_TEXT, "${video.name} ${video.getVideoUrl()}")
type = "text/plain"
}
startActivity(Intent.createChooser(sendIntent, resources.getText(R.string.shareBtn)))
}
private fun reportIntent() {
val builder = AlertDialog.Builder(this)
// Get the layout inflater
val dialog = layoutInflater.inflate(R.layout.report_dialog, null)
val inputReason = dialog.findViewById<EditText>(R.id.reportText)
// Inflate and set the layout for the dialog
// Pass null as the parent view because its going in the dialog layout
builder.setView(dialog)
// Add action buttons
.setPositiveButton(R.string.reportBtn) { dialog, id ->
val reason = inputReason.text.toString()
reportVideo(reason)
}
.setNegativeButton("Cancel") { dialog, id ->
dialog.cancel()
}
val alertDialog = builder.create()
alertDialog.show()
}
private fun reportVideo(reason: String){
AsyncTask.execute {
val res = _actions.reportVideo(video.id, reason, ManagerSingleton.token.token)
runOnUiThread {
if(res) {
ManagerSingleton.Toast(getText(R.string.reportDialogMsg).toString(), this)
}
else {
ManagerSingleton.Toast(getText(R.string.errorMsg).toString(), this)
}
} }
} }
} }
@ -250,12 +325,22 @@ class ReproductorActivity : AppCompatActivity() {
override fun onHideCustomView() { override fun onHideCustomView() {
try { try {
(this@ReproductorActivity.window.decorView as FrameLayout).removeView(this.mCustomView) this@ReproductorActivity.nonFullScreen.visibility = View.VISIBLE
this@ReproductorActivity.fullScreen.visibility = View.GONE
this@ReproductorActivity.fullScreen.removeView(this.mCustomView)
this.mCustomView = null this.mCustomView = null
this@ReproductorActivity.window.decorView.systemUiVisibility = this.mOriginalSystemUiVisibility
this@ReproductorActivity.requestedOrientation = this.mOriginalOrientation this.mCustomViewCallback!!.onCustomViewHidden()
this.mCustomViewCallback?.onCustomViewHidden()
this.mCustomViewCallback = null this.mCustomViewCallback = null
this@ReproductorActivity.requestedOrientation = this.mOriginalOrientation
// this@ReproductorActivity.window.decorView.systemUiVisibility = this.mOriginalSystemUiVisibility
val attrs = this@ReproductorActivity.window.attributes
attrs.flags = attrs.flags and WindowManager.LayoutParams.FLAG_FULLSCREEN.inv()
attrs.flags = attrs.flags and WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON.inv()
window.attributes = attrs
this@ReproductorActivity.window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_VISIBLE
} }
catch (err: Exception){ catch (err: Exception){
err.printStackTrace() err.printStackTrace()
@ -272,8 +357,21 @@ class ReproductorActivity : AppCompatActivity() {
this.mOriginalSystemUiVisibility = this@ReproductorActivity.window.decorView.systemUiVisibility this.mOriginalSystemUiVisibility = this@ReproductorActivity.window.decorView.systemUiVisibility
this.mOriginalOrientation = this@ReproductorActivity.requestedOrientation this.mOriginalOrientation = this@ReproductorActivity.requestedOrientation
this.mCustomViewCallback = paramCustomViewCallback this.mCustomViewCallback = paramCustomViewCallback
(this@ReproductorActivity.window.decorView as FrameLayout).addView(this.mCustomView, FrameLayout.LayoutParams(-1, -1)) val match_parent = WindowManager.LayoutParams.MATCH_PARENT
this@ReproductorActivity.window.decorView.systemUiVisibility = 3846
this@ReproductorActivity.nonFullScreen.visibility = View.GONE
this@ReproductorActivity.fullScreen.visibility = View.VISIBLE
this@ReproductorActivity.fullScreen.addView(paramView, FrameLayout.LayoutParams(match_parent, match_parent))
val attrs = this@ReproductorActivity.window.attributes
attrs.flags = attrs.flags or WindowManager.LayoutParams.FLAG_FULLSCREEN
attrs.flags = attrs.flags or WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
window.attributes = attrs
this@ReproductorActivity.window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LOW_PROFILE
this@ReproductorActivity.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE
} }
catch (err: Exception){ catch (err: Exception){
err.printStackTrace() err.printStackTrace()

View File

@ -6,6 +6,7 @@ import android.content.Intent
import android.graphics.drawable.Drawable import android.graphics.drawable.Drawable
import android.os.AsyncTask import android.os.AsyncTask
import android.support.v7.widget.RecyclerView import android.support.v7.widget.RecyclerView
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
@ -13,10 +14,7 @@ import android.widget.ImageView
import android.widget.LinearLayout import android.widget.LinearLayout
import android.widget.TextView import android.widget.TextView
import com.squareup.picasso.Picasso import com.squareup.picasso.Picasso
import org.libre.agosto.p2play.MainActivity import org.libre.agosto.p2play.*
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.CommentaryModel
import org.libre.agosto.p2play.models.VideoModel import org.libre.agosto.p2play.models.VideoModel
import java.io.InputStream import java.io.InputStream
@ -62,10 +60,16 @@ class CommentariesAdapter(private val myDataset: ArrayList<CommentaryModel>) :
// - replace the contents of the view with that element // - replace the contents of the view with that element
holder.username.text = myDataset[position].username holder.username.text = myDataset[position].username
// holder.userImg.setOnClickListener {
// val intent = Intent(holder.context, ChannelActivity::class.java)
// intent.putExtra("channel", myDataset[position])
// holder.context.startActivity(intent)
// }
if(myDataset[position].userImageUrl!="") if(myDataset[position].userImageUrl!="")
Picasso.get().load("https://"+ManagerSingleton.url+myDataset[position].userImageUrl).into(holder.userImg); Picasso.get().load("https://"+ManagerSingleton.url+myDataset[position].userImageUrl).into(holder.userImg);
holder.commentary.text = myDataset[position].commentary holder.commentary.text = Html.fromHtml(myDataset[position].commentary)
} }

View File

@ -13,10 +13,7 @@ import android.widget.ImageView
import android.widget.LinearLayout import android.widget.LinearLayout
import android.widget.TextView import android.widget.TextView
import com.squareup.picasso.Picasso import com.squareup.picasso.Picasso
import org.libre.agosto.p2play.MainActivity import org.libre.agosto.p2play.*
import org.libre.agosto.p2play.ManagerSingleton
import org.libre.agosto.p2play.R
import org.libre.agosto.p2play.ReproductorActivity
import org.libre.agosto.p2play.models.VideoModel import org.libre.agosto.p2play.models.VideoModel
import java.io.InputStream import java.io.InputStream
import java.io.Serializable import java.io.Serializable
@ -69,6 +66,13 @@ class VideosAdapter(private val myDataset: ArrayList<VideoModel>) :
intent.putExtra("video", myDataset[position] as Serializable) intent.putExtra("video", myDataset[position] as Serializable)
holder.context.startActivity(intent) holder.context.startActivity(intent)
} }
holder.userImg.setOnClickListener {
val intent = Intent(holder.context, ChannelActivity::class.java)
intent.putExtra("channel", myDataset[position].getAccount())
holder.context.startActivity(intent)
}
if(myDataset[position].userImageUrl!="") if(myDataset[position].userImageUrl!="")
Picasso.get().load("https://"+ManagerSingleton.url+myDataset[position].userImageUrl).into(holder.userImg) Picasso.get().load("https://"+ManagerSingleton.url+myDataset[position].userImageUrl).into(holder.userImg)
else else

View File

@ -6,7 +6,7 @@ import java.io.InputStreamReader
class Actions: Client() { class Actions: Client() {
fun subscribe(token: String, account: String):Int{ fun subscribe(token: String, account: String):Int{
var con=this._newCon("users/me/subscriptions","POST", token) val con = this._newCon("users/me/subscriptions","POST", token)
val params:String= "uri=$account" val params:String= "uri=$account"
con.outputStream.write(params.toByteArray()) con.outputStream.write(params.toByteArray())
var response = 0 var response = 0
@ -21,11 +21,12 @@ class Actions: Client() {
response = -1 response = -1
} }
con.disconnect()
return response return response
} }
fun unSubscribe(token: String, account: String):Int{ fun unSubscribe(token: String, account: String):Int{
var con=this._newCon("users/me/subscriptions/$account","DELETE", token) val con = this._newCon("users/me/subscriptions/$account","DELETE", token)
var response = 0 var response = 0
try { try {
@ -38,17 +39,18 @@ class Actions: Client() {
response = -1 response = -1
} }
con.disconnect()
return response return response
} }
fun getSubscription(token: String, account: String): Boolean{ fun getSubscription(token: String, account: String): Boolean{
var con=this._newCon("users/me/subscriptions/exist?uris=$account","GET", token) val con = this._newCon("users/me/subscriptions/exist?uris=$account","GET", token)
var isSubscribed = false var isSubscribed = false
try { try {
if (con.responseCode == 200) { if (con.responseCode == 200) {
var response = InputStreamReader(con.inputStream) val response = InputStreamReader(con.inputStream)
var data = JsonReader(response) val data = JsonReader(response)
data.beginObject() data.beginObject()
while (data.hasNext()){ while (data.hasNext()){
val key = data.nextName() val key = data.nextName()
@ -61,6 +63,7 @@ class Actions: Client() {
} }
} }
} }
data.close()
} }
} }
catch (err: Exception){ catch (err: Exception){
@ -68,12 +71,13 @@ class Actions: Client() {
isSubscribed = false isSubscribed = false
} }
con.disconnect()
return isSubscribed return isSubscribed
} }
fun rate(token: String, id_video: Int, rate: String):Int{ fun rate(token: String, id_video: Int, rate: String):Int{
var con=this._newCon("videos/$id_video/rate","PUT", token) val con = this._newCon("videos/$id_video/rate","PUT", token)
val params:String= "rating=$rate" val params = "rating=$rate"
con.outputStream.write(params.toByteArray()) con.outputStream.write(params.toByteArray())
var response = 0 var response = 0
@ -87,17 +91,18 @@ class Actions: Client() {
response = -1 response = -1
} }
con.disconnect()
return response return response
} }
fun getRate(token: String, id_video: Int):String{ fun getRate(token: String, id_video: Int):String{
var con=this._newCon("users/me/videos/$id_video/rating","GET", token) val con = this._newCon("users/me/videos/$id_video/rating","GET", token)
var rating = "none" var rating = "none"
try { try {
if (con.responseCode == 200) { if (con.responseCode == 200) {
var response = InputStreamReader(con.inputStream) val response = InputStreamReader(con.inputStream)
var data = JsonReader(response) val data = JsonReader(response)
data.beginObject() data.beginObject()
while (data.hasNext()){ while (data.hasNext()){
val key = data.nextName() val key = data.nextName()
@ -110,6 +115,7 @@ class Actions: Client() {
} }
} }
} }
con.disconnect()
} }
} }
catch (err: Exception){ catch (err: Exception){
@ -117,7 +123,25 @@ class Actions: Client() {
rating = "none" rating = "none"
} }
con.disconnect()
return rating return rating
} }
fun reportVideo(videoId: Int, reason: String, token: String): Boolean {
val con = this._newCon("videos/$videoId/abuse", "POST", token)
val params = "reason=$reason"
con.outputStream.write(params.toByteArray())
var response = false
try {
if(con.responseCode == 200){
response = true
}
} catch (err: Exception) {
err.printStackTrace()
response = false
}
return response
}
} }

View File

@ -10,19 +10,19 @@ import org.libre.agosto.p2play.models.UserModel
import java.io.InputStreamReader import java.io.InputStreamReader
class Auth: Client() { class Auth: Client() {
val stockParams = "grant_type=password" private val stockParams = "grant_type=password"
fun login(username: String, password: String, client_id: String, client_secret: String): TokenModel{ fun login(username: String, password: String, client_id: String, client_secret: String): TokenModel{
var con = this._newCon("users/token","POST") val con = this._newCon("users/token","POST")
val params:String= "$stockParams&username=$username&password=$password&client_id=$client_id&client_secret=$client_secret" val params = "$stockParams&username=$username&password=$password&client_id=$client_id&client_secret=$client_secret"
con.outputStream.write(params.toByteArray()) con.outputStream.write(params.toByteArray())
var token = TokenModel() val token = TokenModel()
try { try {
if(con.responseCode==200){ if(con.responseCode==200){
var response = InputStreamReader(con.inputStream) val response = InputStreamReader(con.inputStream)
var data = JsonReader(response) val data = JsonReader(response)
data.beginObject() data.beginObject()
while(data.hasNext()){ while(data.hasNext()){
@ -35,6 +35,7 @@ class Auth: Client() {
} }
data.endObject() data.endObject()
data.close()
token.status = 1 token.status = 1
} }
@ -47,12 +48,13 @@ class Auth: Client() {
token.status = 0 token.status = 0
} }
con.disconnect()
return token return token
} }
fun register(username: String, password: String, email: String): Int{ fun register(username: String, password: String, email: String): Int{
var con = this._newCon("users/register","POST") val con = this._newCon("users/register","POST")
val params:String= "username=$username&password=$password&email=$email" val params = "username=$username&password=$password&email=$email"
con.outputStream.write(params.toByteArray()) con.outputStream.write(params.toByteArray())
var response = 0 var response = 0
@ -67,20 +69,21 @@ class Auth: Client() {
response = -1 response = -1
} }
con.disconnect()
return response return response
} }
fun refreshToken(token: TokenModel, client_id: String, client_secret: String): TokenModel{ fun refreshToken(token: TokenModel, client_id: String, client_secret: String): TokenModel{
var con = this._newCon("users/token", "POST", token.token) val con = this._newCon("users/token", "POST", token.token)
val params:String = "refresh_token=${token.refresh_token}&response_type=code&grant_type=refresh_token&client_id=$client_id&client_secret=$client_secret" val params = "refresh_token=${token.refresh_token}&response_type=code&grant_type=refresh_token&client_id=$client_id&client_secret=$client_secret"
con.outputStream.write(params.toByteArray()) con.outputStream.write(params.toByteArray())
var token = TokenModel() // val token = TokenModel()
try { try {
if(con.responseCode==200){ if(con.responseCode==200){
var response = InputStreamReader(con.inputStream) val response = InputStreamReader(con.inputStream)
var data = JsonReader(response) val data = JsonReader(response)
data.beginObject() data.beginObject()
while(data.hasNext()){ while(data.hasNext()){
@ -93,6 +96,7 @@ class Auth: Client() {
} }
data.endObject() data.endObject()
data.close()
token.status = 1 token.status = 1
} }
@ -105,19 +109,19 @@ class Auth: Client() {
token.status = 0 token.status = 0
} }
con.disconnect()
return token return token
} }
fun me(token: String): UserModel{ fun me(token: String): UserModel{
var con = this._newCon("users/me","GET", token) val con = this._newCon("users/me","GET", token)
val user = UserModel()
var user = UserModel()
try { try {
if(con.responseCode==200){ if(con.responseCode==200){
var response = InputStreamReader(con.inputStream) val response = InputStreamReader(con.inputStream)
var data = JsonReader(response) val data = JsonReader(response)
data.beginObject() data.beginObject()
while(data.hasNext()){ while(data.hasNext()){
@ -159,6 +163,7 @@ class Auth: Client() {
} }
data.endObject() data.endObject()
data.close()
user.status = 1 user.status = 1
} }
@ -171,6 +176,7 @@ class Auth: Client() {
user.status = 0 user.status = 0
} }
con.disconnect()
return user return user
} }

View File

@ -0,0 +1,35 @@
package org.libre.agosto.p2play.ajax
import android.util.JsonReader
import android.util.JsonToken
import org.libre.agosto.p2play.models.ChannelModel
import org.libre.agosto.p2play.models.CommentaryModel
import java.io.InputStreamReader
class Channels: Client() {
private fun parseChannel(data: JsonReader): ChannelModel{
val channel = ChannelModel()
data.close()
return channel
}
fun getChannelInfo(account: String): ChannelModel {
val con = this._newCon("video-channels/$account", "GET")
var channel = ChannelModel()
try {
if(con.responseCode == 200){
val response = InputStreamReader(con.inputStream)
val data = JsonReader(response)
channel.parseChannel(data)
data.close()
}
}catch (err: Exception) {
err.printStackTrace()
}
return channel
}
}

View File

@ -1,11 +1,11 @@
package org.libre.agosto.p2play.ajax package org.libre.agosto.p2play.ajax
import android.content.SharedPreferences
import android.util.JsonReader import android.util.JsonReader
import android.util.Log import android.util.Log
import org.libre.agosto.p2play.ManagerSingleton import org.libre.agosto.p2play.ManagerSingleton
import org.libre.agosto.p2play.models.HostModel import org.libre.agosto.p2play.models.HostModel
import java.io.InputStreamReader import java.io.InputStreamReader
import java.io.Reader
import java.net.HttpURLConnection import java.net.HttpURLConnection
import java.net.URL import java.net.URL
@ -13,22 +13,22 @@ open class Client {
protected fun _newCon(uri: String, method: String, token: String = ""): HttpURLConnection { protected fun _newCon(uri: String, method: String, token: String = ""): HttpURLConnection {
var url = URL("https://"+ManagerSingleton.url+"/api/v1/"+uri) val url = URL("https://${ManagerSingleton.url}/api/v1/$uri")
var con = url.openConnection() as HttpURLConnection val con = url.openConnection() as HttpURLConnection
con.setRequestProperty("User-Agent", "P2play/0.1") con.setRequestProperty("User-Agent", "P2play/0.1")
con.setRequestProperty("Content-Type", "application/x-www-form-urlencoded") con.setRequestProperty("Content-Type", "application/x-www-form-urlencoded")
con.setRequestProperty("Accept", "*/*") con.setRequestProperty("Accept", "*/*")
if(token != ""){ if(token != ""){
con.setRequestProperty("Authorization", "Bearer ${token}") con.setRequestProperty("Authorization", "Bearer $token")
} }
con.requestMethod=method con.requestMethod=method
con.connectTimeout=10000 con.connectTimeout=10000
con.readTimeout=10000 con.readTimeout=10000
if(method.equals("POST")) if(method == "POST")
con.doOutput=true con.doOutput=true
Log.d("Petition", url.toString()) Log.d("Petition", url.toString())
@ -36,12 +36,12 @@ open class Client {
} }
fun getKeys():HostModel{ fun getKeys():HostModel{
var con=this._newCon("oauth-clients/local","GET") val con = this._newCon("oauth-clients/local","GET")
var keys = HostModel("","") val keys = HostModel("","")
try { try {
if (con.responseCode == 200) { if (con.responseCode == 200) {
var response = InputStreamReader(con.inputStream) val response = InputStreamReader(con.inputStream)
var data = JsonReader(response) val data = JsonReader(response)
data.beginObject() data.beginObject()
while (data.hasNext()) { while (data.hasNext()) {
val key = data.nextName() val key = data.nextName()
@ -57,13 +57,14 @@ open class Client {
} }
} }
} }
data.close()
} }
Log.d("Key",keys.client_id)
return keys
} catch(err:Exception){ } catch(err:Exception){
Log.d("Error",err.message) err.printStackTrace()
return keys
} }
con.disconnect()
return keys
} }

View File

@ -8,8 +8,8 @@ import java.io.InputStreamReader
class Comments: Client() { class Comments: Client() {
fun parseCommentaries(data: JsonReader): ArrayList<CommentaryModel> { private fun parseCommentaries(data: JsonReader): ArrayList<CommentaryModel> {
var commentaries = arrayListOf<CommentaryModel>() val commentaries = arrayListOf<CommentaryModel>()
data.beginObject() data.beginObject()
while (data.hasNext()){ while (data.hasNext()){
when(data.nextName()) { when(data.nextName()) {
@ -17,47 +17,7 @@ class Comments: Client() {
data.beginArray() data.beginArray()
while (data.hasNext()) { while (data.hasNext()) {
val comment = CommentaryModel() val comment = CommentaryModel()
data.beginObject() comment.parseCommentary(data)
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) commentaries.add(comment)
} }
data.endArray() data.endArray()
@ -76,37 +36,42 @@ class Comments: Client() {
try { try {
if (con.responseCode == 200) { if (con.responseCode == 200) {
var response = InputStreamReader(con.inputStream) val response = InputStreamReader(con.inputStream)
var data = JsonReader(response) val data = JsonReader(response)
commentaries = parseCommentaries(data) commentaries = parseCommentaries(data)
data.close()
} }
} catch(err:Exception){ } catch(err:Exception){
err?.printStackTrace() err.printStackTrace()
Log.d("TypeErr",err?.message ,err.cause)
Log.d("Error","fallo la coneccion")
} }
con.disconnect()
return commentaries return commentaries
} }
fun makeCommentary(token: String, videoId: Int, text: String): Boolean { fun makeCommentary(token: String, videoId: Int, text: String): Boolean {
val con = this._newCon("videos/$videoId/comment-threads", "POST", token) val con = this._newCon("videos/$videoId/comment-threads", "POST", token)
val params:String= "text=$text" val params = "text=$text"
con.outputStream.write(params.toByteArray()) con.outputStream.write(params.toByteArray())
var response: Boolean
try { try {
if (con.responseCode == 200) { if (con.responseCode == 200) {
return true con.disconnect()
response = true
} }
else{ else{
Log.d("Status", con.responseMessage) Log.d("Status", con.responseMessage)
response = false
} }
} }
catch (err: Exception){ catch (err: Exception){
err.printStackTrace() err.printStackTrace()
response = false
} }
return false con.disconnect()
return response
} }
} }

View File

@ -2,7 +2,6 @@ package org.libre.agosto.p2play.ajax
import android.util.JsonReader import android.util.JsonReader
import android.util.JsonToken import android.util.JsonToken
import android.util.Log
import org.libre.agosto.p2play.ManagerSingleton import org.libre.agosto.p2play.ManagerSingleton
import org.libre.agosto.p2play.models.VideoModel import org.libre.agosto.p2play.models.VideoModel
import java.io.InputStreamReader import java.io.InputStreamReader
@ -10,7 +9,7 @@ import java.io.InputStreamReader
class Videos: Client() { class Videos: Client() {
private fun parseVideos(data: JsonReader): ArrayList<VideoModel>{ private fun parseVideos(data: JsonReader): ArrayList<VideoModel>{
var videos = arrayListOf<VideoModel>() val videos = arrayListOf<VideoModel>()
data.beginObject() data.beginObject()
while (data.hasNext()){ while (data.hasNext()){
when(data.nextName()){ when(data.nextName()){
@ -18,68 +17,7 @@ class Videos: Client() {
data.beginArray() data.beginArray()
while (data.hasNext()) { while (data.hasNext()) {
val video = VideoModel() val video = VideoModel()
data.beginObject() video.parseVideo(data)
while (data.hasNext()){
val key = data.nextName()
when (key.toString()) {
"id"-> video.id = data.nextInt()
"name"->{
video.name= data.nextString()
}
"description"->{
if(data.peek() == JsonToken.STRING)
video.description = data.nextString()
else
data.skipValue()
}
"duration"->{
video.duration = data.nextInt()
}
"thumbnailPath"->{
video.thumbUrl = data.nextString()
}
"embedPath"->{
video.embedUrl = data.nextString()
}
"views"->{
video.views = data.nextInt()
}
"channel"->{
data.beginObject()
while (data.hasNext()){
val acKey = data.nextName()
when(acKey.toString()){
"displayName"-> video.username=data.nextString()
"avatar"-> {
if(data.peek() == JsonToken.BEGIN_OBJECT){
data.beginObject()
while (data.hasNext()){
val avKey = data.nextName()
when(avKey){
"path"-> video.userImageUrl = data.nextString()
else-> data.skipValue()
}
}
data.endObject()
}
else
data.skipValue()
}
"uuid" -> video.userUuid = data.nextString()
"host" -> video.userHost = data.nextString()
"name" -> video.nameChannel = data.nextString()
else-> data.skipValue()
}
}
data.endObject()
}
else->{
data.skipValue()
}
}
}
data.endObject()
videos.add(video) videos.add(video)
} }
data.endArray() data.endArray()
@ -98,17 +36,19 @@ class Videos: Client() {
var params = "start=$start&count=$count&sort=$sort&nsfw=$nsfw" var params = "start=$start&count=$count&sort=$sort&nsfw=$nsfw"
if(filter != "") if(filter != "")
params+="&filter=$filter" params+="&filter=$filter"
var con=this._newCon("videos?$params","GET") val con = this._newCon("videos?$params","GET")
var videos = arrayListOf<VideoModel>() var videos = arrayListOf<VideoModel>()
try { try {
if (con.responseCode == 200) { if (con.responseCode == 200) {
var response = InputStreamReader(con.inputStream) val response = InputStreamReader(con.inputStream)
var data = JsonReader(response) val data = JsonReader(response)
videos = parseVideos(data) videos = parseVideos(data)
data.close()
} }
} catch(err:Exception){ } catch(err:Exception){
err?.printStackTrace() err.printStackTrace()
} }
con.disconnect()
return videos return videos
} }
@ -120,6 +60,10 @@ class Videos: Client() {
return this.getVideos(start,"-views") return this.getVideos(start,"-views")
} }
fun getTrendingVideos(start:Int = 0): ArrayList<VideoModel>{
return this.getVideos(start,"-trending")
}
fun getLocalVideos(start:Int = 0): ArrayList<VideoModel>{ fun getLocalVideos(start:Int = 0): ArrayList<VideoModel>{
return this.getVideos(start,"-publishedAt", "local") return this.getVideos(start,"-publishedAt", "local")
} }
@ -127,34 +71,40 @@ class Videos: Client() {
fun myVideos(token: String, start: Int = 0): ArrayList<VideoModel>{ fun myVideos(token: String, start: Int = 0): ArrayList<VideoModel>{
val count = ManagerSingleton.videos_count val count = ManagerSingleton.videos_count
val params = "start=$start&count=$count" val params = "start=$start&count=$count"
var con=this._newCon("users/me/videos?$params","GET", token) val con = this._newCon("users/me/videos?$params","GET", token)
var videos = arrayListOf<VideoModel>() var videos = arrayListOf<VideoModel>()
try { try {
if (con.responseCode == 200) { if (con.responseCode == 200) {
var response = InputStreamReader(con.inputStream) val response = InputStreamReader(con.inputStream)
var data = JsonReader(response) val data = JsonReader(response)
videos = parseVideos(data) videos = parseVideos(data)
data.close()
} }
} catch(err:Exception){ } catch(err:Exception){
err?.printStackTrace() err.printStackTrace()
} }
con.disconnect()
return videos return videos
} }
fun videoSubscriptions(token: String, start: Int = 0): ArrayList<VideoModel>{ fun videoSubscriptions(token: String, start: Int = 0): ArrayList<VideoModel>{
val count = ManagerSingleton.videos_count val count = ManagerSingleton.videos_count
val params = "start=$start&count=$count" val params = "start=$start&count=$count"
var con=this._newCon("users/me/subscriptions/videos?$params","GET", token) val con = this._newCon("users/me/subscriptions/videos?$params","GET", token)
var videos = arrayListOf<VideoModel>() var videos = arrayListOf<VideoModel>()
try { try {
if (con.responseCode == 200) { if (con.responseCode == 200) {
var response = InputStreamReader(con.inputStream) val response = InputStreamReader(con.inputStream)
var data = JsonReader(response) val data = JsonReader(response)
videos = parseVideos(data) videos = parseVideos(data)
data.close()
} }
} catch(err:Exception){ } catch(err:Exception){
err?.printStackTrace() err.printStackTrace()
} }
con.disconnect()
return videos return videos
} }
@ -162,17 +112,66 @@ class Videos: Client() {
val count = ManagerSingleton.videos_count val count = ManagerSingleton.videos_count
val nsfw = ManagerSingleton.nfsw val nsfw = ManagerSingleton.nfsw
val params = "search=$text&start=$start&count=$count&nsfw=$nsfw" val params = "search=$text&start=$start&count=$count&nsfw=$nsfw"
var con=this._newCon("search/videos?$params","GET") val con = this._newCon("search/videos?$params","GET")
var videos = arrayListOf<VideoModel>() var videos = arrayListOf<VideoModel>()
try { try {
if (con.responseCode == 200) { if (con.responseCode == 200) {
var response = InputStreamReader(con.inputStream) val response = InputStreamReader(con.inputStream)
var data = JsonReader(response) val data = JsonReader(response)
videos = parseVideos(data) videos = parseVideos(data)
data.close()
} }
} catch(err:Exception){ } catch(err:Exception){
err?.printStackTrace() err.printStackTrace()
} }
con.disconnect()
return videos
}
fun fullDescription(videoId: Int): String{
val con = this._newCon("videos/$videoId/description","GET")
var description = ""
try {
if (con.responseCode == 200) {
val response = InputStreamReader(con.inputStream)
val data = JsonReader(response)
data.beginObject()
while (data.hasNext()){
val name = data.nextName()
when(name){
"description" -> description = data.nextString()
else -> data.skipValue()
}
}
data.endObject()
data.close()
}
} catch(err:Exception){
err.printStackTrace()
description = "Error!"
}
con.disconnect()
return description
}
fun channelVideos(account: String, start: Int): ArrayList<VideoModel> {
val count = ManagerSingleton.videos_count
val params = "start=$start&count=$count"
val con = this._newCon("video-channels/$account/videos","GET")
var videos = arrayListOf<VideoModel>()
try {
if (con.responseCode == 200) {
val response = InputStreamReader(con.inputStream)
val data = JsonReader(response)
videos = parseVideos(data)
data.close()
}
} catch(err:Exception){
err.printStackTrace()
}
con.disconnect()
return videos return videos
} }
} }

View File

@ -0,0 +1,64 @@
package org.libre.agosto.p2play.models
import android.util.JsonReader
import android.util.JsonToken
class ChannelModel (
var id: Int = 0,
var url: String = "",
var nameChannel: String = "",
var followers: Int = 0,
var host: String = "",
var name: String = "",
var description: String = "",
var support: String = "",
var channelImg: String = ""
) {
fun getAccount(): String {
return "$nameChannel@$host"
}
fun parseChannel(data: JsonReader) {
data.beginObject()
while (data.hasNext()) {
when(data.nextName()){
"id" -> this.id = data.nextInt()
"url" -> this.url = data.nextString()
"name" -> this.nameChannel = data.nextString()
"host" -> this.host = data.nextString()
"followersCount" -> this.followers = data.nextInt()
"displayName" -> this.name = data.nextString()
"description" -> {
if(data.peek() == JsonToken.STRING)
this.description = data.nextString()
else
data.skipValue()
}
"support" -> {
if(data.peek() == JsonToken.STRING)
this.support = data.nextString()
else
data.skipValue()
}
"avatar" -> {
if(data.peek() == JsonToken.BEGIN_OBJECT){
data.beginObject()
while (data.hasNext()){
when(data.nextName()){
"path" -> this.channelImg = data.nextString()
else -> data.skipValue()
}
}
data.endObject()
}
else
data.skipValue()
}
else -> data.skipValue()
}
}
data.endObject()
}
}

View File

@ -1,5 +1,8 @@
package org.libre.agosto.p2play.models package org.libre.agosto.p2play.models
import android.util.JsonReader
import android.util.JsonToken
class CommentaryModel ( class CommentaryModel (
var id: Int = 0, var id: Int = 0,
var threadId: Int = 0, var threadId: Int = 0,
@ -9,4 +12,48 @@ class CommentaryModel (
var commentary: String = "", var commentary: String = "",
var userHost: String = "", var userHost: String = "",
var replies: Int = 0 var replies: Int = 0
) ) {
fun parseCommentary(data: JsonReader) {
data.beginObject()
while (data.hasNext()) {
val key = data.nextName()
when (key.toString()) {
"id" -> this.id = data.nextInt()
"threadId" -> this.threadId = data.nextInt()
"text" -> this.commentary = data.nextString()
"totalReplies" -> this.replies = data.nextInt()
"account" -> {
data.beginObject()
while (data.hasNext()){
val acKey = data.nextName()
when(acKey.toString()){
"displayName"-> this.username=data.nextString()
"avatar"-> {
if(data.peek() == JsonToken.BEGIN_OBJECT){
data.beginObject()
while (data.hasNext()){
val avKey = data.nextName()
when(avKey){
"path"-> this.userImageUrl = data.nextString()
else-> data.skipValue()
}
}
data.endObject()
}
else
data.skipValue()
}
"uuid" -> this.userUuid = data.nextString()
"host" -> this.userHost = data.nextString()
else -> data.skipValue()
}
}
data.endObject()
}
else -> data.skipValue()
}
}
data.endObject()
}
}

View File

@ -1,9 +1,12 @@
package org.libre.agosto.p2play.models package org.libre.agosto.p2play.models
import android.util.JsonReader
import android.util.JsonToken
import java.io.Serializable import java.io.Serializable
class VideoModel( class VideoModel(
var id: Int = 0, var id: Int = 0,
var uuid: String = "",
var name: String = "", var name: String = "",
var description: String = "", var description: String = "",
var thumbUrl: String = "", var thumbUrl: String = "",
@ -15,4 +18,78 @@ class VideoModel(
var userUuid: String = "", var userUuid: String = "",
var userHost: String = "", var userHost: String = "",
var nameChannel: String = "" var nameChannel: String = ""
):Serializable ):Serializable {
fun getAccount(): String {
return "$nameChannel@$userHost"
}
fun getVideoUrl(): String {
return "https://$userHost/videos/watch/$uuid"
}
fun parseVideo(data: JsonReader){
data.beginObject()
while (data.hasNext()){
val key = data.nextName()
when (key.toString()) {
"id"-> this.id = data.nextInt()
"uuid" -> this.uuid = data.nextString()
"name"->{
this.name= data.nextString()
}
"description"->{
if(data.peek() == JsonToken.STRING)
this.description = data.nextString()
else
data.skipValue()
}
"duration"->{
this.duration = data.nextInt()
}
"thumbnailPath"->{
this.thumbUrl = data.nextString()
}
"embedPath"->{
this.embedUrl = data.nextString()
}
"views"->{
this.views = data.nextInt()
}
"channel"->{
data.beginObject()
while (data.hasNext()){
val acKey = data.nextName()
when(acKey.toString()){
"displayName"-> this.username=data.nextString()
"avatar"-> {
if(data.peek() == JsonToken.BEGIN_OBJECT){
data.beginObject()
while (data.hasNext()){
val avKey = data.nextName()
when(avKey){
"path"-> this.userImageUrl = data.nextString()
else-> data.skipValue()
}
}
data.endObject()
}
else
data.skipValue()
}
"uuid" -> this.userUuid = data.nextString()
"host" -> this.userHost = data.nextString()
"name" -> this.nameChannel = data.nextString()
else-> data.skipValue()
}
}
data.endObject()
}
else->{
data.skipValue()
}
}
}
data.endObject()
}
}

View File

@ -0,0 +1,25 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:pathData="M12.8716,3.5097L12,1.9603L11.1284,3.5097L2.1284,19.5097L1.2902,21L3,21L21,21L22.7098,21L21.8716,19.5097L12.8716,3.5097Z"
android:strokeLineJoin="round"
android:strokeWidth="2"
android:fillColor="#00000000"
android:strokeColor="#000000"
android:fillType="evenOdd"/>
<path
android:pathData="M12,17.75C12.6904,17.75 13.25,17.1904 13.25,16.5C13.25,15.8096 12.6904,15.25 12,15.25C11.3096,15.25 10.75,15.8096 10.75,16.5C10.75,17.1904 11.3096,17.75 12,17.75Z"
android:strokeWidth="1"
android:fillColor="#000000"
android:fillType="evenOdd"
android:strokeColor="#00000000"/>
<path
android:pathData="M12,9L12,9A1,1 0,0 1,13 10L13,13A1,1 0,0 1,12 14L12,14A1,1 0,0 1,11 13L11,10A1,1 0,0 1,12 9z"
android:strokeWidth="1"
android:fillColor="#000000"
android:fillType="evenOdd"
android:strokeColor="#00000000"/>
</vector>

View File

@ -0,0 +1,29 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:pathData="M20,15L20,18.0026C20,19.1057 19.1074,20 18.0049,20L5.9951,20C4.8932,20 4,19.1074 4,18.0049L4,5.9951C4,4.8932 4.8959,4 5.9974,4L9,4"
android:strokeWidth="2"
android:fillColor="#00000000"
android:strokeColor="#000000"
android:fillType="evenOdd"
android:strokeLineCap="round"/>
<path
android:pathData="M13,4l7.0208,0l0,7.0191"
android:strokeLineJoin="round"
android:strokeWidth="2"
android:fillColor="#00000000"
android:strokeColor="#000000"
android:fillType="evenOdd"
android:strokeLineCap="round"/>
<path
android:pathData="M19,5L12,12"
android:strokeLineJoin="round"
android:strokeWidth="2"
android:fillColor="#00000000"
android:strokeColor="#000000"
android:fillType="evenOdd"
android:strokeLineCap="round"/>
</vector>

View File

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
android:fillColor="#FF000000"
android:pathData="M16,6l2.29,2.29 -4.88,4.88 -4,-4L2,16.59 3.41,18l6,-6 4,4 6.3,-6.29L22,12V6z"/>
</vector>

View File

@ -0,0 +1,154 @@
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.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:layout_width="match_parent"
android:layout_height="wrap_content"
tools:context=".ChannelActivity">
<ScrollView
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<LinearLayout
android:id="@+id/linearLayout2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/colorProfile"
android:gravity="center_horizontal"
android:orientation="vertical"
android:paddingTop="20dp"
android:paddingBottom="10dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<ImageButton
android:id="@+id/channelImg"
android:layout_width="match_parent"
android:layout_height="70dp"
android:adjustViewBounds="false"
android:background="@android:color/transparent"
android:contentDescription="@string/app_name"
android:cropToPadding="false"
android:scaleType="fitCenter"
app:srcCompat="@drawable/default_avatar" />
<TextView
android:id="@+id/usernameProfile"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:layout_marginBottom="5dp"
android:textAlignment="center"
android:textAppearance="@style/TextAppearance.AppCompat.Medium"
android:textColor="@android:color/white" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
android:baselineAligned="false">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="center_vertical"
android:orientation="horizontal">
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/followersIndicator"
android:textAlignment="center"
android:textColor="@android:color/white"
android:textStyle="bold" />
<TextView
android:id="@+id/subcriptionsTxt"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:textAlignment="textStart"
android:textColor="@android:color/white" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:orientation="horizontal">
<TextView
android:id="@+id/textView3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/hostIndicator"
android:textAlignment="center"
android:textColor="@android:color/white"
android:textStyle="bold" />
<TextView
android:id="@+id/hostTxt"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:textAlignment="textStart"
android:textColor="@android:color/white" />
</LinearLayout>
</LinearLayout>
<Button
android:id="@+id/subcriptionBtn"
style="@style/Widget.AppCompat.Button.Colored"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/subscribeBtn"
android:textAlignment="center"
android:visibility="invisible" />
</LinearLayout>
<FrameLayout
android:id="@+id/frameLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingLeft="5dp"
android:paddingRight="5dp"
app:layout_constraintTop_toBottomOf="@+id/linearLayout2"
tools:layout_editor_absoluteX="0dp">
<TextView
android:id="@+id/textView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Videos:"
android:textStyle="bold"
tools:layout_editor_absoluteX="176dp"
tools:layout_editor_absoluteY="214dp" />
</FrameLayout>
<android.support.v7.widget.RecyclerView
android:id="@+id/listVideosChannel"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:scrollbars="none" />
</LinearLayout>
</ScrollView>
</android.support.constraint.ConstraintLayout>

View File

@ -6,7 +6,18 @@
android:layout_height="match_parent" android:layout_height="match_parent"
tools:context=".ReproductorActivity"> tools:context=".ReproductorActivity">
<RelativeLayout
android:id="@+id/fullScreen"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_alignParentTop="true"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
android:layout_alignParentRight="true"
android:visibility="gone" />
<ScrollView <ScrollView
android:id="@+id/nonFullScreen"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="0dp" android:layout_height="0dp"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
@ -113,21 +124,61 @@
android:textAlignment="center" /> android:textAlignment="center" />
</LinearLayout> </LinearLayout>
<Button <LinearLayout
android:id="@+id/button4" android:id="@+id/reportLayout"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="match_parent"
android:layout_weight="1" android:layout_weight="1"
android:text="@string/shareBtn" android:orientation="vertical"
android:visibility="gone" /> android:visibility="visible">
<Button <ImageView
android:id="@+id/button3" android:id="@+id/imageViewAlert"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:adjustViewBounds="false"
android:contentDescription="@string/dislikeBtn"
android:cropToPadding="false"
android:visibility="visible"
app:srcCompat="@drawable/ic_alert" />
<TextView
android:id="@+id/textViewAlert"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:text="@string/reportBtn"
android:textAlignment="center" />
</LinearLayout>
<LinearLayout
android:id="@+id/shareLayout"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="match_parent"
android:layout_weight="1" android:layout_weight="1"
android:text="@string/reportBtn" android:orientation="vertical"
android:visibility="gone" /> android:visibility="visible">
<ImageView
android:id="@+id/imageViewShare"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:adjustViewBounds="false"
android:contentDescription="@string/dislikeBtn"
android:cropToPadding="false"
android:visibility="visible"
app:srcCompat="@drawable/ic_share" />
<TextView
android:id="@+id/textViewShare"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:text="@string/shareBtn"
android:textAlignment="center" />
</LinearLayout>
</LinearLayout> </LinearLayout>
<LinearLayout <LinearLayout
@ -180,7 +231,7 @@
android:layout_weight="1" android:layout_weight="1"
android:text="@string/subscribeBtn" android:text="@string/subscribeBtn"
android:textSize="10sp" android:textSize="10sp"
android:visibility="visible" /> android:visibility="invisible" />
</LinearLayout> </LinearLayout>
<TextView <TextView
@ -190,12 +241,15 @@
android:maxLength="1000" android:maxLength="1000"
android:maxLines="100" android:maxLines="100"
android:paddingLeft="5dp" android:paddingLeft="5dp"
android:text="@string/descriptionTxt" /> android:text="@string/descriptionTxt"
android:textStyle="bold" />
<TextView <TextView
android:id="@+id/descriptionVideoTxt" android:id="@+id/descriptionVideoTxt"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="2dp"
android:layout_marginBottom="2dp"
android:autoLink="web" android:autoLink="web"
android:linksClickable="true" android:linksClickable="true"
android:maxLength="10000" android:maxLength="10000"
@ -203,6 +257,15 @@
android:paddingLeft="10dp" android:paddingLeft="10dp"
android:paddingRight="10dp" /> android:paddingRight="10dp" />
<Button
android:id="@+id/showMoreBtn"
style="@style/Widget.AppCompat.Button.Borderless.Colored"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/showMore"
android:visibility="gone" />
<View <View
android:id="@+id/divider" android:id="@+id/divider"
android:layout_width="match_parent" android:layout_width="match_parent"
@ -211,14 +274,16 @@
<Space <Space
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="30dp" /> android:layout_height="10dp"
android:layout_weight="1" />
<TextView <TextView
android:id="@+id/commentariesTxt" android:id="@+id/commentariesTxt"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:paddingLeft="5dp" android:paddingLeft="5dp"
android:text="@string/commentariesTxt" /> android:text="@string/commentariesTxt"
android:textStyle="bold" />
<Space <Space
android:layout_width="match_parent" android:layout_width="match_parent"
@ -268,7 +333,6 @@
android:id="@+id/listCommentaries" android:id="@+id/listCommentaries"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:scrollbars="none"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" /> app:layout_constraintTop_toTopOf="parent" />

View File

@ -0,0 +1,26 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/layout_root"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:padding="10dp" >
<TextView
android:id="@+id/reportTxt"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/reportDialog"
android:textAppearance="?android:attr/textAppearanceLarge" />
<EditText
android:id="@+id/reportText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="textMultiLine">
<requestFocus />
</EditText>
</LinearLayout>

View File

@ -16,6 +16,10 @@
android:id="@+id/nav_popular" android:id="@+id/nav_popular"
android:icon="@android:drawable/btn_star" android:icon="@android:drawable/btn_star"
android:title="@string/nav_popular" /> android:title="@string/nav_popular" />
<item
android:id="@+id/nav_trending"
android:icon="@drawable/ic_trending_up_black_24dp"
android:title="@string/nav_trending" />
<item <item
android:id="@+id/nav_recent" android:id="@+id/nav_recent"
android:icon="@drawable/ic_add_circle_black_24dp" android:icon="@drawable/ic_add_circle_black_24dp"

View File

@ -91,6 +91,13 @@
<string name="pref_hostname_title">Instancia Peertube</string> <string name="pref_hostname_title">Instancia Peertube</string>
<string name="pref_message_exit">Reinicia para aplicar los cambios</string> <string name="pref_message_exit">Reinicia para aplicar los cambios</string>
<string name="pref_videos_count_title">Videos por pagina</string> <string name="pref_videos_count_title">Videos por pagina</string>
<string name="showMore">Mostrar mas</string>
<string name="nav_trending">Tendencias</string>
<string name="title_trending">Tendencias</string>
<string name="followersIndicator">Seguidores:</string>
<string name="hostIndicator">Host:</string>
<string name="reportDialog">Razon para reportar:</string>
<string name="reportDialogMsg">Has reportado el video</string>
<!-- End Settings strings --> <!-- End Settings strings -->
</resources> </resources>

View File

@ -6,7 +6,7 @@
<string name="navigation_drawer_close" translatable="false">Close navigation drawer</string> <string name="navigation_drawer_close" translatable="false">Close navigation drawer</string>
<string name="nav_header_desc" translatable="false">Navigation header</string> <string name="nav_header_desc" translatable="false">Navigation header</string>
<string name="comming">Coming soon!</string> <string name="comming">Coming soon!</string>
<string name="charging">Loading...</string> <string name="charging">Loading</string>
<!-- End Global string --> <!-- End Global string -->
@ -48,8 +48,9 @@
<!-- End Login strings --> <!-- End Login strings -->
<!-- Start Main strings --> <!-- Start Main strings -->
<string name="title_subscriptions">Subscriptions</string> <string name="title_subscriptions">Subscriptions</string>
<string name="title_recent">Recent videos</string> <string name="title_recent">Recent</string>
<string name="title_popular">Popular videos</string> <string name="title_popular">Popular</string>
<string name="title_trending">Trending</string>
<string name="title_local">Local videos</string> <string name="title_local">Local videos</string>
<string name="title_myVideos">My videos</string> <string name="title_myVideos">My videos</string>
<string name="view_text">views</string> <string name="view_text">views</string>
@ -64,6 +65,7 @@
<!-- Start Menu strings --> <!-- Start Menu strings -->
<string name="nav_subscriptions">Subscriptions</string> <string name="nav_subscriptions">Subscriptions</string>
<string name="nav_popular">Popular</string> <string name="nav_popular">Popular</string>
<string name="nav_trending">Trending</string>
<string name="nav_recent">Recent</string> <string name="nav_recent">Recent</string>
<string name="nav_local">Local</string> <string name="nav_local">Local</string>
<string name="nav_about">About</string> <string name="nav_about">About</string>
@ -85,6 +87,7 @@
<string name="reportBtn">Report</string> <string name="reportBtn">Report</string>
<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>
<!-- Messages --> <!-- Messages -->
<string name="subscribeMsg">You are subscribed to this channel</string> <string name="subscribeMsg">You are subscribed to this channel</string>
<string name="rateMsg">You are rated the video</string> <string name="rateMsg">You are rated the video</string>
@ -104,5 +107,12 @@
<string name="pref_message_exit">Restart app to apply changes</string> <string name="pref_message_exit">Restart app to apply changes</string>
<string name="pref_videos_count_title">Videos per page</string> <string name="pref_videos_count_title">Videos per page</string>
<!-- End Settings strings --> <!-- End Settings strings -->
<!-- Start Channel strings -->
<string name="followersIndicator">Followers:</string>
<string name="hostIndicator">Host:</string>
<!-- End Channel strings -->
<!-- Start Prompt string -->
<string name="reportDialog">Reason for report video:</string>
<string name="reportDialogMsg">You are reported the video</string>
<!-- End Prompt strings -->
</resources> </resources>

View File

@ -13,6 +13,12 @@
<item name="windowNoTitle">true</item> <item name="windowNoTitle">true</item>
</style> </style>
<style name="P2playTheme.noBar" parent="Theme.AppCompat.Light.NoActionBar">
<item name="colorPrimary">@color/colorHeader</item>
<item name="colorPrimaryDark">@android:color/darker_gray</item>
<item name="colorAccent">@android:color/holo_orange_dark</item>
</style>
<style name="P2playTheme.AppBarOverlay" parent="ThemeOverlay.AppCompat.ActionBar" /> <style name="P2playTheme.AppBarOverlay" parent="ThemeOverlay.AppCompat.ActionBar" />
<style name="P2playTheme.PopupOverlay" parent="ThemeOverlay.AppCompat.Light" /> <style name="P2playTheme.PopupOverlay" parent="ThemeOverlay.AppCompat.Light" />