浏览代码

Removed book cover search

Vadik Sirekanyan 7 年之前
父节点
当前提交
e3fb435e73

+ 34 - 0
app/src/main/java/me/vadik/knigopis/common/extensions/image_view.kt

@@ -1,9 +1,15 @@
 package me.vadik.knigopis.common.extensions
 
+import android.content.Context
+import android.graphics.drawable.Drawable
 import android.widget.ImageView
 import com.bumptech.glide.Glide
+import com.bumptech.glide.load.DataSource
+import com.bumptech.glide.load.engine.GlideException
 import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions
+import com.bumptech.glide.request.RequestListener
 import com.bumptech.glide.request.RequestOptions
+import com.bumptech.glide.request.target.Target
 import me.vadik.knigopis.R
 
 fun ImageView.setCircleImage(url: String?, isDark: Boolean = false) {
@@ -34,4 +40,32 @@ fun ImageView.setSquareImage(url: String?) {
         )
         .transition(DrawableTransitionOptions.withCrossFade())
         .into(this)
+}
+
+fun Context.preloadImage(url: String?, onSuccess: () -> Unit, onError: () -> Unit) {
+    Glide.with(this)
+        .load(url)
+        .listener(object : RequestListener<Drawable> {
+            override fun onResourceReady(
+                resource: Drawable?,
+                model: Any?,
+                target: Target<Drawable>?,
+                dataSource: DataSource?,
+                isFirstResource: Boolean
+            ): Boolean {
+                onSuccess()
+                return false
+            }
+
+            override fun onLoadFailed(
+                e: GlideException?,
+                model: Any?,
+                target: Target<Drawable>?,
+                isFirstResource: Boolean
+            ): Boolean {
+                onError()
+                return false
+            }
+        })
+        .preload()
 }

+ 0 - 28
app/src/main/java/me/vadik/knigopis/common/utils.kt

@@ -14,11 +14,6 @@ import android.text.Spanned
 import android.util.Log
 import android.view.View
 import android.widget.ProgressBar
-import com.bumptech.glide.RequestBuilder
-import com.bumptech.glide.load.DataSource
-import com.bumptech.glide.load.engine.GlideException
-import com.bumptech.glide.request.RequestListener
-import com.bumptech.glide.request.target.Target
 import io.reactivex.Completable
 import io.reactivex.Single
 import io.reactivex.android.schedulers.AndroidSchedulers
@@ -43,29 +38,6 @@ fun Completable.io2main(): Completable =
 
 fun String.orDefault(default: String) = if (isEmpty()) default else this
 
-fun <T> RequestBuilder<T>.doOnSuccess(onSuccess: () -> Unit): RequestBuilder<T> =
-    listener(object : RequestListener<T> {
-        override fun onResourceReady(
-            resource: T?,
-            model: Any?,
-            target: Target<T>?,
-            dataSource: DataSource?,
-            isFirstResource: Boolean
-        ): Boolean {
-            onSuccess()
-            return false
-        }
-
-        override fun onLoadFailed(
-            e: GlideException?,
-            model: Any?,
-            target: Target<T>?,
-            isFirstResource: Boolean
-        ): Boolean {
-            return false
-        }
-    })
-
 fun View.setElevationRes(@DimenRes elevation: Int) {
     ViewCompat.setElevation(this, resources.getDimensionPixelSize(elevation).toFloat())
 }

+ 0 - 23
app/src/main/java/me/vadik/knigopis/dependency.kt

@@ -11,16 +11,11 @@ import me.vadik.knigopis.common.view.dialog.DialogFactory
 import me.vadik.knigopis.feature.user.UserInteractor
 import me.vadik.knigopis.feature.user.UserInteractorImpl
 import me.vadik.knigopis.repository.*
-import me.vadik.knigopis.repository.api.BookCoverSearch
-import me.vadik.knigopis.repository.api.BookCoverSearchImpl
 import me.vadik.knigopis.repository.api.Endpoint
-import me.vadik.knigopis.repository.api.ImageEndpoint
-import me.vadik.knigopis.repository.api.gson.ImageThumbnailDeserializer
 import me.vadik.knigopis.repository.cache.*
 import me.vadik.knigopis.repository.cache.common.CommonCache
 import me.vadik.knigopis.repository.cache.common.CommonCacheImpl
 import me.vadik.knigopis.repository.model.FinishedBook
-import me.vadik.knigopis.repository.model.ImageThumbnail
 import me.vadik.knigopis.repository.model.PlannedBook
 import okhttp3.OkHttpClient
 import okhttp3.logging.HttpLoggingInterceptor
@@ -31,7 +26,6 @@ import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory
 import retrofit2.converter.gson.GsonConverterFactory
 
 private const val MAIN_API_URL = "http://api.knigopis.com"
-private const val IMAGE_API_URL = "https://api.qwant.com/api/"
 private const val DATE_FORMAT = "yyyy-MM-dd HH:mm:ss"
 
 val appModule = applicationContext {
@@ -47,10 +41,8 @@ val appModule = applicationContext {
     }
     bean { SubscriptionRepositoryImpl(get(), get(), get(), get()) as SubscriptionRepository }
     bean { NoteRepositoryImpl(get(), get(), get()) as NoteRepository }
-    bean { BookCoverSearchImpl(get()) as BookCoverSearch }
     bean { KAuthImpl(get(), get()) as KAuth }
     bean { createMainEndpoint(get()) }
-    bean { createImageEndpoint() }
     bean("planned") { PlannedBookOrganizerImpl(get(), get()) as BookOrganizer<PlannedBook> }
     bean("finished") { FinishedBookPrepareImpl(get()) as BookOrganizer<FinishedBook> }
     bean { ConfigurationImpl(get()) as Configuration }
@@ -84,21 +76,6 @@ private fun createMainEndpoint(gson: Gson) =
         .build()
         .create(Endpoint::class.java)
 
-private fun createImageEndpoint() =
-    Retrofit.Builder()
-        .baseUrl(IMAGE_API_URL)
-        .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
-        .addConverterFactory(
-            GsonConverterFactory.create(
-                GsonBuilder().registerTypeAdapter(
-                    ImageThumbnail::class.java,
-                    ImageThumbnailDeserializer()
-                ).create()
-            )
-        )
-        .build()
-        .create(ImageEndpoint::class.java)
-
 private fun OkHttpClient.Builder.setDebugEnabled(debugEnabled: Boolean) =
     apply {
         if (debugEnabled) {

+ 15 - 25
app/src/main/java/me/vadik/knigopis/feature/book/BookActivity.kt

@@ -4,20 +4,15 @@ import android.content.Context
 import android.content.Intent
 import android.os.Bundle
 import android.support.v7.app.AppCompatActivity
-import android.view.View.INVISIBLE
-import android.view.View.VISIBLE
 import android.widget.SeekBar
 import android.widget.SeekBar.OnSeekBarChangeListener
 import kotlinx.android.synthetic.main.book_edit.*
 import me.vadik.knigopis.R
 import me.vadik.knigopis.common.*
-import me.vadik.knigopis.common.extensions.hideKeyboard
-import me.vadik.knigopis.common.extensions.hideNow
-import me.vadik.knigopis.common.extensions.showNow
-import me.vadik.knigopis.common.extensions.toast
+import me.vadik.knigopis.common.extensions.*
 import me.vadik.knigopis.repository.BookRepository
 import me.vadik.knigopis.repository.Configuration
-import me.vadik.knigopis.repository.api.BookCoverSearch
+import me.vadik.knigopis.repository.api.createBookImageUrl
 import me.vadik.knigopis.repository.model.FinishedBook
 import me.vadik.knigopis.repository.model.FinishedBookToSend
 import me.vadik.knigopis.repository.model.PlannedBook
@@ -25,7 +20,6 @@ import me.vadik.knigopis.repository.model.PlannedBookToSend
 import org.koin.android.ext.android.inject
 import java.util.*
 
-private const val IMAGE_PRELOAD_COUNT = 3
 private const val EXTRA_BOOK_ID = "me.vadik.knigopis.extra_book_id"
 private const val EXTRA_BOOK_TITLE = "me.vadik.knigopis.extra_book_title"
 private const val EXTRA_BOOK_AUTHOR = "me.vadik.knigopis.extra_book_author"
@@ -69,7 +63,6 @@ class BookActivity : AppCompatActivity() {
 
     private val config by inject<Configuration>()
     private val repository by inject<BookRepository>()
-    private val imageSearch by inject<BookCoverSearch>()
     private val today = Calendar.getInstance()
     private var bookId: String? = null
 
@@ -141,23 +134,16 @@ class BookActivity : AppCompatActivity() {
                 else -> false
             }
         }
-        coverImageViews.offscreenPageLimit = IMAGE_PRELOAD_COUNT
         titleEditText.setOnFocusChangeListener { _, focus ->
             val editable = titleEditText.editableText
-            if (!focus && !editable.isEmpty()) {
-                imageSearch.search(editable.toString())
-                    .subscribe({ urls ->
-                        coverImageViews.visibility = INVISIBLE
-                        coverImageViews.adapter = CoverPagerAdapter(urls,
-                            onClick = { position, last ->
-                                coverImageViews.currentItem = if (last) 0 else position + 1
-                            },
-                            onFirstLoaded = {
-                                coverImageViews.visibility = VISIBLE
-                            })
-                    }, {
-                        logError("cannot load thumbnail", it)
-                    })
+            if (!focus) {
+                val url = createBookImageUrl(editable.toString())
+                preloadImage(url, {
+                    bookImage.showNow()
+                    bookImage.setSquareImage(url)
+                }, {
+                    bookImage.hideNow()
+                })
             }
         }
         progressSeekBar.setOnSeekBarChangeListener(object : OnSeekBarChangeListener {
@@ -179,7 +165,11 @@ class BookActivity : AppCompatActivity() {
                 }
             }
         })
-        titleEditText.setText(intent.getStringExtra(EXTRA_BOOK_TITLE))
+        intent.getStringExtra(EXTRA_BOOK_TITLE)?.let { title ->
+            titleEditText.setText(title)
+            bookImage.showNow()
+            bookImage.setSquareImage(createBookImageUrl(title))
+        }
         authorEditText.setText(intent.getStringExtra(EXTRA_BOOK_AUTHOR))
         progressSeekBar.setProgressSmoothly(intent.getIntExtra(EXTRA_BOOK_PROGRESS, 0))
         if (bookId != null) {

+ 0 - 45
app/src/main/java/me/vadik/knigopis/feature/book/CoverPagerAdapter.kt

@@ -1,45 +0,0 @@
-package me.vadik.knigopis.feature.book
-
-import android.support.v4.view.PagerAdapter
-import android.view.View
-import android.view.ViewGroup
-import android.view.ViewGroup.LayoutParams
-import android.view.ViewGroup.LayoutParams.MATCH_PARENT
-import android.widget.ImageView
-import com.bumptech.glide.Glide
-import com.bumptech.glide.request.RequestOptions
-import me.vadik.knigopis.common.doOnSuccess
-
-class CoverPagerAdapter(
-    private val urls: List<String>,
-    private val onClick: (Int, Boolean) -> Unit,
-    private val onFirstLoaded: () -> Unit
-) : PagerAdapter() {
-
-    override fun instantiateItem(container: ViewGroup, position: Int): Any {
-        val context = container.context
-        val imageView = ImageView(context).apply {
-            layoutParams = LayoutParams(MATCH_PARENT, MATCH_PARENT)
-            setOnClickListener { onClick(position, position == urls.size - 1) }
-        }
-        Glide.with(context)
-            .load(urls[position])
-            .doOnSuccess {
-                if (position == 0) {
-                    onFirstLoaded()
-                }
-            }
-            .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
-}

+ 0 - 27
app/src/main/java/me/vadik/knigopis/repository/api/BookCoverSearch.kt

@@ -1,27 +0,0 @@
-package me.vadik.knigopis.repository.api
-
-import io.reactivex.Single
-import me.vadik.knigopis.common.io2main
-import me.vadik.knigopis.repository.model.ImageThumbnail
-import java.util.concurrent.TimeUnit
-
-private const val MAX_DELAY_IN_MICROSECONDS = 3000
-
-interface BookCoverSearch {
-
-    fun search(query: String): Single<List<String>>
-
-}
-
-class BookCoverSearchImpl(private val imageEndpoint: ImageEndpoint) : BookCoverSearch {
-
-    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::urls)
-
-}

+ 0 - 15
app/src/main/java/me/vadik/knigopis/repository/api/ImageEndpoint.kt

@@ -1,15 +0,0 @@
-package me.vadik.knigopis.repository.api
-
-import io.reactivex.Single
-import me.vadik.knigopis.repository.model.ImageThumbnail
-import retrofit2.http.GET
-import retrofit2.http.Query
-
-interface ImageEndpoint {
-
-    @GET("search/images")
-    fun searchImage(
-        @Query("q") query: String,
-        @Query("count") count: Int = 10
-    ): Single<ImageThumbnail>
-}

+ 6 - 5
app/src/main/res/layout/book_edit.xml

@@ -39,7 +39,7 @@
                 android:layout_marginTop="16dp"
                 android:hint="@string/book.hint.title"
                 app:layout_constraintLeft_toLeftOf="parent"
-                app:layout_constraintRight_toLeftOf="@id/coverImageViews"
+                app:layout_constraintRight_toLeftOf="@id/bookImage"
                 app:layout_constraintTop_toTopOf="parent">
 
                 <EditText
@@ -60,7 +60,7 @@
                 android:layout_marginTop="16dp"
                 android:hint="@string/book.hint.author"
                 app:layout_constraintLeft_toLeftOf="parent"
-                app:layout_constraintRight_toLeftOf="@id/coverImageViews"
+                app:layout_constraintRight_toLeftOf="@id/bookImage"
                 app:layout_constraintTop_toBottomOf="@id/book_title_input">
 
                 <EditText
@@ -73,18 +73,19 @@
 
             </android.support.design.widget.TextInputLayout>
 
-            <android.support.v4.view.ViewPager
-                android:id="@+id/coverImageViews"
+            <ImageView
+                android:id="@+id/bookImage"
                 android:layout_width="0dp"
                 android:layout_height="0dp"
                 android:layout_marginEnd="16dp"
                 android:layout_marginStart="16dp"
+                android:background="@drawable/rectangle_placeholder_background"
                 android:visibility="gone"
                 app:layout_constraintBottom_toBottomOf="@id/book_author_input"
                 app:layout_constraintDimensionRatio="3:4"
                 app:layout_constraintRight_toRightOf="parent"
                 app:layout_constraintTop_toTopOf="@id/book_title_input"
-                tools:background="@color/colorAccent"
+                tools:ignore="ContentDescription"
                 tools:visibility="visible" />
 
             <TextView