SharedPreferencesAccountsRepository.kt
package chat.rocket.android.server.infrastructure
import android.content.SharedPreferences
import androidx.core.content.edit
import chat.rocket.android.server.domain.AccountsRepository
import chat.rocket.android.server.domain.model.Account
import com.squareup.moshi.Moshi
import com.squareup.moshi.Types
private const val ACCOUNTS_KEY = "ACCOUNTS_KEY"
class SharedPreferencesAccountsRepository(
private val preferences: SharedPreferences,
private val moshi: Moshi
) : AccountsRepository {
override fun save(account: Account) {
load().filter { it.serverUrl != account.serverUrl }
.toMutableList()
.apply {
add(0, account)
save(this)
}
}
override fun load(): List<Account> {
val json = preferences.getString(ACCOUNTS_KEY, "[]")
val type = Types.newParameterizedType(List::class.java, Account::class.java)
val adapter = moshi.adapter<List<Account>>(type)
return json?.let { adapter.fromJson(it) } ?: emptyList()
}
override fun remove(serverUrl: String) {
save(load().filter { account -> serverUrl != account.serverUrl }.toMutableList())
}
private fun save(accounts: List<Account>) {
val type = Types.newParameterizedType(List::class.java, Account::class.java)
val adapter = moshi.adapter<List<Account>>(type)
preferences.edit { putString(ACCOUNTS_KEY, adapter.toJson(accounts)) }
}
}