diff --git a/app/build.gradle b/app/build.gradle index 85b928c1..4bfbf414 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -38,7 +38,7 @@ android { minSdkVersion 16 targetSdkVersion 30 versionCode 64 - versionName "5.1.8-beta2" + versionName "5.1.9" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" vectorDrawables.useSupportLibrary = true } @@ -74,24 +74,23 @@ android { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } - buildToolsVersion = "29.0.3" } dependencies { implementation fileTree(dir: "libs", include: ["*.jar", "*.aar"]) implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8" - implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.4.1" - implementation "org.jetbrains.kotlinx:kotlinx-serialization-json:1.0.1" + implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.4.3" + implementation "org.jetbrains.kotlinx:kotlinx-serialization-json:1.2.0" - implementation "androidx.appcompat:appcompat:1.2.0" - implementation "androidx.activity:activity-ktx:1.3.0-alpha02" - implementation "androidx.fragment:fragment-ktx:1.3.0" + implementation "androidx.appcompat:appcompat:1.3.0" + implementation "androidx.activity:activity-ktx:1.3.0-beta01" + implementation "androidx.fragment:fragment-ktx:1.3.4" implementation "androidx.preference:preference-ktx:1.1.1" - implementation "androidx.recyclerview:recyclerview:1.1.0" + implementation "androidx.recyclerview:recyclerview:1.2.1" implementation "androidx.constraintlayout:constraintlayout:2.0.4" implementation "androidx.gridlayout:gridlayout:1.0.0" implementation "androidx.biometric:biometric:1.1.0" - implementation "androidx.work:work-runtime-ktx:2.5.0" + implementation "androidx.work:work-runtime-ktx:2.6.0-beta01" implementation "com.daimajia.swipelayout:library:1.2.0@aar" @@ -103,15 +102,15 @@ dependencies { implementation "com.google.firebase:firebase-perf-ktx" implementation "com.google.android.gms:play-services-oss-licenses:17.0.0" - implementation "com.google.android.gms:play-services-mlkit-face-detection:16.1.4" + implementation "com.google.android.gms:play-services-mlkit-face-detection:16.1.7" implementation "com.github.clans:fab:1.6.4" //implementation "com.quiph.ui:recyclerviewfastscroller:0.2.1" - implementation 'com.github.piasy:BigImageViewer:1.7.0' - implementation 'com.github.piasy:FrescoImageLoader:1.7.0' - implementation 'com.github.piasy:FrescoImageViewFactory:1.7.0' + implementation 'com.github.piasy:BigImageViewer:1.8.0' + implementation 'com.github.piasy:FrescoImageLoader:1.8.0' + implementation 'com.github.piasy:FrescoImageViewFactory:1.8.0' //noinspection GradleDependency implementation "com.squareup.okhttp3:okhttp:$okhttp_version" @@ -126,9 +125,9 @@ dependencies { implementation "ru.noties.markwon:core:3.1.0" - implementation "xyz.quaver:libpupil:1.8.16" + implementation "xyz.quaver:libpupil:2.1.0" implementation "xyz.quaver:documentfilex:0.6.1" - implementation "xyz.quaver:floatingsearchview:1.1.1" + implementation "xyz.quaver:floatingsearchview:1.1.7" testImplementation "junit:junit:4.13.1" androidTestImplementation "androidx.test.ext:junit:1.1.2" diff --git a/app/src/main/java/xyz/quaver/pupil/Pupil.kt b/app/src/main/java/xyz/quaver/pupil/Pupil.kt index f479968e..5c1d169d 100644 --- a/app/src/main/java/xyz/quaver/pupil/Pupil.kt +++ b/app/src/main/java/xyz/quaver/pupil/Pupil.kt @@ -115,8 +115,6 @@ class Pupil : Application() { if (!FileX(this, it).canWrite()) throw Exception() - - DownloadManager.getInstance(this).migrate() } } catch (e: Exception) { Preferences.remove("download_folder") 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 adcd2a36..eb5b2274 100644 --- a/app/src/main/java/xyz/quaver/pupil/adapters/GalleryBlockAdapter.kt +++ b/app/src/main/java/xyz/quaver/pupil/adapters/GalleryBlockAdapter.kt @@ -36,6 +36,7 @@ import com.daimajia.swipe.interfaces.SwipeAdapterInterface import com.github.piasy.biv.loader.ImageLoader import kotlinx.coroutines.* import xyz.quaver.hitomi.getGallery +import xyz.quaver.hitomi.getGalleryInfo import xyz.quaver.hitomi.getReader import xyz.quaver.io.util.getChild import xyz.quaver.pupil.R @@ -231,7 +232,7 @@ class GalleryBlockAdapter(private val galleries: List) : RecyclerSwipeAdapt binding.galleryblockPagecount.text = "-" CoroutineScope(Dispatchers.IO).launch { val pageCount = kotlin.runCatching { - getReader(galleryBlock.id).galleryInfo.files.size + getGalleryInfo(galleryBlock.id).files.size }.getOrNull() ?: return@launch withContext(Dispatchers.Main) { binding.galleryblockPagecount.text = itemView.context.getString(R.string.galleryblock_pagecount, pageCount) diff --git a/app/src/main/java/xyz/quaver/pupil/adapters/MirrorAdapter.kt b/app/src/main/java/xyz/quaver/pupil/adapters/MirrorAdapter.kt deleted file mode 100644 index 93d72678..00000000 --- a/app/src/main/java/xyz/quaver/pupil/adapters/MirrorAdapter.kt +++ /dev/null @@ -1,86 +0,0 @@ -/* - * 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.annotation.SuppressLint -import android.content.Context -import android.view.LayoutInflater -import android.view.MotionEvent -import android.view.ViewGroup -import androidx.recyclerview.widget.RecyclerView -import xyz.quaver.pupil.R -import xyz.quaver.pupil.databinding.MirrorsItemBinding -import xyz.quaver.pupil.util.Preferences -import java.util.* - -class MirrorAdapter(context: Context) : RecyclerView.Adapter() { - - @SuppressLint("ClickableViewAccessibility") - inner class ViewHolder(val binding: MirrorsItemBinding) : RecyclerView.ViewHolder(binding.root) { - init { - binding.mirrorButton.setOnTouchListener { _, event -> - if (event.action == MotionEvent.ACTION_DOWN) - onStartDrag?.invoke(this) - - true - } - } - fun bind(mirror: String) { - binding.mirrorName.text = mirror - } - } - - val mirrors = context.resources.getStringArray(R.array.mirrors).map { - it.split('|').let { split -> - Pair(split.first(), split.last()) - } - }.toMap() - - val list = mirrors.keys.toMutableList().apply { - Preferences.get("mirrors") - .split(">") - .reversed() - .forEach { - if (this.contains(it)) { - this.remove(it) - this.add(0, it) - } - } - } - - val onItemMove : ((Int, Int) -> Unit) = { from, to -> - Collections.swap(list, from, to) - notifyItemMoved(from, to) - onItemMoved?.invoke(list) - } - var onStartDrag : ((ViewHolder) -> Unit)? = null - var onItemMoved : ((List) -> (Unit))? = null - - @SuppressLint("ClickableViewAccessibility") - override fun onBindViewHolder(holder: ViewHolder, position: Int) { - holder.bind(mirrors[list.elementAt(position)] ?: error("")) - } - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { - return ViewHolder(MirrorsItemBinding.inflate(LayoutInflater.from(parent.context), parent, false)) - } - - override fun getItemCount() = mirrors.size - -} \ No newline at end of file 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 b815518b..2f3ae9f5 100644 --- a/app/src/main/java/xyz/quaver/pupil/adapters/ReaderAdapter.kt +++ b/app/src/main/java/xyz/quaver/pupil/adapters/ReaderAdapter.kt @@ -40,7 +40,7 @@ import com.github.piasy.biv.view.BigImageView import com.github.piasy.biv.view.ImageShownCallback import com.github.piasy.biv.view.ImageViewFactory import kotlinx.coroutines.* -import xyz.quaver.hitomi.Reader +import xyz.quaver.hitomi.GalleryInfo import xyz.quaver.pupil.R import xyz.quaver.pupil.databinding.ReaderItemBinding import xyz.quaver.pupil.ui.ReaderActivity @@ -52,7 +52,7 @@ class ReaderAdapter( private val activity: ReaderActivity, private val galleryID: Int ) : RecyclerView.Adapter() { - var reader: Reader? = null + var reader: GalleryInfo? = null var isFullScreen = false @@ -101,7 +101,7 @@ class ReaderAdapter( binding.image.updateLayoutParams { height = 0 dimensionRatio = - "${reader!!.galleryInfo.files[position].width}:${reader!!.galleryInfo.files[position].height}" + "${reader!!.files[position].width}:${reader!!.files[position].height}" } } else { binding.root.layoutParams.height = ViewGroup.LayoutParams.MATCH_PARENT @@ -158,7 +158,7 @@ class ReaderAdapter( holder.bind(position) } - override fun getItemCount() = reader?.galleryInfo?.files?.size ?: 0 + override fun getItemCount() = reader?.files?.size ?: 0 override fun onViewRecycled(holder: ViewHolder) { holder.clear() 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 f38ec3e0..1bd1d3b0 100644 --- a/app/src/main/java/xyz/quaver/pupil/services/DownloadService.kt +++ b/app/src/main/java/xyz/quaver/pupil/services/DownloadService.kt @@ -316,7 +316,7 @@ class DownloadService : Service() { histories.add(galleryID) - progress[galleryID] = MutableList(reader.galleryInfo.files.size) { 0F } + progress[galleryID] = MutableList(reader.files.size) { 0F } cache.metadata.imageList?.let { it.forEachIndexed { index, image -> @@ -334,7 +334,7 @@ class DownloadService : Service() { return@launch } - notification[galleryID]?.setContentTitle(reader.galleryInfo.title?.ellipsize(30)) + notification[galleryID]?.setContentTitle(reader.title?.ellipsize(30)) notify(galleryID) val queued = mutableSetOf() 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 758f8bff..68cd4b7f 100644 --- a/app/src/main/java/xyz/quaver/pupil/ui/ReaderActivity.kt +++ b/app/src/main/java/xyz/quaver/pupil/ui/ReaderActivity.kt @@ -49,7 +49,6 @@ import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.delay import kotlinx.coroutines.launch -import xyz.quaver.Code import xyz.quaver.pupil.R import xyz.quaver.pupil.adapters.ReaderAdapter import xyz.quaver.pupil.databinding.NumberpickerDialogBinding @@ -184,7 +183,7 @@ class ReaderActivity : BaseActivity() { with(binding.numberPicker) { minValue = 1 - maxValue = cache.metadata.reader?.galleryInfo?.files?.size ?: 0 + maxValue = cache.metadata.reader?.files?.size ?: 0 value = currentPage } val dialog = AlertDialog.Builder(this).apply { @@ -307,18 +306,11 @@ class ReaderActivity : BaseActivity() { notifyDataSetChanged() } - title = reader.galleryInfo.title + title = reader.title menu?.findItem(R.id.reader_menu_page_indicator)?.title = - "$currentPage/${reader.galleryInfo.files.size}" + "$currentPage/${reader.files.size}" - menu?.findItem(R.id.reader_type)?.icon = ContextCompat.getDrawable( - this@ReaderActivity, - when (reader.code) { - Code.HITOMI -> R.drawable.hitomi - Code.HIYOBI -> R.drawable.ic_hiyobi - else -> android.R.color.transparent - } - ) + menu?.findItem(R.id.reader_type)?.icon = ContextCompat.getDrawable(this@ReaderActivity, R.drawable.hitomi) } } diff --git a/app/src/main/java/xyz/quaver/pupil/ui/dialog/DownloadLocationDialogFragment.kt b/app/src/main/java/xyz/quaver/pupil/ui/dialog/DownloadLocationDialogFragment.kt index 7e61be12..fec74930 100644 --- a/app/src/main/java/xyz/quaver/pupil/ui/dialog/DownloadLocationDialogFragment.kt +++ b/app/src/main/java/xyz/quaver/pupil/ui/dialog/DownloadLocationDialogFragment.kt @@ -39,7 +39,6 @@ import xyz.quaver.pupil.databinding.DownloadLocationItemBinding import xyz.quaver.pupil.util.Preferences import xyz.quaver.pupil.util.byteToString import xyz.quaver.pupil.util.downloader.DownloadManager -import xyz.quaver.pupil.util.migrate import java.io.File class DownloadLocationDialogFragment : DialogFragment() { @@ -178,8 +177,6 @@ class DownloadLocationDialogFragment : DialogFragment() { setPositiveButton(requireContext().getText(android.R.string.ok)) { _, _ -> if (Preferences["download_folder", ""].isEmpty()) Preferences["download_folder"] = context.getExternalFilesDir(null)?.toUri()?.toString() ?: "" - - DownloadManager.getInstance(requireContext()).migrate() } isCancelable = false diff --git a/app/src/main/java/xyz/quaver/pupil/ui/dialog/MirrorDialog.kt b/app/src/main/java/xyz/quaver/pupil/ui/dialog/MirrorDialog.kt deleted file mode 100644 index aafb58d0..00000000 --- a/app/src/main/java/xyz/quaver/pupil/ui/dialog/MirrorDialog.kt +++ /dev/null @@ -1,91 +0,0 @@ -/* - * 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.ui.dialog - -import android.annotation.SuppressLint -import android.app.Dialog -import android.content.Context -import android.os.Bundle -import android.view.View -import androidx.appcompat.app.AlertDialog -import androidx.recyclerview.widget.DividerItemDecoration -import androidx.recyclerview.widget.ItemTouchHelper -import androidx.recyclerview.widget.LinearLayoutManager -import androidx.recyclerview.widget.RecyclerView -import xyz.quaver.pupil.R -import xyz.quaver.pupil.adapters.MirrorAdapter -import xyz.quaver.pupil.util.Preferences - -class MirrorDialog(context: Context) : AlertDialog(context) { - - class ItemTouchHelperCallback : ItemTouchHelper.Callback() { - - var onMoveItem : ((Int, Int) -> (Unit))? = null - - override fun getMovementFlags( - recyclerView: RecyclerView, - viewHolder: RecyclerView.ViewHolder - ) = makeMovementFlags(ItemTouchHelper.UP or ItemTouchHelper.DOWN, 0) - - override fun onMove( - recyclerView: RecyclerView, - viewHolder: RecyclerView.ViewHolder, - target: RecyclerView.ViewHolder - ): Boolean { - onMoveItem?.invoke(viewHolder.adapterPosition, target.adapterPosition) - return true - } - - override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) { - - } - } - - @SuppressLint("InflateParams") - override fun onCreate(savedInstanceState: Bundle?) { - setTitle(R.string.settings_mirror_title) - setView(build()) - setButton(Dialog.BUTTON_POSITIVE, context.getString(android.R.string.ok)) { _, _ -> } - - super.onCreate(savedInstanceState) - } - - private fun build() : View { - return RecyclerView(context).apply recyclerview@{ - addItemDecoration(DividerItemDecoration(context, DividerItemDecoration.VERTICAL)) - layoutManager = LinearLayoutManager(context) - adapter = MirrorAdapter(context).apply adapter@{ - val itemTouchHelper = ItemTouchHelper(ItemTouchHelperCallback().apply { - onMoveItem = this@adapter.onItemMove - }).apply { - attachToRecyclerView(this@recyclerview) - } - - onStartDrag = { - itemTouchHelper.startDrag(it) - } - - onItemMoved = { - Preferences["mirrors"] = it.joinToString(">") - } - } - } - } - -} \ No newline at end of file diff --git a/app/src/main/java/xyz/quaver/pupil/ui/fragment/SettingsFragment.kt b/app/src/main/java/xyz/quaver/pupil/ui/fragment/SettingsFragment.kt index b1bd3879..e6c40d39 100644 --- a/app/src/main/java/xyz/quaver/pupil/ui/fragment/SettingsFragment.kt +++ b/app/src/main/java/xyz/quaver/pupil/ui/fragment/SettingsFragment.kt @@ -103,10 +103,6 @@ class SettingsFragment : } lockLauncher.launch(intent) } - "mirrors" -> { - MirrorDialog(requireContext()) - .show() - } "proxy" -> { ProxyDialogFragment().show(parentFragmentManager, "Proxy Dialog") } @@ -263,9 +259,6 @@ class SettingsFragment : onPreferenceClickListener = this@SettingsFragment } - "mirrors" -> { - onPreferenceClickListener = this@SettingsFragment - } "proxy" -> { summary = getProxyInfo().type.name 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 60d8ef25..cfa2e071 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 @@ -32,9 +32,8 @@ import kotlinx.serialization.decodeFromString import kotlinx.serialization.encodeToString import kotlinx.serialization.json.Json import okhttp3.Request -import xyz.quaver.Code import xyz.quaver.hitomi.GalleryBlock -import xyz.quaver.hitomi.Reader +import xyz.quaver.hitomi.GalleryInfo import xyz.quaver.io.FileX import xyz.quaver.io.util.* import xyz.quaver.pupil.client @@ -46,7 +45,7 @@ import java.util.concurrent.ConcurrentHashMap @Serializable data class Metadata( var galleryBlock: GalleryBlock? = null, - var reader: Reader? = null, + var reader: GalleryInfo? = null, var imageList: MutableList? = null ) { fun copy(): Metadata = Metadata(galleryBlock, reader, imageList?.let { MutableList(it.size) { i -> it[i] } }) @@ -110,27 +109,13 @@ class Cache private constructor(context: Context, val galleryID: Int) : ContextW } suspend fun getGalleryBlock(): GalleryBlock? { - val sources = listOf( - { xyz.quaver.hitomi.getGalleryBlock(galleryID) }, - { xyz.quaver.hiyobi.getGalleryBlock(galleryID) } - ) - return metadata.galleryBlock ?: withContext(Dispatchers.IO) { - var galleryBlock: GalleryBlock? = null - - for (source in sources) { - galleryBlock = try { - source.invoke() - } catch (e: Exception) { null } - - if (galleryBlock != null) - break - } - - galleryBlock?.also { - setMetadata { metadata -> metadata.galleryBlock = it } - } + try { + xyz.quaver.hitomi.getGalleryBlock(galleryID).also { + setMetadata { metadata -> metadata.galleryBlock = it } + } + } catch (e: Exception) { return@withContext null } } } @@ -154,41 +139,21 @@ class Cache private constructor(context: Context, val galleryID: Int) : ContextW }.getOrNull()?.uri } } } ?: Uri.EMPTY - suspend fun getReader(): Reader? { - val mirrors = Preferences.get("mirrors").let { if (it.isEmpty()) emptyList() else it.split('>') } - - val sources = mapOf( - Code.HITOMI to { xyz.quaver.hitomi.getReader(galleryID) }, - Code.HIYOBI to { xyz.quaver.hiyobi.getReader(galleryID) } - ).let { - if (mirrors.isNotEmpty()) - it.toSortedMap{ o1, o2 -> mirrors.indexOf(o1.name) - mirrors.indexOf(o2.name) } - else - it - } + suspend fun getReader(): GalleryInfo? { return metadata.reader ?: withContext(Dispatchers.IO) { - var reader: Reader? = null + try { + xyz.quaver.hitomi.getGalleryInfo(galleryID).also { + setMetadata { metadata -> + metadata.reader = it - for (source in sources) { - reader = try { - source.value.invoke() - } catch (e: Exception) { - null - } - - if (reader != null) - break - } - - reader?.also { - setMetadata { metadata -> - metadata.reader = it - - if (metadata.imageList == null) - metadata.imageList = MutableList(reader.galleryInfo.files.size) { null } + if (metadata.imageList == null) + metadata.imageList = MutableList(it.files.size) { null } + } } + } catch (e: Exception) { + null } } } 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 5aba4d89..b0d040cb 100644 --- a/app/src/main/java/xyz/quaver/pupil/util/misc.kt +++ b/app/src/main/java/xyz/quaver/pupil/util/misc.kt @@ -19,19 +19,13 @@ package xyz.quaver.pupil.util import android.annotation.SuppressLint -import android.content.Context -import android.content.Intent -import android.os.Build -import androidx.core.content.ContextCompat import kotlinx.serialization.json.* import okhttp3.OkHttpClient import okhttp3.Request -import xyz.quaver.Code import xyz.quaver.hitomi.GalleryBlock -import xyz.quaver.hitomi.Reader +import xyz.quaver.hitomi.GalleryInfo import xyz.quaver.hitomi.getReferer import xyz.quaver.hitomi.imageUrlFromImage -import xyz.quaver.hiyobi.createImgList import java.util.* import kotlin.collections.ArrayList @@ -41,7 +35,7 @@ fun String.wordCapitalize() : String { @SuppressLint("DefaultLocale") for (word in this.split(" ")) - result.add(word.capitalize(Locale.US)) + result.add(word.replaceFirstChar { if (it.isLowerCase()) it.titlecase(Locale.US) else it.toString() }) return result.joinToString(" ") } @@ -103,25 +97,15 @@ fun GalleryBlock.formatDownloadFolderTest(format: String): String = } }.replace(Regex("""[*\\|"?><:/]"""), "").ellipsize(127) -val Reader.requestBuilders: List +val GalleryInfo.requestBuilders: List get() { - val galleryID = this.galleryInfo.id ?: 0 + val galleryID = this.id ?: 0 val lowQuality = Preferences["low_quality", true] - return when(code) { - Code.HITOMI -> { - this.galleryInfo.files.map { - Request.Builder() - .url(imageUrlFromImage(galleryID, it, !lowQuality)) - .header("Referer", getReferer(galleryID)) - } - } - Code.HIYOBI -> { - createImgList(galleryID, this, lowQuality).map { - Request.Builder() - .url(it.path) - } - } + return this.files.map { + Request.Builder() + .url(imageUrlFromImage(galleryID, it, !lowQuality)) + .header("Referer", getReferer(galleryID)) } } diff --git a/app/src/main/java/xyz/quaver/pupil/util/update.kt b/app/src/main/java/xyz/quaver/pupil/util/update.kt index e8e3bb90..b97ca4b2 100644 --- a/app/src/main/java/xyz/quaver/pupil/util/update.kt +++ b/app/src/main/java/xyz/quaver/pupil/util/update.kt @@ -18,48 +18,26 @@ package xyz.quaver.pupil.util -import android.annotation.SuppressLint import android.app.DownloadManager -import android.app.PendingIntent -import android.content.BroadcastReceiver import android.content.Context -import android.content.Intent -import android.content.IntentFilter import android.net.Uri -import android.util.Base64 import android.webkit.URLUtil import androidx.appcompat.app.AlertDialog -import androidx.core.app.NotificationCompat -import androidx.core.app.NotificationManagerCompat import androidx.preference.PreferenceManager import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.Job import kotlinx.coroutines.launch import kotlinx.serialization.decodeFromString -import kotlinx.serialization.encodeToString import kotlinx.serialization.json.* import okhttp3.Call import okhttp3.Callback import okhttp3.Request import okhttp3.Response import ru.noties.markwon.Markwon -import xyz.quaver.hitomi.GalleryBlock -import xyz.quaver.hitomi.Reader -import xyz.quaver.hitomi.getGalleryBlock -import xyz.quaver.hitomi.getReader -import xyz.quaver.io.FileX -import xyz.quaver.io.util.getChild -import xyz.quaver.io.util.readText -import xyz.quaver.io.util.writeBytes -import xyz.quaver.io.util.writeText import xyz.quaver.pupil.BuildConfig import xyz.quaver.pupil.R import xyz.quaver.pupil.client import xyz.quaver.pupil.favorites -import xyz.quaver.pupil.services.DownloadService -import xyz.quaver.pupil.util.downloader.Cache -import xyz.quaver.pupil.util.downloader.Metadata import java.io.File import java.io.IOException import java.net.URL @@ -220,127 +198,4 @@ fun restore(url: String, onFailure: ((Throwable) -> Unit)? = null, onSuccess: (( }.onFailure { onFailure?.invoke(it) } } }) -} - -private var job: Job? = null -private val receiver = object: BroadcastReceiver() { - val ACTION_CANCEL = "ACTION_IMPORT_CANCEL" - override fun onReceive(context: Context?, intent: Intent?) { - context ?: return - - when (intent?.action) { - ACTION_CANCEL -> { - job?.cancel() - NotificationManagerCompat.from(context).cancel(R.id.notification_id_import) - context.unregisterReceiver(this) - } - } - } -} -@SuppressLint("RestrictedApi") -fun xyz.quaver.pupil.util.downloader.DownloadManager.migrate() { - registerReceiver(receiver, IntentFilter().apply { addAction(receiver.ACTION_CANCEL) }) - - val notificationManager = NotificationManagerCompat.from(this) - val action = NotificationCompat.Action.Builder(0, getText(android.R.string.cancel), - PendingIntent.getBroadcast(this, R.id.notification_import_cancel_action.normalizeID(), Intent(receiver.ACTION_CANCEL), PendingIntent.FLAG_UPDATE_CURRENT) - ).build() - val notification = NotificationCompat.Builder(this, "import") - .setContentTitle(getText(R.string.import_old_galleries_notification)) - .setProgress(0, 0, true) - .addAction(action) - .setSmallIcon(R.drawable.ic_notification) - .setOngoing(true) - - DownloadService.cancel(this) - - job?.cancel() - job = CoroutineScope(Dispatchers.IO).launch { - val images = listOf( - "jpg", - "png", - "gif", - "webp" - ) - - val downloadFolders = downloadFolder.listFiles { folder -> - folder.isDirectory && !downloadFolderMap.values.contains(folder.name) - }?.map { - if (it !is FileX) - FileX(this@migrate, it) - else - it - } - - if (downloadFolders.isNullOrEmpty()) return@launch - - downloadFolders.forEachIndexed { index, folder -> - notification - .setContentText(getString(R.string.import_old_galleries_notification_text, index, downloadFolders.size)) - .setProgress(index, downloadFolders.size, false) - notificationManager.notify(R.id.notification_id_import, notification.build()) - - val metadata = kotlin.runCatching { - folder.getChild(".metadata").readText()?.let { Json.parseToJsonElement(it) } - }.getOrNull() - - val galleryID = metadata?.getOrNull("reader")?.getOrNull("galleryInfo")?.getOrNull("id")?.content?.toIntOrNull() - ?: folder.name.toIntOrNull() ?: return@forEachIndexed - - val galleryBlock: GalleryBlock? = kotlin.runCatching { - metadata?.getOrNull("galleryBlock")?.let { Json.decodeFromJsonElement(it) } - }.getOrNull() ?: kotlin.runCatching { - getGalleryBlock(galleryID) - }.getOrNull() ?: kotlin.runCatching { - xyz.quaver.hiyobi.getGalleryBlock(galleryID) - }.getOrNull() - - val reader: Reader? = kotlin.runCatching { - metadata?.getOrNull("reader")?.let { Json.decodeFromJsonElement(it) } - }.getOrNull() ?: kotlin.runCatching { - getReader(galleryID) - }.getOrNull() ?: kotlin.runCatching { - xyz.quaver.hiyobi.getReader(galleryID) - }.getOrNull() - - metadata?.getOrNull("thumbnail")?.jsonPrimitive?.contentOrNull?.also { thumbnail -> - val file = folder.getChild(".thumbnail").also { - if (it.exists()) - it.delete() - it.createNewFile() - } - - file.writeBytes(Base64.decode(thumbnail, Base64.DEFAULT)) - } - - val list: MutableList = - MutableList(reader!!.galleryInfo.files.size) { null } - - folder.list { _, name -> - name?.substringAfterLast('.') in images - }?.sorted()?.take(list.size)?.forEachIndexed { i, name -> - list[i] = name - } - - folder.getChild(".metadata").also { if (it.exists()) it.delete(); it.createNewFile() }.writeText( - Json.encodeToString(Metadata(galleryBlock, reader, list)) - ) - - Cache.delete(this@migrate, galleryID) - downloadFolderMap[galleryID] = folder.name - - downloadFolder.getChild(".download").let { if (!it.exists()) it.createNewFile(); it.writeText(Json.encodeToString(downloadFolderMap)) } - } - - notification - .setContentText(getText(R.string.import_old_galleries_notification_done)) - .setProgress(0, 0, false) - .setOngoing(false) - .mActions.clear() - notificationManager.notify(R.id.notification_id_import, notification.build()) - - kotlin.runCatching { - unregisterReceiver(receiver) - } - } } \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_hiyobi.png b/app/src/main/res/drawable/ic_hiyobi.png deleted file mode 100644 index 2af60c05..00000000 Binary files a/app/src/main/res/drawable/ic_hiyobi.png and /dev/null differ diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml index 2f211b43..f95e86de 100644 --- a/app/src/main/res/values/arrays.xml +++ b/app/src/main/res/values/arrays.xml @@ -48,11 +48,6 @@ japanese|日本語 - - HITOMI|hitomi.la - HIYOBI|hiyobi.me - - Direct HTTP diff --git a/app/src/main/res/xml/root_preferences.xml b/app/src/main/res/xml/root_preferences.xml index 71936739..dc2e2624 100644 --- a/app/src/main/res/xml/root_preferences.xml +++ b/app/src/main/res/xml/root_preferences.xml @@ -76,11 +76,6 @@ - - diff --git a/build.gradle b/build.gradle index 3db67027..d30f8a22 100644 --- a/build.gradle +++ b/build.gradle @@ -3,26 +3,26 @@ buildscript { repositories { google() - jcenter() + mavenCentral() } dependencies { - classpath 'com.android.tools.build:gradle:4.1.2' + classpath 'com.android.tools.build:gradle:4.2.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" - classpath "com.google.gms:google-services:4.3.5" + classpath "com.google.gms:google-services:4.3.8" // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files - classpath "com.google.firebase:firebase-crashlytics-gradle:2.5.0" - classpath "com.google.firebase:perf-plugin:1.3.4" - classpath "com.google.android.gms:oss-licenses-plugin:0.10.2" + classpath "com.google.firebase:firebase-crashlytics-gradle:2.7.0" + classpath "com.google.firebase:perf-plugin:1.4.0" + classpath "com.google.android.gms:oss-licenses-plugin:0.10.4" } } allprojects { repositories { - maven { url "http://dl.bintray.com/piasy/maven" } google() + mavenCentral() jcenter() maven { url "https://jitpack.io" } maven { url "https://guardian.github.com/maven/repo-releases" } diff --git a/gradle.properties b/gradle.properties index bf7c1c65..158703d0 100644 --- a/gradle.properties +++ b/gradle.properties @@ -20,4 +20,4 @@ kotlin.code.style=official android.enableJetifier=true android.useAndroidX=true -kotlin_version=1.4.30 \ No newline at end of file +kotlin_version=1.5.10 \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 52c5f178..906f70c5 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-6.7.1-all.zip