@@ -2,8 +2,6 @@ package com.getcode.util
22
33import android.graphics.Bitmap
44import android.graphics.Color
5- import androidmads.library.qrgenearator.QRGContents
6- import androidmads.library.qrgenearator.QRGEncoder
75import androidx.compose.runtime.Composable
86import androidx.compose.runtime.LaunchedEffect
97import androidx.compose.runtime.getValue
@@ -15,25 +13,21 @@ import androidx.compose.ui.graphics.painter.BitmapPainter
1513import androidx.compose.ui.platform.LocalDensity
1614import androidx.compose.ui.unit.Dp
1715import androidx.compose.ui.unit.dp
18- import com.getcode.theme.Transparent
19- import com.getcode.theme.White
20- import com.getcode.ui.utils.toAGColor
2116import com.google.zxing.BarcodeFormat
2217import com.google.zxing.EncodeHintType
2318import com.google.zxing.WriterException
2419import com.google.zxing.qrcode.QRCodeWriter
2520import kotlinx.coroutines.Dispatchers
2621import 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+ }
0 commit comments