diff --git a/.editorconfig b/.editorconfig deleted file mode 100644 index b0d1aac5..00000000 --- a/.editorconfig +++ /dev/null @@ -1,4 +0,0 @@ -root = true - -[{*.kt,*.kts}] -ktlint_code_style = android \ No newline at end of file diff --git a/.github/workflows/github-actions.yml b/.github/workflows/github-actions.yml index 30d46986..4004eba6 100644 --- a/.github/workflows/github-actions.yml +++ b/.github/workflows/github-actions.yml @@ -1,4 +1,4 @@ -name: Build and Test +name: Verify on: pull_request: diff --git a/app/src/main/java/com/monstarlab/core/extensions/FlowExtensions.kt b/app/src/main/java/com/monstarlab/core/extensions/FlowExtensions.kt index e313c2f9..5f336584 100644 --- a/app/src/main/java/com/monstarlab/core/extensions/FlowExtensions.kt +++ b/app/src/main/java/com/monstarlab/core/extensions/FlowExtensions.kt @@ -1,9 +1,9 @@ package com.monstarlab.core.extensions +import kotlin.time.Duration import kotlinx.coroutines.delay import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.flow -import kotlin.time.Duration fun tickerFlow(interval: Duration, initialDelay: Duration = Duration.ZERO): Flow { return flow { diff --git a/app/src/main/java/com/monstarlab/core/network/OkHttpModule.kt b/app/src/main/java/com/monstarlab/core/network/OkHttpModule.kt index bed89fd4..e36825a6 100644 --- a/app/src/main/java/com/monstarlab/core/network/OkHttpModule.kt +++ b/app/src/main/java/com/monstarlab/core/network/OkHttpModule.kt @@ -10,14 +10,14 @@ import dagger.Provides import dagger.hilt.InstallIn import dagger.hilt.android.qualifiers.ApplicationContext import dagger.hilt.components.SingletonComponent -import kotlinx.serialization.ExperimentalSerializationApi -import kotlinx.serialization.json.Json import okhttp3.MediaType.Companion.toMediaType import okhttp3.OkHttpClient import okhttp3.logging.HttpLoggingInterceptor import retrofit2.Retrofit import java.util.concurrent.TimeUnit import javax.inject.Singleton +import kotlinx.serialization.ExperimentalSerializationApi +import kotlinx.serialization.json.Json @InstallIn(SingletonComponent::class) @Module @@ -52,7 +52,7 @@ class OkHttpModule { .client(client) .baseUrl(BuildConfig.API_URL) .addConverterFactory( - json.asConverterFactory("application/json".toMediaType()) + json.asConverterFactory("application/json".toMediaType()), ) .build() } diff --git a/app/src/main/java/com/monstarlab/core/network/errorhandling/ApiErrorInterceptor.kt b/app/src/main/java/com/monstarlab/core/network/errorhandling/ApiErrorInterceptor.kt index d55c2575..53a99ed8 100644 --- a/app/src/main/java/com/monstarlab/core/network/errorhandling/ApiErrorInterceptor.kt +++ b/app/src/main/java/com/monstarlab/core/network/errorhandling/ApiErrorInterceptor.kt @@ -1,13 +1,13 @@ package com.monstarlab.core.network.errorhandling -import kotlinx.serialization.decodeFromString -import kotlinx.serialization.json.Json import okhttp3.Interceptor import okhttp3.MediaType.Companion.toMediaType import okhttp3.Response import okhttp3.ResponseBody.Companion.toResponseBody import timber.log.Timber import javax.inject.Inject +import kotlinx.serialization.decodeFromString +import kotlinx.serialization.json.Json /** * Intercepts API errors and converts them into [ApiException] by decoding the Error response body diff --git a/app/src/main/java/com/monstarlab/core/persistence/SingleSharedPreferenceDataStore.kt b/app/src/main/java/com/monstarlab/core/persistence/SingleSharedPreferenceDataStore.kt index 5cba9ee9..1259a801 100644 --- a/app/src/main/java/com/monstarlab/core/persistence/SingleSharedPreferenceDataStore.kt +++ b/app/src/main/java/com/monstarlab/core/persistence/SingleSharedPreferenceDataStore.kt @@ -4,12 +4,12 @@ import androidx.datastore.core.DataStore import androidx.datastore.preferences.core.Preferences import androidx.datastore.preferences.core.edit import androidx.datastore.preferences.core.stringPreferencesKey +import timber.log.Timber import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.map import kotlinx.serialization.KSerializer import kotlinx.serialization.SerializationException import kotlinx.serialization.json.Json -import timber.log.Timber abstract class SingleSharedPreferenceDataStore constructor( private val dataStore: DataStore, diff --git a/app/src/main/java/com/monstarlab/core/persistence/injection/DataStoreModule.kt b/app/src/main/java/com/monstarlab/core/persistence/injection/DataStoreModule.kt index 48e121c5..80b30b49 100644 --- a/app/src/main/java/com/monstarlab/core/persistence/injection/DataStoreModule.kt +++ b/app/src/main/java/com/monstarlab/core/persistence/injection/DataStoreModule.kt @@ -22,10 +22,10 @@ class DataStoreModule { listOf( SharedPreferencesMigration( context, - "preferences" - ) + "preferences", + ), ) - } + }, ) @Singleton diff --git a/app/src/main/java/com/monstarlab/core/ui/ComposeFragment.kt b/app/src/main/java/com/monstarlab/core/ui/ComposeFragment.kt index 1d2f6d3c..25c2247f 100644 --- a/app/src/main/java/com/monstarlab/core/ui/ComposeFragment.kt +++ b/app/src/main/java/com/monstarlab/core/ui/ComposeFragment.kt @@ -21,7 +21,7 @@ abstract class ComposeFragment : Fragment() { return ComposeView(requireContext()).apply { setContent { setViewCompositionStrategy( - ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed + ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed, ) content.invoke() } diff --git a/app/src/main/java/com/monstarlab/core/ui/extensions/ContextExtensions.kt b/app/src/main/java/com/monstarlab/core/ui/extensions/ContextExtensions.kt index e17148bd..727a73e4 100644 --- a/app/src/main/java/com/monstarlab/core/ui/extensions/ContextExtensions.kt +++ b/app/src/main/java/com/monstarlab/core/ui/extensions/ContextExtensions.kt @@ -42,11 +42,7 @@ fun Context.checkPermission(permission: String): Boolean { PackageManager.PERMISSION_GRANTED } -fun Context.openShareSheet( - title: String, - message: String, - intentTitle: String = title, -) { +fun Context.openShareSheet(title: String, message: String, intentTitle: String = title) { val shareIntent = Intent().apply { action = Intent.ACTION_SEND putExtra(Intent.EXTRA_TITLE, title) @@ -64,6 +60,6 @@ fun Context.openBrowser(url: String) { startActivity( Intent(Intent.ACTION_VIEW).apply { data = url.toUri() - } + }, ) } diff --git a/app/src/main/java/com/monstarlab/core/ui/extensions/LazyLayoutExtensions.kt b/app/src/main/java/com/monstarlab/core/ui/extensions/LazyLayoutExtensions.kt index 520d4c79..59471014 100644 --- a/app/src/main/java/com/monstarlab/core/ui/extensions/LazyLayoutExtensions.kt +++ b/app/src/main/java/com/monstarlab/core/ui/extensions/LazyLayoutExtensions.kt @@ -26,9 +26,9 @@ fun LazyListScope.animatedVisibilityItem( visible = visible, enter = enter, exit = exit, - content = { content.invoke() } + content = { content.invoke() }, ) - } + }, ) } @@ -49,8 +49,8 @@ fun LazyListScope.animatedVisibilityHeader( visible = visible, enter = enter, exit = exit, - content = { content.invoke() } + content = { content.invoke() }, ) - } + }, ) } diff --git a/app/src/main/java/com/monstarlab/core/ui/layout/ColumnWithSeparators.kt b/app/src/main/java/com/monstarlab/core/ui/layout/ColumnWithSeparators.kt index 1f27910e..74a0f928 100644 --- a/app/src/main/java/com/monstarlab/core/ui/layout/ColumnWithSeparators.kt +++ b/app/src/main/java/com/monstarlab/core/ui/layout/ColumnWithSeparators.kt @@ -48,7 +48,7 @@ private data class ContentChild(val height: Int) @Preview(name = "Column With Separators", showBackground = true) @Composable private fun PreviewColumnWithSeparators() { - ColumnWithSeparators() { + ColumnWithSeparators { repeat(10) { Text(text = "Hello $it") } } } diff --git a/app/src/main/java/com/monstarlab/core/ui/previews/LightDarkPreview.kt b/app/src/main/java/com/monstarlab/core/ui/previews/LightDarkPreview.kt index 57fb17d7..6bfd87cc 100644 --- a/app/src/main/java/com/monstarlab/core/ui/previews/LightDarkPreview.kt +++ b/app/src/main/java/com/monstarlab/core/ui/previews/LightDarkPreview.kt @@ -7,12 +7,12 @@ import androidx.compose.ui.tooling.preview.Preview name = "Light", group = "Theme", showBackground = true, - uiMode = Configuration.UI_MODE_NIGHT_NO or Configuration.UI_MODE_TYPE_NORMAL + uiMode = Configuration.UI_MODE_NIGHT_NO or Configuration.UI_MODE_TYPE_NORMAL, ) @Preview( name = "Dark", group = "Theme", showBackground = true, - uiMode = Configuration.UI_MODE_NIGHT_YES or Configuration.UI_MODE_TYPE_NORMAL + uiMode = Configuration.UI_MODE_NIGHT_YES or Configuration.UI_MODE_TYPE_NORMAL, ) annotation class LightDarkPreview diff --git a/app/src/main/java/com/monstarlab/designsystem/components/AppTopBar.kt b/app/src/main/java/com/monstarlab/designsystem/components/AppTopBar.kt index 658f1fad..22ba4581 100644 --- a/app/src/main/java/com/monstarlab/designsystem/components/AppTopBar.kt +++ b/app/src/main/java/com/monstarlab/designsystem/components/AppTopBar.kt @@ -17,25 +17,25 @@ import com.monstarlab.designsystem.theme.Theme fun AppTopBar( title: String, modifier: Modifier = Modifier, - onBackButtonClick: (() -> Unit)? = null + onBackButtonClick: (() -> Unit)? = null, ) { TopAppBar( modifier = modifier, backgroundColor = Theme.colors.primary, - contentColor = Theme.colors.onPrimary + contentColor = Theme.colors.onPrimary, ) { onBackButtonClick?.let { onBackClick -> IconButton(onClick = onBackClick) { Icon( imageVector = Icons.Default.ArrowBack, - contentDescription = "back" + contentDescription = "back", ) } } Text( text = title, - style = Theme.typography.headline2.bold + style = Theme.typography.headline2.bold, ) } } @@ -54,7 +54,7 @@ private fun PreviewAppTopBarWithBackButton() { AppTheme { AppTopBar( title = "Top Bar", - onBackButtonClick = { } + onBackButtonClick = { }, ) } } diff --git a/app/src/main/java/com/monstarlab/designsystem/components/appbutton/AppButton.kt b/app/src/main/java/com/monstarlab/designsystem/components/appbutton/AppButton.kt index 409547d5..9b274b9c 100644 --- a/app/src/main/java/com/monstarlab/designsystem/components/appbutton/AppButton.kt +++ b/app/src/main/java/com/monstarlab/designsystem/components/appbutton/AppButton.kt @@ -27,14 +27,14 @@ fun AppButton( enabled: Boolean = true, isLoading: Boolean = false, type: AppButtonType = AppButtonType.Filled, - onClick: () -> Unit + onClick: () -> Unit, ) { when (type) { AppButtonType.Filled -> PrimaryButton( modifier = modifier, onClick = onClick, enabled = enabled && !isLoading, - content = { ButtonContent(text = text, isLoading = isLoading) } + content = { ButtonContent(text = text, isLoading = isLoading) }, ) AppButtonType.Outlined -> OutlinedButton( @@ -44,9 +44,9 @@ fun AppButton( content = { ButtonContent(text = text, isLoading = isLoading) }, colors = ButtonDefaults.outlinedButtonColors( contentColor = Theme.colors.secondary, - backgroundColor = Color.Transparent + backgroundColor = Color.Transparent, ), - border = BorderStroke(1.dp, Theme.colors.secondary) + border = BorderStroke(1.dp, Theme.colors.secondary), ) AppButtonType.Text -> { @@ -56,7 +56,7 @@ fun AppButton( enabled = enabled && !isLoading, content = { ButtonContent(text = text, isLoading = isLoading) - } + }, ) } } @@ -67,7 +67,7 @@ private fun PrimaryButton( modifier: Modifier = Modifier, onClick: () -> Unit = {}, enabled: Boolean = false, - content: @Composable RowScope.() -> Unit + content: @Composable RowScope.() -> Unit, ) { val colors = ButtonDefaults.buttonColors() Button( @@ -76,7 +76,7 @@ private fun PrimaryButton( enabled = enabled, content = content, colors = colors, - contentPadding = PaddingValues(vertical = Theme.dimensions.medium2) + contentPadding = PaddingValues(vertical = Theme.dimensions.medium2), ) } @@ -87,12 +87,12 @@ private fun RowScope.ButtonContent(text: String, isLoading: Boolean) { CircularProgressIndicator( color = Theme.colors.primary, modifier = Modifier.size(24.dp), - strokeWidth = 1.dp + strokeWidth = 1.dp, ) } else { Text( text = text, - style = Theme.typography.button + style = Theme.typography.button, ) } } @@ -105,7 +105,7 @@ private fun PreviewButtonPrimary() { AppButton( text = "Primary", onClick = {}, - modifier = Modifier.fillMaxWidth() + modifier = Modifier.fillMaxWidth(), ) } } @@ -118,7 +118,7 @@ private fun PreviewButtonPrimaryWithLoading() { text = "Primary", onClick = {}, isLoading = true, - modifier = Modifier.fillMaxWidth() + modifier = Modifier.fillMaxWidth(), ) } } diff --git a/app/src/main/java/com/monstarlab/designsystem/components/appbutton/AppButtonType.kt b/app/src/main/java/com/monstarlab/designsystem/components/appbutton/AppButtonType.kt index edabd5f8..5effe0a9 100644 --- a/app/src/main/java/com/monstarlab/designsystem/components/appbutton/AppButtonType.kt +++ b/app/src/main/java/com/monstarlab/designsystem/components/appbutton/AppButtonType.kt @@ -1,5 +1,7 @@ package com.monstarlab.designsystem.components.appbutton enum class AppButtonType { - Filled, Outlined, Text + Filled, + Outlined, + Text, } diff --git a/app/src/main/java/com/monstarlab/designsystem/components/apptextfield/AppTextField.kt b/app/src/main/java/com/monstarlab/designsystem/components/apptextfield/AppTextField.kt index 535d1eb9..bd1318de 100644 --- a/app/src/main/java/com/monstarlab/designsystem/components/apptextfield/AppTextField.kt +++ b/app/src/main/java/com/monstarlab/designsystem/components/apptextfield/AppTextField.kt @@ -36,7 +36,7 @@ fun AppTextField( maxLines: Int = Int.MAX_VALUE, interactionSource: MutableInteractionSource = remember { MutableInteractionSource() }, trailingIcon: @Composable (() -> Unit)? = null, - leadingIcon: @Composable (() -> Unit)? = null + leadingIcon: @Composable (() -> Unit)? = null, ) { Column { OutlinedTextField( @@ -55,13 +55,13 @@ fun AppTextField( leadingIcon = leadingIcon, label = { Text(text = label) }, placeholder = { Text(text = placeholder) }, - isError = error != null + isError = error != null, ) AnimatedVisibility(visible = error != null) { Text( text = error ?: "", - color = Theme.colors.error + color = Theme.colors.error, ) } } @@ -78,7 +78,7 @@ private fun PreviewTextField() { onValueChange = { value = it }, placeholder = "Placeholder", label = "Label", - error = if (value == "error") "This is error" else null + error = if (value == "error") "This is error" else null, ) } } diff --git a/app/src/main/java/com/monstarlab/designsystem/theme/AppTheme.kt b/app/src/main/java/com/monstarlab/designsystem/theme/AppTheme.kt index eab8ddf1..78a7498b 100644 --- a/app/src/main/java/com/monstarlab/designsystem/theme/AppTheme.kt +++ b/app/src/main/java/com/monstarlab/designsystem/theme/AppTheme.kt @@ -33,7 +33,7 @@ fun AppTheme( typography = Typography, shapes = Shapes, content = content, - colors = if (isDarkMode) DarkColors else LightColors + colors = if (isDarkMode) DarkColors else LightColors, ) } } @@ -58,7 +58,7 @@ private val LightColors = lightColors( onBackground = DarkGrey, onSurface = Black, surface = White, - error = Red + error = Red, ) private val DarkColors = darkColors( @@ -68,7 +68,7 @@ private val DarkColors = darkColors( onBackground = White, onSurface = White, surface = Black, - error = Red + error = Red, ) @Composable diff --git a/app/src/main/java/com/monstarlab/designsystem/theme/Shapes.kt b/app/src/main/java/com/monstarlab/designsystem/theme/Shapes.kt index 0000c13e..61bf1475 100644 --- a/app/src/main/java/com/monstarlab/designsystem/theme/Shapes.kt +++ b/app/src/main/java/com/monstarlab/designsystem/theme/Shapes.kt @@ -7,5 +7,5 @@ import androidx.compose.ui.unit.dp val Shapes = Shapes( small = RoundedCornerShape(4.dp), medium = RoundedCornerShape(8.dp), - large = RoundedCornerShape(32.dp) + large = RoundedCornerShape(32.dp), ) diff --git a/app/src/main/java/com/monstarlab/designsystem/theme/dimensions/Dimensions.kt b/app/src/main/java/com/monstarlab/designsystem/theme/dimensions/Dimensions.kt index d0e2b33f..169ade2d 100644 --- a/app/src/main/java/com/monstarlab/designsystem/theme/dimensions/Dimensions.kt +++ b/app/src/main/java/com/monstarlab/designsystem/theme/dimensions/Dimensions.kt @@ -20,7 +20,7 @@ class Dimensions( medium2 = 9.dp, medium3 = 6.dp, big1 = 18.dp, - big2 = 16.dp + big2 = 16.dp, ) val Default = Dimensions( @@ -28,7 +28,7 @@ class Dimensions( medium2 = 12.dp, medium3 = 8.dp, big1 = 24.dp, - big2 = 32.dp + big2 = 32.dp, ) } } diff --git a/app/src/main/java/com/monstarlab/designsystem/theme/dimensions/DimensionsProvider.kt b/app/src/main/java/com/monstarlab/designsystem/theme/dimensions/DimensionsProvider.kt index 4b168c57..c67bc0b0 100644 --- a/app/src/main/java/com/monstarlab/designsystem/theme/dimensions/DimensionsProvider.kt +++ b/app/src/main/java/com/monstarlab/designsystem/theme/dimensions/DimensionsProvider.kt @@ -9,10 +9,7 @@ val LocalDimensions = staticCompositionLocalOf { } @Composable -fun ProvideDimensions( - dimensions: Dimensions, - content: @Composable () -> Unit, -) { +fun ProvideDimensions(dimensions: Dimensions, content: @Composable () -> Unit) { CompositionLocalProvider(LocalDimensions provides dimensions) { content.invoke() } diff --git a/app/src/main/java/com/monstarlab/designsystem/theme/typography/AppTypography.kt b/app/src/main/java/com/monstarlab/designsystem/theme/typography/AppTypography.kt index e1ccd7b9..37f022ba 100644 --- a/app/src/main/java/com/monstarlab/designsystem/theme/typography/AppTypography.kt +++ b/app/src/main/java/com/monstarlab/designsystem/theme/typography/AppTypography.kt @@ -23,6 +23,6 @@ data class AppTypography( headline2 = typography.h2, body1 = typography.body1, body2 = typography.body2, - button = typography.button + button = typography.button, ) } diff --git a/app/src/main/java/com/monstarlab/designsystem/theme/typography/Typography.kt b/app/src/main/java/com/monstarlab/designsystem/theme/typography/Typography.kt index d86d920e..df002bf6 100644 --- a/app/src/main/java/com/monstarlab/designsystem/theme/typography/Typography.kt +++ b/app/src/main/java/com/monstarlab/designsystem/theme/typography/Typography.kt @@ -9,51 +9,51 @@ val Typography = Typography( defaultFontFamily = FontFamily, h1 = TextStyle( fontWeight = FontWeight.Bold, - fontSize = 34.sp + fontSize = 34.sp, ), h2 = TextStyle( fontWeight = FontWeight.Bold, fontSize = 28.sp, - lineHeight = 32.sp + lineHeight = 32.sp, ), h3 = TextStyle( fontWeight = FontWeight.Bold, - fontSize = 24.sp + fontSize = 24.sp, ), h5 = TextStyle( fontWeight = FontWeight.Bold, - fontSize = 20.sp + fontSize = 20.sp, ), h6 = TextStyle( fontWeight = FontWeight.Bold, - fontSize = 17.sp + fontSize = 17.sp, ), body1 = TextStyle( fontWeight = FontWeight.Normal, fontSize = 16.sp, - lineHeight = 21.sp + lineHeight = 21.sp, ), body2 = TextStyle( fontWeight = FontWeight.Normal, - fontSize = 14.sp + fontSize = 14.sp, ), button = TextStyle( fontWeight = FontWeight.Normal, - fontSize = 16.sp + fontSize = 16.sp, ), caption = TextStyle( fontWeight = FontWeight.Normal, - fontSize = 12.sp + fontSize = 12.sp, ), overline = TextStyle( fontWeight = FontWeight.Normal, - fontSize = 8.sp - ) + fontSize = 8.sp, + ), ) diff --git a/app/src/main/java/com/monstarlab/features/auth/data/repository/AuthRepositoryImpl.kt b/app/src/main/java/com/monstarlab/features/auth/data/repository/AuthRepositoryImpl.kt index faef9b4c..38431728 100644 --- a/app/src/main/java/com/monstarlab/features/auth/data/repository/AuthRepositoryImpl.kt +++ b/app/src/main/java/com/monstarlab/features/auth/data/repository/AuthRepositoryImpl.kt @@ -7,7 +7,7 @@ import com.monstarlab.features.auth.domain.repository.AuthRepository import javax.inject.Inject class AuthRepositoryImpl @Inject constructor( - private val api: AuthApi + private val api: AuthApi, ) : AuthRepository { override suspend fun login(email: String, password: String): AuthToken { diff --git a/app/src/main/java/com/monstarlab/features/login/ui/LoginCoordinator.kt b/app/src/main/java/com/monstarlab/features/login/ui/LoginCoordinator.kt index 46870ada..d6218dfb 100644 --- a/app/src/main/java/com/monstarlab/features/login/ui/LoginCoordinator.kt +++ b/app/src/main/java/com/monstarlab/features/login/ui/LoginCoordinator.kt @@ -29,7 +29,7 @@ class LoginCoordinator( navController.navigate( R.id.resourceFragment, navOptions = NavOptions.Builder().setPopUpTo(R.id.loginFragment, true).build(), - args = null + args = null, ) } .launchIn(scope) @@ -46,7 +46,7 @@ fun rememberLoginCoordinator( LoginCoordinator( viewModel = viewModel, navController = navController, - scope = scope + scope = scope, ) } } diff --git a/app/src/main/java/com/monstarlab/features/login/ui/LoginRoute.kt b/app/src/main/java/com/monstarlab/features/login/ui/LoginRoute.kt index 3595aa6f..4d2994bf 100644 --- a/app/src/main/java/com/monstarlab/features/login/ui/LoginRoute.kt +++ b/app/src/main/java/com/monstarlab/features/login/ui/LoginRoute.kt @@ -10,9 +10,7 @@ import com.monstarlab.core.ui.effects.SystemUISideEffect import com.monstarlab.designsystem.theme.AppTheme @Composable -fun LoginRoute( - coordinator: LoginCoordinator, -) { +fun LoginRoute(coordinator: LoginCoordinator) { // State observing and declarations val uiState by coordinator.screenStateFlow.collectAsStateWithLifecycle(LoginState()) @@ -36,7 +34,7 @@ fun rememberLoginActions(coordinator: LoginCoordinator): LoginActions { LoginActions( onEmailChange = coordinator.viewModel::onEmailChange, onLoginClick = coordinator.viewModel::login, - onPasswordChange = coordinator.viewModel::onPasswordChange + onPasswordChange = coordinator.viewModel::onPasswordChange, ) } } diff --git a/app/src/main/java/com/monstarlab/features/login/ui/LoginScreen.kt b/app/src/main/java/com/monstarlab/features/login/ui/LoginScreen.kt index 18db7d10..cefb7fcd 100644 --- a/app/src/main/java/com/monstarlab/features/login/ui/LoginScreen.kt +++ b/app/src/main/java/com/monstarlab/features/login/ui/LoginScreen.kt @@ -23,53 +23,51 @@ import com.monstarlab.designsystem.theme.AppTheme import com.monstarlab.designsystem.theme.Theme @Composable -fun LoginScreen( - state: LoginState = LoginState(), - actions: LoginActions = LoginActions(), -) = Scaffold( - topBar = { - AppTopBar( - modifier = Modifier.systemBarsPadding(), - title = "Login" - ) - } -) { - Column( - modifier = Modifier - .padding(it) - .fillMaxSize() - .padding(Theme.dimensions.big1) - .imePadding(), - horizontalAlignment = Alignment.CenterHorizontally, - verticalArrangement = Arrangement.Center +fun LoginScreen(state: LoginState = LoginState(), actions: LoginActions = LoginActions()) = + Scaffold( + topBar = { + AppTopBar( + modifier = Modifier.systemBarsPadding(), + title = "Login", + ) + }, ) { - AppTextField( - value = state.email, - onValueChange = actions.onEmailChange, - modifier = Modifier.fillMaxWidth(), - placeholder = "E-Mail" - ) + Column( + modifier = Modifier + .padding(it) + .fillMaxSize() + .padding(Theme.dimensions.big1) + .imePadding(), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.Center, + ) { + AppTextField( + value = state.email, + onValueChange = actions.onEmailChange, + modifier = Modifier.fillMaxWidth(), + placeholder = "E-Mail", + ) - Spacer(modifier = Modifier.size(Theme.dimensions.medium3)) + Spacer(modifier = Modifier.size(Theme.dimensions.medium3)) - AppTextField( - value = state.password, - onValueChange = actions.onPasswordChange, - modifier = Modifier.fillMaxWidth(), - error = state.error?.displayableMessage, - visualTransformation = PasswordVisualTransformation(), - placeholder = "Password" - ) - Spacer(modifier = Modifier.size(Theme.dimensions.medium3)) + AppTextField( + value = state.password, + onValueChange = actions.onPasswordChange, + modifier = Modifier.fillMaxWidth(), + error = state.error?.displayableMessage, + visualTransformation = PasswordVisualTransformation(), + placeholder = "Password", + ) + Spacer(modifier = Modifier.size(Theme.dimensions.medium3)) - AppButton( - text = "Login", - onClick = actions.onLoginClick, - modifier = Modifier.fillMaxWidth(), - isLoading = state.isLoading - ) + AppButton( + text = "Login", + onClick = actions.onLoginClick, + modifier = Modifier.fillMaxWidth(), + isLoading = state.isLoading, + ) + } } -} @Composable @LightDarkPreview diff --git a/app/src/main/java/com/monstarlab/features/login/ui/LoginViewModel.kt b/app/src/main/java/com/monstarlab/features/login/ui/LoginViewModel.kt index 2631d8ac..fcaa338a 100644 --- a/app/src/main/java/com/monstarlab/features/login/ui/LoginViewModel.kt +++ b/app/src/main/java/com/monstarlab/features/login/ui/LoginViewModel.kt @@ -5,12 +5,12 @@ import androidx.lifecycle.viewModelScope import com.monstarlab.core.error.toError import com.monstarlab.features.login.domain.usecase.LoginUseCase import dagger.hilt.android.lifecycle.HiltViewModel +import javax.inject.Inject import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch -import javax.inject.Inject @HiltViewModel class LoginViewModel @Inject constructor( @@ -42,7 +42,7 @@ class LoginViewModel @Inject constructor( loginState.copy( error = result.exceptionOrNull()?.toError(), isLoading = false, - isLoggedIn = result.isSuccess + isLoggedIn = result.isSuccess, ) } } diff --git a/app/src/main/java/com/monstarlab/features/main/MainActivityState.kt b/app/src/main/java/com/monstarlab/features/main/MainActivityState.kt index f7cd30c2..5bdf7ca9 100644 --- a/app/src/main/java/com/monstarlab/features/main/MainActivityState.kt +++ b/app/src/main/java/com/monstarlab/features/main/MainActivityState.kt @@ -4,5 +4,5 @@ import dk.nodes.nstack.kotlin.models.AppOpenData data class MainActivityState( val showSplash: Boolean = true, - val nstackData: AppOpenData? = null + val nstackData: AppOpenData? = null, ) diff --git a/app/src/main/java/com/monstarlab/features/main/MainActivityViewModel.kt b/app/src/main/java/com/monstarlab/features/main/MainActivityViewModel.kt index 68414197..def13e15 100644 --- a/app/src/main/java/com/monstarlab/features/main/MainActivityViewModel.kt +++ b/app/src/main/java/com/monstarlab/features/main/MainActivityViewModel.kt @@ -4,11 +4,11 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.monstarlab.features.nstack.domain.usecase.SetupNstackUseCase import dagger.hilt.android.lifecycle.HiltViewModel +import javax.inject.Inject import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch -import javax.inject.Inject @HiltViewModel class MainActivityViewModel @Inject constructor( @@ -31,7 +31,7 @@ class MainActivityViewModel @Inject constructor( _stateFlow.update { it.copy( nstackData = data, - showSplash = false + showSplash = false, ) } } diff --git a/app/src/main/java/com/monstarlab/features/main/NstackMainActivityExtensions.kt b/app/src/main/java/com/monstarlab/features/main/NstackMainActivityExtensions.kt index a8421f2b..1aeaccbc 100644 --- a/app/src/main/java/com/monstarlab/features/main/NstackMainActivityExtensions.kt +++ b/app/src/main/java/com/monstarlab/features/main/NstackMainActivityExtensions.kt @@ -84,15 +84,15 @@ fun MainActivity.startPlayStore() { startActivity( Intent( Intent.ACTION_VIEW, - Uri.parse("market://details?id=$packageName") - ) + Uri.parse("market://details?id=$packageName"), + ), ) } catch (anfe: android.content.ActivityNotFoundException) { startActivity( Intent( Intent.ACTION_VIEW, - Uri.parse("https://play.google.com/store/apps/details?id=$packageName") - ) + Uri.parse("https://play.google.com/store/apps/details?id=$packageName"), + ), ) } } diff --git a/app/src/main/java/com/monstarlab/features/nstack/domain/usecase/SetupNstackUseCase.kt b/app/src/main/java/com/monstarlab/features/nstack/domain/usecase/SetupNstackUseCase.kt index 30a85b10..75e7874a 100644 --- a/app/src/main/java/com/monstarlab/features/nstack/domain/usecase/SetupNstackUseCase.kt +++ b/app/src/main/java/com/monstarlab/features/nstack/domain/usecase/SetupNstackUseCase.kt @@ -4,9 +4,9 @@ import com.monstarlab.core.extensions.suspendRunCatching import com.monstarlab.core.injection.IoDispatcher import dk.nodes.nstack.kotlin.NStack import dk.nodes.nstack.kotlin.models.AppOpenData +import javax.inject.Inject import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.withContext -import javax.inject.Inject import dk.nodes.nstack.kotlin.models.Result as NstackResult class SetupNstackUseCase @Inject constructor( diff --git a/app/src/main/java/com/monstarlab/features/resources/data/api/dtos/ResourceDTO.kt b/app/src/main/java/com/monstarlab/features/resources/data/api/dtos/ResourceDTO.kt index d4e17910..7393812c 100644 --- a/app/src/main/java/com/monstarlab/features/resources/data/api/dtos/ResourceDTO.kt +++ b/app/src/main/java/com/monstarlab/features/resources/data/api/dtos/ResourceDTO.kt @@ -20,6 +20,6 @@ fun ResourceDTO.toResource(): Resource { name = name, year = year, color = color, - pantoneValue = pantoneValue + pantoneValue = pantoneValue, ) } diff --git a/app/src/main/java/com/monstarlab/features/resources/domain/usecase/GetResourcesUseCase.kt b/app/src/main/java/com/monstarlab/features/resources/domain/usecase/GetResourcesUseCase.kt index 0fd5ad0d..f2345144 100644 --- a/app/src/main/java/com/monstarlab/features/resources/domain/usecase/GetResourcesUseCase.kt +++ b/app/src/main/java/com/monstarlab/features/resources/domain/usecase/GetResourcesUseCase.kt @@ -2,8 +2,8 @@ package com.monstarlab.features.resources.domain.usecase import com.monstarlab.core.extensions.suspendRunCatching import com.monstarlab.features.resources.domain.repository.ResourceRepository -import kotlinx.coroutines.delay import javax.inject.Inject +import kotlinx.coroutines.delay class GetResourcesUseCase @Inject constructor( private val resourceRepository: ResourceRepository, diff --git a/app/src/main/java/com/monstarlab/features/resources/ui/ResourcesCoordinator.kt b/app/src/main/java/com/monstarlab/features/resources/ui/ResourcesCoordinator.kt index 1a7cad11..7388b4ec 100644 --- a/app/src/main/java/com/monstarlab/features/resources/ui/ResourcesCoordinator.kt +++ b/app/src/main/java/com/monstarlab/features/resources/ui/ResourcesCoordinator.kt @@ -30,7 +30,7 @@ fun rememberResourcesCoordinator( return remember(viewModel, context) { ResourcesCoordinator( viewModel = viewModel, - context = context + context = context, ) } } diff --git a/app/src/main/java/com/monstarlab/features/resources/ui/ResourcesRoute.kt b/app/src/main/java/com/monstarlab/features/resources/ui/ResourcesRoute.kt index c938ae65..9aa1b695 100644 --- a/app/src/main/java/com/monstarlab/features/resources/ui/ResourcesRoute.kt +++ b/app/src/main/java/com/monstarlab/features/resources/ui/ResourcesRoute.kt @@ -7,9 +7,7 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.monstarlab.designsystem.theme.AppTheme @Composable -fun ResourcesRoute( - coordinator: ResourcesCoordinator, -) { +fun ResourcesRoute(coordinator: ResourcesCoordinator) { // State observing and declarations val uiState by coordinator.screenStateFlow.collectAsStateWithLifecycle(ResourcesState()) diff --git a/app/src/main/java/com/monstarlab/features/resources/ui/ResourcesScreen.kt b/app/src/main/java/com/monstarlab/features/resources/ui/ResourcesScreen.kt index e4197b62..9dd5d32d 100644 --- a/app/src/main/java/com/monstarlab/features/resources/ui/ResourcesScreen.kt +++ b/app/src/main/java/com/monstarlab/features/resources/ui/ResourcesScreen.kt @@ -30,9 +30,9 @@ fun ResourcesScreen( topBar = { AppTopBar( title = "Resources", - modifier = Modifier.statusBarsPadding() + modifier = Modifier.statusBarsPadding(), ) - } + }, ) { LazyColumn( modifier = Modifier @@ -40,7 +40,7 @@ fun ResourcesScreen( .fillMaxSize(), contentPadding = PaddingValues(Theme.dimensions.medium1), horizontalAlignment = Alignment.CenterHorizontally, - verticalArrangement = Arrangement.spacedBy(Theme.dimensions.medium1) + verticalArrangement = Arrangement.spacedBy(Theme.dimensions.medium1), ) { animatedVisibilityItem("progress-indicator", state.isLoading) { CircularProgressIndicator() @@ -51,7 +51,7 @@ fun ResourcesScreen( resource = resource, modifier = Modifier.clickable { actions.onResourceClick(resource) - } + }, ) } } diff --git a/app/src/main/java/com/monstarlab/features/resources/ui/ResourcesViewModel.kt b/app/src/main/java/com/monstarlab/features/resources/ui/ResourcesViewModel.kt index 6d8b20ec..619dd4b5 100644 --- a/app/src/main/java/com/monstarlab/features/resources/ui/ResourcesViewModel.kt +++ b/app/src/main/java/com/monstarlab/features/resources/ui/ResourcesViewModel.kt @@ -5,12 +5,12 @@ import androidx.lifecycle.viewModelScope import com.monstarlab.core.error.toError import com.monstarlab.features.resources.domain.usecase.GetResourcesUseCase import dagger.hilt.android.lifecycle.HiltViewModel +import javax.inject.Inject import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch -import javax.inject.Inject @HiltViewModel class ResourcesViewModel @Inject constructor( @@ -29,7 +29,7 @@ class ResourcesViewModel @Inject constructor( state.copy( isLoading = false, resources = result.getOrDefault(emptyList()), - error = result.exceptionOrNull()?.toError() + error = result.exceptionOrNull()?.toError(), ) } } diff --git a/app/src/main/java/com/monstarlab/features/resources/ui/components/ResourceItem.kt b/app/src/main/java/com/monstarlab/features/resources/ui/components/ResourceItem.kt index 132205ea..9b600edb 100644 --- a/app/src/main/java/com/monstarlab/features/resources/ui/components/ResourceItem.kt +++ b/app/src/main/java/com/monstarlab/features/resources/ui/components/ResourceItem.kt @@ -23,32 +23,29 @@ import com.monstarlab.designsystem.theme.Theme import com.monstarlab.features.resources.domain.model.Resource @Composable -fun ResourceItem( - resource: Resource, - modifier: Modifier = Modifier, -) { +fun ResourceItem(resource: Resource, modifier: Modifier = Modifier) { Card { Row( modifier = modifier.fillMaxWidth().padding(Theme.dimensions.medium2), horizontalArrangement = Arrangement.spacedBy(Theme.dimensions.medium1), - verticalAlignment = Alignment.CenterVertically + verticalAlignment = Alignment.CenterVertically, ) { Box( modifier = Modifier .size(32.dp) .background( brush = Brush.verticalGradient( - listOf(Color.DarkGray, Color.fromHex(resource.color)) + listOf(Color.DarkGray, Color.fromHex(resource.color)), ), - shape = RoundedCornerShape(8.dp) - ) + shape = RoundedCornerShape(8.dp), + ), ) Text( text = buildString { append(resource.name) append(' ') append(resource.year) - } + }, ) } } diff --git a/app/src/main/java/com/monstarlab/features/user/data/api/dtos/UserDTO.kt b/app/src/main/java/com/monstarlab/features/user/data/api/dtos/UserDTO.kt index 0618d04d..67d644ef 100644 --- a/app/src/main/java/com/monstarlab/features/user/data/api/dtos/UserDTO.kt +++ b/app/src/main/java/com/monstarlab/features/user/data/api/dtos/UserDTO.kt @@ -20,6 +20,6 @@ fun UserDTO.toUser(): User { email = email, firstName = firstName, lastName = lastName, - avatar = avatar + avatar = avatar, ) } diff --git a/app/src/test/java/com/monstarlab/features/auth/domain/AuthRepositoryTest.kt b/app/src/test/java/com/monstarlab/features/auth/domain/AuthRepositoryTest.kt index 901bba6c..07abf990 100644 --- a/app/src/test/java/com/monstarlab/features/auth/domain/AuthRepositoryTest.kt +++ b/app/src/test/java/com/monstarlab/features/auth/domain/AuthRepositoryTest.kt @@ -10,11 +10,11 @@ import io.mockk.coEvery import io.mockk.coVerify import io.mockk.mockk import junit.framework.TestCase.assertEquals -import kotlinx.coroutines.ExperimentalCoroutinesApi -import kotlinx.coroutines.test.runTest import org.junit.After import org.junit.Before import org.junit.Test +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.test.runTest /** * Created by aslam on 08,March,2023 @@ -38,7 +38,6 @@ internal class AuthRepositoryTest { @OptIn(ExperimentalCoroutinesApi::class) @Test fun testLoginReturnsExpectedAuthToken() = runTest { - // Arrange val email = "aslam@test.com" val password = "password" diff --git a/build.gradle.kts b/build.gradle.kts index 0947dd5d..c2bd177c 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -33,7 +33,18 @@ subprojects { kotlin { target("**/*.kt") targetExclude("**/RateReminderActions.kt") - ktlint("0.40.0") + ktlint("1.0.1") + .editorConfigOverride( + mapOf( + "indent_size" to 4, + "indent_style" to "space", + "ij_kotlin_imports_layout" to "*,java.**,javax.**,kotlin.**,kotlinx.**,^", + "ij_kotlin_allow_trailing_comma_on_call_site" to "true", + "ij_kotlin_allow_trailing_comma" to "true", + "ktlint_function_naming_ignore_when_annotated_with" to "Composable", + "ktlint_code_style" to "android_studio", + ) + ) } } } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 89cf0ca9..9caeeaab 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -19,7 +19,7 @@ chucker = "4.0.0" mockk = "1.13.7" [plugins] -spotless = { id = "com.diffplug.spotless", version = "6.20.0" } +spotless = { id = "com.diffplug.spotless", version = "6.22.0" } detekt = { id = "io.gitlab.arturbosch.detekt", version = "1.23.1" } kotlin_serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" } android-application = { id = "com.android.application", version.ref = "android_gradle" }