21 Commits

Author SHA1 Message Date
ac191c04d3 Updates of descriptions and screenshots 2024-03-28 19:06:38 -06:00
15aaae2fa1 Fix video preview sizes 2024-03-28 18:41:49 -06:00
42be7c4f77 Merge branch 'feature/add-exo-player' into 'master'
Feature/add exo player

See merge request agosto182/p2play!14
2024-03-28 23:58:25 +00:00
e022fe5e96 Add fullscreen to exoplayer 2024-03-28 17:29:32 -06:00
1f90e21f68 Fix: Fullscreen bug 2024-03-27 21:31:41 -06:00
c104bf32da Merge branch 'master' into feature/add-exo-player 2024-03-27 20:57:17 -06:00
a3cd0b92ed Merge branch 'feature/update-video-view' into 'master'
Feature/update video view

See merge request agosto182/p2play!13
2024-03-28 02:54:14 +00:00
2de1bde4cd Feature/update video view 2024-03-28 02:54:14 +00:00
6f0b97dbc4 Exo player first integration 2024-03-27 20:44:52 -06:00
2fcd3b21f8 Add isLive indicator 2024-03-25 19:57:49 -06:00
eeb20f1f9d Update function name to the correct one 2024-03-25 19:57:22 -06:00
0d9bd5410a Update to sdk 32 2024-03-25 18:53:01 -06:00
40b193a816 Update duration data to a floating text 2024-03-22 18:12:14 -06:00
c500ba9aa4 Merge branch 'androidx' into 'master'
Androidx

See merge request agosto182/p2play!12
2024-03-22 23:23:16 +00:00
35aa0fcea1 Androidx 2024-03-22 23:23:16 +00:00
ba0a298ea9 Add new theme to Channel view 2024-03-22 17:20:42 -06:00
815bafaee1 Update edittext to materialTextview 2024-03-22 16:55:52 -06:00
ef5c97dce1 Finish update to androidx 2024-03-22 12:28:39 -06:00
b6ef9b8aca Normalize theme 2024-03-21 17:47:54 -06:00
bf35a75877 Add material theme 2024-03-21 14:23:36 -06:00
65e061fd25 First changes to androidx 2024-03-20 21:04:16 -06:00
72 changed files with 968 additions and 372 deletions

View File

@ -9,16 +9,12 @@ P2Play is an unoficial Peertube android application.
## Screenshots ## Screenshots
![screenshot](screenshots/screenshot.png) <img src="metadata/en-US/images/phoneScreenshots/1.jpg" alt="Screenshot" width="14%"/>
![screenshot](screenshots/screenshot2.png) <img src="metadata/en-US/images/phoneScreenshots/2.jpg" alt="Screenshot" width="14%"/>
![screenshot](screenshots/screenshot3.png) <img src="metadata/en-US/images/phoneScreenshots/3.jpg" alt="Screenshot" width="14%"/>
![screenshot](screenshots/screenshot4.png) <img src="metadata/en-US/images/phoneScreenshots/4.jpg" alt="Screenshot" width="14%"/>
![screenshot](screenshots/screenshot5.png) <img src="metadata/en-US/images/phoneScreenshots/5.jpg" alt="Screenshot" width="14%">/
![screenshot](screenshots/screenshot6.png) <img src="metadata/en-US/images/phoneScreenshots/6.jpg" alt="Screenshot" width="14%"/>
## Documentation
Comming soon!
## Realeases (apk's) ## Realeases (apk's)
@ -41,16 +37,20 @@ Comming soon!
- Share videos - Share videos
- Report videos - Report videos
- Peertube profiles - Peertube profiles
- Day/Night theme
## What to do? (on incomming updates) ## What to do? (on incomming updates)
- Playlists - Playlists
- Manage subscriptions - Manage subscriptions
- Better commentaries - Better commentaries
- New video player - Account channels view
- Notifications
## Demostrations ## Demostrations
P2play beta 0.6.0: https://fediverse.tv/w/suFPkm9zJstSrQU7WmVARv
**Dead links** **Dead links**
~~Demostration P2play Beta 0.2: https://peertube.video/videos/watch/730fa68e-32c4-4cdb-a7bb-1a819c9d3a46~~ ~~Demostration P2play Beta 0.2: https://peertube.video/videos/watch/730fa68e-32c4-4cdb-a7bb-1a819c9d3a46~~

View File

@ -6,15 +6,15 @@ plugins {
} }
android { android {
compileSdkVersion 30 compileSdkVersion 34
defaultConfig { defaultConfig {
applicationId "org.libre.agosto.p2play" applicationId "org.libre.agosto.p2play"
minSdkVersion 26 minSdkVersion 26
//noinspection OldTargetApi targetSdkVersion 32
targetSdkVersion 28 versionCode 9
versionCode 8 versionName "0.6.0"
versionName "0.5.2"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
vectorDrawables.useSupportLibrary = true
} }
buildTypes { buildTypes {
release { release {
@ -22,7 +22,6 @@ android {
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
} }
} }
buildToolsVersion '30.0.2'
compileOptions { compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8 sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8
@ -31,17 +30,23 @@ android {
checkReleaseBuilds false checkReleaseBuilds false
abortOnError false abortOnError false
} }
namespace 'org.libre.agosto.p2play'
} }
dependencies { dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs') implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version" implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support.constraint:constraint-layout:2.0.4'
implementation 'com.android.support:support-v4:28.0.0'
implementation 'com.android.support:design:28.0.0'
implementation 'com.squareup.picasso:picasso:2.71828' implementation 'com.squareup.picasso:picasso:2.71828'
implementation 'androidx.appcompat:appcompat:1.0.2'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
implementation 'com.android.support:appcompat-v7:23.2.0'
implementation 'com.google.android.material:material:1.6.0'
testImplementation 'junit:junit:4.12' testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2' androidTestImplementation 'androidx.test:runner:1.5.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.0'
implementation 'androidx.media3:media3-exoplayer:1.1.1'
implementation 'androidx.media3:media3-exoplayer-dash:1.1.1'
implementation 'androidx.media3:media3-ui:1.1.1'
implementation 'androidx.media3:media3-exoplayer-hls:1.1.1'
} }

View File

@ -1,24 +0,0 @@
package org.libre.agosto.p2play
import android.support.test.InstrumentationRegistry
import android.support.test.runner.AndroidJUnit4
import org.junit.Test
import org.junit.runner.RunWith
import org.junit.Assert.*
/**
* Instrumented test, which will execute on an Android device.
*
* See [testing documentation](http://d.android.com/tools/testing).
*/
@RunWith(AndroidJUnit4::class)
class ExampleInstrumentedTest {
@Test
fun useAppContext() {
// Context of the app under test.
val appContext = InstrumentationRegistry.getTargetContext()
assertEquals("org.libre.agosto.p2play", appContext.packageName)
}
}

View File

@ -1,6 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" <manifest xmlns:android="http://schemas.android.com/apk/res/android">
package="org.libre.agosto.p2play">
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
@ -11,33 +10,42 @@
android:label="@string/app_name" android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round" android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true" android:supportsRtl="true"
android:theme="@style/P2playTheme"> android:theme="@style/Theme.P2play">
<activity android:name=".ChannelActivity" <activity android:name=".ChannelActivity"
android:theme="@style/P2playTheme.noBar" /> android:theme="@style/Theme.P2play.NoActionBar"
android:exported="false" />
<activity <activity
android:name=".SplashActivity" android:name=".SplashActivity"
android:theme="@style/Theme.AppCompat.Light.NoActionBar"> android:theme="@style/Theme.P2play.NoActionBar"
android:exported="true">
<intent-filter> <intent-filter>
<action android:name="android.intent.action.MAIN" /> <action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" /> <category android:name="android.intent.category.LAUNCHER" />
</intent-filter> </intent-filter>
</activity> </activity>
<activity android:name=".HostActivity" /> <activity
android:name=".HostActivity"
android:theme="@style/Theme.P2play.NoActionBar"
android:exported="false" />
<activity <activity
android:name=".MainActivity" android:name=".MainActivity"
android:theme="@style/P2playTheme.NoActionBar" /> android:theme="@style/Theme.P2play.NoActionBar"
android:exported="false" />
<activity <activity
android:name=".ReproductorActivity" android:name=".ReproductorActivity"
android:configChanges="orientation|screenSize" android:configChanges="orientation|screenSize"
android:hardwareAccelerated="true" android:hardwareAccelerated="true"
android:theme="@style/P2playTheme.noBar" /> android:theme="@style/Theme.P2play.NoActionBar"
<activity android:name=".LoginActivity" /> android:exported="false" />
<activity android:name=".RegisterActivity" /> <activity android:name=".LoginActivity" android:exported="false" />
<activity android:name=".AboutActivity" /> <activity android:name=".RegisterActivity" android:exported="false" />
<activity android:name=".AboutActivity" android:exported="false" />
<activity <activity
android:name=".SettingsActivity" android:name=".SettingsActivity"
android:label="@string/title_activity_settings" /> android:label="@string/title_activity_settings"
android:theme="@style/Theme.P2play"
android:exported="false"/>
</application> </application>
</manifest> </manifest>

View File

@ -1,8 +1,8 @@
package org.libre.agosto.p2play package org.libre.agosto.p2play
import android.support.v7.app.AppCompatActivity
import android.os.Bundle import android.os.Bundle
import android.text.method.LinkMovementMethod import androidx.appcompat.app.AppCompatActivity
import kotlinx.android.synthetic.main.activity_about.* import kotlinx.android.synthetic.main.activity_about.*
class AboutActivity : AppCompatActivity() { class AboutActivity : AppCompatActivity() {

View File

@ -1,15 +1,15 @@
package org.libre.agosto.p2play package org.libre.agosto.p2play
import androidx.appcompat.app.ActionBar
import android.content.res.Configuration import android.content.res.Configuration
import android.os.Bundle import android.os.Bundle
import android.preference.PreferenceActivity import android.preference.PreferenceActivity
import android.support.annotation.LayoutRes
import android.support.v7.app.ActionBar
import android.support.v7.app.AppCompatDelegate
import android.support.v7.widget.Toolbar
import android.view.MenuInflater import android.view.MenuInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.annotation.LayoutRes
import androidx.appcompat.app.AppCompatDelegate
import androidx.appcompat.widget.Toolbar
/** /**
* A [android.preference.PreferenceActivity] which implements and proxies the necessary calls * A [android.preference.PreferenceActivity] which implements and proxies the necessary calls

View File

@ -1,10 +1,10 @@
package org.libre.agosto.p2play package org.libre.agosto.p2play
import android.os.AsyncTask import android.os.AsyncTask
import android.support.v7.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle import android.os.Bundle
import android.support.v7.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import android.support.v7.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import android.view.View import android.view.View
import com.squareup.picasso.Picasso import com.squareup.picasso.Picasso
import kotlinx.android.synthetic.main.activity_channel.* import kotlinx.android.synthetic.main.activity_channel.*

View File

@ -3,14 +3,12 @@ package org.libre.agosto.p2play
import android.content.Intent import android.content.Intent
import android.content.SharedPreferences import android.content.SharedPreferences
import android.os.AsyncTask import android.os.AsyncTask
import android.support.v7.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle import android.os.Bundle
import android.os.Looper import android.os.Looper
import android.preference.PreferenceManager import android.preference.PreferenceManager
import android.util.Log
import kotlinx.android.synthetic.main.activity_host.* import kotlinx.android.synthetic.main.activity_host.*
import org.libre.agosto.p2play.ajax.Auth import org.libre.agosto.p2play.ajax.Auth
import org.libre.agosto.p2play.ajax.Client
class HostActivity : AppCompatActivity() { class HostActivity : AppCompatActivity() {
lateinit var settings: SharedPreferences lateinit var settings: SharedPreferences

View File

@ -3,11 +3,10 @@ package org.libre.agosto.p2play
import android.content.Intent import android.content.Intent
import android.content.SharedPreferences import android.content.SharedPreferences
import android.os.AsyncTask import android.os.AsyncTask
import android.support.v7.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle import android.os.Bundle
import android.os.Looper import android.os.Looper
import android.preference.PreferenceManager import android.preference.PreferenceManager
import android.util.Log
import kotlinx.android.synthetic.main.activity_login.* import kotlinx.android.synthetic.main.activity_login.*
import org.libre.agosto.p2play.ajax.Auth import org.libre.agosto.p2play.ajax.Auth

View File

@ -2,24 +2,25 @@ package org.libre.agosto.p2play
import android.content.Intent import android.content.Intent
import android.os.AsyncTask import android.os.AsyncTask
import android.os.Build
import android.os.Bundle import android.os.Bundle
import android.os.Handler import android.os.Handler
import android.support.design.widget.Snackbar
import android.support.design.widget.NavigationView
import android.support.v4.view.GravityCompat
import android.support.v7.app.ActionBarDrawerToggle
import android.support.v7.app.AppCompatActivity
import android.support.v7.widget.LinearLayoutManager
import android.support.v7.widget.RecyclerView
import android.view.Menu import android.view.Menu
import android.view.MenuInflater
import android.view.MenuItem import android.view.MenuItem
import android.widget.ImageView import android.view.WindowManager
import android.widget.SearchView
import androidx.appcompat.app.ActionBarDrawerToggle
import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.widget.SearchView
import androidx.core.view.GravityCompat
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.google.android.material.navigation.NavigationView
import com.squareup.picasso.Picasso import com.squareup.picasso.Picasso
import kotlinx.android.synthetic.main.activity_main.* import kotlinx.android.synthetic.main.activity_main.drawer_layout
import kotlinx.android.synthetic.main.app_bar_main.* import kotlinx.android.synthetic.main.activity_main.nav_view
import kotlinx.android.synthetic.main.content_main.* import kotlinx.android.synthetic.main.app_bar_main.toolbar
import kotlinx.android.synthetic.main.content_main.swipeContainer
import kotlinx.android.synthetic.main.nav_header_main.* import kotlinx.android.synthetic.main.nav_header_main.*
import org.libre.agosto.p2play.adapters.VideosAdapter import org.libre.agosto.p2play.adapters.VideosAdapter
import org.libre.agosto.p2play.ajax.Videos import org.libre.agosto.p2play.ajax.Videos
@ -101,7 +102,7 @@ class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelecte
} }
}) })
} }
// swipeContainer.isRefreshing = false swipeContainer.isRefreshing = false
} }
private fun addVideos(videos: ArrayList<VideoModel>){ private fun addVideos(videos: ArrayList<VideoModel>){
@ -363,16 +364,18 @@ 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 pagination = 0
// getMyVideos() getMyVideos()
// drawer_layout.closeDrawer(GravityCompat.START) drawer_layout.closeDrawer(GravityCompat.START)
// } }
if(::myMenu.isInitialized){ if(::myMenu.isInitialized){
myMenu.findItem(R.id.action_login).isVisible = false myMenu.findItem(R.id.action_login).isVisible = false
myMenu.findItem(R.id.action_logout).isVisible = true myMenu.findItem(R.id.action_logout).isVisible = true
} }
} else {
nav_view.menu.findItem(R.id.ml).isVisible = false
} }
} }
@ -381,7 +384,7 @@ class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelecte
myMenu.findItem(R.id.action_login).isVisible = true myMenu.findItem(R.id.action_login).isVisible = true
myMenu.findItem(R.id.action_logout).isVisible = false myMenu.findItem(R.id.action_logout).isVisible = false
} }
nav_view.menu.findItem(R.id.ml).isVisible = false //nav_view.menu.findItem(R.id.ml).isVisible = false
side_usernameTxt?.text = getString(R.string.nav_header_title) side_usernameTxt?.text = getString(R.string.nav_header_title)
side_emailTxt?.text = getString(R.string.nav_header_subtitle) + " " + this.packageManager.getPackageInfo(this.packageName, 0).versionName side_emailTxt?.text = getString(R.string.nav_header_subtitle) + " " + this.packageManager.getPackageInfo(this.packageName, 0).versionName
side_imageView?.setImageResource(R.drawable.default_avatar) side_imageView?.setImageResource(R.drawable.default_avatar)
@ -391,7 +394,7 @@ class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelecte
this.refresh() this.refresh()
ManagerSingleton.Toast(getString(R.string.logout_msg), this) ManagerSingleton.Toast(getString(R.string.logout_msg), this)
setSideData()
} }
private fun loadMore(){ private fun loadMore(){

View File

@ -2,7 +2,7 @@ package org.libre.agosto.p2play
import android.content.SharedPreferences import android.content.SharedPreferences
import android.os.AsyncTask import android.os.AsyncTask
import android.support.v7.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle import android.os.Bundle
import android.os.Looper import android.os.Looper
import android.preference.PreferenceManager import android.preference.PreferenceManager

View File

@ -1,41 +1,40 @@
package org.libre.agosto.p2play package org.libre.agosto.p2play
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.app.Activity
import android.content.DialogInterface
import android.content.Intent import android.content.Intent
import android.content.pm.ActivityInfo import android.content.pm.ActivityInfo
import android.graphics.Bitmap import android.graphics.Bitmap
import android.graphics.BitmapFactory import android.graphics.BitmapFactory
import android.media.Image
import android.os.AsyncTask import android.os.AsyncTask
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 androidx.appcompat.app.AlertDialog
import android.support.v7.app.AlertDialog
import android.support.v7.widget.LinearLayoutManager
import android.support.v7.widget.RecyclerView
import android.util.Log
import android.view.View import android.view.View
import android.view.WindowManager import android.view.WindowManager
import android.webkit.WebChromeClient import android.webkit.WebChromeClient
import android.widget.EditText import android.widget.EditText
import android.widget.FrameLayout import android.widget.FrameLayout
import android.widget.ImageView
import androidx.appcompat.app.AppCompatActivity
import androidx.core.content.ContextCompat
import androidx.media3.common.MediaItem
import androidx.media3.exoplayer.ExoPlayer
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.squareup.picasso.Picasso import com.squareup.picasso.Picasso
import kotlinx.android.synthetic.main.activity_reproductor.* import kotlinx.android.synthetic.main.activity_reproductor.*
import 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.ajax.Videos
import org.libre.agosto.p2play.helpers.setFullscreen
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
@Suppress("NAME_SHADOWING") @Suppress("NAME_SHADOWING")
class ReproductorActivity : AppCompatActivity() { class ReproductorActivity : AppCompatActivity() {
private val clientVideo: Videos = Videos()
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()
@ -46,11 +45,20 @@ class ReproductorActivity : AppCompatActivity() {
private lateinit var viewAdapter: RecyclerView.Adapter<*> private lateinit var viewAdapter: RecyclerView.Adapter<*>
private lateinit var viewManager: RecyclerView.LayoutManager private lateinit var viewManager: RecyclerView.LayoutManager
// Exoplayer
private lateinit var player: ExoPlayer
// Fullscreen info
private var isFullscreen = false
@SuppressLint("SetJavaScriptEnabled", "SetTextI18n") @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)
val fullscreenButton: ImageView = exoPlayer.findViewById(R.id.exo_fullscreen_custom)
val fullscreenButton2 = fullscreenPlayer.findViewById<ImageView>(R.id.exo_fullscreen_custom)
videoView.webChromeClient = WebClient() videoView.webChromeClient = WebClient()
videoView.settings.javaScriptEnabled = true videoView.settings.javaScriptEnabled = true
videoView.settings.allowContentAccess = true videoView.settings.allowContentAccess = true
@ -61,7 +69,7 @@ class ReproductorActivity : AppCompatActivity() {
videoView.settings.domStorageEnabled = true videoView.settings.domStorageEnabled = true
try { try {
this.video = this.intent.extras?.getSerializable("video") as VideoModel video = this.intent.extras?.getSerializable("video") as VideoModel
tittleVideoTxt.text = this.video.name tittleVideoTxt.text = this.video.name
viewsTxt.text = "${this.video.views} ${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
@ -94,19 +102,44 @@ class ReproductorActivity : AppCompatActivity() {
showMoreBtn.setOnClickListener { getDescription() } showMoreBtn.setOnClickListener { getDescription() }
shareLayout.setOnClickListener { shareIntent() } shareLayout.setOnClickListener { shareIntent() }
reportLayout.setOnClickListener { reportIntent() } reportLayout.setOnClickListener { reportIntent() }
fullscreenButton.setOnClickListener { toggleFullscreen() }
fullscreenButton2.setOnClickListener { toggleFullscreen() }
userImg.setOnClickListener { userImg.setOnClickListener {
val intent = Intent(this, ChannelActivity::class.java) val intent = Intent(this, ChannelActivity::class.java)
intent.putExtra("channel", video.getAccount()) intent.putExtra("channel", video.getChannel())
startActivity(intent) startActivity(intent)
} }
AsyncTask.execute {
val video = this.clientVideo.getVideo(this.video.uuid)
runOnUiThread {
try {
player = ExoPlayer.Builder(this.baseContext).build()
exoPlayer.player = player
println("----- video --------")
println(video.streamingData?.playlistUrl)
val mediaItem = MediaItem.fromUri(video.streamingData?.playlistUrl!!)
// Set the media item to be played.
player.setMediaItem(mediaItem)
// Prepare the player.
player.prepare()
// Start the playback.
// player.play()
} catch(err: Exception) {
err.printStackTrace()
}
}
}
} }
private fun subscribe() { private fun subscribe() {
AsyncTask.execute { AsyncTask.execute {
if (Looper.myLooper() == null) if (Looper.myLooper() == null)
Looper.prepare() Looper.prepare()
val res = this._actions.subscribe(ManagerSingleton.token.token, video.getAccount()) val res = this._actions.subscribe(ManagerSingleton.token.token, video.getChannel())
if (res == 1) { if (res == 1) {
runOnUiThread { runOnUiThread {
ManagerSingleton.Toast(getString(R.string.subscribeMsg), this) ManagerSingleton.Toast(getString(R.string.subscribeMsg), this)
@ -120,7 +153,7 @@ class ReproductorActivity : AppCompatActivity() {
AsyncTask.execute { AsyncTask.execute {
if (Looper.myLooper() == null) if (Looper.myLooper() == null)
Looper.prepare() Looper.prepare()
val res = this._actions.unSubscribe(ManagerSingleton.token.token, video.getAccount()) val res = this._actions.unSubscribe(ManagerSingleton.token.token, video.getChannel())
if (res == 1) { if (res == 1) {
runOnUiThread { runOnUiThread {
ManagerSingleton.Toast(getString(R.string.unSubscribeMsg), this) ManagerSingleton.Toast(getString(R.string.unSubscribeMsg), this)
@ -233,7 +266,7 @@ class ReproductorActivity : AppCompatActivity() {
runOnUiThread { runOnUiThread {
if (res) { if (res) {
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)
@ -312,6 +345,43 @@ class ReproductorActivity : AppCompatActivity() {
} }
} }
private fun toggleFullscreen () {
if (isFullscreen) {
nonFullScreen.visibility = View.VISIBLE
fullScreenExo.visibility = View.GONE
exoPlayer.player = player
fullscreenPlayer.player = null
requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED
val attrs = 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
window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_VISIBLE
isFullscreen = false
}
else {
val matchParent = WindowManager.LayoutParams.MATCH_PARENT
nonFullScreen.visibility = View.GONE
fullScreenExo.visibility = View.VISIBLE
exoPlayer.player = null
fullscreenPlayer.player = player
setFullscreen(window)
requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE
isFullscreen = true
}
}
override fun onDestroy() {
player.release()
super.onDestroy()
}
internal inner class WebClient: WebChromeClient() { internal inner class WebClient: WebChromeClient() {
private var mCustomView: View? = null private var mCustomView: View? = null
private var mCustomViewCallback: WebChromeClient.CustomViewCallback? = null private var mCustomViewCallback: WebChromeClient.CustomViewCallback? = null
@ -369,12 +439,7 @@ class ReproductorActivity : AppCompatActivity() {
this@ReproductorActivity.fullScreen.addView(paramView, FrameLayout.LayoutParams(match_parent, match_parent)) this@ReproductorActivity.fullScreen.addView(paramView, FrameLayout.LayoutParams(match_parent, match_parent))
setFullscreen(this@ReproductorActivity.window)
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 this@ReproductorActivity.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE
} }

View File

@ -3,7 +3,7 @@ package org.libre.agosto.p2play
import android.content.Intent import android.content.Intent
import android.content.SharedPreferences import android.content.SharedPreferences
import android.os.AsyncTask import android.os.AsyncTask
import android.support.v7.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle import android.os.Bundle
import android.os.Handler import android.os.Handler
import android.os.Looper import android.os.Looper

View File

@ -1,25 +1,18 @@
package org.libre.agosto.p2play.adapters package org.libre.agosto.p2play.adapters
import android.app.Activity
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
import android.graphics.drawable.Drawable import androidx.recyclerview.widget.RecyclerView
import android.os.AsyncTask
import android.support.v7.widget.RecyclerView
import android.text.Html import android.text.Html
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.ImageView import android.widget.ImageView
import android.widget.LinearLayout
import android.widget.TextView import android.widget.TextView
import com.squareup.picasso.Picasso import com.squareup.picasso.Picasso
import kotlinx.android.synthetic.main.view_video.view.userImg
import org.libre.agosto.p2play.* import org.libre.agosto.p2play.*
import org.libre.agosto.p2play.models.CommentaryModel import org.libre.agosto.p2play.models.CommentaryModel
import org.libre.agosto.p2play.models.VideoModel
import java.io.InputStream
import java.io.Serializable
import java.net.URL
@Suppress("DEPRECATION") @Suppress("DEPRECATION")
class CommentariesAdapter(private val myDataset: ArrayList<CommentaryModel>) : class CommentariesAdapter(private val myDataset: ArrayList<CommentaryModel>) :
@ -51,6 +44,7 @@ class CommentariesAdapter(private val myDataset: ArrayList<CommentaryModel>) :
// create a new view // create a new view
val view = LayoutInflater.from(parent.context) val view = LayoutInflater.from(parent.context)
.inflate(R.layout.view_commentary, parent, false) as View .inflate(R.layout.view_commentary, parent, false) as View
// set the view's size, margins, paddings and layout parameters // set the view's size, margins, paddings and layout parameters
return ViewHolder(view) return ViewHolder(view)
} }
@ -72,6 +66,12 @@ class CommentariesAdapter(private val myDataset: ArrayList<CommentaryModel>) :
holder.commentary.text = Html.fromHtml(myDataset[position].commentary) holder.commentary.text = Html.fromHtml(myDataset[position].commentary)
// TODO: Support for view and account (is different than a video channel)
// holder.userImg.setOnClickListener {
// val intent = Intent(holder.context, ChannelActivity::class.java)
// intent.putExtra("channel", myDataset[position].getAccount())
// holder.context.startActivity(intent)
// }
} }
// Return the size of your dataset (invoked by the layout manager) // Return the size of your dataset (invoked by the layout manager)

View File

@ -1,24 +1,18 @@
package org.libre.agosto.p2play.adapters package org.libre.agosto.p2play.adapters
import android.app.Activity
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
import android.graphics.drawable.Drawable import androidx.recyclerview.widget.RecyclerView
import android.os.AsyncTask
import android.support.v7.widget.RecyclerView
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.ImageView import android.widget.ImageView
import android.widget.LinearLayout
import android.widget.TextView import android.widget.TextView
import com.squareup.picasso.Picasso import com.squareup.picasso.Picasso
import org.libre.agosto.p2play.* import org.libre.agosto.p2play.*
import org.libre.agosto.p2play.helpers.mapSeconds
import org.libre.agosto.p2play.models.VideoModel import org.libre.agosto.p2play.models.VideoModel
import java.io.InputStream
import java.io.Serializable import java.io.Serializable
import java.net.URL
import java.util.concurrent.TimeUnit
class VideosAdapter(private val myDataset: ArrayList<VideoModel>) : class VideosAdapter(private val myDataset: ArrayList<VideoModel>) :
RecyclerView.Adapter<VideosAdapter.ViewHolder>() { RecyclerView.Adapter<VideosAdapter.ViewHolder>() {
@ -28,26 +22,18 @@ class VideosAdapter(private val myDataset: ArrayList<VideoModel>) :
// Complex data items may need more than one view per item, and // Complex data items may need more than one view per item, and
// you provide access to all the views for a data item in a view holder. // you provide access to all the views for a data item in a view holder.
// Each data item is just a string in this case that is shown in a TextView. // Each data item is just a string in this case that is shown in a TextView.
class ViewHolder(val view: View) : RecyclerView.ViewHolder(view){ class ViewHolder(private val view: View) : RecyclerView.ViewHolder(view){
val thumb: ImageView val thumb: ImageView = view.findViewById(R.id.thumb)
val userImg: ImageView val userImg: ImageView = view.findViewById(R.id.userImg)
val tittle: TextView val title: TextView = view.findViewById(R.id.tittleTxt)
val description: TextView val description: TextView = view.findViewById(R.id.descriptionTxt)
val context: Context val context: Context = view.context
val duration: TextView = view.findViewById(R.id.duration)
init { val isLive: TextView = view.findViewById(R.id.isLive)
// Define click listener for the ViewHolder's View
tittle = view.findViewById(R.id.tittleTxt)
description = view.findViewById(R.id.descriptionTxt)
thumb = view.findViewById(R.id.thumb)
userImg = view.findViewById(R.id.userImg)
context = view.context
}
} }
// Create new views (invoked by the layout manager) // Create new views (invoked by the layout manager)
override fun onCreateViewHolder(parent: ViewGroup, override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
viewType: Int): VideosAdapter.ViewHolder {
// create a new view // create a new view
val view = LayoutInflater.from(parent.context) val view = LayoutInflater.from(parent.context)
.inflate(R.layout.view_video, parent, false) as View .inflate(R.layout.view_video, parent, false) as View
@ -59,17 +45,18 @@ class VideosAdapter(private val myDataset: ArrayList<VideoModel>) :
override fun onBindViewHolder(holder: ViewHolder, position: Int) { override fun onBindViewHolder(holder: ViewHolder, position: Int) {
// - get element from your dataset at this position // - get element from your dataset at this position
// - replace the contents of the view with that element // - replace the contents of the view with that element
holder.tittle.text = myDataset[position].name holder.title.text = myDataset[position].name
holder.title.setOnClickListener {
this.launchChannelActivity(myDataset[position] as Serializable, holder.context)
}
Picasso.get().load("https://"+ManagerSingleton.url+myDataset[position].thumbUrl).into(holder.thumb) Picasso.get().load("https://"+ManagerSingleton.url+myDataset[position].thumbUrl).into(holder.thumb)
holder.thumb.setOnClickListener { holder.thumb.setOnClickListener {
val intent = Intent(holder.context, ReproductorActivity::class.java) this.launchChannelActivity(myDataset[position] as Serializable, holder.context)
intent.putExtra("video", myDataset[position] as Serializable)
holder.context.startActivity(intent)
} }
holder.userImg.setOnClickListener { holder.userImg.setOnClickListener {
val intent = Intent(holder.context, ChannelActivity::class.java) val intent = Intent(holder.context, ChannelActivity::class.java)
intent.putExtra("channel", myDataset[position].getAccount()) intent.putExtra("channel", myDataset[position].getChannel())
holder.context.startActivity(intent) holder.context.startActivity(intent)
} }
@ -79,20 +66,16 @@ class VideosAdapter(private val myDataset: ArrayList<VideoModel>) :
Picasso.get().load(R.drawable.default_avatar).into(holder.userImg) Picasso.get().load(R.drawable.default_avatar).into(holder.userImg)
val viewsText = holder.context.getString(R.string.view_text) val viewsText = holder.context.getString(R.string.view_text)
var timeText = holder.context.getString(R.string.timeSec_text)
var timeString = myDataset[position].duration.toString()
val seconds = myDataset[position].duration.toInt(); val seconds = myDataset[position].duration.toInt();
if(seconds > 60 && seconds < (60 * 60)){ val timeString = mapSeconds(seconds)
timeText = holder.context.getString(R.string.timeMin_text)
timeString = (seconds / 60).toString() + ":" + (seconds % 60).toString()
}
else if(seconds > (60 * 60)){
timeText = holder.context.getString(R.string.timeHrs_text)
timeString = (seconds / 60 / 60).toString() + ":" + (seconds / 60 % 60).toString()
}
holder.description.text = myDataset[position].username+" - "+myDataset[position].views+" "+viewsText+" - "+timeString+" "+timeText holder.duration.text = timeString
holder.description.text = myDataset[position].username+" - "+myDataset[position].views+" "+viewsText
if (myDataset[position].isLive) {
holder.isLive.visibility = View.VISIBLE
}
} }
// Return the size of your dataset (invoked by the layout manager) // Return the size of your dataset (invoked by the layout manager)
@ -109,5 +92,9 @@ class VideosAdapter(private val myDataset: ArrayList<VideoModel>) :
notifyItemRangeInserted(lastPos, newItems.size) notifyItemRangeInserted(lastPos, newItems.size)
} }
private fun launchChannelActivity (data: Serializable, context: Context) {
val intent = Intent(context, ReproductorActivity::class.java)
intent.putExtra("video", data)
context.startActivity(intent)
}
} }

View File

@ -10,8 +10,6 @@ import java.net.HttpURLConnection
import java.net.URL import java.net.URL
open class Client { open class Client {
protected fun _newCon(uri: String, method: String, token: String = ""): HttpURLConnection { protected fun _newCon(uri: String, method: String, token: String = ""): HttpURLConnection {
val url = URL("https://${ManagerSingleton.url}/api/v1/$uri") val url = URL("https://${ManagerSingleton.url}/api/v1/$uri")
val con = url.openConnection() as HttpURLConnection val con = url.openConnection() as HttpURLConnection
@ -67,5 +65,4 @@ open class Client {
return keys return keys
} }
} }

View File

@ -200,4 +200,22 @@ class Videos: Client() {
fun getMostLikedVideos(start:Int = 0): ArrayList<VideoModel>{ fun getMostLikedVideos(start:Int = 0): ArrayList<VideoModel>{
return this.getVideos(start,"-likes") return this.getVideos(start,"-likes")
} }
fun getVideo(uuid: String): VideoModel {
val con = this._newCon("videos/$uuid","GET")
val video = VideoModel()
try {
if (con.responseCode == 200) {
val response = InputStreamReader(con.inputStream)
val data = JsonReader(response)
video.parseVideo(data)
data.close()
}
} catch(err:Exception){
err.printStackTrace()
}
con.disconnect()
return video
}
} }

View File

@ -0,0 +1,20 @@
package org.libre.agosto.p2play.helpers
fun mapSeconds (inputSeconds: Int): String {
val seconds = (inputSeconds % 60)
var minutes = inputSeconds / 60
var hours = 0
if (minutes > 60) {
hours = minutes / 60
minutes %= 60
}
var result = minutes.toString().padStart(2, '0') + ":" + seconds.toString().padStart(2, '0')
if (hours > 0) {
result = hours.toString().padStart(2, '0') + ":" + result
}
return result
}

View File

@ -0,0 +1,13 @@
package org.libre.agosto.p2play.helpers
import android.view.View
import android.view.Window
import android.view.WindowManager
fun setFullscreen (window: Window) {
val attrs = 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
window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
}

View File

@ -11,7 +11,8 @@ class CommentaryModel (
var userImageUrl: String = "", var userImageUrl: String = "",
var commentary: String = "", var commentary: String = "",
var userHost: String = "", var userHost: String = "",
var replies: Int = 0 var replies: Int = 0,
var nameChannel: String = ""
) { ) {
fun parseCommentary(data: JsonReader) { fun parseCommentary(data: JsonReader) {
data.beginObject() data.beginObject()
@ -46,6 +47,7 @@ class CommentaryModel (
} }
"uuid" -> this.userUuid = data.nextString() "uuid" -> this.userUuid = data.nextString()
"host" -> this.userHost = data.nextString() "host" -> this.userHost = data.nextString()
"name" -> this.nameChannel = data.nextString()
else -> data.skipValue() else -> data.skipValue()
} }
} }
@ -56,4 +58,9 @@ class CommentaryModel (
} }
data.endObject() data.endObject()
} }
fun getAccount(): String {
return "$nameChannel@$userHost"
}
} }

View File

@ -0,0 +1,26 @@
package org.libre.agosto.p2play.models
import android.util.JsonReader
class StreamingModel(
var playlistUrl: String = "",
var segmentsSha256Url: String = "",
// TODO: Download Files
) {
fun parse(data: JsonReader) {
data.beginObject()
while (data.hasNext()) {
val key = data.nextName()
when (key.toString()) {
"playlistUrl"->{
this.playlistUrl = data.nextString()
}
"segmentsSha256Url"->{
this.segmentsSha256Url = data.nextString()
}
else -> data.skipValue()
}
}
data.endObject()
}
}

View File

@ -17,9 +17,11 @@ class VideoModel(
var views: Number = 0, var views: Number = 0,
var userUuid: String = "", var userUuid: String = "",
var userHost: String = "", var userHost: String = "",
var nameChannel: String = "" var nameChannel: String = "",
var isLive: Boolean = false,
var streamingData: StreamingModel? = null
):Serializable { ):Serializable {
fun getAccount(): String { fun getChannel(): String {
return "$nameChannel@$userHost" return "$nameChannel@$userHost"
} }
@ -55,6 +57,38 @@ class VideoModel(
"views"->{ "views"->{
this.views = data.nextInt() this.views = data.nextInt()
} }
"isLive"-> {
this.isLive = data.nextBoolean()
}
"streamingPlaylists"-> {
data.beginArray()
if (data.hasNext()) {
val streamingData = StreamingModel()
streamingData.parse(data)
this.streamingData = streamingData
}
data.endArray()
}
"files" -> {
if (streamingData === null) {
data.beginArray()
if (data.hasNext()) {
data.beginObject()
while (data.hasNext()) {
val key2 = data.nextName()
when (key2.toString()) {
"fileDownloadUrl"->{
streamingData = StreamingModel()
streamingData!!.playlistUrl = data.nextString()
}
else -> data.skipValue()
}
}
data.endObject()
}
data.endArray()
}
}
"channel"->{ "channel"->{
data.beginObject() data.beginObject()
while (data.hasNext()){ while (data.hasNext()){

View File

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" android:tint="#fff" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp">
<path android:fillColor="@android:color/white" android:pathData="M18,13c0,3.31 -2.69,6 -6,6s-6,-2.69 -6,-6s2.69,-6 6,-6v4l5,-5l-5,-5v4c-4.42,0 -8,3.58 -8,8c0,4.42 3.58,8 8,8s8,-3.58 8,-8H18z"/>
<path android:fillColor="@android:color/white" android:pathData="M10.86,15.94l0,-4.27l-0.09,0l-1.77,0.63l0,0.69l1.01,-0.31l0,3.26z"/>
<path android:fillColor="@android:color/white" android:pathData="M12.25,13.44v0.74c0,1.9 1.31,1.82 1.44,1.82c0.14,0 1.44,0.09 1.44,-1.82v-0.74c0,-1.9 -1.31,-1.82 -1.44,-1.82C13.55,11.62 12.25,11.53 12.25,13.44zM14.29,13.32v0.97c0,0.77 -0.21,1.03 -0.59,1.03c-0.38,0 -0.6,-0.26 -0.6,-1.03v-0.97c0,-0.75 0.22,-1.01 0.59,-1.01C14.07,12.3 14.29,12.57 14.29,13.32z"/>
</vector>

View File

@ -0,0 +1,5 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" android:tint="#fff" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp">
<path android:fillColor="@android:color/white" android:pathData="M7,14L5,14v5h5v-2L7,17v-3zM5,10h2L7,7h3L10,5L5,5v5zM17,17h-3v2h5v-5h-2v3zM14,5v2h3v3h2L19,5h-5z"/>
</vector>

View File

@ -0,0 +1,5 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" android:tint="#fff" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp">
<path android:fillColor="@android:color/white" android:pathData="M6,19h4L10,5L6,5v14zM14,5v14h4L18,5h-4z"/>
</vector>

View File

@ -0,0 +1,5 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" android:tint="#fff" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp">
<path android:fillColor="@android:color/white" android:pathData="M8,5v14l11,-7z"/>
</vector>

View File

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" android:tint="#fff" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp">
<path android:fillColor="@android:color/white" android:pathData="M11.99,5V1l-5,5l5,5V7c3.31,0 6,2.69 6,6s-2.69,6 -6,6s-6,-2.69 -6,-6h-2c0,4.42 3.58,8 8,8s8,-3.58 8,-8S16.41,5 11.99,5z"/>
<path android:fillColor="@android:color/white" android:pathData="M10.89,16h-0.85v-3.26l-1.01,0.31v-0.69l1.77,-0.63h0.09V16z"/>
<path android:fillColor="@android:color/white" android:pathData="M15.17,14.24c0,0.32 -0.03,0.6 -0.1,0.82s-0.17,0.42 -0.29,0.57s-0.28,0.26 -0.45,0.33s-0.37,0.1 -0.59,0.1s-0.41,-0.03 -0.59,-0.1s-0.33,-0.18 -0.46,-0.33s-0.23,-0.34 -0.3,-0.57s-0.11,-0.5 -0.11,-0.82V13.5c0,-0.32 0.03,-0.6 0.1,-0.82s0.17,-0.42 0.29,-0.57s0.28,-0.26 0.45,-0.33s0.37,-0.1 0.59,-0.1s0.41,0.03 0.59,0.1c0.18,0.07 0.33,0.18 0.46,0.33s0.23,0.34 0.3,0.57s0.11,0.5 0.11,0.82V14.24zM14.32,13.38c0,-0.19 -0.01,-0.35 -0.04,-0.48s-0.07,-0.23 -0.12,-0.31s-0.11,-0.14 -0.19,-0.17s-0.16,-0.05 -0.25,-0.05s-0.18,0.02 -0.25,0.05s-0.14,0.09 -0.19,0.17s-0.09,0.18 -0.12,0.31s-0.04,0.29 -0.04,0.48v0.97c0,0.19 0.01,0.35 0.04,0.48s0.07,0.24 0.12,0.32s0.11,0.14 0.19,0.17s0.16,0.05 0.25,0.05s0.18,-0.02 0.25,-0.05s0.14,-0.09 0.19,-0.17s0.09,-0.19 0.11,-0.32s0.04,-0.29 0.04,-0.48V13.38z"/>
</vector>

View File

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<shape
xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners android:radius="5dp" />
<!-- This is the border color -->
<!--- This is the background color -->
<solid android:color="@color/colorDislike" />
</shape>

View File

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<shape
xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners android:radius="5dp" />
<!-- This is the border color -->
<!--- This is the background color -->
<solid android:color="?attr/colorSecondary" />
</shape>

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
@ -29,7 +29,7 @@
android:contentDescription="Logo" android:contentDescription="Logo"
app:srcCompat="@mipmap/ic_launcher" /> app:srcCompat="@mipmap/ic_launcher" />
<Space <androidx.legacy.widget.Space
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="30dp" /> android:layout_height="30dp" />
@ -39,11 +39,10 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="@string/aboutLabel" android:text="@string/aboutLabel"
android:textAlignment="center" android:textAlignment="center"
android:textAppearance="@android:style/TextAppearance.Material.Medium.Inverse" android:textAppearance="@android:style/TextAppearance.Material.Medium"
android:textColor="@android:color/black"
android:textStyle="bold" /> android:textStyle="bold" />
<Space <androidx.legacy.widget.Space
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="30dp" /> android:layout_height="30dp" />
@ -55,7 +54,7 @@
android:textAlignment="textStart" android:textAlignment="textStart"
android:textSize="16sp" /> android:textSize="16sp" />
<TextView <com.google.android.material.textview.MaterialTextView
android:id="@+id/gitlabUrl" android:id="@+id/gitlabUrl"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
@ -66,7 +65,7 @@
android:textSize="16sp" android:textSize="16sp"
android:textStyle="bold" /> android:textStyle="bold" />
<Space <androidx.legacy.widget.Space
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="20dp" /> android:layout_height="20dp" />
@ -88,7 +87,7 @@
android:textSize="16sp" android:textSize="16sp"
android:textStyle="bold" /> android:textStyle="bold" />
<Space <androidx.legacy.widget.Space
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="30dp" /> android:layout_height="30dp" />
@ -98,11 +97,10 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="@string/aboutInstance" android:text="@string/aboutInstance"
android:textAlignment="center" android:textAlignment="center"
android:textAppearance="@android:style/TextAppearance.Material.Medium.Inverse" android:textAppearance="@android:style/TextAppearance.Material.Medium"
android:textColor="@android:color/black"
android:textStyle="bold" /> android:textStyle="bold" />
<Space <androidx.legacy.widget.Space
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="20dp" /> android:layout_height="20dp" />
@ -124,7 +122,7 @@
android:textSize="16sp" android:textSize="16sp"
android:textStyle="bold" /> android:textStyle="bold" />
<Space <androidx.legacy.widget.Space
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="30dp" /> android:layout_height="30dp" />
@ -135,7 +133,11 @@
android:text="@string/aboutLicense" android:text="@string/aboutLicense"
android:textAlignment="textStart" android:textAlignment="textStart"
android:textSize="16sp" /> android:textSize="16sp" />
<androidx.legacy.widget.Space
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout> </LinearLayout>
</ScrollView> </ScrollView>
</android.support.constraint.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
@ -141,14 +141,13 @@
tools:layout_editor_absoluteY="214dp" /> tools:layout_editor_absoluteY="214dp" />
</FrameLayout> </FrameLayout>
<android.support.v7.widget.RecyclerView <androidx.recyclerview.widget.RecyclerView
android:id="@+id/listVideosChannel" android:id="@+id/listVideosChannel"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content" />
android:scrollbars="none" />
</LinearLayout> </LinearLayout>
</ScrollView> </ScrollView>
</android.support.constraint.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
@ -29,24 +29,30 @@
android:contentDescription="Logo" android:contentDescription="Logo"
app:srcCompat="@drawable/icon" /> app:srcCompat="@drawable/icon" />
<Space <androidx.legacy.widget.Space
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="30dp" /> android:layout_height="30dp" />
<TextView <androidx.appcompat.widget.AppCompatTextView
android:id="@+id/hostInfoText" android:id="@+id/hostInfoText"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="@string/hostInfoText" android:text="@string/hostInfoText"
android:textAlignment="center" android:textAlignment="center"
android:textAppearance="@android:style/TextAppearance.Material.Medium.Inverse" />
android:textColor="@android:color/black" />
<Space <androidx.legacy.widget.Space
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="30dp" /> android:layout_height="30dp" />
<EditText <com.google.android.material.textfield.TextInputLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="4dp"
android:hint="@string/instance"
app:expandedHintEnabled="false">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/hostText" android:id="@+id/hostText"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
@ -54,13 +60,15 @@
android:hint="@string/hostText" android:hint="@string/hostText"
android:inputType="text" /> android:inputType="text" />
<Button </com.google.android.material.textfield.TextInputLayout>
<com.google.android.material.button.MaterialButton
android:id="@+id/button" android:id="@+id/button"
style="@style/Widget.AppCompat.Button.Colored"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="@string/okButton" /> android:text="@string/okButton" />
</LinearLayout> </LinearLayout>
</FrameLayout> </FrameLayout>
</android.support.constraint.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
@ -29,7 +29,7 @@
android:contentDescription="Logo" android:contentDescription="Logo"
app:srcCompat="@drawable/icon" /> app:srcCompat="@drawable/icon" />
<Space <androidx.legacy.widget.Space
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="30dp" /> android:layout_height="30dp" />
@ -39,62 +39,64 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="@string/loginInfo" android:text="@string/loginInfo"
android:textAlignment="center" android:textAlignment="center"
android:textAppearance="@android:style/TextAppearance.Material.Medium.Inverse" android:textAppearance="@android:style/TextAppearance.DeviceDefault.Medium"/>
android:textColor="@android:color/black" />
<Space <androidx.legacy.widget.Space
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="30dp" /> android:layout_height="30dp" />
<TextView <com.google.android.material.textfield.TextInputLayout
android:id="@+id/userTxt" android:id="@+id/userTxt"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="@string/userTxt" /> android:layout_margin="4dp"
android:hint="@string/userTxt">
<EditText <com.google.android.material.textfield.TextInputEditText
android:id="@+id/userText" android:id="@+id/userText"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:ems="10" android:ems="10"
android:hint="@string/userText" android:hint="@string/userText"
android:inputType="text" /> android:inputType="text" />
</com.google.android.material.textfield.TextInputLayout>
<TextView <com.google.android.material.textfield.TextInputLayout
android:id="@+id/passwordTxt" android:id="@+id/passwordTxt"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="@string/passwordTxt" /> android:layout_margin="4dp"
app:endIconMode="password_toggle"
android:hint="@string/passwordTxt" >
<EditText <EditText
android:id="@+id/passwordText" android:id="@+id/passwordText"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:ems="10" android:ems="10"
android:hint="@string/passwordText" android:inputType="textPassword"/>
android:inputType="text|textPassword" /> </com.google.android.material.textfield.TextInputLayout>
<Button <com.google.android.material.button.MaterialButton
android:id="@+id/loginBtn" android:id="@+id/loginBtn"
style="@style/Widget.AppCompat.Button.Colored"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="@string/loginBtn" android:text="@string/loginBtn"
android:textAlignment="center" /> android:textAlignment="center" />
<Space <androidx.legacy.widget.Space
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="30dp" /> android:layout_height="30dp" />
<Button <com.google.android.material.button.MaterialButton
android:id="@+id/registerActionBtn" android:id="@+id/registerActionBtn"
style="@style/Widget.AppCompat.Button.Borderless" style="@style/Widget.MaterialComponents.Button.TextButton"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="@string/registerActionBtn" android:text="@string/registerActionBtn"
android:visibility="visible" /> android:visibility="invisible" />
</LinearLayout> </LinearLayout>
</FrameLayout> </FrameLayout>
</android.support.constraint.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" <androidx.drawerlayout.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/drawer_layout" android:id="@+id/drawer_layout"
@ -13,7 +13,7 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" /> android:layout_height="match_parent" />
<android.support.design.widget.NavigationView <com.google.android.material.navigation.NavigationView
android:id="@+id/nav_view" android:id="@+id/nav_view"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="match_parent" android:layout_height="match_parent"
@ -26,4 +26,4 @@
app:headerLayout="@layout/nav_header_main" app:headerLayout="@layout/nav_header_main"
app:menu="@menu/activity_main_drawer" /> app:menu="@menu/activity_main_drawer" />
</android.support.v4.widget.DrawerLayout> </androidx.drawerlayout.widget.DrawerLayout>

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
@ -10,11 +10,39 @@
android:id="@+id/fullScreen" android:id="@+id/fullScreen"
android:layout_width="fill_parent" android:layout_width="fill_parent"
android:layout_height="fill_parent" android:layout_height="fill_parent"
android:layout_alignParentStart="true"
android:layout_alignParentTop="true" android:layout_alignParentTop="true"
android:layout_alignParentEnd="true"
android:layout_alignParentBottom="true" android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true" android:visibility="gone"
android:layout_alignParentRight="true" app:layout_constraintBottom_toBottomOf="parent"
android:visibility="gone" /> app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<RelativeLayout
android:id="@+id/fullScreenExo"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_alignParentStart="true"
android:layout_alignParentTop="true"
android:layout_alignParentEnd="true"
android:layout_alignParentBottom="true"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" >
<androidx.media3.ui.PlayerView
android:id="@+id/fullscreenPlayer"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#000"
app:use_controller="true"
app:controller_layout_id="@layout/custom_player_controls"
app:player_layout_id="@layout/exo_player_view"/>
</RelativeLayout>
<ScrollView <ScrollView
android:id="@+id/nonFullScreen" android:id="@+id/nonFullScreen"
@ -37,17 +65,24 @@
<WebView <WebView
android:id="@+id/videoView" android:id="@+id/videoView"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="270dp" android:layout_height="222dp"
android:layout_weight="1"> android:layout_weight="1"
android:visibility="gone" />
</WebView> <androidx.media3.ui.PlayerView
android:id="@+id/exoPlayer"
android:layout_width="match_parent"
android:layout_height="222dp"
app:use_controller="true"
app:controller_layout_id="@layout/custom_player_controls"
app:player_layout_id="@layout/exo_player_view"/>
<TextView <TextView
android:id="@+id/tittleVideoTxt" android:id="@+id/tittleVideoTxt"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:paddingStart="5dp" android:paddingStart="5dp"
android:textAppearance="@android:style/TextAppearance.Material.Large" android:textAppearance="@android:style/TextAppearance.Material.Display1"
android:textSize="18sp" android:textSize="18sp"
android:textStyle="bold" /> android:textStyle="bold" />
@ -59,7 +94,7 @@
android:paddingRight="5dp" android:paddingRight="5dp"
android:textSize="12sp" /> android:textSize="12sp" />
<LinearLayout <androidx.appcompat.widget.LinearLayoutCompat
android:id="@+id/actionsLayout" android:id="@+id/actionsLayout"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="50dp" android:layout_height="50dp"
@ -67,7 +102,7 @@
android:orientation="horizontal" android:orientation="horizontal"
android:visibility="gone"> android:visibility="gone">
<LinearLayout <androidx.appcompat.widget.LinearLayoutCompat
android:id="@+id/likeLayout" android:id="@+id/likeLayout"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
@ -94,7 +129,7 @@
android:layout_weight="1" android:layout_weight="1"
android:text="@string/likeBtn" android:text="@string/likeBtn"
android:textAlignment="center" /> android:textAlignment="center" />
</LinearLayout> </androidx.appcompat.widget.LinearLayoutCompat>
<LinearLayout <LinearLayout
android:id="@+id/dislikeLayout" android:id="@+id/dislikeLayout"
@ -166,7 +201,7 @@
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_weight="1" android:layout_weight="1"
android:adjustViewBounds="false" android:adjustViewBounds="false"
android:contentDescription="@string/dislikeBtn" android:contentDescription="@string/shareBtn"
android:cropToPadding="false" android:cropToPadding="false"
android:visibility="visible" android:visibility="visible"
app:srcCompat="@drawable/ic_share" /> app:srcCompat="@drawable/ic_share" />
@ -179,7 +214,7 @@
android:text="@string/shareBtn" android:text="@string/shareBtn"
android:textAlignment="center" /> android:textAlignment="center" />
</LinearLayout> </LinearLayout>
</LinearLayout> </androidx.appcompat.widget.LinearLayoutCompat>
<LinearLayout <LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"
@ -202,7 +237,7 @@
<LinearLayout <LinearLayout
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_weight="2" android:layout_weight="3"
android:orientation="vertical"> android:orientation="vertical">
<TextView <TextView
@ -210,7 +245,6 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:textAppearance="@android:style/TextAppearance.Material.Large" android:textAppearance="@android:style/TextAppearance.Material.Large"
android:textColor="@android:color/black"
android:textSize="18sp" android:textSize="18sp"
android:textStyle="bold" /> android:textStyle="bold" />
@ -223,14 +257,14 @@
</LinearLayout> </LinearLayout>
<Button <com.google.android.material.button.MaterialButton
android:id="@+id/subscribeBtn" android:id="@+id/subscribeBtn"
style="@style/Widget.AppCompat.Button.Colored" style="@style/Widget.MaterialComponents.Button"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_weight="1" android:layout_weight="1"
android:text="@string/subscribeBtn" android:text="@string/subscribeBtn"
android:textSize="10sp" android:textSize="12sp"
android:visibility="invisible" /> android:visibility="invisible" />
</LinearLayout> </LinearLayout>
@ -257,9 +291,9 @@
android:paddingLeft="10dp" android:paddingLeft="10dp"
android:paddingRight="10dp" /> android:paddingRight="10dp" />
<Button <com.google.android.material.button.MaterialButton
android:id="@+id/showMoreBtn" android:id="@+id/showMoreBtn"
style="@style/Widget.AppCompat.Button.Borderless.Colored" style="@style/Widget.MaterialComponents.Button.TextButton"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_weight="1" android:layout_weight="1"
@ -272,7 +306,7 @@
android:layout_height="1dp" android:layout_height="1dp"
android:background="?android:attr/listDivider" /> android:background="?android:attr/listDivider" />
<Space <androidx.legacy.widget.Space
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="10dp" android:layout_height="10dp"
android:layout_weight="1" /> android:layout_weight="1" />
@ -285,11 +319,11 @@
android:text="@string/commentariesTxt" android:text="@string/commentariesTxt"
android:textStyle="bold" /> android:textStyle="bold" />
<Space <androidx.legacy.widget.Space
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="20dp" /> android:layout_height="20dp" />
<LinearLayout <androidx.appcompat.widget.LinearLayoutCompat
android:id="@+id/commentaryLayout" android:id="@+id/commentaryLayout"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
@ -308,28 +342,33 @@
android:layout_weight="1" android:layout_weight="1"
app:srcCompat="@drawable/default_avatar" /> app:srcCompat="@drawable/default_avatar" />
<EditText <com.google.android.material.textfield.TextInputLayout
android:id="@+id/commentaryText"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_weight="2" android:layout_margin="4dp"
android:layout_weight="3"
android:hint="@string/commentHolder">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/commentaryText"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:ems="10" android:ems="10"
android:hint="@string/commentHolder"
android:inputType="textMultiLine" /> android:inputType="textMultiLine" />
</com.google.android.material.textfield.TextInputLayout>
</LinearLayout> </LinearLayout>
<Button <com.google.android.material.button.MaterialButton
android:id="@+id/commentaryBtn" android:id="@+id/commentaryBtn"
style="@style/Widget.AppCompat.Button.Colored"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_weight="1" android:layout_weight="1"
android:text="@string/commentaryText" /> android:text="@string/commentaryText" />
</LinearLayout> </androidx.appcompat.widget.LinearLayoutCompat>
<android.support.v7.widget.RecyclerView <androidx.recyclerview.widget.RecyclerView
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"
@ -340,4 +379,4 @@
</LinearLayout> </LinearLayout>
</ScrollView> </ScrollView>
</android.support.constraint.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
@ -29,7 +29,7 @@
android:contentDescription="@string/app_name" android:contentDescription="@string/app_name"
app:srcCompat="@mipmap/ic_launcher" /> app:srcCompat="@mipmap/ic_launcher" />
<Space <androidx.legacy.widget.Space
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="30dp" /> android:layout_height="30dp" />
@ -39,10 +39,9 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="@string/charging" android:text="@string/charging"
android:textAlignment="center" android:textAlignment="center"
android:textAppearance="@android:style/TextAppearance.Material.Medium.Inverse" android:textAppearance="@android:style/TextAppearance.Material.Medium" />
android:textColor="@android:color/black" />
<Space <androidx.legacy.widget.Space
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="30dp" /> android:layout_height="30dp" />
@ -55,4 +54,4 @@
</LinearLayout> </LinearLayout>
</FrameLayout> </FrameLayout>
</android.support.constraint.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -1,25 +1,22 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" <androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
tools:context=".MainActivity"> tools:context=".MainActivity">
<android.support.design.widget.AppBarLayout <com.google.android.material.appbar.AppBarLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content">
android:theme="@style/P2playTheme.AppBarOverlay">
<android.support.v7.widget.Toolbar <androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar" android:id="@+id/toolbar"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize" android:layout_height="?attr/actionBarSize"/>
android:background="?attr/colorPrimary"
app:popupTheme="@style/P2playTheme.PopupOverlay" />
</android.support.design.widget.AppBarLayout> </com.google.android.material.appbar.AppBarLayout>
<include layout="@layout/content_main" /> <include layout="@layout/content_main" />
</android.support.design.widget.CoordinatorLayout> </androidx.coordinatorlayout.widget.CoordinatorLayout>

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
@ -8,7 +8,7 @@
tools:context=".MainActivity" tools:context=".MainActivity"
tools:showIn="@layout/app_bar_main"> tools:showIn="@layout/app_bar_main">
<android.support.v4.widget.SwipeRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android" <androidx.swiperefreshlayout.widget.SwipeRefreshLayout
android:id="@+id/swipeContainer" android:id="@+id/swipeContainer"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
@ -16,7 +16,7 @@
android:visibility="visible" android:visibility="visible"
app:layout_constraintTop_toTopOf="parent"> app:layout_constraintTop_toTopOf="parent">
<android.support.v7.widget.RecyclerView <view class="androidx.recyclerview.widget.RecyclerView"
android:id="@+id/list" android:id="@+id/list"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
@ -24,5 +24,5 @@
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" /> app:layout_constraintTop_toTopOf="parent" />
</android.support.v4.widget.SwipeRefreshLayout> </androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
</android.support.constraint.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -0,0 +1,99 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:background="#aa000000"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="horizontal"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<ImageView
android:layout_width="48dp"
android:layout_height="48dp"
android:id="@+id/exo_rew"
android:src="@drawable/ic_replay_10_24"
/>
<ImageView
android:id="@+id/exo_play_pause"
android:layout_width="48dp"
android:layout_height="48dp"
android:layout_marginHorizontal="30dp"/>
<ImageView
android:layout_width="48dp"
android:layout_height="48dp"
android:id="@+id/exo_ffwd"
android:src="@drawable/ic_forward_10_24"
/>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="0dp"
android:layout_marginEnd="0dp"
android:layout_marginBottom="0dp"
android:orientation="vertical"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="20dp"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/exo_position"
android:textColor="#fff"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="/"
android:textColor="#CBCDC8"
android:layout_marginHorizontal="4dp"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:id="@+id/exo_duration"
android:textColor="#CBCDC8"/>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="50dp"
android:orientation="horizontal">
<androidx.media3.ui.DefaultTimeBar
android:id="@+id/exo_progress"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_weight="2" />
<ImageView
android:id="@+id/exo_fullscreen_custom"
android:layout_width="42dp"
android:layout_height="42dp"
android:src="@drawable/ic_fullscreen_24"
android:layout_weight="0"
android:layout_gravity="center"/>
</LinearLayout>
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -6,21 +6,26 @@
android:orientation="vertical" android:orientation="vertical"
android:padding="10dp" > 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 <com.google.android.material.textfield.TextInputLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="4dp"
android:layout_weight="3"
android:hint="@string/reportDialog">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/reportText" android:id="@+id/reportText"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:inputType="textMultiLine"> android:inputType="textMultiLine" >
<requestFocus /> <requestFocus />
</EditText> </com.google.android.material.textfield.TextInputEditText>
</com.google.android.material.textfield.TextInputLayout>
</LinearLayout> </LinearLayout>

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content"> android:layout_height="wrap_content">
@ -48,4 +48,4 @@
android:maxLines="10" /> android:maxLines="10" />
</LinearLayout> </LinearLayout>
</LinearLayout> </LinearLayout>
</android.support.constraint.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
@ -14,20 +14,63 @@
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"> app:layout_constraintTop_toTopOf="parent">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<ImageView <ImageView
android:id="@+id/thumb" android:id="@+id/thumb"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="230dp" android:layout_height="205dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@android:drawable/ic_menu_gallery" /> app:srcCompat="@android:drawable/ic_menu_gallery" />
<TextView
android:id="@+id/isLive"
android:layout_width="65dp"
android:layout_height="19dp"
android:layout_marginStart="8dp"
android:layout_marginBottom="16dp"
android:background="@drawable/live_shape"
android:ems="10"
android:paddingHorizontal="3dp"
android:text="@string/is_live_video"
android:textAlignment="center"
android:textColor="@color/durationColor"
android:visibility="invisible"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
tools:visibility="invisible" />
<TextView
android:id="@+id/duration"
android:layout_width="65dp"
android:layout_height="19dp"
android:layout_marginEnd="8dp"
android:layout_marginBottom="16dp"
android:background="@drawable/round_text"
android:ems="10"
android:paddingHorizontal="3dp"
android:text="00:00"
android:textAlignment="center"
android:textColor="?attr/colorOnSecondary"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
<LinearLayout <LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="63dp" android:layout_height="55dp"
android:orientation="horizontal"> android:orientation="horizontal">
<ImageView <ImageView
android:id="@+id/userImg" android:id="@+id/userImg"
android:layout_width="140dp" android:layout_width="120dp"
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_weight="1" android:layout_weight="1"
android:adjustViewBounds="false" android:adjustViewBounds="false"
@ -50,7 +93,8 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:maxLength="70" android:maxLength="70"
android:textSize="14sp" android:textSize="14sp"
android:textStyle="bold" /> android:textStyle="bold"
android:theme="@style/MaterialAlertDialog.MaterialComponents.Title.Text" />
<TextView <TextView
android:id="@+id/descriptionTxt" android:id="@+id/descriptionTxt"
@ -64,10 +108,10 @@
</LinearLayout> </LinearLayout>
<Space <androidx.legacy.widget.Space
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="15dp" android:layout_height="5dp"
android:layout_weight="1" android:layout_weight="1"
app:layout_constraintTop_toBottomOf="@+id/linearLayout" /> app:layout_constraintTop_toBottomOf="@+id/linearLayout" />
</android.support.constraint.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -5,7 +5,8 @@
<item <item
android:id="@+id/app_bar_search" android:id="@+id/app_bar_search"
android:icon="@drawable/ic_search_black_24dp" android:icon="@drawable/ic_search_black_24dp"
app:actionViewClass="android.widget.SearchView" app:actionViewClass="androidx.appcompat.widget.SearchView"
android:title="@string/action_login"
app:showAsAction="always"/> app:showAsAction="always"/>
<item <item

View File

@ -9,7 +9,7 @@
<string name="aboutLabel">Sobre P2Play</string> <string name="aboutLabel">Sobre P2Play</string>
<string name="aboutText">P2Play es una aplicacion no-oficial de PeerTube. Tu puedes ver y cntribuir con el codigo en GitLab:</string> <string name="aboutText">P2Play es una aplicacion no-oficial de PeerTube. Tu puedes ver y cntribuir con el codigo en GitLab:</string>
<string name="aboutStatus">Puedes seguir nuestro blog:</string> <string name="aboutStatus">Puedes seguir nuestro blog:</string>
<string name="aboutLicense">Copyleft GNU GPLv3 License</string> <string name="aboutLicense">GNU GPLv3 License</string>
<string name="aboutInstance">Sobre la instancia</string> <string name="aboutInstance">Sobre la instancia</string>
<string name="aboutInWeb">Para ver los terminos y mas visita la web:</string> <string name="aboutInWeb">Para ver los terminos y mas visita la web:</string>
<!-- End About strings --> <!-- End About strings -->
@ -25,6 +25,7 @@
<string name="passwordTxt">Contraseña:</string> <string name="passwordTxt">Contraseña:</string>
<string name="loginBtn">Ingresar</string> <string name="loginBtn">Ingresar</string>
<string name="registerActionBtn">Crear una cuenta</string> <string name="registerActionBtn">Crear una cuenta</string>
<string name="instance">Instancia</string>
<!-- Toast msg --> <!-- Toast msg -->
<string name="loginSuccess_msg">Te has identificado</string> <string name="loginSuccess_msg">Te has identificado</string>
<string name="loginError_msg">Ha ocurrido un error</string> <string name="loginError_msg">Ha ocurrido un error</string>
@ -47,6 +48,7 @@
<string name="timeMin_text">minutos</string> <string name="timeMin_text">minutos</string>
<string name="timeHrs_text">horas</string> <string name="timeHrs_text">horas</string>
<string name="nav_header_title">Inicia session</string> <string name="nav_header_title">Inicia session</string>
<string name="is_live_video">En vivo</string>
<!-- Toast msg --> <!-- Toast msg -->
<string name="logout_msg">Te has desconectado</string> <string name="logout_msg">Te has desconectado</string>
<!-- End Main strings --> <!-- End Main strings -->

View File

@ -5,7 +5,7 @@
<string name="aboutLabel">Informazioni su P2Play</string> <string name="aboutLabel">Informazioni su P2Play</string>
<string name="aboutText">P2Play è un\'applicazione Android non ufficiale per PeerTube. Puoi visualizzare e contribuire al codice su GitLab:</string> <string name="aboutText">P2Play è un\'applicazione Android non ufficiale per PeerTube. Puoi visualizzare e contribuire al codice su GitLab:</string>
<string name="aboutStatus">Puoi seguire il nostro blog:</string> <string name="aboutStatus">Puoi seguire il nostro blog:</string>
<string name="aboutLicense">Copyleft GNU GPLv3 License</string> <string name="aboutLicense">GNU GPLv3 License</string>
<string name="aboutInstance">Informazioni sull\'istanza</string> <string name="aboutInstance">Informazioni sull\'istanza</string>
<string name="aboutInWeb">Puoi vedere in termini ed altro sul web:</string> <string name="aboutInWeb">Puoi vedere in termini ed altro sul web:</string>
<string name="hostInfoText">Scegliere l\'istanza</string> <string name="hostInfoText">Scegliere l\'istanza</string>

View File

@ -0,0 +1,23 @@
<resources>
<style name="Theme.P2play" parent="Theme.MaterialComponents.DayNight">
<item name="colorPrimary">@color/md_theme_dark_primary</item>
<item name="colorOnPrimary">@color/md_theme_dark_onPrimary</item>
<item name="colorSecondary">@color/md_theme_dark_secondary</item>
<item name="colorOnSecondary">@color/md_theme_dark_onSecondary</item>
<item name="colorError">@color/md_theme_dark_error</item>
<item name="colorOnError">@color/md_theme_dark_onError</item>
<item name="android:colorBackground">@color/md_theme_dark_background</item>
<item name="colorOnBackground">@color/md_theme_dark_onBackground</item>
<item name="colorSurface">@color/md_theme_dark_surface</item>
<item name="colorOnSurface">@color/md_theme_dark_onSurface</item>
<item name="colorPrimaryDark">@color/colorAccent</item>
<item name="colorAccent">@color/md_theme_dark_onBackground</item>
<item name="android:textColorLink">@color/md_theme_dark_secondary</item>
</style>
<style name="Theme.P2play.NoActionBar" parent="Theme.P2play">
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
</style>
</resources>

View File

@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<color name="colorPrimary">#3F51B5</color> <color name="colorPrimary">#9F4200</color>
<color name="colorPrimaryDark">#303F9F</color> <color name="colorPrimaryDark">#F4DED5</color>
<color name="colorAccent">#FF4081</color> <color name="colorAccent">#0f3239</color>
<color name="colorHeader">#ffffff</color> <color name="colorHeader">#ffffff</color>
<color name="colorBody">#fff</color> <color name="colorBody">#fff</color>
<color name="colorMenu">#000</color> <color name="colorMenu">#000</color>
@ -10,4 +10,69 @@
<color name="colorLike">#FF3C9100</color> <color name="colorLike">#FF3C9100</color>
<color name="colorDislike">#ec020e</color> <color name="colorDislike">#ec020e</color>
<color name="colorProfile">#262626</color> <color name="colorProfile">#262626</color>
<color name="durationBackground">#88000000</color>
<color name="durationColor">#ffffff</color>
<color name="seed">#f16805</color>
<color name="md_theme_light_primary">#9F4200</color>
<color name="md_theme_light_onPrimary">#FFFFFF</color>
<color name="md_theme_light_primaryContainer">#FFDBCB</color>
<color name="md_theme_light_onPrimaryContainer">#341100</color>
<color name="md_theme_light_secondary">#566500</color>
<color name="md_theme_light_onSecondary">#FFFFFF</color>
<color name="md_theme_light_secondaryContainer">#D9EC7B</color>
<color name="md_theme_light_onSecondaryContainer">#181E00</color>
<color name="md_theme_light_tertiary">#904D00</color>
<color name="md_theme_light_onTertiary">#FFFFFF</color>
<color name="md_theme_light_tertiaryContainer">#FFDCC3</color>
<color name="md_theme_light_onTertiaryContainer">#2F1500</color>
<color name="md_theme_light_error">#BA1A1A</color>
<color name="md_theme_light_errorContainer">#FFDAD6</color>
<color name="md_theme_light_onError">#FFFFFF</color>
<color name="md_theme_light_onErrorContainer">#410002</color>
<color name="md_theme_light_background">#F8FDFF</color>
<color name="md_theme_light_onBackground">#001F25</color>
<color name="md_theme_light_surface">#F8FDFF</color>
<color name="md_theme_light_onSurface">#001F25</color>
<color name="md_theme_light_surfaceVariant">#F4DED5</color>
<color name="md_theme_light_onSurfaceVariant">#52443D</color>
<color name="md_theme_light_outline">#85736C</color>
<color name="md_theme_light_inverseOnSurface">#D6F6FF</color>
<color name="md_theme_light_inverseSurface">#00363F</color>
<color name="md_theme_light_inversePrimary">#FFB692</color>
<color name="md_theme_light_shadow">#000000</color>
<color name="md_theme_light_surfaceTint">#9F4200</color>
<color name="md_theme_light_outlineVariant">#D7C2B9</color>
<color name="md_theme_light_scrim">#000000</color>
<color name="md_theme_dark_primary">#FFB692</color>
<color name="md_theme_dark_onPrimary">#562000</color>
<color name="md_theme_dark_primaryContainer">#793000</color>
<color name="md_theme_dark_onPrimaryContainer">#FFDBCB</color>
<color name="md_theme_dark_secondary">#BDD062</color>
<color name="md_theme_dark_onSecondary">#2C3400</color>
<color name="md_theme_dark_secondaryContainer">#404C00</color>
<color name="md_theme_dark_onSecondaryContainer">#D9EC7B</color>
<color name="md_theme_dark_tertiary">#FFB77C</color>
<color name="md_theme_dark_onTertiary">#4D2600</color>
<color name="md_theme_dark_tertiaryContainer">#6E3900</color>
<color name="md_theme_dark_onTertiaryContainer">#FFDCC3</color>
<color name="md_theme_dark_error">#FFB4AB</color>
<color name="md_theme_dark_errorContainer">#93000A</color>
<color name="md_theme_dark_onError">#690005</color>
<color name="md_theme_dark_onErrorContainer">#FFDAD6</color>
<color name="md_theme_dark_background">#001F25</color>
<color name="md_theme_dark_onBackground">#A6EEFF</color>
<color name="md_theme_dark_surface">#001F25</color>
<color name="md_theme_dark_onSurface">#A6EEFF</color>
<color name="md_theme_dark_surfaceVariant">#52443D</color>
<color name="md_theme_dark_onSurfaceVariant">#D7C2B9</color>
<color name="md_theme_dark_outline">#A08D85</color>
<color name="md_theme_dark_inverseOnSurface">#001F25</color>
<color name="md_theme_dark_inverseSurface">#A6EEFF</color>
<color name="md_theme_dark_inversePrimary">#9F4200</color>
<color name="md_theme_dark_shadow">#000000</color>
<color name="md_theme_dark_surfaceTint">#FFB692</color>
<color name="md_theme_dark_outlineVariant">#52443D</color>
<color name="md_theme_dark_scrim">#000000</color>
</resources> </resources>

View File

@ -9,14 +9,13 @@
<string name="charging">Loading…</string> <string name="charging">Loading…</string>
<!-- End Global string --> <!-- End Global string -->
<!-- Start About strings --> <!-- Start About strings -->
<string name="aboutGitUrl" translatable="false">https://gitlab.com/agosto182/p2play/</string> <string name="aboutGitUrl" translatable="false">https://gitlab.com/agosto182/p2play/</string>
<string name="aboutGnuUrl" translatable="false">https://personaljournal.ca/p2play/</string> <string name="aboutGnuUrl" translatable="false">https://personaljournal.ca/p2play/</string>
<string name="aboutLabel">About P2Play</string> <string name="aboutLabel">About P2Play</string>
<string name="aboutText">P2Play is an unofficial Android application for PeerTube. You can watch and contribute with the code on GitLab:</string> <string name="aboutText">P2Play is an unofficial Android application for PeerTube. You can watch and contribute with the code on GitLab:</string>
<string name="aboutStatus">You can follow our blog:</string> <string name="aboutStatus">You can follow our blog:</string>
<string name="aboutLicense">Copyleft GNU GPLv3 License</string> <string name="aboutLicense">Licence GNU GPLv3 License</string>
<string name="aboutInstance">About instance</string> <string name="aboutInstance">About instance</string>
<string name="aboutInWeb">You can see terms and more on the web:</string> <string name="aboutInWeb">You can see terms and more on the web:</string>
<!-- End About strings --> <!-- End About strings -->
@ -25,6 +24,7 @@
<string name="okButton">Accept</string> <string name="okButton">Accept</string>
<string name="errorMsg">Error, try again</string> <string name="errorMsg">Error, try again</string>
<string name="finallyMsg">Host saved</string> <string name="finallyMsg">Host saved</string>
<string name="instance">Instance</string>
<!-- End Host strings --> <!-- End Host strings -->
<!-- Start Login strings --> <!-- Start Login strings -->
<string name="loginInfo">Login or register new account</string> <string name="loginInfo">Login or register new account</string>
@ -59,6 +59,7 @@
<string name="timeHrs_text">hours</string> <string name="timeHrs_text">hours</string>
<string name="nav_header_title">Log In</string> <string name="nav_header_title">Log In</string>
<string name="nav_header_subtitle" translatable="false">P2Play</string> <string name="nav_header_subtitle" translatable="false">P2Play</string>
<string name="is_live_video">Live</string>
<!-- Toast msg --> <!-- Toast msg -->
<string name="logout_msg">You are now disconnected</string> <string name="logout_msg">You are now disconnected</string>
<!-- End Main strings --> <!-- End Main strings -->

View File

@ -0,0 +1,23 @@
<resources>
<style name="Theme.P2play" parent="Theme.MaterialComponents.DayNight">
<item name="colorPrimary">@color/md_theme_light_primary</item>
<item name="colorOnPrimary">@color/md_theme_light_onPrimary</item>
<item name="colorSecondary">@color/md_theme_light_secondary</item>
<item name="colorOnSecondary">@color/md_theme_light_onSecondary</item>
<item name="colorError">@color/md_theme_light_error</item>
<item name="colorOnError">@color/md_theme_light_onError</item>
<item name="android:colorBackground">@color/md_theme_light_background</item>
<item name="colorOnBackground">@color/md_theme_light_onBackground</item>
<item name="colorSurface">@color/md_theme_light_surface</item>
<item name="colorOnSurface">@color/md_theme_light_onSurface</item>
<item name="colorPrimaryDark">@color/md_theme_light_primary</item>
<item name="colorAccent">@color/md_theme_light_onPrimary</item>
<item name="android:textColorLink">@color/md_theme_light_secondary</item>
</style>
<style name="Theme.P2play.NoActionBar" parent="Theme.P2play">
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
</style>
</resources>

View File

@ -5,7 +5,7 @@
<EditTextPreference <EditTextPreference
android:capitalize="words" android:capitalize="words"
android:defaultValue="@string/pref_hostname_error" android:defaultValue="@string/pref_hostname_error"
android:inputType="textCapWords" android:inputType="text"
android:key="hostP2play" android:key="hostP2play"
android:maxLines="1" android:maxLines="1"
android:selectAllOnFocus="true" android:selectAllOnFocus="true"

View File

@ -1,11 +1,14 @@
<preference-headers xmlns:android="http://schemas.android.com/apk/res/android"> <preference-headers xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto">
<!-- These settings headers are only used on tablets. --> <!-- These settings headers are only used on tablets. -->
<header <header
android:fragment="org.libre.agosto.p2play.SettingsActivity$GeneralPreferenceFragment" android:fragment="org.libre.agosto.p2play.SettingsActivity$GeneralPreferenceFragment"
android:icon="@drawable/ic_info_black_24dp" android:icon="@drawable/ic_info_black_24dp"
android:title="@string/pref_header_general" /> android:title="@string/pref_header_general"
android:textColor="@color/md_theme_light_secondary"/>
<!-- <header <!-- <header
android:fragment="org.libre.agosto.p2play.SettingsActivity$NotificationPreferenceFragment" android:fragment="org.libre.agosto.p2play.SettingsActivity$NotificationPreferenceFragment"

View File

@ -1,13 +1,13 @@
// Top-level build file where you can add configuration options common to all sub-projects/modules. // Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript { buildscript {
ext.kotlin_version = '1.6.20' ext.kotlin_version = '1.6.21'
repositories { repositories {
google() google()
mavenCentral() mavenCentral()
} }
dependencies { dependencies {
classpath 'com.android.tools.build:gradle:7.4.2' classpath 'com.android.tools.build:gradle:8.3.0'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
// NOTE: Do not place your application dependencies here; they belong // NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files // in the individual module build.gradle files

View File

@ -7,6 +7,12 @@
# Specifies the JVM arguments used for the daemon process. # Specifies the JVM arguments used for the daemon process.
# The setting is particularly useful for tweaking memory settings. # The setting is particularly useful for tweaking memory settings.
org.gradle.jvmargs=-Xmx1536m org.gradle.jvmargs=-Xmx1536m
android.enableJetifier=true
android.useAndroidX=true
android.defaults.buildfeatures.buildconfig=true
android.nonTransitiveRClass=false
android.nonFinalResIds=false
# When configured, Gradle will run in incubating parallel mode. # When configured, Gradle will run in incubating parallel mode.
# This option should only be used with decoupled projects. More details, visit # This option should only be used with decoupled projects. More details, visit
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects

View File

@ -1,6 +1,6 @@
#Mon Mar 18 13:17:32 CST 2024 #Mon Mar 18 13:17:32 CST 2024
distributionBase=GRADLE_USER_HOME distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-bin.zip distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-bin.zip
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists zipStorePath=wrapper/dists

View File

@ -0,0 +1,5 @@
* Updated to androidx libraries
* Day/Night theme
* Exoplayer added
* Material2 implemented
* Obviusly bug fixes

View File

@ -1,20 +1,16 @@
P2Play is an Unofficial Android client for Peertube. P2Play is an Unofficial Android client for Peertube.
What is Peertube? https://github.com/Chocobozzz/PeerTube/
Features Features
* Show recent, popular and local list of videos. * Show recent, popular and local list of videos.
* Reproduce videos * Reproduce videos
* Login and register in your instance * Login in your instance
* Show uploaded videos * Show uploaded videos
* Subscribe to accounts * Subscribe to accounts
* Show your subscription videos * Show your subscription videos
* Show your history * Show your history
* Rate videos * Rate videos
* Show and make commentaries * Show and make commentaries
* Splash screen
* Search videos * Search videos
* Infinite scroll
* Share videos * Share videos
* Report videos * Report videos
* Peertube profiles * Peertube channels

Binary file not shown.

After

Width:  |  Height:  |  Size: 538 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 149 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 889 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 540 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 461 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 607 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 240 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 474 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 530 KiB

View File

@ -1,20 +1,16 @@
P2Play es una aplicacion no-oficial android para Peertube. P2Play es una aplicacion no-oficial android para Peertube.
¿Que es Peertube? https://github.com/Chocobozzz/PeerTube/ Características
* Mostrar la lista de vídeos recientes, populares y locales.
Caracteristicas * Reproducir vídeos
* Show recent, popular and local list of videos. * Iniciar sesión en su instancia
* Reproduce videos * Mostrar vídeos subidos
* Login and register in your instance * Suscribirse a cuentas
* Show uploaded videos * Mostrar tus vídeos suscritos
* Subscribe to accounts * Mostrar su historial
* Show your subscription videos * Valorar vídeos
* Show your history * Mostrar y hacer comentarios
* Rate videos * Buscar vídeos
* Show and make commentaries * Compartir vídeos
* Splash screen * Denunciar vídeos
* Search videos * Canales Peertube
* Infinite scroll
* Share videos
* Report videos
* Peertube profiles

64
readme.html Normal file
View File

@ -0,0 +1,64 @@
<h1>P2Play</h1>
<p>P2Play is an unoficial Peertube android application.</p>
<p><a href="https://github.com/Chocobozzz/PeerTube/">What is Peertube?</a></p>
<p><a href="https://f-droid.org/packages/org.libre.agosto.p2play/"><img src="https://fdroid.gitlab.io/artwork/badge/get-it-on.png"
alt="Get it on F-Droid"
height="80"></a></p>
<h2>Screenshots</h2>
<p><img src="metadata/en-US/images/phoneScreenshots/1.jpg" alt="Screenshot" width="14%"/>
<img src="metadata/en-US/images/phoneScreenshots/2.jpg" alt="Screenshot" width="14%"/>
<img src="metadata/en-US/images/phoneScreenshots/3.jpg" alt="Screenshot" width="14%"/>
<img src="metadata/en-US/images/phoneScreenshots/4.jpg" alt="Screenshot" width="14%"/>
<img src="metadata/en-US/images/phoneScreenshots/5.jpg" alt="Screenshot" width="14%">/
<img src="metadata/en-US/images/phoneScreenshots/6.jpg" alt="Screenshot" width="14%"/></p>
<h2>Realeases (apk's)</h2>
<p><a href="https://gitlab.com/agosto182/p2play/tags">All realeases are here</a></p>
<h2>Features</h2>
<ul>
<li>Show recent, popular and local list of videos.</li>
<li>Reproduce videos</li>
<li>Login and register in your instance</li>
<li>Show uploaded videos</li>
<li>Subscribe to accounts</li>
<li>Show your subscripcion videos</li>
<li>Show your history</li>
<li>Rate videos</li>
<li>Show and make commentaries</li>
<li>Splash screen</li>
<li>Search videos</li>
<li>Infinite scroll</li>
<li>Share videos</li>
<li>Report videos</li>
<li>Peertube profiles</li>
<li>Day/Night theme</li>
</ul>
<h2>What to do? (on incomming updates)</h2>
<ul>
<li>Playlists</li>
<li>Manage subscriptions</li>
<li>Better commentaries</li>
<li>Account channels view</li>
<li>Notifications</li>
</ul>
<h2>Demostrations</h2>
<p>P2play beta 0.6.0: https://fediverse.tv/w/suFPkm9zJstSrQU7WmVARv</p>
<p><strong>Dead links</strong></p>
<p>~~Demostration P2play Beta 0.2: https://peertube.video/videos/watch/730fa68e-32c4-4cdb-a7bb-1a819c9d3a46~~</p>
<p>~~Demostration P2Play Beta 0.1: https://peertube.video/videos/watch/2eb7b953-0b1b-4019-9300-817539f5f4e8~~</p>
<p>~~[Spanish] Demostracion P2Play Beta 0.1: https://peertube.video/videos/watch/d6a7da26-d3dd-43aa-ad5c-7d032603c848~~</p>
<h2>Contact</h2>
<p>You can follow our accounts to get news and contact with the developer(s).</p>
<ul>
<li>WriteFreely (ActivityPub): https://personaljournal.ca/p2play/</li>
</ul>
<h2>About</h2>
<p>P2Play is made in Android Studio with Kotlin languaje.</p>
<p><img alt="kotlin" src="https://weblizar.com/blog/wp-content/uploads/2017/11/Kotlin-A-New-Programming-Platform-For-Android-Developers.png" /></p>
<h3>Developers</h3>
<ul>
<li>Ivan Agosto: <a href="https://mast.lat/@agosto182">https://mast.lat/@agosto182</a></li>
</ul>
<h2>License</h2>
<p>This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.</p>
<p>This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details.</p>
<p>You should have received a copy of the GNU Affero General Public License along with this program. If not, see <a href="./LICENSE.md">license</a></p>