From 7195ab646d47b50ca76a47c5f46c552c3fb8030e Mon Sep 17 00:00:00 2001 From: Tlaster Date: Sat, 19 Oct 2024 17:46:48 +0900 Subject: [PATCH] fix misskey timeline wrong quoted display --- .../component/status/UiTimelineComponent.kt | 16 ++++----- .../database/cache/dao/StatusReferenceDao.kt | 3 ++ .../data/database/cache/mapper/Bluesky.kt | 1 + .../data/database/cache/mapper/Microblog.kt | 1 + .../data/database/cache/mapper/Misskey.kt | 7 +++- .../dimension/flare/ui/model/UiTimeline.kt | 32 ++++++++++++----- .../flare/ui/model/mapper/Mastodon.kt | 36 ++++++++++++++----- .../flare/ui/model/mapper/Misskey.kt | 4 ++- 8 files changed, 73 insertions(+), 27 deletions(-) diff --git a/app/src/main/java/dev/dimension/flare/ui/component/status/UiTimelineComponent.kt b/app/src/main/java/dev/dimension/flare/ui/component/status/UiTimelineComponent.kt index b5c6d3d6f..7d624d76a 100644 --- a/app/src/main/java/dev/dimension/flare/ui/component/status/UiTimelineComponent.kt +++ b/app/src/main/java/dev/dimension/flare/ui/component/status/UiTimelineComponent.kt @@ -212,40 +212,40 @@ private fun TopMessageComponent( is UiTimeline.TopMessage.MessageType.Mastodon -> when (type) { - UiTimeline.TopMessage.MessageType.Mastodon.Favourite -> + is UiTimeline.TopMessage.MessageType.Mastodon.Favourite -> stringResource( id = R.string.mastodon_notification_item_favourited_your_status, ) - UiTimeline.TopMessage.MessageType.Mastodon.Follow -> + is UiTimeline.TopMessage.MessageType.Mastodon.Follow -> stringResource( id = R.string.mastodon_notification_item_followed_you, ) - UiTimeline.TopMessage.MessageType.Mastodon.FollowRequest -> + is UiTimeline.TopMessage.MessageType.Mastodon.FollowRequest -> stringResource( id = R.string.mastodon_notification_item_requested_follow, ) - UiTimeline.TopMessage.MessageType.Mastodon.Mention -> + is UiTimeline.TopMessage.MessageType.Mastodon.Mention -> stringResource( id = R.string.mastodon_notification_item_mentioned_you, ) - UiTimeline.TopMessage.MessageType.Mastodon.Poll -> + is UiTimeline.TopMessage.MessageType.Mastodon.Poll -> stringResource(id = R.string.mastodon_notification_item_poll_ended) - UiTimeline.TopMessage.MessageType.Mastodon.Reblogged -> + is UiTimeline.TopMessage.MessageType.Mastodon.Reblogged -> stringResource( id = R.string.mastodon_notification_item_reblogged_your_status, ) - UiTimeline.TopMessage.MessageType.Mastodon.Status -> + is UiTimeline.TopMessage.MessageType.Mastodon.Status -> stringResource( id = R.string.mastodon_notification_item_posted_status, ) - UiTimeline.TopMessage.MessageType.Mastodon.Update -> + is UiTimeline.TopMessage.MessageType.Mastodon.Update -> stringResource( id = R.string.mastodon_notification_item_updated_status, ) diff --git a/shared/src/commonMain/kotlin/dev/dimension/flare/data/database/cache/dao/StatusReferenceDao.kt b/shared/src/commonMain/kotlin/dev/dimension/flare/data/database/cache/dao/StatusReferenceDao.kt index 12c51210e..9b934a700 100644 --- a/shared/src/commonMain/kotlin/dev/dimension/flare/data/database/cache/dao/StatusReferenceDao.kt +++ b/shared/src/commonMain/kotlin/dev/dimension/flare/data/database/cache/dao/StatusReferenceDao.kt @@ -14,4 +14,7 @@ interface StatusReferenceDao { @Query("DELETE FROM status_reference WHERE statusKey = :key") suspend fun delete(key: MicroBlogKey) + + @Query("DELETE FROM status_reference WHERE statusKey in (:keys)") + suspend fun delete(keys: List) } diff --git a/shared/src/commonMain/kotlin/dev/dimension/flare/data/database/cache/mapper/Bluesky.kt b/shared/src/commonMain/kotlin/dev/dimension/flare/data/database/cache/mapper/Bluesky.kt index f001ca654..85292ba33 100644 --- a/shared/src/commonMain/kotlin/dev/dimension/flare/data/database/cache/mapper/Bluesky.kt +++ b/shared/src/commonMain/kotlin/dev/dimension/flare/data/database/cache/mapper/Bluesky.kt @@ -117,6 +117,7 @@ internal object Bluesky { database.statusDao().insertAll(it) } timeline.flatMap { it.status.references }.map { it.reference }.let { + database.statusReferenceDao().delete(it.map { it.statusKey }) database.statusReferenceDao().insertAll(it) } database.pagingTimelineDao().insertAll(timeline.map { it.timeline }) diff --git a/shared/src/commonMain/kotlin/dev/dimension/flare/data/database/cache/mapper/Microblog.kt b/shared/src/commonMain/kotlin/dev/dimension/flare/data/database/cache/mapper/Microblog.kt index 3426a6497..b622cdf27 100644 --- a/shared/src/commonMain/kotlin/dev/dimension/flare/data/database/cache/mapper/Microblog.kt +++ b/shared/src/commonMain/kotlin/dev/dimension/flare/data/database/cache/mapper/Microblog.kt @@ -32,6 +32,7 @@ internal suspend fun saveToDatabase( database.statusDao().insertAll(it) } items.flatMap { it.status.references }.map { it.reference }.let { + database.statusReferenceDao().delete(it.map { it.statusKey }) database.statusReferenceDao().insertAll(it) } database.pagingTimelineDao().insertAll(items.map { it.timeline }) diff --git a/shared/src/commonMain/kotlin/dev/dimension/flare/data/database/cache/mapper/Misskey.kt b/shared/src/commonMain/kotlin/dev/dimension/flare/data/database/cache/mapper/Misskey.kt index a3a1d98a0..49f084be8 100644 --- a/shared/src/commonMain/kotlin/dev/dimension/flare/data/database/cache/mapper/Misskey.kt +++ b/shared/src/commonMain/kotlin/dev/dimension/flare/data/database/cache/mapper/Misskey.kt @@ -95,6 +95,7 @@ internal object Misskey { database.statusDao().insertAll(it) } timeline.flatMap { it.status.references }.map { it.reference }.let { + database.statusReferenceDao().delete(it.map { it.statusKey }) database.statusReferenceDao().insertAll(it) } database.pagingTimelineDao().insertAll(timeline.map { it.timeline }) @@ -160,7 +161,11 @@ private fun List.toDbPagingTimeline( references = listOfNotNull( if (it.renote != null) { - ReferenceType.Retweet to it.renote.toDbStatusWithUser(accountKey) + if (it.text.isNullOrEmpty()) { + ReferenceType.Retweet to it.renote.toDbStatusWithUser(accountKey) + } else { + ReferenceType.Quote to it.renote.toDbStatusWithUser(accountKey) + } } else { null }, diff --git a/shared/src/commonMain/kotlin/dev/dimension/flare/ui/model/UiTimeline.kt b/shared/src/commonMain/kotlin/dev/dimension/flare/ui/model/UiTimeline.kt index 308739a72..1a83cb42c 100644 --- a/shared/src/commonMain/kotlin/dev/dimension/flare/ui/model/UiTimeline.kt +++ b/shared/src/commonMain/kotlin/dev/dimension/flare/ui/model/UiTimeline.kt @@ -180,21 +180,37 @@ data class UiTimeline internal constructor( sealed interface MessageType { sealed interface Mastodon : MessageType { - data object Reblogged : Mastodon + data class Reblogged( + val id: String, + ) : Mastodon - data object Follow : Mastodon + data class Follow( + val id: String, + ) : Mastodon - data object Favourite : Mastodon + data class Favourite( + val id: String, + ) : Mastodon - data object Mention : Mastodon + data class Mention( + val id: String, + ) : Mastodon - data object Poll : Mastodon + data class Poll( + val id: String, + ) : Mastodon - data object FollowRequest : Mastodon + data class FollowRequest( + val id: String, + ) : Mastodon - data object Status : Mastodon + data class Status( + val id: String, + ) : Mastodon - data object Update : Mastodon + data class Update( + val id: String, + ) : Mastodon } sealed interface Misskey : MessageType { diff --git a/shared/src/commonMain/kotlin/dev/dimension/flare/ui/model/mapper/Mastodon.kt b/shared/src/commonMain/kotlin/dev/dimension/flare/ui/model/mapper/Mastodon.kt index 266468617..b7538a866 100644 --- a/shared/src/commonMain/kotlin/dev/dimension/flare/ui/model/mapper/Mastodon.kt +++ b/shared/src/commonMain/kotlin/dev/dimension/flare/ui/model/mapper/Mastodon.kt @@ -53,14 +53,30 @@ internal fun Notification.render( ) val topMessageType = when (type) { - NotificationTypes.Follow -> UiTimeline.TopMessage.MessageType.Mastodon.Follow - NotificationTypes.Favourite -> UiTimeline.TopMessage.MessageType.Mastodon.Favourite - NotificationTypes.Reblog -> UiTimeline.TopMessage.MessageType.Mastodon.Reblogged - NotificationTypes.Mention -> UiTimeline.TopMessage.MessageType.Mastodon.Mention - NotificationTypes.Poll -> UiTimeline.TopMessage.MessageType.Mastodon.Poll - NotificationTypes.FollowRequest -> UiTimeline.TopMessage.MessageType.Mastodon.FollowRequest - NotificationTypes.Status -> UiTimeline.TopMessage.MessageType.Mastodon.Status - NotificationTypes.Update -> UiTimeline.TopMessage.MessageType.Mastodon.Update + NotificationTypes.Follow -> + UiTimeline.TopMessage.MessageType.Mastodon + .Follow(id = id.orEmpty()) + NotificationTypes.Favourite -> + UiTimeline.TopMessage.MessageType.Mastodon + .Favourite(id = id.orEmpty()) + NotificationTypes.Reblog -> + UiTimeline.TopMessage.MessageType.Mastodon + .Reblogged(id = id.orEmpty()) + NotificationTypes.Mention -> + UiTimeline.TopMessage.MessageType.Mastodon + .Mention(id = id.orEmpty()) + NotificationTypes.Poll -> + UiTimeline.TopMessage.MessageType.Mastodon + .Poll(id = id.orEmpty()) + NotificationTypes.FollowRequest -> + UiTimeline.TopMessage.MessageType.Mastodon + .FollowRequest(id = id.orEmpty()) + NotificationTypes.Status -> + UiTimeline.TopMessage.MessageType.Mastodon + .Status(id = id.orEmpty()) + NotificationTypes.Update -> + UiTimeline.TopMessage.MessageType.Mastodon + .Update(id = id.orEmpty()) null -> null } val topMessage = @@ -121,7 +137,9 @@ internal fun Status.render( UiTimeline.TopMessage( user = user, icon = UiTimeline.TopMessage.Icon.Retweet, - type = UiTimeline.TopMessage.MessageType.Mastodon.Reblogged, + type = + UiTimeline.TopMessage.MessageType.Mastodon + .Reblogged(id = id.orEmpty()), onClicked = { launcher.launch( AppDeepLink.Profile( diff --git a/shared/src/commonMain/kotlin/dev/dimension/flare/ui/model/mapper/Misskey.kt b/shared/src/commonMain/kotlin/dev/dimension/flare/ui/model/mapper/Misskey.kt index 6d99b6059..3c054b58f 100644 --- a/shared/src/commonMain/kotlin/dev/dimension/flare/ui/model/mapper/Misskey.kt +++ b/shared/src/commonMain/kotlin/dev/dimension/flare/ui/model/mapper/Misskey.kt @@ -251,7 +251,9 @@ internal fun Note.render( UiTimeline.TopMessage( user = user, icon = UiTimeline.TopMessage.Icon.Retweet, - type = UiTimeline.TopMessage.MessageType.Mastodon.Reblogged, + type = + UiTimeline.TopMessage.MessageType.Misskey + .Renote(id = id), onClicked = { launcher.launch( AppDeepLink.Profile(