Skip to content

Commit ba101c7

Browse files
committed
Add Coil GIF support and update images
1 parent 12c6035 commit ba101c7

12 files changed

Lines changed: 265 additions & 1 deletion

File tree

292 KB
Loading

.github/assets/profile_bottom.png

231 KB
Loading

.github/assets/profile_top.png

1.8 MB
Loading

.github/assets/settings.png

87.6 KB
Loading

.github/assets/timeline.png

280 KB
Loading

README.md

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,23 @@ An attempt to make a Mastodon client that is multiplatform (iOS and Android)
44
and supports extensions brought by Mastodon API compatible software
55
like Iceshrimp.NET.
66

7-
Uses Material 3 for UI and icons.
7+
Uses Material 3 (supporting dynamic color schemes) for UI and icons.
8+
9+
## Screenshots
10+
11+
<img src=".github/assets/timeline.png" height="250px">
12+
<img src=".github/assets/settings.png" height="250px">
13+
<img src=".github/assets/account_switcher.png" height="250px">
14+
<img src=".github/assets/profile_top.png" height="250px">
15+
<img src=".github/assets/profile_bottom.png" height="250px">
16+
17+
## Contributing
18+
19+
You can see instructions and helpful tips on contributing in `./CONTRIBUTING.md`.
20+
Pull requests are welcome!
21+
22+
## Acknowledgments
23+
24+
[outadoc modified](https://github.com/coil-kt/coil/issues/2347#issuecomment-2408047810) a
25+
[multiplatform decoder written by colinrtwhite](https://github.com/coil-kt/coil/issues/2347#issuecomment-2392764750) which
26+
Snowdrop uses to handle GIFs on iOS. This code is used in `shared/src/iosMain/kotlin/site/remlit/snowdrop/util/config/MediaDecoders.ios.kt`.

gradle/libs.versions.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ ktor = "3.5.0"
2222
androidx-navigation-compose = { module = "org.jetbrains.androidx.navigation:navigation-compose", version.ref = "navigationCompose" }
2323
androidx-startup-runtime = { module = "androidx.startup:startup-runtime", version.ref = "startupRuntime" }
2424
coil-compose = { module = "io.coil-kt.coil3:coil-compose", version.ref = "coil" }
25+
coil-gif = { module = "io.coil-kt.coil3:coil-gif", version.ref = "coil" }
2526
coil-network-ktor3 = { module = "io.coil-kt.coil3:coil-network-ktor3", version.ref = "coil" }
2627
htmlconverter = { module = "be.digitalia.compose.htmlconverter:htmlconverter", version.ref = "htmlconverter" }
2728
kermit = { module = "co.touchlab:kermit", version.ref = "kermit" }

shared/build.gradle.kts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,8 @@ kotlin {
4242

4343
implementation(libs.ktor.client.okhttp)
4444
implementation(libs.kotlinx.coroutines.android)
45+
46+
implementation(libs.coil.gif)
4547
}
4648
iosMain.dependencies {
4749
implementation(libs.ktor.client.darwin)
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package site.remlit.snowdrop.util.config
2+
3+
import android.os.Build.VERSION.SDK_INT
4+
import coil3.decode.Decoder
5+
import coil3.gif.AnimatedImageDecoder
6+
import coil3.gif.GifDecoder
7+
8+
actual fun getGifDecoder(): Decoder.Factory =
9+
if (SDK_INT >= 28) AnimatedImageDecoder.Factory()
10+
else GifDecoder.Factory()

shared/src/commonMain/kotlin/site/remlit/snowdrop/App.kt

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,12 @@ import androidx.navigation.compose.currentBackStackEntryAsState
6262
import androidx.navigation.compose.rememberNavController
6363
import androidx.navigation.toRoute
6464
import co.touchlab.kermit.Logger
65+
import coil3.ImageLoader
6566
import coil3.compose.AsyncImage
67+
import coil3.compose.setSingletonImageLoaderFactory
68+
import coil3.decode.Decoder
69+
import coil3.disk.DiskCache
70+
import coil3.request.crossfade
6671
import com.russhwolf.settings.ExperimentalSettingsApi
6772
import io.ktor.http.Url
6873
import kotlinx.coroutines.delay
@@ -83,6 +88,7 @@ import site.remlit.snowdrop.util.scrollingUpward
8388
import site.remlit.snowdrop.util.settings
8489
import site.remlit.snowdrop.util.setupAppSettings
8590
import site.remlit.snowdrop.util.cache.setupCache
91+
import site.remlit.snowdrop.util.config.getGifDecoder
8692
import site.remlit.snowdrop.util.getAccountObjectFlow
8793
import site.remlit.snowdrop.util.getAccounts
8894
import site.remlit.snowdrop.util.getCurrentAccountId
@@ -105,6 +111,7 @@ import snowdrop.shared.generated.resources.icon_home_24px
105111
import snowdrop.shared.generated.resources.icon_home_filled_24px
106112
import snowdrop.shared.generated.resources.icon_notifications_24px
107113
import snowdrop.shared.generated.resources.icon_notifications_filled_24px
114+
import kotlin.reflect.KClass
108115
import kotlin.time.Duration.Companion.milliseconds
109116

110117

@@ -159,6 +166,15 @@ fun App() = safe {
159166
setupAppSettings()
160167
setupCache()
161168

169+
setSingletonImageLoaderFactory { context ->
170+
ImageLoader.Builder(context)
171+
.components {
172+
add(getGifDecoder())
173+
}
174+
.crossfade(100)
175+
.build()
176+
}
177+
162178
/*
163179
* Variables & Handlers for Whole App Stuff
164180
*/

0 commit comments

Comments
 (0)