@@ -6,7 +6,17 @@ import android.widget.Toast
6
6
import androidx.compose.foundation.Image
7
7
import androidx.compose.foundation.background
8
8
import androidx.compose.foundation.clickable
9
- import androidx.compose.foundation.layout.*
9
+ import androidx.compose.foundation.layout.Arrangement
10
+ import androidx.compose.foundation.layout.Box
11
+ import androidx.compose.foundation.layout.Column
12
+ import androidx.compose.foundation.layout.Row
13
+ import androidx.compose.foundation.layout.Spacer
14
+ import androidx.compose.foundation.layout.fillMaxSize
15
+ import androidx.compose.foundation.layout.fillMaxWidth
16
+ import androidx.compose.foundation.layout.height
17
+ import androidx.compose.foundation.layout.padding
18
+ import androidx.compose.foundation.layout.size
19
+ import androidx.compose.foundation.layout.width
10
20
import androidx.compose.foundation.lazy.LazyColumn
11
21
import androidx.compose.foundation.shape.RoundedCornerShape
12
22
import androidx.compose.material.icons.Icons
@@ -52,6 +62,7 @@ import f.cking.software.utils.graphic.DropEffectState
52
62
import f.cking.software.utils.graphic.GlassBottomNavBar
53
63
import f.cking.software.utils.graphic.SystemNavbarSpacer
54
64
import f.cking.software.utils.graphic.ThemedDialog
65
+ import f.cking.software.utils.graphic.infoDialog
55
66
import f.cking.software.utils.graphic.rememberDropEffectState
56
67
import f.cking.software.utils.graphic.withDropEffect
57
68
import org.koin.androidx.compose.koinViewModel
@@ -195,10 +206,35 @@ object MainScreen {
195
206
}
196
207
197
208
val context = LocalContext .current
209
+
210
+ var checkAndStartService: (() -> Boolean )? = null
211
+
212
+ val disclaimerDialog = infoDialog(
213
+ title = stringResource(R .string.disclaimer),
214
+ content = stringResource(R .string.unlowful_usage_disclaimer),
215
+ buttons = { state ->
216
+ {
217
+ negativeButton(
218
+ stringResource(R .string.decline),
219
+ textStyle = TextStyle (color = MaterialTheme .colorScheme.onSurface)
220
+ ) { state.hide() }
221
+
222
+ positiveButton(
223
+ stringResource(R .string.accept),
224
+ textStyle = TextStyle (color = MaterialTheme .colorScheme.onSurface)
225
+ ) {
226
+ viewModel.disclaimerWasAccepted()
227
+ state.hide()
228
+ checkAndStartService?.invoke()
229
+ }
230
+ }
231
+ }
232
+ )
233
+
198
234
val permissionsIntro = permissionsIntroDialog(
199
235
onPassed = {
200
236
viewModel.userHasPassedPermissionsIntro()
201
- viewModel.runBackgroundScanning ()
237
+ checkAndStartService?.invoke ()
202
238
},
203
239
onDeclined = {
204
240
Toast .makeText(context, " The scanner cannot work without these permissions" , Toast .LENGTH_SHORT ).show()
@@ -207,6 +243,23 @@ object MainScreen {
207
243
val haptic = LocalHapticFeedback .current
208
244
var observeEvent = remember { true }
209
245
246
+ checkAndStartService = {
247
+ when {
248
+ viewModel.needToShowDisclaimer() -> {
249
+ disclaimerDialog.show()
250
+ false
251
+ }
252
+ viewModel.needToShowPermissionsIntro() -> {
253
+ permissionsIntro.show()
254
+ false
255
+ }
256
+ else -> {
257
+ viewModel.runBackgroundScanning()
258
+ true
259
+ }
260
+ }
261
+ }
262
+
210
263
ExtendedFloatingActionButton (
211
264
containerColor = MaterialTheme .colorScheme.primaryContainer,
212
265
modifier = Modifier
@@ -225,13 +278,12 @@ object MainScreen {
225
278
}
226
279
227
280
observeEvent && event.action == MotionEvent .ACTION_UP -> {
228
- if (viewModel.needToShowPermissionsIntro()) {
229
- permissionsIntro.show()
230
- dropEffectState.drop(type = DropEffectState .DropEvent .Type .RELEASE_SOFT , touchX, touchY)
231
- } else {
232
- viewModel.runBackgroundScanning()
281
+ val started = checkAndStartService.invoke()
282
+ if (started) {
233
283
dropEffectState.drop(type = DropEffectState .DropEvent .Type .RELEASE_HARD , touchX, touchY)
234
284
haptic.performHapticFeedback(HapticFeedbackType .LongPress )
285
+ } else {
286
+ dropEffectState.drop(type = DropEffectState .DropEvent .Type .RELEASE_SOFT , touchX, touchY)
235
287
}
236
288
true
237
289
}
0 commit comments