pull/1284/head
gedoor 3 years ago
parent afd1a82259
commit 4066608c26
  1. 60
      app/src/main/java/io/legado/app/lib/dialogs/AndroidDialogs.kt
  2. 22
      app/src/main/java/io/legado/app/lib/dialogs/AndroidSelectors.kt
  3. 67
      app/src/main/java/io/legado/app/lib/dialogs/Dialogs.kt
  4. 17
      app/src/main/java/io/legado/app/lib/dialogs/SelectItem.kt
  5. 29
      app/src/main/java/io/legado/app/lib/dialogs/Selectors.kt
  6. 7
      app/src/main/java/io/legado/app/ui/book/cache/CacheActivity.kt
  7. 3
      app/src/main/java/io/legado/app/ui/book/read/config/BgTextConfigDialog.kt
  8. 6
      app/src/main/java/io/legado/app/ui/document/FilePickerDialog.kt
  9. 55
      app/src/main/java/io/legado/app/ui/document/HandleFileActivity.kt
  10. 8
      app/src/main/java/io/legado/app/ui/document/HandleFileContract.kt
  11. 7
      app/src/main/java/io/legado/app/ui/rss/read/ReadRssActivity.kt
  12. 3
      app/src/main/java/io/legado/app/ui/widget/font/FontSelectDialog.kt

@ -123,3 +123,63 @@ private fun Context.progressDialog(
if (init != null) init() if (init != null) init()
show() show()
} }
typealias AlertBuilderFactory<D> = (Context) -> AlertBuilder<D>
inline fun <D : DialogInterface> Fragment.alert(
noinline factory: AlertBuilderFactory<D>,
title: String? = null,
message: String? = null,
noinline init: (AlertBuilder<D>.() -> Unit)? = null
) = activity?.alert(factory, title, message, init)
fun <D : DialogInterface> Context.alert(
factory: AlertBuilderFactory<D>,
title: String? = null,
message: String? = null,
init: (AlertBuilder<D>.() -> Unit)? = null
): AlertBuilder<D> {
return factory(this).apply {
if (title != null) {
this.setTitle(title)
}
if (message != null) {
this.setMessage(message)
}
if (init != null) init()
}
}
inline fun <D : DialogInterface> Fragment.alert(
noinline factory: AlertBuilderFactory<D>,
titleResource: Int? = null,
messageResource: Int? = null,
noinline init: (AlertBuilder<D>.() -> Unit)? = null
) = requireActivity().alert(factory, titleResource, messageResource, init)
fun <D : DialogInterface> Context.alert(
factory: AlertBuilderFactory<D>,
titleResource: Int? = null,
messageResource: Int? = null,
init: (AlertBuilder<D>.() -> Unit)? = null
): AlertBuilder<D> {
return factory(this).apply {
if (titleResource != null) {
this.setTitle(titleResource)
}
if (messageResource != null) {
this.setMessage(messageResource)
}
if (init != null) init()
}
}
inline fun <D : DialogInterface> Fragment.alert(
noinline factory: AlertBuilderFactory<D>,
noinline init: AlertBuilder<D>.() -> Unit
) = requireActivity().alert(factory, init)
fun <D : DialogInterface> Context.alert(
factory: AlertBuilderFactory<D>,
init: AlertBuilder<D>.() -> Unit
): AlertBuilder<D> = factory(this).apply { init() }

@ -55,3 +55,25 @@ fun Context.selector(
show() show()
} }
} }
inline fun <D : DialogInterface> Fragment.selector(
noinline factory: AlertBuilderFactory<D>,
title: CharSequence? = null,
items: List<CharSequence>,
noinline onClick: (DialogInterface, CharSequence, Int) -> Unit
) = requireActivity().selector(factory, title, items, onClick)
fun <D : DialogInterface> Context.selector(
factory: AlertBuilderFactory<D>,
title: CharSequence? = null,
items: List<CharSequence>,
onClick: (DialogInterface, CharSequence, Int) -> Unit
) {
with(factory(this)) {
if (title != null) {
this.setTitle(title)
}
items(items, onClick)
show()
}
}

@ -1,67 +0,0 @@
@file:Suppress("NOTHING_TO_INLINE", "unused")
package io.legado.app.lib.dialogs
import android.content.Context
import android.content.DialogInterface
import androidx.fragment.app.Fragment
typealias AlertBuilderFactory<D> = (Context) -> AlertBuilder<D>
inline fun <D : DialogInterface> Fragment.alert(
noinline factory: AlertBuilderFactory<D>,
title: String? = null,
message: String? = null,
noinline init: (AlertBuilder<D>.() -> Unit)? = null
) = activity?.alert(factory, title, message, init)
fun <D : DialogInterface> Context.alert(
factory: AlertBuilderFactory<D>,
title: String? = null,
message: String? = null,
init: (AlertBuilder<D>.() -> Unit)? = null
): AlertBuilder<D> {
return factory(this).apply {
if (title != null) {
this.setTitle(title)
}
if (message != null) {
this.setMessage(message)
}
if (init != null) init()
}
}
inline fun <D : DialogInterface> Fragment.alert(
noinline factory: AlertBuilderFactory<D>,
titleResource: Int? = null,
messageResource: Int? = null,
noinline init: (AlertBuilder<D>.() -> Unit)? = null
) = requireActivity().alert(factory, titleResource, messageResource, init)
fun <D : DialogInterface> Context.alert(
factory: AlertBuilderFactory<D>,
titleResource: Int? = null,
messageResource: Int? = null,
init: (AlertBuilder<D>.() -> Unit)? = null
): AlertBuilder<D> {
return factory(this).apply {
if (titleResource != null) {
this.setTitle(titleResource)
}
if (messageResource != null) {
this.setMessage(messageResource)
}
if (init != null) init()
}
}
inline fun <D : DialogInterface> Fragment.alert(
noinline factory: AlertBuilderFactory<D>,
noinline init: AlertBuilder<D>.() -> Unit
) = requireActivity().alert(factory, init)
fun <D : DialogInterface> Context.alert(
factory: AlertBuilderFactory<D>,
init: AlertBuilder<D>.() -> Unit
): AlertBuilder<D> = factory(this).apply { init() }

@ -0,0 +1,17 @@
package io.legado.app.lib.dialogs
import android.os.Parcelable
import kotlinx.parcelize.Parcelize
@Suppress("unused")
@Parcelize
data class SelectItem(
val title: String,
val id: Int
) : Parcelable {
override fun toString(): String {
return title
}
}

@ -1,29 +0,0 @@
@file:Suppress("NOTHING_TO_INLINE", "unused")
package io.legado.app.lib.dialogs
import android.content.Context
import android.content.DialogInterface
import androidx.fragment.app.Fragment
inline fun <D : DialogInterface> Fragment.selector(
noinline factory: AlertBuilderFactory<D>,
title: CharSequence? = null,
items: List<CharSequence>,
noinline onClick: (DialogInterface, CharSequence, Int) -> Unit
) = requireActivity().selector(factory, title, items, onClick)
fun <D : DialogInterface> Context.selector(
factory: AlertBuilderFactory<D>,
title: CharSequence? = null,
items: List<CharSequence>,
onClick: (DialogInterface, CharSequence, Int) -> Unit
) {
with(factory(this)) {
if (title != null) {
this.setTitle(title)
}
items(items, onClick)
show()
}
}

@ -21,6 +21,7 @@ import io.legado.app.databinding.ActivityCacheBookBinding
import io.legado.app.databinding.DialogEditTextBinding import io.legado.app.databinding.DialogEditTextBinding
import io.legado.app.help.AppConfig import io.legado.app.help.AppConfig
import io.legado.app.help.BookHelp import io.legado.app.help.BookHelp
import io.legado.app.lib.dialogs.SelectItem
import io.legado.app.lib.dialogs.alert import io.legado.app.lib.dialogs.alert
import io.legado.app.lib.dialogs.selector import io.legado.app.lib.dialogs.selector
import io.legado.app.service.help.CacheBook import io.legado.app.service.help.CacheBook
@ -248,13 +249,13 @@ class CacheActivity : VMBaseActivity<ActivityCacheBookBinding, CacheViewModel>()
} }
private fun selectExportFolder() { private fun selectExportFolder() {
val default = arrayListOf<String>() val default = arrayListOf<SelectItem>()
val path = ACache.get(this@CacheActivity).getAsString(exportBookPathKey) val path = ACache.get(this@CacheActivity).getAsString(exportBookPathKey)
if (!path.isNullOrEmpty()) { if (!path.isNullOrEmpty()) {
default.add(path) default.add(SelectItem(path, -1))
} }
exportDir.launch { exportDir.launch {
otherActions = default.toTypedArray() otherActions = default
} }
} }

@ -18,6 +18,7 @@ import io.legado.app.help.DefaultData
import io.legado.app.help.ReadBookConfig import io.legado.app.help.ReadBookConfig
import io.legado.app.help.http.newCall import io.legado.app.help.http.newCall
import io.legado.app.help.http.okHttpClient import io.legado.app.help.http.okHttpClient
import io.legado.app.lib.dialogs.SelectItem
import io.legado.app.lib.dialogs.alert import io.legado.app.lib.dialogs.alert
import io.legado.app.lib.dialogs.selector import io.legado.app.lib.dialogs.selector
import io.legado.app.lib.theme.bottomBackground import io.legado.app.lib.theme.bottomBackground
@ -191,7 +192,7 @@ class BgTextConfigDialog : BaseDialogFragment() {
mode = HandleFileContract.FILE mode = HandleFileContract.FILE
title = getString(R.string.import_str) title = getString(R.string.import_str)
allowExtensions = arrayOf("zip") allowExtensions = arrayOf("zip")
otherActions = arrayOf(importFormNet) otherActions = arrayListOf(SelectItem(importFormNet, -1))
} }
} }
binding.ivExport.setOnClickListener { binding.ivExport.setOnClickListener {

@ -16,7 +16,7 @@ import androidx.recyclerview.widget.RecyclerView
import io.legado.app.R import io.legado.app.R
import io.legado.app.databinding.DialogFileChooserBinding import io.legado.app.databinding.DialogFileChooserBinding
import io.legado.app.lib.theme.primaryColor import io.legado.app.lib.theme.primaryColor
import io.legado.app.ui.document.HandleFileContract.Companion.DIRECTORY import io.legado.app.ui.document.HandleFileContract.Companion.DIR
import io.legado.app.ui.document.HandleFileContract.Companion.FILE import io.legado.app.ui.document.HandleFileContract.Companion.FILE
import io.legado.app.ui.document.adapter.FileAdapter import io.legado.app.ui.document.adapter.FileAdapter
import io.legado.app.ui.document.adapter.PathAdapter import io.legado.app.ui.document.adapter.PathAdapter
@ -63,7 +63,7 @@ class FilePickerDialog : DialogFragment(),
private val binding by viewBinding(DialogFileChooserBinding::bind) private val binding by viewBinding(DialogFileChooserBinding::bind)
override var allowExtensions: Array<String>? = null override var allowExtensions: Array<String>? = null
override val isSelectDir: Boolean override val isSelectDir: Boolean
get() = mode == DIRECTORY get() = mode == DIR
override var isShowHomeDir: Boolean = false override var isShowHomeDir: Boolean = false
override var isShowUpDir: Boolean = true override var isShowUpDir: Boolean = true
override var isShowHideDir: Boolean = false override var isShowHideDir: Boolean = false
@ -159,7 +159,7 @@ class FilePickerDialog : DialogFragment(),
refreshCurrentDirPath(fileItem.path) refreshCurrentDirPath(fileItem.path)
} else { } else {
fileItem?.path?.let { path -> fileItem?.path?.let { path ->
if (mode == DIRECTORY) { if (mode == DIR) {
toastOnUi("这是文件夹选择,不能选择文件,点击右上角的确定选择文件夹") toastOnUi("这是文件夹选择,不能选择文件,点击右上角的确定选择文件夹")
} else if (allowExtensions.isNullOrEmpty() || } else if (allowExtensions.isNullOrEmpty() ||
allowExtensions?.contains(FileUtils.getExtension(path)) == true allowExtensions?.contains(FileUtils.getExtension(path)) == true

@ -10,6 +10,7 @@ import io.legado.app.R
import io.legado.app.base.BaseActivity import io.legado.app.base.BaseActivity
import io.legado.app.constant.Theme import io.legado.app.constant.Theme
import io.legado.app.databinding.ActivityTranslucenceBinding import io.legado.app.databinding.ActivityTranslucenceBinding
import io.legado.app.lib.dialogs.SelectItem
import io.legado.app.lib.dialogs.alert import io.legado.app.lib.dialogs.alert
import io.legado.app.lib.permission.Permissions import io.legado.app.lib.permission.Permissions
import io.legado.app.lib.permission.PermissionsCompat import io.legado.app.lib.permission.PermissionsCompat
@ -46,50 +47,60 @@ class HandleFileActivity :
override fun onActivityCreated(savedInstanceState: Bundle?) { override fun onActivityCreated(savedInstanceState: Bundle?) {
val mode = intent.getIntExtra("mode", 0) val mode = intent.getIntExtra("mode", 0)
val allowExtensions = intent.getStringArrayExtra("allowExtensions") val allowExtensions = intent.getStringArrayExtra("allowExtensions")
val selectList = if (mode == HandleFileContract.DIRECTORY) { val selectList = when (mode) {
arrayListOf(getString(R.string.sys_folder_picker)) HandleFileContract.DIR -> arrayListOf(
} else { SelectItem(getString(R.string.sys_folder_picker), HandleFileContract.DIR)
arrayListOf(getString(R.string.sys_file_picker)) ).apply {
if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.Q) {
add(SelectItem(getString(R.string.app_folder_picker), 10))
} }
}
HandleFileContract.FILE -> arrayListOf(
SelectItem(getString(R.string.sys_file_picker), HandleFileContract.FILE)
).apply {
if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.Q) { if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.Q) {
selectList.add(getString(R.string.app_folder_picker)) add(SelectItem(getString(R.string.app_folder_picker), 11))
}
} }
intent.getStringArrayListExtra("otherActions")?.let { HandleFileContract.EXPORT -> arrayListOf(
SelectItem(getString(R.string.upload_url), 111),
SelectItem(getString(R.string.sys_folder_picker), HandleFileContract.DIR)
)
else -> arrayListOf()
}
intent.getParcelableArrayListExtra<SelectItem>("otherActions")?.let {
selectList.addAll(it) selectList.addAll(it)
} }
val title = intent.getStringExtra("title") ?: let { val title = intent.getStringExtra("title") ?: let {
if (mode == HandleFileContract.DIRECTORY) { when (mode) {
HandleFileContract.DIR -> {
return@let getString(R.string.select_folder) return@let getString(R.string.select_folder)
} else { }
else -> {
return@let getString(R.string.select_file) return@let getString(R.string.select_file)
} }
} }
alert(title) {
items(selectList) { _, index ->
when (index) {
0 -> if (mode == HandleFileContract.DIRECTORY) {
selectDocTree.launch(null)
} else {
selectDoc.launch(typesOfExtensions(allowExtensions))
} }
1 -> if (mode == HandleFileContract.DIRECTORY) { alert(title) {
checkPermissions { items(selectList) { _, item, _ ->
when (item.id) {
HandleFileContract.DIR -> selectDocTree.launch(null)
HandleFileContract.FILE -> selectDoc.launch(typesOfExtensions(allowExtensions))
10 -> checkPermissions {
FilePickerDialog.show( FilePickerDialog.show(
supportFragmentManager, supportFragmentManager,
mode = HandleFileContract.DIRECTORY mode = HandleFileContract.DIR
) )
} }
} else { 11 -> checkPermissions {
checkPermissions {
FilePickerDialog.show( FilePickerDialog.show(
supportFragmentManager, supportFragmentManager,
mode = HandleFileContract.FILE, mode = HandleFileContract.FILE,
allowExtensions = allowExtensions allowExtensions = allowExtensions
) )
} }
}
else -> { else -> {
val path = selectList[index] val path = item.title
val uri = if (path.isContentScheme()) { val uri = if (path.isContentScheme()) {
Uri.fromFile(File(path)) Uri.fromFile(File(path))
} else { } else {

@ -5,14 +5,16 @@ import android.content.Context
import android.content.Intent import android.content.Intent
import android.net.Uri import android.net.Uri
import androidx.activity.result.contract.ActivityResultContract import androidx.activity.result.contract.ActivityResultContract
import io.legado.app.lib.dialogs.SelectItem
@Suppress("unused") @Suppress("unused")
class HandleFileContract : class HandleFileContract :
ActivityResultContract<HandleFileContract.HandleFileParam.() -> Unit, Uri?>() { ActivityResultContract<HandleFileContract.HandleFileParam.() -> Unit, Uri?>() {
companion object { companion object {
const val DIRECTORY = 0 const val DIR = 0
const val FILE = 1 const val FILE = 1
const val EXPORT = 3
} }
override fun createIntent(context: Context, input: (HandleFileParam.() -> Unit)?): Intent { override fun createIntent(context: Context, input: (HandleFileParam.() -> Unit)?): Intent {
@ -39,10 +41,10 @@ class HandleFileContract :
@Suppress("ArrayInDataClass") @Suppress("ArrayInDataClass")
data class HandleFileParam( data class HandleFileParam(
var mode: Int = DIRECTORY, var mode: Int = DIR,
var title: String? = null, var title: String? = null,
var allowExtensions: Array<String> = arrayOf(), var allowExtensions: Array<String> = arrayOf(),
var otherActions: Array<String>? = null, var otherActions: ArrayList<SelectItem>? = null,
) )
} }

@ -18,6 +18,7 @@ import io.legado.app.base.VMBaseActivity
import io.legado.app.constant.AppConst import io.legado.app.constant.AppConst
import io.legado.app.databinding.ActivityRssReadBinding import io.legado.app.databinding.ActivityRssReadBinding
import io.legado.app.help.AppConfig import io.legado.app.help.AppConfig
import io.legado.app.lib.dialogs.SelectItem
import io.legado.app.lib.theme.DrawableUtils import io.legado.app.lib.theme.DrawableUtils
import io.legado.app.lib.theme.primaryTextColor import io.legado.app.lib.theme.primaryTextColor
import io.legado.app.service.help.Download import io.legado.app.service.help.Download
@ -164,13 +165,13 @@ class ReadRssActivity : VMBaseActivity<ActivityRssReadBinding, ReadRssViewModel>
} }
private fun selectSaveFolder() { private fun selectSaveFolder() {
val default = arrayListOf<String>() val default = arrayListOf<SelectItem>()
val path = ACache.get(this@ReadRssActivity).getAsString(imagePathKey) val path = ACache.get(this@ReadRssActivity).getAsString(imagePathKey)
if (!path.isNullOrEmpty()) { if (!path.isNullOrEmpty()) {
default.add(path) default.add(SelectItem(path, -1))
} }
saveImage.launch { saveImage.launch {
otherActions = default.toTypedArray() otherActions = default
} }
} }

@ -15,6 +15,7 @@ import io.legado.app.base.BaseDialogFragment
import io.legado.app.constant.PreferKey import io.legado.app.constant.PreferKey
import io.legado.app.databinding.DialogFontSelectBinding import io.legado.app.databinding.DialogFontSelectBinding
import io.legado.app.help.AppConfig import io.legado.app.help.AppConfig
import io.legado.app.lib.dialogs.SelectItem
import io.legado.app.lib.dialogs.alert import io.legado.app.lib.dialogs.alert
import io.legado.app.lib.permission.Permissions import io.legado.app.lib.permission.Permissions
import io.legado.app.lib.permission.PermissionsCompat import io.legado.app.lib.permission.PermissionsCompat
@ -128,7 +129,7 @@ class FontSelectDialog : BaseDialogFragment(),
launch(Main) { launch(Main) {
val defaultPath = "SD${File.separator}Fonts" val defaultPath = "SD${File.separator}Fonts"
selectFontDir.launch { selectFontDir.launch {
otherActions = arrayOf(defaultPath) otherActions = arrayListOf(SelectItem(defaultPath, -1))
} }
} }
} }

Loading…
Cancel
Save