Explorar o código

Added caching notes in shared preferences

Vadik Sirekanyan %!s(int64=7) %!d(string=hai) anos
pai
achega
6fd8212a0d

+ 3 - 2
app/src/main/java/me/vadik/knigopis/MainActivity.kt

@@ -59,6 +59,7 @@ class MainActivity : AppCompatActivity(), Router {
     private val dialogs by inject<DialogFactory> { mapOf("activity" to this) }
     private val bookRepository by inject<BookRepository>()
     private val userRepository by inject<SubscriptionRepository>()
+    private val noteRepository by inject<NoteRepository>()
     private val resourceProvider by inject<ResourceProvider>()
     private val allBooks = mutableListOf<Book>()
     private val allBookHeaders = mutableListOf<BookHeader>()
@@ -427,14 +428,14 @@ class MainActivity : AppCompatActivity(), Router {
     }
 
     private fun refreshNotesTab() {
-        api.getLatestBooksWithNotes()
+        noteRepository.getNotes()
             .io2main()
             .showProgressBar()
             .subscribe({ notes ->
                 notesPlaceholder.show(notes.isEmpty())
                 notesErrorPlaceholder.hide()
                 allNotes.clear()
-                allNotes.addAll(notes.values)
+                allNotes.addAll(notes)
                 notesAdapter.notifyDataSetChanged()
             }, {
                 logError("cannot load notes", it)

+ 1 - 1
app/src/main/java/me/vadik/knigopis/common/CacheKey.kt

@@ -2,7 +2,7 @@ package me.vadik.knigopis.common
 
 enum class CacheKey {
 
-    PLANNED_BOOKS, FINISHED_BOOKS, SUBSCRIPTIONS;
+    PLANNED_BOOKS, FINISHED_BOOKS, SUBSCRIPTIONS, NOTES;
 
     val storeValue get() = name.toLowerCase()
 

+ 26 - 0
app/src/main/java/me/vadik/knigopis/data/NoteCache.kt

@@ -0,0 +1,26 @@
+package me.vadik.knigopis.data
+
+import io.reactivex.Completable
+import io.reactivex.Maybe
+import me.vadik.knigopis.common.CacheKey
+import me.vadik.knigopis.common.CommonCache
+import me.vadik.knigopis.common.genericType
+import me.vadik.knigopis.model.note.Note
+
+interface NoteCache {
+
+    fun getNotes(): Maybe<List<Note>>
+
+    fun saveNotes(notes: List<Note>): Completable
+
+}
+
+class NoteCacheImpl(private val commonCache: CommonCache) : NoteCache {
+
+    override fun getNotes(): Maybe<List<Note>> =
+        commonCache.getFromJson(CacheKey.NOTES, genericType<List<Note>>())
+
+    override fun saveNotes(notes: List<Note>): Completable =
+        commonCache.saveToJson(CacheKey.NOTES, notes)
+
+}

+ 45 - 0
app/src/main/java/me/vadik/knigopis/data/NoteRepository.kt

@@ -0,0 +1,45 @@
+package me.vadik.knigopis.data
+
+import io.reactivex.Completable
+import io.reactivex.Single
+import me.vadik.knigopis.api.Endpoint
+import me.vadik.knigopis.common.NetworkChecker
+import me.vadik.knigopis.logError
+import me.vadik.knigopis.logWarn
+import me.vadik.knigopis.model.note.Note
+
+interface NoteRepository {
+
+    fun getNotes(): Single<List<Note>>
+
+}
+
+class NoteRepositoryImpl(
+    private val api: Endpoint,
+    private val cache: NoteCache,
+    private val networkChecker: NetworkChecker
+) : NoteRepository {
+
+    override fun getNotes(): Single<List<Note>> =
+        if (networkChecker.isNetworkAvailable()) {
+            getFromNetwork()
+                .doOnSuccess { saveToCache(it).blockingAwait() }
+                .doOnError {
+                    logError("Cannot load notes from network", it)
+                    logWarn("Getting cached notes")
+                }
+                .onErrorResumeNext(findInCache())
+        } else {
+            findInCache()
+        }
+
+    private fun getFromNetwork(): Single<List<Note>> =
+        api.getLatestBooksWithNotes().map { it.values.toList() }
+
+    private fun findInCache(): Single<List<Note>> =
+        cache.getNotes().toSingle()
+
+    private fun saveToCache(notes: List<Note>): Completable =
+        cache.saveNotes(notes)
+
+}

+ 3 - 3
app/src/main/java/me/vadik/knigopis/data/SubscriptionCache.kt

@@ -11,7 +11,7 @@ interface SubscriptionCache {
 
     fun getSubscriptions(): Maybe<List<Subscription>>
 
-    fun saveSubscriptions(planned: List<Subscription>): Completable
+    fun saveSubscriptions(subscriptions: List<Subscription>): Completable
 
 }
 
@@ -20,7 +20,7 @@ class SubscriptionCacheImpl(private val commonCache: CommonCache) : Subscription
     override fun getSubscriptions(): Maybe<List<Subscription>> =
         commonCache.getFromJson(CacheKey.SUBSCRIPTIONS, genericType<List<Subscription>>())
 
-    override fun saveSubscriptions(planned: List<Subscription>): Completable =
-        commonCache.saveToJson(CacheKey.SUBSCRIPTIONS, planned)
+    override fun saveSubscriptions(subscriptions: List<Subscription>): Completable =
+        commonCache.saveToJson(CacheKey.SUBSCRIPTIONS, subscriptions)
 
 }

+ 3 - 1
app/src/main/java/me/vadik/knigopis/dependency/modules.kt

@@ -2,7 +2,7 @@ package me.vadik.knigopis.dependency
 
 import com.google.gson.Gson
 import com.google.gson.GsonBuilder
-import me.vadik.knigopis.*
+import me.vadik.knigopis.BuildConfig
 import me.vadik.knigopis.api.BookCoverSearch
 import me.vadik.knigopis.api.BookCoverSearchImpl
 import me.vadik.knigopis.api.Endpoint
@@ -43,6 +43,7 @@ val appModule = applicationContext {
         ) as BookRepository
     }
     bean { SubscriptionRepositoryImpl(get(), get(), get(), get()) as SubscriptionRepository }
+    bean { NoteRepositoryImpl(get(), get(), get()) as NoteRepository }
     bean { BookCoverSearchImpl(get(), BookCoverCacheImpl(get())) as BookCoverSearch }
     bean { KAuthImpl(get(), get()) as KAuth }
     bean { createMainEndpoint(get()) }
@@ -54,6 +55,7 @@ val appModule = applicationContext {
     bean { NetworkCheckerImpl(get()) as NetworkChecker }
     bean { BookCacheImpl(get()) as BookCache }
     bean { SubscriptionCacheImpl(get()) as SubscriptionCache }
+    bean { NoteCacheImpl(get()) as NoteCache }
     bean { CommonCacheImpl(get(), get()) as CommonCache }
     bean { GsonBuilder().setDateFormat(DATE_FORMAT).create() }
     factory { BottomSheetDialogFactory(it["activity"]) as DialogFactory }