diff --git a/JetLagged/app/src/main/java/com/example/jetlagged/sleep/JetLaggedHeaderTabs.kt b/JetLagged/app/src/main/java/com/example/jetlagged/sleep/JetLaggedHeaderTabs.kt index b56e98252..ba4a62fa1 100644 --- a/JetLagged/app/src/main/java/com/example/jetlagged/sleep/JetLaggedHeaderTabs.kt +++ b/JetLagged/app/src/main/java/com/example/jetlagged/sleep/JetLaggedHeaderTabs.kt @@ -23,7 +23,7 @@ import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.padding import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.ScrollableTabRow +import androidx.compose.material3.PrimaryScrollableTabRow import androidx.compose.material3.Tab import androidx.compose.material3.TabPosition import androidx.compose.material3.TabRowDefaults.tabIndicatorOffset @@ -46,14 +46,14 @@ enum class SleepTab(val title: Int) { @Composable fun JetLaggedHeaderTabs(onTabSelected: (SleepTab) -> Unit, selectedTab: SleepTab, modifier: Modifier = Modifier) { - ScrollableTabRow( + PrimaryScrollableTabRow( modifier = modifier, edgePadding = 12.dp, selectedTabIndex = selectedTab.ordinal, - indicator = { tabPositions: List -> + indicator = { Box( Modifier - .tabIndicatorOffset(tabPositions[selectedTab.ordinal]) + .tabIndicatorOffset(selectedTab.ordinal, matchContentSize = true) .fillMaxSize() .padding(horizontal = 2.dp) .border( diff --git a/JetLagged/gradle/libs.versions.toml b/JetLagged/gradle/libs.versions.toml index 7dffdd485..bdc0fb683 100644 --- a/JetLagged/gradle/libs.versions.toml +++ b/JetLagged/gradle/libs.versions.toml @@ -2,9 +2,9 @@ accompanist = "0.37.3" android-material3 = "1.14.0-alpha09" androidGradlePlugin = "9.0.1" -androidx-activity-compose = "1.12.4" +androidx-activity-compose = "1.13.0" androidx-appcompat = "1.7.1" -androidx-compose-bom = "2026.02.00" +androidx-compose-bom = "2026.03.00" androidx-constraintlayout = "1.1.1" androidx-core-splashscreen = "1.2.0" androidx-corektx = "1.17.0" diff --git a/JetNews/app/src/main/java/com/example/jetnews/ui/interests/InterestsScreen.kt b/JetNews/app/src/main/java/com/example/jetnews/ui/interests/InterestsScreen.kt index 0e3966f83..2a0924b13 100644 --- a/JetNews/app/src/main/java/com/example/jetnews/ui/interests/InterestsScreen.kt +++ b/JetNews/app/src/main/java/com/example/jetnews/ui/interests/InterestsScreen.kt @@ -41,13 +41,13 @@ import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.PrimaryScrollableTabRow +import androidx.compose.material3.PrimaryTabRow import androidx.compose.material3.Scaffold -import androidx.compose.material3.ScrollableTabRow import androidx.compose.material3.SnackbarHost import androidx.compose.material3.SnackbarHostState import androidx.compose.material3.Surface import androidx.compose.material3.Tab -import androidx.compose.material3.TabRow import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue @@ -356,7 +356,7 @@ private fun InterestsTabRow( ) { when (isExpandedScreen) { false -> { - TabRow( + PrimaryTabRow( selectedTabIndex = selectedTabIndex, contentColor = MaterialTheme.colorScheme.primary, ) { @@ -365,7 +365,7 @@ private fun InterestsTabRow( } true -> { - ScrollableTabRow( + PrimaryScrollableTabRow( selectedTabIndex = selectedTabIndex, contentColor = MaterialTheme.colorScheme.primary, edgePadding = 0.dp, diff --git a/JetNews/gradle/libs.versions.toml b/JetNews/gradle/libs.versions.toml index 61bf6410c..07831faa3 100644 --- a/JetNews/gradle/libs.versions.toml +++ b/JetNews/gradle/libs.versions.toml @@ -6,9 +6,9 @@ accompanist = "0.37.3" android-material3 = "1.14.0-alpha09" androidGradlePlugin = "9.0.1" -androidx-activity-compose = "1.12.4" +androidx-activity-compose = "1.13.0" androidx-appcompat = "1.7.1" -androidx-compose-bom = "2026.02.00" +androidx-compose-bom = "2026.03.00" androidx-constraintlayout = "1.1.1" androidx-core-splashscreen = "1.2.0" androidx-corektx = "1.17.0" diff --git a/Jetcaster/gradle/libs.versions.toml b/Jetcaster/gradle/libs.versions.toml index 4a02af961..6a9ddbabb 100644 --- a/Jetcaster/gradle/libs.versions.toml +++ b/Jetcaster/gradle/libs.versions.toml @@ -6,17 +6,17 @@ accompanist = "0.37.3" android-material3 = "1.13.0-alpha13" androidGradlePlugin = "8.10.1" -androidx-activity-compose = "1.10.1" +androidx-activity-compose = "1.13.0" androidx-appcompat = "1.7.1" -androidx-compose-bom = "2025.09.00" +androidx-compose-bom = "2026.03.00" androidx-constraintlayout = "1.1.1" androidx-core-splashscreen = "1.0.1" androidx-corektx = "1.16.0" androidx-glance = "1.1.1" androidx-lifecycle = "2.8.2" -androidx-lifecycle-compose = "2.9.1" -androidx-lifecycle-runtime-compose = "2.9.1" -androidx-navigation = "2.9.0" +androidx-lifecycle-compose = "2.10.0" +androidx-lifecycle-runtime-compose = "2.10.0" +androidx-navigation = "2.9.7" androidx-palette = "1.0.0" androidx-test = "1.6.1" androidx-test-espresso = "3.6.1" @@ -25,9 +25,9 @@ androidx-test-ext-truth = "1.6.0" androidx-tv-foundation = "1.0.0-alpha12" androidx-tv-material = "1.0.0" androidx-wear-compose-material3 = "1.5.1" -androidx-wear-compose = "1.5.0" +androidx-wear-compose = "1.5.6" androidx-window = "1.4.0" -androidxHiltNavigationCompose = "1.2.0" +androidxHiltNavigationCompose = "1.3.0" androix-test-uiautomator = "2.3.0" coil = "2.7.0" # @keep diff --git a/Jetcaster/mobile/src/main/java/com/example/jetcaster/ui/home/Home.kt b/Jetcaster/mobile/src/main/java/com/example/jetcaster/ui/home/Home.kt index 7b363bfce..249780202 100644 --- a/Jetcaster/mobile/src/main/java/com/example/jetcaster/ui/home/Home.kt +++ b/Jetcaster/mobile/src/main/java/com/example/jetcaster/ui/home/Home.kt @@ -90,10 +90,9 @@ import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp -import androidx.hilt.navigation.compose.hiltViewModel +import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.window.core.layout.WindowSizeClass -import androidx.window.core.layout.WindowWidthSizeClass import com.example.jetcaster.R import com.example.jetcaster.core.domain.testing.PreviewCategories import com.example.jetcaster.core.domain.testing.PreviewPodcastEpisodes @@ -141,21 +140,12 @@ fun calculateScaffoldDirective( maxHorizontalPartitions = 1 verticalSpacerSize = 0.dp } else { - when (windowAdaptiveInfo.windowSizeClass.windowWidthSizeClass) { - WindowWidthSizeClass.COMPACT -> { - maxHorizontalPartitions = 1 - verticalSpacerSize = 0.dp - } - - WindowWidthSizeClass.MEDIUM -> { - maxHorizontalPartitions = 1 - verticalSpacerSize = 0.dp - } - - else -> { - maxHorizontalPartitions = 2 - verticalSpacerSize = 24.dp - } + if (windowAdaptiveInfo.windowSizeClass.isWidthAtLeastBreakpoint(WindowSizeClass.WIDTH_DP_EXPANDED_LOWER_BOUND)) { + maxHorizontalPartitions = 2 + verticalSpacerSize = 24.dp + } else { + maxHorizontalPartitions = 1 + verticalSpacerSize = 0.dp } } val maxVerticalPartitions: Int @@ -261,7 +251,7 @@ private fun HomeScreenReady( directive = navigator.scaffoldDirective, mainPane = { HomeScreen( - windowSizeClass = windowSizeClass, + isHomeAppBarExpanded = windowSizeClass.isCompact, isLoading = uiState.isLoading, featuredPodcasts = uiState.featuredPodcasts, homeCategories = uiState.homeCategories, @@ -371,7 +361,7 @@ private fun HomeScreenBackground(modifier: Modifier = Modifier, content: @Compos @Composable private fun HomeScreen( - windowSizeClass: WindowSizeClass, + isHomeAppBarExpanded: Boolean, isLoading: Boolean, featuredPodcasts: ImmutableList, selectedHomeCategory: HomeCategory, @@ -400,7 +390,7 @@ private fun HomeScreen( topBar = { Column { HomeAppBar( - isExpanded = windowSizeClass.isCompact, + isExpanded = isHomeAppBarExpanded, modifier = Modifier.fillMaxWidth(), ) if (isLoading) { @@ -758,14 +748,12 @@ private fun HomeAppBarPreview() { } } -private val CompactWindowSizeClass = WindowSizeClass.compute(360f, 780f) - @DevicePreviews @Composable private fun PreviewHome() { JetcasterTheme { HomeScreen( - windowSizeClass = CompactWindowSizeClass, + isHomeAppBarExpanded = true, isLoading = true, featuredPodcasts = PreviewPodcasts.toImmutableList(), homeCategories = HomeCategory.entries, diff --git a/Jetcaster/mobile/src/main/java/com/example/jetcaster/ui/player/PlayerScreen.kt b/Jetcaster/mobile/src/main/java/com/example/jetcaster/ui/player/PlayerScreen.kt index 77536537f..52b14cc75 100644 --- a/Jetcaster/mobile/src/main/java/com/example/jetcaster/ui/player/PlayerScreen.kt +++ b/Jetcaster/mobile/src/main/java/com/example/jetcaster/ui/player/PlayerScreen.kt @@ -83,9 +83,9 @@ import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp -import androidx.hilt.navigation.compose.hiltViewModel +import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.window.core.layout.WindowSizeClass -import androidx.window.core.layout.WindowWidthSizeClass +import androidx.window.core.layout.computeWindowSizeClass import androidx.window.layout.DisplayFeature import androidx.window.layout.FoldingFeature import com.example.jetcaster.R @@ -256,7 +256,7 @@ fun PlayerContent( // Use a two pane layout if there is a fold impacting layout (meaning it is separating // or non-flat) or if we have a large enough width to show both. if ( - windowSizeClass.windowWidthSizeClass == WindowWidthSizeClass.EXPANDED || + windowSizeClass.isWidthAtLeastBreakpoint(WindowSizeClass.WIDTH_DP_EXPANDED_LOWER_BOUND) || isBookPosture(foldingFeature) || isTableTopPosture(foldingFeature) || isSeparatingPosture(foldingFeature) @@ -926,7 +926,7 @@ fun PlayerScreenPreview() { ), ), displayFeatures = emptyList(), - windowSizeClass = WindowSizeClass.compute(maxWidth.value, maxHeight.value), + windowSizeClass = WindowSizeClass.BREAKPOINTS_V1.computeWindowSizeClass(maxWidth.value, maxHeight.value), onBackPress = { }, onAddToQueue = {}, onStop = {}, diff --git a/Jetcaster/mobile/src/main/java/com/example/jetcaster/util/WindowSizeClass.kt b/Jetcaster/mobile/src/main/java/com/example/jetcaster/util/WindowSizeClass.kt index b4c90b372..c08593c29 100644 --- a/Jetcaster/mobile/src/main/java/com/example/jetcaster/util/WindowSizeClass.kt +++ b/Jetcaster/mobile/src/main/java/com/example/jetcaster/util/WindowSizeClass.kt @@ -16,13 +16,11 @@ package com.example.jetcaster.util -import androidx.window.core.layout.WindowHeightSizeClass import androidx.window.core.layout.WindowSizeClass -import androidx.window.core.layout.WindowWidthSizeClass /** * Returns true if the width or height size classes are compact. */ val WindowSizeClass.isCompact: Boolean - get() = windowWidthSizeClass == WindowWidthSizeClass.COMPACT || - windowHeightSizeClass == WindowHeightSizeClass.COMPACT + get() = !isWidthAtLeastBreakpoint(WindowSizeClass.WIDTH_DP_MEDIUM_LOWER_BOUND) || + !isHeightAtLeastBreakpoint(WindowSizeClass.HEIGHT_DP_MEDIUM_LOWER_BOUND) diff --git a/Jetcaster/tv/src/main/java/com/example/jetcaster/tv/ui/JetcasterApp.kt b/Jetcaster/tv/src/main/java/com/example/jetcaster/tv/ui/JetcasterApp.kt index 147ad2557..c9ab65d68 100644 --- a/Jetcaster/tv/src/main/java/com/example/jetcaster/tv/ui/JetcasterApp.kt +++ b/Jetcaster/tv/src/main/java/com/example/jetcaster/tv/ui/JetcasterApp.kt @@ -73,7 +73,7 @@ private fun GlobalNavigationContainer( modifier = Modifier .padding(JetcasterAppDefaults.overScanMargin.drawer.intoPaddingValues()) .focusProperties { - enter = { + onEnter = { when (currentRoute) { Screen.Discover.route -> discover Screen.Library.route -> library diff --git a/Jetcaster/tv/src/main/java/com/example/jetcaster/tv/ui/component/Catalog.kt b/Jetcaster/tv/src/main/java/com/example/jetcaster/tv/ui/component/Catalog.kt index eef6f9e92..949332081 100644 --- a/Jetcaster/tv/src/main/java/com/example/jetcaster/tv/ui/component/Catalog.kt +++ b/Jetcaster/tv/src/main/java/com/example/jetcaster/tv/ui/component/Catalog.kt @@ -154,11 +154,11 @@ private fun PodcastRow( modifier = modifier .focusRequester(focusRequester) .focusProperties { - exit = { + onExit = { focusRequester.saveFocusedChild() FocusRequester.Default } - enter = { + onEnter = { if (focusRequester.restoreFocusedChild()) { FocusRequester.Cancel } else { diff --git a/Jetcaster/tv/src/main/java/com/example/jetcaster/tv/ui/component/EpisodeRow.kt b/Jetcaster/tv/src/main/java/com/example/jetcaster/tv/ui/component/EpisodeRow.kt index 70def2b17..602cd3b69 100644 --- a/Jetcaster/tv/src/main/java/com/example/jetcaster/tv/ui/component/EpisodeRow.kt +++ b/Jetcaster/tv/src/main/java/com/example/jetcaster/tv/ui/component/EpisodeRow.kt @@ -56,14 +56,14 @@ internal fun EpisodeRow( modifier = Modifier .focusRequester(focusRequester) .focusProperties { - enter = { + onEnter = { when { lazyListState.layoutInfo.visibleItemsInfo.isEmpty() -> FocusRequester.Cancel isSameList && focusRequester.restoreFocusedChild() -> FocusRequester.Cancel else -> firstItem } } - exit = { + onExit = { previousEpisodeListHash = playerEpisodeList.hashCode() focusRequester.saveFocusedChild() FocusRequester.Default diff --git a/Jetcaster/tv/src/main/java/com/example/jetcaster/tv/ui/discover/DiscoverScreen.kt b/Jetcaster/tv/src/main/java/com/example/jetcaster/tv/ui/discover/DiscoverScreen.kt index 15cbfc786..81c1b87f0 100644 --- a/Jetcaster/tv/src/main/java/com/example/jetcaster/tv/ui/discover/DiscoverScreen.kt +++ b/Jetcaster/tv/src/main/java/com/example/jetcaster/tv/ui/discover/DiscoverScreen.kt @@ -30,7 +30,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.focus.FocusRequester import androidx.compose.ui.focus.focusProperties import androidx.compose.ui.focus.focusRequester -import androidx.hilt.navigation.compose.hiltViewModel +import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.tv.material3.Tab import androidx.tv.material3.TabRow import androidx.tv.material3.Text @@ -120,7 +120,7 @@ private fun CatalogWithCategorySelection( TabRow( selectedTabIndex = selectedTabIndex, modifier = Modifier.focusProperties { - enter = { + onEnter = { selectedTab } }, diff --git a/Jetcaster/tv/src/main/java/com/example/jetcaster/tv/ui/episode/EpisodeScreen.kt b/Jetcaster/tv/src/main/java/com/example/jetcaster/tv/ui/episode/EpisodeScreen.kt index 3042cd460..62ef26086 100644 --- a/Jetcaster/tv/src/main/java/com/example/jetcaster/tv/ui/episode/EpisodeScreen.kt +++ b/Jetcaster/tv/src/main/java/com/example/jetcaster/tv/ui/episode/EpisodeScreen.kt @@ -29,7 +29,7 @@ import androidx.compose.runtime.getValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.text.style.TextOverflow -import androidx.hilt.navigation.compose.hiltViewModel +import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.tv.material3.MaterialTheme import androidx.tv.material3.Text import com.example.jetcaster.core.player.model.PlayerEpisode diff --git a/Jetcaster/tv/src/main/java/com/example/jetcaster/tv/ui/library/LibraryScreen.kt b/Jetcaster/tv/src/main/java/com/example/jetcaster/tv/ui/library/LibraryScreen.kt index 2a823d8e6..88cd87ebf 100644 --- a/Jetcaster/tv/src/main/java/com/example/jetcaster/tv/ui/library/LibraryScreen.kt +++ b/Jetcaster/tv/src/main/java/com/example/jetcaster/tv/ui/library/LibraryScreen.kt @@ -31,7 +31,7 @@ import androidx.compose.ui.focus.FocusRequester import androidx.compose.ui.focus.focusRequester import androidx.compose.ui.focus.focusRestorer import androidx.compose.ui.res.stringResource -import androidx.hilt.navigation.compose.hiltViewModel +import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.tv.material3.Button import androidx.tv.material3.MaterialTheme import androidx.tv.material3.Text diff --git a/Jetcaster/tv/src/main/java/com/example/jetcaster/tv/ui/player/PlayerScreen.kt b/Jetcaster/tv/src/main/java/com/example/jetcaster/tv/ui/player/PlayerScreen.kt index 7717daf35..46eeea089 100644 --- a/Jetcaster/tv/src/main/java/com/example/jetcaster/tv/ui/player/PlayerScreen.kt +++ b/Jetcaster/tv/src/main/java/com/example/jetcaster/tv/ui/player/PlayerScreen.kt @@ -59,7 +59,7 @@ import androidx.compose.ui.text.TextStyle import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.DpOffset import androidx.compose.ui.unit.dp -import androidx.hilt.navigation.compose.hiltViewModel +import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.media3.common.C import androidx.media3.common.MediaItem diff --git a/Jetcaster/tv/src/main/java/com/example/jetcaster/tv/ui/podcast/PodcastDetailsScreen.kt b/Jetcaster/tv/src/main/java/com/example/jetcaster/tv/ui/podcast/PodcastDetailsScreen.kt index 5db3b9a5c..fc94c42ec 100644 --- a/Jetcaster/tv/src/main/java/com/example/jetcaster/tv/ui/podcast/PodcastDetailsScreen.kt +++ b/Jetcaster/tv/src/main/java/com/example/jetcaster/tv/ui/podcast/PodcastDetailsScreen.kt @@ -50,7 +50,7 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp -import androidx.hilt.navigation.compose.hiltViewModel +import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.tv.material3.ButtonDefaults import androidx.tv.material3.MaterialTheme import androidx.tv.material3.Text diff --git a/Jetcaster/tv/src/main/java/com/example/jetcaster/tv/ui/search/SearchScreen.kt b/Jetcaster/tv/src/main/java/com/example/jetcaster/tv/ui/search/SearchScreen.kt index ebb00cc6c..8fba15117 100644 --- a/Jetcaster/tv/src/main/java/com/example/jetcaster/tv/ui/search/SearchScreen.kt +++ b/Jetcaster/tv/src/main/java/com/example/jetcaster/tv/ui/search/SearchScreen.kt @@ -48,7 +48,7 @@ import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.input.ImeAction import androidx.compose.ui.unit.dp -import androidx.hilt.navigation.compose.hiltViewModel +import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.tv.material3.ExperimentalTvMaterial3Api import androidx.tv.material3.FilterChip import androidx.tv.material3.Icon diff --git a/Jetcaster/wear/build.gradle b/Jetcaster/wear/build.gradle index 77580edf3..bfa5982b5 100644 --- a/Jetcaster/wear/build.gradle +++ b/Jetcaster/wear/build.gradle @@ -23,7 +23,7 @@ plugins { } android { - compileSdk 35 + compileSdk 36 namespace "com.example.jetcaster" diff --git a/Jetcaster/wear/src/main/java/com/example/jetcaster/ui/episode/EpisodeScreen.kt b/Jetcaster/wear/src/main/java/com/example/jetcaster/ui/episode/EpisodeScreen.kt index 2f9f13030..121e965e7 100644 --- a/Jetcaster/wear/src/main/java/com/example/jetcaster/ui/episode/EpisodeScreen.kt +++ b/Jetcaster/wear/src/main/java/com/example/jetcaster/ui/episode/EpisodeScreen.kt @@ -30,7 +30,7 @@ import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.compose.ui.unit.dp -import androidx.hilt.navigation.compose.hiltViewModel +import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.wear.compose.foundation.lazy.TransformingLazyColumn import androidx.wear.compose.foundation.lazy.TransformingLazyColumnScope diff --git a/Jetcaster/wear/src/main/java/com/example/jetcaster/ui/latest_episodes/LatestEpisodesScreen.kt b/Jetcaster/wear/src/main/java/com/example/jetcaster/ui/latest_episodes/LatestEpisodesScreen.kt index cd7271a60..7ce5679e0 100644 --- a/Jetcaster/wear/src/main/java/com/example/jetcaster/ui/latest_episodes/LatestEpisodesScreen.kt +++ b/Jetcaster/wear/src/main/java/com/example/jetcaster/ui/latest_episodes/LatestEpisodesScreen.kt @@ -25,7 +25,7 @@ import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.tooling.preview.PreviewParameter -import androidx.hilt.navigation.compose.hiltViewModel +import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.wear.compose.foundation.lazy.TransformingLazyColumn import androidx.wear.compose.foundation.lazy.TransformingLazyColumnState diff --git a/Jetcaster/wear/src/main/java/com/example/jetcaster/ui/library/LibraryScreen.kt b/Jetcaster/wear/src/main/java/com/example/jetcaster/ui/library/LibraryScreen.kt index 033cc53d8..b0ff8c4c6 100644 --- a/Jetcaster/wear/src/main/java/com/example/jetcaster/ui/library/LibraryScreen.kt +++ b/Jetcaster/wear/src/main/java/com/example/jetcaster/ui/library/LibraryScreen.kt @@ -37,7 +37,7 @@ import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.compose.ui.unit.dp -import androidx.hilt.navigation.compose.hiltViewModel +import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.wear.compose.foundation.lazy.TransformingLazyColumn import androidx.wear.compose.foundation.lazy.TransformingLazyColumnState import androidx.wear.compose.foundation.lazy.items diff --git a/Jetcaster/wear/src/main/java/com/example/jetcaster/ui/player/PlayerScreen.kt b/Jetcaster/wear/src/main/java/com/example/jetcaster/ui/player/PlayerScreen.kt index dfdfdbe42..879b19050 100644 --- a/Jetcaster/wear/src/main/java/com/example/jetcaster/ui/player/PlayerScreen.kt +++ b/Jetcaster/wear/src/main/java/com/example/jetcaster/ui/player/PlayerScreen.kt @@ -44,7 +44,7 @@ import androidx.compose.ui.focus.FocusRequester import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource -import androidx.hilt.navigation.compose.hiltViewModel +import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.media3.common.C import androidx.media3.common.MediaItem diff --git a/Jetcaster/wear/src/main/java/com/example/jetcaster/ui/podcast/PodcastDetailsScreen.kt b/Jetcaster/wear/src/main/java/com/example/jetcaster/ui/podcast/PodcastDetailsScreen.kt index 991e6485c..1bb0a42f9 100644 --- a/Jetcaster/wear/src/main/java/com/example/jetcaster/ui/podcast/PodcastDetailsScreen.kt +++ b/Jetcaster/wear/src/main/java/com/example/jetcaster/ui/podcast/PodcastDetailsScreen.kt @@ -25,7 +25,7 @@ import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.tooling.preview.PreviewParameter -import androidx.hilt.navigation.compose.hiltViewModel +import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.wear.compose.foundation.lazy.TransformingLazyColumn import androidx.wear.compose.foundation.lazy.TransformingLazyColumnState diff --git a/Jetcaster/wear/src/main/java/com/example/jetcaster/ui/podcasts/PodcastsScreen.kt b/Jetcaster/wear/src/main/java/com/example/jetcaster/ui/podcasts/PodcastsScreen.kt index bf52a452f..ae4d0e5fa 100644 --- a/Jetcaster/wear/src/main/java/com/example/jetcaster/ui/podcasts/PodcastsScreen.kt +++ b/Jetcaster/wear/src/main/java/com/example/jetcaster/ui/podcasts/PodcastsScreen.kt @@ -31,7 +31,7 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.tooling.preview.PreviewParameter -import androidx.hilt.navigation.compose.hiltViewModel +import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.wear.compose.foundation.lazy.TransformingLazyColumn import androidx.wear.compose.foundation.lazy.TransformingLazyColumnState diff --git a/Jetcaster/wear/src/main/java/com/example/jetcaster/ui/queue/QueueScreen.kt b/Jetcaster/wear/src/main/java/com/example/jetcaster/ui/queue/QueueScreen.kt index 7934f9361..8be17e317 100644 --- a/Jetcaster/wear/src/main/java/com/example/jetcaster/ui/queue/QueueScreen.kt +++ b/Jetcaster/wear/src/main/java/com/example/jetcaster/ui/queue/QueueScreen.kt @@ -31,7 +31,7 @@ import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.compose.ui.unit.dp -import androidx.hilt.navigation.compose.hiltViewModel +import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.wear.compose.foundation.lazy.TransformingLazyColumn import androidx.wear.compose.foundation.lazy.TransformingLazyColumnState diff --git a/Jetchat/app/src/main/java/com/example/compose/jetchat/conversation/Conversation.kt b/Jetchat/app/src/main/java/com/example/compose/jetchat/conversation/Conversation.kt index 8f5290750..14a48d168 100644 --- a/Jetchat/app/src/main/java/com/example/compose/jetchat/conversation/Conversation.kt +++ b/Jetchat/app/src/main/java/com/example/compose/jetchat/conversation/Conversation.kt @@ -48,8 +48,8 @@ import androidx.compose.foundation.lazy.rememberLazyListState import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.text.ClickableText -import androidx.compose.material3.Divider import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.Icon import androidx.compose.material3.LocalContentColor import androidx.compose.material3.MaterialTheme @@ -461,7 +461,7 @@ fun DayHeader(dayString: String) { @Composable private fun RowScope.DayHeaderLine() { - Divider( + HorizontalDivider( modifier = Modifier .weight(1f) .align(Alignment.CenterVertically), diff --git a/Jetchat/app/src/main/java/com/example/compose/jetchat/conversation/RecordButton.kt b/Jetchat/app/src/main/java/com/example/compose/jetchat/conversation/RecordButton.kt index 12538ef4f..a1b1c26a1 100644 --- a/Jetchat/app/src/main/java/com/example/compose/jetchat/conversation/RecordButton.kt +++ b/Jetchat/app/src/main/java/com/example/compose/jetchat/conversation/RecordButton.kt @@ -36,6 +36,7 @@ import androidx.compose.material3.Icon import androidx.compose.material3.LocalContentColor import androidx.compose.material3.RichTooltip import androidx.compose.material3.Text +import androidx.compose.material3.TooltipAnchorPosition import androidx.compose.material3.TooltipBox import androidx.compose.material3.TooltipDefaults import androidx.compose.material3.TooltipState @@ -103,7 +104,9 @@ fun RecordButton( val scope = rememberCoroutineScope() val tooltipState = remember { TooltipState() } TooltipBox( - positionProvider = TooltipDefaults.rememberRichTooltipPositionProvider(), + positionProvider = TooltipDefaults.rememberTooltipPositionProvider( + positioning = TooltipAnchorPosition.Above, + ), tooltip = { RichTooltip { Text(stringResource(R.string.touch_and_hold_to_record)) diff --git a/Jetchat/app/src/main/java/com/example/compose/jetchat/conversation/UserInput.kt b/Jetchat/app/src/main/java/com/example/compose/jetchat/conversation/UserInput.kt index cc5df57bd..dafccdd3b 100644 --- a/Jetchat/app/src/main/java/com/example/compose/jetchat/conversation/UserInput.kt +++ b/Jetchat/app/src/main/java/com/example/compose/jetchat/conversation/UserInput.kt @@ -224,18 +224,11 @@ private fun SelectorExpanded(currentSelector: InputSelector, onCloseRequested: ( Surface(tonalElevation = 8.dp) { when (currentSelector) { InputSelector.EMOJI -> EmojiSelector(onTextAdded, focusRequester) - InputSelector.DM -> NotAvailablePopup(onCloseRequested) - InputSelector.PICTURE -> FunctionalityNotAvailablePanel() - InputSelector.MAP -> FunctionalityNotAvailablePanel() - InputSelector.PHONE -> FunctionalityNotAvailablePanel() - - else -> { - throw NotImplementedError() - } + InputSelector.NONE -> Unit } } } diff --git a/Jetchat/app/src/main/java/com/example/compose/jetchat/profile/Profile.kt b/Jetchat/app/src/main/java/com/example/compose/jetchat/profile/Profile.kt index 35b9b1af7..94e54a920 100644 --- a/Jetchat/app/src/main/java/com/example/compose/jetchat/profile/Profile.kt +++ b/Jetchat/app/src/main/java/com/example/compose/jetchat/profile/Profile.kt @@ -33,9 +33,9 @@ import androidx.compose.foundation.layout.widthIn import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.verticalScroll -import androidx.compose.material3.Divider import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.FloatingActionButton +import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Surface @@ -201,7 +201,7 @@ private fun ProfileHeader(scrollState: ScrollState, data: ProfileScreenState, co @Composable fun ProfileProperty(label: String, value: String, isLink: Boolean = false) { Column(modifier = Modifier.padding(start = 16.dp, end = 16.dp, bottom = 16.dp)) { - Divider() + HorizontalDivider() Text( text = label, modifier = Modifier.baselineHeight(24.dp), diff --git a/Jetchat/app/src/main/java/com/example/compose/jetchat/profile/ProfileViewModel.kt b/Jetchat/app/src/main/java/com/example/compose/jetchat/profile/ProfileViewModel.kt index bb196bbe8..9b2d02809 100644 --- a/Jetchat/app/src/main/java/com/example/compose/jetchat/profile/ProfileViewModel.kt +++ b/Jetchat/app/src/main/java/com/example/compose/jetchat/profile/ProfileViewModel.kt @@ -47,7 +47,7 @@ class ProfileViewModel : ViewModel() { @Immutable data class ProfileScreenState( val userId: String, - @DrawableRes val photo: Int?, + @param:DrawableRes val photo: Int?, val name: String, val status: String, val displayName: String, diff --git a/Jetchat/gradle/libs.versions.toml b/Jetchat/gradle/libs.versions.toml index 61bf6410c..07831faa3 100644 --- a/Jetchat/gradle/libs.versions.toml +++ b/Jetchat/gradle/libs.versions.toml @@ -6,9 +6,9 @@ accompanist = "0.37.3" android-material3 = "1.14.0-alpha09" androidGradlePlugin = "9.0.1" -androidx-activity-compose = "1.12.4" +androidx-activity-compose = "1.13.0" androidx-appcompat = "1.7.1" -androidx-compose-bom = "2026.02.00" +androidx-compose-bom = "2026.03.00" androidx-constraintlayout = "1.1.1" androidx-core-splashscreen = "1.2.0" androidx-corektx = "1.17.0" diff --git a/Jetsnack/app/src/main/java/com/example/jetsnack/ui/theme/Theme.kt b/Jetsnack/app/src/main/java/com/example/jetsnack/ui/theme/Theme.kt index ad0a8e66c..87f851d5b 100644 --- a/Jetsnack/app/src/main/java/com/example/jetsnack/ui/theme/Theme.kt +++ b/Jetsnack/app/src/main/java/com/example/jetsnack/ui/theme/Theme.kt @@ -182,4 +182,16 @@ fun debugColors(darkTheme: Boolean, debugColor: Color = Color.Magenta) = ColorSc surfaceContainerHighest = debugColor, surfaceContainerLow = debugColor, surfaceContainerLowest = debugColor, + primaryFixed = debugColor, + primaryFixedDim = debugColor, + onPrimaryFixed = debugColor, + onPrimaryFixedVariant = debugColor, + secondaryFixed = debugColor, + secondaryFixedDim = debugColor, + onSecondaryFixed = debugColor, + onSecondaryFixedVariant = debugColor, + tertiaryFixed = debugColor, + tertiaryFixedDim = debugColor, + onTertiaryFixed = debugColor, + onTertiaryFixedVariant = debugColor, ) diff --git a/Jetsnack/gradle/libs.versions.toml b/Jetsnack/gradle/libs.versions.toml index c51b64c94..4eee128ed 100644 --- a/Jetsnack/gradle/libs.versions.toml +++ b/Jetsnack/gradle/libs.versions.toml @@ -2,9 +2,9 @@ accompanist = "0.37.3" android-material3 = "1.14.0-alpha09" androidGradlePlugin = "9.0.1" -androidx-activity-compose = "1.12.4" +androidx-activity-compose = "1.13.0" androidx-appcompat = "1.7.1" -androidx-compose-bom = "2026.02.00" +androidx-compose-bom = "2026.03.00" androidx-core-splashscreen = "1.2.0" androidx-corektx = "1.17.0" androidx-glance = "1.2.0-rc01" diff --git a/Reply/app/src/main/java/com/example/reply/ui/navigation/ReplyNavigationComponents.kt b/Reply/app/src/main/java/com/example/reply/ui/navigation/ReplyNavigationComponents.kt index 856a6b738..8a19adf11 100644 --- a/Reply/app/src/main/java/com/example/reply/ui/navigation/ReplyNavigationComponents.kt +++ b/Reply/app/src/main/java/com/example/reply/ui/navigation/ReplyNavigationComponents.kt @@ -69,15 +69,13 @@ import androidx.compose.ui.unit.offset import androidx.compose.ui.unit.toSize import androidx.navigation.NavDestination import androidx.navigation.NavDestination.Companion.hasRoute -import androidx.window.core.layout.WindowHeightSizeClass import androidx.window.core.layout.WindowSizeClass -import androidx.window.core.layout.WindowWidthSizeClass import com.example.reply.R import com.example.reply.ui.utils.ReplyNavigationContentPosition import kotlinx.coroutines.launch -private fun WindowSizeClass.isCompact() = windowWidthSizeClass == WindowWidthSizeClass.COMPACT || - windowHeightSizeClass == WindowHeightSizeClass.COMPACT +private fun WindowSizeClass.isCompact() = !isWidthAtLeastBreakpoint(WindowSizeClass.WIDTH_DP_MEDIUM_LOWER_BOUND) || + !isHeightAtLeastBreakpoint(WindowSizeClass.HEIGHT_DP_MEDIUM_LOWER_BOUND) class ReplyNavSuiteScope(val navSuiteType: NavigationSuiteType) @@ -97,19 +95,15 @@ fun ReplyNavigationWrapper( adaptiveInfo.windowSizeClass.isCompact() -> NavigationSuiteType.NavigationBar - adaptiveInfo.windowSizeClass.windowWidthSizeClass == WindowWidthSizeClass.EXPANDED && + adaptiveInfo.windowSizeClass.isWidthAtLeastBreakpoint(WindowSizeClass.WIDTH_DP_EXPANDED_LOWER_BOUND) && windowSize.width >= 1200.dp -> NavigationSuiteType.NavigationDrawer else -> NavigationSuiteType.NavigationRail } - val navContentPosition = when (adaptiveInfo.windowSizeClass.windowHeightSizeClass) { - WindowHeightSizeClass.COMPACT -> ReplyNavigationContentPosition.TOP - - WindowHeightSizeClass.MEDIUM, - WindowHeightSizeClass.EXPANDED, - -> ReplyNavigationContentPosition.CENTER - - else -> ReplyNavigationContentPosition.TOP + val navContentPosition = if (adaptiveInfo.windowSizeClass.isHeightAtLeastBreakpoint(WindowSizeClass.HEIGHT_DP_MEDIUM_LOWER_BOUND)) { + ReplyNavigationContentPosition.CENTER + } else { + ReplyNavigationContentPosition.TOP } val drawerState = rememberDrawerState(initialValue = DrawerValue.Closed) diff --git a/Reply/app/src/main/java/com/example/reply/ui/theme/Theme.kt b/Reply/app/src/main/java/com/example/reply/ui/theme/Theme.kt index bf392f237..0b9296e56 100644 --- a/Reply/app/src/main/java/com/example/reply/ui/theme/Theme.kt +++ b/Reply/app/src/main/java/com/example/reply/ui/theme/Theme.kt @@ -308,15 +308,6 @@ fun ContrastAwareReplyTheme( else -> selectSchemeForContrast(darkTheme) } - val view = LocalView.current - if (!view.isInEditMode) { - SideEffect { - val window = (view.context as Activity).window - window.statusBarColor = replyColorScheme.primary.toArgb() - WindowCompat.getInsetsController(window, view).isAppearanceLightStatusBars = darkTheme - } - } - MaterialTheme( colorScheme = replyColorScheme, typography = replyTypography, diff --git a/Reply/gradle/libs.versions.toml b/Reply/gradle/libs.versions.toml index 61bf6410c..07831faa3 100644 --- a/Reply/gradle/libs.versions.toml +++ b/Reply/gradle/libs.versions.toml @@ -6,9 +6,9 @@ accompanist = "0.37.3" android-material3 = "1.14.0-alpha09" androidGradlePlugin = "9.0.1" -androidx-activity-compose = "1.12.4" +androidx-activity-compose = "1.13.0" androidx-appcompat = "1.7.1" -androidx-compose-bom = "2026.02.00" +androidx-compose-bom = "2026.03.00" androidx-constraintlayout = "1.1.1" androidx-core-splashscreen = "1.2.0" androidx-corektx = "1.17.0"