ananas/app/phone/src/main/java/dev/jdtech/jellyfin/MainActivity.kt
Jarne Demeulemeester 76121925d7
Modularize the codebase (#230)
* Split app into core and app:phone

* Use global versionCode and versionName

* Clean up gradle dependencies

* Use string formatting inside getString function

* Move proguard file to app:phone

* Move app_navigation and BasePlayerActivity to app:phone

* Add buildTypes to core gradle and remove buildFeatures

* Add suffix core to core namespace

* Split code into 4 more modules: data, preferences, player:core and player:video

* Clean up some gradle files

* Clean up data gradle

* Remove duplicate Constants.kt

* Use AppPreferences in more places

* Split off strings

* Remove unused animations

* Make about_libraries strings non-translatable

* Move mpv assets to player:video module

* Make AppPreferences a Singleton
2023-01-13 23:51:20 +01:00

117 lines
4.3 KiB
Kotlin

package dev.jdtech.jellyfin
import android.os.Bundle
import android.view.View
import androidx.activity.viewModels
import androidx.appcompat.app.AppCompatActivity
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 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.utils.loadDownloadLocation
import dev.jdtech.jellyfin.viewmodels.MainViewModel
import javax.inject.Inject
@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)
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
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.downloadFragment
)
)
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, R.id.about_libraries_dest, R.id.usersFragment, R.id.serverAddressesFragment -> View.GONE
else -> View.VISIBLE
}
if (destination.id == R.id.about_libraries_dest) binding.mainToolbar.title =
getString(R.string.app_info)
}
loadDownloadLocation(applicationContext)
}
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()
}
}
}
}
}