diff --git a/app/build.gradle b/app/build.gradle index 66933a5..3c0110a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -2,13 +2,12 @@ plugins { id "com.android.application" id "kotlin-android" - id "kotlin-android-extensions" } android { - compileSdkVersion 34 defaultConfig { applicationId "org.libre.agosto.p2play" + compileSdk 34 minSdkVersion 26 targetSdkVersion 32 versionCode 10 @@ -22,9 +21,12 @@ android { proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } + buildFeatures { + viewBinding = true + } compileOptions { - sourceCompatibility JavaVersion.VERSION_1_8 - targetCompatibility JavaVersion.VERSION_1_8 + sourceCompatibility JavaVersion.VERSION_17 + targetCompatibility JavaVersion.VERSION_17 } namespace 'org.libre.agosto.p2play' lint { @@ -41,14 +43,14 @@ dependencies { implementation 'androidx.constraintlayout:constraintlayout:2.1.4' implementation 'androidx.legacy:legacy-support-v4:1.0.0' implementation 'com.android.support:appcompat-v7:28.0.0' - implementation 'com.google.android.material:material:1.6.0' - implementation 'androidx.preference:preference:1.2.1' + implementation 'com.google.android.material:material:1.12.0' + implementation 'androidx.preference:preference-ktx:1.2.1' testImplementation 'junit:junit:4.13.2' androidTestImplementation 'androidx.test:runner:1.5.2' androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1' - implementation 'androidx.media3:media3-exoplayer:1.1.1' - implementation 'androidx.media3:media3-exoplayer-dash:1.1.1' - implementation 'androidx.media3:media3-ui:1.1.1' - implementation 'androidx.media3:media3-exoplayer-hls:1.1.1' - implementation "androidx.media3:media3-session:1.1.1" + implementation 'androidx.media3:media3-exoplayer:1.3.1' + implementation 'androidx.media3:media3-exoplayer-dash:1.3.1' + implementation 'androidx.media3:media3-ui:1.3.1' + implementation 'androidx.media3:media3-exoplayer-hls:1.3.1' + implementation "androidx.media3:media3-session:1.3.1" } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 0e34e85..3f6ff3d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -59,11 +59,6 @@ - private lateinit var viewManager: RecyclerView.LayoutManager + private lateinit var binding: ActivityChannelBinding + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - setContentView(R.layout.activity_channel) + binding = ActivityChannelBinding.inflate(layoutInflater) + val view = binding.root + setContentView(view) channelId = this.intent.extras?.getString("channel")!! viewManager = getViewManager(this, resources) - subcriptionBtn.setOnClickListener { + binding.subcriptionBtn.setOnClickListener { subscribeAction() } } @@ -48,7 +51,7 @@ class ChannelActivity : AppCompatActivity() { getVideos() if (ManagerSingleton.user.status == 1) { - subcriptionBtn.visibility = View.VISIBLE + binding.subcriptionBtn.visibility = View.VISIBLE getSubscription() } } @@ -57,11 +60,11 @@ class ChannelActivity : AppCompatActivity() { AsyncTask.execute { channel = channelService.getChannelInfo(channelId) runOnUiThread { - usernameProfile.text = channel.name - hostTxt.text = channel.host - subcriptionsTxt.text = channel.followers.toString() + binding.usernameProfile.text = channel.name + binding.hostTxt.text = channel.host + binding.subcriptionsTxt.text = channel.followers.toString() if (channel.channelImg != "") { - Picasso.get().load("https://${ManagerSingleton.url}${channel.channelImg}").into(channelImg) + Picasso.get().load("https://${ManagerSingleton.url}${channel.channelImg}").into(binding.channelImg) } } } @@ -72,7 +75,7 @@ class ChannelActivity : AppCompatActivity() { val res = actionsService.subscribe(ManagerSingleton.token.token, channel.getAccount()) runOnUiThread { if (res == 1) { - subcriptionBtn.text = getString(R.string.unSubscribeBtn) + binding.subcriptionBtn.text = getString(R.string.unSubscribeBtn) ManagerSingleton.toast(getString(R.string.subscribeMsg), this) getSubscription() } else { @@ -87,7 +90,7 @@ class ChannelActivity : AppCompatActivity() { val res = actionsService.unSubscribe(ManagerSingleton.token.token, channel.getAccount()) runOnUiThread { if (res == 1) { - subcriptionBtn.text = getString(R.string.subscribeBtn) + binding.subcriptionBtn.text = getString(R.string.subscribeBtn) ManagerSingleton.toast(getString(R.string.unSubscribeMsg), this) getSubscription() } else { @@ -110,9 +113,9 @@ class ChannelActivity : AppCompatActivity() { isSubcribed = actionsService.getSubscription(ManagerSingleton.token.token, channel.getAccount()) runOnUiThread { if (isSubcribed) { - subcriptionBtn.text = getText(R.string.unSubscribeBtn) + binding.subcriptionBtn.text = getText(R.string.unSubscribeBtn) } else { - subcriptionBtn.text = getText(R.string.subscribeBtn) + binding.subcriptionBtn.text = getText(R.string.subscribeBtn) } } } 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 4e8494c..3e3103a 100644 --- a/app/src/main/java/org/libre/agosto/p2play/HostActivity.kt +++ b/app/src/main/java/org/libre/agosto/p2play/HostActivity.kt @@ -7,8 +7,8 @@ import android.os.Bundle import android.os.Looper import androidx.appcompat.app.AppCompatActivity import androidx.preference.PreferenceManager -import kotlinx.android.synthetic.main.activity_host.* import org.libre.agosto.p2play.ajax.Auth +import org.libre.agosto.p2play.databinding.ActivityHostBinding class HostActivity : AppCompatActivity() { lateinit var settings: SharedPreferences @@ -16,15 +16,19 @@ class HostActivity : AppCompatActivity() { val client: Auth = Auth() private val db = Database(this) + private lateinit var binding: ActivityHostBinding + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - setContentView(R.layout.activity_host) + binding = ActivityHostBinding.inflate(layoutInflater) + val view = binding.root + setContentView(view) settings = PreferenceManager.getDefaultSharedPreferences(this) editor = settings.edit() - button.setOnClickListener { - getKeys(hostText.text.toString()) + binding.button.setOnClickListener { + getKeys(binding.hostText.text.toString()) } val host = settings.getString("hostP2play", "") @@ -51,7 +55,7 @@ class HostActivity : AppCompatActivity() { } private fun getKeys(hostText: String) { - button.isEnabled = false + binding.button.isEnabled = false var host = hostText.toString() host = host.replace("http://", "") host = host.replace("https://", "") @@ -71,7 +75,7 @@ class HostActivity : AppCompatActivity() { } else { runOnUiThread { ManagerSingleton.toast(getString(R.string.errorMsg), this) - button.isEnabled = true + binding.button.isEnabled = true } } } 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 6c2e07b..7b2cfdc 100644 --- a/app/src/main/java/org/libre/agosto/p2play/LoginActivity.kt +++ b/app/src/main/java/org/libre/agosto/p2play/LoginActivity.kt @@ -9,8 +9,8 @@ import android.widget.EditText import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AppCompatActivity import androidx.preference.PreferenceManager -import kotlinx.android.synthetic.main.activity_login.* import org.libre.agosto.p2play.ajax.Auth +import org.libre.agosto.p2play.databinding.ActivityLoginBinding class LoginActivity : AppCompatActivity() { private val auth = Auth() @@ -20,9 +20,13 @@ class LoginActivity : AppCompatActivity() { private lateinit var db: Database private var optCode: String? = null + private lateinit var binding: ActivityLoginBinding + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - setContentView(R.layout.activity_login) + binding = ActivityLoginBinding.inflate(layoutInflater) + val view = binding.root + setContentView(view) setTitle(R.string.action_login) db = Database(this) @@ -30,14 +34,14 @@ class LoginActivity : AppCompatActivity() { clientId = settings.getString("client_id", "")!! clientSecret = settings.getString("client_secret", "")!! - registerActionBtn.setOnClickListener { startActivity(Intent(this, RegisterActivity::class.java)) } - loginBtn.setOnClickListener { tryLogin() } + binding.registerActionBtn.setOnClickListener { startActivity(Intent(this, RegisterActivity::class.java)) } + binding.loginBtn.setOnClickListener { tryLogin() } } fun tryLogin() { - loginBtn.isEnabled = false - val username = userText.text.toString() - val password = passwordText.text.toString() + binding.loginBtn.isEnabled = false + val username = binding.userText.text.toString() + val password = binding.passwordText.text.toString() AsyncTask.execute { if (Looper.myLooper() == null) { @@ -62,7 +66,7 @@ class LoginActivity : AppCompatActivity() { } "-1" -> { runOnUiThread { - loginBtn.isEnabled = true + binding.loginBtn.isEnabled = true ManagerSingleton.toast(getString(R.string.loginFailed_msg), this) } } @@ -84,7 +88,7 @@ class LoginActivity : AppCompatActivity() { } .setNegativeButton("Cancel") { d, _ -> dialog.run { d.cancel() } - loginBtn.isEnabled = true + binding.loginBtn.isEnabled = true } val alertDialog = builder.create() alertDialog.show() 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 7efe016..dc1befd 100644 --- a/app/src/main/java/org/libre/agosto/p2play/MainActivity.kt +++ b/app/src/main/java/org/libre/agosto/p2play/MainActivity.kt @@ -1,34 +1,24 @@ package org.libre.agosto.p2play import android.content.Intent -import android.content.res.Configuration import android.os.AsyncTask import android.os.Bundle import android.os.Handler import android.view.Menu import android.view.MenuItem import android.view.View +import android.widget.ImageView +import android.widget.TextView import androidx.appcompat.app.ActionBarDrawerToggle import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.widget.SearchView import androidx.core.view.GravityCompat -import androidx.recyclerview.widget.GridLayoutManager -import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import com.google.android.material.navigation.NavigationView import com.squareup.picasso.Picasso -import kotlinx.android.synthetic.main.activity_main.drawer_layout -import kotlinx.android.synthetic.main.activity_main.nav_view -import kotlinx.android.synthetic.main.app_bar_main.toolbar -import kotlinx.android.synthetic.main.content_main.mini -import kotlinx.android.synthetic.main.content_main.swipeContainer -import kotlinx.android.synthetic.main.mini_player.mini_play_pause -import kotlinx.android.synthetic.main.mini_player.mini_player_author -import kotlinx.android.synthetic.main.mini_player.mini_player_image -import kotlinx.android.synthetic.main.mini_player.mini_player_title -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.databinding.ActivityMainBinding import org.libre.agosto.p2play.helpers.getViewManager import org.libre.agosto.p2play.models.VideoModel import org.libre.agosto.p2play.singletons.PlaybackSingleton @@ -44,16 +34,20 @@ class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelecte var section: String = "" var searchVal: String = "" var pagination = 0 + + private lateinit var binding: ActivityMainBinding override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - setContentView(R.layout.activity_main) - setSupportActionBar(toolbar) + binding = ActivityMainBinding.inflate(layoutInflater) + val view = binding.root + setContentView(view) + setSupportActionBar(binding.toolbar) - val toggle = ActionBarDrawerToggle(this, drawer_layout, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close) - drawer_layout.addDrawerListener(toggle) + val toggle = ActionBarDrawerToggle(this, binding.drawerLayout, binding.toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close) + binding.drawerLayout.addDrawerListener(toggle) toggle.syncState() - nav_view.setNavigationItemSelectedListener(this) + binding.navView.setNavigationItemSelectedListener(this) viewManager = getViewManager(this, resources) @@ -62,19 +56,20 @@ class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelecte this.getTrengindVideos() - swipeContainer.setOnRefreshListener { + binding.content.swipeContainer.setOnRefreshListener { this.refresh() } - mini_player_image.setOnClickListener { this.resumeVideo() } - mini_player_title.setOnClickListener { this.resumeVideo() } - mini_player_author.setOnClickListener { this.resumeVideo() } - mini.setOnClickListener { this.resumeVideo() } - mini_play_pause.setOnClickListener { this.playPausePlayer() } + + binding.content.mini.miniPlayerImage.setOnClickListener { this.resumeVideo() } + binding.content.mini.miniPlayerTitle.setOnClickListener { this.resumeVideo() } + binding.content.mini.miniPlayerAuthor.setOnClickListener { this.resumeVideo() } + // binding.content.mini.setOnClickListener { this.resumeVideo() } + binding.content.mini.miniPlayPause.setOnClickListener { this.playPausePlayer() } Handler().postDelayed({ // Title for nav_bar - side_emailTxt?.text = getString(R.string.nav_header_subtitle) + " " + this.packageManager.getPackageInfo(this.packageName, 0).versionName + binding.navView.getHeaderView(0).findViewById(R.id.side_emailTxt).text = getString(R.string.nav_header_subtitle) + " " + this.packageManager.getPackageInfo(this.packageName, 0).versionName }, 2000) } @@ -99,7 +94,7 @@ class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelecte super.onScrolled(recyclerView, dx, dy) // super.onScrolled(recyclerView!!, dx, dy) - if (!swipeContainer.isRefreshing) { + if (!binding.content.swipeContainer.isRefreshing) { if (!canScrollVertically(1)) { loadMore() } @@ -107,11 +102,11 @@ class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelecte } }) } - swipeContainer.isRefreshing = false + binding.content.swipeContainer.isRefreshing = false } private fun addVideos(videos: ArrayList) { - this.swipeContainer.isRefreshing = true + binding.content.swipeContainer.isRefreshing = true try { if (this.pagination == 0) { @@ -125,11 +120,11 @@ class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelecte ManagerSingleton.toast(getString(R.string.errorMsg), this) } - this.swipeContainer.isRefreshing = false + binding.content.swipeContainer.isRefreshing = false } private fun refresh() { - swipeContainer.isRefreshing = true + binding.content.swipeContainer.isRefreshing = true this.pagination = 0 when (section) { "local" -> this.getLocalVideos() @@ -154,7 +149,7 @@ class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelecte startActivity(Intent(this, LoginActivity::class.java)) return } - swipeContainer.isRefreshing = true + binding.content.swipeContainer.isRefreshing = true section = "sub" setTitle(R.string.title_subscriptions) AsyncTask.execute { @@ -167,7 +162,7 @@ class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelecte // Last videos private fun getLastVideos() { - swipeContainer.isRefreshing = true + binding.content.swipeContainer.isRefreshing = true section = "last" setTitle(R.string.title_recent) AsyncTask.execute { @@ -180,7 +175,7 @@ class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelecte // Popular videos private fun getPopularVideos() { - swipeContainer.isRefreshing = true + binding.content.swipeContainer.isRefreshing = true section = "popular" setTitle(R.string.title_popular) AsyncTask.execute { @@ -193,7 +188,7 @@ class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelecte // Trending videos private fun getTrengindVideos() { - swipeContainer.isRefreshing = true + binding.content.swipeContainer.isRefreshing = true section = "trending" setTitle(R.string.title_trending) AsyncTask.execute { @@ -206,7 +201,7 @@ class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelecte // Local videos private fun getLocalVideos() { - swipeContainer.isRefreshing = true + binding.content.swipeContainer.isRefreshing = true section = "local" setTitle(R.string.title_local) AsyncTask.execute { @@ -219,7 +214,7 @@ class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelecte // Videos of user private fun getMyVideos() { - swipeContainer.isRefreshing = true + binding.content.swipeContainer.isRefreshing = true section = "my_videos" setTitle(R.string.title_myVideos) AsyncTask.execute { @@ -232,7 +227,7 @@ class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelecte // Videos history of user private fun getHistory() { - swipeContainer.isRefreshing = true + binding.content.swipeContainer.isRefreshing = true section = "my_videos" setTitle(R.string.nav_history) AsyncTask.execute { @@ -245,7 +240,7 @@ class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelecte // Most liked private fun getMostLiked() { - swipeContainer.isRefreshing = true + binding.content.swipeContainer.isRefreshing = true section = "liked" setTitle(R.string.nav_likes) AsyncTask.execute { @@ -257,8 +252,8 @@ class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelecte } override fun onBackPressed() { - if (drawer_layout.isDrawerOpen(GravityCompat.START)) { - drawer_layout.closeDrawer(GravityCompat.START) + if (binding.drawerLayout.isDrawerOpen(GravityCompat.START)) { + binding.drawerLayout.closeDrawer(GravityCompat.START) } else if (!section.equals("trending")) { // Hot fix pagination = 0 @@ -350,7 +345,7 @@ class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelecte R.id.nav_likes -> getMostLiked() } - drawer_layout.closeDrawer(GravityCompat.START) + binding.drawerLayout.closeDrawer(GravityCompat.START) return true } @@ -360,13 +355,14 @@ class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelecte if (PlaybackSingleton.player != null && PlaybackSingleton.player!!.isPlaying) { PlaybackSingleton.runMediaSession(this) - mini_player_title.text = PlaybackSingleton.video!!.name - mini_player_author.text = PlaybackSingleton.video!!.username - Picasso.get().load("https://${ManagerSingleton.url}${PlaybackSingleton.video!!.thumbUrl}").into(mini_player_image) - mini_play_pause.setImageResource(R.drawable.ic_pause_24) - mini.visibility = View.VISIBLE + + binding.content.mini.miniPlayerTitle.text = PlaybackSingleton.video!!.name + binding.content.mini.miniPlayerAuthor.text = PlaybackSingleton.video!!.username + Picasso.get().load("https://${ManagerSingleton.url}${PlaybackSingleton.video!!.thumbUrl}").into(binding.content.mini.miniPlayerImage) + binding.content.mini.miniPlayPause.setImageResource(R.drawable.ic_pause_24) + binding.content.mini.miniPlayer.visibility = View.VISIBLE } else { - mini.visibility = View.GONE + binding.content.mini.miniPlayer.visibility = View.GONE } } @@ -379,24 +375,25 @@ class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelecte private fun setSideData() { if (ManagerSingleton.user.status == 1) { - nav_view.menu.findItem(R.id.ml).isVisible = true + binding.navView.menu.findItem(R.id.ml).isVisible = true - 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) + val headerView = binding.navView.getHeaderView(0) + headerView.findViewById(R.id.side_usernameTxt).text = ManagerSingleton.user.username + headerView.findViewById(R.id.side_emailTxt).text = ManagerSingleton.user.email + if (ManagerSingleton.user.avatar != "" && headerView.findViewById(R.id.side_imageView) != null) { + Picasso.get().load("https://" + ManagerSingleton.url + ManagerSingleton.user.avatar).into(headerView.findViewById(R.id.side_imageView)) } - side_imageView?.setOnClickListener { + headerView.findViewById(R.id.side_imageView).setOnClickListener { pagination = 0 getMyVideos() - drawer_layout.closeDrawer(GravityCompat.START) + binding.drawerLayout.closeDrawer(GravityCompat.START) } if (::myMenu.isInitialized) { myMenu.findItem(R.id.action_login).isVisible = false myMenu.findItem(R.id.action_logout).isVisible = true } } else { - nav_view.menu.findItem(R.id.ml).isVisible = false + binding.navView.menu.findItem(R.id.ml).isVisible = false } } @@ -405,11 +402,12 @@ class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelecte myMenu.findItem(R.id.action_login).isVisible = true myMenu.findItem(R.id.action_logout).isVisible = false } - // nav_view.menu.findItem(R.id.ml).isVisible = false - side_usernameTxt?.text = getString(R.string.nav_header_title) - side_emailTxt?.text = getString(R.string.nav_header_subtitle) + " " + this.packageManager.getPackageInfo(this.packageName, 0).versionName - side_imageView?.setImageResource(R.drawable.default_avatar) - side_imageView?.setOnClickListener { } + val headerView = binding.navView.getHeaderView(0) + binding.navView.menu.findItem(R.id.ml).isVisible = false + headerView.findViewById(R.id.side_usernameTxt).text = getString(R.string.nav_header_title) + headerView.findViewById(R.id.side_emailTxt).text = getString(R.string.nav_header_subtitle) + " " + this.packageManager.getPackageInfo(this.packageName, 0).versionName + headerView.findViewById(R.id.side_imageView).setImageResource(R.drawable.default_avatar) + headerView.findViewById(R.id.side_imageView).setOnClickListener { } db.logout() ManagerSingleton.logout() @@ -419,7 +417,7 @@ class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelecte } private fun loadMore() { - swipeContainer.isRefreshing = true + binding.content.swipeContainer.isRefreshing = true this.pagination += ManagerSingleton.videosCount when (section) { @@ -441,7 +439,7 @@ class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelecte } private fun searchVideos() { - swipeContainer.isRefreshing = true + binding.content.swipeContainer.isRefreshing = true section = "search" this.title = this.searchVal AsyncTask.execute { @@ -462,10 +460,10 @@ class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelecte PlaybackSingleton.player?.let { if (it.isPlaying) { it.pause() - mini_play_pause.setImageResource(R.drawable.ic_play_arrow_24) + binding.content.mini.miniPlayPause.setImageResource(R.drawable.ic_play_arrow_24) } else { it.play() - mini_play_pause.setImageResource(R.drawable.ic_pause_24) + binding.content.mini.miniPlayPause.setImageResource(R.drawable.ic_pause_24) } } } 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 73e2569..f696c03 100644 --- a/app/src/main/java/org/libre/agosto/p2play/RegisterActivity.kt +++ b/app/src/main/java/org/libre/agosto/p2play/RegisterActivity.kt @@ -7,8 +7,8 @@ import android.os.Looper import android.util.Log import androidx.appcompat.app.AppCompatActivity import androidx.preference.PreferenceManager -import kotlinx.android.synthetic.main.activity_register.* import org.libre.agosto.p2play.ajax.Auth +import org.libre.agosto.p2play.databinding.ActivityRegisterBinding class RegisterActivity : AppCompatActivity() { private val auth = Auth() @@ -16,23 +16,27 @@ class RegisterActivity : AppCompatActivity() { lateinit var clientId: String lateinit var clientSecret: String + private lateinit var binding: ActivityRegisterBinding + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - setContentView(R.layout.activity_register) + binding = ActivityRegisterBinding.inflate(layoutInflater) + val view = binding.root + setContentView(view) setTitle(R.string.registerActionBtn) settings = PreferenceManager.getDefaultSharedPreferences(this) clientId = settings.getString("client_id", "")!! clientSecret = settings.getString("client_secret", "")!! - registerBtn.setOnClickListener { registerUser() } + binding.registerBtn.setOnClickListener { registerUser() } } private fun registerUser() { - registerBtn.isEnabled = false - val username = userText2.text.toString() - val password = passwordText2.text.toString() - val email = emailText.text.toString() + binding.registerBtn.isEnabled = false + val username = binding.userText2.text.toString() + val password = binding.passwordText2.text.toString() + val email = binding.emailText.text.toString() AsyncTask.execute { if (Looper.myLooper() == null) { Looper.prepare() @@ -49,7 +53,7 @@ class RegisterActivity : AppCompatActivity() { 0 -> ManagerSingleton.toast(getString(R.string.registerFailed_msg), this) -1 -> ManagerSingleton.toast(getString(R.string.registerError_msg), this) } - registerBtn.isEnabled = true + binding.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 fe71c0c..cecc487 100644 --- a/app/src/main/java/org/libre/agosto/p2play/ReproductorActivity.kt +++ b/app/src/main/java/org/libre/agosto/p2play/ReproductorActivity.kt @@ -15,35 +15,28 @@ import android.webkit.WebChromeClient import android.widget.EditText import android.widget.FrameLayout import android.widget.ImageView +import android.widget.LinearLayout import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AppCompatActivity import androidx.core.content.ContextCompat import androidx.media3.common.MediaItem import androidx.media3.common.MediaMetadata import androidx.media3.common.Player -import androidx.media3.exoplayer.DefaultLoadControl import androidx.media3.exoplayer.ExoPlayer -import androidx.media3.exoplayer.upstream.DefaultAllocator import androidx.media3.session.MediaController import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import com.squareup.picasso.Picasso -import kotlinx.android.synthetic.main.activity_reproductor.* -import kotlinx.android.synthetic.main.comment_component.commentaryBtn -import kotlinx.android.synthetic.main.comment_component.commentaryLayout -import kotlinx.android.synthetic.main.comment_component.commentaryText -import kotlinx.android.synthetic.main.comment_component.userImgCom -import kotlinx.android.synthetic.main.custom_player_controls.view.exo_controls import org.libre.agosto.p2play.adapters.CommentariesAdapter import org.libre.agosto.p2play.ajax.Actions import org.libre.agosto.p2play.ajax.Comments import org.libre.agosto.p2play.ajax.Videos +import org.libre.agosto.p2play.databinding.ActivityReproductorBinding import org.libre.agosto.p2play.helpers.setFullscreen import org.libre.agosto.p2play.models.CommentaryModel import org.libre.agosto.p2play.models.VideoModel import org.libre.agosto.p2play.singletons.PlaybackSingleton -@Suppress("NAME_SHADOWING") class ReproductorActivity : AppCompatActivity() { private val clientVideo: Videos = Videos() lateinit var video: VideoModel @@ -68,14 +61,19 @@ class ReproductorActivity : AppCompatActivity() { // Resume info private var isResume = false + private lateinit var binding: ActivityReproductorBinding + @SuppressLint("SetJavaScriptEnabled", "SetTextI18n") override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - setContentView(R.layout.activity_reproductor) + binding = ActivityReproductorBinding.inflate(layoutInflater) + val view = binding.root + setContentView(view) - val fullscreenButton: ImageView = exoPlayer.findViewById(R.id.exo_fullscreen_custom) - val fullscreenButton2 = fullscreenPlayer.findViewById(R.id.exo_fullscreen_custom) + val fullscreenButton = binding.exoPlayer.findViewById(R.id.exo_fullscreen_custom) + val fullscreenButton2 = binding.fullscreenPlayer.findViewById(R.id.exo_fullscreen_custom) + val videoView = binding.videoView videoView.webChromeClient = WebClient() videoView.settings.javaScriptEnabled = true videoView.settings.allowContentAccess = true @@ -95,19 +93,19 @@ class ReproductorActivity : AppCompatActivity() { isResume = true } - tittleVideoTxt.text = this.video.name - viewsTxt.text = "${this.video.views} ${getString(R.string.view_text)}" - userTxt.text = this.video.username - descriptionVideoTxt.text = this.video.description + binding.tittleVideoTxt.text = this.video.name + binding.viewsTxt.text = "${this.video.views} ${getString(R.string.view_text)}" + binding.userTxt.text = this.video.username + binding.descriptionVideoTxt.text = this.video.description val haveDescription = this.video.description.endsWith("...") if (haveDescription) { - showMoreBtn.visibility = View.VISIBLE + binding.showMoreBtn.visibility = View.VISIBLE } - hostTxt.text = this.video.userHost + binding.hostTxt.text = this.video.userHost // Check if user had profile image if (this.video.userImageUrl != "") { - Picasso.get().load("https://" + ManagerSingleton.url + this.video.userImageUrl).into(userImg) + Picasso.get().load("https://" + ManagerSingleton.url + this.video.userImageUrl).into(binding.userImg) } // Load the video videoView.loadUrl("https://" + ManagerSingleton.url + this.video.embedUrl) @@ -120,17 +118,17 @@ class ReproductorActivity : AppCompatActivity() { this.getComments() - subscribeBtn.setOnClickListener { subscribe() } - likeLayout.setOnClickListener { rate("like") } - dislikeLayout.setOnClickListener { rate("dislike") } - commentaryBtn.setOnClickListener { makeComment() } - showMoreBtn.setOnClickListener { getDescription() } - shareLayout.setOnClickListener { shareIntent() } - reportLayout.setOnClickListener { reportIntent() } + binding.subscribeBtn.setOnClickListener { subscribe() } + binding.likeLayout.setOnClickListener { rate("like") } + binding.dislikeLayout.setOnClickListener { rate("dislike") } + binding.commentBox.commentaryBtn.setOnClickListener { makeComment() } + binding.showMoreBtn.setOnClickListener { getDescription() } + binding.shareLayout.setOnClickListener { shareIntent() } + binding.reportLayout.setOnClickListener { reportIntent() } fullscreenButton.setOnClickListener { toggleFullscreen() } fullscreenButton2.setOnClickListener { toggleFullscreen() } - userImg.setOnClickListener { + binding.userImg.setOnClickListener { val intent = Intent(this, ChannelActivity::class.java) intent.putExtra("channel", video.getChannel()) startActivity(intent) @@ -139,35 +137,38 @@ class ReproductorActivity : AppCompatActivity() { AsyncTask.execute { videoPlayback = this.clientVideo.getVideo(this.video.uuid) // TODO: Make this configurable - val bufferSize = 1024 * 1024 // 1mb - val allocator = DefaultAllocator(true, bufferSize) - val loadControl = DefaultLoadControl.Builder() - .setAllocator(allocator) - .build() + // val bufferSize = 1024 * 1024 // 1mb + // val allocator = DefaultAllocator(true, bufferSize) + // val loadControl = DefaultLoadControl.Builder() + // .setAllocator(allocator) + // .build() runOnUiThread { try { if (PlaybackSingleton.player == null || !PlaybackSingleton.player!!.playWhenReady) { - PlaybackSingleton.player = ExoPlayer.Builder(this.baseContext) - .setSeekBackIncrementMs(10000) - .setSeekForwardIncrementMs(10000) - .setLoadControl(loadControl).build() + PlaybackSingleton.player = ExoPlayer.Builder(this) + //.setSeekBackIncrementMs(10000) + //.setSeekForwardIncrementMs(10000) + //.setLoadControl(loadControl) + .build() } player = PlaybackSingleton.player!! - exoPlayer.player = player + binding.exoPlayer.player = player + binding.exoPlayer player.addListener( object : Player.Listener { override fun onPlaybackStateChanged(playbackState: Int) { super.onPlaybackStateChanged(playbackState) + val controls = binding.exoPlayer.findViewById(R.id.exo_center_controls) if (playbackState == Player.STATE_BUFFERING || playbackState == Player.STATE_IDLE) { - exoPlayer.exo_controls.visibility = View.INVISIBLE - } else if (playbackState == Player.STATE_READY) { - exoPlayer.exo_controls.visibility = View.VISIBLE - } - } - } + controls.visibility = View.INVISIBLE + } else if (playbackState == Player.STATE_READY) { + controls.visibility = View.VISIBLE + } + } + } ) println("----- video --------") @@ -186,6 +187,7 @@ class ReproductorActivity : AppCompatActivity() { PlaybackSingleton.setData(mediaItem, video) } // Start the playback. + // TODO: Setting for autoplay // player.play() } catch (err: Exception) { err.printStackTrace() @@ -234,11 +236,11 @@ class ReproductorActivity : AppCompatActivity() { runOnUiThread { ManagerSingleton.toast(getString(R.string.rateMsg), this) if (rate == "like") { - textViewLike.setTextColor(ContextCompat.getColor(this, R.color.colorLike)) - textViewDislike.setTextColor(ContextCompat.getColor(this, R.color.primary_dark_material_light)) + binding.textViewLike.setTextColor(ContextCompat.getColor(this, R.color.colorLike)) + binding.textViewDislike.setTextColor(ContextCompat.getColor(this, R.color.primary_dark_material_light)) } else if (rate == "dislike") { - textViewDislike.setTextColor(ContextCompat.getColor(this, R.color.colorDislike)) - textViewLike.setTextColor(ContextCompat.getColor(this, R.color.primary_dark_material_light)) + binding.textViewDislike.setTextColor(ContextCompat.getColor(this, R.color.colorDislike)) + binding.textViewLike.setTextColor(ContextCompat.getColor(this, R.color.primary_dark_material_light)) } } } @@ -254,16 +256,16 @@ class ReproductorActivity : AppCompatActivity() { runOnUiThread { when (rate) { "like" -> { - textViewLike.setTextColor(ContextCompat.getColor(this, R.color.colorLike)) - textViewDislike.setTextColor(ContextCompat.getColor(this, R.color.primary_dark_material_light)) + binding.textViewLike.setTextColor(ContextCompat.getColor(this, R.color.colorLike)) + binding.textViewDislike.setTextColor(ContextCompat.getColor(this, R.color.primary_dark_material_light)) } "dislike" -> { - textViewDislike.setTextColor(ContextCompat.getColor(this, R.color.colorDislike)) - textViewLike.setTextColor(ContextCompat.getColor(this, R.color.primary_dark_material_light)) + binding.textViewDislike.setTextColor(ContextCompat.getColor(this, R.color.colorDislike)) + binding.textViewLike.setTextColor(ContextCompat.getColor(this, R.color.primary_dark_material_light)) } else -> { - textViewLike.setTextColor(ContextCompat.getColor(this, R.color.primary_dark_material_light)) - textViewDislike.setTextColor(ContextCompat.getColor(this, R.color.primary_dark_material_light)) + binding.textViewLike.setTextColor(ContextCompat.getColor(this, R.color.primary_dark_material_light)) + binding.textViewDislike.setTextColor(ContextCompat.getColor(this, R.color.primary_dark_material_light)) } } } @@ -285,11 +287,11 @@ class ReproductorActivity : AppCompatActivity() { private fun changeSubscribeBtn(subscribed: Boolean) { if (subscribed) { - subscribeBtn.text = getText(R.string.unSubscribeBtn) - subscribeBtn.setOnClickListener { this.unSubscribe() } + binding.subscribeBtn.text = getText(R.string.unSubscribeBtn) + binding.subscribeBtn.setOnClickListener { this.unSubscribe() } } else { - subscribeBtn.text = getText(R.string.subscribeBtn) - subscribeBtn.setOnClickListener { this.subscribe() } + binding.subscribeBtn.text = getText(R.string.subscribeBtn) + binding.subscribeBtn.setOnClickListener { this.subscribe() } } } @@ -320,17 +322,17 @@ class ReproductorActivity : AppCompatActivity() { } private fun makeComment() { - if (commentaryText.text.toString() == "") { + if (binding.commentBox.commentaryText.text.toString() == "") { ManagerSingleton.toast(getString(R.string.emptyCommentaryMsg), this) return } - val text = commentaryText.text.toString() + val text = binding.commentBox.commentaryText.text.toString() AsyncTask.execute { val res = this.client.makeCommentary(ManagerSingleton.token.token, this.video.id, text) runOnUiThread { if (res) { ManagerSingleton.toast(getString(R.string.makedCommentaryMsg), this) - commentaryText.text?.clear() + binding.commentBox.commentaryText.text?.clear() this.getComments() } else { ManagerSingleton.toast(getString(R.string.errorCommentaryMsg), this) @@ -344,14 +346,14 @@ class ReproductorActivity : AppCompatActivity() { if (ManagerSingleton.user.status == 1) { this.getRate() this.getSubscription() - actionsLayout.visibility = View.VISIBLE - subscribeBtn.visibility = View.VISIBLE - commentaryLayout.visibility = View.VISIBLE + binding.actionsLayout.visibility = View.VISIBLE + binding.subscribeBtn.visibility = View.VISIBLE + binding.commentBox.commentaryLayout.visibility = View.VISIBLE if (ManagerSingleton.user.avatar != "") { - Picasso.get().load("https://" + ManagerSingleton.url + ManagerSingleton.user.avatar).into(userImgCom) + Picasso.get().load("https://" + ManagerSingleton.url + ManagerSingleton.user.avatar).into(binding.commentBox.userImgCom) } } else { - commentaryLayout.visibility = View.GONE + binding.commentBox.commentaryLayout.visibility = View.GONE } } @@ -359,8 +361,8 @@ class ReproductorActivity : AppCompatActivity() { AsyncTask.execute { val fullDescription = this.videos.fullDescription(this.video.id) runOnUiThread { - descriptionVideoTxt.text = fullDescription - showMoreBtn.visibility = View.GONE + binding.descriptionVideoTxt.text = fullDescription + binding.showMoreBtn.visibility = View.GONE } } } @@ -413,10 +415,10 @@ class ReproductorActivity : AppCompatActivity() { private fun toggleFullscreen() { if (isFullscreen) { - nonFullScreen.visibility = View.VISIBLE - fullScreenExo.visibility = View.GONE - exoPlayer.player = player - fullscreenPlayer.player = null + binding.nonFullScreen.visibility = View.VISIBLE + binding.fullScreenExo.visibility = View.GONE + binding.exoPlayer.player = player + binding.fullscreenPlayer.player = null requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED val attrs = window.attributes @@ -429,11 +431,11 @@ class ReproductorActivity : AppCompatActivity() { } else { val matchParent = WindowManager.LayoutParams.MATCH_PARENT - nonFullScreen.visibility = View.GONE - fullScreenExo.visibility = View.VISIBLE + binding.nonFullScreen.visibility = View.GONE + binding.fullScreenExo.visibility = View.VISIBLE - exoPlayer.player = null - fullscreenPlayer.player = player + binding.exoPlayer.player = null + binding.fullscreenPlayer.player = player setFullscreen(window) @@ -469,9 +471,9 @@ class ReproductorActivity : AppCompatActivity() { override fun onHideCustomView() { try { - this@ReproductorActivity.nonFullScreen.visibility = View.VISIBLE - this@ReproductorActivity.fullScreen.visibility = View.GONE - this@ReproductorActivity.fullScreen.removeView(this.mCustomView) + this@ReproductorActivity.binding.nonFullScreen.visibility = View.VISIBLE + this@ReproductorActivity.binding.fullScreen.visibility = View.GONE + this@ReproductorActivity.binding.fullScreen.removeView(this.mCustomView) this.mCustomView = null this.mCustomViewCallback!!.onCustomViewHidden() @@ -502,10 +504,10 @@ class ReproductorActivity : AppCompatActivity() { this.mCustomViewCallback = paramCustomViewCallback val matchParent = WindowManager.LayoutParams.MATCH_PARENT - this@ReproductorActivity.nonFullScreen.visibility = View.GONE - this@ReproductorActivity.fullScreen.visibility = View.VISIBLE + this@ReproductorActivity.binding.nonFullScreen.visibility = View.GONE + this@ReproductorActivity.binding.fullScreen.visibility = View.VISIBLE - this@ReproductorActivity.fullScreen.addView(paramView, FrameLayout.LayoutParams(matchParent, matchParent)) + this@ReproductorActivity.binding.fullScreen.addView(paramView, FrameLayout.LayoutParams(matchParent, matchParent)) setFullscreen(this@ReproductorActivity.window) diff --git a/app/src/main/java/org/libre/agosto/p2play/SettingsActivity.kt b/app/src/main/java/org/libre/agosto/p2play/SettingsActivity.kt deleted file mode 100644 index 246e574..0000000 --- a/app/src/main/java/org/libre/agosto/p2play/SettingsActivity.kt +++ /dev/null @@ -1,159 +0,0 @@ -package org.libre.agosto.p2play - -import android.annotation.TargetApi -import android.content.Context -import android.content.Intent -import android.content.res.Configuration -import android.os.Build -import android.os.Bundle -import android.preference.ListPreference -import android.preference.Preference -import android.preference.PreferenceActivity -import android.preference.PreferenceFragment -import android.preference.PreferenceManager -import android.view.MenuItem - -/** - * A [PreferenceActivity] that presents a set of application settings. On - * handset devices, settings are presented as a single list. On tablets, - * settings are split by category, with category headers shown to the left of - * the list of settings. - * - * See [Android Design: Settings](http://developer.android.com/design/patterns/settings.html) - * for design guidelines and the [Settings API Guide](http://developer.android.com/guide/topics/ui/settings.html) - * for more information on developing a Settings UI. - */ -class SettingsActivity : AppCompatPreferenceActivity() { - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setupActionBar() - } - - override fun onBackPressed() { - super.onBackPressed() - ManagerSingleton.toast(getString(R.string.pref_message_exit), this) - } - - /** - * Set up the [android.app.ActionBar], if the API is available. - */ - private fun setupActionBar() { - supportActionBar?.setDisplayHomeAsUpEnabled(false) - } - - /** - * {@inheritDoc} - */ - override fun onIsMultiPane(): Boolean { - return isXLargeTablet(this) - } - - /** - * {@inheritDoc} - */ - @TargetApi(Build.VERSION_CODES.HONEYCOMB) - override fun onBuildHeaders(target: List) { - loadHeadersFromResource(R.xml.pref_headers, target) - } - - /** - * This method stops fragment injection in malicious applications. - * Make sure to deny any unknown fragments here. - */ - override fun isValidFragment(fragmentName: String): Boolean { - return PreferenceFragment::class.java.name == fragmentName || - GeneralPreferenceFragment::class.java.name == fragmentName - } - - /** - * This fragment shows general preferences only. It is used when the - * activity is showing a two-pane settings UI. - */ - @TargetApi(Build.VERSION_CODES.HONEYCOMB) - class GeneralPreferenceFragment : PreferenceFragment() { - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - addPreferencesFromResource(R.xml.pref_general) - setHasOptionsMenu(true) - - // Bind the summaries of EditText/List/Dialog/Ringtone preferences - // to their values. When their values change, their summaries are - // updated to reflect the new value, per the Android Design - // guidelines. - bindPreferenceSummaryToValue(findPreference("hostP2play")) - } - - override fun onOptionsItemSelected(item: MenuItem): Boolean { - val id = item.itemId - if (id == android.R.id.home) { - startActivity(Intent(activity, SettingsActivity::class.java)) - return true - } - return super.onOptionsItemSelected(item) - } - } - - companion object { - - /** - * A preference value change listener that updates the preference's summary - * to reflect its new value. - */ - private val sBindPreferenceSummaryToValueListener = Preference.OnPreferenceChangeListener { preference, value -> - val stringValue = value.toString() - - if (preference is ListPreference) { - // For list preferences, look up the correct display value in - // the preference's 'entries' list. - val listPreference = preference - val index = listPreference.findIndexOfValue(stringValue) - - // Set the summary to reflect the new value. - preference.setSummary( - if (index >= 0) { - listPreference.entries[index] - } else { - null - }, - ) - } else { - // For all other preferences, set the summary to the value's - // simple string representation. - preference.summary = stringValue - } - true - } - - /** - * Helper method to determine if the device has an extra-large screen. For - * example, 10" tablets are extra-large. - */ - private fun isXLargeTablet(context: Context): Boolean { - return context.resources.configuration.screenLayout and Configuration.SCREENLAYOUT_SIZE_MASK >= Configuration.SCREENLAYOUT_SIZE_XLARGE - } - - /** - * Binds a preference's summary to its value. More specifically, when the - * preference's value is changed, its summary (line of text below the - * preference title) is updated to reflect the value. The summary is also - * immediately updated upon calling this method. The exact display format is - * dependent on the type of preference. - - * @see .sBindPreferenceSummaryToValueListener - */ - private fun bindPreferenceSummaryToValue(preference: Preference) { - // Set the listener to watch for value changes. - preference.onPreferenceChangeListener = sBindPreferenceSummaryToValueListener - - // Trigger the listener immediately with the preference's - // current value. - sBindPreferenceSummaryToValueListener.onPreferenceChange( - preference, - PreferenceManager - .getDefaultSharedPreferences(preference.context) - .getString(preference.key, ""), - ) - } - } -} diff --git a/app/src/main/java/org/libre/agosto/p2play/dialogs/ThreadDialog.kt b/app/src/main/java/org/libre/agosto/p2play/dialogs/ThreadDialog.kt index 04011ce..2643ca8 100644 --- a/app/src/main/java/org/libre/agosto/p2play/dialogs/ThreadDialog.kt +++ b/app/src/main/java/org/libre/agosto/p2play/dialogs/ThreadDialog.kt @@ -12,22 +12,11 @@ import androidx.fragment.app.FragmentManager import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import com.squareup.picasso.Picasso -import kotlinx.android.synthetic.main.comment_component.commentaryLayout -import kotlinx.android.synthetic.main.comment_component.commentaryText -import kotlinx.android.synthetic.main.comment_component.userImgCom -import kotlinx.android.synthetic.main.comment_component.view.commentaryBtn -import kotlinx.android.synthetic.main.comment_component.view.commentaryLayout -import kotlinx.android.synthetic.main.comment_component.view.commentaryText -import kotlinx.android.synthetic.main.comment_component.view.userImgCom -import kotlinx.android.synthetic.main.dialog_thread.view.materialToolbar -import kotlinx.android.synthetic.main.view_commentary.view.replyBtn -import kotlinx.android.synthetic.main.view_commentary.view.userCommentImg -import kotlinx.android.synthetic.main.view_commentary.view.userCommentary -import kotlinx.android.synthetic.main.view_commentary.view.userTxt import org.libre.agosto.p2play.ManagerSingleton import org.libre.agosto.p2play.R import org.libre.agosto.p2play.adapters.CommentariesAdapter import org.libre.agosto.p2play.ajax.Comments +import org.libre.agosto.p2play.databinding.DialogThreadBinding import org.libre.agosto.p2play.models.CommentaryModel class ThreadDialog : DialogFragment() { @@ -35,6 +24,12 @@ class ThreadDialog : DialogFragment() { lateinit var fragmentManager2: FragmentManager private val client: Comments = Comments() + private var _binding: DialogThreadBinding? = null + // This property is only valid between onCreateView and +// onDestroyView. + private val binding get() = _binding!! + + // The system calls this to get the DialogFragment's layout, regardless of // whether it's being displayed as a dialog or an embedded fragment. override fun onCreateView( @@ -43,29 +38,30 @@ class ThreadDialog : DialogFragment() { savedInstanceState: Bundle?, ): View { // Inflate the layout to use as a dialog or embedded fragment. - val view = inflater.inflate(R.layout.dialog_thread, container, false) + _binding = DialogThreadBinding.inflate(inflater, container, false) + val view = binding.root comment = arguments?.getSerializable("comment") as CommentaryModel - view.userTxt.text = comment.username - view.userCommentary.text = comment.commentary - Picasso.get().load("https://${ManagerSingleton.url}${comment.userImageUrl}").into(view.userCommentImg) - view.replyBtn.visibility = View.GONE + binding.commentThread?.userTxt?.text = comment.username + binding.commentThread?.userCommentary?.text = comment.commentary + Picasso.get().load("https://${ManagerSingleton.url}${comment.userImageUrl}").into(binding.commentThread?.userCommentImg) + binding.commentThread?.replyBtn?.visibility = View.GONE if (ManagerSingleton.user.status == 1) { - view.commentaryText.setText("${comment.username}@${comment.userHost} ") + binding.commentBox?.commentaryText?.setText("${comment.nameChannel}@${comment.userHost} ") if (ManagerSingleton.user.avatar != "") { - Picasso.get().load("https://${ManagerSingleton.url}${ManagerSingleton.user.avatar}").into(view.userImgCom) + Picasso.get().load("https://${ManagerSingleton.url}${ManagerSingleton.user.avatar}").into(binding.commentBox?.userImgCom) } - view.commentaryText.requestFocus() - view.commentaryBtn.setOnClickListener { this.replyThread() } + binding.commentBox?.commentaryText?.requestFocus() + binding.commentBox?.commentaryBtn?.setOnClickListener { this.replyThread() } } else { - view.commentaryLayout.visibility = View.GONE + binding.commentBox?.commentaryLayout?.visibility = View.GONE } - view.materialToolbar.setTitle("Thread") - view.materialToolbar.setNavigationIcon(R.drawable.baseline_arrow_back_24) - view.materialToolbar.setNavigationOnClickListener { + binding.materialToolbar.setTitle("Thread") + binding.materialToolbar.setNavigationIcon(R.drawable.baseline_arrow_back_24) + binding.materialToolbar.setNavigationOnClickListener { dismiss() this.fragmentManager2.popBackStack() } @@ -109,7 +105,7 @@ class ThreadDialog : DialogFragment() { } private fun replyThread() { - val commentary = view?.commentaryText?.text.toString() + val commentary = binding.commentBox?.commentaryText?.text.toString() if (commentary == "") { ManagerSingleton.toast(getString(R.string.emptyCommentaryMsg), requireActivity()) @@ -121,7 +117,7 @@ class ThreadDialog : DialogFragment() { activity?.runOnUiThread { if (res) { ManagerSingleton.toast(getString(R.string.makedCommentaryMsg), requireActivity()) - commentaryText.text?.clear() + binding.commentBox?.commentaryText?.text?.clear() this.getComments() } else { ManagerSingleton.toast(getString(R.string.errorCommentaryMsg), requireActivity()) diff --git a/app/src/main/res/drawable/ic_fullscreen_24.xml b/app/src/main/res/drawable/ic_fullscreen_24.xml index 42323b2..076c9aa 100644 --- a/app/src/main/res/drawable/ic_fullscreen_24.xml +++ b/app/src/main/res/drawable/ic_fullscreen_24.xml @@ -1,4 +1,4 @@ - + diff --git a/app/src/main/res/layout-large/activity_reproductor.xml b/app/src/main/res/layout-large/activity_reproductor.xml index 18706e2..b3bc599 100644 --- a/app/src/main/res/layout-large/activity_reproductor.xml +++ b/app/src/main/res/layout-large/activity_reproductor.xml @@ -84,12 +84,9 @@ android:id="@+id/exoPlayer" android:layout_width="match_parent" android:layout_height="500dp" - app:auto_show="true" - app:controller_layout_id="@layout/custom_player_controls" - app:repeat_toggle_modes="none" app:show_buffering="always" - app:surface_type="surface_view" - app:use_controller="true" /> + app:use_controller="true" + app:controller_layout_id="@layout/custom_player_controls"/> - + - + + + + + + + - - - - - - - - - - - - + android:layout_height="50dp" + android:layout_gravity="bottom" + android:layout_marginTop="@dimen/exo_styled_bottom_bar_margin_top" + android:background="@color/exo_bottom_bar_background" + android:layoutDirection="ltr"> + android:id="@id/exo_time" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="center_vertical|start" + android:layoutDirection="ltr" + android:paddingStart="@dimen/exo_styled_bottom_bar_time_padding" + android:paddingLeft="@dimen/exo_styled_bottom_bar_time_padding" + android:paddingEnd="@dimen/exo_styled_bottom_bar_time_padding" + android:paddingRight="@dimen/exo_styled_bottom_bar_time_padding"> + android:id="@id/exo_position" + style="@style/ExoStyledControls.TimeText.Position" /> + style="@style/ExoStyledControls.TimeText.Separator" + android:text="/" /> + android:id="@id/exo_duration" + style="@style/ExoStyledControls.TimeText.Duration" /> - + + + + + + + + + + + + + + + + + + + + + + - - \ No newline at end of file + \ No newline at end of file diff --git a/app/src/main/res/layout-large/dialog_thread.xml b/app/src/main/res/layout-large/dialog_thread.xml index af93bd5..dc642e1 100644 --- a/app/src/main/res/layout-large/dialog_thread.xml +++ b/app/src/main/res/layout-large/dialog_thread.xml @@ -23,6 +23,7 @@ android:minHeight="?attr/actionBarSize" /> @@ -41,6 +42,7 @@ - + android:layout_height="match_parent" + tools:context=".MainActivity"> + + + + + + + + + + - - @@ -42,7 +42,7 @@ android:textAppearance="@android:style/TextAppearance.Material.Medium.Inverse" android:textColor="@android:color/black" /> - @@ -99,4 +99,4 @@ - \ No newline at end of file + \ 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 index 52c161b..e3c5017 100644 --- a/app/src/main/res/layout/activity_reproductor.xml +++ b/app/src/main/res/layout/activity_reproductor.xml @@ -74,12 +74,9 @@ android:id="@+id/exoPlayer" android:layout_width="match_parent" android:layout_height="205dp" - app:auto_show="true" app:show_buffering="always" - app:controller_layout_id="@layout/custom_player_controls" - app:surface_type="surface_view" app:use_controller="true" - app:repeat_toggle_modes="none"/> + app:controller_layout_id="@layout/custom_player_controls" /> - + - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/custom_player_controls.xml b/app/src/main/res/layout/custom_player_controls.xml index 85fd4e1..7afed01 100644 --- a/app/src/main/res/layout/custom_player_controls.xml +++ b/app/src/main/res/layout/custom_player_controls.xml @@ -1,107 +1,113 @@ - + + + + + + + - - - - - - - - - - - - + android:layout_height="50dp" + android:layout_gravity="bottom" + android:layout_marginTop="@dimen/exo_styled_bottom_bar_margin_top" + android:background="@color/exo_bottom_bar_background" + android:layoutDirection="ltr"> + android:id="@id/exo_time" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="center_vertical|start" + android:layoutDirection="ltr" + android:paddingStart="@dimen/exo_styled_bottom_bar_time_padding" + android:paddingLeft="@dimen/exo_styled_bottom_bar_time_padding" + android:paddingEnd="@dimen/exo_styled_bottom_bar_time_padding" + android:paddingRight="@dimen/exo_styled_bottom_bar_time_padding"> + android:id="@id/exo_position" + style="@style/ExoStyledControls.TimeText.Position" /> + style="@style/ExoStyledControls.TimeText.Separator" + android:text="/" /> + android:id="@id/exo_duration" + style="@style/ExoStyledControls.TimeText.Duration" /> - + + + + + + + + + + + + + + + + + + + + + + - - \ No newline at end of file + \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_thread.xml b/app/src/main/res/layout/dialog_thread.xml index bd5c913..95fc828 100644 --- a/app/src/main/res/layout/dialog_thread.xml +++ b/app/src/main/res/layout/dialog_thread.xml @@ -1,7 +1,6 @@ @@ -24,6 +23,7 @@ android:minHeight="?attr/actionBarSize" /> @@ -42,6 +42,7 @@ - - - - - - - - - - diff --git a/app/src/main/res/xml/pref_headers.xml b/app/src/main/res/xml/pref_headers.xml deleted file mode 100644 index 12803d9..0000000 --- a/app/src/main/res/xml/pref_headers.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - -
- - - - diff --git a/build.gradle b/build.gradle index 9967f71..3d6ea4f 100644 --- a/build.gradle +++ b/build.gradle @@ -1,7 +1,7 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { - ext.kotlin_version = '1.6.21' + ext.kotlin_version = '1.9.20' repositories { google() mavenCentral()