Skip to content

Commit

Permalink
Stream Episode 19 (#84)
Browse files Browse the repository at this point in the history
* Final touches on frameworkLocalStorageTest

Still missing clear all, getAll and make sure observeSharedPreferencesChanges
emitts for any changes (missing tests basically).

#17, #69

* Add episode to README

#84
  • Loading branch information
JoaquimLey authored Oct 28, 2018
1 parent 77e83b5 commit a9aff4e
Show file tree
Hide file tree
Showing 9 changed files with 206 additions and 99 deletions.
2 changes: 2 additions & 0 deletions README.MD
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,8 @@ Since I'm always working on some side-projects, I decided to document the progre

- Ep.18: https://github.com/JoaquimLey/transport-eta/pull/83

- Ep.19: https://github.com/JoaquimLey/transport-eta/pull/84

## About the author
Hi, my name is **Joaquim Ley**, I'm a Software Engineer (Android).

Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -34,11 +34,21 @@ class FrameworkLocalStorageImpl @Inject constructor(private val sharedPreference
}

override fun deleteTransport(transportEntityId: String): Completable {
return Completable.complete()
return Completable.fromAction {
if (getTransportFromSharedPreferences(transportEntityId).not()) {
throw Throwable("No transport found")
}
}
}

override fun getTransport(transportEntityId: String): Single<TransportEntity> {
return Single.just(TransportEntity("hi", "mock", 2, "el", true, "bus"))
return Single.defer {

// TODO - Should this single return a nullable TransportEntity instead of Error?
Single.just(getFromSharedPrefs(transportEntityId)?.let { mapper.toEntity(it) }
?: throw Throwable("Not found transport with id $transportEntityId")
)
}
}

override fun getAll(): Single<List<TransportEntity>> {
Expand All @@ -51,57 +61,87 @@ class FrameworkLocalStorageImpl @Inject constructor(private val sharedPreference
}

override fun clearAll(): Completable {
return Completable.fromAction {

}
throw NotImplementedError()
// return Completable.fromAction {
//
// }
}

private fun observeSharedPreferencesChanges() {
sharedPreferences.registerOnSharedPreferenceChangeListener { _, key ->
if (key != SHARED_PREFERENCES_LAST_UPDATED) {
loadAll()
}
sharedPreferences.registerOnSharedPreferenceChangeListener { _, _ ->
loadAll()
}
}

private fun loadAll() {
getFromSharedPrefs(Slot.ONE)?.let { data[Slot.ONE] = mapper.fromCacheString(it) }
getFromSharedPrefs(Slot.TWO)?.let { data[Slot.TWO] = mapper.fromCacheString(it) }
getFromSharedPrefs(Slot.THREE)?.let { data[Slot.THREE] = mapper.fromCacheString(it) }
getFromSharedPrefs(Slot.SAVE_SLOT_ONE)?.let { data[Slot.SAVE_SLOT_ONE] = mapper.fromCacheString(it) }
getFromSharedPrefs(Slot.SAVE_SLOT_TWO)?.let { data[Slot.SAVE_SLOT_TWO] = mapper.fromCacheString(it) }
getFromSharedPrefs(Slot.SAVE_SLOT_THREE)?.let { data[Slot.SAVE_SLOT_THREE] = mapper.fromCacheString(it) }

sharedPreferencesObservable
.onNext(data.values.filterNotNull().map { mapper.toEntity(it) })
}

private fun saveToSharedPrefs(sharedPrefTransport: SharedPrefTransport): Boolean {
return getFreeSlot()?.let {
return getSlot()?.let {
sharedPreferences.edit()
.putString(it.slotName, mapper.toCacheString(sharedPrefTransport))
.putString(it.name, mapper.toCacheString(sharedPrefTransport))
.apply()
true
} ?: false
}

private fun getFreeSlot(): Slot? {
private fun getTransportFromSharedPreferences(transportEntityId: String): Boolean {
return getFromSharedPrefs(transportEntityId)?.let {
removeFromSharedPreferences(it.slot)
true
} ?: false
}

private fun removeFromSharedPreferences(slot: Slot?) {
slot?.let {
sharedPreferences.edit()
.remove(it.name)
.apply()
}
}

private fun getSlot(): Slot? {
// TODO Improve this, also check for updates
return when {
getFromSharedPrefs(Slot.ONE) == null -> Slot.ONE
getFromSharedPrefs(Slot.TWO) == null -> Slot.TWO
getFromSharedPrefs(Slot.THREE) == null -> Slot.THREE
getFromSharedPrefs(Slot.SAVE_SLOT_ONE) == null -> Slot.SAVE_SLOT_ONE
getFromSharedPrefs(Slot.SAVE_SLOT_TWO) == null -> Slot.SAVE_SLOT_TWO
getFromSharedPrefs(Slot.SAVE_SLOT_THREE) == null -> Slot.SAVE_SLOT_THREE
else -> null
}
}

private fun getFromSharedPrefs(slot: Slot): String? {
return sharedPreferences.getString(slot.slotName, null)
return sharedPreferences.getString(slot.name, null)
}

companion object {
private const val SHARED_PREFERENCES_LAST_UPDATED = "sharedpreferences.last_updated"
// TODO Improve this
private fun getFromSharedPrefs(transportId: String): SharedPrefTransport? {
val dataFromSlotOne = getFromSharedPrefs(Slot.SAVE_SLOT_ONE)?.let { mapper.fromCacheString(it) }
if (dataFromSlotOne?.id == transportId) {
return dataFromSlotOne
}

val dataFromSlotTwo = getFromSharedPrefs(Slot.SAVE_SLOT_TWO)?.let { mapper.fromCacheString(it) }
if (dataFromSlotTwo?.id == transportId) {
return dataFromSlotTwo
}

val dataFromSlotThree = getFromSharedPrefs(Slot.SAVE_SLOT_THREE)?.let { mapper.fromCacheString(it) }
if (dataFromSlotThree?.id == transportId) {
return dataFromSlotThree
}
return null
}

enum class Slot(val slotName: String) {
ONE("transport_eta_fav_1"),
TWO("transport_eta_fav_2"),
THREE("transport_eta_fav_3"),
enum class Slot {
SAVE_SLOT_ONE,
SAVE_SLOT_TWO,
SAVE_SLOT_THREE,
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ class SharedPrefTransportMapper {
}

fun toSharedPref(from: TransportEntity): SharedPrefTransport {
return SharedPrefTransport(from.id, from.name, from.code, from.latestEta, from.isFavorite, from.type, 1312, "")
return SharedPrefTransport(from.id, from.name, from.code, from.latestEta, from.isFavorite, from.type, from.latestEta)
}

fun toEntity(from: List<SharedPrefTransport>): List<TransportEntity> {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package com.joaquimley.transporteta.sharedpreferences.model

import com.joaquimley.transporteta.sharedpreferences.FrameworkLocalStorageImpl

@kotlinx.serialization.Serializable
data class SharedPrefTransport(val id: String, val name: String, val code: Int, val latestEta: String,
val isFavorite: Boolean = false, val type: String, val lastUpdated: Long,
val slot: String)
val isFavorite: Boolean = false, val type: String, val lastUpdated: String,
val slot: FrameworkLocalStorageImpl.Slot? = null)
Loading

0 comments on commit a9aff4e

Please sign in to comment.