Skip to content

Commit 7e91ef3

Browse files
authored
Merge branch 'master' into feat/swipe-v59
2 parents f7f32e2 + c06c035 commit 7e91ef3

File tree

6 files changed

+544
-144
lines changed

6 files changed

+544
-144
lines changed

app/src/main/java/to/bitkit/ui/components/RectangleButton.kt

Lines changed: 69 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,56 +1,111 @@
11
package to.bitkit.ui.components
22

3+
import androidx.annotation.DrawableRes
4+
import androidx.compose.foundation.background
35
import androidx.compose.foundation.layout.Arrangement
6+
import androidx.compose.foundation.layout.Box
47
import androidx.compose.foundation.layout.Column
58
import androidx.compose.foundation.layout.PaddingValues
6-
import androidx.compose.foundation.layout.Spacer
79
import androidx.compose.foundation.layout.fillMaxWidth
810
import androidx.compose.foundation.layout.height
911
import androidx.compose.foundation.layout.padding
1012
import androidx.compose.foundation.layout.size
11-
import androidx.compose.foundation.layout.width
13+
import androidx.compose.foundation.shape.CircleShape
1214
import androidx.compose.material.icons.Icons
1315
import androidx.compose.material.icons.filled.ContentPaste
1416
import androidx.compose.material3.Button
1517
import androidx.compose.material3.ButtonDefaults
1618
import androidx.compose.material3.Icon
1719
import androidx.compose.runtime.Composable
20+
import androidx.compose.ui.Alignment
1821
import androidx.compose.ui.Modifier
1922
import androidx.compose.ui.draw.alpha
23+
import androidx.compose.ui.draw.clip
2024
import androidx.compose.ui.graphics.Color
25+
import androidx.compose.ui.graphics.painter.Painter
26+
import androidx.compose.ui.graphics.vector.ImageVector
2127
import androidx.compose.ui.res.painterResource
2228
import androidx.compose.ui.tooling.preview.Preview
29+
import androidx.compose.ui.unit.Dp
2330
import androidx.compose.ui.unit.dp
2431
import to.bitkit.R
25-
import to.bitkit.ui.theme.AppShapes
2632
import to.bitkit.ui.theme.AppThemeSurface
2733
import to.bitkit.ui.theme.Colors
34+
import to.bitkit.ui.theme.Shapes
2835

2936
@Composable
3037
fun RectangleButton(
3138
label: String,
32-
icon: @Composable () -> Unit,
3339
modifier: Modifier = Modifier,
40+
@DrawableRes icon: Int? = null,
41+
imageVector: ImageVector? = null,
42+
iconTint: Color = Colors.White,
3443
enabled: Boolean = true,
44+
iconSize: Dp = 20.dp,
3545
onClick: () -> Unit = {},
3646
) {
3747
Button(
3848
onClick = onClick,
3949
colors = ButtonDefaults.buttonColors(
40-
containerColor = Colors.White10,
50+
containerColor = Colors.Gray6,
4151
),
4252
enabled = enabled,
43-
shape = AppShapes.small,
44-
contentPadding = PaddingValues(24.dp),
53+
shape = Shapes.medium,
54+
contentPadding = PaddingValues(horizontal = 16.dp, vertical = 0.dp),
4555
modifier = modifier
4656
.alpha(if (enabled) 1f else 0.5f)
4757
.height(80.dp)
4858
.fillMaxWidth()
4959
) {
50-
icon()
51-
Spacer(modifier = Modifier.width(16.dp))
60+
icon?.let {
61+
CircularIcon(
62+
painter = painterResource(it),
63+
iconTint = iconTint,
64+
iconSize = iconSize
65+
)
66+
}
67+
imageVector?.let {
68+
CircularIcon(
69+
imageVector = it,
70+
iconTint = iconTint,
71+
iconSize = iconSize
72+
)
73+
}
74+
HorizontalSpacer(16.dp)
5275
BodyMSB(text = label, color = Colors.White)
53-
Spacer(modifier = Modifier.weight(1f))
76+
FillWidth()
77+
}
78+
}
79+
80+
@Composable
81+
private fun CircularIcon(
82+
iconTint: Color,
83+
iconSize: Dp,
84+
painter: Painter? = null,
85+
imageVector: ImageVector? = null,
86+
) {
87+
Box(
88+
modifier = Modifier
89+
.clip(CircleShape)
90+
.size(40.dp)
91+
.background(Colors.Black),
92+
contentAlignment = Alignment.Center
93+
) {
94+
when {
95+
painter != null -> Icon(
96+
painter = painter,
97+
contentDescription = null,
98+
tint = iconTint,
99+
modifier = Modifier.size(iconSize),
100+
)
101+
102+
imageVector != null -> Icon(
103+
imageVector = imageVector,
104+
contentDescription = null,
105+
tint = iconTint,
106+
modifier = Modifier.size(iconSize),
107+
)
108+
}
54109
}
55110
}
56111

@@ -64,26 +119,14 @@ private fun RectangleButtonPreview() {
64119
) {
65120
RectangleButton(
66121
label = "Button",
67-
icon = {
68-
Icon(
69-
painter = painterResource(R.drawable.ic_scan),
70-
contentDescription = null,
71-
tint = Color.Unspecified,
72-
modifier = Modifier.size(28.dp),
73-
)
74-
}
122+
icon = R.drawable.ic_scan
75123
)
76124
RectangleButton(
77125
label = "Button Disabled",
78126
enabled = false,
79-
icon = {
80-
Icon(
81-
imageVector = Icons.Default.ContentPaste,
82-
contentDescription = null,
83-
tint = Colors.Brand,
84-
modifier = Modifier.size(28.dp),
85-
)
86-
}
127+
icon = null,
128+
iconTint = Colors.Purple,
129+
imageVector = Icons.Default.ContentPaste,
87130
)
88131
}
89132
}

app/src/main/java/to/bitkit/ui/screens/scanner/QrCodeAnalyzer.kt

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,19 +16,21 @@ import to.bitkit.utils.Logger
1616
class QrCodeAnalyzer(
1717
private val onScanResult: (Result<String>) -> Unit,
1818
) : ImageAnalysis.Analyzer {
19-
private var isScanning = true
19+
private var lastScannedCode: String? = null
20+
private var lastScanTime: Long = 0
21+
private val scanCooldownMs = 2000L // 2 seconds cooldown between scans
2022

2123
private val scannerOptions = BarcodeScannerOptions.Builder()
2224
.setBarcodeFormats(Barcode.FORMAT_QR_CODE)
2325
.build()
2426
private val scanner: BarcodeScanner = BarcodeScanning.getClient(scannerOptions)
2527

26-
override fun analyze(image: ImageProxy) {
27-
if (!isScanning) {
28-
image.close()
29-
return
30-
}
28+
fun reset() {
29+
lastScannedCode = null
30+
lastScanTime = 0
31+
}
3132

33+
override fun analyze(image: ImageProxy) {
3234
if (image.image != null) {
3335
val inputImage = InputImage.fromMediaImage(image.image!!, image.imageInfo.rotationDegrees)
3436
scanner.process(inputImage)
@@ -37,8 +39,15 @@ class QrCodeAnalyzer(
3739
it.result.let { barcodes ->
3840
barcodes.forEach { barcode ->
3941
barcode.rawValue?.let { qrCode ->
40-
isScanning = false
41-
onScanResult(Result.success(qrCode))
42+
val currentTime = System.currentTimeMillis()
43+
val isDifferentCode = qrCode != lastScannedCode
44+
val isCooldownExpired = currentTime - lastScanTime > scanCooldownMs
45+
46+
if (isDifferentCode || isCooldownExpired) {
47+
lastScannedCode = qrCode
48+
lastScanTime = currentTime
49+
onScanResult(Result.success(qrCode))
50+
}
4251
image.close()
4352
return@addOnCompleteListener
4453
}

app/src/main/java/to/bitkit/ui/screens/transfer/FundingAdvancedScreen.kt

Lines changed: 6 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,9 @@ import androidx.compose.foundation.layout.Spacer
66
import androidx.compose.foundation.layout.fillMaxWidth
77
import androidx.compose.foundation.layout.height
88
import androidx.compose.foundation.layout.padding
9-
import androidx.compose.foundation.layout.size
10-
import androidx.compose.material3.Icon
119
import androidx.compose.runtime.Composable
1210
import androidx.compose.ui.Modifier
1311
import androidx.compose.ui.platform.testTag
14-
import androidx.compose.ui.res.painterResource
1512
import androidx.compose.ui.res.stringResource
1613
import androidx.compose.ui.tooling.preview.Preview
1714
import androidx.compose.ui.unit.dp
@@ -58,26 +55,16 @@ fun FundingAdvancedScreen(
5855
) {
5956
RectangleButton(
6057
label = stringResource(R.string.lightning__funding_advanced__button1),
61-
icon = {
62-
Icon(
63-
painter = painterResource(R.drawable.ic_scan),
64-
contentDescription = null,
65-
tint = Colors.Purple,
66-
modifier = Modifier.size(28.dp),
67-
)
68-
},
58+
icon = R.drawable.ic_scan,
59+
iconTint = Colors.Purple,
60+
iconSize = 13.75.dp,
6961
onClick = onLnurl,
7062
)
7163
RectangleButton(
7264
label = stringResource(R.string.lightning__funding_advanced__button2),
73-
icon = {
74-
Icon(
75-
painter = painterResource(R.drawable.ic_pencil_full),
76-
contentDescription = null,
77-
tint = Colors.Purple,
78-
modifier = Modifier.size(28.dp),
79-
)
80-
},
65+
icon = R.drawable.ic_pencil_full,
66+
iconTint = Colors.Purple,
67+
iconSize = 13.37.dp,
8168
onClick = onManual,
8269
modifier = Modifier.testTag("FundManual")
8370
)

app/src/main/java/to/bitkit/ui/screens/transfer/FundingScreen.kt

Lines changed: 7 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,7 @@ import androidx.compose.foundation.layout.Spacer
88
import androidx.compose.foundation.layout.fillMaxWidth
99
import androidx.compose.foundation.layout.height
1010
import androidx.compose.foundation.layout.padding
11-
import androidx.compose.foundation.layout.size
1211
import androidx.compose.material3.AlertDialog
13-
import androidx.compose.material3.Icon
1412
import androidx.compose.material3.MaterialTheme
1513
import androidx.compose.material3.TextButton
1614
import androidx.compose.runtime.Composable
@@ -19,9 +17,7 @@ import androidx.compose.runtime.mutableStateOf
1917
import androidx.compose.runtime.remember
2018
import androidx.compose.runtime.setValue
2119
import androidx.compose.ui.Modifier
22-
import androidx.compose.ui.graphics.Color
2320
import androidx.compose.ui.platform.testTag
24-
import androidx.compose.ui.res.painterResource
2521
import androidx.compose.ui.res.stringResource
2622
import androidx.compose.ui.tooling.preview.Preview
2723
import androidx.compose.ui.unit.dp
@@ -83,14 +79,8 @@ fun FundingScreen(
8379
Box {
8480
RectangleButton(
8581
label = stringResource(R.string.lightning__funding__button1),
86-
icon = {
87-
Icon(
88-
painter = painterResource(R.drawable.ic_transfer),
89-
contentDescription = null,
90-
tint = Colors.Purple,
91-
modifier = Modifier.size(28.dp),
92-
)
93-
},
82+
icon = R.drawable.ic_transfer,
83+
iconTint = Colors.Purple,
9484
enabled = canTransfer && !isGeoBlocked,
9585
onClick = onTransfer,
9686
modifier = Modifier.testTag("FundTransfer")
@@ -111,28 +101,17 @@ fun FundingScreen(
111101
}
112102
RectangleButton(
113103
label = stringResource(R.string.lightning__funding__button2),
114-
icon = {
115-
Icon(
116-
painter = painterResource(R.drawable.ic_qr_purple),
117-
contentDescription = null,
118-
tint = Color.Unspecified,
119-
modifier = Modifier.size(28.dp),
120-
)
121-
},
104+
icon = R.drawable.ic_qr_purple,
105+
iconTint = Colors.Purple,
106+
iconSize = 13.75.dp,
122107
enabled = !isGeoBlocked,
123108
onClick = onFund,
124109
modifier = Modifier.testTag("FundReceive")
125110
)
126111
RectangleButton(
127112
label = stringResource(R.string.lightning__funding__button3),
128-
icon = {
129-
Icon(
130-
painter = painterResource(R.drawable.ic_share_purple),
131-
contentDescription = null,
132-
tint = Color.Unspecified,
133-
modifier = Modifier.size(28.dp),
134-
)
135-
},
113+
icon = R.drawable.ic_share_purple,
114+
iconTint = Colors.Purple,
136115
onClick = onAdvanced,
137116
modifier = Modifier.testTag("FundCustom")
138117
)

0 commit comments

Comments
 (0)