From db07a12be5c3090765a0587535bfe559630ca09d Mon Sep 17 00:00:00 2001 From: Harsh Shandilya Date: Fri, 2 Apr 2021 13:05:08 +0530 Subject: [PATCH] all: reformat with ktfmt google style Signed-off-by: Harsh Shandilya --- .../lobsters/data/api/LobstersApi.kt | 10 +- .../lobsters/model/KeybaseSignature.kt | 6 +- .../msfjarvis/lobsters/model/LobstersPost.kt | 18 +- .../dev/msfjarvis/lobsters/model/Submitter.kt | 24 +-- .../lobsters/data/api/LobstersApiTest.kt | 34 ++-- app/build.gradle.kts | 5 +- .../lobsters/ui/main/LobstersTopBarTest.kt | 11 +- .../ui/navigation/LobstersBottomNavTest.kt | 12 +- .../msfjarvis/lobsters/ui/posts/HeaderTest.kt | 13 +- .../lobsters/ui/posts/LobstersItemTest.kt | 21 +- .../puculek/pulltorefresh/PullToRefresh.kt | 186 +++++++++--------- .../PullToRefreshProgressIndicator.kt | 80 +++----- .../dev/msfjarvis/lobsters/ClawApplication.kt | 3 +- .../data/preferences/ClawPreferences.kt | 8 +- .../data/remote/HottestPostsPagingSource.kt | 3 +- .../data/remote/NewestPostsPagingSource.kt | 3 +- .../lobsters/data/repo/LobstersRepository.kt | 52 ++--- .../msfjarvis/lobsters/injection/ApiModule.kt | 7 +- .../lobsters/injection/BaseUrlQualifier.kt | 4 +- .../lobsters/injection/DatabaseModule.kt | 5 +- .../lobsters/injection/MoshiModule.kt | 3 +- .../msfjarvis/lobsters/ui/main/LobstersApp.kt | 3 +- .../lobsters/ui/main/LobstersTopAppBar.kt | 7 +- .../lobsters/ui/main/MainActivity.kt | 4 +- .../lobsters/ui/navigation/Destination.kt | 4 +- .../dev/msfjarvis/lobsters/ui/posts/Header.kt | 18 +- .../lobsters/ui/posts/LobstersItem.kt | 61 +++--- .../lobsters/ui/posts/NetworkPosts.kt | 13 +- .../msfjarvis/lobsters/ui/posts/SavedPosts.kt | 7 +- .../lobsters/ui/posts/ShimmeringList.kt | 45 ++--- .../dev/msfjarvis/lobsters/ui/theme/Theme.kt | 42 ++-- .../ui/viewmodel/LobstersViewModel.kt | 33 ++-- .../lobsters/util/DatabaseExtensions.kt | 4 +- build.gradle.kts | 4 +- buildSrc/build.gradle.kts | 8 +- buildSrc/buildSrc/build.gradle.kts | 8 +- buildSrc/src/main/java/BaseProjectConfig.kt | 40 ++-- .../main/java/CoreLibraryDesugaringPlugin.kt | 3 +- buildSrc/src/main/java/KaptConfigs.kt | 17 +- buildSrc/src/main/java/KotlinCompilerArgs.kt | 6 +- buildSrc/src/main/java/LobstersPlugin.kt | 10 +- buildSrc/src/main/java/SigningConfig.kt | 4 +- buildSrc/src/main/java/VersioningPlugin.kt | 66 +++---- common/build.gradle.kts | 26 +-- .../lobsters/ui/urllauncher/UrlLauncher.kt | 11 +- .../msfjarvis/lobsters/utils/StringValue.kt | 6 +- .../dev/msfjarvis/lobsters/utils/Strings.kt | 1 - .../data/local/SqlDelightQueriesTest.kt | 31 +-- desktop/build.gradle.kts | 10 +- .../msfjarvis/lobsters/data/ApiRepository.kt | 12 +- .../dev/msfjarvis/lobsters/ui/LobstersItem.kt | 30 +-- .../kotlin/dev/msfjarvis/lobsters/ui/Main.kt | 60 +++--- .../kotlin/dev/msfjarvis/lobsters/ui/Theme.kt | 48 ++--- settings.gradle.kts | 2 + 54 files changed, 496 insertions(+), 656 deletions(-) diff --git a/api/src/main/java/dev/msfjarvis/lobsters/data/api/LobstersApi.kt b/api/src/main/java/dev/msfjarvis/lobsters/data/api/LobstersApi.kt index c66f7c5b..9cef0224 100644 --- a/api/src/main/java/dev/msfjarvis/lobsters/data/api/LobstersApi.kt +++ b/api/src/main/java/dev/msfjarvis/lobsters/data/api/LobstersApi.kt @@ -4,16 +4,12 @@ import dev.msfjarvis.lobsters.model.LobstersPost import retrofit2.http.GET import retrofit2.http.Query -/** - * Simple interface defining an API for lobste.rs - */ +/** Simple interface defining an API for lobste.rs */ interface LobstersApi { - @GET("hottest.json") - suspend fun getHottestPosts(@Query("page") page: Int): List + @GET("hottest.json") suspend fun getHottestPosts(@Query("page") page: Int): List - @GET("newest.json") - suspend fun getNewestPosts(@Query("page") page: Int): List + @GET("newest.json") suspend fun getNewestPosts(@Query("page") page: Int): List companion object { const val BASE_URL = "https://lobste.rs" diff --git a/api/src/main/java/dev/msfjarvis/lobsters/model/KeybaseSignature.kt b/api/src/main/java/dev/msfjarvis/lobsters/model/KeybaseSignature.kt index 243bdff9..b90df662 100644 --- a/api/src/main/java/dev/msfjarvis/lobsters/model/KeybaseSignature.kt +++ b/api/src/main/java/dev/msfjarvis/lobsters/model/KeybaseSignature.kt @@ -5,8 +5,6 @@ import com.squareup.moshi.JsonClass @JsonClass(generateAdapter = true) class KeybaseSignature( - @Json(name = "kb_username") - val kbUsername: String, - @Json(name = "sig_hash") - val sigHash: String, + @Json(name = "kb_username") val kbUsername: String, + @Json(name = "sig_hash") val sigHash: String, ) diff --git a/api/src/main/java/dev/msfjarvis/lobsters/model/LobstersPost.kt b/api/src/main/java/dev/msfjarvis/lobsters/model/LobstersPost.kt index f6d947bd..1f6f4458 100644 --- a/api/src/main/java/dev/msfjarvis/lobsters/model/LobstersPost.kt +++ b/api/src/main/java/dev/msfjarvis/lobsters/model/LobstersPost.kt @@ -5,22 +5,16 @@ import com.squareup.moshi.JsonClass @JsonClass(generateAdapter = true) class LobstersPost( - @Json(name = "short_id") - val shortId: String, - @Json(name = "short_id_url") - val shortIdUrl: String, - @Json(name = "created_at") - val createdAt: String, + @Json(name = "short_id") val shortId: String, + @Json(name = "short_id_url") val shortIdUrl: String, + @Json(name = "created_at") val createdAt: String, val title: String, val url: String, val score: Long, val flags: Long, - @Json(name = "comment_count") - val commentCount: Long, + @Json(name = "comment_count") val commentCount: Long, val description: String, - @Json(name = "comments_url") - val commentsUrl: String, - @Json(name = "submitter_user") - val submitterUser: Submitter, + @Json(name = "comments_url") val commentsUrl: String, + @Json(name = "submitter_user") val submitterUser: Submitter, val tags: List, ) diff --git a/api/src/main/java/dev/msfjarvis/lobsters/model/Submitter.kt b/api/src/main/java/dev/msfjarvis/lobsters/model/Submitter.kt index ea739b74..8f32f9a4 100644 --- a/api/src/main/java/dev/msfjarvis/lobsters/model/Submitter.kt +++ b/api/src/main/java/dev/msfjarvis/lobsters/model/Submitter.kt @@ -6,22 +6,14 @@ import com.squareup.moshi.JsonClass @JsonClass(generateAdapter = true) class Submitter( val username: String, - @Json(name = "created_at") - val createdAt: String, - @Json(name = "is_admin") - val isAdmin: Boolean, + @Json(name = "created_at") val createdAt: String, + @Json(name = "is_admin") val isAdmin: Boolean, val about: String, - @Json(name = "is_moderator") - val isModerator: Boolean, + @Json(name = "is_moderator") val isModerator: Boolean, val karma: Long = 0, - @Json(name = "avatar_url") - val avatarUrl: String, - @Json(name = "invited_by_user") - val invitedByUser: String, - @Json(name = "github_username") - val githubUsername: String? = null, - @Json(name = "twitter_username") - val twitterUsername: String? = null, - @Json(name = "keybase_signatures") - val keybaseSignatures: List = emptyList(), + @Json(name = "avatar_url") val avatarUrl: String, + @Json(name = "invited_by_user") val invitedByUser: String, + @Json(name = "github_username") val githubUsername: String? = null, + @Json(name = "twitter_username") val twitterUsername: String? = null, + @Json(name = "keybase_signatures") val keybaseSignatures: List = emptyList(), ) diff --git a/api/src/test/java/dev/msfjarvis/lobsters/data/api/LobstersApiTest.kt b/api/src/test/java/dev/msfjarvis/lobsters/data/api/LobstersApiTest.kt index cb867b91..b01aa089 100644 --- a/api/src/test/java/dev/msfjarvis/lobsters/data/api/LobstersApiTest.kt +++ b/api/src/test/java/dev/msfjarvis/lobsters/data/api/LobstersApiTest.kt @@ -22,26 +22,26 @@ class LobstersApiTest { companion object { private val webServer = MockWebServer() private val apiData = TestUtils.getJson("hottest.json") - private val moshi = Moshi.Builder() - .build() - private val okHttp = OkHttpClient.Builder() - .build() - private val retrofit = Retrofit.Builder() - .client(okHttp) - .baseUrl("http://localhost:8080/") - .addConverterFactory(MoshiConverterFactory.create(moshi)) - .build() + private val moshi = Moshi.Builder().build() + private val okHttp = OkHttpClient.Builder().build() + private val retrofit = + Retrofit.Builder() + .client(okHttp) + .baseUrl("http://localhost:8080/") + .addConverterFactory(MoshiConverterFactory.create(moshi)) + .build() private val apiClient = retrofit.create() @JvmStatic @BeforeClass fun setUp() { webServer.start(8080) - webServer.dispatcher = object : Dispatcher() { - override fun dispatch(request: RecordedRequest): MockResponse { - return MockResponse().setBody(apiData).setResponseCode(200) + webServer.dispatcher = + object : Dispatcher() { + override fun dispatch(request: RecordedRequest): MockResponse { + return MockResponse().setBody(apiData).setResponseCode(200) + } } - } } @JvmStatic @@ -60,18 +60,14 @@ class LobstersApiTest { @Test fun `no moderator posts in test data`() = runBlocking { val posts = apiClient.getHottestPosts(1) - val moderatorPosts = posts.asSequence() - .filter { it.submitterUser.isModerator } - .toSet() + val moderatorPosts = posts.asSequence().filter { it.submitterUser.isModerator }.toSet() assertTrue(moderatorPosts.isEmpty()) } @Test fun `posts with no urls`() = runBlocking { val posts = apiClient.getHottestPosts(1) - val commentsOnlyPosts = posts.asSequence() - .filter { it.url.isEmpty() } - .toSet() + val commentsOnlyPosts = posts.asSequence().filter { it.url.isEmpty() }.toSet() assertEquals(2, commentsOnlyPosts.size) } } diff --git a/app/build.gradle.kts b/app/build.gradle.kts index fad36e8d..39eec84b 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -10,9 +10,7 @@ plugins { `core-library-desugaring` } -repositories { - maven("https://maven.pkg.jetbrains.space/public/p/compose/dev") -} +repositories { maven("https://maven.pkg.jetbrains.space/public/p/compose/dev") } android { defaultConfig { @@ -22,7 +20,6 @@ android { } dependencies { - kapt(Dependencies.AndroidX.Hilt.daggerCompiler) implementation(project(":api")) implementation(project(":common")) diff --git a/app/src/androidTest/java/dev/msfjarvis/lobsters/ui/main/LobstersTopBarTest.kt b/app/src/androidTest/java/dev/msfjarvis/lobsters/ui/main/LobstersTopBarTest.kt index f57928f1..cd66ee9b 100644 --- a/app/src/androidTest/java/dev/msfjarvis/lobsters/ui/main/LobstersTopBarTest.kt +++ b/app/src/androidTest/java/dev/msfjarvis/lobsters/ui/main/LobstersTopBarTest.kt @@ -15,8 +15,7 @@ import org.junit.Test @Ignore("Shot is broken yet again") class LobstersTopBarTest : ScreenshotTest { - @get:Rule - val composeTestRule = createComposeRule() + @get:Rule val composeTestRule = createComposeRule() @Test fun showsRefreshIconWhenOnHottestPostsScreen_DarkTheme() { @@ -24,7 +23,7 @@ class LobstersTopBarTest : ScreenshotTest { DarkTestTheme { LobstersTopAppBar( currentDestination = Destination.Hottest, - toggleSortingOrder = { }, + toggleSortingOrder = {}, ) } } @@ -38,7 +37,7 @@ class LobstersTopBarTest : ScreenshotTest { LightTestTheme { LobstersTopAppBar( currentDestination = Destination.Hottest, - toggleSortingOrder = { }, + toggleSortingOrder = {}, ) } } @@ -52,7 +51,7 @@ class LobstersTopBarTest : ScreenshotTest { DarkTestTheme { LobstersTopAppBar( currentDestination = Destination.Saved, - toggleSortingOrder = { }, + toggleSortingOrder = {}, ) } } @@ -66,7 +65,7 @@ class LobstersTopBarTest : ScreenshotTest { LightTestTheme { LobstersTopAppBar( currentDestination = Destination.Saved, - toggleSortingOrder = { }, + toggleSortingOrder = {}, ) } } diff --git a/app/src/androidTest/java/dev/msfjarvis/lobsters/ui/navigation/LobstersBottomNavTest.kt b/app/src/androidTest/java/dev/msfjarvis/lobsters/ui/navigation/LobstersBottomNavTest.kt index 8b8e569f..f427b2e1 100644 --- a/app/src/androidTest/java/dev/msfjarvis/lobsters/ui/navigation/LobstersBottomNavTest.kt +++ b/app/src/androidTest/java/dev/msfjarvis/lobsters/ui/navigation/LobstersBottomNavTest.kt @@ -14,7 +14,6 @@ import androidx.compose.ui.test.performClick import com.karumi.shot.ScreenshotTest import dev.msfjarvis.lobsters.ui.DarkTestTheme import dev.msfjarvis.lobsters.ui.main.LobstersBottomNav -import dev.msfjarvis.lobsters.ui.theme.LobstersTheme import kotlin.test.Test import org.junit.Ignore import org.junit.Rule @@ -22,8 +21,7 @@ import org.junit.Rule @Ignore("Shot is broken yet again") class LobstersBottomNavTest : ScreenshotTest { - @get:Rule - val composeTestRule = createComposeRule() + @get:Rule val composeTestRule = createComposeRule() @Test fun bottomNavIsRenderedCorrectlyOnScreen() { @@ -31,7 +29,7 @@ class LobstersBottomNavTest : ScreenshotTest { DarkTestTheme { LobstersBottomNav( currentDestination = Destination.startDestination, - navigateToDestination = { /*TODO*/ }, + navigateToDestination = { /*TODO*/}, jumpToIndex = { _, _ -> }, ) } @@ -59,8 +57,6 @@ class LobstersBottomNavTest : ScreenshotTest { compareScreenshot(composeTestRule.onRoot().captureToImage().asAndroidBitmap()) } - private fun selectNode(testTag: String) = composeTestRule - .onNodeWithTag(testTag) - .assertHasClickAction() - .performClick() + private fun selectNode(testTag: String) = + composeTestRule.onNodeWithTag(testTag).assertHasClickAction().performClick() } diff --git a/app/src/androidTest/java/dev/msfjarvis/lobsters/ui/posts/HeaderTest.kt b/app/src/androidTest/java/dev/msfjarvis/lobsters/ui/posts/HeaderTest.kt index 68ea0519..3ac50dff 100644 --- a/app/src/androidTest/java/dev/msfjarvis/lobsters/ui/posts/HeaderTest.kt +++ b/app/src/androidTest/java/dev/msfjarvis/lobsters/ui/posts/HeaderTest.kt @@ -19,21 +19,16 @@ import org.junit.Rule @Ignore("Shot is broken yet again") class HeaderTest : ScreenshotTest { - @get:Rule - val composeTestRule = createComposeRule() + @get:Rule val composeTestRule = createComposeRule() @Test fun headerDoesNotHaveATransparentBackground() { composeTestRule.setContent { DarkTestTheme { Box( - modifier = Modifier - .background(color = Color(0xffffff)) - .fillMaxWidth() - .wrapContentHeight(), - ) { - MonthHeader(month = Month.AUGUST) - } + modifier = + Modifier.background(color = Color(0xffffff)).fillMaxWidth().wrapContentHeight(), + ) { MonthHeader(month = Month.AUGUST) } } } compareScreenshot(composeTestRule.onRoot().captureToImage().asAndroidBitmap()) diff --git a/app/src/androidTest/java/dev/msfjarvis/lobsters/ui/posts/LobstersItemTest.kt b/app/src/androidTest/java/dev/msfjarvis/lobsters/ui/posts/LobstersItemTest.kt index ceee5c13..c117c021 100644 --- a/app/src/androidTest/java/dev/msfjarvis/lobsters/ui/posts/LobstersItemTest.kt +++ b/app/src/androidTest/java/dev/msfjarvis/lobsters/ui/posts/LobstersItemTest.kt @@ -15,8 +15,7 @@ import org.junit.Rule @Ignore("Shot is broken yet again") class LobstersItemTest : ScreenshotTest { - @get:Rule - val composeTestRule = createComposeRule() + @get:Rule val composeTestRule = createComposeRule() @Test fun singlePost() { @@ -24,9 +23,9 @@ class LobstersItemTest : ScreenshotTest { DarkTestTheme { LobstersItem( post = TEST_POST, - viewPost = { /*TODO*/ }, - viewComments = { /*TODO*/ }, - toggleSave = { /*TODO*/ }, + viewPost = {}, + viewComments = {}, + toggleSave = {}, isSaved = true, ) } @@ -42,9 +41,9 @@ class LobstersItemTest : ScreenshotTest { items(10) { LobstersItem( post = TEST_POST, - viewPost = { /*TODO*/ }, - viewComments = { /*TODO*/ }, - toggleSave = { /*TODO*/ }, + viewPost = {}, + viewComments = {}, + toggleSave = {}, isSaved = true, ) } @@ -62,9 +61,9 @@ class LobstersItemTest : ScreenshotTest { items(10) { LobstersItem( post = TEST_POST.copy(tags = listOf("openbsd", "linux")), - viewPost = { /*TODO*/ }, - viewComments = { /*TODO*/ }, - toggleSave = { /*TODO*/ }, + viewPost = {}, + viewComments = {}, + toggleSave = {}, isSaved = true, ) } diff --git a/app/src/main/java/com/puculek/pulltorefresh/PullToRefresh.kt b/app/src/main/java/com/puculek/pulltorefresh/PullToRefresh.kt index aea80edb..f96fcc7c 100644 --- a/app/src/main/java/com/puculek/pulltorefresh/PullToRefresh.kt +++ b/app/src/main/java/com/puculek/pulltorefresh/PullToRefresh.kt @@ -25,13 +25,11 @@ import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.unit.Velocity import androidx.compose.ui.unit.dp - private const val MAX_OFFSET = 400f private const val MIN_REFRESH_OFFSET = 250f private const val PERCENT_INDICATOR_PROGRESS_ON_DRAG = 0.85f private const val BASE_OFFSET = -48 - /** * A layout composable with [content]. * @@ -78,26 +76,30 @@ fun PullToRefresh( finishedListener = { indicatorOffset = 0f isFinishingRefresh = false - }) + } + ) val offsetAnimation by animateFloatAsState( - targetValue = if (isRefreshing || isFinishingRefresh) { - indicatorOffset - minRefreshOffset - } else { - 0f - } + targetValue = + if (isRefreshing || isFinishingRefresh) { + indicatorOffset - minRefreshOffset + } else { + 0f + } ) val resettingScrollOffsetAnimation by animateFloatAsState( - targetValue = if (isResettingScroll) { - scrollToReset - } else { - 0f - }, + targetValue = + if (isResettingScroll) { + scrollToReset + } else { + 0f + }, finishedListener = { if (isResettingScroll) { indicatorOffset = 0f isResettingScroll = false } - }) + } + ) if (isResettingScroll) { indicatorOffset -= resettingScrollOffsetAnimation @@ -110,100 +112,102 @@ fun PullToRefresh( isRefreshingInternal = true } - val nestedScrollConnection = object : NestedScrollConnection { + val nestedScrollConnection = + object : NestedScrollConnection { - override fun onPostScroll( - consumed: Offset, - available: Offset, - source: NestedScrollSource - ): Offset { - if (!isRefreshing && source == NestedScrollSource.Drag) { - val diff = if (indicatorOffset + available.y > maxOffset) { - available.y - (indicatorOffset + available.y - maxOffset) - } else if (indicatorOffset + available.y < 0) { - 0f - } else { - available.y + override fun onPostScroll( + consumed: Offset, + available: Offset, + source: NestedScrollSource + ): Offset { + if (!isRefreshing && source == NestedScrollSource.Drag) { + val diff = + if (indicatorOffset + available.y > maxOffset) { + available.y - (indicatorOffset + available.y - maxOffset) + } else if (indicatorOffset + available.y < 0) { + 0f + } else { + available.y + } + indicatorOffset += diff + return Offset(0f, diff) } - indicatorOffset += diff - return Offset(0f, diff) + return super.onPostScroll(consumed, available, source) } - return super.onPostScroll(consumed, available, source) - } - override fun onPreScroll( - available: Offset, - source: NestedScrollSource - ): Offset { - if (!isRefreshing && source == NestedScrollSource.Drag) { - if (available.y < 0 && indicatorOffset > 0) { - val diff = if (indicatorOffset + available.y < 0) { - indicatorOffset = 0f - indicatorOffset + override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset { + if (!isRefreshing && source == NestedScrollSource.Drag) { + if (available.y < 0 && indicatorOffset > 0) { + val diff = + if (indicatorOffset + available.y < 0) { + indicatorOffset = 0f + indicatorOffset + } else { + indicatorOffset += available.y + available.y + } + isFinishingRefresh = false + return Offset.Zero.copy(y = diff) + } + } + return super.onPreScroll(available, source) + } + + override suspend fun onPostFling(consumed: Velocity, available: Velocity): Velocity { + if (!isRefreshing) { + if (indicatorOffset > minRefreshOffset) { + onRefresh() + isRefreshingInternal = true } else { - indicatorOffset += available.y - available.y + isResettingScroll = true + scrollToReset = indicatorOffset } - isFinishingRefresh = false - return Offset.Zero.copy(y = diff) } + return super.onPostFling(consumed, available) } - return super.onPreScroll(available, source) } - override suspend fun onPostFling( - consumed: Velocity, - available: Velocity - ): Velocity { - if (!isRefreshing) { - if (indicatorOffset > minRefreshOffset) { - onRefresh() - isRefreshingInternal = true - } else { - isResettingScroll = true - scrollToReset = indicatorOffset - } - } - return super.onPostFling(consumed, available) - } - } - Box( - modifier = CombinedModifier( - inner = Modifier - .nestedScroll(nestedScrollConnection) - .clip(RectangleShape), - outer = modifier - ) + modifier = + CombinedModifier( + inner = Modifier.nestedScroll(nestedScrollConnection).clip(RectangleShape), + outer = modifier + ) ) { content() - val offsetPx = if (isRefreshing || isFinishingRefresh) { - offsetAnimation - } else { - 0f - } - val absoluteOffset = BASE_OFFSET.dp + with(LocalDensity.current) { - val diffedOffset = indicatorOffset - offsetPx - val calculated = calculateAbsoluteOffset(diffedOffset, MAX_OFFSET) - calculated.toDp() - } - val progressFromOffset = with(LocalDensity.current) { - val coeff = MAX_OFFSET / (MAX_OFFSET - BASE_OFFSET) - (indicatorOffset - BASE_OFFSET) / maxOffset * coeff - } + val offsetPx = + if (isRefreshing || isFinishingRefresh) { + offsetAnimation + } else { + 0f + } + val absoluteOffset = + BASE_OFFSET.dp + + with(LocalDensity.current) { + val diffedOffset = indicatorOffset - offsetPx + val calculated = calculateAbsoluteOffset(diffedOffset, MAX_OFFSET) + calculated.toDp() + } + val progressFromOffset = + with(LocalDensity.current) { + val coeff = MAX_OFFSET / (MAX_OFFSET - BASE_OFFSET) + (indicatorOffset - BASE_OFFSET) / maxOffset * coeff + } PullToRefreshProgressIndicator( - modifier = Modifier - .fillMaxWidth() - .absoluteOffset(y = absoluteOffset) - .scale(scaleAnimation) - .rotate(indicatorOffset / MAX_OFFSET * 180 + 110), + modifier = + Modifier.fillMaxWidth() + .absoluteOffset(y = absoluteOffset) + .scale(scaleAnimation) + .rotate(indicatorOffset / MAX_OFFSET * 180 + 110), progressColor = progressColor, backgroundColor = backgroundColor, - progress = when { - !isRefreshing && !isFinishingRefresh -> progressFromOffset * PERCENT_INDICATOR_PROGRESS_ON_DRAG - else -> null - }, + progress = + when { + !isRefreshing && !isFinishingRefresh -> + progressFromOffset * PERCENT_INDICATOR_PROGRESS_ON_DRAG + else -> null + }, ) } } diff --git a/app/src/main/java/com/puculek/pulltorefresh/PullToRefreshProgressIndicator.kt b/app/src/main/java/com/puculek/pulltorefresh/PullToRefreshProgressIndicator.kt index 280f2a46..b5db0471 100644 --- a/app/src/main/java/com/puculek/pulltorefresh/PullToRefreshProgressIndicator.kt +++ b/app/src/main/java/com/puculek/pulltorefresh/PullToRefreshProgressIndicator.kt @@ -27,11 +27,9 @@ import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp - private val CircularIndicatorDiameter = 40.dp private const val strokeWidthPx = 2.5f - @Composable internal fun PullToRefreshProgressIndicator( modifier: Modifier = Modifier, @@ -39,22 +37,15 @@ internal fun PullToRefreshProgressIndicator( backgroundColor: Color, progress: Float? = null ) { - Row( - modifier = modifier, - horizontalArrangement = Arrangement.Center - ) { + Row(modifier = modifier, horizontalArrangement = Arrangement.Center) { Card( - modifier = Modifier - .width(CircularIndicatorDiameter) - .height(CircularIndicatorDiameter), + modifier = Modifier.width(CircularIndicatorDiameter).height(CircularIndicatorDiameter), shape = CircleShape, elevation = 6.dp, backgroundColor = backgroundColor, ) { val padding = Modifier.padding(8.dp) - val strokeWidth = with(LocalDensity.current) { - (strokeWidthPx * this.density).toDp() - } + val strokeWidth = with(LocalDensity.current) { (strokeWidthPx * this.density).toDp() } if (progress == null) { CircularProgressIndicator( @@ -74,7 +65,6 @@ internal fun PullToRefreshProgressIndicator( } } - @Composable fun ProgressIndicatorWithArrow( progress: Float, @@ -83,47 +73,41 @@ fun ProgressIndicatorWithArrow( strokeWidth: Dp = ProgressIndicatorDefaults.StrokeWidth, ) { - val strokeWidthPx = with(LocalDensity.current) { - strokeWidth.toPx() - } + val strokeWidthPx = with(LocalDensity.current) { strokeWidth.toPx() } val arrowWidth = 2.5f * strokeWidthPx * (0.5f + progress * 0.5f) val stroke = Stroke(width = strokeWidthPx, cap = StrokeCap.Butt) val diameterOffset = stroke.width / 2 - val arrowPath = Path().apply { - moveTo(0f, -arrowWidth) - lineTo(arrowWidth, 0f) - lineTo(0f, arrowWidth) - close() - } + val arrowPath = + Path().apply { + moveTo(0f, -arrowWidth) + lineTo(arrowWidth, 0f) + lineTo(0f, arrowWidth) + close() + } Box(modifier = modifier) { - Canvas(modifier = Modifier - .fillMaxWidth() - .fillMaxHeight(), onDraw = { - val arcDimen = size.width - 2 * diameterOffset - withTransform({ - translate(top = strokeWidthPx / 2, left = size.width / 2) - rotate( - degrees = progress * 360, - pivot = Offset(x = 0f, y = size.height / 2 - diameterOffset) - ) - }) { - drawPath( - path = arrowPath, - color = color + Canvas( + modifier = Modifier.fillMaxWidth().fillMaxHeight(), + onDraw = { + val arcDimen = size.width - 2 * diameterOffset + withTransform({ + translate(top = strokeWidthPx / 2, left = size.width / 2) + rotate( + degrees = progress * 360, + pivot = Offset(x = 0f, y = size.height / 2 - diameterOffset) + ) + }) { drawPath(path = arrowPath, color = color) } + + drawArc( + color = color, + startAngle = -90f, + sweepAngle = 360 * progress, + useCenter = false, + topLeft = Offset(diameterOffset, diameterOffset), + size = Size(arcDimen, arcDimen), + style = stroke ) } - - drawArc( - color = color, - startAngle = -90f, - sweepAngle = 360 * progress, - useCenter = false, - topLeft = Offset(diameterOffset, diameterOffset), - size = Size(arcDimen, arcDimen), - style = stroke - ) - }) + ) } - } diff --git a/app/src/main/java/dev/msfjarvis/lobsters/ClawApplication.kt b/app/src/main/java/dev/msfjarvis/lobsters/ClawApplication.kt index 0537185c..03424ed6 100644 --- a/app/src/main/java/dev/msfjarvis/lobsters/ClawApplication.kt +++ b/app/src/main/java/dev/msfjarvis/lobsters/ClawApplication.kt @@ -3,5 +3,4 @@ package dev.msfjarvis.lobsters import android.app.Application import dagger.hilt.android.HiltAndroidApp -@HiltAndroidApp -class ClawApplication : Application() +@HiltAndroidApp class ClawApplication : Application() diff --git a/app/src/main/java/dev/msfjarvis/lobsters/data/preferences/ClawPreferences.kt b/app/src/main/java/dev/msfjarvis/lobsters/data/preferences/ClawPreferences.kt index 4eb62aac..fe8fc369 100644 --- a/app/src/main/java/dev/msfjarvis/lobsters/data/preferences/ClawPreferences.kt +++ b/app/src/main/java/dev/msfjarvis/lobsters/data/preferences/ClawPreferences.kt @@ -8,7 +8,9 @@ import javax.inject.Inject import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.map -class ClawPreferences @Inject constructor( +class ClawPreferences +@Inject +constructor( private val dataStore: DataStore, ) { private val sortKey = booleanPreferencesKey("post_sorting_order") @@ -17,8 +19,6 @@ class ClawPreferences @Inject constructor( get() = dataStore.data.map { preferences -> preferences[sortKey] ?: false } suspend fun toggleSortingOrder() { - dataStore.edit { preferences -> - preferences[sortKey] = (preferences[sortKey] ?: false).not() - } + dataStore.edit { preferences -> preferences[sortKey] = (preferences[sortKey] ?: false).not() } } } diff --git a/app/src/main/java/dev/msfjarvis/lobsters/data/remote/HottestPostsPagingSource.kt b/app/src/main/java/dev/msfjarvis/lobsters/data/remote/HottestPostsPagingSource.kt index d8d5c911..31d99a64 100644 --- a/app/src/main/java/dev/msfjarvis/lobsters/data/remote/HottestPostsPagingSource.kt +++ b/app/src/main/java/dev/msfjarvis/lobsters/data/remote/HottestPostsPagingSource.kt @@ -5,7 +5,8 @@ import androidx.paging.PagingState import dev.msfjarvis.lobsters.data.repo.LobstersRepository import dev.msfjarvis.lobsters.model.LobstersPost -class HottestPostsPagingSource constructor( +class HottestPostsPagingSource +constructor( private val lobstersRepository: LobstersRepository, ) : PagingSource() { diff --git a/app/src/main/java/dev/msfjarvis/lobsters/data/remote/NewestPostsPagingSource.kt b/app/src/main/java/dev/msfjarvis/lobsters/data/remote/NewestPostsPagingSource.kt index 0e09a780..c4f246b3 100644 --- a/app/src/main/java/dev/msfjarvis/lobsters/data/remote/NewestPostsPagingSource.kt +++ b/app/src/main/java/dev/msfjarvis/lobsters/data/remote/NewestPostsPagingSource.kt @@ -5,7 +5,8 @@ import androidx.paging.PagingState import dev.msfjarvis.lobsters.data.repo.LobstersRepository import dev.msfjarvis.lobsters.model.LobstersPost -class NewestPostsPagingSource constructor( +class NewestPostsPagingSource +constructor( private val lobstersRepository: LobstersRepository, ) : PagingSource() { diff --git a/app/src/main/java/dev/msfjarvis/lobsters/data/repo/LobstersRepository.kt b/app/src/main/java/dev/msfjarvis/lobsters/data/repo/LobstersRepository.kt index dad3983c..cde8ce2e 100644 --- a/app/src/main/java/dev/msfjarvis/lobsters/data/repo/LobstersRepository.kt +++ b/app/src/main/java/dev/msfjarvis/lobsters/data/repo/LobstersRepository.kt @@ -2,14 +2,15 @@ package dev.msfjarvis.lobsters.data.repo import dev.msfjarvis.lobsters.data.api.LobstersApi import dev.msfjarvis.lobsters.data.local.SavedPost -import dev.msfjarvis.lobsters.model.LobstersPost import dev.msfjarvis.lobsters.database.LobstersDatabase +import dev.msfjarvis.lobsters.model.LobstersPost import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.withContext -class LobstersRepository constructor( +class LobstersRepository +constructor( private val lobstersApi: LobstersApi, private val lobstersDatabase: LobstersDatabase, ) { @@ -26,13 +27,15 @@ class LobstersRepository constructor( return savedPostsCache.values.toList() } - suspend fun fetchHottestPosts(page: Int): List = withContext(Dispatchers.IO) { - return@withContext lobstersApi.getHottestPosts(page) - } + suspend fun fetchHottestPosts(page: Int): List = + withContext(Dispatchers.IO) { + return@withContext lobstersApi.getHottestPosts(page) + } - suspend fun fetchNewestPosts(page: Int): List = withContext(Dispatchers.IO) { - return@withContext lobstersApi.getNewestPosts(page) - } + suspend fun fetchNewestPosts(page: Int): List = + withContext(Dispatchers.IO) { + return@withContext lobstersApi.getNewestPosts(page) + } // https://issuetracker.google.com/issues/181221325 @Suppress("NewApi") @@ -40,27 +43,28 @@ class LobstersRepository constructor( if (_isCacheReady.value) return val posts = getSavedPosts() - posts.forEach { - savedPostsCache[it.shortId] = it - } + posts.forEach { savedPostsCache[it.shortId] = it } _isCacheReady.value = true } - private suspend fun getSavedPosts(): List = withContext(Dispatchers.IO) { - return@withContext lobstersDatabase.savedPostQueries.selectAllPosts().executeAsList() - } + private suspend fun getSavedPosts(): List = + withContext(Dispatchers.IO) { + return@withContext lobstersDatabase.savedPostQueries.selectAllPosts().executeAsList() + } - suspend fun addPost(post: SavedPost) = withContext(Dispatchers.IO) { - if (!savedPostsCache.containsKey(post.shortId)) { - savedPostsCache.putIfAbsent(post.shortId, post) - lobstersDatabase.savedPostQueries.insertOrReplacePost(post) + suspend fun addPost(post: SavedPost) = + withContext(Dispatchers.IO) { + if (!savedPostsCache.containsKey(post.shortId)) { + savedPostsCache.putIfAbsent(post.shortId, post) + lobstersDatabase.savedPostQueries.insertOrReplacePost(post) + } } - } - suspend fun removePost(post: SavedPost) = withContext(Dispatchers.IO) { - if (savedPostsCache.containsKey(post.shortId)) { - savedPostsCache.remove(post.shortId) - lobstersDatabase.savedPostQueries.deletePost(post.shortId) + suspend fun removePost(post: SavedPost) = + withContext(Dispatchers.IO) { + if (savedPostsCache.containsKey(post.shortId)) { + savedPostsCache.remove(post.shortId) + lobstersDatabase.savedPostQueries.deletePost(post.shortId) + } } - } } diff --git a/app/src/main/java/dev/msfjarvis/lobsters/injection/ApiModule.kt b/app/src/main/java/dev/msfjarvis/lobsters/injection/ApiModule.kt index 061b2f09..75ccc3b6 100644 --- a/app/src/main/java/dev/msfjarvis/lobsters/injection/ApiModule.kt +++ b/app/src/main/java/dev/msfjarvis/lobsters/injection/ApiModule.kt @@ -24,13 +24,12 @@ object ApiModule { @Provides fun provideClient(): OkHttpClient { - return OkHttpClient.Builder() - .build() + return OkHttpClient.Builder().build() } /** - * Using [Lazy] here is a trick I picked up from Zac Sweers, which he explained in more - * detail here: https://www.zacsweers.dev/dagger-party-tricks-deferred-okhttp-init/ + * Using [Lazy] here is a trick I picked up from Zac Sweers, which he explained in more detail + * here: https://www.zacsweers.dev/dagger-party-tricks-deferred-okhttp-init/ */ @Provides fun provideRetrofit( diff --git a/app/src/main/java/dev/msfjarvis/lobsters/injection/BaseUrlQualifier.kt b/app/src/main/java/dev/msfjarvis/lobsters/injection/BaseUrlQualifier.kt index 2874f257..7f4cfcf1 100644 --- a/app/src/main/java/dev/msfjarvis/lobsters/injection/BaseUrlQualifier.kt +++ b/app/src/main/java/dev/msfjarvis/lobsters/injection/BaseUrlQualifier.kt @@ -6,6 +6,4 @@ import javax.inject.Qualifier * Qualifier for a string value that needs to be provided to the [ApiModule.provideRetrofit] method * as the base URL of our API. */ -@Qualifier -@Retention(AnnotationRetention.RUNTIME) -annotation class BaseUrlQualifier +@Qualifier @Retention(AnnotationRetention.RUNTIME) annotation class BaseUrlQualifier diff --git a/app/src/main/java/dev/msfjarvis/lobsters/injection/DatabaseModule.kt b/app/src/main/java/dev/msfjarvis/lobsters/injection/DatabaseModule.kt index 68fd581c..a960454d 100644 --- a/app/src/main/java/dev/msfjarvis/lobsters/injection/DatabaseModule.kt +++ b/app/src/main/java/dev/msfjarvis/lobsters/injection/DatabaseModule.kt @@ -32,10 +32,7 @@ object DatabaseModule { @Provides @Singleton - fun providesLobstersDatabase( - sqlDriver: SqlDriver, - tagsAdapter: TagsAdapter - ): LobstersDatabase { + fun providesLobstersDatabase(sqlDriver: SqlDriver, tagsAdapter: TagsAdapter): LobstersDatabase { return LobstersDatabase( sqlDriver, SavedPost.Adapter(tagsAdapter), diff --git a/app/src/main/java/dev/msfjarvis/lobsters/injection/MoshiModule.kt b/app/src/main/java/dev/msfjarvis/lobsters/injection/MoshiModule.kt index 3f0b22e7..f55009c8 100644 --- a/app/src/main/java/dev/msfjarvis/lobsters/injection/MoshiModule.kt +++ b/app/src/main/java/dev/msfjarvis/lobsters/injection/MoshiModule.kt @@ -13,7 +13,6 @@ object MoshiModule { @Provides @Reusable fun provideMoshi(): Moshi { - return Moshi.Builder() - .build() + return Moshi.Builder().build() } } diff --git a/app/src/main/java/dev/msfjarvis/lobsters/ui/main/LobstersApp.kt b/app/src/main/java/dev/msfjarvis/lobsters/ui/main/LobstersApp.kt index fc40401c..401e838f 100644 --- a/app/src/main/java/dev/msfjarvis/lobsters/ui/main/LobstersApp.kt +++ b/app/src/main/java/dev/msfjarvis/lobsters/ui/main/LobstersApp.kt @@ -62,8 +62,7 @@ fun LobstersApp() { newestPostsListState.animateScrollToItem(index) } } - else -> { - } + else -> {} } } diff --git a/app/src/main/java/dev/msfjarvis/lobsters/ui/main/LobstersTopAppBar.kt b/app/src/main/java/dev/msfjarvis/lobsters/ui/main/LobstersTopAppBar.kt index 4bbd216a..fc63e087 100644 --- a/app/src/main/java/dev/msfjarvis/lobsters/ui/main/LobstersTopAppBar.kt +++ b/app/src/main/java/dev/msfjarvis/lobsters/ui/main/LobstersTopAppBar.kt @@ -36,9 +36,10 @@ fun LobstersTopAppBar( IconResource( resourceId = R.drawable.ic_sort_24px, contentDescription = Strings.ChangeSortingOrder.get(), - modifier = Modifier - .padding(horizontal = 8.dp, vertical = 8.dp) - .clickable { scope.launch { toggleSortingOrder() } }, + modifier = + Modifier.padding(horizontal = 8.dp, vertical = 8.dp).clickable { + scope.launch { toggleSortingOrder() } + }, ) } } diff --git a/app/src/main/java/dev/msfjarvis/lobsters/ui/main/MainActivity.kt b/app/src/main/java/dev/msfjarvis/lobsters/ui/main/MainActivity.kt index c6b5c0fd..d1a57868 100644 --- a/app/src/main/java/dev/msfjarvis/lobsters/ui/main/MainActivity.kt +++ b/app/src/main/java/dev/msfjarvis/lobsters/ui/main/MainActivity.kt @@ -18,9 +18,7 @@ class MainActivity : AppCompatActivity() { super.onCreate(savedInstanceState) setContent { CompositionLocalProvider(LocalUrlLauncher provides urlLauncher) { - LobstersTheme { - LobstersApp() - } + LobstersTheme { LobstersApp() } } } } diff --git a/app/src/main/java/dev/msfjarvis/lobsters/ui/navigation/Destination.kt b/app/src/main/java/dev/msfjarvis/lobsters/ui/navigation/Destination.kt index 7a8b4a11..6e219b20 100644 --- a/app/src/main/java/dev/msfjarvis/lobsters/ui/navigation/Destination.kt +++ b/app/src/main/java/dev/msfjarvis/lobsters/ui/navigation/Destination.kt @@ -4,9 +4,7 @@ import androidx.annotation.DrawableRes import dev.msfjarvis.lobsters.R import dev.msfjarvis.lobsters.utils.Strings -/** - * Destinations for navigation within the app. - */ +/** Destinations for navigation within the app. */ enum class Destination( val route: String, val labelRes: Strings, diff --git a/app/src/main/java/dev/msfjarvis/lobsters/ui/posts/Header.kt b/app/src/main/java/dev/msfjarvis/lobsters/ui/posts/Header.kt index 43c17d07..052350fb 100644 --- a/app/src/main/java/dev/msfjarvis/lobsters/ui/posts/Header.kt +++ b/app/src/main/java/dev/msfjarvis/lobsters/ui/posts/Header.kt @@ -14,24 +14,24 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import dev.msfjarvis.lobsters.ui.theme.LobstersTheme import java.time.Month -import java.util.Locale import java.time.format.TextStyle as JTextStyle +import java.util.Locale @Composable fun MonthHeader(month: Month) { Box( - Modifier - .fillMaxWidth() + Modifier.fillMaxWidth() .background(MaterialTheme.colors.secondary) .wrapContentHeight() .padding(4.dp) ) { Text( text = month.getDisplayName(JTextStyle.FULL, Locale.getDefault()), - style = MaterialTheme.typography.h5.copy( - color = MaterialTheme.colors.onSecondary, - textAlign = TextAlign.Center, - ), + style = + MaterialTheme.typography.h5.copy( + color = MaterialTheme.colors.onSecondary, + textAlign = TextAlign.Center, + ), modifier = Modifier.padding(horizontal = 12.dp), ) } @@ -40,7 +40,5 @@ fun MonthHeader(month: Month) { @Preview @Composable fun MonthHeaderPreview() { - LobstersTheme { - MonthHeader(month = Month.JULY) - } + LobstersTheme { MonthHeader(month = Month.JULY) } } diff --git a/app/src/main/java/dev/msfjarvis/lobsters/ui/posts/LobstersItem.kt b/app/src/main/java/dev/msfjarvis/lobsters/ui/posts/LobstersItem.kt index 88a0dac9..1b95f2dc 100644 --- a/app/src/main/java/dev/msfjarvis/lobsters/ui/posts/LobstersItem.kt +++ b/app/src/main/java/dev/msfjarvis/lobsters/ui/posts/LobstersItem.kt @@ -39,16 +39,17 @@ import dev.msfjarvis.lobsters.util.IconResource import dev.msfjarvis.lobsters.utils.Strings import dev.msfjarvis.lobsters.utils.get -val TEST_POST = SavedPost( - shortId = "zqyydb", - title = "k2k20 hackathon report: Bob Beck on LibreSSL progress", - url = "https://undeadly.org/cgi?action=article;sid=20200921105847", - createdAt = "2020-09-21T07:11:14.000-05:00", - commentsUrl = "https://lobste.rs/s/zqyydb/k2k20_hackathon_report_bob_beck_on", - submitterName = "Vigdis", - submitterAvatarUrl = "/404.html", - tags = listOf("openbsd", "linux", "containers", "hack the planet", "no thanks"), -) +val TEST_POST = + SavedPost( + shortId = "zqyydb", + title = "k2k20 hackathon report: Bob Beck on LibreSSL progress", + url = "https://undeadly.org/cgi?action=article;sid=20200921105847", + createdAt = "2020-09-21T07:11:14.000-05:00", + commentsUrl = "https://lobste.rs/s/zqyydb/k2k20_hackathon_report_bob_beck_on", + submitterName = "Vigdis", + submitterAvatarUrl = "/404.html", + tags = listOf("openbsd", "linux", "containers", "hack the planet", "no thanks"), + ) @OptIn(ExperimentalFoundationApi::class) @Composable @@ -61,22 +62,17 @@ fun LobstersItem( modifier: Modifier = Modifier, ) { Surface( - modifier = Modifier - .clickable { viewPost.invoke() } - .then(modifier), + modifier = Modifier.clickable { viewPost.invoke() }.then(modifier), ) { Column( - modifier = Modifier - .padding(horizontal = 12.dp, vertical = 4.dp), + modifier = Modifier.padding(horizontal = 12.dp, vertical = 4.dp), ) { PostTitle( title = post.title, - modifier = Modifier - .padding(bottom = 4.dp), + modifier = Modifier.padding(bottom = 4.dp), ) Row( - modifier = Modifier - .fillMaxWidth(), + modifier = Modifier.fillMaxWidth(), verticalAlignment = Alignment.CenterVertically, ) { TagRow( @@ -144,11 +140,8 @@ fun SubmitterAvatar( data = "${LobstersApi.BASE_URL}/$avatarUrl", contentDescription = Strings.AvatarContentDescription.get(name), fadeIn = true, - requestBuilder = { - transformations(CircleCropTransformation()) - }, - modifier = Modifier - .requiredSize(24.dp), + requestBuilder = { transformations(CircleCropTransformation()) }, + modifier = Modifier.requiredSize(24.dp), ) } @@ -158,8 +151,7 @@ fun SubmitterNameText( ) { Text( text = Strings.SubmittedBy.get(name), - modifier = Modifier - .padding(start = 4.dp), + modifier = Modifier.padding(start = 4.dp), ) } @@ -172,15 +164,14 @@ fun SaveButton( IconToggleButton( checked = isSaved, onCheckedChange = { onClick.invoke() }, - modifier = Modifier - .requiredSize(32.dp) - .then(modifier), + modifier = Modifier.requiredSize(32.dp).then(modifier), ) { Crossfade(targetState = isSaved) { saved -> IconResource( resourceId = if (saved) R.drawable.ic_favorite_24px else R.drawable.ic_favorite_border_24px, tint = MaterialTheme.colors.secondary, - contentDescription = if (saved) Strings.RemoveFromSavedPosts.get() else Strings.AddToSavedPosts.get(), + contentDescription = + if (saved) Strings.RemoveFromSavedPosts.get() else Strings.AddToSavedPosts.get(), ) } } @@ -193,9 +184,7 @@ fun CommentsButton( ) { IconButton( onClick = onClick, - modifier = Modifier - .requiredSize(32.dp) - .then(modifier), + modifier = Modifier.requiredSize(32.dp).then(modifier), ) { IconResource( resourceId = R.drawable.ic_insert_comment_24px, @@ -220,9 +209,9 @@ fun TagRow( tags.forEach { tag -> Text( text = tag, - modifier = Modifier - .background(Color(0xFFFFFCD7), RoundedCornerShape(8.dp)) - .padding(vertical = 2.dp, horizontal = 6.dp), + modifier = + Modifier.background(Color(0xFFFFFCD7), RoundedCornerShape(8.dp)) + .padding(vertical = 2.dp, horizontal = 6.dp), color = Color.DarkGray, ) } diff --git a/app/src/main/java/dev/msfjarvis/lobsters/ui/posts/NetworkPosts.kt b/app/src/main/java/dev/msfjarvis/lobsters/ui/posts/NetworkPosts.kt index 5f59340a..bc93a0dd 100644 --- a/app/src/main/java/dev/msfjarvis/lobsters/ui/posts/NetworkPosts.kt +++ b/app/src/main/java/dev/msfjarvis/lobsters/ui/posts/NetworkPosts.kt @@ -17,9 +17,7 @@ import dev.msfjarvis.lobsters.model.LobstersPost import dev.msfjarvis.lobsters.ui.urllauncher.LocalUrlLauncher import dev.msfjarvis.lobsters.util.toDbModel -/** - * Composable for rendering a list of [LobstersPost] fetched from the network. - */ +/** Composable for rendering a list of [LobstersPost] fetched from the network. */ @Composable fun NetworkPosts( posts: LazyPagingItems, @@ -42,11 +40,7 @@ fun NetworkPosts( }, ) { if (posts.loadState.refresh == LoadState.Loading) { - LazyColumn { - items(15) { - LoadingLobstersItem() - } - } + LazyColumn { items(15) { LoadingLobstersItem() } } } else { LazyColumn( state = listState, @@ -54,8 +48,7 @@ fun NetworkPosts( ) { items(posts) { item -> if (item != null) { - @Suppress("NAME_SHADOWING") - val item = item.toDbModel() + @Suppress("NAME_SHADOWING") val item = item.toDbModel() var isSaved by remember(item.shortId) { mutableStateOf(isPostSaved(item.shortId)) } LobstersItem( diff --git a/app/src/main/java/dev/msfjarvis/lobsters/ui/posts/SavedPosts.kt b/app/src/main/java/dev/msfjarvis/lobsters/ui/posts/SavedPosts.kt index 1a8c15f9..94842cb3 100644 --- a/app/src/main/java/dev/msfjarvis/lobsters/ui/posts/SavedPosts.kt +++ b/app/src/main/java/dev/msfjarvis/lobsters/ui/posts/SavedPosts.kt @@ -58,11 +58,8 @@ fun SavedPosts( ) { val grouped = posts.groupBy { it.createdAt.asZonedDateTime().month } grouped.forEach { (month, posts) -> - stickyHeader { - MonthHeader(month = month) - } - @Suppress("NAME_SHADOWING") - val posts = if (sortOrder) posts.reversed() else posts + stickyHeader { MonthHeader(month = month) } + @Suppress("NAME_SHADOWING") val posts = if (sortOrder) posts.reversed() else posts items(posts) { item -> LobstersItem( post = item, diff --git a/app/src/main/java/dev/msfjarvis/lobsters/ui/posts/ShimmeringList.kt b/app/src/main/java/dev/msfjarvis/lobsters/ui/posts/ShimmeringList.kt index bb7f0ca5..7e1ffabf 100644 --- a/app/src/main/java/dev/msfjarvis/lobsters/ui/posts/ShimmeringList.kt +++ b/app/src/main/java/dev/msfjarvis/lobsters/ui/posts/ShimmeringList.kt @@ -34,13 +34,15 @@ fun LoadingLobstersItem() { val alpha by infiniteTransition.animateFloat( initialValue = 0.2f, targetValue = 1f, - animationSpec = infiniteRepeatable( - animation = keyframes { - durationMillis = 1000 - 0.7f at 500 - }, - repeatMode = RepeatMode.Reverse - ) + animationSpec = + infiniteRepeatable( + animation = + keyframes { + durationMillis = 1000 + 0.7f at 500 + }, + repeatMode = RepeatMode.Reverse + ) ) val color = Color.LightGray.copy(alpha = alpha) Surface( @@ -54,29 +56,22 @@ fun LoadingLobstersItem() { verticalArrangement = Arrangement.SpaceEvenly, ) { Box( - modifier = Modifier - .fillMaxWidth() - .requiredHeight(12.dp) - .background(color) - .padding(8.dp), + modifier = Modifier.fillMaxWidth().requiredHeight(12.dp).background(color).padding(8.dp), ) Row( verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.SpaceEvenly, - modifier = Modifier - .absoluteOffset(y = 12.dp), + modifier = Modifier.absoluteOffset(y = 12.dp), ) { Box( - modifier = Modifier - .requiredSize(30.dp) - .background(color = color, shape = CircleShape), + modifier = Modifier.requiredSize(30.dp).background(color = color, shape = CircleShape), ) Box( - modifier = Modifier - .requiredHeight(12.dp) - .requiredWidth(40.dp) - .absoluteOffset(x = 12.dp) - .background(color), + modifier = + Modifier.requiredHeight(12.dp) + .requiredWidth(40.dp) + .absoluteOffset(x = 12.dp) + .background(color), ) } } @@ -87,9 +82,5 @@ fun LoadingLobstersItem() { @Preview @Composable fun ShimmerListPreview() { - LazyColumn { - items(10) { - LoadingLobstersItem() - } - } + LazyColumn { items(10) { LoadingLobstersItem() } } } diff --git a/app/src/main/java/dev/msfjarvis/lobsters/ui/theme/Theme.kt b/app/src/main/java/dev/msfjarvis/lobsters/ui/theme/Theme.kt index a7fbeaec..569e3c6c 100644 --- a/app/src/main/java/dev/msfjarvis/lobsters/ui/theme/Theme.kt +++ b/app/src/main/java/dev/msfjarvis/lobsters/ui/theme/Theme.kt @@ -9,27 +9,29 @@ import androidx.compose.ui.graphics.Color val titleColor = Color(0xFF7395D9) -val lightColors = lightColors( - primary = Color.White, - secondary = Color(0xFF6C0000), - background = Color.White, - surface = Color.White, - onPrimary = Color.DarkGray, - onSecondary = Color.White, - onBackground = Color.White, - onSurface = Color.White, -) +val lightColors = + lightColors( + primary = Color.White, + secondary = Color(0xFF6C0000), + background = Color.White, + surface = Color.White, + onPrimary = Color.DarkGray, + onSecondary = Color.White, + onBackground = Color.White, + onSurface = Color.White, + ) -val darkColors = darkColors( - primary = Color.White, - secondary = Color(0xFFD2362D), - background = Color.Black, - surface = Color.Black, - onPrimary = Color.Black, - onSecondary = Color.White, - onBackground = Color.White, - onSurface = Color.White, -) +val darkColors = + darkColors( + primary = Color.White, + secondary = Color(0xFFD2362D), + background = Color.Black, + surface = Color.Black, + onPrimary = Color.Black, + onSecondary = Color.White, + onBackground = Color.White, + onSurface = Color.White, + ) @Composable fun LobstersTheme(children: @Composable () -> Unit) { diff --git a/app/src/main/java/dev/msfjarvis/lobsters/ui/viewmodel/LobstersViewModel.kt b/app/src/main/java/dev/msfjarvis/lobsters/ui/viewmodel/LobstersViewModel.kt index 86575234..70c9947e 100644 --- a/app/src/main/java/dev/msfjarvis/lobsters/ui/viewmodel/LobstersViewModel.kt +++ b/app/src/main/java/dev/msfjarvis/lobsters/ui/viewmodel/LobstersViewModel.kt @@ -20,27 +20,38 @@ import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.launch @HiltViewModel -class LobstersViewModel @Inject constructor( +class LobstersViewModel +@Inject +constructor( private val lobstersRepository: LobstersRepository, private val clawPreferences: ClawPreferences, ) : ViewModel() { private val _savedPosts = MutableStateFlow>(emptyList()) val savedPosts = _savedPosts.asStateFlow() - val hottestPosts = Pager(PagingConfig(25)) { - HottestPostsPagingSource(lobstersRepository).also { hottestPostsPagingSource = it } - }.flow.cachedIn(viewModelScope) - val newestPosts = Pager(PagingConfig(25)) { - NewestPostsPagingSource(lobstersRepository).also { newestPostsPagingSource = it } - }.flow.cachedIn(viewModelScope) + val hottestPosts = + Pager(PagingConfig(25)) { + HottestPostsPagingSource(lobstersRepository).also { hottestPostsPagingSource = it } + } + .flow + .cachedIn(viewModelScope) + val newestPosts = + Pager(PagingConfig(25)) { + NewestPostsPagingSource(lobstersRepository).also { newestPostsPagingSource = it } + } + .flow + .cachedIn(viewModelScope) private var hottestPostsPagingSource: HottestPostsPagingSource? = null private var newestPostsPagingSource: NewestPostsPagingSource? = null init { - lobstersRepository.isCacheReady.onEach { ready -> - if (ready) { - _savedPosts.value = lobstersRepository.getAllPostsFromCache() + lobstersRepository + .isCacheReady + .onEach { ready -> + if (ready) { + _savedPosts.value = lobstersRepository.getAllPostsFromCache() + } } - }.launchIn(viewModelScope) + .launchIn(viewModelScope) } fun getSortOrder(): Flow { diff --git a/app/src/main/java/dev/msfjarvis/lobsters/util/DatabaseExtensions.kt b/app/src/main/java/dev/msfjarvis/lobsters/util/DatabaseExtensions.kt index 13e85a29..9bd4a120 100644 --- a/app/src/main/java/dev/msfjarvis/lobsters/util/DatabaseExtensions.kt +++ b/app/src/main/java/dev/msfjarvis/lobsters/util/DatabaseExtensions.kt @@ -3,9 +3,7 @@ package dev.msfjarvis.lobsters.util import dev.msfjarvis.lobsters.data.local.SavedPost import dev.msfjarvis.lobsters.model.LobstersPost -/** - * Convert a [LobstersPost] object returned by the API into a [SavedPost] for persistence. - */ +/** Convert a [LobstersPost] object returned by the API into a [SavedPost] for persistence. */ fun LobstersPost.toDbModel(): SavedPost { return SavedPost( shortId = shortId, diff --git a/build.gradle.kts b/build.gradle.kts index ee3d8c2b..eb81133e 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,6 +1,4 @@ -plugins { - `lobsters-plugin` -} +plugins { `lobsters-plugin` } subprojects { configurations.configureEach { diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts index fcf191cd..59eeef3d 100644 --- a/buildSrc/build.gradle.kts +++ b/buildSrc/build.gradle.kts @@ -1,15 +1,11 @@ -plugins { - `kotlin-dsl` -} +plugins { `kotlin-dsl` } repositories { google() gradlePluginPortal() } -kotlinDslPluginOptions { - experimentalWarning.set(false) -} +kotlinDslPluginOptions { experimentalWarning.set(false) } gradlePlugin { plugins { diff --git a/buildSrc/buildSrc/build.gradle.kts b/buildSrc/buildSrc/build.gradle.kts index 7092e5dd..f4bc8a7e 100644 --- a/buildSrc/buildSrc/build.gradle.kts +++ b/buildSrc/buildSrc/build.gradle.kts @@ -1,6 +1,4 @@ -plugins { - `kotlin-dsl` -} +plugins { `kotlin-dsl` } repositories { mavenCentral() @@ -8,9 +6,7 @@ repositories { gradlePluginPortal() } -kotlinDslPluginOptions { - experimentalWarning.set(false) -} +kotlinDslPluginOptions { experimentalWarning.set(false) } // force compilation of Dependencies.kt so it can be referenced in buildSrc/build.gradle.kts sourceSets.main { diff --git a/buildSrc/src/main/java/BaseProjectConfig.kt b/buildSrc/src/main/java/BaseProjectConfig.kt index 066e0af0..e0c64831 100644 --- a/buildSrc/src/main/java/BaseProjectConfig.kt +++ b/buildSrc/src/main/java/BaseProjectConfig.kt @@ -18,14 +18,12 @@ import org.gradle.kotlin.dsl.withType import org.jetbrains.kotlin.gradle.tasks.KotlinCompile /** - * Configure root project. - * Note that classpath dependencies still need to be defined in the `buildscript` block in the top-level build.gradle.kts file. + * Configure root project. Note that classpath dependencies still need to be defined in the + * `buildscript` block in the top-level build.gradle.kts file. */ internal fun Project.configureForRootProject() { // register task for cleaning the build directory in the root project - tasks.register("clean") { - delete(rootProject.buildDir) - } + tasks.register("clean") { delete(rootProject.buildDir) } tasks.withType { gradleVersion = "7.0-rc-1" distributionType = Wrapper.DistributionType.ALL @@ -33,18 +31,12 @@ internal fun Project.configureForRootProject() { } } -/** - * Configure all projects including the root project - */ +/** Configure all projects including the root project */ internal fun Project.configureForAllProjects() { repositories { google() mavenCentral() - jcenter { - content { - includeGroup("org.jetbrains.compose.*") - } - } + jcenter { content { includeGroup("org.jetbrains.compose.*") } } maven("https://dl.bintray.com/kotlin/kotlinx") { name = "KotlinX Bintray" content { @@ -62,25 +54,23 @@ internal fun Project.configureForAllProjects() { } tasks.withType { maxParallelForks = Runtime.getRuntime().availableProcessors() * 2 - testLogging { - events(TestLogEvent.PASSED, TestLogEvent.SKIPPED, TestLogEvent.FAILED) - } + testLogging { events(TestLogEvent.PASSED, TestLogEvent.SKIPPED, TestLogEvent.FAILED) } } } -/** - * Apply configuration options for Android Application projects. - */ +/** Apply configuration options for Android Application projects. */ @Suppress("UnstableApiUsage") internal fun BaseAppModuleExtension.configureAndroidApplicationOptions(project: Project) { val minifySwitch = project.providers.environmentVariable("DISABLE_MINIFY").forUseAtConfigurationTime() project.tasks.withType { kotlinOptions { - freeCompilerArgs = freeCompilerArgs + listOf( - "-Xopt-in=kotlinx.coroutines.ExperimentalCoroutinesApi", - "-Xopt-in=androidx.compose.material.ExperimentalMaterialApi" - ) + freeCompilerArgs = + freeCompilerArgs + + listOf( + "-Xopt-in=kotlinx.coroutines.ExperimentalCoroutinesApi", + "-Xopt-in=androidx.compose.material.ExperimentalMaterialApi" + ) } } adbOptions.installOptions("--user 0") @@ -97,9 +87,7 @@ internal fun BaseAppModuleExtension.configureAndroidApplicationOptions(project: } } -/** - * Apply baseline configurations for all Android projects (Application and Library). - */ +/** Apply baseline configurations for all Android projects (Application and Library). */ @Suppress("UnstableApiUsage") internal fun TestedExtension.configureCommonAndroidOptions() { compileSdkVersion(30) diff --git a/buildSrc/src/main/java/CoreLibraryDesugaringPlugin.kt b/buildSrc/src/main/java/CoreLibraryDesugaringPlugin.kt index 824bf34f..7bd2c0b7 100644 --- a/buildSrc/src/main/java/CoreLibraryDesugaringPlugin.kt +++ b/buildSrc/src/main/java/CoreLibraryDesugaringPlugin.kt @@ -9,7 +9,8 @@ import org.gradle.kotlin.dsl.withType /** * A plugin that enables Java 8 desugaring for consuming new Java language APIs. * - * Apply this plugin to the build.gradle.kts file in Android Application or Android Library projects: + * Apply this plugin to the build.gradle.kts file in Android Application or Android Library + * projects: * ``` * plugins { * `core-library-desugaring` diff --git a/buildSrc/src/main/java/KaptConfigs.kt b/buildSrc/src/main/java/KaptConfigs.kt index 818ad1a2..e4460561 100644 --- a/buildSrc/src/main/java/KaptConfigs.kt +++ b/buildSrc/src/main/java/KaptConfigs.kt @@ -2,9 +2,7 @@ import org.gradle.api.Project import org.gradle.kotlin.dsl.configure import org.jetbrains.kotlin.gradle.plugin.KaptExtension -/** - * Apply default kapt configs to the [Project]. - */ +/** Apply default kapt configs to the [Project]. */ internal fun Project.configureKapt() { extensions.configure { javacOptions { @@ -17,15 +15,14 @@ internal fun Project.configureKapt() { } } // disable kapt tasks for unit tests - tasks.matching { - it.name.startsWith("kapt") && it.name.endsWith("UnitTestKotlin") - }.configureEach { enabled = false } + tasks + .matching { it.name.startsWith("kapt") && it.name.endsWith("UnitTestKotlin") } + .configureEach { enabled = false } } } private val Project.hasDaggerCompilerDependency: Boolean - get() = configurations.any { - it.dependencies.any { dependency -> - dependency.name == "dagger-compiler" + get() = + configurations.any { + it.dependencies.any { dependency -> dependency.name == "dagger-compiler" } } - } diff --git a/buildSrc/src/main/java/KotlinCompilerArgs.kt b/buildSrc/src/main/java/KotlinCompilerArgs.kt index f80413ae..24d31fe9 100644 --- a/buildSrc/src/main/java/KotlinCompilerArgs.kt +++ b/buildSrc/src/main/java/KotlinCompilerArgs.kt @@ -3,7 +3,5 @@ * SPDX-License-Identifier: GPL-3.0-only */ -internal val additionalCompilerArgs = listOf( - "-Xopt-in=kotlin.RequiresOptIn", - "-Xskip-prerelease-check" -) +internal val additionalCompilerArgs = + listOf("-Xopt-in=kotlin.RequiresOptIn", "-Xskip-prerelease-check") diff --git a/buildSrc/src/main/java/LobstersPlugin.kt b/buildSrc/src/main/java/LobstersPlugin.kt index e7009c14..02bfa025 100644 --- a/buildSrc/src/main/java/LobstersPlugin.kt +++ b/buildSrc/src/main/java/LobstersPlugin.kt @@ -29,8 +29,7 @@ class LobstersPlugin : Plugin { project.plugins.all { when (this) { - is JavaPlugin, - is JavaLibraryPlugin -> { + is JavaPlugin, is JavaLibraryPlugin -> { project.tasks.withType { options.compilerArgs.add("-Xlint:unchecked") options.isDeprecation = true @@ -42,7 +41,9 @@ class LobstersPlugin : Plugin { is AppPlugin -> { project.extensions.getByType().configureCommonAndroidOptions() project.extensions.getByType().configureBuildSigning(project) - project.extensions.getByType() + project + .extensions + .getByType() .configureAndroidApplicationOptions(project) } is Kapt3GradleSubplugin -> { @@ -56,4 +57,5 @@ class LobstersPlugin : Plugin { } } -private val Project.isRoot get() = this == this.rootProject +private val Project.isRoot + get() = this == this.rootProject diff --git a/buildSrc/src/main/java/SigningConfig.kt b/buildSrc/src/main/java/SigningConfig.kt index 7fb7b8b8..f0e0b1cc 100644 --- a/buildSrc/src/main/java/SigningConfig.kt +++ b/buildSrc/src/main/java/SigningConfig.kt @@ -9,9 +9,7 @@ import org.gradle.api.Project private const val KEYSTORE_CONFIG_PATH = "keystore.properties" -/** - * Configure signing for all build types. - */ +/** Configure signing for all build types. */ @Suppress("UnstableApiUsage") internal fun BaseAppModuleExtension.configureBuildSigning(project: Project) { with(project) { diff --git a/buildSrc/src/main/java/VersioningPlugin.kt b/buildSrc/src/main/java/VersioningPlugin.kt index 27e1707e..1ce2d765 100644 --- a/buildSrc/src/main/java/VersioningPlugin.kt +++ b/buildSrc/src/main/java/VersioningPlugin.kt @@ -3,7 +3,6 @@ * SPDX-License-Identifier: GPL-3.0-only */ - import com.android.build.gradle.internal.plugins.AppPlugin import com.github.zafarkhaja.semver.Version import java.io.OutputStream @@ -14,34 +13,26 @@ import org.gradle.api.Project private const val VERSIONING_PROP_FILE = "version.properties" private const val VERSIONING_PROP_VERSION_NAME = "versioning-plugin.versionName" private const val VERSIONING_PROP_VERSION_CODE = "versioning-plugin.versionCode" -private const val VERSIONING_PROP_COMMENT = """ +private const val VERSIONING_PROP_COMMENT = + """ This file was automatically generated by 'versioning-plugin'. DO NOT EDIT MANUALLY. """ /** * A Gradle [Plugin] that takes a [Project] with the [AppPlugin] applied and dynamically sets the * versionCode and versionName properties based on values read from a [VERSIONING_PROP_FILE] file in - * the [Project.getBuildDir] directory. It also adds Gradle tasks to bump the major, minor, and patch - * versions along with one to prepare the next snapshot. + * the [Project.getBuildDir] directory. It also adds Gradle tasks to bump the major, minor, and + * patch versions along with one to prepare the next snapshot. */ -@Suppress( - "UnstableApiUsage", - "NAME_SHADOWING" -) +@Suppress("UnstableApiUsage", "NAME_SHADOWING") class VersioningPlugin : Plugin { - /** - * Generate the Android 'versionCode' property - */ + /** Generate the Android 'versionCode' property */ private fun Version.androidCode(): Int { - return majorVersion * 1_00_00 + - minorVersion * 1_00 + - patchVersion + return majorVersion * 1_00_00 + minorVersion * 1_00 + patchVersion } - /** - * Write an Android-specific variant of [this] to [stream] - */ + /** Write an Android-specific variant of [this] to [stream] */ private fun Version.writeForAndroid(stream: OutputStream) { val newVersionCode = androidCode() val props = Properties() @@ -50,27 +41,27 @@ class VersioningPlugin : Plugin { props.store(stream, VERSIONING_PROP_COMMENT) } - /** - * Returns the same [Version], but with build metadata stripped. - */ + /** Returns the same [Version], but with build metadata stripped. */ private fun Version.clearPreRelease(): Version { return Version.forIntegers(majorVersion, minorVersion, patchVersion) } override fun apply(project: Project) { with(project) { - val appPlugin = requireNotNull(plugins.findPlugin(AppPlugin::class.java)) { - "Plugin 'com.android.application' must be applied to use this plugin" - } + val appPlugin = + requireNotNull(plugins.findPlugin(AppPlugin::class.java)) { + "Plugin 'com.android.application' must be applied to use this plugin" + } val propFile = layout.projectDirectory.file(VERSIONING_PROP_FILE) require(propFile.asFile.exists()) { "A 'version.properties' file must exist in the project subdirectory to use this plugin" } val contents = providers.fileContents(propFile).asText.forUseAtConfigurationTime() val versionProps = Properties().also { it.load(contents.get().byteInputStream()) } - val versionName = requireNotNull(versionProps.getProperty(VERSIONING_PROP_VERSION_NAME)) { - "version.properties must contain a '$VERSIONING_PROP_VERSION_NAME' property" - } + val versionName = + requireNotNull(versionProps.getProperty(VERSIONING_PROP_VERSION_NAME)) { + "version.properties must contain a '$VERSIONING_PROP_VERSION_NAME' property" + } val versionCode = requireNotNull(versionProps.getProperty(VERSIONING_PROP_VERSION_CODE).toInt()) { "version.properties must contain a '$VERSIONING_PROP_VERSION_CODE' property" @@ -80,32 +71,21 @@ class VersioningPlugin : Plugin { afterEvaluate { val version = Version.valueOf(versionName) tasks.register("clearPreRelease") { - doLast { - version.clearPreRelease() - .writeForAndroid(propFile.asFile.outputStream()) - } + doLast { version.clearPreRelease().writeForAndroid(propFile.asFile.outputStream()) } } tasks.register("bumpMajor") { - doLast { - version.incrementMajorVersion() - .writeForAndroid(propFile.asFile.outputStream()) - } + doLast { version.incrementMajorVersion().writeForAndroid(propFile.asFile.outputStream()) } } tasks.register("bumpMinor") { - doLast { - version.incrementMinorVersion() - .writeForAndroid(propFile.asFile.outputStream()) - } + doLast { version.incrementMinorVersion().writeForAndroid(propFile.asFile.outputStream()) } } tasks.register("bumpPatch") { - doLast { - version.incrementPatchVersion() - .writeForAndroid(propFile.asFile.outputStream()) - } + doLast { version.incrementPatchVersion().writeForAndroid(propFile.asFile.outputStream()) } } tasks.register("bumpSnapshot") { doLast { - version.incrementMinorVersion() + version + .incrementMinorVersion() .setPreReleaseVersion("SNAPSHOT") .writeForAndroid(propFile.asFile.outputStream()) } diff --git a/common/build.gradle.kts b/common/build.gradle.kts index 523bc21a..6e088840 100644 --- a/common/build.gradle.kts +++ b/common/build.gradle.kts @@ -5,9 +5,7 @@ plugins { `lobsters-plugin` } -repositories { - maven("https://maven.pkg.jetbrains.space/public/p/compose/dev") -} +repositories { maven("https://maven.pkg.jetbrains.space/public/p/compose/dev") } // workaround for https://youtrack.jetbrains.com/issue/KT-43944 android { @@ -40,23 +38,11 @@ kotlin { } } - val jvmMain by getting { - dependencies { - implementation(compose.runtime) - } - } + val jvmMain by getting { dependencies { implementation(compose.runtime) } } - val androidTest by getting { - dependencies { - implementation(kotlin("test-junit")) - } - } + val androidTest by getting { dependencies { implementation(kotlin("test-junit")) } } - val jvmTest by getting { - dependencies { - implementation(kotlin("test-junit")) - } - } + val jvmTest by getting { dependencies { implementation(kotlin("test-junit")) } } val commonTest by getting { dependencies { @@ -68,9 +54,7 @@ kotlin { } android { - buildFeatures { - androidResources = true - } + buildFeatures { androidResources = true } sourceSets { named("main") { diff --git a/common/src/androidMain/kotlin/dev/msfjarvis/lobsters/ui/urllauncher/UrlLauncher.kt b/common/src/androidMain/kotlin/dev/msfjarvis/lobsters/ui/urllauncher/UrlLauncher.kt index 5fdca34d..ba1362ea 100644 --- a/common/src/androidMain/kotlin/dev/msfjarvis/lobsters/ui/urllauncher/UrlLauncher.kt +++ b/common/src/androidMain/kotlin/dev/msfjarvis/lobsters/ui/urllauncher/UrlLauncher.kt @@ -6,11 +6,12 @@ import androidx.browser.customtabs.CustomTabsIntent actual class UrlLauncher(private val context: Context) { actual fun launch(url: String) { - val customTabsIntent = CustomTabsIntent.Builder() - .setShareState(CustomTabsIntent.SHARE_STATE_ON) - .setShowTitle(true) - .setColorScheme(CustomTabsIntent.COLOR_SCHEME_DARK) - .build() + val customTabsIntent = + CustomTabsIntent.Builder() + .setShareState(CustomTabsIntent.SHARE_STATE_ON) + .setShowTitle(true) + .setColorScheme(CustomTabsIntent.COLOR_SCHEME_DARK) + .build() customTabsIntent.launchUrl(context, Uri.parse(url)) } } diff --git a/common/src/commonMain/kotlin/dev/msfjarvis/lobsters/utils/StringValue.kt b/common/src/commonMain/kotlin/dev/msfjarvis/lobsters/utils/StringValue.kt index 589a6a32..4f25af7e 100644 --- a/common/src/commonMain/kotlin/dev/msfjarvis/lobsters/utils/StringValue.kt +++ b/common/src/commonMain/kotlin/dev/msfjarvis/lobsters/utils/StringValue.kt @@ -2,8 +2,6 @@ package dev.msfjarvis.lobsters.utils import androidx.compose.runtime.Composable -@Composable -expect fun Strings.get(): String +@Composable expect fun Strings.get(): String -@Composable -expect fun Strings.get(fmt: Any): String +@Composable expect fun Strings.get(fmt: Any): String diff --git a/common/src/commonMain/kotlin/dev/msfjarvis/lobsters/utils/Strings.kt b/common/src/commonMain/kotlin/dev/msfjarvis/lobsters/utils/Strings.kt index 1edf66ab..13d946a9 100644 --- a/common/src/commonMain/kotlin/dev/msfjarvis/lobsters/utils/Strings.kt +++ b/common/src/commonMain/kotlin/dev/msfjarvis/lobsters/utils/Strings.kt @@ -13,5 +13,4 @@ enum class Strings { SavedPosts, SubmittedBy, NewestPosts, - ; } diff --git a/database/src/test/java/dev/msfjarvis/lobsters/data/local/SqlDelightQueriesTest.kt b/database/src/test/java/dev/msfjarvis/lobsters/data/local/SqlDelightQueriesTest.kt index 79cbc1d6..68bee231 100644 --- a/database/src/test/java/dev/msfjarvis/lobsters/data/local/SqlDelightQueriesTest.kt +++ b/database/src/test/java/dev/msfjarvis/lobsters/data/local/SqlDelightQueriesTest.kt @@ -17,10 +17,11 @@ class SqlDelightQueriesTest { fun setUp() { val driver = JdbcSqliteDriver(JdbcSqliteDriver.IN_MEMORY) LobstersDatabase.Schema.create(driver) - val database = LobstersDatabase( - driver, - SavedPost.Adapter(TagsAdapter()), - ) + val database = + LobstersDatabase( + driver, + SavedPost.Adapter(TagsAdapter()), + ) postQueries = database.savedPostQueries } @@ -128,21 +129,21 @@ class SqlDelightQueriesTest { assertEquals(0, postsCount) } - private fun createTestData(count: Int): ArrayList { val posts = arrayListOf() for (i in 1..count) { - val post = SavedPost( - shortId = "test_id_$i", - createdAt = "0", - title = "test", - url = "test_url", - commentsUrl = "test_comments_url", - submitterName = "test_user_$i", - submitterAvatarUrl = "test_avatar_url", - tags = listOf(), - ) + val post = + SavedPost( + shortId = "test_id_$i", + createdAt = "0", + title = "test", + url = "test_url", + commentsUrl = "test_comments_url", + submitterName = "test_user_$i", + submitterAvatarUrl = "test_avatar_url", + tags = listOf(), + ) posts.add(post) } diff --git a/desktop/build.gradle.kts b/desktop/build.gradle.kts index 9df4863c..0718098c 100644 --- a/desktop/build.gradle.kts +++ b/desktop/build.gradle.kts @@ -6,9 +6,7 @@ plugins { `lobsters-plugin` } -repositories { - maven("https://maven.pkg.jetbrains.space/public/p/compose/dev") -} +repositories { maven("https://maven.pkg.jetbrains.space/public/p/compose/dev") } dependencies { implementation(project(":api")) @@ -22,8 +20,4 @@ dependencies { implementation(Dependencies.ThirdParty.Retrofit.moshi) } -compose.desktop { - application { - mainClass = "dev.msfjarvis.lobsters.ui.Main" - } -} +compose.desktop { application { mainClass = "dev.msfjarvis.lobsters.ui.Main" } } diff --git a/desktop/src/main/kotlin/dev/msfjarvis/lobsters/data/ApiRepository.kt b/desktop/src/main/kotlin/dev/msfjarvis/lobsters/data/ApiRepository.kt index e4a65eb8..f16b13b2 100644 --- a/desktop/src/main/kotlin/dev/msfjarvis/lobsters/data/ApiRepository.kt +++ b/desktop/src/main/kotlin/dev/msfjarvis/lobsters/data/ApiRepository.kt @@ -8,12 +8,12 @@ import retrofit2.converter.moshi.MoshiConverterFactory import retrofit2.create class ApiRepository { - private val moshi = Moshi.Builder() - .build() - private val retrofit = Retrofit.Builder() - .baseUrl(LobstersApi.BASE_URL) - .addConverterFactory(MoshiConverterFactory.create(moshi)) - .build() + private val moshi = Moshi.Builder().build() + private val retrofit = + Retrofit.Builder() + .baseUrl(LobstersApi.BASE_URL) + .addConverterFactory(MoshiConverterFactory.create(moshi)) + .build() private val api: LobstersApi = retrofit.create() suspend fun loadPosts(pageNumber: Int): List { diff --git a/desktop/src/main/kotlin/dev/msfjarvis/lobsters/ui/LobstersItem.kt b/desktop/src/main/kotlin/dev/msfjarvis/lobsters/ui/LobstersItem.kt index a516c906..aa744d7d 100644 --- a/desktop/src/main/kotlin/dev/msfjarvis/lobsters/ui/LobstersItem.kt +++ b/desktop/src/main/kotlin/dev/msfjarvis/lobsters/ui/LobstersItem.kt @@ -29,16 +29,11 @@ fun LobstersItem( post: SavedPost, ) { Surface( - modifier = Modifier - .fillMaxWidth() - .clickable { - UrlLauncher.launch(post.url) - } - .wrapContentHeight(), + modifier = + Modifier.fillMaxWidth().clickable { UrlLauncher.launch(post.url) }.wrapContentHeight(), ) { Row( - modifier = Modifier - .padding(start = 12.dp, end = 24.dp), + modifier = Modifier.padding(start = 12.dp, end = 24.dp), verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.SpaceBetween, ) { @@ -49,26 +44,21 @@ fun LobstersItem( text = post.title, color = titleColor, fontWeight = FontWeight.Bold, - modifier = Modifier - .padding(top = 4.dp), + modifier = Modifier.padding(top = 4.dp), ) TagRow( tags = post.tags, - modifier = Modifier - .padding(top = 8.dp, bottom = 8.dp, end = 16.dp), + modifier = Modifier.padding(top = 8.dp, bottom = 8.dp, end = 16.dp), ) Row { KamelImage( resource = lazyImageResource(data = URI(post.submitterAvatarUrl)), contentDescription = "${post.submitterName}'s avatar", - modifier = Modifier - .requiredWidth(30.dp) - .padding(4.dp), + modifier = Modifier.requiredWidth(30.dp).padding(4.dp), ) Text( text = "Submitted by ${post.submitterName}", - modifier = Modifier - .padding(4.dp), + modifier = Modifier.padding(4.dp), ) } } @@ -87,9 +77,9 @@ fun TagRow( tags.forEach { tag -> Text( text = tag, - modifier = Modifier - .background(Color(0xFFFFFCD7), RoundedCornerShape(8.dp)) - .padding(horizontal = 8.dp), + modifier = + Modifier.background(Color(0xFFFFFCD7), RoundedCornerShape(8.dp)) + .padding(horizontal = 8.dp), color = Color.DarkGray, ) } diff --git a/desktop/src/main/kotlin/dev/msfjarvis/lobsters/ui/Main.kt b/desktop/src/main/kotlin/dev/msfjarvis/lobsters/ui/Main.kt index c53c3302..d0865822 100644 --- a/desktop/src/main/kotlin/dev/msfjarvis/lobsters/ui/Main.kt +++ b/desktop/src/main/kotlin/dev/msfjarvis/lobsters/ui/Main.kt @@ -1,4 +1,5 @@ @file:JvmName("Main") + package dev.msfjarvis.lobsters.ui import androidx.compose.desktop.Window @@ -12,15 +13,15 @@ import androidx.compose.foundation.rememberScrollbarAdapter import androidx.compose.foundation.verticalScroll import androidx.compose.material.Text import androidx.compose.runtime.CompositionLocalProvider +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import dev.msfjarvis.lobsters.data.local.SavedPost -import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.setValue import dev.msfjarvis.lobsters.data.ApiRepository +import dev.msfjarvis.lobsters.data.local.SavedPost import dev.msfjarvis.lobsters.model.LobstersPost import dev.msfjarvis.lobsters.ui.urllauncher.LocalUrlLauncher import dev.msfjarvis.lobsters.ui.urllauncher.UrlLauncher @@ -31,44 +32,37 @@ import kotlinx.coroutines.withContext val repository = ApiRepository() @OptIn(ExperimentalStdlibApi::class) -fun main() = Window(title = "Claw for lobste.rs") { - val urlLauncher = UrlLauncher() - val coroutineScope = rememberCoroutineScope() - var items by remember { mutableStateOf(emptyList()) } - coroutineScope.launch { - withContext(Dispatchers.IO) { - items = repository.loadPosts(0).map(::toDbModel) +fun main() = + Window(title = "Claw for lobste.rs") { + val urlLauncher = UrlLauncher() + val coroutineScope = rememberCoroutineScope() + var items by remember { mutableStateOf(emptyList()) } + coroutineScope.launch { + withContext(Dispatchers.IO) { items = repository.loadPosts(0).map(::toDbModel) } } - } - LobstersTheme { - Box( - modifier = Modifier.fillMaxSize(), - ) { - val stateVertical = rememberScrollState(0) + LobstersTheme { Box( - modifier = Modifier - .fillMaxSize() - .verticalScroll(stateVertical), + modifier = Modifier.fillMaxSize(), ) { - if (items.isEmpty()) { - Text("Loading...") - } else { - CompositionLocalProvider(LocalUrlLauncher provides urlLauncher) { - Column { - items.forEach { - LobstersItem(it) - } + val stateVertical = rememberScrollState(0) + Box( + modifier = Modifier.fillMaxSize().verticalScroll(stateVertical), + ) { + if (items.isEmpty()) { + Text("Loading...") + } else { + CompositionLocalProvider(LocalUrlLauncher provides urlLauncher) { + Column { items.forEach { LobstersItem(it) } } } } } + VerticalScrollbar( + modifier = Modifier.align(Alignment.CenterEnd).fillMaxHeight(), + adapter = rememberScrollbarAdapter(stateVertical), + ) } - VerticalScrollbar( - modifier = Modifier.align(Alignment.CenterEnd).fillMaxHeight(), - adapter = rememberScrollbarAdapter(stateVertical), - ) } } -} fun toDbModel(post: LobstersPost): SavedPost { return SavedPost( diff --git a/desktop/src/main/kotlin/dev/msfjarvis/lobsters/ui/Theme.kt b/desktop/src/main/kotlin/dev/msfjarvis/lobsters/ui/Theme.kt index c01aa69c..47234935 100644 --- a/desktop/src/main/kotlin/dev/msfjarvis/lobsters/ui/Theme.kt +++ b/desktop/src/main/kotlin/dev/msfjarvis/lobsters/ui/Theme.kt @@ -1,4 +1,5 @@ @file:Suppress("UNUSED") + package dev.msfjarvis.lobsters.ui import androidx.compose.material.MaterialTheme @@ -9,33 +10,32 @@ import androidx.compose.ui.graphics.Color val titleColor = Color(0xFF7395D9) -val lightColors = lightColors( - primary = Color.White, - secondary = Color(0xFF6C0000), - background = Color.White, - surface = Color.White, - onPrimary = Color.DarkGray, - onSecondary = Color.White, - onBackground = Color.White, - onSurface = Color.White, -) +val lightColors = + lightColors( + primary = Color.White, + secondary = Color(0xFF6C0000), + background = Color.White, + surface = Color.White, + onPrimary = Color.DarkGray, + onSecondary = Color.White, + onBackground = Color.White, + onSurface = Color.White, + ) -val darkColors = darkColors( - primary = Color.White, - secondary = Color(0xFF6C0000), - background = Color.Black, - surface = Color.Black, - onPrimary = Color.Black, - onSecondary = Color.White, - onBackground = Color.White, - onSurface = Color.White, -) +val darkColors = + darkColors( + primary = Color.White, + secondary = Color(0xFF6C0000), + background = Color.Black, + surface = Color.Black, + onPrimary = Color.Black, + onSecondary = Color.White, + onBackground = Color.White, + onSurface = Color.White, + ) @Composable -fun LobstersTheme( - useLightColors: Boolean = true, - children: @Composable () -> Unit -) { +fun LobstersTheme(useLightColors: Boolean = true, children: @Composable () -> Unit) { MaterialTheme( colors = if (useLightColors) lightColors else darkColors, content = children, diff --git a/settings.gradle.kts b/settings.gradle.kts index f149a702..9fcbcff4 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,5 +1,7 @@ rootProject.name = "Claw" + include(":app", ":api", ":common", ":database", ":desktop") + pluginManagement { repositories { google()