176 lines
6.1 KiB
Kotlin
176 lines
6.1 KiB
Kotlin
package dev.jdtech.jellyfin
|
|
|
|
import android.os.Bundle
|
|
import android.os.Environment
|
|
import android.view.View
|
|
import androidx.activity.viewModels
|
|
import androidx.appcompat.app.AppCompatActivity
|
|
import androidx.lifecycle.lifecycleScope
|
|
import androidx.navigation.NavController
|
|
import androidx.navigation.NavGraph
|
|
import androidx.navigation.fragment.NavHostFragment
|
|
import androidx.navigation.ui.AppBarConfiguration
|
|
import androidx.navigation.ui.NavigationUI
|
|
import androidx.navigation.ui.NavigationUiSaveStateControl
|
|
import androidx.navigation.ui.setupActionBarWithNavController
|
|
import androidx.work.Constraints
|
|
import androidx.work.ExistingWorkPolicy
|
|
import androidx.work.NetworkType
|
|
import androidx.work.OneTimeWorkRequestBuilder
|
|
import androidx.work.WorkManager
|
|
import com.google.android.material.navigation.NavigationBarView
|
|
import dagger.hilt.android.AndroidEntryPoint
|
|
import dev.jdtech.jellyfin.database.ServerDatabaseDao
|
|
import dev.jdtech.jellyfin.databinding.ActivityMainBinding
|
|
import dev.jdtech.jellyfin.viewmodels.MainViewModel
|
|
import dev.jdtech.jellyfin.work.SyncWorker
|
|
import kotlinx.coroutines.launch
|
|
import javax.inject.Inject
|
|
import dev.jdtech.jellyfin.core.R as CoreR
|
|
|
|
@AndroidEntryPoint
|
|
class MainActivity : AppCompatActivity() {
|
|
|
|
private lateinit var binding: ActivityMainBinding
|
|
|
|
private val viewModel: MainViewModel by viewModels()
|
|
|
|
@Inject
|
|
lateinit var database: ServerDatabaseDao
|
|
|
|
@Inject
|
|
lateinit var appPreferences: AppPreferences
|
|
|
|
private lateinit var navController: NavController
|
|
|
|
@OptIn(NavigationUiSaveStateControl::class)
|
|
override fun onCreate(savedInstanceState: Bundle?) {
|
|
super.onCreate(savedInstanceState)
|
|
|
|
print("OnCreate LOOOOOL")
|
|
|
|
val syncWorkRequest = OneTimeWorkRequestBuilder<SyncWorker>()
|
|
.setConstraints(
|
|
Constraints.Builder()
|
|
.setRequiredNetworkType(
|
|
NetworkType.CONNECTED,
|
|
)
|
|
.build(),
|
|
)
|
|
.build()
|
|
|
|
val workManager = WorkManager.getInstance(applicationContext)
|
|
|
|
workManager.beginUniqueWork("syncUserData", ExistingWorkPolicy.KEEP, syncWorkRequest).enqueue()
|
|
|
|
if (!appPreferences.downloadsMigrated) {
|
|
cleanUpOldDownloads()
|
|
}
|
|
|
|
if (appPreferences.amoledTheme) {
|
|
setTheme(CoreR.style.Theme_FindroidAMOLED)
|
|
}
|
|
|
|
binding = ActivityMainBinding.inflate(layoutInflater)
|
|
|
|
setContentView(binding.root)
|
|
|
|
val navHostFragment =
|
|
supportFragmentManager.findFragmentById(R.id.nav_host_fragment_activity_main) as NavHostFragment
|
|
navController = navHostFragment.navController
|
|
val inflater = navController.navInflater
|
|
val graph = inflater.inflate(R.navigation.app_navigation)
|
|
|
|
checkServersEmpty(graph) {
|
|
navController.setGraph(graph, intent.extras)
|
|
}
|
|
checkUser(graph) {
|
|
navController.setGraph(graph, intent.extras)
|
|
}
|
|
|
|
val navView: NavigationBarView = binding.navView as NavigationBarView
|
|
|
|
if (appPreferences.offlineMode) {
|
|
navView.menu.clear()
|
|
navView.inflateMenu(CoreR.menu.bottom_nav_menu_offline)
|
|
}
|
|
|
|
setSupportActionBar(binding.mainToolbar)
|
|
|
|
// Passing each menu ID as a set of Ids because each
|
|
// menu should be considered as top level destinations.
|
|
val appBarConfiguration = AppBarConfiguration(
|
|
setOf(
|
|
R.id.homeFragment,
|
|
R.id.mediaFragment,
|
|
R.id.favoriteFragment,
|
|
R.id.downloadsFragment,
|
|
),
|
|
)
|
|
|
|
setupActionBarWithNavController(navController, appBarConfiguration)
|
|
// navView.setupWithNavController(navController)
|
|
// Don't save the state of other main navigation items, only this experimental function allows turning off this behavior
|
|
NavigationUI.setupWithNavController(navView, navController, false)
|
|
|
|
navController.addOnDestinationChangedListener { _, destination, _ ->
|
|
binding.navView.visibility = when (destination.id) {
|
|
R.id.twoPaneSettingsFragment, R.id.serverSelectFragment, R.id.addServerFragment, R.id.loginFragment, com.mikepenz.aboutlibraries.R.id.about_libraries_dest, R.id.usersFragment, R.id.serverAddressesFragment -> View.GONE
|
|
else -> View.VISIBLE
|
|
}
|
|
if (destination.id == com.mikepenz.aboutlibraries.R.id.about_libraries_dest) {
|
|
binding.mainToolbar.title =
|
|
getString(CoreR.string.app_info)
|
|
}
|
|
}
|
|
}
|
|
|
|
override fun onSupportNavigateUp(): Boolean {
|
|
return navController.navigateUp()
|
|
}
|
|
|
|
private fun checkServersEmpty(graph: NavGraph, onServersEmpty: () -> Unit = {}) {
|
|
if (!viewModel.startDestinationChanged) {
|
|
val nServers = database.getServersCount()
|
|
if (nServers < 1) {
|
|
graph.setStartDestination(R.id.addServerFragment)
|
|
viewModel.startDestinationChanged = true
|
|
onServersEmpty()
|
|
}
|
|
}
|
|
}
|
|
|
|
private fun checkUser(graph: NavGraph, onNoUser: () -> Unit = {}) {
|
|
if (!viewModel.startDestinationChanged) {
|
|
appPreferences.currentServer?.let {
|
|
val currentUser = database.getServerCurrentUser(it)
|
|
if (currentUser == null) {
|
|
graph.setStartDestination(R.id.loginFragment)
|
|
viewModel.startDestinationChanged = true
|
|
onNoUser()
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Temp to remove old downloads, will be removed in a future version
|
|
*/
|
|
private fun cleanUpOldDownloads() {
|
|
lifecycleScope.launch {
|
|
val oldDir = applicationContext.getExternalFilesDir(Environment.DIRECTORY_MOVIES)
|
|
if (oldDir == null) {
|
|
appPreferences.downloadsMigrated = true
|
|
return@launch
|
|
}
|
|
|
|
try {
|
|
for (file in oldDir.listFiles()!!) {
|
|
file.delete()
|
|
}
|
|
} catch (_: Exception) {}
|
|
|
|
appPreferences.downloadsMigrated = true
|
|
}
|
|
}
|
|
}
|