xref: /aosp_15_r20/external/lottie/sample-compose/src/main/java/com/airbnb/lottie/sample/compose/preview/PreviewPage.kt (revision bb5273fecd5c61b9ace70f9ff4fcd88f0e12e3f7)

<lambda>null1 package com.airbnb.lottie.sample.compose.preview
2 
3 import androidx.annotation.DrawableRes
4 import androidx.annotation.StringRes
5 import androidx.compose.foundation.background
6 import androidx.compose.foundation.layout.Box
7 import androidx.compose.foundation.layout.Column
8 import androidx.compose.foundation.layout.Row
9 import androidx.compose.foundation.layout.fillMaxWidth
10 import androidx.compose.foundation.layout.height
11 import androidx.compose.foundation.layout.padding
12 import androidx.compose.foundation.shape.RoundedCornerShape
13 import androidx.compose.material.Divider
14 import androidx.compose.material.Icon
15 import androidx.compose.material.OutlinedTextField
16 import androidx.compose.material.Surface
17 import androidx.compose.material.Text
18 import androidx.compose.material.TextButton
19 import androidx.compose.runtime.Composable
20 import androidx.compose.runtime.getValue
21 import androidx.compose.runtime.mutableStateOf
22 import androidx.compose.runtime.remember
23 import androidx.compose.runtime.setValue
24 import androidx.compose.ui.Alignment
25 import androidx.compose.ui.Modifier
26 import androidx.compose.ui.graphics.Color
27 import androidx.compose.ui.platform.LocalContext
28 import androidx.compose.ui.res.painterResource
29 import androidx.compose.ui.res.stringResource
30 import androidx.compose.ui.tooling.preview.Preview
31 import androidx.compose.ui.unit.dp
32 import androidx.compose.ui.unit.sp
33 import androidx.compose.ui.window.Dialog
34 import androidx.navigation.NavController
35 import androidx.navigation.compose.rememberNavController
36 import com.airbnb.lottie.sample.compose.R
37 import com.airbnb.lottie.sample.compose.Route
38 import com.airbnb.lottie.sample.compose.composables.Marquee
39 import com.airbnb.lottie.sample.compose.ui.LottieTheme
40 
41 @Composable
42 fun PreviewPage(navController: NavController) {
43     var showingAssetsDialog by remember { mutableStateOf(false) }
44     var showingUrlDialog by remember { mutableStateOf(false) }
45 
46     Column {
47         Marquee(stringResource(R.string.tab_preview))
48         PreviewRow(R.drawable.ic_qr_scan, R.string.scan_qr_code) {
49 
50         }
51         PreviewRow(R.drawable.ic_file, R.string.open_file) {
52 
53         }
54         PreviewRow(R.drawable.ic_network, R.string.enter_url) {
55             showingUrlDialog = true
56         }
57         PreviewRow(R.drawable.ic_storage, R.string.load_from_assets) {
58             showingAssetsDialog = true
59         }
60     }
61 
62     AssetsDialog(
63         showingAssetsDialog,
64         onDismiss = { showingAssetsDialog = false },
65         onAssetSelected = { assetName ->
66             navController.navigate(Route.Player.forAsset(assetName))
67         }
68     )
69     UrlDialog(
70         showingUrlDialog,
71         onDismiss = { showingUrlDialog = false },
72         onUrlSelected = { url ->
73             navController.navigate(Route.Player.forUrl(url))
74         }
75     )
76 }
77 
78 @Composable
PreviewRownull79 private fun PreviewRow(
80     @DrawableRes iconRes: Int,
81     @StringRes textRes: Int,
82     onClick: () -> Unit,
83 ) {
84     Surface(
85         onClick = onClick,
86     ) {
87         Column {
88             Row(
89                 modifier = Modifier
90                     .height(48.dp)
91             ) {
92                 Icon(
93                     painterResource(iconRes),
94                     modifier = Modifier
95                         .align(Alignment.CenterVertically)
96                         .padding(16.dp),
97                     contentDescription = null
98                 )
99                 Text(
100                     stringResource(textRes),
101                     modifier = Modifier
102                         .align(Alignment.CenterVertically)
103                 )
104             }
105             Divider(color = Color.LightGray)
106         }
107     }
108 }
109 
110 @Composable
AssetsDialognull111 fun AssetsDialog(isShowing: Boolean, onDismiss: () -> Unit, onAssetSelected: (assetName: String) -> Unit) {
112     if (!isShowing) return
113     val context = LocalContext.current
114     val assets = context.assets.list("")
115         ?.asSequence()
116         ?.filter { it.endsWith(".json") || it.endsWith(".zip") }
117         ?.toList()
118         ?: emptyList()
119     Dialog(onDismissRequest = onDismiss) {
120         Surface(
121             shape = RoundedCornerShape(4.dp),
122         ) {
123             Column(
124                 modifier = Modifier
125                     .padding(horizontal = 12.dp)
126             ) {
127                 assets.forEach { asset ->
128                     AssetRow(asset, onClick = {
129                         onDismiss()
130                         onAssetSelected(asset)
131                     })
132                 }
133             }
134         }
135     }
136 }
137 
138 @Composable
UrlDialognull139 fun UrlDialog(isShowing: Boolean, onDismiss: () -> Unit, onUrlSelected: (url: String) -> Unit) {
140     if (!isShowing) return
141     var url by remember { mutableStateOf("") }
142     Dialog(onDismissRequest = {
143         url = ""
144         onDismiss()
145     }) {
146         Surface(
147             shape = RoundedCornerShape(4.dp),
148         ) {
149             Column(
150                 modifier = Modifier.padding(16.dp)
151             ) {
152                 Text(
153                     stringResource(R.string.enter_url),
154                     fontSize = 18.sp,
155                 )
156                 OutlinedTextField(
157                     value = url,
158                     onValueChange = { url = it },
159                     label = { Text(stringResource(R.string.url)) },
160                 )
161                 TextButton(
162                     onClick = { onUrlSelected(url) },
163                     modifier = Modifier.align(Alignment.End)
164                 ) {
165                     Text(stringResource(R.string.ok))
166                 }
167             }
168         }
169     }
170 }
171 
172 @Composable
AssetRownull173 private fun AssetRow(name: String, onClick: () -> Unit) {
174     Surface(
175         onClick = onClick,
176         modifier = Modifier
177             .fillMaxWidth()
178             .padding(vertical = 12.dp)
179     ) {
180         Text(name)
181     }
182 }
183 
184 @Preview
185 @Composable
PreviewPagePreviewnull186 fun PreviewPagePreview() {
187     val navController = rememberNavController()
188     LottieTheme {
189         Box(modifier = Modifier.background(Color.White)) {
190             PreviewPage(navController)
191         }
192     }
193 }
194