Move servers check to Activity (#136)

Remove MainViewModel
Change startDestination when no servers are found
This commit is contained in:
Jarne Demeulemeester 2022-07-25 13:44:15 +02:00 committed by GitHub
parent ba584473dd
commit cc0ab920fd
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 26 additions and 78 deletions

View file

@ -114,7 +114,6 @@ private fun ImageView.loadImage(url: String, @DrawableRes errorPlaceHolderId: In
.placeholder(R.color.neutral_800) .placeholder(R.color.neutral_800)
.error(errorPlaceHolderId) .error(errorPlaceHolderId)
.into(this) .into(this)
.view
return this return this
} }

View file

@ -2,30 +2,25 @@ package dev.jdtech.jellyfin
import android.os.Bundle import android.os.Bundle
import android.view.View import android.view.View
import androidx.activity.viewModels
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.lifecycleScope
import androidx.lifecycle.repeatOnLifecycle
import androidx.navigation.fragment.NavHostFragment import androidx.navigation.fragment.NavHostFragment
import androidx.navigation.ui.AppBarConfiguration import androidx.navigation.ui.AppBarConfiguration
import androidx.navigation.ui.NavigationUI import androidx.navigation.ui.NavigationUI
import androidx.navigation.ui.setupActionBarWithNavController import androidx.navigation.ui.setupActionBarWithNavController
import com.google.android.material.bottomnavigation.BottomNavigationView
import com.google.android.material.navigation.NavigationBarView import com.google.android.material.navigation.NavigationBarView
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import dev.jdtech.jellyfin.database.ServerDatabaseDao
import dev.jdtech.jellyfin.databinding.ActivityMainAppBinding import dev.jdtech.jellyfin.databinding.ActivityMainAppBinding
import dev.jdtech.jellyfin.fragments.HomeFragmentDirections
import dev.jdtech.jellyfin.utils.loadDownloadLocation import dev.jdtech.jellyfin.utils.loadDownloadLocation
import dev.jdtech.jellyfin.viewmodels.MainViewModel import javax.inject.Inject
import kotlinx.coroutines.launch
@AndroidEntryPoint @AndroidEntryPoint
class MainActivity : AppCompatActivity() { class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainAppBinding private lateinit var binding: ActivityMainAppBinding
private val viewModel: MainViewModel by viewModels() @Inject
lateinit var database: ServerDatabaseDao
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
installSplashScreen() installSplashScreen()
@ -44,6 +39,14 @@ class MainActivity : AppCompatActivity() {
val navController = navHostFragment.navController val navController = navHostFragment.navController
val nServers = database.getServersCount()
if (nServers < 1) {
val inflater = navController.navInflater
val graph = inflater.inflate(R.navigation.app_navigation)
graph.setStartDestination(R.id.addServerFragment)
navController.setGraph(graph, intent.extras)
}
// Passing each menu ID as a set of Ids because each // Passing each menu ID as a set of Ids because each
// menu should be considered as top level destinations. // menu should be considered as top level destinations.
val appBarConfiguration = AppBarConfiguration( val appBarConfiguration = AppBarConfiguration(
@ -66,16 +69,6 @@ class MainActivity : AppCompatActivity() {
} }
loadDownloadLocation(applicationContext) loadDownloadLocation(applicationContext)
lifecycleScope.launch {
repeatOnLifecycle(Lifecycle.State.STARTED) {
viewModel.onNavigateToAddServer(lifecycleScope) {
if (it) {
navController.navigate(HomeFragmentDirections.actionHomeFragmentToAddServerFragment())
}
}
}
}
} }
override fun onSupportNavigateUp(): Boolean { override fun onSupportNavigateUp(): Boolean {

View file

@ -1,24 +1,20 @@
package dev.jdtech.jellyfin package dev.jdtech.jellyfin
import android.os.Bundle import android.os.Bundle
import androidx.activity.viewModels
import androidx.fragment.app.FragmentActivity import androidx.fragment.app.FragmentActivity
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.lifecycleScope
import androidx.lifecycle.repeatOnLifecycle
import androidx.navigation.fragment.NavHostFragment import androidx.navigation.fragment.NavHostFragment
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import dev.jdtech.jellyfin.database.ServerDatabaseDao
import dev.jdtech.jellyfin.databinding.ActivityMainTvBinding import dev.jdtech.jellyfin.databinding.ActivityMainTvBinding
import dev.jdtech.jellyfin.tv.ui.HomeFragmentDirections
import dev.jdtech.jellyfin.utils.loadDownloadLocation import dev.jdtech.jellyfin.utils.loadDownloadLocation
import dev.jdtech.jellyfin.viewmodels.MainViewModel import javax.inject.Inject
import kotlinx.coroutines.launch
@AndroidEntryPoint @AndroidEntryPoint
internal class MainActivityTv : FragmentActivity() { internal class MainActivityTv : FragmentActivity() {
private lateinit var binding: ActivityMainTvBinding private lateinit var binding: ActivityMainTvBinding
private val viewModel: MainViewModel by viewModels() @Inject
lateinit var database: ServerDatabaseDao
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
@ -28,17 +24,14 @@ internal class MainActivityTv : FragmentActivity() {
val navHostFragment = val navHostFragment =
supportFragmentManager.findFragmentById(R.id.tv_nav_host) as NavHostFragment supportFragmentManager.findFragmentById(R.id.tv_nav_host) as NavHostFragment
val navController = navHostFragment.navController val navController = navHostFragment.navController
val nServers = database.getServersCount()
if (nServers < 1) {
val inflater = navController.navInflater
val graph = inflater.inflate(R.navigation.tv_navigation)
graph.setStartDestination(R.id.addServerTvFragment)
navController.setGraph(graph, intent.extras)
}
loadDownloadLocation(applicationContext) loadDownloadLocation(applicationContext)
lifecycleScope.launch {
repeatOnLifecycle(Lifecycle.State.STARTED) {
viewModel.onNavigateToAddServer(lifecycleScope) {
if (it) {
navController.navigate(HomeFragmentDirections.actionHomeFragmentToAddServerFragment())
}
}
}
}
} }
} }

View file

@ -23,6 +23,9 @@ interface ServerDatabaseDao {
@Query("select * from servers") @Query("select * from servers")
fun getAllServersSync(): List<Server> fun getAllServersSync(): List<Server>
@Query("select count(*) from servers")
fun getServersCount(): Int
@Query("delete from servers where id = :id") @Query("delete from servers where id = :id")
fun delete(id: String) fun delete(id: String)
} }

View file

@ -1,40 +0,0 @@
package dev.jdtech.jellyfin.viewmodels
import androidx.lifecycle.LifecycleCoroutineScope
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import dagger.hilt.android.lifecycle.HiltViewModel
import dev.jdtech.jellyfin.database.Server
import dev.jdtech.jellyfin.database.ServerDatabaseDao
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.MutableSharedFlow
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import timber.log.Timber
import javax.inject.Inject
@HiltViewModel
class MainViewModel
@Inject
constructor(
private val database: ServerDatabaseDao,
) : ViewModel() {
private val navigateToAddServer = MutableSharedFlow<Boolean>()
fun onNavigateToAddServer(scope: LifecycleCoroutineScope, collector: (Boolean) -> Unit) {
scope.launch { navigateToAddServer.collect { collector(it) } }
}
init {
Timber.d("Start Main")
viewModelScope.launch {
val servers: List<Server>
withContext(Dispatchers.IO) {
servers = database.getAllServersSync()
}
if (servers.isEmpty()) {
navigateToAddServer.emit(true)
}
}
}
}