Skip to content

Commit

Permalink
Fixed detekt linters
Browse files Browse the repository at this point in the history
  • Loading branch information
jonathanarodr committed May 5, 2024
1 parent 6c7ed09 commit f472596
Show file tree
Hide file tree
Showing 20 changed files with 137 additions and 112 deletions.
1 change: 1 addition & 0 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ dependencies {
implementation(projects.feature.stocks)

implementation(libs.androidx.startup.runtime)
implementation(libs.kotlinx.collections.immutable)

testImplementation(libs.bundles.test.jvm)
androidTestImplementation(libs.bundles.test.jvm)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package br.com.stonks.navigation

enum class MainNavDestination(val route: String) {
HOME("home"),
STOCK("stock"),
enum class MainNavDestination {
HOME,
STOCK,
}
78 changes: 20 additions & 58 deletions app/src/main/kotlin/br/com/stonks/ui/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -7,31 +7,21 @@ import androidx.compose.foundation.layout.WindowInsets
import androidx.compose.foundation.layout.consumeWindowInsets
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
import androidx.compose.material3.Icon
import androidx.compose.material3.NavigationBar
import androidx.compose.material3.NavigationBarItem
import androidx.compose.material3.Scaffold
import androidx.compose.material3.SnackbarHost
import androidx.compose.material3.SnackbarHostState
import androidx.compose.material3.Surface
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.mutableIntStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.navigation.NavController
import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable
import androidx.navigation.compose.currentBackStackEntryAsState
import androidx.navigation.compose.rememberNavController
import br.com.stonks.designsystem.R
import br.com.stonks.feature.home.ui.view.HomeScreen
import br.com.stonks.feature.stocks.ui.view.StockAlertScreen
import br.com.stonks.navigation.MainNavDestination
import kotlinx.collections.immutable.toImmutableList

class MainActivity : ComponentActivity() {

Expand All @@ -41,7 +31,6 @@ class MainActivity : ComponentActivity() {
setContent {
val snackbarHostState = remember { SnackbarHostState() }
val navController = rememberNavController()
val selectedNavIndex = rememberSaveable { mutableIntStateOf(MainNavDestination.HOME.ordinal) }

Scaffold(
containerColor = Color.Transparent,
Expand All @@ -51,44 +40,22 @@ class MainActivity : ComponentActivity() {
SnackbarHost(snackbarHostState)
},
bottomBar = {
NavigationBar {
NavigationBarItem(
selected = (selectedNavIndex.intValue == MainNavDestination.HOME.ordinal),
icon = {
Icon(
painter = painterResource(R.drawable.ic_home),
contentDescription = null,
)
},
label = {
Text(
text = stringResource(id = br.com.stonks.R.string.main_nav_action_home)
)
},
onClick = {
selectedNavIndex.intValue = MainNavDestination.HOME.ordinal
navController.navigate(MainNavDestination.HOME.route)
},
)
NavigationBarItem(
selected = navController.isCurrentDestination(MainNavDestination.STOCK),
icon = {
Icon(
painter = painterResource(R.drawable.ic_radar),
contentDescription = null,
)
},
label = {
Text(
text = stringResource(id = br.com.stonks.R.string.main_nav_action_stock_alert)
)
},
onClick = {
selectedNavIndex.intValue = MainNavDestination.STOCK.ordinal
navController.navigate(MainNavDestination.STOCK.route)
},
)
}
MainNavigationBarLayout(
navController = navController,
navItems = listOf(
MainNavItem(
icon = R.drawable.ic_home,
label = br.com.stonks.R.string.main_nav_action_home,
route = MainNavDestination.HOME,
),
MainNavItem(
icon = R.drawable.ic_radar,
label = br.com.stonks.R.string.main_nav_action_stock_alert,
route = MainNavDestination.STOCK,
),
).toImmutableList(),
startDestination = MainNavDestination.HOME,
)
}
) { innerPadding ->
Surface(
Expand All @@ -99,14 +66,14 @@ class MainActivity : ComponentActivity() {
) {
NavHost(
navController = navController,
startDestination = MainNavDestination.HOME.route,
startDestination = MainNavDestination.HOME.name,
) {
composable(route = MainNavDestination.HOME.route) {
composable(route = MainNavDestination.HOME.name) {
HomeScreen(
snackbarHostState = snackbarHostState,
)
}
composable(route = MainNavDestination.STOCK.route) {
composable(route = MainNavDestination.STOCK.name) {
StockAlertScreen(
snackbarHostState = snackbarHostState,
)
Expand All @@ -116,9 +83,4 @@ class MainActivity : ComponentActivity() {
}
}
}

@Composable
private fun NavController.isCurrentDestination(destination: MainNavDestination): Boolean {
return currentBackStackEntryAsState().value?.destination?.route == destination.route
}
}
67 changes: 67 additions & 0 deletions app/src/main/kotlin/br/com/stonks/ui/MainNavigationBar.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
package br.com.stonks.ui

import androidx.annotation.DrawableRes
import androidx.annotation.StringRes
import androidx.compose.material3.Icon
import androidx.compose.material3.NavigationBar
import androidx.compose.material3.NavigationBarItem
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.Stable
import androidx.compose.runtime.mutableIntStateOf
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.navigation.NavController
import androidx.navigation.NavHostController
import androidx.navigation.compose.currentBackStackEntryAsState
import br.com.stonks.navigation.MainNavDestination
import kotlinx.collections.immutable.ImmutableList

@Composable
private fun NavController.isCurrentDestination(destination: MainNavDestination): Boolean {
return currentBackStackEntryAsState().value?.destination?.route == destination.name
}

@Composable
@Stable
internal fun MainNavigationBarLayout(
navController: NavHostController,
navItems: ImmutableList<MainNavItem>,
startDestination: MainNavDestination,
modifier: Modifier = Modifier,
) {
val selectedNavIndex = rememberSaveable { mutableIntStateOf(startDestination.ordinal) }

NavigationBar(
modifier = modifier,
) {
navItems.forEach { navItem ->
NavigationBarItem(
selected = navController.isCurrentDestination(navItem.route),
icon = {
Icon(
painter = painterResource(navItem.icon),
contentDescription = null,
)
},
label = {
Text(
text = stringResource(id = navItem.label)
)
},
onClick = {
selectedNavIndex.intValue = navItem.route.ordinal
navController.navigate(navItem.route.name)
},
)
}
}
}

internal data class MainNavItem(
@DrawableRes val icon: Int,
@StringRes val label: Int,
val route: MainNavDestination,
)
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
package br.com.stonks.common.db

const val DEFAULT_PRIMARY_KEY = 0L
const val DefaultPrimaryKey = 0L
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@ import java.math.RoundingMode
import java.text.DecimalFormat
import java.util.Locale

private const val CurrencyDivider = 100

fun Double.formatCurrency(locale: Locale = LocaleDefault.localePtBr): String {
val decimalFormat = DecimalFormat.getCurrencyInstance(locale) as DecimalFormat

Expand All @@ -15,14 +17,16 @@ fun Double.formatCurrency(locale: Locale = LocaleDefault.localePtBr): String {
}

fun String.toCurrency(): Double {
val divider: BigDecimal by lazy { BigDecimal(100) }
val divider: BigDecimal by lazy { BigDecimal(CurrencyDivider) }
val onlyNumbers = if (this.isDigitsOnly()) {
this
} else {
"[^0-9]".toRegex().replace(this, "")
}

return (onlyNumbers.toBigDecimalOrNull()?.run {
this.divide(divider).setScale(2, RoundingMode.HALF_DOWN)
} ?: BigDecimal.ZERO).toDouble()
return (
onlyNumbers.toBigDecimalOrNull()?.run {
this.divide(divider).setScale(2, RoundingMode.HALF_DOWN)
} ?: BigDecimal.ZERO
).toDouble()
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,8 @@ import br.com.stonks.designsystem.tokens.SpacingToken
@Composable
fun HeaderLayout(
title: String,
subtitle: String? = null,
modifier: Modifier = Modifier,
subtitle: String? = null,
) {
Column(
modifier = modifier.fillMaxWidth()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,16 @@ package br.com.stonks.feature.stocks.di

import br.com.stonks.common.states.ViewModelState
import br.com.stonks.feature.stocks.domain.mapper.AlertUiToModelMapper
import br.com.stonks.feature.stocks.domain.mapper.StockAlertEntityToResponseMapper
import br.com.stonks.feature.stocks.domain.mapper.StockAlertModelToResponseMapper
import br.com.stonks.feature.stocks.domain.mapper.StockAlertModelToUiMapper
import br.com.stonks.feature.stocks.domain.mapper.StockAlertResponseToEntityMapper
import br.com.stonks.feature.stocks.domain.mapper.StockAlertResponseToModelMapper
import br.com.stonks.feature.stocks.domain.usecase.StockAlertUseCase
import br.com.stonks.feature.stocks.domain.mapper.StockAlertModelToUiMapper
import br.com.stonks.feature.stocks.repository.StockRepository
import br.com.stonks.feature.stocks.repository.StockRepositoryImpl
import br.com.stonks.feature.stocks.repository.local.StockLocalDataSource
import br.com.stonks.feature.stocks.repository.local.db.StockDataBase
import br.com.stonks.feature.stocks.domain.mapper.StockAlertEntityToResponseMapper
import br.com.stonks.feature.stocks.domain.mapper.StockAlertModelToResponseMapper
import br.com.stonks.feature.stocks.domain.mapper.StockAlertResponseToEntityMapper
import br.com.stonks.feature.stocks.repository.remote.StockApiService
import br.com.stonks.feature.stocks.repository.remote.StockRemoteDataSource
import br.com.stonks.feature.stocks.ui.viewmodel.STOCK_VM_QUALIFIER
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package br.com.stonks.feature.stocks.domain.usecase

import br.com.stonks.common.db.DEFAULT_PRIMARY_KEY
import br.com.stonks.common.db.DefaultPrimaryKey
import br.com.stonks.common.utils.asFlow
import br.com.stonks.feature.stocks.domain.mapper.StockAlertModelToResponseMapper
import br.com.stonks.feature.stocks.domain.mapper.StockAlertResponseToModelMapper
Expand Down Expand Up @@ -29,7 +29,7 @@ internal class StockAlertUseCase(
suspend fun saveStockAlert(alert: StockAlertModel): Flow<Unit> {
val alertResponse = stockAlertResponseMapper.mapper(alert)

return if (alert.id == DEFAULT_PRIMARY_KEY) {
return if (alert.id == DefaultPrimaryKey) {
stockAlertRepository.insertStockAlert(alertResponse)
} else {
stockAlertRepository.updateStockAlert(alertResponse)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package br.com.stonks.feature.stocks.repository

import br.com.stonks.feature.stocks.repository.local.StockLocalDataSource
import br.com.stonks.feature.stocks.domain.mapper.StockAlertEntityToResponseMapper
import br.com.stonks.feature.stocks.domain.mapper.StockAlertResponseToEntityMapper
import br.com.stonks.feature.stocks.repository.local.StockLocalDataSource
import br.com.stonks.feature.stocks.repository.remote.StockRemoteDataSource
import br.com.stonks.feature.stocks.repository.remote.response.StockAlertResponse

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,13 @@ package br.com.stonks.feature.stocks.repository.local
import androidx.room.ColumnInfo
import androidx.room.Entity
import androidx.room.PrimaryKey
import br.com.stonks.common.db.DEFAULT_PRIMARY_KEY
import br.com.stonks.common.db.DefaultPrimaryKey

@Entity(tableName = "alerts")
data class StockAlertEntity(
@PrimaryKey(autoGenerate = true)
@ColumnInfo(name = "id")
val id: Long = DEFAULT_PRIMARY_KEY,
val id: Long = DefaultPrimaryKey,
@ColumnInfo(name = "ticket")
val ticket: String,
@ColumnInfo(name = "price")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ import androidx.compose.ui.platform.LocalFocusManager
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.input.KeyboardType
import androidx.compose.ui.tooling.preview.Preview
import br.com.stonks.common.db.DEFAULT_PRIMARY_KEY
import br.com.stonks.common.db.DefaultPrimaryKey
import br.com.stonks.common.formatters.formatCurrency
import br.com.stonks.common.formatters.toCurrency
import br.com.stonks.designsystem.components.HeaderLayout
Expand All @@ -44,7 +44,8 @@ import br.com.stonks.feature.stocks.ui.model.AlertUiModel
import br.com.stonks.feature.stocks.utils.getDescription

@Composable
internal fun AlertFormsScreen(
@Suppress("LongMethod")
internal fun AlertScreen(
uiModel: AlertUiModel? = null,
modifier: Modifier = Modifier,
onSaveItem: (alert: AlertUiModel) -> Unit,
Expand Down Expand Up @@ -132,7 +133,7 @@ internal fun AlertFormsScreen(
onClick = {
onSaveItem(
AlertUiModel(
id = uiModel?.id ?: DEFAULT_PRIMARY_KEY,
id = uiModel?.id ?: DefaultPrimaryKey,
ticket = ticket,
alertValue = price,
status = if (statusAvailable) StockStatusType.AVAILABLE else StockStatusType.UNAVAILABLE
Expand All @@ -156,8 +157,8 @@ internal fun AlertFormsScreen(

@Preview(showBackground = true)
@Composable
private fun AlertFormsLayoutPreview() {
AlertFormsScreen(
private fun AlertScreenPreview() {
AlertScreen(
uiModel = AlertUiModel(
id = 1L,
ticket = "GOGL34",
Expand Down
Loading

0 comments on commit f472596

Please sign in to comment.