20 Commits

Author SHA1 Message Date
07ad6cb59d Merge pull request 'dev' (#16) from dev into main
All checks were successful
Gitea Android Builder / Build (push) Successful in 1m56s
Reviewed-on: #16
2025-03-05 03:51:27 +03:00
a1b7569ef0 Merge pull request 'pipeline-test' (#15) from pipeline-test into main
All checks were successful
Gitea Android Builder / Build (push) Successful in 59s
Reviewed-on: #15
2025-03-04 22:06:06 +03:00
d1bc545a07 CI/CD time optimization attempt 6
All checks were successful
Gitea Android Builder / Build (push) Successful in 55s
2025-03-04 23:44:32 +05:00
9c184c08a8 CI/CD time optimization attempt 6
Some checks failed
Gitea Android Builder / Build (push) Failing after 54s
2025-03-04 23:40:39 +05:00
186f1e693c CI/CD time optimization attempt 5
Some checks failed
Gitea Android Builder / Build (push) Failing after 46s
2025-03-04 23:36:03 +05:00
3e6e44c4b3 CI/CD time optimization attempt 5
Some checks failed
Gitea Android Builder / Build (push) Failing after 58s
2025-03-04 23:32:49 +05:00
da80ba3abd CI/CD time optimization attempt 5
All checks were successful
Gitea Android Builder / Build (push) Successful in 57s
2025-03-04 23:27:17 +05:00
f05f4fbbad CI/CD time optimization attempt 4
All checks were successful
Gitea Android Builder / Build (push) Successful in 1m3s
2025-03-04 23:18:04 +05:00
91a8b0380b CI/CD time optimization attempt 3
All checks were successful
Gitea Android Builder / Build (push) Successful in 1m8s
2025-03-04 23:15:46 +05:00
3b196de1d8 CI/CD time optimization attempt 2
All checks were successful
Gitea Android Builder / Build (push) Successful in 55s
2025-03-04 22:43:32 +05:00
b4beaf4f94 CI/CD time optimization attempt
All checks were successful
Gitea Android Builder / Build (push) Successful in 2m58s
2025-03-04 22:37:45 +05:00
85c9bd50cd Merge pull request 'MVP' (#14) from dev into main
All checks were successful
Gitea Android Builder / Build (push) Successful in 1m9s
Reviewed-on: #14
2025-03-03 22:21:51 +03:00
d3d7bd391b Merge pull request 'Dependencies updated and example screen added' (#13) from dev into main
All checks were successful
Gitea Android Builder / Build (push) Successful in 2m20s
Reviewed-on: #13
2025-03-03 19:52:52 +03:00
e6d8a5b7aa Merge pull request 'Data classes and other retrofit logic added' (#12) from dev into main
All checks were successful
Gitea Android Builder / Build (push) Successful in 2m20s
Reviewed-on: #12
2025-03-03 19:28:18 +03:00
fa0905486a Merge pull request 'CI/CD revamp fix' (#11) from dev into main
All checks were successful
Gitea Android Builder / Build (push) Successful in 1m4s
Reviewed-on: #11
2025-02-27 20:36:18 +03:00
d0598853bd Merge pull request 'CI/CD revamp fix' (#10) from dev into main
All checks were successful
Gitea Android Builder / Build (push) Successful in 1m15s
Reviewed-on: #10
2025-02-27 20:34:09 +03:00
9dfdd328db Merge pull request 'CI/CD revamp fix' (#9) from dev into main
All checks were successful
Gitea Android Builder / Build (push) Successful in 3m52s
Reviewed-on: #9
2025-02-27 20:06:45 +03:00
fd77fbd97e Merge pull request 'CI/CD revamp fix' (#8) from dev into main
Some checks failed
Gitea Android Builder / Build (push) Failing after 5m38s
Reviewed-on: #8
2025-02-27 19:55:30 +03:00
08bdb6f481 Merge pull request 'CI/CD revamp fix' (#7) from dev into main
Some checks failed
Gitea Android Builder / Build (push) Failing after 1m50s
Reviewed-on: #7
2025-02-27 19:48:13 +03:00
f33906b965 Merge pull request 'dev' (#6) from dev into main
Some checks failed
Gitea Android Builder / Build (push) Failing after 29s
Reviewed-on: #6
2025-02-27 19:45:38 +03:00
24 changed files with 302 additions and 133 deletions

View File

@@ -4,6 +4,7 @@ on:
push: push:
branches: branches:
- main - main
- pipeline-test
jobs: jobs:
Build: Build:
@@ -12,7 +13,7 @@ jobs:
- name: Checkout the repo - name: Checkout the repo
uses: actions/checkout@v4 uses: actions/checkout@v4
- name: Set up JDK 23 - name: Set up JDK 23
uses: actions/setup-java@v3 uses: actions/setup-java@v4
with: with:
java-version: '23' java-version: '23'
distribution: 'temurin' distribution: 'temurin'
@@ -20,6 +21,13 @@ jobs:
uses: android-actions/setup-android@v3 uses: android-actions/setup-android@v3
- name: Grant execute permission for gradlew - name: Grant execute permission for gradlew
run: chmod +x gradlew run: chmod +x gradlew
- name: Cache Gradle packages
uses: actions/cache@v3
with:
path: |
~/.gradle/caches
~/.gradle/wrapper
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
- name: Build with Gradle - name: Build with Gradle
uses: gradle/gradle-build-action@v2 uses: gradle/gradle-build-action@v2
with: with:

7
.gitignore vendored
View File

@@ -1,7 +1,12 @@
*.iml *.iml
.gradle .gradle
/local.properties /local.properties
/.idea /.idea/caches
/.idea/libraries
/.idea/modules.xml
/.idea/workspace.xml
/.idea/navEditor.xml
/.idea/assetWizardSettings.xml
.DS_Store .DS_Store
/build /build
/captures /captures

3
.idea/.gitignore generated vendored Normal file
View File

@@ -0,0 +1,3 @@
# Default ignored files
/shelf/
/workspace.xml

1
.idea/.name generated Normal file
View File

@@ -0,0 +1 @@
Bitcoin summarizer

123
.idea/codeStyles/Project.xml generated Normal file
View File

@@ -0,0 +1,123 @@
<component name="ProjectCodeStyleConfiguration">
<code_scheme name="Project" version="173">
<JetCodeStyleSettings>
<option name="CODE_STYLE_DEFAULTS" value="KOTLIN_OFFICIAL" />
</JetCodeStyleSettings>
<codeStyleSettings language="XML">
<option name="FORCE_REARRANGE_MODE" value="1" />
<indentOptions>
<option name="CONTINUATION_INDENT_SIZE" value="4" />
</indentOptions>
<arrangement>
<rules>
<section>
<rule>
<match>
<AND>
<NAME>xmlns:android</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>^$</XML_NAMESPACE>
</AND>
</match>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>xmlns:.*</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>^$</XML_NAMESPACE>
</AND>
</match>
<order>BY_NAME</order>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>.*:id</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
</AND>
</match>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>.*:name</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
</AND>
</match>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>name</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>^$</XML_NAMESPACE>
</AND>
</match>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>style</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>^$</XML_NAMESPACE>
</AND>
</match>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>.*</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>^$</XML_NAMESPACE>
</AND>
</match>
<order>BY_NAME</order>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>.*</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
</AND>
</match>
<order>ANDROID_ATTRIBUTE_ORDER</order>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>.*</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>.*</XML_NAMESPACE>
</AND>
</match>
<order>BY_NAME</order>
</rule>
</section>
</rules>
</arrangement>
</codeStyleSettings>
<codeStyleSettings language="kotlin">
<option name="CODE_STYLE_DEFAULTS" value="KOTLIN_OFFICIAL" />
</codeStyleSettings>
</code_scheme>
</component>

5
.idea/codeStyles/codeStyleConfig.xml generated Normal file
View File

@@ -0,0 +1,5 @@
<component name="ProjectCodeStyleConfiguration">
<state>
<option name="USE_PER_PROJECT_SETTINGS" value="true" />
</state>
</component>

6
.idea/compiler.xml generated Normal file
View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CompilerConfiguration">
<bytecodeTargetLevel target="21" />
</component>
</project>

10
.idea/deploymentTargetSelector.xml generated Normal file
View File

@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="deploymentTargetSelector">
<selectionStates>
<SelectionState runConfigName="app">
<option name="selectionMode" value="DROPDOWN" />
</SelectionState>
</selectionStates>
</component>
</project>

20
.idea/gradle.xml generated Normal file
View File

@@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="GradleMigrationSettings" migrationVersion="1" />
<component name="GradleSettings">
<option name="linkedExternalProjectsSettings">
<GradleProjectSettings>
<option name="testRunner" value="CHOOSE_PER_TEST" />
<option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="gradleJvm" value="#GRADLE_LOCAL_JAVA_HOME" />
<option name="modules">
<set>
<option value="$PROJECT_DIR$" />
<option value="$PROJECT_DIR$/app" />
</set>
</option>
<option name="resolveExternalAnnotations" value="false" />
</GradleProjectSettings>
</option>
</component>
</project>

6
.idea/kotlinc.xml generated Normal file
View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="KotlinJpsPluginSettings">
<option name="version" value="2.0.0" />
</component>
</project>

10
.idea/migrations.xml generated Normal file
View File

@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectMigrations">
<option name="MigrateToGradleLocalJavaHome">
<set>
<option value="$PROJECT_DIR$" />
</set>
</option>
</component>
</project>

10
.idea/misc.xml generated Normal file
View File

@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ExternalStorageConfigurationManager" enabled="true" />
<component name="ProjectRootManager" version="2" languageLevel="JDK_21" default="true" project-jdk-name="jbr-21" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/build/classes" />
</component>
<component name="ProjectType">
<option name="id" value="Android" />
</component>
</project>

17
.idea/runConfigurations.xml generated Normal file
View File

@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="RunConfigurationProducerService">
<option name="ignoredProducers">
<set>
<option value="com.intellij.execution.junit.AbstractAllInDirectoryConfigurationProducer" />
<option value="com.intellij.execution.junit.AllInPackageConfigurationProducer" />
<option value="com.intellij.execution.junit.PatternConfigurationProducer" />
<option value="com.intellij.execution.junit.TestInClassConfigurationProducer" />
<option value="com.intellij.execution.junit.UniqueIdConfigurationProducer" />
<option value="com.intellij.execution.junit.testDiscovery.JUnitTestDiscoveryConfigurationProducer" />
<option value="org.jetbrains.kotlin.idea.junit.KotlinJUnitRunConfigurationProducer" />
<option value="org.jetbrains.kotlin.idea.junit.KotlinPatternConfigurationProducer" />
</set>
</option>
</component>
</project>

6
.idea/vcs.xml generated Normal file
View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
</component>
</project>

View File

@@ -12,8 +12,8 @@ android {
applicationId = "ru.vendetti.bitcoin_summarizer" applicationId = "ru.vendetti.bitcoin_summarizer"
minSdk = 29 minSdk = 29
targetSdk = 35 targetSdk = 35
versionCode = 2 versionCode = 1
versionName = "1.2" versionName = "1.0"
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
} }

View File

@@ -3,13 +3,13 @@
xmlns:tools="http://schemas.android.com/tools"> xmlns:tools="http://schemas.android.com/tools">
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.INTERNET" />
<application <application
android:allowBackup="false" android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules" android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules" android:fullBackupContent="@xml/backup_rules"
android:icon="@mipmap/ic_launcher" android:icon="@mipmap/ic_launcher"
android:label="@string/app_name" android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round" android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="false" android:supportsRtl="true"
android:theme="@style/Theme.BitcoinSummarizer" android:theme="@style/Theme.BitcoinSummarizer"
tools:targetApi="31"> tools:targetApi="31">
<activity <activity

View File

@@ -7,5 +7,5 @@ data class GlobalResponse(
@SerializedName("active_currencies") val activeCryptocurrencies: String = "", @SerializedName("active_currencies") val activeCryptocurrencies: String = "",
@SerializedName("total_market_cap_usd") val totalMarketCapUsd: String = "", @SerializedName("total_market_cap_usd") val totalMarketCapUsd: String = "",
@SerializedName("total_24h_volume_usd") val total24hVolumeUsd: String = "", @SerializedName("total_24h_volume_usd") val total24hVolumeUsd: String = "",
@SerializedName("bitcoin_percentage_of_market_cap") val bitcoinPercentageOfMarketCap: String = "0.0" @SerializedName("bitcoin_percentage_of_market_cap") val bitcoinPercentageOfMarketCap: String = ""
) )

View File

@@ -4,7 +4,6 @@ import android.annotation.SuppressLint
import android.os.Bundle import android.os.Bundle
import androidx.activity.ComponentActivity import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent import androidx.activity.compose.setContent
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.PaddingValues
@@ -43,43 +42,28 @@ import androidx.compose.ui.unit.TextUnit
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp import androidx.compose.ui.unit.sp
import com.patrykandpatrick.vico.compose.cartesian.CartesianChartHost import com.patrykandpatrick.vico.compose.cartesian.CartesianChartHost
import com.patrykandpatrick.vico.compose.cartesian.axis.rememberAxisLabelComponent
import com.patrykandpatrick.vico.compose.cartesian.axis.rememberAxisLineComponent
import com.patrykandpatrick.vico.compose.cartesian.axis.rememberBottom import com.patrykandpatrick.vico.compose.cartesian.axis.rememberBottom
import com.patrykandpatrick.vico.compose.cartesian.axis.rememberStart import com.patrykandpatrick.vico.compose.cartesian.axis.rememberStart
import com.patrykandpatrick.vico.compose.cartesian.layer.rememberLine
import com.patrykandpatrick.vico.compose.cartesian.layer.rememberLineCartesianLayer import com.patrykandpatrick.vico.compose.cartesian.layer.rememberLineCartesianLayer
import com.patrykandpatrick.vico.compose.cartesian.rememberCartesianChart import com.patrykandpatrick.vico.compose.cartesian.rememberCartesianChart
import com.patrykandpatrick.vico.compose.cartesian.rememberVicoZoomState import com.patrykandpatrick.vico.compose.cartesian.rememberVicoZoomState
import com.patrykandpatrick.vico.compose.common.component.rememberLineComponent
import com.patrykandpatrick.vico.compose.common.component.rememberTextComponent import com.patrykandpatrick.vico.compose.common.component.rememberTextComponent
import com.patrykandpatrick.vico.compose.common.component.shapeComponent import com.patrykandpatrick.vico.compose.common.component.shapeComponent
import com.patrykandpatrick.vico.compose.common.fill import com.patrykandpatrick.vico.compose.common.fill
import com.patrykandpatrick.vico.compose.common.shape.rounded import com.patrykandpatrick.vico.compose.common.shape.rounded
import com.patrykandpatrick.vico.compose.common.vicoTheme
import com.patrykandpatrick.vico.core.cartesian.Zoom import com.patrykandpatrick.vico.core.cartesian.Zoom
import com.patrykandpatrick.vico.core.cartesian.axis.BaseAxis
import com.patrykandpatrick.vico.core.cartesian.axis.HorizontalAxis import com.patrykandpatrick.vico.core.cartesian.axis.HorizontalAxis
import com.patrykandpatrick.vico.core.cartesian.axis.VerticalAxis import com.patrykandpatrick.vico.core.cartesian.axis.VerticalAxis
import com.patrykandpatrick.vico.core.cartesian.data.CartesianChartModelProducer import com.patrykandpatrick.vico.core.cartesian.data.CartesianChartModelProducer
import com.patrykandpatrick.vico.core.cartesian.data.CartesianLayerRangeProvider
import com.patrykandpatrick.vico.core.cartesian.data.lineSeries import com.patrykandpatrick.vico.core.cartesian.data.lineSeries
import com.patrykandpatrick.vico.core.cartesian.decoration.HorizontalLine import com.patrykandpatrick.vico.core.cartesian.decoration.HorizontalLine
import com.patrykandpatrick.vico.core.cartesian.layer.LineCartesianLayer
import com.patrykandpatrick.vico.core.common.Position import com.patrykandpatrick.vico.core.common.Position
import com.patrykandpatrick.vico.core.common.component.LineComponent import com.patrykandpatrick.vico.core.common.component.LineComponent
import com.patrykandpatrick.vico.core.common.component.TextComponent import com.patrykandpatrick.vico.core.common.component.TextComponent
import com.patrykandpatrick.vico.core.common.shape.CorneredShape import com.patrykandpatrick.vico.core.common.shape.CorneredShape
import ru.vendetti.bitcoin_summarizer.ui.theme.BitcoinSummarizerTheme import ru.vendetti.bitcoin_summarizer.ui.theme.BitcoinSummarizerTheme
import ru.vendetti.bitcoin_summarizer.ui.theme.EnglishViolet
import ru.vendetti.bitcoin_summarizer.ui.theme.Flame
import ru.vendetti.bitcoin_summarizer.ui.theme.Green2
import java.text.DateFormat import java.text.DateFormat
import java.text.DecimalFormat
import java.text.SimpleDateFormat
import java.time.format.DateTimeFormatter import java.time.format.DateTimeFormatter
import java.util.Date
import kotlin.math.roundToInt
class MainActivity : ComponentActivity() { class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
@@ -92,7 +76,7 @@ class MainActivity : ComponentActivity() {
} }
} }
@SuppressLint("MutableCollectionMutableState", "SimpleDateFormat") @SuppressLint("MutableCollectionMutableState")
@OptIn(ExperimentalMaterial3Api::class) @OptIn(ExperimentalMaterial3Api::class)
@Preview @Preview
@Composable @Composable
@@ -125,24 +109,15 @@ fun CryptoScreen() {
LaunchedEffect(fearGreedDataList) { LaunchedEffect(fearGreedDataList) {
modelProducer.runTransaction { modelProducer.runTransaction {
var numberValues = Array<Int>(fearGreedDataList.count()) { var numberValues = Array<Int>(fearGreedDataList.count()) { index -> fearGreedDataList[index].value.toInt() }
index ->
fearGreedDataList[fearGreedDataList.count() - index - 1]
.value.toInt()
}
if(numberValues.isEmpty()) if(numberValues.isEmpty())
numberValues = Array<Int>(1) {0} numberValues = Array<Int>(1) {0}
lineSeries { series(numberValues.toList()) } lineSeries { series(numberValues.toList()) }
} }
} }
val scrollBehavior = TopAppBarDefaults.enterAlwaysScrollBehavior(rememberTopAppBarState()) val scrollBehavior = TopAppBarDefaults.enterAlwaysScrollBehavior(rememberTopAppBarState())
val zoomState = rememberVicoZoomState( val zoomState = rememberVicoZoomState(initialZoom = Zoom.x(fearGreedIndexDaysCount.toDouble()))
zoomEnabled = false,
initialZoom = Zoom.x(fearGreedIndexDaysCount.toDouble()))
// Отображаем результаты на странице // Отображаем результаты на странице
Scaffold ( Scaffold (
modifier = Modifier modifier = Modifier
@@ -151,11 +126,8 @@ fun CryptoScreen() {
topBar = { topBar = {
MediumTopAppBar( MediumTopAppBar(
colors = TopAppBarDefaults.topAppBarColors( colors = TopAppBarDefaults.topAppBarColors(
containerColor = MaterialTheme.colorScheme.primary, containerColor = MaterialTheme.colorScheme.primaryContainer,
scrolledContainerColor = MaterialTheme.colorScheme.primary, titleContentColor = MaterialTheme.colorScheme.primary,
titleContentColor = MaterialTheme.colorScheme.onPrimary,
navigationIconContentColor = MaterialTheme.colorScheme.onPrimary,
actionIconContentColor = MaterialTheme.colorScheme.onPrimary,
), ),
title = { title = {
Text( Text(
@@ -187,7 +159,7 @@ fun CryptoScreen() {
{ innerPadding -> { innerPadding ->
Box( Box(
modifier = Modifier modifier = Modifier
.background(Color.Transparent) .fillMaxSize()
.padding(innerPadding) .padding(innerPadding)
.verticalScroll(rememberScrollState()) .verticalScroll(rememberScrollState())
) { ) {
@@ -199,44 +171,27 @@ fun CryptoScreen() {
CartesianChartHost( CartesianChartHost(
zoomState = zoomState, zoomState = zoomState,
chart = rememberCartesianChart( 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( startAxis = VerticalAxis.rememberStart(
title = "FGI", titleComponent = rememberTextComponent(),
titleComponent = rememberTextComponent(MaterialTheme.colorScheme.onPrimary), title = "FGI"
line = rememberAxisLineComponent(fill(MaterialTheme.colorScheme.onPrimary)),
label = rememberAxisLabelComponent(MaterialTheme.colorScheme.onPrimary)
), ),
bottomAxis = HorizontalAxis.rememberBottom( bottomAxis = HorizontalAxis.rememberBottom(
title = "last $fearGreedIndexDaysCount days", titleComponent = rememberTextComponent(),
titleComponent = rememberTextComponent(MaterialTheme.colorScheme.onPrimary), title = "last $fearGreedIndexDaysCount days"
line = rememberAxisLineComponent(fill(MaterialTheme.colorScheme.onPrimary)),
label = rememberAxisLabelComponent(MaterialTheme.colorScheme.onPrimary)
), ),
decorations = listOf( decorations = listOf(
remember { remember {
HorizontalLine( HorizontalLine(
y = { 25.toDouble() }, y = { 15.toDouble() },
line = LineComponent(fill(Flame), 2f), line = LineComponent(fill(Color.Red), 2f),
labelComponent = TextComponent( labelComponent = TextComponent(
background = background =
shapeComponent( shapeComponent(
fill(Flame), fill(Color.Red),
CorneredShape.rounded( CorneredShape.rounded(
topLeft = 4.dp, bottomLeft = 4.dp,
topRight = 4.dp bottomRight = 4.dp
) )
), ),
), ),
@@ -246,12 +201,12 @@ fun CryptoScreen() {
}, },
remember { remember {
HorizontalLine( HorizontalLine(
y = { 70.toDouble() }, y = { 60.toDouble() },
line = LineComponent(fill(Green2), 2f), line = LineComponent(fill(Color.Green), 2f),
labelComponent = TextComponent( labelComponent = TextComponent(
background = background =
shapeComponent( shapeComponent(
fill(Green2), fill(Color.Green),
CorneredShape.rounded( CorneredShape.rounded(
bottomLeft = 4.dp, bottomLeft = 4.dp,
bottomRight = 4.dp bottomRight = 4.dp
@@ -274,23 +229,15 @@ fun CryptoScreen() {
.align(alignment = Alignment.CenterHorizontally), .align(alignment = Alignment.CenterHorizontally),
fontSize = 24.sp fontSize = 24.sp
) )
val formatter = DecimalFormat("0.00") Text("Текущая цена: \n ${bitcoinTicker.priceUsd}\n")
Text("Текущая цена: \n \$ ${formatter.format(bitcoinTicker.priceUsd.toFloat())}\n") Text("Суточный оборот: \n ${bitcoinTicker.volume24hUsd}\n")
Text("Суточный оборот: \n \$ ${bitcoinTicker.volume24hUsd}\n") Text("Капитализация: \n ${bitcoinTicker.marketCapUsd}\n")
Text("Капитализация: \n \$ ${bitcoinTicker.marketCapUsd}\n")
Text( Text(
"Изменение курса за: " + "Изменение курса за: " +
"\n Сутки: ${formatter.format(bitcoinTicker.percentChange24h.toFloat())}% " + "\n Сутки: ${bitcoinTicker.percentChange24h} " +
"\n Неделю: ${formatter.format(bitcoinTicker.percentChange7d.toFloat())}%\n" "\n Неделю: ${bitcoinTicker.percentChange7d}\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) HorizontalDivider(thickness = 2.dp)
Text( Text(
@@ -299,10 +246,10 @@ fun CryptoScreen() {
.align(alignment = Alignment.CenterHorizontally), .align(alignment = Alignment.CenterHorizontally),
fontSize = 24.sp fontSize = 24.sp
) )
Text("Общая капитализация крипторынка: \n \$ ${globalData.totalMarketCapUsd}\n") Text("Общая капитализация крипторынка: \n ${globalData.totalMarketCapUsd}\n")
Text("Всего тикеров: \n ${globalData.activeCryptocurrencies}\n") Text("Всего видов криптовалют: \n ${globalData.activeCryptocurrencies}\n")
Text("Суточный оборот всех криптовалют: \n \$ ${globalData.total24hVolumeUsd}\n") Text("Суточный оборот других криптовалют: \n ${globalData.total24hVolumeUsd}\n")
Text("Процент доминации Биткоина: \n ${formatter.format(globalData.bitcoinPercentageOfMarketCap.toFloat())}%\n") Text("Процент доминации Биткоина: \n ${globalData.bitcoinPercentageOfMarketCap}\n")
} }
} }
} }

View File

@@ -11,15 +11,15 @@ data class TickerData(
val name: String = "", val name: String = "",
val symbol: String = "", val symbol: String = "",
val rank: String = "", val rank: String = "",
@SerializedName("price_usd") val priceUsd: String = "0.0", @SerializedName("price_usd") val priceUsd: String = "",
@SerializedName("price_btc") val priceBtc: String = "0.0", @SerializedName("price_btc") val priceBtc: String = "",
@SerializedName("24h_volume_usd") val volume24hUsd: String = "0", @SerializedName("24h_volume_usd") val volume24hUsd: String = "",
@SerializedName("market_cap_usd") val marketCapUsd: String = "0", @SerializedName("market_cap_usd") val marketCapUsd: String = "",
@SerializedName("available_supply") val availableSupply: String = "0", @SerializedName("available_supply") val availableSupply: String = "",
@SerializedName("total_supply") val totalSupply: String = "0", @SerializedName("total_supply") val totalSupply: String = "",
@SerializedName("max_supply") val maxSupply: String? = "0", @SerializedName("max_supply") val maxSupply: String? = "",
@SerializedName("percent_change_1h") val percentChange1h: String = "0", @SerializedName("percent_change_1h") val percentChange1h: String = "",
@SerializedName("percent_change_24h") val percentChange24h: String = "0.0", @SerializedName("percent_change_24h") val percentChange24h: String = "",
@SerializedName("percent_change_7d") val percentChange7d: String = "0.0", @SerializedName("percent_change_7d") val percentChange7d: String = "",
@SerializedName("last_updated") val lastUpdated: String = "" @SerializedName("last_updated") val lastUpdated: String = ""
) )

View File

@@ -9,11 +9,3 @@ val Pink80 = Color(0xFFEFB8C8)
val Purple40 = Color(0xFF6650a4) val Purple40 = Color(0xFF6650a4)
val PurpleGrey40 = Color(0xFF625b71) val PurpleGrey40 = Color(0xFF625b71)
val Pink40 = Color(0xFF7D5260) 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)

View File

@@ -9,45 +9,43 @@ import androidx.compose.material3.dynamicDarkColorScheme
import androidx.compose.material3.dynamicLightColorScheme import androidx.compose.material3.dynamicLightColorScheme
import androidx.compose.material3.lightColorScheme import androidx.compose.material3.lightColorScheme
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalContext
private val DarkColorScheme = darkColorScheme( private val DarkColorScheme = darkColorScheme(
primary = RaisinBlack, primary = Purple80,
secondary = DarkPurple, secondary = PurpleGrey80,
tertiary = EnglishViolet, tertiary = Pink80
// 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( private val LightColorScheme = lightColorScheme(
primary = HunyadiYellow, primary = Purple40,
secondary = Flame, secondary = PurpleGrey40,
tertiary = EnglishViolet, tertiary = Pink40
// Other default colors to override /* Other default colors to override
background = Color.White, background = Color(0xFFFFFBFE),
surface = Color(0xFFFFFBFE), surface = Color(0xFFFFFBFE),
onPrimary = RaisinBlack, onPrimary = Color.White,
onSecondary = Color.White, onSecondary = Color.White,
onTertiary = Color.White, onTertiary = Color.White,
onBackground = RaisinBlack, onBackground = Color(0xFF1C1B1F),
onSurface = Color(0xFF1C1B1F), onSurface = Color(0xFF1C1B1F),
*/
) )
@Composable @Composable
fun BitcoinSummarizerTheme( fun BitcoinSummarizerTheme(
darkTheme: Boolean = isSystemInDarkTheme(), darkTheme: Boolean = isSystemInDarkTheme(),
// Dynamic color is available on Android 12+
dynamicColor: Boolean = true,
content: @Composable () -> Unit content: @Composable () -> Unit
) { ) {
val colorScheme = when { 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 darkTheme -> DarkColorScheme
else -> LightColorScheme else -> LightColorScheme
} }

View File

@@ -21,3 +21,5 @@ kotlin.code.style=official
# resources declared in the library itself and none from the library's dependencies, # resources declared in the library itself and none from the library's dependencies,
# thereby reducing the size of the R class for that library # thereby reducing the size of the R class for that library
android.nonTransitiveRClass=true android.nonTransitiveRClass=true
org.gradle.caching=true
org.gradle.parallel=true

View File

@@ -1,13 +1,13 @@
[versions] [versions]
agp = "8.9.0" agp = "8.8.2"
converterGson = "2.9.0" converterGson = "2.9.0"
kotlin = "2.0.0" kotlin = "2.0.0"
coreKtx = "1.15.0" coreKtx = "1.15.0"
junit = "4.13.2" junit = "4.13.2"
junitVersion = "1.2.1" junitVersion = "1.2.1"
espressoCore = "3.6.1" espressoCore = "3.6.1"
kotlinxCoroutinesAndroid = "1.10.1" kotlinxCoroutinesAndroid = "1.7.3"
kotlinxCoroutinesCore = "1.10.1" kotlinxCoroutinesCore = "1.7.3"
lifecycleRuntimeKtx = "2.8.7" lifecycleRuntimeKtx = "2.8.7"
activityCompose = "1.10.1" activityCompose = "1.10.1"
composeBom = "2025.02.00" composeBom = "2025.02.00"

View File

@@ -1,6 +1,6 @@
#Wed Feb 26 23:45:23 YEKT 2025 #Wed Feb 26 23:45:23 YEKT 2025
distributionBase=GRADLE_USER_HOME distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-bin.zip distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-bin.zip
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists zipStorePath=wrapper/dists