Skip to content

Commit d240be7

Browse files
authored
Merge pull request #493 from code-payments/chore/clean-up-access-key-gen
Chore/clean up access key gen
2 parents dbbde28 + db7664c commit d240be7

7 files changed

Lines changed: 88 additions & 71 deletions

File tree

app/build.gradle.kts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -190,7 +190,6 @@ dependencies {
190190
implementation(Libs.hilt_nav_compose)
191191
implementation(Libs.lib_phone_number_port)
192192
implementation(Libs.mp_android_chart)
193-
implementation(Libs.qr_generator)
194193
implementation(Libs.zxing)
195194
implementation(Libs.mixpanel)
196195

app/src/main/java/com/getcode/util/QRCodeGenerator.kt

Lines changed: 60 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@ package com.getcode.util
22

33
import android.graphics.Bitmap
44
import android.graphics.Color
5-
import androidmads.library.qrgenearator.QRGContents
6-
import androidmads.library.qrgenearator.QRGEncoder
75
import androidx.compose.runtime.Composable
86
import androidx.compose.runtime.LaunchedEffect
97
import androidx.compose.runtime.getValue
@@ -15,25 +13,21 @@ import androidx.compose.ui.graphics.painter.BitmapPainter
1513
import androidx.compose.ui.platform.LocalDensity
1614
import androidx.compose.ui.unit.Dp
1715
import androidx.compose.ui.unit.dp
18-
import com.getcode.theme.Transparent
19-
import com.getcode.theme.White
20-
import com.getcode.ui.utils.toAGColor
2116
import com.google.zxing.BarcodeFormat
2217
import com.google.zxing.EncodeHintType
2318
import com.google.zxing.WriterException
2419
import com.google.zxing.qrcode.QRCodeWriter
2520
import kotlinx.coroutines.Dispatchers
2621
import kotlinx.coroutines.launch
2722

28-
fun generateQrCode(url: String, size: Int? = null): Bitmap? {
29-
val qrgEncoder = if (size == null) {
30-
QRGEncoder(url, QRGContents.Type.TEXT)
31-
} else {
32-
QRGEncoder(url, null, QRGContents.Type.TEXT, size)
33-
}
34-
qrgEncoder.colorBlack = White.toAGColor()
35-
qrgEncoder.colorWhite = Transparent.toAGColor()
36-
return qrgEncoder.bitmap
23+
fun generateQrCode(url: String, size: Int): Bitmap? {
24+
return generateQr(
25+
url = url,
26+
size = size,
27+
padding = 0,
28+
contentColor = Color.WHITE,
29+
spaceColor = Color.TRANSPARENT
30+
)
3731
}
3832

3933
@Composable
@@ -47,7 +41,6 @@ fun rememberQrBitmapPainter(
4741
val sizePx = with(density) { size.roundToPx() }
4842
val paddingPx = with(density) { padding.roundToPx() }
4943

50-
5144
var bitmap by remember(content) {
5245
mutableStateOf<Bitmap?>(null)
5346
}
@@ -56,45 +49,11 @@ fun rememberQrBitmapPainter(
5649
if (bitmap != null) return@LaunchedEffect
5750

5851
launch(Dispatchers.IO) {
59-
val qrCodeWriter = QRCodeWriter()
60-
61-
val encodeHints = mutableMapOf<EncodeHintType, Any?>()
62-
.apply {
63-
this[EncodeHintType.MARGIN] = paddingPx
64-
}
65-
66-
val bitmapMatrix = try {
67-
qrCodeWriter.encode(
68-
content, BarcodeFormat.QR_CODE,
69-
sizePx, sizePx, encodeHints
70-
)
71-
} catch (ex: WriterException) {
72-
null
73-
}
74-
75-
val matrixWidth = bitmapMatrix?.width ?: sizePx
76-
val matrixHeight = bitmapMatrix?.height ?: sizePx
77-
78-
val newBitmap = Bitmap.createBitmap(
79-
bitmapMatrix?.width ?: sizePx,
80-
bitmapMatrix?.height ?: sizePx,
81-
Bitmap.Config.ARGB_8888,
52+
bitmap = generateQr(
53+
url = content,
54+
size = sizePx,
55+
padding = paddingPx,
8256
)
83-
84-
val pixels = IntArray(matrixWidth * matrixHeight)
85-
86-
for (x in 0 until matrixWidth) {
87-
for (y in 0 until matrixHeight) {
88-
val shouldColorPixel = bitmapMatrix?.get(x, y) ?: false
89-
val pixelColor = if (shouldColorPixel) Color.BLACK else Color.WHITE
90-
91-
pixels[y * matrixWidth + x] = pixelColor
92-
}
93-
}
94-
95-
newBitmap.setPixels(pixels, 0, matrixWidth, 0, 0, matrixWidth, matrixHeight)
96-
97-
bitmap = newBitmap
9857
}
9958
}
10059

@@ -107,3 +66,51 @@ fun rememberQrBitmapPainter(
10766
BitmapPainter(currentBitmap.asImageBitmap())
10867
}
10968
}
69+
70+
private fun generateQr(
71+
url: String,
72+
size: Int,
73+
padding: Int,
74+
contentColor: Int = Color.BLACK,
75+
spaceColor: Int = Color.WHITE,
76+
): Bitmap {
77+
val qrCodeWriter = QRCodeWriter()
78+
79+
val encodeHints = mutableMapOf<EncodeHintType, Any?>()
80+
.apply {
81+
this[EncodeHintType.MARGIN] = padding
82+
}
83+
84+
val bitmapMatrix = try {
85+
qrCodeWriter.encode(
86+
url, BarcodeFormat.QR_CODE,
87+
size, size, encodeHints
88+
)
89+
} catch (ex: WriterException) {
90+
null
91+
}
92+
93+
val matrixWidth = bitmapMatrix?.width ?: size
94+
val matrixHeight = bitmapMatrix?.height ?: size
95+
96+
val newBitmap = Bitmap.createBitmap(
97+
bitmapMatrix?.width ?: size,
98+
bitmapMatrix?.height ?: size,
99+
Bitmap.Config.ARGB_8888,
100+
)
101+
102+
val pixels = IntArray(matrixWidth * matrixHeight)
103+
104+
for (x in 0 until matrixWidth) {
105+
for (y in 0 until matrixHeight) {
106+
val shouldColorPixel = bitmapMatrix?.get(x, y) ?: false
107+
val pixelColor = if (shouldColorPixel) contentColor else spaceColor
108+
109+
pixels[y * matrixWidth + x] = pixelColor
110+
}
111+
}
112+
113+
newBitmap.setPixels(pixels, 0, matrixWidth, 0, 0, matrixWidth, matrixHeight)
114+
115+
return newBitmap
116+
}

app/src/main/java/com/getcode/view/login/AccessKeyViewModel.kt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,10 @@ import android.annotation.SuppressLint
55
import android.os.Build
66
import com.getcode.analytics.Action
77
import com.getcode.analytics.ActionSource
8-
import com.getcode.analytics.AnalyticsManager
98
import com.getcode.analytics.AnalyticsService
109
import com.getcode.manager.AuthManager
11-
import com.getcode.media.MediaScanner
1210
import com.getcode.manager.MnemonicManager
11+
import com.getcode.media.MediaScanner
1312
import com.getcode.navigation.core.CodeNavigator
1413
import com.getcode.navigation.screens.CodeLoginPermission
1514
import com.getcode.navigation.screens.HomeScreen

app/src/main/java/com/getcode/view/login/BaseAccessKeyViewModel.kt

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,23 +5,19 @@ import android.graphics.Canvas
55
import android.graphics.Paint
66
import android.graphics.Typeface
77
import android.os.Environment
8-
import androidmads.library.qrgenearator.QRGContents
9-
import androidmads.library.qrgenearator.QRGEncoder
108
import androidx.core.graphics.applyCanvas
119
import androidx.core.graphics.drawable.toBitmap
1210
import androidx.lifecycle.viewModelScope
1311
import com.getcode.R
14-
import com.getcode.media.MediaScanner
1512
import com.getcode.manager.MnemonicManager
1613
import com.getcode.manager.SessionManager
1714
import com.getcode.manager.TopBarManager
15+
import com.getcode.media.MediaScanner
1816
import com.getcode.network.repository.TransactionRepository
1917
import com.getcode.network.repository.TransactionRepository.DeniedReason
2018
import com.getcode.network.repository.decodeBase64
2119
import com.getcode.theme.Alert
22-
import com.getcode.theme.R as themeR
2320
import com.getcode.theme.Brand
24-
import com.getcode.theme.Transparent
2521
import com.getcode.theme.White
2622
import com.getcode.ui.utils.toAGColor
2723
import com.getcode.util.generateQrCode
@@ -41,6 +37,7 @@ import java.text.DateFormat
4137
import java.text.SimpleDateFormat
4238
import java.util.Date
4339
import java.util.Locale
40+
import com.getcode.theme.R as themeR
4441

4542

4643
data class AccessKeyUiModel(

app/src/main/java/com/getcode/view/main/account/AccountAccessKeyViewModel.kt

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.getcode.view.main.account
22

33
import android.annotation.SuppressLint
4+
import androidx.lifecycle.viewModelScope
45
import com.getcode.media.MediaScanner
56
import com.getcode.manager.MnemonicManager
67
import com.getcode.navigation.core.CodeNavigator
@@ -10,7 +11,11 @@ import dagger.hilt.android.lifecycle.HiltViewModel
1011
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
1112
import io.reactivex.rxjava3.core.Completable
1213
import io.reactivex.rxjava3.schedulers.Schedulers
14+
import kotlinx.coroutines.delay
15+
import kotlinx.coroutines.flow.update
16+
import kotlinx.coroutines.launch
1317
import javax.inject.Inject
18+
import kotlin.time.Duration.Companion.seconds
1419

1520

1621
@HiltViewModel
@@ -20,23 +25,36 @@ class AccountAccessKeyViewModel @Inject constructor(
2025
mediaScanner: MediaScanner,
2126
) : BaseAccessKeyViewModel(resources, mnemonicManager, mediaScanner) {
2227
@SuppressLint("CheckResult")
23-
fun onSubmit(navigator: CodeNavigator) {
28+
fun onSubmit() {
2429
Completable.create {
2530
val result = saveBitmapToFile()
2631
if (result) it.onComplete() else it.onError(IllegalStateException())
2732
}
2833
.observeOn(AndroidSchedulers.mainThread())
2934
.subscribeOn(Schedulers.computation())
3035
.doOnSubscribe {
31-
uiFlow.value = uiFlow.value.copy(isLoading = true, isEnabled = false)
36+
uiFlow.update {
37+
it.copy(isLoading = true, isEnabled = false)
38+
}
3239
}
3340
.doOnComplete {
34-
uiFlow.value =
35-
uiFlow.value.copy(isLoading = false, isEnabled = false, isSuccess = true)
41+
viewModelScope.launch {
42+
uiFlow.update {
43+
it.copy(isLoading = false, isEnabled = false, isSuccess = true)
44+
}
45+
// wait 2s and reset button state
46+
delay(2.seconds)
47+
48+
uiFlow.update {
49+
it.copy(isSuccess = false, isEnabled = true)
50+
}
51+
52+
}
3653
}
3754
.doOnError {
38-
uiFlow.value =
39-
uiFlow.value.copy(isLoading = false, isEnabled = true, isSuccess = false)
55+
uiFlow.update {
56+
it.copy(isLoading = false, isEnabled = true, isSuccess = false)
57+
}
4058
}
4159
.subscribe({}, ::onSubmitError)
4260
}

app/src/main/java/com/getcode/view/main/account/BackupKey.kt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,6 @@ import com.getcode.util.launchAppSettings
5656
fun BackupKey(
5757
viewModel: AccountAccessKeyViewModel,
5858
) {
59-
val navigator = LocalCodeNavigator.current
6059
val dataState by viewModel.uiFlow.collectAsState()
6160

6261
val context = LocalContext.current
@@ -83,7 +82,7 @@ fun BackupKey(
8382
val launcher = getPermissionLauncher(onPermissionResult)
8483

8584
if (isExportSeedRequested && isStoragePermissionGranted) {
86-
viewModel.onSubmit(navigator)
85+
viewModel.onSubmit()
8786
isExportSeedRequested = false
8887
}
8988

buildSrc/src/main/java/Dependencies.kt

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,6 @@ object Versions {
6666
const val lib_phone_number_port: String = "8.12.43"
6767
const val lib_phone_number_google: String = "8.12.54"
6868
const val hilt_nav_compose: String = "1.1.0-alpha02"
69-
const val qr_generator: String = "1.0.1"
7069
const val zxing: String = "3.3.2"
7170

7271
const val androidx_test_runner = "1.4.0"
@@ -224,7 +223,6 @@ object Libs {
224223
const val lib_phone_number_port = "io.michaelrocks:libphonenumber-android:${Versions.lib_phone_number_port}"
225224
const val lib_phone_number_google = "com.googlecode.libphonenumber:libphonenumber:${Versions.lib_phone_number_google}"
226225
const val hilt_nav_compose = "androidx.hilt:hilt-navigation-compose:1.1.0-alpha01"
227-
const val qr_generator = "com.github.androidmads:QRGenerator:${Versions.qr_generator}"
228226
const val zxing = "com.google.zxing:core:${Versions.zxing}"
229227

230228
const val retrofit = "com.squareup.retrofit2:retrofit:${Versions.retrofit}"

0 commit comments

Comments
 (0)