Skip to content

Commit b4f57c8

Browse files
committed
feat: modularize code scanner/camera implementation
Signed-off-by: Brandon McAnsh <[email protected]>
1 parent b7a36eb commit b4f57c8

File tree

15 files changed

+128
-43
lines changed

15 files changed

+128
-43
lines changed

apps/codeApp/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,7 @@ dependencies {
128128
implementation(project(":ui:components"))
129129
implementation(project(":ui:navigation"))
130130
implementation(project(":ui:resources"))
131+
implementation(project(":ui:scanner"))
131132
implementation(project(":ui:theme"))
132133

133134
// kik code scanner

apps/codeApp/src/main/java/com/getcode/CodeApp.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,10 +45,11 @@ import com.getcode.ui.modals.ConfirmationModals
4545
import com.getcode.ui.utils.getActivity
4646
import com.getcode.navigation.extensions.getActivityScopedViewModel
4747
import com.getcode.ui.LocalTopBarPadding
48+
import com.getcode.ui.biometrics.LocalBiometricsState
4849
import com.getcode.ui.biometrics.rememberBiometricsState
4950
import com.getcode.ui.theme.CodeTheme
5051
import com.getcode.ui.core.measured
51-
import com.getcode.view.main.scanner.views.BiometricsBlockingView
52+
import com.getcode.ui.biometrics.views.BiometricsBlockingView
5253
import dev.bmcreations.tipkit.TipScaffold
5354
import dev.bmcreations.tipkit.engines.TipsEngine
5455

apps/codeApp/src/main/java/com/getcode/Locals.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,3 @@ val LocalPhoneFormatter: ProvidableCompositionLocal<PhoneUtils?> = staticComposi
1313
val LocalDeeplinks: ProvidableCompositionLocal<DeeplinkHandler?> = staticCompositionLocalOf { null }
1414
val LocalBetaFlags: ProvidableCompositionLocal<BetaOptions> = staticCompositionLocalOf { BetaOptions.Defaults }
1515
val LocalDownloadQrCode: ProvidableCompositionLocal<BitmapPainter?> = staticCompositionLocalOf { null }
16-
val LocalBiometricsState: ProvidableCompositionLocal<BiometricsState> = staticCompositionLocalOf { BiometricsState() }

apps/codeApp/src/main/java/com/getcode/view/main/scanner/ScannerScreen.kt

Lines changed: 17 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import androidx.activity.result.PickVisualMediaRequest
88
import androidx.activity.result.contract.ActivityResultContracts
99
import androidx.compose.animation.AnimatedVisibility
1010
import androidx.compose.animation.EnterExitState
11-
import androidx.compose.animation.ExperimentalAnimationApi
1211
import androidx.compose.animation.core.tween
1312
import androidx.compose.animation.fadeIn
1413
import androidx.compose.animation.fadeOut
@@ -40,12 +39,11 @@ import androidx.compose.ui.platform.LocalContext
4039
import androidx.compose.ui.platform.LocalFocusManager
4140
import androidx.compose.ui.unit.dp
4241
import androidx.lifecycle.Lifecycle
43-
import com.getcode.SessionEvent
44-
import com.getcode.SessionState
45-
import com.getcode.SessionController
46-
import com.getcode.LocalBiometricsState
4742
import com.getcode.PresentationStyle
4843
import com.getcode.R
44+
import com.getcode.SessionController
45+
import com.getcode.SessionEvent
46+
import com.getcode.SessionState
4947
import com.getcode.manager.TopBarManager
5048
import com.getcode.models.Bill
5149
import com.getcode.models.DeepLinkRequest
@@ -58,21 +56,23 @@ import com.getcode.navigation.screens.EnterTipModal
5856
import com.getcode.navigation.screens.GetKinModal
5957
import com.getcode.navigation.screens.GiveKinModal
6058
import com.getcode.navigation.screens.ShareDownloadLinkModal
59+
import com.getcode.ui.biometrics.LocalBiometricsState
6160
import com.getcode.ui.components.OnLifecycleEvent
62-
import com.getcode.ui.utils.AnimationUtils
61+
import com.getcode.ui.components.restrictions.ContentRestrictedView
62+
import com.getcode.ui.core.RestrictionType
6363
import com.getcode.ui.core.measured
64-
import com.getcode.util.launchAppSettings
65-
import com.getcode.view.main.bill.BillManagementOptions
66-
import com.getcode.view.main.scanner.views.CameraDisabledView
67-
import com.getcode.view.main.scanner.camera.CodeScanner
68-
import com.getcode.view.main.bill.HomeBill
69-
import com.getcode.view.main.scanner.views.CameraPermissionsMissingView
7064
import com.getcode.ui.modals.ReceivedKinConfirmation
65+
import com.getcode.ui.scanner.CodeScanner
66+
import com.getcode.ui.scanner.views.CameraDisabledView
67+
import com.getcode.ui.scanner.views.CameraPermissionsMissingView
68+
import com.getcode.ui.utils.AnimationUtils
69+
import com.getcode.util.launchAppSettings
7170
import com.getcode.util.permissions.PermissionResult
7271
import com.getcode.util.permissions.getPermissionLauncher
7372
import com.getcode.util.permissions.rememberPermissionHandler
74-
import com.getcode.ui.components.restrictions.ContentRestrictedView
75-
import com.getcode.ui.core.RestrictionType
73+
import com.getcode.utils.ErrorUtils
74+
import com.getcode.view.main.bill.BillManagementOptions
75+
import com.getcode.view.main.bill.HomeBill
7676
import kotlinx.coroutines.delay
7777
import kotlinx.coroutines.flow.launchIn
7878
import kotlinx.coroutines.flow.onEach
@@ -256,7 +256,8 @@ private fun ScannerContent(
256256
if (previewing) {
257257
session.onCodeScan(it)
258258
}
259-
}
259+
},
260+
onError = { ErrorUtils.handleError(it) }
260261
)
261262
},
262263
onAction = { handleAction(it) },
@@ -313,7 +314,7 @@ private fun ScannerContent(
313314
}
314315
}
315316

316-
@OptIn(ExperimentalMaterialApi::class, ExperimentalAnimationApi::class)
317+
@OptIn(ExperimentalMaterialApi::class)
317318
@Composable
318319
private fun BillContainer(
319320
modifier: Modifier = Modifier,
@@ -368,11 +369,9 @@ private fun BillContainer(
368369
when {
369370
LocalBiometricsState.current.isAwaitingAuthentication -> {
370371
// waiting for result
371-
println("CAM : waiting for biometrics check")
372372
}
373373

374374
dataState.isCameraPermissionGranted == true || dataState.isCameraPermissionGranted == null -> {
375-
println("CAM: checking auto start cam")
376375
if (dataState.autoStartCamera == null) {
377376
// waiting for result
378377
} else if (!dataState.autoStartCamera && !isCameraStarted) {
@@ -385,7 +384,6 @@ private fun BillContainer(
385384
}
386385

387386
else -> {
388-
println("CAM: missing camera perms")
389387
CameraPermissionsMissingView(
390388
modifier = Modifier.fillMaxSize(),
391389
onClick = { checkPermission(true) }

settings.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ include(
5858
":ui:emojis",
5959
":ui:navigation",
6060
":ui:resources",
61+
":ui:scanner",
6162
":ui:theme",
6263

6364
// 3rd party imported dependencies

ui/biometrics/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ android {
5050
dependencies {
5151
api(project(":libs:biometrics"))
5252
implementation(project(":ui:components"))
53+
implementation(project(":ui:theme"))
5354

5455
api(Libs.androidx_annotation)
5556
api(Libs.kotlin_stdlib)

ui/biometrics/src/main/kotlin/com/getcode/ui/biometrics/Biometrics.kt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,12 @@ package com.getcode.ui.biometrics
22

33
import androidx.compose.runtime.Composable
44
import androidx.compose.runtime.LaunchedEffect
5+
import androidx.compose.runtime.ProvidableCompositionLocal
56
import androidx.compose.runtime.getValue
67
import androidx.compose.runtime.mutableStateOf
78
import androidx.compose.runtime.remember
89
import androidx.compose.runtime.setValue
10+
import androidx.compose.runtime.staticCompositionLocalOf
911
import androidx.compose.ui.platform.LocalContext
1012
import androidx.lifecycle.Lifecycle
1113
import com.getcode.libs.biometrics.Biometrics
@@ -106,4 +108,6 @@ fun rememberBiometricsState(
106108
}
107109
)
108110
}
109-
}
111+
}
112+
113+
val LocalBiometricsState: ProvidableCompositionLocal<BiometricsState> = staticCompositionLocalOf { BiometricsState() }

apps/codeApp/src/main/java/com/getcode/view/main/scanner/views/BiometricsBlockingView.kt renamed to ui/biometrics/src/main/kotlin/com/getcode/ui/biometrics/views/BiometricsBlockingView.kt

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.getcode.view.main.scanner.views
1+
package com.getcode.ui.biometrics.views
22

33
import androidx.compose.animation.AnimatedVisibility
44
import androidx.compose.animation.fadeIn
@@ -12,14 +12,13 @@ import androidx.compose.runtime.Composable
1212
import androidx.compose.ui.Alignment
1313
import androidx.compose.ui.Modifier
1414
import androidx.compose.ui.res.stringResource
15-
import com.getcode.R
16-
import com.getcode.theme.Brand
15+
import com.getcode.theme.CodeTheme
16+
import com.getcode.ui.biometrics.R
1717
import com.getcode.ui.theme.ButtonState
1818
import com.getcode.ui.theme.CodeButton
19-
import com.getcode.ui.biometrics.BiometricsState
2019

2120
@Composable
22-
internal fun BiometricsBlockingView(
21+
fun BiometricsBlockingView(
2322
modifier: Modifier = Modifier,
2423
state: com.getcode.ui.biometrics.BiometricsState,
2524
) {
@@ -30,7 +29,7 @@ internal fun BiometricsBlockingView(
3029
) {
3130
Surface(
3231
modifier = modifier,
33-
color = Brand.copy(alpha = 0.87f),
32+
color = CodeTheme.colors.brand.copy(alpha = 0.87f),
3433
) {
3534
Box(
3635
modifier = Modifier.fillMaxSize(),

ui/scanner/.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
build/
2+
.gradle/

ui/scanner/build.gradle.kts

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
plugins {
2+
id(Plugins.android_library)
3+
id(Plugins.kotlin_android)
4+
id(Plugins.kotlin_serialization)
5+
}
6+
7+
android {
8+
namespace = "${Android.codeNamespace}.ui.scanner"
9+
compileSdk = Android.compileSdkVersion
10+
defaultConfig {
11+
minSdk = Android.minSdkVersion
12+
targetSdk = Android.targetSdkVersion
13+
buildToolsVersion = Android.buildToolsVersion
14+
testInstrumentationRunner = Android.testInstrumentationRunner
15+
}
16+
17+
kotlinOptions {
18+
jvmTarget = Versions.java
19+
freeCompilerArgs += listOf(
20+
"-opt-in=kotlin.ExperimentalUnsignedTypes",
21+
"-opt-in=kotlin.RequiresOptIn"
22+
)
23+
}
24+
25+
java {
26+
toolchain {
27+
languageVersion.set(JavaLanguageVersion.of(Versions.java))
28+
}
29+
}
30+
31+
compileOptions {
32+
sourceCompatibility = JavaVersion.VERSION_17
33+
targetCompatibility = JavaVersion.VERSION_17
34+
}
35+
36+
kotlin {
37+
jvmToolchain(17)
38+
}
39+
40+
buildFeatures {
41+
buildConfig = true
42+
compose = true
43+
}
44+
45+
composeOptions {
46+
kotlinCompilerExtensionVersion = Versions.compose_compiler
47+
}
48+
}
49+
50+
dependencies {
51+
implementation(project(":libs:logging"))
52+
53+
implementation(project(":ui:biometrics"))
54+
implementation(project(":ui:components"))
55+
implementation(project(":ui:theme"))
56+
57+
implementation(project(":vendor:kik:scanner"))
58+
59+
// cameraX
60+
implementation(Libs.androidx_camerax_core)
61+
implementation(Libs.androidx_camerax_camera2)
62+
implementation(Libs.androidx_camerax_lifecycle)
63+
implementation(Libs.androidx_camerax_view)
64+
65+
implementation(Libs.androidx_annotation)
66+
implementation(Libs.kotlin_stdlib)
67+
implementation(Libs.kotlinx_coroutines_core)
68+
69+
implementation(platform(Libs.compose_bom))
70+
implementation(Libs.compose_ui)
71+
implementation(Libs.compose_foundation)
72+
implementation(Libs.compose_animation)
73+
implementation(Libs.compose_material)
74+
75+
implementation(Libs.timber)
76+
}

0 commit comments

Comments
 (0)