Skip to content

Commit

Permalink
Gson -> Kotlinx.serialization
Browse files Browse the repository at this point in the history
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
  • Loading branch information
terrakok committed Feb 2, 2025
1 parent 1ca581d commit 908c33e
Show file tree
Hide file tree
Showing 51 changed files with 495 additions and 372 deletions.
3 changes: 1 addition & 2 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
Original file line number Diff line number Diff line change
@@ -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<AccessToken> {
override fun toModel(): AccessToken {
return AccessToken(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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<String>?,
@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<String>?,
@SerialName("statuses_count") val statusesCount: Int?,
@SerialName("url") val url: String?,
@SerialName("username") val username: String?,
@SerialName("website") val website: String?
) : DtoInterface<Account> {
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()
)
}
Expand Down
Original file line number Diff line number Diff line change
@@ -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<ReplyDto>
@SerialName("data") val data: List<ReplyDto>
)
Original file line number Diff line number Diff line change
Expand Up @@ -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<Application> {
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 ?: ""
)
}
}
Original file line number Diff line number Diff line change
@@ -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<MessageDto>,
Expand Down
Original file line number Diff line number Diff line change
@@ -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<Collection> {
override fun toModel(): Collection {
return Collection(
Expand Down
Original file line number Diff line number Diff line change
@@ -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<Configuration> {
override fun toModel(): Configuration {
return Configuration(
Expand Down
Original file line number Diff line number Diff line change
@@ -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<AccountDto>,
@SerializedName("last_status") val lastPost: PostDto
@SerialName("last_status") val lastPost: PostDto
) : DtoInterface<Conversation> {
override fun toModel(): Conversation {
return Conversation(
Expand Down
Original file line number Diff line number Diff line change
@@ -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,
Expand Down
Original file line number Diff line number Diff line change
@@ -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
Expand Down
Original file line number Diff line number Diff line change
@@ -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<String> {
override fun toModel(): String {
return name
Expand Down
Original file line number Diff line number Diff line change
@@ -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
)
Original file line number Diff line number Diff line change
@@ -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<RuleDto>,
@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<RuleDto>,
@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<Instance> {
override fun toModel(): Instance {
Expand Down
Original file line number Diff line number Diff line change
@@ -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<InstanceStats> {
override fun toModel(): InstanceStats {
return InstanceStats(
Expand Down
Original file line number Diff line number Diff line change
@@ -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?
)
Original file line number Diff line number Diff line change
Expand Up @@ -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<License> {
override fun toModel(): License {
return License(
Expand Down
Loading

0 comments on commit 908c33e

Please sign in to comment.