1 /*
2 * Copyright (C) 2025 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16 package com.android.privatespace
17
18 import androidx.compose.foundation.layout.Arrangement
19 import androidx.compose.foundation.layout.Column
20 import androidx.compose.foundation.layout.ExperimentalLayoutApi
21 import androidx.compose.foundation.layout.FlowRow
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.material3.BasicAlertDialog
27 import androidx.compose.material3.ExperimentalMaterial3Api
28 import androidx.compose.material3.MaterialTheme
29 import androidx.compose.material3.Surface
30 import androidx.compose.material3.Text
31 import androidx.compose.runtime.Composable
32 import androidx.compose.ui.Alignment
33 import androidx.compose.ui.Modifier
34 import androidx.compose.ui.text.style.TextAlign
35 import androidx.compose.ui.unit.dp
36 import androidx.compose.ui.window.DialogProperties
37
38 /**
39 * Based on {@link androidx.compose.material3.AlertDialog} but with three buttons instead of only up
40 * to two.
41 */
42 @OptIn(ExperimentalMaterial3Api::class, ExperimentalLayoutApi::class)
43 @Composable
ThreeButtonAlertDialognull44 fun ThreeButtonAlertDialog(
45 onDismissRequest: () -> Unit,
46 title: String,
47 message: String,
48 primaryButton: @Composable () -> Unit,
49 secondaryButton: @Composable () -> Unit,
50 dismissButton: @Composable () -> Unit,
51 ) {
52 BasicAlertDialog(
53 onDismissRequest = { onDismissRequest() },
54 properties =
55 DialogProperties(
56 dismissOnBackPress = true,
57 dismissOnClickOutside = true,
58 usePlatformDefaultWidth = false,
59 ),
60 ) {
61 Surface(
62 shape = MaterialTheme.shapes.extraLarge,
63 tonalElevation = 5.dp,
64 modifier = Modifier.padding(horizontal = 24.dp),
65 ) {
66 Column(modifier = Modifier.padding(24.dp)) {
67 Text(
68 text = title,
69 style = MaterialTheme.typography.headlineSmall,
70 modifier = Modifier.align(Alignment.CenterHorizontally),
71 )
72 Spacer(modifier = Modifier.height(16.dp))
73 Text(
74 text = message,
75 style = MaterialTheme.typography.bodyMedium,
76 modifier = Modifier.align(Alignment.CenterHorizontally),
77 textAlign = TextAlign.Center,
78 )
79 Spacer(modifier = Modifier.height(24.dp))
80
81 FlowRow(
82 modifier = Modifier.fillMaxWidth(),
83 verticalArrangement = Arrangement.spacedBy(10.dp),
84 horizontalArrangement = Arrangement.End,
85 ) {
86 dismissButton()
87 Spacer(modifier = Modifier.weight(1.0f))
88 secondaryButton()
89 primaryButton()
90 }
91 }
92 }
93 }
94 }
95