diff --git a/.gitignore b/.gitignore index aa724b7..10cfdbf 100644 --- a/.gitignore +++ b/.gitignore @@ -1,12 +1,7 @@ *.iml .gradle /local.properties -/.idea/caches -/.idea/libraries -/.idea/modules.xml -/.idea/workspace.xml -/.idea/navEditor.xml -/.idea/assetWizardSettings.xml +/.idea .DS_Store /build /captures diff --git a/.idea/.gitignore b/.idea/.gitignore deleted file mode 100644 index 26d3352..0000000 --- a/.idea/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -# Default ignored files -/shelf/ -/workspace.xml diff --git a/.idea/.name b/.idea/.name deleted file mode 100644 index e44e06d..0000000 --- a/.idea/.name +++ /dev/null @@ -1 +0,0 @@ -Bitcoin summarizer \ No newline at end of file diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml deleted file mode 100644 index 7643783..0000000 --- a/.idea/codeStyles/Project.xml +++ /dev/null @@ -1,123 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/.idea/codeStyles/codeStyleConfig.xml b/.idea/codeStyles/codeStyleConfig.xml deleted file mode 100644 index 79ee123..0000000 --- a/.idea/codeStyles/codeStyleConfig.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - \ No newline at end of file diff --git a/.idea/compiler.xml b/.idea/compiler.xml deleted file mode 100644 index b86273d..0000000 --- a/.idea/compiler.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.idea/deploymentTargetSelector.xml b/.idea/deploymentTargetSelector.xml deleted file mode 100644 index b268ef3..0000000 --- a/.idea/deploymentTargetSelector.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml deleted file mode 100644 index 7b3006b..0000000 --- a/.idea/gradle.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/.idea/kotlinc.xml b/.idea/kotlinc.xml deleted file mode 100644 index 6d0ee1c..0000000 --- a/.idea/kotlinc.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - \ No newline at end of file diff --git a/.idea/migrations.xml b/.idea/migrations.xml deleted file mode 100644 index f8051a6..0000000 --- a/.idea/migrations.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml deleted file mode 100644 index 74dd639..0000000 --- a/.idea/misc.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/.idea/runConfigurations.xml b/.idea/runConfigurations.xml deleted file mode 100644 index 16660f1..0000000 --- a/.idea/runConfigurations.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml deleted file mode 100644 index 94a25f7..0000000 --- a/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 4f87ced..6558deb 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -12,8 +12,8 @@ android { applicationId = "ru.vendetti.bitcoin_summarizer" minSdk = 29 targetSdk = 35 - versionCode = 1 - versionName = "1.0" + versionCode = 2 + versionName = "1.2" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 6830513..dc24fe6 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -3,13 +3,13 @@ xmlns:tools="http://schemas.android.com/tools"> (fearGreedDataList.count()) { index -> fearGreedDataList[index].value.toInt() } + var numberValues = Array(fearGreedDataList.count()) { + index -> + fearGreedDataList[fearGreedDataList.count() - index - 1] + .value.toInt() + } + if(numberValues.isEmpty()) - numberValues = Array(1) {0} + numberValues = Array(1) {0} + lineSeries { series(numberValues.toList()) } } } val scrollBehavior = TopAppBarDefaults.enterAlwaysScrollBehavior(rememberTopAppBarState()) - val zoomState = rememberVicoZoomState(initialZoom = Zoom.x(fearGreedIndexDaysCount.toDouble())) + val zoomState = rememberVicoZoomState( + zoomEnabled = false, + initialZoom = Zoom.x(fearGreedIndexDaysCount.toDouble())) + // Отображаем результаты на странице Scaffold ( modifier = Modifier @@ -126,12 +142,15 @@ fun CryptoScreen() { topBar = { MediumTopAppBar( colors = TopAppBarDefaults.topAppBarColors( - containerColor = MaterialTheme.colorScheme.primaryContainer, - titleContentColor = MaterialTheme.colorScheme.primary, + containerColor = MaterialTheme.colorScheme.primary, + scrolledContainerColor = MaterialTheme.colorScheme.primary, + titleContentColor = MaterialTheme.colorScheme.onPrimary, + navigationIconContentColor = MaterialTheme.colorScheme.onPrimary, + actionIconContentColor = MaterialTheme.colorScheme.onPrimary, ), title = { Text( - "Bitcoin Summarizer!", + "Bitcoin Summarizer", maxLines = 1, overflow = TextOverflow.Ellipsis ) @@ -159,7 +178,7 @@ fun CryptoScreen() { { innerPadding -> Box( modifier = Modifier - .fillMaxSize() + .background(Color.Transparent) .padding(innerPadding) .verticalScroll(rememberScrollState()) ) { @@ -171,49 +190,66 @@ fun CryptoScreen() { CartesianChartHost( zoomState = zoomState, chart = rememberCartesianChart( - rememberLineCartesianLayer(), + rememberLineCartesianLayer( + lineProvider = LineCartesianLayer.LineProvider.series( + vicoTheme.lineCartesianLayerColors.map{ + _ -> + LineCartesianLayer + .rememberLine( + LineCartesianLayer.LineFill.single( + fill(MaterialTheme.colorScheme.onPrimary) + ) + ) + } + ), + rangeProvider = remember { CartesianLayerRangeProvider.fixed(minY = 0.0, maxY = 100.0)} + ), startAxis = VerticalAxis.rememberStart( - titleComponent = rememberTextComponent(), - title = "FGI" + title = "FGI", + titleComponent = rememberTextComponent(MaterialTheme.colorScheme.onPrimary), + line = rememberAxisLineComponent(fill(MaterialTheme.colorScheme.onPrimary)), + label = rememberAxisLabelComponent(MaterialTheme.colorScheme.onPrimary) ), bottomAxis = HorizontalAxis.rememberBottom( - titleComponent = rememberTextComponent(), - title = "last $fearGreedIndexDaysCount days" + title = "последние $fearGreedIndexDaysCount дней", + titleComponent = rememberTextComponent(MaterialTheme.colorScheme.onPrimary), + line = rememberAxisLineComponent(fill(MaterialTheme.colorScheme.onPrimary)), + label = rememberAxisLabelComponent(MaterialTheme.colorScheme.onPrimary) ), decorations = listOf( remember { HorizontalLine( - y = { 15.toDouble() }, - line = LineComponent(fill(Color.Red), 2f), + y = { 25.toDouble() }, + line = LineComponent(fill(Flame), 1f), labelComponent = TextComponent( background = shapeComponent( - fill(Color.Red), + fill(Flame), CorneredShape.rounded( - bottomLeft = 4.dp, - bottomRight = 4.dp + topLeft = 4.dp, + topRight = 4.dp ) ), ), - label = { "Fear" }, + label = { "Страх" }, verticalLabelPosition = Position.Vertical.Top ) }, remember { HorizontalLine( - y = { 60.toDouble() }, - line = LineComponent(fill(Color.Green), 2f), + y = { 70.toDouble() }, + line = LineComponent(fill(Green2), 1f), labelComponent = TextComponent( background = shapeComponent( - fill(Color.Green), + fill(Green2), CorneredShape.rounded( bottomLeft = 4.dp, bottomRight = 4.dp ) ), ), - label = { "Greed" }, + label = { "Жадность" }, verticalLabelPosition = Position.Vertical.Bottom ) } @@ -222,34 +258,47 @@ fun CryptoScreen() { modelProducer = modelProducer, ) /* Fear Greed Chart End */ + Spacer(modifier = Modifier.height(16.dp)) HorizontalDivider(thickness = 2.dp) + Spacer(modifier = Modifier.height(16.dp)) Text( - "Данные о Биткойне", + "Данные о Биткоине", modifier = Modifier .align(alignment = Alignment.CenterHorizontally), fontSize = 24.sp ) - Text("Текущая цена: \n ${bitcoinTicker.priceUsd}\n") - Text("Суточный оборот: \n ${bitcoinTicker.volume24hUsd}\n") - Text("Капитализация: \n ${bitcoinTicker.marketCapUsd}\n") + Spacer(modifier = Modifier.height(16.dp)) + val formatter = DecimalFormat("0.00") + Text("Текущая цена: \n \$ ${formatter.format(bitcoinTicker.priceUsd.toFloat())}\n") + Text("Суточный оборот: \n \$ ${bitcoinTicker.volume24hUsd}\n") + Text("Капитализация: \n \$ ${bitcoinTicker.marketCapUsd}\n") Text( "Изменение курса за: " + - "\n Сутки: ${bitcoinTicker.percentChange24h} " + - "\n Неделю: ${bitcoinTicker.percentChange7d}\n" + "\n Сутки: ${formatter.format(bitcoinTicker.percentChange24h.toFloat())}% " + + "\n Неделю: ${formatter.format(bitcoinTicker.percentChange7d.toFloat())}%\n" ) - Text("Дата последнего обновления: \n ${bitcoinTicker.lastUpdated}\n") + + var humanDate = "" + + if(bitcoinTicker.lastUpdated.isNotEmpty()) + humanDate = DateTimeFormatter.ISO_INSTANT + .format(java.time.Instant.ofEpochSecond(bitcoinTicker.lastUpdated.toLong())) + + Text("Время последнего обновления: \n ${humanDate}\n") HorizontalDivider(thickness = 2.dp) + Spacer(modifier = Modifier.height(16.dp)) Text( "Глобальные данные", modifier = Modifier .align(alignment = Alignment.CenterHorizontally), fontSize = 24.sp ) - Text("Общая капитализация крипторынка: \n ${globalData.totalMarketCapUsd}\n") - Text("Всего видов криптовалют: \n ${globalData.activeCryptocurrencies}\n") - Text("Суточный оборот других криптовалют: \n ${globalData.total24hVolumeUsd}\n") - Text("Процент доминации Биткоина: \n ${globalData.bitcoinPercentageOfMarketCap}\n") + Spacer(modifier = Modifier.height(16.dp)) + Text("Общая капитализация крипторынка: \n \$ ${globalData.totalMarketCapUsd}\n") + Text("Всего тикеров: \n ${globalData.activeCryptocurrencies}\n") + Text("Суточный оборот всех криптовалют: \n \$ ${globalData.total24hVolumeUsd}\n") + Text("Процент доминации Биткоина: \n ${formatter.format(globalData.bitcoinPercentageOfMarketCap.toFloat())}%\n") } } } diff --git a/app/src/main/java/ru/vendetti/bitcoin_summarizer/TickerResponse.kt b/app/src/main/java/ru/vendetti/bitcoin_summarizer/TickerResponse.kt index a845db9..30b0dfa 100644 --- a/app/src/main/java/ru/vendetti/bitcoin_summarizer/TickerResponse.kt +++ b/app/src/main/java/ru/vendetti/bitcoin_summarizer/TickerResponse.kt @@ -11,15 +11,15 @@ data class TickerData( val name: String = "", val symbol: String = "", val rank: String = "", - @SerializedName("price_usd") val priceUsd: String = "", - @SerializedName("price_btc") val priceBtc: String = "", - @SerializedName("24h_volume_usd") val volume24hUsd: String = "", - @SerializedName("market_cap_usd") val marketCapUsd: String = "", - @SerializedName("available_supply") val availableSupply: String = "", - @SerializedName("total_supply") val totalSupply: String = "", - @SerializedName("max_supply") val maxSupply: String? = "", - @SerializedName("percent_change_1h") val percentChange1h: String = "", - @SerializedName("percent_change_24h") val percentChange24h: String = "", - @SerializedName("percent_change_7d") val percentChange7d: String = "", + @SerializedName("price_usd") val priceUsd: String = "0.0", + @SerializedName("price_btc") val priceBtc: String = "0.0", + @SerializedName("24h_volume_usd") val volume24hUsd: String = "0", + @SerializedName("market_cap_usd") val marketCapUsd: String = "0", + @SerializedName("available_supply") val availableSupply: String = "0", + @SerializedName("total_supply") val totalSupply: String = "0", + @SerializedName("max_supply") val maxSupply: String? = "0", + @SerializedName("percent_change_1h") val percentChange1h: String = "0", + @SerializedName("percent_change_24h") val percentChange24h: String = "0.0", + @SerializedName("percent_change_7d") val percentChange7d: String = "0.0", @SerializedName("last_updated") val lastUpdated: String = "" ) \ No newline at end of file diff --git a/app/src/main/java/ru/vendetti/bitcoin_summarizer/ui/theme/Color.kt b/app/src/main/java/ru/vendetti/bitcoin_summarizer/ui/theme/Color.kt index 3dc063b..9a3f2ed 100644 --- a/app/src/main/java/ru/vendetti/bitcoin_summarizer/ui/theme/Color.kt +++ b/app/src/main/java/ru/vendetti/bitcoin_summarizer/ui/theme/Color.kt @@ -8,4 +8,12 @@ val Pink80 = Color(0xFFEFB8C8) val Purple40 = Color(0xFF6650a4) val PurpleGrey40 = Color(0xFF625b71) -val Pink40 = Color(0xFF7D5260) \ No newline at end of file +val Pink40 = Color(0xFF7D5260) + +val EnglishViolet = Color(0xFF44355B) +val DarkPurple = Color(0xFF31263E) +val RaisinBlack = Color(0xFF221E22) +val HunyadiYellow = Color(0xFFECA72C) +val Flame = Color(0xFFEE5622) + +val Green2 = Color(0xFFB1E434) \ No newline at end of file diff --git a/app/src/main/java/ru/vendetti/bitcoin_summarizer/ui/theme/Theme.kt b/app/src/main/java/ru/vendetti/bitcoin_summarizer/ui/theme/Theme.kt index fa7ac0a..cf97fbd 100644 --- a/app/src/main/java/ru/vendetti/bitcoin_summarizer/ui/theme/Theme.kt +++ b/app/src/main/java/ru/vendetti/bitcoin_summarizer/ui/theme/Theme.kt @@ -9,43 +9,45 @@ import androidx.compose.material3.dynamicDarkColorScheme import androidx.compose.material3.dynamicLightColorScheme import androidx.compose.material3.lightColorScheme import androidx.compose.runtime.Composable +import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalContext private val DarkColorScheme = darkColorScheme( - primary = Purple80, - secondary = PurpleGrey80, - tertiary = Pink80 + primary = RaisinBlack, + secondary = DarkPurple, + tertiary = EnglishViolet, + + // Other default colors to override + background = DarkPurple, + surface = Color(0xFFFFFBFE), + onPrimary = HunyadiYellow, + onSecondary = HunyadiYellow, + onTertiary = HunyadiYellow, + onBackground = HunyadiYellow, + onSurface = Color(0xFF1C1B1F), ) private val LightColorScheme = lightColorScheme( - primary = Purple40, - secondary = PurpleGrey40, - tertiary = Pink40 + primary = HunyadiYellow, + secondary = Flame, + tertiary = EnglishViolet, - /* Other default colors to override - background = Color(0xFFFFFBFE), + // Other default colors to override + background = Color.White, surface = Color(0xFFFFFBFE), - onPrimary = Color.White, + onPrimary = RaisinBlack, onSecondary = Color.White, onTertiary = Color.White, - onBackground = Color(0xFF1C1B1F), + onBackground = RaisinBlack, onSurface = Color(0xFF1C1B1F), - */ ) @Composable fun BitcoinSummarizerTheme( darkTheme: Boolean = isSystemInDarkTheme(), - // Dynamic color is available on Android 12+ - dynamicColor: Boolean = true, content: @Composable () -> Unit ) { val colorScheme = when { - dynamicColor && Build.VERSION.SDK_INT >= Build.VERSION_CODES.S -> { - val context = LocalContext.current - if (darkTheme) dynamicDarkColorScheme(context) else dynamicLightColorScheme(context) - } - darkTheme -> DarkColorScheme else -> LightColorScheme } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index d2fbf2f..cdc58bf 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,13 +1,13 @@ [versions] -agp = "8.8.2" +agp = "8.9.0" converterGson = "2.9.0" kotlin = "2.0.0" coreKtx = "1.15.0" junit = "4.13.2" junitVersion = "1.2.1" espressoCore = "3.6.1" -kotlinxCoroutinesAndroid = "1.7.3" -kotlinxCoroutinesCore = "1.7.3" +kotlinxCoroutinesAndroid = "1.10.1" +kotlinxCoroutinesCore = "1.10.1" lifecycleRuntimeKtx = "2.8.7" activityCompose = "1.10.1" composeBom = "2025.02.00" diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 85913bb..78a6c6f 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ #Wed Feb 26 23:45:23 YEKT 2025 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists