From ba069d8f8e676e17f0d3c341ca758e0c3c2c03c7 Mon Sep 17 00:00:00 2001 From: Pupil Date: Fri, 14 Feb 2020 20:10:04 +0900 Subject: [PATCH] Image loading optimization --- app/build.gradle | 11 +- app/proguard-rules.pro | 9 +- .../pupil/adapters/GalleryBlockAdapter.kt | 6 +- .../quaver/pupil/adapters/ReaderAdapter.kt | 103 ++++++++---------- app/src/main/res/layout/item_reader.xml | 2 + 5 files changed, 69 insertions(+), 62 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 6d43957f..f07e94e3 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -32,10 +32,13 @@ android { versionNameSuffix "-DEBUG" buildConfigField('Boolean', 'CENSOR', 'false') + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } release { minifyEnabled true shrinkResources true + + buildConfigField('Boolean', 'CENSOR', 'false') proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } @@ -71,16 +74,18 @@ dependencies { implementation 'com.crashlytics.sdk.android:crashlytics:2.10.1' implementation 'com.github.arimorty:floatingsearchview:2.1.1' implementation 'com.github.clans:fab:1.6.4' + implementation 'com.github.bumptech.glide:glide:4.11.0' - implementation ("com.github.bumptech.glide:recyclerview-integration:4.10.0") { + annotationProcessor 'com.github.bumptech.glide:compiler:4.11.0' + kapt 'com.github.bumptech.glide:compiler:4.11.0' + implementation ("com.github.bumptech.glide:recyclerview-integration:4.11.0") { transitive = false } + implementation 'net.rdrei.android.dirchooser:library:3.2@aar' - implementation 'com.gu:option:1.3' implementation 'com.github.chrisbanes:PhotoView:2.3.0' implementation 'com.andrognito.patternlockview:patternlockview:1.0.0' implementation "ru.noties.markwon:core:${markwonVersion}" - kapt 'com.github.bumptech.glide:compiler:4.11.0' testImplementation 'junit:junit:4.13' androidTestImplementation 'androidx.test.ext:junit:1.1.1' androidTestImplementation 'androidx.test:rules:1.2.0' diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index 481bb434..a9d9d7f4 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -18,4 +18,11 @@ # If you keep the line number information, uncomment this to # hide the original source file name. -#-renamesourcefileattribute SourceFile \ No newline at end of file +#-renamesourcefileattribute SourceFile + +-keep public class * implements com.bumptech.glide.module.GlideModule +-keep public class * extends com.bumptech.glide.module.AppGlideModule +-keep public enum com.bumptech.glide.load.ImageHeaderParser$** { + **[] $VALUES; + public *; +} \ No newline at end of file diff --git a/app/src/main/java/xyz/quaver/pupil/adapters/GalleryBlockAdapter.kt b/app/src/main/java/xyz/quaver/pupil/adapters/GalleryBlockAdapter.kt index 273e5958..6c1f637d 100644 --- a/app/src/main/java/xyz/quaver/pupil/adapters/GalleryBlockAdapter.kt +++ b/app/src/main/java/xyz/quaver/pupil/adapters/GalleryBlockAdapter.kt @@ -71,15 +71,15 @@ class GalleryBlockAdapter(context: Context, private val galleries: List() { + val glide = Glide.with(context) + //region Glide.RecyclerView - inner class SizeProvider : ListPreloader.PreloadSizeProvider { - - override fun getPreloadSize(item: File, adapterPosition: Int, itemPosition: Int): IntArray? { - return Cache(context).getReaderOrNull(galleryID)?.galleryInfo?.getOrNull(itemPosition)?.let { - arrayOf(it.width, it.height).toIntArray() - } + val sizeProvider = ListPreloader.PreloadSizeProvider { _, _, position -> + Cache(context).getReaderOrNull(galleryID)?.galleryInfo?.getOrNull(position)?.let { + arrayOf(it.width, it.height).toIntArray() } - } - - inner class ModelProvider : ListPreloader.PreloadModelProvider { - + val modelProvider = object: ListPreloader.PreloadModelProvider { override fun getPreloadItems(position: Int): MutableList { return listOf(Cache(context).getImages(galleryID)?.get(position)).filterNotNullTo(mutableListOf()) } @@ -76,18 +72,13 @@ class ReaderAdapter(private val context: Context, override(5, 8) } } - } + val preloader = RecyclerViewPreloader(glide, modelProvider, sizeProvider, 10) //endregion var reader: Reader? = null - val glide = Glide.with(context) val timer = Timer() - val sizeProvider = SizeProvider() - val modelProvider = ModelProvider() - val preloader = RecyclerViewPreloader(glide, modelProvider, sizeProvider, 10) - var isFullScreen = false var onItemClickListener : ((Int) -> (Unit))? = null @@ -114,10 +105,13 @@ class ReaderAdapter(private val context: Context, override fun onBindViewHolder(holder: ViewHolder, position: Int) { holder.view as ConstraintLayout - if (isFullScreen) + if (isFullScreen) { holder.view.layoutParams.height = RecyclerView.LayoutParams.MATCH_PARENT - else + holder.view.container.layoutParams.height = ConstraintLayout.LayoutParams.MATCH_PARENT + } else { holder.view.layoutParams.height = RecyclerView.LayoutParams.WRAP_CONTENT + holder.view.container.layoutParams.height = 0 + } holder.view.image.setOnPhotoTapListener { _, _, _ -> onItemClickListener?.invoke(position) @@ -127,52 +121,51 @@ class ReaderAdapter(private val context: Context, onItemClickListener?.invoke(position) } - (holder.view.container.layoutParams as ConstraintLayout.LayoutParams) - .dimensionRatio = "${reader!!.galleryInfo[position].width}:${reader!!.galleryInfo[position].height}" + if (!isFullScreen) + (holder.view.container.layoutParams as ConstraintLayout.LayoutParams) + .dimensionRatio = "${reader!!.galleryInfo[position].width}:${reader!!.galleryInfo[position].height}" holder.view.reader_index.text = (position+1).toString() - CoroutineScope(Dispatchers.IO).launch { - val images = Cache(context).getImages(galleryID) + val images = Cache(context).getImages(galleryID) - launch(Dispatchers.Main) { - if (images?.get(position) != null) { - glide - .load(images[position]) - .diskCacheStrategy(DiskCacheStrategy.NONE) - .skipMemoryCache(true) - .error(R.drawable.image_broken_variant) - .apply { - if (BuildConfig.CENSOR) - override(5, 8) - } - .into(holder.view.image) - } else { - val progress = DownloadWorker.getInstance(context).progress[galleryID]?.get(position) + if (images?.get(position) != null) { + glide + .load(images[position]) + .diskCacheStrategy(DiskCacheStrategy.NONE) + .skipMemoryCache(true) + .error(R.drawable.image_broken_variant) + .dontTransform() + .apply { + if (BuildConfig.CENSOR) + override(5, 8) + } + .into(holder.view.image) + } else { + val progress = DownloadWorker.getInstance(context).progress[galleryID]?.get(position) - if (progress?.isNaN() == true) { + if (progress?.isNaN() == true) { + if (Fabric.isInitialized()) + Crashlytics.logException(DownloadWorker.getInstance(context).exception[galleryID]?.get(position)) - if (Fabric.isInitialized()) - Crashlytics.logException(DownloadWorker.getInstance(context).exception[galleryID]?.get(position)) + glide + .load(R.drawable.image_broken_variant) + .into(holder.view.image) - glide - .load(R.drawable.image_broken_variant) - .into(holder.view.image) - } else { - holder.view.reader_item_progressbar.progress = - if (progress?.isInfinite() == true) - 100 - else - progress?.roundToInt() ?: 0 + return + } else { + holder.view.reader_item_progressbar.progress = + if (progress?.isInfinite() == true) + 100 + else + progress?.roundToInt() ?: 0 - holder.view.image.setImageDrawable(null) - } + holder.view.image.setImageDrawable(null) + } - timer.schedule(1000) { - CoroutineScope(Dispatchers.Main).launch { - notifyItemChanged(position) - } - } + timer.schedule(1000) { + CoroutineScope(Dispatchers.Main).launch { + notifyItemChanged(position) } } } diff --git a/app/src/main/res/layout/item_reader.xml b/app/src/main/res/layout/item_reader.xml index d91faa03..60a1f261 100644 --- a/app/src/main/res/layout/item_reader.xml +++ b/app/src/main/res/layout/item_reader.xml @@ -62,6 +62,8 @@