Переглянути джерело

Added view pager for selecting book cover

sirekanyan 8 роки тому
батько
коміт
f5bd7ff373

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

@@ -3,16 +3,14 @@ package me.vadik.knigopis
 import android.content.Context
 import android.content.Intent
 import android.os.Bundle
+import android.support.v4.view.ViewPager
 import android.support.v7.app.AppCompatActivity
 import android.support.v7.widget.Toolbar
 import android.view.View
 import android.view.View.GONE
 import android.view.View.VISIBLE
 import android.widget.CheckBox
-import android.widget.ImageView
 import android.widget.TextView
-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.Endpoint
@@ -22,6 +20,8 @@ import me.vadik.knigopis.auth.KAuthImpl
 import me.vadik.knigopis.model.FinishedBookToSend
 import me.vadik.knigopis.model.PlannedBookToSend
 
+private const val IMAGE_PRELOAD_COUNT = 3
+
 fun Context.createBookIntent() = Intent(this, BookActivity::class.java)
 
 class BookActivity : AppCompatActivity() {
@@ -41,7 +41,11 @@ class BookActivity : AppCompatActivity() {
   private val monthEditText by lazy { findView<TextView>(R.id.book_month_edit_text) }
   private val yearEditText by lazy { findView<TextView>(R.id.book_year_edit_text) }
   private val readCheckbox by lazy { findView<CheckBox>(R.id.book_read_checkbox) }
-  private val coverImageView by lazy { findView<ImageView>(R.id.cover_image_view) }
+  private val coverViewPager by lazy {
+    findView<ViewPager>(R.id.cover_image_views).apply {
+      offscreenPageLimit = IMAGE_PRELOAD_COUNT
+    }
+  }
   private val notesTextArea by lazy { findView<TextView>(R.id.notes_text_area) }
   private val dateInputViews by lazy {
     arrayOf<View>(
@@ -90,11 +94,8 @@ class BookActivity : AppCompatActivity() {
       val editable = titleEditText.editableText
       if (!focus && !editable.isEmpty()) {
         imageSearch.search(editable.toString())
-            .subscribe({ coverUrl ->
-              Glide.with(applicationContext)
-                  .load(coverUrl)
-                  .apply(RequestOptions.centerCropTransform())
-                  .into(coverImageView)
+            .subscribe({ urls ->
+              coverViewPager.adapter = CoverPagerAdapter(urls)
             }, {
               logError("cannot load thumbnail", it)
             })

+ 34 - 0
app/src/main/java/me/vadik/knigopis/CoverPagerAdapter.kt

@@ -0,0 +1,34 @@
+package me.vadik.knigopis
+
+import android.support.v4.view.PagerAdapter
+import android.view.View
+import android.view.ViewGroup
+import android.view.ViewGroup.LayoutParams
+import android.view.ViewGroup.LayoutParams.*
+import android.widget.ImageView
+import com.bumptech.glide.Glide
+import com.bumptech.glide.request.RequestOptions
+
+class CoverPagerAdapter(private val urls: List<String>) : PagerAdapter() {
+
+  override fun instantiateItem(container: ViewGroup, position: Int): Any {
+    val context = container.context
+    val imageView = ImageView(context).apply {
+      layoutParams = LayoutParams(MATCH_PARENT, MATCH_PARENT)
+    }
+    Glide.with(context)
+        .load(urls[position])
+        .apply(RequestOptions.centerCropTransform())
+        .into(imageView)
+    container.addView(imageView)
+    return imageView
+  }
+
+  override fun destroyItem(container: ViewGroup, position: Int, obj: Any) {
+    container.removeView(obj as ImageView)
+  }
+
+  override fun isViewFromObject(view: View, obj: Any) = obj == view
+
+  override fun getCount() = urls.size
+}

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

@@ -13,7 +13,7 @@ private const val MIN_TITLE_WORDS_COUNT = 2
 
 interface BookCoverSearch {
   fun search(book: Book): Single<String>
-  fun search(query: String): Single<String>
+  fun search(query: String): Single<List<String>>
 }
 
 class BookCoverSearchImpl(
@@ -26,6 +26,7 @@ class BookCoverSearchImpl(
         val cachedUrl = getFromCache(book.id)
         if (cachedUrl == null) {
           searchThumbnail(getSearchQuery(book))
+              .map { it.first() }
               .map { thumbnailUrl ->
                 saveToCache(book.id, thumbnailUrl)
                 thumbnailUrl
@@ -43,7 +44,6 @@ class BookCoverSearchImpl(
       imageEndpoint.searchImage(query)
           .delay((Math.random() * MAX_DELAY_IN_MICROSECONDS).toLong(), TimeUnit.MICROSECONDS)
           .map(ImageThumbnail::urls)
-          .map(List<String>::first)
 
   private fun getSearchQuery(book: Book) =
       book.title.split(" ").size.let { titleWordsCount ->

+ 3 - 4
app/src/main/res/layout/book_edit.xml

@@ -145,8 +145,8 @@
 
     </android.support.design.widget.TextInputLayout>
 
-    <ImageView
-        android:id="@+id/cover_image_view"
+    <android.support.v4.view.ViewPager
+        android:id="@+id/cover_image_views"
         android:layout_width="0dp"
         android:layout_height="0dp"
         android:layout_margin="16dp"
@@ -154,7 +154,6 @@
         app:layout_constraintLeft_toLeftOf="parent"
         app:layout_constraintRight_toRightOf="parent"
         app:layout_constraintTop_toBottomOf="@id/notes_text_input"
-        tools:ignore="ContentDescription"
-        tools:src="@color/colorAccent" />
+        tools:background="@color/colorAccent" />
 
 </android.support.constraint.ConstraintLayout>