Compare commits
10 Commits
source
...
5.1.8-beta
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2c56bcacee | ||
|
|
c8202db3c6 | ||
|
|
223d689b0c | ||
|
|
4f0e7d9696 | ||
|
|
f4ce911de9 | ||
|
|
46ec9e48d9 | ||
|
|
26bcef1cc0 | ||
|
|
bfb2f44f8f | ||
|
|
28b19b6774 | ||
|
|
65ea09854e |
@@ -38,7 +38,7 @@ android {
|
|||||||
minSdkVersion 16
|
minSdkVersion 16
|
||||||
targetSdkVersion 30
|
targetSdkVersion 30
|
||||||
versionCode 64
|
versionCode 64
|
||||||
versionName "5.1.7-beta1"
|
versionName "5.1.8-beta1"
|
||||||
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||||
vectorDrawables.useSupportLibrary = true
|
vectorDrawables.useSupportLibrary = true
|
||||||
}
|
}
|
||||||
@@ -84,34 +84,34 @@ dependencies {
|
|||||||
implementation "org.jetbrains.kotlinx:kotlinx-serialization-json:1.0.1"
|
implementation "org.jetbrains.kotlinx:kotlinx-serialization-json:1.0.1"
|
||||||
|
|
||||||
implementation "androidx.appcompat:appcompat:1.2.0"
|
implementation "androidx.appcompat:appcompat:1.2.0"
|
||||||
implementation "androidx.activity:activity-ktx:1.2.0-beta01"
|
implementation "androidx.activity:activity-ktx:1.3.0-alpha02"
|
||||||
implementation "androidx.fragment:fragment-ktx:1.3.0-beta01"
|
implementation "androidx.fragment:fragment-ktx:1.3.0"
|
||||||
implementation "androidx.preference:preference-ktx:1.1.1"
|
implementation "androidx.preference:preference-ktx:1.1.1"
|
||||||
implementation "androidx.recyclerview:recyclerview:1.1.0"
|
implementation "androidx.recyclerview:recyclerview:1.1.0"
|
||||||
implementation "androidx.constraintlayout:constraintlayout:2.0.4"
|
implementation "androidx.constraintlayout:constraintlayout:2.0.4"
|
||||||
implementation "androidx.gridlayout:gridlayout:1.0.0"
|
implementation "androidx.gridlayout:gridlayout:1.0.0"
|
||||||
implementation "androidx.biometric:biometric:1.0.1"
|
implementation "androidx.biometric:biometric:1.1.0"
|
||||||
implementation "androidx.work:work-runtime-ktx:2.4.0"
|
implementation "androidx.work:work-runtime-ktx:2.5.0"
|
||||||
|
|
||||||
implementation "com.daimajia.swipelayout:library:1.2.0@aar"
|
implementation "com.daimajia.swipelayout:library:1.2.0@aar"
|
||||||
|
|
||||||
implementation "com.google.android.material:material:1.3.0-alpha04"
|
implementation "com.google.android.material:material:1.3.0"
|
||||||
|
|
||||||
implementation "com.google.firebase:firebase-core:18.0.0"
|
implementation "com.google.firebase:firebase-core:18.0.2"
|
||||||
implementation "com.google.firebase:firebase-analytics:18.0.0"
|
implementation "com.google.firebase:firebase-analytics:18.0.2"
|
||||||
implementation "com.google.firebase:firebase-crashlytics:17.3.0"
|
implementation "com.google.firebase:firebase-crashlytics:17.3.1"
|
||||||
implementation "com.google.firebase:firebase-perf:19.0.10"
|
implementation "com.google.firebase:firebase-perf:19.1.0"
|
||||||
|
|
||||||
implementation "com.google.android.gms:play-services-oss-licenses:17.0.0"
|
implementation "com.google.android.gms:play-services-oss-licenses:17.0.0"
|
||||||
implementation "com.google.android.gms:play-services-mlkit-face-detection:16.1.1"
|
implementation "com.google.android.gms:play-services-mlkit-face-detection:16.1.4"
|
||||||
|
|
||||||
implementation "com.github.clans:fab:1.6.4"
|
implementation "com.github.clans:fab:1.6.4"
|
||||||
|
|
||||||
//implementation "com.quiph.ui:recyclerviewfastscroller:0.2.1"
|
//implementation "com.quiph.ui:recyclerviewfastscroller:0.2.1"
|
||||||
|
|
||||||
implementation 'com.github.piasy:BigImageViewer:1.6.7'
|
implementation 'com.github.piasy:BigImageViewer:1.7.0'
|
||||||
implementation 'com.github.piasy:FrescoImageLoader:1.6.7'
|
implementation 'com.github.piasy:FrescoImageLoader:1.7.0'
|
||||||
implementation 'com.github.piasy:FrescoImageViewFactory:1.6.7'
|
implementation 'com.github.piasy:FrescoImageViewFactory:1.7.0'
|
||||||
|
|
||||||
//noinspection GradleDependency
|
//noinspection GradleDependency
|
||||||
implementation "com.squareup.okhttp3:okhttp:$okhttp_version"
|
implementation "com.squareup.okhttp3:okhttp:$okhttp_version"
|
||||||
@@ -128,7 +128,7 @@ dependencies {
|
|||||||
|
|
||||||
implementation "xyz.quaver:libpupil:1.8.16"
|
implementation "xyz.quaver:libpupil:1.8.16"
|
||||||
implementation "xyz.quaver:documentfilex:0.4-alpha02"
|
implementation "xyz.quaver:documentfilex:0.4-alpha02"
|
||||||
implementation "xyz.quaver:floatingsearchview:1.0.7"
|
implementation "xyz.quaver:floatingsearchview:1.1.1"
|
||||||
|
|
||||||
testImplementation "junit:junit:4.13.1"
|
testImplementation "junit:junit:4.13.1"
|
||||||
androidTestImplementation "androidx.test.ext:junit:1.1.2"
|
androidTestImplementation "androidx.test.ext:junit:1.1.2"
|
||||||
|
|||||||
@@ -11,7 +11,7 @@
|
|||||||
"type": "SINGLE",
|
"type": "SINGLE",
|
||||||
"filters": [],
|
"filters": [],
|
||||||
"versionCode": 64,
|
"versionCode": 64,
|
||||||
"versionName": "5.1.7-beta1",
|
"versionName": "5.1.8-beta1",
|
||||||
"outputFile": "app-release.apk"
|
"outputFile": "app-release.apk"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -26,6 +26,7 @@ import android.content.Context
|
|||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
import android.net.Uri
|
import android.net.Uri
|
||||||
import android.os.Build
|
import android.os.Build
|
||||||
|
import android.util.Log
|
||||||
import androidx.appcompat.app.AppCompatDelegate
|
import androidx.appcompat.app.AppCompatDelegate
|
||||||
import androidx.core.content.ContextCompat
|
import androidx.core.content.ContextCompat
|
||||||
import androidx.preference.PreferenceManager
|
import androidx.preference.PreferenceManager
|
||||||
@@ -34,8 +35,8 @@ import com.github.piasy.biv.loader.fresco.FrescoImageLoader
|
|||||||
import com.google.android.gms.common.GooglePlayServicesNotAvailableException
|
import com.google.android.gms.common.GooglePlayServicesNotAvailableException
|
||||||
import com.google.android.gms.common.GooglePlayServicesRepairableException
|
import com.google.android.gms.common.GooglePlayServicesRepairableException
|
||||||
import com.google.android.gms.security.ProviderInstaller
|
import com.google.android.gms.security.ProviderInstaller
|
||||||
import com.google.firebase.analytics.FirebaseAnalytics
|
|
||||||
import com.google.firebase.crashlytics.FirebaseCrashlytics
|
import com.google.firebase.crashlytics.FirebaseCrashlytics
|
||||||
|
import okhttp3.Dispatcher
|
||||||
import okhttp3.Interceptor
|
import okhttp3.Interceptor
|
||||||
import okhttp3.OkHttpClient
|
import okhttp3.OkHttpClient
|
||||||
import okhttp3.Response
|
import okhttp3.Response
|
||||||
@@ -46,6 +47,7 @@ import xyz.quaver.pupil.util.downloader.DownloadManager
|
|||||||
import xyz.quaver.setClient
|
import xyz.quaver.setClient
|
||||||
import java.io.File
|
import java.io.File
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
import java.util.concurrent.Executors
|
||||||
import java.util.concurrent.TimeUnit
|
import java.util.concurrent.TimeUnit
|
||||||
import kotlin.reflect.KClass
|
import kotlin.reflect.KClass
|
||||||
|
|
||||||
@@ -96,6 +98,11 @@ class Pupil : Application() {
|
|||||||
val tag = request.tag() ?: return@addInterceptor chain.proceed(request)
|
val tag = request.tag() ?: return@addInterceptor chain.proceed(request)
|
||||||
|
|
||||||
interceptors[tag::class]?.invoke(chain) ?: chain.proceed(request)
|
interceptors[tag::class]?.invoke(chain) ?: chain.proceed(request)
|
||||||
|
}.apply {
|
||||||
|
(Preferences.get<String>("max_concurrent_download").toIntOrNull() ?: 0).let {
|
||||||
|
if (it != 0)
|
||||||
|
dispatcher(Dispatcher(Executors.newFixedThreadPool(it)))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
@@ -125,8 +132,13 @@ class Pupil : Application() {
|
|||||||
favoriteTags = SavedSet(File(ContextCompat.getDataDir(this), "favorites_tags.json"), Tag.parse(""))
|
favoriteTags = SavedSet(File(ContextCompat.getDataDir(this), "favorites_tags.json"), Tag.parse(""))
|
||||||
searchHistory = SavedSet(File(ContextCompat.getDataDir(this), "search_histories.json"), "")
|
searchHistory = SavedSet(File(ContextCompat.getDataDir(this), "search_histories.json"), "")
|
||||||
|
|
||||||
|
favoriteTags.filter { it.tag.contains('_') }.forEach {
|
||||||
|
favoriteTags.remove(it)
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
if (BuildConfig.DEBUG)
|
if (BuildConfig.DEBUG)
|
||||||
FirebaseAnalytics.getInstance(this).setAnalyticsCollectionEnabled(false)
|
FirebaseAnalytics.getInstance(this).setAnalyticsCollectionEnabled(false)*/
|
||||||
|
|
||||||
try {
|
try {
|
||||||
ProviderInstaller.installIfNeeded(this)
|
ProviderInstaller.installIfNeeded(this)
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ package xyz.quaver.pupil.ui
|
|||||||
import android.annotation.SuppressLint
|
import android.annotation.SuppressLint
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
import android.net.Uri
|
import android.net.Uri
|
||||||
|
import android.os.Build
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.text.InputType
|
import android.text.InputType
|
||||||
import android.text.util.Linkify
|
import android.text.util.Linkify
|
||||||
@@ -31,8 +32,8 @@ import android.view.animation.DecelerateInterpolator
|
|||||||
import android.widget.EditText
|
import android.widget.EditText
|
||||||
import android.widget.TextView
|
import android.widget.TextView
|
||||||
import androidx.appcompat.app.AlertDialog
|
import androidx.appcompat.app.AlertDialog
|
||||||
import androidx.appcompat.app.AppCompatDelegate
|
|
||||||
import androidx.cardview.widget.CardView
|
import androidx.cardview.widget.CardView
|
||||||
|
import androidx.core.content.ContextCompat
|
||||||
import androidx.core.view.GravityCompat
|
import androidx.core.view.GravityCompat
|
||||||
import androidx.core.view.ViewCompat
|
import androidx.core.view.ViewCompat
|
||||||
import androidx.recyclerview.widget.RecyclerView
|
import androidx.recyclerview.widget.RecyclerView
|
||||||
@@ -126,6 +127,21 @@ class MainActivity :
|
|||||||
|
|
||||||
checkUpdate(this)
|
checkUpdate(this)
|
||||||
|
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R &&
|
||||||
|
!Preferences["download_folder_ignore_warning", false] &&
|
||||||
|
ContextCompat.getExternalFilesDirs(this, null).map { Uri.fromFile(it).toString() }
|
||||||
|
.contains(Preferences["download_folder", ""])
|
||||||
|
) {
|
||||||
|
AlertDialog.Builder(this)
|
||||||
|
.setTitle(R.string.warning)
|
||||||
|
.setMessage(R.string.unaccessible_download_folder)
|
||||||
|
.setPositiveButton(android.R.string.ok) { _, _ ->
|
||||||
|
DownloadLocationDialogFragment().show(supportFragmentManager, "Download Location Dialog")
|
||||||
|
}.setNegativeButton(R.string.ignore) { _, _ ->
|
||||||
|
Preferences["download_folder_ignore_warning"] = true
|
||||||
|
}.show()
|
||||||
|
}
|
||||||
|
|
||||||
initView()
|
initView()
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -196,7 +212,7 @@ class MainActivity :
|
|||||||
min(
|
min(
|
||||||
max(
|
max(
|
||||||
binding.contents.searchview.translationY - dy,
|
binding.contents.searchview.translationY - dy,
|
||||||
-binding.contents.searchview.findViewById<CardView>(R.id.search_query_section).height.toFloat()
|
-binding.contents.searchview.binding.querySection.root.height.toFloat()
|
||||||
), 0F)
|
), 0F)
|
||||||
|
|
||||||
if (dy > 0)
|
if (dy > 0)
|
||||||
@@ -458,7 +474,7 @@ class MainActivity :
|
|||||||
with(binding.contents.searchview) {
|
with(binding.contents.searchview) {
|
||||||
onMenuStatusChangeListener = object: FloatingSearchView.OnMenuStatusChangeListener {
|
onMenuStatusChangeListener = object: FloatingSearchView.OnMenuStatusChangeListener {
|
||||||
override fun onMenuOpened() {
|
override fun onMenuOpened() {
|
||||||
(binding.contents.recyclerview.adapter as GalleryBlockAdapter).closeAllItems()
|
(this@MainActivity.binding.contents.recyclerview.adapter as GalleryBlockAdapter).closeAllItems()
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onMenuClosed() {
|
override fun onMenuClosed() {
|
||||||
@@ -542,7 +558,7 @@ class MainActivity :
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
attachNavigationDrawerToMenuButton(binding.drawer)
|
attachNavigationDrawerToMenuButton(this@MainActivity.binding.drawer)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -19,25 +19,29 @@
|
|||||||
package xyz.quaver.pupil.ui.dialog
|
package xyz.quaver.pupil.ui.dialog
|
||||||
|
|
||||||
import android.app.Dialog
|
import android.app.Dialog
|
||||||
import android.content.Context
|
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.text.Editable
|
import android.text.Editable
|
||||||
import android.text.TextWatcher
|
import android.text.TextWatcher
|
||||||
import android.widget.ArrayAdapter
|
import android.widget.ArrayAdapter
|
||||||
import androidx.appcompat.app.AlertDialog
|
import androidx.appcompat.app.AlertDialog
|
||||||
|
import androidx.fragment.app.DialogFragment
|
||||||
import xyz.quaver.pupil.R
|
import xyz.quaver.pupil.R
|
||||||
import xyz.quaver.pupil.databinding.DefaultQueryDialogBinding
|
import xyz.quaver.pupil.databinding.DefaultQueryDialogBinding
|
||||||
import xyz.quaver.pupil.types.Tags
|
import xyz.quaver.pupil.types.Tags
|
||||||
import xyz.quaver.pupil.util.Preferences
|
import xyz.quaver.pupil.util.Preferences
|
||||||
|
|
||||||
class DefaultQueryDialog(context : Context) : AlertDialog(context) {
|
class DefaultQueryDialog : DialogFragment() {
|
||||||
|
|
||||||
private val languages = context.resources.getStringArray(R.array.languages).map {
|
private val languages: Map<String, String> by lazy {
|
||||||
it.split("|").let { split ->
|
requireContext().resources.getStringArray(R.array.languages).map {
|
||||||
Pair(split[0], split[1])
|
it.split("|").let { split ->
|
||||||
}
|
Pair(split[0], split[1])
|
||||||
}.toMap()
|
}
|
||||||
private val reverseLanguages = languages.entries.associate { (k, v) -> v to k }
|
}.toMap()
|
||||||
|
}
|
||||||
|
private val reverseLanguages: Map<String, String> by lazy {
|
||||||
|
languages.entries.associate { (k, v) -> v to k }
|
||||||
|
}
|
||||||
|
|
||||||
private val excludeBL = "-male:yaoi"
|
private val excludeBL = "-male:yaoi"
|
||||||
private val excludeGuro = listOf("-female:guro", "-male:guro")
|
private val excludeGuro = listOf("-female:guro", "-male:guro")
|
||||||
@@ -45,41 +49,8 @@ class DefaultQueryDialog(context : Context) : AlertDialog(context) {
|
|||||||
|
|
||||||
var onPositiveButtonClickListener : ((Tags) -> (Unit))? = null
|
var onPositiveButtonClickListener : ((Tags) -> (Unit))? = null
|
||||||
|
|
||||||
private lateinit var binding: DefaultQueryDialogBinding
|
private var _binding: DefaultQueryDialogBinding? = null
|
||||||
|
private val binding get() = _binding!!
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
|
||||||
super.onCreate(savedInstanceState)
|
|
||||||
|
|
||||||
setTitle(R.string.default_query_dialog_title)
|
|
||||||
binding = DefaultQueryDialogBinding.inflate(layoutInflater)
|
|
||||||
setView(binding.root)
|
|
||||||
|
|
||||||
initView()
|
|
||||||
|
|
||||||
setButton(Dialog.BUTTON_POSITIVE, context.getString(android.R.string.ok)) { _, _ ->
|
|
||||||
val newTags = Tags.parse(binding.edittext.text.toString())
|
|
||||||
|
|
||||||
with(binding.languageSelector) {
|
|
||||||
if (selectedItemPosition != 0)
|
|
||||||
newTags.add("language:${reverseLanguages[selectedItem]}")
|
|
||||||
}
|
|
||||||
|
|
||||||
if (binding.BLCheckbox.isChecked)
|
|
||||||
newTags.add(excludeBL)
|
|
||||||
|
|
||||||
if (binding.guroCheckbox.isChecked)
|
|
||||||
excludeGuro.forEach { tag ->
|
|
||||||
newTags.add(tag)
|
|
||||||
}
|
|
||||||
|
|
||||||
if (binding.loliCheckbox.isChecked)
|
|
||||||
excludeLoli.forEach { tag ->
|
|
||||||
newTags.add(tag)
|
|
||||||
}
|
|
||||||
|
|
||||||
onPositiveButtonClickListener?.invoke(newTags)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun initView() {
|
private fun initView() {
|
||||||
val tags = Tags.parse(
|
val tags = Tags.parse(
|
||||||
@@ -158,4 +129,43 @@ class DefaultQueryDialog(context : Context) : AlertDialog(context) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
|
||||||
|
_binding = DefaultQueryDialogBinding.inflate(layoutInflater)
|
||||||
|
|
||||||
|
initView()
|
||||||
|
|
||||||
|
return AlertDialog.Builder(requireContext()).apply {
|
||||||
|
setTitle(R.string.default_query_dialog_title)
|
||||||
|
setView(binding.root)
|
||||||
|
setPositiveButton(android.R.string.ok) { _, _ ->
|
||||||
|
val newTags = Tags.parse(binding.edittext.text.toString())
|
||||||
|
|
||||||
|
with(binding.languageSelector) {
|
||||||
|
if (selectedItemPosition != 0)
|
||||||
|
newTags.add("language:${reverseLanguages[selectedItem]}")
|
||||||
|
}
|
||||||
|
|
||||||
|
if (binding.BLCheckbox.isChecked)
|
||||||
|
newTags.add(excludeBL)
|
||||||
|
|
||||||
|
if (binding.guroCheckbox.isChecked)
|
||||||
|
excludeGuro.forEach { tag ->
|
||||||
|
newTags.add(tag)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (binding.loliCheckbox.isChecked)
|
||||||
|
excludeLoli.forEach { tag ->
|
||||||
|
newTags.add(tag)
|
||||||
|
}
|
||||||
|
|
||||||
|
onPositiveButtonClickListener?.invoke(newTags)
|
||||||
|
}
|
||||||
|
}.create()
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onDestroy() {
|
||||||
|
super.onDestroy()
|
||||||
|
_binding = null
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -51,14 +51,11 @@ class DownloadLocationDialogFragment : DialogFragment() {
|
|||||||
|
|
||||||
private val requestDownloadFolderLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
|
private val requestDownloadFolderLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
|
||||||
if (it.resultCode == Activity.RESULT_OK) {
|
if (it.resultCode == Activity.RESULT_OK) {
|
||||||
val activity = activity ?: return@registerForActivityResult
|
|
||||||
val context = context ?: return@registerForActivityResult
|
val context = context ?: return@registerForActivityResult
|
||||||
val dialog = dialog ?: return@registerForActivityResult
|
val dialog = dialog ?: return@registerForActivityResult
|
||||||
|
|
||||||
it.data?.data?.also { uri ->
|
it.data?.data?.also { uri ->
|
||||||
val takeFlags: Int =
|
val takeFlags: Int = Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION
|
||||||
activity.intent.flags and
|
|
||||||
(Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION)
|
|
||||||
|
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT)
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT)
|
||||||
context.contentResolver.takePersistableUriPermission(uri, takeFlags)
|
context.contentResolver.takePersistableUriPermission(uri, takeFlags)
|
||||||
|
|||||||
@@ -203,7 +203,7 @@ class GalleryDialog(context: Context, private val galleryID: Int) : AlertDialog(
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun addRelated(gallery: Gallery) {
|
private fun addRelated(gallery: Gallery) {
|
||||||
val galleries = ArrayList<Int>()
|
val galleries = mutableListOf<Int>()
|
||||||
|
|
||||||
val adapter = GalleryBlockAdapter(galleries).apply {
|
val adapter = GalleryBlockAdapter(galleries).apply {
|
||||||
onChipClickedHandler.add { tag ->
|
onChipClickedHandler.add { tag ->
|
||||||
@@ -216,7 +216,7 @@ class GalleryDialog(context: Context, private val galleryID: Int) : AlertDialog(
|
|||||||
GalleryDialogDetailsBinding.inflate(layoutInflater, binding.contents, true).apply {
|
GalleryDialogDetailsBinding.inflate(layoutInflater, binding.contents, true).apply {
|
||||||
type.setText(R.string.gallery_related)
|
type.setText(R.string.gallery_related)
|
||||||
|
|
||||||
RecyclerView(context).apply {
|
contents.addView(RecyclerView(context).apply {
|
||||||
layoutManager = LinearLayoutManager(context)
|
layoutManager = LinearLayoutManager(context)
|
||||||
this.adapter = adapter
|
this.adapter = adapter
|
||||||
|
|
||||||
@@ -236,7 +236,7 @@ class GalleryDialog(context: Context, private val galleryID: Int) : AlertDialog(
|
|||||||
true
|
true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
})
|
||||||
|
|
||||||
CoroutineScope(Dispatchers.IO).launch {
|
CoroutineScope(Dispatchers.IO).launch {
|
||||||
gallery.related.forEach { galleryID ->
|
gallery.related.forEach { galleryID ->
|
||||||
|
|||||||
@@ -45,7 +45,7 @@ class ProxyDialog(context: Context) : AlertDialog(context) {
|
|||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
|
|
||||||
binding = ProxyDialogBinding.inflate(layoutInflater)
|
binding = ProxyDialogBinding.inflate(layoutInflater)
|
||||||
setView(binding.root)
|
setContentView(binding.root)
|
||||||
|
|
||||||
initView()
|
initView()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -29,15 +29,20 @@ import com.google.android.gms.oss.licenses.OssLicensesMenuActivity
|
|||||||
import kotlinx.coroutines.CoroutineScope
|
import kotlinx.coroutines.CoroutineScope
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
|
import okhttp3.Dispatcher
|
||||||
import xyz.quaver.io.FileX
|
import xyz.quaver.io.FileX
|
||||||
import xyz.quaver.io.util.getChild
|
import xyz.quaver.io.util.getChild
|
||||||
import xyz.quaver.pupil.R
|
import xyz.quaver.pupil.R
|
||||||
|
import xyz.quaver.pupil.client
|
||||||
|
import xyz.quaver.pupil.clientBuilder
|
||||||
|
import xyz.quaver.pupil.clientHolder
|
||||||
import xyz.quaver.pupil.ui.LockActivity
|
import xyz.quaver.pupil.ui.LockActivity
|
||||||
import xyz.quaver.pupil.ui.SettingsActivity
|
import xyz.quaver.pupil.ui.SettingsActivity
|
||||||
import xyz.quaver.pupil.ui.dialog.*
|
import xyz.quaver.pupil.ui.dialog.*
|
||||||
import xyz.quaver.pupil.util.*
|
import xyz.quaver.pupil.util.*
|
||||||
import xyz.quaver.pupil.util.downloader.DownloadManager
|
import xyz.quaver.pupil.util.downloader.DownloadManager
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
import java.util.concurrent.Executors
|
||||||
|
|
||||||
class SettingsFragment :
|
class SettingsFragment :
|
||||||
PreferenceFragmentCompat(),
|
PreferenceFragmentCompat(),
|
||||||
@@ -85,12 +90,12 @@ class SettingsFragment :
|
|||||||
DownloadLocationDialogFragment().show(parentFragmentManager, "Download Location Dialog")
|
DownloadLocationDialogFragment().show(parentFragmentManager, "Download Location Dialog")
|
||||||
}
|
}
|
||||||
"default_query" -> {
|
"default_query" -> {
|
||||||
DefaultQueryDialog(requireContext()).apply {
|
DefaultQueryDialog().apply {
|
||||||
onPositiveButtonClickListener = { newTags ->
|
onPositiveButtonClickListener = { newTags ->
|
||||||
Preferences["default_query"] = newTags.toString()
|
Preferences["default_query"] = newTags.toString()
|
||||||
summary = newTags.toString()
|
summary = newTags.toString()
|
||||||
}
|
}
|
||||||
}.show()
|
}.show(parentFragmentManager, "Default Query Dialog")
|
||||||
}
|
}
|
||||||
"app_lock" -> {
|
"app_lock" -> {
|
||||||
val intent = Intent(requireContext(), LockActivity::class.java).apply {
|
val intent = Intent(requireContext(), LockActivity::class.java).apply {
|
||||||
@@ -168,6 +173,18 @@ class SettingsFragment :
|
|||||||
"download_folder_name" -> {
|
"download_folder_name" -> {
|
||||||
summary = Preferences["download_folder_name", "[-id-] -title-"]
|
summary = Preferences["download_folder_name", "[-id-] -title-"]
|
||||||
}
|
}
|
||||||
|
"max_concurrent_download" -> {
|
||||||
|
val newValue = Preferences.get<String>(key).toIntOrNull() ?: 0
|
||||||
|
|
||||||
|
if (newValue == 0)
|
||||||
|
clientBuilder.dispatcher(Dispatcher())
|
||||||
|
else
|
||||||
|
clientBuilder.dispatcher((Dispatcher(Executors.newFixedThreadPool(newValue))))
|
||||||
|
|
||||||
|
clientHolder = null
|
||||||
|
client
|
||||||
|
}
|
||||||
|
else -> return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -247,6 +264,14 @@ class SettingsFragment :
|
|||||||
|
|
||||||
onPreferenceClickListener = this@SettingsFragment
|
onPreferenceClickListener = this@SettingsFragment
|
||||||
}
|
}
|
||||||
|
"mirrors" -> {
|
||||||
|
onPreferenceClickListener = this@SettingsFragment
|
||||||
|
}
|
||||||
|
"proxy" -> {
|
||||||
|
summary = getProxyInfo().type.name
|
||||||
|
|
||||||
|
onPreferenceClickListener = this@SettingsFragment
|
||||||
|
}
|
||||||
"tag_translation" -> {
|
"tag_translation" -> {
|
||||||
this as ListPreference
|
this as ListPreference
|
||||||
|
|
||||||
@@ -268,14 +293,6 @@ class SettingsFragment :
|
|||||||
onPreferenceChangeListener = this@SettingsFragment
|
onPreferenceChangeListener = this@SettingsFragment
|
||||||
|
|
||||||
}
|
}
|
||||||
"mirrors" -> {
|
|
||||||
onPreferenceClickListener = this@SettingsFragment
|
|
||||||
}
|
|
||||||
"proxy" -> {
|
|
||||||
summary = getProxyInfo().type.name
|
|
||||||
|
|
||||||
onPreferenceClickListener = this@SettingsFragment
|
|
||||||
}
|
|
||||||
"dark_mode" -> {
|
"dark_mode" -> {
|
||||||
onPreferenceChangeListener = this@SettingsFragment
|
onPreferenceChangeListener = this@SettingsFragment
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ import android.graphics.drawable.Animatable
|
|||||||
import android.text.Editable
|
import android.text.Editable
|
||||||
import android.text.TextWatcher
|
import android.text.TextWatcher
|
||||||
import android.util.AttributeSet
|
import android.util.AttributeSet
|
||||||
|
import android.util.Log
|
||||||
import android.view.LayoutInflater
|
import android.view.LayoutInflater
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import android.view.inputmethod.EditorInfo
|
import android.view.inputmethod.EditorInfo
|
||||||
@@ -58,8 +59,8 @@ class FloatingSearchView @JvmOverloads constructor(context: Context, attrs: Attr
|
|||||||
|
|
||||||
searchInputView.addTextChangedListener(this)
|
searchInputView.addTextChangedListener(this)
|
||||||
onSearchListener = this
|
onSearchListener = this
|
||||||
onBindSuggestionCallback = { a, b, c, d, e ->
|
onBindSuggestionCallback = { binding, item, itemPosition ->
|
||||||
onBindSuggestion(a, b, c, d, e)
|
onBindSuggestion(binding.root, binding.leftIcon, binding.body, item, itemPosition)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -110,7 +111,7 @@ class FloatingSearchView @JvmOverloads constructor(context: Context, attrs: Attr
|
|||||||
) {
|
) {
|
||||||
when(item) {
|
when(item) {
|
||||||
is TagSuggestion -> {
|
is TagSuggestion -> {
|
||||||
val tag = "${item.n}:${item.s.replace(Regex("\\s"), "_")}"
|
val tag = "${item.n}:${item.s}"
|
||||||
|
|
||||||
leftIcon?.setImageDrawable(
|
leftIcon?.setImageDrawable(
|
||||||
ResourcesCompat.getDrawable(
|
ResourcesCompat.getDrawable(
|
||||||
|
|||||||
@@ -137,5 +137,9 @@ operator fun JsonElement.get(index: Int) =
|
|||||||
operator fun JsonElement.get(tag: String) =
|
operator fun JsonElement.get(tag: String) =
|
||||||
this.jsonObject[tag]
|
this.jsonObject[tag]
|
||||||
|
|
||||||
|
fun JsonElement.getOrNull(tag: String) = kotlin.runCatching {
|
||||||
|
this.jsonObject.getOrDefault(tag, null)
|
||||||
|
}.getOrNull()
|
||||||
|
|
||||||
val JsonElement.content
|
val JsonElement.content
|
||||||
get() = this.jsonPrimitive.contentOrNull
|
get() = this.jsonPrimitive.contentOrNull
|
||||||
@@ -32,7 +32,6 @@ import androidx.appcompat.app.AlertDialog
|
|||||||
import androidx.core.app.NotificationCompat
|
import androidx.core.app.NotificationCompat
|
||||||
import androidx.core.app.NotificationManagerCompat
|
import androidx.core.app.NotificationManagerCompat
|
||||||
import androidx.preference.PreferenceManager
|
import androidx.preference.PreferenceManager
|
||||||
import com.google.firebase.crashlytics.FirebaseCrashlytics
|
|
||||||
import kotlinx.coroutines.CoroutineScope
|
import kotlinx.coroutines.CoroutineScope
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
import kotlinx.coroutines.Job
|
import kotlinx.coroutines.Job
|
||||||
@@ -182,7 +181,7 @@ fun checkUpdate(context: Context, force: Boolean = false) {
|
|||||||
Preferences["update_download_id"] = it
|
Preferences["update_download_id"] = it
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
setNegativeButton(if (force) android.R.string.cancel else R.string.ignore_update) { _, _ ->
|
setNegativeButton(if (force) android.R.string.cancel else R.string.ignore) { _, _ ->
|
||||||
if (!force)
|
if (!force)
|
||||||
preferences.edit()
|
preferences.edit()
|
||||||
.putLong("ignore_update_until", System.currentTimeMillis() + 604800000)
|
.putLong("ignore_update_until", System.currentTimeMillis() + 604800000)
|
||||||
@@ -285,11 +284,11 @@ fun xyz.quaver.pupil.util.downloader.DownloadManager.migrate() {
|
|||||||
folder.getChild(".metadata").readText()?.let { Json.parseToJsonElement(it) }
|
folder.getChild(".metadata").readText()?.let { Json.parseToJsonElement(it) }
|
||||||
}.getOrNull()
|
}.getOrNull()
|
||||||
|
|
||||||
val galleryID = metadata?.get("reader")?.get("galleryInfo")?.get("id")?.content?.toIntOrNull()
|
val galleryID = metadata?.getOrNull("reader")?.getOrNull("galleryInfo")?.getOrNull("id")?.content?.toIntOrNull()
|
||||||
?: folder.name.toIntOrNull() ?: return@forEachIndexed
|
?: folder.name.toIntOrNull() ?: return@forEachIndexed
|
||||||
|
|
||||||
val galleryBlock: GalleryBlock? = kotlin.runCatching {
|
val galleryBlock: GalleryBlock? = kotlin.runCatching {
|
||||||
metadata?.get("galleryBlock")?.let { Json.decodeFromJsonElement<GalleryBlock>(it) }
|
metadata?.getOrNull("galleryBlock")?.let { Json.decodeFromJsonElement<GalleryBlock>(it) }
|
||||||
}.getOrNull() ?: kotlin.runCatching {
|
}.getOrNull() ?: kotlin.runCatching {
|
||||||
getGalleryBlock(galleryID)
|
getGalleryBlock(galleryID)
|
||||||
}.getOrNull() ?: kotlin.runCatching {
|
}.getOrNull() ?: kotlin.runCatching {
|
||||||
@@ -297,14 +296,14 @@ fun xyz.quaver.pupil.util.downloader.DownloadManager.migrate() {
|
|||||||
}.getOrNull()
|
}.getOrNull()
|
||||||
|
|
||||||
val reader: Reader? = kotlin.runCatching {
|
val reader: Reader? = kotlin.runCatching {
|
||||||
metadata?.get("reader")?.let { Json.decodeFromJsonElement<Reader>(it) }
|
metadata?.getOrNull("reader")?.let { Json.decodeFromJsonElement<Reader>(it) }
|
||||||
}.getOrNull() ?: kotlin.runCatching {
|
}.getOrNull() ?: kotlin.runCatching {
|
||||||
getReader(galleryID)
|
getReader(galleryID)
|
||||||
}.getOrNull() ?: kotlin.runCatching {
|
}.getOrNull() ?: kotlin.runCatching {
|
||||||
xyz.quaver.hiyobi.getReader(galleryID)
|
xyz.quaver.hiyobi.getReader(galleryID)
|
||||||
}.getOrNull()
|
}.getOrNull()
|
||||||
|
|
||||||
metadata?.get("thumbnail")?.jsonPrimitive?.contentOrNull?.also { thumbnail ->
|
metadata?.getOrNull("thumbnail")?.jsonPrimitive?.contentOrNull?.also { thumbnail ->
|
||||||
val file = folder.getChild(".thumbnail").also {
|
val file = folder.getChild(".thumbnail").also {
|
||||||
if (it.exists())
|
if (it.exists())
|
||||||
it.delete()
|
it.delete()
|
||||||
|
|||||||
@@ -73,7 +73,7 @@
|
|||||||
<string name="main_menu_sort">ソート</string>
|
<string name="main_menu_sort">ソート</string>
|
||||||
<string name="main_menu_sort_newest">投稿日時順</string>
|
<string name="main_menu_sort_newest">投稿日時順</string>
|
||||||
<string name="main_menu_sort_popular">人気順</string>
|
<string name="main_menu_sort_popular">人気順</string>
|
||||||
<string name="ignore_update">無視</string>
|
<string name="ignore">無視</string>
|
||||||
<string name="lock_corrupted">ロックファイルが破損されています。Pupilを再再インストールしてください。</string>
|
<string name="lock_corrupted">ロックファイルが破損されています。Pupilを再再インストールしてください。</string>
|
||||||
<string name="settings_dark_mode_title">ダークモード</string>
|
<string name="settings_dark_mode_title">ダークモード</string>
|
||||||
<string name="settings_dark_mode_summary">夜にシコりたい方々へ</string>
|
<string name="settings_dark_mode_summary">夜にシコりたい方々へ</string>
|
||||||
@@ -151,8 +151,10 @@
|
|||||||
<string name="no_camera">この機器には前面カメラが装着されていません</string>
|
<string name="no_camera">この機器には前面カメラが装着されていません</string>
|
||||||
<string name="error">エラー</string>
|
<string name="error">エラー</string>
|
||||||
<string name="settings_cache_limit">キャッシュサイズ制限</string>
|
<string name="settings_cache_limit">キャッシュサイズ制限</string>
|
||||||
<string name="settings_cache_unlimited">制限なし</string>
|
<string name="unlimited">制限なし</string>
|
||||||
<string name="settings_tag_translation">タグ言語</string>
|
<string name="settings_tag_translation">タグ言語</string>
|
||||||
<string name="settings_tag_translation_message">Githubにて翻訳に参加できます</string>
|
<string name="settings_tag_translation_message">Githubにて翻訳に参加できます</string>
|
||||||
<string name="settings_concurrent_download">並列ダウンロード</string>
|
<string name="settings_max_concurrent_download">並列ダウンロード</string>
|
||||||
|
<string name="unaccessible_download_folder">アンドロイド11以上では外部からのアプリ内部空間接近が不可能です。ダウンロードフォルダを変更しますか?</string>
|
||||||
|
<string name="settings_networking">ネットワーク</string>
|
||||||
</resources>
|
</resources>
|
||||||
@@ -71,7 +71,7 @@
|
|||||||
<string name="main_menu_sort">정렬</string>
|
<string name="main_menu_sort">정렬</string>
|
||||||
<string name="main_menu_sort_popular">인기순</string>
|
<string name="main_menu_sort_popular">인기순</string>
|
||||||
<string name="main_menu_sort_newest">시간순</string>
|
<string name="main_menu_sort_newest">시간순</string>
|
||||||
<string name="ignore_update">무시</string>
|
<string name="ignore">무시</string>
|
||||||
<string name="lock_corrupted">잠금 파일이 손상되었습니다! 앱을 재설치 해 주시기 바랍니다.</string>
|
<string name="lock_corrupted">잠금 파일이 손상되었습니다! 앱을 재설치 해 주시기 바랍니다.</string>
|
||||||
<string name="settings_dark_mode_title">다크 모드</string>
|
<string name="settings_dark_mode_title">다크 모드</string>
|
||||||
<string name="settings_dark_mode_summary">딥 다크한 모오드</string>
|
<string name="settings_dark_mode_summary">딥 다크한 모오드</string>
|
||||||
@@ -151,8 +151,10 @@
|
|||||||
<string name="no_camera">이 장치에는 전면 카메라가 없습니다</string>
|
<string name="no_camera">이 장치에는 전면 카메라가 없습니다</string>
|
||||||
<string name="error">오류</string>
|
<string name="error">오류</string>
|
||||||
<string name="settings_cache_limit">캐시 크기 제한</string>
|
<string name="settings_cache_limit">캐시 크기 제한</string>
|
||||||
<string name="settings_cache_unlimited">무제한</string>
|
<string name="unlimited">무제한</string>
|
||||||
<string name="settings_tag_translation">태그 언어</string>
|
<string name="settings_tag_translation">태그 언어</string>
|
||||||
<string name="settings_tag_translation_message">Github에서 번역에 참여하세요</string>
|
<string name="settings_tag_translation_message">Github에서 번역에 참여하세요</string>
|
||||||
<string name="settings_concurrent_download">병렬 다운로드</string>
|
<string name="settings_max_concurrent_download">병렬 다운로드</string>
|
||||||
|
<string name="unaccessible_download_folder">안드로이드 11 이상에서는 외부에서 현재 다운로드 폴더에 접근할 수 없습니다. 변경하시겠습니까?</string>
|
||||||
|
<string name="settings_networking">네트워크</string>
|
||||||
</resources>
|
</resources>
|
||||||
@@ -70,7 +70,7 @@
|
|||||||
</string-array>
|
</string-array>
|
||||||
|
|
||||||
<string-array name="cache_size_text">
|
<string-array name="cache_size_text">
|
||||||
<item>@string/settings_cache_unlimited</item>
|
<item>@string/unlimited</item>
|
||||||
<item>1G</item>
|
<item>1G</item>
|
||||||
<item>2G</item>
|
<item>2G</item>
|
||||||
<item>4G</item>
|
<item>4G</item>
|
||||||
@@ -79,4 +79,24 @@
|
|||||||
<item>32G</item>
|
<item>32G</item>
|
||||||
</string-array>
|
</string-array>
|
||||||
|
|
||||||
|
<string-array name="concurrent_download">
|
||||||
|
<item>0</item>
|
||||||
|
<item>1</item>
|
||||||
|
<item>2</item>
|
||||||
|
<item>4</item>
|
||||||
|
<item>8</item>
|
||||||
|
<item>16</item>
|
||||||
|
<item>32</item>
|
||||||
|
</string-array>
|
||||||
|
|
||||||
|
<string-array name="concurrent_download_text">
|
||||||
|
<item>@string/unlimited</item>
|
||||||
|
<item>1</item>
|
||||||
|
<item>2</item>
|
||||||
|
<item>4</item>
|
||||||
|
<item>8</item>
|
||||||
|
<item>16</item>
|
||||||
|
<item>32</item>
|
||||||
|
</string-array>
|
||||||
|
|
||||||
</resources>
|
</resources>
|
||||||
@@ -28,7 +28,9 @@
|
|||||||
<string name="warning">Warning</string>
|
<string name="warning">Warning</string>
|
||||||
<string name="error">Error</string>
|
<string name="error">Error</string>
|
||||||
|
|
||||||
<string name="ignore_update">Ignore</string>
|
<string name="ignore">Ignore</string>
|
||||||
|
|
||||||
|
<string name="unlimited">Unlimited</string>
|
||||||
|
|
||||||
<string name="copied_to_clipboard">Copied to clipboard</string>
|
<string name="copied_to_clipboard">Copied to clipboard</string>
|
||||||
|
|
||||||
@@ -47,6 +49,8 @@
|
|||||||
|
|
||||||
<string name="main_no_result">No result</string>
|
<string name="main_no_result">No result</string>
|
||||||
|
|
||||||
|
<string name="unaccessible_download_folder">From Android 11 and above, current Download folder cannot be accessed by outside apps. Would you like to change the download folder?</string>
|
||||||
|
|
||||||
<string name="main_drawer_home">Home</string>
|
<string name="main_drawer_home">Home</string>
|
||||||
<string name="main_drawer_history">History</string>
|
<string name="main_drawer_history">History</string>
|
||||||
<string name="main_drawer_downloads">Downloads</string>
|
<string name="main_drawer_downloads">Downloads</string>
|
||||||
@@ -164,7 +168,6 @@
|
|||||||
<string name="settings_download_folder_custom">Custom Location</string>
|
<string name="settings_download_folder_custom">Custom Location</string>
|
||||||
<string name="settings_download_folder_not_writable">This folder is not writable. Please select another folder.</string>
|
<string name="settings_download_folder_not_writable">This folder is not writable. Please select another folder.</string>
|
||||||
<string name="settings_cache_limit">Cache Limit</string>
|
<string name="settings_cache_limit">Cache Limit</string>
|
||||||
<string name="settings_cache_unlimited">Unlimited</string>
|
|
||||||
<string name="settings_nomedia_title">Hide image from gallery</string>
|
<string name="settings_nomedia_title">Hide image from gallery</string>
|
||||||
<string name="settings_low_quality">Low quality images</string>
|
<string name="settings_low_quality">Low quality images</string>
|
||||||
<string name="settings_low_quality_summary">Load low quality images to improve load speed and data usage</string>
|
<string name="settings_low_quality_summary">Load low quality images to improve load speed and data usage</string>
|
||||||
@@ -174,14 +177,17 @@
|
|||||||
<string name="settings_app_lock">App lock</string>
|
<string name="settings_app_lock">App lock</string>
|
||||||
<string name="settings_app_lock_type">App lock type</string>
|
<string name="settings_app_lock_type">App lock type</string>
|
||||||
|
|
||||||
|
<!-- SETTINGS/NETWORKING -->
|
||||||
|
<string name="settings_networking">Networking</string>
|
||||||
|
<string name="settings_mirror_summary">Load images from mirrors</string>
|
||||||
|
<string name="settings_proxy_title">Proxy</string>
|
||||||
|
<string name="settings_max_concurrent_download">Concurrent Download</string>
|
||||||
|
|
||||||
<!-- SETTINGS/MISCELLANEOUS -->
|
<!-- SETTINGS/MISCELLANEOUS -->
|
||||||
|
|
||||||
<string name="settings_miscellaneous_title">Miscellaneous</string>
|
<string name="settings_miscellaneous_title">Miscellaneous</string>
|
||||||
<string name="settings_tag_translation">Tag Language</string>
|
<string name="settings_tag_translation">Tag Language</string>
|
||||||
<string name="settings_concurrent_download">Concurrent Download</string>
|
|
||||||
<string name="settings_tag_translation_message">Participate in translation on Github</string>
|
<string name="settings_tag_translation_message">Participate in translation on Github</string>
|
||||||
<string name="settings_mirror_summary">Load images from mirrors</string>
|
|
||||||
<string name="settings_proxy_title">Proxy</string>
|
|
||||||
<string name="settings_rtl">Turn pages Right-to-Left</string>
|
<string name="settings_rtl">Turn pages Right-to-Left</string>
|
||||||
<string name="settings_security_mode_title">Enable security mode</string>
|
<string name="settings_security_mode_title">Enable security mode</string>
|
||||||
<string name="settings_security_mode_summary">Enable security mode to make the screen invisible on recent app window</string>
|
<string name="settings_security_mode_summary">Enable security mode to make the screen invisible on recent app window</string>
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<PreferenceScreen xmlns:app="http://schemas.android.com/apk/res-auto">
|
<PreferenceScreen xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
|
||||||
<Preference
|
<Preference
|
||||||
app:key="app_version"
|
app:key="app_version"
|
||||||
@@ -73,12 +74,7 @@
|
|||||||
</PreferenceCategory>
|
</PreferenceCategory>
|
||||||
|
|
||||||
<PreferenceCategory
|
<PreferenceCategory
|
||||||
app:title="@string/settings_miscellaneous_title">
|
app:title="@string/settings_networking">
|
||||||
|
|
||||||
<ListPreference
|
|
||||||
app:key="tag_translation"
|
|
||||||
app:title="@string/settings_tag_translation"
|
|
||||||
app:useSimpleSummaryProvider="true"/>
|
|
||||||
|
|
||||||
<Preference
|
<Preference
|
||||||
app:key="mirrors"
|
app:key="mirrors"
|
||||||
@@ -89,6 +85,24 @@
|
|||||||
app:key="proxy"
|
app:key="proxy"
|
||||||
app:title="@string/settings_proxy_title"/>
|
app:title="@string/settings_proxy_title"/>
|
||||||
|
|
||||||
|
<ListPreference
|
||||||
|
app:key="max_concurrent_download"
|
||||||
|
android:title="@string/settings_max_concurrent_download"
|
||||||
|
app:entries="@array/concurrent_download_text"
|
||||||
|
app:entryValues="@array/concurrent_download"
|
||||||
|
android:defaultValue="0"
|
||||||
|
app:useSimpleSummaryProvider="true"/>
|
||||||
|
|
||||||
|
</PreferenceCategory>
|
||||||
|
|
||||||
|
<PreferenceCategory
|
||||||
|
app:title="@string/settings_miscellaneous_title">
|
||||||
|
|
||||||
|
<ListPreference
|
||||||
|
app:key="tag_translation"
|
||||||
|
app:title="@string/settings_tag_translation"
|
||||||
|
app:useSimpleSummaryProvider="true"/>
|
||||||
|
|
||||||
<SwitchPreferenceCompat
|
<SwitchPreferenceCompat
|
||||||
app:key="rtl"
|
app:key="rtl"
|
||||||
app:title="@string/settings_rtl"
|
app:title="@string/settings_rtl"
|
||||||
|
|||||||
@@ -6,11 +6,11 @@ buildscript {
|
|||||||
jcenter()
|
jcenter()
|
||||||
}
|
}
|
||||||
dependencies {
|
dependencies {
|
||||||
classpath 'com.android.tools.build:gradle:4.1.1'
|
classpath 'com.android.tools.build:gradle:4.1.2'
|
||||||
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
|
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
|
||||||
classpath "org.jetbrains.kotlin:kotlin-android-extensions:$kotlin_version"
|
classpath "org.jetbrains.kotlin:kotlin-android-extensions:$kotlin_version"
|
||||||
classpath "org.jetbrains.kotlin:kotlin-serialization:$kotlin_version"
|
classpath "org.jetbrains.kotlin:kotlin-serialization:$kotlin_version"
|
||||||
classpath "com.google.gms:google-services:4.3.4"
|
classpath "com.google.gms:google-services:4.3.5"
|
||||||
// NOTE: Do not place your application dependencies here; they belong
|
// NOTE: Do not place your application dependencies here; they belong
|
||||||
// in the individual module build.gradle files
|
// in the individual module build.gradle files
|
||||||
classpath "com.google.firebase:firebase-crashlytics-gradle:2.4.1"
|
classpath "com.google.firebase:firebase-crashlytics-gradle:2.4.1"
|
||||||
|
|||||||
@@ -20,4 +20,4 @@ kotlin.code.style=official
|
|||||||
android.enableJetifier=true
|
android.enableJetifier=true
|
||||||
android.useAndroidX=true
|
android.useAndroidX=true
|
||||||
|
|
||||||
kotlin_version=1.4.20
|
kotlin_version=1.4.30
|
||||||
Reference in New Issue
Block a user