From 49c3ebc36b5d020f75d573e5b3e2c6af212d3634 Mon Sep 17 00:00:00 2001 From: tom5079 Date: Sun, 4 Oct 2020 21:41:16 +0900 Subject: [PATCH] Concurrency issue fixed Don't cancel download onPause Limit folder length to 127 characters --- app/build.gradle | 5 +---- app/proguard-rules.pro | 18 +----------------- app/release/output-metadata.json | 4 ++-- .../quaver/pupil/services/DownloadService.kt | 9 +++++---- .../java/xyz/quaver/pupil/ui/MainActivity.kt | 2 +- .../java/xyz/quaver/pupil/ui/ReaderActivity.kt | 13 ++++++------- .../java/xyz/quaver/pupil/util/SavedSet.kt | 3 ++- .../main/java/xyz/quaver/pupil/util/misc.kt | 4 ++-- 8 files changed, 20 insertions(+), 38 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index cf2c680b..deb80cb2 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -37,7 +37,7 @@ android { applicationId "xyz.quaver.pupil" minSdkVersion 16 targetSdkVersion 30 - versionCode 61 + versionCode 62 versionName "5.1.3" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" vectorDrawables.useSupportLibrary = true @@ -51,7 +51,6 @@ android { applicationIdSuffix ".debug" versionNameSuffix "-DEBUG" - buildConfigField("Boolean", "CENSOR", "false") proguardFiles getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro" ext.enableCrashlytics = false @@ -61,7 +60,6 @@ android { minifyEnabled true shrinkResources true - buildConfigField("Boolean", "CENSOR", "false") proguardFiles getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro" } } @@ -79,7 +77,6 @@ android { dependencies { implementation fileTree(dir: "libs", include: ["*.jar", "*.aar"]) implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8" - implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.9" implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.9" implementation "org.jetbrains.kotlinx:kotlinx-serialization-json:1.0.0-RC2" diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index a4e83a1d..7b1b98e0 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -22,21 +22,6 @@ -dontobfuscate --keep public class * implements com.bumptech.glide.module.GlideModule --keep class * extends com.bumptech.glide.module.AppGlideModule { - (...); -} --keep public enum com.bumptech.glide.load.ImageHeaderParser$** { - **[] $VALUES; - public *; -} --keep class com.bumptech.glide.load.data.ParcelFileDescriptorRewinder$InternalRewinder { - *** rewind(); -} - --keep public class * extends com.bumptech.glide.module.AppGlideModule --keep class com.bumptech.glide.GeneratedAppGlideModuleImpl - -keepattributes *Annotation*, InnerClasses -dontnote kotlinx.serialization.SerializationKt -keep,includedescriptorclasses class xyz.quaver.**$$serializer { *; } # <-- change package name to your app's @@ -47,5 +32,4 @@ kotlinx.serialization.KSerializer serializer(...); } -keep class xyz.quaver.pupil.ui.fragment.ManageFavoritesFragment --keep class xyz.quaver.pupil.ui.fragment.ManageStorageFragment --keep class xyz.quaver.pupil.util.Preferences \ No newline at end of file +-keep class xyz.quaver.pupil.ui.fragment.ManageStorageFragment \ No newline at end of file diff --git a/app/release/output-metadata.json b/app/release/output-metadata.json index 9407c54b..96c10c13 100644 --- a/app/release/output-metadata.json +++ b/app/release/output-metadata.json @@ -11,8 +11,8 @@ "type": "SINGLE", "filters": [], "properties": [], - "versionCode": 61, - "versionName": "5.1.2-hotfix3", + "versionCode": 62, + "versionName": "5.1.3", "enabled": true, "outputFile": "app-release.apk" } diff --git a/app/src/main/java/xyz/quaver/pupil/services/DownloadService.kt b/app/src/main/java/xyz/quaver/pupil/services/DownloadService.kt index 41b06e1a..31c79ac1 100644 --- a/app/src/main/java/xyz/quaver/pupil/services/DownloadService.kt +++ b/app/src/main/java/xyz/quaver/pupil/services/DownloadService.kt @@ -27,7 +27,6 @@ import androidx.core.app.NotificationCompat import androidx.core.app.NotificationManagerCompat import androidx.core.app.TaskStackBuilder import androidx.core.content.ContextCompat -import com.google.firebase.crashlytics.FirebaseCrashlytics import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job @@ -46,6 +45,7 @@ import xyz.quaver.pupil.util.ellipsize import xyz.quaver.pupil.util.normalizeID import xyz.quaver.pupil.util.requestBuilders import java.io.IOException +import java.util.* import java.util.concurrent.ConcurrentHashMap import kotlin.math.ceil import kotlin.math.log10 @@ -88,7 +88,7 @@ class DownloadService : Service() { PendingIntent.FLAG_UPDATE_CURRENT), ).build() - notification.put(galleryID, NotificationCompat.Builder(this, "download").apply { + notification[galleryID] = NotificationCompat.Builder(this, "download").apply { setContentTitle(getString(R.string.reader_loading)) setContentText(getString(R.string.reader_notification_text)) setSmallIcon(R.drawable.ic_notification) @@ -96,7 +96,7 @@ class DownloadService : Service() { addAction(action) setProgress(0, 0, true) setOngoing(true) - }) + } notify(galleryID) } @@ -121,7 +121,7 @@ class DownloadService : Service() { .setProgress(max, progress, false) .setContentText("$progress/$max") - if (DownloadManager.getInstance(this).getDownloadFolder(galleryID) != null) + if (DownloadManager.getInstance(this).getDownloadFolder(galleryID) != null || galleryID == priority) notification.let { notificationManager.notify(galleryID, it.build()) } else notificationManager.cancel(galleryID) @@ -196,6 +196,7 @@ class DownloadService : Service() { * Float.POSITIVE_INFINITY -> Download completed */ val progress = ConcurrentHashMap>() + var priority = 0 fun isCompleted(galleryID: Int) = progress[galleryID]?.toList()?.all { it == Float.POSITIVE_INFINITY } == true diff --git a/app/src/main/java/xyz/quaver/pupil/ui/MainActivity.kt b/app/src/main/java/xyz/quaver/pupil/ui/MainActivity.kt index 3b34fd3d..3999d42b 100644 --- a/app/src/main/java/xyz/quaver/pupil/ui/MainActivity.kt +++ b/app/src/main/java/xyz/quaver/pupil/ui/MainActivity.kt @@ -378,7 +378,7 @@ class MainActivity : if (v !is CardView) return@listener false - val galleryID = galleries[position] + val galleryID = galleries.getOrNull(position) ?: return@listener true GalleryDialog(this@MainActivity, galleryID).apply { onChipClickedHandler.add { diff --git a/app/src/main/java/xyz/quaver/pupil/ui/ReaderActivity.kt b/app/src/main/java/xyz/quaver/pupil/ui/ReaderActivity.kt index 9539d8ee..48dbcced 100644 --- a/app/src/main/java/xyz/quaver/pupil/ui/ReaderActivity.kt +++ b/app/src/main/java/xyz/quaver/pupil/ui/ReaderActivity.kt @@ -33,11 +33,9 @@ import android.view.animation.Animation import android.view.animation.AnticipateInterpolator import android.view.animation.OvershootInterpolator import android.view.animation.TranslateAnimation -import android.widget.Toast import androidx.activity.result.contract.ActivityResultContracts import androidx.appcompat.app.AlertDialog import androidx.core.content.ContextCompat -import androidx.preference.PreferenceManager import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.PagerSnapHelper import androidx.recyclerview.widget.RecyclerView @@ -59,7 +57,6 @@ import xyz.quaver.Code import xyz.quaver.pupil.R import xyz.quaver.pupil.adapters.ReaderAdapter import xyz.quaver.pupil.favorites -import xyz.quaver.pupil.histories import xyz.quaver.pupil.services.DownloadService import xyz.quaver.pupil.util.Preferences import xyz.quaver.pupil.util.camera @@ -67,8 +64,6 @@ import xyz.quaver.pupil.util.closeCamera import xyz.quaver.pupil.util.downloader.Cache import xyz.quaver.pupil.util.downloader.DownloadManager import xyz.quaver.pupil.util.startCamera -import java.util.* -import kotlin.concurrent.schedule class ReaderActivity : BaseActivity() { @@ -88,6 +83,8 @@ class ReaderActivity : BaseActivity() { private val conn = object: ServiceConnection { override fun onServiceConnected(name: ComponentName?, service: IBinder?) { downloader = (service as DownloadService.Binder).service.also { + it.priority = 0 + if (!it.progress.containsKey(galleryID)) DownloadService.download(this@ReaderActivity, galleryID, true) } @@ -230,14 +227,16 @@ class ReaderActivity : BaseActivity() { if (downloader != null) unbindService(conn) - if (!DownloadManager.getInstance(this).isDownloading(galleryID)) - DownloadService.cancel(this, galleryID) + downloader?.priority = galleryID } override fun onDestroy() { super.onDestroy() update = false + + if (!DownloadManager.getInstance(this).isDownloading(galleryID)) + DownloadService.cancel(this, galleryID) } override fun onBackPressed() { diff --git a/app/src/main/java/xyz/quaver/pupil/util/SavedSet.kt b/app/src/main/java/xyz/quaver/pupil/util/SavedSet.kt index 91c8c431..24c71f2a 100644 --- a/app/src/main/java/xyz/quaver/pupil/util/SavedSet.kt +++ b/app/src/main/java/xyz/quaver/pupil/util/SavedSet.kt @@ -22,8 +22,9 @@ import kotlinx.serialization.* import kotlinx.serialization.builtins.ListSerializer import kotlinx.serialization.json.Json import java.io.File +import java.util.* -class SavedSet (private val file: File, private val any: T, private val set: MutableSet = mutableSetOf()) : MutableSet by set { +class SavedSet (private val file: File, private val any: T, private val set: MutableSet = Collections.synchronizedSet(mutableSetOf())) : MutableSet by set { @Suppress("UNCHECKED_CAST") @OptIn(ExperimentalSerializationApi::class) diff --git a/app/src/main/java/xyz/quaver/pupil/util/misc.kt b/app/src/main/java/xyz/quaver/pupil/util/misc.kt index 48d84ae8..df3e820e 100644 --- a/app/src/main/java/xyz/quaver/pupil/util/misc.kt +++ b/app/src/main/java/xyz/quaver/pupil/util/misc.kt @@ -93,14 +93,14 @@ fun GalleryBlock.formatDownloadFolder(): String = formatMap.entries.fold(it) { str, (k, v) -> str.replace(k, v.invoke(this), true) } - }.replace(Regex("""[*\\|"?><:/]"""), "") + }.replace(Regex("""[*\\|"?><:/]"""), "").ellipsize(127) fun GalleryBlock.formatDownloadFolderTest(format: String): String = format.let { formatMap.entries.fold(it) { str, (k, v) -> str.replace(k, v.invoke(this), true) } - }.replace(Regex("""[*\\|"?><:/]"""), "") + }.replace(Regex("""[*\\|"?><:/]"""), "").ellipsize(127) val Reader.requestBuilders: List get() {