<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