diff --git a/README.md b/README.md index dec7311..8d8c699 100644 --- a/README.md +++ b/README.md @@ -3,10 +3,20 @@ P2Play is an Android Application for 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 Comming soon! -## Realeases +## Realeases (apk's) [All realeases are here](https://gitlab.com/agosto182/p2play/tags) @@ -22,29 +32,35 @@ Comming soon! - Rate videos - Show and make commentaries - Splash screen +- Search videos +- Infinite scroll ## What to do? (in next version) -- Search videos - Share videos +- Report videos - Peertube profiles -- Infinite scroll +- History of videos watched +- Notifications ## 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 You can follow our accounts for get news and contact with the developers. -- GNU Social: [https://gnusocial.ml/p2play](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) +- GNU Social: https://gnusocial.ml/p2play +- Peertube Channel: https://peertube.video/video-channels/90df4e5f-c834-4720-a5d7-c9faa0af0af5/videos ## About P2Play is made in Android Studio with Kotlin code. - +![kotlin](https://weblizar.com/blog/wp-content/uploads/2017/11/Kotlin-A-New-Programming-Platform-For-Android-Developers.png) ### Developers - Ivan Agosto: [https://gnusocial.ml/agosto182](https://gnusocial.ml/agosto182) diff --git a/app/build.gradle b/app/build.gradle index 0b32c89..7cd9331 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -10,8 +10,8 @@ android { applicationId "mx.agosto182.p2play" minSdkVersion 21 targetSdkVersion 27 - versionCode 3 - versionName "0.2" + versionCode 4 + versionName "0.3" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } buildTypes { diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index a8bca63..dd6f1cb 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -7,7 +7,6 @@ diff --git a/app/src/main/java/org/libre/agosto/p2play/HostActivity.kt b/app/src/main/java/org/libre/agosto/p2play/HostActivity.kt index 432a6e6..88d1b02 100644 --- a/app/src/main/java/org/libre/agosto/p2play/HostActivity.kt +++ b/app/src/main/java/org/libre/agosto/p2play/HostActivity.kt @@ -24,7 +24,7 @@ class HostActivity : AppCompatActivity() { settings = PreferenceManager.getDefaultSharedPreferences(this) editor = settings.edit() - ManagerSingleton.context = this + button.setOnClickListener { getKeys(hostText.text.toString()) } @@ -49,7 +49,7 @@ class HostActivity : AppCompatActivity() { editor.putString("last_host",host) editor.putString("hostP2play",host) editor.apply() - ManagerSingleton.Toast(getString(R.string.finallyMsg)) + ManagerSingleton.Toast(getString(R.string.finallyMsg), this) ManagerSingleton.url=host startApp() } @@ -74,7 +74,7 @@ class HostActivity : AppCompatActivity() { } else{ runOnUiThread { - ManagerSingleton.Toast(getString(R.string.errorMsg)) + ManagerSingleton.Toast(getString(R.string.errorMsg), this) button.isEnabled = true } } @@ -83,7 +83,7 @@ class HostActivity : AppCompatActivity() { private fun startApp(){ runOnUiThread { - val intent = Intent(ManagerSingleton.context,MainActivity::class.java) + val intent = Intent(this,MainActivity::class.java) startActivity(intent) this.finish() } diff --git a/app/src/main/java/org/libre/agosto/p2play/LoginActivity.kt b/app/src/main/java/org/libre/agosto/p2play/LoginActivity.kt index 64ac851..8de0e7e 100644 --- a/app/src/main/java/org/libre/agosto/p2play/LoginActivity.kt +++ b/app/src/main/java/org/libre/agosto/p2play/LoginActivity.kt @@ -22,7 +22,6 @@ class LoginActivity : AppCompatActivity() { super.onCreate(savedInstanceState) setContentView(R.layout.activity_login) setTitle(R.string.action_login) - ManagerSingleton.context = this _db = Database(this) settings = PreferenceManager.getDefaultSharedPreferences(this) @@ -56,13 +55,13 @@ class LoginActivity : AppCompatActivity() { } "0" -> { runOnUiThread { - ManagerSingleton.Toast(getString(R.string.loginError_msg)) + ManagerSingleton.Toast(getString(R.string.loginError_msg), this) } } "-1" -> { runOnUiThread { 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) ManagerSingleton.user = user runOnUiThread { - ManagerSingleton.Toast(getString(R.string.loginSuccess_msg)) + ManagerSingleton.Toast(getString(R.string.loginSuccess_msg), this) finish() } } else{ runOnUiThread { - ManagerSingleton.Toast(getString(R.string.loginError_msg)) + ManagerSingleton.Toast(getString(R.string.loginError_msg), this) } } } diff --git a/app/src/main/java/org/libre/agosto/p2play/MainActivity.kt b/app/src/main/java/org/libre/agosto/p2play/MainActivity.kt index 3ceb1a9..97a823f 100644 --- a/app/src/main/java/org/libre/agosto/p2play/MainActivity.kt +++ b/app/src/main/java/org/libre/agosto/p2play/MainActivity.kt @@ -15,6 +15,7 @@ import android.view.Menu import android.view.MenuInflater import android.view.MenuItem import android.widget.ImageView +import android.widget.SearchView import com.squareup.picasso.Picasso import kotlinx.android.synthetic.main.activity_main.* import kotlinx.android.synthetic.main.app_bar_main.* @@ -26,7 +27,7 @@ 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 viewAdapter: RecyclerView.Adapter private lateinit var viewManager: RecyclerView.LayoutManager private val client: Videos = Videos() private lateinit var lastItem: MenuItem @@ -34,6 +35,8 @@ class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelecte lateinit var myMenu: Menu private val _db = Database(this) var section: String = "" + var searchVal: String = "" + var pagination = 0 override fun onCreate(savedInstanceState: Bundle?) { @@ -46,20 +49,16 @@ class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelecte .setAction("Action", null).show() } */ - val toggle = ActionBarDrawerToggle( - this, drawer_layout, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close) + val toggle = ActionBarDrawerToggle(this, drawer_layout, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close) drawer_layout.addDrawerListener(toggle) toggle.syncState() - // Context for ManagerSingleton - ManagerSingleton.context = this - nav_view.setNavigationItemSelectedListener(this) viewManager = LinearLayoutManager(this) - // Set data for RecyclerView - this.setData(arrayListOf()) + // Init RecyclerView + this.initRecycler() this.getLastVideos() @@ -74,7 +73,8 @@ class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelecte } // Generic function for set data to RecyclerView - private fun setData(data:ArrayList){ + private fun initRecycler(){ + val data = arrayListOf() viewAdapter = VideosAdapter(data) recyclerView = findViewById(R.id.list).apply { @@ -87,17 +87,49 @@ class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelecte // specify an viewAdapter (see also next example) 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 + } + + private fun addVideos(videos: ArrayList){ + 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 + this.pagination = 0 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() @@ -109,7 +141,7 @@ class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelecte private fun getSubscriptionVideos(){ if(ManagerSingleton.user.status != 1){ - ManagerSingleton.Toast("Inicia session primero") + ManagerSingleton.Toast("Inicia session primero", this) startActivity(Intent(this, LoginActivity::class.java)) return } @@ -117,9 +149,9 @@ class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelecte section = "sub" setTitle(R.string.title_subscriptions) AsyncTask.execute { - val videos = client.videoSubscriptions(ManagerSingleton.token.token) + val videos = client.videoSubscriptions(ManagerSingleton.token.token, this.pagination) runOnUiThread { - this.setData(videos) + this.addVideos(videos) } } } @@ -130,9 +162,9 @@ class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelecte section = "last" setTitle(R.string.title_recent) AsyncTask.execute { - val videos = client.getLastVideos() + val videos = client.getLastVideos(this.pagination) runOnUiThread { - this.setData(videos) + this.addVideos(videos) } } } @@ -143,9 +175,9 @@ class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelecte section = "popular" setTitle(R.string.title_popular) AsyncTask.execute { - val videos = client.getPopularVideos() + val videos = client.getPopularVideos(this.pagination) runOnUiThread { - this.setData(videos) + this.addVideos(videos) } } } @@ -156,9 +188,9 @@ class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelecte section = "local" setTitle(R.string.title_local) AsyncTask.execute { - val videos = client.getLocalVideos() + val videos = client.getLocalVideos(this.pagination) runOnUiThread { - this.setData(videos) + this.addVideos(videos) } } } @@ -169,9 +201,9 @@ class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelecte section = "my_videos" setTitle(R.string.title_myVideos) AsyncTask.execute { - val videos = client.myVideos(ManagerSingleton.token.token) + val videos = client.myVideos(ManagerSingleton.token.token, this.pagination) runOnUiThread { - this.setData(videos) + this.addVideos(videos) } } } @@ -187,6 +219,28 @@ class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelecte 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) + + 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 setSideData() return true @@ -228,6 +282,8 @@ class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelecte // lastItem.isChecked = false // } lastItem = item + pagination = 0 + // item.isChecked = true when (item.itemId) { R.id.nav_subscriptions->{ @@ -254,7 +310,6 @@ class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelecte override fun onResume() { super.onResume() - ManagerSingleton.context = this setSideData() } @@ -289,9 +344,39 @@ class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelecte ManagerSingleton.logout() 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) + } + } + } } diff --git a/app/src/main/java/org/libre/agosto/p2play/ManagerSingleton.kt b/app/src/main/java/org/libre/agosto/p2play/ManagerSingleton.kt index 65b9e60..dee2cbe 100644 --- a/app/src/main/java/org/libre/agosto/p2play/ManagerSingleton.kt +++ b/app/src/main/java/org/libre/agosto/p2play/ManagerSingleton.kt @@ -5,15 +5,15 @@ 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: + var nfsw: Boolean = false + var videos_count: Int = 0 - fun Toast(text: String?) { - if(this.context == null) { return } - android.widget.Toast.makeText(this.context, text, android.widget.Toast.LENGTH_SHORT).show() + fun Toast(text: String?, context: Context) { + if(context == null) { return } + android.widget.Toast.makeText(context, text, android.widget.Toast.LENGTH_SHORT).show() } fun logout(){ diff --git a/app/src/main/java/org/libre/agosto/p2play/RegisterActivity.kt b/app/src/main/java/org/libre/agosto/p2play/RegisterActivity.kt index 5cf3692..149d932 100644 --- a/app/src/main/java/org/libre/agosto/p2play/RegisterActivity.kt +++ b/app/src/main/java/org/libre/agosto/p2play/RegisterActivity.kt @@ -20,7 +20,6 @@ class RegisterActivity : AppCompatActivity() { super.onCreate(savedInstanceState) setContentView(R.layout.activity_register) setTitle(R.string.registerActionBtn) - ManagerSingleton.context = this settings = PreferenceManager.getDefaultSharedPreferences(this) client_id = settings.getString("client_id", "") @@ -43,11 +42,11 @@ class RegisterActivity : AppCompatActivity() { runOnUiThread { when (res) { 1 -> { - ManagerSingleton.Toast(getString(R.string.registerSuccess_msg)) + ManagerSingleton.Toast(getString(R.string.registerSuccess_msg), this) finish() } - 0 -> ManagerSingleton.Toast(getString(R.string.registerFailed_msg)) - -1 -> ManagerSingleton.Toast(getString(R.string.registerError_msg)) + 0 -> ManagerSingleton.Toast(getString(R.string.registerFailed_msg), this) + -1 -> ManagerSingleton.Toast(getString(R.string.registerError_msg), this) } registerBtn.isEnabled = true } diff --git a/app/src/main/java/org/libre/agosto/p2play/ReproductorActivity.kt b/app/src/main/java/org/libre/agosto/p2play/ReproductorActivity.kt index 206642e..365168c 100644 --- a/app/src/main/java/org/libre/agosto/p2play/ReproductorActivity.kt +++ b/app/src/main/java/org/libre/agosto/p2play/ReproductorActivity.kt @@ -35,7 +35,6 @@ class ReproductorActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_reproductor) - ManagerSingleton.context = this videoView.webChromeClient = WebClient() videoView.settings.javaScriptEnabled = true @@ -52,6 +51,7 @@ class ReproductorActivity : AppCompatActivity() { viewsTxt.text = this.video.views.toString() + ' ' + getString(R.string.view_text) userTxt.text = this.video.username descriptionVideoTxt.text = this.video.description.toString() + hostTxt.text = this.video.userHost.toString() // Check if user had profile image if(this.video.userImageUrl!="") @@ -85,7 +85,7 @@ class ReproductorActivity : AppCompatActivity() { val res = this._actions.subscribe(ManagerSingleton.token.token, account) if (res == 1) { runOnUiThread { - ManagerSingleton.Toast(getString(R.string.subscribeMsg)) + ManagerSingleton.Toast(getString(R.string.subscribeMsg), this) this.changeSubscribeBtn(true) } } @@ -100,7 +100,7 @@ class ReproductorActivity : AppCompatActivity() { val res = this._actions.unSubscribe(ManagerSingleton.token.token, account) if (res == 1) { runOnUiThread { - ManagerSingleton.Toast(getString(R.string.unSubscribeMsg)) + ManagerSingleton.Toast(getString(R.string.unSubscribeMsg), this) this.changeSubscribeBtn(false) } } @@ -114,14 +114,14 @@ class ReproductorActivity : AppCompatActivity() { val res = this._actions.rate(ManagerSingleton.token.token, this.video.id, rate) if (res == 1) { runOnUiThread { - ManagerSingleton.Toast(getString(R.string.rateMsg)) + ManagerSingleton.Toast(getString(R.string.rateMsg), this) if(rate=="like"){ - likeLayout.setBackgroundColor(ContextCompat.getColor(this, R.color.colorLike)) - dislikeLayout.background = null + textViewLike.setTextColor(ContextCompat.getColor(this, R.color.colorLike)) + textViewDislike.setTextColor(ContextCompat.getColor(this, R.color.primary_dark_material_light)) } else if(rate=="dislike"){ - dislikeLayout.setBackgroundColor(ContextCompat.getColor(this, R.color.colorDislike)) - likeLayout.background = null + textViewDislike.setTextColor(ContextCompat.getColor(this, R.color.colorDislike)) + textViewLike.setTextColor(ContextCompat.getColor(this, R.color.primary_dark_material_light)) } } } @@ -136,16 +136,16 @@ class ReproductorActivity : AppCompatActivity() { runOnUiThread { when (rate){ "like" -> { - likeLayout.setBackgroundColor(ContextCompat.getColor(this, R.color.colorLike)) - dislikeLayout.background = null + textViewLike.setTextColor(ContextCompat.getColor(this, R.color.colorLike)) + textViewDislike.setTextColor(ContextCompat.getColor(this, R.color.primary_dark_material_light)) } "dislike" -> { - dislikeLayout.setBackgroundColor(ContextCompat.getColor(this, R.color.colorDislike)) - likeLayout.background = null + textViewDislike.setTextColor(ContextCompat.getColor(this, R.color.colorDislike)) + textViewLike.setTextColor(ContextCompat.getColor(this, R.color.primary_dark_material_light)) } else -> { - likeLayout.background = null - dislikeLayout.background = null + textViewLike.setTextColor(ContextCompat.getColor(this, R.color.primary_dark_material_light)) + textViewDislike.setTextColor(ContextCompat.getColor(this, R.color.primary_dark_material_light)) } } } @@ -203,7 +203,7 @@ class ReproductorActivity : AppCompatActivity() { private fun makeComment() { if(commentaryText.text.toString() == ""){ - ManagerSingleton.Toast(getString(R.string.emptyCommentaryMsg)) + ManagerSingleton.Toast(getString(R.string.emptyCommentaryMsg), this) return } val text = commentaryText.text.toString() @@ -211,12 +211,12 @@ class ReproductorActivity : AppCompatActivity() { val res = this.client.makeCommentary(ManagerSingleton.token.token, this.video.id, text) runOnUiThread { if (res) { - ManagerSingleton.Toast(getString(R.string.makedCommentaryMsg)) + ManagerSingleton.Toast(getString(R.string.makedCommentaryMsg), this) commentaryText.text.clear() this.getComments() } else { - ManagerSingleton.Toast(getString(R.string.errorCommentaryMsg)) + ManagerSingleton.Toast(getString(R.string.errorCommentaryMsg), this) } } } @@ -236,15 +236,12 @@ class ReproductorActivity : AppCompatActivity() { } } - internal inner class WebClient(): WebChromeClient() { + internal inner class WebClient: WebChromeClient() { private var mCustomView: View? = null private var mCustomViewCallback: WebChromeClient.CustomViewCallback? = null - private var mFullscreenContainer: FrameLayout? = null private var mOriginalOrientation: Int = 0 private var mOriginalSystemUiVisibility: Int = 0 - fun WebClient() {} - override fun getDefaultVideoPoster(): Bitmap? { return if (mCustomView == null) { null @@ -271,7 +268,6 @@ class ReproductorActivity : AppCompatActivity() { return } try { - this.mCustomView = paramView this.mOriginalSystemUiVisibility = this@ReproductorActivity.window.decorView.systemUiVisibility this.mOriginalOrientation = this@ReproductorActivity.requestedOrientation diff --git a/app/src/main/java/org/libre/agosto/p2play/SettingsActivity.kt b/app/src/main/java/org/libre/agosto/p2play/SettingsActivity.kt index 976d82e..cd0b34c 100644 --- a/app/src/main/java/org/libre/agosto/p2play/SettingsActivity.kt +++ b/app/src/main/java/org/libre/agosto/p2play/SettingsActivity.kt @@ -32,13 +32,12 @@ class SettingsActivity : AppCompatPreferenceActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - ManagerSingleton.context = this setupActionBar() } override fun onBackPressed() { super.onBackPressed() - ManagerSingleton.Toast(getString(R.string.pref_message_exit)) + ManagerSingleton.Toast(getString(R.string.pref_message_exit), this) } /** diff --git a/app/src/main/java/org/libre/agosto/p2play/SplashActivity.kt b/app/src/main/java/org/libre/agosto/p2play/SplashActivity.kt index fc5845c..d5bca99 100644 --- a/app/src/main/java/org/libre/agosto/p2play/SplashActivity.kt +++ b/app/src/main/java/org/libre/agosto/p2play/SplashActivity.kt @@ -24,8 +24,9 @@ class SplashActivity : AppCompatActivity() { settings = PreferenceManager.getDefaultSharedPreferences(this) - editor = settings.edit() - ManagerSingleton.context = 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","") @@ -92,7 +93,7 @@ class SplashActivity : AppCompatActivity() { private fun startApp() { runOnUiThread { - val intent = Intent(ManagerSingleton.context, MainActivity::class.java) + val intent = Intent(this, MainActivity::class.java) startActivity(intent) this.finish() } @@ -100,7 +101,7 @@ class SplashActivity : AppCompatActivity() { private fun startHostActivity() { runOnUiThread { - val intent = Intent(ManagerSingleton.context, HostActivity::class.java) + val intent = Intent(this, HostActivity::class.java) startActivity(intent) this.finish() } diff --git a/app/src/main/java/org/libre/agosto/p2play/adapters/CommentariesAdapter.kt b/app/src/main/java/org/libre/agosto/p2play/adapters/CommentariesAdapter.kt index 7053460..77a93df 100644 --- a/app/src/main/java/org/libre/agosto/p2play/adapters/CommentariesAdapter.kt +++ b/app/src/main/java/org/libre/agosto/p2play/adapters/CommentariesAdapter.kt @@ -1,6 +1,7 @@ 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 @@ -33,12 +34,14 @@ class CommentariesAdapter(private val myDataset: ArrayList) : 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 } } 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 index a5bae25..4a5624c 100644 --- a/app/src/main/java/org/libre/agosto/p2play/adapters/VideosAdapter.kt +++ b/app/src/main/java/org/libre/agosto/p2play/adapters/VideosAdapter.kt @@ -1,6 +1,7 @@ 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 @@ -20,10 +21,12 @@ import org.libre.agosto.p2play.models.VideoModel import java.io.InputStream import java.io.Serializable import java.net.URL +import java.util.concurrent.TimeUnit 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. @@ -33,6 +36,7 @@ class VideosAdapter(private val myDataset: ArrayList) : val userImg: ImageView val tittle: TextView val description: TextView + val context: Context init { // Define click listener for the ViewHolder's View @@ -40,10 +44,10 @@ class VideosAdapter(private val myDataset: ArrayList) : description = view.findViewById(R.id.descriptionTxt) thumb = view.findViewById(R.id.thumb) userImg = view.findViewById(R.id.userImg) + context = view.context } } - // Create new views (invoked by the layout manager) override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): VideosAdapter.ViewHolder { @@ -61,19 +65,45 @@ class VideosAdapter(private val myDataset: ArrayList) : 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) + val intent = Intent(holder.context, ReproductorActivity::class.java) intent.putExtra("video", myDataset[position] as Serializable) - ManagerSingleton.context!!.startActivity(intent) + holder.context.startActivity(intent) } 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 timeText = ManagerSingleton.context!!.getString(R.string.time_text) - holder.description.text = myDataset[position].username+" - "+myDataset[position].views+" "+viewsText+" - "+myDataset[position].duration+" "+timeText + val viewsText = holder.context.getString(R.string.view_text) + var timeText = holder.context.getString(R.string.timeSec_text) + var timeString = myDataset[position].duration.toString() + val seconds = myDataset[position].duration.toInt(); + 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) override fun getItemCount() = myDataset.size + + fun clearData(){ + myDataset.clear() + notifyDataSetChanged() + } + + fun addData(newItems: ArrayList){ + val lastPos = myDataset.size + myDataset.addAll(newItems) + notifyItemRangeInserted(lastPos, newItems.size) + } + + } \ No newline at end of file diff --git a/app/src/main/java/org/libre/agosto/p2play/ajax/Videos.kt b/app/src/main/java/org/libre/agosto/p2play/ajax/Videos.kt index bd3f5b1..795b8f6 100644 --- a/app/src/main/java/org/libre/agosto/p2play/ajax/Videos.kt +++ b/app/src/main/java/org/libre/agosto/p2play/ajax/Videos.kt @@ -3,12 +3,13 @@ package org.libre.agosto.p2play.ajax import android.util.JsonReader import android.util.JsonToken import android.util.Log +import org.libre.agosto.p2play.ManagerSingleton import org.libre.agosto.p2play.models.VideoModel import java.io.InputStreamReader class Videos: Client() { - fun parseVideos(data: JsonReader): ArrayList{ + private fun parseVideos(data: JsonReader): ArrayList{ var videos = arrayListOf() data.beginObject() while (data.hasNext()){ @@ -91,8 +92,10 @@ class Videos: Client() { return videos } - private fun getVideos(start:Int, count:Int, sort:String = "-publishedAt", filter:String = ""):ArrayList{ - var params = "start=$start&count=$count&sort=$sort" + private fun getVideos(start:Int, sort:String = "-publishedAt", filter:String = ""):ArrayList{ + val nsfw = ManagerSingleton.nfsw + val count = ManagerSingleton.videos_count + var params = "start=$start&count=$count&sort=$sort&nsfw=$nsfw" if(filter != "") params+="&filter=$filter" var con=this._newCon("videos?$params","GET") @@ -105,26 +108,26 @@ class Videos: Client() { } } catch(err:Exception){ err?.printStackTrace() - Log.d("TypeErr",err?.message ,err.cause) - Log.d("Error","fallo la coneccion") } return videos } - fun getLastVideos(start:Int = 0, count:Int = 30): ArrayList{ - return this.getVideos(start, count) + fun getLastVideos(start:Int = 0): ArrayList{ + return this.getVideos(start) } - fun getPopularVideos(start:Int = 0, count:Int = 30): ArrayList{ - return this.getVideos(start, count,"-views") + fun getPopularVideos(start:Int = 0): ArrayList{ + return this.getVideos(start,"-views") } - fun getLocalVideos(start:Int = 0, count:Int = 30): ArrayList{ - return this.getVideos(start, count,"-publishedAt", "local") + fun getLocalVideos(start:Int = 0): ArrayList{ + return this.getVideos(start,"-publishedAt", "local") } - fun myVideos(token: String): ArrayList{ - var con=this._newCon("users/me/videos","GET", token) + fun myVideos(token: String, start: Int = 0): ArrayList{ + val count = ManagerSingleton.videos_count + val params = "start=$start&count=$count" + var con=this._newCon("users/me/videos?$params","GET", token) var videos = arrayListOf() try { if (con.responseCode == 200) { @@ -134,14 +137,32 @@ class Videos: Client() { } } catch(err:Exception){ err?.printStackTrace() - Log.d("TypeErr",err?.message ,err.cause) - Log.d("Error","fallo la coneccion") } return videos } - fun videoSubscriptions(token: String): ArrayList{ - var con=this._newCon("users/me/subscriptions/videos","GET", token) + fun videoSubscriptions(token: String, start: Int = 0): ArrayList{ + 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() + 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{ + 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() try { if (con.responseCode == 200) { @@ -151,8 +172,6 @@ class Videos: Client() { } } catch(err:Exception){ err?.printStackTrace() - Log.d("TypeErr",err?.message ,err.cause) - Log.d("Error","fallo la coneccion") } return videos } diff --git a/app/src/main/res/drawable/ic_search_black_24dp.xml b/app/src/main/res/drawable/ic_search_black_24dp.xml new file mode 100644 index 0000000..affc7ba --- /dev/null +++ b/app/src/main/res/drawable/ic_search_black_24dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index a61d8a6..c21e1aa 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -18,6 +18,10 @@ android:layout_width="wrap_content" android:layout_height="match_parent" 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" app:headerLayout="@layout/nav_header_main" app:menu="@menu/activity_main_drawer" /> diff --git a/app/src/main/res/layout/activity_reproductor.xml b/app/src/main/res/layout/activity_reproductor.xml index 1abc106..bed671b 100644 --- a/app/src/main/res/layout/activity_reproductor.xml +++ b/app/src/main/res/layout/activity_reproductor.xml @@ -37,6 +37,7 @@ android:layout_height="wrap_content" android:paddingStart="5dp" android:textAppearance="@android:style/TextAppearance.Material.Large" + android:textSize="18sp" android:textStyle="bold" /> - + android:orientation="vertical"> + + + + + +