OSDN Git Service

操作説明とプライバシーポリシーを開けるようにした。
[gokigen/A01f.git] / app / src / main / java / net / osdn / gokigen / objectdetection / a01f / ui / view / PreferenceScreen.kt
1 package net.osdn.gokigen.objectdetection.a01f.ui.view
2
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
25
26 @Composable
27 fun PreferenceScreen(navController: NavHostController, prefsModel: A01fPrefsModel, vibrator : IVibrator)
28 {
29     val padding = 2.dp
30
31     MaterialTheme {
32         Column {
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))
47             ShowAboutGokigen()
48             Spacer(Modifier.size(padding))
49             ShowGokigenPrivacyPolicy()
50             Spacer(Modifier.size(padding))
51         }
52     }
53 }
54
55 @Composable
56 fun CaptureBothLiveViewAndCamera(prefsModel: A01fPrefsModel)
57 {
58     val scope = rememberCoroutineScope()
59     val captureBothLiveViewAndCamera = prefsModel.captureBothLvAndCamera.observeAsState(initial = prefsModel.captureBothLvAndCamera.value ?: false)
60     Row (verticalAlignment = Alignment.CenterVertically) {
61         Checkbox(
62             checked = captureBothLiveViewAndCamera.value,
63             onCheckedChange = {
64                 scope.launch {
65                     prefsModel.setCaptureBothLvAndCamera(!captureBothLiveViewAndCamera.value)
66                 }
67             })
68         Text(stringResource(R.string.pref_capture_both_camera_and_live_view))
69     }
70 }
71
72 @Composable
73 fun CameraConnectionMethodDropdown(prefsModel: A01fPrefsModel, vibrator : IVibrator)
74 {
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)
78
79     var expanded = cameraConnectionMethodExpanded.value
80     var selectedIndex = cameraConnectionMethodIndex.value
81     val itemLabels = stringArrayResource(id = R.array.connection_method)
82
83     Box(modifier = Modifier
84         .fillMaxSize()
85         .wrapContentSize(Alignment.TopStart)) {
86         Text(" " + stringResource(id = R.string.pref_connection_method) + " : " + itemLabels[selectedIndex],modifier = Modifier
87             .fillMaxWidth()
88             .clickable(onClick = {
89                 expanded = true
90                 prefsModel.setIsCameraConnectionMethodExpanded(true)
91             })
92             .background(Color.White))
93         DropdownMenu(
94             expanded = expanded,
95             onDismissRequest = { expanded = false },
96             modifier = Modifier
97                 .fillMaxWidth()
98                 .background(Color.LightGray)
99         ) {
100             itemLabels.forEachIndexed { index, s ->
101                 DropdownMenuItem(onClick = {
102                     scope.launch {
103                         selectedIndex = index
104                         expanded = false
105                         prefsModel.setIsCameraConnectionMethodExpanded(false)
106                         prefsModel.setCameraConnectionMethodSelectionIndex(index)
107                         vibrator.vibrate(IVibrator.VibratePattern.SIMPLE_SHORT_SHORT)
108                         Log.v("CameraConnectionMethod", "selected Index: $selectedIndex value: ")
109                     }
110                 }) {
111                     Text(text = s)
112                 }
113             }
114         }
115     }
116 }
117
118 @Composable
119 fun FilePickerForObjectDetectionModel(prefsModel: A01fPrefsModel)
120 {
121     val scope = rememberCoroutineScope()
122
123     //val filePickerLauncher = rememberLauncherForActivityResult(ActivityResultContracts.GetContent()) { modelUri ->
124     val filePickerLauncher = rememberLauncherForActivityResult(GetPickFilePermission()) { modelUri ->
125         if (modelUri != null)
126         {
127             Log.v("File Pick", "Picked file URI: $modelUri")
128             scope.launch {
129                 prefsModel.setObjectDetectionFileModel(modelUri)
130             }
131         }
132     }
133
134     Row (verticalAlignment = Alignment.CenterVertically) {
135         Text(" " + stringResource(id = R.string.pref_for_object_detection_model_file) + " " + prefsModel.getObjectDetectionFileName(), modifier = Modifier.clickable { filePickerLauncher.launch("*/*") })
136     }
137 }
138
139 @Composable
140 fun ShowAboutGokigen()
141 {
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))
146         Column {
147             Text(
148                 text = stringResource(R.string.pref_instruction_manual),
149                 color = MaterialTheme.colors.primaryVariant
150             )
151             Spacer(modifier = Modifier.height(4.dp))
152             Text(
153                 text = openUri,
154                 color = MaterialTheme.colors.secondaryVariant,
155                 modifier = Modifier.clickable(onClick = { uriHandler.openUri(openUri) })
156             )
157         }
158     }
159 }
160
161 @Composable
162 fun ShowGokigenPrivacyPolicy()
163 {
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))
168         Column {
169             Text(
170                 text = stringResource(R.string.pref_privacy_policy),
171                 color = MaterialTheme.colors.primaryVariant
172             )
173             Spacer(modifier = Modifier.height(4.dp))
174             Text(
175                 text = openUri,
176                 color = MaterialTheme.colors.secondaryVariant,
177                 modifier = Modifier.clickable(onClick = { uriHandler.openUri(openUri) })
178             )
179         }
180     }
181 }