11package org.wordpress.android.ui.voicetocontent
22
33import android.content.Intent
4- import android.content.pm.PackageManager
54import android.net.Uri
65import android.os.Bundle
76import android.view.LayoutInflater
87import android.view.View
98import android.view.ViewGroup
109import androidx.activity.result.contract.ActivityResultContracts
1110import androidx.appcompat.app.AlertDialog
12- import androidx.compose.foundation.clickable
13- import androidx.compose.runtime.Composable
14- import androidx.compose.runtime.getValue
15- import androidx.compose.runtime.livedata.observeAsState
1611import androidx.compose.ui.platform.ComposeView
1712import androidx.fragment.app.viewModels
1813import com.google.android.material.bottomsheet.BottomSheetDialogFragment
1914import dagger.hilt.android.AndroidEntryPoint
2015import org.wordpress.android.ui.compose.theme.AppTheme
21- import androidx.compose.foundation.layout.Column
22- import androidx.compose.foundation.layout.Spacer
23- import androidx.compose.foundation.layout.fillMaxWidth
24- import androidx.compose.foundation.layout.height
25- import androidx.compose.foundation.layout.padding
26- import androidx.compose.foundation.layout.size
27- import androidx.compose.material.Icon
28- import androidx.compose.material.Text
29- import androidx.compose.ui.Alignment
30- import androidx.compose.ui.Modifier
31- import androidx.compose.ui.res.painterResource
32- import androidx.compose.ui.text.font.FontWeight
33- import androidx.compose.ui.unit.dp
34- import androidx.compose.ui.unit.sp
35- import androidx.core.content.ContextCompat
3616import org.wordpress.android.R
3717import org.wordpress.android.util.audio.IAudioRecorder.Companion.REQUIRED_RECORDING_PERMISSIONS
3818import android.provider.Settings
19+ import androidx.compose.material.ExperimentalMaterialApi
3920
4021@AndroidEntryPoint
4122class VoiceToContentDialogFragment : BottomSheetDialogFragment () {
4223 private val viewModel: VoiceToContentViewModel by viewModels()
4324
25+ @ExperimentalMaterialApi
4426 override fun onCreateView (
4527 inflater : LayoutInflater , container : ViewGroup ? , savedInstanceState : Bundle ?
4628 ): View = ComposeView (requireContext()).apply {
4729 setContent {
4830 AppTheme {
4931 VoiceToContentScreen (
50- viewModel = viewModel,
51- onRequestPermission = { requestAllPermissionsForRecording() },
52- hasPermission = { hasAllPermissionsForRecording() }
32+ viewModel = viewModel
5333 )
5434 }
5535 }
5636 }
5737
38+ override fun onViewCreated (view : View , savedInstanceState : Bundle ? ) {
39+ super .onViewCreated(view, savedInstanceState)
40+ observeViewModel()
41+ viewModel.start()
42+ }
43+
44+ private fun observeViewModel () {
45+ viewModel.requestPermission.observe(viewLifecycleOwner) {
46+ requestAllPermissionsForRecording()
47+ }
48+
49+ viewModel.dismiss.observe(viewLifecycleOwner) {
50+ dismiss()
51+ }
52+ }
53+
5854 private val requestMultiplePermissionsLauncher = registerForActivityResult(
5955 ActivityResultContracts .RequestMultiplePermissions ()
6056 ) { permissions ->
6157 val areAllPermissionsGranted = permissions.entries.all { it.value }
6258 if (areAllPermissionsGranted) {
63- viewModel.startRecording ()
59+ viewModel.onPermissionGranted ()
6460 } else {
6561 // Check if any permissions were denied permanently
6662 if (permissions.entries.any { ! it.value }) {
@@ -69,15 +65,6 @@ class VoiceToContentDialogFragment : BottomSheetDialogFragment() {
6965 }
7066 }
7167
72- private fun hasAllPermissionsForRecording (): Boolean {
73- return REQUIRED_RECORDING_PERMISSIONS .all {
74- ContextCompat .checkSelfPermission(
75- requireContext(),
76- it
77- ) == PackageManager .PERMISSION_GRANTED
78- }
79- }
80-
8168 private fun requestAllPermissionsForRecording () {
8269 requestMultiplePermissionsLauncher.launch(REQUIRED_RECORDING_PERMISSIONS )
8370 }
@@ -104,63 +91,3 @@ class VoiceToContentDialogFragment : BottomSheetDialogFragment() {
10491 fun newInstance () = VoiceToContentDialogFragment ()
10592 }
10693}
107-
108- @Composable
109- fun VoiceToContentScreen (
110- viewModel : VoiceToContentViewModel ,
111- onRequestPermission : () -> Unit ,
112- hasPermission : () -> Boolean
113- ) {
114- val result by viewModel.uiState.observeAsState()
115- val assistantFeature by viewModel.aiAssistantFeatureState.observeAsState()
116- Column (
117- horizontalAlignment = Alignment .CenterHorizontally ,
118- modifier = Modifier
119- .fillMaxWidth()
120- .padding(16 .dp)
121- ) {
122- when {
123- result?.isError == true -> {
124- Text (text = " Error happened" , fontSize = 20 .sp, fontWeight = FontWeight .Bold )
125- }
126-
127- result?.content != null -> {
128- Text (text = result?.content!! , fontSize = 20 .sp, fontWeight = FontWeight .Bold )
129- }
130-
131- assistantFeature != null -> {
132- Text (text = " Assistant Feature Returned Successfully" , fontSize = 20 .sp, fontWeight = FontWeight .Bold )
133- Spacer (modifier = Modifier .height(16 .dp))
134- }
135-
136- else -> {
137- Text (text = " Ready to fake record - tap microphone" , fontSize = 20 .sp, fontWeight = FontWeight .Bold )
138- Spacer (modifier = Modifier .height(16 .dp))
139- Icon (
140- painterResource(id = R .drawable.ic_mic_white_24dp),
141- contentDescription = " Microphone" ,
142- modifier = Modifier
143- .size(64 .dp)
144- .clickable {
145- if (hasPermission()) {
146- viewModel.startRecording()
147- } else {
148- onRequestPermission()
149- }
150- }
151- )
152-
153- Spacer (modifier = Modifier .height(16 .dp))
154- Icon (
155- painterResource(id = com.google.android.exoplayer2.ui.R .drawable.exo_icon_stop),
156- contentDescription = " Stop" ,
157- modifier = Modifier
158- .size(64 .dp)
159- .clickable {
160- viewModel.stopRecording()
161- }
162- )
163- }
164- }
165- }
166- }
0 commit comments