diff --git a/app/src/main/java/gq/kirmanak/mealient/ui/activity/MainActivity.kt b/app/src/main/java/gq/kirmanak/mealient/ui/activity/MainActivity.kt index fc97e32..9890d3f 100644 --- a/app/src/main/java/gq/kirmanak/mealient/ui/activity/MainActivity.kt +++ b/app/src/main/java/gq/kirmanak/mealient/ui/activity/MainActivity.kt @@ -8,6 +8,7 @@ import androidx.appcompat.app.AppCompatActivity import androidx.core.net.toUri import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen import androidx.core.view.isVisible +import androidx.navigation.NavController import androidx.navigation.findNavController import com.google.android.material.shape.CornerFamily import com.google.android.material.shape.MaterialShapeDrawable @@ -24,6 +25,8 @@ class MainActivity : AppCompatActivity() { private val viewModel by viewModels() private val title: String by lazy { getString(R.string.app_name) } private val uiState: MainActivityUiState get() = viewModel.uiState + private val navController: NavController + get() = findNavController(binding.navHost.id) @Inject lateinit var logger: Logger @@ -34,12 +37,25 @@ class MainActivity : AppCompatActivity() { logger.v { "onCreate() called with: savedInstanceState = $savedInstanceState" } binding = MainActivityBinding.inflate(layoutInflater) setContentView(binding.root) + configureToolbar() + configureNavGraph() + viewModel.uiStateLive.observe(this, ::onUiStateChange) + binding.navigationView.setNavigationItemSelectedListener(::onNavigationItemSelected) + } + + private fun configureNavGraph() { + val graph = navController.navInflater.inflate(R.navigation.nav_graph) + viewModel.startDestination.observe(this) { + graph.setStartDestination(it) + navController.setGraph(graph, intent.extras) + } + } + + private fun configureToolbar() { setSupportActionBar(binding.toolbar) binding.toolbar.setNavigationIcon(R.drawable.ic_toolbar) binding.toolbar.setNavigationOnClickListener { binding.drawer.open() } setToolbarRoundCorner() - viewModel.uiStateLive.observe(this, ::onUiStateChange) - binding.navigationView.setNavigationItemSelectedListener(::onNavigationItemSelected) } private fun onNavigationItemSelected(menuItem: MenuItem): Boolean { @@ -104,7 +120,7 @@ class MainActivity : AppCompatActivity() { private fun navigateDeepLink(deepLink: String) { logger.v { "navigateDeepLink() called with: deepLink = $deepLink" } - findNavController(binding.navHost.id).navigate(deepLink.toUri()) + navController.navigate(deepLink.toUri()) } companion object { diff --git a/app/src/main/java/gq/kirmanak/mealient/ui/activity/MainActivityViewModel.kt b/app/src/main/java/gq/kirmanak/mealient/ui/activity/MainActivityViewModel.kt index 0a47762..7375832 100644 --- a/app/src/main/java/gq/kirmanak/mealient/ui/activity/MainActivityViewModel.kt +++ b/app/src/main/java/gq/kirmanak/mealient/ui/activity/MainActivityViewModel.kt @@ -2,7 +2,10 @@ package gq.kirmanak.mealient.ui.activity import androidx.lifecycle.* import dagger.hilt.android.lifecycle.HiltViewModel +import gq.kirmanak.mealient.R import gq.kirmanak.mealient.data.auth.AuthRepo +import gq.kirmanak.mealient.data.baseurl.ServerInfoRepo +import gq.kirmanak.mealient.data.disclaimer.DisclaimerStorage import gq.kirmanak.mealient.logging.Logger import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach @@ -13,6 +16,8 @@ import javax.inject.Inject class MainActivityViewModel @Inject constructor( private val authRepo: AuthRepo, private val logger: Logger, + private val disclaimerStorage: DisclaimerStorage, + private val serverInfoRepo: ServerInfoRepo, ) : ViewModel() { private val _uiState = MutableLiveData(MainActivityUiState()) @@ -22,10 +27,21 @@ class MainActivityViewModel @Inject constructor( get() = checkNotNull(_uiState.value) { "UiState must not be null" } private set(value) = _uiState.postValue(value) + private val _startDestination = MutableLiveData() + val startDestination: LiveData = _startDestination + init { authRepo.isAuthorizedFlow .onEach { isAuthorized -> updateUiState { it.copy(isAuthorized = isAuthorized) } } .launchIn(viewModelScope) + + viewModelScope.launch { + _startDestination.value = when { + !disclaimerStorage.isDisclaimerAccepted() -> R.id.disclaimerFragment + serverInfoRepo.getUrl() == null -> R.id.baseURLFragment + else -> R.id.recipesFragment + } + } } fun updateUiState(updater: (MainActivityUiState) -> MainActivityUiState) { diff --git a/app/src/main/java/gq/kirmanak/mealient/ui/splash/SplashFragment.kt b/app/src/main/java/gq/kirmanak/mealient/ui/splash/SplashFragment.kt deleted file mode 100644 index b68a10f..0000000 --- a/app/src/main/java/gq/kirmanak/mealient/ui/splash/SplashFragment.kt +++ /dev/null @@ -1,41 +0,0 @@ -package gq.kirmanak.mealient.ui.splash - -import android.os.Bundle -import android.view.View -import androidx.fragment.app.Fragment -import androidx.fragment.app.viewModels -import androidx.navigation.NavDirections -import androidx.navigation.fragment.findNavController -import dagger.hilt.android.AndroidEntryPoint -import gq.kirmanak.mealient.logging.Logger -import javax.inject.Inject - -@AndroidEntryPoint -class SplashFragment : Fragment() { - - private val viewModel by viewModels() - - @Inject - lateinit var logger: Logger - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - logger.v { "onCreate() called with: savedInstanceState = $savedInstanceState" } - viewModel.nextDestination.observe(this, ::onNextDestination) - } - - private fun onNextDestination(navDirections: NavDirections) { - logger.v { "onNextDestination() called with: navDirections = $navDirections" } - findNavController().navigate(navDirections) - } - - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) - logger.v { "onViewCreated() called with: view = $view, savedInstanceState = $savedInstanceState" } - } - - override fun onDestroyView() { - super.onDestroyView() - logger.v { "onDestroyView() called" } - } -} \ No newline at end of file diff --git a/app/src/main/java/gq/kirmanak/mealient/ui/splash/SplashViewModel.kt b/app/src/main/java/gq/kirmanak/mealient/ui/splash/SplashViewModel.kt deleted file mode 100644 index 413ca94..0000000 --- a/app/src/main/java/gq/kirmanak/mealient/ui/splash/SplashViewModel.kt +++ /dev/null @@ -1,31 +0,0 @@ -package gq.kirmanak.mealient.ui.splash - -import androidx.lifecycle.LiveData -import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import androidx.navigation.NavDirections -import dagger.hilt.android.lifecycle.HiltViewModel -import gq.kirmanak.mealient.data.baseurl.ServerInfoRepo -import gq.kirmanak.mealient.data.disclaimer.DisclaimerStorage -import kotlinx.coroutines.launch -import javax.inject.Inject - -@HiltViewModel -class SplashViewModel @Inject constructor( - private val disclaimerStorage: DisclaimerStorage, - private val serverInfoRepo: ServerInfoRepo, -) : ViewModel() { - private val _nextDestination = MutableLiveData() - val nextDestination: LiveData = _nextDestination - - init { - viewModelScope.launch { - _nextDestination.value = when { - !disclaimerStorage.isDisclaimerAccepted() -> SplashFragmentDirections.actionSplashFragmentToDisclaimerFragment() - serverInfoRepo.getUrl() == null -> SplashFragmentDirections.actionSplashFragmentToBaseURLFragment() - else -> SplashFragmentDirections.actionSplashFragmentToRecipesFragment() - } - } - } -} diff --git a/app/src/main/res/layout/main_activity.xml b/app/src/main/res/layout/main_activity.xml index e788a45..f5b97f5 100644 --- a/app/src/main/res/layout/main_activity.xml +++ b/app/src/main/res/layout/main_activity.xml @@ -33,8 +33,7 @@ android:layout_width="match_parent" android:layout_height="match_parent" app:defaultNavHost="true" - app:layout_behavior="@string/appbar_scrolling_view_behavior" - app:navGraph="@navigation/nav_graph" /> + app:layout_behavior="@string/appbar_scrolling_view_behavior" /> + tools:ignore="InvalidNavigation"> - - - - -