Replace material-dialogs with Material Components' SY

This commit is contained in:
Jobobby04 2021-07-18 20:17:58 -04:00
parent d4993d1b71
commit cf54851342
40 changed files with 822 additions and 733 deletions

View File

@ -2,8 +2,8 @@ package eu.kanade.tachiyomi.ui.browse.migration
import android.app.Dialog
import android.os.Bundle
import com.afollestad.materialdialogs.MaterialDialog
import com.bluelinelabs.conductor.Controller
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.ui.base.controller.DialogController
import eu.kanade.tachiyomi.ui.browse.migration.advanced.process.MigrationListController
@ -32,15 +32,16 @@ class MigrationMangaDialog<T>(bundle: Bundle? = null) : DialogController(bundle)
else ""
)
).orEmpty()
return MaterialDialog(activity!!)
.message(text = confirmString)
.positiveButton(if (copy) R.string.copy else R.string.migrate) {
return MaterialAlertDialogBuilder(activity!!)
.setMessage(confirmString)
.setPositiveButton(if (copy) R.string.copy else R.string.migrate) { _, _ ->
if (copy) {
(targetController as? MigrationListController)?.copyMangas()
} else {
(targetController as? MigrationListController)?.migrateMangas()
}
}
.negativeButton(android.R.string.cancel)
.setNegativeButton(android.R.string.cancel, null)
.create()
}
}

View File

@ -13,8 +13,8 @@ import androidx.core.graphics.ColorUtils
import androidx.core.os.bundleOf
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.vectordrawable.graphics.drawable.VectorDrawableCompat
import com.afollestad.materialdialogs.MaterialDialog
import com.bluelinelabs.conductor.changehandler.FadeChangeHandler
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import dev.chrisbanes.insetter.applyInsetter
import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.database.DatabaseHelper
@ -430,14 +430,14 @@ class MigrationListController(bundle: Bundle? = null) :
override fun handleBack(): Boolean {
activity?.let {
MaterialDialog(it).show {
title(R.string.stop_migrating)
positiveButton(R.string.action_stop) {
MaterialAlertDialogBuilder(it)
.setTitle(R.string.stop_migrating)
.setPositiveButton(R.string.action_stop) { _, _ ->
router.popCurrentController()
migrationsJob?.cancel()
}
negativeButton(android.R.string.cancel)
}
.setNegativeButton(android.R.string.cancel, null)
.show()
}
return true
}

View File

@ -234,7 +234,8 @@ class SourceController(bundle: Bundle? = null) :
}
private fun addToCategories(source: Source) {
val categories = preferences.sourcesTabCategories().get().toList().sortedBy { it.lowercase() }
val categories = preferences.sourcesTabCategories().get().sortedBy { it.lowercase() }
.toTypedArray()
if (categories.isEmpty()) {
applicationContext?.toast(R.string.no_source_categories)
@ -245,16 +246,18 @@ class SourceController(bundle: Bundle? = null) :
val sources = preferenceSources.map { it.split("|")[0] }
if (source.id.toString() in sources) {
val preferenceSourcePairs = preferenceSources.map { it.split("|") }.filter { it[0] == source.id.toString() }.map { it[0] to it[1] }.toMutableList()
val sourceCategories = preferenceSources
.map { item -> item.split("|").let { it.component1() to it.component2() } }
.filter { it.first == source.id.toString() }
.map { it.second }
val preselected = preferenceSourcePairs.map { category ->
categories.indexOf(category.second)
}.toTypedArray()
val selection = categories.map { it in sourceCategories }
.toBooleanArray()
ChangeSourceCategoriesDialog(this, source, categories, preselected)
ChangeSourceCategoriesDialog(this, source, categories, selection)
.showDialog(router)
} else {
ChangeSourceCategoriesDialog(this, source, categories, emptyArray())
ChangeSourceCategoriesDialog(this, source, categories, categories.map { false }.toBooleanArray())
.showDialog(router)
}
}

View File

@ -54,6 +54,7 @@ import eu.kanade.tachiyomi.util.view.shrinkOnScroll
import eu.kanade.tachiyomi.util.view.snack
import eu.kanade.tachiyomi.widget.AutofitRecyclerView
import eu.kanade.tachiyomi.widget.EmptyView
import eu.kanade.tachiyomi.widget.materialdialogs.setTextInput
import exh.log.xLogW
import exh.savedsearches.EXHSavedSearch
import exh.source.getMainSource
@ -205,15 +206,19 @@ open class BrowseSourceController(bundle: Bundle) :
// EXH -->
onSaveClicked = {
filterSheet?.context?.let {
MaterialDialog(it)
.title(R.string.save_search)
.input(hintRes = R.string.save_search_hint) { _, searchName ->
var searchName = ""
MaterialAlertDialogBuilder(it)
.setTitle(R.string.save_search)
.setTextInput(hint = it.getString(R.string.save_search_hint)) { input ->
searchName = input
}
.setPositiveButton(R.string.action_save) { _, _ ->
val oldSavedSearches = presenter.loadSearches()
if (searchName.isNotBlank() &&
oldSavedSearches.size < MAX_SAVED_SEARCHES
) {
val newSearches = oldSavedSearches + EXHSavedSearch(
searchName.toString().trim(),
searchName.trim(),
presenter.query,
presenter.sourceFilters
)
@ -221,10 +226,7 @@ open class BrowseSourceController(bundle: Bundle) :
filterSheet?.setSavedSearches(newSearches)
}
}
.positiveButton(R.string.action_save)
.negativeButton(R.string.action_cancel)
.cancelable(true)
.cancelOnTouchOutside(true)
.setNegativeButton(R.string.action_cancel, null)
.show()
}
},
@ -235,11 +237,9 @@ open class BrowseSourceController(bundle: Bundle) :
if (search == null) {
filterSheet?.context?.let {
MaterialDialog(it)
.title(R.string.save_search_failed_to_load)
.message(R.string.save_search_failed_to_load_message)
.cancelable(true)
.cancelOnTouchOutside(true)
MaterialAlertDialogBuilder(it)
.setTitle(R.string.save_search_failed_to_load)
.setMessage(R.string.save_search_failed_to_load_message)
.show()
}
return@cb
@ -267,30 +267,26 @@ open class BrowseSourceController(bundle: Bundle) :
if (search == null || search.name != name) {
filterSheet?.context?.let {
MaterialDialog(it)
.title(R.string.save_search_failed_to_delete)
.message(R.string.save_search_failed_to_delete_message)
.cancelable(true)
.cancelOnTouchOutside(true)
MaterialAlertDialogBuilder(it)
.setTitle(R.string.save_search_failed_to_delete)
.setMessage(R.string.save_search_failed_to_delete_message)
.show()
}
return@cb
}
filterSheet?.context?.let {
MaterialDialog(it)
.title(R.string.save_search_delete)
.message(text = it.getString(R.string.save_search_delete_message, search.name))
.positiveButton(R.string.action_cancel)
.negativeButton(android.R.string.ok) {
MaterialAlertDialogBuilder(it)
.setTitle(R.string.save_search_delete)
.setMessage(it.getString(R.string.save_search_delete_message, search.name))
.setPositiveButton(R.string.action_cancel, null)
.setNegativeButton(android.R.string.ok) { _, _ ->
val newSearches = savedSearches.filterIndexed { index, _ ->
index != indexToDelete
}
presenter.saveSearches(newSearches)
filterSheet?.setSavedSearches(newSearches)
}
.cancelable(true)
.cancelOnTouchOutside(true)
.show()
}
}

View File

@ -8,7 +8,7 @@ import android.view.View
import androidx.core.os.bundleOf
import androidx.core.view.isVisible
import androidx.recyclerview.widget.LinearLayoutManager
import com.afollestad.materialdialogs.MaterialDialog
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton
import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.database.models.Manga
@ -216,11 +216,9 @@ open class IndexController :
if (search == null) {
filterSheet?.context?.let {
MaterialDialog(it)
.title(R.string.save_search_failed_to_load)
.message(R.string.save_search_failed_to_load_message)
.cancelable(true)
.cancelOnTouchOutside(true)
MaterialAlertDialogBuilder(it)
.setTitle(R.string.save_search_failed_to_load)
.setMessage(R.string.save_search_failed_to_load_message)
.show()
}
return@cb

View File

@ -10,6 +10,7 @@ import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton
import com.google.android.material.snackbar.Snackbar
import com.google.android.material.timepicker.MaterialTimePicker
import dev.chrisbanes.insetter.applyInsetter
import eu.davidea.flexibleadapter.FlexibleAdapter
import eu.davidea.flexibleadapter.SelectableAdapter
@ -21,6 +22,8 @@ import eu.kanade.tachiyomi.ui.base.controller.NucleusController
import eu.kanade.tachiyomi.ui.main.MainActivity
import eu.kanade.tachiyomi.util.system.toast
import eu.kanade.tachiyomi.util.view.shrinkOnScroll
import exh.util.hours
import exh.util.minutes
import kotlin.time.Duration
import kotlin.time.ExperimentalTime
@ -34,7 +37,6 @@ class BiometricTimesController :
ActionMode.Callback,
FlexibleAdapter.OnItemClickListener,
FlexibleAdapter.OnItemLongClickListener,
BiometricTimesCreateDialog.Listener,
UndoHelper.OnActionListener {
/**
@ -97,7 +99,7 @@ class BiometricTimesController :
fab.setText(R.string.action_add)
fab.setIconResource(R.drawable.ic_add_24dp)
fab.setOnClickListener {
BiometricTimesCreateDialog(this@BiometricTimesController).showDialog(router, null)
showTimePicker()
}
}
@ -298,15 +300,19 @@ class BiometricTimesController :
activity?.toast(R.string.biometric_lock_time_conflicts)
}
override fun startNextDialog(startTime: Duration?) {
if (startTime != null) {
BiometricTimesCreateDialog(this@BiometricTimesController, startTime).showDialog(router, null)
} else activity?.toast(R.string.biometric_lock_invalid_time_selected)
}
override fun createTimeRange(startTime: Duration?, endTime: Duration?) {
if (startTime != null && endTime != null) {
presenter.createTimeRange(TimeRange(startTime, endTime))
} else activity?.toast(R.string.biometric_lock_invalid_time_selected)
fun showTimePicker(startTime: Duration? = null) {
val picker = MaterialTimePicker.Builder()
.setTitleText(if (startTime == null) R.string.biometric_lock_start_time else R.string.biometric_lock_end_time)
.setInputMode(MaterialTimePicker.INPUT_MODE_CLOCK)
.build()
picker.addOnPositiveButtonClickListener {
val timeRange = picker.hour.hours + picker.minute.minutes
if (startTime != null) {
presenter.createTimeRange(TimeRange(startTime, timeRange))
} else {
showTimePicker(timeRange)
}
}
picker.show((activity as MainActivity).supportFragmentManager, null)
}
}

View File

@ -1,73 +0,0 @@
package eu.kanade.tachiyomi.ui.category.biometric
import android.app.Dialog
import android.os.Bundle
import com.afollestad.materialdialogs.MaterialDialog
import com.afollestad.materialdialogs.datetime.timePicker
import com.bluelinelabs.conductor.Controller
import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.ui.base.controller.DialogController
import exh.log.xLogD
import exh.util.hours
import exh.util.minutes
import java.util.Calendar
import kotlin.time.Duration
/**
* Dialog to create a new category for the library.
*/
class BiometricTimesCreateDialog<T>(bundle: Bundle? = null) : DialogController(bundle)
where T : Controller, T : BiometricTimesCreateDialog.Listener {
/**
* Name of the new category. Value updated with each input from the user.
*/
private var startTime: Duration? = null
private var endTime: Duration? = null
constructor(target: T) : this() {
targetController = target
}
constructor(target: T, startTime: Duration) : this() {
targetController = target
this.startTime = startTime
}
/**
* Called when creating the dialog for this controller.
*
* @param savedViewState The saved state of this dialog.
* @return a new dialog instance.
*/
override fun onCreateDialog(savedViewState: Bundle?): Dialog {
return MaterialDialog(activity!!)
.title(if (startTime == null) R.string.biometric_lock_start_time else R.string.biometric_lock_end_time)
.timePicker(show24HoursView = false) { _, datetime ->
val hour = datetime.get(Calendar.HOUR_OF_DAY)
xLogD(hour)
val minute = datetime.get(Calendar.MINUTE)
xLogD(minute)
if (hour !in 0..24 || minute !in 0..60) return@timePicker
if (startTime != null) {
endTime = hour.hours + minute.minutes
} else {
startTime = hour.hours + minute.minutes
}
}
.negativeButton(android.R.string.cancel)
.positiveButton(android.R.string.ok) {
if (endTime != null) {
(targetController as? Listener)?.createTimeRange(startTime, endTime)
} else {
(targetController as? Listener)?.startNextDialog(startTime)
}
}
}
interface Listener {
fun startNextDialog(startTime: Duration?)
fun createTimeRange(startTime: Duration?, endTime: Duration?)
}
}

View File

@ -9,7 +9,7 @@ import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.view.ActionMode
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.afollestad.materialdialogs.MaterialDialog
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton
import com.google.android.material.snackbar.Snackbar
import dev.chrisbanes.insetter.applyInsetter
@ -230,10 +230,10 @@ class SortTagController :
}
private fun helpDialog(hasPositive: Boolean = false) {
MaterialDialog(activity!!)
.title(R.string.add_tag)
.message(R.string.action_add_tags_message)
.positiveButton(android.R.string.ok) {
MaterialAlertDialogBuilder(activity!!)
.setTitle(R.string.add_tag)
.setMessage(R.string.action_add_tags_message)
.setPositiveButton(android.R.string.ok) { _, _ ->
if (hasPositive) {
SortTagCreateDialog(this@SortTagController).showDialog(router, null)
}

View File

@ -2,11 +2,11 @@ package eu.kanade.tachiyomi.ui.category.genre
import android.app.Dialog
import android.os.Bundle
import com.afollestad.materialdialogs.MaterialDialog
import com.afollestad.materialdialogs.input.input
import com.bluelinelabs.conductor.Controller
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.ui.base.controller.DialogController
import eu.kanade.tachiyomi.widget.materialdialogs.setTextInput
/**
* Dialog to create a new category for the library.
@ -30,18 +30,19 @@ class SortTagCreateDialog<T>(bundle: Bundle? = null) : DialogController(bundle)
* @return a new dialog instance.
*/
override fun onCreateDialog(savedViewState: Bundle?): Dialog {
return MaterialDialog(activity!!)
.title(R.string.action_add_category)
.negativeButton(android.R.string.cancel)
.input(
return MaterialAlertDialogBuilder(activity!!)
.setTitle(R.string.action_add_category)
.setTextInput(
hint = resources?.getString(R.string.name),
prefill = currentName
) { _, input ->
currentName = input.toString()
) { input ->
currentName = input
}
.positiveButton(android.R.string.ok) {
.setPositiveButton(android.R.string.ok) { _, _ ->
(targetController as? Listener)?.createCategory(currentName)
}
.setNegativeButton(android.R.string.cancel, null)
.create()
}
interface Listener {

View File

@ -2,11 +2,11 @@ package eu.kanade.tachiyomi.ui.category.repos
import android.app.Dialog
import android.os.Bundle
import com.afollestad.materialdialogs.MaterialDialog
import com.afollestad.materialdialogs.input.input
import com.bluelinelabs.conductor.Controller
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.ui.base.controller.DialogController
import eu.kanade.tachiyomi.widget.materialdialogs.setTextInput
/**
* Dialog to create a new repo for the library.
@ -30,19 +30,20 @@ class RepoCreateDialog<T>(bundle: Bundle? = null) : DialogController(bundle)
* @return a new dialog instance.
*/
override fun onCreateDialog(savedViewState: Bundle?): Dialog {
return MaterialDialog(activity!!)
.title(R.string.action_add_repo)
.message(R.string.action_add_repo_message)
.negativeButton(android.R.string.cancel)
.input(
return MaterialAlertDialogBuilder(activity!!)
.setTitle(R.string.action_add_repo)
.setMessage(R.string.action_add_repo_message)
.setTextInput(
hint = resources?.getString(R.string.name),
prefill = currentName
) { _, input ->
currentName = input.toString()
) { input ->
currentName = input
}
.positiveButton(android.R.string.ok) {
.setPositiveButton(android.R.string.ok) { _, _ ->
(targetController as? Listener)?.createRepo(currentName)
}
.setNegativeButton(android.R.string.cancel, null)
.create()
}
interface Listener {

View File

@ -2,9 +2,8 @@ package eu.kanade.tachiyomi.ui.category.sources
import android.app.Dialog
import android.os.Bundle
import com.afollestad.materialdialogs.MaterialDialog
import com.afollestad.materialdialogs.list.listItemsMultiChoice
import com.bluelinelabs.conductor.Controller
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.source.Source
import eu.kanade.tachiyomi.ui.base.controller.DialogController
@ -14,35 +13,39 @@ class ChangeSourceCategoriesDialog<T>(bundle: Bundle? = null) :
private var source: Source? = null
private var categories = emptyList<String>()
private var categories = emptyArray<String>()
private var preselected = emptyArray<Int>()
private var selection = booleanArrayOf()
constructor(
target: T,
source: Source,
categories: List<String>,
preselected: Array<Int>
categories: Array<String>,
selection: BooleanArray
) : this() {
this.source = source
this.categories = categories
this.preselected = preselected
this.selection = selection
targetController = target
}
override fun onCreateDialog(savedViewState: Bundle?): Dialog {
return MaterialDialog(activity!!)
.title(R.string.action_move_category)
.listItemsMultiChoice(
items = categories,
initialSelection = preselected.toIntArray(),
allowEmptySelection = true
) { _, selections, _ ->
val newCategories = selections.map { categories[it] }
return MaterialAlertDialogBuilder(activity!!)
.setTitle(R.string.action_move_category)
.setMultiChoiceItems(
categories,
selection
) { _, which, selected ->
selection[which] = selected
}
.setPositiveButton(android.R.string.ok) { _, _ ->
val newCategories = categories.filterIndexed { index, s ->
selection[index]
}
(targetController as? Listener)?.updateCategoriesForSource(source!!, newCategories)
}
.positiveButton(android.R.string.ok)
.negativeButton(android.R.string.cancel)
.setNegativeButton(android.R.string.cancel, null)
.create()
}
interface Listener {

View File

@ -2,11 +2,11 @@ package eu.kanade.tachiyomi.ui.category.sources
import android.app.Dialog
import android.os.Bundle
import com.afollestad.materialdialogs.MaterialDialog
import com.afollestad.materialdialogs.input.input
import com.bluelinelabs.conductor.Controller
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.ui.base.controller.DialogController
import eu.kanade.tachiyomi.widget.materialdialogs.setTextInput
/**
* Dialog to create a new category for the library.
@ -30,18 +30,19 @@ class SourceCategoryCreateDialog<T>(bundle: Bundle? = null) : DialogController(b
* @return a new dialog instance.
*/
override fun onCreateDialog(savedViewState: Bundle?): Dialog {
return MaterialDialog(activity!!)
.title(R.string.action_add_category)
.negativeButton(android.R.string.cancel)
.input(
return MaterialAlertDialogBuilder(activity!!)
.setTitle(R.string.action_add_category)
.setNegativeButton(android.R.string.cancel, null)
.setTextInput(
hint = resources?.getString(R.string.name),
prefill = currentName
) { _, input ->
currentName = input.toString()
) { input ->
currentName = input
}
.positiveButton(android.R.string.ok) {
.setPositiveButton(android.R.string.ok) { _, _ ->
(targetController as? Listener)?.createCategory(currentName)
}
.create()
}
interface Listener {

View File

@ -2,11 +2,11 @@ package eu.kanade.tachiyomi.ui.category.sources
import android.app.Dialog
import android.os.Bundle
import com.afollestad.materialdialogs.MaterialDialog
import com.afollestad.materialdialogs.input.input
import com.bluelinelabs.conductor.Controller
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.ui.base.controller.DialogController
import eu.kanade.tachiyomi.widget.materialdialogs.setTextInput
/**
* Dialog to rename an existing category of the library.
@ -34,16 +34,17 @@ class SourceCategoryRenameDialog<T>(bundle: Bundle? = null) : DialogController(b
* @return a new dialog instance.
*/
override fun onCreateDialog(savedViewState: Bundle?): Dialog {
return MaterialDialog(activity!!)
.title(R.string.action_rename_category)
.negativeButton(android.R.string.cancel)
.input(
return MaterialAlertDialogBuilder(activity!!)
.setTitle(R.string.action_rename_category)
.setTextInput(
hint = resources?.getString(R.string.name),
prefill = currentName
) { _, input ->
currentName = input.toString()
) { input ->
currentName = input
}
.positiveButton(android.R.string.ok) { onPositive() }
.setPositiveButton(android.R.string.ok) { _, _ -> onPositive() }
.setNegativeButton(android.R.string.cancel, null)
.create()
}
/**

View File

@ -8,13 +8,14 @@ import android.view.MenuInflater
import android.view.MenuItem
import android.view.View
import android.view.WindowManager
import androidx.appcompat.app.AlertDialog
import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.view.ActionMode
import androidx.core.graphics.drawable.DrawableCompat
import androidx.core.view.isVisible
import com.afollestad.materialdialogs.MaterialDialog
import com.bluelinelabs.conductor.ControllerChangeHandler
import com.bluelinelabs.conductor.ControllerChangeType
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.google.android.material.tabs.TabLayout
import com.jakewharton.rxrelay.BehaviorRelay
import com.jakewharton.rxrelay.PublishRelay
@ -140,7 +141,7 @@ class LibraryController(
// --> EH
// Sync dialog
private var favSyncDialog: MaterialDialog? = null
private var favSyncDialog: AlertDialog? = null
// Old sync status
private var oldSyncStatus: FavoritesSyncStatus? = null
@ -750,14 +751,16 @@ class LibraryController(
}
private fun buildDialog() = activity?.let {
MaterialDialog(it)
MaterialAlertDialogBuilder(it)
}
private fun showSyncProgressDialog() {
favSyncDialog?.dismiss()
favSyncDialog = buildDialog()
?.title(R.string.favorites_syncing)
?.cancelable(false)
?.setTitle(R.string.favorites_syncing)
?.setMessage("")
?.setCancelable(false)
?.create()
favSyncDialog?.show()
}
@ -782,16 +785,17 @@ class LibraryController(
favSyncDialog?.dismiss()
favSyncDialog = buildDialog()
?.title(R.string.favorites_sync_error)
?.message(text = activity!!.getString(R.string.favorites_sync_bad_library_state, status.message))
?.cancelable(false)
?.positiveButton(R.string.show_gallery) {
?.setTitle(R.string.favorites_sync_error)
?.setMessage(activity!!.getString(R.string.favorites_sync_bad_library_state, status.message))
?.setCancelable(false)
?.setPositiveButton(R.string.show_gallery) { _, _ ->
openManga(status.manga)
presenter.favoritesSync.status.value = FavoritesSyncStatus.Idle(activity!!)
}
?.negativeButton(android.R.string.ok) {
?.setNegativeButton(android.R.string.ok) { _, _ ->
presenter.favoritesSync.status.value = FavoritesSyncStatus.Idle(activity!!)
}
?.create()
favSyncDialog?.show()
}
is FavoritesSyncStatus.Error -> {
@ -799,12 +803,13 @@ class LibraryController(
favSyncDialog?.dismiss()
favSyncDialog = buildDialog()
?.title(R.string.favorites_sync_error)
?.message(text = activity!!.getString(R.string.favorites_sync_error_string, status.message))
?.cancelable(false)
?.positiveButton(android.R.string.ok) {
?.setTitle(R.string.favorites_sync_error)
?.setMessage(activity!!.getString(R.string.favorites_sync_error_string, status.message))
?.setCancelable(false)
?.setPositiveButton(android.R.string.ok) { _, _ ->
presenter.favoritesSync.status.value = FavoritesSyncStatus.Idle(activity!!)
}
?.create()
favSyncDialog?.show()
}
is FavoritesSyncStatus.CompleteWithErrors -> {
@ -812,12 +817,13 @@ class LibraryController(
favSyncDialog?.dismiss()
favSyncDialog = buildDialog()
?.title(R.string.favorites_sync_done_errors)
?.message(text = activity!!.getString(R.string.favorites_sync_done_errors_message, status.message))
?.cancelable(false)
?.positiveButton(android.R.string.ok) {
?.setTitle(R.string.favorites_sync_done_errors)
?.setMessage(activity!!.getString(R.string.favorites_sync_done_errors_message, status.message))
?.setCancelable(false)
?.setPositiveButton(android.R.string.ok) { _, _ ->
presenter.favoritesSync.status.value = FavoritesSyncStatus.Idle(activity!!)
}
?.create()
favSyncDialog?.show()
}
is FavoritesSyncStatus.Processing,
@ -833,13 +839,13 @@ class LibraryController(
showSyncProgressDialog()
}
favSyncDialog?.message(text = status.message)
favSyncDialog?.setMessage(status.message)
}
}
oldSyncStatus = status
if (status is FavoritesSyncStatus.Processing && status.delayedMessage != null) {
delay(5.seconds)
favSyncDialog?.message(text = status.delayedMessage)
favSyncDialog?.setMessage(status.delayedMessage)
}
}

View File

@ -18,9 +18,10 @@ class WhatsNewDialogController : DialogController() {
val activity = activity!!
val view = WhatsNewRecyclerView(activity)
return MaterialAlertDialogBuilder(activity)
.setTitle(res = if (BuildConfig.DEBUG /* SY --> */ || syDebugVersion != "0" /* SY <-- */) R.string.notices else R.string.whats_new)
.setCustomView(view = view)
.setTitle(if (BuildConfig.DEBUG /* SY --> */ || syDebugVersion != "0" /* SY <-- */) R.string.notices else R.string.whats_new)
.setView(view)
.setPositiveButton(android.R.string.cancel, null)
.create()
}
class WhatsNewRecyclerView(context: Context) : ChangeLogRecyclerView(context) {

View File

@ -4,19 +4,16 @@ import android.app.Dialog
import android.content.Context
import android.net.Uri
import android.os.Bundle
import android.text.InputType
import android.widget.ArrayAdapter
import android.widget.ScrollView
import androidx.core.content.ContextCompat
import androidx.core.os.bundleOf
import androidx.core.view.children
import coil.loadAny
import coil.transform.RoundedCornersTransformation
import com.afollestad.materialdialogs.MaterialDialog
import com.afollestad.materialdialogs.customview.customView
import com.afollestad.materialdialogs.input.getInputField
import com.afollestad.materialdialogs.input.input
import com.google.android.material.chip.Chip
import com.google.android.material.chip.ChipGroup
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.database.DatabaseHelper
import eu.kanade.tachiyomi.data.database.models.Manga
@ -26,6 +23,7 @@ import eu.kanade.tachiyomi.source.model.SManga
import eu.kanade.tachiyomi.ui.base.controller.DialogController
import eu.kanade.tachiyomi.util.lang.chop
import eu.kanade.tachiyomi.util.system.getResourceColor
import eu.kanade.tachiyomi.widget.materialdialogs.setTextInput
import exh.util.dropBlank
import exh.util.trimOrNull
import kotlinx.coroutines.flow.launchIn
@ -64,13 +62,15 @@ class EditMangaDialog : DialogController {
override fun onCreateDialog(savedViewState: Bundle?): Dialog {
binding = EditMangaDialogBinding.inflate(activity!!.layoutInflater)
val dialog = MaterialDialog(activity!!).apply {
customView(view = binding.root, scrollable = true)
negativeButton(android.R.string.cancel)
positiveButton(R.string.action_save) { onPositiveButtonClick() }
val view = ScrollView(activity!!).apply {
addView(binding.root)
}
onViewCreated()
return dialog
return MaterialAlertDialogBuilder(activity!!)
.setView(view)
.setPositiveButton(R.string.action_save) { _, _ -> onPositiveButtonClick() }
.setNegativeButton(android.R.string.cancel, null)
.create()
}
fun onViewCreated() {
@ -230,15 +230,16 @@ class EditMangaDialog : DialogController {
textStartPadding = 0F
clicks().onEach {
MaterialDialog(context)
.title(R.string.add_tag)
.input(inputType = InputType.TYPE_CLASS_TEXT)
.positiveButton(android.R.string.ok) {
val newTag = it.getInputField().text.toString().trimOrNull()
var newTag: String? = null
MaterialAlertDialogBuilder(context)
.setTitle(R.string.add_tag)
.setTextInput {
text = it.trimOrNull()
}
.setPositiveButton(android.R.string.ok) { _, _ ->
if (newTag != null) setChips(items + listOf(newTag))
}
.negativeButton(android.R.string.cancel)
.setNegativeButton(android.R.string.cancel, null)
.show()
}.launchIn(infoController.viewScope)
}

View File

@ -28,10 +28,9 @@ import androidx.recyclerview.widget.ConcatAdapter
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import coil.loadAny
import com.afollestad.materialdialogs.MaterialDialog
import com.afollestad.materialdialogs.list.listItemsSingleChoice
import com.bluelinelabs.conductor.ControllerChangeHandler
import com.bluelinelabs.conductor.ControllerChangeType
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton
import com.google.android.material.snackbar.Snackbar
import dev.chrisbanes.insetter.applyInsetter
@ -613,14 +612,17 @@ class MangaController :
val sourceManager: SourceManager = Injekt.get()
val mergedManga = presenter.mergedManga.values.filterNot { it.source == MERGED_SOURCE_ID }
val sources = mergedManga.map { sourceManager.getOrStub(it.source) }
MaterialDialog(activity!!)
.title(R.string.action_open_in_web_view)
.listItemsSingleChoice(
items = mergedManga.mapIndexed { index, _ -> sources[index].toString() }
) { _, index, _ ->
MaterialAlertDialogBuilder(activity!!)
.setTitle(R.string.action_open_in_web_view)
.setSingleChoiceItems(
mergedManga.mapIndexed { index, _ -> sources[index].toString() }
.toTypedArray(),
-1
) { dialog, index ->
dialog.dismiss()
openMangaInWebView(mergedManga[index], sources[index] as? HttpSource)
}
.negativeButton(android.R.string.cancel)
.setNegativeButton(android.R.string.cancel, null)
.show()
}
// SY <--
@ -773,14 +775,16 @@ class MangaController :
fun openRecommends() {
val source = presenter.source.getMainSource()
if (source.isMdBasedSource()) {
MaterialDialog(activity!!)
.title(R.string.az_recommends)
.listItemsSingleChoice(
items = listOf(
MaterialAlertDialogBuilder(activity!!)
.setTitle(R.string.az_recommends)
.setSingleChoiceItems(
arrayOf(
"MangaDex similar",
"Community recommendations"
)
) { _, index, _ ->
),
-1
) { dialog, index ->
dialog.dismiss()
when (index) {
0 -> router.pushController(MangaDexSimilarController(presenter.manga, source as CatalogueSource).withFadeTransaction())
1 -> router.pushController(RecommendsController(presenter.manga, source as CatalogueSource).withFadeTransaction())

View File

@ -5,9 +5,8 @@ import android.os.Bundle
import android.util.AttributeSet
import android.view.View
import androidx.core.view.isVisible
import com.afollestad.materialdialogs.MaterialDialog
import com.afollestad.materialdialogs.list.listItemsMultiChoice
import com.bluelinelabs.conductor.Router
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.database.models.Manga
import eu.kanade.tachiyomi.ui.manga.MangaPresenter
@ -110,26 +109,27 @@ class ChaptersSettingsSheet(
override fun onItemClicked(item: Item) {
if (item is Item.DrawableSelection) {
val scanlators = presenter.allChapterScanlators.toList()
val filteredScanlators = presenter.manga.filtered_scanlators?.let { MdUtil.getScanlators(it) }
val preselected = if (filteredScanlators.isNullOrEmpty()) {
scanlators.mapIndexed { index, _ -> index }
} else {
filteredScanlators.map { scanlators.indexOf(it) }
}.toIntArray()
val scanlators = presenter.allChapterScanlators.toTypedArray()
val filteredScanlators = presenter.manga.filtered_scanlators?.let { MdUtil.getScanlators(it) } ?: scanlators.toSet()
val selection = scanlators.map {
it in filteredScanlators
}.toBooleanArray()
MaterialDialog(context)
.title(R.string.select_scanlators)
.listItemsMultiChoice(items = presenter.allChapterScanlators.toList(), initialSelection = preselected) { _, selections, _ ->
MaterialAlertDialogBuilder(context)
.setTitle(R.string.select_scanlators)
.setMultiChoiceItems(scanlators, selection) { _, which, selected ->
selection[which] = selected
}
.setPositiveButton(android.R.string.ok) { _, _ ->
launchIO {
supervisorScope {
val selected = selections.map { scanlators[it] }.toSet()
val selected = scanlators.filterIndexed { index, s -> selection[index] }.toSet()
presenter.setScanlatorFilter(selected)
withUIContext { onGroupClicked(this@FilterGroup) }
}
}
}
.negativeButton(R.string.action_reset) {
.setNegativeButton(R.string.action_reset) { _, _ ->
launchIO {
supervisorScope {
presenter.setScanlatorFilter(presenter.allChapterScanlators)
@ -137,7 +137,6 @@ class ChaptersSettingsSheet(
}
}
}
.positiveButton(android.R.string.ok)
.show()
return
}

View File

@ -2,11 +2,11 @@ package eu.kanade.tachiyomi.ui.manga.merged
import android.app.Dialog
import android.os.Bundle
import android.widget.ScrollView
import androidx.core.os.bundleOf
import androidx.recyclerview.widget.ConcatAdapter
import androidx.recyclerview.widget.LinearLayoutManager
import com.afollestad.materialdialogs.MaterialDialog
import com.afollestad.materialdialogs.customview.customView
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.database.DatabaseHelper
import eu.kanade.tachiyomi.data.database.models.Manga
@ -50,13 +50,15 @@ class EditMergedSettingsDialog : DialogController, EditMergedMangaAdapter.EditMe
override fun onCreateDialog(savedViewState: Bundle?): Dialog {
binding = EditMergedSettingsDialogBinding.inflate(activity!!.layoutInflater)
val dialog = MaterialDialog(activity!!)
.customView(view = binding.root, scrollable = true)
.negativeButton(android.R.string.cancel)
.positiveButton(R.string.action_save) { onPositiveButtonClick() }
val view = ScrollView(activity!!).apply {
addView(binding.root)
}
onViewCreated()
return dialog
return MaterialAlertDialogBuilder(activity!!)
.setView(view)
.setPositiveButton(R.string.action_save) { _, _ -> onPositiveButtonClick() }
.setNegativeButton(android.R.string.cancel, null)
.create()
}
fun onViewCreated() {
@ -99,26 +101,26 @@ class EditMergedSettingsDialog : DialogController, EditMergedMangaAdapter.EditMe
val mergedMangaAdapter = mergedMangaAdapter ?: return
val mergeMangaReference = mergedMangaAdapter.currentItems.getOrNull(position)?.mergedMangaReference ?: return
MaterialDialog(activity!!)
.title(R.string.delete_merged_manga)
.message(R.string.delete_merged_manga_desc)
.positiveButton(android.R.string.ok) {
MaterialAlertDialogBuilder(activity!!)
.setTitle(R.string.delete_merged_manga)
.setMessage(R.string.delete_merged_manga_desc)
.setPositiveButton(android.R.string.ok) { _, _ ->
db.deleteMergedManga(mergeMangaReference).executeAsBlocking()
dialog?.dismiss()
mangaController.router.popController(mangaController)
}
.negativeButton(android.R.string.cancel)
.setNegativeButton(android.R.string.cancel, null)
.show()
}
override fun onToggleChapterUpdatesClicked(position: Int) {
MaterialDialog(activity!!)
.title(R.string.chapter_updates_merged_manga)
.message(R.string.chapter_updates_merged_manga_desc)
.positiveButton(android.R.string.ok) {
MaterialAlertDialogBuilder(activity!!)
.setTitle(R.string.chapter_updates_merged_manga)
.setMessage(R.string.chapter_updates_merged_manga_desc)
.setPositiveButton(android.R.string.ok) { _, _ ->
toggleChapterUpdates(position)
}
.negativeButton(android.R.string.cancel)
.setNegativeButton(android.R.string.cancel, null)
.show()
}
@ -136,13 +138,13 @@ class EditMergedSettingsDialog : DialogController, EditMergedMangaAdapter.EditMe
}
override fun onToggleChapterDownloadsClicked(position: Int) {
MaterialDialog(activity!!)
.title(R.string.download_merged_manga)
.message(R.string.download_merged_manga_desc)
.positiveButton(android.R.string.ok) {
MaterialAlertDialogBuilder(activity!!)
.setTitle(R.string.download_merged_manga)
.setMessage(R.string.download_merged_manga_desc)
.setPositiveButton(android.R.string.ok) { _, _ ->
toggleChapterDownloads(position)
}
.negativeButton(android.R.string.cancel)
.setNegativeButton(android.R.string.cancel, null)
.show()
}

View File

@ -34,8 +34,8 @@ import androidx.core.view.WindowInsetsControllerCompat
import androidx.core.view.isInvisible
import androidx.core.view.isVisible
import androidx.lifecycle.lifecycleScope
import com.afollestad.materialdialogs.MaterialDialog
import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.google.android.material.shape.MaterialShapeDrawable
import com.mikepenz.aboutlibraries.util.getThemeColor
import dev.chrisbanes.insetter.applyInsetter
@ -693,10 +693,10 @@ class ReaderActivity : BaseRxActivity<ReaderActivityBinding, ReaderPresenter>()
binding.ehAutoscrollHelp.clicks()
.onEach {
MaterialDialog(this)
.title(R.string.eh_autoscroll_help)
.message(R.string.eh_autoscroll_help_message)
.positiveButton(android.R.string.ok)
MaterialAlertDialogBuilder(this)
.setTitle(R.string.eh_autoscroll_help)
.setMessage(R.string.eh_autoscroll_help_message)
.setPositiveButton(android.R.string.ok, null)
.show()
}
.launchIn(lifecycleScope)
@ -747,10 +747,10 @@ class ReaderActivity : BaseRxActivity<ReaderActivityBinding, ReaderPresenter>()
binding.ehRetryAllHelp.clicks()
.onEach {
MaterialDialog(this)
.title(R.string.eh_retry_all_help)
.message(R.string.eh_retry_all_help_message)
.positiveButton(android.R.string.ok)
MaterialAlertDialogBuilder(this)
.setTitle(R.string.eh_retry_all_help)
.setMessage(R.string.eh_retry_all_help_message)
.setPositiveButton(android.R.string.ok, null)
.show()
}
.launchIn(lifecycleScope)
@ -784,10 +784,10 @@ class ReaderActivity : BaseRxActivity<ReaderActivityBinding, ReaderPresenter>()
binding.ehBoostPageHelp.clicks()
.onEach {
MaterialDialog(this)
.title(R.string.eh_boost_page_help)
.message(R.string.eh_boost_page_help_message)
.positiveButton(android.R.string.ok)
MaterialAlertDialogBuilder(this)
.setTitle(R.string.eh_boost_page_help)
.setMessage(R.string.eh_boost_page_help_message)
.setPositiveButton(android.R.string.ok, null)
.show()
}
.launchIn(lifecycleScope)

View File

@ -1,9 +1,9 @@
package eu.kanade.tachiyomi.ui.reader.chapter
import androidx.appcompat.app.AlertDialog
import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.LinearLayoutManager
import com.afollestad.materialdialogs.MaterialDialog
import com.afollestad.materialdialogs.callbacks.onDismiss
import com.afollestad.materialdialogs.customview.customView
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import eu.davidea.flexibleadapter.FlexibleAdapter
import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.database.models.Chapter
@ -12,36 +12,41 @@ import eu.kanade.tachiyomi.ui.reader.ReaderActivity
import eu.kanade.tachiyomi.ui.reader.ReaderPresenter
import eu.kanade.tachiyomi.util.chapter.getChapterSort
import eu.kanade.tachiyomi.util.system.dpToPx
import kotlinx.coroutines.launch
class ReaderChapterDialog(private val activity: ReaderActivity) : ReaderChapterAdapter.OnBookmarkClickListener {
private val binding = ReaderChaptersDialogBinding.inflate(activity.layoutInflater, null, false)
var presenter: ReaderPresenter = activity.presenter
var adapter: FlexibleAdapter<ReaderChapterItem>? = null
var dialog: MaterialDialog
var dialog: AlertDialog
init {
dialog = MaterialDialog(activity)
.title(R.string.chapters)
.customView(view = binding.root)
.negativeButton(android.R.string.cancel)
.onDismiss { destroy() }
.show {
adapter = ReaderChapterAdapter(this@ReaderChapterDialog)
binding.chapterRecycler.adapter = adapter
dialog = MaterialAlertDialogBuilder(activity)
.setTitle(R.string.chapters)
.setView(binding.root)
.setNegativeButton(android.R.string.cancel, null)
.setOnDismissListener { destroy() }
.create()
adapter?.mItemClickListener = FlexibleAdapter.OnItemClickListener { _, position ->
val item = adapter?.getItem(position)
if (item != null && item.id != presenter.getCurrentChapter()?.chapter?.id) {
dismiss()
presenter.loadNewChapterFromDialog(item)
}
true
}
adapter = ReaderChapterAdapter(this@ReaderChapterDialog)
binding.chapterRecycler.adapter = adapter
binding.chapterRecycler.layoutManager = LinearLayoutManager(context)
refreshList()
adapter?.mItemClickListener = FlexibleAdapter.OnItemClickListener { _, position ->
val item = adapter?.getItem(position)
if (item != null && item.id != presenter.getCurrentChapter()?.chapter?.id) {
dialog.dismiss()
presenter.loadNewChapterFromDialog(item)
}
true
}
binding.chapterRecycler.layoutManager = LinearLayoutManager(activity)
activity.lifecycleScope.launch {
refreshList()
}
dialog.show()
}
private fun refreshList() {

View File

@ -7,6 +7,7 @@ import android.content.Intent
import android.os.Bundle
import android.provider.Settings
import android.widget.Toast
import androidx.appcompat.app.AlertDialog
import androidx.core.net.toUri
import androidx.core.text.HtmlCompat
import androidx.preference.PreferenceScreen
@ -323,16 +324,25 @@ class SettingsAdvancedController : SettingsController() {
// SY -->
class CleanupDownloadsDialogController : DialogController() {
override fun onCreateDialog(savedViewState: Bundle?): Dialog {
return MaterialDialog(activity!!).show {
title(R.string.clean_up_downloaded_chapters)
.listItemsMultiChoice(R.array.clean_up_downloads, disabledIndices = intArrayOf(0), initialSelection = intArrayOf(0, 1, 2)) { _, selections, _ ->
val deleteRead = selections.contains(1)
val deleteNonFavorite = selections.contains(2)
(targetController as? SettingsAdvancedController)?.cleanupDownloads(deleteRead, deleteNonFavorite)
val options = activity!!.resources.getStringArray(R.array.clean_up_downloads)
val selected = options.map { true }.toBooleanArray()
return MaterialAlertDialogBuilder(activity!!)
.setTitle(R.string.clean_up_downloaded_chapters)
.setMultiChoiceItems(options, selected) { dialog, which, checked ->
if (which == 0) {
(dialog as AlertDialog).listView.setItemChecked(which, true)
} else {
selected[which] = checked
}
positiveButton(android.R.string.ok)
negativeButton(android.R.string.cancel)
}
}
.setPositiveButton(android.R.string.ok) { _, _ ->
(targetController as? SettingsAdvancedController)?.cleanupDownloads(
selected[1],
selected[2]
)
}
.setNegativeButton(android.R.string.cancel, null)
.create()
}
}
@ -400,14 +410,18 @@ class SettingsAdvancedController : SettingsController() {
// SY <--
override fun onCreateDialog(savedViewState: Bundle?): Dialog {
val item = arrayOf(
activity!!.getString(R.string.clear_db_exclude_read)
)
val selected = booleanArrayOf(true)
return MaterialAlertDialogBuilder(activity!!)
.setMessage(R.string.clear_database_confirmation)
.checkBoxPrompt(R.string.clear_db_exclude_read) {
keepReadManga = it
.setMultiChoiceItems(item, selected) { _, _, isChecked ->
selected[0] = isChecked
}
// SY <--
.setPositiveButton(android.R.string.ok) { _, _ ->
(targetController as? SettingsAdvancedController)?.clearDatabase()
(targetController as? SettingsAdvancedController)?.clearDatabase(selected.first())
}
.setNegativeButton(android.R.string.cancel, null)
.create()

View File

@ -331,29 +331,35 @@ class SettingsDownloadController : SettingsController() {
val dbCategories = db.getCategories().executeAsBlocking()
val categories = listOf(Category.createDefault()) + dbCategories
val items = categories.map { it.name }
val preselected = categories
.mapIndexedNotNull { index, category ->
if (category.id in preferences.dontDeleteFromCategories().get().map { it.toInt() }) {
index
} else null
val items = categories.map { it.name }.toTypedArray()
val selection = categories
.mapNotNull { category ->
category.id in preferences.dontDeleteFromCategories().get().map { it.toInt() }
}
.toIntArray()
.toBooleanArray()
return MaterialDialog(activity!!)
.title(R.string.categories)
.listItemsMultiChoice(
items = items,
initialSelection = preselected
) { _: MaterialDialog, selections: IntArray, _: List<CharSequence> ->
val included = selections
.map { categories[it].id.toString() }
return MaterialAlertDialogBuilder(activity!!)
.setTitle(R.string.categories)
.setMultiChoiceItems(
items,
selection
) { _, which, selected ->
selection[which] = selected
}
.setPositiveButton(android.R.string.ok) { _, _ ->
val included = selection
.mapIndexed { index, selected ->
if (selected) {
categories[index].id.toString()
} else null
}
.filterNotNull()
.toSet()
preferences.dontDeleteFromCategories().set(included)
}
.positiveButton(android.R.string.ok)
.negativeButton(android.R.string.cancel)
.setNegativeButton(android.R.string.cancel, null)
.create()
}
}

View File

@ -4,15 +4,15 @@ import android.app.Activity
import android.content.Context
import android.content.Intent
import android.text.InputType
import android.view.LayoutInflater
import android.view.inputmethod.InputMethodManager
import android.widget.TextView
import android.widget.Toast
import androidx.core.content.ContextCompat
import androidx.core.content.getSystemService
import androidx.core.widget.doAfterTextChanged
import androidx.preference.PreferenceScreen
import com.afollestad.materialdialogs.MaterialDialog
import com.afollestad.materialdialogs.WhichButton
import com.afollestad.materialdialogs.actions.setActionButtonEnabled
import com.afollestad.materialdialogs.customview.customView
import com.afollestad.materialdialogs.input.getInputField
import com.afollestad.materialdialogs.input.input
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.tfcporciuncula.flow.Preference
import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.database.DatabaseHelper
@ -21,8 +21,9 @@ import eu.kanade.tachiyomi.data.preference.CHARGING
import eu.kanade.tachiyomi.data.preference.PreferenceKeys
import eu.kanade.tachiyomi.data.preference.UNMETERED_NETWORK
import eu.kanade.tachiyomi.data.preference.asImmediateFlow
import eu.kanade.tachiyomi.databinding.EhDialogCategoriesBinding
import eu.kanade.tachiyomi.databinding.EhDialogLanguagesBinding
import eu.kanade.tachiyomi.databinding.DialogStubTextinputBinding
import eu.kanade.tachiyomi.ui.setting.eh.FrontPageCategoriesDialog
import eu.kanade.tachiyomi.ui.setting.eh.LanguagesDialog
import eu.kanade.tachiyomi.ui.webview.WebViewActivity
import eu.kanade.tachiyomi.util.preference.defaultValue
import eu.kanade.tachiyomi.util.preference.entriesRes
@ -42,6 +43,7 @@ import exh.eh.EHentaiUpdateWorkerConstants
import exh.eh.EHentaiUpdaterStats
import exh.favorites.FavoritesIntroDialog
import exh.favorites.LocalFavoritesStorage
import exh.log.xLogD
import exh.metadata.metadata.EHentaiSearchMetadata
import exh.metadata.metadata.base.getFlatMetadataForManga
import exh.source.isEhBasedManga
@ -73,7 +75,7 @@ import kotlin.time.Duration
class SettingsEhController : SettingsController() {
private val db: DatabaseHelper by injectLazy()
private fun Preference<*>.reconfigure(): Boolean {
fun Preference<*>.reconfigure(): Boolean {
// Listen for change commit
asFlow()
.take(1) // Only listen for first commit
@ -186,30 +188,36 @@ class SettingsEhController : SettingsController() {
summary = context.getString(R.string.tag_filtering_threshhold_summary, preferences.ehTagFilterValue().get())
onClick {
MaterialDialog(activity!!)
.title(R.string.tag_filtering_threshold)
.input(
inputType = InputType.TYPE_NUMBER_FLAG_SIGNED,
waitForPositiveButton = false,
allowEmpty = false
) { dialog, number ->
val inputField = dialog.getInputField()
val value = number.toString().toIntOrNull()
if ((value != null && value in -9999..0) || number.toString() == "-") {
inputField.error = null
} else {
inputField.error = context.getString(R.string.tag_filtering_threshhold_error)
var value: Int? = preferences.ehTagFilterValue().get()
MaterialAlertDialogBuilder(activity!!)
.setTitle(R.string.tag_filtering_threshold)
.let { builder ->
val binding = DialogStubTextinputBinding.inflate(LayoutInflater.from(builder.context))
binding.textField.editText?.apply {
inputType = InputType.TYPE_NUMBER_FLAG_SIGNED
setText(value.toString(), TextView.BufferType.EDITABLE)
doAfterTextChanged {
value = it?.toString()?.toIntOrNull()
this@SettingsEhController.xLogD(value)
error = if (value in -9999..0 || it.toString() == "-") {
null
} else {
context.getString(R.string.tag_filtering_threshhold_error)
}
}
post {
requestFocusFromTouch()
context.getSystemService<InputMethodManager>()?.showSoftInput(this, 0)
}
}
dialog.setActionButtonEnabled(WhichButton.POSITIVE, value != null && value in -9999..0)
builder.setView(binding.root)
}
.positiveButton(android.R.string.ok) {
val value = it.getInputField().text.toString().toInt()
preferences.ehTagFilterValue().set(value)
.setPositiveButton(android.R.string.ok) { _, _ ->
preferences.ehTagFilterValue().set(value ?: return@setPositiveButton)
summary = context.getString(R.string.tag_filtering_threshhold_summary, preferences.ehTagFilterValue().get())
preferences.ehTagFilterValue().reconfigure()
}
.negativeButton(android.R.string.cancel)
.setNegativeButton(android.R.string.cancel, null)
.show()
}
@ -225,31 +233,37 @@ class SettingsEhController : SettingsController() {
summary = context.getString(R.string.tag_watching_threshhold_summary, preferences.ehTagWatchingValue().get())
onClick {
MaterialDialog(activity!!)
.title(R.string.tag_watching_threshhold)
.input(
inputType = InputType.TYPE_NUMBER_FLAG_SIGNED,
maxLength = 4,
waitForPositiveButton = false,
allowEmpty = false
) { dialog, number ->
val inputField = dialog.getInputField()
val value = number.toString().toIntOrNull()
var value: Int? = preferences.ehTagWatchingValue().get()
MaterialAlertDialogBuilder(activity!!)
.setTitle(R.string.tag_watching_threshhold)
.let { builder ->
val binding = DialogStubTextinputBinding.inflate(LayoutInflater.from(builder.context))
binding.textField.editText?.apply {
inputType = InputType.TYPE_NUMBER_FLAG_SIGNED
if (value != null && value in 0..9999) {
inputField.error = null
} else {
inputField.error = context.getString(R.string.tag_watching_threshhold_error)
setText(value.toString(), TextView.BufferType.EDITABLE)
doAfterTextChanged {
value = it?.toString()?.toIntOrNull()
error = if (value in 0..9999) {
null
} else {
context.getString(R.string.tag_watching_threshhold_error)
}
}
post {
requestFocusFromTouch()
context.getSystemService<InputMethodManager>()?.showSoftInput(this, 0)
}
}
dialog.setActionButtonEnabled(WhichButton.POSITIVE, value != null && value in 0..9999)
builder.setView(binding.root)
}
.positiveButton(android.R.string.ok) {
val value = it.getInputField().text.toString().toInt()
preferences.ehTagWatchingValue().set(value)
.setPositiveButton(android.R.string.ok) { _, _ ->
preferences.ehTagWatchingValue().set(value ?: return@setPositiveButton)
summary = context.getString(R.string.tag_watching_threshhold_summary, preferences.ehTagWatchingValue().get())
preferences.ehTagWatchingValue().reconfigure()
}
.negativeButton(android.R.string.cancel)
.setNegativeButton(android.R.string.cancel, null)
.show()
}
@ -258,143 +272,14 @@ class SettingsEhController : SettingsController() {
}
preference {
key = "pref_language_filtering"
key = PreferenceKeys.eh_settings_languages
titleRes = R.string.language_filtering
summaryRes = R.string.language_filtering_summary
onClick {
MaterialDialog(activity!!)
.title(R.string.language_filtering)
.message(R.string.language_filtering_summary)
.customView(R.layout.eh_dialog_languages, scrollable = true)
.positiveButton(android.R.string.ok) {
val customView = it.view.contentLayout.customView!!
val binding = EhDialogLanguagesBinding.bind(customView)
val languages = with(binding) {
listOf(
"${japaneseOriginal.isChecked}*${japaneseTranslated.isChecked}*${japaneseRewrite.isChecked}",
"${englishOriginal.isChecked}*${englishTranslated.isChecked}*${englishRewrite.isChecked}",
"${chineseOriginal.isChecked}*${chineseTranslated.isChecked}*${chineseRewrite.isChecked}",
"${dutchOriginal.isChecked}*${dutchTranslated.isChecked}*${dutchRewrite.isChecked}",
"${frenchOriginal.isChecked}*${frenchTranslated.isChecked}*${frenchRewrite.isChecked}",
"${germanOriginal.isChecked}*${germanTranslated.isChecked}*${germanRewrite.isChecked}",
"${hungarianOriginal.isChecked}*${hungarianTranslated.isChecked}*${hungarianRewrite.isChecked}",
"${italianOriginal.isChecked}*${italianTranslated.isChecked}*${italianRewrite.isChecked}",
"${koreanOriginal.isChecked}*${koreanTranslated.isChecked}*${koreanRewrite.isChecked}",
"${polishOriginal.isChecked}*${polishTranslated.isChecked}*${polishRewrite.isChecked}",
"${portugueseOriginal.isChecked}*${portugueseTranslated.isChecked}*${portugueseRewrite.isChecked}",
"${russianOriginal.isChecked}*${russianTranslated.isChecked}*${russianRewrite.isChecked}",
"${spanishOriginal.isChecked}*${spanishTranslated.isChecked}*${spanishRewrite.isChecked}",
"${thaiOriginal.isChecked}*${thaiTranslated.isChecked}*${thaiRewrite.isChecked}",
"${vietnameseOriginal.isChecked}*${vietnameseTranslated.isChecked}*${vietnameseRewrite.isChecked}",
"${notAvailableOriginal.isChecked}*${notAvailableTranslated.isChecked}*${notAvailableRewrite.isChecked}",
"${otherOriginal.isChecked}*${otherTranslated.isChecked}*${otherRewrite.isChecked}"
).joinToString("\n")
}
preferences.exhSettingsLanguages().set(languages)
preferences.exhSettingsLanguages().reconfigure()
}
.show {
val customView = this.view.contentLayout.customView!!
val binding = EhDialogLanguagesBinding.bind(customView)
val settingsLanguages = preferences.exhSettingsLanguages().get().split("\n")
val japanese = settingsLanguages[0].split("*").map { it.toBoolean() }
val english = settingsLanguages[1].split("*").map { it.toBoolean() }
val chinese = settingsLanguages[2].split("*").map { it.toBoolean() }
val dutch = settingsLanguages[3].split("*").map { it.toBoolean() }
val french = settingsLanguages[4].split("*").map { it.toBoolean() }
val german = settingsLanguages[5].split("*").map { it.toBoolean() }
val hungarian = settingsLanguages[6].split("*").map { it.toBoolean() }
val italian = settingsLanguages[7].split("*").map { it.toBoolean() }
val korean = settingsLanguages[8].split("*").map { it.toBoolean() }
val polish = settingsLanguages[9].split("*").map { it.toBoolean() }
val portuguese = settingsLanguages[10].split("*").map { it.toBoolean() }
val russian = settingsLanguages[11].split("*").map { it.toBoolean() }
val spanish = settingsLanguages[12].split("*").map { it.toBoolean() }
val thai = settingsLanguages[13].split("*").map { it.toBoolean() }
val vietnamese = settingsLanguages[14].split("*").map { it.toBoolean() }
val notAvailable =
settingsLanguages[15].split("*").map { it.toBoolean() }
val other = settingsLanguages[16].split("*").map { it.toBoolean() }
with(binding) {
japaneseOriginal.isChecked = japanese[0]
japaneseTranslated.isChecked = japanese[1]
japaneseRewrite.isChecked = japanese[2]
japaneseOriginal.isChecked = japanese[0]
japaneseTranslated.isChecked = japanese[1]
japaneseRewrite.isChecked = japanese[2]
englishOriginal.isChecked = english[0]
englishTranslated.isChecked = english[1]
englishRewrite.isChecked = english[2]
chineseOriginal.isChecked = chinese[0]
chineseTranslated.isChecked = chinese[1]
chineseRewrite.isChecked = chinese[2]
dutchOriginal.isChecked = dutch[0]
dutchTranslated.isChecked = dutch[1]
dutchRewrite.isChecked = dutch[2]
frenchOriginal.isChecked = french[0]
frenchTranslated.isChecked = french[1]
frenchRewrite.isChecked = french[2]
germanOriginal.isChecked = german[0]
germanTranslated.isChecked = german[1]
germanRewrite.isChecked = german[2]
hungarianOriginal.isChecked = hungarian[0]
hungarianTranslated.isChecked = hungarian[1]
hungarianRewrite.isChecked = hungarian[2]
italianOriginal.isChecked = italian[0]
italianTranslated.isChecked = italian[1]
italianRewrite.isChecked = italian[2]
koreanOriginal.isChecked = korean[0]
koreanTranslated.isChecked = korean[1]
koreanRewrite.isChecked = korean[2]
polishOriginal.isChecked = polish[0]
polishTranslated.isChecked = polish[1]
polishRewrite.isChecked = polish[2]
portugueseOriginal.isChecked = portuguese[0]
portugueseTranslated.isChecked = portuguese[1]
portugueseRewrite.isChecked = portuguese[2]
russianOriginal.isChecked = russian[0]
russianTranslated.isChecked = russian[1]
russianRewrite.isChecked = russian[2]
spanishOriginal.isChecked = spanish[0]
spanishTranslated.isChecked = spanish[1]
spanishRewrite.isChecked = spanish[2]
thaiOriginal.isChecked = thai[0]
thaiTranslated.isChecked = thai[1]
thaiRewrite.isChecked = thai[2]
vietnameseOriginal.isChecked = vietnamese[0]
vietnameseTranslated.isChecked = vietnamese[1]
vietnameseRewrite.isChecked = vietnamese[2]
notAvailableOriginal.isChecked = notAvailable[0]
notAvailableTranslated.isChecked = notAvailable[1]
notAvailableRewrite.isChecked = notAvailable[2]
otherOriginal.isChecked = other[0]
otherTranslated.isChecked = other[1]
otherRewrite.isChecked = other[2]
}
}
val dialog = LanguagesDialog()
dialog.targetController = this@SettingsEhController
dialog.showDialog(router)
}
preferences.enableExhentai().asImmediateFlow { isVisible = it }
@ -402,56 +287,14 @@ class SettingsEhController : SettingsController() {
}
preference {
key = "pref_front_page_categories"
key = PreferenceKeys.eh_enabled_categories
titleRes = R.string.frong_page_categories
summaryRes = R.string.fromt_page_categories_summary
onClick {
MaterialDialog(activity!!)
.title(R.string.frong_page_categories)
.message(R.string.fromt_page_categories_summary)
.customView(R.layout.eh_dialog_categories, scrollable = true)
.positiveButton { dialog ->
val customView = dialog.view.contentLayout.customView!!
val binding = EhDialogCategoriesBinding.bind(customView)
with(binding) {
preferences.exhEnabledCategories().set(
listOf(
(!doujinshiCheckbox.isChecked),
(!mangaCheckbox.isChecked),
(!artistCgCheckbox.isChecked),
(!gameCgCheckbox.isChecked),
(!westernCheckbox.isChecked),
(!nonHCheckbox.isChecked),
(!imageSetCheckbox.isChecked),
(!cosplayCheckbox.isChecked),
(!asianPornCheckbox.isChecked),
(!miscCheckbox.isChecked)
).joinToString(separator = ",") { it.toString() }
)
}
preferences.exhEnabledCategories().reconfigure()
}
.show {
val customView = this.view.contentLayout.customView!!
val binding = EhDialogCategoriesBinding.bind(customView)
with(binding) {
val list = preferences.exhEnabledCategories().get().split(",").map { !it.toBoolean() }
doujinshiCheckbox.isChecked = list[0]
mangaCheckbox.isChecked = list[1]
artistCgCheckbox.isChecked = list[2]
gameCgCheckbox.isChecked = list[3]
westernCheckbox.isChecked = list[4]
nonHCheckbox.isChecked = list[5]
imageSetCheckbox.isChecked = list[6]
cosplayCheckbox.isChecked = list[7]
asianPornCheckbox.isChecked = list[8]
miscCheckbox.isChecked = list[9]
}
}
val dialog = FrontPageCategoriesDialog()
dialog.targetController = this@SettingsEhController
dialog.showDialog(router)
}
preferences.enableExhentai().asImmediateFlow { isVisible = it }
@ -540,10 +383,10 @@ class SettingsEhController : SettingsController() {
onClick {
activity?.let { activity ->
MaterialDialog(activity)
.title(R.string.favorites_sync_reset)
.message(R.string.favorites_sync_reset_message)
.positiveButton(android.R.string.ok) {
MaterialAlertDialogBuilder(activity)
.setTitle(R.string.favorites_sync_reset)
.setMessage(R.string.favorites_sync_reset_message)
.setPositiveButton(android.R.string.ok) { _, _ ->
LocalFavoritesStorage().apply {
getRealm().use {
it.trans {
@ -553,8 +396,8 @@ class SettingsEhController : SettingsController() {
}
activity.toast(context.getString(R.string.sync_state_reset), Toast.LENGTH_LONG)
}
.negativeButton(android.R.string.cancel)
.cancelable(false)
.setNegativeButton(android.R.string.cancel, null)
.setCancelable(false)
.show()
}
}
@ -642,9 +485,10 @@ class SettingsEhController : SettingsController() {
titleRes = R.string.show_updater_statistics
onClick {
val progress = MaterialDialog(context)
.message(R.string.gallery_updater_statistics_collection)
.cancelable(false)
val progress = MaterialAlertDialogBuilder(context)
.setMessage(R.string.gallery_updater_statistics_collection)
.setCancelable(false)
.create()
progress.show()
viewScope.launch(Dispatchers.IO) {
@ -688,10 +532,10 @@ class SettingsEhController : SettingsController() {
}
withContext(Dispatchers.Main) {
MaterialDialog(context)
.title(R.string.gallery_updater_statistics)
.message(text = updateInfo)
.positiveButton(android.R.string.ok)
MaterialAlertDialogBuilder(context)
.setTitle(R.string.gallery_updater_statistics)
.setMessage(updateInfo)
.setPositiveButton(android.R.string.ok, null)
.show()
}
}

View File

@ -1,8 +1,7 @@
package eu.kanade.tachiyomi.ui.setting
import androidx.preference.PreferenceScreen
import com.afollestad.materialdialogs.MaterialDialog
import com.afollestad.materialdialogs.list.listItemsMultiChoice
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.library.LibraryUpdateService
import eu.kanade.tachiyomi.data.preference.PreferenceKeys
@ -67,21 +66,33 @@ class SettingsMangaDexController :
summaryRes = R.string.mangadex_sync_follows_to_library_summary
onClick {
MaterialDialog(context)
.title(R.string.mangadex_sync_follows_to_library)
.message(R.string.mangadex_sync_follows_to_library_message)
.listItemsMultiChoice(
items = context.resources.getStringArray(R.array.md_follows_options).toList().let { it.subList(1, it.size) },
initialSelection = intArrayOf(0, 5)
) { _, indices, _ ->
preferences.mangadexSyncToLibraryIndexes().set(indices.map { (it + 1).toString() }.toSet())
val items = context.resources.getStringArray(R.array.md_follows_options)
.drop(1)
.toTypedArray()
val selection = items.mapIndexed { index, _ ->
index == 0 || index == 5
}.toBooleanArray()
MaterialAlertDialogBuilder(context)
.setTitle(R.string.mangadex_sync_follows_to_library)
// .setMessage(R.string.mangadex_sync_follows_to_library_message)
.setMultiChoiceItems(
items,
selection
) { _, which, selected ->
selection[which] = selected
}
.setPositiveButton(android.R.string.ok) { _, _ ->
preferences.mangadexSyncToLibraryIndexes().set(
items.filterIndexed { index, _ -> selection[index] }
.mapIndexed { index, _ -> (index + 1).toString() }
.toSet()
)
LibraryUpdateService.start(
context,
target = LibraryUpdateService.Target.SYNC_FOLLOWS
)
}
.positiveButton(android.R.string.ok)
.negativeButton(android.R.string.cancel)
.setNegativeButton(android.R.string.cancel, null)
.show()
}
}

View File

@ -4,8 +4,7 @@ import android.app.Dialog
import android.os.Build
import android.os.Bundle
import androidx.preference.PreferenceScreen
import com.afollestad.materialdialogs.MaterialDialog
import com.afollestad.materialdialogs.list.listItemsMultiChoice
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.preference.PreferenceValues.TappingInvertMode
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
@ -543,27 +542,32 @@ class SettingsReaderController : SettingsController() {
private val preferences: PreferencesHelper = Injekt.get()
override fun onCreateDialog(savedViewState: Bundle?): Dialog {
val selected = preferences.readerBottomButtons().get()
val oldSelection = preferences.readerBottomButtons().get()
val values = ReaderBottomButton.values()
val items = values.map { it.value }
val preselected = selected.mapNotNull { selection -> items.indexOf(selection).takeUnless { it == -1 } }
.toIntArray()
val selection = values.map { it.value in oldSelection }
.toBooleanArray()
return MaterialDialog(activity!!)
.title(R.string.reader_bottom_buttons)
.listItemsMultiChoice(
items = values.map { activity!!.getString(it.stringRes) },
initialSelection = preselected
) { _, selections: IntArray, _ ->
val included = selections
.map { values[it].value }
return MaterialAlertDialogBuilder(activity!!)
.setTitle(R.string.reader_bottom_buttons)
.setMultiChoiceItems(
values.map { activity!!.getString(it.stringRes) }.toTypedArray(),
selection
) { _, which, selected ->
selection[which] = selected
}
.setPositiveButton(android.R.string.ok) { _, _ ->
val included = values
.filterIndexed { index, _ ->
selection[index]
}
.map { it.value }
.toSet()
preferences.readerBottomButtons().set(included)
}
.positiveButton(android.R.string.ok)
.negativeButton(android.R.string.cancel)
.setNegativeButton(android.R.string.cancel, null)
.create()
}
}
}

View File

@ -3,8 +3,7 @@ package eu.kanade.tachiyomi.ui.setting
import android.app.Dialog
import android.os.Bundle
import androidx.preference.PreferenceScreen
import com.afollestad.materialdialogs.MaterialDialog
import com.afollestad.materialdialogs.list.listItemsMultiChoice
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
import eu.kanade.tachiyomi.data.preference.asImmediateFlow
@ -99,7 +98,7 @@ class SettingsSecurityController : SettingsController() {
override fun onCreateDialog(savedViewState: Bundle?): Dialog {
val activity = activity!!
val options = arrayOf(
val options = listOf(
R.string.sunday,
R.string.monday,
R.string.tuesday,
@ -109,10 +108,11 @@ class SettingsSecurityController : SettingsController() {
R.string.saturday
)
.map { activity.getString(it) }
.toTypedArray()
val lockDays = preferences.authenticatorDays().get()
val initialSelection = List(7) {
val locked = when (it) {
val selection = BooleanArray(7) {
when (it) {
0 -> (lockDays and SecureActivityDelegate.LOCK_SUNDAY) == SecureActivityDelegate.LOCK_SUNDAY
1 -> (lockDays and SecureActivityDelegate.LOCK_MONDAY) == SecureActivityDelegate.LOCK_MONDAY
2 -> (lockDays and SecureActivityDelegate.LOCK_TUESDAY) == SecureActivityDelegate.LOCK_TUESDAY
@ -122,35 +122,36 @@ class SettingsSecurityController : SettingsController() {
6 -> (lockDays and SecureActivityDelegate.LOCK_SATURDAY) == SecureActivityDelegate.LOCK_SATURDAY
else -> false
}
if (locked) {
it
} else null
}.filterNotNull().toIntArray()
}
return MaterialDialog(activity)
.title(R.string.biometric_lock_days)
.message(R.string.biometric_lock_days_summary)
.listItemsMultiChoice(
items = options,
initialSelection = initialSelection
) { _, positions, _ ->
return MaterialAlertDialogBuilder(activity)
.setTitle(R.string.biometric_lock_days)
.setMultiChoiceItems(
options,
selection
) { _, which, selected ->
selection[which] = selected
}
.setPositiveButton(android.R.string.ok) { _, _ ->
var flags = 0
positions.forEach {
when (it) {
0 -> flags = flags or SecureActivityDelegate.LOCK_SUNDAY
1 -> flags = flags or SecureActivityDelegate.LOCK_MONDAY
2 -> flags = flags or SecureActivityDelegate.LOCK_TUESDAY
3 -> flags = flags or SecureActivityDelegate.LOCK_WEDNESDAY
4 -> flags = flags or SecureActivityDelegate.LOCK_THURSDAY
5 -> flags = flags or SecureActivityDelegate.LOCK_FRIDAY
6 -> flags = flags or SecureActivityDelegate.LOCK_SATURDAY
selection.forEachIndexed { index, checked ->
if (checked) {
when (index) {
0 -> flags = flags or SecureActivityDelegate.LOCK_SUNDAY
1 -> flags = flags or SecureActivityDelegate.LOCK_MONDAY
2 -> flags = flags or SecureActivityDelegate.LOCK_TUESDAY
3 -> flags = flags or SecureActivityDelegate.LOCK_WEDNESDAY
4 -> flags = flags or SecureActivityDelegate.LOCK_THURSDAY
5 -> flags = flags or SecureActivityDelegate.LOCK_FRIDAY
6 -> flags = flags or SecureActivityDelegate.LOCK_SATURDAY
}
}
}
preferences.authenticatorDays().set(flags)
}
.positiveButton(android.R.string.ok)
.negativeButton(android.R.string.cancel)
.setNegativeButton(android.R.string.cancel, null)
.create()
}
}
}

View File

@ -1,2 +1,93 @@
package eu.kanade.tachiyomi.ui.setting.eh
import android.app.Dialog
import android.os.Bundle
import android.view.LayoutInflater
import android.widget.ScrollView
import com.bluelinelabs.conductor.ControllerChangeHandler
import com.bluelinelabs.conductor.ControllerChangeType
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
import eu.kanade.tachiyomi.databinding.EhDialogCategoriesBinding
import eu.kanade.tachiyomi.ui.base.controller.DialogController
import eu.kanade.tachiyomi.ui.setting.SettingsEhController
import uy.kohesive.injekt.injectLazy
class FrontPageCategoriesDialog(
bundle: Bundle? = null
) : DialogController(bundle) {
var binding: EhDialogCategoriesBinding? = null
private set
val preferences: PreferencesHelper by injectLazy()
override fun onCreateDialog(savedViewState: Bundle?): Dialog {
binding = EhDialogCategoriesBinding.inflate(LayoutInflater.from(activity!!))
val view = ScrollView(binding!!.root.context).apply {
addView(binding!!.root)
}
onViewCreated()
return MaterialAlertDialogBuilder(activity!!)
.setTitle(R.string.language_filtering)
.setMessage(R.string.language_filtering_summary)
.setView(view)
.setPositiveButton(android.R.string.ok) { _, _ ->
onPositive()
}
.setOnDismissListener {
onPositive()
}
.setOnCancelListener {
onPositive()
}
.setNegativeButton(android.R.string.cancel, null)
.create()
}
fun onViewCreated() {
with(binding!!) {
val list = preferences.exhEnabledCategories().get().split(",").map { !it.toBoolean() }
doujinshiCheckbox.isChecked = list[0]
mangaCheckbox.isChecked = list[1]
artistCgCheckbox.isChecked = list[2]
gameCgCheckbox.isChecked = list[3]
westernCheckbox.isChecked = list[4]
nonHCheckbox.isChecked = list[5]
imageSetCheckbox.isChecked = list[6]
cosplayCheckbox.isChecked = list[7]
asianPornCheckbox.isChecked = list[8]
miscCheckbox.isChecked = list[9]
}
}
fun onPositive() {
with(binding!!) {
preferences.exhEnabledCategories().set(
listOf(
(!doujinshiCheckbox.isChecked),
(!mangaCheckbox.isChecked),
(!artistCgCheckbox.isChecked),
(!gameCgCheckbox.isChecked),
(!westernCheckbox.isChecked),
(!nonHCheckbox.isChecked),
(!imageSetCheckbox.isChecked),
(!cosplayCheckbox.isChecked),
(!asianPornCheckbox.isChecked),
(!miscCheckbox.isChecked)
).joinToString(separator = ",") { it.toString() }
)
}
with(targetController as? SettingsEhController ?: return) {
preferences.exhSettingsLanguages().reconfigure()
}
}
override fun onChangeStarted(handler: ControllerChangeHandler, type: ControllerChangeType) {
super.onChangeStarted(handler, type)
if (!type.isEnter) {
binding = null
}
}
}

View File

@ -1,4 +1,183 @@
package eu.kanade.tachiyomi.ui.setting.eh
class LanguagesDialog {
}
import android.app.Dialog
import android.os.Bundle
import android.view.LayoutInflater
import android.widget.ScrollView
import com.bluelinelabs.conductor.ControllerChangeHandler
import com.bluelinelabs.conductor.ControllerChangeType
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
import eu.kanade.tachiyomi.databinding.EhDialogLanguagesBinding
import eu.kanade.tachiyomi.ui.base.controller.DialogController
import eu.kanade.tachiyomi.ui.setting.SettingsEhController
import uy.kohesive.injekt.injectLazy
class LanguagesDialog(
bundle: Bundle? = null
) : DialogController(bundle) {
var binding: EhDialogLanguagesBinding? = null
private set
val preferences: PreferencesHelper by injectLazy()
override fun onCreateDialog(savedViewState: Bundle?): Dialog {
binding = EhDialogLanguagesBinding.inflate(LayoutInflater.from(activity!!))
val view = ScrollView(binding!!.root.context).apply {
addView(binding!!.root)
}
onViewCreated()
return MaterialAlertDialogBuilder(activity!!)
.setTitle(R.string.language_filtering)
.setMessage(R.string.language_filtering_summary)
.setView(view)
.setPositiveButton(android.R.string.ok) { _, _ ->
onPositive()
}
.setOnDismissListener {
onPositive()
}
.setOnCancelListener {
onPositive()
}
.setNegativeButton(android.R.string.cancel, null)
.create()
}
fun onViewCreated() {
val settingsLanguages = preferences.exhSettingsLanguages().get().split("\n")
val japanese = settingsLanguages[0].split("*").map { it.toBoolean() }
val english = settingsLanguages[1].split("*").map { it.toBoolean() }
val chinese = settingsLanguages[2].split("*").map { it.toBoolean() }
val dutch = settingsLanguages[3].split("*").map { it.toBoolean() }
val french = settingsLanguages[4].split("*").map { it.toBoolean() }
val german = settingsLanguages[5].split("*").map { it.toBoolean() }
val hungarian = settingsLanguages[6].split("*").map { it.toBoolean() }
val italian = settingsLanguages[7].split("*").map { it.toBoolean() }
val korean = settingsLanguages[8].split("*").map { it.toBoolean() }
val polish = settingsLanguages[9].split("*").map { it.toBoolean() }
val portuguese = settingsLanguages[10].split("*").map { it.toBoolean() }
val russian = settingsLanguages[11].split("*").map { it.toBoolean() }
val spanish = settingsLanguages[12].split("*").map { it.toBoolean() }
val thai = settingsLanguages[13].split("*").map { it.toBoolean() }
val vietnamese = settingsLanguages[14].split("*").map { it.toBoolean() }
val notAvailable =
settingsLanguages[15].split("*").map { it.toBoolean() }
val other = settingsLanguages[16].split("*").map { it.toBoolean() }
with(binding!!) {
japaneseOriginal.isChecked = japanese[0]
japaneseTranslated.isChecked = japanese[1]
japaneseRewrite.isChecked = japanese[2]
japaneseOriginal.isChecked = japanese[0]
japaneseTranslated.isChecked = japanese[1]
japaneseRewrite.isChecked = japanese[2]
englishOriginal.isChecked = english[0]
englishTranslated.isChecked = english[1]
englishRewrite.isChecked = english[2]
chineseOriginal.isChecked = chinese[0]
chineseTranslated.isChecked = chinese[1]
chineseRewrite.isChecked = chinese[2]
dutchOriginal.isChecked = dutch[0]
dutchTranslated.isChecked = dutch[1]
dutchRewrite.isChecked = dutch[2]
frenchOriginal.isChecked = french[0]
frenchTranslated.isChecked = french[1]
frenchRewrite.isChecked = french[2]
germanOriginal.isChecked = german[0]
germanTranslated.isChecked = german[1]
germanRewrite.isChecked = german[2]
hungarianOriginal.isChecked = hungarian[0]
hungarianTranslated.isChecked = hungarian[1]
hungarianRewrite.isChecked = hungarian[2]
italianOriginal.isChecked = italian[0]
italianTranslated.isChecked = italian[1]
italianRewrite.isChecked = italian[2]
koreanOriginal.isChecked = korean[0]
koreanTranslated.isChecked = korean[1]
koreanRewrite.isChecked = korean[2]
polishOriginal.isChecked = polish[0]
polishTranslated.isChecked = polish[1]
polishRewrite.isChecked = polish[2]
portugueseOriginal.isChecked = portuguese[0]
portugueseTranslated.isChecked = portuguese[1]
portugueseRewrite.isChecked = portuguese[2]
russianOriginal.isChecked = russian[0]
russianTranslated.isChecked = russian[1]
russianRewrite.isChecked = russian[2]
spanishOriginal.isChecked = spanish[0]
spanishTranslated.isChecked = spanish[1]
spanishRewrite.isChecked = spanish[2]
thaiOriginal.isChecked = thai[0]
thaiTranslated.isChecked = thai[1]
thaiRewrite.isChecked = thai[2]
vietnameseOriginal.isChecked = vietnamese[0]
vietnameseTranslated.isChecked = vietnamese[1]
vietnameseRewrite.isChecked = vietnamese[2]
notAvailableOriginal.isChecked = notAvailable[0]
notAvailableTranslated.isChecked = notAvailable[1]
notAvailableRewrite.isChecked = notAvailable[2]
otherOriginal.isChecked = other[0]
otherTranslated.isChecked = other[1]
otherRewrite.isChecked = other[2]
}
}
fun onPositive() {
val languages = with(binding!!) {
listOf(
"${japaneseOriginal.isChecked}*${japaneseTranslated.isChecked}*${japaneseRewrite.isChecked}",
"${englishOriginal.isChecked}*${englishTranslated.isChecked}*${englishRewrite.isChecked}",
"${chineseOriginal.isChecked}*${chineseTranslated.isChecked}*${chineseRewrite.isChecked}",
"${dutchOriginal.isChecked}*${dutchTranslated.isChecked}*${dutchRewrite.isChecked}",
"${frenchOriginal.isChecked}*${frenchTranslated.isChecked}*${frenchRewrite.isChecked}",
"${germanOriginal.isChecked}*${germanTranslated.isChecked}*${germanRewrite.isChecked}",
"${hungarianOriginal.isChecked}*${hungarianTranslated.isChecked}*${hungarianRewrite.isChecked}",
"${italianOriginal.isChecked}*${italianTranslated.isChecked}*${italianRewrite.isChecked}",
"${koreanOriginal.isChecked}*${koreanTranslated.isChecked}*${koreanRewrite.isChecked}",
"${polishOriginal.isChecked}*${polishTranslated.isChecked}*${polishRewrite.isChecked}",
"${portugueseOriginal.isChecked}*${portugueseTranslated.isChecked}*${portugueseRewrite.isChecked}",
"${russianOriginal.isChecked}*${russianTranslated.isChecked}*${russianRewrite.isChecked}",
"${spanishOriginal.isChecked}*${spanishTranslated.isChecked}*${spanishRewrite.isChecked}",
"${thaiOriginal.isChecked}*${thaiTranslated.isChecked}*${thaiRewrite.isChecked}",
"${vietnameseOriginal.isChecked}*${vietnameseTranslated.isChecked}*${vietnameseRewrite.isChecked}",
"${notAvailableOriginal.isChecked}*${notAvailableTranslated.isChecked}*${notAvailableRewrite.isChecked}",
"${otherOriginal.isChecked}*${otherTranslated.isChecked}*${otherRewrite.isChecked}"
).joinToString("\n")
}
preferences.exhSettingsLanguages().set(languages)
with(targetController as? SettingsEhController ?: return) {
preferences.exhSettingsLanguages().reconfigure()
}
}
override fun onChangeStarted(handler: ControllerChangeHandler, type: ControllerChangeType) {
super.onChangeStarted(handler, type)
if (!type.isEnter) {
binding = null
}
}
}

View File

@ -5,7 +5,7 @@ import android.app.Activity
import android.util.Log
import androidx.core.text.HtmlCompat
import androidx.preference.PreferenceScreen
import com.afollestad.materialdialogs.MaterialDialog
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import eu.kanade.tachiyomi.ui.setting.SettingsController
import eu.kanade.tachiyomi.util.preference.defaultValue
import eu.kanade.tachiyomi.util.preference.onClick
@ -36,23 +36,13 @@ class SettingsDebugController : SettingsController() {
try {
val result = it.call(DebugFunctions)
val text = "Function returned result:\n\n$result"
MaterialDialog(context)
.title(text = title.toString())
.message(text = text) {
messageTextView.apply {
setHorizontallyScrolling(true)
setTextIsSelectable(true)
}
}
MaterialAlertDialogBuilder(context)
.setTitle(title.toString())
.setMessage(text)
} catch (t: Throwable) {
val text = "Function threw exception:\n\n${Log.getStackTraceString(t)}"
MaterialDialog(context)
.message(text = text) {
messageTextView.apply {
setHorizontallyScrolling(true)
setTextIsSelectable(true)
}
}
MaterialAlertDialogBuilder(context)
.setMessage(text)
}.show()
}
}

View File

@ -2,7 +2,7 @@ package exh.favorites
import android.content.Context
import androidx.core.text.HtmlCompat
import com.afollestad.materialdialogs.MaterialDialog
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
import uy.kohesive.injekt.injectLazy
@ -10,12 +10,12 @@ import uy.kohesive.injekt.injectLazy
class FavoritesIntroDialog {
private val prefs: PreferencesHelper by injectLazy()
fun show(context: Context) = MaterialDialog(context)
.title(R.string.favorites_sync_notes)
.message(text = HtmlCompat.fromHtml(context.getString(R.string.favorites_sync_notes_message), HtmlCompat.FROM_HTML_MODE_LEGACY))
.positiveButton(android.R.string.ok) {
fun show(context: Context) = MaterialAlertDialogBuilder(context)
.setTitle(R.string.favorites_sync_notes)
.setMessage(HtmlCompat.fromHtml(context.getString(R.string.favorites_sync_notes_message), HtmlCompat.FROM_HTML_MODE_LEGACY))
.setPositiveButton(android.R.string.ok) { _, _ ->
prefs.exhShowSyncIntro().set(false)
}
.cancelable(false)
.setCancelable(false)
.show()
}

View File

@ -3,7 +3,8 @@ package exh.uconfig
import android.app.Dialog
import android.os.Bundle
import android.view.View
import com.afollestad.materialdialogs.MaterialDialog
import androidx.appcompat.app.AlertDialog
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.ui.base.controller.DialogController
import eu.kanade.tachiyomi.util.lang.launchIO
@ -14,7 +15,7 @@ import kotlinx.coroutines.MainScope
import kotlinx.coroutines.cancel
class ConfiguringDialogController : DialogController() {
private var materialDialog: MaterialDialog? = null
private var materialDialog: AlertDialog? = null
val scope = MainScope()
override fun onCreateDialog(savedViewState: Bundle?): Dialog {
@ -28,10 +29,10 @@ class ConfiguringDialogController : DialogController() {
} catch (e: Exception) {
launchUI {
activity?.let {
MaterialDialog(it)
.title(R.string.eh_settings_configuration_failed)
.message(text = it.getString(R.string.eh_settings_configuration_failed_message, e.message))
.positiveButton(android.R.string.ok)
MaterialAlertDialogBuilder(it)
.setTitle(R.string.eh_settings_configuration_failed)
.setMessage(it.getString(R.string.eh_settings_configuration_failed_message, e.message))
.setPositiveButton(android.R.string.ok, null)
.show()
}
}
@ -43,10 +44,11 @@ class ConfiguringDialogController : DialogController() {
}
}
return MaterialDialog(activity!!)
.title(R.string.eh_settings_uploading_to_server)
.message(R.string.eh_settings_uploading_to_server_message)
.cancelable(false)
return MaterialAlertDialogBuilder(activity!!)
.setTitle(R.string.eh_settings_uploading_to_server)
.setMessage(R.string.eh_settings_uploading_to_server_message)
.setCancelable(false)
.create()
.also {
materialDialog = it
}

View File

@ -2,8 +2,8 @@ package exh.uconfig
import android.app.Dialog
import android.os.Bundle
import com.afollestad.materialdialogs.MaterialDialog
import com.bluelinelabs.conductor.Router
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
import eu.kanade.tachiyomi.ui.base.controller.DialogController
@ -14,14 +14,15 @@ import uy.kohesive.injekt.injectLazy
class WarnConfigureDialogController : DialogController() {
private val prefs: PreferencesHelper by injectLazy()
override fun onCreateDialog(savedViewState: Bundle?): Dialog {
return MaterialDialog(activity!!)
.title(R.string.settings_profile_note)
.message(R.string.settings_profile_note_message)
.positiveButton(android.R.string.ok) {
return MaterialAlertDialogBuilder(activity!!)
.setTitle(R.string.settings_profile_note)
.setMessage(R.string.settings_profile_note_message)
.setPositiveButton(android.R.string.ok) { _, _ ->
prefs.exhShowSettingsUploadWarning().set(false)
ConfiguringDialogController().showDialog(router)
}
.cancelable(false)
.setCancelable(false)
.create()
}
companion object {

View File

@ -3,7 +3,7 @@ package exh.ui.batchadd
import android.view.LayoutInflater
import android.view.View
import android.widget.TextView
import com.afollestad.materialdialogs.MaterialDialog
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.databinding.EhFragmentBatchAddBinding
import eu.kanade.tachiyomi.ui.base.controller.NucleusController
@ -143,12 +143,10 @@ class BatchAddController : NucleusController<EhFragmentBatchAddBinding, BatchAdd
private fun noGalleriesSpecified() {
activity?.let {
MaterialDialog(it)
.title(R.string.batch_add_no_valid_galleries)
.message(R.string.batch_add_no_valid_galleries_message)
.positiveButton(android.R.string.ok) { materialDialog -> materialDialog.dismiss() }
.cancelable(true)
.cancelOnTouchOutside(true)
MaterialAlertDialogBuilder(it)
.setTitle(R.string.batch_add_no_valid_galleries)
.setMessage(R.string.batch_add_no_valid_galleries_message)
.setPositiveButton(android.R.string.ok, null)
.show()
}
}

View File

@ -11,7 +11,7 @@ import android.webkit.JsResult
import android.webkit.WebChromeClient
import android.webkit.WebView
import androidx.appcompat.app.AppCompatActivity
import com.afollestad.materialdialogs.MaterialDialog
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
import eu.kanade.tachiyomi.databinding.EhActivityCaptchaBinding
@ -190,12 +190,10 @@ class BrowserActionActivity : AppCompatActivity() {
xLogE("Captcha solve Error", IllegalStateException("Captcha solve failure!"))
withUIContext {
binding.webview.evaluateJavascript(SOLVE_UI_SCRIPT_HIDE, null)
MaterialDialog(this@BrowserActionActivity)
.title(R.string.captcha_solve_failure)
.message(R.string.captcha_solve_failure_message)
.cancelable(true)
.cancelOnTouchOutside(true)
.positiveButton(android.R.string.ok)
MaterialAlertDialogBuilder(this@BrowserActionActivity)
.setTitle(R.string.captcha_solve_failure)
.setMessage(R.string.captcha_solve_failure_message)
.setPositiveButton(android.R.string.ok, null)
.show()
}
}

View File

@ -5,10 +5,7 @@ import android.os.Bundle
import android.view.MenuItem
import androidx.core.view.isVisible
import androidx.lifecycle.lifecycleScope
import com.afollestad.materialdialogs.MaterialDialog
import com.afollestad.materialdialogs.callbacks.onCancel
import com.afollestad.materialdialogs.callbacks.onDismiss
import com.afollestad.materialdialogs.list.listItemsSingleChoice
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.database.models.Chapter
import eu.kanade.tachiyomi.data.database.models.Manga
@ -83,14 +80,12 @@ class InterceptActivity : BaseViewBindingActivity<EhActivityInterceptBinding>()
is InterceptResult.Failure -> {
binding.interceptProgress.isVisible = false
binding.interceptStatus.text = this.getString(R.string.error_with_reason, it.reason)
MaterialDialog(this)
.title(R.string.chapter_error)
.message(text = this.getString(R.string.could_not_open_manga, it.reason))
.cancelable(true)
.cancelOnTouchOutside(true)
.positiveButton(android.R.string.ok)
.onCancel { onBackPressed() }
.onDismiss { onBackPressed() }
MaterialAlertDialogBuilder(this)
.setTitle(R.string.chapter_error)
.setMessage(getString(R.string.could_not_open_manga, it.reason))
.setPositiveButton(android.R.string.ok, null)
.setOnCancelListener { onBackPressed() }
.setOnDismissListener { onBackPressed() }
.show()
}
}
@ -114,9 +109,10 @@ class InterceptActivity : BaseViewBindingActivity<EhActivityInterceptBinding>()
status.value = InterceptResult.Loading
val sources = galleryAdder.pickSource(gallery)
if (sources.size > 1) {
MaterialDialog(this)
.title(R.string.label_sources)
.listItemsSingleChoice(items = sources.map { it.toString() }) { _, index, _ ->
MaterialAlertDialogBuilder(this)
.setTitle(R.string.label_sources)
.setSingleChoiceItems(sources.map { it.toString() }.toTypedArray(), 0) { dialog, index ->
dialog.dismiss()
loadGalleryEnd(gallery, sources[index])
}
.show()

View File

@ -13,8 +13,7 @@ import android.widget.Toast
import androidx.core.view.isInvisible
import androidx.core.view.isVisible
import androidx.lifecycle.lifecycleScope
import com.afollestad.materialdialogs.MaterialDialog
import com.afollestad.materialdialogs.input.input
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import eu.kanade.tachiyomi.BuildConfig
import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
@ -25,6 +24,7 @@ import eu.kanade.tachiyomi.util.lang.launchUI
import eu.kanade.tachiyomi.util.system.WebViewUtil
import eu.kanade.tachiyomi.util.system.setDefaultSettings
import eu.kanade.tachiyomi.util.system.toast
import eu.kanade.tachiyomi.widget.materialdialogs.setTextInput
import exh.log.xLogD
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach
@ -147,18 +147,18 @@ class EhLoginActivity : BaseViewBindingActivity<EhActivityLoginBinding>() {
private fun openIgneousDialog() {
var igneous: CharSequence? = null
MaterialDialog(this)
.title(R.string.custom_igneous_cookie)
.message(R.string.custom_igneous_cookie_message)
.input { _, charSequence ->
igneous = charSequence
MaterialAlertDialogBuilder(this)
.setTitle(R.string.custom_igneous_cookie)
.setMessage(R.string.custom_igneous_cookie_message)
.setTextInput { igneousText ->
igneous = igneousText
}
.positiveButton(android.R.string.ok) {
.setPositiveButton(android.R.string.ok) { _, _ ->
if (!igneous.isNullOrBlank()) {
this.igneous = igneous?.toString()?.trim()
}
}
.negativeButton(android.R.string.cancel)
.setNegativeButton(android.R.string.cancel, null)
.show()
}

View File

@ -5,11 +5,10 @@ import android.os.Bundle
import android.view.LayoutInflater
import androidx.core.os.bundleOf
import androidx.core.view.isVisible
import com.afollestad.materialdialogs.MaterialDialog
import com.afollestad.materialdialogs.customview.customView
import com.bluelinelabs.conductor.ControllerChangeHandler
import com.bluelinelabs.conductor.ControllerChangeType
import com.dd.processbutton.iml.ActionProcessButton
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
import eu.kanade.tachiyomi.databinding.PrefSiteLoginTwoFactorAuthBinding
@ -48,12 +47,10 @@ class MangadexLoginDialog(bundle: Bundle? = null) : DialogController(bundle) {
override fun onCreateDialog(savedViewState: Bundle?): Dialog {
binding = PrefSiteLoginTwoFactorAuthBinding.inflate(LayoutInflater.from(activity!!))
val dialog = MaterialDialog(activity!!)
.customView(view = binding.root, scrollable = false)
onViewCreated()
return dialog
return MaterialAlertDialogBuilder(activity!!)
.setView(binding.root)
.create()
}
fun onViewCreated() {

View File

@ -3,7 +3,7 @@ package exh.widget.preference
import android.app.Dialog
import android.os.Bundle
import androidx.core.os.bundleOf
import com.afollestad.materialdialogs.MaterialDialog
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.track.TrackManager
import eu.kanade.tachiyomi.source.Source
@ -34,9 +34,9 @@ class MangadexLogoutDialog(bundle: Bundle? = null) : DialogController(bundle) {
)
override fun onCreateDialog(savedViewState: Bundle?): Dialog {
return MaterialDialog(activity!!)
.title(R.string.logout)
.positiveButton(R.string.logout) {
return MaterialAlertDialogBuilder(activity!!)
.setTitle(R.string.logout)
.setPositiveButton(R.string.logout) { _, _ ->
launchNow {
supervisorScope {
if (source != null) {
@ -66,7 +66,8 @@ class MangadexLogoutDialog(bundle: Bundle? = null) : DialogController(bundle) {
}
}
}
.negativeButton(android.R.string.cancel)
.setNegativeButton(android.R.string.cancel, null)
.create()
}
interface Listener {

View File

@ -221,7 +221,7 @@
</plurals>
<string name="biometric_lock_start_time">Enter starting time</string>
<string name="biometric_lock_end_time">Enter end time</string>
<string name="biometric_lock_time_deleted_snack">Biometric lock time completed</string>
<string name="biometric_lock_time_deleted_snack">Biometric lock time deleted</string>
<string name="biometric_lock_invalid_time_selected">Invalid time selected</string>
<string name="biometric_lock_days">Biometric lock days</string>
<string name="biometric_lock_days_summary">Days to have the app locked</string>