diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000000..83be1d5a01 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,6 @@ +# https://editorconfig.org/ +# This configuration is used by ktlint when spotless invokes it + +[*.{kt,kts}] +ij_kotlin_allow_trailing_comma=true +ij_kotlin_allow_trailing_comma_on_call_site=true diff --git a/app-nia-catalog/src/main/java/com/google/samples/apps/niacatalog/ui/Catalog.kt b/app-nia-catalog/src/main/java/com/google/samples/apps/niacatalog/ui/Catalog.kt index 965d03c476..52e1c7485e 100644 --- a/app-nia-catalog/src/main/java/com/google/samples/apps/niacatalog/ui/Catalog.kt +++ b/app-nia-catalog/src/main/java/com/google/samples/apps/niacatalog/ui/Catalog.kt @@ -66,7 +66,7 @@ fun NiaCatalog() { LazyColumn( modifier = Modifier.fillMaxSize(), contentPadding = contentPadding, - verticalArrangement = Arrangement.spacedBy(16.dp) + verticalArrangement = Arrangement.spacedBy(16.dp), ) { item { Text( @@ -93,19 +93,19 @@ fun NiaCatalog() { FlowRow(mainAxisSpacing = 16.dp) { NiaButton( onClick = {}, - enabled = false + enabled = false, ) { Text(text = "Disabled") } NiaOutlinedButton( onClick = {}, - enabled = false + enabled = false, ) { Text(text = "Disabled") } NiaTextButton( onClick = {}, - enabled = false + enabled = false, ) { Text(text = "Disabled") } @@ -119,21 +119,21 @@ fun NiaCatalog() { text = { Text(text = "Enabled") }, leadingIcon = { Icon(imageVector = NiaIcons.Add, contentDescription = null) - } + }, ) NiaOutlinedButton( onClick = {}, text = { Text(text = "Enabled") }, leadingIcon = { Icon(imageVector = NiaIcons.Add, contentDescription = null) - } + }, ) NiaTextButton( onClick = {}, text = { Text(text = "Enabled") }, leadingIcon = { Icon(imageVector = NiaIcons.Add, contentDescription = null) - } + }, ) } } @@ -146,7 +146,7 @@ fun NiaCatalog() { text = { Text(text = "Disabled") }, leadingIcon = { Icon(imageVector = NiaIcons.Add, contentDescription = null) - } + }, ) NiaOutlinedButton( onClick = {}, @@ -154,7 +154,7 @@ fun NiaCatalog() { text = { Text(text = "Disabled") }, leadingIcon = { Icon(imageVector = NiaIcons.Add, contentDescription = null) - } + }, ) NiaTextButton( onClick = {}, @@ -162,7 +162,7 @@ fun NiaCatalog() { text = { Text(text = "Disabled") }, leadingIcon = { Icon(imageVector = NiaIcons.Add, contentDescription = null) - } + }, ) } } @@ -173,14 +173,14 @@ fun NiaCatalog() { text = { Text("Enabled") }, items = listOf("Item 1", "Item 2", "Item 3"), onItemClick = {}, - itemText = { item -> Text(item) } + itemText = { item -> Text(item) }, ) NiaDropdownMenuButton( text = { Text("Disabled") }, items = listOf("Item 1", "Item 2", "Item 3"), onItemClick = {}, itemText = { item -> Text(item) }, - enabled = false + enabled = false, ) } } @@ -191,25 +191,25 @@ fun NiaCatalog() { NiaFilterChip( selected = firstChecked, onSelectedChange = { checked -> firstChecked = checked }, - label = { Text(text = "Enabled") } + label = { Text(text = "Enabled") }, ) var secondChecked by remember { mutableStateOf(true) } NiaFilterChip( selected = secondChecked, onSelectedChange = { checked -> secondChecked = checked }, - label = { Text(text = "Enabled") } + label = { Text(text = "Enabled") }, ) NiaFilterChip( selected = false, onSelectedChange = {}, enabled = false, - label = { Text(text = "Disabled") } + label = { Text(text = "Disabled") }, ) NiaFilterChip( selected = true, onSelectedChange = {}, enabled = false, - label = { Text(text = "Disabled") } + label = { Text(text = "Disabled") }, ) } } @@ -223,15 +223,15 @@ fun NiaCatalog() { icon = { Icon( painter = painterResource(id = NiaIcons.BookmarkBorder), - contentDescription = null + contentDescription = null, ) }, checkedIcon = { Icon( painter = painterResource(id = NiaIcons.Bookmark), - contentDescription = null + contentDescription = null, ) - } + }, ) var secondChecked by remember { mutableStateOf(true) } NiaIconToggleButton( @@ -240,15 +240,15 @@ fun NiaCatalog() { icon = { Icon( painter = painterResource(id = NiaIcons.BookmarkBorder), - contentDescription = null + contentDescription = null, ) }, checkedIcon = { Icon( painter = painterResource(id = NiaIcons.Bookmark), - contentDescription = null + contentDescription = null, ) - } + }, ) NiaIconToggleButton( checked = false, @@ -256,16 +256,16 @@ fun NiaCatalog() { icon = { Icon( painter = painterResource(id = NiaIcons.BookmarkBorder), - contentDescription = null + contentDescription = null, ) }, checkedIcon = { Icon( painter = painterResource(id = NiaIcons.Bookmark), - contentDescription = null + contentDescription = null, ) }, - enabled = false + enabled = false, ) NiaIconToggleButton( checked = true, @@ -273,16 +273,16 @@ fun NiaCatalog() { icon = { Icon( painter = painterResource(id = NiaIcons.BookmarkBorder), - contentDescription = null + contentDescription = null, ) }, checkedIcon = { Icon( painter = painterResource(id = NiaIcons.Bookmark), - contentDescription = null + contentDescription = null, ) }, - enabled = false + enabled = false, ) } } @@ -294,21 +294,21 @@ fun NiaCatalog() { expanded = firstExpanded, onExpandedChange = { expanded -> firstExpanded = expanded }, compactText = { Text(text = "Compact view") }, - expandedText = { Text(text = "Expanded view") } + expandedText = { Text(text = "Expanded view") }, ) var secondExpanded by remember { mutableStateOf(true) } NiaViewToggleButton( expanded = secondExpanded, onExpandedChange = { expanded -> secondExpanded = expanded }, compactText = { Text(text = "Compact view") }, - expandedText = { Text(text = "Expanded view") } + expandedText = { Text(text = "Expanded view") }, ) NiaViewToggleButton( expanded = false, onExpandedChange = {}, compactText = { Text(text = "Disabled") }, expandedText = { Text(text = "Disabled") }, - enabled = false + enabled = false, ) } } @@ -330,7 +330,7 @@ fun NiaCatalog() { text = { Text(text = "Topic 1".uppercase()) }, followText = { Text(text = "Follow") }, unFollowText = { Text(text = "Unfollow") }, - browseText = { Text(text = "Browse topic") } + browseText = { Text(text = "Browse topic") }, ) var secondFollowed by remember { mutableStateOf(true) } NiaTopicTag( @@ -345,7 +345,7 @@ fun NiaCatalog() { text = { Text(text = "Topic 2".uppercase()) }, followText = { Text(text = "Follow") }, unFollowText = { Text(text = "Unfollow") }, - browseText = { Text(text = "Browse topic") } + browseText = { Text(text = "Browse topic") }, ) NiaTopicTag( expanded = false, @@ -355,7 +355,7 @@ fun NiaCatalog() { onUnfollowClick = {}, onBrowseClick = {}, text = { Text(text = "Disabled".uppercase()) }, - enabled = false + enabled = false, ) } } @@ -368,7 +368,7 @@ fun NiaCatalog() { NiaTab( selected = selectedTabIndex == index, onClick = { selectedTabIndex = index }, - text = { Text(text = title) } + text = { Text(text = title) }, ) } } @@ -380,12 +380,12 @@ fun NiaCatalog() { val icons = listOf( NiaIcons.UpcomingBorder, NiaIcons.MenuBookBorder, - NiaIcons.BookmarksBorder + NiaIcons.BookmarksBorder, ) val selectedIcons = listOf( NiaIcons.Upcoming, NiaIcons.MenuBook, - NiaIcons.Bookmarks + NiaIcons.Bookmarks, ) val tagIcon = NiaIcons.Tag NiaNavigationBar { @@ -397,7 +397,7 @@ fun NiaCatalog() { } else { Icon( painter = painterResource(id = icons[index]), - contentDescription = item + contentDescription = item, ) } }, @@ -407,13 +407,13 @@ fun NiaCatalog() { } else { Icon( painter = painterResource(id = selectedIcons[index]), - contentDescription = item + contentDescription = item, ) } }, label = { Text(item) }, selected = selectedItem == index, - onClick = { selectedItem = index } + onClick = { selectedItem = index }, ) } } diff --git a/app/src/androidTest/java/com/google/samples/apps/nowinandroid/ui/NavigationTest.kt b/app/src/androidTest/java/com/google/samples/apps/nowinandroid/ui/NavigationTest.kt index 8474c3546e..17dd28ac7c 100644 --- a/app/src/androidTest/java/com/google/samples/apps/nowinandroid/ui/NavigationTest.kt +++ b/app/src/androidTest/java/com/google/samples/apps/nowinandroid/ui/NavigationTest.kt @@ -29,10 +29,6 @@ import androidx.test.espresso.Espresso import androidx.test.espresso.NoActivityResumedException import com.google.samples.apps.nowinandroid.MainActivity import com.google.samples.apps.nowinandroid.R -import com.google.samples.apps.nowinandroid.feature.bookmarks.R as BookmarksR -import com.google.samples.apps.nowinandroid.feature.foryou.R as FeatureForyouR -import com.google.samples.apps.nowinandroid.feature.interests.R as FeatureInterestsR -import com.google.samples.apps.nowinandroid.feature.settings.R as SettingsR import dagger.hilt.android.testing.BindValue import dagger.hilt.android.testing.HiltAndroidRule import dagger.hilt.android.testing.HiltAndroidTest @@ -40,6 +36,10 @@ import org.junit.Before import org.junit.Rule import org.junit.Test import org.junit.rules.TemporaryFolder +import com.google.samples.apps.nowinandroid.feature.bookmarks.R as BookmarksR +import com.google.samples.apps.nowinandroid.feature.foryou.R as FeatureForyouR +import com.google.samples.apps.nowinandroid.feature.interests.R as FeatureInterestsR +import com.google.samples.apps.nowinandroid.feature.settings.R as SettingsR /** * Tests all the navigation flows that are handled by the navigation library. @@ -57,7 +57,8 @@ class NavigationTest { * Create a temporary folder used to create a Data Store file. This guarantees that * the file is removed in between each test, preventing a crash. */ - @BindValue @get:Rule(order = 1) + @BindValue + @get:Rule(order = 1) val tmpFolder: TemporaryFolder = TemporaryFolder.builder().assureDeletion().build() /** @@ -165,7 +166,6 @@ class NavigationTest { @Test fun topLevelDestinations_showTopBarWithTitle() { composeTestRule.apply { - // Verify that the top bar contains the app name on the first screen. onNodeWithText(appName).assertExists() @@ -207,7 +207,6 @@ class NavigationTest { @Test fun whenSettingsDialogDismissed_previousScreenIsDisplayed() { composeTestRule.apply { - // Navigate to the saved screen, open the settings dialog, then close it. onNodeWithText(saved).performClick() onNodeWithContentDescription(settings).performClick() diff --git a/app/src/androidTest/java/com/google/samples/apps/nowinandroid/ui/NavigationUiTest.kt b/app/src/androidTest/java/com/google/samples/apps/nowinandroid/ui/NavigationUiTest.kt index 67dd5b61cc..ca20d43325 100644 --- a/app/src/androidTest/java/com/google/samples/apps/nowinandroid/ui/NavigationUiTest.kt +++ b/app/src/androidTest/java/com/google/samples/apps/nowinandroid/ui/NavigationUiTest.kt @@ -30,11 +30,11 @@ import com.google.samples.apps.nowinandroid.uitesthiltmanifest.HiltComponentActi import dagger.hilt.android.testing.BindValue import dagger.hilt.android.testing.HiltAndroidRule import dagger.hilt.android.testing.HiltAndroidTest -import javax.inject.Inject import org.junit.Before import org.junit.Rule import org.junit.Test import org.junit.rules.TemporaryFolder +import javax.inject.Inject /** * Tests that the navigation UI is rendered correctly on different screen sizes. @@ -53,7 +53,8 @@ class NavigationUiTest { * Create a temporary folder used to create a Data Store file. This guarantees that * the file is removed in between each test, preventing a crash. */ - @BindValue @get:Rule(order = 1) + @BindValue + @get:Rule(order = 1) val tmpFolder: TemporaryFolder = TemporaryFolder.builder().assureDeletion().build() /** @@ -77,9 +78,9 @@ class NavigationUiTest { BoxWithConstraints { NiaApp( windowSizeClass = WindowSizeClass.calculateFromSize( - DpSize(maxWidth, maxHeight) + DpSize(maxWidth, maxHeight), ), - networkMonitor = networkMonitor + networkMonitor = networkMonitor, ) } } @@ -96,9 +97,9 @@ class NavigationUiTest { BoxWithConstraints { NiaApp( windowSizeClass = WindowSizeClass.calculateFromSize( - DpSize(maxWidth, maxHeight) + DpSize(maxWidth, maxHeight), ), - networkMonitor = networkMonitor + networkMonitor = networkMonitor, ) } } @@ -115,9 +116,9 @@ class NavigationUiTest { BoxWithConstraints { NiaApp( windowSizeClass = WindowSizeClass.calculateFromSize( - DpSize(maxWidth, maxHeight) + DpSize(maxWidth, maxHeight), ), - networkMonitor = networkMonitor + networkMonitor = networkMonitor, ) } } @@ -134,9 +135,9 @@ class NavigationUiTest { BoxWithConstraints { NiaApp( windowSizeClass = WindowSizeClass.calculateFromSize( - DpSize(maxWidth, maxHeight) + DpSize(maxWidth, maxHeight), ), - networkMonitor = networkMonitor + networkMonitor = networkMonitor, ) } } @@ -153,9 +154,9 @@ class NavigationUiTest { BoxWithConstraints { NiaApp( windowSizeClass = WindowSizeClass.calculateFromSize( - DpSize(maxWidth, maxHeight) + DpSize(maxWidth, maxHeight), ), - networkMonitor = networkMonitor + networkMonitor = networkMonitor, ) } } @@ -172,9 +173,9 @@ class NavigationUiTest { BoxWithConstraints { NiaApp( windowSizeClass = WindowSizeClass.calculateFromSize( - DpSize(maxWidth, maxHeight) + DpSize(maxWidth, maxHeight), ), - networkMonitor = networkMonitor + networkMonitor = networkMonitor, ) } } @@ -191,9 +192,9 @@ class NavigationUiTest { BoxWithConstraints { NiaApp( windowSizeClass = WindowSizeClass.calculateFromSize( - DpSize(maxWidth, maxHeight) + DpSize(maxWidth, maxHeight), ), - networkMonitor = networkMonitor + networkMonitor = networkMonitor, ) } } @@ -210,9 +211,9 @@ class NavigationUiTest { BoxWithConstraints { NiaApp( windowSizeClass = WindowSizeClass.calculateFromSize( - DpSize(maxWidth, maxHeight) + DpSize(maxWidth, maxHeight), ), - networkMonitor = networkMonitor + networkMonitor = networkMonitor, ) } } @@ -229,9 +230,9 @@ class NavigationUiTest { BoxWithConstraints { NiaApp( windowSizeClass = WindowSizeClass.calculateFromSize( - DpSize(maxWidth, maxHeight) + DpSize(maxWidth, maxHeight), ), - networkMonitor = networkMonitor + networkMonitor = networkMonitor, ) } } diff --git a/app/src/androidTest/java/com/google/samples/apps/nowinandroid/ui/NiaAppStateTest.kt b/app/src/androidTest/java/com/google/samples/apps/nowinandroid/ui/NiaAppStateTest.kt index 8e0d656365..64896a5448 100644 --- a/app/src/androidTest/java/com/google/samples/apps/nowinandroid/ui/NiaAppStateTest.kt +++ b/app/src/androidTest/java/com/google/samples/apps/nowinandroid/ui/NiaAppStateTest.kt @@ -31,15 +31,15 @@ import androidx.navigation.compose.composable import androidx.navigation.createGraph import androidx.navigation.testing.TestNavHostController import com.google.samples.apps.nowinandroid.core.testing.util.TestNetworkMonitor -import kotlin.test.assertEquals -import kotlin.test.assertFalse -import kotlin.test.assertTrue import kotlinx.coroutines.flow.collect import kotlinx.coroutines.launch import kotlinx.coroutines.test.UnconfinedTestDispatcher import kotlinx.coroutines.test.runTest import org.junit.Rule import org.junit.Test +import kotlin.test.assertEquals +import kotlin.test.assertFalse +import kotlin.test.assertTrue /** * Tests [NiaAppState]. @@ -70,7 +70,7 @@ class NiaAppStateTest { windowSizeClass = getCompactWindowClass(), navController = navController, networkMonitor = networkMonitor, - coroutineScope = backgroundScope + coroutineScope = backgroundScope, ) } @@ -91,7 +91,7 @@ class NiaAppStateTest { composeTestRule.setContent { state = rememberNiaAppState( windowSizeClass = getCompactWindowClass(), - networkMonitor = networkMonitor + networkMonitor = networkMonitor, ) } @@ -108,7 +108,7 @@ class NiaAppStateTest { windowSizeClass = getCompactWindowClass(), navController = NavHostController(LocalContext.current), networkMonitor = networkMonitor, - coroutineScope = backgroundScope + coroutineScope = backgroundScope, ) } @@ -123,7 +123,7 @@ class NiaAppStateTest { windowSizeClass = WindowSizeClass.calculateFromSize(DpSize(800.dp, 800.dp)), navController = NavHostController(LocalContext.current), networkMonitor = networkMonitor, - coroutineScope = backgroundScope + coroutineScope = backgroundScope, ) } @@ -133,13 +133,12 @@ class NiaAppStateTest { @Test fun niaAppState_showNavRail_large() = runTest { - composeTestRule.setContent { state = NiaAppState( windowSizeClass = WindowSizeClass.calculateFromSize(DpSize(900.dp, 1200.dp)), navController = NavHostController(LocalContext.current), networkMonitor = networkMonitor, - coroutineScope = backgroundScope + coroutineScope = backgroundScope, ) } @@ -149,13 +148,12 @@ class NiaAppStateTest { @Test fun stateIsOfflineWhenNetworkMonitorIsOffline() = runTest(UnconfinedTestDispatcher()) { - composeTestRule.setContent { state = NiaAppState( windowSizeClass = WindowSizeClass.calculateFromSize(DpSize(900.dp, 1200.dp)), navController = NavHostController(LocalContext.current), networkMonitor = networkMonitor, - coroutineScope = backgroundScope + coroutineScope = backgroundScope, ) } @@ -163,7 +161,7 @@ class NiaAppStateTest { networkMonitor.setConnected(false) assertEquals( true, - state.isOffline.value + state.isOffline.value, ) } diff --git a/app/src/main/java/com/google/samples/apps/nowinandroid/MainActivity.kt b/app/src/main/java/com/google/samples/apps/nowinandroid/MainActivity.kt index 06cbf9c84c..e46d2156a6 100644 --- a/app/src/main/java/com/google/samples/apps/nowinandroid/MainActivity.kt +++ b/app/src/main/java/com/google/samples/apps/nowinandroid/MainActivity.kt @@ -43,10 +43,10 @@ import com.google.samples.apps.nowinandroid.core.model.data.DarkThemeConfig import com.google.samples.apps.nowinandroid.core.model.data.ThemeBrand import com.google.samples.apps.nowinandroid.ui.NiaApp import dagger.hilt.android.AndroidEntryPoint -import javax.inject.Inject import kotlinx.coroutines.flow.collect import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.launch +import javax.inject.Inject @OptIn(ExperimentalMaterial3WindowSizeClassApi::class) @AndroidEntryPoint @@ -107,7 +107,7 @@ class MainActivity : ComponentActivity() { NiaTheme( darkTheme = darkTheme, androidTheme = shouldUseAndroidTheme(uiState), - disableDynamicTheming = shouldDisableDynamicTheming(uiState) + disableDynamicTheming = shouldDisableDynamicTheming(uiState), ) { NiaApp( networkMonitor = networkMonitor, diff --git a/app/src/main/java/com/google/samples/apps/nowinandroid/MainActivityViewModel.kt b/app/src/main/java/com/google/samples/apps/nowinandroid/MainActivityViewModel.kt index 0a182cbd7c..ebea4b9656 100644 --- a/app/src/main/java/com/google/samples/apps/nowinandroid/MainActivityViewModel.kt +++ b/app/src/main/java/com/google/samples/apps/nowinandroid/MainActivityViewModel.kt @@ -23,22 +23,22 @@ import com.google.samples.apps.nowinandroid.MainActivityUiState.Success import com.google.samples.apps.nowinandroid.core.data.repository.UserDataRepository import com.google.samples.apps.nowinandroid.core.model.data.UserData import dagger.hilt.android.lifecycle.HiltViewModel -import javax.inject.Inject import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.stateIn +import javax.inject.Inject @HiltViewModel class MainActivityViewModel @Inject constructor( - userDataRepository: UserDataRepository + userDataRepository: UserDataRepository, ) : ViewModel() { val uiState: StateFlow = userDataRepository.userData.map { Success(it) }.stateIn( scope = viewModelScope, initialValue = Loading, - started = SharingStarted.WhileSubscribed(5_000) + started = SharingStarted.WhileSubscribed(5_000), ) } diff --git a/app/src/main/java/com/google/samples/apps/nowinandroid/di/JankStatsModule.kt b/app/src/main/java/com/google/samples/apps/nowinandroid/di/JankStatsModule.kt index 90f844c1b4..be64d057f3 100644 --- a/app/src/main/java/com/google/samples/apps/nowinandroid/di/JankStatsModule.kt +++ b/app/src/main/java/com/google/samples/apps/nowinandroid/di/JankStatsModule.kt @@ -47,7 +47,7 @@ object JankStatsModule { @Provides fun providesJankStats( window: Window, - frameListener: JankStats.OnFrameListener + frameListener: JankStats.OnFrameListener, ): JankStats { return JankStats.createAndTrack(window, frameListener) } diff --git a/app/src/main/java/com/google/samples/apps/nowinandroid/navigation/NiaNavHost.kt b/app/src/main/java/com/google/samples/apps/nowinandroid/navigation/NiaNavHost.kt index 6146a55272..d6e30a10ec 100644 --- a/app/src/main/java/com/google/samples/apps/nowinandroid/navigation/NiaNavHost.kt +++ b/app/src/main/java/com/google/samples/apps/nowinandroid/navigation/NiaNavHost.kt @@ -39,7 +39,7 @@ fun NiaNavHost( navController: NavHostController, onBackClick: () -> Unit, modifier: Modifier = Modifier, - startDestination: String = forYouNavigationRoute + startDestination: String = forYouNavigationRoute, ) { NavHost( navController = navController, @@ -54,7 +54,7 @@ fun NiaNavHost( }, nestedGraphs = { topicScreen(onBackClick) - } + }, ) } } diff --git a/app/src/main/java/com/google/samples/apps/nowinandroid/navigation/TopLevelDestination.kt b/app/src/main/java/com/google/samples/apps/nowinandroid/navigation/TopLevelDestination.kt index 956037f29c..396ab8b7b0 100644 --- a/app/src/main/java/com/google/samples/apps/nowinandroid/navigation/TopLevelDestination.kt +++ b/app/src/main/java/com/google/samples/apps/nowinandroid/navigation/TopLevelDestination.kt @@ -34,24 +34,24 @@ enum class TopLevelDestination( val selectedIcon: Icon, val unselectedIcon: Icon, val iconTextId: Int, - val titleTextId: Int + val titleTextId: Int, ) { FOR_YOU( selectedIcon = DrawableResourceIcon(NiaIcons.Upcoming), unselectedIcon = DrawableResourceIcon(NiaIcons.UpcomingBorder), iconTextId = forYouR.string.for_you, - titleTextId = R.string.app_name + titleTextId = R.string.app_name, ), BOOKMARKS( selectedIcon = DrawableResourceIcon(NiaIcons.Bookmarks), unselectedIcon = DrawableResourceIcon(NiaIcons.BookmarksBorder), iconTextId = bookmarksR.string.saved, - titleTextId = bookmarksR.string.saved + titleTextId = bookmarksR.string.saved, ), INTERESTS( selectedIcon = ImageVectorIcon(NiaIcons.Grid3x3), unselectedIcon = ImageVectorIcon(NiaIcons.Grid3x3), iconTextId = interestsR.string.interests, - titleTextId = interestsR.string.interests - ) + titleTextId = interestsR.string.interests, + ), } diff --git a/app/src/main/java/com/google/samples/apps/nowinandroid/ui/NiaApp.kt b/app/src/main/java/com/google/samples/apps/nowinandroid/ui/NiaApp.kt index a3f570ad55..14bc119927 100644 --- a/app/src/main/java/com/google/samples/apps/nowinandroid/ui/NiaApp.kt +++ b/app/src/main/java/com/google/samples/apps/nowinandroid/ui/NiaApp.kt @@ -68,16 +68,16 @@ import com.google.samples.apps.nowinandroid.core.designsystem.icon.Icon.ImageVec import com.google.samples.apps.nowinandroid.core.designsystem.icon.NiaIcons import com.google.samples.apps.nowinandroid.core.designsystem.theme.GradientColors import com.google.samples.apps.nowinandroid.core.designsystem.theme.LocalGradientColors -import com.google.samples.apps.nowinandroid.feature.settings.R as settingsR import com.google.samples.apps.nowinandroid.feature.settings.SettingsDialog import com.google.samples.apps.nowinandroid.navigation.NiaNavHost import com.google.samples.apps.nowinandroid.navigation.TopLevelDestination +import com.google.samples.apps.nowinandroid.feature.settings.R as settingsR @OptIn( ExperimentalMaterial3Api::class, ExperimentalLayoutApi::class, ExperimentalComposeUiApi::class, - ExperimentalLifecycleComposeApi::class + ExperimentalLifecycleComposeApi::class, ) @Composable fun NiaApp( @@ -85,7 +85,7 @@ fun NiaApp( networkMonitor: NetworkMonitor, appState: NiaAppState = rememberNiaAppState( networkMonitor = networkMonitor, - windowSizeClass = windowSizeClass + windowSizeClass = windowSizeClass, ), ) { val shouldShowGradientBackground = @@ -106,15 +106,17 @@ fun NiaApp( // If user is not connected to the internet show a snack bar to inform them. val notConnectedMessage = stringResource(R.string.not_connected) LaunchedEffect(isOffline) { - if (isOffline) snackbarHostState.showSnackbar( - message = notConnectedMessage, - duration = Indefinite - ) + if (isOffline) { + snackbarHostState.showSnackbar( + message = notConnectedMessage, + duration = Indefinite, + ) + } } if (appState.shouldShowSettingsDialog) { SettingsDialog( - onDismiss = { appState.setShowSettingsDialog(false) } + onDismiss = { appState.setShowSettingsDialog(false) }, ) } @@ -132,10 +134,10 @@ fun NiaApp( destinations = appState.topLevelDestinations, onNavigateToDestination = appState::navigateToTopLevelDestination, currentDestination = appState.currentDestination, - modifier = Modifier.testTag("NiaBottomBar") + modifier = Modifier.testTag("NiaBottomBar"), ) } - } + }, ) { padding -> Row( Modifier @@ -144,9 +146,9 @@ fun NiaApp( .consumedWindowInsets(padding) .windowInsetsPadding( WindowInsets.safeDrawing.only( - WindowInsetsSides.Horizontal - ) - ) + WindowInsetsSides.Horizontal, + ), + ), ) { if (appState.shouldShowNavRail) { NiaNavRail( @@ -155,7 +157,7 @@ fun NiaApp( currentDestination = appState.currentDestination, modifier = Modifier .testTag("NiaNavRail") - .safeDrawingPadding() + .safeDrawingPadding(), ) } @@ -167,18 +169,18 @@ fun NiaApp( titleRes = destination.titleTextId, actionIcon = NiaIcons.Settings, actionIconContentDescription = stringResource( - id = settingsR.string.top_app_bar_action_icon_description + id = settingsR.string.top_app_bar_action_icon_description, ), colors = TopAppBarDefaults.centerAlignedTopAppBarColors( - containerColor = Color.Transparent + containerColor = Color.Transparent, ), - onActionClick = { appState.setShowSettingsDialog(true) } + onActionClick = { appState.setShowSettingsDialog(true) }, ) } NiaNavHost( navController = appState.navController, - onBackClick = appState::onBackClick + onBackClick = appState::onBackClick, ) } @@ -212,15 +214,15 @@ private fun NiaNavRail( when (icon) { is ImageVectorIcon -> Icon( imageVector = icon.imageVector, - contentDescription = null + contentDescription = null, ) is DrawableResourceIcon -> Icon( painter = painterResource(id = icon.id), - contentDescription = null + contentDescription = null, ) } }, - label = { Text(stringResource(destination.iconTextId)) } + label = { Text(stringResource(destination.iconTextId)) }, ) } } @@ -231,10 +233,10 @@ private fun NiaBottomBar( destinations: List, onNavigateToDestination: (TopLevelDestination) -> Unit, currentDestination: NavDestination?, - modifier: Modifier = Modifier + modifier: Modifier = Modifier, ) { NiaNavigationBar( - modifier = modifier + modifier = modifier, ) { destinations.forEach { destination -> val selected = currentDestination.isTopLevelDestinationInHierarchy(destination) @@ -250,16 +252,16 @@ private fun NiaBottomBar( when (icon) { is ImageVectorIcon -> Icon( imageVector = icon.imageVector, - contentDescription = null + contentDescription = null, ) is DrawableResourceIcon -> Icon( painter = painterResource(id = icon.id), - contentDescription = null + contentDescription = null, ) } }, - label = { Text(stringResource(destination.iconTextId)) } + label = { Text(stringResource(destination.iconTextId)) }, ) } } diff --git a/app/src/main/java/com/google/samples/apps/nowinandroid/ui/NiaAppState.kt b/app/src/main/java/com/google/samples/apps/nowinandroid/ui/NiaAppState.kt index bc5724c022..51df525a01 100644 --- a/app/src/main/java/com/google/samples/apps/nowinandroid/ui/NiaAppState.kt +++ b/app/src/main/java/com/google/samples/apps/nowinandroid/ui/NiaAppState.kt @@ -56,7 +56,7 @@ fun rememberNiaAppState( windowSizeClass: WindowSizeClass, networkMonitor: NetworkMonitor, coroutineScope: CoroutineScope = rememberCoroutineScope(), - navController: NavHostController = rememberNavController() + navController: NavHostController = rememberNavController(), ): NiaAppState { NavigationTrackingSideEffect(navController) return remember(navController, coroutineScope, windowSizeClass, networkMonitor) { @@ -98,7 +98,7 @@ class NiaAppState( .stateIn( scope = coroutineScope, started = SharingStarted.WhileSubscribed(5_000), - initialValue = false + initialValue = false, ) /** diff --git a/benchmarks/src/main/java/androidx/test/uiautomator/UiAutomatorHelpers.kt b/benchmarks/src/main/java/androidx/test/uiautomator/UiAutomatorHelpers.kt index 3e5191d348..85867b9825 100644 --- a/benchmarks/src/main/java/androidx/test/uiautomator/UiAutomatorHelpers.kt +++ b/benchmarks/src/main/java/androidx/test/uiautomator/UiAutomatorHelpers.kt @@ -28,7 +28,7 @@ import androidx.test.uiautomator.HasChildrenOp.EXACTLY */ fun untilHasChildren( childCount: Int = 1, - op: HasChildrenOp = AT_LEAST + op: HasChildrenOp = AT_LEAST, ): UiObject2Condition { return object : UiObject2Condition() { override fun apply(element: UiObject2): Boolean { @@ -44,5 +44,5 @@ fun untilHasChildren( enum class HasChildrenOp { AT_LEAST, EXACTLY, - AT_MOST + AT_MOST, } diff --git a/benchmarks/src/main/java/com/google/samples/apps/nowinandroid/foryou/ScrollForYouFeedBenchmark.kt b/benchmarks/src/main/java/com/google/samples/apps/nowinandroid/foryou/ScrollForYouFeedBenchmark.kt index b4e8352dce..f8945a31ca 100644 --- a/benchmarks/src/main/java/com/google/samples/apps/nowinandroid/foryou/ScrollForYouFeedBenchmark.kt +++ b/benchmarks/src/main/java/com/google/samples/apps/nowinandroid/foryou/ScrollForYouFeedBenchmark.kt @@ -47,7 +47,7 @@ class ScrollForYouFeedBenchmark { // Start the app pressHome() startActivityAndWait() - } + }, ) { forYouWaitForContent() forYouSelectTopics() diff --git a/benchmarks/src/main/java/com/google/samples/apps/nowinandroid/interests/TopicsScreenRecompositionBenchmark.kt b/benchmarks/src/main/java/com/google/samples/apps/nowinandroid/interests/TopicsScreenRecompositionBenchmark.kt index 69f02d2359..24bd233ea8 100644 --- a/benchmarks/src/main/java/com/google/samples/apps/nowinandroid/interests/TopicsScreenRecompositionBenchmark.kt +++ b/benchmarks/src/main/java/com/google/samples/apps/nowinandroid/interests/TopicsScreenRecompositionBenchmark.kt @@ -51,7 +51,7 @@ class TopicsScreenRecompositionBenchmark { // Navigate to interests screen device.findObject(By.text("Interests")).click() device.waitForIdle() - } + }, ) { interestsWaitForTopics() repeat(3) { diff --git a/benchmarks/src/main/java/com/google/samples/apps/nowinandroid/startup/StartupBenchmark.kt b/benchmarks/src/main/java/com/google/samples/apps/nowinandroid/startup/StartupBenchmark.kt index 5d83d89b27..8e396eda33 100644 --- a/benchmarks/src/main/java/com/google/samples/apps/nowinandroid/startup/StartupBenchmark.kt +++ b/benchmarks/src/main/java/com/google/samples/apps/nowinandroid/startup/StartupBenchmark.kt @@ -66,7 +66,7 @@ abstract class AbstractStartupBenchmark(private val startupMode: StartupMode) { @Test fun startupBaselineProfileDisabled() = startup( - CompilationMode.Partial(baselineProfileMode = Disable, warmupIterations = 1) + CompilationMode.Partial(baselineProfileMode = Disable, warmupIterations = 1), ) @Test @@ -83,7 +83,7 @@ abstract class AbstractStartupBenchmark(private val startupMode: StartupMode) { startupMode = startupMode, setupBlock = { pressHome() - } + }, ) { startActivityAndWait() // Waits until the content is ready to capture Time To Full Display diff --git a/core/common/src/main/java/com/google/samples/apps/nowinandroid/core/network/NiaDispatchers.kt b/core/common/src/main/java/com/google/samples/apps/nowinandroid/core/network/NiaDispatchers.kt index 5895568a79..277b68717c 100644 --- a/core/common/src/main/java/com/google/samples/apps/nowinandroid/core/network/NiaDispatchers.kt +++ b/core/common/src/main/java/com/google/samples/apps/nowinandroid/core/network/NiaDispatchers.kt @@ -24,5 +24,5 @@ import kotlin.annotation.AnnotationRetention.RUNTIME annotation class Dispatcher(val niaDispatcher: NiaDispatchers) enum class NiaDispatchers { - IO + IO, } diff --git a/core/common/src/test/java/com/google/samples/apps/nowinandroid/core/result/ResultKtTest.kt b/core/common/src/test/java/com/google/samples/apps/nowinandroid/core/result/ResultKtTest.kt index 90852c7c59..4f1229e9db 100644 --- a/core/common/src/test/java/com/google/samples/apps/nowinandroid/core/result/ResultKtTest.kt +++ b/core/common/src/test/java/com/google/samples/apps/nowinandroid/core/result/ResultKtTest.kt @@ -17,10 +17,10 @@ package com.google.samples.apps.nowinandroid.core.result import app.cash.turbine.test -import kotlin.test.assertEquals import kotlinx.coroutines.flow.flow import kotlinx.coroutines.test.runTest import org.junit.Test +import kotlin.test.assertEquals class ResultKtTest { @@ -38,11 +38,12 @@ class ResultKtTest { when (val errorResult = awaitItem()) { is Result.Error -> assertEquals( "Test Done", - errorResult.exception?.message + errorResult.exception?.message, ) Result.Loading, - is Result.Success -> throw IllegalStateException( - "The flow should have emitted an Error Result" + is Result.Success, + -> throw IllegalStateException( + "The flow should have emitted an Error Result", ) } diff --git a/core/data-test/src/main/java/com/google/samples/apps/nowinandroid/core/data/test/AlwaysOnlineNetworkMonitor.kt b/core/data-test/src/main/java/com/google/samples/apps/nowinandroid/core/data/test/AlwaysOnlineNetworkMonitor.kt index 91e47b6880..c00c99ded0 100644 --- a/core/data-test/src/main/java/com/google/samples/apps/nowinandroid/core/data/test/AlwaysOnlineNetworkMonitor.kt +++ b/core/data-test/src/main/java/com/google/samples/apps/nowinandroid/core/data/test/AlwaysOnlineNetworkMonitor.kt @@ -17,9 +17,9 @@ package com.google.samples.apps.nowinandroid.core.data.test import com.google.samples.apps.nowinandroid.core.data.util.NetworkMonitor -import javax.inject.Inject import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.flowOf +import javax.inject.Inject class AlwaysOnlineNetworkMonitor @Inject constructor() : NetworkMonitor { override val isOnline: Flow = flowOf(true) diff --git a/core/data-test/src/main/java/com/google/samples/apps/nowinandroid/core/data/test/TestDataModule.kt b/core/data-test/src/main/java/com/google/samples/apps/nowinandroid/core/data/test/TestDataModule.kt index ca20edc443..f4fc9c7b0f 100644 --- a/core/data-test/src/main/java/com/google/samples/apps/nowinandroid/core/data/test/TestDataModule.kt +++ b/core/data-test/src/main/java/com/google/samples/apps/nowinandroid/core/data/test/TestDataModule.kt @@ -32,26 +32,26 @@ import dagger.hilt.testing.TestInstallIn @Module @TestInstallIn( components = [SingletonComponent::class], - replaces = [DataModule::class] + replaces = [DataModule::class], ) interface TestDataModule { @Binds fun bindsTopicRepository( - fakeTopicsRepository: FakeTopicsRepository + fakeTopicsRepository: FakeTopicsRepository, ): TopicsRepository @Binds fun bindsNewsResourceRepository( - fakeNewsRepository: FakeNewsRepository + fakeNewsRepository: FakeNewsRepository, ): NewsRepository @Binds fun bindsUserDataRepository( - userDataRepository: FakeUserDataRepository + userDataRepository: FakeUserDataRepository, ): UserDataRepository @Binds fun bindsNetworkMonitor( - networkMonitor: AlwaysOnlineNetworkMonitor + networkMonitor: AlwaysOnlineNetworkMonitor, ): NetworkMonitor } diff --git a/core/data/src/main/java/com/google/samples/apps/nowinandroid/core/data/SyncUtilities.kt b/core/data/src/main/java/com/google/samples/apps/nowinandroid/core/data/SyncUtilities.kt index 0f2a592de0..5d069dbafb 100644 --- a/core/data/src/main/java/com/google/samples/apps/nowinandroid/core/data/SyncUtilities.kt +++ b/core/data/src/main/java/com/google/samples/apps/nowinandroid/core/data/SyncUtilities.kt @@ -19,9 +19,9 @@ package com.google.samples.apps.nowinandroid.core.data import android.util.Log import com.google.samples.apps.nowinandroid.core.datastore.ChangeListVersions import com.google.samples.apps.nowinandroid.core.network.model.NetworkChangeList -import kotlin.coroutines.cancellation.CancellationException import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.combine +import kotlin.coroutines.cancellation.CancellationException /** * Interface marker for a class that manages synchronization between local data and a remote @@ -62,7 +62,7 @@ private suspend fun suspendRunCatching(block: suspend () -> T): Result = Log.i( "suspendRunCatching", "Failed to evaluate a suspendRunCatchingBlock. Returning failure Result", - exception + exception, ) Result.failure(exception) } @@ -116,10 +116,10 @@ fun combine( flow4: Flow, flow5: Flow, flow6: Flow, - transform: suspend (T1, T2, T3, T4, T5, T6) -> R + transform: suspend (T1, T2, T3, T4, T5, T6) -> R, ): Flow = combine( combine(flow, flow2, flow3, ::Triple), - combine(flow4, flow5, flow6, ::Triple) + combine(flow4, flow5, flow6, ::Triple), ) { t1, t2 -> transform( t1.first, @@ -127,6 +127,6 @@ fun combine( t1.third, t2.first, t2.second, - t2.third + t2.third, ) } diff --git a/core/data/src/main/java/com/google/samples/apps/nowinandroid/core/data/di/DataModule.kt b/core/data/src/main/java/com/google/samples/apps/nowinandroid/core/data/di/DataModule.kt index c585524165..b4dda701e8 100644 --- a/core/data/src/main/java/com/google/samples/apps/nowinandroid/core/data/di/DataModule.kt +++ b/core/data/src/main/java/com/google/samples/apps/nowinandroid/core/data/di/DataModule.kt @@ -35,21 +35,21 @@ interface DataModule { @Binds fun bindsTopicRepository( - topicsRepository: OfflineFirstTopicsRepository + topicsRepository: OfflineFirstTopicsRepository, ): TopicsRepository @Binds fun bindsNewsResourceRepository( - newsRepository: OfflineFirstNewsRepository + newsRepository: OfflineFirstNewsRepository, ): NewsRepository @Binds fun bindsUserDataRepository( - userDataRepository: OfflineFirstUserDataRepository + userDataRepository: OfflineFirstUserDataRepository, ): UserDataRepository @Binds fun bindsNetworkMonitor( - networkMonitor: ConnectivityManagerNetworkMonitor + networkMonitor: ConnectivityManagerNetworkMonitor, ): NetworkMonitor } diff --git a/core/data/src/main/java/com/google/samples/apps/nowinandroid/core/data/model/NewsResource.kt b/core/data/src/main/java/com/google/samples/apps/nowinandroid/core/data/model/NewsResource.kt index ecb2d7a4e8..c3ad91dfe3 100644 --- a/core/data/src/main/java/com/google/samples/apps/nowinandroid/core/data/model/NewsResource.kt +++ b/core/data/src/main/java/com/google/samples/apps/nowinandroid/core/data/model/NewsResource.kt @@ -62,6 +62,6 @@ fun NetworkNewsResource.topicCrossReferences(): List topics.map { topicId -> NewsResourceTopicCrossRef( newsResourceId = id, - topicId = topicId + topicId = topicId, ) } diff --git a/core/data/src/main/java/com/google/samples/apps/nowinandroid/core/data/model/Topic.kt b/core/data/src/main/java/com/google/samples/apps/nowinandroid/core/data/model/Topic.kt index b9acb90a0b..188b1e06d0 100644 --- a/core/data/src/main/java/com/google/samples/apps/nowinandroid/core/data/model/Topic.kt +++ b/core/data/src/main/java/com/google/samples/apps/nowinandroid/core/data/model/Topic.kt @@ -25,5 +25,5 @@ fun NetworkTopic.asEntity() = TopicEntity( shortDescription = shortDescription, longDescription = longDescription, url = url, - imageUrl = imageUrl + imageUrl = imageUrl, ) diff --git a/core/data/src/main/java/com/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstNewsRepository.kt b/core/data/src/main/java/com/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstNewsRepository.kt index bd434a7dca..9e041b9566 100644 --- a/core/data/src/main/java/com/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstNewsRepository.kt +++ b/core/data/src/main/java/com/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstNewsRepository.kt @@ -30,9 +30,9 @@ import com.google.samples.apps.nowinandroid.core.datastore.ChangeListVersions import com.google.samples.apps.nowinandroid.core.model.data.NewsResource import com.google.samples.apps.nowinandroid.core.network.NiaNetworkDataSource import com.google.samples.apps.nowinandroid.core.network.model.NetworkNewsResource -import javax.inject.Inject import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.map +import javax.inject.Inject /** * Disk storage backed implementation of the [NewsRepository]. @@ -49,9 +49,9 @@ class OfflineFirstNewsRepository @Inject constructor( .map { it.map(PopulatedNewsResource::asExternalModel) } override fun getNewsResources( - filterTopicIds: Set + filterTopicIds: Set, ): Flow> = newsResourceDao.getNewsResources( - filterTopicIds = filterTopicIds + filterTopicIds = filterTopicIds, ) .map { it.map(PopulatedNewsResource::asExternalModel) } @@ -74,18 +74,18 @@ class OfflineFirstNewsRepository @Inject constructor( topicEntities = networkNewsResources .map(NetworkNewsResource::topicEntityShells) .flatten() - .distinctBy(TopicEntity::id) + .distinctBy(TopicEntity::id), ) newsResourceDao.upsertNewsResources( newsResourceEntities = networkNewsResources - .map(NetworkNewsResource::asEntity) + .map(NetworkNewsResource::asEntity), ) newsResourceDao.insertOrIgnoreTopicCrossRefEntities( newsResourceTopicCrossReferences = networkNewsResources .map(NetworkNewsResource::topicCrossReferences) .distinct() - .flatten() + .flatten(), ) - } + }, ) } diff --git a/core/data/src/main/java/com/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstTopicsRepository.kt b/core/data/src/main/java/com/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstTopicsRepository.kt index c3d2cb72e5..13dd19e497 100644 --- a/core/data/src/main/java/com/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstTopicsRepository.kt +++ b/core/data/src/main/java/com/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstTopicsRepository.kt @@ -26,9 +26,9 @@ import com.google.samples.apps.nowinandroid.core.datastore.ChangeListVersions import com.google.samples.apps.nowinandroid.core.model.data.Topic import com.google.samples.apps.nowinandroid.core.network.NiaNetworkDataSource import com.google.samples.apps.nowinandroid.core.network.model.NetworkTopic -import javax.inject.Inject import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.map +import javax.inject.Inject /** * Disk storage backed implementation of the [TopicsRepository]. @@ -59,8 +59,8 @@ class OfflineFirstTopicsRepository @Inject constructor( modelUpdater = { changedIds -> val networkTopics = network.getTopics(ids = changedIds) topicDao.upsertTopics( - entities = networkTopics.map(NetworkTopic::asEntity) + entities = networkTopics.map(NetworkTopic::asEntity), ) - } + }, ) } diff --git a/core/data/src/main/java/com/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstUserDataRepository.kt b/core/data/src/main/java/com/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstUserDataRepository.kt index 954779a3f1..200ca4a3d1 100644 --- a/core/data/src/main/java/com/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstUserDataRepository.kt +++ b/core/data/src/main/java/com/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstUserDataRepository.kt @@ -20,11 +20,11 @@ import com.google.samples.apps.nowinandroid.core.datastore.NiaPreferencesDataSou import com.google.samples.apps.nowinandroid.core.model.data.DarkThemeConfig import com.google.samples.apps.nowinandroid.core.model.data.ThemeBrand import com.google.samples.apps.nowinandroid.core.model.data.UserData -import javax.inject.Inject import kotlinx.coroutines.flow.Flow +import javax.inject.Inject class OfflineFirstUserDataRepository @Inject constructor( - private val niaPreferencesDataSource: NiaPreferencesDataSource + private val niaPreferencesDataSource: NiaPreferencesDataSource, ) : UserDataRepository { override val userData: Flow = diff --git a/core/data/src/main/java/com/google/samples/apps/nowinandroid/core/data/repository/fake/FakeNewsRepository.kt b/core/data/src/main/java/com/google/samples/apps/nowinandroid/core/data/repository/fake/FakeNewsRepository.kt index f74a94a436..d6a7125389 100644 --- a/core/data/src/main/java/com/google/samples/apps/nowinandroid/core/data/repository/fake/FakeNewsRepository.kt +++ b/core/data/src/main/java/com/google/samples/apps/nowinandroid/core/data/repository/fake/FakeNewsRepository.kt @@ -26,11 +26,11 @@ import com.google.samples.apps.nowinandroid.core.network.Dispatcher import com.google.samples.apps.nowinandroid.core.network.NiaDispatchers.IO import com.google.samples.apps.nowinandroid.core.network.fake.FakeNiaNetworkDataSource import com.google.samples.apps.nowinandroid.core.network.model.NetworkNewsResource -import javax.inject.Inject import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.flowOn +import javax.inject.Inject /** * Fake implementation of the [NewsRepository] that retrieves the news resources from a JSON String. @@ -40,7 +40,7 @@ import kotlinx.coroutines.flow.flowOn */ class FakeNewsRepository @Inject constructor( @Dispatcher(IO) private val ioDispatcher: CoroutineDispatcher, - private val datasource: FakeNiaNetworkDataSource + private val datasource: FakeNiaNetworkDataSource, ) : NewsRepository { override fun getNewsResources(): Flow> = @@ -48,7 +48,7 @@ class FakeNewsRepository @Inject constructor( emit( datasource.getNewsResources() .map(NetworkNewsResource::asEntity) - .map(NewsResourceEntity::asExternalModel) + .map(NewsResourceEntity::asExternalModel), ) }.flowOn(ioDispatcher) @@ -61,7 +61,7 @@ class FakeNewsRepository @Inject constructor( .getNewsResources() .filter { it.topics.intersect(filterTopicIds).isNotEmpty() } .map(NetworkNewsResource::asEntity) - .map(NewsResourceEntity::asExternalModel) + .map(NewsResourceEntity::asExternalModel), ) }.flowOn(ioDispatcher) diff --git a/core/data/src/main/java/com/google/samples/apps/nowinandroid/core/data/repository/fake/FakeTopicsRepository.kt b/core/data/src/main/java/com/google/samples/apps/nowinandroid/core/data/repository/fake/FakeTopicsRepository.kt index 60d876b754..1ab9c93532 100644 --- a/core/data/src/main/java/com/google/samples/apps/nowinandroid/core/data/repository/fake/FakeTopicsRepository.kt +++ b/core/data/src/main/java/com/google/samples/apps/nowinandroid/core/data/repository/fake/FakeTopicsRepository.kt @@ -22,12 +22,12 @@ import com.google.samples.apps.nowinandroid.core.model.data.Topic import com.google.samples.apps.nowinandroid.core.network.Dispatcher import com.google.samples.apps.nowinandroid.core.network.NiaDispatchers.IO import com.google.samples.apps.nowinandroid.core.network.fake.FakeNiaNetworkDataSource -import javax.inject.Inject import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.flow.map +import javax.inject.Inject /** * Fake implementation of the [TopicsRepository] that retrieves the topics from a JSON String, and @@ -38,7 +38,7 @@ import kotlinx.coroutines.flow.map */ class FakeTopicsRepository @Inject constructor( @Dispatcher(IO) private val ioDispatcher: CoroutineDispatcher, - private val datasource: FakeNiaNetworkDataSource + private val datasource: FakeNiaNetworkDataSource, ) : TopicsRepository { override fun getTopics(): Flow> = flow { emit( @@ -49,9 +49,9 @@ class FakeTopicsRepository @Inject constructor( shortDescription = it.shortDescription, longDescription = it.longDescription, url = it.url, - imageUrl = it.imageUrl + imageUrl = it.imageUrl, ) - } + }, ) }.flowOn(ioDispatcher) diff --git a/core/data/src/main/java/com/google/samples/apps/nowinandroid/core/data/repository/fake/FakeUserDataRepository.kt b/core/data/src/main/java/com/google/samples/apps/nowinandroid/core/data/repository/fake/FakeUserDataRepository.kt index d7920cabcb..af206e5c79 100644 --- a/core/data/src/main/java/com/google/samples/apps/nowinandroid/core/data/repository/fake/FakeUserDataRepository.kt +++ b/core/data/src/main/java/com/google/samples/apps/nowinandroid/core/data/repository/fake/FakeUserDataRepository.kt @@ -21,8 +21,8 @@ import com.google.samples.apps.nowinandroid.core.datastore.NiaPreferencesDataSou import com.google.samples.apps.nowinandroid.core.model.data.DarkThemeConfig import com.google.samples.apps.nowinandroid.core.model.data.ThemeBrand import com.google.samples.apps.nowinandroid.core.model.data.UserData -import javax.inject.Inject import kotlinx.coroutines.flow.Flow +import javax.inject.Inject /** * Fake implementation of the [UserDataRepository] that returns hardcoded user data. diff --git a/core/data/src/main/java/com/google/samples/apps/nowinandroid/core/data/util/ConnectivityManagerNetworkMonitor.kt b/core/data/src/main/java/com/google/samples/apps/nowinandroid/core/data/util/ConnectivityManagerNetworkMonitor.kt index 0f86f5384f..982f47c6e8 100644 --- a/core/data/src/main/java/com/google/samples/apps/nowinandroid/core/data/util/ConnectivityManagerNetworkMonitor.kt +++ b/core/data/src/main/java/com/google/samples/apps/nowinandroid/core/data/util/ConnectivityManagerNetworkMonitor.kt @@ -26,14 +26,14 @@ import android.os.Build.VERSION import android.os.Build.VERSION_CODES import androidx.core.content.getSystemService import dagger.hilt.android.qualifiers.ApplicationContext -import javax.inject.Inject import kotlinx.coroutines.channels.awaitClose import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.callbackFlow import kotlinx.coroutines.flow.conflate +import javax.inject.Inject class ConnectivityManagerNetworkMonitor @Inject constructor( - @ApplicationContext private val context: Context + @ApplicationContext private val context: Context, ) : NetworkMonitor { override val isOnline: Flow = callbackFlow { val connectivityManager = context.getSystemService() @@ -54,7 +54,7 @@ class ConnectivityManagerNetworkMonitor @Inject constructor( override fun onCapabilitiesChanged( network: Network, - networkCapabilities: NetworkCapabilities + networkCapabilities: NetworkCapabilities, ) { channel.trySend(connectivityManager.isCurrentlyConnected()) } @@ -64,7 +64,7 @@ class ConnectivityManagerNetworkMonitor @Inject constructor( Builder() .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) .build(), - callback + callback, ) channel.trySend(connectivityManager.isCurrentlyConnected()) diff --git a/core/data/src/test/java/com/google/samples/apps/nowinandroid/core/data/model/NetworkEntityKtTest.kt b/core/data/src/test/java/com/google/samples/apps/nowinandroid/core/data/model/NetworkEntityKtTest.kt index ed0c78c8ee..dbbb3a94e9 100644 --- a/core/data/src/test/java/com/google/samples/apps/nowinandroid/core/data/model/NetworkEntityKtTest.kt +++ b/core/data/src/test/java/com/google/samples/apps/nowinandroid/core/data/model/NetworkEntityKtTest.kt @@ -20,9 +20,9 @@ import com.google.samples.apps.nowinandroid.core.model.data.NewsResourceType.Art import com.google.samples.apps.nowinandroid.core.network.model.NetworkNewsResource import com.google.samples.apps.nowinandroid.core.network.model.NetworkNewsResourceExpanded import com.google.samples.apps.nowinandroid.core.network.model.NetworkTopic -import kotlin.test.assertEquals import kotlinx.datetime.Instant import org.junit.Test +import kotlin.test.assertEquals class NetworkEntityKtTest { diff --git a/core/data/src/test/java/com/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstNewsRepositoryTest.kt b/core/data/src/test/java/com/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstNewsRepositoryTest.kt index cc32bf9bb0..74848d6559 100644 --- a/core/data/src/test/java/com/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstNewsRepositoryTest.kt +++ b/core/data/src/test/java/com/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstNewsRepositoryTest.kt @@ -35,13 +35,13 @@ import com.google.samples.apps.nowinandroid.core.datastore.test.testUserPreferen import com.google.samples.apps.nowinandroid.core.model.data.NewsResource import com.google.samples.apps.nowinandroid.core.network.model.NetworkChangeList import com.google.samples.apps.nowinandroid.core.network.model.NetworkNewsResource -import kotlin.test.assertEquals import kotlinx.coroutines.flow.first import kotlinx.coroutines.test.runTest import org.junit.Before import org.junit.Rule import org.junit.Test import org.junit.rules.TemporaryFolder +import kotlin.test.assertEquals class OfflineFirstNewsRepositoryTest { @@ -65,8 +65,8 @@ class OfflineFirstNewsRepositoryTest { network = TestNiaNetworkDataSource() synchronizer = TestSynchronizer( NiaPreferencesDataSource( - tmpFolder.testUserPreferencesDataStore() - ) + tmpFolder.testUserPreferencesDataStore(), + ), ) subject = OfflineFirstNewsRepository( @@ -84,7 +84,7 @@ class OfflineFirstNewsRepositoryTest { .first() .map(PopulatedNewsResource::asExternalModel), subject.getNewsResources() - .first() + .first(), ) } @@ -100,7 +100,7 @@ class OfflineFirstNewsRepositoryTest { subject.getNewsResources( filterTopicIds = filteredInterestsIds, ) - .first() + .first(), ) assertEquals( @@ -108,7 +108,7 @@ class OfflineFirstNewsRepositoryTest { subject.getNewsResources( filterTopicIds = nonPresentInterestsIds, ) - .first() + .first(), ) } @@ -127,13 +127,13 @@ class OfflineFirstNewsRepositoryTest { assertEquals( newsResourcesFromNetwork.map(NewsResource::id), - newsResourcesFromDb.map(NewsResource::id) + newsResourcesFromDb.map(NewsResource::id), ) // After sync version should be updated assertEquals( network.latestChangeListVersion(CollectionType.NewsResources), - synchronizer.getChangeListVersions().newsResourceVersion + synchronizer.getChangeListVersions().newsResourceVersion, ) } @@ -155,7 +155,7 @@ class OfflineFirstNewsRepositoryTest { network.editCollection( collectionType = CollectionType.NewsResources, id = it, - isDelete = true + isDelete = true, ) } @@ -168,13 +168,13 @@ class OfflineFirstNewsRepositoryTest { // Assert that items marked deleted on the network have been deleted locally assertEquals( newsResourcesFromNetwork.map(NewsResource::id) - deletedItems, - newsResourcesFromDb.map(NewsResource::id) + newsResourcesFromDb.map(NewsResource::id), ) // After sync version should be updated assertEquals( network.latestChangeListVersion(CollectionType.NewsResources), - synchronizer.getChangeListVersions().newsResourceVersion + synchronizer.getChangeListVersions().newsResourceVersion, ) } @@ -190,7 +190,7 @@ class OfflineFirstNewsRepositoryTest { val changeList = network.changeListsAfter( CollectionType.NewsResources, - version = 7 + version = 7, ) val changeListIds = changeList .map(NetworkChangeList::id) @@ -207,13 +207,13 @@ class OfflineFirstNewsRepositoryTest { assertEquals( newsResourcesFromNetwork.map(NewsResource::id), - newsResourcesFromDb.map(NewsResource::id) + newsResourcesFromDb.map(NewsResource::id), ) // After sync version should be updated assertEquals( changeList.last().changeListVersion, - synchronizer.getChangeListVersions().newsResourceVersion + synchronizer.getChangeListVersions().newsResourceVersion, ) } @@ -228,7 +228,7 @@ class OfflineFirstNewsRepositoryTest { .flatten() .distinctBy(TopicEntity::id), topicDao.getTopicEntities() - .first() + .first(), ) } @@ -242,7 +242,7 @@ class OfflineFirstNewsRepositoryTest { .map(NetworkNewsResource::topicCrossReferences) .distinct() .flatten(), - newsResourceDao.topicCrossReferences + newsResourceDao.topicCrossReferences, ) } } diff --git a/core/data/src/test/java/com/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstTopicsRepositoryTest.kt b/core/data/src/test/java/com/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstTopicsRepositoryTest.kt index 5c3f8dfc09..ca9941b8a4 100644 --- a/core/data/src/test/java/com/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstTopicsRepositoryTest.kt +++ b/core/data/src/test/java/com/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstTopicsRepositoryTest.kt @@ -28,13 +28,13 @@ import com.google.samples.apps.nowinandroid.core.datastore.NiaPreferencesDataSou import com.google.samples.apps.nowinandroid.core.datastore.test.testUserPreferencesDataStore import com.google.samples.apps.nowinandroid.core.model.data.Topic import com.google.samples.apps.nowinandroid.core.network.model.NetworkTopic -import kotlin.test.assertEquals import kotlinx.coroutines.flow.first import kotlinx.coroutines.test.runTest import org.junit.Before import org.junit.Rule import org.junit.Test import org.junit.rules.TemporaryFolder +import kotlin.test.assertEquals class OfflineFirstTopicsRepositoryTest { @@ -56,13 +56,13 @@ class OfflineFirstTopicsRepositoryTest { topicDao = TestTopicDao() network = TestNiaNetworkDataSource() niaPreferences = NiaPreferencesDataSource( - tmpFolder.testUserPreferencesDataStore() + tmpFolder.testUserPreferencesDataStore(), ) synchronizer = TestSynchronizer(niaPreferences) subject = OfflineFirstTopicsRepository( topicDao = topicDao, - network = network + network = network, ) } @@ -74,7 +74,7 @@ class OfflineFirstTopicsRepositoryTest { .first() .map(TopicEntity::asExternalModel), subject.getTopics() - .first() + .first(), ) } @@ -91,13 +91,13 @@ class OfflineFirstTopicsRepositoryTest { assertEquals( networkTopics.map(TopicEntity::id), - dbTopics.map(TopicEntity::id) + dbTopics.map(TopicEntity::id), ) // After sync version should be updated assertEquals( network.latestChangeListVersion(CollectionType.Topics), - synchronizer.getChangeListVersions().topicVersion + synchronizer.getChangeListVersions().topicVersion, ) } @@ -121,13 +121,13 @@ class OfflineFirstTopicsRepositoryTest { assertEquals( networkTopics.map(TopicEntity::id), - dbTopics.map(TopicEntity::id) + dbTopics.map(TopicEntity::id), ) // After sync version should be updated assertEquals( network.latestChangeListVersion(CollectionType.Topics), - synchronizer.getChangeListVersions().topicVersion + synchronizer.getChangeListVersions().topicVersion, ) } @@ -149,7 +149,7 @@ class OfflineFirstTopicsRepositoryTest { network.editCollection( collectionType = CollectionType.Topics, id = it, - isDelete = true + isDelete = true, ) } @@ -162,13 +162,13 @@ class OfflineFirstTopicsRepositoryTest { // Assert that items marked deleted on the network have been deleted locally assertEquals( networkTopics.map(Topic::id) - deletedItems, - dbTopics.map(Topic::id) + dbTopics.map(Topic::id), ) // After sync version should be updated assertEquals( network.latestChangeListVersion(CollectionType.Topics), - synchronizer.getChangeListVersions().topicVersion + synchronizer.getChangeListVersions().topicVersion, ) } } diff --git a/core/data/src/test/java/com/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstUserDataRepositoryTest.kt b/core/data/src/test/java/com/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstUserDataRepositoryTest.kt index 926052ea8f..055d8e074a 100644 --- a/core/data/src/test/java/com/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstUserDataRepositoryTest.kt +++ b/core/data/src/test/java/com/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstUserDataRepositoryTest.kt @@ -21,9 +21,6 @@ import com.google.samples.apps.nowinandroid.core.datastore.test.testUserPreferen import com.google.samples.apps.nowinandroid.core.model.data.DarkThemeConfig import com.google.samples.apps.nowinandroid.core.model.data.ThemeBrand import com.google.samples.apps.nowinandroid.core.model.data.UserData -import kotlin.test.assertEquals -import kotlin.test.assertFalse -import kotlin.test.assertTrue import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.map import kotlinx.coroutines.test.runTest @@ -31,6 +28,9 @@ import org.junit.Before import org.junit.Rule import org.junit.Test import org.junit.rules.TemporaryFolder +import kotlin.test.assertEquals +import kotlin.test.assertFalse +import kotlin.test.assertTrue class OfflineFirstUserDataRepositoryTest { private lateinit var subject: OfflineFirstUserDataRepository @@ -43,11 +43,11 @@ class OfflineFirstUserDataRepositoryTest { @Before fun setup() { niaPreferencesDataSource = NiaPreferencesDataSource( - tmpFolder.testUserPreferencesDataStore() + tmpFolder.testUserPreferencesDataStore(), ) subject = OfflineFirstUserDataRepository( - niaPreferencesDataSource = niaPreferencesDataSource + niaPreferencesDataSource = niaPreferencesDataSource, ) } @@ -61,9 +61,9 @@ class OfflineFirstUserDataRepositoryTest { themeBrand = ThemeBrand.DEFAULT, darkThemeConfig = DarkThemeConfig.FOLLOW_SYSTEM, useDynamicColor = false, - shouldHideOnboarding = false + shouldHideOnboarding = false, ), - subject.userData.first() + subject.userData.first(), ) } @@ -76,7 +76,7 @@ class OfflineFirstUserDataRepositoryTest { setOf("0"), subject.userData .map { it.followedTopics } - .first() + .first(), ) subject.toggleFollowedTopicId(followedTopicId = "1", followed = true) @@ -85,7 +85,7 @@ class OfflineFirstUserDataRepositoryTest { setOf("0", "1"), subject.userData .map { it.followedTopics } - .first() + .first(), ) assertEquals( @@ -94,7 +94,7 @@ class OfflineFirstUserDataRepositoryTest { .first(), subject.userData .map { it.followedTopics } - .first() + .first(), ) } @@ -107,7 +107,7 @@ class OfflineFirstUserDataRepositoryTest { setOf("1", "2"), subject.userData .map { it.followedTopics } - .first() + .first(), ) assertEquals( @@ -116,7 +116,7 @@ class OfflineFirstUserDataRepositoryTest { .first(), subject.userData .map { it.followedTopics } - .first() + .first(), ) } @@ -129,7 +129,7 @@ class OfflineFirstUserDataRepositoryTest { setOf("0"), subject.userData .map { it.bookmarkedNewsResources } - .first() + .first(), ) subject.updateNewsResourceBookmark(newsResourceId = "1", bookmarked = true) @@ -138,7 +138,7 @@ class OfflineFirstUserDataRepositoryTest { setOf("0", "1"), subject.userData .map { it.bookmarkedNewsResources } - .first() + .first(), ) assertEquals( @@ -147,7 +147,7 @@ class OfflineFirstUserDataRepositoryTest { .first(), subject.userData .map { it.bookmarkedNewsResources } - .first() + .first(), ) } @@ -160,14 +160,14 @@ class OfflineFirstUserDataRepositoryTest { ThemeBrand.ANDROID, subject.userData .map { it.themeBrand } - .first() + .first(), ) assertEquals( ThemeBrand.ANDROID, niaPreferencesDataSource .userData .map { it.themeBrand } - .first() + .first(), ) } @@ -180,14 +180,14 @@ class OfflineFirstUserDataRepositoryTest { true, subject.userData .map { it.useDynamicColor } - .first() + .first(), ) assertEquals( true, niaPreferencesDataSource .userData .map { it.useDynamicColor } - .first() + .first(), ) } @@ -200,14 +200,14 @@ class OfflineFirstUserDataRepositoryTest { DarkThemeConfig.DARK, subject.userData .map { it.darkThemeConfig } - .first() + .first(), ) assertEquals( DarkThemeConfig.DARK, niaPreferencesDataSource .userData .map { it.darkThemeConfig } - .first() + .first(), ) } diff --git a/core/data/src/test/java/com/google/samples/apps/nowinandroid/core/data/repository/TestSynchronizer.kt b/core/data/src/test/java/com/google/samples/apps/nowinandroid/core/data/repository/TestSynchronizer.kt index e50a3776b2..270dd010e3 100644 --- a/core/data/src/test/java/com/google/samples/apps/nowinandroid/core/data/repository/TestSynchronizer.kt +++ b/core/data/src/test/java/com/google/samples/apps/nowinandroid/core/data/repository/TestSynchronizer.kt @@ -24,12 +24,12 @@ import com.google.samples.apps.nowinandroid.core.datastore.NiaPreferencesDataSou * Test synchronizer that delegates to [NiaPreferencesDataSource] */ class TestSynchronizer( - private val niaPreferences: NiaPreferencesDataSource + private val niaPreferences: NiaPreferencesDataSource, ) : Synchronizer { override suspend fun getChangeListVersions(): ChangeListVersions = niaPreferences.getChangeListVersions() override suspend fun updateChangeListVersions( - update: ChangeListVersions.() -> ChangeListVersions + update: ChangeListVersions.() -> ChangeListVersions, ) = niaPreferences.updateChangeListVersion(update) } diff --git a/core/data/src/test/java/com/google/samples/apps/nowinandroid/core/data/testdoubles/TestNewsResourceDao.kt b/core/data/src/test/java/com/google/samples/apps/nowinandroid/core/data/testdoubles/TestNewsResourceDao.kt index 6441cf6ed2..f63014075f 100644 --- a/core/data/src/test/java/com/google/samples/apps/nowinandroid/core/data/testdoubles/TestNewsResourceDao.kt +++ b/core/data/src/test/java/com/google/samples/apps/nowinandroid/core/data/testdoubles/TestNewsResourceDao.kt @@ -46,8 +46,8 @@ class TestNewsResourceDao : NewsResourceDao { headerImageUrl = "headerImageUrl", type = Video, publishDate = Instant.fromEpochMilliseconds(1), - ) - ) + ), + ), ) internal var topicCrossReferences: List = listOf() @@ -58,7 +58,7 @@ class TestNewsResourceDao : NewsResourceDao { } override fun getNewsResources( - filterTopicIds: Set + filterTopicIds: Set, ): Flow> = getNewsResources() .map { resources -> @@ -68,7 +68,7 @@ class TestNewsResourceDao : NewsResourceDao { } override suspend fun insertOrIgnoreNewsResources( - entities: List + entities: List, ): List { entitiesStateFlow.value = entities // Assume no conflicts on insert @@ -84,7 +84,7 @@ class TestNewsResourceDao : NewsResourceDao { } override suspend fun insertOrIgnoreTopicCrossRefEntities( - newsResourceTopicCrossReferences: List + newsResourceTopicCrossReferences: List, ) { topicCrossReferences = newsResourceTopicCrossReferences } @@ -107,6 +107,6 @@ private fun NewsResourceEntity.asPopulatedNewsResource() = PopulatedNewsResource longDescription = "long description", url = "URL", imageUrl = "image URL", - ) + ), ), ) diff --git a/core/data/src/test/java/com/google/samples/apps/nowinandroid/core/data/testdoubles/TestNiaNetworkDataSource.kt b/core/data/src/test/java/com/google/samples/apps/nowinandroid/core/data/testdoubles/TestNiaNetworkDataSource.kt index abbf39f509..8e248a3aa5 100644 --- a/core/data/src/test/java/com/google/samples/apps/nowinandroid/core/data/testdoubles/TestNiaNetworkDataSource.kt +++ b/core/data/src/test/java/com/google/samples/apps/nowinandroid/core/data/testdoubles/TestNiaNetworkDataSource.kt @@ -27,7 +27,7 @@ import kotlinx.serialization.json.Json enum class CollectionType { Topics, - NewsResources + NewsResources, } /** @@ -37,7 +37,7 @@ class TestNiaNetworkDataSource : NiaNetworkDataSource { private val source = FakeNiaNetworkDataSource( UnconfinedTestDispatcher(), - Json { ignoreUnknownKeys = true } + Json { ignoreUnknownKeys = true }, ) private val allTopics = runBlocking { source.getTopics() } @@ -54,13 +54,13 @@ class TestNiaNetworkDataSource : NiaNetworkDataSource { override suspend fun getTopics(ids: List?): List = allTopics.matchIds( ids = ids, - idGetter = NetworkTopic::id + idGetter = NetworkTopic::id, ) override suspend fun getNewsResources(ids: List?): List = allNewsResources.matchIds( ids = ids, - idGetter = NetworkNewsResource::id + idGetter = NetworkNewsResource::id, ) override suspend fun getTopicChangeList(after: Int?): List = @@ -102,7 +102,7 @@ fun List.after(version: Int?): List = */ private fun List.matchIds( ids: List?, - idGetter: (T) -> String + idGetter: (T) -> String, ) = when (ids) { null -> this else -> ids.toSet().let { idSet -> this.filter { idSet.contains(idGetter(it)) } } @@ -113,7 +113,7 @@ private fun List.matchIds( * [after] simulates which models have changed by excluding items before it */ private fun List.mapToChangeList( - idGetter: (T) -> String + idGetter: (T) -> String, ) = mapIndexed { index, item -> NetworkChangeList( id = idGetter(item), diff --git a/core/data/src/test/java/com/google/samples/apps/nowinandroid/core/data/testdoubles/TestTopicDao.kt b/core/data/src/test/java/com/google/samples/apps/nowinandroid/core/data/testdoubles/TestTopicDao.kt index d842f1501e..8ac0dc0b82 100644 --- a/core/data/src/test/java/com/google/samples/apps/nowinandroid/core/data/testdoubles/TestTopicDao.kt +++ b/core/data/src/test/java/com/google/samples/apps/nowinandroid/core/data/testdoubles/TestTopicDao.kt @@ -37,8 +37,8 @@ class TestTopicDao : TopicDao { longDescription = "long description", url = "URL", imageUrl = "image URL", - ) - ) + ), + ), ) override fun getTopicEntity(topicId: String): Flow { diff --git a/core/data/src/test/java/com/google/samples/apps/nowinandroid/core/database/model/PopulatedNewsResourceKtTest.kt b/core/data/src/test/java/com/google/samples/apps/nowinandroid/core/database/model/PopulatedNewsResourceKtTest.kt index fa500decbc..83158f6cd0 100644 --- a/core/data/src/test/java/com/google/samples/apps/nowinandroid/core/database/model/PopulatedNewsResourceKtTest.kt +++ b/core/data/src/test/java/com/google/samples/apps/nowinandroid/core/database/model/PopulatedNewsResourceKtTest.kt @@ -19,9 +19,9 @@ package com.google.samples.apps.nowinandroid.core.database.model import com.google.samples.apps.nowinandroid.core.model.data.NewsResource import com.google.samples.apps.nowinandroid.core.model.data.NewsResourceType.Video import com.google.samples.apps.nowinandroid.core.model.data.Topic -import kotlin.test.assertEquals import kotlinx.datetime.Instant import org.junit.Test +import kotlin.test.assertEquals class PopulatedNewsResourceKtTest { @Test @@ -44,7 +44,7 @@ class PopulatedNewsResourceKtTest { longDescription = "long description", url = "URL", imageUrl = "image URL", - ) + ), ), ) val newsResource = populatedNewsResource.asExternalModel() @@ -66,10 +66,10 @@ class PopulatedNewsResourceKtTest { longDescription = "long description", url = "URL", imageUrl = "image URL", - ) - ) + ), + ), ), - newsResource + newsResource, ) } } diff --git a/core/data/src/test/java/com/google/samples/apps/nowinandroid/core/database/util/NewsResourceTypeConverterTest.kt b/core/data/src/test/java/com/google/samples/apps/nowinandroid/core/database/util/NewsResourceTypeConverterTest.kt index 37a25dc7ea..77a09819b1 100644 --- a/core/data/src/test/java/com/google/samples/apps/nowinandroid/core/database/util/NewsResourceTypeConverterTest.kt +++ b/core/data/src/test/java/com/google/samples/apps/nowinandroid/core/database/util/NewsResourceTypeConverterTest.kt @@ -17,8 +17,8 @@ package com.google.samples.apps.nowinandroid.core.database.util import com.google.samples.apps.nowinandroid.core.model.data.NewsResourceType -import kotlin.test.assertEquals import org.junit.Test +import kotlin.test.assertEquals class NewsResourceTypeConverterTest { @@ -26,7 +26,7 @@ class NewsResourceTypeConverterTest { fun test_room_news_resource_type_converter_for_video() { assertEquals( NewsResourceType.Video, - NewsResourceTypeConverter().stringToNewsResourceType("Video 📺") + NewsResourceTypeConverter().stringToNewsResourceType("Video 📺"), ) } @@ -34,7 +34,7 @@ class NewsResourceTypeConverterTest { fun test_room_news_resource_type_converter_for_article() { assertEquals( NewsResourceType.Article, - NewsResourceTypeConverter().stringToNewsResourceType("Article 📚") + NewsResourceTypeConverter().stringToNewsResourceType("Article 📚"), ) } @@ -42,7 +42,7 @@ class NewsResourceTypeConverterTest { fun test_room_news_resource_type_converter_for_api_change() { assertEquals( NewsResourceType.APIChange, - NewsResourceTypeConverter().stringToNewsResourceType("API change") + NewsResourceTypeConverter().stringToNewsResourceType("API change"), ) } @@ -50,7 +50,7 @@ class NewsResourceTypeConverterTest { fun test_room_news_resource_type_converter_for_codelab() { assertEquals( NewsResourceType.Codelab, - NewsResourceTypeConverter().stringToNewsResourceType("Codelab") + NewsResourceTypeConverter().stringToNewsResourceType("Codelab"), ) } @@ -58,7 +58,7 @@ class NewsResourceTypeConverterTest { fun test_room_news_resource_type_converter_for_podcast() { assertEquals( NewsResourceType.Podcast, - NewsResourceTypeConverter().stringToNewsResourceType("Podcast 🎙") + NewsResourceTypeConverter().stringToNewsResourceType("Podcast 🎙"), ) } @@ -66,7 +66,7 @@ class NewsResourceTypeConverterTest { fun test_room_news_resource_type_converter_for_docs() { assertEquals( NewsResourceType.Docs, - NewsResourceTypeConverter().stringToNewsResourceType("Docs 📑") + NewsResourceTypeConverter().stringToNewsResourceType("Docs 📑"), ) } @@ -74,7 +74,7 @@ class NewsResourceTypeConverterTest { fun test_room_news_resource_type_converter_for_event() { assertEquals( NewsResourceType.Event, - NewsResourceTypeConverter().stringToNewsResourceType("Event 📆") + NewsResourceTypeConverter().stringToNewsResourceType("Event 📆"), ) } @@ -82,7 +82,7 @@ class NewsResourceTypeConverterTest { fun test_room_news_resource_type_converter_for_dac() { assertEquals( NewsResourceType.DAC, - NewsResourceTypeConverter().stringToNewsResourceType("DAC") + NewsResourceTypeConverter().stringToNewsResourceType("DAC"), ) } @@ -90,7 +90,7 @@ class NewsResourceTypeConverterTest { fun test_room_news_resource_type_converter_for_umm() { assertEquals( NewsResourceType.Unknown, - NewsResourceTypeConverter().stringToNewsResourceType("umm") + NewsResourceTypeConverter().stringToNewsResourceType("umm"), ) } } diff --git a/core/database/src/androidTest/java/com/google/samples/apps/nowinandroid/core/database/dao/NewsResourceDaoTest.kt b/core/database/src/androidTest/java/com/google/samples/apps/nowinandroid/core/database/dao/NewsResourceDaoTest.kt index 5dd1cf624f..c1c1b39ba8 100644 --- a/core/database/src/androidTest/java/com/google/samples/apps/nowinandroid/core/database/dao/NewsResourceDaoTest.kt +++ b/core/database/src/androidTest/java/com/google/samples/apps/nowinandroid/core/database/dao/NewsResourceDaoTest.kt @@ -25,12 +25,12 @@ import com.google.samples.apps.nowinandroid.core.database.model.NewsResourceTopi import com.google.samples.apps.nowinandroid.core.database.model.TopicEntity import com.google.samples.apps.nowinandroid.core.database.model.asExternalModel import com.google.samples.apps.nowinandroid.core.model.data.NewsResourceType -import kotlin.test.assertEquals import kotlinx.coroutines.flow.first import kotlinx.coroutines.test.runTest import kotlinx.datetime.Instant import org.junit.Before import org.junit.Test +import kotlin.test.assertEquals class NewsResourceDaoTest { @@ -43,7 +43,7 @@ class NewsResourceDaoTest { val context = ApplicationProvider.getApplicationContext() db = Room.inMemoryDatabaseBuilder( context, - NiaDatabase::class.java + NiaDatabase::class.java, ).build() newsResourceDao = db.newsResourceDao() topicDao = db.topicDao() @@ -70,7 +70,7 @@ class NewsResourceDaoTest { ), ) newsResourceDao.upsertNewsResources( - newsResourceEntities + newsResourceEntities, ) val savedNewsResourceEntities = newsResourceDao.getNewsResources() @@ -80,7 +80,7 @@ class NewsResourceDaoTest { listOf(3L, 2L, 1L, 0L), savedNewsResourceEntities.map { it.asExternalModel().publishDate.toEpochMilliseconds() - } + }, ) } @@ -89,11 +89,11 @@ class NewsResourceDaoTest { val topicEntities = listOf( testTopicEntity( id = "1", - name = "1" + name = "1", ), testTopicEntity( id = "2", - name = "2" + name = "2", ), ) val newsResourceEntities = listOf( @@ -117,18 +117,18 @@ class NewsResourceDaoTest { val newsResourceTopicCrossRefEntities = topicEntities.mapIndexed { index, topicEntity -> NewsResourceTopicCrossRef( newsResourceId = index.toString(), - topicId = topicEntity.id + topicId = topicEntity.id, ) } topicDao.insertOrIgnoreTopics( - topicEntities = topicEntities + topicEntities = topicEntities, ) newsResourceDao.upsertNewsResources( - newsResourceEntities + newsResourceEntities, ) newsResourceDao.insertOrIgnoreTopicCrossRefEntities( - newsResourceTopicCrossRefEntities + newsResourceTopicCrossRefEntities, ) val filteredNewsResources = newsResourceDao.getNewsResources( @@ -139,7 +139,7 @@ class NewsResourceDaoTest { assertEquals( listOf("1", "0"), - filteredNewsResources.map { it.entity.id } + filteredNewsResources.map { it.entity.id }, ) } @@ -169,7 +169,7 @@ class NewsResourceDaoTest { val (toDelete, toKeep) = newsResourceEntities.partition { it.id.toInt() % 2 == 0 } newsResourceDao.deleteNewsResources( - toDelete.map(NewsResourceEntity::id) + toDelete.map(NewsResourceEntity::id), ) assertEquals( @@ -177,26 +177,26 @@ class NewsResourceDaoTest { .toSet(), newsResourceDao.getNewsResources().first() .map { it.entity.id } - .toSet() + .toSet(), ) } } private fun testTopicEntity( id: String = "0", - name: String + name: String, ) = TopicEntity( id = id, name = name, shortDescription = "", longDescription = "", url = "", - imageUrl = "" + imageUrl = "", ) private fun testNewsResource( id: String = "0", - millisSinceEpoch: Long = 0 + millisSinceEpoch: Long = 0, ) = NewsResourceEntity( id = id, title = "", diff --git a/core/database/src/main/java/com/google/samples/apps/nowinandroid/core/database/DatabaseMigrations.kt b/core/database/src/main/java/com/google/samples/apps/nowinandroid/core/database/DatabaseMigrations.kt index 8d7430fa00..09e0849fe4 100644 --- a/core/database/src/main/java/com/google/samples/apps/nowinandroid/core/database/DatabaseMigrations.kt +++ b/core/database/src/main/java/com/google/samples/apps/nowinandroid/core/database/DatabaseMigrations.kt @@ -33,31 +33,31 @@ object DatabaseMigrations { @RenameColumn( tableName = "topics", fromColumnName = "description", - toColumnName = "shortDescription" + toColumnName = "shortDescription", ) class Schema2to3 : AutoMigrationSpec @DeleteColumn( tableName = "news_resources", - columnName = "episode_id" + columnName = "episode_id", ) @DeleteTable.Entries( DeleteTable( - tableName = "episodes_authors" + tableName = "episodes_authors", ), DeleteTable( - tableName = "episodes" - ) + tableName = "episodes", + ), ) class Schema10to11 : AutoMigrationSpec @DeleteTable.Entries( DeleteTable( - tableName = "news_resources_authors" + tableName = "news_resources_authors", ), DeleteTable( - tableName = "authors" - ) + tableName = "authors", + ), ) class Schema11to12 : AutoMigrationSpec } diff --git a/core/database/src/main/java/com/google/samples/apps/nowinandroid/core/database/DatabaseModule.kt b/core/database/src/main/java/com/google/samples/apps/nowinandroid/core/database/DatabaseModule.kt index 7d4dd67c80..7d89cd1ac7 100644 --- a/core/database/src/main/java/com/google/samples/apps/nowinandroid/core/database/DatabaseModule.kt +++ b/core/database/src/main/java/com/google/samples/apps/nowinandroid/core/database/DatabaseModule.kt @@ -35,6 +35,6 @@ object DatabaseModule { ): NiaDatabase = Room.databaseBuilder( context, NiaDatabase::class.java, - "nia-database" + "nia-database", ).build() } diff --git a/core/database/src/main/java/com/google/samples/apps/nowinandroid/core/database/NiaDatabase.kt b/core/database/src/main/java/com/google/samples/apps/nowinandroid/core/database/NiaDatabase.kt index 33a1862752..83bd469678 100644 --- a/core/database/src/main/java/com/google/samples/apps/nowinandroid/core/database/NiaDatabase.kt +++ b/core/database/src/main/java/com/google/samples/apps/nowinandroid/core/database/NiaDatabase.kt @@ -46,7 +46,7 @@ import com.google.samples.apps.nowinandroid.core.database.util.NewsResourceTypeC AutoMigration(from = 8, to = 9), AutoMigration(from = 9, to = 10), AutoMigration(from = 10, to = 11, spec = DatabaseMigrations.Schema10to11::class), - AutoMigration(from = 11, to = 12, spec = DatabaseMigrations.Schema11to12::class) + AutoMigration(from = 11, to = 12, spec = DatabaseMigrations.Schema11to12::class), ], exportSchema = true, ) diff --git a/core/database/src/main/java/com/google/samples/apps/nowinandroid/core/database/dao/NewsResourceDao.kt b/core/database/src/main/java/com/google/samples/apps/nowinandroid/core/database/dao/NewsResourceDao.kt index 8f02bb4a8e..af0a59bcef 100644 --- a/core/database/src/main/java/com/google/samples/apps/nowinandroid/core/database/dao/NewsResourceDao.kt +++ b/core/database/src/main/java/com/google/samples/apps/nowinandroid/core/database/dao/NewsResourceDao.kt @@ -39,7 +39,7 @@ interface NewsResourceDao { value = """ SELECT * FROM news_resources ORDER BY publish_date DESC - """ + """, ) fun getNewsResources(): Flow> @@ -53,7 +53,7 @@ interface NewsResourceDao { WHERE topic_id IN (:filterTopicIds) ) ORDER BY publish_date DESC - """ + """, ) fun getNewsResources( filterTopicIds: Set = emptySet(), @@ -79,7 +79,7 @@ interface NewsResourceDao { @Insert(onConflict = OnConflictStrategy.IGNORE) suspend fun insertOrIgnoreTopicCrossRefEntities( - newsResourceTopicCrossReferences: List + newsResourceTopicCrossReferences: List, ) /** @@ -89,7 +89,7 @@ interface NewsResourceDao { value = """ DELETE FROM news_resources WHERE id in (:ids) - """ + """, ) suspend fun deleteNewsResources(ids: List) } diff --git a/core/database/src/main/java/com/google/samples/apps/nowinandroid/core/database/dao/TopicDao.kt b/core/database/src/main/java/com/google/samples/apps/nowinandroid/core/database/dao/TopicDao.kt index 9d9cde602a..37724af698 100644 --- a/core/database/src/main/java/com/google/samples/apps/nowinandroid/core/database/dao/TopicDao.kt +++ b/core/database/src/main/java/com/google/samples/apps/nowinandroid/core/database/dao/TopicDao.kt @@ -34,7 +34,7 @@ interface TopicDao { value = """ SELECT * FROM topics WHERE id = :topicId - """ + """, ) fun getTopicEntity(topicId: String): Flow @@ -45,7 +45,7 @@ interface TopicDao { value = """ SELECT * FROM topics WHERE id IN (:ids) - """ + """, ) fun getTopicEntities(ids: Set): Flow> @@ -74,7 +74,7 @@ interface TopicDao { value = """ DELETE FROM topics WHERE id in (:ids) - """ + """, ) suspend fun deleteTopics(ids: List) } diff --git a/core/database/src/main/java/com/google/samples/apps/nowinandroid/core/database/model/NewsResourceEntity.kt b/core/database/src/main/java/com/google/samples/apps/nowinandroid/core/database/model/NewsResourceEntity.kt index 38cd3c473f..a571d8f940 100644 --- a/core/database/src/main/java/com/google/samples/apps/nowinandroid/core/database/model/NewsResourceEntity.kt +++ b/core/database/src/main/java/com/google/samples/apps/nowinandroid/core/database/model/NewsResourceEntity.kt @@ -27,7 +27,7 @@ import kotlinx.datetime.Instant * Defines an NiA news resource. */ @Entity( - tableName = "news_resources" + tableName = "news_resources", ) data class NewsResourceEntity( @PrimaryKey @@ -50,5 +50,5 @@ fun NewsResourceEntity.asExternalModel() = NewsResource( headerImageUrl = headerImageUrl, publishDate = publishDate, type = type, - topics = listOf() + topics = listOf(), ) diff --git a/core/database/src/main/java/com/google/samples/apps/nowinandroid/core/database/model/NewsResourceTopicCrossRef.kt b/core/database/src/main/java/com/google/samples/apps/nowinandroid/core/database/model/NewsResourceTopicCrossRef.kt index dac2b5f0b7..59bf1458f8 100644 --- a/core/database/src/main/java/com/google/samples/apps/nowinandroid/core/database/model/NewsResourceTopicCrossRef.kt +++ b/core/database/src/main/java/com/google/samples/apps/nowinandroid/core/database/model/NewsResourceTopicCrossRef.kt @@ -32,13 +32,13 @@ import androidx.room.Index entity = NewsResourceEntity::class, parentColumns = ["id"], childColumns = ["news_resource_id"], - onDelete = ForeignKey.CASCADE + onDelete = ForeignKey.CASCADE, ), ForeignKey( entity = TopicEntity::class, parentColumns = ["id"], childColumns = ["topic_id"], - onDelete = ForeignKey.CASCADE + onDelete = ForeignKey.CASCADE, ), ], indices = [ diff --git a/core/database/src/main/java/com/google/samples/apps/nowinandroid/core/database/model/PopulatedNewsResource.kt b/core/database/src/main/java/com/google/samples/apps/nowinandroid/core/database/model/PopulatedNewsResource.kt index 6e18cc8739..ec8acfb3f7 100644 --- a/core/database/src/main/java/com/google/samples/apps/nowinandroid/core/database/model/PopulatedNewsResource.kt +++ b/core/database/src/main/java/com/google/samples/apps/nowinandroid/core/database/model/PopulatedNewsResource.kt @@ -34,9 +34,9 @@ data class PopulatedNewsResource( value = NewsResourceTopicCrossRef::class, parentColumn = "news_resource_id", entityColumn = "topic_id", - ) + ), ) - val topics: List + val topics: List, ) fun PopulatedNewsResource.asExternalModel() = NewsResource( @@ -47,5 +47,5 @@ fun PopulatedNewsResource.asExternalModel() = NewsResource( headerImageUrl = entity.headerImageUrl, publishDate = entity.publishDate, type = entity.type, - topics = topics.map(TopicEntity::asExternalModel) + topics = topics.map(TopicEntity::asExternalModel), ) diff --git a/core/datastore-test/src/main/java/com/google/samples/apps/nowinandroid/core/datastore/test/TestDataStoreModule.kt b/core/datastore-test/src/main/java/com/google/samples/apps/nowinandroid/core/datastore/test/TestDataStoreModule.kt index 62b3abc34a..b29728cf15 100644 --- a/core/datastore-test/src/main/java/com/google/samples/apps/nowinandroid/core/datastore/test/TestDataStoreModule.kt +++ b/core/datastore-test/src/main/java/com/google/samples/apps/nowinandroid/core/datastore/test/TestDataStoreModule.kt @@ -25,13 +25,13 @@ import dagger.Module import dagger.Provides import dagger.hilt.components.SingletonComponent import dagger.hilt.testing.TestInstallIn -import javax.inject.Singleton import org.junit.rules.TemporaryFolder +import javax.inject.Singleton @Module @TestInstallIn( components = [SingletonComponent::class], - replaces = [DataStoreModule::class] + replaces = [DataStoreModule::class], ) object TestDataStoreModule { @@ -39,13 +39,13 @@ object TestDataStoreModule { @Singleton fun providesUserPreferencesDataStore( userPreferencesSerializer: UserPreferencesSerializer, - tmpFolder: TemporaryFolder + tmpFolder: TemporaryFolder, ): DataStore = tmpFolder.testUserPreferencesDataStore(userPreferencesSerializer) } fun TemporaryFolder.testUserPreferencesDataStore( - userPreferencesSerializer: UserPreferencesSerializer = UserPreferencesSerializer() + userPreferencesSerializer: UserPreferencesSerializer = UserPreferencesSerializer(), ) = DataStoreFactory.create( serializer = userPreferencesSerializer, ) { diff --git a/core/datastore/src/main/java/com/google/samples/apps/nowinandroid/core/datastore/IntToStringIdsMigration.kt b/core/datastore/src/main/java/com/google/samples/apps/nowinandroid/core/datastore/IntToStringIdsMigration.kt index cd27bb0150..98632c6526 100644 --- a/core/datastore/src/main/java/com/google/samples/apps/nowinandroid/core/datastore/IntToStringIdsMigration.kt +++ b/core/datastore/src/main/java/com/google/samples/apps/nowinandroid/core/datastore/IntToStringIdsMigration.kt @@ -30,14 +30,14 @@ object IntToStringIdsMigration : DataMigration { // Migrate topic ids deprecatedFollowedTopicIds.clear() deprecatedFollowedTopicIds.addAll( - currentData.deprecatedIntFollowedTopicIdsList.map(Int::toString) + currentData.deprecatedIntFollowedTopicIdsList.map(Int::toString), ) deprecatedIntFollowedTopicIds.clear() // Migrate author ids deprecatedFollowedAuthorIds.clear() deprecatedFollowedAuthorIds.addAll( - currentData.deprecatedIntFollowedAuthorIdsList.map(Int::toString) + currentData.deprecatedIntFollowedAuthorIdsList.map(Int::toString), ) deprecatedIntFollowedAuthorIds.clear() diff --git a/core/datastore/src/main/java/com/google/samples/apps/nowinandroid/core/datastore/ListToMapMigration.kt b/core/datastore/src/main/java/com/google/samples/apps/nowinandroid/core/datastore/ListToMapMigration.kt index b88b27f74c..5bff23340c 100644 --- a/core/datastore/src/main/java/com/google/samples/apps/nowinandroid/core/datastore/ListToMapMigration.kt +++ b/core/datastore/src/main/java/com/google/samples/apps/nowinandroid/core/datastore/ListToMapMigration.kt @@ -30,21 +30,21 @@ object ListToMapMigration : DataMigration { // Migrate topic id lists followedTopicIds.clear() followedTopicIds.putAll( - currentData.deprecatedFollowedTopicIdsList.associateWith { true } + currentData.deprecatedFollowedTopicIdsList.associateWith { true }, ) deprecatedFollowedTopicIds.clear() // Migrate author ids followedAuthorIds.clear() followedAuthorIds.putAll( - currentData.deprecatedFollowedAuthorIdsList.associateWith { true } + currentData.deprecatedFollowedAuthorIdsList.associateWith { true }, ) deprecatedFollowedAuthorIds.clear() // Migrate bookmarks bookmarkedNewsResourceIds.clear() bookmarkedNewsResourceIds.putAll( - currentData.deprecatedBookmarkedNewsResourceIdsList.associateWith { true } + currentData.deprecatedBookmarkedNewsResourceIdsList.associateWith { true }, ) deprecatedBookmarkedNewsResourceIds.clear() diff --git a/core/datastore/src/main/java/com/google/samples/apps/nowinandroid/core/datastore/NiaPreferencesDataSource.kt b/core/datastore/src/main/java/com/google/samples/apps/nowinandroid/core/datastore/NiaPreferencesDataSource.kt index e82b139506..f5751193a5 100644 --- a/core/datastore/src/main/java/com/google/samples/apps/nowinandroid/core/datastore/NiaPreferencesDataSource.kt +++ b/core/datastore/src/main/java/com/google/samples/apps/nowinandroid/core/datastore/NiaPreferencesDataSource.kt @@ -21,13 +21,13 @@ import androidx.datastore.core.DataStore import com.google.samples.apps.nowinandroid.core.model.data.DarkThemeConfig import com.google.samples.apps.nowinandroid.core.model.data.ThemeBrand import com.google.samples.apps.nowinandroid.core.model.data.UserData -import java.io.IOException -import javax.inject.Inject import kotlinx.coroutines.flow.firstOrNull import kotlinx.coroutines.flow.map +import java.io.IOException +import javax.inject.Inject class NiaPreferencesDataSource @Inject constructor( - private val userPreferences: DataStore + private val userPreferences: DataStore, ) { val userData = userPreferences.data .map { @@ -38,21 +38,23 @@ class NiaPreferencesDataSource @Inject constructor( null, ThemeBrandProto.THEME_BRAND_UNSPECIFIED, ThemeBrandProto.UNRECOGNIZED, - ThemeBrandProto.THEME_BRAND_DEFAULT -> ThemeBrand.DEFAULT + ThemeBrandProto.THEME_BRAND_DEFAULT, + -> ThemeBrand.DEFAULT ThemeBrandProto.THEME_BRAND_ANDROID -> ThemeBrand.ANDROID }, darkThemeConfig = when (it.darkThemeConfig) { null, DarkThemeConfigProto.DARK_THEME_CONFIG_UNSPECIFIED, DarkThemeConfigProto.UNRECOGNIZED, - DarkThemeConfigProto.DARK_THEME_CONFIG_FOLLOW_SYSTEM -> + DarkThemeConfigProto.DARK_THEME_CONFIG_FOLLOW_SYSTEM, + -> DarkThemeConfig.FOLLOW_SYSTEM DarkThemeConfigProto.DARK_THEME_CONFIG_LIGHT -> DarkThemeConfig.LIGHT DarkThemeConfigProto.DARK_THEME_CONFIG_DARK -> DarkThemeConfig.DARK }, useDynamicColor = it.useDynamicColor, - shouldHideOnboarding = it.shouldHideOnboarding + shouldHideOnboarding = it.shouldHideOnboarding, ) } @@ -153,8 +155,8 @@ class NiaPreferencesDataSource @Inject constructor( val updatedChangeListVersions = update( ChangeListVersions( topicVersion = currentPreferences.topicChangeListVersion, - newsResourceVersion = currentPreferences.newsResourceChangeListVersion - ) + newsResourceVersion = currentPreferences.newsResourceChangeListVersion, + ), ) currentPreferences.copy { @@ -177,7 +179,6 @@ class NiaPreferencesDataSource @Inject constructor( } private fun UserPreferencesKt.Dsl.updateShouldHideOnboardingIfNecessary() { - if (followedTopicIds.isEmpty() && followedAuthorIds.isEmpty()) { shouldHideOnboarding = false } diff --git a/core/datastore/src/main/java/com/google/samples/apps/nowinandroid/core/datastore/di/DataStoreModule.kt b/core/datastore/src/main/java/com/google/samples/apps/nowinandroid/core/datastore/di/DataStoreModule.kt index f4eb8f8482..895e22307b 100644 --- a/core/datastore/src/main/java/com/google/samples/apps/nowinandroid/core/datastore/di/DataStoreModule.kt +++ b/core/datastore/src/main/java/com/google/samples/apps/nowinandroid/core/datastore/di/DataStoreModule.kt @@ -30,10 +30,10 @@ import dagger.Provides import dagger.hilt.InstallIn import dagger.hilt.android.qualifiers.ApplicationContext import dagger.hilt.components.SingletonComponent -import javax.inject.Singleton import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.SupervisorJob +import javax.inject.Singleton @Module @InstallIn(SingletonComponent::class) @@ -44,14 +44,14 @@ object DataStoreModule { fun providesUserPreferencesDataStore( @ApplicationContext context: Context, @Dispatcher(IO) ioDispatcher: CoroutineDispatcher, - userPreferencesSerializer: UserPreferencesSerializer + userPreferencesSerializer: UserPreferencesSerializer, ): DataStore = DataStoreFactory.create( serializer = userPreferencesSerializer, scope = CoroutineScope(ioDispatcher + SupervisorJob()), migrations = listOf( IntToStringIdsMigration, - ) + ), ) { context.dataStoreFile("user_preferences.pb") } diff --git a/core/datastore/src/test/java/com/google/samples/apps/nowinandroid/core/datastore/IntToStringIdsMigrationTest.kt b/core/datastore/src/test/java/com/google/samples/apps/nowinandroid/core/datastore/IntToStringIdsMigrationTest.kt index e82f74b52c..8b97cff34f 100644 --- a/core/datastore/src/test/java/com/google/samples/apps/nowinandroid/core/datastore/IntToStringIdsMigrationTest.kt +++ b/core/datastore/src/test/java/com/google/samples/apps/nowinandroid/core/datastore/IntToStringIdsMigrationTest.kt @@ -16,10 +16,10 @@ package com.google.samples.apps.nowinandroid.core.datastore -import kotlin.test.assertEquals -import kotlin.test.assertTrue import kotlinx.coroutines.test.runTest import org.junit.Test +import kotlin.test.assertEquals +import kotlin.test.assertTrue /** * Unit test for [IntToStringIdsMigration] @@ -35,7 +35,7 @@ class IntToStringIdsMigrationTest { // Assert that there are no string topic ids yet assertEquals( emptyList(), - preMigrationUserPreferences.deprecatedFollowedTopicIdsList + preMigrationUserPreferences.deprecatedFollowedTopicIdsList, ) // Run the migration @@ -48,7 +48,7 @@ class IntToStringIdsMigrationTest { deprecatedFollowedTopicIds.addAll(listOf("1", "2", "3")) hasDoneIntToStringIdMigration = true }, - postMigrationUserPreferences + postMigrationUserPreferences, ) // Assert that the migration has been marked complete @@ -64,7 +64,7 @@ class IntToStringIdsMigrationTest { // Assert that there are no string author ids yet assertEquals( emptyList(), - preMigrationUserPreferences.deprecatedFollowedAuthorIdsList + preMigrationUserPreferences.deprecatedFollowedAuthorIdsList, ) // Run the migration @@ -77,7 +77,7 @@ class IntToStringIdsMigrationTest { deprecatedFollowedAuthorIds.addAll(listOf("4", "5", "6")) hasDoneIntToStringIdMigration = true }, - postMigrationUserPreferences + postMigrationUserPreferences, ) // Assert that the migration has been marked complete diff --git a/core/datastore/src/test/java/com/google/samples/apps/nowinandroid/core/datastore/ListToMapMigrationTest.kt b/core/datastore/src/test/java/com/google/samples/apps/nowinandroid/core/datastore/ListToMapMigrationTest.kt index c2fdf4f556..f7e083b452 100644 --- a/core/datastore/src/test/java/com/google/samples/apps/nowinandroid/core/datastore/ListToMapMigrationTest.kt +++ b/core/datastore/src/test/java/com/google/samples/apps/nowinandroid/core/datastore/ListToMapMigrationTest.kt @@ -16,10 +16,10 @@ package com.google.samples.apps.nowinandroid.core.datastore -import kotlin.test.assertEquals -import kotlin.test.assertTrue import kotlinx.coroutines.test.runTest import org.junit.Test +import kotlin.test.assertEquals +import kotlin.test.assertTrue class ListToMapMigrationTest { @@ -32,7 +32,7 @@ class ListToMapMigrationTest { // Assert that there are no topic ids in the map yet assertEquals( emptyMap(), - preMigrationUserPreferences.followedTopicIdsMap + preMigrationUserPreferences.followedTopicIdsMap, ) // Run the migration @@ -42,7 +42,7 @@ class ListToMapMigrationTest { // Assert the deprecated topic ids have been migrated to the topic ids map assertEquals( mapOf("1" to true, "2" to true, "3" to true), - postMigrationUserPreferences.followedTopicIdsMap + postMigrationUserPreferences.followedTopicIdsMap, ) // Assert that the migration has been marked complete @@ -58,7 +58,7 @@ class ListToMapMigrationTest { // Assert that there are no author ids in the map yet assertEquals( emptyMap(), - preMigrationUserPreferences.followedAuthorIdsMap + preMigrationUserPreferences.followedAuthorIdsMap, ) // Run the migration @@ -68,7 +68,7 @@ class ListToMapMigrationTest { // Assert the deprecated author ids have been migrated to the author ids map assertEquals( mapOf("4" to true, "5" to true, "6" to true), - postMigrationUserPreferences.followedAuthorIdsMap + postMigrationUserPreferences.followedAuthorIdsMap, ) // Assert that the migration has been marked complete @@ -84,7 +84,7 @@ class ListToMapMigrationTest { // Assert that there are no bookmarks in the map yet assertEquals( emptyMap(), - preMigrationUserPreferences.bookmarkedNewsResourceIdsMap + preMigrationUserPreferences.bookmarkedNewsResourceIdsMap, ) // Run the migration @@ -94,7 +94,7 @@ class ListToMapMigrationTest { // Assert the deprecated bookmarks have been migrated to the bookmarks map assertEquals( mapOf("7" to true, "8" to true, "9" to true), - postMigrationUserPreferences.bookmarkedNewsResourceIdsMap + postMigrationUserPreferences.bookmarkedNewsResourceIdsMap, ) // Assert that the migration has been marked complete diff --git a/core/datastore/src/test/java/com/google/samples/apps/nowinandroid/core/datastore/NiaPreferencesDataSourceTest.kt b/core/datastore/src/test/java/com/google/samples/apps/nowinandroid/core/datastore/NiaPreferencesDataSourceTest.kt index 62a70de11f..0d047d310e 100644 --- a/core/datastore/src/test/java/com/google/samples/apps/nowinandroid/core/datastore/NiaPreferencesDataSourceTest.kt +++ b/core/datastore/src/test/java/com/google/samples/apps/nowinandroid/core/datastore/NiaPreferencesDataSourceTest.kt @@ -17,14 +17,14 @@ package com.google.samples.apps.nowinandroid.core.datastore import com.google.samples.apps.nowinandroid.core.datastore.test.testUserPreferencesDataStore -import kotlin.test.assertFalse -import kotlin.test.assertTrue import kotlinx.coroutines.flow.first import kotlinx.coroutines.test.runTest import org.junit.Before import org.junit.Rule import org.junit.Test import org.junit.rules.TemporaryFolder +import kotlin.test.assertFalse +import kotlin.test.assertTrue class NiaPreferencesDataSourceTest { private lateinit var subject: NiaPreferencesDataSource @@ -35,7 +35,7 @@ class NiaPreferencesDataSourceTest { @Before fun setup() { subject = NiaPreferencesDataSource( - tmpFolder.testUserPreferencesDataStore() + tmpFolder.testUserPreferencesDataStore(), ) } @@ -52,7 +52,6 @@ class NiaPreferencesDataSourceTest { @Test fun userShouldHideOnboarding_unfollowsLastTopic_shouldHideOnboardingIsFalse() = runTest { - // Given: user completes onboarding by selecting a single topic. subject.toggleFollowedTopicId("1", true) subject.setShouldHideOnboarding(true) @@ -66,7 +65,6 @@ class NiaPreferencesDataSourceTest { @Test fun userShouldHideOnboarding_unfollowsAllTopics_shouldHideOnboardingIsFalse() = runTest { - // Given: user completes onboarding by selecting several topics. subject.setFollowedTopicIds(setOf("1", "2")) subject.setShouldHideOnboarding(true) diff --git a/core/datastore/src/test/java/com/google/samples/apps/nowinandroid/core/datastore/UserPreferencesSerializerTest.kt b/core/datastore/src/test/java/com/google/samples/apps/nowinandroid/core/datastore/UserPreferencesSerializerTest.kt index 1b10c5672e..ad7664fe59 100644 --- a/core/datastore/src/test/java/com/google/samples/apps/nowinandroid/core/datastore/UserPreferencesSerializerTest.kt +++ b/core/datastore/src/test/java/com/google/samples/apps/nowinandroid/core/datastore/UserPreferencesSerializerTest.kt @@ -17,11 +17,11 @@ package com.google.samples.apps.nowinandroid.core.datastore import androidx.datastore.core.CorruptionException +import kotlinx.coroutines.test.runTest +import org.junit.Test import java.io.ByteArrayInputStream import java.io.ByteArrayOutputStream import kotlin.test.assertEquals -import kotlinx.coroutines.test.runTest -import org.junit.Test class UserPreferencesSerializerTest { private val userPreferencesSerializer = UserPreferencesSerializer() @@ -32,7 +32,7 @@ class UserPreferencesSerializerTest { userPreferences { // Default value }, - userPreferencesSerializer.defaultValue + userPreferencesSerializer.defaultValue, ) } @@ -53,7 +53,7 @@ class UserPreferencesSerializerTest { assertEquals( expectedUserPreferences, - actualUserPreferences + actualUserPreferences, ) } diff --git a/core/designsystem/src/androidTest/java/com/google/samples/apps/nowinandroid/core/designsystem/ThemeTest.kt b/core/designsystem/src/androidTest/java/com/google/samples/apps/nowinandroid/core/designsystem/ThemeTest.kt index a047d838b3..b10df053ca 100644 --- a/core/designsystem/src/androidTest/java/com/google/samples/apps/nowinandroid/core/designsystem/ThemeTest.kt +++ b/core/designsystem/src/androidTest/java/com/google/samples/apps/nowinandroid/core/designsystem/ThemeTest.kt @@ -41,9 +41,9 @@ import com.google.samples.apps.nowinandroid.core.designsystem.theme.LocalGradien import com.google.samples.apps.nowinandroid.core.designsystem.theme.LocalTintTheme import com.google.samples.apps.nowinandroid.core.designsystem.theme.NiaTheme import com.google.samples.apps.nowinandroid.core.designsystem.theme.TintTheme -import kotlin.test.assertEquals import org.junit.Rule import org.junit.Test +import kotlin.test.assertEquals /** * Tests [NiaTheme] using different combinations of the theme mode parameters: @@ -64,7 +64,7 @@ class ThemeTest { NiaTheme( darkTheme = false, disableDynamicTheming = true, - androidTheme = false + androidTheme = false, ) { val colorScheme = LightDefaultColorScheme assertColorSchemesEqual(colorScheme, MaterialTheme.colorScheme) @@ -84,7 +84,7 @@ class ThemeTest { NiaTheme( darkTheme = true, disableDynamicTheming = true, - androidTheme = false + androidTheme = false, ) { val colorScheme = DarkDefaultColorScheme assertColorSchemesEqual(colorScheme, MaterialTheme.colorScheme) @@ -104,7 +104,7 @@ class ThemeTest { NiaTheme( darkTheme = false, disableDynamicTheming = false, - androidTheme = false + androidTheme = false, ) { val colorScheme = dynamicLightColorSchemeWithFallback() assertColorSchemesEqual(colorScheme, MaterialTheme.colorScheme) @@ -124,7 +124,7 @@ class ThemeTest { NiaTheme( darkTheme = true, disableDynamicTheming = false, - androidTheme = false + androidTheme = false, ) { val colorScheme = dynamicDarkColorSchemeWithFallback() assertColorSchemesEqual(colorScheme, MaterialTheme.colorScheme) @@ -144,7 +144,7 @@ class ThemeTest { NiaTheme( darkTheme = false, disableDynamicTheming = true, - androidTheme = true + androidTheme = true, ) { val colorScheme = LightAndroidColorScheme assertColorSchemesEqual(colorScheme, MaterialTheme.colorScheme) @@ -164,7 +164,7 @@ class ThemeTest { NiaTheme( darkTheme = true, disableDynamicTheming = true, - androidTheme = true + androidTheme = true, ) { val colorScheme = DarkAndroidColorScheme assertColorSchemesEqual(colorScheme, MaterialTheme.colorScheme) @@ -184,7 +184,7 @@ class ThemeTest { NiaTheme( darkTheme = false, disableDynamicTheming = false, - androidTheme = true + androidTheme = true, ) { val colorScheme = LightAndroidColorScheme assertColorSchemesEqual(colorScheme, MaterialTheme.colorScheme) @@ -204,7 +204,7 @@ class ThemeTest { NiaTheme( darkTheme = true, disableDynamicTheming = false, - androidTheme = true + androidTheme = true, ) { val colorScheme = DarkAndroidColorScheme assertColorSchemesEqual(colorScheme, MaterialTheme.colorScheme) @@ -244,7 +244,7 @@ class ThemeTest { return GradientColors( top = colorScheme.inverseOnSurface, bottom = colorScheme.primaryContainer, - container = colorScheme.surface + container = colorScheme.surface, ) } @@ -259,7 +259,7 @@ class ThemeTest { private fun defaultBackgroundTheme(colorScheme: ColorScheme): BackgroundTheme { return BackgroundTheme( color = colorScheme.surface, - tonalElevation = 2.dp + tonalElevation = 2.dp, ) } @@ -280,7 +280,7 @@ class ThemeTest { */ private fun assertColorSchemesEqual( expectedColorScheme: ColorScheme, - actualColorScheme: ColorScheme + actualColorScheme: ColorScheme, ) { assertEquals(expectedColorScheme.primary, actualColorScheme.primary) assertEquals(expectedColorScheme.onPrimary, actualColorScheme.onPrimary) @@ -291,7 +291,7 @@ class ThemeTest { assertEquals(expectedColorScheme.secondaryContainer, actualColorScheme.secondaryContainer) assertEquals( expectedColorScheme.onSecondaryContainer, - actualColorScheme.onSecondaryContainer + actualColorScheme.onSecondaryContainer, ) assertEquals(expectedColorScheme.tertiary, actualColorScheme.tertiary) assertEquals(expectedColorScheme.onTertiary, actualColorScheme.onTertiary) diff --git a/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/Background.kt b/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/Background.kt index f81d2e36d1..9ef52dd765 100644 --- a/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/Background.kt +++ b/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/Background.kt @@ -50,7 +50,7 @@ import kotlin.math.tan @Composable fun NiaBackground( modifier: Modifier = Modifier, - content: @Composable () -> Unit + content: @Composable () -> Unit, ) { val color = LocalBackgroundTheme.current.color val tonalElevation = LocalBackgroundTheme.current.tonalElevation @@ -77,7 +77,7 @@ fun NiaBackground( fun NiaGradientBackground( modifier: Modifier = Modifier, gradientColors: GradientColors = LocalGradientColors.current, - content: @Composable () -> Unit + content: @Composable () -> Unit, ) { val currentTopColor by rememberUpdatedState(gradientColors.top) val currentBottomColor by rememberUpdatedState(gradientColors.bottom) @@ -87,7 +87,7 @@ fun NiaGradientBackground( } else { gradientColors.container }, - modifier = modifier.fillMaxSize() + modifier = modifier.fillMaxSize(), ) { Box( Modifier @@ -98,7 +98,7 @@ fun NiaGradientBackground( val offset = size.height * tan( Math .toRadians(11.06) - .toFloat() + .toFloat(), ) val start = Offset(size.width / 2 + offset / 2, 0f) @@ -132,7 +132,7 @@ fun NiaGradientBackground( drawRect(topGradient) drawRect(bottomGradient) } - } + }, ) { content() } diff --git a/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/Button.kt b/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/Button.kt index cab6fcd2f9..e4b437dfec 100644 --- a/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/Button.kt +++ b/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/Button.kt @@ -48,17 +48,17 @@ fun NiaButton( modifier: Modifier = Modifier, enabled: Boolean = true, contentPadding: PaddingValues = ButtonDefaults.ContentPadding, - content: @Composable RowScope.() -> Unit + content: @Composable RowScope.() -> Unit, ) { Button( onClick = onClick, modifier = modifier, enabled = enabled, colors = ButtonDefaults.buttonColors( - containerColor = MaterialTheme.colorScheme.onBackground + containerColor = MaterialTheme.colorScheme.onBackground, ), contentPadding = contentPadding, - content = content + content = content, ) } @@ -78,7 +78,7 @@ fun NiaButton( modifier: Modifier = Modifier, enabled: Boolean = true, text: @Composable () -> Unit, - leadingIcon: @Composable (() -> Unit)? = null + leadingIcon: @Composable (() -> Unit)? = null, ) { NiaButton( onClick = onClick, @@ -88,11 +88,11 @@ fun NiaButton( ButtonDefaults.ButtonWithIconContentPadding } else { ButtonDefaults.ContentPadding - } + }, ) { NiaButtonContent( text = text, - leadingIcon = leadingIcon + leadingIcon = leadingIcon, ) } } @@ -114,14 +114,14 @@ fun NiaOutlinedButton( modifier: Modifier = Modifier, enabled: Boolean = true, contentPadding: PaddingValues = ButtonDefaults.ContentPadding, - content: @Composable RowScope.() -> Unit + content: @Composable RowScope.() -> Unit, ) { OutlinedButton( onClick = onClick, modifier = modifier, enabled = enabled, colors = ButtonDefaults.outlinedButtonColors( - contentColor = MaterialTheme.colorScheme.onBackground + contentColor = MaterialTheme.colorScheme.onBackground, ), border = BorderStroke( width = NiaButtonDefaults.OutlinedButtonBorderWidth, @@ -129,12 +129,12 @@ fun NiaOutlinedButton( MaterialTheme.colorScheme.outline } else { MaterialTheme.colorScheme.onSurface.copy( - alpha = NiaButtonDefaults.DisabledOutlinedButtonBorderAlpha + alpha = NiaButtonDefaults.DisabledOutlinedButtonBorderAlpha, ) - } + }, ), contentPadding = contentPadding, - content = content + content = content, ) } @@ -154,7 +154,7 @@ fun NiaOutlinedButton( modifier: Modifier = Modifier, enabled: Boolean = true, text: @Composable () -> Unit, - leadingIcon: @Composable (() -> Unit)? = null + leadingIcon: @Composable (() -> Unit)? = null, ) { NiaOutlinedButton( onClick = onClick, @@ -164,11 +164,11 @@ fun NiaOutlinedButton( ButtonDefaults.ButtonWithIconContentPadding } else { ButtonDefaults.ContentPadding - } + }, ) { NiaButtonContent( text = text, - leadingIcon = leadingIcon + leadingIcon = leadingIcon, ) } } @@ -187,16 +187,16 @@ fun NiaTextButton( onClick: () -> Unit, modifier: Modifier = Modifier, enabled: Boolean = true, - content: @Composable RowScope.() -> Unit + content: @Composable RowScope.() -> Unit, ) { TextButton( onClick = onClick, modifier = modifier, enabled = enabled, colors = ButtonDefaults.textButtonColors( - contentColor = MaterialTheme.colorScheme.onBackground + contentColor = MaterialTheme.colorScheme.onBackground, ), - content = content + content = content, ) } @@ -216,16 +216,16 @@ fun NiaTextButton( modifier: Modifier = Modifier, enabled: Boolean = true, text: @Composable () -> Unit, - leadingIcon: @Composable (() -> Unit)? = null + leadingIcon: @Composable (() -> Unit)? = null, ) { NiaTextButton( onClick = onClick, modifier = modifier, - enabled = enabled + enabled = enabled, ) { NiaButtonContent( text = text, - leadingIcon = leadingIcon + leadingIcon = leadingIcon, ) } } @@ -239,7 +239,7 @@ fun NiaTextButton( @Composable private fun NiaButtonContent( text: @Composable () -> Unit, - leadingIcon: @Composable (() -> Unit)? = null + leadingIcon: @Composable (() -> Unit)? = null, ) { if (leadingIcon != null) { Box(Modifier.sizeIn(maxHeight = ButtonDefaults.IconSize)) { @@ -253,8 +253,8 @@ private fun NiaButtonContent( ButtonDefaults.IconSpacing } else { 0.dp - } - ) + }, + ), ) { text() } @@ -267,6 +267,7 @@ object NiaButtonDefaults { // TODO: File bug // OutlinedButton border color doesn't respect disabled state by default const val DisabledOutlinedButtonBorderAlpha = 0.12f + // TODO: File bug // OutlinedButton default border width isn't exposed via ButtonDefaults val OutlinedButtonBorderWidth = 1.dp diff --git a/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/Chip.kt b/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/Chip.kt index 663667861f..b291b3fa1e 100644 --- a/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/Chip.kt +++ b/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/Chip.kt @@ -46,7 +46,7 @@ fun NiaFilterChip( onSelectedChange: (Boolean) -> Unit, modifier: Modifier = Modifier, enabled: Boolean = true, - label: @Composable () -> Unit + label: @Composable () -> Unit, ) { FilterChip( selected = selected, @@ -62,7 +62,7 @@ fun NiaFilterChip( { Icon( imageVector = NiaIcons.Check, - contentDescription = null + contentDescription = null, ) } } else { @@ -73,33 +73,33 @@ fun NiaFilterChip( borderColor = MaterialTheme.colorScheme.onBackground, selectedBorderColor = MaterialTheme.colorScheme.onBackground, disabledBorderColor = MaterialTheme.colorScheme.onBackground.copy( - alpha = NiaChipDefaults.DisabledChipContentAlpha + alpha = NiaChipDefaults.DisabledChipContentAlpha, ), disabledSelectedBorderColor = MaterialTheme.colorScheme.onBackground.copy( - alpha = NiaChipDefaults.DisabledChipContentAlpha + alpha = NiaChipDefaults.DisabledChipContentAlpha, ), - selectedBorderWidth = NiaChipDefaults.ChipBorderWidth + selectedBorderWidth = NiaChipDefaults.ChipBorderWidth, ), colors = FilterChipDefaults.filterChipColors( labelColor = MaterialTheme.colorScheme.onBackground, iconColor = MaterialTheme.colorScheme.onBackground, disabledContainerColor = if (selected) { MaterialTheme.colorScheme.onBackground.copy( - alpha = NiaChipDefaults.DisabledChipContainerAlpha + alpha = NiaChipDefaults.DisabledChipContainerAlpha, ) } else { Color.Transparent }, disabledLabelColor = MaterialTheme.colorScheme.onBackground.copy( - alpha = NiaChipDefaults.DisabledChipContentAlpha + alpha = NiaChipDefaults.DisabledChipContentAlpha, ), disabledLeadingIconColor = MaterialTheme.colorScheme.onBackground.copy( - alpha = NiaChipDefaults.DisabledChipContentAlpha + alpha = NiaChipDefaults.DisabledChipContentAlpha, ), selectedContainerColor = MaterialTheme.colorScheme.primaryContainer, selectedLabelColor = MaterialTheme.colorScheme.onBackground, - selectedLeadingIconColor = MaterialTheme.colorScheme.onBackground - ) + selectedLeadingIconColor = MaterialTheme.colorScheme.onBackground, + ), ) } diff --git a/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/DropdownMenu.kt b/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/DropdownMenu.kt index b8d3fa8375..b624ebcb69 100644 --- a/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/DropdownMenu.kt +++ b/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/DropdownMenu.kt @@ -61,7 +61,7 @@ fun NiaDropdownMenuButton( text: @Composable () -> Unit, itemText: @Composable (item: T) -> Unit, itemLeadingIcon: @Composable ((item: T) -> Unit)? = null, - itemTrailingIcon: @Composable ((item: T) -> Unit)? = null + itemTrailingIcon: @Composable ((item: T) -> Unit)? = null, ) { var expanded by remember { mutableStateOf(false) } Box(modifier = modifier) { @@ -69,7 +69,7 @@ fun NiaDropdownMenuButton( onClick = { expanded = true }, enabled = enabled, colors = ButtonDefaults.outlinedButtonColors( - contentColor = MaterialTheme.colorScheme.onBackground + contentColor = MaterialTheme.colorScheme.onBackground, ), border = BorderStroke( width = NiaDropdownMenuDefaults.DropdownMenuButtonBorderWidth, @@ -77,11 +77,11 @@ fun NiaDropdownMenuButton( MaterialTheme.colorScheme.outline } else { MaterialTheme.colorScheme.onSurface.copy( - alpha = NiaDropdownMenuDefaults.DisabledDropdownMenuButtonBorderAlpha + alpha = NiaDropdownMenuDefaults.DisabledDropdownMenuButtonBorderAlpha, ) - } + }, ), - contentPadding = NiaDropdownMenuDefaults.DropdownMenuButtonContentPadding + contentPadding = NiaDropdownMenuDefaults.DropdownMenuButtonContentPadding, ) { NiaDropdownMenuButtonContent( text = text, @@ -92,9 +92,9 @@ fun NiaDropdownMenuButton( } else { NiaIcons.ArrowDropDown }, - contentDescription = null + contentDescription = null, ) - } + }, ) } NiaDropdownMenu( @@ -105,7 +105,7 @@ fun NiaDropdownMenuButton( dismissOnItemClick = dismissOnItemClick, itemText = itemText, itemLeadingIcon = itemLeadingIcon, - itemTrailingIcon = itemTrailingIcon + itemTrailingIcon = itemTrailingIcon, ) } } @@ -129,8 +129,8 @@ private fun NiaDropdownMenuButtonContent( ButtonDefaults.IconSpacing } else { 0.dp - } - ) + }, + ), ) { ProvideTextStyle(value = MaterialTheme.typography.labelSmall) { text() @@ -166,11 +166,11 @@ fun NiaDropdownMenu( dismissOnItemClick: Boolean = true, itemText: @Composable (item: T) -> Unit, itemLeadingIcon: @Composable ((item: T) -> Unit)? = null, - itemTrailingIcon: @Composable ((item: T) -> Unit)? = null + itemTrailingIcon: @Composable ((item: T) -> Unit)? = null, ) { DropdownMenu( expanded = expanded, - onDismissRequest = onDismissRequest + onDismissRequest = onDismissRequest, ) { items.forEach { item -> DropdownMenuItem( @@ -188,7 +188,7 @@ fun NiaDropdownMenu( { itemTrailingIcon(item) } } else { null - } + }, ) } } @@ -201,9 +201,11 @@ object NiaDropdownMenuDefaults { // TODO: File bug // OutlinedButton border color doesn't respect disabled state by default const val DisabledDropdownMenuButtonBorderAlpha = 0.12f + // TODO: File bug // OutlinedButton default border width isn't exposed via ButtonDefaults val DropdownMenuButtonBorderWidth = 1.dp + // TODO: File bug // Various default button padding values aren't exposed via ButtonDefaults val DropdownMenuButtonContentPadding = @@ -211,6 +213,6 @@ object NiaDropdownMenuDefaults { start = 24.dp, top = 8.dp, end = 16.dp, - bottom = 8.dp + bottom = 8.dp, ) } diff --git a/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/DynamicAsyncImage.kt b/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/DynamicAsyncImage.kt index 26f80989fb..e26a824afd 100644 --- a/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/DynamicAsyncImage.kt +++ b/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/DynamicAsyncImage.kt @@ -31,7 +31,7 @@ fun DynamicAsyncImage( imageUrl: String, contentDescription: String?, modifier: Modifier = Modifier, - placeholder: Painter? = null + placeholder: Painter? = null, ) { val iconTint = LocalTintTheme.current.iconTint AsyncImage( @@ -39,6 +39,6 @@ fun DynamicAsyncImage( model = imageUrl, contentDescription = contentDescription, colorFilter = if (iconTint != null) ColorFilter.tint(iconTint) else null, - modifier = modifier + modifier = modifier, ) } diff --git a/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/IconButton.kt b/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/IconButton.kt index 0eedf23f73..b0dda0af1a 100644 --- a/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/IconButton.kt +++ b/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/IconButton.kt @@ -43,7 +43,7 @@ fun NiaIconToggleButton( modifier: Modifier = Modifier, enabled: Boolean = true, icon: @Composable () -> Unit, - checkedIcon: @Composable () -> Unit = icon + checkedIcon: @Composable () -> Unit = icon, ) { // TODO: File bug // Can't use regular IconToggleButton as it doesn't include a shape (appears square) @@ -57,12 +57,12 @@ fun NiaIconToggleButton( checkedContentColor = MaterialTheme.colorScheme.onPrimaryContainer, disabledContainerColor = if (checked) { MaterialTheme.colorScheme.onBackground.copy( - alpha = NiaIconButtonDefaults.DisabledIconButtonContainerAlpha + alpha = NiaIconButtonDefaults.DisabledIconButtonContainerAlpha, ) } else { Color.Transparent - } - ) + }, + ), ) { if (checked) checkedIcon() else icon() } diff --git a/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/LoadingWheel.kt b/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/LoadingWheel.kt index 8365580218..55ff143a65 100644 --- a/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/LoadingWheel.kt +++ b/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/LoadingWheel.kt @@ -53,7 +53,7 @@ import kotlinx.coroutines.launch @Composable fun NiaLoadingWheel( contentDesc: String, - modifier: Modifier = Modifier + modifier: Modifier = Modifier, ) { val infiniteTransition = rememberInfiniteTransition() @@ -68,8 +68,8 @@ fun NiaLoadingWheel( animationSpec = tween( durationMillis = 100, easing = FastOutSlowInEasing, - delayMillis = 40 * index - ) + delayMillis = 40 * index, + ), ) } } @@ -80,8 +80,8 @@ fun NiaLoadingWheel( initialValue = 0F, targetValue = 360F, animationSpec = infiniteRepeatable( - animation = tween(durationMillis = ROTATION_TIME, easing = LinearEasing) - ) + animation = tween(durationMillis = ROTATION_TIME, easing = LinearEasing), + ), ) // Specifies the color animation for the base-to-progress line color change @@ -98,8 +98,8 @@ fun NiaLoadingWheel( baseLineColor at ROTATION_TIME / NUM_OF_LINES with LinearEasing }, repeatMode = RepeatMode.Restart, - initialStartOffset = StartOffset(ROTATION_TIME / NUM_OF_LINES / 2 * index) - ) + initialStartOffset = StartOffset(ROTATION_TIME / NUM_OF_LINES / 2 * index), + ), ) } @@ -121,7 +121,7 @@ fun NiaLoadingWheel( strokeWidth = 4F, cap = StrokeCap.Round, start = Offset(size.width / 2, size.height / 4), - end = Offset(size.width / 2, floatAnimValues[index].value * size.height / 4) + end = Offset(size.width / 2, floatAnimValues[index].value * size.height / 4), ) } } @@ -131,7 +131,7 @@ fun NiaLoadingWheel( @Composable fun NiaOverlayLoadingWheel( contentDesc: String, - modifier: Modifier = Modifier + modifier: Modifier = Modifier, ) { Surface( shape = RoundedCornerShape(60.dp), diff --git a/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/Navigation.kt b/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/Navigation.kt index 57d70642c4..624cf25ac3 100644 --- a/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/Navigation.kt +++ b/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/Navigation.kt @@ -54,7 +54,7 @@ fun RowScope.NiaNavigationBarItem( selectedIcon: @Composable () -> Unit = icon, enabled: Boolean = true, label: @Composable (() -> Unit)? = null, - alwaysShowLabel: Boolean = true + alwaysShowLabel: Boolean = true, ) { NavigationBarItem( selected = selected, @@ -69,8 +69,8 @@ fun RowScope.NiaNavigationBarItem( unselectedIconColor = NiaNavigationDefaults.navigationContentColor(), selectedTextColor = NiaNavigationDefaults.navigationSelectedItemColor(), unselectedTextColor = NiaNavigationDefaults.navigationContentColor(), - indicatorColor = NiaNavigationDefaults.navigationIndicatorColor() - ) + indicatorColor = NiaNavigationDefaults.navigationIndicatorColor(), + ), ) } @@ -84,13 +84,13 @@ fun RowScope.NiaNavigationBarItem( @Composable fun NiaNavigationBar( modifier: Modifier = Modifier, - content: @Composable RowScope.() -> Unit + content: @Composable RowScope.() -> Unit, ) { NavigationBar( modifier = modifier, contentColor = NiaNavigationDefaults.navigationContentColor(), tonalElevation = 0.dp, - content = content + content = content, ) } @@ -118,7 +118,7 @@ fun NiaNavigationRailItem( selectedIcon: @Composable () -> Unit = icon, enabled: Boolean = true, label: @Composable (() -> Unit)? = null, - alwaysShowLabel: Boolean = true + alwaysShowLabel: Boolean = true, ) { NavigationRailItem( selected = selected, @@ -133,8 +133,8 @@ fun NiaNavigationRailItem( unselectedIconColor = NiaNavigationDefaults.navigationContentColor(), selectedTextColor = NiaNavigationDefaults.navigationSelectedItemColor(), unselectedTextColor = NiaNavigationDefaults.navigationContentColor(), - indicatorColor = NiaNavigationDefaults.navigationIndicatorColor() - ) + indicatorColor = NiaNavigationDefaults.navigationIndicatorColor(), + ), ) } @@ -150,14 +150,14 @@ fun NiaNavigationRailItem( fun NiaNavigationRail( modifier: Modifier = Modifier, header: @Composable (ColumnScope.() -> Unit)? = null, - content: @Composable ColumnScope.() -> Unit + content: @Composable ColumnScope.() -> Unit, ) { NavigationRail( modifier = modifier, containerColor = Color.Transparent, contentColor = NiaNavigationDefaults.navigationContentColor(), header = header, - content = content + content = content, ) } @@ -167,8 +167,10 @@ fun NiaNavigationRail( object NiaNavigationDefaults { @Composable fun navigationContentColor() = MaterialTheme.colorScheme.onSurfaceVariant + @Composable fun navigationSelectedItemColor() = MaterialTheme.colorScheme.onPrimaryContainer + @Composable fun navigationIndicatorColor() = MaterialTheme.colorScheme.primaryContainer } diff --git a/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/Tabs.kt b/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/Tabs.kt index 76a0a32489..ad2f3799c1 100644 --- a/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/Tabs.kt +++ b/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/Tabs.kt @@ -46,7 +46,7 @@ fun NiaTab( onClick: () -> Unit, modifier: Modifier = Modifier, enabled: Boolean = true, - text: @Composable () -> Unit + text: @Composable () -> Unit, ) { Tab( selected = selected, @@ -61,9 +61,9 @@ fun NiaTab( Box(modifier = Modifier.padding(top = NiaTabDefaults.TabTopPadding)) { text() } - } + }, ) - } + }, ) } @@ -79,7 +79,7 @@ fun NiaTab( fun NiaTabRow( selectedTabIndex: Int, modifier: Modifier = Modifier, - tabs: @Composable () -> Unit + tabs: @Composable () -> Unit, ) { TabRow( selectedTabIndex = selectedTabIndex, @@ -90,10 +90,10 @@ fun NiaTabRow( TabRowDefaults.Indicator( modifier = Modifier.tabIndicatorOffset(tabPositions[selectedTabIndex]), height = 2.dp, - color = MaterialTheme.colorScheme.onSurface + color = MaterialTheme.colorScheme.onSurface, ) }, - tabs = tabs + tabs = tabs, ) } diff --git a/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/Tag.kt b/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/Tag.kt index dae42421c1..cf8b246bbf 100644 --- a/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/Tag.kt +++ b/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/Tag.kt @@ -41,15 +41,14 @@ fun NiaTopicTag( text: @Composable () -> Unit, followText: @Composable () -> Unit = { Text(stringResource(R.string.follow)) }, unFollowText: @Composable () -> Unit = { Text(stringResource(R.string.unfollow)) }, - browseText: @Composable () -> Unit = { Text(stringResource(R.string.browse_topic)) } + browseText: @Composable () -> Unit = { Text(stringResource(R.string.browse_topic)) }, ) { - Box(modifier = modifier) { val containerColor = if (followed) { MaterialTheme.colorScheme.primaryContainer } else { MaterialTheme.colorScheme.surfaceVariant.copy( - alpha = NiaTagDefaults.UnfollowedTopicTagContainerAlpha + alpha = NiaTagDefaults.UnfollowedTopicTagContainerAlpha, ) } TextButton( @@ -59,9 +58,9 @@ fun NiaTopicTag( containerColor = containerColor, contentColor = contentColorFor(backgroundColor = containerColor), disabledContainerColor = MaterialTheme.colorScheme.onSurface.copy( - alpha = NiaTagDefaults.DisabledTopicTagContainerAlpha - ) - ) + alpha = NiaTagDefaults.DisabledTopicTagContainerAlpha, + ), + ), ) { ProvideTextStyle(value = MaterialTheme.typography.labelSmall) { text() @@ -84,7 +83,7 @@ fun NiaTopicTag( UNFOLLOW -> unFollowText() BROWSE -> browseText() } - } + }, ) } } @@ -94,6 +93,7 @@ fun NiaTopicTag( */ object NiaTagDefaults { const val UnfollowedTopicTagContainerAlpha = 0.5f + // TODO: File bug // Button disabled container alpha value not exposed by ButtonDefaults const val DisabledTopicTagContainerAlpha = 0.12f diff --git a/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/TopAppBar.kt b/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/TopAppBar.kt index fb4cc0ff02..28007a3b13 100644 --- a/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/TopAppBar.kt +++ b/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/TopAppBar.kt @@ -46,7 +46,7 @@ fun NiaTopAppBar( modifier: Modifier = Modifier, colors: TopAppBarColors = TopAppBarDefaults.centerAlignedTopAppBarColors(), onNavigationClick: () -> Unit = {}, - onActionClick: () -> Unit = {} + onActionClick: () -> Unit = {}, ) { CenterAlignedTopAppBar( title = { Text(text = stringResource(id = titleRes)) }, @@ -55,7 +55,7 @@ fun NiaTopAppBar( Icon( imageVector = navigationIcon, contentDescription = navigationIconContentDescription, - tint = MaterialTheme.colorScheme.onSurface + tint = MaterialTheme.colorScheme.onSurface, ) } }, @@ -64,7 +64,7 @@ fun NiaTopAppBar( Icon( imageVector = actionIcon, contentDescription = actionIconContentDescription, - tint = MaterialTheme.colorScheme.onSurface + tint = MaterialTheme.colorScheme.onSurface, ) } }, @@ -84,7 +84,7 @@ fun NiaTopAppBar( actionIconContentDescription: String?, modifier: Modifier = Modifier, colors: TopAppBarColors = TopAppBarDefaults.centerAlignedTopAppBarColors(), - onActionClick: () -> Unit = {} + onActionClick: () -> Unit = {}, ) { CenterAlignedTopAppBar( title = { Text(text = stringResource(id = titleRes)) }, @@ -93,7 +93,7 @@ fun NiaTopAppBar( Icon( imageVector = actionIcon, contentDescription = actionIconContentDescription, - tint = MaterialTheme.colorScheme.onSurface + tint = MaterialTheme.colorScheme.onSurface, ) } }, @@ -111,6 +111,6 @@ private fun NiaTopAppBarPreview() { navigationIcon = NiaIcons.Search, navigationIconContentDescription = "Navigation icon", actionIcon = NiaIcons.MoreVert, - actionIconContentDescription = "Action icon" + actionIconContentDescription = "Action icon", ) } diff --git a/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/ViewToggle.kt b/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/ViewToggle.kt index a6721c78cb..c6ec77a922 100644 --- a/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/ViewToggle.kt +++ b/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/ViewToggle.kt @@ -49,25 +49,25 @@ fun NiaViewToggleButton( modifier: Modifier = Modifier, enabled: Boolean = true, compactText: @Composable () -> Unit, - expandedText: @Composable () -> Unit + expandedText: @Composable () -> Unit, ) { TextButton( onClick = { onExpandedChange(!expanded) }, modifier = modifier, enabled = enabled, colors = ButtonDefaults.textButtonColors( - contentColor = MaterialTheme.colorScheme.onBackground + contentColor = MaterialTheme.colorScheme.onBackground, ), - contentPadding = NiaViewToggleDefaults.ViewToggleButtonContentPadding + contentPadding = NiaViewToggleDefaults.ViewToggleButtonContentPadding, ) { NiaViewToggleButtonContent( text = if (expanded) expandedText else compactText, trailingIcon = { Icon( imageVector = if (expanded) NiaIcons.ViewDay else NiaIcons.ShortText, - contentDescription = null + contentDescription = null, ) - } + }, ) } } @@ -91,8 +91,8 @@ private fun NiaViewToggleButtonContent( ButtonDefaults.IconSpacing } else { 0.dp - } - ) + }, + ), ) { ProvideTextStyle(value = MaterialTheme.typography.labelSmall) { text() @@ -116,6 +116,6 @@ object NiaViewToggleDefaults { start = 16.dp, top = 8.dp, end = 12.dp, - bottom = 8.dp + bottom = 8.dp, ) } diff --git a/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/theme/Background.kt b/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/theme/Background.kt index f91e5a30d9..e75758ea8e 100644 --- a/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/theme/Background.kt +++ b/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/theme/Background.kt @@ -27,7 +27,7 @@ import androidx.compose.ui.unit.Dp @Immutable data class BackgroundTheme( val color: Color = Color.Unspecified, - val tonalElevation: Dp = Dp.Unspecified + val tonalElevation: Dp = Dp.Unspecified, ) /** diff --git a/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/theme/Gradient.kt b/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/theme/Gradient.kt index f471af761a..bad1c62a19 100644 --- a/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/theme/Gradient.kt +++ b/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/theme/Gradient.kt @@ -31,7 +31,7 @@ import androidx.compose.ui.graphics.Color data class GradientColors( val top: Color = Color.Unspecified, val bottom: Color = Color.Unspecified, - val container: Color = Color.Unspecified + val container: Color = Color.Unspecified, ) /** diff --git a/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/theme/Theme.kt b/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/theme/Theme.kt index e7be17c991..582f884734 100644 --- a/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/theme/Theme.kt +++ b/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/theme/Theme.kt @@ -61,7 +61,7 @@ val LightDefaultColorScheme = lightColorScheme( onSurfaceVariant = PurpleGray30, inverseSurface = DarkPurpleGray20, inverseOnSurface = DarkPurpleGray95, - outline = PurpleGray50 + outline = PurpleGray50, ) /** @@ -93,7 +93,7 @@ val DarkDefaultColorScheme = darkColorScheme( onSurfaceVariant = PurpleGray80, inverseSurface = DarkPurpleGray90, inverseOnSurface = DarkPurpleGray10, - outline = PurpleGray60 + outline = PurpleGray60, ) /** @@ -125,7 +125,7 @@ val LightAndroidColorScheme = lightColorScheme( onSurfaceVariant = GreenGray30, inverseSurface = DarkGreenGray20, inverseOnSurface = DarkGreenGray95, - outline = GreenGray50 + outline = GreenGray50, ) /** @@ -157,7 +157,7 @@ val DarkAndroidColorScheme = darkColorScheme( onSurfaceVariant = GreenGray80, inverseSurface = DarkGreenGray90, inverseOnSurface = DarkGreenGray10, - outline = GreenGray60 + outline = GreenGray60, ) /** @@ -194,7 +194,7 @@ fun NiaTheme( darkTheme: Boolean = isSystemInDarkTheme(), androidTheme: Boolean = false, disableDynamicTheming: Boolean = true, - content: @Composable () -> Unit + content: @Composable () -> Unit, ) { // Color scheme val colorScheme = when { @@ -211,7 +211,7 @@ fun NiaTheme( val defaultGradientColors = GradientColors( top = colorScheme.inverseOnSurface, bottom = colorScheme.primaryContainer, - container = colorScheme.surface + container = colorScheme.surface, ) val gradientColors = when { androidTheme -> if (darkTheme) DarkAndroidGradientColors else LightAndroidGradientColors @@ -221,7 +221,7 @@ fun NiaTheme( // Background theme val defaultBackgroundTheme = BackgroundTheme( color = colorScheme.surface, - tonalElevation = 2.dp + tonalElevation = 2.dp, ) val backgroundTheme = when { androidTheme -> if (darkTheme) DarkAndroidBackgroundTheme else LightAndroidBackgroundTheme @@ -236,12 +236,12 @@ fun NiaTheme( CompositionLocalProvider( LocalGradientColors provides gradientColors, LocalBackgroundTheme provides backgroundTheme, - LocalTintTheme provides tintTheme + LocalTintTheme provides tintTheme, ) { MaterialTheme( colorScheme = colorScheme, typography = NiaTypography, - content = content + content = content, ) } } diff --git a/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/theme/Type.kt b/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/theme/Type.kt index 7c9621caf3..0d3b064579 100644 --- a/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/theme/Type.kt +++ b/core/designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/theme/Type.kt @@ -29,90 +29,90 @@ internal val NiaTypography = Typography( fontWeight = FontWeight.Normal, fontSize = 57.sp, lineHeight = 64.sp, - letterSpacing = (-0.25).sp + letterSpacing = (-0.25).sp, ), displayMedium = TextStyle( fontWeight = FontWeight.Normal, fontSize = 45.sp, lineHeight = 52.sp, - letterSpacing = 0.sp + letterSpacing = 0.sp, ), displaySmall = TextStyle( fontWeight = FontWeight.Normal, fontSize = 36.sp, lineHeight = 44.sp, - letterSpacing = 0.sp + letterSpacing = 0.sp, ), headlineLarge = TextStyle( fontWeight = FontWeight.Normal, fontSize = 32.sp, lineHeight = 40.sp, - letterSpacing = 0.sp + letterSpacing = 0.sp, ), headlineMedium = TextStyle( fontWeight = FontWeight.Normal, fontSize = 28.sp, lineHeight = 36.sp, - letterSpacing = 0.sp + letterSpacing = 0.sp, ), headlineSmall = TextStyle( fontWeight = FontWeight.Normal, fontSize = 24.sp, lineHeight = 32.sp, - letterSpacing = 0.sp + letterSpacing = 0.sp, ), titleLarge = TextStyle( fontWeight = FontWeight.Bold, fontSize = 22.sp, lineHeight = 28.sp, - letterSpacing = 0.sp + letterSpacing = 0.sp, ), titleMedium = TextStyle( fontWeight = FontWeight.Bold, fontSize = 18.sp, lineHeight = 24.sp, - letterSpacing = 0.1.sp + letterSpacing = 0.1.sp, ), titleSmall = TextStyle( fontWeight = FontWeight.Medium, fontSize = 14.sp, lineHeight = 20.sp, - letterSpacing = 0.1.sp + letterSpacing = 0.1.sp, ), bodyLarge = TextStyle( fontWeight = FontWeight.Normal, fontSize = 16.sp, lineHeight = 24.sp, - letterSpacing = 0.5.sp + letterSpacing = 0.5.sp, ), bodyMedium = TextStyle( fontWeight = FontWeight.Normal, fontSize = 14.sp, lineHeight = 20.sp, - letterSpacing = 0.25.sp + letterSpacing = 0.25.sp, ), bodySmall = TextStyle( fontWeight = FontWeight.Normal, fontSize = 12.sp, lineHeight = 16.sp, - letterSpacing = 0.4.sp + letterSpacing = 0.4.sp, ), labelLarge = TextStyle( fontWeight = FontWeight.Medium, fontSize = 14.sp, lineHeight = 20.sp, - letterSpacing = 0.1.sp + letterSpacing = 0.1.sp, ), labelMedium = TextStyle( fontWeight = FontWeight.Medium, fontSize = 12.sp, lineHeight = 16.sp, - letterSpacing = 0.5.sp + letterSpacing = 0.5.sp, ), labelSmall = TextStyle( fontWeight = FontWeight.Medium, fontSize = 10.sp, lineHeight = 16.sp, - letterSpacing = 0.sp - ) + letterSpacing = 0.sp, + ), ) diff --git a/core/domain/src/main/java/com/google/samples/apps/nowinandroid/core/domain/GetFollowableTopicsUseCase.kt b/core/domain/src/main/java/com/google/samples/apps/nowinandroid/core/domain/GetFollowableTopicsUseCase.kt index 2fab78d6c9..ccc7e4ee12 100644 --- a/core/domain/src/main/java/com/google/samples/apps/nowinandroid/core/domain/GetFollowableTopicsUseCase.kt +++ b/core/domain/src/main/java/com/google/samples/apps/nowinandroid/core/domain/GetFollowableTopicsUseCase.kt @@ -21,16 +21,16 @@ import com.google.samples.apps.nowinandroid.core.data.repository.UserDataReposit import com.google.samples.apps.nowinandroid.core.domain.TopicSortField.NAME import com.google.samples.apps.nowinandroid.core.domain.TopicSortField.NONE import com.google.samples.apps.nowinandroid.core.domain.model.FollowableTopic -import javax.inject.Inject import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.combine +import javax.inject.Inject /** * A use case which obtains a list of topics with their followed state. */ class GetFollowableTopicsUseCase @Inject constructor( private val topicsRepository: TopicsRepository, - private val userDataRepository: UserDataRepository + private val userDataRepository: UserDataRepository, ) { /** * Returns a list of topics with their associated followed state. @@ -40,13 +40,13 @@ class GetFollowableTopicsUseCase @Inject constructor( operator fun invoke(sortBy: TopicSortField = NONE): Flow> { return combine( userDataRepository.userData, - topicsRepository.getTopics() + topicsRepository.getTopics(), ) { userData, topics -> val followedTopics = topics .map { topic -> FollowableTopic( topic = topic, - isFollowed = topic.id in userData.followedTopics + isFollowed = topic.id in userData.followedTopics, ) } when (sortBy) { diff --git a/core/domain/src/main/java/com/google/samples/apps/nowinandroid/core/domain/GetUserNewsResourcesUseCase.kt b/core/domain/src/main/java/com/google/samples/apps/nowinandroid/core/domain/GetUserNewsResourcesUseCase.kt index 07cd6d8564..db274bbbdf 100644 --- a/core/domain/src/main/java/com/google/samples/apps/nowinandroid/core/domain/GetUserNewsResourcesUseCase.kt +++ b/core/domain/src/main/java/com/google/samples/apps/nowinandroid/core/domain/GetUserNewsResourcesUseCase.kt @@ -22,10 +22,10 @@ import com.google.samples.apps.nowinandroid.core.domain.model.UserNewsResource import com.google.samples.apps.nowinandroid.core.domain.model.mapToUserNewsResources import com.google.samples.apps.nowinandroid.core.model.data.NewsResource import com.google.samples.apps.nowinandroid.core.model.data.UserData -import javax.inject.Inject import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.filterNot +import javax.inject.Inject /** * A use case responsible for obtaining news resources with their associated bookmarked (also known @@ -33,7 +33,7 @@ import kotlinx.coroutines.flow.filterNot */ class GetUserNewsResourcesUseCase @Inject constructor( private val newsRepository: NewsRepository, - private val userDataRepository: UserDataRepository + private val userDataRepository: UserDataRepository, ) { /** * Returns a list of UserNewsResources which match the supplied set of topic ids. @@ -42,7 +42,7 @@ class GetUserNewsResourcesUseCase @Inject constructor( * this is empty the list of news resources will not be filtered. */ operator fun invoke( - filterTopicIds: Set = emptySet() + filterTopicIds: Set = emptySet(), ): Flow> = if (filterTopicIds.isEmpty()) { newsRepository.getNewsResources() @@ -52,7 +52,7 @@ class GetUserNewsResourcesUseCase @Inject constructor( } private fun Flow>.mapToUserNewsResources( - userDataStream: Flow + userDataStream: Flow, ): Flow> = filterNot { it.isEmpty() } .combine(userDataStream) { newsResources, userData -> diff --git a/core/domain/src/main/java/com/google/samples/apps/nowinandroid/core/domain/model/FollowableTopic.kt b/core/domain/src/main/java/com/google/samples/apps/nowinandroid/core/domain/model/FollowableTopic.kt index 4071eb1aa8..121f830989 100644 --- a/core/domain/src/main/java/com/google/samples/apps/nowinandroid/core/domain/model/FollowableTopic.kt +++ b/core/domain/src/main/java/com/google/samples/apps/nowinandroid/core/domain/model/FollowableTopic.kt @@ -24,20 +24,20 @@ import com.google.samples.apps.nowinandroid.core.model.data.previewTopics */ data class FollowableTopic( // TODO consider changing to UserTopic and flattening val topic: Topic, - val isFollowed: Boolean + val isFollowed: Boolean, ) val previewFollowableTopics = listOf( FollowableTopic( previewTopics[0], - isFollowed = false + isFollowed = false, ), FollowableTopic( previewTopics[1], - isFollowed = true + isFollowed = true, ), FollowableTopic( previewTopics[2], - isFollowed = false - ) + isFollowed = false, + ), ) diff --git a/core/domain/src/main/java/com/google/samples/apps/nowinandroid/core/domain/model/UserNewsResource.kt b/core/domain/src/main/java/com/google/samples/apps/nowinandroid/core/domain/model/UserNewsResource.kt index 872f93f166..7cf511c603 100644 --- a/core/domain/src/main/java/com/google/samples/apps/nowinandroid/core/domain/model/UserNewsResource.kt +++ b/core/domain/src/main/java/com/google/samples/apps/nowinandroid/core/domain/model/UserNewsResource.kt @@ -42,7 +42,7 @@ data class UserNewsResource internal constructor( val publishDate: Instant, val type: NewsResourceType, val followableTopics: List, - val isSaved: Boolean + val isSaved: Boolean, ) { constructor(newsResource: NewsResource, userData: UserData) : this( id = newsResource.id, @@ -55,10 +55,10 @@ data class UserNewsResource internal constructor( followableTopics = newsResource.topics.map { topic -> FollowableTopic( topic = topic, - isFollowed = userData.followedTopics.contains(topic.id) + isFollowed = userData.followedTopics.contains(topic.id), ) }, - isSaved = userData.bookmarkedNewsResources.contains(newsResource.id) + isSaved = userData.bookmarkedNewsResources.contains(newsResource.id), ) } @@ -80,11 +80,11 @@ val previewUserNewsResources = listOf( hour = 23, minute = 0, second = 0, - nanosecond = 0 + nanosecond = 0, ).toInstant(TimeZone.UTC), type = Codelab, followableTopics = listOf(previewFollowableTopics[1]), - isSaved = true + isSaved = true, ), UserNewsResource( id = "2", @@ -98,7 +98,7 @@ val previewUserNewsResources = listOf( publishDate = Instant.parse("2021-11-09T00:00:00.000Z"), type = Video, followableTopics = listOf(previewFollowableTopics[0], previewFollowableTopics[1]), - isSaved = false + isSaved = false, ), UserNewsResource( id = "3", @@ -112,7 +112,7 @@ val previewUserNewsResources = listOf( publishDate = Instant.parse("2021-11-01T00:00:00.000Z"), type = Video, followableTopics = listOf(previewFollowableTopics[2]), - isSaved = false + isSaved = false, ), UserNewsResource( id = "4", @@ -124,6 +124,6 @@ val previewUserNewsResources = listOf( publishDate = Instant.parse("2022-10-01T00:00:00.000Z"), type = Unknown, followableTopics = listOf(previewFollowableTopics[2]), - isSaved = true - ) + isSaved = true, + ), ) diff --git a/core/domain/src/test/java/com/google/samples/apps/nowinandroid/core/domain/GetFollowableTopicsUseCaseTest.kt b/core/domain/src/test/java/com/google/samples/apps/nowinandroid/core/domain/GetFollowableTopicsUseCaseTest.kt index 95ab22b63f..8bf63aea49 100644 --- a/core/domain/src/test/java/com/google/samples/apps/nowinandroid/core/domain/GetFollowableTopicsUseCaseTest.kt +++ b/core/domain/src/test/java/com/google/samples/apps/nowinandroid/core/domain/GetFollowableTopicsUseCaseTest.kt @@ -22,11 +22,11 @@ import com.google.samples.apps.nowinandroid.core.model.data.Topic import com.google.samples.apps.nowinandroid.core.testing.repository.TestTopicsRepository import com.google.samples.apps.nowinandroid.core.testing.repository.TestUserDataRepository import com.google.samples.apps.nowinandroid.core.testing.util.MainDispatcherRule -import kotlin.test.assertEquals import kotlinx.coroutines.flow.first import kotlinx.coroutines.test.runTest import org.junit.Rule import org.junit.Test +import kotlin.test.assertEquals class GetFollowableTopicsUseCaseTest { @@ -38,12 +38,11 @@ class GetFollowableTopicsUseCaseTest { val useCase = GetFollowableTopicsUseCase( topicsRepository, - userDataRepository + userDataRepository, ) @Test fun whenNoParams_followableTopicsAreReturnedWithNoSorting() = runTest { - // Obtain a stream of followable topics. val followableTopics = useCase() @@ -58,16 +57,15 @@ class GetFollowableTopicsUseCaseTest { FollowableTopic(testTopics[1], false), FollowableTopic(testTopics[2], true), ), - followableTopics.first() + followableTopics.first(), ) } @Test fun whenSortOrderIsByName_topicsSortedByNameAreReturned() = runTest { - // Obtain a stream of followable topics, sorted by name. val followableTopics = useCase( - sortBy = NAME + sortBy = NAME, ) // Send some test topics and their followed state. @@ -81,7 +79,7 @@ class GetFollowableTopicsUseCaseTest { .sortedBy { it.name } .map { FollowableTopic(it, false) - } + }, ) } } diff --git a/core/domain/src/test/java/com/google/samples/apps/nowinandroid/core/domain/GetUserNewsResourcesUseCaseTest.kt b/core/domain/src/test/java/com/google/samples/apps/nowinandroid/core/domain/GetUserNewsResourcesUseCaseTest.kt index fe50ecf4d6..32ee8773ce 100644 --- a/core/domain/src/test/java/com/google/samples/apps/nowinandroid/core/domain/GetUserNewsResourcesUseCaseTest.kt +++ b/core/domain/src/test/java/com/google/samples/apps/nowinandroid/core/domain/GetUserNewsResourcesUseCaseTest.kt @@ -24,12 +24,12 @@ import com.google.samples.apps.nowinandroid.core.testing.repository.TestNewsRepo import com.google.samples.apps.nowinandroid.core.testing.repository.TestUserDataRepository import com.google.samples.apps.nowinandroid.core.testing.repository.emptyUserData import com.google.samples.apps.nowinandroid.core.testing.util.MainDispatcherRule -import kotlin.test.assertEquals import kotlinx.coroutines.flow.first import kotlinx.coroutines.test.runTest import kotlinx.datetime.Instant import org.junit.Rule import org.junit.Test +import kotlin.test.assertEquals class GetUserNewsResourcesUseCaseTest { @@ -43,7 +43,6 @@ class GetUserNewsResourcesUseCaseTest { @Test fun whenNoFilters_allNewsResourcesAreReturned() = runTest { - // Obtain the user news resources stream. val userNewsResources = useCase() @@ -53,7 +52,7 @@ class GetUserNewsResourcesUseCaseTest { // Construct the test user data with bookmarks and followed topics. val userData = emptyUserData.copy( bookmarkedNewsResources = setOf(sampleNewsResources[0].id, sampleNewsResources[2].id), - followedTopics = setOf(sampleTopic1.id) + followedTopics = setOf(sampleTopic1.id), ) userDataRepository.setUserData(userData) @@ -61,13 +60,12 @@ class GetUserNewsResourcesUseCaseTest { // Check that the correct news resources are returned with their bookmarked state. assertEquals( sampleNewsResources.mapToUserNewsResources(userData), - userNewsResources.first() + userNewsResources.first(), ) } @Test fun whenFilteredByTopicId_matchingNewsResourcesAreReturned() = runTest { - // Obtain a stream of user news resources for the given topic id. val userNewsResources = useCase(filterTopicIds = setOf(sampleTopic1.id)) @@ -80,7 +78,7 @@ class GetUserNewsResourcesUseCaseTest { sampleNewsResources .filter { it.topics.contains(sampleTopic1) } .mapToUserNewsResources(emptyUserData), - userNewsResources.first() + userNewsResources.first(), ) } } @@ -115,7 +113,7 @@ private val sampleNewsResources = listOf( headerImageUrl = "https://i.ytimg.com/vi/-fJ6poHQrjM/maxresdefault.jpg", publishDate = Instant.parse("2021-11-09T00:00:00.000Z"), type = Video, - topics = listOf(sampleTopic1) + topics = listOf(sampleTopic1), ), NewsResource( id = "2", @@ -127,7 +125,7 @@ private val sampleNewsResources = listOf( headerImageUrl = "https://i.ytimg.com/vi/ZARz0pjm5YM/maxresdefault.jpg", publishDate = Instant.parse("2021-11-01T00:00:00.000Z"), type = Video, - topics = listOf(sampleTopic1, sampleTopic2) + topics = listOf(sampleTopic1, sampleTopic2), ), NewsResource( id = "3", @@ -137,6 +135,6 @@ private val sampleNewsResources = listOf( headerImageUrl = "https://i.ytimg.com/vi/r5JgIyS3t3s/maxresdefault.jpg", publishDate = Instant.parse("2021-11-08T00:00:00.000Z"), type = Video, - topics = listOf(sampleTopic2) + topics = listOf(sampleTopic2), ), ) diff --git a/core/domain/src/test/java/com/google/samples/apps/nowinandroid/core/domain/UserNewsResourceTest.kt b/core/domain/src/test/java/com/google/samples/apps/nowinandroid/core/domain/UserNewsResourceTest.kt index d06a6d5acf..8350c51787 100644 --- a/core/domain/src/test/java/com/google/samples/apps/nowinandroid/core/domain/UserNewsResourceTest.kt +++ b/core/domain/src/test/java/com/google/samples/apps/nowinandroid/core/domain/UserNewsResourceTest.kt @@ -38,7 +38,6 @@ class UserNewsResourceTest { */ @Test fun userNewsResourcesAreConstructedFromNewsResourcesAndUserData() { - val newsResource1 = NewsResource( id = "N1", title = "Test news title", @@ -54,7 +53,7 @@ class UserNewsResourceTest { shortDescription = "Topic 1 short description", longDescription = "Topic 1 long description", url = "Topic 1 URL", - imageUrl = "Topic 1 image URL" + imageUrl = "Topic 1 image URL", ), Topic( id = "T2", @@ -62,9 +61,9 @@ class UserNewsResourceTest { shortDescription = "Topic 2 short description", longDescription = "Topic 2 long description", url = "Topic 2 URL", - imageUrl = "Topic 2 image URL" + imageUrl = "Topic 2 image URL", ), - ) + ), ) val userData = UserData( @@ -73,7 +72,7 @@ class UserNewsResourceTest { themeBrand = DEFAULT, darkThemeConfig = FOLLOW_SYSTEM, useDynamicColor = false, - shouldHideOnboarding = true + shouldHideOnboarding = true, ) val userNewsResource = UserNewsResource(newsResource1, userData) @@ -89,11 +88,10 @@ class UserNewsResourceTest { // Check that each Topic has been converted to a FollowedTopic correctly. assertEquals(newsResource1.topics.size, userNewsResource.followableTopics.size) for (topic in newsResource1.topics) { - // Construct the expected FollowableTopic. val followableTopic = FollowableTopic( topic = topic, - isFollowed = userData.followedTopics.contains(topic.id) + isFollowed = userData.followedTopics.contains(topic.id), ) assertTrue(userNewsResource.followableTopics.contains(followableTopic)) } @@ -101,7 +99,7 @@ class UserNewsResourceTest { // Check that the saved flag is set correctly. assertEquals( userData.bookmarkedNewsResources.contains(newsResource1.id), - userNewsResource.isSaved + userNewsResource.isSaved, ) } } diff --git a/core/model/src/main/java/com/google/samples/apps/nowinandroid/core/model/data/NewsResource.kt b/core/model/src/main/java/com/google/samples/apps/nowinandroid/core/model/data/NewsResource.kt index 4f75d27add..2f60ca43bb 100644 --- a/core/model/src/main/java/com/google/samples/apps/nowinandroid/core/model/data/NewsResource.kt +++ b/core/model/src/main/java/com/google/samples/apps/nowinandroid/core/model/data/NewsResource.kt @@ -37,7 +37,7 @@ data class NewsResource( val headerImageUrl: String?, val publishDate: Instant, val type: NewsResourceType, - val topics: List + val topics: List, ) val previewNewsResources = listOf( @@ -54,10 +54,10 @@ val previewNewsResources = listOf( hour = 23, minute = 0, second = 0, - nanosecond = 0 + nanosecond = 0, ).toInstant(TimeZone.UTC), type = Codelab, - topics = listOf(previewTopics[1]) + topics = listOf(previewTopics[1]), ), NewsResource( id = "2", @@ -70,7 +70,7 @@ val previewNewsResources = listOf( headerImageUrl = "https://i.ytimg.com/vi/-fJ6poHQrjM/maxresdefault.jpg", publishDate = Instant.parse("2021-11-09T00:00:00.000Z"), type = Video, - topics = listOf(previewTopics[0], previewTopics[1]) + topics = listOf(previewTopics[0], previewTopics[1]), ), NewsResource( id = "3", @@ -83,7 +83,7 @@ val previewNewsResources = listOf( headerImageUrl = "https://i.ytimg.com/vi/ZARz0pjm5YM/maxresdefault.jpg", publishDate = Instant.parse("2021-11-01T00:00:00.000Z"), type = Video, - topics = listOf(previewTopics[2]) + topics = listOf(previewTopics[2]), ), NewsResource( id = "4", @@ -94,6 +94,6 @@ val previewNewsResources = listOf( headerImageUrl = "", publishDate = Instant.parse("2022-10-01T00:00:00.000Z"), type = Unknown, - topics = listOf(previewTopics[2]) - ) + topics = listOf(previewTopics[2]), + ), ) diff --git a/core/model/src/main/java/com/google/samples/apps/nowinandroid/core/model/data/NewsResourceType.kt b/core/model/src/main/java/com/google/samples/apps/nowinandroid/core/model/data/NewsResourceType.kt index a6a175ff30..bb00f86208 100644 --- a/core/model/src/main/java/com/google/samples/apps/nowinandroid/core/model/data/NewsResourceType.kt +++ b/core/model/src/main/java/com/google/samples/apps/nowinandroid/core/model/data/NewsResourceType.kt @@ -23,53 +23,53 @@ enum class NewsResourceType( val serializedName: String, val displayText: String, // TODO: descriptions should probably be string resources - val description: String + val description: String, ) { Video( serializedName = "Video 📺", displayText = "Video 📺", - description = "A video published on YouTube" + description = "A video published on YouTube", ), APIChange( serializedName = "API change", displayText = "API change", - description = "An addition, deprecation or change to the Android platform APIs." + description = "An addition, deprecation or change to the Android platform APIs.", ), Article( serializedName = "Article 📚", displayText = "Article 📚", - description = "An article, typically on Medium or the official Android blog" + description = "An article, typically on Medium or the official Android blog", ), Codelab( serializedName = "Codelab", displayText = "Codelab", - description = "A new or updated codelab" + description = "A new or updated codelab", ), Podcast( serializedName = "Podcast 🎙", displayText = "Podcast 🎙", - description = "A podcast" + description = "A podcast", ), Docs( serializedName = "Docs 📑", displayText = "Docs 📑", - description = "A new or updated piece of documentation" + description = "A new or updated piece of documentation", ), Event( serializedName = "Event 📆", displayText = "Event 📆", - description = "Information about a developer event e.g. Android Developer Summit" + description = "Information about a developer event e.g. Android Developer Summit", ), DAC( serializedName = "DAC", displayText = "DAC", - description = "Android version features - Information about features in an Android" + description = "Android version features - Information about features in an Android", ), Unknown( serializedName = "Unknown", displayText = "Unknown", - description = "Unknown" - ) + description = "Unknown", + ), } fun String?.asNewsResourceType() = when (this) { diff --git a/core/model/src/main/java/com/google/samples/apps/nowinandroid/core/model/data/Topic.kt b/core/model/src/main/java/com/google/samples/apps/nowinandroid/core/model/data/Topic.kt index 16dd4e4646..03c184e0d5 100644 --- a/core/model/src/main/java/com/google/samples/apps/nowinandroid/core/model/data/Topic.kt +++ b/core/model/src/main/java/com/google/samples/apps/nowinandroid/core/model/data/Topic.kt @@ -37,7 +37,7 @@ val previewTopics = listOf( shortDescription = "News we want everyone to see", longDescription = "Stay up to date with the latest events and announcements from Android!", imageUrl = "https://firebasestorage.googleapis.com/v0/b/now-in-android.appspot.com/o/img%2Fic_topic_Headlines.svg?alt=media&token=506faab0-617a-4668-9e63-4a2fb996603f", - url = "" + url = "", ), Topic( id = "3", @@ -45,7 +45,7 @@ val previewTopics = listOf( shortDescription = "Material Design, Navigation, Text, Paging, Accessibility (a11y), Internationalization (i18n), Localization (l10n), Animations, Large Screens, Widgets", longDescription = "Learn how to optimize your app's user interface - everything that users can see and interact with. Stay up to date on tocpis such as Material Design, Navigation, Text, Paging, Compose, Accessibility (a11y), Internationalization (i18n), Localization (l10n), Animations, Large Screens, Widgets, and many more!", imageUrl = "https://firebasestorage.googleapis.com/v0/b/now-in-android.appspot.com/o/img%2Fic_topic_UI.svg?alt=media&token=0ee1842b-12e8-435f-87ba-a5bb02c47594", - url = "" + url = "", ), Topic( id = "4", @@ -53,6 +53,6 @@ val previewTopics = listOf( shortDescription = "CI, Espresso, TestLab, etc", longDescription = "Testing is an integral part of the app development process. By running tests against your app consistently, you can verify your app's correctness, functional behavior, and usability before you release it publicly. Stay up to date on the latest tricks in CI, Espresso, and Firebase TestLab.", imageUrl = "https://firebasestorage.googleapis.com/v0/b/now-in-android.appspot.com/o/img%2Fic_topic_Testing.svg?alt=media&token=a11533c4-7cc8-4b11-91a3-806158ebf428", - url = "" + url = "", ), ) diff --git a/core/model/src/main/java/com/google/samples/apps/nowinandroid/core/model/data/UserData.kt b/core/model/src/main/java/com/google/samples/apps/nowinandroid/core/model/data/UserData.kt index 56e3fa522d..638b90d368 100644 --- a/core/model/src/main/java/com/google/samples/apps/nowinandroid/core/model/data/UserData.kt +++ b/core/model/src/main/java/com/google/samples/apps/nowinandroid/core/model/data/UserData.kt @@ -25,5 +25,5 @@ data class UserData( val themeBrand: ThemeBrand, val darkThemeConfig: DarkThemeConfig, val useDynamicColor: Boolean, - val shouldHideOnboarding: Boolean + val shouldHideOnboarding: Boolean, ) diff --git a/core/network/src/main/java/com/google/samples/apps/nowinandroid/core/network/di/NetworkModule.kt b/core/network/src/main/java/com/google/samples/apps/nowinandroid/core/network/di/NetworkModule.kt index d6b6b987d4..a272451e53 100644 --- a/core/network/src/main/java/com/google/samples/apps/nowinandroid/core/network/di/NetworkModule.kt +++ b/core/network/src/main/java/com/google/samples/apps/nowinandroid/core/network/di/NetworkModule.kt @@ -23,8 +23,8 @@ import dagger.Provides import dagger.hilt.InstallIn import dagger.hilt.android.qualifiers.ApplicationContext import dagger.hilt.components.SingletonComponent -import javax.inject.Singleton import kotlinx.serialization.json.Json +import javax.inject.Singleton @Module @InstallIn(SingletonComponent::class) diff --git a/core/network/src/main/java/com/google/samples/apps/nowinandroid/core/network/fake/FakeNiaNetworkDataSource.kt b/core/network/src/main/java/com/google/samples/apps/nowinandroid/core/network/fake/FakeNiaNetworkDataSource.kt index 47a8ab4c45..4ffddb20aa 100644 --- a/core/network/src/main/java/com/google/samples/apps/nowinandroid/core/network/fake/FakeNiaNetworkDataSource.kt +++ b/core/network/src/main/java/com/google/samples/apps/nowinandroid/core/network/fake/FakeNiaNetworkDataSource.kt @@ -23,12 +23,12 @@ import com.google.samples.apps.nowinandroid.core.network.NiaNetworkDataSource import com.google.samples.apps.nowinandroid.core.network.model.NetworkChangeList import com.google.samples.apps.nowinandroid.core.network.model.NetworkNewsResource import com.google.samples.apps.nowinandroid.core.network.model.NetworkTopic -import javax.inject.Inject import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.withContext import kotlinx.serialization.ExperimentalSerializationApi import kotlinx.serialization.json.Json import kotlinx.serialization.json.decodeFromStream +import javax.inject.Inject /** * [NiaNetworkDataSource] implementation that provides static news resources to aid development @@ -69,7 +69,7 @@ class FakeNiaNetworkDataSource @Inject constructor( * [NetworkChangeList.id] */ private fun List.mapToChangeList( - idGetter: (T) -> String + idGetter: (T) -> String, ) = mapIndexed { index, item -> NetworkChangeList( id = idGetter(item), diff --git a/core/network/src/main/java/com/google/samples/apps/nowinandroid/core/network/model/util/InstantSerializer.kt b/core/network/src/main/java/com/google/samples/apps/nowinandroid/core/network/model/util/InstantSerializer.kt index f093998cf9..dec73dc107 100644 --- a/core/network/src/main/java/com/google/samples/apps/nowinandroid/core/network/model/util/InstantSerializer.kt +++ b/core/network/src/main/java/com/google/samples/apps/nowinandroid/core/network/model/util/InstantSerializer.kt @@ -31,7 +31,7 @@ object InstantSerializer : KSerializer { override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor( serialName = "Instant", - kind = STRING + kind = STRING, ) override fun serialize(encoder: Encoder, value: Instant) = diff --git a/core/network/src/main/java/com/google/samples/apps/nowinandroid/core/network/model/util/NewsResourceTypeSerializer.kt b/core/network/src/main/java/com/google/samples/apps/nowinandroid/core/network/model/util/NewsResourceTypeSerializer.kt index 4100a956cb..ac40d6182c 100644 --- a/core/network/src/main/java/com/google/samples/apps/nowinandroid/core/network/model/util/NewsResourceTypeSerializer.kt +++ b/core/network/src/main/java/com/google/samples/apps/nowinandroid/core/network/model/util/NewsResourceTypeSerializer.kt @@ -31,7 +31,7 @@ object NewsResourceTypeSerializer : KSerializer { override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor( serialName = "type", - kind = STRING + kind = STRING, ) override fun serialize(encoder: Encoder, value: NewsResourceType) = diff --git a/core/network/src/main/java/com/google/samples/apps/nowinandroid/core/network/retrofit/RetrofitNiaNetwork.kt b/core/network/src/main/java/com/google/samples/apps/nowinandroid/core/network/retrofit/RetrofitNiaNetwork.kt index e380c05cc3..6b59f16e34 100644 --- a/core/network/src/main/java/com/google/samples/apps/nowinandroid/core/network/retrofit/RetrofitNiaNetwork.kt +++ b/core/network/src/main/java/com/google/samples/apps/nowinandroid/core/network/retrofit/RetrofitNiaNetwork.kt @@ -22,8 +22,6 @@ import com.google.samples.apps.nowinandroid.core.network.model.NetworkChangeList import com.google.samples.apps.nowinandroid.core.network.model.NetworkNewsResource import com.google.samples.apps.nowinandroid.core.network.model.NetworkTopic import com.jakewharton.retrofit2.converter.kotlinx.serialization.asConverterFactory -import javax.inject.Inject -import javax.inject.Singleton import kotlinx.serialization.ExperimentalSerializationApi import kotlinx.serialization.Serializable import kotlinx.serialization.json.Json @@ -33,6 +31,8 @@ import okhttp3.logging.HttpLoggingInterceptor import retrofit2.Retrofit import retrofit2.http.GET import retrofit2.http.Query +import javax.inject.Inject +import javax.inject.Singleton /** * Retrofit API declaration for NIA Network API @@ -66,7 +66,7 @@ private const val NiaBaseUrl = BuildConfig.BACKEND_URL */ @Serializable private data class NetworkResponse( - val data: T + val data: T, ) /** @@ -74,7 +74,7 @@ private data class NetworkResponse( */ @Singleton class RetrofitNiaNetwork @Inject constructor( - networkJson: Json + networkJson: Json, ) : NiaNetworkDataSource { private val networkApi = Retrofit.Builder() @@ -85,13 +85,13 @@ class RetrofitNiaNetwork @Inject constructor( // TODO: Decide logging logic HttpLoggingInterceptor().apply { setLevel(HttpLoggingInterceptor.Level.BODY) - } + }, ) - .build() + .build(), ) .addConverterFactory( @OptIn(ExperimentalSerializationApi::class) - networkJson.asConverterFactory("application/json".toMediaType()) + networkJson.asConverterFactory("application/json".toMediaType()), ) .build() .create(RetrofitNiaNetworkApi::class.java) diff --git a/core/network/src/test/java/com/google/samples/apps/nowinandroid/core/network/fake/FakeNiaNetworkDataSourceTest.kt b/core/network/src/test/java/com/google/samples/apps/nowinandroid/core/network/fake/FakeNiaNetworkDataSourceTest.kt index 48eb4746b9..f543517501 100644 --- a/core/network/src/test/java/com/google/samples/apps/nowinandroid/core/network/fake/FakeNiaNetworkDataSourceTest.kt +++ b/core/network/src/test/java/com/google/samples/apps/nowinandroid/core/network/fake/FakeNiaNetworkDataSourceTest.kt @@ -20,7 +20,6 @@ import JvmUnitTestFakeAssetManager import com.google.samples.apps.nowinandroid.core.model.data.NewsResourceType.Codelab import com.google.samples.apps.nowinandroid.core.network.model.NetworkNewsResource import com.google.samples.apps.nowinandroid.core.network.model.NetworkTopic -import kotlin.test.assertEquals import kotlinx.coroutines.test.StandardTestDispatcher import kotlinx.coroutines.test.runTest import kotlinx.datetime.LocalDateTime @@ -29,6 +28,7 @@ import kotlinx.datetime.toInstant import kotlinx.serialization.json.Json import org.junit.Before import org.junit.Test +import kotlin.test.assertEquals class FakeNiaNetworkDataSourceTest { @@ -41,7 +41,7 @@ class FakeNiaNetworkDataSourceTest { subject = FakeNiaNetworkDataSource( ioDispatcher = testDispatcher, networkJson = Json { ignoreUnknownKeys = true }, - assets = JvmUnitTestFakeAssetManager + assets = JvmUnitTestFakeAssetManager, ) } @@ -55,10 +55,10 @@ class FakeNiaNetworkDataSourceTest { shortDescription = "News you'll definitely be interested in", longDescription = "The latest events and announcements from the world of Android development.", url = "", - imageUrl = "https://firebasestorage.googleapis.com/v0/b/now-in-android.appspot.com/o/img%2Fic_topic_Headlines.svg?alt=media&token=506faab0-617a-4668-9e63-4a2fb996603f" + imageUrl = "https://firebasestorage.googleapis.com/v0/b/now-in-android.appspot.com/o/img%2Fic_topic_Headlines.svg?alt=media&token=506faab0-617a-4668-9e63-4a2fb996603f", ), /* ktlint-enable max-line-length */ - subject.getTopics().first() + subject.getTopics().first(), ) } @@ -79,13 +79,13 @@ class FakeNiaNetworkDataSourceTest { hour = 23, minute = 0, second = 0, - nanosecond = 0 + nanosecond = 0, ).toInstant(TimeZone.UTC), type = Codelab, topics = listOf("2", "3", "10"), ), /* ktlint-enable max-line-length */ - subject.getNewsResources().find { it.id == "125" } + subject.getNewsResources().find { it.id == "125" }, ) } } diff --git a/core/network/src/test/java/com/google/samples/apps/nowinandroid/core/network/model/util/NewsResourceTypeSerializerTest.kt b/core/network/src/test/java/com/google/samples/apps/nowinandroid/core/network/model/util/NewsResourceTypeSerializerTest.kt index 191501a3d6..16ac7df265 100644 --- a/core/network/src/test/java/com/google/samples/apps/nowinandroid/core/network/model/util/NewsResourceTypeSerializerTest.kt +++ b/core/network/src/test/java/com/google/samples/apps/nowinandroid/core/network/model/util/NewsResourceTypeSerializerTest.kt @@ -17,9 +17,9 @@ package com.google.samples.apps.nowinandroid.core.network.model.util import com.google.samples.apps.nowinandroid.core.model.data.NewsResourceType -import kotlin.test.assertEquals import kotlinx.serialization.json.Json import org.junit.Test +import kotlin.test.assertEquals class NewsResourceTypeSerializerTest { @@ -27,7 +27,7 @@ class NewsResourceTypeSerializerTest { fun test_news_resource_serializer_video() { assertEquals( NewsResourceType.Video, - Json.decodeFromString(NewsResourceTypeSerializer, """"Video 📺"""") + Json.decodeFromString(NewsResourceTypeSerializer, """"Video 📺""""), ) } @@ -35,7 +35,7 @@ class NewsResourceTypeSerializerTest { fun test_news_resource_serializer_article() { assertEquals( NewsResourceType.Article, - Json.decodeFromString(NewsResourceTypeSerializer, """"Article 📚"""") + Json.decodeFromString(NewsResourceTypeSerializer, """"Article 📚""""), ) } @@ -43,7 +43,7 @@ class NewsResourceTypeSerializerTest { fun test_news_resource_serializer_api_change() { assertEquals( NewsResourceType.APIChange, - Json.decodeFromString(NewsResourceTypeSerializer, """"API change"""") + Json.decodeFromString(NewsResourceTypeSerializer, """"API change""""), ) } @@ -51,7 +51,7 @@ class NewsResourceTypeSerializerTest { fun test_news_resource_serializer_codelab() { assertEquals( NewsResourceType.Codelab, - Json.decodeFromString(NewsResourceTypeSerializer, """"Codelab"""") + Json.decodeFromString(NewsResourceTypeSerializer, """"Codelab""""), ) } @@ -59,7 +59,7 @@ class NewsResourceTypeSerializerTest { fun test_news_resource_serializer_podcast() { assertEquals( NewsResourceType.Podcast, - Json.decodeFromString(NewsResourceTypeSerializer, """"Podcast 🎙"""") + Json.decodeFromString(NewsResourceTypeSerializer, """"Podcast 🎙""""), ) } @@ -67,7 +67,7 @@ class NewsResourceTypeSerializerTest { fun test_news_resource_serializer_docs() { assertEquals( NewsResourceType.Docs, - Json.decodeFromString(NewsResourceTypeSerializer, """"Docs 📑"""") + Json.decodeFromString(NewsResourceTypeSerializer, """"Docs 📑""""), ) } @@ -75,7 +75,7 @@ class NewsResourceTypeSerializerTest { fun test_news_resource_serializer_event() { assertEquals( NewsResourceType.Event, - Json.decodeFromString(NewsResourceTypeSerializer, """"Event 📆"""") + Json.decodeFromString(NewsResourceTypeSerializer, """"Event 📆""""), ) } @@ -83,7 +83,7 @@ class NewsResourceTypeSerializerTest { fun test_news_resource_serializer_dac() { assertEquals( NewsResourceType.DAC, - Json.decodeFromString(NewsResourceTypeSerializer, """"DAC"""") + Json.decodeFromString(NewsResourceTypeSerializer, """"DAC""""), ) } @@ -91,7 +91,7 @@ class NewsResourceTypeSerializerTest { fun test_news_resource_serializer_unknown() { assertEquals( NewsResourceType.Unknown, - Json.decodeFromString(NewsResourceTypeSerializer, """"umm"""") + Json.decodeFromString(NewsResourceTypeSerializer, """"umm""""), ) } @@ -100,7 +100,7 @@ class NewsResourceTypeSerializerTest { val json = Json.encodeToString(NewsResourceTypeSerializer, NewsResourceType.Video) assertEquals( NewsResourceType.Video, - Json.decodeFromString(NewsResourceTypeSerializer, json) + Json.decodeFromString(NewsResourceTypeSerializer, json), ) } } diff --git a/core/testing/src/main/java/com/google/samples/apps/nowinandroid/core/testing/di/TestDispatcherModule.kt b/core/testing/src/main/java/com/google/samples/apps/nowinandroid/core/testing/di/TestDispatcherModule.kt index d0af328936..66d52dabe6 100644 --- a/core/testing/src/main/java/com/google/samples/apps/nowinandroid/core/testing/di/TestDispatcherModule.kt +++ b/core/testing/src/main/java/com/google/samples/apps/nowinandroid/core/testing/di/TestDispatcherModule.kt @@ -20,9 +20,9 @@ import dagger.Module import dagger.Provides import dagger.hilt.InstallIn import dagger.hilt.components.SingletonComponent -import javax.inject.Singleton import kotlinx.coroutines.test.TestDispatcher import kotlinx.coroutines.test.UnconfinedTestDispatcher +import javax.inject.Singleton @Module @InstallIn(SingletonComponent::class) diff --git a/core/testing/src/main/java/com/google/samples/apps/nowinandroid/core/testing/repository/TestUserDataRepository.kt b/core/testing/src/main/java/com/google/samples/apps/nowinandroid/core/testing/repository/TestUserDataRepository.kt index c4c6e126f1..e1b86cd63b 100644 --- a/core/testing/src/main/java/com/google/samples/apps/nowinandroid/core/testing/repository/TestUserDataRepository.kt +++ b/core/testing/src/main/java/com/google/samples/apps/nowinandroid/core/testing/repository/TestUserDataRepository.kt @@ -31,7 +31,7 @@ val emptyUserData = UserData( themeBrand = ThemeBrand.DEFAULT, darkThemeConfig = DarkThemeConfig.FOLLOW_SYSTEM, useDynamicColor = false, - shouldHideOnboarding = false + shouldHideOnboarding = false, ) class TestUserDataRepository : UserDataRepository { @@ -50,8 +50,11 @@ class TestUserDataRepository : UserDataRepository { override suspend fun toggleFollowedTopicId(followedTopicId: String, followed: Boolean) { currentUserData.let { current -> - val followedTopics = if (followed) current.followedTopics + followedTopicId - else current.followedTopics - followedTopicId + val followedTopics = if (followed) { + current.followedTopics + followedTopicId + } else { + current.followedTopics - followedTopicId + } _userData.tryEmit(current.copy(followedTopics = followedTopics)) } @@ -59,8 +62,11 @@ class TestUserDataRepository : UserDataRepository { override suspend fun updateNewsResourceBookmark(newsResourceId: String, bookmarked: Boolean) { currentUserData.let { current -> - val bookmarkedNews = if (bookmarked) current.bookmarkedNewsResources + newsResourceId - else current.bookmarkedNewsResources - newsResourceId + val bookmarkedNews = if (bookmarked) { + current.bookmarkedNewsResources + newsResourceId + } else { + current.bookmarkedNewsResources - newsResourceId + } _userData.tryEmit(current.copy(bookmarkedNewsResources = bookmarkedNews)) } diff --git a/core/ui/src/androidTest/java/com/google/samples/apps/nowinandroid/core/ui/NewsResourceCardTest.kt b/core/ui/src/androidTest/java/com/google/samples/apps/nowinandroid/core/ui/NewsResourceCardTest.kt index 6fbe0b0e4a..ddcd2644ec 100644 --- a/core/ui/src/androidTest/java/com/google/samples/apps/nowinandroid/core/ui/NewsResourceCardTest.kt +++ b/core/ui/src/androidTest/java/com/google/samples/apps/nowinandroid/core/ui/NewsResourceCardTest.kt @@ -40,7 +40,7 @@ class NewsResourceCardTest { userNewsResource = newsWithKnownResourceType, isBookmarked = false, onToggleBookmark = {}, - onClick = {} + onClick = {}, ) dateFormatted = dateFormatted(publishDate = newsWithKnownResourceType.publishDate) @@ -51,8 +51,8 @@ class NewsResourceCardTest { composeTestRule.activity.getString( R.string.card_meta_data_text, dateFormatted, - newsWithKnownResourceType.type.displayText - ) + newsWithKnownResourceType.type.displayText, + ), ) .assertExists() } @@ -67,7 +67,7 @@ class NewsResourceCardTest { userNewsResource = newsWithUnknownResourceType, isBookmarked = false, onToggleBookmark = {}, - onClick = {} + onClick = {}, ) dateFormatted = dateFormatted(publishDate = newsWithUnknownResourceType.publishDate) diff --git a/core/ui/src/main/java/com/google/samples/apps/nowinandroid/core/ui/JankStatsExtensions.kt b/core/ui/src/main/java/com/google/samples/apps/nowinandroid/core/ui/JankStatsExtensions.kt index d4ca9180de..c9fee1ac89 100644 --- a/core/ui/src/main/java/com/google/samples/apps/nowinandroid/core/ui/JankStatsExtensions.kt +++ b/core/ui/src/main/java/com/google/samples/apps/nowinandroid/core/ui/JankStatsExtensions.kt @@ -51,7 +51,7 @@ fun rememberMetricsStateHolder(): Holder { @Composable fun TrackJank( vararg keys: Any?, - reportMetric: suspend CoroutineScope.(state: Holder) -> Unit + reportMetric: suspend CoroutineScope.(state: Holder) -> Unit, ) { val metrics = rememberMetricsStateHolder() LaunchedEffect(metrics, *keys) { @@ -66,7 +66,7 @@ fun TrackJank( @Composable fun TrackDisposableJank( vararg keys: Any?, - reportMetric: DisposableEffectScope.(state: Holder) -> DisposableEffectResult + reportMetric: DisposableEffectScope.(state: Holder) -> DisposableEffectResult, ) { val metrics = rememberMetricsStateHolder() DisposableEffect(metrics, *keys) { diff --git a/core/ui/src/main/java/com/google/samples/apps/nowinandroid/core/ui/NewsFeed.kt b/core/ui/src/main/java/com/google/samples/apps/nowinandroid/core/ui/NewsFeed.kt index 44c810a361..bbff34e40a 100644 --- a/core/ui/src/main/java/com/google/samples/apps/nowinandroid/core/ui/NewsFeed.kt +++ b/core/ui/src/main/java/com/google/samples/apps/nowinandroid/core/ui/NewsFeed.kt @@ -46,7 +46,7 @@ import com.google.samples.apps.nowinandroid.core.domain.model.previewUserNewsRes */ fun LazyGridScope.newsFeed( feedState: NewsFeedUiState, - onNewsResourcesCheckedChanged: (String, Boolean) -> Unit + onNewsResourcesCheckedChanged: (String, Boolean) -> Unit, ) { when (feedState) { NewsFeedUiState.Loading -> Unit @@ -65,9 +65,9 @@ fun LazyGridScope.newsFeed( onToggleBookmark = { onNewsResourcesCheckedChanged( userNewsResource.id, - !userNewsResource.isSaved + !userNewsResource.isSaved, ) - } + }, ) } } @@ -100,7 +100,7 @@ sealed interface NewsFeedUiState { /** * The list of news resources contained in this feed. */ - val feed: List + val feed: List, ) : NewsFeedUiState } @@ -111,7 +111,7 @@ private fun NewsFeedLoadingPreview() { LazyVerticalGrid(columns = GridCells.Adaptive(300.dp)) { newsFeed( feedState = NewsFeedUiState.Loading, - onNewsResourcesCheckedChanged = { _, _ -> } + onNewsResourcesCheckedChanged = { _, _ -> }, ) } } @@ -125,9 +125,9 @@ private fun NewsFeedContentPreview() { LazyVerticalGrid(columns = GridCells.Adaptive(300.dp)) { newsFeed( feedState = NewsFeedUiState.Success( - previewUserNewsResources + previewUserNewsResources, ), - onNewsResourcesCheckedChanged = { _, _ -> } + onNewsResourcesCheckedChanged = { _, _ -> }, ) } } diff --git a/core/ui/src/main/java/com/google/samples/apps/nowinandroid/core/ui/NewsResourceCard.kt b/core/ui/src/main/java/com/google/samples/apps/nowinandroid/core/ui/NewsResourceCard.kt index 76657067ed..f2ec186e70 100644 --- a/core/ui/src/main/java/com/google/samples/apps/nowinandroid/core/ui/NewsResourceCard.kt +++ b/core/ui/src/main/java/com/google/samples/apps/nowinandroid/core/ui/NewsResourceCard.kt @@ -52,7 +52,6 @@ import androidx.compose.ui.semantics.semantics import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import coil.compose.AsyncImage -import com.google.samples.apps.nowinandroid.core.designsystem.R as DesignsystemR import com.google.samples.apps.nowinandroid.core.designsystem.component.NiaIconToggleButton import com.google.samples.apps.nowinandroid.core.designsystem.component.NiaTopicTag import com.google.samples.apps.nowinandroid.core.designsystem.icon.NiaIcons @@ -62,11 +61,12 @@ import com.google.samples.apps.nowinandroid.core.domain.model.UserNewsResource import com.google.samples.apps.nowinandroid.core.domain.model.previewUserNewsResources import com.google.samples.apps.nowinandroid.core.model.data.NewsResource import com.google.samples.apps.nowinandroid.core.model.data.NewsResourceType +import kotlinx.datetime.Instant +import kotlinx.datetime.toJavaInstant import java.time.ZoneId import java.time.format.DateTimeFormatter import java.util.Locale -import kotlinx.datetime.Instant -import kotlinx.datetime.toJavaInstant +import com.google.samples.apps.nowinandroid.core.designsystem.R as DesignsystemR /** * [NewsResource] card used on the following screens: For You, Saved @@ -79,7 +79,7 @@ fun NewsResourceCardExpanded( isBookmarked: Boolean, onToggleBookmark: () -> Unit, onClick: () -> Unit, - modifier: Modifier = Modifier + modifier: Modifier = Modifier, ) { val clickActionLabel = stringResource(R.string.card_tap_action) Card( @@ -90,7 +90,7 @@ fun NewsResourceCardExpanded( // Pass null for action to only override the label and not the actual action. modifier = modifier.semantics { onClick(label = clickActionLabel, action = null) - } + }, ) { Column { if (!userNewsResource.headerImageUrl.isNullOrEmpty()) { @@ -99,14 +99,14 @@ fun NewsResourceCardExpanded( } } Box( - modifier = Modifier.padding(16.dp) + modifier = Modifier.padding(16.dp), ) { Column { Spacer(modifier = Modifier.height(12.dp)) Row { NewsResourceTitle( userNewsResource.title, - modifier = Modifier.fillMaxWidth((.8f)) + modifier = Modifier.fillMaxWidth((.8f)), ) Spacer(modifier = Modifier.weight(1f)) BookmarkButton(isBookmarked, onToggleBookmark) @@ -125,7 +125,7 @@ fun NewsResourceCardExpanded( @Composable fun NewsResourceHeaderImage( - headerImageUrl: String? + headerImageUrl: String?, ) { AsyncImage( placeholder = if (LocalInspectionMode.current) { @@ -140,14 +140,14 @@ fun NewsResourceHeaderImage( contentScale = ContentScale.Crop, model = headerImageUrl, // TODO b/226661685: Investigate using alt text of image to populate content description - contentDescription = null // decorative image + contentDescription = null, // decorative image ) } @Composable fun NewsResourceTitle( newsResourceTitle: String, - modifier: Modifier = Modifier + modifier: Modifier = Modifier, ) { Text(newsResourceTitle, style = MaterialTheme.typography.headlineSmall, modifier = modifier) } @@ -156,7 +156,7 @@ fun NewsResourceTitle( fun BookmarkButton( isBookmarked: Boolean, onClick: () -> Unit, - modifier: Modifier = Modifier + modifier: Modifier = Modifier, ) { NiaIconToggleButton( checked = isBookmarked, @@ -165,15 +165,15 @@ fun BookmarkButton( icon = { Icon( painter = painterResource(NiaIcons.BookmarkBorder), - contentDescription = stringResource(R.string.bookmark) + contentDescription = stringResource(R.string.bookmark), ) }, checkedIcon = { Icon( painter = painterResource(NiaIcons.Bookmark), - contentDescription = stringResource(R.string.unbookmark) + contentDescription = stringResource(R.string.unbookmark), ) - } + }, ) } @@ -185,7 +185,7 @@ fun dateFormatted(publishDate: Instant): String { DisposableEffect(context) { val receiver = TimeZoneBroadcastReceiver( - onTimeZoneChanged = { zoneId = ZoneId.systemDefault() } + onTimeZoneChanged = { zoneId = ZoneId.systemDefault() }, ) receiver.register(context) onDispose { @@ -200,7 +200,7 @@ fun dateFormatted(publishDate: Instant): String { @Composable fun NewsResourceMetaData( publishDate: Instant, - resourceType: NewsResourceType + resourceType: NewsResourceType, ) { val formattedDate = dateFormatted(publishDate) Text( @@ -209,21 +209,21 @@ fun NewsResourceMetaData( } else { formattedDate }, - style = MaterialTheme.typography.labelSmall + style = MaterialTheme.typography.labelSmall, ) } @Composable fun NewsResourceLink( @Suppress("UNUSED_PARAMETER") - newsResource: NewsResource + newsResource: NewsResource, ) { TODO() } @Composable fun NewsResourceShortDescription( - newsResourceShortDescription: String + newsResourceShortDescription: String, ) { Text(newsResourceShortDescription, style = MaterialTheme.typography.bodyLarge) } @@ -231,7 +231,7 @@ fun NewsResourceShortDescription( @Composable fun NewsResourceTopics( topics: List, - modifier: Modifier = Modifier + modifier: Modifier = Modifier, ) { // Store the ID of the Topic which has its "following" menu expanded, if any. // To avoid UI confusion, only one topic can have an expanded menu at a time. @@ -255,21 +255,21 @@ fun NewsResourceTopics( val contentDescription = if (followableTopic.isFollowed) { stringResource( R.string.topic_chip_content_description_when_followed, - followableTopic.topic.name + followableTopic.topic.name, ) } else { stringResource( R.string.topic_chip_content_description_when_not_followed, - followableTopic.topic.name + followableTopic.topic.name, ) } Text( text = followableTopic.topic.name.uppercase(Locale.getDefault()), modifier = Modifier.semantics { this.contentDescription = contentDescription - } + }, ) - } + }, ) } } @@ -304,7 +304,7 @@ private fun ExpandedNewsResourcePreview() { userNewsResource = previewUserNewsResources[0], isBookmarked = true, onToggleBookmark = {}, - onClick = {} + onClick = {}, ) } } diff --git a/core/ui/src/main/java/com/google/samples/apps/nowinandroid/core/ui/NewsResourceCardList.kt b/core/ui/src/main/java/com/google/samples/apps/nowinandroid/core/ui/NewsResourceCardList.kt index e0bd22785c..a63bae6570 100644 --- a/core/ui/src/main/java/com/google/samples/apps/nowinandroid/core/ui/NewsResourceCardList.kt +++ b/core/ui/src/main/java/com/google/samples/apps/nowinandroid/core/ui/NewsResourceCardList.kt @@ -56,7 +56,7 @@ fun LazyListScope.userNewsResourceCardItems( else -> onItemClick(userNewsResource) } }, - modifier = itemModifier + modifier = itemModifier, ) }, ) diff --git a/core/ui/src/main/java/com/google/samples/apps/nowinandroid/core/ui/TimeZoneBroadcastReceiver.kt b/core/ui/src/main/java/com/google/samples/apps/nowinandroid/core/ui/TimeZoneBroadcastReceiver.kt index 0e3fc6d1c5..f7ae813c4e 100644 --- a/core/ui/src/main/java/com/google/samples/apps/nowinandroid/core/ui/TimeZoneBroadcastReceiver.kt +++ b/core/ui/src/main/java/com/google/samples/apps/nowinandroid/core/ui/TimeZoneBroadcastReceiver.kt @@ -22,7 +22,7 @@ import android.content.Intent import android.content.IntentFilter class TimeZoneBroadcastReceiver( - val onTimeZoneChanged: () -> Unit + val onTimeZoneChanged: () -> Unit, ) : BroadcastReceiver() { private var registered = false diff --git a/feature/bookmarks/src/androidTest/java/com/google/samples/apps/nowinandroid/feature/bookmarks/BookmarksScreenTest.kt b/feature/bookmarks/src/androidTest/java/com/google/samples/apps/nowinandroid/feature/bookmarks/BookmarksScreenTest.kt index 1f51d2bb98..08d4f6c06e 100644 --- a/feature/bookmarks/src/androidTest/java/com/google/samples/apps/nowinandroid/feature/bookmarks/BookmarksScreenTest.kt +++ b/feature/bookmarks/src/androidTest/java/com/google/samples/apps/nowinandroid/feature/bookmarks/BookmarksScreenTest.kt @@ -32,10 +32,10 @@ import androidx.compose.ui.test.performClick import androidx.compose.ui.test.performScrollToNode import com.google.samples.apps.nowinandroid.core.domain.model.previewUserNewsResources import com.google.samples.apps.nowinandroid.core.ui.NewsFeedUiState -import kotlin.test.assertEquals -import kotlin.test.assertTrue import org.junit.Rule import org.junit.Test +import kotlin.test.assertEquals +import kotlin.test.assertTrue /** * UI tests for [BookmarksScreen] composable. @@ -50,13 +50,13 @@ class BookmarksScreenTest { composeTestRule.setContent { BookmarksScreen( feedState = NewsFeedUiState.Loading, - removeFromBookmarks = { } + removeFromBookmarks = { }, ) } composeTestRule .onNodeWithContentDescription( - composeTestRule.activity.resources.getString(R.string.saved_loading) + composeTestRule.activity.resources.getString(R.string.saved_loading), ) .assertExists() } @@ -66,16 +66,16 @@ class BookmarksScreenTest { composeTestRule.setContent { BookmarksScreen( feedState = NewsFeedUiState.Success( - previewUserNewsResources.take(2) + previewUserNewsResources.take(2), ), - removeFromBookmarks = { } + removeFromBookmarks = { }, ) } composeTestRule .onNodeWithText( previewUserNewsResources[0].title, - substring = true + substring = true, ) .assertExists() .assertHasClickAction() @@ -84,14 +84,14 @@ class BookmarksScreenTest { .performScrollToNode( hasText( previewUserNewsResources[1].title, - substring = true - ) + substring = true, + ), ) composeTestRule .onNodeWithText( previewUserNewsResources[1].title, - substring = true + substring = true, ) .assertExists() .assertHasClickAction() @@ -104,27 +104,27 @@ class BookmarksScreenTest { composeTestRule.setContent { BookmarksScreen( feedState = NewsFeedUiState.Success( - previewUserNewsResources.take(2) + previewUserNewsResources.take(2), ), removeFromBookmarks = { newsResourceId -> assertEquals(previewUserNewsResources[0].id, newsResourceId) removeFromBookmarksCalled = true - } + }, ) } composeTestRule .onAllNodesWithContentDescription( composeTestRule.activity.getString( - com.google.samples.apps.nowinandroid.core.ui.R.string.unbookmark - ) + com.google.samples.apps.nowinandroid.core.ui.R.string.unbookmark, + ), ).filter( hasAnyAncestor( hasText( previewUserNewsResources[0].title, - substring = true - ) - ) + substring = true, + ), + ), ) .assertCountEquals(1) .onFirst() @@ -138,19 +138,19 @@ class BookmarksScreenTest { composeTestRule.setContent { BookmarksScreen( feedState = NewsFeedUiState.Success(emptyList()), - removeFromBookmarks = { } + removeFromBookmarks = { }, ) } composeTestRule .onNodeWithText( - composeTestRule.activity.getString(R.string.bookmarks_empty_error) + composeTestRule.activity.getString(R.string.bookmarks_empty_error), ) .assertExists() composeTestRule .onNodeWithText( - composeTestRule.activity.getString(R.string.bookmarks_empty_description) + composeTestRule.activity.getString(R.string.bookmarks_empty_description), ) .assertExists() } diff --git a/feature/bookmarks/src/main/java/com/google/samples/apps/nowinandroid/feature/bookmarks/BookmarksScreen.kt b/feature/bookmarks/src/main/java/com/google/samples/apps/nowinandroid/feature/bookmarks/BookmarksScreen.kt index 4531942bbe..6b0bca0030 100644 --- a/feature/bookmarks/src/main/java/com/google/samples/apps/nowinandroid/feature/bookmarks/BookmarksScreen.kt +++ b/feature/bookmarks/src/main/java/com/google/samples/apps/nowinandroid/feature/bookmarks/BookmarksScreen.kt @@ -65,13 +65,13 @@ import com.google.samples.apps.nowinandroid.core.ui.newsFeed @Composable internal fun BookmarksRoute( modifier: Modifier = Modifier, - viewModel: BookmarksViewModel = hiltViewModel() + viewModel: BookmarksViewModel = hiltViewModel(), ) { val feedState by viewModel.feedUiState.collectAsStateWithLifecycle() BookmarksScreen( feedState = feedState, removeFromBookmarks = viewModel::removeFromSavedResources, - modifier = modifier + modifier = modifier, ) } @@ -83,7 +83,7 @@ internal fun BookmarksRoute( internal fun BookmarksScreen( feedState: NewsFeedUiState, removeFromBookmarks: (String) -> Unit, - modifier: Modifier = Modifier + modifier: Modifier = Modifier, ) { when (feedState) { Loading -> LoadingState(modifier) @@ -110,7 +110,7 @@ private fun LoadingState(modifier: Modifier = Modifier) { private fun BookmarksGrid( feedState: NewsFeedUiState, removeFromBookmarks: (String) -> Unit, - modifier: Modifier = Modifier + modifier: Modifier = Modifier, ) { val scrollableState = rememberLazyGridState() TrackScrollJank(scrollableState = scrollableState, stateName = "bookmarks:grid") @@ -122,7 +122,7 @@ private fun BookmarksGrid( state = scrollableState, modifier = modifier .fillMaxSize() - .testTag("bookmarks:feed") + .testTag("bookmarks:feed"), ) { newsFeed( feedState = feedState, @@ -142,14 +142,14 @@ private fun EmptyState(modifier: Modifier = Modifier) { .fillMaxSize() .testTag("bookmarks:empty"), verticalArrangement = Arrangement.Center, - horizontalAlignment = Alignment.CenterHorizontally + horizontalAlignment = Alignment.CenterHorizontally, ) { val iconTint = LocalTintTheme.current.iconTint Image( modifier = Modifier.fillMaxWidth(), painter = painterResource(id = R.drawable.img_empty_bookmarks), colorFilter = if (iconTint != null) ColorFilter.tint(iconTint) else null, - contentDescription = null + contentDescription = null, ) Spacer(modifier = Modifier.height(16.dp)) @@ -159,7 +159,7 @@ private fun EmptyState(modifier: Modifier = Modifier) { modifier = Modifier.fillMaxWidth(), textAlign = TextAlign.Center, style = MaterialTheme.typography.titleMedium, - fontWeight = FontWeight.Bold + fontWeight = FontWeight.Bold, ) Spacer(modifier = Modifier.height(8.dp)) @@ -168,7 +168,7 @@ private fun EmptyState(modifier: Modifier = Modifier) { text = stringResource(id = R.string.bookmarks_empty_description), modifier = Modifier.fillMaxWidth(), textAlign = TextAlign.Center, - style = MaterialTheme.typography.bodyMedium + style = MaterialTheme.typography.bodyMedium, ) } } @@ -187,9 +187,9 @@ private fun BookmarksGridPreview() { NiaTheme { BookmarksGrid( feedState = Success( - previewUserNewsResources + previewUserNewsResources, ), - removeFromBookmarks = {} + removeFromBookmarks = {}, ) } } diff --git a/feature/bookmarks/src/main/java/com/google/samples/apps/nowinandroid/feature/bookmarks/BookmarksViewModel.kt b/feature/bookmarks/src/main/java/com/google/samples/apps/nowinandroid/feature/bookmarks/BookmarksViewModel.kt index db94839be4..fe631c2877 100644 --- a/feature/bookmarks/src/main/java/com/google/samples/apps/nowinandroid/feature/bookmarks/BookmarksViewModel.kt +++ b/feature/bookmarks/src/main/java/com/google/samples/apps/nowinandroid/feature/bookmarks/BookmarksViewModel.kt @@ -24,7 +24,6 @@ import com.google.samples.apps.nowinandroid.core.domain.model.UserNewsResource import com.google.samples.apps.nowinandroid.core.ui.NewsFeedUiState import com.google.samples.apps.nowinandroid.core.ui.NewsFeedUiState.Loading import dagger.hilt.android.lifecycle.HiltViewModel -import javax.inject.Inject import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.filterNot @@ -32,11 +31,12 @@ import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.onStart import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.launch +import javax.inject.Inject @HiltViewModel class BookmarksViewModel @Inject constructor( private val userDataRepository: UserDataRepository, - getSaveableNewsResources: GetUserNewsResourcesUseCase + getSaveableNewsResources: GetUserNewsResourcesUseCase, ) : ViewModel() { val feedUiState: StateFlow = getSaveableNewsResources() @@ -47,7 +47,7 @@ class BookmarksViewModel @Inject constructor( .stateIn( scope = viewModelScope, started = SharingStarted.WhileSubscribed(5_000), - initialValue = Loading + initialValue = Loading, ) fun removeFromSavedResources(newsResourceId: String) { diff --git a/feature/bookmarks/src/test/java/com/google/samples/apps/nowinandroid/feature/bookmarks/BookmarksViewModelTest.kt b/feature/bookmarks/src/test/java/com/google/samples/apps/nowinandroid/feature/bookmarks/BookmarksViewModelTest.kt index a8da1a4ff0..b721218d45 100644 --- a/feature/bookmarks/src/test/java/com/google/samples/apps/nowinandroid/feature/bookmarks/BookmarksViewModelTest.kt +++ b/feature/bookmarks/src/test/java/com/google/samples/apps/nowinandroid/feature/bookmarks/BookmarksViewModelTest.kt @@ -23,8 +23,6 @@ import com.google.samples.apps.nowinandroid.core.testing.repository.TestUserData import com.google.samples.apps.nowinandroid.core.testing.util.MainDispatcherRule import com.google.samples.apps.nowinandroid.core.ui.NewsFeedUiState.Loading import com.google.samples.apps.nowinandroid.core.ui.NewsFeedUiState.Success -import kotlin.test.assertEquals -import kotlin.test.assertIs import kotlinx.coroutines.flow.collect import kotlinx.coroutines.launch import kotlinx.coroutines.test.UnconfinedTestDispatcher @@ -32,6 +30,8 @@ import kotlinx.coroutines.test.runTest import org.junit.Before import org.junit.Rule import org.junit.Test +import kotlin.test.assertEquals +import kotlin.test.assertIs /** * To learn more about how this test handles Flows created with stateIn, see @@ -45,7 +45,7 @@ class BookmarksViewModelTest { private val newsRepository = TestNewsRepository() private val getUserNewsResourcesUseCase = GetUserNewsResourcesUseCase( newsRepository = newsRepository, - userDataRepository = userDataRepository + userDataRepository = userDataRepository, ) private lateinit var viewModel: BookmarksViewModel @@ -53,7 +53,7 @@ class BookmarksViewModelTest { fun setup() { viewModel = BookmarksViewModel( userDataRepository = userDataRepository, - getSaveableNewsResources = getUserNewsResourcesUseCase + getSaveableNewsResources = getUserNewsResourcesUseCase, ) } diff --git a/feature/foryou/src/androidTest/java/com/google/samples/apps/nowinandroid/feature/foryou/ForYouScreenTest.kt b/feature/foryou/src/androidTest/java/com/google/samples/apps/nowinandroid/feature/foryou/ForYouScreenTest.kt index 70f60811bf..9ff4ed8f45 100644 --- a/feature/foryou/src/androidTest/java/com/google/samples/apps/nowinandroid/feature/foryou/ForYouScreenTest.kt +++ b/feature/foryou/src/androidTest/java/com/google/samples/apps/nowinandroid/feature/foryou/ForYouScreenTest.kt @@ -41,7 +41,7 @@ class ForYouScreenTest { private val doneButtonMatcher by lazy { hasText( - composeTestRule.activity.resources.getString(R.string.done) + composeTestRule.activity.resources.getString(R.string.done), ) } @@ -55,14 +55,14 @@ class ForYouScreenTest { feedState = NewsFeedUiState.Loading, onTopicCheckedChanged = { _, _ -> }, saveFollowedTopics = {}, - onNewsResourcesCheckedChanged = { _, _ -> } + onNewsResourcesCheckedChanged = { _, _ -> }, ) } } composeTestRule .onNodeWithContentDescription( - composeTestRule.activity.resources.getString(R.string.for_you_loading) + composeTestRule.activity.resources.getString(R.string.for_you_loading), ) .assertExists() } @@ -77,14 +77,14 @@ class ForYouScreenTest { feedState = NewsFeedUiState.Success(emptyList()), onTopicCheckedChanged = { _, _ -> }, saveFollowedTopics = {}, - onNewsResourcesCheckedChanged = { _, _ -> } + onNewsResourcesCheckedChanged = { _, _ -> }, ) } } composeTestRule .onNodeWithContentDescription( - composeTestRule.activity.resources.getString(R.string.for_you_loading) + composeTestRule.activity.resources.getString(R.string.for_you_loading), ) .assertExists() } @@ -100,11 +100,11 @@ class ForYouScreenTest { topics = testTopics, ), feedState = NewsFeedUiState.Success( - feed = emptyList() + feed = emptyList(), ), onTopicCheckedChanged = { _, _ -> }, saveFollowedTopics = {}, - onNewsResourcesCheckedChanged = { _, _ -> } + onNewsResourcesCheckedChanged = { _, _ -> }, ) } } @@ -140,14 +140,14 @@ class ForYouScreenTest { // Follow one topic topics = testTopics.mapIndexed { index, testTopic -> testTopic.copy(isFollowed = index == 1) - } + }, ), feedState = NewsFeedUiState.Success( - feed = emptyList() + feed = emptyList(), ), onTopicCheckedChanged = { _, _ -> }, saveFollowedTopics = {}, - onNewsResourcesCheckedChanged = { _, _ -> } + onNewsResourcesCheckedChanged = { _, _ -> }, ) } } @@ -183,14 +183,14 @@ class ForYouScreenTest { feedState = NewsFeedUiState.Loading, onTopicCheckedChanged = { _, _ -> }, saveFollowedTopics = {}, - onNewsResourcesCheckedChanged = { _, _ -> } + onNewsResourcesCheckedChanged = { _, _ -> }, ) } } composeTestRule .onNodeWithContentDescription( - composeTestRule.activity.resources.getString(R.string.for_you_loading) + composeTestRule.activity.resources.getString(R.string.for_you_loading), ) .assertExists() } @@ -205,14 +205,14 @@ class ForYouScreenTest { feedState = NewsFeedUiState.Loading, onTopicCheckedChanged = { _, _ -> }, saveFollowedTopics = {}, - onNewsResourcesCheckedChanged = { _, _ -> } + onNewsResourcesCheckedChanged = { _, _ -> }, ) } } composeTestRule .onNodeWithContentDescription( - composeTestRule.activity.resources.getString(R.string.for_you_loading) + composeTestRule.activity.resources.getString(R.string.for_you_loading), ) .assertExists() } @@ -224,18 +224,18 @@ class ForYouScreenTest { isSyncing = false, onboardingUiState = OnboardingUiState.NotShown, feedState = NewsFeedUiState.Success( - feed = previewUserNewsResources + feed = previewUserNewsResources, ), onTopicCheckedChanged = { _, _ -> }, saveFollowedTopics = {}, - onNewsResourcesCheckedChanged = { _, _ -> } + onNewsResourcesCheckedChanged = { _, _ -> }, ) } composeTestRule .onNodeWithText( previewUserNewsResources[0].title, - substring = true + substring = true, ) .assertExists() .assertHasClickAction() @@ -244,14 +244,14 @@ class ForYouScreenTest { .performScrollToNode( hasText( previewUserNewsResources[1].title, - substring = true - ) + substring = true, + ), ) composeTestRule .onNodeWithText( previewUserNewsResources[1].title, - substring = true + substring = true, ) .assertExists() .assertHasClickAction() @@ -264,19 +264,19 @@ private val testTopic = Topic( shortDescription = "", longDescription = "", url = "", - imageUrl = "" + imageUrl = "", ) private val testTopics = listOf( FollowableTopic( topic = testTopic.copy(id = "0", name = "Headlines"), - isFollowed = false + isFollowed = false, ), FollowableTopic( topic = testTopic.copy(id = "1", name = "UI"), - isFollowed = false + isFollowed = false, ), FollowableTopic( topic = testTopic.copy(id = "2", name = "Tools"), - isFollowed = false + isFollowed = false, ), ) diff --git a/feature/foryou/src/main/java/com/google/samples/apps/nowinandroid/feature/foryou/ForYouScreen.kt b/feature/foryou/src/main/java/com/google/samples/apps/nowinandroid/feature/foryou/ForYouScreen.kt index d80bb4f01e..f13cbdb1a6 100644 --- a/feature/foryou/src/main/java/com/google/samples/apps/nowinandroid/feature/foryou/ForYouScreen.kt +++ b/feature/foryou/src/main/java/com/google/samples/apps/nowinandroid/feature/foryou/ForYouScreen.kt @@ -93,7 +93,7 @@ import com.google.samples.apps.nowinandroid.core.ui.newsFeed @Composable internal fun ForYouRoute( modifier: Modifier = Modifier, - viewModel: ForYouViewModel = hiltViewModel() + viewModel: ForYouViewModel = hiltViewModel(), ) { val onboardingUiState by viewModel.onboardingUiState.collectAsStateWithLifecycle() val feedState by viewModel.feedState.collectAsStateWithLifecycle() @@ -106,7 +106,7 @@ internal fun ForYouRoute( onTopicCheckedChanged = viewModel::updateTopicSelection, saveFollowedTopics = viewModel::dismissOnboarding, onNewsResourcesCheckedChanged = viewModel::updateNewsResourceSaved, - modifier = modifier + modifier = modifier, ) } @@ -152,7 +152,7 @@ internal fun ForYouScreen( modifier = modifier .fillMaxSize() .testTag("forYou:feed"), - state = state + state = state, ) { onboarding( onboardingUiState = onboardingUiState, @@ -163,13 +163,13 @@ internal fun ForYouScreen( interestsItemModifier = Modifier.layout { measurable, constraints -> val placeable = measurable.measure( constraints.copy( - maxWidth = constraints.maxWidth + 32.dp.roundToPx() - ) + maxWidth = constraints.maxWidth + 32.dp.roundToPx(), + ), ) layout(placeable.width, placeable.height) { placeable.place(0, 0) } - } + }, ) newsFeed( @@ -198,12 +198,12 @@ internal fun ForYouScreen( ) { val loadingContentDescription = stringResource(id = R.string.for_you_loading) Box( - modifier = Modifier.fillMaxWidth() + modifier = Modifier.fillMaxWidth(), ) { NiaOverlayLoadingWheel( modifier = Modifier .align(Alignment.Center), - contentDesc = loadingContentDescription + contentDesc = loadingContentDescription, ) } } @@ -218,12 +218,13 @@ private fun LazyGridScope.onboarding( onboardingUiState: OnboardingUiState, onTopicCheckedChanged: (String, Boolean) -> Unit, saveFollowedTopics: () -> Unit, - interestsItemModifier: Modifier = Modifier + interestsItemModifier: Modifier = Modifier, ) { when (onboardingUiState) { OnboardingUiState.Loading, OnboardingUiState.LoadFailed, - OnboardingUiState.NotShown -> Unit + OnboardingUiState.NotShown, + -> Unit is OnboardingUiState.Shown -> { item(span = { GridItemSpan(maxLineSpan) }) { @@ -234,7 +235,7 @@ private fun LazyGridScope.onboarding( modifier = Modifier .fillMaxWidth() .padding(top = 24.dp), - style = MaterialTheme.typography.titleMedium + style = MaterialTheme.typography.titleMedium, ) Text( text = stringResource(R.string.onboarding_guidance_subtitle), @@ -242,27 +243,27 @@ private fun LazyGridScope.onboarding( .fillMaxWidth() .padding(top = 8.dp, start = 16.dp, end = 16.dp), textAlign = TextAlign.Center, - style = MaterialTheme.typography.bodyMedium + style = MaterialTheme.typography.bodyMedium, ) TopicSelection( onboardingUiState, onTopicCheckedChanged, - Modifier.padding(bottom = 8.dp) + Modifier.padding(bottom = 8.dp), ) // Done button Row( horizontalArrangement = Arrangement.Center, - modifier = Modifier.fillMaxWidth() + modifier = Modifier.fillMaxWidth(), ) { NiaButton( onClick = saveFollowedTopics, enabled = onboardingUiState.isDismissable, modifier = Modifier .padding(horizontal = 40.dp) - .width(364.dp) + .width(364.dp), ) { Text( - text = stringResource(R.string.done) + text = stringResource(R.string.done), ) } } @@ -276,7 +277,7 @@ private fun LazyGridScope.onboarding( private fun TopicSelection( onboardingUiState: OnboardingUiState.Shown, onTopicCheckedChanged: (String, Boolean) -> Unit, - modifier: Modifier = Modifier + modifier: Modifier = Modifier, ) = trace("TopicSelection") { val lazyGridState = rememberLazyGridState() val topicSelectionTestTag = "forYou:topicSelection" @@ -301,7 +302,7 @@ private fun TopicSelection( // The maximum of these two bounds is therefore a valid upper bound in all cases. .heightIn(max = max(240.dp, with(LocalDensity.current) { 240.sp.toDp() })) .fillMaxWidth() - .testTag(topicSelectionTestTag) + .testTag(topicSelectionTestTag), ) { items( items = onboardingUiState.topics, @@ -312,7 +313,7 @@ private fun TopicSelection( topicId = it.topic.id, imageUrl = it.topic.imageUrl, isSelected = it.isFollowed, - onClick = onTopicCheckedChanged + onClick = onTopicCheckedChanged, ) } } @@ -325,7 +326,7 @@ private fun SingleTopicButton( topicId: String, imageUrl: String, isSelected: Boolean, - onClick: (String, Boolean) -> Unit + onClick: (String, Boolean) -> Unit, ) = trace("SingleTopicButton") { Surface( modifier = Modifier @@ -336,14 +337,14 @@ private fun SingleTopicButton( selected = isSelected, onClick = { onClick(topicId, !isSelected) - } + }, ) { Row( verticalAlignment = Alignment.CenterVertically, - modifier = Modifier.padding(start = 12.dp, end = 8.dp) + modifier = Modifier.padding(start = 12.dp, end = 8.dp), ) { TopicIcon( - imageUrl = imageUrl + imageUrl = imageUrl, ) Text( text = name, @@ -351,7 +352,7 @@ private fun SingleTopicButton( modifier = Modifier .padding(horizontal = 12.dp) .weight(1f), - color = MaterialTheme.colorScheme.onSurface + color = MaterialTheme.colorScheme.onSurface, ) NiaIconToggleButton( checked = isSelected, @@ -359,15 +360,15 @@ private fun SingleTopicButton( icon = { Icon( imageVector = NiaIcons.Add, - contentDescription = name + contentDescription = name, ) }, checkedIcon = { Icon( imageVector = NiaIcons.Check, - contentDescription = name + contentDescription = name, ) - } + }, ) } } @@ -376,7 +377,7 @@ private fun SingleTopicButton( @Composable fun TopicIcon( imageUrl: String, - modifier: Modifier = Modifier + modifier: Modifier = Modifier, ) { DynamicAsyncImage( // TODO b/228077205, show loading image visual instead of static placeholder @@ -385,7 +386,7 @@ fun TopicIcon( contentDescription = null, // decorative modifier = modifier .padding(10.dp) - .size(32.dp) + .size(32.dp), ) } @@ -398,11 +399,11 @@ fun ForYouScreenPopulatedFeed() { isSyncing = false, onboardingUiState = OnboardingUiState.NotShown, feedState = NewsFeedUiState.Success( - feed = previewUserNewsResources + feed = previewUserNewsResources, ), onTopicCheckedChanged = { _, _ -> }, saveFollowedTopics = {}, - onNewsResourcesCheckedChanged = { _, _ -> } + onNewsResourcesCheckedChanged = { _, _ -> }, ) } } @@ -417,11 +418,11 @@ fun ForYouScreenOfflinePopulatedFeed() { isSyncing = false, onboardingUiState = OnboardingUiState.NotShown, feedState = NewsFeedUiState.Success( - feed = previewUserNewsResources + feed = previewUserNewsResources, ), onTopicCheckedChanged = { _, _ -> }, saveFollowedTopics = {}, - onNewsResourcesCheckedChanged = { _, _ -> } + onNewsResourcesCheckedChanged = { _, _ -> }, ) } } @@ -438,11 +439,11 @@ fun ForYouScreenTopicSelection() { topics = previewTopics.map { FollowableTopic(it, false) }, ), feedState = NewsFeedUiState.Success( - feed = previewUserNewsResources + feed = previewUserNewsResources, ), onTopicCheckedChanged = { _, _ -> }, saveFollowedTopics = {}, - onNewsResourcesCheckedChanged = { _, _ -> } + onNewsResourcesCheckedChanged = { _, _ -> }, ) } } @@ -459,7 +460,7 @@ fun ForYouScreenLoading() { feedState = NewsFeedUiState.Loading, onTopicCheckedChanged = { _, _ -> }, saveFollowedTopics = {}, - onNewsResourcesCheckedChanged = { _, _ -> } + onNewsResourcesCheckedChanged = { _, _ -> }, ) } } @@ -474,11 +475,11 @@ fun ForYouScreenPopulatedAndLoading() { isSyncing = true, onboardingUiState = OnboardingUiState.Loading, feedState = NewsFeedUiState.Success( - feed = previewUserNewsResources + feed = previewUserNewsResources, ), onTopicCheckedChanged = { _, _ -> }, saveFollowedTopics = {}, - onNewsResourcesCheckedChanged = { _, _ -> } + onNewsResourcesCheckedChanged = { _, _ -> }, ) } } diff --git a/feature/foryou/src/main/java/com/google/samples/apps/nowinandroid/feature/foryou/ForYouViewModel.kt b/feature/foryou/src/main/java/com/google/samples/apps/nowinandroid/feature/foryou/ForYouViewModel.kt index 6c9218a758..4895f8306a 100644 --- a/feature/foryou/src/main/java/com/google/samples/apps/nowinandroid/feature/foryou/ForYouViewModel.kt +++ b/feature/foryou/src/main/java/com/google/samples/apps/nowinandroid/feature/foryou/ForYouViewModel.kt @@ -25,7 +25,6 @@ import com.google.samples.apps.nowinandroid.core.domain.GetUserNewsResourcesUseC import com.google.samples.apps.nowinandroid.core.domain.model.UserNewsResource import com.google.samples.apps.nowinandroid.core.ui.NewsFeedUiState import dagger.hilt.android.lifecycle.HiltViewModel -import javax.inject.Inject import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow @@ -36,13 +35,14 @@ import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.onStart import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.launch +import javax.inject.Inject @HiltViewModel class ForYouViewModel @Inject constructor( syncStatusMonitor: SyncStatusMonitor, private val userDataRepository: UserDataRepository, private val getSaveableNewsResources: GetUserNewsResourcesUseCase, - getFollowableTopics: GetFollowableTopicsUseCase + getFollowableTopics: GetFollowableTopicsUseCase, ) : ViewModel() { private val shouldShowOnboarding: Flow = @@ -52,7 +52,7 @@ class ForYouViewModel @Inject constructor( .stateIn( scope = viewModelScope, started = SharingStarted.WhileSubscribed(5_000), - initialValue = false + initialValue = false, ) val feedState: StateFlow = @@ -67,7 +67,7 @@ class ForYouViewModel @Inject constructor( flowOf(NewsFeedUiState.Success(emptyList())) } else { getSaveableNewsResources( - filterTopicIds = userData.followedTopics + filterTopicIds = userData.followedTopics, ).mapToFeedState() } } @@ -78,13 +78,13 @@ class ForYouViewModel @Inject constructor( .stateIn( scope = viewModelScope, started = SharingStarted.WhileSubscribed(5_000), - initialValue = NewsFeedUiState.Loading + initialValue = NewsFeedUiState.Loading, ) val onboardingUiState: StateFlow = combine( shouldShowOnboarding, - getFollowableTopics() + getFollowableTopics(), ) { shouldShowOnboarding, topics -> if (shouldShowOnboarding) { OnboardingUiState.Shown(topics = topics) @@ -95,7 +95,7 @@ class ForYouViewModel @Inject constructor( .stateIn( scope = viewModelScope, started = SharingStarted.WhileSubscribed(5_000), - initialValue = OnboardingUiState.Loading + initialValue = OnboardingUiState.Loading, ) fun updateTopicSelection(topicId: String, isChecked: Boolean) { diff --git a/feature/foryou/src/main/java/com/google/samples/apps/nowinandroid/feature/foryou/OnboardingUiState.kt b/feature/foryou/src/main/java/com/google/samples/apps/nowinandroid/feature/foryou/OnboardingUiState.kt index 73ecfed140..faf368b1e1 100644 --- a/feature/foryou/src/main/java/com/google/samples/apps/nowinandroid/feature/foryou/OnboardingUiState.kt +++ b/feature/foryou/src/main/java/com/google/samples/apps/nowinandroid/feature/foryou/OnboardingUiState.kt @@ -41,7 +41,7 @@ sealed interface OnboardingUiState { * There is a onboarding state, with the given lists of topics. */ data class Shown( - val topics: List + val topics: List, ) : OnboardingUiState { /** * True if the onboarding can be dismissed. diff --git a/feature/foryou/src/test/java/com/google/samples/apps/nowinandroid/feature/foryou/ForYouViewModelTest.kt b/feature/foryou/src/test/java/com/google/samples/apps/nowinandroid/feature/foryou/ForYouViewModelTest.kt index 4427b44fe4..1f6e010d54 100644 --- a/feature/foryou/src/test/java/com/google/samples/apps/nowinandroid/feature/foryou/ForYouViewModelTest.kt +++ b/feature/foryou/src/test/java/com/google/samples/apps/nowinandroid/feature/foryou/ForYouViewModelTest.kt @@ -32,7 +32,6 @@ import com.google.samples.apps.nowinandroid.core.testing.util.MainDispatcherRule import com.google.samples.apps.nowinandroid.core.testing.util.TestNetworkMonitor import com.google.samples.apps.nowinandroid.core.testing.util.TestSyncStatusMonitor import com.google.samples.apps.nowinandroid.core.ui.NewsFeedUiState -import kotlin.test.assertEquals import kotlinx.coroutines.flow.collect import kotlinx.coroutines.launch import kotlinx.coroutines.test.UnconfinedTestDispatcher @@ -42,6 +41,7 @@ import kotlinx.datetime.Instant import org.junit.Before import org.junit.Rule import org.junit.Test +import kotlin.test.assertEquals /** * To learn more about how this test handles Flows created with stateIn, see @@ -58,11 +58,11 @@ class ForYouViewModelTest { private val newsRepository = TestNewsRepository() private val getUserNewsResourcesUseCase = GetUserNewsResourcesUseCase( newsRepository = newsRepository, - userDataRepository = userDataRepository + userDataRepository = userDataRepository, ) private val getFollowableTopicsUseCase = GetFollowableTopicsUseCase( topicsRepository = topicsRepository, - userDataRepository = userDataRepository + userDataRepository = userDataRepository, ) private lateinit var viewModel: ForYouViewModel @@ -72,7 +72,7 @@ class ForYouViewModelTest { syncStatusMonitor = syncStatusMonitor, userDataRepository = userDataRepository, getSaveableNewsResources = getUserNewsResourcesUseCase, - getFollowableTopics = getFollowableTopicsUseCase + getFollowableTopics = getFollowableTopicsUseCase, ) } @@ -80,7 +80,7 @@ class ForYouViewModelTest { fun stateIsInitiallyLoading() = runTest { assertEquals( OnboardingUiState.Loading, - viewModel.onboardingUiState.value + viewModel.onboardingUiState.value, ) assertEquals(NewsFeedUiState.Loading, viewModel.feedState.value) } @@ -95,7 +95,7 @@ class ForYouViewModelTest { assertEquals( OnboardingUiState.Loading, - viewModel.onboardingUiState.value + viewModel.onboardingUiState.value, ) assertEquals(NewsFeedUiState.Loading, viewModel.feedState.value) @@ -112,7 +112,7 @@ class ForYouViewModelTest { assertEquals( true, - viewModel.isSyncing.value + viewModel.isSyncing.value, ) collectJob.cancel() @@ -128,7 +128,7 @@ class ForYouViewModelTest { assertEquals( OnboardingUiState.Loading, - viewModel.onboardingUiState.value + viewModel.onboardingUiState.value, ) assertEquals(NewsFeedUiState.Success(emptyList()), viewModel.feedState.value) @@ -157,7 +157,7 @@ class ForYouViewModelTest { url = "URL", imageUrl = "image URL", ), - isFollowed = false + isFollowed = false, ), FollowableTopic( topic = Topic( @@ -168,7 +168,7 @@ class ForYouViewModelTest { url = "URL", imageUrl = "image URL", ), - isFollowed = false + isFollowed = false, ), FollowableTopic( topic = Topic( @@ -179,17 +179,17 @@ class ForYouViewModelTest { url = "URL", imageUrl = "image URL", ), - isFollowed = false + isFollowed = false, ), ), ), - viewModel.onboardingUiState.value + viewModel.onboardingUiState.value, ) assertEquals( NewsFeedUiState.Success( - feed = emptyList() + feed = emptyList(), ), - viewModel.feedState.value + viewModel.feedState.value, ) collectJob1.cancel() @@ -218,7 +218,7 @@ class ForYouViewModelTest { url = "URL", imageUrl = "image URL", ), - isFollowed = false + isFollowed = false, ), FollowableTopic( topic = Topic( @@ -229,7 +229,7 @@ class ForYouViewModelTest { url = "URL", imageUrl = "image URL", ), - isFollowed = false + isFollowed = false, ), FollowableTopic( topic = Topic( @@ -240,18 +240,18 @@ class ForYouViewModelTest { url = "URL", imageUrl = "image URL", ), - isFollowed = false + isFollowed = false, ), ), ), - viewModel.onboardingUiState.value + viewModel.onboardingUiState.value, ) assertEquals( NewsFeedUiState.Success( - feed = emptyList() + feed = emptyList(), ), - viewModel.feedState.value + viewModel.feedState.value, ) collectJob1.cancel() @@ -273,7 +273,7 @@ class ForYouViewModelTest { assertEquals( OnboardingUiState.NotShown, - viewModel.onboardingUiState.value + viewModel.onboardingUiState.value, ) assertEquals(NewsFeedUiState.Loading, viewModel.feedState.value) @@ -281,13 +281,13 @@ class ForYouViewModelTest { assertEquals( OnboardingUiState.NotShown, - viewModel.onboardingUiState.value + viewModel.onboardingUiState.value, ) assertEquals( NewsFeedUiState.Success( - feed = sampleNewsResources.mapToUserNewsResources(userData) + feed = sampleNewsResources.mapToUserNewsResources(userData), ), - viewModel.feedState.value + viewModel.feedState.value, ) collectJob1.cancel() @@ -308,15 +308,15 @@ class ForYouViewModelTest { OnboardingUiState.Shown( topics = sampleTopics.map { FollowableTopic(it, false) - } + }, ), - viewModel.onboardingUiState.value + viewModel.onboardingUiState.value, ) assertEquals( NewsFeedUiState.Success( feed = emptyList(), ), - viewModel.feedState.value + viewModel.feedState.value, ) val followedTopicId = sampleTopics[1].id @@ -326,9 +326,9 @@ class ForYouViewModelTest { OnboardingUiState.Shown( topics = sampleTopics.map { FollowableTopic(it, it.id == followedTopicId) - } + }, ), - viewModel.onboardingUiState.value + viewModel.onboardingUiState.value, ) val userData = emptyUserData.copy(followedTopics = setOf(followedTopicId)) @@ -338,9 +338,9 @@ class ForYouViewModelTest { feed = listOf( UserNewsResource(sampleNewsResources[1], userData), UserNewsResource(sampleNewsResources[2], userData), - ) + ), ), - viewModel.feedState.value + viewModel.feedState.value, ) collectJob1.cancel() @@ -372,7 +372,7 @@ class ForYouViewModelTest { url = "URL", imageUrl = "image URL", ), - isFollowed = false + isFollowed = false, ), FollowableTopic( topic = Topic( @@ -383,7 +383,7 @@ class ForYouViewModelTest { url = "URL", imageUrl = "image URL", ), - isFollowed = false + isFollowed = false, ), FollowableTopic( topic = Topic( @@ -394,17 +394,17 @@ class ForYouViewModelTest { url = "URL", imageUrl = "image URL", ), - isFollowed = false - ) + isFollowed = false, + ), ), ), - viewModel.onboardingUiState.value + viewModel.onboardingUiState.value, ) assertEquals( NewsFeedUiState.Success( - feed = emptyList() + feed = emptyList(), ), - viewModel.feedState.value + viewModel.feedState.value, ) collectJob1.cancel() @@ -420,7 +420,7 @@ class ForYouViewModelTest { val followedTopicIds = setOf("1") val userData = emptyUserData.copy( followedTopics = followedTopicIds, - shouldHideOnboarding = true + shouldHideOnboarding = true, ) topicsRepository.sendTopics(sampleTopics) @@ -430,25 +430,25 @@ class ForYouViewModelTest { val bookmarkedNewsResourceId = "2" viewModel.updateNewsResourceSaved( newsResourceId = bookmarkedNewsResourceId, - isChecked = true + isChecked = true, ) val userDataExpected = userData.copy( - bookmarkedNewsResources = setOf(bookmarkedNewsResourceId) + bookmarkedNewsResources = setOf(bookmarkedNewsResourceId), ) assertEquals( OnboardingUiState.NotShown, - viewModel.onboardingUiState.value + viewModel.onboardingUiState.value, ) assertEquals( NewsFeedUiState.Success( feed = listOf( UserNewsResource(newsResource = sampleNewsResources[1], userDataExpected), - UserNewsResource(newsResource = sampleNewsResources[2], userDataExpected) - ) + UserNewsResource(newsResource = sampleNewsResources[2], userDataExpected), + ), ), - viewModel.feedState.value + viewModel.feedState.value, ) collectJob1.cancel() @@ -480,7 +480,7 @@ private val sampleTopics = listOf( longDescription = "long description", url = "URL", imageUrl = "image URL", - ) + ), ) private val sampleNewsResources = listOf( @@ -503,7 +503,7 @@ private val sampleNewsResources = listOf( longDescription = "long description", url = "URL", imageUrl = "image URL", - ) + ), ), ), NewsResource( diff --git a/feature/interests/src/androidTest/java/com/google/samples/apps/nowinandroid/interests/InterestsScreenTest.kt b/feature/interests/src/androidTest/java/com/google/samples/apps/nowinandroid/interests/InterestsScreenTest.kt index e44086c4ce..2c5ed48441 100644 --- a/feature/interests/src/androidTest/java/com/google/samples/apps/nowinandroid/interests/InterestsScreenTest.kt +++ b/feature/interests/src/androidTest/java/com/google/samples/apps/nowinandroid/interests/InterestsScreenTest.kt @@ -76,7 +76,7 @@ class InterestsScreenTest { fun interestsWithTopics_whenTopicsFollowed_showFollowedAndUnfollowedTopicsWithInfo() { composeTestRule.setContent { InterestsScreen( - uiState = InterestsUiState.Interests(topics = testTopics) + uiState = InterestsUiState.Interests(topics = testTopics), ) } @@ -115,7 +115,7 @@ class InterestsScreenTest { InterestsScreen( uiState = uiState, followTopic = { _, _ -> }, - navigateToTopic = {} + navigateToTopic = {}, ) } } @@ -138,7 +138,7 @@ private val testTopics = listOf( url = TOPIC_URL, imageUrl = TOPIC_IMAGE_URL, ), - isFollowed = true + isFollowed = true, ), FollowableTopic( Topic( @@ -149,7 +149,7 @@ private val testTopics = listOf( url = TOPIC_URL, imageUrl = TOPIC_IMAGE_URL, ), - isFollowed = false + isFollowed = false, ), FollowableTopic( Topic( @@ -160,8 +160,8 @@ private val testTopics = listOf( url = TOPIC_URL, imageUrl = TOPIC_IMAGE_URL, ), - isFollowed = false - ) + isFollowed = false, + ), ) private val numberOfUnfollowedTopics = testTopics.filter { !it.isFollowed }.size diff --git a/feature/interests/src/main/java/com/google/samples/apps/nowinandroid/feature/interests/InterestsItem.kt b/feature/interests/src/main/java/com/google/samples/apps/nowinandroid/feature/interests/InterestsItem.kt index 19ace59f6f..f8a7a8d903 100644 --- a/feature/interests/src/main/java/com/google/samples/apps/nowinandroid/feature/interests/InterestsItem.kt +++ b/feature/interests/src/main/java/com/google/samples/apps/nowinandroid/feature/interests/InterestsItem.kt @@ -51,18 +51,18 @@ fun InterestsItem( modifier: Modifier = Modifier, iconModifier: Modifier = Modifier, description: String = "", - itemSeparation: Dp = 16.dp + itemSeparation: Dp = 16.dp, ) { Row( verticalAlignment = Alignment.CenterVertically, - modifier = modifier + modifier = modifier, ) { Row( verticalAlignment = Alignment.CenterVertically, modifier = Modifier .weight(1f) .clickable { onClick() } - .padding(vertical = itemSeparation) + .padding(vertical = itemSeparation), ) { InterestsIcon(topicImageUrl, iconModifier.size(64.dp)) Spacer(modifier = Modifier.width(16.dp)) @@ -75,18 +75,18 @@ fun InterestsItem( Icon( imageVector = NiaIcons.Add, contentDescription = stringResource( - id = string.card_follow_button_content_desc - ) + id = string.card_follow_button_content_desc, + ), ) }, checkedIcon = { Icon( imageVector = NiaIcons.Check, contentDescription = stringResource( - id = string.card_unfollow_button_content_desc - ) + id = string.card_unfollow_button_content_desc, + ), ) - } + }, ) } } @@ -98,13 +98,13 @@ private fun InterestContent(name: String, description: String, modifier: Modifie text = name, style = MaterialTheme.typography.headlineSmall, modifier = Modifier.padding( - vertical = if (description.isEmpty()) 0.dp else 4.dp - ) + vertical = if (description.isEmpty()) 0.dp else 4.dp, + ), ) if (description.isNotEmpty()) { Text( text = description, - style = MaterialTheme.typography.bodyMedium + style = MaterialTheme.typography.bodyMedium, ) } } @@ -124,7 +124,7 @@ private fun InterestsIcon(topicImageUrl: String, modifier: Modifier = Modifier) DynamicAsyncImage( imageUrl = topicImageUrl, contentDescription = null, - modifier = modifier + modifier = modifier, ) } } @@ -140,7 +140,7 @@ private fun InterestsCardPreview() { following = false, topicImageUrl = "", onClick = { }, - onFollowButtonClick = { } + onFollowButtonClick = { }, ) } } @@ -157,7 +157,7 @@ private fun InterestsCardLongNamePreview() { following = true, topicImageUrl = "", onClick = { }, - onFollowButtonClick = { } + onFollowButtonClick = { }, ) } } @@ -175,7 +175,7 @@ private fun InterestsCardLongDescriptionPreview() { following = false, topicImageUrl = "", onClick = { }, - onFollowButtonClick = { } + onFollowButtonClick = { }, ) } } @@ -192,7 +192,7 @@ private fun InterestsCardWithEmptyDescriptionPreview() { following = true, topicImageUrl = "", onClick = { }, - onFollowButtonClick = { } + onFollowButtonClick = { }, ) } } diff --git a/feature/interests/src/main/java/com/google/samples/apps/nowinandroid/feature/interests/InterestsScreen.kt b/feature/interests/src/main/java/com/google/samples/apps/nowinandroid/feature/interests/InterestsScreen.kt index 8cce790c4d..4376d55d6a 100644 --- a/feature/interests/src/main/java/com/google/samples/apps/nowinandroid/feature/interests/InterestsScreen.kt +++ b/feature/interests/src/main/java/com/google/samples/apps/nowinandroid/feature/interests/InterestsScreen.kt @@ -38,7 +38,7 @@ import com.google.samples.apps.nowinandroid.core.ui.DevicePreviews internal fun InterestsRoute( navigateToTopic: (String) -> Unit, modifier: Modifier = Modifier, - viewModel: InterestsViewModel = hiltViewModel() + viewModel: InterestsViewModel = hiltViewModel(), ) { val uiState by viewModel.uiState.collectAsStateWithLifecycle() @@ -46,7 +46,7 @@ internal fun InterestsRoute( uiState = uiState, followTopic = viewModel::followTopic, navigateToTopic = navigateToTopic, - modifier = modifier + modifier = modifier, ) } @@ -59,7 +59,7 @@ internal fun InterestsScreen( ) { Column( modifier = modifier, - horizontalAlignment = Alignment.CenterHorizontally + horizontalAlignment = Alignment.CenterHorizontally, ) { when (uiState) { InterestsUiState.Loading -> @@ -91,7 +91,7 @@ fun InterestsScreenPopulated() { NiaBackground { InterestsScreen( uiState = InterestsUiState.Interests( - topics = previewTopics.map { FollowableTopic(it, false) } + topics = previewTopics.map { FollowableTopic(it, false) }, ), followTopic = { _, _ -> }, navigateToTopic = {}, diff --git a/feature/interests/src/main/java/com/google/samples/apps/nowinandroid/feature/interests/InterestsViewModel.kt b/feature/interests/src/main/java/com/google/samples/apps/nowinandroid/feature/interests/InterestsViewModel.kt index 8466a33f00..d6ef945218 100644 --- a/feature/interests/src/main/java/com/google/samples/apps/nowinandroid/feature/interests/InterestsViewModel.kt +++ b/feature/interests/src/main/java/com/google/samples/apps/nowinandroid/feature/interests/InterestsViewModel.kt @@ -23,12 +23,12 @@ import com.google.samples.apps.nowinandroid.core.domain.GetFollowableTopicsUseCa import com.google.samples.apps.nowinandroid.core.domain.TopicSortField import com.google.samples.apps.nowinandroid.core.domain.model.FollowableTopic import dagger.hilt.android.lifecycle.HiltViewModel -import javax.inject.Inject import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.launch +import javax.inject.Inject @HiltViewModel class InterestsViewModel @Inject constructor( @@ -38,11 +38,11 @@ class InterestsViewModel @Inject constructor( val uiState: StateFlow = getFollowableTopics(sortBy = TopicSortField.NAME).map( - InterestsUiState::Interests + InterestsUiState::Interests, ).stateIn( scope = viewModelScope, started = SharingStarted.WhileSubscribed(5_000), - initialValue = InterestsUiState.Loading + initialValue = InterestsUiState.Loading, ) fun followTopic(followedTopicId: String, followed: Boolean) { @@ -56,7 +56,7 @@ sealed interface InterestsUiState { object Loading : InterestsUiState data class Interests( - val topics: List + val topics: List, ) : InterestsUiState object Empty : InterestsUiState diff --git a/feature/interests/src/main/java/com/google/samples/apps/nowinandroid/feature/interests/TabContent.kt b/feature/interests/src/main/java/com/google/samples/apps/nowinandroid/feature/interests/TabContent.kt index 0cff8c82c8..dcca357951 100644 --- a/feature/interests/src/main/java/com/google/samples/apps/nowinandroid/feature/interests/TabContent.kt +++ b/feature/interests/src/main/java/com/google/samples/apps/nowinandroid/feature/interests/TabContent.kt @@ -34,13 +34,13 @@ fun TopicsTabContent( topics: List, onTopicClick: (String) -> Unit, onFollowButtonClick: (String, Boolean) -> Unit, - modifier: Modifier = Modifier + modifier: Modifier = Modifier, ) { LazyColumn( modifier = modifier .padding(horizontal = 16.dp) .testTag("interests:topics"), - contentPadding = PaddingValues(top = 8.dp) + contentPadding = PaddingValues(top = 8.dp), ) { topics.forEach { followableTopic -> val topicId = followableTopic.topic.id @@ -51,7 +51,7 @@ fun TopicsTabContent( description = followableTopic.topic.shortDescription, topicImageUrl = followableTopic.topic.imageUrl, onClick = { onTopicClick(topicId) }, - onFollowButtonClick = { onFollowButtonClick(topicId, it) } + onFollowButtonClick = { onFollowButtonClick(topicId, it) }, ) } } diff --git a/feature/interests/src/main/java/com/google/samples/apps/nowinandroid/feature/interests/navigation/InterestsNavigation.kt b/feature/interests/src/main/java/com/google/samples/apps/nowinandroid/feature/interests/navigation/InterestsNavigation.kt index 47facde82e..9a5ce76967 100644 --- a/feature/interests/src/main/java/com/google/samples/apps/nowinandroid/feature/interests/navigation/InterestsNavigation.kt +++ b/feature/interests/src/main/java/com/google/samples/apps/nowinandroid/feature/interests/navigation/InterestsNavigation.kt @@ -32,11 +32,11 @@ fun NavController.navigateToInterestsGraph(navOptions: NavOptions? = null) { fun NavGraphBuilder.interestsGraph( navigateToTopic: (String) -> Unit, - nestedGraphs: NavGraphBuilder.() -> Unit + nestedGraphs: NavGraphBuilder.() -> Unit, ) { navigation( route = interestsGraphRoutePattern, - startDestination = interestsRoute + startDestination = interestsRoute, ) { composable(route = interestsRoute) { InterestsRoute( diff --git a/feature/interests/src/test/java/com/google/samples/apps/nowinandroid/interests/InterestsViewModelTest.kt b/feature/interests/src/test/java/com/google/samples/apps/nowinandroid/interests/InterestsViewModelTest.kt index c84a8ad453..e47b250215 100644 --- a/feature/interests/src/test/java/com/google/samples/apps/nowinandroid/interests/InterestsViewModelTest.kt +++ b/feature/interests/src/test/java/com/google/samples/apps/nowinandroid/interests/InterestsViewModelTest.kt @@ -24,7 +24,6 @@ import com.google.samples.apps.nowinandroid.core.testing.repository.TestUserData import com.google.samples.apps.nowinandroid.core.testing.util.MainDispatcherRule import com.google.samples.apps.nowinandroid.feature.interests.InterestsUiState import com.google.samples.apps.nowinandroid.feature.interests.InterestsViewModel -import kotlin.test.assertEquals import kotlinx.coroutines.flow.collect import kotlinx.coroutines.launch import kotlinx.coroutines.test.UnconfinedTestDispatcher @@ -32,6 +31,7 @@ import kotlinx.coroutines.test.runTest import org.junit.Before import org.junit.Rule import org.junit.Test +import kotlin.test.assertEquals /** * To learn more about how this test handles Flows created with stateIn, see @@ -46,7 +46,7 @@ class InterestsViewModelTest { private val topicsRepository = TestTopicsRepository() private val getFollowableTopicsUseCase = GetFollowableTopicsUseCase( topicsRepository = topicsRepository, - userDataRepository = userDataRepository + userDataRepository = userDataRepository, ) private lateinit var viewModel: InterestsViewModel @@ -84,17 +84,17 @@ class InterestsViewModelTest { assertEquals( false, (viewModel.uiState.value as InterestsUiState.Interests) - .topics.first { it.topic.id == toggleTopicId }.isFollowed + .topics.first { it.topic.id == toggleTopicId }.isFollowed, ) viewModel.followTopic( followedTopicId = toggleTopicId, - true + true, ) assertEquals( InterestsUiState.Interests(topics = testOutputTopics), - viewModel.uiState.value + viewModel.uiState.value, ) collectJob.cancel() @@ -108,23 +108,23 @@ class InterestsViewModelTest { topicsRepository.sendTopics(testOutputTopics.map { it.topic }) userDataRepository.setFollowedTopicIds( - setOf(testOutputTopics[0].topic.id, testOutputTopics[1].topic.id) + setOf(testOutputTopics[0].topic.id, testOutputTopics[1].topic.id), ) assertEquals( true, (viewModel.uiState.value as InterestsUiState.Interests) - .topics.first { it.topic.id == toggleTopicId }.isFollowed + .topics.first { it.topic.id == toggleTopicId }.isFollowed, ) viewModel.followTopic( followedTopicId = toggleTopicId, - false + false, ) assertEquals( InterestsUiState.Interests(topics = testInputTopics), - viewModel.uiState.value + viewModel.uiState.value, ) collectJob.cancel() @@ -149,7 +149,7 @@ private val testInputTopics = listOf( url = TOPIC_URL, imageUrl = TOPIC_IMAGE_URL, ), - isFollowed = true + isFollowed = true, ), FollowableTopic( Topic( @@ -160,7 +160,7 @@ private val testInputTopics = listOf( url = TOPIC_URL, imageUrl = TOPIC_IMAGE_URL, ), - isFollowed = false + isFollowed = false, ), FollowableTopic( Topic( @@ -171,8 +171,8 @@ private val testInputTopics = listOf( url = TOPIC_URL, imageUrl = TOPIC_IMAGE_URL, ), - isFollowed = false - ) + isFollowed = false, + ), ) private val testOutputTopics = listOf( @@ -185,7 +185,7 @@ private val testOutputTopics = listOf( url = TOPIC_URL, imageUrl = TOPIC_IMAGE_URL, ), - isFollowed = true + isFollowed = true, ), FollowableTopic( Topic( @@ -196,7 +196,7 @@ private val testOutputTopics = listOf( url = TOPIC_URL, imageUrl = TOPIC_IMAGE_URL, ), - isFollowed = true + isFollowed = true, ), FollowableTopic( Topic( @@ -207,6 +207,6 @@ private val testOutputTopics = listOf( url = TOPIC_URL, imageUrl = TOPIC_IMAGE_URL, ), - isFollowed = false - ) + isFollowed = false, + ), ) diff --git a/feature/settings/src/androidTest/java/com/google/samples/apps/nowinandroid/feature/settings/SettingsDialogTest.kt b/feature/settings/src/androidTest/java/com/google/samples/apps/nowinandroid/feature/settings/SettingsDialogTest.kt index 4643362ffc..febc606b09 100644 --- a/feature/settings/src/androidTest/java/com/google/samples/apps/nowinandroid/feature/settings/SettingsDialogTest.kt +++ b/feature/settings/src/androidTest/java/com/google/samples/apps/nowinandroid/feature/settings/SettingsDialogTest.kt @@ -37,14 +37,13 @@ class SettingsDialogTest { @Test fun whenLoading_showsLoadingText() { - composeTestRule.setContent { SettingsDialog( settingsUiState = Loading, onDismiss = {}, onChangeDynamicColorPreference = {}, onChangeThemeBrand = {}, - onChangeDarkThemeConfig = {} + onChangeDarkThemeConfig = {}, ) } @@ -61,13 +60,13 @@ class SettingsDialogTest { UserEditableSettings( brand = ANDROID, useDynamicColor = false, - darkThemeConfig = DARK - ) + darkThemeConfig = DARK, + ), ), onDismiss = { }, onChangeDynamicColorPreference = {}, onChangeThemeBrand = {}, - onChangeDarkThemeConfig = {} + onChangeDarkThemeConfig = {}, ) } @@ -75,7 +74,7 @@ class SettingsDialogTest { composeTestRule.onNodeWithText(getString(R.string.brand_default)).assertExists() composeTestRule.onNodeWithText(getString(R.string.brand_android)).assertExists() composeTestRule.onNodeWithText( - getString(R.string.dark_mode_config_system_default) + getString(R.string.dark_mode_config_system_default), ).assertExists() composeTestRule.onNodeWithText(getString(R.string.dark_mode_config_light)).assertExists() composeTestRule.onNodeWithText(getString(R.string.dark_mode_config_dark)).assertExists() @@ -94,13 +93,13 @@ class SettingsDialogTest { brand = DEFAULT, darkThemeConfig = DARK, useDynamicColor = false, - ) + ), ), supportDynamicColor = true, onDismiss = {}, onChangeDynamicColorPreference = {}, onChangeThemeBrand = {}, - onChangeDarkThemeConfig = {} + onChangeDarkThemeConfig = {}, ) } @@ -121,12 +120,12 @@ class SettingsDialogTest { brand = ANDROID, darkThemeConfig = DARK, useDynamicColor = false, - ) + ), ), onDismiss = {}, onChangeDynamicColorPreference = {}, onChangeThemeBrand = {}, - onChangeDarkThemeConfig = {} + onChangeDarkThemeConfig = {}, ) } @@ -145,12 +144,12 @@ class SettingsDialogTest { brand = ANDROID, darkThemeConfig = DARK, useDynamicColor = false, - ) + ), ), onDismiss = {}, onChangeDynamicColorPreference = {}, onChangeThemeBrand = {}, - onChangeDarkThemeConfig = {} + onChangeDarkThemeConfig = {}, ) } @@ -169,12 +168,12 @@ class SettingsDialogTest { brand = ANDROID, darkThemeConfig = DARK, useDynamicColor = false, - ) + ), ), onDismiss = {}, onChangeDynamicColorPreference = {}, onChangeThemeBrand = {}, - onChangeDarkThemeConfig = {} + onChangeDarkThemeConfig = {}, ) } diff --git a/feature/settings/src/main/java/com/google/samples/apps/nowinandroid/feature/settings/SettingsDialog.kt b/feature/settings/src/main/java/com/google/samples/apps/nowinandroid/feature/settings/SettingsDialog.kt index a824c1db38..bed230d0d9 100644 --- a/feature/settings/src/main/java/com/google/samples/apps/nowinandroid/feature/settings/SettingsDialog.kt +++ b/feature/settings/src/main/java/com/google/samples/apps/nowinandroid/feature/settings/SettingsDialog.kt @@ -69,7 +69,7 @@ import com.google.samples.apps.nowinandroid.feature.settings.SettingsUiState.Suc @Composable fun SettingsDialog( onDismiss: () -> Unit, - viewModel: SettingsViewModel = hiltViewModel() + viewModel: SettingsViewModel = hiltViewModel(), ) { val settingsUiState by viewModel.settingsUiState.collectAsStateWithLifecycle() SettingsDialog( @@ -89,7 +89,7 @@ fun SettingsDialog( onDismiss: () -> Unit, onChangeThemeBrand: (themeBrand: ThemeBrand) -> Unit, onChangeDynamicColorPreference: (useDynamicColor: Boolean) -> Unit, - onChangeDarkThemeConfig: (darkThemeConfig: DarkThemeConfig) -> Unit + onChangeDarkThemeConfig: (darkThemeConfig: DarkThemeConfig) -> Unit, ) { val configuration = LocalConfiguration.current @@ -107,7 +107,7 @@ fun SettingsDialog( title = { Text( text = stringResource(string.settings_title), - style = MaterialTheme.typography.titleLarge + style = MaterialTheme.typography.titleLarge, ) }, text = { @@ -117,7 +117,7 @@ fun SettingsDialog( Loading -> { Text( text = stringResource(string.loading), - modifier = Modifier.padding(vertical = 16.dp) + modifier = Modifier.padding(vertical = 16.dp), ) } @@ -127,7 +127,7 @@ fun SettingsDialog( supportDynamicColor = supportDynamicColor, onChangeThemeBrand = onChangeThemeBrand, onChangeDynamicColorPreference = onChangeDynamicColorPreference, - onChangeDarkThemeConfig = onChangeDarkThemeConfig + onChangeDarkThemeConfig = onChangeDarkThemeConfig, ) } } @@ -142,9 +142,9 @@ fun SettingsDialog( color = MaterialTheme.colorScheme.primary, modifier = Modifier .padding(horizontal = 8.dp) - .clickable { onDismiss() } + .clickable { onDismiss() }, ) - } + }, ) } @@ -154,19 +154,19 @@ private fun SettingsPanel( supportDynamicColor: Boolean, onChangeThemeBrand: (themeBrand: ThemeBrand) -> Unit, onChangeDynamicColorPreference: (useDynamicColor: Boolean) -> Unit, - onChangeDarkThemeConfig: (darkThemeConfig: DarkThemeConfig) -> Unit + onChangeDarkThemeConfig: (darkThemeConfig: DarkThemeConfig) -> Unit, ) { SettingsDialogSectionTitle(text = stringResource(string.theme)) Column(Modifier.selectableGroup()) { SettingsDialogThemeChooserRow( text = stringResource(string.brand_default), selected = settings.brand == DEFAULT, - onClick = { onChangeThemeBrand(DEFAULT) } + onClick = { onChangeThemeBrand(DEFAULT) }, ) SettingsDialogThemeChooserRow( text = stringResource(string.brand_android), selected = settings.brand == ANDROID, - onClick = { onChangeThemeBrand(ANDROID) } + onClick = { onChangeThemeBrand(ANDROID) }, ) } if (settings.brand == DEFAULT && supportDynamicColor) { @@ -175,12 +175,12 @@ private fun SettingsPanel( SettingsDialogThemeChooserRow( text = stringResource(string.dynamic_color_yes), selected = settings.useDynamicColor, - onClick = { onChangeDynamicColorPreference(true) } + onClick = { onChangeDynamicColorPreference(true) }, ) SettingsDialogThemeChooserRow( text = stringResource(string.dynamic_color_no), selected = !settings.useDynamicColor, - onClick = { onChangeDynamicColorPreference(false) } + onClick = { onChangeDynamicColorPreference(false) }, ) } } @@ -189,17 +189,17 @@ private fun SettingsPanel( SettingsDialogThemeChooserRow( text = stringResource(string.dark_mode_config_system_default), selected = settings.darkThemeConfig == FOLLOW_SYSTEM, - onClick = { onChangeDarkThemeConfig(FOLLOW_SYSTEM) } + onClick = { onChangeDarkThemeConfig(FOLLOW_SYSTEM) }, ) SettingsDialogThemeChooserRow( text = stringResource(string.dark_mode_config_light), selected = settings.darkThemeConfig == LIGHT, - onClick = { onChangeDarkThemeConfig(LIGHT) } + onClick = { onChangeDarkThemeConfig(LIGHT) }, ) SettingsDialogThemeChooserRow( text = stringResource(string.dark_mode_config_dark), selected = settings.darkThemeConfig == DARK, - onClick = { onChangeDarkThemeConfig(DARK) } + onClick = { onChangeDarkThemeConfig(DARK) }, ) } } @@ -209,7 +209,7 @@ private fun SettingsDialogSectionTitle(text: String) { Text( text = text, style = MaterialTheme.typography.titleMedium, - modifier = Modifier.padding(top = 16.dp, bottom = 8.dp) + modifier = Modifier.padding(top = 16.dp, bottom = 8.dp), ) } @@ -217,7 +217,7 @@ private fun SettingsDialogSectionTitle(text: String) { fun SettingsDialogThemeChooserRow( text: String, selected: Boolean, - onClick: () -> Unit + onClick: () -> Unit, ) { Row( Modifier @@ -228,11 +228,11 @@ fun SettingsDialogThemeChooserRow( onClick = onClick, ) .padding(8.dp), - verticalAlignment = Alignment.CenterVertically + verticalAlignment = Alignment.CenterVertically, ) { RadioButton( selected = selected, - onClick = null + onClick = null, ) Spacer(Modifier.width(8.dp)) Text(text) @@ -242,7 +242,7 @@ fun SettingsDialogThemeChooserRow( @Composable private fun LinksPanel() { Row( - modifier = Modifier.padding(top = 16.dp) + modifier = Modifier.padding(top = 16.dp), ) { Column( Modifier.fillMaxWidth(), @@ -251,24 +251,24 @@ private fun LinksPanel() { Row { TextLink( text = stringResource(string.privacy_policy), - url = PRIVACY_POLICY_URL + url = PRIVACY_POLICY_URL, ) Spacer(Modifier.width(16.dp)) TextLink( text = stringResource(string.licenses), - url = LICENSES_URL + url = LICENSES_URL, ) } Spacer(Modifier.height(16.dp)) Row { TextLink( text = stringResource(string.brand_guidelines), - url = BRAND_GUIDELINES_URL + url = BRAND_GUIDELINES_URL, ) Spacer(Modifier.width(16.dp)) TextLink( text = stringResource(string.feedback), - url = FEEDBACK_URL + url = FEEDBACK_URL, ) } } @@ -277,7 +277,6 @@ private fun LinksPanel() { @Composable private fun TextLink(text: String, url: String) { - val launchResourceIntent = Intent(Intent.ACTION_VIEW, Uri.parse(url)) val context = LocalContext.current @@ -288,7 +287,7 @@ private fun TextLink(text: String, url: String) { modifier = Modifier .clickable { ContextCompat.startActivity(context, launchResourceIntent, null) - } + }, ) } @@ -302,12 +301,12 @@ private fun PreviewSettingsDialog() { UserEditableSettings( brand = DEFAULT, darkThemeConfig = FOLLOW_SYSTEM, - useDynamicColor = false - ) + useDynamicColor = false, + ), ), onChangeThemeBrand = {}, onChangeDynamicColorPreference = {}, - onChangeDarkThemeConfig = {} + onChangeDarkThemeConfig = {}, ) } } @@ -321,7 +320,7 @@ private fun PreviewSettingsDialogLoading() { settingsUiState = Loading, onChangeThemeBrand = {}, onChangeDynamicColorPreference = {}, - onChangeDarkThemeConfig = {} + onChangeDarkThemeConfig = {}, ) } } diff --git a/feature/settings/src/main/java/com/google/samples/apps/nowinandroid/feature/settings/SettingsViewModel.kt b/feature/settings/src/main/java/com/google/samples/apps/nowinandroid/feature/settings/SettingsViewModel.kt index c1eac1eeee..33bf58a2cd 100644 --- a/feature/settings/src/main/java/com/google/samples/apps/nowinandroid/feature/settings/SettingsViewModel.kt +++ b/feature/settings/src/main/java/com/google/samples/apps/nowinandroid/feature/settings/SettingsViewModel.kt @@ -24,12 +24,12 @@ import com.google.samples.apps.nowinandroid.core.model.data.ThemeBrand import com.google.samples.apps.nowinandroid.feature.settings.SettingsUiState.Loading import com.google.samples.apps.nowinandroid.feature.settings.SettingsUiState.Success import dagger.hilt.android.lifecycle.HiltViewModel -import javax.inject.Inject import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.launch +import javax.inject.Inject @HiltViewModel class SettingsViewModel @Inject constructor( @@ -42,8 +42,8 @@ class SettingsViewModel @Inject constructor( settings = UserEditableSettings( brand = userData.themeBrand, useDynamicColor = userData.useDynamicColor, - darkThemeConfig = userData.darkThemeConfig - ) + darkThemeConfig = userData.darkThemeConfig, + ), ) } .stateIn( @@ -55,7 +55,7 @@ class SettingsViewModel @Inject constructor( // scrollable column. // TODO: Change to SharingStarted.WhileSubscribed(5_000) when b/221643630 is fixed started = SharingStarted.Eagerly, - initialValue = Loading + initialValue = Loading, ) fun updateThemeBrand(themeBrand: ThemeBrand) { @@ -83,7 +83,7 @@ class SettingsViewModel @Inject constructor( data class UserEditableSettings( val brand: ThemeBrand, val useDynamicColor: Boolean, - val darkThemeConfig: DarkThemeConfig + val darkThemeConfig: DarkThemeConfig, ) sealed interface SettingsUiState { diff --git a/feature/settings/src/test/java/com/google/samples/apps/nowinandroid/feature/settings/SettingsViewModelTest.kt b/feature/settings/src/test/java/com/google/samples/apps/nowinandroid/feature/settings/SettingsViewModelTest.kt index 0377490b31..9062abee65 100644 --- a/feature/settings/src/test/java/com/google/samples/apps/nowinandroid/feature/settings/SettingsViewModelTest.kt +++ b/feature/settings/src/test/java/com/google/samples/apps/nowinandroid/feature/settings/SettingsViewModelTest.kt @@ -22,7 +22,6 @@ import com.google.samples.apps.nowinandroid.core.testing.repository.TestUserData import com.google.samples.apps.nowinandroid.core.testing.util.MainDispatcherRule import com.google.samples.apps.nowinandroid.feature.settings.SettingsUiState.Loading import com.google.samples.apps.nowinandroid.feature.settings.SettingsUiState.Success -import kotlin.test.assertEquals import kotlinx.coroutines.flow.collect import kotlinx.coroutines.launch import kotlinx.coroutines.test.UnconfinedTestDispatcher @@ -30,6 +29,7 @@ import kotlinx.coroutines.test.runTest import org.junit.Before import org.junit.Rule import org.junit.Test +import kotlin.test.assertEquals class SettingsViewModelTest { @@ -52,7 +52,6 @@ class SettingsViewModelTest { @Test fun stateIsSuccessAfterUserDataLoaded() = runTest { - val collectJob = launch(UnconfinedTestDispatcher()) { viewModel.settingsUiState.collect() } @@ -64,10 +63,10 @@ class SettingsViewModelTest { UserEditableSettings( brand = ANDROID, darkThemeConfig = DARK, - useDynamicColor = false - ) + useDynamicColor = false, + ), ), - viewModel.settingsUiState.value + viewModel.settingsUiState.value, ) collectJob.cancel() diff --git a/feature/topic/src/androidTest/java/com/google/samples/apps/nowinandroid/feature/topic/TopicScreenTest.kt b/feature/topic/src/androidTest/java/com/google/samples/apps/nowinandroid/feature/topic/TopicScreenTest.kt index df9e83315c..9f984c4a3d 100644 --- a/feature/topic/src/androidTest/java/com/google/samples/apps/nowinandroid/feature/topic/TopicScreenTest.kt +++ b/feature/topic/src/androidTest/java/com/google/samples/apps/nowinandroid/feature/topic/TopicScreenTest.kt @@ -120,7 +120,7 @@ class TopicScreenTest { TopicScreen( topicUiState = TopicUiState.Success(testTopic), newsUiState = NewsUiState.Success( - sampleUserNewsResources + sampleUserNewsResources, ), onBackClick = { }, onFollowClick = { }, @@ -149,9 +149,9 @@ private val testTopics = listOf( shortDescription = "", longDescription = TOPIC_DESC, url = "", - imageUrl = "" + imageUrl = "", ), - isFollowed = true + isFollowed = true, ), FollowableTopic( Topic( @@ -160,9 +160,9 @@ private val testTopics = listOf( shortDescription = "", longDescription = TOPIC_DESC, url = "", - imageUrl = "" + imageUrl = "", ), - isFollowed = false + isFollowed = false, ), FollowableTopic( Topic( @@ -171,10 +171,10 @@ private val testTopics = listOf( shortDescription = "", longDescription = TOPIC_DESC, url = "", - imageUrl = "" + imageUrl = "", ), - isFollowed = false - ) + isFollowed = false, + ), ) private val sampleUserNewsResources = listOf( @@ -198,10 +198,10 @@ private val sampleUserNewsResources = listOf( shortDescription = "", longDescription = TOPIC_DESC, url = "", - imageUrl = "" - ) - ) + imageUrl = "", + ), + ), ), - userData = emptyUserData.copy(bookmarkedNewsResources = setOf("1")) - ) + userData = emptyUserData.copy(bookmarkedNewsResources = setOf("1")), + ), ) diff --git a/feature/topic/src/main/java/com/google/samples/apps/nowinandroid/feature/topic/TopicScreen.kt b/feature/topic/src/main/java/com/google/samples/apps/nowinandroid/feature/topic/TopicScreen.kt index 2200fc0351..b4d31084b1 100644 --- a/feature/topic/src/main/java/com/google/samples/apps/nowinandroid/feature/topic/TopicScreen.kt +++ b/feature/topic/src/main/java/com/google/samples/apps/nowinandroid/feature/topic/TopicScreen.kt @@ -95,7 +95,7 @@ internal fun TopicScreen( LazyColumn( state = state, modifier = modifier, - horizontalAlignment = Alignment.CenterHorizontally + horizontalAlignment = Alignment.CenterHorizontally, ) { item { Spacer(Modifier.windowInsetsTopHeight(WindowInsets.safeDrawing)) @@ -122,7 +122,7 @@ internal fun TopicScreen( description = topicUiState.followableTopic.topic.longDescription, news = newsUiState, imageUrl = topicUiState.followableTopic.topic.imageUrl, - onBookmarkChanged = onBookmarkChanged + onBookmarkChanged = onBookmarkChanged, ) } } @@ -137,7 +137,7 @@ private fun LazyListScope.TopicBody( description: String, news: NewsUiState, imageUrl: String, - onBookmarkChanged: (String, Boolean) -> Unit + onBookmarkChanged: (String, Boolean) -> Unit, ) { // TODO: Show icon if available item { @@ -150,7 +150,7 @@ private fun LazyListScope.TopicBody( @Composable private fun TopicHeader(name: String, description: String, imageUrl: String) { Column( - modifier = Modifier.padding(horizontal = 24.dp) + modifier = Modifier.padding(horizontal = 24.dp), ) { DynamicAsyncImage( imageUrl = imageUrl, @@ -158,14 +158,14 @@ private fun TopicHeader(name: String, description: String, imageUrl: String) { modifier = Modifier .align(Alignment.CenterHorizontally) .size(216.dp) - .padding(bottom = 12.dp) + .padding(bottom = 12.dp), ) Text(name, style = MaterialTheme.typography.displayMedium) if (description.isNotEmpty()) { Text( description, modifier = Modifier.padding(top = 24.dp), - style = MaterialTheme.typography.bodyLarge + style = MaterialTheme.typography.bodyLarge, ) } } @@ -174,14 +174,14 @@ private fun TopicHeader(name: String, description: String, imageUrl: String) { // TODO: Could/should this be replaced with [LazyGridScope.newsFeed]? private fun LazyListScope.userNewsResourceCards( news: NewsUiState, - onBookmarkChanged: (String, Boolean) -> Unit + onBookmarkChanged: (String, Boolean) -> Unit, ) { when (news) { is NewsUiState.Success -> { userNewsResourceCardItems( items = news.news, onToggleBookmark = { onBookmarkChanged(it.id, !it.isSaved) }, - itemModifier = Modifier.padding(24.dp) + itemModifier = Modifier.padding(24.dp), ) } @@ -201,8 +201,11 @@ private fun TopicBodyPreview() { NiaTheme { LazyColumn { TopicBody( - "Jetpack Compose", "Lorem ipsum maximum", - NewsUiState.Success(emptyList()), "", { _, _ -> } + "Jetpack Compose", + "Lorem ipsum maximum", + NewsUiState.Success(emptyList()), + "", + { _, _ -> }, ) } } @@ -220,21 +223,21 @@ private fun TopicToolbar( verticalAlignment = Alignment.CenterVertically, modifier = modifier .fillMaxWidth() - .padding(bottom = 32.dp) + .padding(bottom = 32.dp), ) { IconButton(onClick = { onBackClick() }) { Icon( imageVector = NiaIcons.ArrowBack, contentDescription = stringResource( - id = com.google.samples.apps.nowinandroid.core.ui.R.string.back - ) + id = com.google.samples.apps.nowinandroid.core.ui.R.string.back, + ), ) } val selected = uiState.isFollowed NiaFilterChip( selected = selected, onSelectedChange = onFollowClick, - modifier = Modifier.padding(end = 24.dp) + modifier = Modifier.padding(end = 24.dp), ) { if (selected) { Text("FOLLOWING") @@ -253,7 +256,7 @@ fun TopicScreenPopulated() { TopicScreen( topicUiState = TopicUiState.Success(FollowableTopic(previewTopics[0], false)), newsUiState = NewsUiState.Success( - previewUserNewsResources + previewUserNewsResources, ), onBackClick = {}, onFollowClick = {}, diff --git a/feature/topic/src/main/java/com/google/samples/apps/nowinandroid/feature/topic/TopicViewModel.kt b/feature/topic/src/main/java/com/google/samples/apps/nowinandroid/feature/topic/TopicViewModel.kt index 260cecbd13..c0c6bbafdf 100644 --- a/feature/topic/src/main/java/com/google/samples/apps/nowinandroid/feature/topic/TopicViewModel.kt +++ b/feature/topic/src/main/java/com/google/samples/apps/nowinandroid/feature/topic/TopicViewModel.kt @@ -30,7 +30,6 @@ import com.google.samples.apps.nowinandroid.core.result.Result import com.google.samples.apps.nowinandroid.core.result.asResult import com.google.samples.apps.nowinandroid.feature.topic.navigation.TopicArgs import dagger.hilt.android.lifecycle.HiltViewModel -import javax.inject.Inject import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow @@ -38,6 +37,7 @@ import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.launch +import javax.inject.Inject @HiltViewModel class TopicViewModel @Inject constructor( @@ -45,7 +45,7 @@ class TopicViewModel @Inject constructor( stringDecoder: StringDecoder, private val userDataRepository: UserDataRepository, topicsRepository: TopicsRepository, - getSaveableNewsResources: GetUserNewsResourcesUseCase + getSaveableNewsResources: GetUserNewsResourcesUseCase, ) : ViewModel() { private val topicArgs: TopicArgs = TopicArgs(savedStateHandle, stringDecoder) @@ -53,23 +53,23 @@ class TopicViewModel @Inject constructor( val topicUiState: StateFlow = topicUiState( topicId = topicArgs.topicId, userDataRepository = userDataRepository, - topicsRepository = topicsRepository + topicsRepository = topicsRepository, ) .stateIn( scope = viewModelScope, started = SharingStarted.WhileSubscribed(5_000), - initialValue = TopicUiState.Loading + initialValue = TopicUiState.Loading, ) val newUiState: StateFlow = newsUiState( topicId = topicArgs.topicId, userDataRepository = userDataRepository, - getSaveableNewsResources = getSaveableNewsResources + getSaveableNewsResources = getSaveableNewsResources, ) .stateIn( scope = viewModelScope, started = SharingStarted.WhileSubscribed(5_000), - initialValue = NewsUiState.Loading + initialValue = NewsUiState.Loading, ) fun followTopicToggle(followed: Boolean) { @@ -97,13 +97,13 @@ private fun topicUiState( // Observe topic information val topicStream: Flow = topicsRepository.getTopic( - id = topicId + id = topicId, ) return combine( followedTopicIds, topicStream, - ::Pair + ::Pair, ) .asResult() .map { followedTopicToTopicResult -> @@ -114,8 +114,8 @@ private fun topicUiState( TopicUiState.Success( followableTopic = FollowableTopic( topic = topic, - isFollowed = followed - ) + isFollowed = followed, + ), ) } is Result.Loading -> { @@ -145,7 +145,7 @@ private fun newsUiState( return combine( newsStream, bookmark, - ::Pair + ::Pair, ) .asResult() .map { newsToBookmarksResult -> diff --git a/feature/topic/src/main/java/com/google/samples/apps/nowinandroid/feature/topic/navigation/TopicNavigation.kt b/feature/topic/src/main/java/com/google/samples/apps/nowinandroid/feature/topic/navigation/TopicNavigation.kt index 808143275a..1cc43bbd13 100644 --- a/feature/topic/src/main/java/com/google/samples/apps/nowinandroid/feature/topic/navigation/TopicNavigation.kt +++ b/feature/topic/src/main/java/com/google/samples/apps/nowinandroid/feature/topic/navigation/TopicNavigation.kt @@ -41,13 +41,13 @@ fun NavController.navigateToTopic(topicId: String) { } fun NavGraphBuilder.topicScreen( - onBackClick: () -> Unit + onBackClick: () -> Unit, ) { composable( route = "topic_route/{$topicIdArg}", arguments = listOf( - navArgument(topicIdArg) { type = NavType.StringType } - ) + navArgument(topicIdArg) { type = NavType.StringType }, + ), ) { TopicRoute(onBackClick = onBackClick) } diff --git a/feature/topic/src/test/java/com/google/samples/apps/nowinandroid/feature/topic/TopicViewModelTest.kt b/feature/topic/src/test/java/com/google/samples/apps/nowinandroid/feature/topic/TopicViewModelTest.kt index 6c61e59d52..a8f1b0a88e 100644 --- a/feature/topic/src/test/java/com/google/samples/apps/nowinandroid/feature/topic/TopicViewModelTest.kt +++ b/feature/topic/src/test/java/com/google/samples/apps/nowinandroid/feature/topic/TopicViewModelTest.kt @@ -28,8 +28,6 @@ import com.google.samples.apps.nowinandroid.core.testing.repository.TestTopicsRe import com.google.samples.apps.nowinandroid.core.testing.repository.TestUserDataRepository import com.google.samples.apps.nowinandroid.core.testing.util.MainDispatcherRule import com.google.samples.apps.nowinandroid.feature.topic.navigation.topicIdArg -import kotlin.test.assertEquals -import kotlin.test.assertIs import kotlinx.coroutines.flow.collect import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.first @@ -40,6 +38,8 @@ import kotlinx.datetime.Instant import org.junit.Before import org.junit.Rule import org.junit.Test +import kotlin.test.assertEquals +import kotlin.test.assertIs /** * To learn more about how this test handles Flows created with stateIn, see @@ -55,7 +55,7 @@ class TopicViewModelTest { private val newsRepository = TestNewsRepository() private val getUserNewsResourcesUseCase = GetUserNewsResourcesUseCase( newsRepository = newsRepository, - userDataRepository = userDataRepository + userDataRepository = userDataRepository, ) private lateinit var viewModel: TopicViewModel @@ -66,7 +66,7 @@ class TopicViewModelTest { stringDecoder = FakeStringDecoder(), userDataRepository = userDataRepository, topicsRepository = topicsRepository, - getSaveableNewsResources = getUserNewsResourcesUseCase + getSaveableNewsResources = getUserNewsResourcesUseCase, ) } @@ -80,7 +80,7 @@ class TopicViewModelTest { assertIs(item) val topicFromRepository = topicsRepository.getTopic( - testInputTopics[0].topic.id + testInputTopics[0].topic.id, ).first() assertEquals(topicFromRepository, item.followableTopic.topic) @@ -131,7 +131,7 @@ class TopicViewModelTest { combine( viewModel.topicUiState, viewModel.newUiState, - ::Pair + ::Pair, ).collect() } topicsRepository.sendTopics(testInputTopics.map { it.topic }) @@ -158,7 +158,7 @@ class TopicViewModelTest { assertEquals( TopicUiState.Success(followableTopic = testOutputTopics[0]), - viewModel.topicUiState.value + viewModel.topicUiState.value, ) collectJob.cancel() @@ -183,7 +183,7 @@ private val testInputTopics = listOf( url = TOPIC_URL, imageUrl = TOPIC_IMAGE_URL, ), - isFollowed = true + isFollowed = true, ), FollowableTopic( Topic( @@ -194,7 +194,7 @@ private val testInputTopics = listOf( url = TOPIC_URL, imageUrl = TOPIC_IMAGE_URL, ), - isFollowed = false + isFollowed = false, ), FollowableTopic( Topic( @@ -205,8 +205,8 @@ private val testInputTopics = listOf( url = TOPIC_URL, imageUrl = TOPIC_IMAGE_URL, ), - isFollowed = false - ) + isFollowed = false, + ), ) private val testOutputTopics = listOf( @@ -219,7 +219,7 @@ private val testOutputTopics = listOf( url = TOPIC_URL, imageUrl = TOPIC_IMAGE_URL, ), - isFollowed = true + isFollowed = true, ), FollowableTopic( Topic( @@ -230,7 +230,7 @@ private val testOutputTopics = listOf( url = TOPIC_URL, imageUrl = TOPIC_IMAGE_URL, ), - isFollowed = true + isFollowed = true, ), FollowableTopic( Topic( @@ -241,8 +241,8 @@ private val testOutputTopics = listOf( url = TOPIC_URL, imageUrl = TOPIC_IMAGE_URL, ), - isFollowed = false - ) + isFollowed = false, + ), ) private val sampleNewsResources = listOf( @@ -265,7 +265,7 @@ private val sampleNewsResources = listOf( longDescription = "long description", url = "URL", imageUrl = "image URL", - ) + ), ), - ) + ), ) diff --git a/gradle/init.gradle.kts b/gradle/init.gradle.kts index bd5658fc0c..57f91da088 100644 --- a/gradle/init.gradle.kts +++ b/gradle/init.gradle.kts @@ -14,10 +14,10 @@ * limitations under the License. */ -val ktlintVersion = "0.43.0" +val ktlintVersion = "0.48.1" initscript { - val spotlessVersion = "6.11.0" + val spotlessVersion = "6.13.0" repositories { mavenCentral() diff --git a/lint/src/main/java/com/google/samples/apps/nowinandroid/lint/designsystem/DesignSystemDetector.kt b/lint/src/main/java/com/google/samples/apps/nowinandroid/lint/designsystem/DesignSystemDetector.kt index 047b5d7ab3..39aa071601 100644 --- a/lint/src/main/java/com/google/samples/apps/nowinandroid/lint/designsystem/DesignSystemDetector.kt +++ b/lint/src/main/java/com/google/samples/apps/nowinandroid/lint/designsystem/DesignSystemDetector.kt @@ -38,7 +38,7 @@ class DesignSystemDetector : Detector(), Detector.UastScanner { override fun getApplicableUastTypes(): List> { return listOf( UCallExpression::class.java, - UQualifiedReferenceExpression::class.java + UQualifiedReferenceExpression::class.java, ) } @@ -71,8 +71,8 @@ class DesignSystemDetector : Detector(), Detector.UastScanner { severity = Severity.ERROR, implementation = Implementation( DesignSystemDetector::class.java, - Scope.JAVA_FILE_SCOPE - ) + Scope.JAVA_FILE_SCOPE, + ), ) // Unfortunately :lint is a Java module and thus can't depend on the :core-designsystem @@ -99,21 +99,23 @@ class DesignSystemDetector : Detector(), Detector.UastScanner { "CenterAlignedTopAppBar" to "NiaTopAppBar", "SmallTopAppBar" to "NiaTopAppBar", "MediumTopAppBar" to "NiaTopAppBar", - "LargeTopAppBar" to "NiaTopAppBar" + "LargeTopAppBar" to "NiaTopAppBar", ) val RECEIVER_NAMES = mapOf( - "Icons" to "NiaIcons" + "Icons" to "NiaIcons", ) fun reportIssue( context: JavaContext, node: UElement, name: String, - preferredName: String + preferredName: String, ) { context.report( - ISSUE, node, context.getLocation(node), - "Using $name instead of $preferredName" + ISSUE, + node, + context.getLocation(node), + "Using $name instead of $preferredName", ) } } diff --git a/lint/src/main/java/com/google/samples/apps/nowinandroid/lint/designsystem/DesignSystemIssueRegistry.kt b/lint/src/main/java/com/google/samples/apps/nowinandroid/lint/designsystem/DesignSystemIssueRegistry.kt index 152c07c28c..d951151bbf 100644 --- a/lint/src/main/java/com/google/samples/apps/nowinandroid/lint/designsystem/DesignSystemIssueRegistry.kt +++ b/lint/src/main/java/com/google/samples/apps/nowinandroid/lint/designsystem/DesignSystemIssueRegistry.kt @@ -35,6 +35,6 @@ class DesignSystemIssueRegistry : IssueRegistry() { override val vendor: Vendor = Vendor( vendorName = "Now in Android", feedbackUrl = "https://github.com/android/nowinandroid/issues", - contact = "https://github.com/android/nowinandroid" + contact = "https://github.com/android/nowinandroid", ) } diff --git a/sync/sync-test/src/main/java/com/google/samples/apps/nowinandroid/core/sync/test/NeverSyncingSyncStatusMonitor.kt b/sync/sync-test/src/main/java/com/google/samples/apps/nowinandroid/core/sync/test/NeverSyncingSyncStatusMonitor.kt index 0c0069f7d5..647dd864e3 100644 --- a/sync/sync-test/src/main/java/com/google/samples/apps/nowinandroid/core/sync/test/NeverSyncingSyncStatusMonitor.kt +++ b/sync/sync-test/src/main/java/com/google/samples/apps/nowinandroid/core/sync/test/NeverSyncingSyncStatusMonitor.kt @@ -17,9 +17,9 @@ package com.google.samples.apps.nowinandroid.core.sync.test import com.google.samples.apps.nowinandroid.core.data.util.SyncStatusMonitor -import javax.inject.Inject import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.flowOf +import javax.inject.Inject class NeverSyncingSyncStatusMonitor @Inject constructor() : SyncStatusMonitor { override val isSyncing: Flow = flowOf(false) diff --git a/sync/sync-test/src/main/java/com/google/samples/apps/nowinandroid/core/sync/test/TestSyncModule.kt b/sync/sync-test/src/main/java/com/google/samples/apps/nowinandroid/core/sync/test/TestSyncModule.kt index bc0876a7cc..323704b5ae 100644 --- a/sync/sync-test/src/main/java/com/google/samples/apps/nowinandroid/core/sync/test/TestSyncModule.kt +++ b/sync/sync-test/src/main/java/com/google/samples/apps/nowinandroid/core/sync/test/TestSyncModule.kt @@ -26,11 +26,11 @@ import dagger.hilt.testing.TestInstallIn @Module @TestInstallIn( components = [SingletonComponent::class], - replaces = [SyncModule::class] + replaces = [SyncModule::class], ) interface TestSyncModule { @Binds fun bindsSyncStatusMonitor( - syncStatusMonitor: NeverSyncingSyncStatusMonitor + syncStatusMonitor: NeverSyncingSyncStatusMonitor, ): SyncStatusMonitor } diff --git a/sync/work/src/androidTest/java/com/google/samples/apps/nowinandroid/sync/workers/SyncWorkerTest.kt b/sync/work/src/androidTest/java/com/google/samples/apps/nowinandroid/sync/workers/SyncWorkerTest.kt index 4bcc19be84..9c9d135104 100644 --- a/sync/work/src/androidTest/java/com/google/samples/apps/nowinandroid/sync/workers/SyncWorkerTest.kt +++ b/sync/work/src/androidTest/java/com/google/samples/apps/nowinandroid/sync/workers/SyncWorkerTest.kt @@ -25,10 +25,10 @@ import androidx.work.testing.SynchronousExecutor import androidx.work.testing.WorkManagerTestInitHelper import dagger.hilt.android.testing.HiltAndroidRule import dagger.hilt.android.testing.HiltAndroidTest -import kotlin.test.assertEquals import org.junit.Before import org.junit.Rule import org.junit.Test +import kotlin.test.assertEquals @HiltAndroidTest class SyncWorkerTest { diff --git a/sync/work/src/main/java/com/google/samples/apps/nowinandroid/sync/di/SyncModule.kt b/sync/work/src/main/java/com/google/samples/apps/nowinandroid/sync/di/SyncModule.kt index 88e7df4de4..68f9eee93e 100644 --- a/sync/work/src/main/java/com/google/samples/apps/nowinandroid/sync/di/SyncModule.kt +++ b/sync/work/src/main/java/com/google/samples/apps/nowinandroid/sync/di/SyncModule.kt @@ -28,6 +28,6 @@ import dagger.hilt.components.SingletonComponent interface SyncModule { @Binds fun bindsSyncStatusMonitor( - syncStatusMonitor: WorkManagerSyncStatusMonitor + syncStatusMonitor: WorkManagerSyncStatusMonitor, ): SyncStatusMonitor } diff --git a/sync/work/src/main/java/com/google/samples/apps/nowinandroid/sync/initializers/SyncInitializer.kt b/sync/work/src/main/java/com/google/samples/apps/nowinandroid/sync/initializers/SyncInitializer.kt index 21f98138bb..837eb9a206 100644 --- a/sync/work/src/main/java/com/google/samples/apps/nowinandroid/sync/initializers/SyncInitializer.kt +++ b/sync/work/src/main/java/com/google/samples/apps/nowinandroid/sync/initializers/SyncInitializer.kt @@ -47,7 +47,7 @@ class SyncInitializer : Initializer { enqueueUniqueWork( SyncWorkName, ExistingWorkPolicy.KEEP, - SyncWorker.startUpSyncWork() + SyncWorker.startUpSyncWork(), ) } diff --git a/sync/work/src/main/java/com/google/samples/apps/nowinandroid/sync/initializers/SyncWorkHelpers.kt b/sync/work/src/main/java/com/google/samples/apps/nowinandroid/sync/initializers/SyncWorkHelpers.kt index bfaef1808f..334b3f0c72 100644 --- a/sync/work/src/main/java/com/google/samples/apps/nowinandroid/sync/initializers/SyncWorkHelpers.kt +++ b/sync/work/src/main/java/com/google/samples/apps/nowinandroid/sync/initializers/SyncWorkHelpers.kt @@ -42,7 +42,7 @@ val SyncConstraints */ fun Context.syncForegroundInfo() = ForegroundInfo( SyncNotificationId, - syncWorkNotification() + syncWorkNotification(), ) /** @@ -54,7 +54,7 @@ private fun Context.syncWorkNotification(): Notification { val channel = NotificationChannel( SyncNotificationChannelID, getString(R.string.sync_notification_channel_name), - NotificationManager.IMPORTANCE_DEFAULT + NotificationManager.IMPORTANCE_DEFAULT, ).apply { description = getString(R.string.sync_notification_channel_description) } @@ -67,10 +67,10 @@ private fun Context.syncWorkNotification(): Notification { return NotificationCompat.Builder( this, - SyncNotificationChannelID + SyncNotificationChannelID, ) .setSmallIcon( - com.google.samples.apps.nowinandroid.core.common.R.drawable.ic_nia_notification + com.google.samples.apps.nowinandroid.core.common.R.drawable.ic_nia_notification, ) .setContentTitle(getString(R.string.sync_notification_title)) .setPriority(NotificationCompat.PRIORITY_DEFAULT) diff --git a/sync/work/src/main/java/com/google/samples/apps/nowinandroid/sync/status/WorkManagerSyncStatusMonitor.kt b/sync/work/src/main/java/com/google/samples/apps/nowinandroid/sync/status/WorkManagerSyncStatusMonitor.kt index fe9c429e0c..9edb630ebd 100644 --- a/sync/work/src/main/java/com/google/samples/apps/nowinandroid/sync/status/WorkManagerSyncStatusMonitor.kt +++ b/sync/work/src/main/java/com/google/samples/apps/nowinandroid/sync/status/WorkManagerSyncStatusMonitor.kt @@ -25,20 +25,20 @@ import androidx.work.WorkManager import com.google.samples.apps.nowinandroid.core.data.util.SyncStatusMonitor import com.google.samples.apps.nowinandroid.sync.initializers.SyncWorkName import dagger.hilt.android.qualifiers.ApplicationContext -import javax.inject.Inject import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.conflate +import javax.inject.Inject /** * [SyncStatusMonitor] backed by [WorkInfo] from [WorkManager] */ class WorkManagerSyncStatusMonitor @Inject constructor( - @ApplicationContext context: Context + @ApplicationContext context: Context, ) : SyncStatusMonitor { override val isSyncing: Flow = Transformations.map( WorkManager.getInstance(context).getWorkInfosForUniqueWorkLiveData(SyncWorkName), - MutableList::anyRunning + MutableList::anyRunning, ) .asFlow() .conflate() diff --git a/sync/work/src/main/java/com/google/samples/apps/nowinandroid/sync/workers/SyncWorker.kt b/sync/work/src/main/java/com/google/samples/apps/nowinandroid/sync/workers/SyncWorker.kt index 1a7dfb1be5..c6ac6fb650 100644 --- a/sync/work/src/main/java/com/google/samples/apps/nowinandroid/sync/workers/SyncWorker.kt +++ b/sync/work/src/main/java/com/google/samples/apps/nowinandroid/sync/workers/SyncWorker.kt @@ -65,8 +65,11 @@ class SyncWorker @AssistedInject constructor( async { newsRepository.sync() }, ).all { it } - if (syncedSuccessfully) Result.success() - else Result.retry() + if (syncedSuccessfully) { + Result.success() + } else { + Result.retry() + } } } @@ -74,7 +77,7 @@ class SyncWorker @AssistedInject constructor( niaPreferences.getChangeListVersions() override suspend fun updateChangeListVersions( - update: ChangeListVersions.() -> ChangeListVersions + update: ChangeListVersions.() -> ChangeListVersions, ) = niaPreferences.updateChangeListVersion(update) companion object {