<lambda>null1 package com.airbnb.lottie.sample.compose
2
3 import android.os.Bundle
4 import androidx.activity.compose.setContent
5 import androidx.annotation.DrawableRes
6 import androidx.annotation.StringRes
7 import androidx.appcompat.app.AppCompatActivity
8 import androidx.compose.foundation.layout.Box
9 import androidx.compose.foundation.layout.padding
10 import androidx.compose.material.BottomNavigation
11 import androidx.compose.material.BottomNavigationItem
12 import androidx.compose.material.Icon
13 import androidx.compose.material.Scaffold
14 import androidx.compose.material.Text
15 import androidx.compose.runtime.Composable
16 import androidx.compose.runtime.getValue
17 import androidx.compose.ui.Modifier
18 import androidx.compose.ui.graphics.Color
19 import androidx.compose.ui.res.painterResource
20 import androidx.compose.ui.res.stringResource
21 import androidx.compose.ui.unit.dp
22 import androidx.navigation.compose.NavHost
23 import androidx.navigation.compose.composable
24 import androidx.navigation.compose.currentBackStackEntryAsState
25 import androidx.navigation.compose.rememberNavController
26 import com.airbnb.lottie.compose.LottieCompositionSpec
27 import com.airbnb.lottie.sample.compose.examples.AnimatableExamplesPage
28 import com.airbnb.lottie.sample.compose.examples.BasicUsageExamplesPage
29 import com.airbnb.lottie.sample.compose.examples.CachingExamplesPage
30 import com.airbnb.lottie.sample.compose.examples.ContentScaleExamplesPage
31 import com.airbnb.lottie.sample.compose.examples.DynamicPropertiesExamplesPage
32 import com.airbnb.lottie.sample.compose.examples.ExamplesPage
33 import com.airbnb.lottie.sample.compose.examples.ImagesExamplesPage
34 import com.airbnb.lottie.sample.compose.examples.NetworkExamplesPage
35 import com.airbnb.lottie.sample.compose.examples.TextExamplesPage
36 import com.airbnb.lottie.sample.compose.examples.TransitionsExamplesPage
37 import com.airbnb.lottie.sample.compose.examples.ViewPagerExamplePage
38 import com.airbnb.lottie.sample.compose.lottiefiles.LottieFilesPage
39 import com.airbnb.lottie.sample.compose.player.PlayerPage
40 import com.airbnb.lottie.sample.compose.preview.PreviewPage
41 import com.airbnb.lottie.sample.compose.showcase.ShowcasePage
42 import com.airbnb.lottie.sample.compose.ui.LottieTheme
43 import com.airbnb.lottie.sample.compose.ui.Teal
44 import com.airbnb.lottie.sample.compose.ui.toColorSafe
45 import com.airbnb.lottie.sample.compose.utils.getBase64String
46
47 class ComposeActivity : AppCompatActivity() {
48
49 override fun onCreate(savedInstanceState: Bundle?) {
50 super.onCreate(savedInstanceState)
51 setContent {
52 LottieScaffold()
53 }
54 }
55
56 @Composable
57 private fun LottieScaffold() {
58 val navController = rememberNavController()
59
60 LottieTheme {
61 Scaffold(
62 bottomBar = {
63 BottomNavigation(
64 backgroundColor = Color(0xFFF7F7F7),
65 elevation = 8.dp,
66 contentColor = Teal,
67 ) {
68 val navBackStackEntry by navController.currentBackStackEntryAsState()
69 val currentRoute = navBackStackEntry?.destination?.route
70
71 BottomNavItemData.values().forEach { item ->
72 BottomNavigationItem(
73 icon = {
74 Icon(
75 painter = painterResource(item.iconRes),
76 contentDescription = null
77 )
78 },
79 label = { Text(stringResource(item.labelRes)) },
80 selected = currentRoute == item.route.route,
81 onClick = {
82 if (currentRoute != item.route.route) {
83 navController.navigate(item.route.route)
84 }
85 },
86 )
87 }
88 }
89 }
90 ) { innerPadding ->
91 Box(
92 modifier = Modifier.padding(innerPadding)
93 ) {
94 NavHost(navController, startDestination = Route.Showcase.route) {
95 composable(Route.Showcase.route) { ShowcasePage(navController) }
96 composable(Route.Preview.route) { PreviewPage(navController) }
97 composable(Route.LottieFiles.route) { LottieFilesPage(navController) }
98 composable(Route.Examples.route) { ExamplesPage(navController) }
99 composable(Route.BasicUsageExamples.route) { BasicUsageExamplesPage() }
100 composable(Route.AnimatableUsageExamples.route) { AnimatableExamplesPage() }
101 composable(Route.TransitionsExamples.route) { TransitionsExamplesPage() }
102 composable(Route.ViewPagerExample.route) { ViewPagerExamplePage() }
103 composable(Route.NetworkExamples.route) { NetworkExamplesPage() }
104 composable(Route.DynamicPropertiesExamples.route) { DynamicPropertiesExamplesPage() }
105 composable(Route.ImagesExamples.route) { ImagesExamplesPage() }
106 composable(Route.TextExamples.route) { TextExamplesPage() }
107 composable(Route.ContentScaleExamples.route) { ContentScaleExamplesPage() }
108 composable(Route.CachingExamples.route) { CachingExamplesPage() }
109 composable(
110 Route.Player.fullRoute,
111 arguments = Route.Player.args
112 ) { entry ->
113 val arguments = entry.arguments ?: error("No arguments provided to ${Route.Player}")
114 val spec = when {
115 arguments.getString("url") != null -> LottieCompositionSpec.Url(arguments.getBase64String("url"))
116 arguments.getString("file") != null -> LottieCompositionSpec.File(arguments.getBase64String("file"))
117 arguments.getString("asset") != null -> LottieCompositionSpec.Asset(arguments.getBase64String("asset"))
118 else -> error("You must specify a url, file, or asset")
119 }
120 val backgroundColor = when (arguments.getString("backgroundColor") != null) {
121 true -> arguments.getBase64String("backgroundColor").toColorSafe()
122 else -> null
123 }
124 PlayerPage(spec, backgroundColor)
125 }
126 }
127 }
128 }
129 }
130 }
131
132
133 private enum class BottomNavItemData(val route: Route, @DrawableRes val iconRes: Int, @StringRes val labelRes: Int) {
134 Showcase(Route.Showcase, R.drawable.ic_showcase, R.string.bottom_tab_showcase),
135 Preview(Route.Preview, R.drawable.ic_device, R.string.bottom_tab_preview),
136 LottieFiles(Route.LottieFiles, R.drawable.ic_lottie_files, R.string.bottom_tab_lottie_files),
137 Docs(Route.Examples, R.drawable.ic_examples, R.string.bottom_tab_examples),
138 }
139 }
140