Skip to content

Commit b49d93e

Browse files
authored
Merge pull request #49 from YAPP-Github/feat/#46-life4cut
[Feat] #46 인생네컷 QR 이미지 URL 감지 로직 및 QR 스캔 레이아웃 수정
2 parents 948df58 + 8206612 commit b49d93e

7 files changed

Lines changed: 219 additions & 161 deletions

File tree

feature/photo-upload/impl/build.gradle.kts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,11 @@ android {
2121

2222
defaultConfig {
2323
buildConfigField("String", "PHOTOISM_URL", properties["PHOTOISM_URL"].toString())
24-
buildConfigField("String", "PHOTOISM_IMG_URL_END", properties["PHOTOISM_IMG_URL_END"].toString())
24+
buildConfigField("String", "PHOTOISM_IMAGE_URL", properties["PHOTOISM_IMAGE_URL"].toString())
25+
buildConfigField("String", "PHOTOISM_IMG_URL_MIME_TYPE", properties["PHOTOISM_IMG_URL_MIME_TYPE"].toString())
26+
buildConfigField("String", "LIFE_FOUR_CUT_URL", properties["LIFE_FOUR_CUT_URL"].toString())
27+
buildConfigField("String", "LIFE_FOUR_CUT_IMAGE_URL", properties["LIFE_FOUR_CUT_IMAGE_URL"].toString())
28+
buildConfigField("String", "LIFE_FOUR_CUT_URL_MIME_TYPE", properties["LIFE_FOUR_CUT_URL_MIME_TYPE"].toString())
2529
}
2630
}
2731

feature/photo-upload/impl/src/main/java/com/neki/android/feature/photo_upload/impl/qrscan/component/DimExceptContent.kt

Lines changed: 13 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -2,99 +2,43 @@ package com.neki.android.feature.photo_upload.impl.qrscan.component
22

33
import androidx.compose.foundation.Canvas
44
import androidx.compose.foundation.layout.Box
5-
import androidx.compose.foundation.layout.BoxScope
65
import androidx.compose.foundation.layout.fillMaxSize
7-
import androidx.compose.foundation.layout.padding
86
import androidx.compose.runtime.Composable
9-
import androidx.compose.runtime.Immutable
10-
import androidx.compose.runtime.getValue
11-
import androidx.compose.runtime.mutableStateOf
12-
import androidx.compose.runtime.remember
13-
import androidx.compose.runtime.setValue
147
import androidx.compose.ui.Modifier
15-
import androidx.compose.ui.geometry.CornerRadius
168
import androidx.compose.ui.geometry.Offset
179
import androidx.compose.ui.geometry.Size
1810
import androidx.compose.ui.graphics.BlendMode
1911
import androidx.compose.ui.graphics.Color
2012
import androidx.compose.ui.graphics.CompositingStrategy
2113
import androidx.compose.ui.graphics.graphicsLayer
22-
import androidx.compose.ui.layout.onGloballyPositioned
23-
import androidx.compose.ui.layout.positionInParent
24-
import androidx.compose.ui.platform.LocalDensity
25-
import androidx.compose.ui.unit.Dp
26-
import androidx.compose.ui.unit.dp
27-
import com.neki.android.feature.photo_upload.impl.qrscan.const.QRLayoutConst.CUTOUT_RADIUS
14+
import androidx.compose.ui.unit.IntSize
2815
import com.neki.android.feature.photo_upload.impl.qrscan.const.QRLayoutConst.DIM_COLOR
2916

30-
@Immutable
31-
private data class CutoutRectPx(
32-
val left: Float,
33-
val top: Float,
34-
val width: Float,
35-
val height: Float,
36-
)
37-
3817
@Composable
3918
internal fun DimExceptContent(
19+
offSet: Offset?,
20+
size: IntSize?,
4021
modifier: Modifier = Modifier,
4122
dimColor: Color = Color(DIM_COLOR),
42-
cutoutRadius: Dp = CUTOUT_RADIUS.dp,
43-
cutoutPadding: Dp = 0.dp,
44-
cutout: @Composable BoxScope.(Modifier) -> Unit,
4523
) {
46-
val density = LocalDensity.current
47-
var cutoutRect by remember { mutableStateOf<CutoutRectPx?>(null) }
48-
49-
val paddingPx = with(density) { cutoutPadding.toPx() }
50-
val radiusPx = with(density) { cutoutRadius.toPx() }
51-
52-
Box(modifier = modifier) {
53-
cutout(
54-
Modifier
55-
.padding(bottom = 20.dp)
56-
.onGloballyPositioned { coords ->
57-
val pos = coords.positionInParent()
58-
val size = coords.size
59-
cutoutRect = CutoutRectPx(
60-
left = pos.x,
61-
top = pos.y,
62-
width = size.width.toFloat(),
63-
height = size.height.toFloat(),
64-
)
65-
},
66-
)
67-
24+
Box(
25+
modifier = modifier,
26+
) {
6827
Canvas(
6928
modifier = Modifier
7029
.fillMaxSize()
7130
.graphicsLayer { compositingStrategy = CompositingStrategy.Offscreen },
7231
) {
7332
drawRect(dimColor)
7433

75-
val c = cutoutRect ?: return@Canvas
76-
77-
val left = c.left - paddingPx
78-
val top = c.top - paddingPx
79-
val w = c.width + paddingPx * 2f
80-
val h = c.height + paddingPx * 2f
34+
if (offSet == null || size == null) return@Canvas
8135

82-
if (radiusPx > 0f) {
83-
drawRoundRect(
84-
color = Color.Transparent,
85-
topLeft = Offset(left, top),
86-
size = Size(w, h),
87-
cornerRadius = CornerRadius(radiusPx, radiusPx),
88-
blendMode = BlendMode.Clear,
89-
)
90-
} else {
91-
drawRect(
92-
color = Color.Transparent,
93-
topLeft = Offset(left, top),
94-
size = Size(w, h),
95-
blendMode = BlendMode.Clear,
96-
)
97-
}
36+
drawRoundRect(
37+
color = Color.Transparent,
38+
topLeft = offSet,
39+
size = Size(size.width.toFloat(), size.height.toFloat()),
40+
blendMode = BlendMode.Clear,
41+
)
9842
}
9943
}
10044
}

feature/photo-upload/impl/src/main/java/com/neki/android/feature/photo_upload/impl/qrscan/component/PhotoWebViewContent.kt

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,13 @@ package com.neki.android.feature.photo_upload.impl.qrscan.component
33
import android.webkit.WebView
44
import androidx.compose.runtime.Composable
55
import androidx.compose.runtime.DisposableEffect
6+
import androidx.compose.runtime.getValue
67
import androidx.compose.runtime.mutableStateOf
78
import androidx.compose.runtime.remember
9+
import androidx.compose.runtime.setValue
810
import androidx.compose.ui.viewinterop.AndroidView
11+
import androidx.compose.ui.window.DialogProperties
12+
import com.neki.android.core.ui.component.LoadingDialog
913
import com.neki.android.feature.photo_upload.impl.qrscan.util.PhotoWebViewClient
1014

1115
@Composable
@@ -14,6 +18,7 @@ internal fun PhotoWebViewContent(
1418
onDetectImageUrl: (String) -> Unit,
1519
) {
1620
val webView = remember { mutableStateOf<WebView?>(null) }
21+
var isLoading by remember { mutableStateOf(true) }
1722

1823
DisposableEffect(Unit) {
1924
onDispose {
@@ -32,6 +37,7 @@ internal fun PhotoWebViewContent(
3237

3338
webViewClient = PhotoWebViewClient { photoImageUrl ->
3439
onDetectImageUrl(photoImageUrl)
40+
isLoading = false
3541
}
3642

3743
loadUrl(scannedUrl)
@@ -43,4 +49,14 @@ internal fun PhotoWebViewContent(
4349
}
4450
},
4551
)
52+
53+
if (isLoading) {
54+
LoadingDialog(
55+
properties = DialogProperties(
56+
dismissOnBackPress = false,
57+
dismissOnClickOutside = false,
58+
),
59+
onDismissRequest = { isLoading = false },
60+
)
61+
}
4662
}

feature/photo-upload/impl/src/main/java/com/neki/android/feature/photo_upload/impl/qrscan/component/QRScanner.kt

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.neki.android.feature.photo_upload.impl.qrscan.component
22

3+
import android.graphics.RectF
34
import androidx.camera.compose.CameraXViewfinder
45
import androidx.camera.core.Camera
56
import androidx.camera.core.CameraSelector
@@ -38,6 +39,7 @@ import java.util.concurrent.TimeUnit
3839
internal fun QRScanner(
3940
modifier: Modifier = Modifier,
4041
isTorchEnabled: Boolean = false,
42+
scanAreaRatio: () -> RectF? = { null },
4143
onQRCodeScanned: (String) -> Unit = {},
4244
) {
4345
val context = LocalContext.current
@@ -62,11 +64,14 @@ internal fun QRScanner(
6264
.build().apply {
6365
setAnalyzer(
6466
ContextCompat.getMainExecutor(context),
65-
QRImageAnalyzer { scannedUrl ->
66-
if (scannedUrl.isNotEmpty()) {
67-
onQRCodeScanned(scannedUrl)
68-
}
69-
},
67+
QRImageAnalyzer(
68+
scanAreaRatio = scanAreaRatio,
69+
onQRCodeScanned = { scannedUrl ->
70+
if (scannedUrl.isNotEmpty()) {
71+
onQRCodeScanned(scannedUrl)
72+
}
73+
},
74+
),
7075
)
7176
}
7277

0 commit comments

Comments
 (0)