27 Commits
v0.1.5 ... v0.3

Author SHA1 Message Date
d15ad1006e Merge branch 'development' into 'master'
Development: 0.3 version

See merge request agosto182/p2play!4
2019-02-14 18:45:52 +00:00
fb98d96f66 Version 0.3 prereleased 2019-02-12 22:40:35 -06:00
c1b746da80 Fixed errors on infinite scroll 2019-02-12 11:45:24 -06:00
130ece5982 Title videos centered 2019-02-10 16:28:14 -06:00
999bd4ad9d Colors of nav changed 2019-02-10 13:42:29 -06:00
4347831907 Count videos added 2019-02-10 12:10:52 -06:00
d783b4887d Fixed bad practices of singleton 2019-02-10 11:41:56 -06:00
329813d1b3 Videos per page settings added 2019-02-10 10:29:36 -06:00
700559e28f Autoclose searchView 2019-02-10 00:03:21 -06:00
c07c15c766 Search videos and infinite scroll 2019-02-09 14:56:56 -06:00
305acc87e7 Nsfw content blocked by default 2019-02-07 08:27:25 -06:00
a626bc85bb Merge branch 'development' into 'master'
P2play 0.2

See merge request agosto182/p2play!3
2019-02-01 14:47:17 +00:00
66428e0c34 Fix subscriptions problems 2019-01-30 13:03:00 -06:00
76a1d2f4b3 Adding lint skips for releases 2019-01-30 12:40:36 -06:00
e2d1ffdb15 Update for 0.2 2019-01-29 17:17:32 -06:00
97c85c7bba Version name added +fix screen on reproductor 2019-01-29 16:23:33 -06:00
7930ffa582 Splash screen fix + description on videos 2019-01-29 14:56:50 -06:00
abec98d172 Splash screen + commentaries changes 2019-01-28 14:54:08 -06:00
e74e39fe28 Color of buttons changed 2019-01-25 12:35:15 -06:00
176e580f1f Make commentaries on videos 2019-01-25 12:30:48 -06:00
ab69d59f9a Showing commentaries on videos 2019-01-25 11:38:59 -06:00
5cf806577a Ajax petitions for commentaries 2019-01-25 11:38:37 -06:00
9bf8ea0483 Adapter and model of commentaries maked 2019-01-24 15:56:20 -06:00
6413bb078d iml files ignored 2019-01-24 14:46:34 -06:00
d918824d74 gitignore updated 2019-01-24 14:45:08 -06:00
7d60dc8c0f Updated kotlin + commentaries 2019-01-23 15:40:41 -06:00
4655d9ed86 Merge branch 'master' into development 2019-01-23 14:10:02 -06:00
46 changed files with 1072 additions and 450 deletions

6
.gitignore vendored
View File

@ -32,3 +32,9 @@ proguard/
captures/ captures/
\.idea/ \.idea/
# iml Files
*.iml
app/app.iml
app/release/

View File

@ -3,10 +3,20 @@ P2Play is an Android Application for Peertube.
[What is Peertube?](https://github.com/Chocobozzz/PeerTube/) [What is Peertube?](https://github.com/Chocobozzz/PeerTube/)
## Screenshots
![screenshot](screenshots/screenshot.png)
![screenshot](screenshots/screenshot2.png)
![screenshot](screenshots/screenshot3.png)
![screenshot](screenshots/screenshot4.png)
![screenshot](screenshots/screenshot5.png)
![screenshot](screenshots/screenshot6.png)
## Documentation ## Documentation
Comming soon! Comming soon!
## Realeases ## Realeases (apk's)
[All realeases are here](https://gitlab.com/agosto182/p2play/tags) [All realeases are here](https://gitlab.com/agosto182/p2play/tags)
@ -20,30 +30,37 @@ Comming soon!
- Subscribe to accounts - Subscribe to accounts
- Show your subscripcion videos - Show your subscripcion videos
- Rate videos - Rate videos
- Show and make commentaries
- Splash screen
- Search videos
- Infinite scroll
## What to do? (in next version) ## What to do? (in next version)
- Search videos
- Show and make commentaries
- Share videos - Share videos
- View Peertube profiles - Report videos
- Splash screen - Peertube profiles
- History of videos watched
- Notifications
## Demostrations ## Demostrations
Demostration P2Play Beta 0.1: [https://peertube.video/videos/watch/2eb7b953-0b1b-4019-9300-817539f5f4e8](https://peertube.video/videos/watch/2eb7b953-0b1b-4019-9300-817539f5f4e8)
[Spanish] Demostracion P2Play Beta 0.1: [https://peertube.video/videos/watch/d6a7da26-d3dd-43aa-ad5c-7d032603c848](https://peertube.video/videos/watch/d6a7da26-d3dd-43aa-ad5c-7d032603c848) Demostration P2play Beta 0.2: https://peertube.video/videos/watch/730fa68e-32c4-4cdb-a7bb-1a819c9d3a46
Demostration P2Play Beta 0.1: https://peertube.video/videos/watch/2eb7b953-0b1b-4019-9300-817539f5f4e8
[Spanish] Demostracion P2Play Beta 0.1: https://peertube.video/videos/watch/d6a7da26-d3dd-43aa-ad5c-7d032603c848
## Contact ## Contact
You can follow our accounts for get news and contact with the developers. You can follow our accounts for get news and contact with the developers.
- GNU Social: [https://gnusocial.ml/p2play](https://gnusocial.ml/p2play) - GNU Social: https://gnusocial.ml/p2play
- Peertube Channel: [https://peertube.video/video-channels/90df4e5f-c834-4720-a5d7-c9faa0af0af5/videos](https://peertube.video/video-channels/90df4e5f-c834-4720-a5d7-c9faa0af0af5/videos) - Peertube Channel: https://peertube.video/video-channels/90df4e5f-c834-4720-a5d7-c9faa0af0af5/videos
## About ## About
P2Play is made in Android Studio with Kotlin code. P2Play is made in Android Studio with Kotlin code.
<img src="https://weblizar.com/blog/wp-content/uploads/2017/11/Kotlin-A-New-Programming-Platform-For-Android-Developers.png" width="200px"> ![kotlin](https://weblizar.com/blog/wp-content/uploads/2017/11/Kotlin-A-New-Programming-Platform-For-Android-Developers.png)
### Developers ### Developers
- Ivan Agosto: [https://gnusocial.ml/agosto182](https://gnusocial.ml/agosto182) - Ivan Agosto: [https://gnusocial.ml/agosto182](https://gnusocial.ml/agosto182)

View File

@ -1,199 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<module external.linked.project.id=":app" external.linked.project.path="$MODULE_DIR$" external.root.project.path="$MODULE_DIR$/.." external.system.id="GRADLE" type="JAVA_MODULE" version="4">
<component name="FacetManager">
<facet type="android-gradle" name="Android-Gradle">
<configuration>
<option name="GRADLE_PROJECT_PATH" value=":app" />
</configuration>
</facet>
<facet type="android" name="Android">
<configuration>
<option name="SELECTED_BUILD_VARIANT" value="debug" />
<option name="ASSEMBLE_TASK_NAME" value="assembleDebug" />
<option name="COMPILE_JAVA_TASK_NAME" value="compileDebugSources" />
<afterSyncTasks>
<task>generateDebugSources</task>
</afterSyncTasks>
<option name="ALLOW_USER_CONFIGURATION" value="false" />
<option name="MANIFEST_FILE_RELATIVE_PATH" value="/src/main/AndroidManifest.xml" />
<option name="RES_FOLDER_RELATIVE_PATH" value="/src/main/res" />
<option name="RES_FOLDERS_RELATIVE_PATH" value="file://$MODULE_DIR$/src/main/res" />
<option name="ASSETS_FOLDER_RELATIVE_PATH" value="/src/main/assets" />
</configuration>
</facet>
<facet type="kotlin-language" name="Kotlin">
<configuration version="3" platform="JVM 1.8" useProjectSettings="false">
<compilerSettings />
<compilerArguments>
<option name="destination" value="$MODULE_DIR$/build/tmp/kotlin-classes/debug" />
<option name="noStdlib" value="true" />
<option name="noReflect" value="true" />
<option name="moduleName" value="app_debug" />
<option name="jvmTarget" value="1.8" />
<option name="addCompilerBuiltIns" value="true" />
<option name="loadBuiltInsFromDependencies" value="true" />
<option name="languageVersion" value="1.2" />
<option name="apiVersion" value="1.2" />
<option name="pluginOptions">
<array>
<option value="plugin:org.jetbrains.kotlin.android:experimental=false" />
<option value="plugin:org.jetbrains.kotlin.android:enabled=true" />
<option value="plugin:org.jetbrains.kotlin.android:defaultCacheImplementation=hashMap" />
</array>
</option>
<option name="pluginClasspaths">
<array>
<option value="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-android-extensions/1.2.51/1755c607e5fabf4ba949ef626c73fc7421d35123/kotlin-android-extensions-1.2.51.jar" />
</array>
</option>
</compilerArguments>
</configuration>
</facet>
</component>
<component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_6">
<output url="file://$MODULE_DIR$/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes" />
<output-test url="file://$MODULE_DIR$/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes" />
<exclude-output />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/apt/debug" isTestSource="false" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/not_namespaced_r_class_sources/debug/processDebugResources/r" isTestSource="false" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/aidl/debug" isTestSource="false" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/buildConfig/debug" isTestSource="false" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/rs/debug" isTestSource="false" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/res/rs/debug" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/res/resValues/debug" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/apt/androidTest/debug" isTestSource="true" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/not_namespaced_r_class_sources/debugAndroidTest/processDebugAndroidTestResources/r" isTestSource="true" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/aidl/androidTest/debug" isTestSource="true" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/buildConfig/androidTest/debug" isTestSource="true" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/rs/androidTest/debug" isTestSource="true" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/res/rs/androidTest/debug" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/res/resValues/androidTest/debug" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/apt/test/debug" isTestSource="true" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/src/debug/res" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/debug/resources" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/debug/assets" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/debug/aidl" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/debug/java" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/debug/rs" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/debug/shaders" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTestDebug/res" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTestDebug/resources" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTestDebug/assets" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTestDebug/aidl" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTestDebug/java" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTestDebug/rs" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTestDebug/shaders" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/testDebug/res" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/testDebug/resources" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/testDebug/assets" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/testDebug/aidl" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/testDebug/java" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/testDebug/rs" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/testDebug/shaders" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/main/res" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/main/assets" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/main/aidl" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/main/rs" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/main/shaders" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/res" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/resources" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/assets" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/aidl" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/java" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/rs" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/shaders" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/test/res" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/test/resources" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/test/assets" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/test/aidl" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/test/rs" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/test/shaders" isTestSource="true" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/annotation_processor_list" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/apk_list" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/blame" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/build-info" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/builds" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/check-libraries" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/check-manifest" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/checkDebugClasspath" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/compatible_screen_manifest" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/incremental" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/incremental-classes" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/incremental-runtime-classes" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/incremental-verifier" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/instant-run-apk" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/instant-run-resources" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/instant_run_merged_manifests" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/instant_run_split_apk_resources" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/javac" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/jniLibs" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/lint_jar" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/manifest-checker" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/merged_assets" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/merged_manifests" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/prebuild" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/processed_res" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/reload-dex" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/res" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/resources" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/rs" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/shader_assets" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/shaders" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/split-apk" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/split_list" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/symbols" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/transforms" />
<excludeFolder url="file://$MODULE_DIR$/build/kotlin" />
<excludeFolder url="file://$MODULE_DIR$/build/outputs" />
<excludeFolder url="file://$MODULE_DIR$/build/tmp" />
</content>
<orderEntry type="jdk" jdkName="Android API 27 Platform" jdkType="Android SDK" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" name="Gradle: com.android.support:transition-27.1.0" level="project" />
<orderEntry type="library" scope="TEST" name="Gradle: com.android.support.test:runner-1.0.2" level="project" />
<orderEntry type="library" name="Gradle: android.arch.lifecycle:common:1.1.0@jar" level="project" />
<orderEntry type="library" name="Gradle: org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.2.51@jar" level="project" />
<orderEntry type="library" scope="TEST" name="Gradle: com.android.support:support-annotations:27.1.1@jar" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:animated-vector-drawable-27.1.0" level="project" />
<orderEntry type="library" name="Gradle: org.jetbrains.kotlin:kotlin-stdlib-common:1.2.51@jar" level="project" />
<orderEntry type="library" name="Gradle: android.arch.lifecycle:viewmodel-1.1.0" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:support-v4-27.1.0" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:support-compat-27.1.0" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:recyclerview-v7-27.1.0" level="project" />
<orderEntry type="library" scope="TEST" name="Gradle: com.squareup:javawriter:2.1.1@jar" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:support-media-compat-27.1.0" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:support-vector-drawable-27.1.0" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:support-annotations:27.1.0@jar" level="project" />
<orderEntry type="library" name="Gradle: com.android.support.constraint:constraint-layout-1.1.2" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:support-core-utils-27.1.0" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:support-core-ui-27.1.0" level="project" />
<orderEntry type="library" name="Gradle: org.jetbrains:annotations:13.0@jar" level="project" />
<orderEntry type="library" scope="TEST" name="Gradle: com.google.code.findbugs:jsr305:2.0.1@jar" level="project" />
<orderEntry type="library" name="Gradle: com.squareup.okio:okio:1.14.0@jar" level="project" />
<orderEntry type="library" scope="TEST" name="Gradle: com.android.support.test.espresso:espresso-core-3.0.2" level="project" />
<orderEntry type="library" scope="TEST" name="Gradle: javax.inject:javax.inject:1@jar" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:support-fragment-27.1.0" level="project" />
<orderEntry type="library" scope="TEST" name="Gradle: junit:junit:4.12@jar" level="project" />
<orderEntry type="library" name="Gradle: org.jetbrains.kotlin:kotlin-stdlib:1.2.51@jar" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:design-27.1.0" level="project" />
<orderEntry type="library" name="Gradle: android.arch.core:runtime-1.1.0" level="project" />
<orderEntry type="library" scope="TEST" name="Gradle: org.hamcrest:hamcrest-core:1.3@jar" level="project" />
<orderEntry type="library" scope="TEST" name="Gradle: com.android.support.test:monitor-1.0.2" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:appcompat-v7-27.1.0" level="project" />
<orderEntry type="library" scope="TEST" name="Gradle: com.android.support.test.espresso:espresso-idling-resource-3.0.2" level="project" />
<orderEntry type="library" name="Gradle: com.squareup.okhttp3:okhttp:3.10.0@jar" level="project" />
<orderEntry type="library" name="Gradle: com.android.support.constraint:constraint-layout-solver:1.1.2@jar" level="project" />
<orderEntry type="library" name="Gradle: com.android.support:exifinterface-27.1.0" level="project" />
<orderEntry type="library" name="Gradle: android.arch.lifecycle:livedata-core-1.1.0" level="project" />
<orderEntry type="library" scope="TEST" name="Gradle: org.hamcrest:hamcrest-library:1.3@jar" level="project" />
<orderEntry type="library" scope="TEST" name="Gradle: org.hamcrest:hamcrest-integration:1.3@jar" level="project" />
<orderEntry type="library" name="Gradle: com.squareup.picasso:picasso-2.71828" level="project" />
<orderEntry type="library" name="Gradle: android.arch.core:common:1.1.0@jar" level="project" />
<orderEntry type="library" scope="TEST" name="Gradle: net.sf.kxml:kxml2:2.3.0@jar" level="project" />
<orderEntry type="library" name="Gradle: android.arch.lifecycle:runtime-1.1.0" level="project" />
</component>
</module>

View File

@ -7,11 +7,11 @@ apply plugin: 'kotlin-android-extensions'
android { android {
compileSdkVersion 27 compileSdkVersion 27
defaultConfig { defaultConfig {
applicationId "org.libre.agosto.p2play" applicationId "mx.agosto182.p2play"
minSdkVersion 21 minSdkVersion 21
targetSdkVersion 27 targetSdkVersion 27
versionCode 2 versionCode 4
versionName "0.1.5" versionName "0.3"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
} }
buildTypes { buildTypes {
@ -25,6 +25,10 @@ android {
sourceCompatibility JavaVersion.VERSION_1_6 sourceCompatibility JavaVersion.VERSION_1_6
targetCompatibility JavaVersion.VERSION_1_6 targetCompatibility JavaVersion.VERSION_1_6
} }
lintOptions {
checkReleaseBuilds false
abortOnError false
}
} }
dependencies { dependencies {

View File

@ -11,25 +11,30 @@
android:label="@string/app_name" android:label="@string/app_name"
android:roundIcon="@mipmap/ic_p2play" android:roundIcon="@mipmap/ic_p2play"
android:supportsRtl="true" android:supportsRtl="true"
android:theme="@style/P2playTheme" android:theme="@style/P2playTheme">
android:hardwareAccelerated="true"> <activity
<activity android:name=".HostActivity"> android:name=".SplashActivity"
android:theme="@style/Theme.AppCompat.Light.NoActionBar">
<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 <activity
android:name=".MainActivity" android:name=".MainActivity"
android:theme="@style/P2playTheme.NoActionBar" /> android:theme="@style/P2playTheme.NoActionBar" />
<activity android:name=".ReproductorActivity" /> <activity
android:name=".ReproductorActivity"
android:hardwareAccelerated="true"
android:configChanges="orientation|screenSize"/>
<activity android:name=".LoginActivity" /> <activity android:name=".LoginActivity" />
<activity android:name=".RegisterActivity" /> <activity android:name=".RegisterActivity" />
<activity android:name=".AboutActivity" /> <activity android:name=".AboutActivity" />
<activity <activity
android:name=".SettingsActivity" android:name=".SettingsActivity"
android:label="@string/title_activity_settings"></activity> android:label="@string/title_activity_settings" />
</application> </application>
</manifest> </manifest>

View File

@ -12,5 +12,7 @@ class AboutActivity : AppCompatActivity() {
setContentView(R.layout.activity_about) setContentView(R.layout.activity_about)
aboutUrl.text = "https://"+ManagerSingleton.url+"/about/instance" aboutUrl.text = "https://"+ManagerSingleton.url+"/about/instance"
aboutLabel.text = aboutLabel.text.toString() + " " + this.packageManager.getPackageInfo(this.packageName, 0).versionName
} }
} }

View File

@ -61,12 +61,14 @@ class Database(context:Context): SQLiteOpenHelper(context,"p2play",null,1) {
try { try {
var cursor= db.rawQuery("SELECT * FROM tokens WHERE status=1 ORDER BY id DESC LIMIT 1",null) var cursor= db.rawQuery("SELECT * FROM tokens WHERE status=1 ORDER BY id DESC LIMIT 1",null)
cursor.moveToFirst()
token.token = cursor.getString(cursor.getColumnIndex("token")).toString() if(cursor.count != 0){
token.refresh_token = cursor.getString(cursor.getColumnIndex("refresh_token")).toString() cursor.moveToFirst()
token.status = cursor.getString(cursor.getColumnIndex("status")).toInt()
token.token = cursor.getString(cursor.getColumnIndex("token")).toString()
token.refresh_token = cursor.getString(cursor.getColumnIndex("refresh_token")).toString()
token.status = cursor.getString(cursor.getColumnIndex("status")).toInt()
}
cursor.close() cursor.close()
return token return token
@ -85,15 +87,18 @@ class Database(context:Context): SQLiteOpenHelper(context,"p2play",null,1) {
try { try {
var cursor= db.rawQuery("SELECT * FROM users WHERE status=1 ORDER BY id DESC LIMIT 1",null) var cursor= db.rawQuery("SELECT * FROM users WHERE status=1 ORDER BY id DESC LIMIT 1",null)
cursor.moveToFirst()
user.uuid = cursor.getString(cursor.getColumnIndex("uuid")).toInt() if(cursor.count != 0){
user.username = cursor.getString(cursor.getColumnIndex("username")).toString() cursor.moveToFirst()
user.email = cursor.getString(cursor.getColumnIndex("email")).toString()
user.nsfw = cursor.getString(cursor.getColumnIndex("nsfw")).toBoolean() user.uuid = cursor.getString(cursor.getColumnIndex("uuid")).toInt()
user.followers = cursor.getString(cursor.getColumnIndex("followers")).toInt() user.username = cursor.getString(cursor.getColumnIndex("username")).toString()
user.avatar = cursor.getString(cursor.getColumnIndex("avatar")).toString() user.email = cursor.getString(cursor.getColumnIndex("email")).toString()
user.status = cursor.getString(cursor.getColumnIndex("status")).toInt() user.nsfw = cursor.getString(cursor.getColumnIndex("nsfw")).toBoolean()
user.followers = cursor.getString(cursor.getColumnIndex("followers")).toInt()
user.avatar = cursor.getString(cursor.getColumnIndex("avatar")).toString()
user.status = cursor.getString(cursor.getColumnIndex("status")).toInt()
}
cursor.close() cursor.close()

View File

@ -24,61 +24,34 @@ class HostActivity : AppCompatActivity() {
settings = PreferenceManager.getDefaultSharedPreferences(this) settings = PreferenceManager.getDefaultSharedPreferences(this)
editor = settings.edit() editor = settings.edit()
ManagerSingleton.context = this
button.setOnClickListener { button.setOnClickListener {
getKeys(hostText.text.toString()) getKeys(hostText.text.toString())
} }
val host = settings.getString("hostP2play","") val host = settings.getString("hostP2play", "")
val lastHost = settings.getString("last_host","") val lastHost = settings.getString("last_host", "")
if(host!=""){ if(host!=""){
if(lastHost!=host){ if(lastHost!=host){
_db.logout() _db.logout()
ManagerSingleton.logout()
getKeys(host) getKeys(host)
}else{ }else{
ManagerSingleton.url=host ManagerSingleton.url=host
checkUser() startApp()
} }
} }
} }
fun checkUser(){
val token = _db.getToken()
val user = _db.getUser()
AsyncTask.execute {
if (Looper.myLooper() == null)
Looper.prepare()
startApp()
if (token.status == 1 && user.status == 1) {
val client_id = settings.getString("client_id", "")
val client_secret = settings.getString("client_secret", "")
val newToken = client.refreshToken(token, client_id, client_secret)
when (token.status.toString()) {
"1" -> {
_db.newToken(newToken)
ManagerSingleton.token = newToken
ManagerSingleton.user = user
}
else -> _db.logout()
}
} else {
_db.logout()
}
this.finish()
}
}
fun saveHost(host: String){ fun saveHost(host: String){
editor.putString("last_host",host) editor.putString("last_host",host)
editor.putString("hostP2play",host) editor.putString("hostP2play",host)
editor.apply() editor.apply()
ManagerSingleton.Toast(getString(R.string.finallyMsg)) ManagerSingleton.Toast(getString(R.string.finallyMsg), this)
ManagerSingleton.url=host ManagerSingleton.url=host
checkUser() startApp()
} }
private fun getKeys(hostText: String){ private fun getKeys(hostText: String){
@ -101,7 +74,7 @@ class HostActivity : AppCompatActivity() {
} }
else{ else{
runOnUiThread { runOnUiThread {
ManagerSingleton.Toast(getString(R.string.errorMsg)) ManagerSingleton.Toast(getString(R.string.errorMsg), this)
button.isEnabled = true button.isEnabled = true
} }
} }
@ -110,8 +83,9 @@ class HostActivity : AppCompatActivity() {
private fun startApp(){ private fun startApp(){
runOnUiThread { runOnUiThread {
val intent = Intent(ManagerSingleton.context,MainActivity::class.java) val intent = Intent(this,MainActivity::class.java)
startActivity(intent) startActivity(intent)
this.finish()
} }
} }
} }

View File

@ -22,7 +22,6 @@ class LoginActivity : AppCompatActivity() {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
setContentView(R.layout.activity_login) setContentView(R.layout.activity_login)
setTitle(R.string.action_login) setTitle(R.string.action_login)
ManagerSingleton.context = this
_db = Database(this) _db = Database(this)
settings = PreferenceManager.getDefaultSharedPreferences(this) settings = PreferenceManager.getDefaultSharedPreferences(this)
@ -56,13 +55,13 @@ class LoginActivity : AppCompatActivity() {
} }
"0" -> { "0" -> {
runOnUiThread { runOnUiThread {
ManagerSingleton.Toast(getString(R.string.loginError_msg)) ManagerSingleton.Toast(getString(R.string.loginError_msg), this)
} }
} }
"-1" -> { "-1" -> {
runOnUiThread { runOnUiThread {
loginBtn.isEnabled = true loginBtn.isEnabled = true
ManagerSingleton.Toast(getString(R.string.loginFailed_msg)) ManagerSingleton.Toast(getString(R.string.loginFailed_msg), this)
} }
} }
} }
@ -76,13 +75,13 @@ class LoginActivity : AppCompatActivity() {
_db.newUser(user) _db.newUser(user)
ManagerSingleton.user = user ManagerSingleton.user = user
runOnUiThread { runOnUiThread {
ManagerSingleton.Toast(getString(R.string.loginSuccess_msg)) ManagerSingleton.Toast(getString(R.string.loginSuccess_msg), this)
finish() finish()
} }
} }
else{ else{
runOnUiThread { runOnUiThread {
ManagerSingleton.Toast(getString(R.string.loginError_msg)) ManagerSingleton.Toast(getString(R.string.loginError_msg), this)
} }
} }
} }

View File

@ -3,6 +3,7 @@ package org.libre.agosto.p2play
import android.content.Intent import android.content.Intent
import android.os.AsyncTask import android.os.AsyncTask
import android.os.Bundle import android.os.Bundle
import android.os.Handler
import android.support.design.widget.Snackbar import android.support.design.widget.Snackbar
import android.support.design.widget.NavigationView import android.support.design.widget.NavigationView
import android.support.v4.view.GravityCompat import android.support.v4.view.GravityCompat
@ -14,6 +15,7 @@ import android.view.Menu
import android.view.MenuInflater import android.view.MenuInflater
import android.view.MenuItem import android.view.MenuItem
import android.widget.ImageView import android.widget.ImageView
import android.widget.SearchView
import com.squareup.picasso.Picasso import com.squareup.picasso.Picasso
import kotlinx.android.synthetic.main.activity_main.* import kotlinx.android.synthetic.main.activity_main.*
import kotlinx.android.synthetic.main.app_bar_main.* import kotlinx.android.synthetic.main.app_bar_main.*
@ -25,14 +27,16 @@ import org.libre.agosto.p2play.models.VideoModel
class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelectedListener { class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelectedListener {
private lateinit var recyclerView: RecyclerView private lateinit var recyclerView: RecyclerView
private lateinit var viewAdapter: RecyclerView.Adapter<*> private lateinit var viewAdapter: RecyclerView.Adapter<VideosAdapter.ViewHolder>
private lateinit var viewManager: RecyclerView.LayoutManager private lateinit var viewManager: RecyclerView.LayoutManager
val client: Videos = Videos() private val client: Videos = Videos()
private lateinit var lastItem: MenuItem private lateinit var lastItem: MenuItem
private lateinit var subItem: MenuItem private lateinit var subItem: MenuItem
lateinit var myMenu: Menu lateinit var myMenu: Menu
val _db = Database(this) private val _db = Database(this)
var section: String = "" var section: String = ""
var searchVal: String = ""
var pagination = 0
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
@ -45,29 +49,32 @@ class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelecte
.setAction("Action", null).show() .setAction("Action", null).show()
} */ } */
val toggle = ActionBarDrawerToggle( val toggle = ActionBarDrawerToggle(this, drawer_layout, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close)
this, drawer_layout, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close)
drawer_layout.addDrawerListener(toggle) drawer_layout.addDrawerListener(toggle)
toggle.syncState() toggle.syncState()
// Context for ManagerSingleton
ManagerSingleton.context = this
nav_view.setNavigationItemSelectedListener(this) nav_view.setNavigationItemSelectedListener(this)
viewManager = LinearLayoutManager(this) viewManager = LinearLayoutManager(this)
// Set data for RecyclerView // Init RecyclerView
this.setData(arrayListOf()) this.initRecycler()
this.getLastVideos() this.getLastVideos()
swipeContainer.setOnRefreshListener { swipeContainer.setOnRefreshListener {
this.refresh() this.refresh()
} }
Handler().postDelayed({
// Title for nav_bar
side_emailTxt?.text = getString(R.string.nav_header_subtitle) + " " + this.packageManager.getPackageInfo(this.packageName, 0).versionName
}, 2000)
} }
// Generic function for set data to RecyclerView // Generic function for set data to RecyclerView
fun setData(data:ArrayList<VideoModel>){ private fun initRecycler(){
val data = arrayListOf<VideoModel>()
viewAdapter = VideosAdapter(data) viewAdapter = VideosAdapter(data)
recyclerView = findViewById<RecyclerView>(R.id.list).apply { recyclerView = findViewById<RecyclerView>(R.id.list).apply {
@ -80,17 +87,49 @@ class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelecte
// specify an viewAdapter (see also next example) // specify an viewAdapter (see also next example)
adapter = viewAdapter adapter = viewAdapter
this.addOnScrollListener(object : RecyclerView.OnScrollListener() {
override fun onScrolled(recyclerView: RecyclerView?, dx: Int, dy: Int) {
super.onScrolled(recyclerView, dx, dy)
if(!swipeContainer.isRefreshing){
if(!canScrollVertically(1)){
loadMore()
}
}
}
})
} }
swipeContainer.isRefreshing = false // swipeContainer.isRefreshing = false
} }
fun refresh(){ private fun addVideos(videos: ArrayList<VideoModel>){
this.swipeContainer.isRefreshing = true
try {
if(this.pagination == 0){
(viewAdapter as VideosAdapter).clearData()
recyclerView.scrollToPosition(0)
}
(viewAdapter as VideosAdapter).addData(videos)
}catch (err: Exception){
err.printStackTrace()
ManagerSingleton.Toast(getString(R.string.errorMsg), this)
}
this.swipeContainer.isRefreshing = false
}
private fun refresh(){
swipeContainer.isRefreshing = true swipeContainer.isRefreshing = true
this.pagination = 0
when(section){ when(section){
"local" -> this.getLocalVideos() "local" -> this.getLocalVideos()
"popular" -> this.getPopularVideos() "popular" -> this.getPopularVideos()
"last" -> this.getLastVideos() "last" -> this.getLastVideos()
"sub" -> this.getSubscriptionVideos() "sub" -> this.getSubscriptionVideos()
"search" -> this.searchVideos()
"my_videos" -> { "my_videos" -> {
if(ManagerSingleton.token.token != "") if(ManagerSingleton.token.token != "")
this.getMyVideos() this.getMyVideos()
@ -100,9 +139,9 @@ class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelecte
} }
} }
fun getSubscriptionVideos(){ private fun getSubscriptionVideos(){
if(ManagerSingleton.user.status != 1){ if(ManagerSingleton.user.status != 1){
ManagerSingleton.Toast("Inicia session primero") ManagerSingleton.Toast("Inicia session primero", this)
startActivity(Intent(this, LoginActivity::class.java)) startActivity(Intent(this, LoginActivity::class.java))
return return
} }
@ -110,59 +149,61 @@ class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelecte
section = "sub" section = "sub"
setTitle(R.string.title_subscriptions) setTitle(R.string.title_subscriptions)
AsyncTask.execute { AsyncTask.execute {
val videos = client.videoSubscriptions(ManagerSingleton.token.token) val videos = client.videoSubscriptions(ManagerSingleton.token.token, this.pagination)
runOnUiThread { runOnUiThread {
this.setData(videos) this.addVideos(videos)
} }
} }
} }
// Last videos // Last videos
fun getLastVideos(){ private fun getLastVideos(){
swipeContainer.isRefreshing = true swipeContainer.isRefreshing = true
section = "last" section = "last"
setTitle(R.string.title_recent) setTitle(R.string.title_recent)
AsyncTask.execute { AsyncTask.execute {
val videos = client.getLastVideos() val videos = client.getLastVideos(this.pagination)
runOnUiThread { runOnUiThread {
this.setData(videos) this.addVideos(videos)
} }
} }
} }
// // Popular videos
fun getPopularVideos(){ private fun getPopularVideos(){
swipeContainer.isRefreshing = true swipeContainer.isRefreshing = true
section = "popular" section = "popular"
setTitle(R.string.title_popular) setTitle(R.string.title_popular)
AsyncTask.execute { AsyncTask.execute {
val videos = client.getPopularVideos() val videos = client.getPopularVideos(this.pagination)
runOnUiThread { runOnUiThread {
this.setData(videos) this.addVideos(videos)
} }
} }
} }
fun getLocalVideos(){ // Local videos
private fun getLocalVideos(){
swipeContainer.isRefreshing = true swipeContainer.isRefreshing = true
section = "local" section = "local"
setTitle(R.string.title_local) setTitle(R.string.title_local)
AsyncTask.execute { AsyncTask.execute {
val videos = client.getLocalVideos() val videos = client.getLocalVideos(this.pagination)
runOnUiThread { runOnUiThread {
this.setData(videos) this.addVideos(videos)
} }
} }
} }
fun getMyVideos(){ // Videos of user
private fun getMyVideos(){
swipeContainer.isRefreshing = true swipeContainer.isRefreshing = true
section = "my_videos" section = "my_videos"
setTitle(R.string.title_myVideos) setTitle(R.string.title_myVideos)
AsyncTask.execute { AsyncTask.execute {
val videos = client.myVideos(ManagerSingleton.token.token) val videos = client.myVideos(ManagerSingleton.token.token, this.pagination)
runOnUiThread { runOnUiThread {
this.setData(videos) this.addVideos(videos)
} }
} }
} }
@ -178,6 +219,28 @@ class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelecte
override fun onCreateOptionsMenu(menu: Menu): Boolean { override fun onCreateOptionsMenu(menu: Menu): Boolean {
// Inflate the menu; this adds items to the action bar if it is present. // Inflate the menu; this adds items to the action bar if it is present.
menuInflater.inflate(R.menu.main, menu) menuInflater.inflate(R.menu.main, menu)
val searchItem = menu.findItem(R.id.app_bar_search)
val searchView = searchItem.actionView as SearchView
searchView.setOnQueryTextListener(object : SearchView.OnQueryTextListener{
override fun onQueryTextChange(p0: String?): Boolean {
return true
}
override fun onQueryTextSubmit(p0: String?): Boolean {
if(!p0.isNullOrBlank()){
searchVal = p0
pagination = 0
searchView.onActionViewCollapsed()
searchVideos()
}
return true
}
})
myMenu = menu myMenu = menu
setSideData() setSideData()
return true return true
@ -219,6 +282,8 @@ class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelecte
// lastItem.isChecked = false // lastItem.isChecked = false
// } // }
lastItem = item lastItem = item
pagination = 0
// item.isChecked = true // item.isChecked = true
when (item.itemId) { when (item.itemId) {
R.id.nav_subscriptions->{ R.id.nav_subscriptions->{
@ -245,7 +310,6 @@ class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelecte
override fun onResume() { override fun onResume() {
super.onResume() super.onResume()
ManagerSingleton.context = this
setSideData() setSideData()
} }
@ -266,23 +330,53 @@ class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelecte
} }
} }
fun logout(){ private fun logout(){
if(::myMenu.isInitialized){ if(::myMenu.isInitialized){
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
} }
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) side_emailTxt?.text = getString(R.string.nav_header_subtitle) + " " + this.packageManager.getPackageInfo(this.packageName, 0).versionName
side_imageView?.setImageResource(R.mipmap.ic_launcher_round) side_imageView?.setImageResource(R.mipmap.ic_launcher_round)
side_imageView?.setOnClickListener { } side_imageView?.setOnClickListener { }
_db.logout() _db.logout()
ManagerSingleton.logout() ManagerSingleton.logout()
this.refresh() this.refresh()
ManagerSingleton.Toast(getString(R.string.logout_msg)) ManagerSingleton.Toast(getString(R.string.logout_msg), this)
} }
private fun loadMore(){
swipeContainer.isRefreshing = true
this.pagination += ManagerSingleton.videos_count
when(section){
"local" -> this.getLocalVideos()
"popular" -> this.getPopularVideos()
"last" -> this.getLastVideos()
"sub" -> this.getSubscriptionVideos()
"search" -> this.searchVideos()
"my_videos" -> {
if(ManagerSingleton.token.token != "")
this.getMyVideos()
else
this.getLastVideos()
}
}
}
private fun searchVideos(){
swipeContainer.isRefreshing = true
section = "search"
this.title = this.searchVal
AsyncTask.execute {
val videos = client.search(this.searchVal, this.pagination)
runOnUiThread {
this.addVideos(videos)
}
}
}
} }

View File

@ -5,15 +5,15 @@ import org.libre.agosto.p2play.models.TokenModel
import org.libre.agosto.p2play.models.UserModel import org.libre.agosto.p2play.models.UserModel
object ManagerSingleton { object ManagerSingleton {
var context: Context?= null
var url: String?= null var url: String?= null
var user: UserModel = UserModel() var user: UserModel = UserModel()
var token: TokenModel = TokenModel() var token: TokenModel = TokenModel()
// var keys: var nfsw: Boolean = false
var videos_count: Int = 0
fun Toast(text: String?) { fun Toast(text: String?, context: Context) {
if(this.context == null) { return } if(context == null) { return }
android.widget.Toast.makeText(this.context, text, android.widget.Toast.LENGTH_SHORT).show() android.widget.Toast.makeText(context, text, android.widget.Toast.LENGTH_SHORT).show()
} }
fun logout(){ fun logout(){

View File

@ -20,7 +20,6 @@ class RegisterActivity : AppCompatActivity() {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
setContentView(R.layout.activity_register) setContentView(R.layout.activity_register)
setTitle(R.string.registerActionBtn) setTitle(R.string.registerActionBtn)
ManagerSingleton.context = this
settings = PreferenceManager.getDefaultSharedPreferences(this) settings = PreferenceManager.getDefaultSharedPreferences(this)
client_id = settings.getString("client_id", "") client_id = settings.getString("client_id", "")
@ -43,11 +42,11 @@ class RegisterActivity : AppCompatActivity() {
runOnUiThread { runOnUiThread {
when (res) { when (res) {
1 -> { 1 -> {
ManagerSingleton.Toast(getString(R.string.registerSuccess_msg)) ManagerSingleton.Toast(getString(R.string.registerSuccess_msg), this)
finish() finish()
} }
0 -> ManagerSingleton.Toast(getString(R.string.registerFailed_msg)) 0 -> ManagerSingleton.Toast(getString(R.string.registerFailed_msg), this)
-1 -> ManagerSingleton.Toast(getString(R.string.registerError_msg)) -1 -> ManagerSingleton.Toast(getString(R.string.registerError_msg), this)
} }
registerBtn.isEnabled = true registerBtn.isEnabled = true
} }

View File

@ -1,27 +1,42 @@
package org.libre.agosto.p2play package org.libre.agosto.p2play
import android.opengl.Visibility import android.app.Activity
import android.graphics.Bitmap
import android.graphics.BitmapFactory
import android.os.AsyncTask import android.os.AsyncTask
import android.support.v7.app.AppCompatActivity import android.support.v7.app.AppCompatActivity
import android.os.Bundle import android.os.Bundle
import android.os.Looper import android.os.Looper
import android.support.v4.content.ContextCompat import android.support.v4.content.ContextCompat
import android.support.v7.widget.LinearLayoutManager
import android.support.v7.widget.RecyclerView
import android.util.Log import android.util.Log
import android.view.View import android.view.View
import android.webkit.WebChromeClient
import android.widget.FrameLayout
import com.squareup.picasso.Picasso import com.squareup.picasso.Picasso
import kotlinx.android.synthetic.main.activity_reproductor.* import kotlinx.android.synthetic.main.activity_reproductor.*
import org.libre.agosto.p2play.adapters.CommentariesAdapter
import org.libre.agosto.p2play.ajax.Actions import org.libre.agosto.p2play.ajax.Actions
import org.libre.agosto.p2play.ajax.Comments
import org.libre.agosto.p2play.models.CommentaryModel
import org.libre.agosto.p2play.models.VideoModel import org.libre.agosto.p2play.models.VideoModel
class ReproductorActivity : AppCompatActivity() { class ReproductorActivity : AppCompatActivity() {
lateinit var video:VideoModel lateinit var video:VideoModel
private val _actions: Actions = Actions() private val _actions: Actions = Actions()
private val client: Comments = Comments()
// Commentaries adapter values
private lateinit var recyclerView: RecyclerView
private lateinit var viewAdapter: RecyclerView.Adapter<*>
private lateinit var viewManager: RecyclerView.LayoutManager
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
setContentView(R.layout.activity_reproductor) setContentView(R.layout.activity_reproductor)
ManagerSingleton.context = this
videoView.webChromeClient = WebClient()
videoView.settings.javaScriptEnabled = true videoView.settings.javaScriptEnabled = true
videoView.settings.allowContentAccess = true videoView.settings.allowContentAccess = true
videoView.settings.javaScriptCanOpenWindowsAutomatically = true videoView.settings.javaScriptCanOpenWindowsAutomatically = true
@ -35,76 +50,85 @@ class ReproductorActivity : AppCompatActivity() {
tittleVideoTxt.text = this.video.name tittleVideoTxt.text = this.video.name
viewsTxt.text = this.video.views.toString() + ' ' + getString(R.string.view_text) viewsTxt.text = this.video.views.toString() + ' ' + getString(R.string.view_text)
userTxt.text = this.video.username userTxt.text = this.video.username
descriptionVideoTxt.text = this.video.description descriptionVideoTxt.text = this.video.description.toString()
hostTxt.text = this.video.userHost.toString()
// Check if user had profile image
if(this.video.userImageUrl!="") if(this.video.userImageUrl!="")
Picasso.get().load("https://"+ManagerSingleton.url+this.video.userImageUrl).into(userImg) Picasso.get().load("https://"+ManagerSingleton.url+this.video.userImageUrl).into(userImg)
// Load the video
videoView.loadUrl("https://"+ManagerSingleton.url+this.video.embedUrl) videoView.loadUrl("https://"+ManagerSingleton.url+this.video.embedUrl)
Log.d("url", videoView.url)
} }
catch (err:Exception){ catch (err:Exception){
err.printStackTrace() err.printStackTrace()
Log.d("Error", err?.message) Log.d("Error", err?.message)
} }
// subscribeBtn.setOnClickListener { ManagerSingleton.Toast(getString(R.string.comming)) } viewManager = LinearLayoutManager(this)
this.setDataComments(arrayListOf())
this.getComments()
subscribeBtn.setOnClickListener { subscribe() } subscribeBtn.setOnClickListener { subscribe() }
likeLayout.setOnClickListener { rate("like") } likeLayout.setOnClickListener { rate("like") }
dislikeLayout.setOnClickListener { rate("dislike") } dislikeLayout.setOnClickListener { rate("dislike") }
commentaryBtn.setOnClickListener { makeComment() }
} }
fun subscribe(){ private fun subscribe(){
val account = this.video.userUuid+"@"+this.video.userHost val account = this.video.nameChannel+"@"+this.video.userHost
AsyncTask.execute { AsyncTask.execute {
if (Looper.myLooper() == null) if (Looper.myLooper() == null)
Looper.prepare() Looper.prepare()
val res = this._actions.subscribe(ManagerSingleton.token.token, account) val res = this._actions.subscribe(ManagerSingleton.token.token, account)
if (res == 1) { if (res == 1) {
runOnUiThread { runOnUiThread {
ManagerSingleton.Toast(getString(R.string.subscribeMsg)) ManagerSingleton.Toast(getString(R.string.subscribeMsg), this)
this.changeSubscribeBtn(true) this.changeSubscribeBtn(true)
} }
} }
} }
} }
fun unSubscribe(){ private fun unSubscribe(){
val account = this.video.userUuid+"@"+this.video.userHost val account = this.video.nameChannel+"@"+this.video.userHost
AsyncTask.execute { AsyncTask.execute {
if (Looper.myLooper() == null) if (Looper.myLooper() == null)
Looper.prepare() Looper.prepare()
val res = this._actions.unSubscribe(ManagerSingleton.token.token, account) val res = this._actions.unSubscribe(ManagerSingleton.token.token, account)
if (res == 1) { if (res == 1) {
runOnUiThread { runOnUiThread {
ManagerSingleton.Toast(getString(R.string.unSubscribeMsg)) ManagerSingleton.Toast(getString(R.string.unSubscribeMsg), this)
this.changeSubscribeBtn(false) this.changeSubscribeBtn(false)
} }
} }
} }
} }
fun rate(rate: String){ private fun rate(rate: String){
AsyncTask.execute { AsyncTask.execute {
if (Looper.myLooper() == null) if (Looper.myLooper() == null)
Looper.prepare() Looper.prepare()
val res = this._actions.rate(ManagerSingleton.token.token, this.video.id, rate) val res = this._actions.rate(ManagerSingleton.token.token, this.video.id, rate)
if (res == 1) { if (res == 1) {
runOnUiThread { runOnUiThread {
ManagerSingleton.Toast(getString(R.string.rateMsg)) ManagerSingleton.Toast(getString(R.string.rateMsg), this)
if(rate=="like"){ if(rate=="like"){
likeLayout.setBackgroundColor(ContextCompat.getColor(this, R.color.colorLike)) textViewLike.setTextColor(ContextCompat.getColor(this, R.color.colorLike))
dislikeLayout.background = null textViewDislike.setTextColor(ContextCompat.getColor(this, R.color.primary_dark_material_light))
} }
else if(rate=="dislike"){ else if(rate=="dislike"){
dislikeLayout.setBackgroundColor(ContextCompat.getColor(this, R.color.colorDislike)) textViewDislike.setTextColor(ContextCompat.getColor(this, R.color.colorDislike))
likeLayout.background = null textViewLike.setTextColor(ContextCompat.getColor(this, R.color.primary_dark_material_light))
} }
} }
} }
} }
} }
fun getRate(){ private fun getRate(){
AsyncTask.execute { AsyncTask.execute {
if (Looper.myLooper() == null) if (Looper.myLooper() == null)
Looper.prepare() Looper.prepare()
@ -112,24 +136,24 @@ class ReproductorActivity : AppCompatActivity() {
runOnUiThread { runOnUiThread {
when (rate){ when (rate){
"like" -> { "like" -> {
likeLayout.setBackgroundColor(ContextCompat.getColor(this, R.color.colorLike)) textViewLike.setTextColor(ContextCompat.getColor(this, R.color.colorLike))
dislikeLayout.background = null textViewDislike.setTextColor(ContextCompat.getColor(this, R.color.primary_dark_material_light))
} }
"dislike" -> { "dislike" -> {
dislikeLayout.setBackgroundColor(ContextCompat.getColor(this, R.color.colorDislike)) textViewDislike.setTextColor(ContextCompat.getColor(this, R.color.colorDislike))
likeLayout.background = null textViewLike.setTextColor(ContextCompat.getColor(this, R.color.primary_dark_material_light))
} }
else -> { else -> {
likeLayout.background = null textViewLike.setTextColor(ContextCompat.getColor(this, R.color.primary_dark_material_light))
dislikeLayout.background = null textViewDislike.setTextColor(ContextCompat.getColor(this, R.color.primary_dark_material_light))
} }
} }
} }
} }
} }
fun getSubscription(){ private fun getSubscription(){
val account = this.video.userUuid+"@"+this.video.userHost val account = this.video.nameChannel+"@"+this.video.userHost
AsyncTask.execute { AsyncTask.execute {
if (Looper.myLooper() == null) if (Looper.myLooper() == null)
Looper.prepare() Looper.prepare()
@ -140,7 +164,7 @@ class ReproductorActivity : AppCompatActivity() {
} }
} }
fun changeSubscribeBtn(subscribed: Boolean){ private fun changeSubscribeBtn(subscribed: Boolean){
if(subscribed){ if(subscribed){
subscribeBtn.text = getText(R.string.unSubscribeBtn) subscribeBtn.text = getText(R.string.unSubscribeBtn)
subscribeBtn.setOnClickListener { this.unSubscribe() } subscribeBtn.setOnClickListener { this.unSubscribe() }
@ -151,6 +175,53 @@ class ReproductorActivity : AppCompatActivity() {
} }
} }
private fun setDataComments(data: ArrayList<CommentaryModel>) {
// Set data for RecyclerView
viewAdapter = CommentariesAdapter(data)
recyclerView = findViewById<RecyclerView>(R.id.listCommentaries).apply {
// use this setting to improve performance if you know that changes
// in content do not change the layout size of the RecyclerView
setHasFixedSize(true)
// use a linear layout manager
layoutManager = viewManager
// specify an viewAdapter (see also next example)
adapter = viewAdapter
}
}
private fun getComments() {
AsyncTask.execute {
val data = this.client.getCommentaries(this.video.id)
runOnUiThread {
this.setDataComments(data)
}
}
}
private fun makeComment() {
if(commentaryText.text.toString() == ""){
ManagerSingleton.Toast(getString(R.string.emptyCommentaryMsg), this)
return
}
val text = commentaryText.text.toString()
AsyncTask.execute {
val res = this.client.makeCommentary(ManagerSingleton.token.token, this.video.id, text)
runOnUiThread {
if (res) {
ManagerSingleton.Toast(getString(R.string.makedCommentaryMsg), this)
commentaryText.text.clear()
this.getComments()
}
else {
ManagerSingleton.Toast(getString(R.string.errorCommentaryMsg), this)
}
}
}
}
override fun onResume() { override fun onResume() {
super.onResume() super.onResume()
if(ManagerSingleton.user.status == 1) { if(ManagerSingleton.user.status == 1) {
@ -158,6 +229,56 @@ class ReproductorActivity : AppCompatActivity() {
this.getSubscription() this.getSubscription()
actionsLayout.visibility = View.VISIBLE actionsLayout.visibility = View.VISIBLE
subscribeBtn.visibility = View.VISIBLE subscribeBtn.visibility = View.VISIBLE
commentaryLayout.visibility = View.VISIBLE
if(ManagerSingleton.user.avatar != ""){
Picasso.get().load("https://"+ManagerSingleton.url+ManagerSingleton.user.avatar).into(userImgCom)
}
} }
} }
internal inner class WebClient: WebChromeClient() {
private var mCustomView: View? = null
private var mCustomViewCallback: WebChromeClient.CustomViewCallback? = null
private var mOriginalOrientation: Int = 0
private var mOriginalSystemUiVisibility: Int = 0
override fun getDefaultVideoPoster(): Bitmap? {
return if (mCustomView == null) {
null
} else BitmapFactory.decodeResource(this@ReproductorActivity.resources, 2130837573)
}
override fun onHideCustomView() {
try {
(this@ReproductorActivity.window.decorView as FrameLayout).removeView(this.mCustomView)
this.mCustomView = null
this@ReproductorActivity.window.decorView.systemUiVisibility = this.mOriginalSystemUiVisibility
this@ReproductorActivity.requestedOrientation = this.mOriginalOrientation
this.mCustomViewCallback?.onCustomViewHidden()
this.mCustomViewCallback = null
}
catch (err: Exception){
err.printStackTrace()
}
}
override fun onShowCustomView(paramView: View, paramCustomViewCallback: WebChromeClient.CustomViewCallback) {
if (this.mCustomView != null) {
this.onHideCustomView()
return
}
try {
this.mCustomView = paramView
this.mOriginalSystemUiVisibility = this@ReproductorActivity.window.decorView.systemUiVisibility
this.mOriginalOrientation = this@ReproductorActivity.requestedOrientation
this.mCustomViewCallback = paramCustomViewCallback
(this@ReproductorActivity.window.decorView as FrameLayout).addView(this.mCustomView, FrameLayout.LayoutParams(-1, -1))
this@ReproductorActivity.window.decorView.systemUiVisibility = 3846
}
catch (err: Exception){
err.printStackTrace()
}
}
}
} }

View File

@ -32,13 +32,12 @@ class SettingsActivity : AppCompatPreferenceActivity() {
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
ManagerSingleton.context = this
setupActionBar() setupActionBar()
} }
override fun onBackPressed() { override fun onBackPressed() {
super.onBackPressed() super.onBackPressed()
ManagerSingleton.Toast(getString(R.string.pref_message_exit)) ManagerSingleton.Toast(getString(R.string.pref_message_exit), this)
} }
/** /**

View File

@ -0,0 +1,109 @@
package org.libre.agosto.p2play
import android.content.Intent
import android.content.SharedPreferences
import android.os.AsyncTask
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.os.Handler
import android.os.Looper
import android.preference.PreferenceManager
import android.util.Log
import org.libre.agosto.p2play.ajax.Auth
import java.lang.Exception
class SplashActivity : AppCompatActivity() {
lateinit var settings: SharedPreferences
lateinit var editor: SharedPreferences.Editor
val client: Auth = Auth()
val _db = Database(this)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_splash)
settings = PreferenceManager.getDefaultSharedPreferences(this)
ManagerSingleton.nfsw = settings.getBoolean("show_nfsw", false)
ManagerSingleton.videos_count = settings.getString("videos_count", "15").toInt()
val host = settings.getString("hostP2play","")
val lastHost = settings.getString("last_host","")
if(host != ""){
if(lastHost != host){
_db.logout()
Handler().postDelayed({
startHostActivity()
}, 2000)
}else{
ManagerSingleton.url = host
checkUser()
}
}
else{
Handler().postDelayed({
startHostActivity()
}, 2000)
}
}
private fun checkUser(){
Log.d("was", "Chequed")
try {
val token = _db.getToken()
val user = _db.getUser()
AsyncTask.execute {
if (Looper.myLooper() == null)
Looper.prepare()
if (token.status == 1 && user.status == 1) {
val client_id = settings.getString("client_id", "")
val client_secret = settings.getString("client_secret", "")
val newToken = client.refreshToken(token, client_id, client_secret)
when (token.status.toString()) {
"1" -> {
_db.newToken(newToken)
ManagerSingleton.token = newToken
ManagerSingleton.user = user
}
else -> _db.logout()
}
} else {
_db.logout()
}
startApp()
Log.d("Aqui", "81")
}
}
catch (err: Exception){
err.printStackTrace()
Log.d("Aqui", "89")
Handler().postDelayed({
startApp()
}, 2000)
}
}
private fun startApp() {
runOnUiThread {
val intent = Intent(this, MainActivity::class.java)
startActivity(intent)
this.finish()
}
}
private fun startHostActivity() {
runOnUiThread {
val intent = Intent(this, HostActivity::class.java)
startActivity(intent)
this.finish()
}
}
}

View File

@ -0,0 +1,74 @@
package org.libre.agosto.p2play.adapters
import android.app.Activity
import android.content.Context
import android.content.Intent
import android.graphics.drawable.Drawable
import android.os.AsyncTask
import android.support.v7.widget.RecyclerView
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.LinearLayout
import android.widget.TextView
import com.squareup.picasso.Picasso
import org.libre.agosto.p2play.MainActivity
import org.libre.agosto.p2play.ManagerSingleton
import org.libre.agosto.p2play.R
import org.libre.agosto.p2play.ReproductorActivity
import org.libre.agosto.p2play.models.CommentaryModel
import org.libre.agosto.p2play.models.VideoModel
import java.io.InputStream
import java.io.Serializable
import java.net.URL
class CommentariesAdapter(private val myDataset: ArrayList<CommentaryModel>) :
RecyclerView.Adapter<CommentariesAdapter.ViewHolder>() {
// Provide a reference to the views for each data item
// Complex data items may need more than one view per item, and
// you provide access to all the views for a data item in a view holder.
// Each data item is just a string in this case that is shown in a TextView.
class ViewHolder(val view: View) : RecyclerView.ViewHolder(view){
val userImg: ImageView
val username: TextView
val commentary: TextView
val context: Context
init {
// Define click listener for the ViewHolder's View
username = view.findViewById(R.id.userTxt)
commentary = view.findViewById(R.id.userCommentary)
userImg = view.findViewById(R.id.userCommentImg)
context = view.context
}
}
// Create new views (invoked by the layout manager)
override fun onCreateViewHolder(parent: ViewGroup,
viewType: Int): CommentariesAdapter.ViewHolder {
// create a new view
val view = LayoutInflater.from(parent.context)
.inflate(R.layout.view_commentary, parent, false) as View
// set the view's size, margins, paddings and layout parameters
return ViewHolder(view)
}
// Replace the contents of a view (invoked by the layout manager)
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
// - get element from your dataset at this position
// - replace the contents of the view with that element
holder.username.text = myDataset[position].username
if(myDataset[position].userImageUrl!="")
Picasso.get().load("https://"+ManagerSingleton.url+myDataset[position].userImageUrl).into(holder.userImg);
holder.commentary.text = myDataset[position].commentary
}
// Return the size of your dataset (invoked by the layout manager)
override fun getItemCount() = myDataset.size
}

View File

@ -1,6 +1,7 @@
package org.libre.agosto.p2play.adapters package org.libre.agosto.p2play.adapters
import android.app.Activity import android.app.Activity
import android.content.Context
import android.content.Intent import android.content.Intent
import android.graphics.drawable.Drawable import android.graphics.drawable.Drawable
import android.os.AsyncTask import android.os.AsyncTask
@ -20,10 +21,12 @@ import org.libre.agosto.p2play.models.VideoModel
import java.io.InputStream import java.io.InputStream
import java.io.Serializable import java.io.Serializable
import java.net.URL 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>() {
// Provide a reference to the views for each data item // Provide a reference to the views for each data item
// 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.
@ -33,6 +36,7 @@ class VideosAdapter(private val myDataset: ArrayList<VideoModel>) :
val userImg: ImageView val userImg: ImageView
val tittle: TextView val tittle: TextView
val description: TextView val description: TextView
val context: Context
init { init {
// Define click listener for the ViewHolder's View // Define click listener for the ViewHolder's View
@ -40,10 +44,10 @@ class VideosAdapter(private val myDataset: ArrayList<VideoModel>) :
description = view.findViewById(R.id.descriptionTxt) description = view.findViewById(R.id.descriptionTxt)
thumb = view.findViewById(R.id.thumb) thumb = view.findViewById(R.id.thumb)
userImg = view.findViewById(R.id.userImg) 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): VideosAdapter.ViewHolder { viewType: Int): VideosAdapter.ViewHolder {
@ -61,19 +65,45 @@ class VideosAdapter(private val myDataset: ArrayList<VideoModel>) :
holder.tittle.text = myDataset[position].name holder.tittle.text = myDataset[position].name
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(ManagerSingleton.context, ReproductorActivity::class.java) val intent = Intent(holder.context, ReproductorActivity::class.java)
intent.putExtra("video", myDataset[position] as Serializable) intent.putExtra("video", myDataset[position] as Serializable)
ManagerSingleton.context!!.startActivity(intent) holder.context.startActivity(intent)
} }
if(myDataset[position].userImageUrl!="") if(myDataset[position].userImageUrl!="")
Picasso.get().load("https://"+ManagerSingleton.url+myDataset[position].userImageUrl).into(holder.userImg); Picasso.get().load("https://"+ManagerSingleton.url+myDataset[position].userImageUrl).into(holder.userImg)
else
Picasso.get().load(R.drawable.default_avatar).into(holder.userImg)
val viewsText = ManagerSingleton.context!!.getString(R.string.view_text) val viewsText = holder.context.getString(R.string.view_text)
val timeText = ManagerSingleton.context!!.getString(R.string.time_text) var timeText = holder.context.getString(R.string.timeSec_text)
holder.description.text = myDataset[position].username+" - "+myDataset[position].views+" "+viewsText+" - "+myDataset[position].duration+" "+timeText var timeString = myDataset[position].duration.toString()
val seconds = myDataset[position].duration.toInt();
if(seconds > 60 && seconds < (60 * 60)){
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
} }
// Return the size of your dataset (invoked by the layout manager) // Return the size of your dataset (invoked by the layout manager)
override fun getItemCount() = myDataset.size override fun getItemCount() = myDataset.size
fun clearData(){
myDataset.clear()
notifyDataSetChanged()
}
fun addData(newItems: ArrayList<VideoModel>){
val lastPos = myDataset.size
myDataset.addAll(newItems)
notifyItemRangeInserted(lastPos, newItems.size)
}
} }

View File

@ -0,0 +1,112 @@
package org.libre.agosto.p2play.ajax
import android.util.JsonReader
import android.util.JsonToken
import android.util.Log
import org.libre.agosto.p2play.models.CommentaryModel
import java.io.InputStreamReader
class Comments: Client() {
fun parseCommentaries(data: JsonReader): ArrayList<CommentaryModel> {
var commentaries = arrayListOf<CommentaryModel>()
data.beginObject()
while (data.hasNext()){
when(data.nextName()) {
"data" -> {
data.beginArray()
while (data.hasNext()) {
val comment = CommentaryModel()
data.beginObject()
while (data.hasNext()) {
val key = data.nextName()
when (key.toString()) {
"id" -> comment.id = data.nextInt()
"threadId" -> comment.threadId = data.nextInt()
"text" -> comment.commentary = data.nextString()
"totalReplies" -> comment.replies = data.nextInt()
"account" -> {
data.beginObject()
while (data.hasNext()){
val acKey = data.nextName()
when(acKey.toString()){
"displayName"-> comment.username=data.nextString()
"avatar"-> {
if(data.peek() == JsonToken.BEGIN_OBJECT){
data.beginObject()
while (data.hasNext()){
val avKey = data.nextName()
when(avKey){
"path"-> comment.userImageUrl = data.nextString()
else-> data.skipValue()
}
}
data.endObject()
}
else
data.skipValue()
}
"uuid" -> comment.userUuid = data.nextString()
"host" -> comment.userHost = data.nextString()
else -> data.skipValue()
}
}
data.endObject()
}
else -> data.skipValue()
}
}
data.endObject()
commentaries.add(comment)
}
data.endArray()
}
else -> data.skipValue()
}
}
data.endObject()
return commentaries
}
fun getCommentaries(videoId: Int): ArrayList<CommentaryModel> {
var commentaries = arrayListOf<CommentaryModel>()
val con = this._newCon("videos/$videoId/comment-threads", "GET")
try {
if (con.responseCode == 200) {
var response = InputStreamReader(con.inputStream)
var data = JsonReader(response)
commentaries = parseCommentaries(data)
}
} catch(err:Exception){
err?.printStackTrace()
Log.d("TypeErr",err?.message ,err.cause)
Log.d("Error","fallo la coneccion")
}
return commentaries
}
fun makeCommentary(token: String, videoId: Int, text: String): Boolean {
val con = this._newCon("videos/$videoId/comment-threads", "POST", token)
val params:String= "text=$text"
con.outputStream.write(params.toByteArray())
try {
if (con.responseCode == 200) {
return true
}
else{
Log.d("Status", con.responseMessage)
}
}
catch (err: Exception){
err.printStackTrace()
}
return false
}
}

View File

@ -3,12 +3,13 @@ package org.libre.agosto.p2play.ajax
import android.util.JsonReader import android.util.JsonReader
import android.util.JsonToken import android.util.JsonToken
import android.util.Log import android.util.Log
import org.libre.agosto.p2play.ManagerSingleton
import org.libre.agosto.p2play.models.VideoModel import org.libre.agosto.p2play.models.VideoModel
import java.io.InputStreamReader import java.io.InputStreamReader
class Videos: Client() { class Videos: Client() {
fun parseVideos(data: JsonReader): ArrayList<VideoModel>{ private fun parseVideos(data: JsonReader): ArrayList<VideoModel>{
var videos = arrayListOf<VideoModel>() var videos = arrayListOf<VideoModel>()
data.beginObject() data.beginObject()
while (data.hasNext()){ while (data.hasNext()){
@ -67,6 +68,7 @@ class Videos: Client() {
} }
"uuid" -> video.userUuid = data.nextString() "uuid" -> video.userUuid = data.nextString()
"host" -> video.userHost = data.nextString() "host" -> video.userHost = data.nextString()
"name" -> video.nameChannel = data.nextString()
else-> data.skipValue() else-> data.skipValue()
} }
} }
@ -90,8 +92,10 @@ class Videos: Client() {
return videos return videos
} }
private fun getVideos(start:Int, count:Int, sort:String = "-publishedAt", filter:String = ""):ArrayList<VideoModel>{ private fun getVideos(start:Int, sort:String = "-publishedAt", filter:String = ""):ArrayList<VideoModel>{
var params = "start=$start&count=$count&sort=$sort" val nsfw = ManagerSingleton.nfsw
val count = ManagerSingleton.videos_count
var params = "start=$start&count=$count&sort=$sort&nsfw=$nsfw"
if(filter != "") if(filter != "")
params+="&filter=$filter" params+="&filter=$filter"
var con=this._newCon("videos?$params","GET") var con=this._newCon("videos?$params","GET")
@ -104,26 +108,26 @@ class Videos: Client() {
} }
} catch(err:Exception){ } catch(err:Exception){
err?.printStackTrace() err?.printStackTrace()
Log.d("TypeErr",err?.message ,err.cause)
Log.d("Error","fallo la coneccion")
} }
return videos return videos
} }
fun getLastVideos(start:Int = 0, count:Int = 30): ArrayList<VideoModel>{ fun getLastVideos(start:Int = 0): ArrayList<VideoModel>{
return this.getVideos(start, count) return this.getVideos(start)
} }
fun getPopularVideos(start:Int = 0, count:Int = 30): ArrayList<VideoModel>{ fun getPopularVideos(start:Int = 0): ArrayList<VideoModel>{
return this.getVideos(start, count,"-views") return this.getVideos(start,"-views")
} }
fun getLocalVideos(start:Int = 0, count:Int = 30): ArrayList<VideoModel>{ fun getLocalVideos(start:Int = 0): ArrayList<VideoModel>{
return this.getVideos(start, count,"-publishedAt", "local") return this.getVideos(start,"-publishedAt", "local")
} }
fun myVideos(token: String): ArrayList<VideoModel>{ fun myVideos(token: String, start: Int = 0): ArrayList<VideoModel>{
var con=this._newCon("users/me/videos","GET", token) val count = ManagerSingleton.videos_count
val params = "start=$start&count=$count"
var con=this._newCon("users/me/videos?$params","GET", token)
var videos = arrayListOf<VideoModel>() var videos = arrayListOf<VideoModel>()
try { try {
if (con.responseCode == 200) { if (con.responseCode == 200) {
@ -133,14 +137,32 @@ class Videos: Client() {
} }
} catch(err:Exception){ } catch(err:Exception){
err?.printStackTrace() err?.printStackTrace()
Log.d("TypeErr",err?.message ,err.cause)
Log.d("Error","fallo la coneccion")
} }
return videos return videos
} }
fun videoSubscriptions(token: String): ArrayList<VideoModel>{ fun videoSubscriptions(token: String, start: Int = 0): ArrayList<VideoModel>{
var con=this._newCon("users/me/subscriptions/videos","GET", token) val count = ManagerSingleton.videos_count
val params = "start=$start&count=$count"
var con=this._newCon("users/me/subscriptions/videos?$params","GET", token)
var videos = arrayListOf<VideoModel>()
try {
if (con.responseCode == 200) {
var response = InputStreamReader(con.inputStream)
var data = JsonReader(response)
videos = parseVideos(data)
}
} catch(err:Exception){
err?.printStackTrace()
}
return videos
}
fun search(text: String, start: Int = 0): ArrayList<VideoModel>{
val count = ManagerSingleton.videos_count
val nsfw = ManagerSingleton.nfsw
val params = "search=$text&start=$start&count=$count&nsfw=$nsfw"
var con=this._newCon("search/videos?$params","GET")
var videos = arrayListOf<VideoModel>() var videos = arrayListOf<VideoModel>()
try { try {
if (con.responseCode == 200) { if (con.responseCode == 200) {
@ -150,8 +172,6 @@ class Videos: Client() {
} }
} catch(err:Exception){ } catch(err:Exception){
err?.printStackTrace() err?.printStackTrace()
Log.d("TypeErr",err?.message ,err.cause)
Log.d("Error","fallo la coneccion")
} }
return videos return videos
} }

View File

@ -0,0 +1,12 @@
package org.libre.agosto.p2play.models
class CommentaryModel (
var id: Int = 0,
var threadId: Int = 0,
var userUuid: String = "",
var username: String = "",
var userImageUrl: String = "",
var commentary: String = "",
var userHost: String = "",
var replies: Int = 0
)

View File

@ -13,5 +13,6 @@ class VideoModel(
var username: String = "", var username: String = "",
var views: Number = 0, var views: Number = 0,
var userUuid: String = "", var userUuid: String = "",
var userHost: String = "" var userHost: String = "",
var nameChannel: String = ""
):Serializable ):Serializable

View File

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
android:fillColor="#FF000000"
android:pathData="M15.5,14h-0.79l-0.28,-0.27C15.41,12.59 16,11.11 16,9.5 16,5.91 13.09,3 9.5,3S3,5.91 3,9.5 5.91,16 9.5,16c1.61,0 3.09,-0.59 4.23,-1.57l0.27,0.28v0.79l5,4.99L20.49,19l-4.99,-5zM9.5,14C7.01,14 5,11.99 5,9.5S7.01,5 9.5,5 14,7.01 14,9.5 11.99,14 9.5,14z"/>
</vector>

View File

@ -56,6 +56,7 @@
<Button <Button
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" />

View File

@ -76,6 +76,7 @@
<Button <Button
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"
@ -87,6 +88,7 @@
<Button <Button
android:id="@+id/registerActionBtn" android:id="@+id/registerActionBtn"
style="@style/Widget.AppCompat.Button.Borderless"
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"

View File

@ -18,6 +18,10 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_gravity="start" android:layout_gravity="start"
android:background="@color/colorMenu"
app:itemTextColor="@color/colorBody"
app:itemIconTint="@android:color/darker_gray"
android:theme="@style/ThemeOverlay.AppCompat.Dark"
android:fitsSystemWindows="true" android:fitsSystemWindows="true"
app:headerLayout="@layout/nav_header_main" app:headerLayout="@layout/nav_header_main"
app:menu="@menu/activity_main_drawer" /> app:menu="@menu/activity_main_drawer" />

View File

@ -90,6 +90,7 @@
<Button <Button
android:id="@+id/registerBtn" android:id="@+id/registerBtn"
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/registerBtn" android:text="@string/registerBtn"

View File

@ -7,8 +7,9 @@
tools:context=".ReproductorActivity"> tools:context=".ReproductorActivity">
<ScrollView <ScrollView
android:layout_width="match_parent" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"> app:layout_constraintTop_toTopOf="parent">
@ -25,7 +26,8 @@
<WebView <WebView
android:id="@+id/videoView" android:id="@+id/videoView"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="220dp"> android:layout_height="270dp"
android:layout_weight="1">
</WebView> </WebView>
@ -33,8 +35,9 @@
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:paddingLeft="5dp" android:paddingStart="5dp"
android:textAppearance="@android:style/TextAppearance.Material.Large" android:textAppearance="@android:style/TextAppearance.Material.Large"
android:textSize="18sp"
android:textStyle="bold" /> android:textStyle="bold" />
<TextView <TextView
@ -42,12 +45,13 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:paddingLeft="5dp" android:paddingLeft="5dp"
android:paddingRight="5dp"
android:textSize="12sp" /> android:textSize="12sp" />
<LinearLayout <LinearLayout
android:id="@+id/actionsLayout" android:id="@+id/actionsLayout"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="40dp" android:layout_height="50dp"
android:gravity="top" android:gravity="top"
android:orientation="horizontal" android:orientation="horizontal"
android:visibility="gone"> android:visibility="gone">
@ -57,21 +61,25 @@
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:orientation="vertical"> android:orientation="vertical"
android:visibility="visible">
<ImageView <ImageView
android:id="@+id/imageView" android:id="@+id/imageView"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="match_parent"
android:layout_weight="1" android:layout_weight="1"
android:adjustViewBounds="false" android:adjustViewBounds="false"
android:contentDescription="@string/likeBtn"
android:cropToPadding="false" android:cropToPadding="false"
android:scaleType="center"
android:visibility="visible"
app:srcCompat="@drawable/ic_like" /> app:srcCompat="@drawable/ic_like" />
<TextView <TextView
android:id="@+id/textView" android:id="@+id/textViewLike"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="match_parent"
android:layout_weight="1" android:layout_weight="1"
android:text="@string/likeBtn" android:text="@string/likeBtn"
android:textAlignment="center" /> android:textAlignment="center" />
@ -82,21 +90,24 @@
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:orientation="vertical"> android:orientation="vertical"
android:visibility="visible">
<ImageView <ImageView
android:id="@+id/imageView2" android:id="@+id/imageView2"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="match_parent"
android:layout_weight="1" android:layout_weight="1"
android:adjustViewBounds="false" android:adjustViewBounds="false"
android:contentDescription="@string/dislikeBtn"
android:cropToPadding="false" android:cropToPadding="false"
android:visibility="visible"
app:srcCompat="@drawable/ic_dislike" /> app:srcCompat="@drawable/ic_dislike" />
<TextView <TextView
android:id="@+id/textView" android:id="@+id/textViewDislike"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="match_parent"
android:layout_weight="1" android:layout_weight="1"
android:text="@string/dislikeBtn" android:text="@string/dislikeBtn"
android:textAlignment="center" /> android:textAlignment="center" />
@ -104,7 +115,7 @@
<Button <Button
android:id="@+id/button4" android:id="@+id/button4"
android:layout_width="wrap_content" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_weight="1" android:layout_weight="1"
android:text="@string/shareBtn" android:text="@string/shareBtn"
@ -112,7 +123,7 @@
<Button <Button
android:id="@+id/button3" android:id="@+id/button3"
android:layout_width="wrap_content" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_weight="1" android:layout_weight="1"
android:text="@string/reportBtn" android:text="@string/reportBtn"
@ -121,14 +132,14 @@
<LinearLayout <LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="60dp"
android:layout_weight="1" android:layout_weight="1"
android:orientation="horizontal"> android:orientation="horizontal">
<ImageView <ImageView
android:id="@+id/userImg" android:id="@+id/userImg"
android:layout_width="40dp" android:layout_width="40dp"
android:layout_height="50dp" android:layout_height="match_parent"
android:layout_margin="0dp" android:layout_margin="0dp"
android:layout_weight="1" android:layout_weight="1"
android:adjustViewBounds="false" android:adjustViewBounds="false"
@ -137,45 +148,60 @@
android:scaleType="centerInside" android:scaleType="centerInside"
app:srcCompat="@drawable/default_avatar" /> app:srcCompat="@drawable/default_avatar" />
<TextView <LinearLayout
android:id="@+id/userTxt" android:layout_width="wrap_content"
android:layout_width="70dp"
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_weight="2" android:layout_weight="2"
android:textAppearance="@android:style/TextAppearance.Material.Large" android:orientation="vertical">
android:textColor="@android:color/black" />
<TextView
android:id="@+id/userTxt"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAppearance="@android:style/TextAppearance.Material.Large"
android:textColor="@android:color/black"
android:textSize="18sp"
android:textStyle="bold" />
<TextView
android:id="@+id/hostTxt"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="10sp"
android:textStyle="italic" />
</LinearLayout>
<Button <Button
android:id="@+id/subscribeBtn" android:id="@+id/subscribeBtn"
style="@android:style/Widget.Holo.Button.Small" style="@style/Widget.AppCompat.Button.Colored"
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:visibility="gone" /> android:textSize="10sp"
android:visibility="visible" />
</LinearLayout> </LinearLayout>
<TextView <TextView
android:id="@+id/descriptionTxt" android:id="@+id/descriptionTxt"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:maxLength="1000"
android:maxLines="100"
android:paddingLeft="5dp" android:paddingLeft="5dp"
android:text="@string/descriptionTxt" /> android:text="@string/descriptionTxt" />
<ScrollView <TextView
android:id="@+id/descriptionVideoTxt"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="80dp"> android:layout_height="wrap_content"
android:autoLink="web"
<TextView android:linksClickable="true"
android:id="@+id/descriptionVideoTxt" android:maxLength="10000"
android:layout_width="match_parent" android:maxLines="100"
android:layout_height="wrap_content" android:paddingLeft="10dp"
android:maxLength="1000" android:paddingRight="10dp" />
android:maxLines="1000"
android:paddingLeft="5dp"
android:text="TextView"
android:textStyle="italic" />
</ScrollView>
<View <View
android:id="@+id/divider" android:id="@+id/divider"
@ -183,6 +209,70 @@
android:layout_height="1dp" android:layout_height="1dp"
android:background="?android:attr/listDivider" /> android:background="?android:attr/listDivider" />
<Space
android:layout_width="match_parent"
android:layout_height="30dp" />
<TextView
android:id="@+id/commentariesTxt"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingLeft="5dp"
android:text="@string/commentariesTxt" />
<Space
android:layout_width="match_parent"
android:layout_height="20dp" />
<LinearLayout
android:id="@+id/commentaryLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:visibility="gone">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<ImageView
android:id="@+id/userImgCom"
android:layout_width="10dp"
android:layout_height="60dp"
android:layout_weight="1"
app:srcCompat="@drawable/default_avatar" />
<EditText
android:id="@+id/commentaryText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="2"
android:ems="10"
android:hint="@string/commentHolder"
android:inputType="textMultiLine" />
</LinearLayout>
<Button
android:id="@+id/commentaryBtn"
style="@style/Widget.AppCompat.Button.Colored"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:text="@string/commentaryText" />
</LinearLayout>
<android.support.v7.widget.RecyclerView
android:id="@+id/listCommentaries"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:scrollbars="none"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</LinearLayout> </LinearLayout>
</ScrollView> </ScrollView>

View File

@ -0,0 +1,58 @@
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".SplashActivity">
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginEnd="16dp"
android:layout_marginBottom="32dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<ImageView
android:id="@+id/imageView2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:contentDescription="@string/app_name"
app:srcCompat="@drawable/icon" />
<Space
android:layout_width="match_parent"
android:layout_height="30dp" />
<TextView
android:id="@+id/hostInfoText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/charging"
android:textAlignment="center"
android:textAppearance="@android:style/TextAppearance.Material.Medium.Inverse"
android:textColor="@android:color/black" />
<Space
android:layout_width="match_parent"
android:layout_height="30dp" />
<ProgressBar
android:id="@+id/progressBar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:backgroundTint="?attr/colorAccent"
android:indeterminate="true" />
</LinearLayout>
</FrameLayout>
</android.support.constraint.ConstraintLayout>

View File

@ -3,22 +3,21 @@
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="@dimen/nav_header_height" android:layout_height="@dimen/nav_header_height"
android:background="@android:color/darker_gray" android:background="@color/colorProfile"
android:gravity="bottom" android:gravity="bottom"
android:orientation="vertical" android:orientation="vertical"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin" android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
android:theme="@style/ThemeOverlay.AppCompat.Dark"> android:theme="@style/ThemeOverlay.AppCompat.Dark">
<ImageView <ImageView
android:id="@+id/side_imageView" android:id="@+id/side_imageView"
android:layout_width="wrap_content" android:layout_width="50dp"
android:layout_height="wrap_content" android:layout_height="50dp"
android:contentDescription="@string/nav_header_desc" android:contentDescription="@string/nav_header_desc"
android:paddingTop="@dimen/nav_header_vertical_spacing" app:srcCompat="@drawable/default_avatar" />
app:srcCompat="@mipmap/ic_launcher_round" />
<TextView <TextView
android:id="@+id/side_usernameTxt" android:id="@+id/side_usernameTxt"
@ -26,12 +25,15 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:paddingTop="@dimen/nav_header_vertical_spacing" android:paddingTop="@dimen/nav_header_vertical_spacing"
android:text="@string/nav_header_title" android:text="@string/nav_header_title"
android:textAppearance="@style/TextAppearance.AppCompat.Body1" /> android:textAppearance="@style/TextAppearance.AppCompat.Body1"
android:textColor="@android:color/white"
android:textSize="18sp" />
<TextView <TextView
android:id="@+id/side_emailTxt" android:id="@+id/side_emailTxt"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="@string/nav_header_subtitle" /> android:text="@string/nav_header_subtitle"
android:textColor="@android:color/darker_gray" />
</LinearLayout> </LinearLayout>

View File

@ -0,0 +1,50 @@
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:paddingLeft="10dp"
android:paddingRight="10dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toTopOf="parent">
<ImageView
android:id="@+id/userCommentImg"
android:layout_width="100dp"
android:layout_height="60dp"
android:layout_weight="1"
android:contentDescription="@string/app_name"
app:srcCompat="@drawable/default_avatar" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:orientation="vertical"
android:paddingLeft="10dp"
android:paddingRight="10dp">
<TextView
android:id="@+id/userTxt"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="@android:color/darker_gray"
android:textStyle="italic" />
<TextView
android:id="@+id/userCommentary"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:autoLink="web"
android:linksClickable="true"
android:maxLength="1000"
android:maxLines="10" />
</LinearLayout>
</LinearLayout>
</android.support.constraint.ConstraintLayout>

View File

@ -41,6 +41,7 @@
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:gravity="center"
android:orientation="vertical"> android:orientation="vertical">
<TextView <TextView
@ -48,16 +49,15 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:maxLength="70" android:maxLength="70"
android:text="TextView" android:textSize="14sp"
android:textSize="18sp"
android:textStyle="bold" /> android:textStyle="bold" />
<TextView <TextView
android:id="@+id/descriptionTxt" android:id="@+id/descriptionTxt"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="TextView" android:textColor="@android:color/darker_gray"
android:textColor="@android:color/darker_gray" /> android:textSize="12sp" />
</LinearLayout> </LinearLayout>
</LinearLayout> </LinearLayout>

View File

@ -3,7 +3,10 @@
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
tools:showIn="navigation_view"> tools:showIn="navigation_view">
<item android:title="Videos"> <item
android:id="@+id/ai"
android:icon="@android:color/darker_gray"
android:title="Videos">
<menu> <menu>
<item <item
android:id="@+id/nav_subscriptions" android:id="@+id/nav_subscriptions"
@ -24,7 +27,10 @@
</menu> </menu>
</item> </item>
<item android:title="More"> <item
android:id="@+id/aiao"
android:icon="@android:color/white"
android:title="More">
<menu> <menu>
<item <item
android:id="@+id/nav_about" android:id="@+id/nav_about"

View File

@ -2,6 +2,12 @@
<menu xmlns:android="http://schemas.android.com/apk/res/android" <menu 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">
<item
android:id="@+id/app_bar_search"
android:icon="@drawable/ic_search_black_24dp"
app:actionViewClass="android.widget.SearchView"
app:showAsAction="always"/>
<item <item
android:id="@+id/action_login" android:id="@+id/action_login"
android:title="@string/action_login" android:title="@string/action_login"

View File

@ -2,6 +2,7 @@
<resources> <resources>
<!-- Start Global strings --> <!-- Start Global strings -->
<string name="comming">Proximamente</string> <string name="comming">Proximamente</string>
<string name="charging">Cargando...</string>
<!-- End Global strings --> <!-- End Global strings -->
<!-- Start About strings --> <!-- Start About strings -->
@ -42,9 +43,10 @@
<string name="title_subscriptions">Suscripciones</string> <string name="title_subscriptions">Suscripciones</string>
<string name="title_myVideos">Mis videos</string> <string name="title_myVideos">Mis videos</string>
<string name="view_text">vistas</string> <string name="view_text">vistas</string>
<string name="time_text">segundos</string> <string name="timeSec_text">segundos</string>
<string name="timeMin_text">minutos</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="nav_header_subtitle">P2Play (alfa)</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 -->
@ -62,6 +64,8 @@
<!-- End MiniMenu strings --> <!-- End MiniMenu strings -->
<!-- Start Reproductor strings --> <!-- Start Reproductor strings -->
<string name="descriptionTxt">Descripcion:</string> <string name="descriptionTxt">Descripcion:</string>
<string name="commentariesTxt">Comentarios:</string>
<string name="commentHolder">Has un comentario</string>
<!-- Actions --> <!-- Actions -->
<string name="likeBtn">Like</string> <string name="likeBtn">Like</string>
<string name="dislikeBtn">Dislike</string> <string name="dislikeBtn">Dislike</string>
@ -69,10 +73,14 @@
<string name="reportBtn">Reportar</string> <string name="reportBtn">Reportar</string>
<string name="subscribeBtn">Subscribir</string> <string name="subscribeBtn">Subscribir</string>
<string name="unSubscribeBtn">Desubscribir</string> <string name="unSubscribeBtn">Desubscribir</string>
<string name="commentaryText">Comentar</string>
<!-- Messages --> <!-- Messages -->
<string name="subscribeMsg">Te has subscribido a este canal</string> <string name="subscribeMsg">Te has subscribido a este canal</string>
<string name="rateMsg">Has valorado este video</string> <string name="rateMsg">Has valorado este video</string>
<string name="unSubscribeMsg">Te has desubscribido de este canal</string> <string name="unSubscribeMsg">Te has desubscribido de este canal</string>
<string name="makedCommentaryMsg">Has comentado este video</string>
<string name="errorCommentaryMsg">A ocurrido un error, intenta de nuevo</string>
<string name="emptyCommentaryMsg">Porfavor has un comentario primero</string>
<!-- End Reproductor strings --> <!-- End Reproductor strings -->
<!-- Start Settings strings --> <!-- Start Settings strings -->
<string name="title_activity_settings">Configuracion</string> <string name="title_activity_settings">Configuracion</string>
@ -82,6 +90,7 @@
<string name="pref_nfsw_description">Si es activado podria mostrar contenido para adultos o sencible.</string> <string name="pref_nfsw_description">Si es activado podria mostrar contenido para adultos o sencible.</string>
<string name="pref_hostname_title">Instancia Peertube</string> <string name="pref_hostname_title">Instancia Peertube</string>
<string name="pref_message_exit">Reinicia para aplicar los cambios</string> <string name="pref_message_exit">Reinicia para aplicar los cambios</string>
<string name="pref_videos_count_title">Videos por pagina</string>
<!-- End Settings strings --> <!-- End Settings strings -->
</resources> </resources>

View File

@ -9,4 +9,5 @@
<color name="colorBlack">#000</color> <color name="colorBlack">#000</color>
<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>
</resources> </resources>

View File

@ -5,7 +5,8 @@
<string name="navigation_drawer_open" translatable="false">Open navigation drawer</string> <string name="navigation_drawer_open" translatable="false">Open navigation drawer</string>
<string name="navigation_drawer_close" translatable="false">Close navigation drawer</string> <string name="navigation_drawer_close" translatable="false">Close navigation drawer</string>
<string name="nav_header_desc" translatable="false">Navigation header</string> <string name="nav_header_desc" translatable="false">Navigation header</string>
<string name="comming">Comming soon!</string> <string name="comming">Coming soon!</string>
<string name="charging">Loading...</string>
<!-- End Global string --> <!-- End Global string -->
@ -35,10 +36,10 @@
<string name="registerActionBtn">Create new account</string> <string name="registerActionBtn">Create new account</string>
<!-- Toast msg --> <!-- Toast msg -->
<string name="loginSuccess_msg">You are logged</string> <string name="loginSuccess_msg">You are logged</string>
<string name="loginError_msg">An error has ocurred</string> <string name="loginError_msg">An error has occurred</string>
<string name="loginFailed_msg">Invalid credentials</string> <string name="loginFailed_msg">Invalid credentials</string>
<string name="registerSuccess_msg">You are registered</string> <string name="registerSuccess_msg">You are registered</string>
<string name="registerError_msg">An error has ocurred</string> <string name="registerError_msg">An error has occurred</string>
<string name="registerFailed_msg">Invalid data</string> <string name="registerFailed_msg">Invalid data</string>
<!-- Register msg --> <!-- Register msg -->
<string name="registerBtn">Register now</string> <string name="registerBtn">Register now</string>
@ -52,9 +53,11 @@
<string name="title_local">Local videos</string> <string name="title_local">Local videos</string>
<string name="title_myVideos">My videos</string> <string name="title_myVideos">My videos</string>
<string name="view_text">views</string> <string name="view_text">views</string>
<string name="time_text">seconds</string> <string name="timeSec_text">seconds</string>
<string name="timeMin_text">minutes</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">P2Play</string> <string name="nav_header_subtitle" translatable="false">P2Play</string>
<!-- Toast msg --> <!-- Toast msg -->
<string name="logout_msg">You are disconnected</string> <string name="logout_msg">You are disconnected</string>
<!-- End Main strings --> <!-- End Main strings -->
@ -72,6 +75,8 @@
<!-- End MiniMenu strings --> <!-- End MiniMenu strings -->
<!-- Start Reproductor strings --> <!-- Start Reproductor strings -->
<string name="descriptionTxt">Description:</string> <string name="descriptionTxt">Description:</string>
<string name="commentariesTxt">Commentaries:</string>
<string name="commentHolder">Make a commentary</string>
<!-- Actions --> <!-- Actions -->
<string name="subscribeBtn">Subscribe</string> <string name="subscribeBtn">Subscribe</string>
<string name="likeBtn">Like</string> <string name="likeBtn">Like</string>
@ -79,10 +84,14 @@
<string name="shareBtn">Share</string> <string name="shareBtn">Share</string>
<string name="reportBtn">Report</string> <string name="reportBtn">Report</string>
<string name="unSubscribeBtn">Unsubscribe</string> <string name="unSubscribeBtn">Unsubscribe</string>
<string name="commentaryText">Comment</string>
<!-- Messages --> <!-- Messages -->
<string name="subscribeMsg">You are subscribed to this channel</string> <string name="subscribeMsg">You are subscribed to this channel</string>
<string name="rateMsg">You are rated the video</string> <string name="rateMsg">You are rated the video</string>
<string name="unSubscribeMsg">You are unsubscribed to this channel</string> <string name="unSubscribeMsg">You are unsubscribed to this channel</string>
<string name="makedCommentaryMsg">You are commented this video</string>
<string name="errorCommentaryMsg">An error has occurred, try again</string>
<string name="emptyCommentaryMsg">Please make a comment first</string>
<!-- End Reproductor strings --> <!-- End Reproductor strings -->
<!-- Start Settings strings --> <!-- Start Settings strings -->
<string name="title_activity_settings">Settings</string> <string name="title_activity_settings">Settings</string>
@ -93,6 +102,7 @@
<string name="pref_hostname_title">Peertube instance</string> <string name="pref_hostname_title">Peertube instance</string>
<string name="pref_hostname_error" translatable="false">-</string> <string name="pref_hostname_error" translatable="false">-</string>
<string name="pref_message_exit">Restart app to apply changes</string> <string name="pref_message_exit">Restart app to apply changes</string>
<string name="pref_videos_count_title">Videos per page</string>
<!-- End Settings strings --> <!-- End Settings strings -->
</resources> </resources>

View File

@ -18,4 +18,12 @@
android:summary="@string/pref_nfsw_description" android:summary="@string/pref_nfsw_description"
android:title="@string/pref_nfsw_title" /> android:title="@string/pref_nfsw_title" />
<EditTextPreference
android:defaultValue="15"
android:inputType="number"
android:key="videos_count"
android:selectAllOnFocus="true"
android:singleLine="true"
android:title="@string/pref_videos_count_title" />
</PreferenceScreen> </PreferenceScreen>

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.2.51' ext.kotlin_version = '1.3.0'
repositories { repositories {
google() google()
jcenter() jcenter()
} }
dependencies { dependencies {
classpath 'com.android.tools.build:gradle:3.2.1' classpath 'com.android.tools.build:gradle:3.3.1'
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

View File

@ -1,6 +1,6 @@
#Sun Sep 30 14:50:40 CDT 2018 #Wed Jan 23 14:44:01 CST 2019
distributionBase=GRADLE_USER_HOME distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-4.6-all.zip distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.1-all.zip

View File

@ -1,19 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<module external.linked.project.id="p2play" external.linked.project.path="$MODULE_DIR$" external.root.project.path="$MODULE_DIR$" external.system.id="GRADLE" type="JAVA_MODULE" version="4">
<component name="FacetManager">
<facet type="java-gradle" name="Java-Gradle">
<configuration>
<option name="BUILD_FOLDER_PATH" value="$MODULE_DIR$/build" />
<option name="BUILDABLE" value="false" />
</configuration>
</facet>
</component>
<component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_6" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$">
<excludeFolder url="file://$MODULE_DIR$/.gradle" />
</content>
<orderEntry type="jdk" jdkName="1.8" jdkType="JavaSDK" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>

BIN
screenshots/screenshot.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 149 KiB

BIN
screenshots/screenshot2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

BIN
screenshots/screenshot3.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

BIN
screenshots/screenshot4.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

BIN
screenshots/screenshot5.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

BIN
screenshots/screenshot6.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB