Kaynağa Gözat

Refactoring: moved cover-search to separate class

sirekanyan 8 yıl önce
ebeveyn
işleme
ec105ffc49

+ 51 - 0
app/src/main/java/me/vadik/knigopis/BookCoverSearch.kt

@@ -0,0 +1,51 @@
+package me.vadik.knigopis
+
+import android.content.SharedPreferences
+import io.reactivex.Single
+import me.vadik.knigopis.model.Book
+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 = 1
+
+interface BookCoverSearch {
+  fun search(book: Book): Single<String>
+}
+
+class BookCoverSearchImpl(
+    private val imageEndpoint: ImageEndpoint,
+    private val preferences: SharedPreferences
+) : BookCoverSearch {
+
+  override fun search(book: Book): Single<String> =
+      Single.defer {
+        val cachedUrl = getFromCache(book.id)
+        if (cachedUrl == null) {
+          imageEndpoint.searchImage(getSearchQuery(book))
+              .delay((Math.random() * MAX_DELAY_IN_MICROSECONDS).toLong(), TimeUnit.MICROSECONDS)
+              .map { thumbnail ->
+                thumbnail.url.also { url ->
+                  saveToCache(book.id, url)
+                }
+              }
+        } else {
+          Single.just(cachedUrl)
+        }
+      }.io2main()
+
+  private fun getSearchQuery(book: Book) =
+      book.title.split(" ").size.let { titleWordsCount ->
+        if (titleWordsCount <= MIN_TITLE_WORDS_COUNT) {
+          "${book.title} ${book.author}"
+        } else {
+          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)
+}

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

@@ -29,10 +29,10 @@ class MainActivity : AppCompatActivity() {
   private val plannedBooks = mutableListOf<PlannedBook>()
   private val usersAdapter = UsersAdapter.create(users)
   private val booksAdapter by lazy {
-    BooksAdapter(
+    BooksAdapter(BookCoverSearchImpl(
         app().imageApi.create(ImageEndpoint::class.java),
         getSharedPreferences("knigopis", MODE_PRIVATE)
-    )
+    ))
   }
   private val finishedBooksAdapter by lazy { booksAdapter.build(finishedBooks) }
   private val plannedBooksAdapter by lazy { booksAdapter.build(plannedBooks) }

+ 5 - 31
app/src/main/java/me/vadik/knigopis/adapters/BooksAdapter.kt

@@ -1,48 +1,22 @@
 package me.vadik.knigopis.adapters
 
-import android.content.SharedPreferences
 import android.widget.ImageView
 import android.widget.TextView
 import com.bumptech.glide.Glide
 import com.bumptech.glide.request.RequestOptions
-import io.reactivex.Single
-import me.vadik.knigopis.ImageEndpoint
+import me.vadik.knigopis.BookCoverSearch
 import me.vadik.knigopis.R
-import me.vadik.knigopis.io2main
 import me.vadik.knigopis.logError
 import me.vadik.knigopis.model.Book
-import java.util.concurrent.TimeUnit
 
-class BooksAdapter(
-    private val imageEndpoint: ImageEndpoint,
-    private val preferences: SharedPreferences
-) {
+class BooksAdapter(private val coverSearch: BookCoverSearch) {
 
   fun build(books: List<Book>) = Adapter(books, R.layout.book)
       .bind<ImageView>(R.id.book_image) { book ->
-        val cachedUrl = preferences.getString("book${book.id}", null)
-        Single.defer {
-          if (cachedUrl == null) {
-            val titleWordsCount = book.title.split(" ").size
-            val searchQuery = if (titleWordsCount < 2) {
-              "${book.title} ${book.author}"
-            } else {
-              book.title
-            }
-            imageEndpoint.searchImage(searchQuery)
-                .delay((Math.random() * 3000).toLong(), TimeUnit.MICROSECONDS)
-                .map { thumbnail ->
-                  ("https:" + thumbnail.url).also {
-                    preferences.edit().putString("book${book.id}", it).apply()
-                  }
-                }
-          } else {
-            Single.just(cachedUrl)
-          }
-        }.io2main()
-            .subscribe({ thumbnailUrl ->
+        coverSearch.search(book)
+            .subscribe({ coverUrl ->
               Glide.with(context)
-                  .load(thumbnailUrl)
+                  .load(coverUrl)
                   .apply(RequestOptions.circleCropTransform())
                   .into(this)
             }, {

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

@@ -15,6 +15,6 @@ class ImageThumbnailDeserializer : JsonDeserializer<ImageThumbnail> {
           .getAsJsonArray("items")
           .firstOrNull()
           ?.asJsonObject
-          ?.let { ImageThumbnail(it["thumbnail"].asString) }
+          ?.let { ImageThumbnail("https:" + it["thumbnail"].asString) }
           ?: emptyThumbnail
 }