Added Download Folder Dialog
This commit is contained in:
@@ -23,7 +23,6 @@ import android.app.Activity
|
|||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
import android.graphics.drawable.Animatable
|
import android.graphics.drawable.Animatable
|
||||||
import android.net.Uri
|
import android.net.Uri
|
||||||
import android.os.Build
|
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.text.*
|
import android.text.*
|
||||||
import android.text.style.AlignmentSpan
|
import android.text.style.AlignmentSpan
|
||||||
@@ -51,16 +50,13 @@ import com.google.android.material.snackbar.Snackbar
|
|||||||
import com.google.firebase.crashlytics.FirebaseCrashlytics
|
import com.google.firebase.crashlytics.FirebaseCrashlytics
|
||||||
import kotlinx.android.synthetic.main.activity_main.*
|
import kotlinx.android.synthetic.main.activity_main.*
|
||||||
import kotlinx.android.synthetic.main.activity_main_content.*
|
import kotlinx.android.synthetic.main.activity_main_content.*
|
||||||
import kotlinx.android.synthetic.main.settings_activity.*
|
|
||||||
import kotlinx.coroutines.*
|
import kotlinx.coroutines.*
|
||||||
import kotlinx.serialization.decodeFromString
|
import kotlinx.serialization.decodeFromString
|
||||||
import kotlinx.serialization.encodeToString
|
import kotlinx.serialization.encodeToString
|
||||||
import kotlinx.serialization.json.Json
|
import kotlinx.serialization.json.Json
|
||||||
import net.rdrei.android.dirchooser.DirectoryChooserActivity
|
|
||||||
import xyz.quaver.hitomi.doSearch
|
import xyz.quaver.hitomi.doSearch
|
||||||
import xyz.quaver.hitomi.getGalleryIDsFromNozomi
|
import xyz.quaver.hitomi.getGalleryIDsFromNozomi
|
||||||
import xyz.quaver.hitomi.getSuggestionsForQuery
|
import xyz.quaver.hitomi.getSuggestionsForQuery
|
||||||
import xyz.quaver.io.FileX
|
|
||||||
import xyz.quaver.pupil.R
|
import xyz.quaver.pupil.R
|
||||||
import xyz.quaver.pupil.adapters.GalleryBlockAdapter
|
import xyz.quaver.pupil.adapters.GalleryBlockAdapter
|
||||||
import xyz.quaver.pupil.favorites
|
import xyz.quaver.pupil.favorites
|
||||||
@@ -68,7 +64,7 @@ import xyz.quaver.pupil.histories
|
|||||||
import xyz.quaver.pupil.services.DownloadService
|
import xyz.quaver.pupil.services.DownloadService
|
||||||
import xyz.quaver.pupil.types.TagSuggestion
|
import xyz.quaver.pupil.types.TagSuggestion
|
||||||
import xyz.quaver.pupil.types.Tags
|
import xyz.quaver.pupil.types.Tags
|
||||||
import xyz.quaver.pupil.ui.dialog.DownloadLocationDialog
|
import xyz.quaver.pupil.ui.dialog.DownloadLocationDialogFragment
|
||||||
import xyz.quaver.pupil.ui.dialog.GalleryDialog
|
import xyz.quaver.pupil.ui.dialog.GalleryDialog
|
||||||
import xyz.quaver.pupil.util.*
|
import xyz.quaver.pupil.util.*
|
||||||
import xyz.quaver.pupil.util.downloader.Cache
|
import xyz.quaver.pupil.util.downloader.Cache
|
||||||
@@ -151,7 +147,7 @@ class MainActivity : AppCompatActivity() {
|
|||||||
setContentView(R.layout.activity_main)
|
setContentView(R.layout.activity_main)
|
||||||
|
|
||||||
if (Preferences["download_folder", ""].isEmpty())
|
if (Preferences["download_folder", ""].isEmpty())
|
||||||
DownloadLocationDialog(this).show()
|
DownloadLocationDialogFragment().show(supportFragmentManager, "Download Location Dialog")
|
||||||
|
|
||||||
checkUpdate(this)
|
checkUpdate(this)
|
||||||
|
|
||||||
@@ -229,7 +225,6 @@ class MainActivity : AppCompatActivity() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
|
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
|
||||||
super.onActivityResult(requestCode, resultCode, data)
|
|
||||||
when(requestCode) {
|
when(requestCode) {
|
||||||
R.id.request_settings.normalizeID() -> {
|
R.id.request_settings.normalizeID() -> {
|
||||||
runOnUiThread {
|
runOnUiThread {
|
||||||
@@ -243,40 +238,7 @@ class MainActivity : AppCompatActivity() {
|
|||||||
if (resultCode != Activity.RESULT_OK)
|
if (resultCode != Activity.RESULT_OK)
|
||||||
finish()
|
finish()
|
||||||
}
|
}
|
||||||
R.id.request_download_folder.normalizeID() -> {
|
else -> super.onActivityResult(requestCode, resultCode, data)
|
||||||
if (resultCode == Activity.RESULT_OK) {
|
|
||||||
data?.data?.also { uri ->
|
|
||||||
val takeFlags: Int =
|
|
||||||
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)
|
|
||||||
contentResolver.takePersistableUriPermission(uri, takeFlags)
|
|
||||||
|
|
||||||
if (FileX(this, uri).canWrite())
|
|
||||||
Preferences["download_folder"] = uri.toString()
|
|
||||||
else
|
|
||||||
Snackbar.make(
|
|
||||||
settings,
|
|
||||||
R.string.settings_download_folder_not_writable,
|
|
||||||
Snackbar.LENGTH_LONG
|
|
||||||
).show()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
R.id.request_download_folder_old.normalizeID() -> {
|
|
||||||
if (resultCode == DirectoryChooserActivity.RESULT_CODE_DIR_SELECTED) {
|
|
||||||
val directory = data?.getStringExtra(DirectoryChooserActivity.RESULT_SELECTED_DIR)!!
|
|
||||||
|
|
||||||
if (!File(directory).canWrite())
|
|
||||||
Snackbar.make(
|
|
||||||
settings,
|
|
||||||
R.string.settings_download_folder_not_writable,
|
|
||||||
Snackbar.LENGTH_LONG
|
|
||||||
).show()
|
|
||||||
else
|
|
||||||
Preferences["download_folder"] = File(directory).canonicalPath
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -114,40 +114,6 @@ class SettingsActivity : AppCompatActivity() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
R.id.request_download_folder.normalizeID() -> {
|
|
||||||
if (resultCode == Activity.RESULT_OK) {
|
|
||||||
data?.data?.also { uri ->
|
|
||||||
val takeFlags: Int =
|
|
||||||
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)
|
|
||||||
contentResolver.takePersistableUriPermission(uri, takeFlags)
|
|
||||||
|
|
||||||
if (FileX(this, uri).canWrite())
|
|
||||||
Preferences["download_folder"] = uri.toString()
|
|
||||||
else
|
|
||||||
Snackbar.make(
|
|
||||||
settings,
|
|
||||||
R.string.settings_download_folder_not_writable,
|
|
||||||
Snackbar.LENGTH_LONG
|
|
||||||
).show()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
R.id.request_download_folder_old.normalizeID() -> {
|
|
||||||
if (resultCode == DirectoryChooserActivity.RESULT_CODE_DIR_SELECTED) {
|
|
||||||
val directory = data?.getStringExtra(DirectoryChooserActivity.RESULT_SELECTED_DIR)!!
|
|
||||||
|
|
||||||
if (!File(directory).canWrite())
|
|
||||||
Snackbar.make(
|
|
||||||
settings,
|
|
||||||
R.string.settings_download_folder_not_writable,
|
|
||||||
Snackbar.LENGTH_LONG
|
|
||||||
).show()
|
|
||||||
else
|
|
||||||
Preferences["download_folder"] = File(directory).canonicalPath
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else -> super.onActivityResult(requestCode, resultCode, data)
|
else -> super.onActivityResult(requestCode, resultCode, data)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,74 @@
|
|||||||
|
/*
|
||||||
|
* 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 <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package xyz.quaver.pupil.ui.dialog
|
||||||
|
|
||||||
|
import android.annotation.SuppressLint
|
||||||
|
import android.app.Dialog
|
||||||
|
import android.os.Bundle
|
||||||
|
import android.view.View
|
||||||
|
import android.view.ViewGroup
|
||||||
|
import androidx.core.widget.addTextChangedListener
|
||||||
|
import androidx.fragment.app.DialogFragment
|
||||||
|
import com.google.android.material.snackbar.Snackbar
|
||||||
|
import kotlinx.android.synthetic.main.dialog_download_folder_name.view.*
|
||||||
|
import kotlinx.coroutines.runBlocking
|
||||||
|
import xyz.quaver.pupil.R
|
||||||
|
import xyz.quaver.pupil.util.Preferences
|
||||||
|
import xyz.quaver.pupil.util.downloader.Cache
|
||||||
|
import xyz.quaver.pupil.util.formatDownloadFolder
|
||||||
|
import xyz.quaver.pupil.util.formatDownloadFolderTest
|
||||||
|
import xyz.quaver.pupil.util.formatMap
|
||||||
|
|
||||||
|
class DownloadFolderNameDialogFragment : DialogFragment() {
|
||||||
|
|
||||||
|
@SuppressLint("InflateParams")
|
||||||
|
private fun build(): View {
|
||||||
|
val galleryID = Cache.instances.let { if (it.size() == 0) 1199708 else it.keyAt((0 until it.size()).random()) }
|
||||||
|
val galleryBlock = runBlocking {
|
||||||
|
Cache.getInstance(requireContext(), galleryID).getGalleryBlock()
|
||||||
|
}
|
||||||
|
|
||||||
|
return layoutInflater.inflate(R.layout.dialog_download_folder_name, null).apply {
|
||||||
|
message.text = getString(R.string.settings_download_folder_name_message, formatMap.keys.toString(), galleryBlock?.formatDownloadFolder() ?: "")
|
||||||
|
edittext.setText(Preferences.get<String>("download_folder_name"))
|
||||||
|
edittext.addTextChangedListener {
|
||||||
|
message.text = getString(R.string.settings_download_folder_name_message, formatMap.keys.toString(), galleryBlock?.formatDownloadFolderTest(it.toString()) ?: "")
|
||||||
|
}
|
||||||
|
ok_button.setOnClickListener {
|
||||||
|
val newValue = edittext.text.toString()
|
||||||
|
|
||||||
|
if ((newValue as? String)?.contains("/") != false) {
|
||||||
|
Snackbar.make(this, R.string.settings_invalid_download_folder_name, Snackbar.LENGTH_SHORT).show()
|
||||||
|
return@setOnClickListener
|
||||||
|
}
|
||||||
|
|
||||||
|
Preferences["download_folder_name"] = edittext.text.toString()
|
||||||
|
|
||||||
|
dismiss()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog =
|
||||||
|
Dialog(requireContext()).apply {
|
||||||
|
setContentView(build())
|
||||||
|
window?.attributes?.width = ViewGroup.LayoutParams.MATCH_PARENT
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -1,129 +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 <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package xyz.quaver.pupil.ui.dialog
|
|
||||||
|
|
||||||
import android.annotation.SuppressLint
|
|
||||||
import android.app.Activity
|
|
||||||
import android.app.Dialog
|
|
||||||
import android.content.Intent
|
|
||||||
import android.os.Build
|
|
||||||
import android.os.Bundle
|
|
||||||
import android.view.View
|
|
||||||
import android.widget.LinearLayout
|
|
||||||
import android.widget.RadioButton
|
|
||||||
import androidx.appcompat.app.AlertDialog
|
|
||||||
import androidx.core.content.ContextCompat
|
|
||||||
import androidx.core.net.toUri
|
|
||||||
import kotlinx.android.synthetic.main.item_download_folder.view.*
|
|
||||||
import net.rdrei.android.dirchooser.DirectoryChooserActivity
|
|
||||||
import net.rdrei.android.dirchooser.DirectoryChooserConfig
|
|
||||||
import xyz.quaver.pupil.R
|
|
||||||
import xyz.quaver.pupil.util.*
|
|
||||||
import xyz.quaver.pupil.util.downloader.DownloadManager
|
|
||||||
import java.io.File
|
|
||||||
|
|
||||||
@SuppressLint("InflateParams")
|
|
||||||
class DownloadLocationDialog(val activity: Activity) : AlertDialog(activity) {
|
|
||||||
private val buttons = mutableListOf<Pair<RadioButton, File?>>()
|
|
||||||
|
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
|
||||||
setTitle(R.string.settings_download_folder)
|
|
||||||
|
|
||||||
setView(build())
|
|
||||||
|
|
||||||
setButton(Dialog.BUTTON_POSITIVE, context.getText(android.R.string.ok)) { _, _ -> }
|
|
||||||
|
|
||||||
super.onCreate(savedInstanceState)
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun build() : View {
|
|
||||||
val view = layoutInflater.inflate(R.layout.dialog_download_folder, null) as LinearLayout
|
|
||||||
|
|
||||||
val externalFilesDirs = ContextCompat.getExternalFilesDirs(context, null)
|
|
||||||
|
|
||||||
externalFilesDirs.forEachIndexed { index, dir ->
|
|
||||||
|
|
||||||
dir ?: return@forEachIndexed
|
|
||||||
|
|
||||||
view.addView(layoutInflater.inflate(R.layout.item_download_folder, view, false).apply {
|
|
||||||
location_type.text = context.getString(when (index) {
|
|
||||||
0 -> R.string.settings_download_folder_internal
|
|
||||||
else -> R.string.settings_download_folder_removable
|
|
||||||
})
|
|
||||||
location_available.text = context.getString(
|
|
||||||
R.string.settings_download_folder_available,
|
|
||||||
byteToString(dir.freeSpace)
|
|
||||||
)
|
|
||||||
setOnClickListener {
|
|
||||||
buttons.forEach { pair ->
|
|
||||||
pair.first.isChecked = false
|
|
||||||
}
|
|
||||||
button.performClick()
|
|
||||||
Preferences["download_folder"] = dir.toUri().toString()
|
|
||||||
}
|
|
||||||
buttons.add(button to dir)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
view.addView(layoutInflater.inflate(R.layout.item_download_folder, view, false).apply {
|
|
||||||
location_type.text = context.getString(R.string.settings_download_folder_custom)
|
|
||||||
setOnClickListener {
|
|
||||||
buttons.forEach { pair ->
|
|
||||||
pair.first.isChecked = false
|
|
||||||
}
|
|
||||||
button.performClick()
|
|
||||||
|
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
|
|
||||||
val intent = Intent(Intent.ACTION_OPEN_DOCUMENT_TREE).apply {
|
|
||||||
putExtra("android.content.extra.SHOW_ADVANCED", true)
|
|
||||||
}
|
|
||||||
|
|
||||||
activity.startActivityForResult(intent, R.id.request_download_folder.normalizeID())
|
|
||||||
|
|
||||||
dismiss()
|
|
||||||
} else { // Can't use SAF on old Androids!
|
|
||||||
val config = DirectoryChooserConfig.builder()
|
|
||||||
.newDirectoryName("Pupil")
|
|
||||||
.allowNewDirectoryNameModification(true)
|
|
||||||
.build()
|
|
||||||
|
|
||||||
val intent = Intent(context, DirectoryChooserActivity::class.java).apply {
|
|
||||||
putExtra(DirectoryChooserActivity.EXTRA_CONFIG, config)
|
|
||||||
}
|
|
||||||
|
|
||||||
activity.startActivityForResult(intent, R.id.request_download_folder_old.normalizeID())
|
|
||||||
dismiss()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
buttons.add(button to null)
|
|
||||||
})
|
|
||||||
|
|
||||||
externalFilesDirs.indexOfFirst {
|
|
||||||
it.canonicalPath == DownloadManager.getInstance(context).downloadFolder.canonicalPath
|
|
||||||
}.let { index ->
|
|
||||||
if (index < 0)
|
|
||||||
buttons.last().first.isChecked = true
|
|
||||||
else
|
|
||||||
buttons[index].first.isChecked = true
|
|
||||||
}
|
|
||||||
|
|
||||||
return view
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,180 @@
|
|||||||
|
/*
|
||||||
|
* 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 <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package xyz.quaver.pupil.ui.dialog
|
||||||
|
|
||||||
|
import android.annotation.SuppressLint
|
||||||
|
import android.app.Activity
|
||||||
|
import android.app.Dialog
|
||||||
|
import android.content.Intent
|
||||||
|
import android.os.Build
|
||||||
|
import android.os.Bundle
|
||||||
|
import android.view.View
|
||||||
|
import android.widget.LinearLayout
|
||||||
|
import androidx.appcompat.app.AlertDialog
|
||||||
|
import androidx.core.content.ContextCompat
|
||||||
|
import androidx.core.net.toUri
|
||||||
|
import androidx.fragment.app.DialogFragment
|
||||||
|
import com.google.android.material.snackbar.Snackbar
|
||||||
|
import kotlinx.android.synthetic.main.item_download_folder.view.*
|
||||||
|
import net.rdrei.android.dirchooser.DirectoryChooserActivity
|
||||||
|
import net.rdrei.android.dirchooser.DirectoryChooserConfig
|
||||||
|
import xyz.quaver.io.FileX
|
||||||
|
import xyz.quaver.pupil.R
|
||||||
|
import xyz.quaver.pupil.util.Preferences
|
||||||
|
import xyz.quaver.pupil.util.byteToString
|
||||||
|
import xyz.quaver.pupil.util.downloader.DownloadManager
|
||||||
|
import xyz.quaver.pupil.util.normalizeID
|
||||||
|
import java.io.File
|
||||||
|
|
||||||
|
class DownloadLocationDialogFragment : DialogFragment() {
|
||||||
|
private val entries = mutableMapOf<File?, View>()
|
||||||
|
|
||||||
|
@SuppressLint("InflateParams")
|
||||||
|
private fun build() : View {
|
||||||
|
val view = layoutInflater.inflate(R.layout.dialog_download_folder, null) as LinearLayout
|
||||||
|
|
||||||
|
val externalFilesDirs = ContextCompat.getExternalFilesDirs(requireContext(), null)
|
||||||
|
|
||||||
|
externalFilesDirs.forEachIndexed { index, dir ->
|
||||||
|
|
||||||
|
dir ?: return@forEachIndexed
|
||||||
|
|
||||||
|
view.addView(layoutInflater.inflate(R.layout.item_download_folder, view, false).apply {
|
||||||
|
location_type.text = context.getString(when (index) {
|
||||||
|
0 -> R.string.settings_download_folder_internal
|
||||||
|
else -> R.string.settings_download_folder_removable
|
||||||
|
})
|
||||||
|
location_available.text = context.getString(
|
||||||
|
R.string.settings_download_folder_available,
|
||||||
|
byteToString(dir.freeSpace)
|
||||||
|
)
|
||||||
|
setOnClickListener {
|
||||||
|
entries.values.forEach {
|
||||||
|
it.button.isChecked = false
|
||||||
|
}
|
||||||
|
button.performClick()
|
||||||
|
Preferences["download_folder"] = dir.toUri().toString()
|
||||||
|
}
|
||||||
|
entries[dir] = this
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
view.addView(layoutInflater.inflate(R.layout.item_download_folder, view, false).apply {
|
||||||
|
location_type.text = context.getString(R.string.settings_download_folder_custom)
|
||||||
|
setOnClickListener {
|
||||||
|
entries.values.forEach {
|
||||||
|
it.button.isChecked = false
|
||||||
|
}
|
||||||
|
button.performClick()
|
||||||
|
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
|
||||||
|
val intent = Intent(Intent.ACTION_OPEN_DOCUMENT_TREE).apply {
|
||||||
|
putExtra("android.content.extra.SHOW_ADVANCED", true)
|
||||||
|
}
|
||||||
|
|
||||||
|
startActivityForResult(intent, R.id.request_download_folder.normalizeID())
|
||||||
|
} else { // Can't use SAF on old Androids!
|
||||||
|
val config = DirectoryChooserConfig.builder()
|
||||||
|
.newDirectoryName("Pupil")
|
||||||
|
.allowNewDirectoryNameModification(true)
|
||||||
|
.build()
|
||||||
|
|
||||||
|
val intent = Intent(context, DirectoryChooserActivity::class.java).apply {
|
||||||
|
putExtra(DirectoryChooserActivity.EXTRA_CONFIG, config)
|
||||||
|
}
|
||||||
|
|
||||||
|
startActivityForResult(intent, R.id.request_download_folder_old.normalizeID())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
entries[null] = this
|
||||||
|
})
|
||||||
|
|
||||||
|
val downloadFolder = DownloadManager.getInstance(requireContext()).downloadFolder.canonicalPath
|
||||||
|
val key = entries.keys.firstOrNull { it?.canonicalPath == downloadFolder }
|
||||||
|
entries[key]!!.button.isChecked = true
|
||||||
|
if (key == null) entries[key]!!.location_available.text = downloadFolder
|
||||||
|
|
||||||
|
return view
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
|
||||||
|
val builder = AlertDialog.Builder(requireContext())
|
||||||
|
|
||||||
|
builder
|
||||||
|
.setTitle(R.string.settings_download_folder)
|
||||||
|
.setView(build())
|
||||||
|
.setPositiveButton(requireContext().getText(android.R.string.ok)) { _, _ -> }
|
||||||
|
|
||||||
|
return builder.create()
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
|
||||||
|
when (requestCode) {
|
||||||
|
R.id.request_download_folder.normalizeID() -> {
|
||||||
|
if (resultCode == Activity.RESULT_OK) {
|
||||||
|
data?.data?.also { uri ->
|
||||||
|
val takeFlags: Int =
|
||||||
|
requireActivity().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)
|
||||||
|
requireContext().contentResolver.takePersistableUriPermission(uri, takeFlags)
|
||||||
|
|
||||||
|
if (FileX(requireContext(), uri).canWrite())
|
||||||
|
Preferences["download_folder"] = uri.toString()
|
||||||
|
else {
|
||||||
|
Snackbar.make(
|
||||||
|
requireDialog().window!!.decorView.rootView,
|
||||||
|
R.string.settings_download_folder_not_writable,
|
||||||
|
Snackbar.LENGTH_LONG
|
||||||
|
).show()
|
||||||
|
|
||||||
|
val downloadFolder = DownloadManager.getInstance(requireContext()).downloadFolder.canonicalPath
|
||||||
|
val key = entries.keys.firstOrNull { it?.canonicalPath == downloadFolder }
|
||||||
|
entries[key]!!.button.isChecked = true
|
||||||
|
if (key == null) entries[key]!!.location_available.text = downloadFolder
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
R.id.request_download_folder_old.normalizeID() -> {
|
||||||
|
if (resultCode == DirectoryChooserActivity.RESULT_CODE_DIR_SELECTED) {
|
||||||
|
val directory = data?.getStringExtra(DirectoryChooserActivity.RESULT_SELECTED_DIR)!!
|
||||||
|
|
||||||
|
if (!File(directory).canWrite()) {
|
||||||
|
Snackbar.make(
|
||||||
|
requireDialog().window!!.decorView.rootView,
|
||||||
|
R.string.settings_download_folder_not_writable,
|
||||||
|
Snackbar.LENGTH_LONG
|
||||||
|
).show()
|
||||||
|
|
||||||
|
val downloadFolder = DownloadManager.getInstance(requireContext()).downloadFolder.canonicalPath
|
||||||
|
val key = entries.keys.firstOrNull { it?.canonicalPath == downloadFolder }
|
||||||
|
entries[key]!!.button.isChecked = true
|
||||||
|
if (key == null) entries[key]!!.location_available.text = downloadFolder
|
||||||
|
}
|
||||||
|
else
|
||||||
|
Preferences["download_folder"] = File(directory).canonicalPath
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else -> super.onActivityResult(requestCode, resultCode, data)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -43,11 +43,7 @@ import java.net.Proxy
|
|||||||
class ProxyDialog(context: Context) : Dialog(context) {
|
class ProxyDialog(context: Context) : Dialog(context) {
|
||||||
|
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
val view = build()
|
setContentView(build())
|
||||||
|
|
||||||
setTitle(R.string.settings_proxy_title)
|
|
||||||
setContentView(view)
|
|
||||||
|
|
||||||
window?.attributes?.width = ViewGroup.LayoutParams.MATCH_PARENT
|
window?.attributes?.width = ViewGroup.LayoutParams.MATCH_PARENT
|
||||||
|
|
||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
|
|||||||
@@ -21,28 +21,19 @@ package xyz.quaver.pupil.ui.fragment
|
|||||||
import android.content.*
|
import android.content.*
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.widget.Toast
|
import android.widget.Toast
|
||||||
import androidx.appcompat.app.AlertDialog
|
|
||||||
import androidx.appcompat.app.AppCompatDelegate
|
import androidx.appcompat.app.AppCompatDelegate
|
||||||
import androidx.preference.*
|
import androidx.preference.Preference
|
||||||
import com.google.android.material.snackbar.Snackbar
|
import androidx.preference.PreferenceCategory
|
||||||
import kotlinx.coroutines.CoroutineScope
|
import androidx.preference.PreferenceFragmentCompat
|
||||||
import kotlinx.coroutines.Dispatchers
|
import androidx.preference.SwitchPreferenceCompat
|
||||||
import kotlinx.coroutines.launch
|
|
||||||
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.histories
|
|
||||||
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.DefaultQueryDialog
|
import xyz.quaver.pupil.ui.dialog.*
|
||||||
import xyz.quaver.pupil.ui.dialog.DownloadLocationDialog
|
|
||||||
import xyz.quaver.pupil.ui.dialog.MirrorDialog
|
|
||||||
import xyz.quaver.pupil.ui.dialog.ProxyDialog
|
|
||||||
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.io.BufferedReader
|
|
||||||
import java.io.File
|
|
||||||
import java.io.InputStreamReader
|
|
||||||
|
|
||||||
class SettingsFragment :
|
class SettingsFragment :
|
||||||
PreferenceFragmentCompat(),
|
PreferenceFragmentCompat(),
|
||||||
@@ -77,7 +68,7 @@ class SettingsFragment :
|
|||||||
checkUpdate(activity as SettingsActivity, true)
|
checkUpdate(activity as SettingsActivity, true)
|
||||||
}
|
}
|
||||||
"download_folder" -> {
|
"download_folder" -> {
|
||||||
DownloadLocationDialog(requireActivity()).show()
|
DownloadLocationDialogFragment().show(requireActivity().supportFragmentManager, "Download Location Dialog")
|
||||||
}
|
}
|
||||||
"default_query" -> {
|
"default_query" -> {
|
||||||
DefaultQueryDialog(requireContext()).apply {
|
DefaultQueryDialog(requireContext()).apply {
|
||||||
@@ -117,14 +108,6 @@ class SettingsFragment :
|
|||||||
this ?: return false
|
this ?: return false
|
||||||
|
|
||||||
when (key) {
|
when (key) {
|
||||||
"download_folder_name" -> {
|
|
||||||
|
|
||||||
if ((newValue as? String)?.contains("/") != false) {
|
|
||||||
val view = view ?: return false
|
|
||||||
Snackbar.make(view, R.string.settings_invalid_download_folder_name, Snackbar.LENGTH_SHORT).show()
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
"nomedia" -> {
|
"nomedia" -> {
|
||||||
val create = (newValue as? Boolean) ?: return false
|
val create = (newValue as? Boolean) ?: return false
|
||||||
|
|
||||||
@@ -163,6 +146,9 @@ class SettingsFragment :
|
|||||||
"download_folder" -> {
|
"download_folder" -> {
|
||||||
summary = FileX(context, Preferences.get<String>("download_folder")).canonicalPath
|
summary = FileX(context, Preferences.get<String>("download_folder")).canonicalPath
|
||||||
}
|
}
|
||||||
|
"download_folder_name" -> {
|
||||||
|
summary = Preferences.get<String>("download_folder_name")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -189,7 +175,7 @@ class SettingsFragment :
|
|||||||
else
|
else
|
||||||
listOf(this)
|
listOf(this)
|
||||||
}.forEach { preference ->
|
}.forEach { preference ->
|
||||||
with (preference) {
|
with (preference) with@{
|
||||||
|
|
||||||
when (key) {
|
when (key) {
|
||||||
"app_version" -> {
|
"app_version" -> {
|
||||||
@@ -200,8 +186,13 @@ class SettingsFragment :
|
|||||||
onPreferenceClickListener = this@SettingsFragment
|
onPreferenceClickListener = this@SettingsFragment
|
||||||
}
|
}
|
||||||
"download_folder_name" -> {
|
"download_folder_name" -> {
|
||||||
(this as EditTextPreference).dialogMessage = getString(R.string.settings_download_folder_name_message, formatMap.keys.toString())
|
summary = Preferences.get<String>("download_folder_name")
|
||||||
onPreferenceChangeListener = this@SettingsFragment
|
|
||||||
|
setOnPreferenceClickListener {
|
||||||
|
DownloadFolderNameDialogFragment().show(requireActivity().supportFragmentManager, "Download Location Dialog")
|
||||||
|
|
||||||
|
true
|
||||||
|
}
|
||||||
}
|
}
|
||||||
"download_folder" -> {
|
"download_folder" -> {
|
||||||
summary = FileX(context, Preferences.get<String>("download_folder")).canonicalPath
|
summary = FileX(context, Preferences.get<String>("download_folder")).canonicalPath
|
||||||
|
|||||||
@@ -53,7 +53,7 @@ data class Metadata(
|
|||||||
class Cache private constructor(context: Context, val galleryID: Int) : ContextWrapper(context) {
|
class Cache private constructor(context: Context, val galleryID: Int) : ContextWrapper(context) {
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
private val instances = SparseArray<Cache>()
|
val instances = SparseArray<Cache>()
|
||||||
|
|
||||||
fun getInstance(context: Context, galleryID: Int) =
|
fun getInstance(context: Context, galleryID: Int) =
|
||||||
instances[galleryID] ?: synchronized(this) {
|
instances[galleryID] ?: synchronized(this) {
|
||||||
|
|||||||
@@ -97,7 +97,14 @@ val formatMap = mapOf<String, GalleryBlock.() -> (String)>(
|
|||||||
* Formats download folder name with given Metadata
|
* Formats download folder name with given Metadata
|
||||||
*/
|
*/
|
||||||
fun GalleryBlock.formatDownloadFolder(): String =
|
fun GalleryBlock.formatDownloadFolder(): String =
|
||||||
Preferences["download_folder_name", "-id-"].let {
|
Preferences["download_folder_name", "[-id-] -title-"].let {
|
||||||
|
formatMap.entries.fold(it) { str, (k, v) ->
|
||||||
|
str.replace(k, v.invoke(this), true)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun GalleryBlock.formatDownloadFolderTest(format: String): String =
|
||||||
|
format.let {
|
||||||
formatMap.entries.fold(it) { str, (k, v) ->
|
formatMap.entries.fold(it) { str, (k, v) ->
|
||||||
str.replace(k, v.invoke(this), true)
|
str.replace(k, v.invoke(this), true)
|
||||||
}
|
}
|
||||||
|
|||||||
59
app/src/main/res/layout/dialog_download_folder_name.xml
Normal file
59
app/src/main/res/layout/dialog_download_folder_name.xml
Normal file
@@ -0,0 +1,59 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!--
|
||||||
|
~ 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 <http://www.gnu.org/licenses/>.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
android:padding="16dp">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
style="?android:textAppearanceLarge"
|
||||||
|
android:id="@+id/title"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="@string/settings_download_folder_name"
|
||||||
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"/>
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/message"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
app:layout_constraintTop_toBottomOf="@id/title"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"/>
|
||||||
|
|
||||||
|
<EditText
|
||||||
|
android:id="@+id/edittext"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
app:layout_constraintTop_toBottomOf="@id/message"
|
||||||
|
android:layout_margin="8dp"/>
|
||||||
|
|
||||||
|
<com.google.android.material.button.MaterialButton
|
||||||
|
android:id="@+id/ok_button"
|
||||||
|
style="?borderlessButtonStyle"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="@android:string/ok"
|
||||||
|
app:layout_constraintTop_toBottomOf="@id/edittext"
|
||||||
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"/>
|
||||||
|
|
||||||
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||||
@@ -143,6 +143,6 @@
|
|||||||
<string name="downloader_running">ダウンローダー起動中</string>
|
<string name="downloader_running">ダウンローダー起動中</string>
|
||||||
<string name="settings_download_folder_name">フォルダ名パターン</string>
|
<string name="settings_download_folder_name">フォルダ名パターン</string>
|
||||||
<string name="settings_invalid_download_folder_name">フォルダ名に使用できない文字が含まれています</string>
|
<string name="settings_invalid_download_folder_name">フォルダ名に使用できない文字が含まれています</string>
|
||||||
<string name="settings_download_folder_name_message">%sに含まれている文字列を対応する変数に置換します</string>
|
<string name="settings_download_folder_name_message">%sに含まれている文字列を対応する変数に置換します\n\n%s</string>
|
||||||
<string name="settings_manage_storage">ストレージ管理</string>
|
<string name="settings_manage_storage">ストレージ管理</string>
|
||||||
</resources>
|
</resources>
|
||||||
@@ -143,6 +143,6 @@
|
|||||||
<string name="downloader_running">다운로더 작동중…</string>
|
<string name="downloader_running">다운로더 작동중…</string>
|
||||||
<string name="settings_download_folder_name">폴더명 패턴</string>
|
<string name="settings_download_folder_name">폴더명 패턴</string>
|
||||||
<string name="settings_invalid_download_folder_name">폴더 패턴에 사용할 수 없는 문자가 포함되어 있습니다</string>
|
<string name="settings_invalid_download_folder_name">폴더 패턴에 사용할 수 없는 문자가 포함되어 있습니다</string>
|
||||||
<string name="settings_download_folder_name_message">지원되는 변수는 %s 입니다</string>
|
<string name="settings_download_folder_name_message">지원되는 변수는 %s 입니다\n\n%s</string>
|
||||||
<string name="settings_manage_storage">저장소 관리</string>
|
<string name="settings_manage_storage">저장소 관리</string>
|
||||||
</resources>
|
</resources>
|
||||||
@@ -136,9 +136,12 @@
|
|||||||
<string name="settings_clear_history">Clear history</string>
|
<string name="settings_clear_history">Clear history</string>
|
||||||
<string name="settings_clear_history_alert_message">Do you want to clear histories?</string>
|
<string name="settings_clear_history_alert_message">Do you want to clear histories?</string>
|
||||||
<string name="settings_clear_history_summary">%1$d histories saved</string>
|
<string name="settings_clear_history_summary">%1$d histories saved</string>
|
||||||
|
|
||||||
|
<!-- SETTINGS/STORAGE / MISCELLANEOUS -->
|
||||||
|
|
||||||
<string name="settings_download_folder_name">Folder naming pattern</string>
|
<string name="settings_download_folder_name">Folder naming pattern</string>
|
||||||
<string name="settings_invalid_download_folder_name">Folder naming pattern is containing invalid characters</string>
|
<string name="settings_invalid_download_folder_name">Folder naming pattern is containing invalid characters</string>
|
||||||
<string name="settings_download_folder_name_message">Text %s will be replaced to its corresponding value</string>
|
<string name="settings_download_folder_name_message">%s will be replaced to its corresponding value\n\n%s</string>
|
||||||
<string name="settings_download_folder">Download folder</string>
|
<string name="settings_download_folder">Download folder</string>
|
||||||
<string name="settings_download_folder_removable">Removable Storage</string>
|
<string name="settings_download_folder_removable">Removable Storage</string>
|
||||||
<string name="settings_download_folder_internal">Internal Storage</string>
|
<string name="settings_download_folder_internal">Internal Storage</string>
|
||||||
|
|||||||
@@ -35,11 +35,10 @@
|
|||||||
app:fragment="xyz.quaver.pupil.ui.fragment.ManageStorageFragment"
|
app:fragment="xyz.quaver.pupil.ui.fragment.ManageStorageFragment"
|
||||||
app:title="@string/settings_manage_storage" />
|
app:title="@string/settings_manage_storage" />
|
||||||
|
|
||||||
<EditTextPreference
|
<Preference
|
||||||
app:key="download_folder_name"
|
app:key="download_folder_name"
|
||||||
app:title="@string/settings_download_folder_name"
|
app:title="@string/settings_download_folder_name"
|
||||||
app:defaultValue="-id-"
|
app:defaultValue="[-id-] -title-"/>
|
||||||
app:useSimpleSummaryProvider="true"/>
|
|
||||||
|
|
||||||
<Preference
|
<Preference
|
||||||
app:key="download_folder"
|
app:key="download_folder"
|
||||||
|
|||||||
Reference in New Issue
Block a user