From 8060c347cc46cf7a0f4b8c70cd1da1453db1059e Mon Sep 17 00:00:00 2001 From: Harsh Shandilya Date: Wed, 5 Oct 2022 12:16:02 +0530 Subject: [PATCH] refactor(android): resolve Detekt-reported issues --- .../dev/msfjarvis/claw/android/ClawApplication.kt | 9 +++++++-- .../dev/msfjarvis/claw/android/MainActivity.kt | 12 ++++++++++-- .../android/injection/CoroutineDispatcherModule.kt | 4 ++-- .../claw/android/injection/OkHttpModule.kt | 12 +++++++----- .../claw/android/paging/LobstersPagingSource.kt | 1 + .../dev/msfjarvis/claw/android/ui/LobstersApp.kt | 3 ++- detekt-baselines/android.xml | 14 +------------- 7 files changed, 30 insertions(+), 25 deletions(-) diff --git a/android/src/main/kotlin/dev/msfjarvis/claw/android/ClawApplication.kt b/android/src/main/kotlin/dev/msfjarvis/claw/android/ClawApplication.kt index 566e5301..43ebe7b1 100644 --- a/android/src/main/kotlin/dev/msfjarvis/claw/android/ClawApplication.kt +++ b/android/src/main/kotlin/dev/msfjarvis/claw/android/ClawApplication.kt @@ -34,15 +34,20 @@ class ClawApplication : Application(), Configuration.Provider, ImageLoaderFactor override fun newImageLoader(): ImageLoader { return ImageLoader.Builder(this) - .memoryCache { MemoryCache.Builder(this).maxSizePercent(0.25).build() } + .memoryCache { MemoryCache.Builder(this).maxSizePercent(MEMORY_CACHE_RATIO).build() } .diskCache { DiskCache.Builder() .directory(cacheDir.resolve("image_cache")) - .maxSizeBytes(25L * 1024 * 1024) // 25 MB + .maxSizeBytes(DISK_CACHE_MAX_SIZE) .build() } // Show a short crossfade when loading images asynchronously. .crossfade(true) .build() } + + private companion object { + private const val MEMORY_CACHE_RATIO = 0.25 + private const val DISK_CACHE_MAX_SIZE = 25L * 1024 * 1024 // 25 MB + } } diff --git a/android/src/main/kotlin/dev/msfjarvis/claw/android/MainActivity.kt b/android/src/main/kotlin/dev/msfjarvis/claw/android/MainActivity.kt index 8614816b..2c98f16f 100644 --- a/android/src/main/kotlin/dev/msfjarvis/claw/android/MainActivity.kt +++ b/android/src/main/kotlin/dev/msfjarvis/claw/android/MainActivity.kt @@ -30,10 +30,14 @@ class MainActivity : ComponentActivity() { super.onCreate(savedInstanceState) installSplashScreen() setContent { - LobstersApp(urlLauncher = urlLauncher, htmlConverter = htmlConverter) { url -> webUri = url } + LobstersApp( + urlLauncher = urlLauncher, + htmlConverter = htmlConverter, + setWebUri = { url -> webUri = url }, + ) } val postUpdateWorkRequest = - PeriodicWorkRequestBuilder(24, TimeUnit.HOURS) + PeriodicWorkRequestBuilder(POST_REFRESH_PERIOD, TimeUnit.HOURS) .setConstraints( Constraints.Builder() .setRequiresCharging(false) @@ -61,4 +65,8 @@ class MainActivity : ComponentActivity() { } } } + + private companion object { + private const val POST_REFRESH_PERIOD = 24L // 24 hours + } } diff --git a/android/src/main/kotlin/dev/msfjarvis/claw/android/injection/CoroutineDispatcherModule.kt b/android/src/main/kotlin/dev/msfjarvis/claw/android/injection/CoroutineDispatcherModule.kt index 9851c7fe..0cbc1145 100644 --- a/android/src/main/kotlin/dev/msfjarvis/claw/android/injection/CoroutineDispatcherModule.kt +++ b/android/src/main/kotlin/dev/msfjarvis/claw/android/injection/CoroutineDispatcherModule.kt @@ -11,9 +11,9 @@ import kotlinx.coroutines.CoroutineDispatcher @Module @InstallIn(SingletonComponent::class) -abstract class CoroutineDispatcherModule { +interface CoroutineDispatcherModule { - @Binds abstract fun DefaultDispatcherProvider.bind(): DispatcherProvider + @Binds fun DefaultDispatcherProvider.bind(): DispatcherProvider companion object { @[Provides IODispatcher] diff --git a/android/src/main/kotlin/dev/msfjarvis/claw/android/injection/OkHttpModule.kt b/android/src/main/kotlin/dev/msfjarvis/claw/android/injection/OkHttpModule.kt index caf5bb02..9e10f33b 100644 --- a/android/src/main/kotlin/dev/msfjarvis/claw/android/injection/OkHttpModule.kt +++ b/android/src/main/kotlin/dev/msfjarvis/claw/android/injection/OkHttpModule.kt @@ -21,24 +21,26 @@ import okhttp3.logging.HttpLoggingInterceptor @Module @InstallIn(SingletonComponent::class) -abstract class OkHttpModule { +interface OkHttpModule { - @Binds abstract fun NapierLogger.bindLogger(): HttpLoggingInterceptor.Logger + @Binds fun NapierLogger.bindLogger(): HttpLoggingInterceptor.Logger - @Binds @IntoSet abstract fun UserAgentInterceptor.bindUAInterceptor(): Interceptor + @Binds @IntoSet fun UserAgentInterceptor.bindUAInterceptor(): Interceptor companion object { + private const val CACHE_SIZE_MB = 10L * 1024 * 1024 + private const val THREAD_STATS_TAG = 0x000090000 @Provides fun provideCache(@ApplicationContext context: Context): Cache { - return Cache(context.cacheDir, 10 * 1024 * 1024) + return Cache(context.cacheDir, CACHE_SIZE_MB) } @Provides fun provideSocketFactory(): SocketFactory { return object : DelegatingSocketFactory(getDefault()) { override fun configureSocket(socket: Socket): Socket { - TrafficStats.setThreadStatsTag(0x000090000) + TrafficStats.setThreadStatsTag(THREAD_STATS_TAG) return super.configureSocket(socket) } } diff --git a/android/src/main/kotlin/dev/msfjarvis/claw/android/paging/LobstersPagingSource.kt b/android/src/main/kotlin/dev/msfjarvis/claw/android/paging/LobstersPagingSource.kt index 92d6f7df..e68d8d69 100644 --- a/android/src/main/kotlin/dev/msfjarvis/claw/android/paging/LobstersPagingSource.kt +++ b/android/src/main/kotlin/dev/msfjarvis/claw/android/paging/LobstersPagingSource.kt @@ -17,6 +17,7 @@ constructor( @IODispatcher private val ioDispatcher: CoroutineDispatcher, ) : PagingSource() { + @Suppress("TooGenericExceptionCaught") // Intentional override suspend fun load(params: LoadParams): LoadResult { return try { val page = params.key ?: 1 diff --git a/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/LobstersApp.kt b/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/LobstersApp.kt index 5a42c800..b885b114 100644 --- a/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/LobstersApp.kt +++ b/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/LobstersApp.kt @@ -49,13 +49,14 @@ import soup.compose.material.motion.navigation.MaterialMotionNavHost import soup.compose.material.motion.navigation.composable import soup.compose.material.motion.navigation.rememberMaterialMotionNavController +@Suppress("ModifierMissing") // Top-level composable, will never have a modifier supplied. @OptIn(ExperimentalMaterial3Api::class, ExperimentalAnimationApi::class) @Composable fun LobstersApp( - viewModel: ClawViewModel = viewModel(), urlLauncher: UrlLauncher, htmlConverter: HTMLConverter, setWebUri: (String?) -> Unit, + viewModel: ClawViewModel = viewModel(), ) { val systemUiController = rememberSystemUiController() val hottestListState = rememberLazyListState() diff --git a/detekt-baselines/android.xml b/detekt-baselines/android.xml index 94bd0100..e6702a3c 100644 --- a/detekt-baselines/android.xml +++ b/detekt-baselines/android.xml @@ -2,19 +2,7 @@ - ComposableParamOrder:LobstersApp.kt$LobstersApp - LongMethod:LobstersApp.kt$@OptIn(ExperimentalMaterial3Api::class, ExperimentalAnimationApi::class) @Composable fun LobstersApp( viewModel: ClawViewModel = viewModel(), urlLauncher: UrlLauncher, htmlConverter: HTMLConverter, setWebUri: (String?) -> Unit, ) + LongMethod:LobstersApp.kt$@Suppress("ModifierMissing") // Top-level composable, will never have a modifier supplied. @OptIn(ExperimentalMaterial3Api::class, ExperimentalAnimationApi::class) @Composable fun LobstersApp( urlLauncher: UrlLauncher, htmlConverter: HTMLConverter, setWebUri: (String?) -> Unit, viewModel: ClawViewModel = viewModel(), ) LongParameterList:NetworkPosts.kt$( items: LazyPagingItems<LobstersPost>, listState: LazyListState, isPostSaved: suspend (SavedPost) -> Boolean, reloadPosts: () -> Unit, postActions: PostActions, modifier: Modifier = Modifier, ) - MagicNumber:ClawApplication.kt$ClawApplication$0.25 - MagicNumber:ClawApplication.kt$ClawApplication$1024 - MagicNumber:ClawApplication.kt$ClawApplication$25L - MagicNumber:MainActivity.kt$MainActivity$24 - MagicNumber:OkHttpModule.kt$OkHttpModule.Companion$10 - MagicNumber:OkHttpModule.kt$OkHttpModule.Companion$1024 - MagicNumber:OkHttpModule.kt$OkHttpModule.Companion.<no name provided>$0x000090000 - ModifierMissing:LobstersApp.kt$LobstersApp - TooGenericExceptionCaught:LobstersPagingSource.kt$LobstersPagingSource$e: Exception - UnnecessaryAbstractClass:CoroutineDispatcherModule.kt$CoroutineDispatcherModule$CoroutineDispatcherModule - UnnecessaryAbstractClass:OkHttpModule.kt$OkHttpModule$OkHttpModule