diff --git a/P2Play.iml b/P2Play.iml
new file mode 100644
index 0000000..a7938e6
--- /dev/null
+++ b/P2Play.iml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/.DS_Store b/app/.DS_Store
new file mode 100644
index 0000000..c5fd63c
Binary files /dev/null and b/app/.DS_Store differ
diff --git a/app/.gitignore b/app/.gitignore
new file mode 100644
index 0000000..796b96d
--- /dev/null
+++ b/app/.gitignore
@@ -0,0 +1 @@
+/build
diff --git a/app/app.iml b/app/app.iml
new file mode 100644
index 0000000..ae00402
--- /dev/null
+++ b/app/app.iml
@@ -0,0 +1,191 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ generateDebugSources
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
new file mode 100644
index 0000000..0b05edd
--- /dev/null
+++ b/app/build.gradle
@@ -0,0 +1,36 @@
+apply plugin: 'com.android.application'
+
+apply plugin: 'kotlin-android'
+
+apply plugin: 'kotlin-android-extensions'
+
+android {
+ compileSdkVersion 27
+ defaultConfig {
+ applicationId "org.libre.agosto.p2play"
+ minSdkVersion 23
+ targetSdkVersion 27
+ versionCode 1
+ versionName "0.1"
+ testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
+ }
+ buildTypes {
+ release {
+ minifyEnabled false
+ proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
+ }
+ }
+}
+
+dependencies {
+ implementation fileTree(dir: 'libs', include: ['*.jar'])
+ implementation "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version"
+ implementation 'com.android.support:appcompat-v7:27.1.1'
+ implementation 'com.android.support.constraint:constraint-layout:1.1.2'
+ implementation 'com.android.support:support-v4:27.1.1'
+ implementation 'com.android.support:design:27.1.1'
+ implementation 'com.squareup.picasso:picasso:2.71828'
+ testImplementation 'junit:junit:4.12'
+ androidTestImplementation 'com.android.support.test:runner:1.0.2'
+ androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
+}
diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro
new file mode 100644
index 0000000..f1b4245
--- /dev/null
+++ b/app/proguard-rules.pro
@@ -0,0 +1,21 @@
+# Add project specific ProGuard rules here.
+# You can control the set of applied configuration files using the
+# proguardFiles setting in build.gradle.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file name.
+#-renamesourcefileattribute SourceFile
diff --git a/app/src/.DS_Store b/app/src/.DS_Store
new file mode 100644
index 0000000..ead2b84
Binary files /dev/null and b/app/src/.DS_Store differ
diff --git a/app/src/androidTest/java/org/libre/agosto/p2play/ExampleInstrumentedTest.kt b/app/src/androidTest/java/org/libre/agosto/p2play/ExampleInstrumentedTest.kt
new file mode 100644
index 0000000..d86c903
--- /dev/null
+++ b/app/src/androidTest/java/org/libre/agosto/p2play/ExampleInstrumentedTest.kt
@@ -0,0 +1,24 @@
+package org.libre.agosto.p2play
+
+import android.support.test.InstrumentationRegistry
+import android.support.test.runner.AndroidJUnit4
+
+import org.junit.Test
+import org.junit.runner.RunWith
+
+import org.junit.Assert.*
+
+/**
+ * Instrumented test, which will execute on an Android device.
+ *
+ * See [testing documentation](http://d.android.com/tools/testing).
+ */
+@RunWith(AndroidJUnit4::class)
+class ExampleInstrumentedTest {
+ @Test
+ fun useAppContext() {
+ // Context of the app under test.
+ val appContext = InstrumentationRegistry.getTargetContext()
+ assertEquals("org.libre.agosto.p2play", appContext.packageName)
+ }
+}
diff --git a/app/src/main/.DS_Store b/app/src/main/.DS_Store
new file mode 100644
index 0000000..5c5539d
Binary files /dev/null and b/app/src/main/.DS_Store differ
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..f2dce8f
--- /dev/null
+++ b/app/src/main/AndroidManifest.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/org/libre/agosto/p2play/Database.kt b/app/src/main/java/org/libre/agosto/p2play/Database.kt
new file mode 100644
index 0000000..d4e9ebd
--- /dev/null
+++ b/app/src/main/java/org/libre/agosto/p2play/Database.kt
@@ -0,0 +1,123 @@
+package org.libre.agosto.p2play
+
+import android.content.ContentValues
+import android.content.Context
+import android.database.sqlite.SQLiteDatabase
+import android.database.sqlite.SQLiteException
+import android.database.sqlite.SQLiteOpenHelper
+import org.libre.agosto.p2play.models.TokenModel
+import org.libre.agosto.p2play.models.UserModel
+
+class Database(context:Context): SQLiteOpenHelper(context,"p2play",null,1) {
+ val dbName = "p2play"
+
+ private val dbUsers = "CREATE TABLE users(id INTEGER PRIMARY KEY AUTOINCREMENT, uuid INTEGER, username varchar(30), " +
+ "nsfw INTEGER, email string, followers INTEGER, avatar string, status integer)"
+ private val dbTokens = "CREATE TABLE tokens(id INTEGER PRIMARY KEY AUTOINCREMENT, token STRING, status INTEGER)"
+ override fun onCreate(db: SQLiteDatabase?) {
+ db?.execSQL(dbUsers)
+ db?.execSQL(dbTokens)
+ }
+
+ override fun onUpgrade(db: SQLiteDatabase?, oldVersion: Int, newVersion: Int) {
+ db?.execSQL("DROP TABLE users")
+ db?.execSQL("DROP TABLE tokens")
+ onCreate(db)
+ }
+
+ fun newToken(token: TokenModel): Boolean {
+ val db = writableDatabase
+ this.closeTokens()
+ val newToken=ContentValues()
+ newToken.put("token", token.token)
+ newToken.put("status", token.status)
+
+ db.insert("tokens",null,newToken)
+
+ return true
+ }
+
+ fun newUser(user: UserModel): Boolean {
+ val db = writableDatabase
+ this.closeUsers()
+ val newUser=ContentValues()
+ newUser.put("uuid", user.uuid)
+ newUser.put("username", user.username)
+ newUser.put("email", user.email)
+ newUser.put("nsfw", user.nsfw)
+ newUser.put("followers", user.followers)
+ newUser.put("avatar", user.avatar)
+ newUser.put("status", user.status)
+
+ db.insert("users",null, newUser)
+
+ return true
+ }
+
+ fun getToken(): TokenModel{
+ val db = writableDatabase
+ var token = TokenModel()
+
+ try {
+ var cursor= db.rawQuery("SELECT * FROM tokens WHERE status=1 ORDER BY id DESC LIMIT 1",null)
+ cursor.moveToFirst()
+
+ token.token = cursor.getString(cursor.getColumnIndex("token")).toString()
+ token.status = cursor.getString(cursor.getColumnIndex("status")).toInt()
+
+ cursor.close()
+
+ return token
+
+ }catch (e:SQLiteException){
+ db?.execSQL(dbTokens)
+ }catch (e:Exception){
+ e.printStackTrace()
+ }
+ return token
+ }
+
+ fun getUser(): UserModel{
+ val db = writableDatabase
+ var user = UserModel()
+
+ try {
+ var cursor= db.rawQuery("SELECT * FROM users WHERE status=1 ORDER BY id DESC LIMIT 1",null)
+ cursor.moveToFirst()
+
+ user.uuid = cursor.getString(cursor.getColumnIndex("uuid")).toInt()
+ user.username = cursor.getString(cursor.getColumnIndex("username")).toString()
+ user.email = cursor.getString(cursor.getColumnIndex("email")).toString()
+ user.nsfw = cursor.getString(cursor.getColumnIndex("nsfw")).toBoolean()
+ user.followers = cursor.getString(cursor.getColumnIndex("followers")).toInt()
+ user.avatar = cursor.getString(cursor.getColumnIndex("avatar")).toString()
+ user.status = cursor.getString(cursor.getColumnIndex("status")).toInt()
+
+ cursor.close()
+
+ return user
+
+ }catch (e:SQLiteException){
+ db?.execSQL(dbTokens)
+ }catch (e:Exception){
+ e.printStackTrace()
+ }
+ return user
+ }
+
+ private fun closeTokens(){
+ val db = writableDatabase
+ db.execSQL("UPDATE tokens SET status=-1 WHERE 1")
+ }
+
+ private fun closeUsers(){
+ val db = writableDatabase
+ db.execSQL("UPDATE users SET status=-1 WHERE 1")
+ }
+
+ fun logout(){
+ closeUsers()
+ closeTokens()
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/org/libre/agosto/p2play/HostActivity.kt b/app/src/main/java/org/libre/agosto/p2play/HostActivity.kt
new file mode 100644
index 0000000..6991b29
--- /dev/null
+++ b/app/src/main/java/org/libre/agosto/p2play/HostActivity.kt
@@ -0,0 +1,89 @@
+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.Looper
+import android.preference.PreferenceManager
+import android.util.Log
+import kotlinx.android.synthetic.main.activity_host.*
+import org.libre.agosto.p2play.ajax.Client
+
+class HostActivity : AppCompatActivity() {
+ lateinit var settings: SharedPreferences
+ lateinit var editor: SharedPreferences.Editor
+ val client:Client = Client()
+ val _db = Database(this)
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContentView(R.layout.activity_host)
+ settings = this.getSharedPreferences("P2play",0)
+ editor = settings.edit()
+ ManagerSingleton.context = this
+ button.setOnClickListener { getKeys() }
+
+ val host = settings.getString("hostP2play","")
+ if(host!=""){
+ ManagerSingleton.url=host
+ checkUser()
+ startApp()
+ this.finish()
+ }
+ }
+
+ fun checkUser(){
+ val token = _db.getToken()
+ val user = _db.getUser()
+ if(token.status == 1 && user.status==1){
+ ManagerSingleton.user = user
+ ManagerSingleton.token = token
+ }
+ else{
+ _db.logout()
+ }
+ }
+
+ fun saveHost(){
+ val host = hostText.text.toString()
+ editor.putString("hostP2play",host)
+ editor.apply()
+ startApp()
+ }
+
+ fun getKeys(){
+ button.isEnabled = false
+ var host = hostText.text.toString()
+ host = host.replace("http://","")
+ host = host.replace("https://","")
+ host = host.replace("/","")
+ ManagerSingleton.url = host
+ AsyncTask.execute {
+ Looper.prepare()
+ val keys = client.getKeys()
+ if(keys.client_id!=""){
+ editor.putString("client_id",keys.client_id)
+ editor.putString("client_secret",keys.client_secret)
+ editor.apply()
+ saveHost()
+ }
+ else{
+
+ runOnUiThread {
+ ManagerSingleton.Toast(getString(R.string.errorMsg))
+ button.isEnabled = true
+ }
+ }
+ }
+ }
+
+ fun startApp(){
+ runOnUiThread {
+ ManagerSingleton.Toast(getString(R.string.finallyMsg))
+ val intent = Intent(ManagerSingleton.context,MainActivity::class.java)
+ startActivity(intent)
+ }
+ }
+}
diff --git a/app/src/main/java/org/libre/agosto/p2play/LoginActivity.kt b/app/src/main/java/org/libre/agosto/p2play/LoginActivity.kt
new file mode 100644
index 0000000..99e9096
--- /dev/null
+++ b/app/src/main/java/org/libre/agosto/p2play/LoginActivity.kt
@@ -0,0 +1,86 @@
+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.Looper
+import android.util.Log
+import kotlinx.android.synthetic.main.activity_login.*
+import org.libre.agosto.p2play.ajax.Auth
+
+class LoginActivity : AppCompatActivity() {
+ private val _auth = Auth()
+ lateinit var settings: SharedPreferences
+ lateinit var client_id: String
+ lateinit var client_secret: String
+ private lateinit var _db: Database
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContentView(R.layout.activity_login)
+ setTitle(R.string.action_login)
+ ManagerSingleton.context = this
+ _db = Database(this)
+
+ settings = this.getSharedPreferences("P2play",0)
+ client_id = settings.getString("client_id", "")
+ client_secret = settings.getString("client_secret", "")
+
+ registerActionBtn.setOnClickListener { startActivity(Intent(this, RegisterActivity::class.java)) }
+ loginBtn.setOnClickListener { tryLogin() }
+ }
+
+ fun tryLogin(){
+ loginBtn.isEnabled = false;
+ val username = userText.text.toString()
+ val password = passwordText.text.toString()
+
+ AsyncTask.execute {
+ Looper.prepare()
+ val token = _auth.login(username, password, client_id, client_secret)
+
+ Log.d("token", token.token )
+ Log.d("status", token.status.toString() )
+
+
+ when(token.status.toString()){
+ "1" -> {
+ _db.newToken(token)
+ ManagerSingleton.token = token
+ getUser()
+ }
+ "0" -> {
+ runOnUiThread {
+ ManagerSingleton.Toast(getString(R.string.loginError_msg))
+ }
+ }
+ "-1" -> {
+ runOnUiThread {
+ loginBtn.isEnabled = true
+ ManagerSingleton.Toast(getString(R.string.loginFailed_msg))
+ }
+ }
+ }
+
+ }
+ }
+
+ fun getUser(){
+ val user = _auth.me(ManagerSingleton.token.token)
+ if(user.status == 1){
+ _db.newUser(user)
+ ManagerSingleton.user = user
+ runOnUiThread {
+ ManagerSingleton.Toast(getString(R.string.loginSuccess_msg))
+ finish()
+ }
+ }
+ else{
+ runOnUiThread {
+ ManagerSingleton.Toast(getString(R.string.loginError_msg))
+ }
+ }
+ }
+}
diff --git a/app/src/main/java/org/libre/agosto/p2play/MainActivity.kt b/app/src/main/java/org/libre/agosto/p2play/MainActivity.kt
new file mode 100644
index 0000000..3350ce7
--- /dev/null
+++ b/app/src/main/java/org/libre/agosto/p2play/MainActivity.kt
@@ -0,0 +1,226 @@
+package org.libre.agosto.p2play
+
+import android.content.Intent
+import android.os.AsyncTask
+import android.os.Bundle
+import android.support.design.widget.Snackbar
+import android.support.design.widget.NavigationView
+import android.support.v4.view.GravityCompat
+import android.support.v7.app.ActionBarDrawerToggle
+import android.support.v7.app.AppCompatActivity
+import android.support.v7.widget.LinearLayoutManager
+import android.support.v7.widget.RecyclerView
+import android.view.Menu
+import android.view.MenuInflater
+import android.view.MenuItem
+import android.widget.ImageView
+import com.squareup.picasso.Picasso
+import kotlinx.android.synthetic.main.activity_main.*
+import kotlinx.android.synthetic.main.app_bar_main.*
+import kotlinx.android.synthetic.main.nav_header_main.*
+import org.libre.agosto.p2play.adapters.VideosAdapter
+import org.libre.agosto.p2play.ajax.Videos
+import org.libre.agosto.p2play.models.VideoModel
+
+class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelectedListener {
+ private lateinit var recyclerView: RecyclerView
+ private lateinit var viewAdapter: RecyclerView.Adapter<*>
+ private lateinit var viewManager: RecyclerView.LayoutManager
+ val client: Videos = Videos()
+ private lateinit var lastItem: MenuItem
+ lateinit var myMenu: Menu
+ val _db = Database(this)
+
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContentView(R.layout.activity_main)
+ setSupportActionBar(toolbar)
+
+ /* fab.setOnClickListener { view ->
+ Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
+ .setAction("Action", null).show()
+ } */
+
+ val toggle = ActionBarDrawerToggle(
+ this, drawer_layout, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close)
+ drawer_layout.addDrawerListener(toggle)
+ toggle.syncState()
+
+ ManagerSingleton.context = this
+
+ nav_view.setNavigationItemSelectedListener(this)
+ viewManager = LinearLayoutManager(this)
+
+ // val data = arrayOf("test","test2","test3","test4")
+ // viewAdapter = VideosAdapter(data)
+
+ this.setData(arrayListOf())
+
+ this.getLastVideos()
+ }
+
+ fun setData(data:ArrayList){
+ viewAdapter = VideosAdapter(data)
+
+ recyclerView = findViewById(R.id.list).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
+
+ }
+
+ }
+
+ fun getLastVideos(){
+ setTitle(R.string.title_recent)
+ AsyncTask.execute {
+ val videos = client.getLastVideos()
+ runOnUiThread {
+ this.setData(videos)
+ }
+ }
+ }
+
+ fun getPopularVideos(){
+ setTitle(R.string.title_popular)
+ AsyncTask.execute {
+ val videos = client.getPopularVideos()
+ runOnUiThread {
+ this.setData(videos)
+ }
+ }
+ }
+
+ fun getLocalVideos(){
+ setTitle(R.string.title_local)
+ AsyncTask.execute {
+ val videos = client.getLocalVideos()
+ runOnUiThread {
+ this.setData(videos)
+ }
+ }
+ }
+
+ fun getMyVideos(){
+ setTitle(R.string.title_myVideos)
+ AsyncTask.execute {
+ val videos = client.myVideos(ManagerSingleton.token.token)
+ runOnUiThread {
+ this.setData(videos)
+ }
+ }
+ }
+
+ override fun onBackPressed() {
+ if (drawer_layout.isDrawerOpen(GravityCompat.START)) {
+ drawer_layout.closeDrawer(GravityCompat.START)
+ } else {
+ super.onBackPressed()
+ }
+ }
+
+ override fun onCreateOptionsMenu(menu: Menu): Boolean {
+ // Inflate the menu; this adds items to the action bar if it is present.
+ menuInflater.inflate(R.menu.main, menu)
+ myMenu = menu
+ setSideData()
+ return true
+ }
+
+ override fun onPrepareOptionsMenu(menu: Menu?): Boolean {
+ myMenu = menu!!
+
+ return super.onPrepareOptionsMenu(menu)
+ }
+
+ override fun onOptionsItemSelected(item: MenuItem): Boolean {
+ // Handle action bar item clicks here. The action bar will
+ // automatically handle clicks on the Home/Up button, so long
+ // as you specify a parent activity in AndroidManifest.xml.
+ when (item.itemId) {
+ R.id.action_settings -> return true
+ R.id.action_login -> {
+ val intent = Intent(this, LoginActivity::class.java)
+ startActivity(intent)
+ return true
+ }
+ R.id.action_logout -> {
+ logout()
+ return true
+ }
+ else -> return super.onOptionsItemSelected(item)
+ }
+ }
+
+ override fun onNavigationItemSelected(item: MenuItem): Boolean {
+ // Handle navigation view item clicks here.
+
+ // if(::lastItem.isInitialized){
+ // lastItem.isChecked = false
+ // }
+ lastItem = item
+ // item.isChecked = true
+ when (item.itemId) {
+ R.id.nav_popular-> {
+ getPopularVideos()
+ }
+ R.id.nav_recent-> {
+ getLastVideos()
+ }
+ R.id.nav_local-> {
+ getLocalVideos()
+ }
+ }
+
+ drawer_layout.closeDrawer(GravityCompat.START)
+ return true
+ }
+
+ override fun onResume() {
+ super.onResume()
+ ManagerSingleton.context = this
+ setSideData()
+ }
+
+ private fun setSideData(){
+ if(ManagerSingleton.user.status == 1){
+ side_usernameTxt?.text = ManagerSingleton.user.username
+ side_emailTxt?.text = ManagerSingleton.user.email
+ if(ManagerSingleton.user.avatar!="" && side_imageView != null)
+ Picasso.get().load("https://"+ManagerSingleton.url+ManagerSingleton.user.avatar).into(side_imageView)
+ side_imageView?.setOnClickListener {
+ getMyVideos()
+ drawer_layout.closeDrawer(GravityCompat.START)
+ }
+ if(::myMenu.isInitialized){
+ myMenu.findItem(R.id.action_login).isVisible = false
+ myMenu.findItem(R.id.action_logout).isVisible = true
+ }
+ }
+ }
+
+ fun logout(){
+ if(::myMenu.isInitialized){
+ myMenu.findItem(R.id.action_login).isVisible = true
+ myMenu.findItem(R.id.action_logout).isVisible = false
+ }
+ side_usernameTxt?.text = getString(R.string.nav_header_title)
+ side_emailTxt?.text = getString(R.string.nav_header_subtitle)
+ side_imageView?.setImageResource(R.mipmap.ic_launcher_round)
+ side_imageView?.setOnClickListener { }
+ _db.logout()
+ ManagerSingleton.logout()
+
+ ManagerSingleton.Toast(getString(R.string.logout_msg))
+
+ }
+
+
+}
diff --git a/app/src/main/java/org/libre/agosto/p2play/ManagerSingleton.kt b/app/src/main/java/org/libre/agosto/p2play/ManagerSingleton.kt
new file mode 100644
index 0000000..65b9e60
--- /dev/null
+++ b/app/src/main/java/org/libre/agosto/p2play/ManagerSingleton.kt
@@ -0,0 +1,23 @@
+package org.libre.agosto.p2play
+
+import android.content.Context
+import org.libre.agosto.p2play.models.TokenModel
+import org.libre.agosto.p2play.models.UserModel
+
+object ManagerSingleton {
+ var context: Context?= null
+ var url: String?= null
+ var user: UserModel = UserModel()
+ var token: TokenModel = TokenModel()
+ // var keys:
+
+ fun Toast(text: String?) {
+ if(this.context == null) { return }
+ android.widget.Toast.makeText(this.context, text, android.widget.Toast.LENGTH_SHORT).show()
+ }
+
+ fun logout(){
+ user = UserModel()
+ token = TokenModel()
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/org/libre/agosto/p2play/RegisterActivity.kt b/app/src/main/java/org/libre/agosto/p2play/RegisterActivity.kt
new file mode 100644
index 0000000..a59b630
--- /dev/null
+++ b/app/src/main/java/org/libre/agosto/p2play/RegisterActivity.kt
@@ -0,0 +1,12 @@
+package org.libre.agosto.p2play
+
+import android.support.v7.app.AppCompatActivity
+import android.os.Bundle
+
+class RegisterActivity : AppCompatActivity() {
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContentView(R.layout.activity_register)
+ }
+}
diff --git a/app/src/main/java/org/libre/agosto/p2play/ReproductorActivity.kt b/app/src/main/java/org/libre/agosto/p2play/ReproductorActivity.kt
new file mode 100644
index 0000000..d24265d
--- /dev/null
+++ b/app/src/main/java/org/libre/agosto/p2play/ReproductorActivity.kt
@@ -0,0 +1,39 @@
+package org.libre.agosto.p2play
+
+import android.support.v7.app.AppCompatActivity
+import android.os.Bundle
+import android.util.Log
+import com.squareup.picasso.Picasso
+import kotlinx.android.synthetic.main.activity_reproductor.*
+import org.libre.agosto.p2play.models.VideoModel
+
+class ReproductorActivity : AppCompatActivity() {
+ lateinit var video:VideoModel
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContentView(R.layout.activity_reproductor)
+ ManagerSingleton.context = this
+
+ videoView.settings.javaScriptEnabled = true
+ videoView.settings.allowContentAccess = true
+ try {
+ this.video = this.intent.extras.getSerializable("video") as VideoModel
+ tittleVideoTxt.text = this.video.name
+ viewsTxt.text = this.video.views.toString() + getString(R.string.view_text)
+ userTxt.text = this.video.username
+ descriptionVideoTxt.text = this.video.description
+
+ if(this.video.userImageUrl!="")
+ Picasso.get().load("https://"+ManagerSingleton.url+this.video.userImageUrl).into(userImg)
+ videoView.loadUrl("https://"+ManagerSingleton.url+this.video.embedUrl)
+ Log.d("url", videoView.url)
+ }
+ catch (err:Exception){
+ err.printStackTrace()
+ Log.d("Error", err?.message)
+ }
+
+ subscribeBtn.setOnClickListener { ManagerSingleton.Toast(getString(R.string.comming)) }
+ }
+}
diff --git a/app/src/main/java/org/libre/agosto/p2play/adapters/VideosAdapter.kt b/app/src/main/java/org/libre/agosto/p2play/adapters/VideosAdapter.kt
new file mode 100644
index 0000000..a5bae25
--- /dev/null
+++ b/app/src/main/java/org/libre/agosto/p2play/adapters/VideosAdapter.kt
@@ -0,0 +1,79 @@
+package org.libre.agosto.p2play.adapters
+
+import android.app.Activity
+import android.content.Intent
+import android.graphics.drawable.Drawable
+import android.os.AsyncTask
+import android.support.v7.widget.RecyclerView
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.ImageView
+import android.widget.LinearLayout
+import android.widget.TextView
+import com.squareup.picasso.Picasso
+import org.libre.agosto.p2play.MainActivity
+import org.libre.agosto.p2play.ManagerSingleton
+import org.libre.agosto.p2play.R
+import org.libre.agosto.p2play.ReproductorActivity
+import org.libre.agosto.p2play.models.VideoModel
+import java.io.InputStream
+import java.io.Serializable
+import java.net.URL
+
+class VideosAdapter(private val myDataset: ArrayList) :
+ RecyclerView.Adapter() {
+
+ // Provide a reference to the views for each data item
+ // Complex data items may need more than one view per item, and
+ // you provide access to all the views for a data item in a view holder.
+ // Each data item is just a string in this case that is shown in a TextView.
+ class ViewHolder(val view: View) : RecyclerView.ViewHolder(view){
+ val thumb: ImageView
+ val userImg: ImageView
+ val tittle: TextView
+ val description: TextView
+
+ init {
+ // Define click listener for the ViewHolder's View
+ tittle = view.findViewById(R.id.tittleTxt)
+ description = view.findViewById(R.id.descriptionTxt)
+ thumb = view.findViewById(R.id.thumb)
+ userImg = view.findViewById(R.id.userImg)
+ }
+ }
+
+
+ // Create new views (invoked by the layout manager)
+ override fun onCreateViewHolder(parent: ViewGroup,
+ viewType: Int): VideosAdapter.ViewHolder {
+ // create a new view
+ val view = LayoutInflater.from(parent.context)
+ .inflate(R.layout.view_video, 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.tittle.text = myDataset[position].name
+ Picasso.get().load("https://"+ManagerSingleton.url+myDataset[position].thumbUrl).into(holder.thumb)
+ holder.thumb.setOnClickListener {
+ val intent = Intent(ManagerSingleton.context, ReproductorActivity::class.java)
+ intent.putExtra("video", myDataset[position] as Serializable)
+ ManagerSingleton.context!!.startActivity(intent)
+ }
+ if(myDataset[position].userImageUrl!="")
+ Picasso.get().load("https://"+ManagerSingleton.url+myDataset[position].userImageUrl).into(holder.userImg);
+
+ val viewsText = ManagerSingleton.context!!.getString(R.string.view_text)
+ val timeText = ManagerSingleton.context!!.getString(R.string.time_text)
+ holder.description.text = myDataset[position].username+" - "+myDataset[position].views+" "+viewsText+" - "+myDataset[position].duration+" "+timeText
+
+ }
+
+ // Return the size of your dataset (invoked by the layout manager)
+ override fun getItemCount() = myDataset.size
+}
\ No newline at end of file
diff --git a/app/src/main/java/org/libre/agosto/p2play/ajax/Auth.kt b/app/src/main/java/org/libre/agosto/p2play/ajax/Auth.kt
new file mode 100644
index 0000000..c683052
--- /dev/null
+++ b/app/src/main/java/org/libre/agosto/p2play/ajax/Auth.kt
@@ -0,0 +1,112 @@
+package org.libre.agosto.p2play.ajax
+
+import android.support.design.widget.Snackbar
+import android.util.JsonReader
+import android.util.Log
+import org.libre.agosto.p2play.ManagerSingleton
+import org.libre.agosto.p2play.models.TokenModel
+import org.libre.agosto.p2play.models.UserModel
+import java.io.InputStreamReader
+
+class Auth: Client() {
+ val stockParams = "grant_type=password"
+
+ fun login(username: String, password: String, client_id: String, client_secret: String): TokenModel{
+ var con = this._newCon("users/token","POST")
+ val params:String= "$stockParams&username=$username&password=$password&client_id=$client_id&client_secret=$client_secret"
+ con.outputStream.write(params.toByteArray())
+ var token = TokenModel()
+
+ try {
+
+ if(con.responseCode==200){
+ var response = InputStreamReader(con.inputStream)
+ var data = JsonReader(response)
+ data.beginObject()
+
+ while(data.hasNext()){
+ val k = data.nextName()
+ when(k.toString()){
+ "access_token" -> token.token = "Bearer " + data.nextString()
+ else -> data.skipValue()
+ }
+ }
+
+ data.endObject()
+ token.status = 1
+
+ }
+ else{
+ Log.d("Status", con.responseMessage)
+ }
+ }
+ catch (err: Exception){
+ err.printStackTrace()
+ token.status = 0
+ }
+
+ return token
+ }
+
+ fun me(token: String): UserModel{
+ var con = this._newCon("users/me","GET", token)
+
+ var user = UserModel()
+
+ try {
+
+ if(con.responseCode==200){
+ var response = InputStreamReader(con.inputStream)
+ var data = JsonReader(response)
+ data.beginObject()
+
+ while(data.hasNext()){
+ val k = data.nextName()
+ when(k.toString()){
+ "id" -> user.uuid = data.nextInt()
+ "username" -> user.username = data.nextString()
+ "email" -> user.email = data.nextString()
+ "displayNSFW" -> user.nsfw = data.nextBoolean()
+ "account" -> {
+ data.beginObject()
+ while (data.hasNext()){
+ val l = data.nextName()
+ when(l.toString()){
+ "followersCount" -> user.followers = data.nextInt()
+ "avatar" -> {
+ data.beginObject()
+ while (data.hasNext()){
+ val m = data.nextName()
+ when (m.toString()){
+ "path" -> user.avatar = data.nextString()
+ else -> data.skipValue()
+ }
+ }
+ data.endObject()
+ }
+ else -> data.skipValue()
+ }
+ }
+ data.endObject()
+ }
+ else -> data.skipValue()
+ }
+ }
+
+ data.endObject()
+ user.status = 1
+
+ }
+ else{
+ Log.d("Status", con.responseMessage)
+ }
+ }
+ catch (err: Exception){
+ err.printStackTrace()
+ user.status = 0
+ }
+
+ return user
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/org/libre/agosto/p2play/ajax/Client.kt b/app/src/main/java/org/libre/agosto/p2play/ajax/Client.kt
new file mode 100644
index 0000000..815b059
--- /dev/null
+++ b/app/src/main/java/org/libre/agosto/p2play/ajax/Client.kt
@@ -0,0 +1,69 @@
+package org.libre.agosto.p2play.ajax
+
+import android.content.SharedPreferences
+import android.util.JsonReader
+import android.util.Log
+import org.libre.agosto.p2play.ManagerSingleton
+import org.libre.agosto.p2play.models.HostModel
+import java.io.InputStreamReader
+import java.net.HttpURLConnection
+import java.net.URL
+
+open class Client {
+
+
+ protected fun _newCon(uri: String, method: String, token: String = ""): HttpURLConnection {
+ var url = URL("https://"+ManagerSingleton.url+"/api/v1/"+uri)
+ var con = url.openConnection() as HttpURLConnection
+
+ con.setRequestProperty("User-Agent", "P2play/0.0.1")
+ con.setRequestProperty("Content-Type", "application/x-www-form-urlencoded")
+ con.setRequestProperty("Accept", "*/*")
+
+ if(token != ""){
+ con.setRequestProperty("Authorization", token)
+ }
+
+ con.requestMethod=method
+ con.connectTimeout=10000
+ con.readTimeout=10000
+
+ if(method.equals("POST"))
+ con.doOutput=true
+
+ return con
+ }
+
+ fun getKeys():HostModel{
+ var con=this._newCon("oauth-clients/local","GET")
+ var keys = HostModel("","")
+ try {
+ if (con.responseCode == 200) {
+ var response = InputStreamReader(con.inputStream)
+ var data = JsonReader(response)
+ data.beginObject()
+ while (data.hasNext()) {
+ val key = data.nextName()
+ when (key.toString()) {
+ "client_id"->{
+ keys.client_id = data.nextString()
+ }
+ "client_secret"->{
+ keys.client_secret = data.nextString()
+ }
+ else->{
+ data.skipValue()
+ }
+ }
+ }
+ }
+ Log.d("Key",keys.client_id)
+ return keys
+ } catch(err:Exception){
+ Log.d("Error",err.message)
+ return keys
+ }
+ }
+
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/org/libre/agosto/p2play/ajax/Videos.kt b/app/src/main/java/org/libre/agosto/p2play/ajax/Videos.kt
new file mode 100644
index 0000000..4f1865d
--- /dev/null
+++ b/app/src/main/java/org/libre/agosto/p2play/ajax/Videos.kt
@@ -0,0 +1,136 @@
+package org.libre.agosto.p2play.ajax
+
+import android.util.JsonReader
+import android.util.JsonToken
+import android.util.Log
+import org.libre.agosto.p2play.models.VideoModel
+import java.io.InputStreamReader
+
+class Videos: Client() {
+
+ fun parseVideos(data: JsonReader): ArrayList{
+ var videos = arrayListOf()
+ data.beginObject()
+ while (data.hasNext()){
+ when(data.nextName()){
+ "data"->{
+ data.beginArray()
+ while (data.hasNext()) {
+ val video = VideoModel()
+ data.beginObject()
+ while (data.hasNext()){
+ val key = data.nextName()
+ when (key.toString()) {
+ "name"->{
+ video.name= data.nextString()
+ }
+ "description"->{
+ if(data.peek() == JsonToken.STRING)
+ video.description = data.nextString()
+ else
+ data.skipValue()
+ }
+ "duration"->{
+ video.duration = data.nextInt()
+ }
+ "thumbnailPath"->{
+ video.thumbUrl = data.nextString()
+ }
+ "embedPath"->{
+ video.embedUrl = data.nextString()
+ }
+ "views"->{
+ video.views = data.nextInt()
+ }
+ "account"->{
+ data.beginObject()
+ while (data.hasNext()){
+ val acKey = data.nextName()
+ when(acKey.toString()){
+ "name"->video.username=data.nextString()
+ "avatar"->{
+ if(data.peek() == JsonToken.BEGIN_OBJECT){
+ data.beginObject()
+ while (data.hasNext()){
+ val avKey = data.nextName()
+ when(avKey){
+ "path"-> video.userImageUrl = data.nextString()
+ else-> data.skipValue()
+ }
+ }
+ data.endObject()
+ }
+ else
+ data.skipValue()
+
+ }
+ else-> data.skipValue()
+ }
+ }
+ data.endObject()
+ }
+ else->{
+ data.skipValue()
+ }
+ }
+ }
+ data.endObject()
+ videos.add(video)
+ }
+ data.endArray()
+ }
+ else-> data.skipValue()
+ }
+ }
+ data.endObject()
+
+ return videos
+ }
+
+ private fun getVideos(page:Int = 0, sort:String = "-publishedAt", filter:String = ""):ArrayList{
+ val params = "start=$page&sort=$sort&filter=$filter"
+ var con=this._newCon("videos?$params","GET")
+ var videos = arrayListOf()
+ try {
+ if (con.responseCode == 200) {
+ var response = InputStreamReader(con.inputStream)
+ var data = JsonReader(response)
+ videos = parseVideos(data)
+ }
+ } catch(err:Exception){
+ err?.printStackTrace()
+ Log.d("TypeErr",err?.message ,err.cause)
+ Log.d("Error","fallo la coneccion")
+ }
+ return videos
+ }
+
+ fun getLastVideos(): ArrayList{
+ return this.getVideos()
+ }
+
+ fun getPopularVideos(): ArrayList{
+ return this.getVideos(0,"-views")
+ }
+
+ fun getLocalVideos(): ArrayList{
+ return this.getVideos(0,"-publishedAt", "local")
+ }
+
+ fun myVideos(token: String): ArrayList{
+ var con=this._newCon("users/me/videos","GET", token)
+ var videos = arrayListOf()
+ try {
+ if (con.responseCode == 200) {
+ var response = InputStreamReader(con.inputStream)
+ var data = JsonReader(response)
+ videos = parseVideos(data)
+ }
+ } catch(err:Exception){
+ err?.printStackTrace()
+ Log.d("TypeErr",err?.message ,err.cause)
+ Log.d("Error","fallo la coneccion")
+ }
+ return videos
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/org/libre/agosto/p2play/models/HostModel.kt b/app/src/main/java/org/libre/agosto/p2play/models/HostModel.kt
new file mode 100644
index 0000000..34dbe7f
--- /dev/null
+++ b/app/src/main/java/org/libre/agosto/p2play/models/HostModel.kt
@@ -0,0 +1,3 @@
+package org.libre.agosto.p2play.models
+
+class HostModel (var client_id:String, var client_secret:String)
\ No newline at end of file
diff --git a/app/src/main/java/org/libre/agosto/p2play/models/TokenModel.kt b/app/src/main/java/org/libre/agosto/p2play/models/TokenModel.kt
new file mode 100644
index 0000000..dfe5dbc
--- /dev/null
+++ b/app/src/main/java/org/libre/agosto/p2play/models/TokenModel.kt
@@ -0,0 +1,6 @@
+package org.libre.agosto.p2play.models
+
+class TokenModel (
+ var token: String = "",
+ var status: Int = -1
+)
\ No newline at end of file
diff --git a/app/src/main/java/org/libre/agosto/p2play/models/UserModel.kt b/app/src/main/java/org/libre/agosto/p2play/models/UserModel.kt
new file mode 100644
index 0000000..fee5715
--- /dev/null
+++ b/app/src/main/java/org/libre/agosto/p2play/models/UserModel.kt
@@ -0,0 +1,12 @@
+package org.libre.agosto.p2play.models
+
+class UserModel (
+ var id: Int = 0,
+ var uuid: Int = 0,
+ var username: String = "",
+ var email: String = "",
+ var nsfw: Boolean = true,
+ var followers: Int = 0,
+ var avatar: String = "",
+ var status: Int = -1
+)
\ No newline at end of file
diff --git a/app/src/main/java/org/libre/agosto/p2play/models/VideoModel.kt b/app/src/main/java/org/libre/agosto/p2play/models/VideoModel.kt
new file mode 100644
index 0000000..0513e56
--- /dev/null
+++ b/app/src/main/java/org/libre/agosto/p2play/models/VideoModel.kt
@@ -0,0 +1,14 @@
+package org.libre.agosto.p2play.models
+
+import java.io.Serializable
+
+class VideoModel(
+ var name:String="",
+ var description:String="",
+ var thumbUrl:String="",
+ var userImageUrl:String="",
+ var embedUrl:String="",
+ var duration:Number=0,
+ var username:String="",
+ var views:Number=0
+ ):Serializable
\ No newline at end of file
diff --git a/app/src/main/res/.DS_Store b/app/src/main/res/.DS_Store
new file mode 100644
index 0000000..46d685e
Binary files /dev/null and b/app/src/main/res/.DS_Store differ
diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml
new file mode 100644
index 0000000..c7bd21d
--- /dev/null
+++ b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/.DS_Store b/app/src/main/res/drawable/.DS_Store
new file mode 100644
index 0000000..858eb4a
Binary files /dev/null and b/app/src/main/res/drawable/.DS_Store differ
diff --git a/app/src/main/res/drawable/default_avatar.png b/app/src/main/res/drawable/default_avatar.png
new file mode 100644
index 0000000..4b7fd2c
Binary files /dev/null and b/app/src/main/res/drawable/default_avatar.png differ
diff --git a/app/src/main/res/drawable/ic_add_circle_black_24dp.xml b/app/src/main/res/drawable/ic_add_circle_black_24dp.xml
new file mode 100644
index 0000000..db4e035
--- /dev/null
+++ b/app/src/main/res/drawable/ic_add_circle_black_24dp.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_home_black_24dp.xml b/app/src/main/res/drawable/ic_home_black_24dp.xml
new file mode 100644
index 0000000..70fb291
--- /dev/null
+++ b/app/src/main/res/drawable/ic_home_black_24dp.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml
new file mode 100644
index 0000000..d5fccc5
--- /dev/null
+++ b/app/src/main/res/drawable/ic_launcher_background.xml
@@ -0,0 +1,170 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_menu_camera.xml b/app/src/main/res/drawable/ic_menu_camera.xml
new file mode 100644
index 0000000..0d9ea10
--- /dev/null
+++ b/app/src/main/res/drawable/ic_menu_camera.xml
@@ -0,0 +1,12 @@
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_menu_gallery.xml b/app/src/main/res/drawable/ic_menu_gallery.xml
new file mode 100644
index 0000000..f6872c4
--- /dev/null
+++ b/app/src/main/res/drawable/ic_menu_gallery.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_menu_manage.xml b/app/src/main/res/drawable/ic_menu_manage.xml
new file mode 100644
index 0000000..c1be60b
--- /dev/null
+++ b/app/src/main/res/drawable/ic_menu_manage.xml
@@ -0,0 +1,9 @@
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ic_menu_send.xml b/app/src/main/res/drawable/ic_menu_send.xml
new file mode 100644
index 0000000..00c668c
--- /dev/null
+++ b/app/src/main/res/drawable/ic_menu_send.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_menu_share.xml b/app/src/main/res/drawable/ic_menu_share.xml
new file mode 100644
index 0000000..a28fb9e
--- /dev/null
+++ b/app/src/main/res/drawable/ic_menu_share.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_menu_slideshow.xml b/app/src/main/res/drawable/ic_menu_slideshow.xml
new file mode 100644
index 0000000..209aa64
--- /dev/null
+++ b/app/src/main/res/drawable/ic_menu_slideshow.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/drawable/icon.png b/app/src/main/res/drawable/icon.png
new file mode 100644
index 0000000..7354a5f
Binary files /dev/null and b/app/src/main/res/drawable/icon.png differ
diff --git a/app/src/main/res/drawable/side_nav_bar.xml b/app/src/main/res/drawable/side_nav_bar.xml
new file mode 100644
index 0000000..6d81870
--- /dev/null
+++ b/app/src/main/res/drawable/side_nav_bar.xml
@@ -0,0 +1,9 @@
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_host.xml b/app/src/main/res/layout/activity_host.xml
new file mode 100644
index 0000000..2049a50
--- /dev/null
+++ b/app/src/main/res/layout/activity_host.xml
@@ -0,0 +1,65 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml
new file mode 100644
index 0000000..417720e
--- /dev/null
+++ b/app/src/main/res/layout/activity_login.xml
@@ -0,0 +1,98 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
new file mode 100644
index 0000000..a61d8a6
--- /dev/null
+++ b/app/src/main/res/layout/activity_main.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/activity_register.xml b/app/src/main/res/layout/activity_register.xml
new file mode 100644
index 0000000..f01cc03
--- /dev/null
+++ b/app/src/main/res/layout/activity_register.xml
@@ -0,0 +1,101 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_reproductor.xml b/app/src/main/res/layout/activity_reproductor.xml
new file mode 100644
index 0000000..27ce80c
--- /dev/null
+++ b/app/src/main/res/layout/activity_reproductor.xml
@@ -0,0 +1,140 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/app_bar_main.xml b/app/src/main/res/layout/app_bar_main.xml
new file mode 100644
index 0000000..8b0cb7d
--- /dev/null
+++ b/app/src/main/res/layout/app_bar_main.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/content_main.xml b/app/src/main/res/layout/content_main.xml
new file mode 100644
index 0000000..fe4584d
--- /dev/null
+++ b/app/src/main/res/layout/content_main.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/nav_header_main.xml b/app/src/main/res/layout/nav_header_main.xml
new file mode 100644
index 0000000..53afe9d
--- /dev/null
+++ b/app/src/main/res/layout/nav_header_main.xml
@@ -0,0 +1,37 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/view_video.xml b/app/src/main/res/layout/view_video.xml
new file mode 100644
index 0000000..4b94f1c
--- /dev/null
+++ b/app/src/main/res/layout/view_video.xml
@@ -0,0 +1,63 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/menu/activity_main_drawer.xml b/app/src/main/res/menu/activity_main_drawer.xml
new file mode 100644
index 0000000..c840cca
--- /dev/null
+++ b/app/src/main/res/menu/activity_main_drawer.xml
@@ -0,0 +1,32 @@
+
+
diff --git a/app/src/main/res/menu/main.xml b/app/src/main/res/menu/main.xml
new file mode 100644
index 0000000..0b85ce3
--- /dev/null
+++ b/app/src/main/res/menu/main.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
new file mode 100644
index 0000000..eca70cf
--- /dev/null
+++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
new file mode 100644
index 0000000..eca70cf
--- /dev/null
+++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/mipmap-hdpi/.DS_Store b/app/src/main/res/mipmap-hdpi/.DS_Store
new file mode 100644
index 0000000..e4053f7
Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/.DS_Store differ
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.png b/app/src/main/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000..a2f5908
Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/app/src/main/res/mipmap-hdpi/ic_launcher_round.png
new file mode 100644
index 0000000..1b52399
Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher_round.png differ
diff --git a/app/src/main/res/mipmap-hdpi/ic_p2play.png b/app/src/main/res/mipmap-hdpi/ic_p2play.png
new file mode 100644
index 0000000..ff55963
Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_p2play.png differ
diff --git a/app/src/main/res/mipmap-mdpi/.DS_Store b/app/src/main/res/mipmap-mdpi/.DS_Store
new file mode 100644
index 0000000..5499d61
Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/.DS_Store differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.png b/app/src/main/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000..ff10afd
Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/app/src/main/res/mipmap-mdpi/ic_launcher_round.png
new file mode 100644
index 0000000..115a4c7
Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher_round.png differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_p2play.png b/app/src/main/res/mipmap-mdpi/ic_p2play.png
new file mode 100644
index 0000000..0c635be
Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_p2play.png differ
diff --git a/app/src/main/res/mipmap-xhdpi/.DS_Store b/app/src/main/res/mipmap-xhdpi/.DS_Store
new file mode 100644
index 0000000..b4ce1e3
Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/.DS_Store differ
diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/app/src/main/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000..dcd3cd8
Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png
new file mode 100644
index 0000000..459ca60
Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png differ
diff --git a/app/src/main/res/mipmap-xhdpi/ic_p2play.png b/app/src/main/res/mipmap-xhdpi/ic_p2play.png
new file mode 100644
index 0000000..7354a5f
Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_p2play.png differ
diff --git a/app/src/main/res/mipmap-xxhdpi/.DS_Store b/app/src/main/res/mipmap-xxhdpi/.DS_Store
new file mode 100644
index 0000000..eaabee6
Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/.DS_Store differ
diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000..8ca12fe
Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
new file mode 100644
index 0000000..8e19b41
Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png differ
diff --git a/app/src/main/res/mipmap-xxhdpi/ic_p2play.png b/app/src/main/res/mipmap-xxhdpi/ic_p2play.png
new file mode 100644
index 0000000..f3ba9ff
Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_p2play.png differ
diff --git a/app/src/main/res/mipmap-xxxhdpi/.DS_Store b/app/src/main/res/mipmap-xxxhdpi/.DS_Store
new file mode 100644
index 0000000..0c6ec25
Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/.DS_Store differ
diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000..b824ebd
Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
new file mode 100644
index 0000000..4c19a13
Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png differ
diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_p2play.png b/app/src/main/res/mipmap-xxxhdpi/ic_p2play.png
new file mode 100644
index 0000000..393fb10
Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_p2play.png differ
diff --git a/app/src/main/res/values-es/hostActivity.xml b/app/src/main/res/values-es/hostActivity.xml
new file mode 100644
index 0000000..692bd52
--- /dev/null
+++ b/app/src/main/res/values-es/hostActivity.xml
@@ -0,0 +1,5 @@
+
+
+ Selecciona la instancia que prefieras
+ Aceptar
+
\ No newline at end of file
diff --git a/app/src/main/res/values-es/loginActivity.xml b/app/src/main/res/values-es/loginActivity.xml
new file mode 100644
index 0000000..667e269
--- /dev/null
+++ b/app/src/main/res/values-es/loginActivity.xml
@@ -0,0 +1,18 @@
+
+
+ Acceder o crear una cuenta nueva
+ Usuario:
+
+ ContraseƱa:
+
+ Ingresar
+ Crear una cuenta
+ Correo:
+ user@mail.com
+ Registrar ahora
+
+
+ Te has identificado
+ Ha ocurrido un error
+ Credenciales invalidas
+
\ No newline at end of file
diff --git a/app/src/main/res/values-es/mainActivity.xml b/app/src/main/res/values-es/mainActivity.xml
new file mode 100644
index 0000000..23ee7ba
--- /dev/null
+++ b/app/src/main/res/values-es/mainActivity.xml
@@ -0,0 +1,14 @@
+
+
+ Recientes
+ Populares
+ Locales
+ Mis videos
+ vistas
+ segundos
+ Inicia session
+ P2Play (alfa)
+
+
+ Te has desconectado
+
\ No newline at end of file
diff --git a/app/src/main/res/values-es/menu.xml b/app/src/main/res/values-es/menu.xml
new file mode 100644
index 0000000..4958477
--- /dev/null
+++ b/app/src/main/res/values-es/menu.xml
@@ -0,0 +1,7 @@
+
+
+ Populares
+ Recientes
+ Local
+ Sobre
+
\ No newline at end of file
diff --git a/app/src/main/res/values-es/miniMenu.xml b/app/src/main/res/values-es/miniMenu.xml
new file mode 100644
index 0000000..cc4009b
--- /dev/null
+++ b/app/src/main/res/values-es/miniMenu.xml
@@ -0,0 +1,6 @@
+
+
+ Configuracion
+ Acceder
+ Cerrar sesion
+
\ No newline at end of file
diff --git a/app/src/main/res/values-es/reproductorActivity.xml b/app/src/main/res/values-es/reproductorActivity.xml
new file mode 100644
index 0000000..0804759
--- /dev/null
+++ b/app/src/main/res/values-es/reproductorActivity.xml
@@ -0,0 +1,9 @@
+
+
+ Descripcion:
+ Like
+ Dislike
+ Compartir
+ Reportar
+ Subscribir
+
\ No newline at end of file
diff --git a/app/src/main/res/values-v21/styles.xml b/app/src/main/res/values-v21/styles.xml
new file mode 100644
index 0000000..bdd232b
--- /dev/null
+++ b/app/src/main/res/values-v21/styles.xml
@@ -0,0 +1,9 @@
+
+
+
+
diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml
new file mode 100644
index 0000000..40f2136
--- /dev/null
+++ b/app/src/main/res/values/colors.xml
@@ -0,0 +1,10 @@
+
+
+ #3F51B5
+ #303F9F
+ #FF4081
+ #ffffff
+ #fff
+ #000
+ #000
+
diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml
new file mode 100644
index 0000000..4ab4520
--- /dev/null
+++ b/app/src/main/res/values/dimens.xml
@@ -0,0 +1,8 @@
+
+
+ 16dp
+ 16dp
+ 8dp
+ 176dp
+ 16dp
+
\ No newline at end of file
diff --git a/app/src/main/res/values/hostActivity.xml b/app/src/main/res/values/hostActivity.xml
new file mode 100644
index 0000000..2bb33e2
--- /dev/null
+++ b/app/src/main/res/values/hostActivity.xml
@@ -0,0 +1,7 @@
+
+
+ Selecciona la instancia que prefieras
+ Aceptar
+ Error, try again
+ Host saved
+
\ No newline at end of file
diff --git a/app/src/main/res/values/loginActivity.xml b/app/src/main/res/values/loginActivity.xml
new file mode 100644
index 0000000..f626b95
--- /dev/null
+++ b/app/src/main/res/values/loginActivity.xml
@@ -0,0 +1,18 @@
+
+
+ Login or register new account
+ Username:
+
+ Password:
+
+ Login now
+ Create new account
+ Email:
+ user@mail.com
+ Register now
+
+
+ You are logged
+ An error has ocurred
+ Invalid credentials
+
\ No newline at end of file
diff --git a/app/src/main/res/values/mainActivity.xml b/app/src/main/res/values/mainActivity.xml
new file mode 100644
index 0000000..6cddc1b
--- /dev/null
+++ b/app/src/main/res/values/mainActivity.xml
@@ -0,0 +1,14 @@
+
+
+ Recent videos
+ Popular videos
+ Local videos
+ My videos
+ views
+ seconds
+ Log In
+ P2Play (alpha)
+
+
+ You are disconnected
+
\ No newline at end of file
diff --git a/app/src/main/res/values/menu.xml b/app/src/main/res/values/menu.xml
new file mode 100644
index 0000000..23b18fd
--- /dev/null
+++ b/app/src/main/res/values/menu.xml
@@ -0,0 +1,7 @@
+
+
+ Popular
+ Recent
+ Local
+ About
+
\ No newline at end of file
diff --git a/app/src/main/res/values/miniMenu.xml b/app/src/main/res/values/miniMenu.xml
new file mode 100644
index 0000000..b4cfde8
--- /dev/null
+++ b/app/src/main/res/values/miniMenu.xml
@@ -0,0 +1,6 @@
+
+
+ Settings
+ Log In
+ Logout
+
\ No newline at end of file
diff --git a/app/src/main/res/values/reproductorActivity.xml b/app/src/main/res/values/reproductorActivity.xml
new file mode 100644
index 0000000..fc859c8
--- /dev/null
+++ b/app/src/main/res/values/reproductorActivity.xml
@@ -0,0 +1,9 @@
+
+
+ Description:
+ Like
+ Dislike
+ Share
+ Report
+ Subscribe
+
\ No newline at end of file
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
new file mode 100644
index 0000000..cd084d2
--- /dev/null
+++ b/app/src/main/res/values/strings.xml
@@ -0,0 +1,9 @@
+
+ P2Play
+ peertube.example.com
+ Open navigation drawer
+ Close navigation drawer
+ Navigation header
+
+ Comming soon!
+
diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml
new file mode 100644
index 0000000..2531a0a
--- /dev/null
+++ b/app/src/main/res/values/styles.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/test/java/org/libre/agosto/p2play/ExampleUnitTest.kt b/app/src/test/java/org/libre/agosto/p2play/ExampleUnitTest.kt
new file mode 100644
index 0000000..c9a3756
--- /dev/null
+++ b/app/src/test/java/org/libre/agosto/p2play/ExampleUnitTest.kt
@@ -0,0 +1,17 @@
+package org.libre.agosto.p2play
+
+import org.junit.Test
+
+import org.junit.Assert.*
+
+/**
+ * Example local unit test, which will execute on the development machine (host).
+ *
+ * See [testing documentation](http://d.android.com/tools/testing).
+ */
+class ExampleUnitTest {
+ @Test
+ fun addition_isCorrect() {
+ assertEquals(4, 2 + 2)
+ }
+}
diff --git a/build.gradle b/build.gradle
new file mode 100644
index 0000000..c75cf5f
--- /dev/null
+++ b/build.gradle
@@ -0,0 +1,27 @@
+// Top-level build file where you can add configuration options common to all sub-projects/modules.
+
+buildscript {
+ ext.kotlin_version = '1.2.51'
+ repositories {
+ google()
+ jcenter()
+ }
+ dependencies {
+ classpath 'com.android.tools.build:gradle:3.1.3'
+ classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
+
+ // NOTE: Do not place your application dependencies here; they belong
+ // in the individual module build.gradle files
+ }
+}
+
+allprojects {
+ repositories {
+ google()
+ jcenter()
+ }
+}
+
+task clean(type: Delete) {
+ delete rootProject.buildDir
+}
diff --git a/gradle.properties b/gradle.properties
new file mode 100644
index 0000000..743d692
--- /dev/null
+++ b/gradle.properties
@@ -0,0 +1,13 @@
+# Project-wide Gradle settings.
+# IDE (e.g. Android Studio) users:
+# Gradle settings configured through the IDE *will override*
+# any settings specified in this file.
+# For more details on how to configure your build environment visit
+# http://www.gradle.org/docs/current/userguide/build_environment.html
+# Specifies the JVM arguments used for the daemon process.
+# The setting is particularly useful for tweaking memory settings.
+org.gradle.jvmargs=-Xmx1536m
+# When configured, Gradle will run in incubating parallel mode.
+# This option should only be used with decoupled projects. More details, visit
+# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
+# org.gradle.parallel=true
diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 0000000..7a3265e
Binary files /dev/null and b/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 0000000..b1a92c3
--- /dev/null
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,6 @@
+#Wed Jul 11 18:31:20 CDT 2018
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-4.4-all.zip
diff --git a/gradlew b/gradlew
new file mode 100755
index 0000000..cccdd3d
--- /dev/null
+++ b/gradlew
@@ -0,0 +1,172 @@
+#!/usr/bin/env sh
+
+##############################################################################
+##
+## Gradle start up script for UN*X
+##
+##############################################################################
+
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+ ls=`ls -ld "$PRG"`
+ link=`expr "$ls" : '.*-> \(.*\)$'`
+ if expr "$link" : '/.*' > /dev/null; then
+ PRG="$link"
+ else
+ PRG=`dirname "$PRG"`"/$link"
+ fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >/dev/null
+APP_HOME="`pwd -P`"
+cd "$SAVED" >/dev/null
+
+APP_NAME="Gradle"
+APP_BASE_NAME=`basename "$0"`
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS=""
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD="maximum"
+
+warn () {
+ echo "$*"
+}
+
+die () {
+ echo
+ echo "$*"
+ echo
+ exit 1
+}
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+nonstop=false
+case "`uname`" in
+ CYGWIN* )
+ cygwin=true
+ ;;
+ Darwin* )
+ darwin=true
+ ;;
+ MINGW* )
+ msys=true
+ ;;
+ NONSTOP* )
+ nonstop=true
+ ;;
+esac
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+ if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+ # IBM's JDK on AIX uses strange locations for the executables
+ JAVACMD="$JAVA_HOME/jre/sh/java"
+ else
+ JAVACMD="$JAVA_HOME/bin/java"
+ fi
+ if [ ! -x "$JAVACMD" ] ; then
+ die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+ fi
+else
+ JAVACMD="java"
+ which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
+ MAX_FD_LIMIT=`ulimit -H -n`
+ if [ $? -eq 0 ] ; then
+ if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
+ MAX_FD="$MAX_FD_LIMIT"
+ fi
+ ulimit -n $MAX_FD
+ if [ $? -ne 0 ] ; then
+ warn "Could not set maximum file descriptor limit: $MAX_FD"
+ fi
+ else
+ warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
+ fi
+fi
+
+# For Darwin, add options to specify how the application appears in the dock
+if $darwin; then
+ GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
+fi
+
+# For Cygwin, switch paths to Windows format before running java
+if $cygwin ; then
+ APP_HOME=`cygpath --path --mixed "$APP_HOME"`
+ CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+ JAVACMD=`cygpath --unix "$JAVACMD"`
+
+ # We build the pattern for arguments to be converted via cygpath
+ ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
+ SEP=""
+ for dir in $ROOTDIRSRAW ; do
+ ROOTDIRS="$ROOTDIRS$SEP$dir"
+ SEP="|"
+ done
+ OURCYGPATTERN="(^($ROOTDIRS))"
+ # Add a user-defined pattern to the cygpath arguments
+ if [ "$GRADLE_CYGPATTERN" != "" ] ; then
+ OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
+ fi
+ # Now convert the arguments - kludge to limit ourselves to /bin/sh
+ i=0
+ for arg in "$@" ; do
+ CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
+ CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
+
+ if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
+ eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
+ else
+ eval `echo args$i`="\"$arg\""
+ fi
+ i=$((i+1))
+ done
+ case $i in
+ (0) set -- ;;
+ (1) set -- "$args0" ;;
+ (2) set -- "$args0" "$args1" ;;
+ (3) set -- "$args0" "$args1" "$args2" ;;
+ (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+ (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+ (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+ (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+ (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+ (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+ esac
+fi
+
+# Escape application args
+save () {
+ for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
+ echo " "
+}
+APP_ARGS=$(save "$@")
+
+# Collect all arguments for the java command, following the shell quoting and substitution rules
+eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
+
+# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
+if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
+ cd "$(dirname "$0")"
+fi
+
+exec "$JAVACMD" "$@"
diff --git a/gradlew.bat b/gradlew.bat
new file mode 100644
index 0000000..e95643d
--- /dev/null
+++ b/gradlew.bat
@@ -0,0 +1,84 @@
+@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS=
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto init
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto init
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:init
+@rem Get command-line arguments, handling Windows variants
+
+if not "%OS%" == "Windows_NT" goto win9xME_args
+
+:win9xME_args
+@rem Slurp the command line arguments.
+set CMD_LINE_ARGS=
+set _SKIP=2
+
+:win9xME_args_slurp
+if "x%~1" == "x" goto execute
+
+set CMD_LINE_ARGS=%*
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/settings.gradle b/settings.gradle
new file mode 100644
index 0000000..e7b4def
--- /dev/null
+++ b/settings.gradle
@@ -0,0 +1 @@
+include ':app'