|
@@ -149,8 +149,8 @@ class WebtoonPageHolder(
|
|
|
val page = page ?: return
|
|
|
val loader = page.chapter.pageLoader ?: return
|
|
|
statusSubscription = loader.getPage(page)
|
|
|
- .observeOn(AndroidSchedulers.mainThread())
|
|
|
- .subscribe { processStatus(it) }
|
|
|
+ .observeOn(AndroidSchedulers.mainThread())
|
|
|
+ .subscribe { processStatus(it) }
|
|
|
|
|
|
addSubscription(statusSubscription)
|
|
|
}
|
|
@@ -164,11 +164,11 @@ class WebtoonPageHolder(
|
|
|
val page = page ?: return
|
|
|
|
|
|
progressSubscription = Observable.interval(100, TimeUnit.MILLISECONDS)
|
|
|
- .map { page.progress }
|
|
|
- .distinctUntilChanged()
|
|
|
- .onBackpressureLatest()
|
|
|
- .observeOn(AndroidSchedulers.mainThread())
|
|
|
- .subscribe { value -> progressBar.setProgress(value) }
|
|
|
+ .map { page.progress }
|
|
|
+ .distinctUntilChanged()
|
|
|
+ .onBackpressureLatest()
|
|
|
+ .observeOn(AndroidSchedulers.mainThread())
|
|
|
+ .subscribe { value -> progressBar.setProgress(value) }
|
|
|
|
|
|
addSubscription(progressSubscription)
|
|
|
}
|
|
@@ -266,29 +266,29 @@ class WebtoonPageHolder(
|
|
|
|
|
|
var openStream: InputStream? = null
|
|
|
readImageHeaderSubscription = Observable
|
|
|
- .fromCallable {
|
|
|
- val stream = streamFn().buffered(16)
|
|
|
- openStream = stream
|
|
|
+ .fromCallable {
|
|
|
+ val stream = streamFn().buffered(16)
|
|
|
+ openStream = stream
|
|
|
|
|
|
- ImageUtil.findImageType(stream) == ImageUtil.ImageType.GIF
|
|
|
- }
|
|
|
- .subscribeOn(Schedulers.io())
|
|
|
- .observeOn(AndroidSchedulers.mainThread())
|
|
|
- .doOnNext { isAnimated ->
|
|
|
- if (!isAnimated) {
|
|
|
- val subsamplingView = initSubsamplingImageView()
|
|
|
- subsamplingView.visible()
|
|
|
- subsamplingView.setImage(ImageSource.inputStream(openStream!!))
|
|
|
- } else {
|
|
|
- val imageView = initImageView()
|
|
|
- imageView.visible()
|
|
|
- imageView.setImage(openStream!!)
|
|
|
+ ImageUtil.findImageType(stream) == ImageUtil.ImageType.GIF
|
|
|
}
|
|
|
- }
|
|
|
- // Keep the Rx stream alive to close the input stream only when unsubscribed
|
|
|
- .flatMap { Observable.never<Unit>() }
|
|
|
- .doOnUnsubscribe { openStream?.close() }
|
|
|
- .subscribe({}, {})
|
|
|
+ .subscribeOn(Schedulers.io())
|
|
|
+ .observeOn(AndroidSchedulers.mainThread())
|
|
|
+ .doOnNext { isAnimated ->
|
|
|
+ if (!isAnimated) {
|
|
|
+ val subsamplingView = initSubsamplingImageView()
|
|
|
+ subsamplingView.visible()
|
|
|
+ subsamplingView.setImage(ImageSource.inputStream(openStream!!))
|
|
|
+ } else {
|
|
|
+ val imageView = initImageView()
|
|
|
+ imageView.visible()
|
|
|
+ imageView.setImage(openStream!!)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // Keep the Rx stream alive to close the input stream only when unsubscribed
|
|
|
+ .flatMap { Observable.never<Unit>() }
|
|
|
+ .doOnUnsubscribe { openStream?.close() }
|
|
|
+ .subscribe({}, {})
|
|
|
|
|
|
addSubscription(readImageHeaderSubscription)
|
|
|
}
|
|
@@ -328,7 +328,7 @@ class WebtoonPageHolder(
|
|
|
val size = 48.dpToPx
|
|
|
layoutParams = FrameLayout.LayoutParams(size, size).apply {
|
|
|
gravity = Gravity.CENTER_HORIZONTAL
|
|
|
- setMargins(0, parentHeight/4, 0, 0)
|
|
|
+ setMargins(0, parentHeight / 4, 0, 0)
|
|
|
}
|
|
|
}
|
|
|
progressContainer.addView(progress)
|
|
@@ -389,7 +389,7 @@ class WebtoonPageHolder(
|
|
|
AppCompatButton(context).apply {
|
|
|
layoutParams = FrameLayout.LayoutParams(WRAP_CONTENT, WRAP_CONTENT).apply {
|
|
|
gravity = Gravity.CENTER_HORIZONTAL
|
|
|
- setMargins(0, parentHeight/4, 0, 0)
|
|
|
+ setMargins(0, parentHeight / 4, 0, 0)
|
|
|
}
|
|
|
setText(R.string.action_retry)
|
|
|
setOnClickListener {
|
|
@@ -411,7 +411,7 @@ class WebtoonPageHolder(
|
|
|
|
|
|
val decodeLayout = LinearLayout(context).apply {
|
|
|
layoutParams = LinearLayout.LayoutParams(MATCH_PARENT, parentHeight).apply {
|
|
|
- setMargins(0, parentHeight/6, 0, 0)
|
|
|
+ setMargins(0, parentHeight / 6, 0, 0)
|
|
|
}
|
|
|
gravity = Gravity.CENTER_HORIZONTAL
|
|
|
orientation = LinearLayout.VERTICAL
|
|
@@ -476,36 +476,36 @@ class WebtoonPageHolder(
|
|
|
*/
|
|
|
private fun ImageView.setImage(stream: InputStream) {
|
|
|
GlideApp.with(this)
|
|
|
- .load(stream)
|
|
|
- .skipMemoryCache(true)
|
|
|
- .diskCacheStrategy(DiskCacheStrategy.NONE)
|
|
|
- .transition(DrawableTransitionOptions.with(NoTransition.getFactory()))
|
|
|
- .listener(object : RequestListener<Drawable> {
|
|
|
- override fun onLoadFailed(
|
|
|
- e: GlideException?,
|
|
|
- model: Any?,
|
|
|
- target: Target<Drawable>?,
|
|
|
- isFirstResource: Boolean
|
|
|
- ): Boolean {
|
|
|
- onImageDecodeError()
|
|
|
- return false
|
|
|
- }
|
|
|
+ .load(stream)
|
|
|
+ .skipMemoryCache(true)
|
|
|
+ .diskCacheStrategy(DiskCacheStrategy.NONE)
|
|
|
+ .transition(DrawableTransitionOptions.with(NoTransition.getFactory()))
|
|
|
+ .listener(object : RequestListener<Drawable> {
|
|
|
+ override fun onLoadFailed(
|
|
|
+ e: GlideException?,
|
|
|
+ model: Any?,
|
|
|
+ target: Target<Drawable>?,
|
|
|
+ isFirstResource: Boolean
|
|
|
+ ): Boolean {
|
|
|
+ onImageDecodeError()
|
|
|
+ return false
|
|
|
+ }
|
|
|
|
|
|
- override fun onResourceReady(
|
|
|
- resource: Drawable?,
|
|
|
- model: Any?,
|
|
|
- target: Target<Drawable>?,
|
|
|
- dataSource: DataSource?,
|
|
|
- isFirstResource: Boolean
|
|
|
- ): Boolean {
|
|
|
- if (resource is GifDrawable) {
|
|
|
- resource.setLoopCount(GifDrawable.LOOP_INTRINSIC)
|
|
|
+ override fun onResourceReady(
|
|
|
+ resource: Drawable?,
|
|
|
+ model: Any?,
|
|
|
+ target: Target<Drawable>?,
|
|
|
+ dataSource: DataSource?,
|
|
|
+ isFirstResource: Boolean
|
|
|
+ ): Boolean {
|
|
|
+ if (resource is GifDrawable) {
|
|
|
+ resource.setLoopCount(GifDrawable.LOOP_INTRINSIC)
|
|
|
+ }
|
|
|
+ onImageDecoded()
|
|
|
+ return false
|
|
|
}
|
|
|
- onImageDecoded()
|
|
|
- return false
|
|
|
- }
|
|
|
- })
|
|
|
- .into(this)
|
|
|
+ })
|
|
|
+ .into(this)
|
|
|
}
|
|
|
|
|
|
}
|