Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature/add url support #3

Open
wants to merge 5 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -11,4 +11,5 @@ xcuserdata
*.gpg
*.pgp
*.psd
kotlins-js-store
kotlins-js-store
/iosApp/iosApp.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
56 changes: 42 additions & 14 deletions compottie/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -18,28 +18,31 @@ version = libs.versions.compottie.get()
val _jvmTarget = findProperty("jvmTarget") as String

kotlin {

applyDefaultHierarchyTemplate()

androidTarget{
androidTarget {
publishLibraryVariants("release")
compilations.all {
kotlinOptions {
jvmTarget = _jvmTarget
}
}
}

iosArm64()
iosX64()
iosSimulatorArm64()

wasmJs(){
@Suppress("OPT_IN_USAGE")
wasmJs {
browser()
}
js(IR){

js(IR) {
browser()
}
jvm("desktop"){

jvm("desktop") {
compilations.all {
kotlinOptions {
jvmTarget = _jvmTarget
Expand All @@ -50,30 +53,55 @@ kotlin {
macosArm64()
macosX64()


sourceSets {
commonMain.dependencies {
implementation(compose.foundation)
implementation(compose.animation)
}

val desktopMain by getting
val wasmJsMain by getting

androidMain.dependencies {
api(libs.lottie.android)
}

val desktopMain by getting
val wasmJsMain by getting
val iosX64Main by getting
val iosArm64Main by getting
val iosSimulatorArm64Main by getting

val skikoMain by creating {
dependsOn(commonMain.get())
desktopMain.dependsOn(this)
iosMain.get().dependsOn(this)
desktopMain.apply {
dependsOn(this@creating)
dependencies {
implementation(libs.ktor.client.cio)
}
}

iosX64Main.dependsOn(this)
iosArm64Main.dependsOn(this)
iosSimulatorArm64Main.dependsOn(this)
iosMain.apply {
dependsOn(this@creating)
dependencies {
implementation(libs.ktor.client.darwin)
}
}

macosMain.get().dependsOn(this)

jsMain.get().dependsOn(this)
wasmJsMain.dependsOn(this)
wasmJsMain.apply {
dependsOn(this@creating)
dependencies {
implementation(libs.ktor.client.core.wasm)
implementation(libs.ktor.serialization.kotlinx.json.wasm)
}
}

dependencies {
implementation(libs.serialization)
implementation(libs.ktor.client.core)
}
}
}
Expand Down Expand Up @@ -102,7 +130,7 @@ tasks.withType<AbstractPublishToMaven>().configureEach {
}

publishing {
if (System.getenv("OSSRH_PASSWORD")!=null) {
if (System.getenv("OSSRH_PASSWORD") != null) {

repositories {
maven {
Expand Down Expand Up @@ -160,4 +188,4 @@ if (System.getenv("GPG_KEY") != null) {
)
sign(publishing.publications)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,9 @@ actual sealed class LottieCompositionSpec(
PlatformLottieCompositionSpec.JsonString(jsonString)
)

actual class Url actual constructor(url: String) : LottieCompositionSpec(
PlatformLottieCompositionSpec.Url(url)
)

actual companion object {}
}

Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,11 @@ expect sealed class LottieCompositionSpec {
@Immutable
class JsonString(jsonString: String) : LottieCompositionSpec

/**
* Load an animation from a url.
*/
@Immutable
class Url(url: String) : LottieCompositionSpec

companion object
}

//internal expect fun LottieCompositionSpec.JsonString()


Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import androidx.compose.runtime.Stable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import io.github.alexzhirkevich.compottie.data.LottieRepository
import kotlinx.coroutines.CancellationException
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
Expand Down Expand Up @@ -58,6 +59,21 @@ actual fun rememberLottieComposition(spec : LottieCompositionSpec) : LottieCompo
}
}
}
is LottieCompositionSpec.Url -> {
withContext(Dispatchers.Default) {
try {
val jsonString = LottieRepository.getLottieData(spec.url)
val composition = parseFromJsonString(jsonString)
result.complete(composition)
} catch (c: CancellationException) {
println("Cancelled")
throw c
} catch (t: Throwable) {
println("Error: ${t.message}")
result.completeExceptionally(t)
}
}
}
else -> error("Invalid LottieCompositionSpec: $spec")
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,7 @@ actual sealed class LottieCompositionSpec {

other as JsonString

if (jsonString != other.jsonString) return false

return true
return jsonString == other.jsonString
}

override fun hashCode(): Int {
Expand All @@ -30,6 +28,27 @@ actual sealed class LottieCompositionSpec {

}

@Immutable
actual class Url actual constructor(
internal val url: String
) : LottieCompositionSpec() {
override fun equals(other: Any?): Boolean {
if (this === other) return true
if (other == null || this::class != other::class) return false

other as Url

return url == other.url
}

override fun hashCode(): Int {
return url.hashCode()
}

override fun toString(): String {
return "Url(url='$url')"
}
}

actual companion object
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package io.github.alexzhirkevich.compottie.data

import io.ktor.client.HttpClient
import io.ktor.client.plugins.cache.HttpCache

class HttpClientProvider {
fun provideHttpClient(): HttpClient = HttpClient {
install(HttpCache) // In-memory cache
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package io.github.alexzhirkevich.compottie.data

import io.ktor.client.request.get
import io.ktor.client.statement.bodyAsText

object LottieRepository {

private val httpClient = HttpClientProvider().provideHttpClient()

suspend fun getLottieData(url: String): String {
return httpClient.get(url).bodyAsText()
}
}
5 changes: 3 additions & 2 deletions example/androidapp/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -35,8 +35,9 @@ android {
}

dependencies {

implementation(project(":example:shared"))
implementation("androidx.core:core-ktx:1.12.0")
implementation("androidx.activity:activity-compose:1.8.0")
implementation("androidx.activity:activity-compose:1.8.2")
implementation(libs.junit)
implementation(libs.android.junit)
}
5 changes: 3 additions & 2 deletions example/androidapp/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">

<uses-permission android:name="android.permission.INTERNET" />

<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
Expand All @@ -19,5 +21,4 @@
</intent-filter>
</activity>
</application>

</manifest>
</manifest>
2 changes: 1 addition & 1 deletion example/androidapp/src/main/java/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -12,4 +12,4 @@ class MainActivity : ComponentActivity() {
App()
}
}
}
}
32 changes: 32 additions & 0 deletions example/composeApp/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
import org.jetbrains.compose.desktop.application.dsl.TargetFormat

plugins {
kotlin("multiplatform")
id("org.jetbrains.compose")
}

kotlin {
listOf(
iosX64(),
iosArm64(),
iosSimulatorArm64()
).forEach { iosTarget ->
iosTarget.binaries.framework {
baseName = "ComposeApp"
isStatic = true
}
}

sourceSets {

commonMain.dependencies {
implementation(compose.runtime)
implementation(compose.foundation)
implementation(compose.material)
implementation(compose.ui)
implementation(compose.components.resources)
implementation(compose.components.uiToolingPreview)
implementation(project(":example:shared"))
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="600dp"
android:height="600dp"
android:viewportWidth="600"
android:viewportHeight="600">
<path
android:pathData="M301.21,418.53C300.97,418.54 300.73,418.56 300.49,418.56C297.09,418.59 293.74,417.72 290.79,416.05L222.6,377.54C220.63,376.43 219,374.82 217.85,372.88C216.7,370.94 216.09,368.73 216.07,366.47L216.07,288.16C216.06,287.32 216.09,286.49 216.17,285.67C216.38,283.54 216.91,281.5 217.71,279.6L199.29,268.27L177.74,256.19C175.72,260.43 174.73,265.23 174.78,270.22L174.79,387.05C174.85,393.89 178.57,400.2 184.53,403.56L286.26,461.02C290.67,463.51 295.66,464.8 300.73,464.76C300.91,464.76 301.09,464.74 301.27,464.74C301.24,449.84 301.22,439.23 301.22,439.23L301.21,418.53Z"
android:fillColor="#041619"
android:fillType="nonZero"/>
<path
android:pathData="M409.45,242.91L312.64,188.23C303.64,183.15 292.58,183.26 283.68,188.51L187.92,245C183.31,247.73 179.93,251.62 177.75,256.17L177.74,256.19L199.29,268.27L217.71,279.6C217.83,279.32 217.92,279.02 218.05,278.74C218.24,278.36 218.43,277.98 218.64,277.62C219.06,276.88 219.52,276.18 220.04,275.51C221.37,273.8 223.01,272.35 224.87,271.25L289.06,233.39C290.42,232.59 291.87,231.96 293.39,231.51C295.53,230.87 297.77,230.6 300,230.72C302.98,230.88 305.88,231.73 308.47,233.2L373.37,269.85C375.54,271.08 377.49,272.68 379.13,274.57C379.68,275.19 380.18,275.85 380.65,276.53C380.86,276.84 381.05,277.15 381.24,277.47L397.79,266.39L420.34,252.93L420.31,252.88C417.55,248.8 413.77,245.35 409.45,242.91Z"
android:fillColor="#37BF6E"
android:fillType="nonZero"/>
<path
android:pathData="M381.24,277.47C381.51,277.92 381.77,278.38 382.01,278.84C382.21,279.24 382.39,279.65 382.57,280.06C382.91,280.88 383.19,281.73 383.41,282.59C383.74,283.88 383.92,285.21 383.93,286.57L383.93,361.1C383.96,363.95 383.35,366.77 382.16,369.36C381.93,369.86 381.69,370.35 381.42,370.83C379.75,373.79 377.32,376.27 374.39,378L310.2,415.87C307.47,417.48 304.38,418.39 301.21,418.53L301.22,439.23C301.22,439.23 301.24,449.84 301.27,464.74C306.1,464.61 310.91,463.3 315.21,460.75L410.98,404.25C419.88,399 425.31,389.37 425.22,379.03L425.22,267.85C425.17,262.48 423.34,257.34 420.34,252.93L397.79,266.39L381.24,277.47Z"
android:fillColor="#3870B2"
android:fillType="nonZero"/>
<path
android:pathData="M177.75,256.17C179.93,251.62 183.31,247.73 187.92,245L283.68,188.51C292.58,183.26 303.64,183.15 312.64,188.23L409.45,242.91C413.77,245.35 417.55,248.8 420.31,252.88L420.34,252.93L498.59,206.19C494.03,199.46 487.79,193.78 480.67,189.75L320.86,99.49C306.01,91.1 287.75,91.27 273.07,99.95L114.99,193.2C107.39,197.69 101.81,204.11 98.21,211.63L177.74,256.19L177.75,256.17ZM301.27,464.74C301.09,464.74 300.91,464.76 300.73,464.76C295.66,464.8 290.67,463.51 286.26,461.02L184.53,403.56C178.57,400.2 174.85,393.89 174.79,387.05L174.78,270.22C174.73,265.23 175.72,260.43 177.74,256.19L98.21,211.63C94.86,218.63 93.23,226.58 93.31,234.82L93.31,427.67C93.42,438.97 99.54,449.37 109.4,454.92L277.31,549.77C284.6,553.88 292.84,556.01 301.2,555.94L301.2,555.8C301.39,543.78 301.33,495.26 301.27,464.74Z"
android:strokeWidth="10"
android:fillColor="#00000000"
android:strokeColor="#083042"
android:fillType="nonZero"/>
<path
android:pathData="M498.59,206.19L420.34,252.93C423.34,257.34 425.17,262.48 425.22,267.85L425.22,379.03C425.31,389.37 419.88,399 410.98,404.25L315.21,460.75C310.91,463.3 306.1,464.61 301.27,464.74C301.33,495.26 301.39,543.78 301.2,555.8L301.2,555.94C309.48,555.87 317.74,553.68 325.11,549.32L483.18,456.06C497.87,447.39 506.85,431.49 506.69,414.43L506.69,230.91C506.6,222.02 503.57,213.5 498.59,206.19Z"
android:strokeWidth="10"
android:fillColor="#00000000"
android:strokeColor="#083042"
android:fillType="nonZero"/>
<path
android:pathData="M301.2,555.94C292.84,556.01 284.6,553.88 277.31,549.76L109.4,454.92C99.54,449.37 93.42,438.97 93.31,427.67L93.31,234.82C93.23,226.58 94.86,218.63 98.21,211.63C101.81,204.11 107.39,197.69 114.99,193.2L273.07,99.95C287.75,91.27 306.01,91.1 320.86,99.49L480.67,189.75C487.79,193.78 494.03,199.46 498.59,206.19C503.57,213.5 506.6,222.02 506.69,230.91L506.69,414.43C506.85,431.49 497.87,447.39 483.18,456.06L325.11,549.32C317.74,553.68 309.48,555.87 301.2,555.94Z"
android:strokeWidth="10"
android:fillColor="#00000000"
android:strokeColor="#083042"
android:fillType="nonZero"/>
</vector>
3 changes: 3 additions & 0 deletions example/composeApp/src/iosMain/kotlin/MainViewController.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
import androidx.compose.ui.window.ComposeUIViewController

fun MainViewController() = ComposeUIViewController { App() }
Loading