• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download

<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