Skip to content

Commit 313e448

Browse files
Add premission checks
1 parent 53d6430 commit 313e448

File tree

2 files changed

+28
-25
lines changed

2 files changed

+28
-25
lines changed

ai-catalog/samples/gemini-live-todo/src/main/java/com/android/ai/samples/geminilivetodo/ui/TodoScreen.kt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,6 @@ import kotlin.collections.reversed
8484
* This composable is stateful, connecting to the ViewModel to manage UI state and events.
8585
*/
8686
@OptIn(ExperimentalMaterial3Api::class)
87-
@RequiresPermission(Manifest.permission.RECORD_AUDIO)
8887
@Composable
8988
fun TodoScreen(viewModel: TodoScreenViewModel = hiltViewModel()) {
9089
val uiState by viewModel.uiState.collectAsStateWithLifecycle()
@@ -109,7 +108,7 @@ fun TodoScreen(viewModel: TodoScreenViewModel = hiltViewModel()) {
109108
floatingActionButton = {
110109
MicButton(
111110
uiState = uiState,
112-
onToggle = { viewModel.toggleLiveSession() },
111+
onToggle = { viewModel.toggleLiveSession(activity) },
113112
)
114113
},
115114
floatingActionButtonPosition = FabPosition.Center,

ai-catalog/samples/gemini-live-todo/src/main/java/com/android/ai/samples/geminilivetodo/ui/TodoScreenViewModel.kt

Lines changed: 27 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ import android.Manifest
1919
import android.app.Activity
2020
import android.content.pm.PackageManager
2121
import android.util.Log
22-
import androidx.annotation.RequiresPermission
2322
import androidx.core.app.ActivityCompat
2423
import androidx.core.content.ContextCompat
2524
import androidx.lifecycle.ViewModel
@@ -88,34 +87,39 @@ class TodoScreenViewModel @Inject constructor(private val todoRepository: TodoRe
8887
todoRepository.toggleTodoStatus(todoId)
8988
}
9089

91-
@RequiresPermission(android.Manifest.permission.RECORD_AUDIO)
92-
fun toggleLiveSession() {
93-
viewModelScope.launch {
94-
val currentState = _uiState.value
95-
if (currentState !is TodoScreenUiState.Success) return@launch
90+
fun toggleLiveSession(activity: Activity) {
91+
viewModelScope.launch {
92+
val currentState = _uiState.value
93+
if (currentState !is TodoScreenUiState.Success) return@launch
9694

97-
session?.let {
98-
if (!currentState.isLiveSessionRunning) {
99-
it.startAudioConversation(::handleFunctionCall)
100-
_uiState.update {
101-
if (it is TodoScreenUiState.Success) {
102-
it.copy(isLiveSessionRunning = true)
103-
} else {
104-
it
95+
session?.let {
96+
if (!currentState.isLiveSessionRunning) {
97+
if (ContextCompat.checkSelfPermission(
98+
activity,
99+
Manifest.permission.RECORD_AUDIO
100+
) == PackageManager.PERMISSION_GRANTED
101+
) {
102+
it.startAudioConversation(::handleFunctionCall)
103+
_uiState.update {
104+
if (it is TodoScreenUiState.Success) {
105+
it.copy(isLiveSessionRunning = true)
106+
} else {
107+
it
108+
}
109+
}
105110
}
106-
}
107-
} else {
108-
it.stopAudioConversation()
109-
_uiState.update {
110-
if (it is TodoScreenUiState.Success) {
111-
it.copy(isLiveSessionRunning = false)
112-
} else {
113-
it
111+
} else {
112+
it.stopAudioConversation()
113+
_uiState.update {
114+
if (it is TodoScreenUiState.Success) {
115+
it.copy(isLiveSessionRunning = false)
116+
} else {
117+
it
118+
}
114119
}
115120
}
116121
}
117122
}
118-
}
119123
}
120124

121125
fun initializeGeminiLive(activity: Activity) {

0 commit comments

Comments
 (0)