From 908c33e825f7ce775950be99ca1e69caa9249166 Mon Sep 17 00:00:00 2001 From: Konstantin Tskhovrebov Date: Sun, 2 Feb 2025 22:54:44 +0100 Subject: [PATCH] Gson -> Kotlinx.serialization Some fields in DTOs are nullable now because they were nullable in fact. Gson writes nulls to kotlin's non-nullable types through java's reflection --- app/build.gradle.kts | 3 +- .../data/remote/dto/AccessTokenDto.kt | 8 +- .../pfpixelix/data/remote/dto/AccountDto.kt | 75 ++++----- .../data/remote/dto/ApiReplyElementDto.kt | 6 +- .../data/remote/dto/ApplicationDto.kt | 27 ++-- .../pfpixelix/data/remote/dto/ChatDto.kt | 5 +- .../data/remote/dto/CollectionDto.kt | 28 ++-- .../data/remote/dto/ConfigurationDto.kt | 6 +- .../data/remote/dto/ConversationDto.kt | 6 +- .../data/remote/dto/CreateMessageDto.kt | 3 + .../data/remote/dto/CreateReplyDto.kt | 3 + .../data/remote/dto/DomainSoftwareDto.kt | 6 +- .../pfpixelix/data/remote/dto/FocusDto.kt | 7 +- .../pfpixelix/data/remote/dto/InstanceDto.kt | 22 +-- .../data/remote/dto/InstanceStatsDto.kt | 10 +- .../pfpixelix/data/remote/dto/LabelDto.kt | 6 +- .../pfpixelix/data/remote/dto/LicenseDto.kt | 10 +- .../pfpixelix/data/remote/dto/LikedByDto.kt | 21 ++- .../pfpixelix/data/remote/dto/LinkDto.kt | 2 + .../dto/MediaAttachmentConfigurationDto.kt | 10 +- .../data/remote/dto/MediaAttachmentDto.kt | 37 ++--- .../pfpixelix/data/remote/dto/MessageDto.kt | 7 +- .../pfpixelix/data/remote/dto/MetaDto.kt | 8 +- .../data/remote/dto/NotificationDto.kt | 16 +- .../pfpixelix/data/remote/dto/OriginalDto.kt | 12 +- .../pfpixelix/data/remote/dto/PlaceDto.kt | 14 +- .../data/remote/dto/PostContextDto.kt | 8 +- .../pfpixelix/data/remote/dto/PostDto.kt | 143 +++++++++--------- .../data/remote/dto/RelatedHashtagDto.kt | 7 +- .../data/remote/dto/RelationshipDto.kt | 25 +-- .../pfpixelix/data/remote/dto/ReplyDto.kt | 83 +++++----- .../pfpixelix/data/remote/dto/RuleDto.kt | 7 +- .../pfpixelix/data/remote/dto/SearchDto.kt | 10 +- .../pfpixelix/data/remote/dto/SettingsDto.kt | 14 +- .../pfpixelix/data/remote/dto/TagDto.kt | 20 +-- .../data/remote/dto/WellKnownDomainsDto.kt | 2 + .../data/remote/dto/nodeinfo/FediServerDto.kt | 20 +-- .../remote/dto/nodeinfo/FediSoftwareDto.kt | 32 ++-- .../data/remote/dto/nodeinfo/NodeInfoDto.kt | 2 + .../dto/nodeinfo/NodeinfoMetadataDto.kt | 10 +- .../remote/dto/nodeinfo/NodeinfoUsageDto.kt | 14 +- .../remote/dto/nodeinfo/NodeinfoUsersDto.kt | 16 +- .../remote/dto/nodeinfo/ServerLocationDto.kt | 9 +- .../remote/dto/nodeinfo/ServerStatsDto.kt | 10 +- .../remote/dto/nodeinfo/SoftwareSmallDto.kt | 16 +- .../data/remote/dto/nodeinfo/WrapperDto.kt | 6 +- .../com/daniebeler/pfpixelix/di/Module.kt | 19 ++- .../domain/model/nodeinfo/NodeinfoMetadata.kt | 8 +- .../domain/model/nodeinfo/NodeinfoUsers.kt | 10 +- .../widget/WidgetRepositoryProvider.kt | 11 +- gradle/libs.versions.toml | 7 +- 51 files changed, 495 insertions(+), 372 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index da45b222..455802f8 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -72,10 +72,9 @@ dependencies { implementation(libs.volley) - implementation(libs.gson) implementation(libs.retrofit) - implementation(libs.converter.gson) + implementation(libs.retrofit.json) implementation(libs.logging.interceptor) implementation(libs.androidx.runtime.livedata) diff --git a/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/AccessTokenDto.kt b/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/AccessTokenDto.kt index d8a7cbc2..c4025254 100644 --- a/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/AccessTokenDto.kt +++ b/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/AccessTokenDto.kt @@ -1,11 +1,13 @@ package com.daniebeler.pfpixelix.data.remote.dto import com.daniebeler.pfpixelix.domain.model.AccessToken -import com.google.gson.annotations.SerializedName +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +@Serializable data class AccessTokenDto( - @SerializedName("access_token") val accessToken: String, - @SerializedName("created_at") val createdAt: String + @SerialName("access_token") val accessToken: String, + @SerialName("created_at") val createdAt: String ) : DtoInterface { override fun toModel(): AccessToken { return AccessToken( diff --git a/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/AccountDto.kt b/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/AccountDto.kt index a0b82df6..5a2ca102 100644 --- a/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/AccountDto.kt +++ b/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/AccountDto.kt @@ -3,47 +3,50 @@ package com.daniebeler.pfpixelix.data.remote.dto import com.daniebeler.pfpixelix.domain.model.Account import com.daniebeler.pfpixelix.utils.HtmlToText.htmlToText -import com.google.gson.annotations.SerializedName +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import kotlinx.serialization.json.JsonElement +@Serializable data class AccountDto( - @SerializedName("acct") val acct: String, - @SerializedName("avatar") val avatar: String, - @SerializedName("created_at") val createdAt: String, - @SerializedName("discoverable") val discoverable: Boolean, - @SerializedName("display_name") val displayName: String?, - @SerializedName("followers_count") val followersCount: Int, - @SerializedName("following_count") val followingCount: Int, - @SerializedName("header_bg") val headerBg: Any, - @SerializedName("id") val id: String, - @SerializedName("is_admin") val isAdmin: Boolean, - @SerializedName("last_fetched_at") val lastFetchedAt: String, - @SerializedName("local") val local: Boolean, - @SerializedName("location") val location: Any, - @SerializedName("locked") val locked: Boolean, - @SerializedName("note") val note: String, - @SerializedName("note_text") val noteText: String?, - @SerializedName("pronouns") val pronouns: List?, - @SerializedName("statuses_count") val statusesCount: Int, - @SerializedName("url") val url: String, - @SerializedName("username") val username: String, - @SerializedName("website") val website: String + @SerialName("acct") val acct: String?, + @SerialName("avatar") val avatar: String?, + @SerialName("created_at") val createdAt: String?, + @SerialName("discoverable") val discoverable: Boolean?, + @SerialName("display_name") val displayName: String?, + @SerialName("followers_count") val followersCount: Int?, + @SerialName("following_count") val followingCount: Int?, + @SerialName("header_bg") val headerBg: JsonElement?, + @SerialName("id") val id: String?, + @SerialName("is_admin") val isAdmin: Boolean?, + @SerialName("last_fetched_at") val lastFetchedAt: String?, + @SerialName("local") val local: Boolean?, + @SerialName("location") val location: JsonElement?, + @SerialName("locked") val locked: Boolean?, + @SerialName("note") val note: String?, + @SerialName("note_text") val noteText: String?, + @SerialName("pronouns") val pronouns: List?, + @SerialName("statuses_count") val statusesCount: Int?, + @SerialName("url") val url: String?, + @SerialName("username") val username: String?, + @SerialName("website") val website: String? ) : DtoInterface { override fun toModel(): Account { return Account( - id = id, - username = username, - acct = acct, - displayname = displayName, - avatar = avatar, - followersCount = followersCount, - followingCount = followingCount, - postsCount = statusesCount, - website = website, - note = htmlToText(note), - url = url, - locked = locked, - createdAt = createdAt, - isAdmin = isAdmin, + id = id ?: "", + username = username?: "", + acct = acct ?: "", + displayname = displayName ?: "", + avatar = avatar ?: "", + followersCount = followersCount ?: 0, + followingCount = followingCount ?: 0, + postsCount = statusesCount ?: 0, + website = website ?: "", + note = htmlToText(note.orEmpty()), + url = url ?: "", + locked = locked ?: false, + createdAt = createdAt ?: "", + isAdmin = isAdmin ?: false, pronouns = pronouns ?: emptyList() ) } diff --git a/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/ApiReplyElementDto.kt b/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/ApiReplyElementDto.kt index 18c18244..c781bef3 100644 --- a/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/ApiReplyElementDto.kt +++ b/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/ApiReplyElementDto.kt @@ -1,7 +1,9 @@ package com.daniebeler.pfpixelix.data.remote.dto -import com.google.gson.annotations.SerializedName +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +@Serializable data class ApiReplyElementDto( - @SerializedName("data") val data: List + @SerialName("data") val data: List ) diff --git a/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/ApplicationDto.kt b/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/ApplicationDto.kt index 3479af60..c37ba9ca 100644 --- a/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/ApplicationDto.kt +++ b/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/ApplicationDto.kt @@ -2,23 +2,26 @@ package com.daniebeler.pfpixelix.data.remote.dto import com.daniebeler.pfpixelix.domain.model.Application -import com.google.gson.annotations.SerializedName +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import kotlinx.serialization.json.JsonElement +@Serializable data class ApplicationDto( - @SerializedName("name") val name: String, - @SerializedName("website") val website: Any, - @SerializedName("id") val id: String, - @SerializedName("redirect_uri") val redirectUri: String, - @SerializedName("client_id") val clientId: String, - @SerializedName("client_secret") val clientSecret: String + @SerialName("name") val name: String?, + @SerialName("website") val website: JsonElement?, + @SerialName("id") val id: String?, + @SerialName("redirect_uri") val redirectUri: String?, + @SerialName("client_id") val clientId: String?, + @SerialName("client_secret") val clientSecret: String? ) : DtoInterface { override fun toModel(): Application { return Application( - name = name, - id = id, - redirectUri = redirectUri, - clientId = clientId, - clientSecret = clientSecret + name = name ?: "", + id = id ?: "", + redirectUri = redirectUri ?: "", + clientId = clientId ?: "", + clientSecret = clientSecret ?: "" ) } } \ No newline at end of file diff --git a/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/ChatDto.kt b/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/ChatDto.kt index 3c8191f3..4775ca4f 100644 --- a/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/ChatDto.kt +++ b/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/ChatDto.kt @@ -1,10 +1,13 @@ package com.daniebeler.pfpixelix.data.remote.dto import com.daniebeler.pfpixelix.domain.model.Chat +import kotlinx.serialization.Serializable +import kotlinx.serialization.json.JsonElement +@Serializable data class ChatDto( val avatar: String, - val domain: Any, + val domain: JsonElement?, val id: String, val isLocal: Boolean, val messages: List, diff --git a/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/CollectionDto.kt b/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/CollectionDto.kt index c942dd16..26f7b4af 100644 --- a/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/CollectionDto.kt +++ b/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/CollectionDto.kt @@ -1,21 +1,23 @@ package com.daniebeler.pfpixelix.data.remote.dto import com.daniebeler.pfpixelix.domain.model.Collection -import com.google.gson.annotations.SerializedName +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +@Serializable data class CollectionDto( - @SerializedName("avatar") val avatar: String, - @SerializedName("description") val description: String?, - @SerializedName("id") val id: String, - @SerializedName("pid") val pid: String, - @SerializedName("post_count") val postCount: Int, - @SerializedName("published_at") val publishedAt: String, - @SerializedName("thumb") val thumb: String, - @SerializedName("title") val title: String?, - @SerializedName("updated_at") val updatedAt: String, - @SerializedName("url") val url: String, - @SerializedName("username") val username: String, - @SerializedName("visibility") val visibility: String + @SerialName("avatar") val avatar: String?, + @SerialName("description") val description: String?, + @SerialName("id") val id: String, + @SerialName("pid") val pid: String?, + @SerialName("post_count") val postCount: Int, + @SerialName("published_at") val publishedAt: String?, + @SerialName("thumb") val thumb: String, + @SerialName("title") val title: String?, + @SerialName("updated_at") val updatedAt: String?, + @SerialName("url") val url: String, + @SerialName("username") val username: String, + @SerialName("visibility") val visibility: String ) : DtoInterface { override fun toModel(): Collection { return Collection( diff --git a/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/ConfigurationDto.kt b/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/ConfigurationDto.kt index e2c05f71..c3422fb2 100644 --- a/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/ConfigurationDto.kt +++ b/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/ConfigurationDto.kt @@ -1,10 +1,12 @@ package com.daniebeler.pfpixelix.data.remote.dto import com.daniebeler.pfpixelix.domain.model.Configuration -import com.google.gson.annotations.SerializedName +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +@Serializable class ConfigurationDto( - @SerializedName("media_attachments") val mediaAttachmentsConfigurations: MediaAttachmentConfigurationDto + @SerialName("media_attachments") val mediaAttachmentsConfigurations: MediaAttachmentConfigurationDto ) : DtoInterface { override fun toModel(): Configuration { return Configuration( diff --git a/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/ConversationDto.kt b/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/ConversationDto.kt index ca6d4d4f..283bdfea 100644 --- a/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/ConversationDto.kt +++ b/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/ConversationDto.kt @@ -1,13 +1,15 @@ package com.daniebeler.pfpixelix.data.remote.dto import com.daniebeler.pfpixelix.domain.model.Conversation -import com.google.gson.annotations.SerializedName +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +@Serializable data class ConversationDto( val id: Int, val unread: Boolean, val accounts: List, - @SerializedName("last_status") val lastPost: PostDto + @SerialName("last_status") val lastPost: PostDto ) : DtoInterface { override fun toModel(): Conversation { return Conversation( diff --git a/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/CreateMessageDto.kt b/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/CreateMessageDto.kt index dc31713f..8309b34e 100644 --- a/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/CreateMessageDto.kt +++ b/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/CreateMessageDto.kt @@ -1,5 +1,8 @@ package com.daniebeler.pfpixelix.data.remote.dto +import kotlinx.serialization.Serializable + +@Serializable data class CreateMessageDto( val to_id: String, val message: String, diff --git a/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/CreateReplyDto.kt b/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/CreateReplyDto.kt index be674e3a..f8270f67 100644 --- a/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/CreateReplyDto.kt +++ b/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/CreateReplyDto.kt @@ -1,5 +1,8 @@ package com.daniebeler.pfpixelix.data.remote.dto +import kotlinx.serialization.Serializable + +@Serializable data class CreateReplyDto( val status: String, val in_reply_to_id: String diff --git a/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/DomainSoftwareDto.kt b/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/DomainSoftwareDto.kt index c4f05a15..e47c0ecc 100644 --- a/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/DomainSoftwareDto.kt +++ b/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/DomainSoftwareDto.kt @@ -1,7 +1,11 @@ package com.daniebeler.pfpixelix.data.remote.dto +import kotlinx.serialization.Serializable + +@Serializable data class DomainSoftwareDto( - val name: String, val version: String + val name: String, + val version: String? ) : DtoInterface { override fun toModel(): String { return name diff --git a/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/FocusDto.kt b/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/FocusDto.kt index 77c037a3..40dd6dfc 100644 --- a/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/FocusDto.kt +++ b/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/FocusDto.kt @@ -1,8 +1,11 @@ package com.daniebeler.pfpixelix.data.remote.dto -import com.google.gson.annotations.SerializedName +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +@Serializable data class FocusDto( - @SerializedName("x") val x: Int, @SerializedName("y") val y: Int + @SerialName("x") val x: Int, + @SerialName("y") val y: Int ) \ No newline at end of file diff --git a/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/InstanceDto.kt b/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/InstanceDto.kt index 26f92c59..fc2df723 100644 --- a/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/InstanceDto.kt +++ b/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/InstanceDto.kt @@ -1,18 +1,20 @@ package com.daniebeler.pfpixelix.data.remote.dto import com.daniebeler.pfpixelix.domain.model.Instance -import com.google.gson.annotations.SerializedName +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +@Serializable data class InstanceDto( - @SerializedName("uri") val domain: String, - @SerializedName("rules") val rules: List, - @SerializedName("short_description") val shortDescription: String, - @SerializedName("description") val description: String, - @SerializedName("thumbnail") val thumbnailUrl: String, - @SerializedName("contact_account") val admin: AccountDto?, - @SerializedName("stats") val stats: InstanceStatsDto, - @SerializedName("version") val version: String, - @SerializedName("configuration") val configuration: ConfigurationDto + @SerialName("uri") val domain: String, + @SerialName("rules") val rules: List, + @SerialName("short_description") val shortDescription: String, + @SerialName("description") val description: String, + @SerialName("thumbnail") val thumbnailUrl: String, + @SerialName("contact_account") val admin: AccountDto?, + @SerialName("stats") val stats: InstanceStatsDto, + @SerialName("version") val version: String, + @SerialName("configuration") val configuration: ConfigurationDto ) : DtoInterface { override fun toModel(): Instance { diff --git a/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/InstanceStatsDto.kt b/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/InstanceStatsDto.kt index 5aa030d0..36d128b3 100644 --- a/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/InstanceStatsDto.kt +++ b/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/InstanceStatsDto.kt @@ -1,12 +1,14 @@ package com.daniebeler.pfpixelix.data.remote.dto import com.daniebeler.pfpixelix.domain.model.InstanceStats -import com.google.gson.annotations.SerializedName +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +@Serializable data class InstanceStatsDto( - @SerializedName("user_count") val userCount: Int, - @SerializedName("status_count") val statusCount: Int, - @SerializedName("domain_count") val domainCount: Int + @SerialName("user_count") val userCount: Int, + @SerialName("status_count") val statusCount: Int, + @SerialName("domain_count") val domainCount: Int ) : DtoInterface { override fun toModel(): InstanceStats { return InstanceStats( diff --git a/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/LabelDto.kt b/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/LabelDto.kt index 39829772..3f685cb1 100644 --- a/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/LabelDto.kt +++ b/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/LabelDto.kt @@ -1,8 +1,10 @@ package com.daniebeler.pfpixelix.data.remote.dto -import com.google.gson.annotations.SerializedName +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +@Serializable data class LabelDto( - @SerializedName("covid") val covid: Boolean + @SerialName("covid") val covid: Boolean? ) \ No newline at end of file diff --git a/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/LicenseDto.kt b/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/LicenseDto.kt index 57bd7fc6..f28ff577 100644 --- a/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/LicenseDto.kt +++ b/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/LicenseDto.kt @@ -2,12 +2,14 @@ package com.daniebeler.pfpixelix.data.remote.dto import com.daniebeler.pfpixelix.domain.model.License -import com.google.gson.annotations.SerializedName +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +@Serializable data class LicenseDto( - @SerializedName("id") val id: Int, - @SerializedName("title") val title: String, - @SerializedName("url") val url: String + @SerialName("id") val id: Int, + @SerialName("title") val title: String, + @SerialName("url") val url: String ) : DtoInterface { override fun toModel(): License { return License( diff --git a/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/LikedByDto.kt b/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/LikedByDto.kt index 4598f090..564dbf31 100644 --- a/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/LikedByDto.kt +++ b/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/LikedByDto.kt @@ -2,19 +2,24 @@ package com.daniebeler.pfpixelix.data.remote.dto import com.daniebeler.pfpixelix.domain.model.LikedBy -import com.google.gson.annotations.SerializedName +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +@Serializable data class LikedByDto( - @SerializedName("id") val id: String, - @SerializedName("others") val others: Boolean, - @SerializedName("total_count") val totalCount: Int, - @SerializedName("total_count_pretty") val totalCountPretty: String, - @SerializedName("url") val url: String, - @SerializedName("username") val username: String + @SerialName("id") val id: String?, + @SerialName("others") val others: Boolean, + @SerialName("total_count") val totalCount: Int?, + @SerialName("total_count_pretty") val totalCountPretty: String?, + @SerialName("url") val url: String?, + @SerialName("username") val username: String? ) : DtoInterface { override fun toModel(): LikedBy { return LikedBy( - id = id, username = username, others = others, totalCount = totalCount + id = id, + username = username, + others = others, + totalCount = totalCount ?: 0 ) } } \ No newline at end of file diff --git a/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/LinkDto.kt b/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/LinkDto.kt index 1a969128..f68285dc 100644 --- a/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/LinkDto.kt +++ b/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/LinkDto.kt @@ -1,7 +1,9 @@ package com.daniebeler.pfpixelix.data.remote.dto import com.daniebeler.pfpixelix.domain.model.Link +import kotlinx.serialization.Serializable +@Serializable data class LinkDto( val href: String, val rel: String ) : DtoInterface { diff --git a/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/MediaAttachmentConfigurationDto.kt b/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/MediaAttachmentConfigurationDto.kt index e41a94d6..c6721dc1 100644 --- a/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/MediaAttachmentConfigurationDto.kt +++ b/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/MediaAttachmentConfigurationDto.kt @@ -1,12 +1,14 @@ package com.daniebeler.pfpixelix.data.remote.dto import com.daniebeler.pfpixelix.domain.model.MediaAttachmentConfiguration -import com.google.gson.annotations.SerializedName +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +@Serializable class MediaAttachmentConfigurationDto( - @SerializedName("supported_mime_types") val supportedMimeTypes: List, - @SerializedName("image_size_limit") val imageSizeLimit: Int, - @SerializedName("video_size_limit") val videoSizeLimit: Int, + @SerialName("supported_mime_types") val supportedMimeTypes: List, + @SerialName("image_size_limit") val imageSizeLimit: Int, + @SerialName("video_size_limit") val videoSizeLimit: Int, ) : DtoInterface { override fun toModel(): MediaAttachmentConfiguration { return MediaAttachmentConfiguration( diff --git a/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/MediaAttachmentDto.kt b/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/MediaAttachmentDto.kt index a44d5991..09bca4f3 100644 --- a/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/MediaAttachmentDto.kt +++ b/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/MediaAttachmentDto.kt @@ -2,25 +2,28 @@ package com.daniebeler.pfpixelix.data.remote.dto import com.daniebeler.pfpixelix.domain.model.MediaAttachment -import com.google.gson.annotations.SerializedName +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import kotlinx.serialization.json.JsonElement +@Serializable data class MediaAttachmentDto( - @SerializedName("blurhash") val blurhash: String, - @SerializedName("description") val description: String, - @SerializedName("filter_class") val filterClass: Any, - @SerializedName("filter_name") val filterName: Any, - @SerializedName("id") val id: String, - @SerializedName("is_nsfw") val isNsfw: Any, - @SerializedName("license") val license: LicenseDto?, - @SerializedName("meta") val meta: MetaDto?, - @SerializedName("mime") val mime: String?, - @SerializedName("optimized_url") val optimizedUrl: String, - @SerializedName("orientation") val orientation: String, - @SerializedName("preview_url") val previewUrl: String, - @SerializedName("remote_url") val remoteUrl: Any, - @SerializedName("text_url") val textUrl: Any, - @SerializedName("type") val type: String, - @SerializedName("url") val url: String + @SerialName("blurhash") val blurhash: String?, + @SerialName("description") val description: String?, + @SerialName("filter_class") val filterClass: JsonElement?, + @SerialName("filter_name") val filterName: JsonElement?, + @SerialName("id") val id: String, + @SerialName("is_nsfw") val isNsfw: JsonElement?, + @SerialName("license") val license: LicenseDto?, + @SerialName("meta") val meta: MetaDto?, + @SerialName("mime") val mime: String?, + @SerialName("optimized_url") val optimizedUrl: String?, + @SerialName("orientation") val orientation: String?, + @SerialName("preview_url") val previewUrl: String, + @SerialName("remote_url") val remoteUrl: JsonElement?, + @SerialName("text_url") val textUrl: JsonElement?, + @SerialName("type") val type: String, + @SerialName("url") val url: String? ) : DtoInterface { override fun toModel(): MediaAttachment { return MediaAttachment( diff --git a/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/MessageDto.kt b/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/MessageDto.kt index db229b3f..cea81d39 100644 --- a/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/MessageDto.kt +++ b/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/MessageDto.kt @@ -1,13 +1,16 @@ package com.daniebeler.pfpixelix.data.remote.dto import com.daniebeler.pfpixelix.domain.model.Message +import kotlinx.serialization.Serializable +import kotlinx.serialization.json.JsonElement +@Serializable data class MessageDto( val hidden: Boolean, val id: String, val isAuthor: Boolean, - val media: Any, - val meta: Any, + val media: JsonElement?, + val meta: JsonElement?, val reportId: String, val seen: Boolean, val text: String?, diff --git a/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/MetaDto.kt b/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/MetaDto.kt index 809ddac9..85dd0d1f 100644 --- a/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/MetaDto.kt +++ b/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/MetaDto.kt @@ -1,11 +1,13 @@ package com.daniebeler.pfpixelix.data.remote.dto import com.daniebeler.pfpixelix.domain.model.Meta -import com.google.gson.annotations.SerializedName +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +@Serializable data class MetaDto( - @SerializedName("focus") val focus: FocusDto, - @SerializedName("original") val original: OriginalDto? + @SerialName("focus") val focus: FocusDto?, + @SerialName("original") val original: OriginalDto? ) : DtoInterface { override fun toModel(): Meta { return Meta( diff --git a/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/NotificationDto.kt b/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/NotificationDto.kt index 9c6e1028..96a3888d 100644 --- a/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/NotificationDto.kt +++ b/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/NotificationDto.kt @@ -3,15 +3,17 @@ package com.daniebeler.pfpixelix.data.remote.dto import com.daniebeler.pfpixelix.domain.model.Notification import com.daniebeler.pfpixelix.utils.TimeAgo -import com.google.gson.annotations.SerializedName +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +@Serializable data class NotificationDto( - @SerializedName("account") val account: AccountDto, - @SerializedName("created_at") val createdAt: String, - @SerializedName("id") val id: String, - @SerializedName("relationship") val relationship: RelationshipDto, - @SerializedName("type") val type: String, - @SerializedName("status") val post: PostDto? + @SerialName("account") val account: AccountDto, + @SerialName("created_at") val createdAt: String, + @SerialName("id") val id: String, + @SerialName("relationship") val relationship: RelationshipDto?, + @SerialName("type") val type: String, + @SerialName("status") val post: PostDto? ) : DtoInterface { override fun toModel(): Notification { return Notification( diff --git a/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/OriginalDto.kt b/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/OriginalDto.kt index a11c9a13..5bbb9695 100644 --- a/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/OriginalDto.kt +++ b/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/OriginalDto.kt @@ -2,13 +2,15 @@ package com.daniebeler.pfpixelix.data.remote.dto import com.daniebeler.pfpixelix.domain.model.Original -import com.google.gson.annotations.SerializedName +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +@Serializable data class OriginalDto( - @SerializedName("aspect") val aspect: Double, - @SerializedName("height") val height: Int, - @SerializedName("size") val size: String, - @SerializedName("width") val width: Int + @SerialName("aspect") val aspect: Double, + @SerialName("height") val height: Int?, + @SerialName("size") val size: String?, + @SerialName("width") val width: Int? ) : DtoInterface { override fun toModel(): Original { return Original( diff --git a/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/PlaceDto.kt b/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/PlaceDto.kt index 49f7dcc0..e7d44d92 100644 --- a/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/PlaceDto.kt +++ b/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/PlaceDto.kt @@ -1,14 +1,16 @@ package com.daniebeler.pfpixelix.data.remote.dto import com.daniebeler.pfpixelix.domain.model.Place -import com.google.gson.annotations.SerializedName +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +@Serializable data class PlaceDto( - @SerializedName("id") val id: String, - @SerializedName("slug") val slug: String?, - @SerializedName("url") val url: String?, - @SerializedName("name") val name: String, - @SerializedName("country") val country: String + @SerialName("id") val id: String, + @SerialName("slug") val slug: String?, + @SerialName("url") val url: String?, + @SerialName("name") val name: String?, + @SerialName("country") val country: String? ) : DtoInterface { override fun toModel(): Place { return Place( diff --git a/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/PostContextDto.kt b/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/PostContextDto.kt index 6623dfc8..dff3a9af 100644 --- a/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/PostContextDto.kt +++ b/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/PostContextDto.kt @@ -1,11 +1,13 @@ package com.daniebeler.pfpixelix.data.remote.dto import com.daniebeler.pfpixelix.domain.model.PostContext -import com.google.gson.annotations.SerializedName +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +@Serializable data class PostContextDto( - @SerializedName("ancestors") val ancestors: List, - @SerializedName("descendants") val descendants: List, + @SerialName("ancestors") val ancestors: List, + @SerialName("descendants") val descendants: List, ) : DtoInterface { override fun toModel(): PostContext { return PostContext(ancestors = ancestors.map { post -> post.toModel() }, diff --git a/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/PostDto.kt b/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/PostDto.kt index f74b47c3..0a43b19b 100644 --- a/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/PostDto.kt +++ b/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/PostDto.kt @@ -3,95 +3,100 @@ package com.daniebeler.pfpixelix.data.remote.dto import com.daniebeler.pfpixelix.domain.model.Post import com.daniebeler.pfpixelix.utils.HtmlToText.htmlToText -import com.google.gson.annotations.SerializedName +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import kotlinx.serialization.json.JsonElement +@Serializable data class PostDto( - @SerializedName("account") val account: AccountDto, - @SerializedName("application") val application: ApplicationDto, - @SerializedName("comments_disabled") val commentsDisabled: Boolean, - @SerializedName("content") val content: String?, - @SerializedName("content_text") val contentText: String?, - @SerializedName("created_at") val createdAt: String, - @SerializedName("edited_at") val editedAt: Any, - @SerializedName("emojis") val emojis: List, - @SerializedName("favourited") val favourited: Boolean, - @SerializedName("favourites_count") val favouritesCount: Int, - @SerializedName("id") val id: String, - @SerializedName("in_reply_to_account_id") val inReplyToAccountId: Any, - @SerializedName("in_reply_to_id") val inReplyToId: String?, - @SerializedName("label") val label: LabelDto, - @SerializedName("language") val language: Any, - @SerializedName("liked_by") val likedBy: LikedByDto?, - @SerializedName("local") val local: Boolean, - @SerializedName("media_attachments") val mediaAttachments: List, - @SerializedName("mentions") val mentions: List, - @SerializedName("muted") val muted: Any, - @SerializedName("parent") val parent: List, - @SerializedName("pf_type") val pfType: String, - @SerializedName("place") val place: PlaceDto?, - @SerializedName("poll") val poll: Any, - @SerializedName("reblog") val reblog: PostDto?, - @SerializedName("reblogged") val reblogged: Boolean, - @SerializedName("reblogs_count") val reblogsCount: Int, - @SerializedName("replies") val replies: List, - @SerializedName("reply_count") val replyCount: Int, - @SerializedName("sensitive") val sensitive: Boolean, - @SerializedName("shortcode") val shortcode: String, - @SerializedName("spoiler_text") val spoilerText: String?, - @SerializedName("taggedPeople") val taggedPeople: List, - @SerializedName("tags") val tags: List, - @SerializedName("thread") val thread: Boolean, - @SerializedName("uri") val uri: String, - @SerializedName("url") val url: String, - @SerializedName("_v") val v: Int, - @SerializedName("visibility") val visibility: String, - @SerializedName("bookmarked") val bookmarked: Boolean, + @SerialName("account") val account: AccountDto, + @SerialName("application") val application: ApplicationDto?, + @SerialName("comments_disabled") val commentsDisabled: Boolean?, + @SerialName("content") val content: String?, + @SerialName("content_text") val contentText: String?, + @SerialName("created_at") val createdAt: String?, + @SerialName("edited_at") val editedAt: JsonElement?, + @SerialName("emojis") val emojis: List?, + @SerialName("favourited") val favourited: Boolean?, + @SerialName("favourites_count") val favouritesCount: Int?, + @SerialName("id") val id: String?, + @SerialName("in_reply_to_account_id") val inReplyToAccountId: JsonElement?, + @SerialName("in_reply_to_id") val inReplyToId: String?, + @SerialName("label") val label: LabelDto?, + @SerialName("language") val language: JsonElement?, + @SerialName("liked_by") val likedBy: LikedByDto?, + @SerialName("local") val local: Boolean?, + @SerialName("media_attachments") val mediaAttachments: List?, + @SerialName("mentions") val mentions: List?, + @SerialName("muted") val muted: JsonElement?, + @SerialName("parent") val parent: List?, + @SerialName("pf_type") val pfType: String?, + @SerialName("place") val place: PlaceDto?, + @SerialName("poll") val poll: JsonElement?, + @SerialName("reblog") val reblog: PostDto?, + @SerialName("reblogged") val reblogged: Boolean?, + @SerialName("reblogs_count") val reblogsCount: Int?, + @SerialName("replies") val replies: List?, + @SerialName("reply_count") val replyCount: Int?, + @SerialName("sensitive") val sensitive: Boolean?, + @SerialName("shortcode") val shortcode: String?, + @SerialName("spoiler_text") val spoilerText: String?, + @SerialName("taggedPeople") val taggedPeople: List?, + @SerialName("tags") val tags: List?, + @SerialName("thread") val thread: Boolean?, + @SerialName("uri") val uri: String?, + @SerialName("url") val url: String?, + @SerialName("_v") val v: Int?, + @SerialName("visibility") val visibility: String?, + @SerialName("bookmarked") val bookmarked: Boolean?, ) : DtoInterface { override fun toModel(): Post { if (reblog != null) { return Post( rebloggedBy = account.toModel(), - id = id, + id = id ?: "", reblogId = reblog.id, - mediaAttachments = reblog.mediaAttachments.map { it.toModel() }, + mediaAttachments = reblog.mediaAttachments?.map { it.toModel() }.orEmpty(), account = reblog.account.toModel(), - tags = reblog.tags.map { it.toModel() }, - favouritesCount = reblog.favouritesCount, - content = reblog.content?.let { htmlToText(it) } ?: reblog.contentText ?: "", - replyCount = reblog.replyCount, - createdAt = reblog.createdAt, - url = reblog.url, - sensitive = reblog.sensitive, + tags = reblog.tags?.map { it.toModel() }.orEmpty(), + favouritesCount = reblog.favouritesCount ?: 0, + content = reblog.contentText?.let { it.takeIf { it.isNotEmpty() } } + ?: reblog.content?.let { htmlToText(it) } ?: "", + replyCount = reblog.replyCount ?: 0, + createdAt = reblog.createdAt ?: "", + url = reblog.url ?: "", + sensitive = reblog.sensitive ?: false, spoilerText = reblog.spoilerText ?: "", - favourited = reblog.favourited, - reblogged = reblog.reblogged, - bookmarked = reblog.bookmarked, - mentions = reblog.mentions.map { it.toModel() }, + favourited = reblog.favourited ?: false, + reblogged = reblog.reblogged ?: false, + bookmarked = reblog.bookmarked ?: false, + mentions = reblog.mentions?.map { it.toModel() }.orEmpty(), place = reblog.place?.toModel(), likedBy = reblog.likedBy?.toModel(), - visibility = reblog.visibility, + visibility = reblog.visibility ?: "", inReplyToId = reblog.inReplyToId ) } else { return Post( - id = id, - mediaAttachments = mediaAttachments.map { it.toModel() }, + id = id ?: "", + mediaAttachments = mediaAttachments?.map { it.toModel() }.orEmpty(), account = account.toModel(), - tags = tags.map { it.toModel() }, - favouritesCount = favouritesCount, - content = content?.let { htmlToText(it) } ?: contentText ?: "", - replyCount = replyCount, - createdAt = createdAt, - url = url, - sensitive = sensitive, + tags = tags?.map { it.toModel() }.orEmpty(), + favouritesCount = favouritesCount ?: 0, + content = contentText?.let { it.takeIf { it.isNotEmpty() } } + ?: content?.let { htmlToText(it) } ?: "", + replyCount = replyCount ?: 0, + createdAt = createdAt ?: "", + url = url ?: "", + sensitive = sensitive ?: false, spoilerText = spoilerText ?: "", - favourited = favourited, - reblogged = reblogged, - bookmarked = bookmarked, - mentions = mentions.map { it.toModel() }, + favourited = favourited ?: false, + reblogged = reblogged ?: false, + bookmarked = bookmarked ?: false, + mentions = mentions?.map { it.toModel() }.orEmpty(), place = place?.toModel(), likedBy = likedBy?.toModel(), - visibility = visibility, + visibility = visibility ?: "", inReplyToId = inReplyToId ) } diff --git a/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/RelatedHashtagDto.kt b/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/RelatedHashtagDto.kt index 170dcc60..a0e642ba 100644 --- a/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/RelatedHashtagDto.kt +++ b/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/RelatedHashtagDto.kt @@ -2,10 +2,13 @@ package com.daniebeler.pfpixelix.data.remote.dto import com.daniebeler.pfpixelix.domain.model.RelatedHashtag -import com.google.gson.annotations.SerializedName +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +@Serializable data class RelatedHashtagDto( - @SerializedName("name") val name: String, @SerializedName("related_count") val relatedCount: Int + @SerialName("name") val name: String, + @SerialName("related_count") val relatedCount: Int ) : DtoInterface { override fun toModel(): RelatedHashtag { return RelatedHashtag( diff --git a/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/RelationshipDto.kt b/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/RelationshipDto.kt index 79e93686..2d1a6bf5 100644 --- a/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/RelationshipDto.kt +++ b/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/RelationshipDto.kt @@ -1,19 +1,22 @@ package com.daniebeler.pfpixelix.data.remote.dto import com.daniebeler.pfpixelix.domain.model.Relationship -import com.google.gson.annotations.SerializedName +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import kotlinx.serialization.json.JsonElement +@Serializable data class RelationshipDto( - @SerializedName("blocking") val blocking: Boolean, - @SerializedName("domain_blocking") val domainBlocking: Any, - @SerializedName("endorsed") val endorsed: Boolean, - @SerializedName("followed_by") val followedBy: Boolean, - @SerializedName("following") val following: Boolean, - @SerializedName("id") val id: String, - @SerializedName("muting") val muting: Boolean, - @SerializedName("muting_notifications") val mutingNotifications: Any, - @SerializedName("requested") val requested: Boolean, - @SerializedName("showing_reblogs") val showingReblogs: Any + @SerialName("blocking") val blocking: Boolean, + @SerialName("domain_blocking") val domainBlocking: JsonElement?, + @SerialName("endorsed") val endorsed: Boolean?, + @SerialName("followed_by") val followedBy: Boolean, + @SerialName("following") val following: Boolean, + @SerialName("id") val id: String, + @SerialName("muting") val muting: Boolean, + @SerialName("muting_notifications") val mutingNotifications: JsonElement?, + @SerialName("requested") val requested: Boolean?, + @SerialName("showing_reblogs") val showingReblogs: JsonElement? ) : DtoInterface { override fun toModel(): Relationship { return Relationship( diff --git a/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/ReplyDto.kt b/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/ReplyDto.kt index a84e2270..2ce66bc0 100644 --- a/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/ReplyDto.kt +++ b/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/ReplyDto.kt @@ -2,48 +2,51 @@ package com.daniebeler.pfpixelix.data.remote.dto import com.daniebeler.pfpixelix.domain.model.Reply -import com.google.gson.annotations.SerializedName +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import kotlinx.serialization.json.JsonElement +@Serializable data class ReplyDto( - @SerializedName("account") val account: AccountDto, - @SerializedName("application") val application: ApplicationDto, - @SerializedName("comments_disabled") val commentsDisabled: Boolean, - @SerializedName("content") val content: String, - @SerializedName("content_text") val contentText: String, - @SerializedName("created_at") val createdAt: String, - @SerializedName("edited_at") val editedAt: String, - @SerializedName("emojis") val emojis: List, - @SerializedName("favourited") val favourited: Boolean, - @SerializedName("favourites_count") val favouritesCount: Int, - @SerializedName("id") val id: String, - @SerializedName("in_reply_to_account_id") val inReplyToAccountId: Any, - @SerializedName("in_reply_to_id") val inReplyToId: String, - @SerializedName("label") val label: LabelDto, - @SerializedName("language") val language: Any, - @SerializedName("liked_by") val likedBy: LikedByDto, - @SerializedName("local") val local: Boolean, - @SerializedName("media_attachments") val mediaAttachments: List, - @SerializedName("mentions") val mentions: List, - @SerializedName("muted") val muted: Any, - @SerializedName("parent") val parent: List, - @SerializedName("pf_type") val pfType: String, - @SerializedName("place") val place: Any, - @SerializedName("poll") val poll: Any, - @SerializedName("reblog") val reblog: Any, - @SerializedName("reblogged") val reblogged: Any, - @SerializedName("reblogs_count") val reblogsCount: Int, - @SerializedName("replies") val replies: List, - @SerializedName("reply_count") val replyCount: Int, - @SerializedName("sensitive") val sensitive: Boolean, - @SerializedName("shortcode") val shortcode: String, - @SerializedName("spoiler_text") val spoilerText: String, - @SerializedName("taggedPeople") val taggedPeople: List, - @SerializedName("tags") val tags: List, - @SerializedName("thread") val thread: Boolean, - @SerializedName("uri") val uri: String, - @SerializedName("url") val url: String, - @SerializedName("_v") val v: Int, - @SerializedName("visibility") val visibility: String + @SerialName("account") val account: AccountDto, + @SerialName("application") val application: ApplicationDto?, + @SerialName("comments_disabled") val commentsDisabled: Boolean?, + @SerialName("content") val content: String?, + @SerialName("content_text") val contentText: String, + @SerialName("created_at") val createdAt: String, + @SerialName("edited_at") val editedAt: String?, + @SerialName("emojis") val emojis: List?, + @SerialName("favourited") val favourited: Boolean?, + @SerialName("favourites_count") val favouritesCount: Int?, + @SerialName("id") val id: String, + @SerialName("in_reply_to_account_id") val inReplyToAccountId: JsonElement?, + @SerialName("in_reply_to_id") val inReplyToId: String?, + @SerialName("label") val label: LabelDto?, + @SerialName("language") val language: JsonElement?, + @SerialName("liked_by") val likedBy: LikedByDto, + @SerialName("local") val local: Boolean?, + @SerialName("media_attachments") val mediaAttachments: List?, + @SerialName("mentions") val mentions: List, + @SerialName("muted") val muted: JsonElement?, + @SerialName("parent") val parent: List?, + @SerialName("pf_type") val pfType: String?, + @SerialName("place") val place: JsonElement?, + @SerialName("poll") val poll: JsonElement?, + @SerialName("reblog") val reblog: JsonElement?, + @SerialName("reblogged") val reblogged: JsonElement?, + @SerialName("reblogs_count") val reblogsCount: Int?, + @SerialName("replies") val replies: List?, + @SerialName("reply_count") val replyCount: Int, + @SerialName("sensitive") val sensitive: Boolean?, + @SerialName("shortcode") val shortcode: String?, + @SerialName("spoiler_text") val spoilerText: String?, + @SerialName("taggedPeople") val taggedPeople: List?, + @SerialName("tags") val tags: List?, + @SerialName("thread") val thread: Boolean?, + @SerialName("uri") val uri: String?, + @SerialName("url") val url: String?, + @SerialName("_v") val v: Int?, + @SerialName("visibility") val visibility: String? ) : DtoInterface { override fun toModel(): Reply { return Reply( diff --git a/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/RuleDto.kt b/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/RuleDto.kt index 1d0b967e..a60460f1 100644 --- a/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/RuleDto.kt +++ b/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/RuleDto.kt @@ -1,10 +1,13 @@ package com.daniebeler.pfpixelix.data.remote.dto import com.daniebeler.pfpixelix.domain.model.Rule -import com.google.gson.annotations.SerializedName +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +@Serializable data class RuleDto( - @SerializedName("id") val id: String, @SerializedName("text") val text: String + @SerialName("id") val id: String, + @SerialName("text") val text: String ) : DtoInterface { override fun toModel(): Rule { return Rule( diff --git a/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/SearchDto.kt b/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/SearchDto.kt index 7fb2d691..40d0cab7 100644 --- a/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/SearchDto.kt +++ b/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/SearchDto.kt @@ -2,12 +2,14 @@ package com.daniebeler.pfpixelix.data.remote.dto import com.daniebeler.pfpixelix.domain.model.Search -import com.google.gson.annotations.SerializedName +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +@Serializable data class SearchDto( - @SerializedName("accounts") val accounts: List, - @SerializedName("statuses") val posts: List, - @SerializedName("hashtags") val hashtags: List + @SerialName("accounts") val accounts: List, + @SerialName("statuses") val posts: List, + @SerialName("hashtags") val hashtags: List ) : DtoInterface { override fun toModel(): Search { return Search(accounts = accounts.map { accountDto -> accountDto.toModel() }, diff --git a/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/SettingsDto.kt b/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/SettingsDto.kt index bcbb610c..47600702 100644 --- a/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/SettingsDto.kt +++ b/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/SettingsDto.kt @@ -1,18 +1,20 @@ package com.daniebeler.pfpixelix.data.remote.dto import com.daniebeler.pfpixelix.domain.model.Settings +import kotlinx.serialization.Serializable +@Serializable data class SettingsDto( - val advanced_atom: Boolean, - val disable_cw: Boolean, - val disable_embeds: Boolean, + val advanced_atom: Boolean?, + val disable_cw: Boolean?, + val disable_embeds: Boolean?, val enable_reblogs: Boolean, val hide_collections: Boolean, val hide_groups: Boolean, - val hide_like_counts: Boolean, + val hide_like_counts: Boolean?, val hide_stories: Boolean, - val mutual_mention_notifications: Boolean, - val photo_reblogs_only: Boolean + val mutual_mention_notifications: Boolean?, + val photo_reblogs_only: Boolean? ): DtoInterface { override fun toModel(): Settings { return Settings( diff --git a/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/TagDto.kt b/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/TagDto.kt index babfd262..c6db6eaf 100644 --- a/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/TagDto.kt +++ b/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/TagDto.kt @@ -2,23 +2,25 @@ package com.daniebeler.pfpixelix.data.remote.dto import com.daniebeler.pfpixelix.domain.model.Tag -import com.google.gson.annotations.SerializedName +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +@Serializable data class TagDto( - @SerializedName("name") val name: String, - @SerializedName("hashtag") val hashtag: String?, - @SerializedName("url") val url: String, - @SerializedName("following") val following: Boolean, - @SerializedName("count") val count: Int?, - @SerializedName("total") val total: Int + @SerialName("name") val name: String, + @SerialName("hashtag") val hashtag: String?, + @SerialName("url") val url: String, + @SerialName("following") val following: Boolean?, + @SerialName("count") val count: Int?, + @SerialName("total") val total: Int? ) : DtoInterface { override fun toModel(): Tag { return Tag( name = name, url = url, - following = following, + following = following ?: false, count = count, - total = total, + total = total ?: 0, hashtag = hashtag ) } diff --git a/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/WellKnownDomainsDto.kt b/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/WellKnownDomainsDto.kt index 3e97aa49..dba45cf3 100644 --- a/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/WellKnownDomainsDto.kt +++ b/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/WellKnownDomainsDto.kt @@ -1,7 +1,9 @@ package com.daniebeler.pfpixelix.data.remote.dto import com.daniebeler.pfpixelix.domain.model.WellKnownDomains +import kotlinx.serialization.Serializable +@Serializable data class WellKnownDomainsDto( val links: List ) : DtoInterface { diff --git a/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/nodeinfo/FediServerDto.kt b/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/nodeinfo/FediServerDto.kt index 827a8a42..4efff8a1 100644 --- a/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/nodeinfo/FediServerDto.kt +++ b/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/nodeinfo/FediServerDto.kt @@ -1,23 +1,25 @@ package com.daniebeler.pfpixelix.data.remote.dto.nodeinfo -import com.google.gson.annotations.SerializedName +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +@Serializable data class FediServerDto( - @SerializedName("banner_url") + @SerialName("banner_url") val bannerUrl: String?, - @SerializedName("description") + @SerialName("description") val description: String?, - @SerializedName("domain") + @SerialName("domain") val domain: String?, - @SerializedName("id") + @SerialName("id") val id: Int, - @SerializedName("open_registration") + @SerialName("open_registration") val openRegistration: Boolean?, - @SerializedName("software") + @SerialName("software") val software: SoftwareSmallDto?, - @SerializedName("stats") + @SerialName("stats") val stats: ServerStatsDto?, - @SerializedName("location") + @SerialName("location") val location: ServerLocationDto? ) \ No newline at end of file diff --git a/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/nodeinfo/FediSoftwareDto.kt b/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/nodeinfo/FediSoftwareDto.kt index 7bb77c2a..5b5c024b 100644 --- a/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/nodeinfo/FediSoftwareDto.kt +++ b/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/nodeinfo/FediSoftwareDto.kt @@ -2,30 +2,32 @@ package com.daniebeler.pfpixelix.data.remote.dto.nodeinfo import com.daniebeler.pfpixelix.data.remote.dto.DtoInterface import com.daniebeler.pfpixelix.domain.model.nodeinfo.FediSoftware -import com.google.gson.annotations.SerializedName +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +@Serializable data class FediSoftwareDto( - @SerializedName("description") val description: String?, - @SerializedName("id") val id: Int, - @SerializedName("instance_count") val instanceCount: Int?, - @SerializedName("license") val license: String?, - @SerializedName("name") val name: String?, - @SerializedName("slug") val slug: String?, - @SerializedName("status_count") val statusCount: Int?, - @SerializedName("user_count") val userCount: Int?, - @SerializedName("monthly_actives") val activeUserCount: Int?, - @SerializedName("website") val website: String?, + @SerialName("description") val description: String?, + @SerialName("id") val id: Int, + @SerialName("instance_count") val instanceCount: Int?, + @SerialName("license") val license: String?, + @SerialName("name") val name: String?, + @SerialName("slug") val slug: String?, + @SerialName("status_count") val statusCount: Int?, + @SerialName("user_count") val userCount: Int?, + @SerialName("monthly_actives") val activeUserCount: Int?, + @SerialName("website") val website: String?, ) : DtoInterface { override fun toModel(): FediSoftware { return FediSoftware( id = id, description = description ?: "", - instanceCount = instanceCount ?: -1, + instanceCount = instanceCount ?: 0, license = license ?: "", name = name ?: "", - statusCount = statusCount ?: -1, - userCount = userCount ?: -1, - activeUserCount = activeUserCount ?: -1, + statusCount = statusCount ?: 0, + userCount = userCount ?: 0, + activeUserCount = activeUserCount ?: 0, slug = slug ?: "", icon = null, website = website ?: "" diff --git a/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/nodeinfo/NodeInfoDto.kt b/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/nodeinfo/NodeInfoDto.kt index ce2f8967..3ecd418c 100644 --- a/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/nodeinfo/NodeInfoDto.kt +++ b/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/nodeinfo/NodeInfoDto.kt @@ -3,7 +3,9 @@ package com.daniebeler.pfpixelix.data.remote.dto.nodeinfo import com.daniebeler.pfpixelix.data.remote.dto.DomainSoftwareDto import com.daniebeler.pfpixelix.data.remote.dto.DtoInterface import com.daniebeler.pfpixelix.domain.model.nodeinfo.NodeInfo +import kotlinx.serialization.Serializable +@Serializable data class NodeInfoDto( val software: DomainSoftwareDto, val usage: NodeinfoUsageDto, diff --git a/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/nodeinfo/NodeinfoMetadataDto.kt b/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/nodeinfo/NodeinfoMetadataDto.kt index 098714fe..44c73509 100644 --- a/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/nodeinfo/NodeinfoMetadataDto.kt +++ b/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/nodeinfo/NodeinfoMetadataDto.kt @@ -3,13 +3,13 @@ package com.daniebeler.pfpixelix.data.remote.dto.nodeinfo import com.daniebeler.pfpixelix.data.remote.dto.DtoInterface import com.daniebeler.pfpixelix.domain.model.nodeinfo.NodeinfoMetadata -import com.google.gson.annotations.SerializedName +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +@Serializable data class NodeinfoMetadataDto( - @SerializedName("nodeDescription") - val nodeDescription: String?, - @SerializedName("nodeName") - val nodeName: String? + @SerialName("nodeDescription") val nodeDescription: String?, + @SerialName("nodeName") val nodeName: String? ): DtoInterface { override fun toModel(): NodeinfoMetadata { return NodeinfoMetadata( diff --git a/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/nodeinfo/NodeinfoUsageDto.kt b/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/nodeinfo/NodeinfoUsageDto.kt index 40c004ab..ea27b332 100644 --- a/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/nodeinfo/NodeinfoUsageDto.kt +++ b/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/nodeinfo/NodeinfoUsageDto.kt @@ -4,17 +4,19 @@ package com.daniebeler.pfpixelix.data.remote.dto.nodeinfo import com.daniebeler.pfpixelix.data.remote.dto.DtoInterface import com.daniebeler.pfpixelix.domain.model.nodeinfo.NodeinfoUsage import com.daniebeler.pfpixelix.domain.model.nodeinfo.NodeinfoUsers -import com.google.gson.annotations.SerializedName +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +@Serializable data class NodeinfoUsageDto( - @SerializedName("localComments") val localComments: Int?, - @SerializedName("localPosts") val localPosts: Int?, - @SerializedName("users") val users: NodeinfoUsersDto? + @SerialName("localComments") val localComments: Int?, + @SerialName("localPosts") val localPosts: Int?, + @SerialName("users") val users: NodeinfoUsersDto? ) : DtoInterface { override fun toModel(): NodeinfoUsage { return NodeinfoUsage( - localComments = localComments ?: -1, - localPosts = localPosts ?: -1, + localComments = localComments ?: 0, + localPosts = localPosts ?: 0, users = users?.toModel() ?: NodeinfoUsers(-1, -1, -1) ) } diff --git a/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/nodeinfo/NodeinfoUsersDto.kt b/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/nodeinfo/NodeinfoUsersDto.kt index 7208619b..3fc3acca 100644 --- a/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/nodeinfo/NodeinfoUsersDto.kt +++ b/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/nodeinfo/NodeinfoUsersDto.kt @@ -3,18 +3,20 @@ package com.daniebeler.pfpixelix.data.remote.dto.nodeinfo import com.daniebeler.pfpixelix.data.remote.dto.DtoInterface import com.daniebeler.pfpixelix.domain.model.nodeinfo.NodeinfoUsers -import com.google.gson.annotations.SerializedName +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +@Serializable data class NodeinfoUsersDto( - @SerializedName("activeHalfyear") val activeHalfyear: Int?, - @SerializedName("activeMonth") val activeMonth: Int?, - @SerializedName("total") val total: Int? + @SerialName("activeHalfyear") val activeHalfyear: Int?, + @SerialName("activeMonth") val activeMonth: Int?, + @SerialName("total") val total: Int? ) : DtoInterface { override fun toModel(): NodeinfoUsers { return NodeinfoUsers( - activeHalfyear = activeHalfyear ?: -1, - activeMonth = activeMonth ?: -1, - total = total ?: -1 + activeHalfyear = activeHalfyear ?: 0, + activeMonth = activeMonth ?: 0, + total = total ?: 0 ) } } \ No newline at end of file diff --git a/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/nodeinfo/ServerLocationDto.kt b/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/nodeinfo/ServerLocationDto.kt index c0186ac6..48283296 100644 --- a/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/nodeinfo/ServerLocationDto.kt +++ b/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/nodeinfo/ServerLocationDto.kt @@ -3,12 +3,13 @@ package com.daniebeler.pfpixelix.data.remote.dto.nodeinfo import com.daniebeler.pfpixelix.data.remote.dto.DtoInterface import com.daniebeler.pfpixelix.domain.model.nodeinfo.ServerLocation -import com.daniebeler.pfpixelix.domain.model.nodeinfo.ServerStats -import com.google.gson.annotations.SerializedName +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +@Serializable data class ServerLocationDto( - @SerializedName("city") val city: String?, - @SerializedName("country") val country: String?, + @SerialName("city") val city: String?, + @SerialName("country") val country: String?, ) : DtoInterface { override fun toModel(): ServerLocation { return ServerLocation( diff --git a/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/nodeinfo/ServerStatsDto.kt b/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/nodeinfo/ServerStatsDto.kt index 1cfec4cc..e1caff99 100644 --- a/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/nodeinfo/ServerStatsDto.kt +++ b/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/nodeinfo/ServerStatsDto.kt @@ -3,12 +3,14 @@ package com.daniebeler.pfpixelix.data.remote.dto.nodeinfo import com.daniebeler.pfpixelix.data.remote.dto.DtoInterface import com.daniebeler.pfpixelix.domain.model.nodeinfo.ServerStats -import com.google.gson.annotations.SerializedName +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +@Serializable data class ServerStatsDto( - @SerializedName("monthly_active_users") val monthlyActiveUsers: Int, - @SerializedName("status_count") val statusCount: Int, - @SerializedName("user_count") val userCount: Int + @SerialName("monthly_active_users") val monthlyActiveUsers: Int, + @SerialName("status_count") val statusCount: Int, + @SerialName("user_count") val userCount: Int ) : DtoInterface { override fun toModel(): ServerStats { return ServerStats( diff --git a/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/nodeinfo/SoftwareSmallDto.kt b/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/nodeinfo/SoftwareSmallDto.kt index c3967579..da09000a 100644 --- a/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/nodeinfo/SoftwareSmallDto.kt +++ b/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/nodeinfo/SoftwareSmallDto.kt @@ -4,17 +4,15 @@ package com.daniebeler.pfpixelix.data.remote.dto.nodeinfo import android.util.Log import com.daniebeler.pfpixelix.data.remote.dto.DtoInterface import com.daniebeler.pfpixelix.domain.model.nodeinfo.SoftwareSmall -import com.google.gson.annotations.SerializedName +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +@Serializable data class SoftwareSmallDto( - @SerializedName("id") - val id: Int, - @SerializedName("name") - val name: String, - @SerializedName("url") - val url: String, - @SerializedName("version") - val version: String + @SerialName("id") val id: Int, + @SerialName("name") val name: String, + @SerialName("url") val url: String, + @SerialName("version") val version: String ): DtoInterface { override fun toModel(): SoftwareSmall { Log.d("SoftwareSmallDto", "Converting SoftwareSmallDto to SoftwareSmall: $this") diff --git a/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/nodeinfo/WrapperDto.kt b/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/nodeinfo/WrapperDto.kt index 334097af..14532b59 100644 --- a/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/nodeinfo/WrapperDto.kt +++ b/app/src/main/java/com/daniebeler/pfpixelix/data/remote/dto/nodeinfo/WrapperDto.kt @@ -5,10 +5,12 @@ import com.daniebeler.pfpixelix.domain.model.nodeinfo.FediServer import com.daniebeler.pfpixelix.domain.model.nodeinfo.ServerLocation import com.daniebeler.pfpixelix.domain.model.nodeinfo.ServerStats import com.daniebeler.pfpixelix.domain.model.nodeinfo.SoftwareSmall -import com.google.gson.annotations.SerializedName +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +@Serializable data class WrapperDto( - @SerializedName("data") val data: FediServerDto + @SerialName("data") val data: FediServerDto ) : DtoInterface { override fun toModel(): FediServer { return FediServer( diff --git a/app/src/main/java/com/daniebeler/pfpixelix/di/Module.kt b/app/src/main/java/com/daniebeler/pfpixelix/di/Module.kt index fcd2c364..591eceb0 100644 --- a/app/src/main/java/com/daniebeler/pfpixelix/di/Module.kt +++ b/app/src/main/java/com/daniebeler/pfpixelix/di/Module.kt @@ -11,10 +11,13 @@ import dagger.Provides import dagger.hilt.InstallIn import dagger.hilt.android.qualifiers.ApplicationContext import dagger.hilt.components.SingletonComponent +import kotlinx.serialization.ExperimentalSerializationApi +import kotlinx.serialization.json.Json +import okhttp3.MediaType.Companion.toMediaType import okhttp3.OkHttpClient import okhttp3.logging.HttpLoggingInterceptor import retrofit2.Retrofit -import retrofit2.converter.gson.GsonConverterFactory +import retrofit2.converter.kotlinx.serialization.asConverterFactory import javax.inject.Singleton @@ -24,6 +27,16 @@ private val Context.dataStore by preferencesDataStore("settings") @Module class Module { + + @OptIn(ExperimentalSerializationApi::class) + @Provides + @Singleton + fun provideJson(): Json = Json { + ignoreUnknownKeys = true + isLenient = true + explicitNulls = false + } + @Provides @Singleton fun provideUserDataStorePreferences( @@ -53,8 +66,8 @@ class Module { @Provides @Singleton - fun provideRetrofit(client: OkHttpClient): Retrofit = Retrofit.Builder().addConverterFactory( - GsonConverterFactory.create() + fun provideRetrofit(client: OkHttpClient, json: Json): Retrofit = Retrofit.Builder().addConverterFactory( + json.asConverterFactory("application/json; charset=UTF8".toMediaType()) ).client(client).baseUrl("https://err.or/").build() diff --git a/app/src/main/java/com/daniebeler/pfpixelix/domain/model/nodeinfo/NodeinfoMetadata.kt b/app/src/main/java/com/daniebeler/pfpixelix/domain/model/nodeinfo/NodeinfoMetadata.kt index 57a26228..5f5969d3 100644 --- a/app/src/main/java/com/daniebeler/pfpixelix/domain/model/nodeinfo/NodeinfoMetadata.kt +++ b/app/src/main/java/com/daniebeler/pfpixelix/domain/model/nodeinfo/NodeinfoMetadata.kt @@ -1,11 +1,13 @@ package com.daniebeler.pfpixelix.domain.model.nodeinfo -import com.google.gson.annotations.SerializedName +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +@Serializable data class NodeinfoMetadata( - @SerializedName("nodeDescription") + @SerialName("nodeDescription") val nodeDescription: String, - @SerializedName("nodeName") + @SerialName("nodeName") val nodeName: String ) \ No newline at end of file diff --git a/app/src/main/java/com/daniebeler/pfpixelix/domain/model/nodeinfo/NodeinfoUsers.kt b/app/src/main/java/com/daniebeler/pfpixelix/domain/model/nodeinfo/NodeinfoUsers.kt index 6cfec781..6edb4637 100644 --- a/app/src/main/java/com/daniebeler/pfpixelix/domain/model/nodeinfo/NodeinfoUsers.kt +++ b/app/src/main/java/com/daniebeler/pfpixelix/domain/model/nodeinfo/NodeinfoUsers.kt @@ -1,13 +1,15 @@ package com.daniebeler.pfpixelix.domain.model.nodeinfo -import com.google.gson.annotations.SerializedName +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +@Serializable data class NodeinfoUsers( - @SerializedName("activeHalfyear") + @SerialName("activeHalfyear") val activeHalfyear: Int, - @SerializedName("activeMonth") + @SerialName("activeMonth") val activeMonth: Int, - @SerializedName("total") + @SerialName("total") val total: Int ) \ No newline at end of file diff --git a/app/src/main/java/com/daniebeler/pfpixelix/widget/WidgetRepositoryProvider.kt b/app/src/main/java/com/daniebeler/pfpixelix/widget/WidgetRepositoryProvider.kt index e666548e..5edff960 100644 --- a/app/src/main/java/com/daniebeler/pfpixelix/widget/WidgetRepositoryProvider.kt +++ b/app/src/main/java/com/daniebeler/pfpixelix/widget/WidgetRepositoryProvider.kt @@ -8,10 +8,12 @@ import com.daniebeler.pfpixelix.domain.model.AuthData import com.daniebeler.pfpixelix.domain.model.LoginData import com.daniebeler.pfpixelix.domain.repository.WidgetRepository import kotlinx.coroutines.flow.first +import kotlinx.serialization.json.Json +import okhttp3.MediaType.Companion.toMediaType import okhttp3.OkHttpClient import okhttp3.logging.HttpLoggingInterceptor import retrofit2.Retrofit -import retrofit2.converter.gson.GsonConverterFactory +import retrofit2.converter.kotlinx.serialization.asConverterFactory class WidgetRepositoryProvider(private val dataStore: DataStore) { suspend operator fun invoke(): WidgetRepository? { @@ -34,8 +36,13 @@ class WidgetRepositoryProvider(private val dataStore: DataStore) { val client = OkHttpClient.Builder().addInterceptor(hostSelectionInterceptor) .addInterceptor(logging).build() + val json = Json { + ignoreUnknownKeys = true + isLenient = true + } + val retrofit: Retrofit = Retrofit.Builder().addConverterFactory( - GsonConverterFactory.create() + json.asConverterFactory("application/json; charset=UTF8".toMediaType()) ).client(client).baseUrl("https://err.or/").build() val service = retrofit.create(PixelfedApi::class.java) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 6fc5d805..2c5085f5 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -7,12 +7,10 @@ coil = "2.5.0" compiler = "4.12.0" compose = "1.0.0-beta01" composeBom = "2025.01.01" -converterGson = "2.9.0" coreKtx = "1.13.1" datastorePreferences = "1.1.1" glanceAppwidget = "1.1.1" glide = "4.12.0" -gson = "2.10.1" hilt = "2.49" hiltWork = "1.2.0" kotlinSerialization = "2.0.0" @@ -26,7 +24,7 @@ media3Exoplayer = "1.5.1" media3ExoplayerDash = "1.5.1" media3Ui = "1.5.1" navigationCompose = "2.8.3" -retrofit = "2.9.0" +retrofit = "2.11.0" volley = "1.2.1" workRuntimeKtx = "2.9.1" kotlin = "2.0.0" @@ -67,11 +65,9 @@ coil-compose = { module = "io.coil-kt:coil-compose", version.ref = "coil" } coil-video = { module = "io.coil-kt:coil-video", version.ref = "coil" } compiler = { module = "com.github.bumptech.glide:compiler", version.ref = "compiler" } compose = { module = "com.github.bumptech.glide:compose", version.ref = "compose" } -converter-gson = { module = "com.squareup.retrofit2:converter-gson", version.ref = "converterGson" } dagger-hilt = { group = "com.google.dagger", name = "hilt-android", version.ref = "hilt" } dagger-hilt-compiler = { group = "com.google.dagger", name = "hilt-compiler", version.ref = "hilt" } glide = { module = "com.github.bumptech.glide:glide", version.ref = "glide" } -gson = { module = "com.google.code.gson:gson", version.ref = "gson" } hilt-naviation = "androidx.hilt:hilt-navigation-compose:1.2.0" kotlin-serialization = { module = "org.jetbrains.kotlin:kotlin-serialization", version.ref = "kotlinSerialization" } kotlinx-collections-immutable = { module = "org.jetbrains.kotlinx:kotlinx-collections-immutable", version.ref = "kotlinxCollectionsImmutable" } @@ -81,6 +77,7 @@ logging-interceptor = { module = "com.squareup.okhttp3:logging-interceptor", ver material = { module = "com.google.android.material:material", version.ref = "material" } material3 = { module = "androidx.compose.material3:material3", version.ref = "mat3" } retrofit = { module = "com.squareup.retrofit2:retrofit", version.ref = "retrofit" } +retrofit-json = { module = "com.squareup.retrofit2:converter-kotlinx-serialization", version.ref = "retrofit" } volley = { module = "com.android.volley:volley", version.ref = "volley" } jsoup = {module = "org.jsoup:jsoup", version.ref = "jsoup"}