Skip to content

Commit c73e125

Browse files
authored
Merge pull request #550 from DimensionDev/feature/cmp
migrate about screen to cmp
2 parents 1e6e4df + e0a488b commit c73e125

File tree

80 files changed

+651
-368
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

80 files changed

+651
-368
lines changed

.github/workflows/android.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ jobs:
3232
uses: actions/setup-java@v3
3333
with:
3434
distribution: 'zulu'
35-
java-version: 17
35+
java-version: 21
3636

3737
- name: Setup Android SDK
3838
uses: android-actions/setup-android@v2

app/build.gradle.kts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,8 @@ dependencies {
117117
implementation(libs.bundles.koin)
118118
implementation(libs.ktorfit.lib)
119119
ksp(libs.ktorfit.ksp)
120-
implementation(libs.bundles.coil)
120+
implementation(libs.bundles.coil3)
121+
implementation(libs.bundles.coil3.extensions)
121122
implementation(libs.bundles.ktor)
122123
implementation(libs.molecule.runtime)
123124
implementation(libs.ksoup)
@@ -145,6 +146,8 @@ dependencies {
145146
implementation(libs.colorpicker.compose)
146147
implementation(libs.material.motion.compose)
147148
implementation(libs.nestedScrollView)
149+
implementation(libs.precompose.molecule)
150+
implementation(libs.compose.placeholder.material3)
148151

149152
if (project.file("google-services.json").exists()) {
150153
implementation(platform(libs.firebase.bom))

app/src/main/java/dev/dimension/flare/App.kt

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,13 @@ package dev.dimension.flare
22

33
import android.app.Application
44
import android.os.Build
5-
import coil.ImageLoader
6-
import coil.ImageLoaderFactory
7-
import coil.decode.GifDecoder
8-
import coil.decode.ImageDecoderDecoder
9-
import coil.decode.SvgDecoder
5+
import coil3.ImageLoader
6+
import coil3.PlatformContext
7+
import coil3.SingletonImageLoader
8+
import coil3.gif.AnimatedImageDecoder
9+
import coil3.gif.GifDecoder
10+
import coil3.request.crossfade
11+
import coil3.svg.SvgDecoder
1012
import dev.dimension.flare.common.AnimatedPngDecoder
1113
import dev.dimension.flare.common.AnimatedWebPDecoder
1214
import dev.dimension.flare.di.androidModule
@@ -16,7 +18,7 @@ import org.koin.core.context.startKoin
1618

1719
class App :
1820
Application(),
19-
ImageLoaderFactory {
21+
SingletonImageLoader.Factory {
2022
override fun onCreate() {
2123
super.onCreate()
2224
startKoin {
@@ -25,12 +27,12 @@ class App :
2527
}
2628
}
2729

28-
override fun newImageLoader(): ImageLoader =
30+
override fun newImageLoader(context: PlatformContext): ImageLoader =
2931
ImageLoader
3032
.Builder(this)
3133
.components {
3234
if (Build.VERSION.SDK_INT >= 28) {
33-
add(ImageDecoderDecoder.Factory())
35+
add(factory = AnimatedImageDecoder.Factory())
3436
} else {
3537
add(GifDecoder.Factory())
3638
}

app/src/main/java/dev/dimension/flare/common/AnimatedPngDecoder.kt

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
package dev.dimension.flare.common
22

3-
import coil.ImageLoader
4-
import coil.annotation.ExperimentalCoilApi
5-
import coil.decode.DecodeResult
6-
import coil.decode.Decoder
7-
import coil.decode.ImageSource
8-
import coil.fetch.SourceResult
9-
import coil.request.Options
3+
import coil3.ImageLoader
4+
import coil3.annotation.ExperimentalCoilApi
5+
import coil3.asImage
6+
import coil3.decode.DecodeResult
7+
import coil3.decode.Decoder
8+
import coil3.decode.ImageSource
9+
import coil3.fetch.SourceFetchResult
10+
import coil3.request.Options
1011
import com.github.penfeizhou.animation.apng.APNGDrawable
1112
import com.github.penfeizhou.animation.apng.decode.APNGParser
1213

@@ -16,13 +17,13 @@ internal class AnimatedPngDecoder(
1617
@OptIn(ExperimentalCoilApi::class)
1718
override suspend fun decode(): DecodeResult =
1819
DecodeResult(
19-
drawable = APNGDrawable.fromFile(source.file().toString()),
20+
image = APNGDrawable.fromFile(source.file().toString()).asImage(),
2021
isSampled = false,
2122
)
2223

2324
class Factory : Decoder.Factory {
2425
override fun create(
25-
result: SourceResult,
26+
result: SourceFetchResult,
2627
options: Options,
2728
imageLoader: ImageLoader,
2829
): Decoder? =

app/src/main/java/dev/dimension/flare/common/AnimatedWebPDecoder.kt

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,29 @@
11
package dev.dimension.flare.common
22

3-
import coil.ImageLoader
4-
import coil.decode.DecodeResult
5-
import coil.decode.Decoder
6-
import coil.decode.ImageSource
7-
import coil.fetch.SourceResult
8-
import coil.request.Options
3+
import coil3.ImageLoader
4+
import coil3.annotation.ExperimentalCoilApi
5+
import coil3.asImage
6+
import coil3.decode.DecodeResult
7+
import coil3.decode.Decoder
8+
import coil3.decode.ImageSource
9+
import coil3.fetch.SourceFetchResult
10+
import coil3.request.Options
911
import com.github.penfeizhou.animation.webp.WebPDrawable
1012
import com.github.penfeizhou.animation.webp.decode.WebPParser
1113

1214
internal class AnimatedWebPDecoder(
1315
private val source: ImageSource,
1416
) : Decoder {
17+
@OptIn(ExperimentalCoilApi::class)
1518
override suspend fun decode(): DecodeResult =
1619
DecodeResult(
17-
drawable = WebPDrawable.fromFile(source.file().toString()),
20+
image = WebPDrawable.fromFile(source.file().toString()).asImage(),
1821
isSampled = false,
1922
)
2023

2124
class Factory : Decoder.Factory {
2225
override fun create(
23-
result: SourceResult,
26+
result: SourceFetchResult,
2427
options: Options,
2528
imageLoader: ImageLoader,
2629
): Decoder? =

app/src/main/java/dev/dimension/flare/data/model/AppearanceSettings.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,17 +35,20 @@ data class AppearanceSettings(
3535
val compatLinkPreview: Boolean = false,
3636
)
3737

38+
@Serializable
3839
enum class Theme {
3940
LIGHT,
4041
DARK,
4142
SYSTEM,
4243
}
4344

45+
@Serializable
4446
enum class AvatarShape {
4547
CIRCLE,
4648
SQUARE,
4749
}
4850

51+
@Serializable
4952
enum class VideoAutoplay {
5053
ALWAYS,
5154
WIFI,

app/src/main/java/dev/dimension/flare/molecule/Molecule.kt

Lines changed: 0 additions & 42 deletions
This file was deleted.

app/src/main/java/dev/dimension/flare/ui/component/NetworkImage.kt

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ import androidx.compose.foundation.layout.aspectRatio
77
import androidx.compose.foundation.layout.fillMaxSize
88
import androidx.compose.foundation.layout.size
99
import androidx.compose.runtime.Composable
10+
import androidx.compose.runtime.collectAsState
11+
import androidx.compose.runtime.getValue
1012
import androidx.compose.runtime.remember
1113
import androidx.compose.ui.Alignment
1214
import androidx.compose.ui.Modifier
@@ -15,14 +17,14 @@ import androidx.compose.ui.graphics.DefaultAlpha
1517
import androidx.compose.ui.graphics.FilterQuality
1618
import androidx.compose.ui.graphics.drawscope.DrawScope
1719
import androidx.compose.ui.layout.ContentScale
18-
import androidx.compose.ui.platform.LocalContext
1920
import androidx.compose.ui.unit.dp
20-
import coil.compose.AsyncImagePainter
21-
import coil.compose.SubcomposeAsyncImage
22-
import coil.compose.rememberAsyncImagePainter
23-
import coil.request.ImageRequest
24-
import coil.size.Size
25-
import com.eygraber.compose.placeholder.material3.placeholder
21+
import coil3.compose.AsyncImagePainter
22+
import coil3.compose.LocalPlatformContext
23+
import coil3.compose.SubcomposeAsyncImage
24+
import coil3.compose.rememberAsyncImagePainter
25+
import coil3.request.ImageRequest
26+
import coil3.size.Size
27+
import io.github.fornewid.placeholder.material3.placeholder
2628

2729
@Composable
2830
fun NetworkImage(
@@ -46,7 +48,7 @@ fun NetworkImage(
4648
SubcomposeAsyncImage(
4749
model =
4850
ImageRequest
49-
.Builder(LocalContext.current)
51+
.Builder(LocalPlatformContext.current)
5052
.data(model)
5153
.let {
5254
if (model is String) {
@@ -69,11 +71,11 @@ fun NetworkImage(
6971
}
7072

7173
@Composable
72-
fun EmojiImage(
74+
internal fun EmojiImage(
7375
uri: String,
7476
modifier: Modifier = Modifier,
7577
) {
76-
val context = LocalContext.current
78+
val context = LocalPlatformContext.current
7779
val painter =
7880
rememberAsyncImagePainter(
7981
model =
@@ -85,7 +87,8 @@ fun EmojiImage(
8587
.build()
8688
},
8789
)
88-
if (painter.state is AsyncImagePainter.State.Success) {
90+
val state by painter.state.collectAsState(AsyncImagePainter.State.Loading(painter))
91+
if (state is AsyncImagePainter.State.Success) {
8992
val aspectRatio =
9093
remember(painter.intrinsicSize) {
9194
val size = painter.intrinsicSize

app/src/main/java/dev/dimension/flare/ui/component/status/CommonStatusComponent.kt

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,6 @@ import androidx.compose.ui.text.intl.Locale
5656
import androidx.compose.ui.text.style.TextOverflow
5757
import androidx.compose.ui.unit.LayoutDirection
5858
import androidx.compose.ui.unit.dp
59-
import com.eygraber.compose.placeholder.material3.placeholder
6059
import com.fleeksoft.ksoup.nodes.Element
6160
import compose.icons.FontAwesomeIcons
6261
import compose.icons.fontawesomeicons.Regular
@@ -83,7 +82,6 @@ import dev.dimension.flare.data.datasource.microblog.StatusAction
8382
import dev.dimension.flare.data.model.AppearanceSettings
8483
import dev.dimension.flare.data.model.LocalAppearanceSettings
8584
import dev.dimension.flare.model.MicroBlogKey
86-
import dev.dimension.flare.molecule.producePresenter
8785
import dev.dimension.flare.ui.component.AdaptiveGrid
8886
import dev.dimension.flare.ui.component.EmojiImage
8987
import dev.dimension.flare.ui.component.FAIcon
@@ -99,8 +97,10 @@ import dev.dimension.flare.ui.model.onLoading
9997
import dev.dimension.flare.ui.model.onSuccess
10098
import dev.dimension.flare.ui.screen.status.statusTranslatePresenter
10199
import dev.dimension.flare.ui.theme.MediumAlpha
100+
import io.github.fornewid.placeholder.material3.placeholder
102101
import kotlinx.collections.immutable.ImmutableList
103102
import kotlinx.collections.immutable.toImmutableList
103+
import moe.tlaster.precompose.molecule.producePresenter
104104

105105
@Composable
106106
fun CommonStatusComponent(
@@ -112,7 +112,7 @@ fun CommonStatusComponent(
112112
val appearanceSettings = LocalAppearanceSettings.current
113113
Column(
114114
modifier =
115-
modifier
115+
Modifier
116116
.let {
117117
if (isDetail) {
118118
it
@@ -127,7 +127,7 @@ fun CommonStatusComponent(
127127
)
128128
}
129129
}
130-
},
130+
}.then(modifier),
131131
) {
132132
item.user?.let { user ->
133133
CommonStatusHeaderComponent(
@@ -823,7 +823,7 @@ private fun StatusPollComponent(
823823
text =
824824
stringResource(
825825
id = R.string.poll_expired_at,
826-
poll.expiresAt.localizedFullTime,
826+
poll.expiredAt.value.localizedFullTime,
827827
),
828828
modifier =
829829
Modifier
@@ -964,14 +964,14 @@ private fun ExpandedCard(
964964
val appearanceSettings = LocalAppearanceSettings.current
965965
Column(
966966
modifier =
967-
modifier
967+
Modifier
968968
.border(
969969
FlareDividerDefaults.thickness,
970970
color = FlareDividerDefaults.color,
971971
shape = MaterialTheme.shapes.medium,
972972
).clip(
973973
shape = MaterialTheme.shapes.medium,
974-
),
974+
).then(modifier),
975975
) {
976976
card.media?.let {
977977
AdaptiveGrid(
@@ -1016,14 +1016,14 @@ fun CompatCard(
10161016
) {
10171017
Row(
10181018
modifier =
1019-
modifier
1019+
Modifier
10201020
.border(
10211021
FlareDividerDefaults.thickness,
10221022
color = FlareDividerDefaults.color,
10231023
shape = MaterialTheme.shapes.medium,
10241024
).clip(
10251025
shape = MaterialTheme.shapes.medium,
1026-
),
1026+
).then(modifier),
10271027
) {
10281028
card.media?.let {
10291029
MediaItem(

0 commit comments

Comments
 (0)