You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
114 lines
3.5 KiB
114 lines
3.5 KiB
package com.whispercppdemo.ui.main
|
|
|
|
import androidx.compose.foundation.layout.*
|
|
import androidx.compose.foundation.rememberScrollState
|
|
import androidx.compose.foundation.text.selection.SelectionContainer
|
|
import androidx.compose.foundation.verticalScroll
|
|
import androidx.compose.material3.*
|
|
import androidx.compose.runtime.Composable
|
|
import androidx.compose.ui.Modifier
|
|
import androidx.compose.ui.res.stringResource
|
|
import androidx.compose.ui.unit.dp
|
|
import com.google.accompanist.permissions.ExperimentalPermissionsApi
|
|
import com.google.accompanist.permissions.isGranted
|
|
import com.google.accompanist.permissions.rememberPermissionState
|
|
import com.whispercppdemo.R
|
|
|
|
@Composable
|
|
fun MainScreen(viewModel: MainScreenViewModel) {
|
|
MainScreen(
|
|
canTranscribe = viewModel.canTranscribe,
|
|
isRecording = viewModel.isRecording,
|
|
messageLog = viewModel.dataLog,
|
|
onBenchmarkTapped = viewModel::benchmark,
|
|
onTranscribeSampleTapped = viewModel::transcribeSample,
|
|
onRecordTapped = viewModel::toggleRecord
|
|
)
|
|
}
|
|
|
|
@OptIn(ExperimentalMaterial3Api::class)
|
|
@Composable
|
|
private fun MainScreen(
|
|
canTranscribe: Boolean,
|
|
isRecording: Boolean,
|
|
messageLog: String,
|
|
onBenchmarkTapped: () -> Unit,
|
|
onTranscribeSampleTapped: () -> Unit,
|
|
onRecordTapped: () -> Unit
|
|
) {
|
|
Scaffold(
|
|
topBar = {
|
|
TopAppBar(
|
|
title = { Text(stringResource(R.string.app_name)) }
|
|
)
|
|
},
|
|
) { innerPadding ->
|
|
Column(
|
|
modifier = Modifier
|
|
.padding(innerPadding)
|
|
.padding(16.dp)
|
|
) {
|
|
Column(verticalArrangement = Arrangement.SpaceBetween) {
|
|
Row(horizontalArrangement = Arrangement.SpaceBetween, modifier = Modifier.fillMaxWidth()) {
|
|
BenchmarkButton(enabled = canTranscribe, onClick = onBenchmarkTapped)
|
|
TranscribeSampleButton(enabled = canTranscribe, onClick = onTranscribeSampleTapped)
|
|
}
|
|
RecordButton(
|
|
enabled = canTranscribe,
|
|
isRecording = isRecording,
|
|
onClick = onRecordTapped
|
|
)
|
|
}
|
|
MessageLog(messageLog)
|
|
}
|
|
}
|
|
}
|
|
|
|
@Composable
|
|
private fun MessageLog(log: String) {
|
|
SelectionContainer() {
|
|
Text(modifier = Modifier.verticalScroll(rememberScrollState()), text = log)
|
|
}
|
|
}
|
|
|
|
@Composable
|
|
private fun BenchmarkButton(enabled: Boolean, onClick: () -> Unit) {
|
|
Button(onClick = onClick, enabled = enabled) {
|
|
Text("Benchmark")
|
|
}
|
|
}
|
|
|
|
@Composable
|
|
private fun TranscribeSampleButton(enabled: Boolean, onClick: () -> Unit) {
|
|
Button(onClick = onClick, enabled = enabled) {
|
|
Text("Transcribe sample")
|
|
}
|
|
}
|
|
|
|
@OptIn(ExperimentalPermissionsApi::class)
|
|
@Composable
|
|
private fun RecordButton(enabled: Boolean, isRecording: Boolean, onClick: () -> Unit) {
|
|
val micPermissionState = rememberPermissionState(
|
|
permission = android.Manifest.permission.RECORD_AUDIO,
|
|
onPermissionResult = { granted ->
|
|
if (granted) {
|
|
onClick()
|
|
}
|
|
}
|
|
)
|
|
Button(onClick = {
|
|
if (micPermissionState.status.isGranted) {
|
|
onClick()
|
|
} else {
|
|
micPermissionState.launchPermissionRequest()
|
|
}
|
|
}, enabled = enabled) {
|
|
Text(
|
|
if (isRecording) {
|
|
"Stop recording"
|
|
} else {
|
|
"Start recording"
|
|
}
|
|
)
|
|
}
|
|
} |