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() .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 } } }