Przeglądaj źródła

Added searching book cover when add new book

sirekanyan 8 lat temu
rodzic
commit
02204ae576

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

@@ -6,10 +6,25 @@ import android.support.v7.widget.Toolbar
 import android.view.View
 import android.view.View.*
 import android.widget.CheckBox
+import android.widget.EditText
+import android.widget.ImageView
+import com.bumptech.glide.Glide
+import com.bumptech.glide.request.RequestOptions
+import me.vadik.knigopis.api.BookCoverSearch
+import me.vadik.knigopis.api.BookCoverSearchImpl
+import me.vadik.knigopis.api.ImageEndpoint
 
 class BookActivity : AppCompatActivity() {
 
+  private val imageSearch: BookCoverSearch by lazy {
+    BookCoverSearchImpl(
+        app().imageApi.create(ImageEndpoint::class.java),
+        getSharedPreferences("knigopis", MODE_PRIVATE)
+    )
+  }
   private val toolbar by lazy { findView<Toolbar>(R.id.toolbar) }
+  private val titleEditText by lazy { findView<EditText>(R.id.book_title_edit_text) }
+  private val coverImageView by lazy { findView<ImageView>(R.id.cover_image_view) }
   private val readCheckbox by lazy { findView<CheckBox>(R.id.book_read_checkbox) }
   private val dateInputViews by lazy {
     arrayOf<View>(
@@ -36,6 +51,20 @@ class BookActivity : AppCompatActivity() {
         else -> false
       }
     }
+    titleEditText.setOnFocusChangeListener { _, focus ->
+      val editable = titleEditText.editableText
+      if (!focus && !editable.isEmpty()) {
+        imageSearch.search(editable.toString())
+            .subscribe({ coverUrl ->
+              Glide.with(applicationContext)
+                  .load(coverUrl)
+                  .apply(RequestOptions.centerCropTransform())
+                  .into(coverImageView)
+            }, {
+              logError("cannot load thumbnail", it)
+            })
+      }
+    }
     readCheckbox.setOnCheckedChangeListener { _, checked ->
       dateInputViews.forEach {
         it.visibility = if (checked) VISIBLE else GONE

+ 15 - 6
app/src/main/java/me/vadik/knigopis/api/BookCoverSearch.kt

@@ -4,6 +4,7 @@ import android.content.SharedPreferences
 import io.reactivex.Single
 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_"
@@ -12,6 +13,7 @@ private const val MIN_TITLE_WORDS_COUNT = 2
 
 interface BookCoverSearch {
   fun search(book: Book): Single<String>
+  fun search(query: String): Single<String>
 }
 
 class BookCoverSearchImpl(
@@ -23,18 +25,25 @@ class BookCoverSearchImpl(
       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)
-                }
+          searchThumbnail(getSearchQuery(book))
+              .map { thumbnailUrl ->
+                saveToCache(book.id, thumbnailUrl)
+                thumbnailUrl
               }
         } else {
           Single.just(cachedUrl)
         }
       }.io2main()
 
+  override fun search(query: String) =
+      searchThumbnail(query)
+          .io2main()
+
+  private fun searchThumbnail(query: String) =
+      imageEndpoint.searchImage(query)
+          .delay((Math.random() * MAX_DELAY_IN_MICROSECONDS).toLong(), TimeUnit.MICROSECONDS)
+          .map(ImageThumbnail::url)
+
   private fun getSearchQuery(book: Book) =
       book.title.split(" ").size.let { titleWordsCount ->
         if (titleWordsCount <= MIN_TITLE_WORDS_COUNT) {

+ 2 - 0
app/src/main/res/layout/book_edit.xml

@@ -29,6 +29,7 @@
         app:layout_constraintTop_toBottomOf="@id/app_bar_layout">
 
         <EditText
+            android:id="@+id/book_title_edit_text"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
             android:hint="@string/book_hint_title"
@@ -124,6 +125,7 @@
         tools:checked="true" />
 
     <ImageView
+        android:id="@+id/cover_image_view"
         android:layout_width="0dp"
         android:layout_height="0dp"
         android:layout_margin="16dp"