Skip to content

Commit 3b59124

Browse files
authored
Refactor GenAI Writing Assistance sample to use UI state (#75)
Co-authored-by: calren <[email protected]>
1 parent e780327 commit 3b59124

File tree

4 files changed

+177
-110
lines changed

4 files changed

+177
-110
lines changed

ai-catalog/samples/genai-writing-assistance/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,5 +69,6 @@ dependencies {
6969
implementation(libs.genai.proofreading)
7070
implementation(libs.genai.rewrite)
7171
implementation(libs.kotlinx.coroutines.guava)
72+
implementation(libs.androidx.lifecycle.runtime.compose)
7273
ksp(libs.hilt.compiler)
7374
}

ai-catalog/samples/genai-writing-assistance/src/main/java/com/android/ai/samples/genai_writing_assistance/GenAIWritingAssistanceScreen.kt

Lines changed: 46 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@ import androidx.compose.material3.Card
3333
import androidx.compose.material3.ExperimentalMaterial3Api
3434
import androidx.compose.material3.Icon
3535
import androidx.compose.material3.MaterialTheme
36-
import androidx.compose.material3.ModalBottomSheet
3736
import androidx.compose.material3.OutlinedButton
3837
import androidx.compose.material3.RadioButton
3938
import androidx.compose.material3.Scaffold
@@ -42,9 +41,7 @@ import androidx.compose.material3.TextButton
4241
import androidx.compose.material3.TextField
4342
import androidx.compose.material3.TopAppBar
4443
import androidx.compose.material3.TopAppBarDefaults.topAppBarColors
45-
import androidx.compose.material3.rememberModalBottomSheetState
4644
import androidx.compose.runtime.Composable
47-
import androidx.compose.runtime.collectAsState
4845
import androidx.compose.runtime.getValue
4946
import androidx.compose.runtime.mutableStateOf
5047
import androidx.compose.runtime.remember
@@ -61,27 +58,26 @@ import androidx.compose.ui.unit.sp
6158
import androidx.compose.ui.window.Dialog
6259
import androidx.core.net.toUri
6360
import androidx.hilt.navigation.compose.hiltViewModel
61+
import androidx.lifecycle.compose.collectAsStateWithLifecycle
6462
import com.android.ai.samples.geminimultimodal.R
6563
import com.google.mlkit.genai.rewriting.RewriterOptions
6664

6765
@OptIn(ExperimentalMaterial3Api::class)
6866
@Composable
6967
fun GenAIWritingAssistanceScreen(viewModel: GenAIWritingAssistanceViewModel = hiltViewModel()) {
68+
val uiState by viewModel.uiState.collectAsStateWithLifecycle()
7069

71-
val sheetState = rememberModalBottomSheetState()
72-
var showBottomSheet by remember { mutableStateOf(false) }
7370
var showRewriteOptionsDialog by remember { mutableStateOf(false) }
7471
val context = LocalContext.current
7572

76-
val resultGenerated = viewModel.resultGenerated.collectAsState()
77-
7873
val proofreadSampleTextOptions = stringArrayResource(R.array.proofread_sample_text)
7974
val rewriteSampleTextOptions = stringArrayResource(R.array.rewrite_sample_text)
8075

8176
var textInput by remember { mutableStateOf("") }
8277

8378
Scaffold(
84-
modifier = Modifier.fillMaxSize(), topBar = {
79+
modifier = Modifier.fillMaxSize(),
80+
topBar = {
8581
TopAppBar(
8682
colors = topAppBarColors(
8783
containerColor = MaterialTheme.colorScheme.primaryContainer,
@@ -112,14 +108,40 @@ fun GenAIWritingAssistanceScreen(viewModel: GenAIWritingAssistanceViewModel = hi
112108
.weight(.8f),
113109
)
114110

111+
val outputText = when (val state = uiState) {
112+
is GenAIWritingAssistanceUiState.DownloadingFeature -> stringResource(
113+
id = R.string.genai_writing_assistance_downloading,
114+
state.bytesDownloaded,
115+
state.bytesToDownload,
116+
)
117+
118+
is GenAIWritingAssistanceUiState.Error -> stringResource(state.errorMessageStringRes)
119+
is GenAIWritingAssistanceUiState.Success -> state.generatedOutput
120+
is GenAIWritingAssistanceUiState.Generating -> stringResource(id = R.string.generating)
121+
GenAIWritingAssistanceUiState.CheckingFeatureStatus -> stringResource(id = R.string.checking_feature_status)
122+
GenAIWritingAssistanceUiState.Initial -> "" // Show nothing for the Initial state
123+
}
124+
125+
// Output box
126+
Card(
127+
modifier = Modifier
128+
.fillMaxWidth()
129+
.weight(1f)
130+
.padding(horizontal = 16.dp, vertical = 8.dp),
131+
) {
132+
Text(
133+
text = outputText,
134+
modifier = Modifier.padding(16.dp),
135+
)
136+
}
137+
115138
Row(modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.Center) {
116139
// Proofread button
117140
Button(
118141
onClick = {
119-
showBottomSheet = true
120142
viewModel.proofread(textInput, context)
121143
},
122-
Modifier.padding(10.dp),
144+
Modifier.padding(8.dp),
123145
) {
124146
Text(
125147
stringResource(id = R.string.genai_writing_assistance_proofread_btn),
@@ -129,7 +151,7 @@ fun GenAIWritingAssistanceScreen(viewModel: GenAIWritingAssistanceViewModel = hi
129151
onClick = {
130152
showRewriteOptionsDialog = true
131153
},
132-
Modifier.padding(10.dp),
154+
Modifier.padding(8.dp),
133155
) {
134156
Text(
135157
stringResource(id = R.string.genai_writing_assistance_rewrite_btn),
@@ -145,7 +167,9 @@ fun GenAIWritingAssistanceScreen(viewModel: GenAIWritingAssistanceViewModel = hi
145167
) {
146168
OutlinedButton(
147169
onClick = { textInput = proofreadSampleTextOptions.random() },
148-
Modifier.weight(1f).padding(5.dp),
170+
Modifier
171+
.weight(1f)
172+
.padding(4.dp),
149173
) {
150174
Text(
151175
stringResource(id = R.string.genai_writing_assistance_proofread_sample_text_btn),
@@ -155,7 +179,9 @@ fun GenAIWritingAssistanceScreen(viewModel: GenAIWritingAssistanceViewModel = hi
155179

156180
OutlinedButton(
157181
onClick = { textInput = rewriteSampleTextOptions.random() },
158-
Modifier.weight(1f).padding(5.dp),
182+
Modifier
183+
.weight(1f)
184+
.padding(4.dp),
159185
) {
160186
Text(
161187
stringResource(id = R.string.genai_writing_assistance_rewrite_sample_text_btn),
@@ -164,8 +190,13 @@ fun GenAIWritingAssistanceScreen(viewModel: GenAIWritingAssistanceViewModel = hi
164190
}
165191

166192
OutlinedButton(
167-
onClick = { textInput = "" },
168-
Modifier.weight(1f).padding(5.dp),
193+
onClick = {
194+
textInput = ""
195+
viewModel.clearGeneratedText()
196+
},
197+
Modifier
198+
.weight(1f)
199+
.padding(4.dp),
169200
) {
170201
Text(
171202
stringResource(id = R.string.genai_writing_assistance_reset_btn),
@@ -175,31 +206,10 @@ fun GenAIWritingAssistanceScreen(viewModel: GenAIWritingAssistanceViewModel = hi
175206
}
176207
}
177208

178-
if (showBottomSheet) {
179-
ModalBottomSheet(
180-
onDismissRequest = {
181-
showBottomSheet = false
182-
viewModel.clearGeneratedText()
183-
},
184-
sheetState = sheetState,
185-
) {
186-
Text(
187-
text = resultGenerated.value,
188-
modifier = Modifier.padding(
189-
top = 8.dp,
190-
bottom = 24.dp,
191-
start = 24.dp,
192-
end = 24.dp,
193-
),
194-
)
195-
}
196-
}
197-
198209
if (showRewriteOptionsDialog) {
199210
RewriteOptionsDialog(
200211
onConfirm = { rewriteStyleSelected ->
201212
showRewriteOptionsDialog = false
202-
showBottomSheet = true
203213
viewModel.rewrite(
204214
textInput,
205215
rewriteStyleSelected.rewriteStyle,

0 commit comments

Comments
 (0)