1 package net.osdn.gokigen.objectdetection.a01f.ui.view
3 import android.util.Log
4 import androidx.activity.compose.rememberLauncherForActivityResult
5 import androidx.compose.foundation.background
6 import androidx.compose.foundation.clickable
7 import androidx.compose.foundation.layout.*
8 import androidx.compose.material.*
9 import androidx.compose.runtime.Composable
10 import androidx.compose.runtime.livedata.observeAsState
11 import androidx.compose.runtime.rememberCoroutineScope
12 import androidx.compose.ui.Alignment
13 import androidx.compose.ui.Modifier
14 import androidx.compose.ui.graphics.Color
15 import androidx.compose.ui.platform.LocalUriHandler
16 import androidx.compose.ui.res.stringArrayResource
17 import androidx.compose.ui.res.stringResource
18 import androidx.compose.ui.unit.dp
19 import androidx.navigation.NavHostController
20 import jp.osdn.gokigen.gokigenassets.scene.IVibrator
21 import kotlinx.coroutines.launch
22 import net.osdn.gokigen.objectdetection.a01f.R
23 import net.osdn.gokigen.objectdetection.a01f.preference.A01fPrefsModel
24 import net.osdn.gokigen.objectdetection.a01f.preference.GetPickFilePermission
27 fun PreferenceScreen(navController: NavHostController, prefsModel: A01fPrefsModel, vibrator : IVibrator)
33 Spacer(Modifier.size(padding))
34 CaptureBothLiveViewAndCamera(prefsModel)
35 Spacer(Modifier.size(padding))
36 Divider(color = Color.LightGray, thickness = 1.dp)
37 Spacer(Modifier.size(padding))
38 FilePickerForObjectDetectionModel(prefsModel)
39 Spacer(Modifier.size(padding))
40 Divider(color = Color.LightGray, thickness = 1.dp)
41 Spacer(Modifier.size(padding))
42 CameraConnectionMethodDropdown(prefsModel, vibrator)
43 Spacer(Modifier.size(padding))
44 Divider(color = Color.LightGray, thickness = 1.dp)
45 Spacer(Modifier.size(padding))
46 Spacer(Modifier.size(padding))
48 Spacer(Modifier.size(padding))
49 ShowGokigenPrivacyPolicy()
50 Spacer(Modifier.size(padding))
56 fun CaptureBothLiveViewAndCamera(prefsModel: A01fPrefsModel)
58 val scope = rememberCoroutineScope()
59 val captureBothLiveViewAndCamera = prefsModel.captureBothLvAndCamera.observeAsState(initial = prefsModel.captureBothLvAndCamera.value ?: false)
60 Row (verticalAlignment = Alignment.CenterVertically) {
62 checked = captureBothLiveViewAndCamera.value,
65 prefsModel.setCaptureBothLvAndCamera(!captureBothLiveViewAndCamera.value)
68 Text(stringResource(R.string.pref_capture_both_camera_and_live_view))
73 fun CameraConnectionMethodDropdown(prefsModel: A01fPrefsModel, vibrator : IVibrator)
75 val scope = rememberCoroutineScope()
76 val cameraConnectionMethodExpanded = prefsModel.isCameraConnectionMethodExpanded.observeAsState(initial = prefsModel.isCameraConnectionMethodExpanded.value ?: false)
77 val cameraConnectionMethodIndex = prefsModel.cameraConnectionMethodSelectionIndex.observeAsState(initial = prefsModel.cameraConnectionMethodSelectionIndex.value ?: 3)
79 var expanded = cameraConnectionMethodExpanded.value
80 var selectedIndex = cameraConnectionMethodIndex.value
81 val itemLabels = stringArrayResource(id = R.array.connection_method)
83 Box(modifier = Modifier
85 .wrapContentSize(Alignment.TopStart)) {
86 Text(" " + stringResource(id = R.string.pref_connection_method) + " : " + itemLabels[selectedIndex],modifier = Modifier
88 .clickable(onClick = {
90 prefsModel.setIsCameraConnectionMethodExpanded(true)
92 .background(Color.White))
95 onDismissRequest = { expanded = false },
98 .background(Color.LightGray)
100 itemLabels.forEachIndexed { index, s ->
101 DropdownMenuItem(onClick = {
103 selectedIndex = index
105 prefsModel.setIsCameraConnectionMethodExpanded(false)
106 prefsModel.setCameraConnectionMethodSelectionIndex(index)
107 vibrator.vibrate(IVibrator.VibratePattern.SIMPLE_SHORT_SHORT)
108 Log.v("CameraConnectionMethod", "selected Index: $selectedIndex value: ")
119 fun FilePickerForObjectDetectionModel(prefsModel: A01fPrefsModel)
121 val scope = rememberCoroutineScope()
123 //val filePickerLauncher = rememberLauncherForActivityResult(ActivityResultContracts.GetContent()) { modelUri ->
124 val filePickerLauncher = rememberLauncherForActivityResult(GetPickFilePermission()) { modelUri ->
125 if (modelUri != null)
127 Log.v("File Pick", "Picked file URI: $modelUri")
129 prefsModel.setObjectDetectionFileModel(modelUri)
134 Row (verticalAlignment = Alignment.CenterVertically) {
135 Text(" " + stringResource(id = R.string.pref_for_object_detection_model_file) + " " + prefsModel.getObjectDetectionFileName(), modifier = Modifier.clickable { filePickerLauncher.launch("*/*") })
140 fun ShowAboutGokigen()
142 val uriHandler = LocalUriHandler.current
143 val openUri = stringResource(R.string.pref_instruction_manual_url)
144 Row(modifier = Modifier.padding(all = 8.dp)) {
145 Spacer(modifier = Modifier.width(8.dp))
148 text = stringResource(R.string.pref_instruction_manual),
149 color = MaterialTheme.colors.primaryVariant
151 Spacer(modifier = Modifier.height(4.dp))
154 color = MaterialTheme.colors.secondaryVariant,
155 modifier = Modifier.clickable(onClick = { uriHandler.openUri(openUri) })
162 fun ShowGokigenPrivacyPolicy()
164 val uriHandler = LocalUriHandler.current
165 val openUri = stringResource(R.string.pref_privacy_policy_url)
166 Row(modifier = Modifier.padding(all = 8.dp)) {
167 Spacer(modifier = Modifier.width(8.dp))
170 text = stringResource(R.string.pref_privacy_policy),
171 color = MaterialTheme.colors.primaryVariant
173 Spacer(modifier = Modifier.height(4.dp))
176 color = MaterialTheme.colors.secondaryVariant,
177 modifier = Modifier.clickable(onClick = { uriHandler.openUri(openUri) })