Migrated to navigation
diff --git a/build.gradle b/build.gradle index cb6383f..c4380b9 100644 --- a/build.gradle +++ b/build.gradle
@@ -2,7 +2,7 @@ buildscript { ext { - composeVersion = '1.0.0-alpha05' + composeVersion = '1.0.0-alpha06' kotlinVersion = '1.4.10' daggerVersion = '2.29.1' } @@ -16,7 +16,7 @@ } dependencies { classpath 'org.ajoberstar:grgit:1.9.3' - classpath 'com.android.tools.build:gradle:4.2.0-alpha14' + classpath 'com.android.tools.build:gradle:4.2.0-alpha15' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion" classpath "org.jetbrains.kotlin:kotlin-android-extensions:$kotlinVersion" classpath 'org.ajoberstar:grgit:1.9.3'
diff --git a/sample-compose/build.gradle b/sample-compose/build.gradle index 8a9b5d4..bcf8d44 100644 --- a/sample-compose/build.gradle +++ b/sample-compose/build.gradle
@@ -64,14 +64,15 @@ implementation "androidx.compose.material:material:$composeVersion" implementation "androidx.compose.material:material-icons-extended:$composeVersion" implementation "androidx.ui:ui-tooling:$composeVersion" + implementation "androidx.navigation:navigation-compose:1.0.0-alpha01" implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.3.0-beta01' implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.0-beta01' implementation "androidx.navigation:navigation-fragment-ktx:2.3.1" implementation "androidx.navigation:navigation-ui-ktx:2.3.1" - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.9' - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.9' + implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.0' + implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.4.0' implementation "com.google.dagger:dagger:$daggerVersion" kapt "com.google.dagger:dagger-compiler:$daggerVersion" @@ -82,7 +83,7 @@ implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation 'com.squareup.retrofit2:converter-moshi:2.9.0' implementation "dev.chrisbanes.accompanist:accompanist-coil:0.3.1" - implementation 'com.airbnb.android:mvrx:2.0.0-beta1' + implementation 'com.airbnb.android:mvrx:2.0.0-beta2' testImplementation 'junit:junit:4.13.1' androidTestImplementation 'androidx.test.ext:junit:1.1.2'
diff --git a/sample-compose/src/main/java/com/airbnb/lottie/sample/compose/ComposeActivity.kt b/sample-compose/src/main/java/com/airbnb/lottie/sample/compose/ComposeActivity.kt index cc5005a..543c0c7 100644 --- a/sample-compose/src/main/java/com/airbnb/lottie/sample/compose/ComposeActivity.kt +++ b/sample-compose/src/main/java/com/airbnb/lottie/sample/compose/ComposeActivity.kt
@@ -1,5 +1,124 @@ package com.airbnb.lottie.sample.compose +import android.os.Bundle +import androidx.activity.ComponentActivity +import androidx.annotation.DrawableRes +import androidx.annotation.StringRes import androidx.appcompat.app.AppCompatActivity +import androidx.compose.foundation.Text +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.padding +import androidx.compose.material.BottomNavigation +import androidx.compose.material.BottomNavigationItem +import androidx.compose.material.Icon +import androidx.compose.material.Scaffold +import androidx.compose.runtime.Composable +import androidx.compose.runtime.Providers +import androidx.compose.runtime.getValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.platform.ContextAmbient +import androidx.compose.ui.platform.setContent +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.res.vectorResource +import androidx.compose.ui.unit.dp +import androidx.navigation.compose.KEY_ROUTE +import androidx.navigation.compose.NavHost +import androidx.navigation.compose.composable +import androidx.navigation.compose.currentBackStackEntryAsState +import androidx.navigation.compose.navigate +import androidx.navigation.compose.rememberNavController +import com.airbnb.lottie.compose.LottieAnimationSpec +import com.airbnb.lottie.sample.compose.lottiefiles.LottieFilesPage +import com.airbnb.lottie.sample.compose.player.PlayerPage +import com.airbnb.lottie.sample.compose.preview.PreviewPage +import com.airbnb.lottie.sample.compose.showcase.ShowcasePage +import com.airbnb.lottie.sample.compose.ui.LottieTheme +import com.airbnb.lottie.sample.compose.ui.Teal +import com.airbnb.lottie.sample.compose.ui.toColorSafe +import com.airbnb.lottie.sample.compose.utils.NavControllerAmbient +import com.airbnb.lottie.sample.compose.utils.getBase64String -class ComposeActivity : AppCompatActivity(R.layout.main_activity) \ No newline at end of file +class ComposeActivity : AppCompatActivity() { + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContent { + LottieScaffold() + } + } + + @Composable + private fun LottieScaffold() { + val navController = rememberNavController() + + Providers( + NavControllerAmbient provides navController, + BackPressedDispatcherAmbient provides (ContextAmbient.current as ComponentActivity).onBackPressedDispatcher + ) { + LottieTheme { + Scaffold( + bottomBar = { + BottomNavigation( + backgroundColor = Color(0xFFF7F7F7), + elevation = 8.dp, + contentColor = Teal, + ) { + val navBackStackEntry by navController.currentBackStackEntryAsState() + val currentRoute = navBackStackEntry?.arguments?.getString(KEY_ROUTE) + + BottomNavItemData.values().forEach { item -> + BottomNavigationItem( + icon = { Icon(vectorResource(item.iconRes)) }, + label = { Text(stringResource(item.labelRes)) }, + selected = currentRoute == item.route.route, + onClick = { + if (currentRoute != item.route.route) { + navController.navigate(item.route.route) + } + }, + ) + } + } + } + ) { innerPadding -> + Box( + modifier = Modifier.padding(innerPadding) + ) { + NavHost(navController, startDestination = Route.Showcase.route) { + composable(Route.Showcase.route, arguments = Route.Showcase.args) { ShowcasePage() } + composable(Route.Preview.route, arguments = Route.Preview.args) { PreviewPage() } + composable(Route.LottieFiles.route, arguments = Route.LottieFiles.args) { LottieFilesPage() } + composable(Route.Learn.route, arguments = Route.Learn.args) { ShowcasePage() } + composable( + Route.Player.fullRoute, + arguments = Route.Player.args + ) { entry -> + val arguments = entry.arguments ?: error("No arguments provided to ${Route.Player}") + val spec = when { + arguments.containsKey("url") -> LottieAnimationSpec.Url(arguments.getBase64String("url") ?: error("url must be a string")) + arguments.containsKey("file") -> LottieAnimationSpec.File(arguments.getBase64String("file") ?: error("file must be a string")) + arguments.containsKey("asset") -> LottieAnimationSpec.Asset(arguments.getBase64String("asset") ?: error("asset must be a string")) + else -> error("You must specify a url, file, or asset") + } + val backgroundColor = when (arguments.containsKey("backgroundColor")) { + true -> arguments.getBase64String("backgroundColor").toColorSafe() + else -> null + } + PlayerPage(spec, backgroundColor) + } + } + } + } + } + } + } + + + private enum class BottomNavItemData(val route: Route, @StringRes val iconRes: Int, @DrawableRes val labelRes: Int) { + Showcase(Route.Showcase, R.drawable.ic_showcase, R.string.bottom_tab_showcase), + Preview(Route.Preview, R.drawable.ic_device, R.string.bottom_tab_preview), + LottieFiles(Route.LottieFiles, R.drawable.ic_lottie_files, R.string.bottom_tab_lottie_files), + Learn(Route.Learn, R.drawable.ic_learn, R.string.bottom_tab_lottie_files), + } +} \ No newline at end of file
diff --git a/sample-compose/src/main/java/com/airbnb/lottie/sample/compose/ComposeFragment.kt b/sample-compose/src/main/java/com/airbnb/lottie/sample/compose/ComposeFragment.kt deleted file mode 100644 index 4b19afc..0000000 --- a/sample-compose/src/main/java/com/airbnb/lottie/sample/compose/ComposeFragment.kt +++ /dev/null
@@ -1,113 +0,0 @@ -package com.airbnb.lottie.sample.compose - -import android.os.Bundle -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import androidx.activity.ComponentActivity -import androidx.annotation.DrawableRes -import androidx.annotation.StringRes -import androidx.compose.foundation.Icon -import androidx.compose.foundation.Text -import androidx.compose.foundation.clickable -import androidx.compose.foundation.layout.* -import androidx.compose.material.BottomAppBar -import androidx.compose.material.Scaffold -import androidx.compose.material.ripple.RippleIndication -import androidx.compose.runtime.Composable -import androidx.compose.runtime.Providers -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.platform.ComposeView -import androidx.compose.ui.platform.ContextAmbient -import androidx.compose.ui.res.stringResource -import androidx.compose.ui.res.vectorResource -import androidx.compose.ui.text.TextStyle -import androidx.compose.ui.unit.dp -import androidx.compose.ui.unit.sp -import androidx.fragment.app.Fragment -import androidx.navigation.fragment.findNavController -import com.airbnb.lottie.sample.compose.player.PlayerFragment -import com.airbnb.lottie.sample.compose.ui.LottieTheme -import com.airbnb.lottie.sample.compose.ui.Teal -import com.airbnb.lottie.sample.compose.utils.NavControllerAmbient -import com.airbnb.mvrx.asMavericksArgs - -abstract class ComposeFragment : Fragment() { - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { - return ComposeView(requireContext()).apply { - setContent { - Providers( - NavControllerAmbient provides findNavController(), - BackPressedDispatcherAmbient provides (ContextAmbient.current as ComponentActivity).onBackPressedDispatcher - ) { - LottieTheme { - Scaffold( - bottomBar = { - BottomAppBar( - backgroundColor = Color(0xFFF7F7F7), - elevation = 8.dp, - contentColor = Teal, - ) { - Row( - horizontalArrangement = Arrangement.SpaceAround, - modifier = Modifier.fillMaxWidth() - ) { - BottomBarButton(R.drawable.ic_showcase, R.string.bottom_tab_showcase) { - findNavController().navigate(R.id.showcase) - } - - BottomBarButton(R.drawable.ic_lottie_files, R.string.bottom_tab_lottie_files) { - findNavController().navigate(R.id.lottie_files) - } - BottomBarButton(R.drawable.ic_device, R.string.bottom_tab_preview) { - // DO NOT SUBMIT - val args = PlayerFragment.Args.Url("https://assets4.lottiefiles.com/private_files/lf30_8xbh8fop.json") - findNavController().navigate(R.id.player, args.asMavericksArgs()) -// findNavController().navigate(R.id.preview) - } - BottomBarButton(R.drawable.ic_learn, R.string.bottom_tab_learn) { - } - } - } - } - ) { innerPadding -> - Box( - modifier = Modifier.padding(innerPadding) - ) { - root() - } - } - } - } - } - } - } - - @Composable - abstract fun root() - - - @Composable - private fun BottomBarButton(@DrawableRes iconRes: Int, @StringRes labelRes: Int, onClick: () -> Unit) { - Column( - modifier = Modifier - .clickable( - onClick = onClick, - indication = RippleIndication(bounded = false) - ) - .padding(6.dp) - ) { - Icon( - vectorResource(iconRes), - modifier = Modifier - .align(Alignment.CenterHorizontally) - ) - Text( - stringResource(labelRes), - style = TextStyle(fontSize = 12.sp) - ) - } - } -}
diff --git a/sample-compose/src/main/java/com/airbnb/lottie/sample/compose/Route.kt b/sample-compose/src/main/java/com/airbnb/lottie/sample/compose/Route.kt new file mode 100644 index 0000000..96bab82 --- /dev/null +++ b/sample-compose/src/main/java/com/airbnb/lottie/sample/compose/Route.kt
@@ -0,0 +1,51 @@ +package com.airbnb.lottie.sample.compose + +import android.util.Base64 +import androidx.navigation.compose.NamedNavArgument +import androidx.navigation.compose.navArgument +import java.net.URLEncoder + +sealed class Route(val route: String, val args: List<NamedNavArgument> = emptyList()) { + object Showcase : Route("showcase") + + object Preview : Route("preview") + + object LottieFiles : Route("lottiefiles") + + object Learn : Route("learn") + + object Player : Route( + "player", + listOf( + navArgument("url") { + androidx.navigation.NavType.StringType + nullable = true + }, + navArgument("file") { + androidx.navigation.NavType.StringType + nullable = true + }, + navArgument("asset") { + androidx.navigation.NavType.StringType + nullable = true + }, + navArgument("backgroundColor") { + androidx.navigation.NavType.StringType + nullable = true + }, + ) + ) { + val fullRoute = "$route?url={url}&file={file}&asset={asset}&backgroundColor={backgroundColor}" + + fun forUrl(url: String, backgroundColor: String?) = when (backgroundColor) { + null -> "${route}?url=${url.toBase64()}" + else -> "${route}?url=${url.toBase64()}&backgroundColor=${backgroundColor.toBase64()}" + } + + fun forFile(file: String) = "${route}?file=$file" + + fun forAsset(asset: String) = "${route}?asset=$asset" + } +} + +private fun String.toBase64() = Base64.encodeToString(toByteArray(), Base64.NO_PADDING or Base64.NO_WRAP or Base64.URL_SAFE) \ No newline at end of file
diff --git a/sample-compose/src/main/java/com/airbnb/lottie/sample/compose/composables/AnimationRow.kt b/sample-compose/src/main/java/com/airbnb/lottie/sample/compose/composables/AnimationRow.kt index 86027d9..34ed88d 100644 --- a/sample-compose/src/main/java/com/airbnb/lottie/sample/compose/composables/AnimationRow.kt +++ b/sample-compose/src/main/java/com/airbnb/lottie/sample/compose/composables/AnimationRow.kt
@@ -15,6 +15,7 @@ import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp +import com.airbnb.lottie.sample.compose.utils.drawTopBorder import dev.chrisbanes.accompanist.coil.CoilImage @Composable @@ -25,7 +26,8 @@ onClick: () -> Unit ) { Surface( - modifier = Modifier.clickable(onClick = onClick) + modifier = Modifier + .clickable(onClick = onClick) ) { Row( verticalAlignment = Alignment.CenterVertically,
diff --git a/sample-compose/src/main/java/com/airbnb/lottie/sample/compose/lottiefiles/LottieFilesPage.kt b/sample-compose/src/main/java/com/airbnb/lottie/sample/compose/lottiefiles/LottieFilesPage.kt index 6545d54..f6faeb1 100644 --- a/sample-compose/src/main/java/com/airbnb/lottie/sample/compose/lottiefiles/LottieFilesPage.kt +++ b/sample-compose/src/main/java/com/airbnb/lottie/sample/compose/lottiefiles/LottieFilesPage.kt
@@ -15,18 +15,9 @@ import androidx.compose.ui.platform.DensityAmbient import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp -import com.airbnb.lottie.sample.compose.ComposeFragment import com.airbnb.lottie.sample.compose.R import com.airbnb.lottie.sample.compose.composables.Marquee -class LottieFilesFragment : ComposeFragment() { - - @Composable - override fun root() { - LottieFilesPage() - } -} - enum class LottieFilesTab(@StringRes val stringRes: Int) { Recent(R.string.tab_recent), Popular(R.string.tab_popular),
diff --git a/sample-compose/src/main/java/com/airbnb/lottie/sample/compose/lottiefiles/LottieFilesRecentsAndPopularPage.kt b/sample-compose/src/main/java/com/airbnb/lottie/sample/compose/lottiefiles/LottieFilesRecentsAndPopularPage.kt index 1630121..e0c223b 100644 --- a/sample-compose/src/main/java/com/airbnb/lottie/sample/compose/lottiefiles/LottieFilesRecentsAndPopularPage.kt +++ b/sample-compose/src/main/java/com/airbnb/lottie/sample/compose/lottiefiles/LottieFilesRecentsAndPopularPage.kt
@@ -1,12 +1,12 @@ package com.airbnb.lottie.sample.compose.lottiefiles import android.util.Log -import androidx.compose.foundation.Icon import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.LazyColumnForIndexed import androidx.compose.material.FloatingActionButton +import androidx.compose.material.Icon import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Repeat import androidx.compose.runtime.Composable @@ -16,18 +16,17 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.unit.dp -import com.airbnb.lottie.sample.compose.R +import androidx.navigation.compose.navigate +import com.airbnb.lottie.sample.compose.Route import com.airbnb.lottie.sample.compose.api.AnimationDataV2 import com.airbnb.lottie.sample.compose.api.LottieFilesApi import com.airbnb.lottie.sample.compose.composables.AnimationRow import com.airbnb.lottie.sample.compose.dagger.AssistedViewModelFactory import com.airbnb.lottie.sample.compose.dagger.DaggerMvRxViewModelFactory -import com.airbnb.lottie.sample.compose.player.PlayerFragment import com.airbnb.lottie.sample.compose.utils.findNavController import com.airbnb.lottie.sample.compose.utils.mavericksViewModelAndState import com.airbnb.mvrx.MavericksState import com.airbnb.mvrx.MavericksViewModel -import com.airbnb.mvrx.asMavericksArgs import com.squareup.inject.assisted.Assisted import com.squareup.inject.assisted.AssistedInject import kotlinx.coroutines.Dispatchers @@ -108,9 +107,7 @@ state, viewModel::fetchNextPage, onAnimationClicked = { data -> - Log.d("Gabe", data.file) - val args = PlayerFragment.Args.Url(data.file, backgroundColorStr = data.bg_color) - navController.navigate(R.id.player, args.asMavericksArgs()) + navController.navigate(Route.Player.forUrl(data.file, backgroundColor = data.bg_color)) } ) }
diff --git a/sample-compose/src/main/java/com/airbnb/lottie/sample/compose/lottiefiles/LottieFilesSearchPage.kt b/sample-compose/src/main/java/com/airbnb/lottie/sample/compose/lottiefiles/LottieFilesSearchPage.kt index 68b55a1..f0ca565 100644 --- a/sample-compose/src/main/java/com/airbnb/lottie/sample/compose/lottiefiles/LottieFilesSearchPage.kt +++ b/sample-compose/src/main/java/com/airbnb/lottie/sample/compose/lottiefiles/LottieFilesSearchPage.kt
@@ -1,34 +1,36 @@ package com.airbnb.lottie.sample.compose.lottiefiles import android.util.Log -import androidx.compose.foundation.Icon import androidx.compose.foundation.Text -import androidx.compose.foundation.layout.* -import androidx.compose.foundation.lazy.LazyColumnFor +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.LazyColumnForIndexed import androidx.compose.material.FloatingActionButton +import androidx.compose.material.Icon import androidx.compose.material.Surface import androidx.compose.material.TextField import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Repeat -import androidx.compose.runtime.* +import androidx.compose.runtime.Composable +import androidx.compose.runtime.onActive import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.unit.dp +import androidx.navigation.compose.navigate import androidx.ui.tooling.preview.Preview -import com.airbnb.lottie.sample.compose.R +import com.airbnb.lottie.sample.compose.Route import com.airbnb.lottie.sample.compose.api.AnimationDataV2 import com.airbnb.lottie.sample.compose.api.LottieFilesApi import com.airbnb.lottie.sample.compose.composables.AnimationRow import com.airbnb.lottie.sample.compose.dagger.AssistedViewModelFactory import com.airbnb.lottie.sample.compose.dagger.DaggerMvRxViewModelFactory -import com.airbnb.lottie.sample.compose.player.PlayerFragment import com.airbnb.lottie.sample.compose.utils.findNavController import com.airbnb.lottie.sample.compose.utils.mavericksViewModelAndState import com.airbnb.mvrx.MavericksState import com.airbnb.mvrx.MavericksViewModel -import com.airbnb.mvrx.asMavericksArgs import com.squareup.inject.assisted.Assisted import com.squareup.inject.assisted.AssistedInject import kotlinx.coroutines.Dispatchers @@ -115,8 +117,7 @@ viewModel::setQuery, viewModel::fetchNextPage, onAnimationClicked = { data -> - val args = PlayerFragment.Args.Url(data.file, backgroundColorStr = data.bg_color) - navController.navigate(R.id.player, args.asMavericksArgs()) + navController.navigate(Route.Player.forUrl(data.file, backgroundColor = data.bg_color)) } ) }
diff --git a/sample-compose/src/main/java/com/airbnb/lottie/sample/compose/player/PlayerPage.kt b/sample-compose/src/main/java/com/airbnb/lottie/sample/compose/player/PlayerPage.kt index 27bfc84..2246bfb 100644 --- a/sample-compose/src/main/java/com/airbnb/lottie/sample/compose/player/PlayerPage.kt +++ b/sample-compose/src/main/java/com/airbnb/lottie/sample/compose/player/PlayerPage.kt
@@ -1,21 +1,46 @@ package com.airbnb.lottie.sample.compose.player -import android.os.Parcelable import androidx.activity.OnBackPressedDispatcher -import androidx.compose.foundation.Icon import androidx.compose.foundation.ScrollableColumn import androidx.compose.foundation.ScrollableRow import androidx.compose.foundation.Text import androidx.compose.foundation.background import androidx.compose.foundation.border import androidx.compose.foundation.clickable -import androidx.compose.foundation.layout.* +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxHeight +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.heightIn +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.preferredSize +import androidx.compose.foundation.layout.preferredWidth import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.RoundedCornerShape -import androidx.compose.material.* +import androidx.compose.material.Icon +import androidx.compose.material.IconButton +import androidx.compose.material.Scaffold +import androidx.compose.material.Surface +import androidx.compose.material.TopAppBar import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.* -import androidx.compose.runtime.* +import androidx.compose.material.icons.filled.Close +import androidx.compose.material.icons.filled.Pause +import androidx.compose.material.icons.filled.PlayArrow +import androidx.compose.material.icons.filled.RemoveRedEye +import androidx.compose.material.icons.filled.Repeat +import androidx.compose.material.rememberScaffoldState +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedTask +import androidx.compose.runtime.MutableState +import androidx.compose.runtime.Providers +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip @@ -29,56 +54,26 @@ import androidx.compose.ui.window.Dialog import androidx.ui.tooling.preview.Preview import com.airbnb.lottie.LottieComposition -import com.airbnb.lottie.compose.* +import com.airbnb.lottie.compose.LottieAnimation +import com.airbnb.lottie.compose.LottieAnimationSpec +import com.airbnb.lottie.compose.LottieAnimationState +import com.airbnb.lottie.compose.LottieCompositionResult +import com.airbnb.lottie.compose.rememberLottieAnimationState +import com.airbnb.lottie.compose.rememberLottieComposition import com.airbnb.lottie.sample.compose.BackPressedDispatcherAmbient -import com.airbnb.lottie.sample.compose.ComposeFragment import com.airbnb.lottie.sample.compose.R import com.airbnb.lottie.sample.compose.composables.DebouncedCircularProgressIndicator import com.airbnb.lottie.sample.compose.composables.SeekBar import com.airbnb.lottie.sample.compose.ui.Teal -import com.airbnb.lottie.sample.compose.ui.toColorSafe import com.airbnb.lottie.sample.compose.utils.drawTopBorder import com.airbnb.lottie.sample.compose.utils.maybeBackground import com.airbnb.lottie.sample.compose.utils.maybeDrawBorder import com.airbnb.lottie.sample.compose.utils.quantityStringResource -import com.airbnb.mvrx.args -import kotlinx.android.parcel.Parcelize import kotlin.math.ceil import kotlin.math.roundToInt -class PlayerFragment : ComposeFragment() { - private val args: Args by args() - - @Composable - override fun root() { - val spec = when (val a = args) { - is Args.Url -> LottieAnimationSpec.Url(a.url) - is Args.File -> LottieAnimationSpec.File(a.fileName) - is Args.Asset -> LottieAnimationSpec.Asset(a.assetName) - } - val backgroundColor = when (val a = args) { - is Args.Url -> a.backgroundColorStr?.toColorSafe() - else -> null - } - - PlayerPage(spec, backgroundColor) - } - - sealed class Args : Parcelable { - /** colorStr is the value from the LottieFiles API. */ - @Parcelize - class Url(val url: String, val backgroundColorStr: String? = null) : Args() - - @Parcelize - class File(val fileName: String) : Args() - - @Parcelize - class Asset(val assetName: String) : Args() - } -} - @Composable -private fun PlayerPage( +fun PlayerPage( spec: LottieAnimationSpec, animationBackgroundColor: Color? = null, ) {
diff --git a/sample-compose/src/main/java/com/airbnb/lottie/sample/compose/preview/PreviewPage.kt b/sample-compose/src/main/java/com/airbnb/lottie/sample/compose/preview/PreviewPage.kt index 2001563..6b4e27f 100644 --- a/sample-compose/src/main/java/com/airbnb/lottie/sample/compose/preview/PreviewPage.kt +++ b/sample-compose/src/main/java/com/airbnb/lottie/sample/compose/preview/PreviewPage.kt
@@ -2,15 +2,24 @@ import androidx.annotation.DrawableRes import androidx.annotation.StringRes -import androidx.compose.foundation.Icon import androidx.compose.foundation.Text import androidx.compose.foundation.background import androidx.compose.foundation.clickable -import androidx.compose.foundation.layout.* +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.preferredHeight import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.Divider +import androidx.compose.material.Icon import androidx.compose.material.Surface -import androidx.compose.runtime.* +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color @@ -20,20 +29,12 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.window.Dialog import androidx.ui.tooling.preview.Preview -import com.airbnb.lottie.sample.compose.ComposeFragment import com.airbnb.lottie.sample.compose.R +import com.airbnb.lottie.sample.compose.Route import com.airbnb.lottie.sample.compose.composables.Marquee -import com.airbnb.lottie.sample.compose.player.PlayerFragment import com.airbnb.lottie.sample.compose.ui.LottieTheme import com.airbnb.lottie.sample.compose.utils.findNavController -import com.airbnb.mvrx.asMavericksArgs - -class PreviewFragment : ComposeFragment() { - @Composable - override fun root() { - PreviewPage() - } -} +import androidx.navigation.compose.navigate @Composable fun PreviewPage() { @@ -60,8 +61,7 @@ showingAssetsDialog, onDismiss = { showingAssetsDialog = false }, onAssetSelected = { assetName -> - val args = PlayerFragment.Args.Asset(assetName) - navController.navigate(R.id.player, args.asMavericksArgs()) + navController.navigate(Route.Player.forAsset(assetName)) } ) } @@ -108,9 +108,13 @@ ?: emptyList() Dialog(onDismissRequest = onDismiss) { Surface( - shape = RoundedCornerShape(4.dp) + shape = RoundedCornerShape(4.dp), + ) { - Column { + Column( + modifier = Modifier + .padding(horizontal = 12.dp) + ) { assets.forEach { asset -> AssetRow(asset, onClick = { onDismiss()
diff --git a/sample-compose/src/main/java/com/airbnb/lottie/sample/compose/showcase/ShowcasePage.kt b/sample-compose/src/main/java/com/airbnb/lottie/sample/compose/showcase/ShowcasePage.kt index 35c7cd2..e0ea77f 100644 --- a/sample-compose/src/main/java/com/airbnb/lottie/sample/compose/showcase/ShowcasePage.kt +++ b/sample-compose/src/main/java/com/airbnb/lottie/sample/compose/showcase/ShowcasePage.kt
@@ -9,27 +9,17 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color +import androidx.navigation.compose.navigate import androidx.ui.tooling.preview.Preview -import com.airbnb.lottie.sample.compose.ComposeFragment -import com.airbnb.lottie.sample.compose.R +import com.airbnb.lottie.sample.compose.Route import com.airbnb.lottie.sample.compose.composables.AnimationRow import com.airbnb.lottie.sample.compose.composables.Loader import com.airbnb.lottie.sample.compose.composables.Marquee -import com.airbnb.lottie.sample.compose.player.PlayerFragment import com.airbnb.lottie.sample.compose.ui.LottieTheme import com.airbnb.lottie.sample.compose.utils.findNavController import com.airbnb.lottie.sample.compose.utils.mavericksViewModelAndState import com.airbnb.mvrx.Loading import com.airbnb.mvrx.Uninitialized -import com.airbnb.mvrx.asMavericksArgs - -class ShowcaseFragment : ComposeFragment() { - @Composable - override fun root() { - ShowcasePage() - } -} - @Composable fun ShowcasePage() { @@ -50,8 +40,7 @@ previewUrl = data.preview_url ?: "", previewBackgroundColor = data.bgColor, ) { - val args = PlayerFragment.Args.Url(data.file, backgroundColorStr = data.bg_color) - navController.navigate(R.id.player, args.asMavericksArgs()) + navController.navigate(Route.Player.forUrl(data.file, backgroundColor = data.bg_color)) } Divider(color = Color.LightGray) }
diff --git a/sample-compose/src/main/java/com/airbnb/lottie/sample/compose/utils/ComposeExtensions.kt b/sample-compose/src/main/java/com/airbnb/lottie/sample/compose/utils/ComposeExtensions.kt index 0779495..94947c9 100644 --- a/sample-compose/src/main/java/com/airbnb/lottie/sample/compose/utils/ComposeExtensions.kt +++ b/sample-compose/src/main/java/com/airbnb/lottie/sample/compose/utils/ComposeExtensions.kt
@@ -41,4 +41,3 @@ this } } -
diff --git a/sample-compose/src/main/java/com/airbnb/lottie/sample/compose/utils/NavigationExtensions.kt b/sample-compose/src/main/java/com/airbnb/lottie/sample/compose/utils/NavigationExtensions.kt index 3c4dbcc..e9ef66c 100644 --- a/sample-compose/src/main/java/com/airbnb/lottie/sample/compose/utils/NavigationExtensions.kt +++ b/sample-compose/src/main/java/com/airbnb/lottie/sample/compose/utils/NavigationExtensions.kt
@@ -1,10 +1,16 @@ package com.airbnb.lottie.sample.compose.utils +import android.os.Bundle +import android.util.Base64 import androidx.compose.runtime.Composable import androidx.compose.runtime.staticAmbientOf import androidx.navigation.NavController +import java.nio.charset.Charset +import java.nio.charset.StandardCharsets val NavControllerAmbient = staticAmbientOf<NavController> { error("You must specify a NavController.") } @Composable fun findNavController() = NavControllerAmbient.current + +fun Bundle.getBase64String(key: String) = String(Base64.decode(getString(key), Base64.DEFAULT), StandardCharsets.UTF_8)
diff --git a/sample-compose/src/main/res/layout/main_activity.xml b/sample-compose/src/main/res/layout/main_activity.xml deleted file mode 100644 index 2fe4bdd..0000000 --- a/sample-compose/src/main/res/layout/main_activity.xml +++ /dev/null
@@ -1,14 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" - android:layout_width="match_parent" - android:layout_height="match_parent"> - - <androidx.fragment.app.FragmentContainerView - android:id="@+id/nav_host_fragment" - android:name="androidx.navigation.fragment.NavHostFragment" - android:layout_width="match_parent" - android:layout_height="match_parent" - app:defaultNavHost="true" - app:navGraph="@navigation/nav_graph" /> -</FrameLayout> \ No newline at end of file
diff --git a/sample-compose/src/main/res/navigation/nav_graph.xml b/sample-compose/src/main/res/navigation/nav_graph.xml deleted file mode 100644 index 0160016..0000000 --- a/sample-compose/src/main/res/navigation/nav_graph.xml +++ /dev/null
@@ -1,22 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<navigation xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" - android:id="@+id/nav_graph" - app:startDestination="@id/showcase"> - <fragment - android:id="@+id/player" - android:name="com.airbnb.lottie.sample.compose.player.PlayerFragment" /> - - <fragment - android:id="@+id/showcase" - android:name="com.airbnb.lottie.sample.compose.showcase.ShowcaseFragment" /> - - <fragment - android:id="@+id/lottie_files" - android:name="com.airbnb.lottie.sample.compose.lottiefiles.LottieFilesFragment" /> - - <fragment - android:id="@+id/preview" - android:name="com.airbnb.lottie.sample.compose.preview.PreviewFragment" /> - -</navigation> \ No newline at end of file