diff --git a/.idea/vcs.xml b/.idea/vcs.xml index 56883e31..35eb1ddf 100644 --- a/.idea/vcs.xml +++ b/.idea/vcs.xml @@ -2,6 +2,5 @@ - \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index a880fd7e..16bf58e5 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -21,7 +21,7 @@ android { minSdkVersion 16 targetSdkVersion 30 versionCode 59 - versionName "5.0.1-hotfix2" + versionName "5.0.2" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" vectorDrawables.useSupportLibrary = true } diff --git a/app/libs/recyclerviewfastscroller-release.aar b/app/libs/recyclerviewfastscroller-release.aar index be33fec7..9b121127 100644 Binary files a/app/libs/recyclerviewfastscroller-release.aar and b/app/libs/recyclerviewfastscroller-release.aar differ diff --git a/app/src/main/java/xyz/quaver/pupil/Pupil.kt b/app/src/main/java/xyz/quaver/pupil/Pupil.kt index 32517aa6..ec25efa8 100644 --- a/app/src/main/java/xyz/quaver/pupil/Pupil.kt +++ b/app/src/main/java/xyz/quaver/pupil/Pupil.kt @@ -71,11 +71,9 @@ val client: OkHttpClient class Pupil : Application() { - init { - AppCompatDelegate.setCompatVectorFromResourcesEnabled(true) - } - override fun onCreate() { + AppCompatDelegate.setCompatVectorFromResourcesEnabled(true) + preferences = PreferenceManager.getDefaultSharedPreferences(this) val userID = Preferences["user_id", ""].let { userID -> 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 441cdcdc..c37d0003 100644 --- a/app/src/main/java/xyz/quaver/pupil/adapters/GalleryBlockAdapter.kt +++ b/app/src/main/java/xyz/quaver/pupil/adapters/GalleryBlockAdapter.kt @@ -20,6 +20,7 @@ package xyz.quaver.pupil.adapters import android.content.Context import android.graphics.drawable.Drawable +import android.util.Log import android.util.SparseBooleanArray import android.view.LayoutInflater import android.view.View @@ -125,6 +126,8 @@ class GalleryBlockAdapter(private val glide: RequestManager, private val galleri } fun bind(galleryID: Int) { + val time = System.currentTimeMillis() + val cache = Cache.getInstance(view.context, galleryID) val galleryBlock = cache.metadata.galleryBlock ?: return @@ -219,13 +222,15 @@ class GalleryBlockAdapter(private val glide: RequestManager, private val galleri } galleryblock_tag_group.removeAllViews() - galleryBlock.relatedTags.forEach { - galleryblock_tag_group.addView(TagChip(context, Tag.parse(it)).apply { - setOnClickListener { view -> - for (callback in onChipClickedHandler) - callback.invoke((view as TagChip).tag) - } - }) + CoroutineScope(Dispatchers.Default).launch { + galleryBlock.relatedTags.forEach { + TagChip(context, Tag.parse(it)).apply { + setOnClickListener { view -> + for (callback in onChipClickedHandler) + callback.invoke((view as TagChip).tag) + } + }.let { launch(Dispatchers.Main) { galleryblock_tag_group.addView(it) } } + } } galleryblock_id.text = galleryBlock.id.toString() @@ -274,6 +279,7 @@ class GalleryBlockAdapter(private val glide: RequestManager, private val galleri galleryblock_tag_group.visibility = View.GONE } } + Log.i("PUPILD", "${System.currentTimeMillis() - time}") } } class NextViewHolder(view: LinearLayout) : RecyclerView.ViewHolder(view) diff --git a/app/src/main/java/xyz/quaver/pupil/adapters/ReaderAdapter.kt b/app/src/main/java/xyz/quaver/pupil/adapters/ReaderAdapter.kt index d810642b..23dee9fe 100644 --- a/app/src/main/java/xyz/quaver/pupil/adapters/ReaderAdapter.kt +++ b/app/src/main/java/xyz/quaver/pupil/adapters/ReaderAdapter.kt @@ -41,7 +41,6 @@ import xyz.quaver.hitomi.Reader import xyz.quaver.hitomi.getReferer import xyz.quaver.hitomi.imageUrlFromImage import xyz.quaver.hiyobi.createImgList -import xyz.quaver.io.util.readBytes import xyz.quaver.pupil.BuildConfig import xyz.quaver.pupil.R import xyz.quaver.pupil.services.DownloadService @@ -143,7 +142,7 @@ class ReaderAdapter(private val activity: ReaderActivity, CoroutineScope(Dispatchers.IO).launch { glide - .load(image.readBytes()) + .load(image.uri) .diskCacheStrategy(DiskCacheStrategy.NONE) .skipMemoryCache(true) .apply { 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 6348dbb4..92d6a2ad 100644 --- a/app/src/main/java/xyz/quaver/pupil/services/DownloadService.kt +++ b/app/src/main/java/xyz/quaver/pupil/services/DownloadService.kt @@ -309,11 +309,25 @@ class DownloadService : Service() { progress.put(galleryID, MutableList(reader.galleryInfo.files.size) { 0F }) - cache.metadata.imageList?.forEachIndexed { index, image -> - progress[galleryID]?.set(index, if (image != null) Float.POSITIVE_INFINITY else 0F) + cache.metadata.imageList?.let { + if (progress[galleryID]?.size != it.size) { + cache.metadata.imageList?.filterNotNull()?.forEach { file -> + cache.findFile(file)?.delete() + } + cache.metadata.imageList = MutableList(reader.galleryInfo.files.size) { null } + return@let + } + + it.forEachIndexed { index, image -> + progress[galleryID]?.set(index, if (image != null) Float.POSITIVE_INFINITY else 0F) + } } if (isCompleted(galleryID)) { + if (DownloadManager.getInstance(this@DownloadService) + .getDownloadFolder(galleryID) != null) + Cache.getInstance(this@DownloadService, galleryID).moveToDownload() + notificationManager.cancel(galleryID) startId?.let { stopSelf(it) } return@launch 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 3faf5282..8913ca8f 100644 --- a/app/src/main/java/xyz/quaver/pupil/ui/MainActivity.kt +++ b/app/src/main/java/xyz/quaver/pupil/ui/MainActivity.kt @@ -26,6 +26,7 @@ import android.text.InputType import android.view.* import android.widget.* import androidx.appcompat.app.AlertDialog +import androidx.appcompat.app.AppCompatDelegate import androidx.cardview.widget.CardView import androidx.core.view.GravityCompat import com.arlib.floatingsearchview.FloatingSearchView @@ -97,7 +98,9 @@ class MainActivity : override fun onCreate(savedInstanceState: Bundle?) { + AppCompatDelegate.setCompatVectorFromResourcesEnabled(true) super.onCreate(savedInstanceState) + setContentView(R.layout.activity_main) if (intent.action == Intent.ACTION_VIEW) { intent.dataString?.let { url -> @@ -111,8 +114,6 @@ class MainActivity : } } - setContentView(R.layout.activity_main) - if (Preferences["download_folder", ""].isEmpty()) DownloadLocationDialogFragment().show(supportFragmentManager, "Download Location Dialog") diff --git a/app/src/main/java/xyz/quaver/pupil/util/downloader/Cache.kt b/app/src/main/java/xyz/quaver/pupil/util/downloader/Cache.kt index 94f15db4..ada9f18c 100644 --- a/app/src/main/java/xyz/quaver/pupil/util/downloader/Cache.kt +++ b/app/src/main/java/xyz/quaver/pupil/util/downloader/Cache.kt @@ -200,24 +200,42 @@ class Cache private constructor(context: Context, val galleryID: Int) : ContextW fun moveToDownload() = CoroutineScope(Dispatchers.IO).launch { val downloadFolder = downloadFolder ?: return@launch + if (downloadFolder.getChild(".metadata").exists()) + return@launch + metadata.imageList?.forEach { imageName -> imageName ?: return@forEach val target = downloadFolder.getChild(imageName) val source = cacheFolder.getChild(imageName) - if (!source.exists()) + if (!source.exists() || target.exists()) return@forEach kotlin.runCatching { target.createNewFile() - source.readBytes()?.let { target.writeBytes(it) } + target.outputStream()?.use { target -> source.inputStream()?.use { source -> + source.copyTo(target) + } } + } + } + + val cacheThumbnail = cacheFolder.getChild(".thumbnail") + val downloadThumbnail = downloadFolder.getChild(".thumbnail") + + if (cacheThumbnail.exists() && !downloadThumbnail.exists()) { + kotlin.runCatching { + downloadThumbnail.createNewFile() + downloadThumbnail.outputStream()?.use { target -> cacheThumbnail.inputStream()?.use { source -> + source.copyTo(target) + } } + cacheThumbnail.delete() } } val cacheMetadata = cacheFolder.getChild(".metadata") val downloadMetadata = downloadFolder.getChild(".metadata") - if (cacheMetadata.exists()) { + if (cacheMetadata.exists() && !downloadMetadata.exists()) { kotlin.runCatching { downloadMetadata.createNewFile() downloadMetadata.writeText(Json.encodeToString(metadata)) diff --git a/app/src/main/res/layout-v23/activity_main_content.xml b/app/src/main/res/layout-v23/activity_main_content.xml index 35157a5a..78db4973 100644 --- a/app/src/main/res/layout-v23/activity_main_content.xml +++ b/app/src/main/res/layout-v23/activity_main_content.xml @@ -70,6 +70,8 @@ app:handleHasFixedSize="true" app:handleHeight="72dp" app:handleWidth="24dp" + app:disableTrack="true" + app:hideHandleAfter="1000" app:trackMarginStart="64dp" app:addLastItemPadding="true" app:popupDrawable="@color/transparent"> diff --git a/app/src/main/res/layout/activity_main_content.xml b/app/src/main/res/layout/activity_main_content.xml index f9487f70..210d502b 100644 --- a/app/src/main/res/layout/activity_main_content.xml +++ b/app/src/main/res/layout/activity_main_content.xml @@ -70,6 +70,8 @@ app:handleHasFixedSize="true" app:handleHeight="72dp" app:handleWidth="24dp" + app:disableTrack="true" + app:hideHandleAfter="1000" app:trackMarginStart="64dp" app:addLastItemPadding="true" app:popupDrawable="@color/transparent"> diff --git a/app/src/main/res/layout/activity_reader.xml b/app/src/main/res/layout/activity_reader.xml index 2b9de763..2e53a643 100644 --- a/app/src/main/res/layout/activity_reader.xml +++ b/app/src/main/res/layout/activity_reader.xml @@ -33,6 +33,8 @@ app:handleDrawable="@drawable/thumb" app:handleHeight="72dp" app:handleWidth="24dp" + app:disableTrack="true" + app:hideHandleAfter="1000" app:handleHasFixedSize="true" app:addLastItemPadding="true" app:popupDrawable="@color/transparent"> diff --git a/app/src/main/res/layout/item_galleryblock.xml b/app/src/main/res/layout/item_galleryblock.xml index 97548ccb..7d6a9f4f 100644 --- a/app/src/main/res/layout/item_galleryblock.xml +++ b/app/src/main/res/layout/item_galleryblock.xml @@ -25,7 +25,8 @@ android:layout_height="wrap_content" android:layout_margin="8dp" app:cardCornerRadius="8dp" - android:clipChildren="true"> + android:clipChildren="true" + tools:ignore="RtlHardcoded"> - + android:layout_height="wrap_content"> - + android:layout_height="4dp" + android:visibility="gone" + app:layout_constraintTop_toTopOf="parent"/> - + - + - + - + - + - + - - - - - - - - - + + + + + + + + android:background="@color/light_gray" + app:layout_constraintTop_toBottomOf="@id/barrier" + android:layout_margin="8dp"/> - + android:layout_marginLeft="8dp" + android:layout_marginTop="8dp" + android:layout_marginBottom="8dp" + app:layout_constraintTop_toBottomOf="@id/divider" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintLeft_toLeftOf="parent"/> - + - + - - - - - - - - - +