Skip to content

Commit

Permalink
[ANDROID] Deep links refactor
Browse files Browse the repository at this point in the history
  • Loading branch information
kamgurgul committed Feb 5, 2025
1 parent 51d4ba1 commit 20d2d86
Show file tree
Hide file tree
Showing 11 changed files with 247 additions and 139 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -19,14 +19,12 @@ import androidx.navigation.NavDestination.Companion.hasRoute
import androidx.navigation.NavDestination.Companion.hierarchy
import androidx.navigation.NavGraph.Companion.findStartDestination
import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable
import androidx.navigation.compose.currentBackStackEntryAsState
import androidx.navigation.compose.rememberNavController
import androidx.tv.material3.Icon
import androidx.tv.material3.NavigationDrawer
import androidx.tv.material3.NavigationDrawerItem
import androidx.tv.material3.NavigationDrawerItemDefaults
import com.kgurgul.cpuinfo.features.HostScreen
import com.kgurgul.cpuinfo.features.HostViewModel
import com.kgurgul.cpuinfo.shared.Res
import com.kgurgul.cpuinfo.shared.applications
Expand All @@ -37,14 +35,17 @@ import com.kgurgul.cpuinfo.shared.ic_settings
import com.kgurgul.cpuinfo.shared.ic_temperature
import com.kgurgul.cpuinfo.shared.settings
import com.kgurgul.cpuinfo.shared.temp
import com.kgurgul.cpuinfo.tv.features.applications.TvApplicationsScreen
import com.kgurgul.cpuinfo.tv.features.information.TvInfoContainerScreen
import com.kgurgul.cpuinfo.tv.features.settings.TvSettingsScreen
import com.kgurgul.cpuinfo.tv.features.temperature.TvTemperatureScreen
import com.kgurgul.cpuinfo.tv.features.applications.TvApplicationsRoute
import com.kgurgul.cpuinfo.tv.features.applications.tvApplicationsScreen
import com.kgurgul.cpuinfo.tv.features.information.TvInformationRoute
import com.kgurgul.cpuinfo.tv.features.information.tvInformationScreen
import com.kgurgul.cpuinfo.tv.features.settings.TvSettingsRoute
import com.kgurgul.cpuinfo.tv.features.settings.tvSettingsScreen
import com.kgurgul.cpuinfo.tv.features.temperature.TvTemperaturesRoute
import com.kgurgul.cpuinfo.tv.features.temperature.tvTemperaturesScreen
import com.kgurgul.cpuinfo.ui.theme.spacingMedium
import com.kgurgul.cpuinfo.ui.theme.spacingSmall
import com.kgurgul.cpuinfo.utils.navigation.TopLevelRoute
import kotlinx.serialization.Serializable
import org.jetbrains.compose.resources.painterResource
import org.jetbrains.compose.resources.stringResource
import org.koin.compose.viewmodel.koinViewModel
Expand Down Expand Up @@ -124,73 +125,50 @@ fun TvHostScreen(
) {
NavHost(
navController = navController,
startDestination = TvHostScreen.Information,
startDestination = TvInformationRoute,
enterTransition = { fadeIn() },
exitTransition = { fadeOut() },
popEnterTransition = { fadeIn() },
popExitTransition = { fadeOut() },
) {
composable<TvHostScreen.Information> {
TvInfoContainerScreen()
}
composable<TvHostScreen.Applications> {
TvApplicationsScreen()
}
composable<TvHostScreen.Temperatures> {
TvTemperatureScreen()
}
composable<TvHostScreen.Settings> {
TvSettingsScreen()
}
tvInformationScreen()
tvApplicationsScreen()
tvTemperaturesScreen()
tvSettingsScreen()
}
}
}

@Serializable
sealed interface TvHostScreen {
@Serializable
data object Information : TvHostScreen

@Serializable
data object Applications : TvHostScreen

@Serializable
data object Temperatures : TvHostScreen

@Serializable
data object Settings : TvHostScreen
}

private fun buildTopLevelRoutes(
isApplicationsVisible: Boolean,
) = buildList {
add(
TopLevelRoute(
name = Res.string.hardware,
route = HostScreen.Information,
route = TvInformationRoute,
icon = Res.drawable.ic_cpu,
),
)
if (isApplicationsVisible) {
add(
TopLevelRoute(
name = Res.string.applications,
route = HostScreen.Applications,
route = TvApplicationsRoute,
icon = Res.drawable.ic_android,
),
)
}
add(
TopLevelRoute(
name = Res.string.temp,
route = HostScreen.Temperatures,
route = TvTemperaturesRoute,
icon = Res.drawable.ic_temperature,
),
)
add(
TopLevelRoute(
name = Res.string.settings,
route = HostScreen.Settings,
route = TvSettingsRoute,
icon = Res.drawable.ic_settings,
),
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,9 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.navigation.NavGraphBuilder
import androidx.navigation.compose.composable
import androidx.navigation.navDeepLink
import androidx.tv.material3.Icon
import coil3.compose.AsyncImage
import coil3.compose.LocalPlatformContext
Expand Down Expand Up @@ -69,12 +72,29 @@ import com.kgurgul.cpuinfo.ui.components.CpuSnackbar
import com.kgurgul.cpuinfo.ui.theme.spacingMedium
import com.kgurgul.cpuinfo.ui.theme.spacingSmall
import com.kgurgul.cpuinfo.ui.theme.spacingXSmall
import com.kgurgul.cpuinfo.utils.navigation.NavigationConst
import kotlinx.collections.immutable.ImmutableList
import kotlinx.coroutines.launch
import kotlinx.serialization.Serializable
import org.jetbrains.compose.resources.painterResource
import org.jetbrains.compose.resources.stringResource
import org.koin.compose.viewmodel.koinViewModel

@Serializable
data object TvApplicationsRoute

fun NavGraphBuilder.tvApplicationsScreen() {
composable<TvApplicationsRoute>(
deepLinks = listOf(
navDeepLink<TvApplicationsRoute>(
basePath = NavigationConst.BASE_URL + NavigationConst.APPLICATIONS
)
)
) {
TvApplicationsScreen()
}
}

@Composable
fun TvApplicationsScreen(
viewModel: ApplicationsViewModel = koinViewModel(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,9 @@ import androidx.compose.ui.ExperimentalComposeUiApi
import androidx.compose.ui.Modifier
import androidx.compose.ui.focus.focusRestorer
import androidx.compose.ui.unit.LayoutDirection
import androidx.navigation.NavGraphBuilder
import androidx.navigation.compose.composable
import androidx.navigation.navDeepLink
import androidx.tv.material3.Tab
import androidx.tv.material3.TabRow
import androidx.tv.material3.TabRowDefaults
Expand All @@ -56,8 +59,25 @@ import com.kgurgul.cpuinfo.tv.features.information.sensors.TvSensorsInfoScreen
import com.kgurgul.cpuinfo.tv.features.information.storage.TvStorageInfoScreen
import com.kgurgul.cpuinfo.ui.theme.spacingMedium
import com.kgurgul.cpuinfo.ui.theme.spacingSmall
import com.kgurgul.cpuinfo.utils.navigation.NavigationConst
import kotlinx.serialization.Serializable
import org.koin.compose.viewmodel.koinViewModel

@Serializable
data object TvInformationRoute

fun NavGraphBuilder.tvInformationScreen() {
composable<TvInformationRoute>(
deepLinks = listOf(
navDeepLink<TvInformationRoute>(
basePath = NavigationConst.BASE_URL + NavigationConst.INFORMATION
)
)
) {
TvInfoContainerScreen()
}
}

@Composable
fun TvInfoContainerScreen(
viewModel: InfoContainerViewModel = koinViewModel(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,9 @@ import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.navigation.NavGraphBuilder
import androidx.navigation.compose.composable
import androidx.navigation.navDeepLink
import com.kgurgul.cpuinfo.features.settings.SettingsViewModel
import com.kgurgul.cpuinfo.features.settings.getTemperatureUnit
import com.kgurgul.cpuinfo.features.settings.getThemeName
Expand All @@ -38,10 +41,27 @@ import com.kgurgul.cpuinfo.tv.ui.components.TvListItem
import com.kgurgul.cpuinfo.ui.theme.spacingLarge
import com.kgurgul.cpuinfo.ui.theme.spacingMedium
import com.kgurgul.cpuinfo.ui.theme.spacingSmall
import com.kgurgul.cpuinfo.utils.navigation.NavigationConst
import kotlinx.collections.immutable.ImmutableList
import kotlinx.serialization.Serializable
import org.jetbrains.compose.resources.stringResource
import org.koin.compose.viewmodel.koinViewModel

@Serializable
data object TvSettingsRoute

fun NavGraphBuilder.tvSettingsScreen() {
composable<TvSettingsRoute>(
deepLinks = listOf(
navDeepLink<TvSettingsRoute>(
basePath = NavigationConst.BASE_URL + NavigationConst.SETTINGS
)
)
) {
TvSettingsScreen()
}
}

@Composable
fun TvSettingsScreen(
viewModel: SettingsViewModel = koinViewModel(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,9 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.navigation.NavGraphBuilder
import androidx.navigation.compose.composable
import androidx.navigation.navDeepLink
import com.kgurgul.cpuinfo.domain.model.TemperatureItem
import com.kgurgul.cpuinfo.domain.model.asString
import com.kgurgul.cpuinfo.features.temperature.TemperatureFormatter
Expand All @@ -40,12 +43,29 @@ import com.kgurgul.cpuinfo.shared.no_temp_data
import com.kgurgul.cpuinfo.tv.ui.components.TvListItem
import com.kgurgul.cpuinfo.ui.theme.spacingMedium
import com.kgurgul.cpuinfo.ui.theme.spacingSmall
import com.kgurgul.cpuinfo.utils.navigation.NavigationConst
import kotlinx.collections.immutable.ImmutableList
import kotlinx.coroutines.launch
import kotlinx.serialization.Serializable
import org.jetbrains.compose.resources.painterResource
import org.jetbrains.compose.resources.stringResource
import org.koin.compose.viewmodel.koinViewModel

@Serializable
data object TvTemperaturesRoute

fun NavGraphBuilder.tvTemperaturesScreen() {
composable<TvTemperaturesRoute>(
deepLinks = listOf(
navDeepLink<TvTemperaturesRoute>(
basePath = NavigationConst.BASE_URL + NavigationConst.TEMPERATURES
)
)
) {
TvTemperatureScreen()
}
}

@Composable
fun TvTemperatureScreen(
viewModel: TemperatureViewModel = koinViewModel(),
Expand Down
Loading

0 comments on commit 20d2d86

Please sign in to comment.