Skip to content

Commit 11803e6

Browse files
committed
Improve qr code scanner screen UI
1 parent 89381b8 commit 11803e6

File tree

3 files changed

+60
-16
lines changed
  • core
  • feature/scan-qr-code/src/main/java/ru/tech/imageresizershrinker/feature/scan_qr_code/presentation/components

3 files changed

+60
-16
lines changed

core/resources/src/main/res/values/strings.xml

+1
Original file line numberDiff line numberDiff line change
@@ -1601,4 +1601,5 @@
16011601
<string name="enforce_bw_sub">Barcode Image will be fully black and white and not colored by app\'s theme</string>
16021602
<string name="barcodes_sub">Scan any Barcode (QR, EAN, AZTEC, …) and get it\'s content or paste your text to generate new one</string>
16031603
<string name="no_barcode_found">No Barcode Found</string>
1604+
<string name="generated_barcode_will_be_here">Generated Barcode Will Be Here</string>
16041605
</resources>

core/ui/src/main/kotlin/ru/tech/imageresizershrinker/core/ui/widget/text/AutoSizeText.kt

+3-2
Original file line numberDiff line numberDiff line change
@@ -53,9 +53,10 @@ fun AutoSizeText(
5353
maxLines: Int = 1,
5454
minLines: Int = 1,
5555
style: TextStyle = LocalTextStyle.current,
56+
key: (String) -> Any? = { it }
5657
) {
57-
var sizedStyle by remember(style) { mutableStateOf(style) }
58-
var readyToDraw by remember(minLines, text) { mutableStateOf(false) }
58+
var sizedStyle by remember(style, key(text)) { mutableStateOf(style) }
59+
var readyToDraw by remember(minLines, key(text)) { mutableStateOf(false) }
5960

6061
Text(
6162
text = text,

feature/scan-qr-code/src/main/java/ru/tech/imageresizershrinker/feature/scan_qr_code/presentation/components/QrCodePreview.kt

+56-14
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,10 @@
1717

1818
package ru.tech.imageresizershrinker.feature.scan_qr_code.presentation.components
1919

20+
import androidx.compose.animation.AnimatedContent
2021
import androidx.compose.animation.core.animateIntAsState
2122
import androidx.compose.foundation.background
23+
import androidx.compose.foundation.layout.Arrangement
2224
import androidx.compose.foundation.layout.Box
2325
import androidx.compose.foundation.layout.BoxWithConstraints
2426
import androidx.compose.foundation.layout.Column
@@ -31,24 +33,32 @@ import androidx.compose.foundation.layout.padding
3133
import androidx.compose.foundation.layout.size
3234
import androidx.compose.foundation.layout.width
3335
import androidx.compose.foundation.shape.RoundedCornerShape
36+
import androidx.compose.material.icons.Icons
37+
import androidx.compose.material.icons.rounded.QrCode2
38+
import androidx.compose.material3.Icon
3439
import androidx.compose.material3.MaterialTheme
3540
import androidx.compose.material3.Text
3641
import androidx.compose.runtime.Composable
3742
import androidx.compose.ui.Alignment
3843
import androidx.compose.ui.Modifier
44+
import androidx.compose.ui.graphics.Color
3945
import androidx.compose.ui.layout.ContentScale
46+
import androidx.compose.ui.res.stringResource
4047
import androidx.compose.ui.text.style.TextAlign
4148
import androidx.compose.ui.unit.dp
4249
import androidx.compose.ui.unit.min
4350
import dev.shreyaspatil.capturable.capturable
4451
import dev.shreyaspatil.capturable.controller.CaptureController
52+
import ru.tech.imageresizershrinker.core.resources.R
4553
import ru.tech.imageresizershrinker.core.ui.theme.Typography
4654
import ru.tech.imageresizershrinker.core.ui.theme.takeColorFromScheme
4755
import ru.tech.imageresizershrinker.core.ui.utils.helper.rememberPrevious
4856
import ru.tech.imageresizershrinker.core.ui.utils.provider.rememberLocalEssentials
4957
import ru.tech.imageresizershrinker.core.ui.widget.image.Picture
58+
import ru.tech.imageresizershrinker.core.ui.widget.modifier.container
5059
import ru.tech.imageresizershrinker.core.ui.widget.other.BoxAnimatedVisibility
5160
import ru.tech.imageresizershrinker.core.ui.widget.other.QrCode
61+
import ru.tech.imageresizershrinker.core.ui.widget.text.AutoSizeText
5262

5363
@Composable
5464
internal fun QrCodePreview(
@@ -87,8 +97,9 @@ internal fun QrCodePreview(
8797
) {
8898
val essentials = rememberLocalEssentials()
8999
val previous = rememberPrevious(params)
90-
QrCode(
91-
content = params.content,
100+
101+
AnimatedContent(
102+
targetState = params.content.isEmpty(),
92103
modifier = Modifier
93104
.padding(
94105
top = if (params.imageUri != null) 36.dp else 0.dp,
@@ -101,19 +112,50 @@ internal fun QrCodePreview(
101112
.aspectRatio(1f)
102113
} else Modifier
103114
)
104-
.width(targetSize),
105-
heightRatio = params.heightRatio,
106-
type = params.type,
107-
enforceBlackAndWhite = params.enforceBlackAndWhite,
108-
cornerRadius = animateIntAsState(params.cornersSize).value.dp,
109-
onSuccess = {
110-
essentials.dismissToasts()
111-
},
112-
onFailure = {
113-
essentials.dismissToasts()
114-
if (previous != params) essentials.showFailureToast(it)
115+
) { isEmpty ->
116+
if (isEmpty) {
117+
Column(
118+
verticalArrangement = Arrangement.Center,
119+
horizontalAlignment = Alignment.CenterHorizontally,
120+
modifier = Modifier
121+
.container(
122+
resultPadding = 0.dp,
123+
color = if (isLandscape) MaterialTheme.colorScheme.surfaceContainerLowest
124+
else Color.Unspecified
125+
)
126+
.padding(12.dp)
127+
) {
128+
Icon(
129+
imageVector = Icons.Rounded.QrCode2,
130+
contentDescription = null,
131+
modifier = Modifier.size(targetSize / 3)
132+
)
133+
Spacer(Modifier.height(4.dp))
134+
AutoSizeText(
135+
text = stringResource(R.string.generated_barcode_will_be_here),
136+
textAlign = TextAlign.Center,
137+
key = { it.length },
138+
maxLines = 2
139+
)
140+
}
141+
} else {
142+
QrCode(
143+
content = params.content,
144+
modifier = Modifier.width(targetSize),
145+
heightRatio = params.heightRatio,
146+
type = params.type,
147+
enforceBlackAndWhite = params.enforceBlackAndWhite,
148+
cornerRadius = animateIntAsState(params.cornersSize).value.dp,
149+
onSuccess = {
150+
essentials.dismissToasts()
151+
},
152+
onFailure = {
153+
essentials.dismissToasts()
154+
if (previous != params) essentials.showFailureToast(it)
155+
}
156+
)
115157
}
116-
)
158+
}
117159

118160
BoxAnimatedVisibility(visible = params.description.isNotEmpty() && params.content.isNotEmpty()) {
119161
MaterialTheme(

0 commit comments

Comments
 (0)