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.app.Dialog
import android.os.Bundle import android.os.Bundle
import com.afollestad.materialdialogs.MaterialDialog
import com.bluelinelabs.conductor.Controller import com.bluelinelabs.conductor.Controller
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.ui.base.controller.DialogController import eu.kanade.tachiyomi.ui.base.controller.DialogController
import eu.kanade.tachiyomi.ui.browse.migration.advanced.process.MigrationListController import eu.kanade.tachiyomi.ui.browse.migration.advanced.process.MigrationListController
@ -32,15 +32,16 @@ class MigrationMangaDialog<T>(bundle: Bundle? = null) : DialogController(bundle)
else "" else ""
) )
).orEmpty() ).orEmpty()
return MaterialDialog(activity!!) return MaterialAlertDialogBuilder(activity!!)
.message(text = confirmString) .setMessage(confirmString)
.positiveButton(if (copy) R.string.copy else R.string.migrate) { .setPositiveButton(if (copy) R.string.copy else R.string.migrate) { _, _ ->
if (copy) { if (copy) {
(targetController as? MigrationListController)?.copyMangas() (targetController as? MigrationListController)?.copyMangas()
} else { } else {
(targetController as? MigrationListController)?.migrateMangas() (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.core.os.bundleOf
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import androidx.vectordrawable.graphics.drawable.VectorDrawableCompat import androidx.vectordrawable.graphics.drawable.VectorDrawableCompat
import com.afollestad.materialdialogs.MaterialDialog
import com.bluelinelabs.conductor.changehandler.FadeChangeHandler import com.bluelinelabs.conductor.changehandler.FadeChangeHandler
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import dev.chrisbanes.insetter.applyInsetter import dev.chrisbanes.insetter.applyInsetter
import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.database.DatabaseHelper import eu.kanade.tachiyomi.data.database.DatabaseHelper
@ -430,14 +430,14 @@ class MigrationListController(bundle: Bundle? = null) :
override fun handleBack(): Boolean { override fun handleBack(): Boolean {
activity?.let { activity?.let {
MaterialDialog(it).show { MaterialAlertDialogBuilder(it)
title(R.string.stop_migrating) .setTitle(R.string.stop_migrating)
positiveButton(R.string.action_stop) { .setPositiveButton(R.string.action_stop) { _, _ ->
router.popCurrentController() router.popCurrentController()
migrationsJob?.cancel() migrationsJob?.cancel()
} }
negativeButton(android.R.string.cancel) .setNegativeButton(android.R.string.cancel, null)
} .show()
} }
return true return true
} }

View File

@ -234,7 +234,8 @@ class SourceController(bundle: Bundle? = null) :
} }
private fun addToCategories(source: Source) { 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()) { if (categories.isEmpty()) {
applicationContext?.toast(R.string.no_source_categories) applicationContext?.toast(R.string.no_source_categories)
@ -245,16 +246,18 @@ class SourceController(bundle: Bundle? = null) :
val sources = preferenceSources.map { it.split("|")[0] } val sources = preferenceSources.map { it.split("|")[0] }
if (source.id.toString() in sources) { 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 -> val selection = categories.map { it in sourceCategories }
categories.indexOf(category.second) .toBooleanArray()
}.toTypedArray()
ChangeSourceCategoriesDialog(this, source, categories, preselected) ChangeSourceCategoriesDialog(this, source, categories, selection)
.showDialog(router) .showDialog(router)
} else { } else {
ChangeSourceCategoriesDialog(this, source, categories, emptyArray()) ChangeSourceCategoriesDialog(this, source, categories, categories.map { false }.toBooleanArray())
.showDialog(router) .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.util.view.snack
import eu.kanade.tachiyomi.widget.AutofitRecyclerView import eu.kanade.tachiyomi.widget.AutofitRecyclerView
import eu.kanade.tachiyomi.widget.EmptyView import eu.kanade.tachiyomi.widget.EmptyView
import eu.kanade.tachiyomi.widget.materialdialogs.setTextInput
import exh.log.xLogW import exh.log.xLogW
import exh.savedsearches.EXHSavedSearch import exh.savedsearches.EXHSavedSearch
import exh.source.getMainSource import exh.source.getMainSource
@ -205,15 +206,19 @@ open class BrowseSourceController(bundle: Bundle) :
// EXH --> // EXH -->
onSaveClicked = { onSaveClicked = {
filterSheet?.context?.let { filterSheet?.context?.let {
MaterialDialog(it) var searchName = ""
.title(R.string.save_search) MaterialAlertDialogBuilder(it)
.input(hintRes = R.string.save_search_hint) { _, searchName -> .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() val oldSavedSearches = presenter.loadSearches()
if (searchName.isNotBlank() && if (searchName.isNotBlank() &&
oldSavedSearches.size < MAX_SAVED_SEARCHES oldSavedSearches.size < MAX_SAVED_SEARCHES
) { ) {
val newSearches = oldSavedSearches + EXHSavedSearch( val newSearches = oldSavedSearches + EXHSavedSearch(
searchName.toString().trim(), searchName.trim(),
presenter.query, presenter.query,
presenter.sourceFilters presenter.sourceFilters
) )
@ -221,10 +226,7 @@ open class BrowseSourceController(bundle: Bundle) :
filterSheet?.setSavedSearches(newSearches) filterSheet?.setSavedSearches(newSearches)
} }
} }
.positiveButton(R.string.action_save) .setNegativeButton(R.string.action_cancel, null)
.negativeButton(R.string.action_cancel)
.cancelable(true)
.cancelOnTouchOutside(true)
.show() .show()
} }
}, },
@ -235,11 +237,9 @@ open class BrowseSourceController(bundle: Bundle) :
if (search == null) { if (search == null) {
filterSheet?.context?.let { filterSheet?.context?.let {
MaterialDialog(it) MaterialAlertDialogBuilder(it)
.title(R.string.save_search_failed_to_load) .setTitle(R.string.save_search_failed_to_load)
.message(R.string.save_search_failed_to_load_message) .setMessage(R.string.save_search_failed_to_load_message)
.cancelable(true)
.cancelOnTouchOutside(true)
.show() .show()
} }
return@cb return@cb
@ -267,30 +267,26 @@ open class BrowseSourceController(bundle: Bundle) :
if (search == null || search.name != name) { if (search == null || search.name != name) {
filterSheet?.context?.let { filterSheet?.context?.let {
MaterialDialog(it) MaterialAlertDialogBuilder(it)
.title(R.string.save_search_failed_to_delete) .setTitle(R.string.save_search_failed_to_delete)
.message(R.string.save_search_failed_to_delete_message) .setMessage(R.string.save_search_failed_to_delete_message)
.cancelable(true)
.cancelOnTouchOutside(true)
.show() .show()
} }
return@cb return@cb
} }
filterSheet?.context?.let { filterSheet?.context?.let {
MaterialDialog(it) MaterialAlertDialogBuilder(it)
.title(R.string.save_search_delete) .setTitle(R.string.save_search_delete)
.message(text = it.getString(R.string.save_search_delete_message, search.name)) .setMessage(it.getString(R.string.save_search_delete_message, search.name))
.positiveButton(R.string.action_cancel) .setPositiveButton(R.string.action_cancel, null)
.negativeButton(android.R.string.ok) { .setNegativeButton(android.R.string.ok) { _, _ ->
val newSearches = savedSearches.filterIndexed { index, _ -> val newSearches = savedSearches.filterIndexed { index, _ ->
index != indexToDelete index != indexToDelete
} }
presenter.saveSearches(newSearches) presenter.saveSearches(newSearches)
filterSheet?.setSavedSearches(newSearches) filterSheet?.setSavedSearches(newSearches)
} }
.cancelable(true)
.cancelOnTouchOutside(true)
.show() .show()
} }
} }

View File

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

View File

@ -10,6 +10,7 @@ import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton import com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton
import com.google.android.material.snackbar.Snackbar import com.google.android.material.snackbar.Snackbar
import com.google.android.material.timepicker.MaterialTimePicker
import dev.chrisbanes.insetter.applyInsetter import dev.chrisbanes.insetter.applyInsetter
import eu.davidea.flexibleadapter.FlexibleAdapter import eu.davidea.flexibleadapter.FlexibleAdapter
import eu.davidea.flexibleadapter.SelectableAdapter 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.ui.main.MainActivity
import eu.kanade.tachiyomi.util.system.toast import eu.kanade.tachiyomi.util.system.toast
import eu.kanade.tachiyomi.util.view.shrinkOnScroll import eu.kanade.tachiyomi.util.view.shrinkOnScroll
import exh.util.hours
import exh.util.minutes
import kotlin.time.Duration import kotlin.time.Duration
import kotlin.time.ExperimentalTime import kotlin.time.ExperimentalTime
@ -34,7 +37,6 @@ class BiometricTimesController :
ActionMode.Callback, ActionMode.Callback,
FlexibleAdapter.OnItemClickListener, FlexibleAdapter.OnItemClickListener,
FlexibleAdapter.OnItemLongClickListener, FlexibleAdapter.OnItemLongClickListener,
BiometricTimesCreateDialog.Listener,
UndoHelper.OnActionListener { UndoHelper.OnActionListener {
/** /**
@ -97,7 +99,7 @@ class BiometricTimesController :
fab.setText(R.string.action_add) fab.setText(R.string.action_add)
fab.setIconResource(R.drawable.ic_add_24dp) fab.setIconResource(R.drawable.ic_add_24dp)
fab.setOnClickListener { fab.setOnClickListener {
BiometricTimesCreateDialog(this@BiometricTimesController).showDialog(router, null) showTimePicker()
} }
} }
@ -298,15 +300,19 @@ class BiometricTimesController :
activity?.toast(R.string.biometric_lock_time_conflicts) activity?.toast(R.string.biometric_lock_time_conflicts)
} }
override fun startNextDialog(startTime: Duration?) { fun showTimePicker(startTime: Duration? = null) {
if (startTime != null) { val picker = MaterialTimePicker.Builder()
BiometricTimesCreateDialog(this@BiometricTimesController, startTime).showDialog(router, null) .setTitleText(if (startTime == null) R.string.biometric_lock_start_time else R.string.biometric_lock_end_time)
} else activity?.toast(R.string.biometric_lock_invalid_time_selected) .setInputMode(MaterialTimePicker.INPUT_MODE_CLOCK)
} .build()
picker.addOnPositiveButtonClickListener {
override fun createTimeRange(startTime: Duration?, endTime: Duration?) { val timeRange = picker.hour.hours + picker.minute.minutes
if (startTime != null && endTime != null) { if (startTime != null) {
presenter.createTimeRange(TimeRange(startTime, endTime)) presenter.createTimeRange(TimeRange(startTime, timeRange))
} else activity?.toast(R.string.biometric_lock_invalid_time_selected) } 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.appcompat.view.ActionMode
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView 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.floatingactionbutton.ExtendedFloatingActionButton
import com.google.android.material.snackbar.Snackbar import com.google.android.material.snackbar.Snackbar
import dev.chrisbanes.insetter.applyInsetter import dev.chrisbanes.insetter.applyInsetter
@ -230,10 +230,10 @@ class SortTagController :
} }
private fun helpDialog(hasPositive: Boolean = false) { private fun helpDialog(hasPositive: Boolean = false) {
MaterialDialog(activity!!) MaterialAlertDialogBuilder(activity!!)
.title(R.string.add_tag) .setTitle(R.string.add_tag)
.message(R.string.action_add_tags_message) .setMessage(R.string.action_add_tags_message)
.positiveButton(android.R.string.ok) { .setPositiveButton(android.R.string.ok) { _, _ ->
if (hasPositive) { if (hasPositive) {
SortTagCreateDialog(this@SortTagController).showDialog(router, null) 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.app.Dialog
import android.os.Bundle import android.os.Bundle
import com.afollestad.materialdialogs.MaterialDialog
import com.afollestad.materialdialogs.input.input
import com.bluelinelabs.conductor.Controller import com.bluelinelabs.conductor.Controller
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.ui.base.controller.DialogController import eu.kanade.tachiyomi.ui.base.controller.DialogController
import eu.kanade.tachiyomi.widget.materialdialogs.setTextInput
/** /**
* Dialog to create a new category for the library. * 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. * @return a new dialog instance.
*/ */
override fun onCreateDialog(savedViewState: Bundle?): Dialog { override fun onCreateDialog(savedViewState: Bundle?): Dialog {
return MaterialDialog(activity!!) return MaterialAlertDialogBuilder(activity!!)
.title(R.string.action_add_category) .setTitle(R.string.action_add_category)
.negativeButton(android.R.string.cancel) .setTextInput(
.input(
hint = resources?.getString(R.string.name), hint = resources?.getString(R.string.name),
prefill = currentName prefill = currentName
) { _, input -> ) { input ->
currentName = input.toString() currentName = input
} }
.positiveButton(android.R.string.ok) { .setPositiveButton(android.R.string.ok) { _, _ ->
(targetController as? Listener)?.createCategory(currentName) (targetController as? Listener)?.createCategory(currentName)
} }
.setNegativeButton(android.R.string.cancel, null)
.create()
} }
interface Listener { interface Listener {

View File

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

View File

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

View File

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

View File

@ -2,11 +2,11 @@ package eu.kanade.tachiyomi.ui.category.sources
import android.app.Dialog import android.app.Dialog
import android.os.Bundle import android.os.Bundle
import com.afollestad.materialdialogs.MaterialDialog
import com.afollestad.materialdialogs.input.input
import com.bluelinelabs.conductor.Controller import com.bluelinelabs.conductor.Controller
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.ui.base.controller.DialogController import eu.kanade.tachiyomi.ui.base.controller.DialogController
import eu.kanade.tachiyomi.widget.materialdialogs.setTextInput
/** /**
* Dialog to rename an existing category of the library. * 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. * @return a new dialog instance.
*/ */
override fun onCreateDialog(savedViewState: Bundle?): Dialog { override fun onCreateDialog(savedViewState: Bundle?): Dialog {
return MaterialDialog(activity!!) return MaterialAlertDialogBuilder(activity!!)
.title(R.string.action_rename_category) .setTitle(R.string.action_rename_category)
.negativeButton(android.R.string.cancel) .setTextInput(
.input(
hint = resources?.getString(R.string.name), hint = resources?.getString(R.string.name),
prefill = currentName prefill = currentName
) { _, input -> ) { input ->
currentName = input.toString() 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.MenuItem
import android.view.View import android.view.View
import android.view.WindowManager import android.view.WindowManager
import androidx.appcompat.app.AlertDialog
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.view.ActionMode import androidx.appcompat.view.ActionMode
import androidx.core.graphics.drawable.DrawableCompat import androidx.core.graphics.drawable.DrawableCompat
import androidx.core.view.isVisible import androidx.core.view.isVisible
import com.afollestad.materialdialogs.MaterialDialog
import com.bluelinelabs.conductor.ControllerChangeHandler import com.bluelinelabs.conductor.ControllerChangeHandler
import com.bluelinelabs.conductor.ControllerChangeType import com.bluelinelabs.conductor.ControllerChangeType
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.google.android.material.tabs.TabLayout import com.google.android.material.tabs.TabLayout
import com.jakewharton.rxrelay.BehaviorRelay import com.jakewharton.rxrelay.BehaviorRelay
import com.jakewharton.rxrelay.PublishRelay import com.jakewharton.rxrelay.PublishRelay
@ -140,7 +141,7 @@ class LibraryController(
// --> EH // --> EH
// Sync dialog // Sync dialog
private var favSyncDialog: MaterialDialog? = null private var favSyncDialog: AlertDialog? = null
// Old sync status // Old sync status
private var oldSyncStatus: FavoritesSyncStatus? = null private var oldSyncStatus: FavoritesSyncStatus? = null
@ -750,14 +751,16 @@ class LibraryController(
} }
private fun buildDialog() = activity?.let { private fun buildDialog() = activity?.let {
MaterialDialog(it) MaterialAlertDialogBuilder(it)
} }
private fun showSyncProgressDialog() { private fun showSyncProgressDialog() {
favSyncDialog?.dismiss() favSyncDialog?.dismiss()
favSyncDialog = buildDialog() favSyncDialog = buildDialog()
?.title(R.string.favorites_syncing) ?.setTitle(R.string.favorites_syncing)
?.cancelable(false) ?.setMessage("")
?.setCancelable(false)
?.create()
favSyncDialog?.show() favSyncDialog?.show()
} }
@ -782,16 +785,17 @@ class LibraryController(
favSyncDialog?.dismiss() favSyncDialog?.dismiss()
favSyncDialog = buildDialog() favSyncDialog = buildDialog()
?.title(R.string.favorites_sync_error) ?.setTitle(R.string.favorites_sync_error)
?.message(text = activity!!.getString(R.string.favorites_sync_bad_library_state, status.message)) ?.setMessage(activity!!.getString(R.string.favorites_sync_bad_library_state, status.message))
?.cancelable(false) ?.setCancelable(false)
?.positiveButton(R.string.show_gallery) { ?.setPositiveButton(R.string.show_gallery) { _, _ ->
openManga(status.manga) openManga(status.manga)
presenter.favoritesSync.status.value = FavoritesSyncStatus.Idle(activity!!) presenter.favoritesSync.status.value = FavoritesSyncStatus.Idle(activity!!)
} }
?.negativeButton(android.R.string.ok) { ?.setNegativeButton(android.R.string.ok) { _, _ ->
presenter.favoritesSync.status.value = FavoritesSyncStatus.Idle(activity!!) presenter.favoritesSync.status.value = FavoritesSyncStatus.Idle(activity!!)
} }
?.create()
favSyncDialog?.show() favSyncDialog?.show()
} }
is FavoritesSyncStatus.Error -> { is FavoritesSyncStatus.Error -> {
@ -799,12 +803,13 @@ class LibraryController(
favSyncDialog?.dismiss() favSyncDialog?.dismiss()
favSyncDialog = buildDialog() favSyncDialog = buildDialog()
?.title(R.string.favorites_sync_error) ?.setTitle(R.string.favorites_sync_error)
?.message(text = activity!!.getString(R.string.favorites_sync_error_string, status.message)) ?.setMessage(activity!!.getString(R.string.favorites_sync_error_string, status.message))
?.cancelable(false) ?.setCancelable(false)
?.positiveButton(android.R.string.ok) { ?.setPositiveButton(android.R.string.ok) { _, _ ->
presenter.favoritesSync.status.value = FavoritesSyncStatus.Idle(activity!!) presenter.favoritesSync.status.value = FavoritesSyncStatus.Idle(activity!!)
} }
?.create()
favSyncDialog?.show() favSyncDialog?.show()
} }
is FavoritesSyncStatus.CompleteWithErrors -> { is FavoritesSyncStatus.CompleteWithErrors -> {
@ -812,12 +817,13 @@ class LibraryController(
favSyncDialog?.dismiss() favSyncDialog?.dismiss()
favSyncDialog = buildDialog() favSyncDialog = buildDialog()
?.title(R.string.favorites_sync_done_errors) ?.setTitle(R.string.favorites_sync_done_errors)
?.message(text = activity!!.getString(R.string.favorites_sync_done_errors_message, status.message)) ?.setMessage(activity!!.getString(R.string.favorites_sync_done_errors_message, status.message))
?.cancelable(false) ?.setCancelable(false)
?.positiveButton(android.R.string.ok) { ?.setPositiveButton(android.R.string.ok) { _, _ ->
presenter.favoritesSync.status.value = FavoritesSyncStatus.Idle(activity!!) presenter.favoritesSync.status.value = FavoritesSyncStatus.Idle(activity!!)
} }
?.create()
favSyncDialog?.show() favSyncDialog?.show()
} }
is FavoritesSyncStatus.Processing, is FavoritesSyncStatus.Processing,
@ -833,13 +839,13 @@ class LibraryController(
showSyncProgressDialog() showSyncProgressDialog()
} }
favSyncDialog?.message(text = status.message) favSyncDialog?.setMessage(status.message)
} }
} }
oldSyncStatus = status oldSyncStatus = status
if (status is FavoritesSyncStatus.Processing && status.delayedMessage != null) { if (status is FavoritesSyncStatus.Processing && status.delayedMessage != null) {
delay(5.seconds) 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 activity = activity!!
val view = WhatsNewRecyclerView(activity) val view = WhatsNewRecyclerView(activity)
return MaterialAlertDialogBuilder(activity) return MaterialAlertDialogBuilder(activity)
.setTitle(res = if (BuildConfig.DEBUG /* SY --> */ || syDebugVersion != "0" /* SY <-- */) R.string.notices else R.string.whats_new) .setTitle(if (BuildConfig.DEBUG /* SY --> */ || syDebugVersion != "0" /* SY <-- */) R.string.notices else R.string.whats_new)
.setCustomView(view = view) .setView(view)
.setPositiveButton(android.R.string.cancel, null) .setPositiveButton(android.R.string.cancel, null)
.create()
} }
class WhatsNewRecyclerView(context: Context) : ChangeLogRecyclerView(context) { class WhatsNewRecyclerView(context: Context) : ChangeLogRecyclerView(context) {

View File

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

View File

@ -28,10 +28,9 @@ import androidx.recyclerview.widget.ConcatAdapter
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import coil.loadAny import coil.loadAny
import com.afollestad.materialdialogs.MaterialDialog
import com.afollestad.materialdialogs.list.listItemsSingleChoice
import com.bluelinelabs.conductor.ControllerChangeHandler import com.bluelinelabs.conductor.ControllerChangeHandler
import com.bluelinelabs.conductor.ControllerChangeType import com.bluelinelabs.conductor.ControllerChangeType
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton import com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton
import com.google.android.material.snackbar.Snackbar import com.google.android.material.snackbar.Snackbar
import dev.chrisbanes.insetter.applyInsetter import dev.chrisbanes.insetter.applyInsetter
@ -613,14 +612,17 @@ class MangaController :
val sourceManager: SourceManager = Injekt.get() val sourceManager: SourceManager = Injekt.get()
val mergedManga = presenter.mergedManga.values.filterNot { it.source == MERGED_SOURCE_ID } val mergedManga = presenter.mergedManga.values.filterNot { it.source == MERGED_SOURCE_ID }
val sources = mergedManga.map { sourceManager.getOrStub(it.source) } val sources = mergedManga.map { sourceManager.getOrStub(it.source) }
MaterialDialog(activity!!) MaterialAlertDialogBuilder(activity!!)
.title(R.string.action_open_in_web_view) .setTitle(R.string.action_open_in_web_view)
.listItemsSingleChoice( .setSingleChoiceItems(
items = mergedManga.mapIndexed { index, _ -> sources[index].toString() } mergedManga.mapIndexed { index, _ -> sources[index].toString() }
) { _, index, _ -> .toTypedArray(),
-1
) { dialog, index ->
dialog.dismiss()
openMangaInWebView(mergedManga[index], sources[index] as? HttpSource) openMangaInWebView(mergedManga[index], sources[index] as? HttpSource)
} }
.negativeButton(android.R.string.cancel) .setNegativeButton(android.R.string.cancel, null)
.show() .show()
} }
// SY <-- // SY <--
@ -773,14 +775,16 @@ class MangaController :
fun openRecommends() { fun openRecommends() {
val source = presenter.source.getMainSource() val source = presenter.source.getMainSource()
if (source.isMdBasedSource()) { if (source.isMdBasedSource()) {
MaterialDialog(activity!!) MaterialAlertDialogBuilder(activity!!)
.title(R.string.az_recommends) .setTitle(R.string.az_recommends)
.listItemsSingleChoice( .setSingleChoiceItems(
items = listOf( arrayOf(
"MangaDex similar", "MangaDex similar",
"Community recommendations" "Community recommendations"
) ),
) { _, index, _ -> -1
) { dialog, index ->
dialog.dismiss()
when (index) { when (index) {
0 -> router.pushController(MangaDexSimilarController(presenter.manga, source as CatalogueSource).withFadeTransaction()) 0 -> router.pushController(MangaDexSimilarController(presenter.manga, source as CatalogueSource).withFadeTransaction())
1 -> router.pushController(RecommendsController(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.util.AttributeSet
import android.view.View import android.view.View
import androidx.core.view.isVisible import androidx.core.view.isVisible
import com.afollestad.materialdialogs.MaterialDialog
import com.afollestad.materialdialogs.list.listItemsMultiChoice
import com.bluelinelabs.conductor.Router import com.bluelinelabs.conductor.Router
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.database.models.Manga import eu.kanade.tachiyomi.data.database.models.Manga
import eu.kanade.tachiyomi.ui.manga.MangaPresenter import eu.kanade.tachiyomi.ui.manga.MangaPresenter
@ -110,26 +109,27 @@ class ChaptersSettingsSheet(
override fun onItemClicked(item: Item) { override fun onItemClicked(item: Item) {
if (item is Item.DrawableSelection) { if (item is Item.DrawableSelection) {
val scanlators = presenter.allChapterScanlators.toList() val scanlators = presenter.allChapterScanlators.toTypedArray()
val filteredScanlators = presenter.manga.filtered_scanlators?.let { MdUtil.getScanlators(it) } val filteredScanlators = presenter.manga.filtered_scanlators?.let { MdUtil.getScanlators(it) } ?: scanlators.toSet()
val preselected = if (filteredScanlators.isNullOrEmpty()) { val selection = scanlators.map {
scanlators.mapIndexed { index, _ -> index } it in filteredScanlators
} else { }.toBooleanArray()
filteredScanlators.map { scanlators.indexOf(it) }
}.toIntArray()
MaterialDialog(context) MaterialAlertDialogBuilder(context)
.title(R.string.select_scanlators) .setTitle(R.string.select_scanlators)
.listItemsMultiChoice(items = presenter.allChapterScanlators.toList(), initialSelection = preselected) { _, selections, _ -> .setMultiChoiceItems(scanlators, selection) { _, which, selected ->
selection[which] = selected
}
.setPositiveButton(android.R.string.ok) { _, _ ->
launchIO { launchIO {
supervisorScope { supervisorScope {
val selected = selections.map { scanlators[it] }.toSet() val selected = scanlators.filterIndexed { index, s -> selection[index] }.toSet()
presenter.setScanlatorFilter(selected) presenter.setScanlatorFilter(selected)
withUIContext { onGroupClicked(this@FilterGroup) } withUIContext { onGroupClicked(this@FilterGroup) }
} }
} }
} }
.negativeButton(R.string.action_reset) { .setNegativeButton(R.string.action_reset) { _, _ ->
launchIO { launchIO {
supervisorScope { supervisorScope {
presenter.setScanlatorFilter(presenter.allChapterScanlators) presenter.setScanlatorFilter(presenter.allChapterScanlators)
@ -137,7 +137,6 @@ class ChaptersSettingsSheet(
} }
} }
} }
.positiveButton(android.R.string.ok)
.show() .show()
return return
} }

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -4,15 +4,15 @@ import android.app.Activity
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
import android.text.InputType import android.text.InputType
import android.view.LayoutInflater
import android.view.inputmethod.InputMethodManager
import android.widget.TextView
import android.widget.Toast import android.widget.Toast
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import androidx.core.content.getSystemService
import androidx.core.widget.doAfterTextChanged
import androidx.preference.PreferenceScreen import androidx.preference.PreferenceScreen
import com.afollestad.materialdialogs.MaterialDialog import com.google.android.material.dialog.MaterialAlertDialogBuilder
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.tfcporciuncula.flow.Preference import com.tfcporciuncula.flow.Preference
import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.database.DatabaseHelper 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.PreferenceKeys
import eu.kanade.tachiyomi.data.preference.UNMETERED_NETWORK import eu.kanade.tachiyomi.data.preference.UNMETERED_NETWORK
import eu.kanade.tachiyomi.data.preference.asImmediateFlow import eu.kanade.tachiyomi.data.preference.asImmediateFlow
import eu.kanade.tachiyomi.databinding.EhDialogCategoriesBinding import eu.kanade.tachiyomi.databinding.DialogStubTextinputBinding
import eu.kanade.tachiyomi.databinding.EhDialogLanguagesBinding 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.ui.webview.WebViewActivity
import eu.kanade.tachiyomi.util.preference.defaultValue import eu.kanade.tachiyomi.util.preference.defaultValue
import eu.kanade.tachiyomi.util.preference.entriesRes import eu.kanade.tachiyomi.util.preference.entriesRes
@ -42,6 +43,7 @@ import exh.eh.EHentaiUpdateWorkerConstants
import exh.eh.EHentaiUpdaterStats import exh.eh.EHentaiUpdaterStats
import exh.favorites.FavoritesIntroDialog import exh.favorites.FavoritesIntroDialog
import exh.favorites.LocalFavoritesStorage import exh.favorites.LocalFavoritesStorage
import exh.log.xLogD
import exh.metadata.metadata.EHentaiSearchMetadata import exh.metadata.metadata.EHentaiSearchMetadata
import exh.metadata.metadata.base.getFlatMetadataForManga import exh.metadata.metadata.base.getFlatMetadataForManga
import exh.source.isEhBasedManga import exh.source.isEhBasedManga
@ -73,7 +75,7 @@ import kotlin.time.Duration
class SettingsEhController : SettingsController() { class SettingsEhController : SettingsController() {
private val db: DatabaseHelper by injectLazy() private val db: DatabaseHelper by injectLazy()
private fun Preference<*>.reconfigure(): Boolean { fun Preference<*>.reconfigure(): Boolean {
// Listen for change commit // Listen for change commit
asFlow() asFlow()
.take(1) // Only listen for first commit .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()) summary = context.getString(R.string.tag_filtering_threshhold_summary, preferences.ehTagFilterValue().get())
onClick { onClick {
MaterialDialog(activity!!) var value: Int? = preferences.ehTagFilterValue().get()
.title(R.string.tag_filtering_threshold) MaterialAlertDialogBuilder(activity!!)
.input( .setTitle(R.string.tag_filtering_threshold)
inputType = InputType.TYPE_NUMBER_FLAG_SIGNED, .let { builder ->
waitForPositiveButton = false, val binding = DialogStubTextinputBinding.inflate(LayoutInflater.from(builder.context))
allowEmpty = false binding.textField.editText?.apply {
) { dialog, number -> inputType = InputType.TYPE_NUMBER_FLAG_SIGNED
val inputField = dialog.getInputField() setText(value.toString(), TextView.BufferType.EDITABLE)
val value = number.toString().toIntOrNull() doAfterTextChanged {
value = it?.toString()?.toIntOrNull()
if ((value != null && value in -9999..0) || number.toString() == "-") { this@SettingsEhController.xLogD(value)
inputField.error = null error = if (value in -9999..0 || it.toString() == "-") {
} else { null
inputField.error = context.getString(R.string.tag_filtering_threshhold_error) } 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) { .setPositiveButton(android.R.string.ok) { _, _ ->
val value = it.getInputField().text.toString().toInt() preferences.ehTagFilterValue().set(value ?: return@setPositiveButton)
preferences.ehTagFilterValue().set(value)
summary = context.getString(R.string.tag_filtering_threshhold_summary, preferences.ehTagFilterValue().get()) summary = context.getString(R.string.tag_filtering_threshhold_summary, preferences.ehTagFilterValue().get())
preferences.ehTagFilterValue().reconfigure() preferences.ehTagFilterValue().reconfigure()
} }
.negativeButton(android.R.string.cancel) .setNegativeButton(android.R.string.cancel, null)
.show() .show()
} }
@ -225,31 +233,37 @@ class SettingsEhController : SettingsController() {
summary = context.getString(R.string.tag_watching_threshhold_summary, preferences.ehTagWatchingValue().get()) summary = context.getString(R.string.tag_watching_threshhold_summary, preferences.ehTagWatchingValue().get())
onClick { onClick {
MaterialDialog(activity!!) var value: Int? = preferences.ehTagWatchingValue().get()
.title(R.string.tag_watching_threshhold) MaterialAlertDialogBuilder(activity!!)
.input( .setTitle(R.string.tag_watching_threshhold)
inputType = InputType.TYPE_NUMBER_FLAG_SIGNED, .let { builder ->
maxLength = 4, val binding = DialogStubTextinputBinding.inflate(LayoutInflater.from(builder.context))
waitForPositiveButton = false, binding.textField.editText?.apply {
allowEmpty = false inputType = InputType.TYPE_NUMBER_FLAG_SIGNED
) { dialog, number ->
val inputField = dialog.getInputField()
val value = number.toString().toIntOrNull()
if (value != null && value in 0..9999) { setText(value.toString(), TextView.BufferType.EDITABLE)
inputField.error = null doAfterTextChanged {
} else { value = it?.toString()?.toIntOrNull()
inputField.error = context.getString(R.string.tag_watching_threshhold_error)
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) { .setPositiveButton(android.R.string.ok) { _, _ ->
val value = it.getInputField().text.toString().toInt() preferences.ehTagWatchingValue().set(value ?: return@setPositiveButton)
preferences.ehTagWatchingValue().set(value)
summary = context.getString(R.string.tag_watching_threshhold_summary, preferences.ehTagWatchingValue().get()) summary = context.getString(R.string.tag_watching_threshhold_summary, preferences.ehTagWatchingValue().get())
preferences.ehTagWatchingValue().reconfigure() preferences.ehTagWatchingValue().reconfigure()
} }
.negativeButton(android.R.string.cancel) .setNegativeButton(android.R.string.cancel, null)
.show() .show()
} }
@ -258,143 +272,14 @@ class SettingsEhController : SettingsController() {
} }
preference { preference {
key = "pref_language_filtering" key = PreferenceKeys.eh_settings_languages
titleRes = R.string.language_filtering titleRes = R.string.language_filtering
summaryRes = R.string.language_filtering_summary summaryRes = R.string.language_filtering_summary
onClick { onClick {
MaterialDialog(activity!!) val dialog = LanguagesDialog()
.title(R.string.language_filtering) dialog.targetController = this@SettingsEhController
.message(R.string.language_filtering_summary) dialog.showDialog(router)
.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]
}
}
} }
preferences.enableExhentai().asImmediateFlow { isVisible = it } preferences.enableExhentai().asImmediateFlow { isVisible = it }
@ -402,56 +287,14 @@ class SettingsEhController : SettingsController() {
} }
preference { preference {
key = "pref_front_page_categories" key = PreferenceKeys.eh_enabled_categories
titleRes = R.string.frong_page_categories titleRes = R.string.frong_page_categories
summaryRes = R.string.fromt_page_categories_summary summaryRes = R.string.fromt_page_categories_summary
onClick { onClick {
MaterialDialog(activity!!) val dialog = FrontPageCategoriesDialog()
.title(R.string.frong_page_categories) dialog.targetController = this@SettingsEhController
.message(R.string.fromt_page_categories_summary) dialog.showDialog(router)
.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]
}
}
} }
preferences.enableExhentai().asImmediateFlow { isVisible = it } preferences.enableExhentai().asImmediateFlow { isVisible = it }
@ -540,10 +383,10 @@ class SettingsEhController : SettingsController() {
onClick { onClick {
activity?.let { activity -> activity?.let { activity ->
MaterialDialog(activity) MaterialAlertDialogBuilder(activity)
.title(R.string.favorites_sync_reset) .setTitle(R.string.favorites_sync_reset)
.message(R.string.favorites_sync_reset_message) .setMessage(R.string.favorites_sync_reset_message)
.positiveButton(android.R.string.ok) { .setPositiveButton(android.R.string.ok) { _, _ ->
LocalFavoritesStorage().apply { LocalFavoritesStorage().apply {
getRealm().use { getRealm().use {
it.trans { it.trans {
@ -553,8 +396,8 @@ class SettingsEhController : SettingsController() {
} }
activity.toast(context.getString(R.string.sync_state_reset), Toast.LENGTH_LONG) activity.toast(context.getString(R.string.sync_state_reset), Toast.LENGTH_LONG)
} }
.negativeButton(android.R.string.cancel) .setNegativeButton(android.R.string.cancel, null)
.cancelable(false) .setCancelable(false)
.show() .show()
} }
} }
@ -642,9 +485,10 @@ class SettingsEhController : SettingsController() {
titleRes = R.string.show_updater_statistics titleRes = R.string.show_updater_statistics
onClick { onClick {
val progress = MaterialDialog(context) val progress = MaterialAlertDialogBuilder(context)
.message(R.string.gallery_updater_statistics_collection) .setMessage(R.string.gallery_updater_statistics_collection)
.cancelable(false) .setCancelable(false)
.create()
progress.show() progress.show()
viewScope.launch(Dispatchers.IO) { viewScope.launch(Dispatchers.IO) {
@ -688,10 +532,10 @@ class SettingsEhController : SettingsController() {
} }
withContext(Dispatchers.Main) { withContext(Dispatchers.Main) {
MaterialDialog(context) MaterialAlertDialogBuilder(context)
.title(R.string.gallery_updater_statistics) .setTitle(R.string.gallery_updater_statistics)
.message(text = updateInfo) .setMessage(updateInfo)
.positiveButton(android.R.string.ok) .setPositiveButton(android.R.string.ok, null)
.show() .show()
} }
} }

View File

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

View File

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

View File

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

View File

@ -1,2 +1,93 @@
package eu.kanade.tachiyomi.ui.setting.eh 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 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 android.util.Log
import androidx.core.text.HtmlCompat import androidx.core.text.HtmlCompat
import androidx.preference.PreferenceScreen 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.ui.setting.SettingsController
import eu.kanade.tachiyomi.util.preference.defaultValue import eu.kanade.tachiyomi.util.preference.defaultValue
import eu.kanade.tachiyomi.util.preference.onClick import eu.kanade.tachiyomi.util.preference.onClick
@ -36,23 +36,13 @@ class SettingsDebugController : SettingsController() {
try { try {
val result = it.call(DebugFunctions) val result = it.call(DebugFunctions)
val text = "Function returned result:\n\n$result" val text = "Function returned result:\n\n$result"
MaterialDialog(context) MaterialAlertDialogBuilder(context)
.title(text = title.toString()) .setTitle(title.toString())
.message(text = text) { .setMessage(text)
messageTextView.apply {
setHorizontallyScrolling(true)
setTextIsSelectable(true)
}
}
} catch (t: Throwable) { } catch (t: Throwable) {
val text = "Function threw exception:\n\n${Log.getStackTraceString(t)}" val text = "Function threw exception:\n\n${Log.getStackTraceString(t)}"
MaterialDialog(context) MaterialAlertDialogBuilder(context)
.message(text = text) { .setMessage(text)
messageTextView.apply {
setHorizontallyScrolling(true)
setTextIsSelectable(true)
}
}
}.show() }.show()
} }
} }

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -3,7 +3,7 @@ package exh.widget.preference
import android.app.Dialog import android.app.Dialog
import android.os.Bundle import android.os.Bundle
import androidx.core.os.bundleOf 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.R
import eu.kanade.tachiyomi.data.track.TrackManager import eu.kanade.tachiyomi.data.track.TrackManager
import eu.kanade.tachiyomi.source.Source import eu.kanade.tachiyomi.source.Source
@ -34,9 +34,9 @@ class MangadexLogoutDialog(bundle: Bundle? = null) : DialogController(bundle) {
) )
override fun onCreateDialog(savedViewState: Bundle?): Dialog { override fun onCreateDialog(savedViewState: Bundle?): Dialog {
return MaterialDialog(activity!!) return MaterialAlertDialogBuilder(activity!!)
.title(R.string.logout) .setTitle(R.string.logout)
.positiveButton(R.string.logout) { .setPositiveButton(R.string.logout) { _, _ ->
launchNow { launchNow {
supervisorScope { supervisorScope {
if (source != null) { 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 { interface Listener {

View File

@ -221,7 +221,7 @@
</plurals> </plurals>
<string name="biometric_lock_start_time">Enter starting time</string> <string name="biometric_lock_start_time">Enter starting time</string>
<string name="biometric_lock_end_time">Enter end 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_invalid_time_selected">Invalid time selected</string>
<string name="biometric_lock_days">Biometric lock days</string> <string name="biometric_lock_days">Biometric lock days</string>
<string name="biometric_lock_days_summary">Days to have the app locked</string> <string name="biometric_lock_days_summary">Days to have the app locked</string>