diff --git a/app/build.gradle b/app/build.gradle index 278327aa..24e2d0f9 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -19,8 +19,8 @@ android { applicationId "xyz.quaver.pupil" minSdkVersion 16 targetSdkVersion 29 - versionCode 56 - versionName "4.18.4" + versionCode 57 + versionName "4.19-hotfix1" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" multiDexEnabled true vectorDrawables.useSupportLibrary = true @@ -64,7 +64,7 @@ dependencies { implementation "androidx.biometric:biometric:1.0.1" implementation 'androidx.multidex:multidex:2.0.1' implementation "com.daimajia.swipelayout:library:1.2.0@aar" - implementation 'com.google.android.material:material:1.3.0-alpha01' + implementation 'com.google.android.material:material:1.3.0-alpha02' implementation 'com.google.firebase:firebase-core:17.4.4' implementation 'com.google.firebase:firebase-analytics:17.4.4' implementation 'com.google.firebase:firebase-crashlytics:17.1.1' @@ -77,6 +77,7 @@ dependencies { implementation ("com.github.bumptech.glide:recyclerview-integration:4.11.0") { transitive = false } + implementation 'com.tbuonomo.andrui:viewpagerdotsindicator:4.1.2' implementation 'net.rdrei.android.dirchooser:library:3.2@aar' implementation 'com.github.chrisbanes:PhotoView:2.3.0' implementation 'com.andrognito.patternlockview:patternlockview:1.0.0' diff --git a/app/release/output.json b/app/release/output-metadata.json similarity index 83% rename from app/release/output.json rename to app/release/output-metadata.json index c2663150..7f90aa3e 100644 --- a/app/release/output.json +++ b/app/release/output-metadata.json @@ -11,8 +11,8 @@ "type": "SINGLE", "filters": [], "properties": [], - "versionCode": 56, - "versionName": "56", + "versionCode": 57, + "versionName": "4.19-hotfix1", "enabled": true, "outputFile": "app-release.apk" } diff --git a/app/src/main/java/xyz/quaver/pupil/adapters/ThumbnailAdapter.kt b/app/src/main/java/xyz/quaver/pupil/adapters/ThumbnailAdapter.kt index db85c79d..eb216ad6 100644 --- a/app/src/main/java/xyz/quaver/pupil/adapters/ThumbnailAdapter.kt +++ b/app/src/main/java/xyz/quaver/pupil/adapters/ThumbnailAdapter.kt @@ -22,9 +22,10 @@ import android.view.ViewGroup import android.widget.ImageView import androidx.recyclerview.widget.RecyclerView import com.bumptech.glide.RequestManager +import com.bumptech.glide.load.engine.DiskCacheStrategy import xyz.quaver.pupil.BuildConfig -class ThumbnailAdapter(private val glide: RequestManager, private val thumbnails: List) : RecyclerView.Adapter() { +class ThumbnailAdapter(private val glide: RequestManager, var thumbnails: List) : RecyclerView.Adapter() { class ViewHolder(val view: ImageView) : RecyclerView.ViewHolder(view) @@ -35,6 +36,7 @@ class ThumbnailAdapter(private val glide: RequestManager, private val thumbnails override fun onBindViewHolder(holder: ViewHolder, position: Int) { glide .load(thumbnails[position]) + .diskCacheStrategy(DiskCacheStrategy.NONE) .apply { if (BuildConfig.CENSOR) override(5, 8) diff --git a/app/src/main/java/xyz/quaver/pupil/adapters/ThumbnailPageAdapter.kt b/app/src/main/java/xyz/quaver/pupil/adapters/ThumbnailPageAdapter.kt new file mode 100644 index 00000000..b4f5b1a0 --- /dev/null +++ b/app/src/main/java/xyz/quaver/pupil/adapters/ThumbnailPageAdapter.kt @@ -0,0 +1,50 @@ +/* + * Pupil, Hitomi.la viewer for Android + * Copyright (C) 2020 tom5079 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package xyz.quaver.pupil.adapters + +import android.view.ViewGroup +import androidx.recyclerview.widget.GridLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.RequestManager +import kotlin.math.min + +class ThumbnailPageAdapter(private val glide: RequestManager, private val thumbnails: List) : RecyclerView.Adapter() { + + class ViewHolder(val view: RecyclerView) : RecyclerView.ViewHolder(view) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { + return ViewHolder(RecyclerView(parent.context).apply { + layoutManager = GridLayoutManager(parent.context, 3) + adapter = ThumbnailAdapter(glide, listOf()) + layoutParams = ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT) + }) + } + + override fun onBindViewHolder(holder: ViewHolder, position: Int) { + (holder.view.adapter as ThumbnailAdapter).apply { + thumbnails = this@ThumbnailPageAdapter.thumbnails.slice(9*position until min(9*position+9, this@ThumbnailPageAdapter.thumbnails.size)) + notifyDataSetChanged() + + holder.view.layoutManager?.scrollToPosition(itemCount-1) + } + } + + override fun getItemCount() = if (thumbnails.isEmpty()) 0 else thumbnails.size/9 + if (thumbnails.size%9 != 0) 1 else 0 + +} \ No newline at end of file diff --git a/app/src/main/java/xyz/quaver/pupil/ui/dialog/GalleryDialog.kt b/app/src/main/java/xyz/quaver/pupil/ui/dialog/GalleryDialog.kt index 548c3aec..a272c37a 100644 --- a/app/src/main/java/xyz/quaver/pupil/ui/dialog/GalleryDialog.kt +++ b/app/src/main/java/xyz/quaver/pupil/ui/dialog/GalleryDialog.kt @@ -26,14 +26,15 @@ import android.view.LayoutInflater import android.view.View import android.widget.LinearLayout.LayoutParams import androidx.core.content.ContextCompat -import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView +import androidx.viewpager2.widget.ViewPager2 import com.bumptech.glide.RequestManager import com.google.android.material.chip.Chip import com.google.android.material.snackbar.Snackbar import kotlinx.android.synthetic.main.dialog_gallery.* -import kotlinx.android.synthetic.main.gallery_details.view.* +import kotlinx.android.synthetic.main.dialog_gallery_details.view.* +import kotlinx.android.synthetic.main.dialog_gallery_dotindicator.view.* import kotlinx.android.synthetic.main.item_gallery_details.view.* import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers @@ -46,7 +47,7 @@ import xyz.quaver.pupil.BuildConfig import xyz.quaver.pupil.Pupil import xyz.quaver.pupil.R import xyz.quaver.pupil.adapters.GalleryBlockAdapter -import xyz.quaver.pupil.adapters.ThumbnailAdapter +import xyz.quaver.pupil.adapters.ThumbnailPageAdapter import xyz.quaver.pupil.types.Tag import xyz.quaver.pupil.ui.ReaderActivity import xyz.quaver.pupil.util.ItemClickSupport @@ -130,7 +131,7 @@ class GalleryDialog(context: Context, private val glide: RequestManager, private private fun addDetails(gallery: Gallery) { val inflater = LayoutInflater.from(context) - inflater.inflate(R.layout.gallery_details, gallery_contents, false).apply { + inflater.inflate(R.layout.dialog_gallery_details, gallery_contents, false).apply { gallery_details.setText(R.string.gallery_details) listOf( @@ -206,15 +207,21 @@ class GalleryDialog(context: Context, private val glide: RequestManager, private private fun addThumbnails(gallery: Gallery) { val inflater = LayoutInflater.from(context) - inflater.inflate(R.layout.gallery_details, gallery_contents, false).apply { + inflater.inflate(R.layout.dialog_gallery_details, gallery_contents, false).apply { gallery_details.setText(R.string.gallery_thumbnails) - RecyclerView(context).apply { - layoutManager = GridLayoutManager(context, 3) - adapter = ThumbnailAdapter(glide, gallery.thumbnails) - }.let { - gallery_details_contents.addView(it, LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT)) + val pager = ViewPager2(context).apply { + adapter = ThumbnailPageAdapter(glide, gallery.thumbnails) } + + gallery_details_contents.addView( + pager, + LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT) + ) + + LayoutInflater.from(context).inflate(R.layout.dialog_gallery_dotindicator, gallery_details_contents) + + gallery_dotindicator.setViewPager2(pager) }.let { gallery_contents.addView(it) } @@ -245,7 +252,7 @@ class GalleryDialog(context: Context, private val glide: RequestManager, private } } - inflater.inflate(R.layout.gallery_details, gallery_contents, false).apply { + inflater.inflate(R.layout.dialog_gallery_details, gallery_contents, false).apply { gallery_details.setText(R.string.gallery_related) RecyclerView(context).apply { diff --git a/app/src/main/java/xyz/quaver/pupil/util/download/DownloadWorker.kt b/app/src/main/java/xyz/quaver/pupil/util/download/DownloadWorker.kt index d91cc987..6bb1f7ac 100644 --- a/app/src/main/java/xyz/quaver/pupil/util/download/DownloadWorker.kt +++ b/app/src/main/java/xyz/quaver/pupil/util/download/DownloadWorker.kt @@ -130,7 +130,7 @@ class DownloadWorker private constructor(context: Context) : ContextWrapper(cont * Float.POSITIVE_INFINITY -> Download completed */ val progress = SparseArray?>() - val notification = SparseArray() + val notification = SparseArray() private val loop = loop() private val worker = SparseArray() @@ -255,7 +255,7 @@ class DownloadWorker private constructor(context: Context) : ContextWrapper(cont if (notification[galleryID] == null) initNotification(galleryID) - notification[galleryID].setContentTitle(reader.galleryInfo.title) + notification[galleryID]?.setContentTitle(reader.galleryInfo.title) notify(galleryID) if (isCompleted(galleryID)) { @@ -345,7 +345,7 @@ class DownloadWorker private constructor(context: Context) : ContextWrapper(cont ?.setContentText("$progress/$max") if (Cache(this).isDownloading(galleryID) && notification[galleryID] != null) - notificationManager.notify(galleryID, notification[galleryID].build()) + notification[galleryID]?.let { notificationManager.notify(galleryID, it.build()) } else notificationManager.cancel(galleryID) } @@ -383,7 +383,7 @@ class DownloadWorker private constructor(context: Context) : ContextWrapper(cont initNotification(galleryID) if (Cache(this@DownloadWorker).isDownloading(galleryID)) - notificationManager.notify(galleryID, notification[galleryID].build()) + notification[galleryID]?.let { notificationManager.notify(galleryID, it.build()) } worker.put(galleryID, download(galleryID)) queue.poll() diff --git a/app/src/main/res/layout-v21/activity_main_content.xml b/app/src/main/res/layout-v23/activity_main_content.xml similarity index 100% rename from app/src/main/res/layout-v21/activity_main_content.xml rename to app/src/main/res/layout-v23/activity_main_content.xml diff --git a/app/src/main/res/layout/gallery_details.xml b/app/src/main/res/layout/dialog_gallery_details.xml similarity index 100% rename from app/src/main/res/layout/gallery_details.xml rename to app/src/main/res/layout/dialog_gallery_details.xml diff --git a/app/src/main/res/layout/dialog_gallery_dotindicator.xml b/app/src/main/res/layout/dialog_gallery_dotindicator.xml new file mode 100644 index 00000000..b1f5de7b --- /dev/null +++ b/app/src/main/res/layout/dialog_gallery_dotindicator.xml @@ -0,0 +1,34 @@ + + + + + + + + \ No newline at end of file diff --git a/build.gradle b/build.gradle index 5eb988a2..0ff7d69d 100644 --- a/build.gradle +++ b/build.gradle @@ -7,7 +7,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:4.0.0' + classpath 'com.android.tools.build:gradle:4.0.1' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath "org.jetbrains.kotlin:kotlin-android-extensions:$kotlin_version" classpath "org.jetbrains.kotlin:kotlin-serialization:$kotlin_version" diff --git a/libpupil/src/main/java/xyz/quaver/hitomi/galleryblock.kt b/libpupil/src/main/java/xyz/quaver/hitomi/galleryblock.kt index 6040251d..b783588c 100644 --- a/libpupil/src/main/java/xyz/quaver/hitomi/galleryblock.kt +++ b/libpupil/src/main/java/xyz/quaver/hitomi/galleryblock.kt @@ -83,7 +83,7 @@ fun getGalleryBlock(galleryID: Int) : GalleryBlock? { val galleryUrl = doc.selectFirst(".lillie").attr("href") - val thumbnails = doc.select("img").map { protocol + it.attr("data-src") } + val thumbnails = doc.select(".dj-img-cont img").map { protocol + it.attr("src") } val title = doc.selectFirst("h1.lillie > a").text() val artists = doc.select("div.artist-list a").map{ it.text() }