Explorar o código

Refactoring: moved code to separate BookCoverCache class

sirekanyan %!s(int64=8) %!d(string=hai) anos
pai
achega
4c3a006958

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

@@ -40,7 +40,7 @@ class BookActivity : AppCompatActivity() {
   private val imageSearch: BookCoverSearch by lazy {
     BookCoverSearchImpl(
         app().imageApi.create(ImageEndpoint::class.java),
-        getSharedPreferences("knigopis", MODE_PRIVATE)
+        BookCoverCacheImpl(applicationContext)
     )
   }
   private var bookId: String? = null

+ 25 - 0
app/src/main/java/me/vadik/knigopis/BookCoverCache.kt

@@ -0,0 +1,25 @@
+package me.vadik.knigopis
+
+import android.content.Context
+import android.content.Context.MODE_PRIVATE
+import io.reactivex.Maybe
+
+private const val PREFERENCES_NAME = "knigopis_thumbnails"
+
+interface BookCoverCache {
+  fun put(bookId: String, url: String)
+  fun find(bookId: String): Maybe<String>
+}
+
+class BookCoverCacheImpl(context: Context) : BookCoverCache {
+
+  private val preferences = context.getSharedPreferences(PREFERENCES_NAME, MODE_PRIVATE)
+
+  override fun put(bookId: String, url: String) =
+      preferences.edit().putString(bookId, url).apply()
+
+  override fun find(bookId: String): Maybe<String> =
+      Maybe.fromCallable {
+        preferences.getString(bookId, null)
+      }
+}

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

@@ -41,7 +41,7 @@ class MainActivity : AppCompatActivity(), Router {
   private val booksAdapter by lazy {
     BooksAdapter(BookCoverSearchImpl(
         app().imageApi.create(ImageEndpoint::class.java),
-        getSharedPreferences("knigopis", MODE_PRIVATE)
+        BookCoverCacheImpl(applicationContext)
     ), api, auth, this)
   }
   private val allBooksAdapter by lazy { booksAdapter.build(allBooks) }

+ 5 - 17
app/src/main/java/me/vadik/knigopis/api/BookCoverSearch.kt

@@ -1,13 +1,12 @@
 package me.vadik.knigopis.api
 
-import android.content.SharedPreferences
 import io.reactivex.Single
+import me.vadik.knigopis.BookCoverCache
 import me.vadik.knigopis.io2main
 import me.vadik.knigopis.model.Book
 import me.vadik.knigopis.model.ImageThumbnail
 import java.util.concurrent.TimeUnit
 
-private const val PREFERENCE_PREFIX = "thumbnail_"
 private const val MAX_DELAY_IN_MICROSECONDS = 3000
 private const val MIN_TITLE_WORDS_COUNT = 2
 
@@ -18,23 +17,18 @@ interface BookCoverSearch {
 
 class BookCoverSearchImpl(
     private val imageEndpoint: ImageEndpoint,
-    private val preferences: SharedPreferences
+    private val bookCoverCache: BookCoverCache
 ) : BookCoverSearch {
 
   override fun search(book: Book): Single<String> =
-      Single.defer {
-        val cachedUrl = getFromCache(book.id)
-        if (cachedUrl == null) {
+      bookCoverCache.find(book.id).switchIfEmpty(
           searchThumbnail(getSearchQuery(book))
               .map { it.first() }
               .map { thumbnailUrl ->
-                saveToCache(book.id, thumbnailUrl)
+                bookCoverCache.put(book.id, thumbnailUrl)
                 thumbnailUrl
               }
-        } else {
-          Single.just(cachedUrl)
-        }
-      }.io2main()
+      ).io2main()
 
   override fun search(query: String) =
       searchThumbnail(query)
@@ -53,10 +47,4 @@ class BookCoverSearchImpl(
           book.title
         }
       }
-
-  private fun saveToCache(bookId: String, url: String) =
-      preferences.edit().putString(PREFERENCE_PREFIX + bookId, url).apply()
-
-  private fun getFromCache(bookId: String) =
-      preferences.getString(PREFERENCE_PREFIX + bookId, null)
 }