mirror of
https://github.com/jellyfin/jellyfin-android.git
synced 2026-10-26 16:45:26 +00:00
149 lines
5.4 KiB
Kotlin
149 lines
5.4 KiB
Kotlin
package org.jellyfin.mobile
|
|
|
|
import android.app.Service
|
|
import android.content.ComponentName
|
|
import android.content.Intent
|
|
import android.content.ServiceConnection
|
|
import android.os.Build
|
|
import android.os.Bundle
|
|
import android.os.IBinder
|
|
import android.provider.Settings
|
|
import android.view.OrientationEventListener
|
|
import android.widget.Toast
|
|
import androidx.appcompat.app.AlertDialog
|
|
import androidx.appcompat.app.AppCompatActivity
|
|
import androidx.lifecycle.lifecycleScope
|
|
import org.jellyfin.mobile.player.cast.Chromecast
|
|
import org.jellyfin.mobile.player.cast.IChromecast
|
|
import org.jellyfin.mobile.setup.ConnectFragment
|
|
import org.jellyfin.mobile.webapp.WebViewFragment
|
|
import org.jellyfin.mobile.player.ui.PlayerFragment
|
|
import org.jellyfin.mobile.utils.Constants
|
|
import org.jellyfin.mobile.utils.PermissionRequestHelper
|
|
import org.jellyfin.mobile.utils.SmartOrientationListener
|
|
import org.jellyfin.mobile.utils.isWebViewSupported
|
|
import org.jellyfin.mobile.utils.extensions.replaceFragment
|
|
import org.jellyfin.mobile.webapp.RemotePlayerService
|
|
import org.koin.android.ext.android.inject
|
|
import org.koin.androidx.fragment.android.setupKoinFragmentFactory
|
|
import org.koin.androidx.viewmodel.ext.android.viewModel
|
|
|
|
class MainActivity : AppCompatActivity() {
|
|
private val mainViewModel: MainViewModel by viewModel()
|
|
val chromecast: IChromecast = Chromecast()
|
|
private val permissionRequestHelper: PermissionRequestHelper by inject()
|
|
|
|
var serviceBinder: RemotePlayerService.ServiceBinder? = null
|
|
private set
|
|
private val serviceConnection: ServiceConnection = object : ServiceConnection {
|
|
override fun onServiceConnected(componentName: ComponentName, binder: IBinder) {
|
|
serviceBinder = binder as? RemotePlayerService.ServiceBinder
|
|
}
|
|
|
|
override fun onServiceDisconnected(componentName: ComponentName) {
|
|
serviceBinder = null
|
|
}
|
|
}
|
|
|
|
private val orientationListener: OrientationEventListener by lazy { SmartOrientationListener(this) }
|
|
|
|
override fun onCreate(savedInstanceState: Bundle?) {
|
|
setupKoinFragmentFactory()
|
|
super.onCreate(savedInstanceState)
|
|
setContentView(R.layout.activity_main)
|
|
|
|
// Bind player service
|
|
bindService(Intent(this, RemotePlayerService::class.java), serviceConnection, Service.BIND_AUTO_CREATE)
|
|
|
|
// Check WebView support
|
|
if (!isWebViewSupported()) {
|
|
AlertDialog.Builder(this).apply {
|
|
setTitle(R.string.dialog_web_view_not_supported)
|
|
setMessage(R.string.dialog_web_view_not_supported_message)
|
|
setCancelable(false)
|
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
|
|
setNeutralButton(R.string.dialog_button_open_settings) { _, _ ->
|
|
startActivity(Intent(Settings.ACTION_WEBVIEW_SETTINGS))
|
|
Toast.makeText(context, R.string.toast_reopen_after_change, Toast.LENGTH_LONG).show()
|
|
finishAfterTransition()
|
|
}
|
|
}
|
|
setNegativeButton(R.string.dialog_button_close_app) { _, _ ->
|
|
finishAfterTransition()
|
|
}
|
|
}.show()
|
|
return
|
|
}
|
|
|
|
// Load UI
|
|
lifecycleScope.launchWhenStarted {
|
|
mainViewModel.serverState.collect { state ->
|
|
with(supportFragmentManager) {
|
|
when (state) {
|
|
ServerState.Pending -> {
|
|
// TODO add loading indicator
|
|
}
|
|
is ServerState.Unset -> replaceFragment<ConnectFragment>()
|
|
is ServerState.Available -> {
|
|
val currentFragment = findFragmentById(R.id.fragment_container)
|
|
if (currentFragment !is WebViewFragment || currentFragment.server != state.server) {
|
|
replaceFragment<WebViewFragment>(Bundle().apply {
|
|
putParcelable(Constants.FRAGMENT_WEB_VIEW_EXTRA_SERVER, state.server)
|
|
})
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// Setup Chromecast
|
|
chromecast.initializePlugin(this)
|
|
}
|
|
|
|
override fun onStart() {
|
|
super.onStart()
|
|
orientationListener.enable()
|
|
}
|
|
|
|
override fun onRequestPermissionsResult(
|
|
requestCode: Int,
|
|
permissions: Array<out String>,
|
|
grantResults: IntArray
|
|
) {
|
|
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
|
|
|
|
permissionRequestHelper.handleRequestPermissionsResult(requestCode, permissions, grantResults)
|
|
}
|
|
|
|
override fun onSupportNavigateUp(): Boolean {
|
|
onBackPressed()
|
|
return true
|
|
}
|
|
|
|
override fun onUserLeaveHint() {
|
|
for (fragment in supportFragmentManager.fragments) {
|
|
if (fragment is PlayerFragment && fragment.isVisible) {
|
|
fragment.onUserLeaveHint()
|
|
}
|
|
}
|
|
}
|
|
|
|
override fun onStop() {
|
|
super.onStop()
|
|
orientationListener.disable()
|
|
}
|
|
|
|
override fun onBackPressed() {
|
|
if (supportFragmentManager.backStackEntryCount > 0) {
|
|
supportFragmentManager.popBackStack()
|
|
} else super.onBackPressed()
|
|
}
|
|
|
|
override fun onDestroy() {
|
|
unbindService(serviceConnection)
|
|
chromecast.destroy()
|
|
super.onDestroy()
|
|
}
|
|
}
|