Browse Source

Increment version to 1.2, add debug build type with suffixes, and enhance ProGuard rules. Update UI components in MainActivity and DashboardContent for improved layout and padding. Refactor BottomTabs and Wallet/Workers screens for consistent padding adjustments.

codeskraps 1 week ago
parent
commit
6b81ef0b13

+ 12 - 3
app/build.gradle.kts

@@ -15,8 +15,8 @@ android {
         applicationId = "com.codeskraps.publicpool"
         applicationId = "com.codeskraps.publicpool"
         minSdk = 26
         minSdk = 26
         targetSdk = 35
         targetSdk = 35
-        versionCode = 2
-        versionName = "1.1"
+        versionCode = 3
+        versionName = "1.2"
 
 
         testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
         testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
         vectorDrawables {
         vectorDrawables {
@@ -25,13 +25,22 @@ android {
     }
     }
 
 
     buildTypes {
     buildTypes {
-        release {
+        debug {
+            applicationIdSuffix = ".debug"
+            versionNameSuffix = "-debug"
             isMinifyEnabled = false
             isMinifyEnabled = false
             proguardFiles(
             proguardFiles(
                 getDefaultProguardFile("proguard-android-optimize.txt"),
                 getDefaultProguardFile("proguard-android-optimize.txt"),
                 "proguard-rules.pro"
                 "proguard-rules.pro"
             )
             )
         }
         }
+        release {
+            isMinifyEnabled = true
+            proguardFiles(
+                getDefaultProguardFile("proguard-android-optimize.txt"),
+                "proguard-rules.pro"
+            )
+        }
     }
     }
     compileOptions {
     compileOptions {
         sourceCompatibility = JavaVersion.VERSION_19
         sourceCompatibility = JavaVersion.VERSION_19

+ 27 - 1
app/proguard-rules.pro

@@ -18,4 +18,30 @@
 
 
 # If you keep the line number information, uncomment this to
 # If you keep the line number information, uncomment this to
 # hide the original source file name.
 # hide the original source file name.
-#-renamesourcefileattribute SourceFile
+#-renamesourcefileattribute SourceFile
+
+# Rules from missing_rules.txt
+-dontwarn javax.servlet.ServletContainerInitializer
+
+# Keep rules for libraries
+# AnyChart
+-keep class com.anychart.** { *; }
+-dontwarn com.anychart.**
+
+# Kotlinx Serialization
+-keepattributes *Annotation*, InnerClasses
+-dontnote kotlinx.serialization.AnnotationsKt
+
+# Ktor
+-keepattributes Signature, InnerClasses, EnclosingMethod
+-keepattributes RuntimeVisibleAnnotations, RuntimeVisibleParameterAnnotations
+-keepattributes AnnotationDefault
+
+# Coil
+-dontwarn okhttp3.internal.**
+-dontwarn okio.**
+
+# General Android
+-keepattributes SourceFile,LineNumberTable
+-keepattributes Signature
+-keepattributes *Annotation*

+ 15 - 4
app/src/main/java/com/codeskraps/publicpool/MainActivity.kt

@@ -7,16 +7,21 @@ import androidx.activity.ComponentActivity
 import androidx.activity.compose.setContent
 import androidx.activity.compose.setContent
 import androidx.activity.enableEdgeToEdge
 import androidx.activity.enableEdgeToEdge
 import androidx.compose.foundation.layout.Box
 import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.Column
 import androidx.compose.foundation.layout.RowScope
 import androidx.compose.foundation.layout.RowScope
 import androidx.compose.foundation.layout.fillMaxSize
 import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.foundation.layout.fillMaxWidth
 import androidx.compose.foundation.layout.padding
 import androidx.compose.foundation.layout.padding
+import androidx.compose.material3.HorizontalDivider
 import androidx.compose.material3.Icon
 import androidx.compose.material3.Icon
+import androidx.compose.material3.MaterialTheme
 import androidx.compose.material3.NavigationBar
 import androidx.compose.material3.NavigationBar
 import androidx.compose.material3.NavigationBarItem
 import androidx.compose.material3.NavigationBarItem
 import androidx.compose.material3.Scaffold
 import androidx.compose.material3.Scaffold
 import androidx.compose.material3.Text
 import androidx.compose.material3.Text
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.Composable
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.Modifier
+import androidx.compose.ui.unit.dp
 import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen
 import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen
 import cafe.adriel.voyager.core.screen.Screen
 import cafe.adriel.voyager.core.screen.Screen
 import cafe.adriel.voyager.navigator.CurrentScreen
 import cafe.adriel.voyager.navigator.CurrentScreen
@@ -78,10 +83,16 @@ class HomeScreen : Screen {
         TabNavigator(DashboardTab) { tabNavigator ->
         TabNavigator(DashboardTab) { tabNavigator ->
             Scaffold(
             Scaffold(
                 bottomBar = {
                 bottomBar = {
-                    NavigationBar {
-                        TabNavigationItem(DashboardTab)
-                        TabNavigationItem(WorkersTab)
-                        TabNavigationItem(WalletTab)
+                    Column {
+                        HorizontalDivider(
+                            thickness = 1.dp,
+                            color = MaterialTheme.colorScheme.outline.copy(alpha = 0.7f)
+                        )
+                        NavigationBar {
+                            TabNavigationItem(DashboardTab)
+                            TabNavigationItem(WorkersTab)
+                            TabNavigationItem(WalletTab)
+                        }
                     }
                     }
                 }
                 }
             ) { innerPadding ->
             ) { innerPadding ->

+ 41 - 21
app/src/main/java/com/codeskraps/publicpool/presentation/dashboard/DashboardContent.kt

@@ -34,6 +34,7 @@ import androidx.compose.material3.TextButton
 import androidx.compose.material3.TopAppBar
 import androidx.compose.material3.TopAppBar
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.LaunchedEffect
 import androidx.compose.runtime.LaunchedEffect
+import androidx.compose.runtime.MutableState
 import androidx.compose.runtime.collectAsState
 import androidx.compose.runtime.collectAsState
 import androidx.compose.runtime.getValue
 import androidx.compose.runtime.getValue
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.mutableStateOf
@@ -42,6 +43,8 @@ import androidx.compose.ui.Alignment
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.graphics.toArgb
 import androidx.compose.ui.graphics.toArgb
+import androidx.compose.ui.layout.onGloballyPositioned
+import androidx.compose.ui.platform.LocalDensity
 import androidx.compose.ui.res.stringResource
 import androidx.compose.ui.res.stringResource
 import androidx.compose.ui.text.font.FontWeight
 import androidx.compose.ui.text.font.FontWeight
 import androidx.compose.ui.unit.dp
 import androidx.compose.ui.unit.dp
@@ -126,13 +129,18 @@ fun DashboardContent(screenModel: DashboardScreenModel) {
             onRefresh = { screenModel.handleEvent(DashboardEvent.RefreshData) },
             onRefresh = { screenModel.handleEvent(DashboardEvent.RefreshData) },
             modifier = Modifier
             modifier = Modifier
                 .fillMaxSize()
                 .fillMaxSize()
-                .padding(paddingValues)
+                .padding(
+                    top = paddingValues.calculateTopPadding(),
+                    start = 0.dp,
+                    end = 0.dp,
+                    bottom = 0.dp
+                )
         ) {
         ) {
             Column(
             Column(
                 modifier = Modifier
                 modifier = Modifier
                     .fillMaxSize()
                     .fillMaxSize()
-                    .padding(horizontal = 16.dp) // Add horizontal padding
-                    .verticalScroll(rememberScrollState()) // Make column scrollable
+                    .padding(horizontal = 16.dp)
+                    .verticalScroll(rememberScrollState())
             ) {
             ) {
                 // Add padding between TopAppBar and first card row
                 // Add padding between TopAppBar and first card row
                 Spacer(modifier = Modifier.height(16.dp))
                 Spacer(modifier = Modifier.height(16.dp))
@@ -159,7 +167,8 @@ fun DashboardContent(screenModel: DashboardScreenModel) {
                 // Chart Section
                 // Chart Section
                 ChartSection(state = state)
                 ChartSection(state = state)
 
 
-                Spacer(modifier = Modifier.height(16.dp)) // Bottom padding
+                // Bottom padding that won't extend beyond the visible area
+                Spacer(modifier = Modifier.height(16.dp))
             }
             }
         }
         }
     }
     }
@@ -177,7 +186,7 @@ fun TopInfoCards(state: DashboardState) {
             secondaryValue = state.clientInfo?.bestDifficulty?.toDoubleOrNull()?.let { numberFormat.format(it) },
             secondaryValue = state.clientInfo?.bestDifficulty?.toDoubleOrNull()?.let { numberFormat.format(it) },
             isLoading = state.isClientInfoLoading,
             isLoading = state.isClientInfoLoading,
             modifier = Modifier.weight(1f),
             modifier = Modifier.weight(1f),
-            showInfoIcon = true
+            showInfoIcon = true,
         )
         )
         Spacer(modifier = Modifier.width(8.dp))
         Spacer(modifier = Modifier.width(8.dp))
         InfoCard(
         InfoCard(
@@ -185,7 +194,7 @@ fun TopInfoCards(state: DashboardState) {
             value = formatLargeNumber(state.networkInfo?.networkDifficulty ?: 0.0),
             value = formatLargeNumber(state.networkInfo?.networkDifficulty ?: 0.0),
             secondaryValue = numberFormat.format(state.networkInfo?.networkDifficulty ?: 0.0),
             secondaryValue = numberFormat.format(state.networkInfo?.networkDifficulty ?: 0.0),
             isLoading = state.isNetworkLoading,
             isLoading = state.isNetworkLoading,
-            modifier = Modifier.weight(1f)
+            modifier = Modifier.weight(1f),
         )
         )
     }
     }
     Spacer(modifier = Modifier.height(8.dp))
     Spacer(modifier = Modifier.height(8.dp))
@@ -194,7 +203,7 @@ fun TopInfoCards(state: DashboardState) {
             label = stringResource(R.string.dashboard_card_label_network_hash_rate),
             label = stringResource(R.string.dashboard_card_label_network_hash_rate),
             value = formatHashRate(state.networkInfo?.networkHashRate ?: 0.0),
             value = formatHashRate(state.networkInfo?.networkHashRate ?: 0.0),
             isLoading = state.isNetworkLoading,
             isLoading = state.isNetworkLoading,
-            modifier = Modifier.weight(1f)
+            modifier = Modifier.weight(1f),
         )
         )
         Spacer(modifier = Modifier.width(8.dp))
         Spacer(modifier = Modifier.width(8.dp))
         InfoCard(
         InfoCard(
@@ -202,7 +211,7 @@ fun TopInfoCards(state: DashboardState) {
             value = numberFormat.format(state.networkInfo?.blockHeight ?: 0L),
             value = numberFormat.format(state.networkInfo?.blockHeight ?: 0L),
             secondaryValue = "${stringResource(R.string.dashboard_card_secondary_block_weight_prefix)} ${numberFormat.format(state.networkInfo?.blockWeight ?: 0L)}",
             secondaryValue = "${stringResource(R.string.dashboard_card_secondary_block_weight_prefix)} ${numberFormat.format(state.networkInfo?.blockWeight ?: 0L)}",
             isLoading = state.isNetworkLoading,
             isLoading = state.isNetworkLoading,
-            modifier = Modifier.weight(1f)
+            modifier = Modifier.weight(1f),
         )
         )
     }
     }
 }
 }
@@ -214,7 +223,7 @@ fun InfoCard(
     isLoading: Boolean,
     isLoading: Boolean,
     modifier: Modifier = Modifier,
     modifier: Modifier = Modifier,
     secondaryValue: String? = null,
     secondaryValue: String? = null,
-    showInfoIcon: Boolean = false
+    showInfoIcon: Boolean = false,
 ) {
 ) {
     val showDialog = remember { mutableStateOf(false) }
     val showDialog = remember { mutableStateOf(false) }
     
     
@@ -235,17 +244,19 @@ fun InfoCard(
         Column(
         Column(
             modifier = Modifier
             modifier = Modifier
                 .fillMaxWidth()
                 .fillMaxWidth()
-                .defaultMinSize(minHeight = 90.dp)
+                .defaultMinSize(minHeight = 100.dp)
                 .padding(12.dp),
                 .padding(12.dp),
-             verticalArrangement = Arrangement.SpaceBetween
+            verticalArrangement = Arrangement.SpaceBetween
         ) {
         ) {
             Row(
             Row(
-                verticalAlignment = Alignment.CenterVertically
+                verticalAlignment = Alignment.Top,
+                modifier = Modifier.fillMaxWidth()
             ) {
             ) {
                 Text(
                 Text(
                     text = label, 
                     text = label, 
                     style = MaterialTheme.typography.labelMedium, 
                     style = MaterialTheme.typography.labelMedium, 
-                    color = MaterialTheme.colorScheme.onSurfaceVariant
+                    color = MaterialTheme.colorScheme.onSurfaceVariant,
+                    modifier = Modifier.weight(1f)
                 )
                 )
                 if (showInfoIcon) {
                 if (showInfoIcon) {
                     Spacer(modifier = Modifier.width(4.dp))
                     Spacer(modifier = Modifier.width(4.dp))
@@ -253,13 +264,20 @@ fun InfoCard(
                         imageVector = Icons.Default.Info,
                         imageVector = Icons.Default.Info,
                         contentDescription = stringResource(R.string.info_icon_description),
                         contentDescription = stringResource(R.string.info_icon_description),
                         modifier = Modifier
                         modifier = Modifier
-                            .size(16.dp)
-                            .clickable { showDialog.value = true },
-                        tint = MaterialTheme.colorScheme.onSurfaceVariant
+                            .size(20.dp)
+                            .clickable(
+                                onClick = { showDialog.value = true },
+                                indication = null,
+                                interactionSource = remember { androidx.compose.foundation.interaction.MutableInteractionSource() }
+                            )
+                            .padding(2.dp),
+                        tint = MaterialTheme.colorScheme.primary
                     )
                     )
                 }
                 }
             }
             }
             
             
+            Spacer(modifier = Modifier.height(8.dp))
+            
             Box(modifier = Modifier.align(Alignment.End)) {
             Box(modifier = Modifier.align(Alignment.End)) {
                 if (isLoading) {
                 if (isLoading) {
                     CircularProgressIndicator(modifier = Modifier.size(20.dp))
                     CircularProgressIndicator(modifier = Modifier.size(20.dp))
@@ -271,11 +289,13 @@ fun InfoCard(
                             fontWeight = FontWeight.Bold,
                             fontWeight = FontWeight.Bold,
                             color = MaterialTheme.colorScheme.onSurface
                             color = MaterialTheme.colorScheme.onSurface
                         )
                         )
-                        Text(
-                            text = secondaryValue ?: "",
-                            style = MaterialTheme.typography.bodySmall,
-                            color = if (secondaryValue != null) PositiveGreen else Color.Transparent
-                        )
+                        if (secondaryValue != null && secondaryValue.isNotEmpty()) {
+                            Text(
+                                text = secondaryValue,
+                                style = MaterialTheme.typography.bodySmall,
+                                color = PositiveGreen
+                            )
+                        }
                     }
                     }
                 }
                 }
             }
             }

+ 21 - 3
app/src/main/java/com/codeskraps/publicpool/presentation/navigation/BottomTabs.kt

@@ -20,7 +20,13 @@ internal data object DashboardTab : Tab {
         get() {
         get() {
             val title = stringResource(id = R.string.tab_title_dashboard)
             val title = stringResource(id = R.string.tab_title_dashboard)
             val icon = rememberVectorPainter(Icons.Default.Home)
             val icon = rememberVectorPainter(Icons.Default.Home)
-            return remember { TabOptions(index = 0u, title = title, icon = icon) }
+            return remember { 
+                TabOptions(
+                    index = 0u, 
+                    title = title, 
+                    icon = icon
+                ) 
+            }
         }
         }
 
 
     @Composable
     @Composable
@@ -36,7 +42,13 @@ internal data object WorkersTab : Tab {
         get() {
         get() {
             val title = stringResource(id = R.string.tab_title_workers)
             val title = stringResource(id = R.string.tab_title_workers)
             val icon = painterResource(id = R.drawable.device_hub)
             val icon = painterResource(id = R.drawable.device_hub)
-            return remember { TabOptions(index = 1u, title = title, icon = icon) }
+            return remember { 
+                TabOptions(
+                    index = 1u, 
+                    title = title, 
+                    icon = icon
+                ) 
+            }
         }
         }
 
 
     @Composable
     @Composable
@@ -52,7 +64,13 @@ internal data object WalletTab : Tab {
         get() {
         get() {
             val title = stringResource(id = R.string.tab_title_wallet)
             val title = stringResource(id = R.string.tab_title_wallet)
             val icon = painterResource(id = R.drawable.wallet)
             val icon = painterResource(id = R.drawable.wallet)
-            return remember { TabOptions(index = 2u, title = title, icon = icon) }
+            return remember { 
+                TabOptions(
+                    index = 2u, 
+                    title = title, 
+                    icon = icon
+                ) 
+            }
         }
         }
 
 
     @Composable
     @Composable

+ 6 - 1
app/src/main/java/com/codeskraps/publicpool/presentation/wallet/WalletScreen.kt

@@ -84,7 +84,12 @@ data object WalletScreen : Screen, Parcelable {
                 onRefresh = { screenModel.handleEvent(WalletEvent.LoadWalletDetails) },
                 onRefresh = { screenModel.handleEvent(WalletEvent.LoadWalletDetails) },
                 modifier = Modifier
                 modifier = Modifier
                     .fillMaxSize()
                     .fillMaxSize()
-                    .padding(paddingValues)
+                    .padding(
+                        top = paddingValues.calculateTopPadding(),
+                        start = 0.dp,
+                        end = 0.dp,
+                        bottom = 0.dp
+                    )
             ) {
             ) {
                 Box(
                 Box(
                     modifier = Modifier.fillMaxSize()
                     modifier = Modifier.fillMaxSize()

+ 6 - 1
app/src/main/java/com/codeskraps/publicpool/presentation/workers/WorkersScreen.kt

@@ -85,7 +85,12 @@ data object WorkersScreen : Screen, Parcelable {
                 onRefresh = { screenModel.handleEvent(WorkersEvent.LoadWorkers) },
                 onRefresh = { screenModel.handleEvent(WorkersEvent.LoadWorkers) },
                 modifier = Modifier
                 modifier = Modifier
                     .fillMaxSize()
                     .fillMaxSize()
-                    .padding(paddingValues)
+                    .padding(
+                        top = paddingValues.calculateTopPadding(),
+                        start = 0.dp,
+                        end = 0.dp,
+                        bottom = 0.dp
+                    )
             ) {
             ) {
                 Box(
                 Box(
                     modifier = Modifier.fillMaxSize()
                     modifier = Modifier.fillMaxSize()