From cf54851342214d234ea8c7d7b8262551c21038fa Mon Sep 17 00:00:00 2001 From: Jobobby04 Date: Sun, 18 Jul 2021 20:17:58 -0400 Subject: [PATCH] Replace material-dialogs with Material Components' SY --- .../browse/migration/MigrationMangaDialog.kt | 11 +- .../process/MigrationListController.kt | 12 +- .../ui/browse/source/SourceController.kt | 17 +- .../source/browse/BrowseSourceController.kt | 46 ++- .../ui/browse/source/index/IndexController.kt | 10 +- .../biometric/BiometricTimesController.kt | 30 +- .../biometric/BiometricTimesCreateDialog.kt | 73 ---- .../ui/category/genre/SortTagController.kt | 10 +- .../ui/category/genre/SortTagCreateDialog.kt | 19 +- .../ui/category/repos/RepoCreateDialog.kt | 21 +- .../sources/ChangeSourceCategoriesDialog.kt | 37 +- .../sources/SourceCategoryCreateDialog.kt | 19 +- .../sources/SourceCategoryRenameDialog.kt | 19 +- .../tachiyomi/ui/library/LibraryController.kt | 46 +-- .../ui/main/WhatsNewDialogController.kt | 5 +- .../tachiyomi/ui/manga/EditMangaDialog.kt | 35 +- .../tachiyomi/ui/manga/MangaController.kt | 32 +- .../ui/manga/chapter/ChaptersSettingsSheet.kt | 29 +- .../manga/merged/EditMergedSettingsDialog.kt | 48 +-- .../tachiyomi/ui/reader/ReaderActivity.kt | 26 +- .../ui/reader/chapter/ReaderChapterDialog.kt | 49 +-- .../ui/setting/SettingsAdvancedController.kt | 38 ++- .../ui/setting/SettingsDownloadController.kt | 40 ++- .../ui/setting/SettingsEhController.kt | 322 +++++------------- .../ui/setting/SettingsMangaDexController.kt | 35 +- .../ui/setting/SettingsReaderController.kt | 36 +- .../ui/setting/SettingsSecurityController.kt | 55 +-- .../setting/eh/FrontPageCategoriesDialog.kt | 91 +++++ .../ui/setting/eh/LanguagesDialog.kt | 183 +++++++++- .../java/exh/debug/SettingsDebugController.kt | 22 +- .../exh/favorites/FavoritesIntroDialog.kt | 12 +- .../uconfig/ConfiguringDialogController.kt | 22 +- .../uconfig/WarnConfigureDialogController.kt | 13 +- .../exh/ui/batchadd/BatchAddController.kt | 12 +- .../exh/ui/captcha/BrowserActionActivity.kt | 12 +- .../exh/ui/intercept/InterceptActivity.kt | 26 +- .../main/java/exh/ui/login/EhLoginActivity.kt | 18 +- .../widget/preference/MangadexLoginDialog.kt | 11 +- .../widget/preference/MangadexLogoutDialog.kt | 11 +- app/src/main/res/values/strings_sy.xml | 2 +- 40 files changed, 822 insertions(+), 733 deletions(-) delete mode 100644 app/src/main/java/eu/kanade/tachiyomi/ui/category/biometric/BiometricTimesCreateDialog.kt diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/MigrationMangaDialog.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/MigrationMangaDialog.kt index 756bb9bb7..51ebebe8c 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/MigrationMangaDialog.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/MigrationMangaDialog.kt @@ -2,8 +2,8 @@ package eu.kanade.tachiyomi.ui.browse.migration import android.app.Dialog import android.os.Bundle -import com.afollestad.materialdialogs.MaterialDialog import com.bluelinelabs.conductor.Controller +import com.google.android.material.dialog.MaterialAlertDialogBuilder import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.ui.base.controller.DialogController import eu.kanade.tachiyomi.ui.browse.migration.advanced.process.MigrationListController @@ -32,15 +32,16 @@ class MigrationMangaDialog(bundle: Bundle? = null) : DialogController(bundle) else "" ) ).orEmpty() - return MaterialDialog(activity!!) - .message(text = confirmString) - .positiveButton(if (copy) R.string.copy else R.string.migrate) { + return MaterialAlertDialogBuilder(activity!!) + .setMessage(confirmString) + .setPositiveButton(if (copy) R.string.copy else R.string.migrate) { _, _ -> if (copy) { (targetController as? MigrationListController)?.copyMangas() } else { (targetController as? MigrationListController)?.migrateMangas() } } - .negativeButton(android.R.string.cancel) + .setNegativeButton(android.R.string.cancel, null) + .create() } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/advanced/process/MigrationListController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/advanced/process/MigrationListController.kt index 21b17c0c4..373922c15 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/advanced/process/MigrationListController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/advanced/process/MigrationListController.kt @@ -13,8 +13,8 @@ import androidx.core.graphics.ColorUtils import androidx.core.os.bundleOf import androidx.recyclerview.widget.LinearLayoutManager import androidx.vectordrawable.graphics.drawable.VectorDrawableCompat -import com.afollestad.materialdialogs.MaterialDialog import com.bluelinelabs.conductor.changehandler.FadeChangeHandler +import com.google.android.material.dialog.MaterialAlertDialogBuilder import dev.chrisbanes.insetter.applyInsetter import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.data.database.DatabaseHelper @@ -430,14 +430,14 @@ class MigrationListController(bundle: Bundle? = null) : override fun handleBack(): Boolean { activity?.let { - MaterialDialog(it).show { - title(R.string.stop_migrating) - positiveButton(R.string.action_stop) { + MaterialAlertDialogBuilder(it) + .setTitle(R.string.stop_migrating) + .setPositiveButton(R.string.action_stop) { _, _ -> router.popCurrentController() migrationsJob?.cancel() } - negativeButton(android.R.string.cancel) - } + .setNegativeButton(android.R.string.cancel, null) + .show() } return true } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/SourceController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/SourceController.kt index ee1ffd24c..43a39dc85 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/SourceController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/SourceController.kt @@ -234,7 +234,8 @@ class SourceController(bundle: Bundle? = null) : } private fun addToCategories(source: Source) { - val categories = preferences.sourcesTabCategories().get().toList().sortedBy { it.lowercase() } + val categories = preferences.sourcesTabCategories().get().sortedBy { it.lowercase() } + .toTypedArray() if (categories.isEmpty()) { applicationContext?.toast(R.string.no_source_categories) @@ -245,16 +246,18 @@ class SourceController(bundle: Bundle? = null) : val sources = preferenceSources.map { it.split("|")[0] } if (source.id.toString() in sources) { - val preferenceSourcePairs = preferenceSources.map { it.split("|") }.filter { it[0] == source.id.toString() }.map { it[0] to it[1] }.toMutableList() + val sourceCategories = preferenceSources + .map { item -> item.split("|").let { it.component1() to it.component2() } } + .filter { it.first == source.id.toString() } + .map { it.second } - val preselected = preferenceSourcePairs.map { category -> - categories.indexOf(category.second) - }.toTypedArray() + val selection = categories.map { it in sourceCategories } + .toBooleanArray() - ChangeSourceCategoriesDialog(this, source, categories, preselected) + ChangeSourceCategoriesDialog(this, source, categories, selection) .showDialog(router) } else { - ChangeSourceCategoriesDialog(this, source, categories, emptyArray()) + ChangeSourceCategoriesDialog(this, source, categories, categories.map { false }.toBooleanArray()) .showDialog(router) } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/BrowseSourceController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/BrowseSourceController.kt index 3dd2ff80d..1877dc646 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/BrowseSourceController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/BrowseSourceController.kt @@ -54,6 +54,7 @@ import eu.kanade.tachiyomi.util.view.shrinkOnScroll import eu.kanade.tachiyomi.util.view.snack import eu.kanade.tachiyomi.widget.AutofitRecyclerView import eu.kanade.tachiyomi.widget.EmptyView +import eu.kanade.tachiyomi.widget.materialdialogs.setTextInput import exh.log.xLogW import exh.savedsearches.EXHSavedSearch import exh.source.getMainSource @@ -205,15 +206,19 @@ open class BrowseSourceController(bundle: Bundle) : // EXH --> onSaveClicked = { filterSheet?.context?.let { - MaterialDialog(it) - .title(R.string.save_search) - .input(hintRes = R.string.save_search_hint) { _, searchName -> + var searchName = "" + MaterialAlertDialogBuilder(it) + .setTitle(R.string.save_search) + .setTextInput(hint = it.getString(R.string.save_search_hint)) { input -> + searchName = input + } + .setPositiveButton(R.string.action_save) { _, _ -> val oldSavedSearches = presenter.loadSearches() if (searchName.isNotBlank() && oldSavedSearches.size < MAX_SAVED_SEARCHES ) { val newSearches = oldSavedSearches + EXHSavedSearch( - searchName.toString().trim(), + searchName.trim(), presenter.query, presenter.sourceFilters ) @@ -221,10 +226,7 @@ open class BrowseSourceController(bundle: Bundle) : filterSheet?.setSavedSearches(newSearches) } } - .positiveButton(R.string.action_save) - .negativeButton(R.string.action_cancel) - .cancelable(true) - .cancelOnTouchOutside(true) + .setNegativeButton(R.string.action_cancel, null) .show() } }, @@ -235,11 +237,9 @@ open class BrowseSourceController(bundle: Bundle) : if (search == null) { filterSheet?.context?.let { - MaterialDialog(it) - .title(R.string.save_search_failed_to_load) - .message(R.string.save_search_failed_to_load_message) - .cancelable(true) - .cancelOnTouchOutside(true) + MaterialAlertDialogBuilder(it) + .setTitle(R.string.save_search_failed_to_load) + .setMessage(R.string.save_search_failed_to_load_message) .show() } return@cb @@ -267,30 +267,26 @@ open class BrowseSourceController(bundle: Bundle) : if (search == null || search.name != name) { filterSheet?.context?.let { - MaterialDialog(it) - .title(R.string.save_search_failed_to_delete) - .message(R.string.save_search_failed_to_delete_message) - .cancelable(true) - .cancelOnTouchOutside(true) + MaterialAlertDialogBuilder(it) + .setTitle(R.string.save_search_failed_to_delete) + .setMessage(R.string.save_search_failed_to_delete_message) .show() } return@cb } filterSheet?.context?.let { - MaterialDialog(it) - .title(R.string.save_search_delete) - .message(text = it.getString(R.string.save_search_delete_message, search.name)) - .positiveButton(R.string.action_cancel) - .negativeButton(android.R.string.ok) { + MaterialAlertDialogBuilder(it) + .setTitle(R.string.save_search_delete) + .setMessage(it.getString(R.string.save_search_delete_message, search.name)) + .setPositiveButton(R.string.action_cancel, null) + .setNegativeButton(android.R.string.ok) { _, _ -> val newSearches = savedSearches.filterIndexed { index, _ -> index != indexToDelete } presenter.saveSearches(newSearches) filterSheet?.setSavedSearches(newSearches) } - .cancelable(true) - .cancelOnTouchOutside(true) .show() } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/index/IndexController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/index/IndexController.kt index d2e47b1b3..801b94a08 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/index/IndexController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/index/IndexController.kt @@ -8,7 +8,7 @@ import android.view.View import androidx.core.os.bundleOf import androidx.core.view.isVisible import androidx.recyclerview.widget.LinearLayoutManager -import com.afollestad.materialdialogs.MaterialDialog +import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.data.database.models.Manga @@ -216,11 +216,9 @@ open class IndexController : if (search == null) { filterSheet?.context?.let { - MaterialDialog(it) - .title(R.string.save_search_failed_to_load) - .message(R.string.save_search_failed_to_load_message) - .cancelable(true) - .cancelOnTouchOutside(true) + MaterialAlertDialogBuilder(it) + .setTitle(R.string.save_search_failed_to_load) + .setMessage(R.string.save_search_failed_to_load_message) .show() } return@cb diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/category/biometric/BiometricTimesController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/category/biometric/BiometricTimesController.kt index 76c711a39..390b4133a 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/category/biometric/BiometricTimesController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/category/biometric/BiometricTimesController.kt @@ -10,6 +10,7 @@ import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton import com.google.android.material.snackbar.Snackbar +import com.google.android.material.timepicker.MaterialTimePicker import dev.chrisbanes.insetter.applyInsetter import eu.davidea.flexibleadapter.FlexibleAdapter import eu.davidea.flexibleadapter.SelectableAdapter @@ -21,6 +22,8 @@ import eu.kanade.tachiyomi.ui.base.controller.NucleusController import eu.kanade.tachiyomi.ui.main.MainActivity import eu.kanade.tachiyomi.util.system.toast import eu.kanade.tachiyomi.util.view.shrinkOnScroll +import exh.util.hours +import exh.util.minutes import kotlin.time.Duration import kotlin.time.ExperimentalTime @@ -34,7 +37,6 @@ class BiometricTimesController : ActionMode.Callback, FlexibleAdapter.OnItemClickListener, FlexibleAdapter.OnItemLongClickListener, - BiometricTimesCreateDialog.Listener, UndoHelper.OnActionListener { /** @@ -97,7 +99,7 @@ class BiometricTimesController : fab.setText(R.string.action_add) fab.setIconResource(R.drawable.ic_add_24dp) fab.setOnClickListener { - BiometricTimesCreateDialog(this@BiometricTimesController).showDialog(router, null) + showTimePicker() } } @@ -298,15 +300,19 @@ class BiometricTimesController : activity?.toast(R.string.biometric_lock_time_conflicts) } - override fun startNextDialog(startTime: Duration?) { - if (startTime != null) { - BiometricTimesCreateDialog(this@BiometricTimesController, startTime).showDialog(router, null) - } else activity?.toast(R.string.biometric_lock_invalid_time_selected) - } - - override fun createTimeRange(startTime: Duration?, endTime: Duration?) { - if (startTime != null && endTime != null) { - presenter.createTimeRange(TimeRange(startTime, endTime)) - } else activity?.toast(R.string.biometric_lock_invalid_time_selected) + fun showTimePicker(startTime: Duration? = null) { + val picker = MaterialTimePicker.Builder() + .setTitleText(if (startTime == null) R.string.biometric_lock_start_time else R.string.biometric_lock_end_time) + .setInputMode(MaterialTimePicker.INPUT_MODE_CLOCK) + .build() + picker.addOnPositiveButtonClickListener { + val timeRange = picker.hour.hours + picker.minute.minutes + if (startTime != null) { + presenter.createTimeRange(TimeRange(startTime, timeRange)) + } else { + showTimePicker(timeRange) + } + } + picker.show((activity as MainActivity).supportFragmentManager, null) } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/category/biometric/BiometricTimesCreateDialog.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/category/biometric/BiometricTimesCreateDialog.kt deleted file mode 100644 index c92bb98c5..000000000 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/category/biometric/BiometricTimesCreateDialog.kt +++ /dev/null @@ -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(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?) - } -} diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/category/genre/SortTagController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/category/genre/SortTagController.kt index 8efa21482..e8ba8da7f 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/category/genre/SortTagController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/category/genre/SortTagController.kt @@ -9,7 +9,7 @@ import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.view.ActionMode import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView -import com.afollestad.materialdialogs.MaterialDialog +import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton import com.google.android.material.snackbar.Snackbar import dev.chrisbanes.insetter.applyInsetter @@ -230,10 +230,10 @@ class SortTagController : } private fun helpDialog(hasPositive: Boolean = false) { - MaterialDialog(activity!!) - .title(R.string.add_tag) - .message(R.string.action_add_tags_message) - .positiveButton(android.R.string.ok) { + MaterialAlertDialogBuilder(activity!!) + .setTitle(R.string.add_tag) + .setMessage(R.string.action_add_tags_message) + .setPositiveButton(android.R.string.ok) { _, _ -> if (hasPositive) { SortTagCreateDialog(this@SortTagController).showDialog(router, null) } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/category/genre/SortTagCreateDialog.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/category/genre/SortTagCreateDialog.kt index e501ed296..be02cdc36 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/category/genre/SortTagCreateDialog.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/category/genre/SortTagCreateDialog.kt @@ -2,11 +2,11 @@ package eu.kanade.tachiyomi.ui.category.genre import android.app.Dialog import android.os.Bundle -import com.afollestad.materialdialogs.MaterialDialog -import com.afollestad.materialdialogs.input.input import com.bluelinelabs.conductor.Controller +import com.google.android.material.dialog.MaterialAlertDialogBuilder import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.ui.base.controller.DialogController +import eu.kanade.tachiyomi.widget.materialdialogs.setTextInput /** * Dialog to create a new category for the library. @@ -30,18 +30,19 @@ class SortTagCreateDialog(bundle: Bundle? = null) : DialogController(bundle) * @return a new dialog instance. */ override fun onCreateDialog(savedViewState: Bundle?): Dialog { - return MaterialDialog(activity!!) - .title(R.string.action_add_category) - .negativeButton(android.R.string.cancel) - .input( + return MaterialAlertDialogBuilder(activity!!) + .setTitle(R.string.action_add_category) + .setTextInput( hint = resources?.getString(R.string.name), prefill = currentName - ) { _, input -> - currentName = input.toString() + ) { input -> + currentName = input } - .positiveButton(android.R.string.ok) { + .setPositiveButton(android.R.string.ok) { _, _ -> (targetController as? Listener)?.createCategory(currentName) } + .setNegativeButton(android.R.string.cancel, null) + .create() } interface Listener { diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/category/repos/RepoCreateDialog.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/category/repos/RepoCreateDialog.kt index 1f2c4a5f0..59dc1e72f 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/category/repos/RepoCreateDialog.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/category/repos/RepoCreateDialog.kt @@ -2,11 +2,11 @@ package eu.kanade.tachiyomi.ui.category.repos import android.app.Dialog import android.os.Bundle -import com.afollestad.materialdialogs.MaterialDialog -import com.afollestad.materialdialogs.input.input import com.bluelinelabs.conductor.Controller +import com.google.android.material.dialog.MaterialAlertDialogBuilder import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.ui.base.controller.DialogController +import eu.kanade.tachiyomi.widget.materialdialogs.setTextInput /** * Dialog to create a new repo for the library. @@ -30,19 +30,20 @@ class RepoCreateDialog(bundle: Bundle? = null) : DialogController(bundle) * @return a new dialog instance. */ override fun onCreateDialog(savedViewState: Bundle?): Dialog { - return MaterialDialog(activity!!) - .title(R.string.action_add_repo) - .message(R.string.action_add_repo_message) - .negativeButton(android.R.string.cancel) - .input( + return MaterialAlertDialogBuilder(activity!!) + .setTitle(R.string.action_add_repo) + .setMessage(R.string.action_add_repo_message) + .setTextInput( hint = resources?.getString(R.string.name), prefill = currentName - ) { _, input -> - currentName = input.toString() + ) { input -> + currentName = input } - .positiveButton(android.R.string.ok) { + .setPositiveButton(android.R.string.ok) { _, _ -> (targetController as? Listener)?.createRepo(currentName) } + .setNegativeButton(android.R.string.cancel, null) + .create() } interface Listener { diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/category/sources/ChangeSourceCategoriesDialog.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/category/sources/ChangeSourceCategoriesDialog.kt index 8359c049e..1955df644 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/category/sources/ChangeSourceCategoriesDialog.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/category/sources/ChangeSourceCategoriesDialog.kt @@ -2,9 +2,8 @@ package eu.kanade.tachiyomi.ui.category.sources import android.app.Dialog import android.os.Bundle -import com.afollestad.materialdialogs.MaterialDialog -import com.afollestad.materialdialogs.list.listItemsMultiChoice import com.bluelinelabs.conductor.Controller +import com.google.android.material.dialog.MaterialAlertDialogBuilder import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.source.Source import eu.kanade.tachiyomi.ui.base.controller.DialogController @@ -14,35 +13,39 @@ class ChangeSourceCategoriesDialog(bundle: Bundle? = null) : private var source: Source? = null - private var categories = emptyList() + private var categories = emptyArray() - private var preselected = emptyArray() + private var selection = booleanArrayOf() constructor( target: T, source: Source, - categories: List, - preselected: Array + categories: Array, + selection: BooleanArray ) : this() { this.source = source this.categories = categories - this.preselected = preselected + this.selection = selection targetController = target } override fun onCreateDialog(savedViewState: Bundle?): Dialog { - return MaterialDialog(activity!!) - .title(R.string.action_move_category) - .listItemsMultiChoice( - items = categories, - initialSelection = preselected.toIntArray(), - allowEmptySelection = true - ) { _, selections, _ -> - val newCategories = selections.map { categories[it] } + return MaterialAlertDialogBuilder(activity!!) + .setTitle(R.string.action_move_category) + .setMultiChoiceItems( + categories, + selection + ) { _, which, selected -> + selection[which] = selected + } + .setPositiveButton(android.R.string.ok) { _, _ -> + val newCategories = categories.filterIndexed { index, s -> + selection[index] + } (targetController as? Listener)?.updateCategoriesForSource(source!!, newCategories) } - .positiveButton(android.R.string.ok) - .negativeButton(android.R.string.cancel) + .setNegativeButton(android.R.string.cancel, null) + .create() } interface Listener { diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/category/sources/SourceCategoryCreateDialog.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/category/sources/SourceCategoryCreateDialog.kt index a22cfedda..7dbd74306 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/category/sources/SourceCategoryCreateDialog.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/category/sources/SourceCategoryCreateDialog.kt @@ -2,11 +2,11 @@ package eu.kanade.tachiyomi.ui.category.sources import android.app.Dialog import android.os.Bundle -import com.afollestad.materialdialogs.MaterialDialog -import com.afollestad.materialdialogs.input.input import com.bluelinelabs.conductor.Controller +import com.google.android.material.dialog.MaterialAlertDialogBuilder import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.ui.base.controller.DialogController +import eu.kanade.tachiyomi.widget.materialdialogs.setTextInput /** * Dialog to create a new category for the library. @@ -30,18 +30,19 @@ class SourceCategoryCreateDialog(bundle: Bundle? = null) : DialogController(b * @return a new dialog instance. */ override fun onCreateDialog(savedViewState: Bundle?): Dialog { - return MaterialDialog(activity!!) - .title(R.string.action_add_category) - .negativeButton(android.R.string.cancel) - .input( + return MaterialAlertDialogBuilder(activity!!) + .setTitle(R.string.action_add_category) + .setNegativeButton(android.R.string.cancel, null) + .setTextInput( hint = resources?.getString(R.string.name), prefill = currentName - ) { _, input -> - currentName = input.toString() + ) { input -> + currentName = input } - .positiveButton(android.R.string.ok) { + .setPositiveButton(android.R.string.ok) { _, _ -> (targetController as? Listener)?.createCategory(currentName) } + .create() } interface Listener { diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/category/sources/SourceCategoryRenameDialog.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/category/sources/SourceCategoryRenameDialog.kt index 0c4f03371..99a8d1b2c 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/category/sources/SourceCategoryRenameDialog.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/category/sources/SourceCategoryRenameDialog.kt @@ -2,11 +2,11 @@ package eu.kanade.tachiyomi.ui.category.sources import android.app.Dialog import android.os.Bundle -import com.afollestad.materialdialogs.MaterialDialog -import com.afollestad.materialdialogs.input.input import com.bluelinelabs.conductor.Controller +import com.google.android.material.dialog.MaterialAlertDialogBuilder import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.ui.base.controller.DialogController +import eu.kanade.tachiyomi.widget.materialdialogs.setTextInput /** * Dialog to rename an existing category of the library. @@ -34,16 +34,17 @@ class SourceCategoryRenameDialog(bundle: Bundle? = null) : DialogController(b * @return a new dialog instance. */ override fun onCreateDialog(savedViewState: Bundle?): Dialog { - return MaterialDialog(activity!!) - .title(R.string.action_rename_category) - .negativeButton(android.R.string.cancel) - .input( + return MaterialAlertDialogBuilder(activity!!) + .setTitle(R.string.action_rename_category) + .setTextInput( hint = resources?.getString(R.string.name), prefill = currentName - ) { _, input -> - currentName = input.toString() + ) { input -> + currentName = input } - .positiveButton(android.R.string.ok) { onPositive() } + .setPositiveButton(android.R.string.ok) { _, _ -> onPositive() } + .setNegativeButton(android.R.string.cancel, null) + .create() } /** diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryController.kt index bdcfa9a39..7a116c82b 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryController.kt @@ -8,13 +8,14 @@ import android.view.MenuInflater import android.view.MenuItem import android.view.View import android.view.WindowManager +import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.view.ActionMode import androidx.core.graphics.drawable.DrawableCompat import androidx.core.view.isVisible -import com.afollestad.materialdialogs.MaterialDialog import com.bluelinelabs.conductor.ControllerChangeHandler import com.bluelinelabs.conductor.ControllerChangeType +import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.tabs.TabLayout import com.jakewharton.rxrelay.BehaviorRelay import com.jakewharton.rxrelay.PublishRelay @@ -140,7 +141,7 @@ class LibraryController( // --> EH // Sync dialog - private var favSyncDialog: MaterialDialog? = null + private var favSyncDialog: AlertDialog? = null // Old sync status private var oldSyncStatus: FavoritesSyncStatus? = null @@ -750,14 +751,16 @@ class LibraryController( } private fun buildDialog() = activity?.let { - MaterialDialog(it) + MaterialAlertDialogBuilder(it) } private fun showSyncProgressDialog() { favSyncDialog?.dismiss() favSyncDialog = buildDialog() - ?.title(R.string.favorites_syncing) - ?.cancelable(false) + ?.setTitle(R.string.favorites_syncing) + ?.setMessage("") + ?.setCancelable(false) + ?.create() favSyncDialog?.show() } @@ -782,16 +785,17 @@ class LibraryController( favSyncDialog?.dismiss() favSyncDialog = buildDialog() - ?.title(R.string.favorites_sync_error) - ?.message(text = activity!!.getString(R.string.favorites_sync_bad_library_state, status.message)) - ?.cancelable(false) - ?.positiveButton(R.string.show_gallery) { + ?.setTitle(R.string.favorites_sync_error) + ?.setMessage(activity!!.getString(R.string.favorites_sync_bad_library_state, status.message)) + ?.setCancelable(false) + ?.setPositiveButton(R.string.show_gallery) { _, _ -> openManga(status.manga) presenter.favoritesSync.status.value = FavoritesSyncStatus.Idle(activity!!) } - ?.negativeButton(android.R.string.ok) { + ?.setNegativeButton(android.R.string.ok) { _, _ -> presenter.favoritesSync.status.value = FavoritesSyncStatus.Idle(activity!!) } + ?.create() favSyncDialog?.show() } is FavoritesSyncStatus.Error -> { @@ -799,12 +803,13 @@ class LibraryController( favSyncDialog?.dismiss() favSyncDialog = buildDialog() - ?.title(R.string.favorites_sync_error) - ?.message(text = activity!!.getString(R.string.favorites_sync_error_string, status.message)) - ?.cancelable(false) - ?.positiveButton(android.R.string.ok) { + ?.setTitle(R.string.favorites_sync_error) + ?.setMessage(activity!!.getString(R.string.favorites_sync_error_string, status.message)) + ?.setCancelable(false) + ?.setPositiveButton(android.R.string.ok) { _, _ -> presenter.favoritesSync.status.value = FavoritesSyncStatus.Idle(activity!!) } + ?.create() favSyncDialog?.show() } is FavoritesSyncStatus.CompleteWithErrors -> { @@ -812,12 +817,13 @@ class LibraryController( favSyncDialog?.dismiss() favSyncDialog = buildDialog() - ?.title(R.string.favorites_sync_done_errors) - ?.message(text = activity!!.getString(R.string.favorites_sync_done_errors_message, status.message)) - ?.cancelable(false) - ?.positiveButton(android.R.string.ok) { + ?.setTitle(R.string.favorites_sync_done_errors) + ?.setMessage(activity!!.getString(R.string.favorites_sync_done_errors_message, status.message)) + ?.setCancelable(false) + ?.setPositiveButton(android.R.string.ok) { _, _ -> presenter.favoritesSync.status.value = FavoritesSyncStatus.Idle(activity!!) } + ?.create() favSyncDialog?.show() } is FavoritesSyncStatus.Processing, @@ -833,13 +839,13 @@ class LibraryController( showSyncProgressDialog() } - favSyncDialog?.message(text = status.message) + favSyncDialog?.setMessage(status.message) } } oldSyncStatus = status if (status is FavoritesSyncStatus.Processing && status.delayedMessage != null) { delay(5.seconds) - favSyncDialog?.message(text = status.delayedMessage) + favSyncDialog?.setMessage(status.delayedMessage) } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/main/WhatsNewDialogController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/main/WhatsNewDialogController.kt index cd5b38790..e151bfe71 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/main/WhatsNewDialogController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/main/WhatsNewDialogController.kt @@ -18,9 +18,10 @@ class WhatsNewDialogController : DialogController() { val activity = activity!! val view = WhatsNewRecyclerView(activity) return MaterialAlertDialogBuilder(activity) - .setTitle(res = if (BuildConfig.DEBUG /* SY --> */ || syDebugVersion != "0" /* SY <-- */) R.string.notices else R.string.whats_new) - .setCustomView(view = view) + .setTitle(if (BuildConfig.DEBUG /* SY --> */ || syDebugVersion != "0" /* SY <-- */) R.string.notices else R.string.whats_new) + .setView(view) .setPositiveButton(android.R.string.cancel, null) + .create() } class WhatsNewRecyclerView(context: Context) : ChangeLogRecyclerView(context) { diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/EditMangaDialog.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/EditMangaDialog.kt index ecc5da8a4..b7af2c860 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/EditMangaDialog.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/EditMangaDialog.kt @@ -4,19 +4,16 @@ import android.app.Dialog import android.content.Context import android.net.Uri import android.os.Bundle -import android.text.InputType import android.widget.ArrayAdapter +import android.widget.ScrollView import androidx.core.content.ContextCompat import androidx.core.os.bundleOf import androidx.core.view.children import coil.loadAny import coil.transform.RoundedCornersTransformation -import com.afollestad.materialdialogs.MaterialDialog -import com.afollestad.materialdialogs.customview.customView -import com.afollestad.materialdialogs.input.getInputField -import com.afollestad.materialdialogs.input.input import com.google.android.material.chip.Chip import com.google.android.material.chip.ChipGroup +import com.google.android.material.dialog.MaterialAlertDialogBuilder import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.data.database.DatabaseHelper import eu.kanade.tachiyomi.data.database.models.Manga @@ -26,6 +23,7 @@ import eu.kanade.tachiyomi.source.model.SManga import eu.kanade.tachiyomi.ui.base.controller.DialogController import eu.kanade.tachiyomi.util.lang.chop import eu.kanade.tachiyomi.util.system.getResourceColor +import eu.kanade.tachiyomi.widget.materialdialogs.setTextInput import exh.util.dropBlank import exh.util.trimOrNull import kotlinx.coroutines.flow.launchIn @@ -64,13 +62,15 @@ class EditMangaDialog : DialogController { override fun onCreateDialog(savedViewState: Bundle?): Dialog { binding = EditMangaDialogBinding.inflate(activity!!.layoutInflater) - val dialog = MaterialDialog(activity!!).apply { - customView(view = binding.root, scrollable = true) - negativeButton(android.R.string.cancel) - positiveButton(R.string.action_save) { onPositiveButtonClick() } + val view = ScrollView(activity!!).apply { + addView(binding.root) } onViewCreated() - return dialog + return MaterialAlertDialogBuilder(activity!!) + .setView(view) + .setPositiveButton(R.string.action_save) { _, _ -> onPositiveButtonClick() } + .setNegativeButton(android.R.string.cancel, null) + .create() } fun onViewCreated() { @@ -230,15 +230,16 @@ class EditMangaDialog : DialogController { textStartPadding = 0F clicks().onEach { - MaterialDialog(context) - .title(R.string.add_tag) - .input(inputType = InputType.TYPE_CLASS_TEXT) - .positiveButton(android.R.string.ok) { - val newTag = it.getInputField().text.toString().trimOrNull() - + var newTag: String? = null + MaterialAlertDialogBuilder(context) + .setTitle(R.string.add_tag) + .setTextInput { + text = it.trimOrNull() + } + .setPositiveButton(android.R.string.ok) { _, _ -> if (newTag != null) setChips(items + listOf(newTag)) } - .negativeButton(android.R.string.cancel) + .setNegativeButton(android.R.string.cancel, null) .show() }.launchIn(infoController.viewScope) } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaController.kt index 81957ae83..06cf43b5c 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaController.kt @@ -28,10 +28,9 @@ import androidx.recyclerview.widget.ConcatAdapter import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import coil.loadAny -import com.afollestad.materialdialogs.MaterialDialog -import com.afollestad.materialdialogs.list.listItemsSingleChoice import com.bluelinelabs.conductor.ControllerChangeHandler import com.bluelinelabs.conductor.ControllerChangeType +import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton import com.google.android.material.snackbar.Snackbar import dev.chrisbanes.insetter.applyInsetter @@ -613,14 +612,17 @@ class MangaController : val sourceManager: SourceManager = Injekt.get() val mergedManga = presenter.mergedManga.values.filterNot { it.source == MERGED_SOURCE_ID } val sources = mergedManga.map { sourceManager.getOrStub(it.source) } - MaterialDialog(activity!!) - .title(R.string.action_open_in_web_view) - .listItemsSingleChoice( - items = mergedManga.mapIndexed { index, _ -> sources[index].toString() } - ) { _, index, _ -> + MaterialAlertDialogBuilder(activity!!) + .setTitle(R.string.action_open_in_web_view) + .setSingleChoiceItems( + mergedManga.mapIndexed { index, _ -> sources[index].toString() } + .toTypedArray(), + -1 + ) { dialog, index -> + dialog.dismiss() openMangaInWebView(mergedManga[index], sources[index] as? HttpSource) } - .negativeButton(android.R.string.cancel) + .setNegativeButton(android.R.string.cancel, null) .show() } // SY <-- @@ -773,14 +775,16 @@ class MangaController : fun openRecommends() { val source = presenter.source.getMainSource() if (source.isMdBasedSource()) { - MaterialDialog(activity!!) - .title(R.string.az_recommends) - .listItemsSingleChoice( - items = listOf( + MaterialAlertDialogBuilder(activity!!) + .setTitle(R.string.az_recommends) + .setSingleChoiceItems( + arrayOf( "MangaDex similar", "Community recommendations" - ) - ) { _, index, _ -> + ), + -1 + ) { dialog, index -> + dialog.dismiss() when (index) { 0 -> router.pushController(MangaDexSimilarController(presenter.manga, source as CatalogueSource).withFadeTransaction()) 1 -> router.pushController(RecommendsController(presenter.manga, source as CatalogueSource).withFadeTransaction()) diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/chapter/ChaptersSettingsSheet.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/chapter/ChaptersSettingsSheet.kt index b06b25734..b2df6b3f0 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/chapter/ChaptersSettingsSheet.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/chapter/ChaptersSettingsSheet.kt @@ -5,9 +5,8 @@ import android.os.Bundle import android.util.AttributeSet import android.view.View import androidx.core.view.isVisible -import com.afollestad.materialdialogs.MaterialDialog -import com.afollestad.materialdialogs.list.listItemsMultiChoice import com.bluelinelabs.conductor.Router +import com.google.android.material.dialog.MaterialAlertDialogBuilder import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.data.database.models.Manga import eu.kanade.tachiyomi.ui.manga.MangaPresenter @@ -110,26 +109,27 @@ class ChaptersSettingsSheet( override fun onItemClicked(item: Item) { if (item is Item.DrawableSelection) { - val scanlators = presenter.allChapterScanlators.toList() - val filteredScanlators = presenter.manga.filtered_scanlators?.let { MdUtil.getScanlators(it) } - val preselected = if (filteredScanlators.isNullOrEmpty()) { - scanlators.mapIndexed { index, _ -> index } - } else { - filteredScanlators.map { scanlators.indexOf(it) } - }.toIntArray() + val scanlators = presenter.allChapterScanlators.toTypedArray() + val filteredScanlators = presenter.manga.filtered_scanlators?.let { MdUtil.getScanlators(it) } ?: scanlators.toSet() + val selection = scanlators.map { + it in filteredScanlators + }.toBooleanArray() - MaterialDialog(context) - .title(R.string.select_scanlators) - .listItemsMultiChoice(items = presenter.allChapterScanlators.toList(), initialSelection = preselected) { _, selections, _ -> + MaterialAlertDialogBuilder(context) + .setTitle(R.string.select_scanlators) + .setMultiChoiceItems(scanlators, selection) { _, which, selected -> + selection[which] = selected + } + .setPositiveButton(android.R.string.ok) { _, _ -> launchIO { supervisorScope { - val selected = selections.map { scanlators[it] }.toSet() + val selected = scanlators.filterIndexed { index, s -> selection[index] }.toSet() presenter.setScanlatorFilter(selected) withUIContext { onGroupClicked(this@FilterGroup) } } } } - .negativeButton(R.string.action_reset) { + .setNegativeButton(R.string.action_reset) { _, _ -> launchIO { supervisorScope { presenter.setScanlatorFilter(presenter.allChapterScanlators) @@ -137,7 +137,6 @@ class ChaptersSettingsSheet( } } } - .positiveButton(android.R.string.ok) .show() return } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/merged/EditMergedSettingsDialog.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/merged/EditMergedSettingsDialog.kt index 814dfa614..a4c47e458 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/merged/EditMergedSettingsDialog.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/merged/EditMergedSettingsDialog.kt @@ -2,11 +2,11 @@ package eu.kanade.tachiyomi.ui.manga.merged import android.app.Dialog import android.os.Bundle +import android.widget.ScrollView import androidx.core.os.bundleOf import androidx.recyclerview.widget.ConcatAdapter import androidx.recyclerview.widget.LinearLayoutManager -import com.afollestad.materialdialogs.MaterialDialog -import com.afollestad.materialdialogs.customview.customView +import com.google.android.material.dialog.MaterialAlertDialogBuilder import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.data.database.DatabaseHelper import eu.kanade.tachiyomi.data.database.models.Manga @@ -50,13 +50,15 @@ class EditMergedSettingsDialog : DialogController, EditMergedMangaAdapter.EditMe override fun onCreateDialog(savedViewState: Bundle?): Dialog { binding = EditMergedSettingsDialogBinding.inflate(activity!!.layoutInflater) - val dialog = MaterialDialog(activity!!) - .customView(view = binding.root, scrollable = true) - .negativeButton(android.R.string.cancel) - .positiveButton(R.string.action_save) { onPositiveButtonClick() } - + val view = ScrollView(activity!!).apply { + addView(binding.root) + } onViewCreated() - return dialog + return MaterialAlertDialogBuilder(activity!!) + .setView(view) + .setPositiveButton(R.string.action_save) { _, _ -> onPositiveButtonClick() } + .setNegativeButton(android.R.string.cancel, null) + .create() } fun onViewCreated() { @@ -99,26 +101,26 @@ class EditMergedSettingsDialog : DialogController, EditMergedMangaAdapter.EditMe val mergedMangaAdapter = mergedMangaAdapter ?: return val mergeMangaReference = mergedMangaAdapter.currentItems.getOrNull(position)?.mergedMangaReference ?: return - MaterialDialog(activity!!) - .title(R.string.delete_merged_manga) - .message(R.string.delete_merged_manga_desc) - .positiveButton(android.R.string.ok) { + MaterialAlertDialogBuilder(activity!!) + .setTitle(R.string.delete_merged_manga) + .setMessage(R.string.delete_merged_manga_desc) + .setPositiveButton(android.R.string.ok) { _, _ -> db.deleteMergedManga(mergeMangaReference).executeAsBlocking() dialog?.dismiss() mangaController.router.popController(mangaController) } - .negativeButton(android.R.string.cancel) + .setNegativeButton(android.R.string.cancel, null) .show() } override fun onToggleChapterUpdatesClicked(position: Int) { - MaterialDialog(activity!!) - .title(R.string.chapter_updates_merged_manga) - .message(R.string.chapter_updates_merged_manga_desc) - .positiveButton(android.R.string.ok) { + MaterialAlertDialogBuilder(activity!!) + .setTitle(R.string.chapter_updates_merged_manga) + .setMessage(R.string.chapter_updates_merged_manga_desc) + .setPositiveButton(android.R.string.ok) { _, _ -> toggleChapterUpdates(position) } - .negativeButton(android.R.string.cancel) + .setNegativeButton(android.R.string.cancel, null) .show() } @@ -136,13 +138,13 @@ class EditMergedSettingsDialog : DialogController, EditMergedMangaAdapter.EditMe } override fun onToggleChapterDownloadsClicked(position: Int) { - MaterialDialog(activity!!) - .title(R.string.download_merged_manga) - .message(R.string.download_merged_manga_desc) - .positiveButton(android.R.string.ok) { + MaterialAlertDialogBuilder(activity!!) + .setTitle(R.string.download_merged_manga) + .setMessage(R.string.download_merged_manga_desc) + .setPositiveButton(android.R.string.ok) { _, _ -> toggleChapterDownloads(position) } - .negativeButton(android.R.string.cancel) + .setNegativeButton(android.R.string.cancel, null) .show() } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderActivity.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderActivity.kt index 6993c6d55..84e34a5e0 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderActivity.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderActivity.kt @@ -34,8 +34,8 @@ import androidx.core.view.WindowInsetsControllerCompat import androidx.core.view.isInvisible import androidx.core.view.isVisible import androidx.lifecycle.lifecycleScope -import com.afollestad.materialdialogs.MaterialDialog import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView +import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.shape.MaterialShapeDrawable import com.mikepenz.aboutlibraries.util.getThemeColor import dev.chrisbanes.insetter.applyInsetter @@ -693,10 +693,10 @@ class ReaderActivity : BaseRxActivity() binding.ehAutoscrollHelp.clicks() .onEach { - MaterialDialog(this) - .title(R.string.eh_autoscroll_help) - .message(R.string.eh_autoscroll_help_message) - .positiveButton(android.R.string.ok) + MaterialAlertDialogBuilder(this) + .setTitle(R.string.eh_autoscroll_help) + .setMessage(R.string.eh_autoscroll_help_message) + .setPositiveButton(android.R.string.ok, null) .show() } .launchIn(lifecycleScope) @@ -747,10 +747,10 @@ class ReaderActivity : BaseRxActivity() binding.ehRetryAllHelp.clicks() .onEach { - MaterialDialog(this) - .title(R.string.eh_retry_all_help) - .message(R.string.eh_retry_all_help_message) - .positiveButton(android.R.string.ok) + MaterialAlertDialogBuilder(this) + .setTitle(R.string.eh_retry_all_help) + .setMessage(R.string.eh_retry_all_help_message) + .setPositiveButton(android.R.string.ok, null) .show() } .launchIn(lifecycleScope) @@ -784,10 +784,10 @@ class ReaderActivity : BaseRxActivity() binding.ehBoostPageHelp.clicks() .onEach { - MaterialDialog(this) - .title(R.string.eh_boost_page_help) - .message(R.string.eh_boost_page_help_message) - .positiveButton(android.R.string.ok) + MaterialAlertDialogBuilder(this) + .setTitle(R.string.eh_boost_page_help) + .setMessage(R.string.eh_boost_page_help_message) + .setPositiveButton(android.R.string.ok, null) .show() } .launchIn(lifecycleScope) diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/chapter/ReaderChapterDialog.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/chapter/ReaderChapterDialog.kt index 67dec7bcf..98ac01a3b 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/chapter/ReaderChapterDialog.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/chapter/ReaderChapterDialog.kt @@ -1,9 +1,9 @@ package eu.kanade.tachiyomi.ui.reader.chapter +import androidx.appcompat.app.AlertDialog +import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.LinearLayoutManager -import com.afollestad.materialdialogs.MaterialDialog -import com.afollestad.materialdialogs.callbacks.onDismiss -import com.afollestad.materialdialogs.customview.customView +import com.google.android.material.dialog.MaterialAlertDialogBuilder import eu.davidea.flexibleadapter.FlexibleAdapter import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.data.database.models.Chapter @@ -12,36 +12,41 @@ import eu.kanade.tachiyomi.ui.reader.ReaderActivity import eu.kanade.tachiyomi.ui.reader.ReaderPresenter import eu.kanade.tachiyomi.util.chapter.getChapterSort import eu.kanade.tachiyomi.util.system.dpToPx +import kotlinx.coroutines.launch class ReaderChapterDialog(private val activity: ReaderActivity) : ReaderChapterAdapter.OnBookmarkClickListener { private val binding = ReaderChaptersDialogBinding.inflate(activity.layoutInflater, null, false) var presenter: ReaderPresenter = activity.presenter var adapter: FlexibleAdapter? = null - var dialog: MaterialDialog + var dialog: AlertDialog init { - dialog = MaterialDialog(activity) - .title(R.string.chapters) - .customView(view = binding.root) - .negativeButton(android.R.string.cancel) - .onDismiss { destroy() } - .show { - adapter = ReaderChapterAdapter(this@ReaderChapterDialog) - binding.chapterRecycler.adapter = adapter + dialog = MaterialAlertDialogBuilder(activity) + .setTitle(R.string.chapters) + .setView(binding.root) + .setNegativeButton(android.R.string.cancel, null) + .setOnDismissListener { destroy() } + .create() - adapter?.mItemClickListener = FlexibleAdapter.OnItemClickListener { _, position -> - val item = adapter?.getItem(position) - if (item != null && item.id != presenter.getCurrentChapter()?.chapter?.id) { - dismiss() - presenter.loadNewChapterFromDialog(item) - } - true - } + adapter = ReaderChapterAdapter(this@ReaderChapterDialog) + binding.chapterRecycler.adapter = adapter - binding.chapterRecycler.layoutManager = LinearLayoutManager(context) - refreshList() + adapter?.mItemClickListener = FlexibleAdapter.OnItemClickListener { _, position -> + val item = adapter?.getItem(position) + if (item != null && item.id != presenter.getCurrentChapter()?.chapter?.id) { + dialog.dismiss() + presenter.loadNewChapterFromDialog(item) } + true + } + + binding.chapterRecycler.layoutManager = LinearLayoutManager(activity) + activity.lifecycleScope.launch { + refreshList() + } + + dialog.show() } private fun refreshList() { diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsAdvancedController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsAdvancedController.kt index fc27a9c2e..06efdbdf1 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsAdvancedController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsAdvancedController.kt @@ -7,6 +7,7 @@ import android.content.Intent import android.os.Bundle import android.provider.Settings import android.widget.Toast +import androidx.appcompat.app.AlertDialog import androidx.core.net.toUri import androidx.core.text.HtmlCompat import androidx.preference.PreferenceScreen @@ -323,16 +324,25 @@ class SettingsAdvancedController : SettingsController() { // SY --> class CleanupDownloadsDialogController : DialogController() { override fun onCreateDialog(savedViewState: Bundle?): Dialog { - return MaterialDialog(activity!!).show { - title(R.string.clean_up_downloaded_chapters) - .listItemsMultiChoice(R.array.clean_up_downloads, disabledIndices = intArrayOf(0), initialSelection = intArrayOf(0, 1, 2)) { _, selections, _ -> - val deleteRead = selections.contains(1) - val deleteNonFavorite = selections.contains(2) - (targetController as? SettingsAdvancedController)?.cleanupDownloads(deleteRead, deleteNonFavorite) + val options = activity!!.resources.getStringArray(R.array.clean_up_downloads) + val selected = options.map { true }.toBooleanArray() + return MaterialAlertDialogBuilder(activity!!) + .setTitle(R.string.clean_up_downloaded_chapters) + .setMultiChoiceItems(options, selected) { dialog, which, checked -> + if (which == 0) { + (dialog as AlertDialog).listView.setItemChecked(which, true) + } else { + selected[which] = checked } - positiveButton(android.R.string.ok) - negativeButton(android.R.string.cancel) - } + } + .setPositiveButton(android.R.string.ok) { _, _ -> + (targetController as? SettingsAdvancedController)?.cleanupDownloads( + selected[1], + selected[2] + ) + } + .setNegativeButton(android.R.string.cancel, null) + .create() } } @@ -400,14 +410,18 @@ class SettingsAdvancedController : SettingsController() { // SY <-- override fun onCreateDialog(savedViewState: Bundle?): Dialog { + val item = arrayOf( + activity!!.getString(R.string.clear_db_exclude_read) + ) + val selected = booleanArrayOf(true) return MaterialAlertDialogBuilder(activity!!) .setMessage(R.string.clear_database_confirmation) - .checkBoxPrompt(R.string.clear_db_exclude_read) { - keepReadManga = it + .setMultiChoiceItems(item, selected) { _, _, isChecked -> + selected[0] = isChecked } // SY <-- .setPositiveButton(android.R.string.ok) { _, _ -> - (targetController as? SettingsAdvancedController)?.clearDatabase() + (targetController as? SettingsAdvancedController)?.clearDatabase(selected.first()) } .setNegativeButton(android.R.string.cancel, null) .create() diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsDownloadController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsDownloadController.kt index 96ac159e4..0c71c3e20 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsDownloadController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsDownloadController.kt @@ -331,29 +331,35 @@ class SettingsDownloadController : SettingsController() { val dbCategories = db.getCategories().executeAsBlocking() val categories = listOf(Category.createDefault()) + dbCategories - val items = categories.map { it.name } - val preselected = categories - .mapIndexedNotNull { index, category -> - if (category.id in preferences.dontDeleteFromCategories().get().map { it.toInt() }) { - index - } else null + val items = categories.map { it.name }.toTypedArray() + val selection = categories + .mapNotNull { category -> + category.id in preferences.dontDeleteFromCategories().get().map { it.toInt() } } - .toIntArray() + .toBooleanArray() - return MaterialDialog(activity!!) - .title(R.string.categories) - .listItemsMultiChoice( - items = items, - initialSelection = preselected - ) { _: MaterialDialog, selections: IntArray, _: List -> - val included = selections - .map { categories[it].id.toString() } + return MaterialAlertDialogBuilder(activity!!) + .setTitle(R.string.categories) + .setMultiChoiceItems( + items, + selection + ) { _, which, selected -> + selection[which] = selected + } + .setPositiveButton(android.R.string.ok) { _, _ -> + val included = selection + .mapIndexed { index, selected -> + if (selected) { + categories[index].id.toString() + } else null + } + .filterNotNull() .toSet() preferences.dontDeleteFromCategories().set(included) } - .positiveButton(android.R.string.ok) - .negativeButton(android.R.string.cancel) + .setNegativeButton(android.R.string.cancel, null) + .create() } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsEhController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsEhController.kt index af010f500..035a7312c 100755 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsEhController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsEhController.kt @@ -4,15 +4,15 @@ import android.app.Activity import android.content.Context import android.content.Intent import android.text.InputType +import android.view.LayoutInflater +import android.view.inputmethod.InputMethodManager +import android.widget.TextView import android.widget.Toast import androidx.core.content.ContextCompat +import androidx.core.content.getSystemService +import androidx.core.widget.doAfterTextChanged import androidx.preference.PreferenceScreen -import com.afollestad.materialdialogs.MaterialDialog -import com.afollestad.materialdialogs.WhichButton -import com.afollestad.materialdialogs.actions.setActionButtonEnabled -import com.afollestad.materialdialogs.customview.customView -import com.afollestad.materialdialogs.input.getInputField -import com.afollestad.materialdialogs.input.input +import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.tfcporciuncula.flow.Preference import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.data.database.DatabaseHelper @@ -21,8 +21,9 @@ import eu.kanade.tachiyomi.data.preference.CHARGING import eu.kanade.tachiyomi.data.preference.PreferenceKeys import eu.kanade.tachiyomi.data.preference.UNMETERED_NETWORK import eu.kanade.tachiyomi.data.preference.asImmediateFlow -import eu.kanade.tachiyomi.databinding.EhDialogCategoriesBinding -import eu.kanade.tachiyomi.databinding.EhDialogLanguagesBinding +import eu.kanade.tachiyomi.databinding.DialogStubTextinputBinding +import eu.kanade.tachiyomi.ui.setting.eh.FrontPageCategoriesDialog +import eu.kanade.tachiyomi.ui.setting.eh.LanguagesDialog import eu.kanade.tachiyomi.ui.webview.WebViewActivity import eu.kanade.tachiyomi.util.preference.defaultValue import eu.kanade.tachiyomi.util.preference.entriesRes @@ -42,6 +43,7 @@ import exh.eh.EHentaiUpdateWorkerConstants import exh.eh.EHentaiUpdaterStats import exh.favorites.FavoritesIntroDialog import exh.favorites.LocalFavoritesStorage +import exh.log.xLogD import exh.metadata.metadata.EHentaiSearchMetadata import exh.metadata.metadata.base.getFlatMetadataForManga import exh.source.isEhBasedManga @@ -73,7 +75,7 @@ import kotlin.time.Duration class SettingsEhController : SettingsController() { private val db: DatabaseHelper by injectLazy() - private fun Preference<*>.reconfigure(): Boolean { + fun Preference<*>.reconfigure(): Boolean { // Listen for change commit asFlow() .take(1) // Only listen for first commit @@ -186,30 +188,36 @@ class SettingsEhController : SettingsController() { summary = context.getString(R.string.tag_filtering_threshhold_summary, preferences.ehTagFilterValue().get()) onClick { - MaterialDialog(activity!!) - .title(R.string.tag_filtering_threshold) - .input( - inputType = InputType.TYPE_NUMBER_FLAG_SIGNED, - waitForPositiveButton = false, - allowEmpty = false - ) { dialog, number -> - val inputField = dialog.getInputField() - val value = number.toString().toIntOrNull() - - if ((value != null && value in -9999..0) || number.toString() == "-") { - inputField.error = null - } else { - inputField.error = context.getString(R.string.tag_filtering_threshhold_error) + var value: Int? = preferences.ehTagFilterValue().get() + MaterialAlertDialogBuilder(activity!!) + .setTitle(R.string.tag_filtering_threshold) + .let { builder -> + val binding = DialogStubTextinputBinding.inflate(LayoutInflater.from(builder.context)) + binding.textField.editText?.apply { + inputType = InputType.TYPE_NUMBER_FLAG_SIGNED + setText(value.toString(), TextView.BufferType.EDITABLE) + doAfterTextChanged { + value = it?.toString()?.toIntOrNull() + this@SettingsEhController.xLogD(value) + error = if (value in -9999..0 || it.toString() == "-") { + null + } else { + context.getString(R.string.tag_filtering_threshhold_error) + } + } + post { + requestFocusFromTouch() + context.getSystemService()?.showSoftInput(this, 0) + } } - dialog.setActionButtonEnabled(WhichButton.POSITIVE, value != null && value in -9999..0) + builder.setView(binding.root) } - .positiveButton(android.R.string.ok) { - val value = it.getInputField().text.toString().toInt() - preferences.ehTagFilterValue().set(value) + .setPositiveButton(android.R.string.ok) { _, _ -> + preferences.ehTagFilterValue().set(value ?: return@setPositiveButton) summary = context.getString(R.string.tag_filtering_threshhold_summary, preferences.ehTagFilterValue().get()) preferences.ehTagFilterValue().reconfigure() } - .negativeButton(android.R.string.cancel) + .setNegativeButton(android.R.string.cancel, null) .show() } @@ -225,31 +233,37 @@ class SettingsEhController : SettingsController() { summary = context.getString(R.string.tag_watching_threshhold_summary, preferences.ehTagWatchingValue().get()) onClick { - MaterialDialog(activity!!) - .title(R.string.tag_watching_threshhold) - .input( - inputType = InputType.TYPE_NUMBER_FLAG_SIGNED, - maxLength = 4, - waitForPositiveButton = false, - allowEmpty = false - ) { dialog, number -> - val inputField = dialog.getInputField() - val value = number.toString().toIntOrNull() + var value: Int? = preferences.ehTagWatchingValue().get() + MaterialAlertDialogBuilder(activity!!) + .setTitle(R.string.tag_watching_threshhold) + .let { builder -> + val binding = DialogStubTextinputBinding.inflate(LayoutInflater.from(builder.context)) + binding.textField.editText?.apply { + inputType = InputType.TYPE_NUMBER_FLAG_SIGNED - if (value != null && value in 0..9999) { - inputField.error = null - } else { - inputField.error = context.getString(R.string.tag_watching_threshhold_error) + setText(value.toString(), TextView.BufferType.EDITABLE) + doAfterTextChanged { + value = it?.toString()?.toIntOrNull() + + error = if (value in 0..9999) { + null + } else { + context.getString(R.string.tag_watching_threshhold_error) + } + } + post { + requestFocusFromTouch() + context.getSystemService()?.showSoftInput(this, 0) + } } - dialog.setActionButtonEnabled(WhichButton.POSITIVE, value != null && value in 0..9999) + builder.setView(binding.root) } - .positiveButton(android.R.string.ok) { - val value = it.getInputField().text.toString().toInt() - preferences.ehTagWatchingValue().set(value) + .setPositiveButton(android.R.string.ok) { _, _ -> + preferences.ehTagWatchingValue().set(value ?: return@setPositiveButton) summary = context.getString(R.string.tag_watching_threshhold_summary, preferences.ehTagWatchingValue().get()) preferences.ehTagWatchingValue().reconfigure() } - .negativeButton(android.R.string.cancel) + .setNegativeButton(android.R.string.cancel, null) .show() } @@ -258,143 +272,14 @@ class SettingsEhController : SettingsController() { } preference { - key = "pref_language_filtering" + key = PreferenceKeys.eh_settings_languages titleRes = R.string.language_filtering summaryRes = R.string.language_filtering_summary onClick { - MaterialDialog(activity!!) - .title(R.string.language_filtering) - .message(R.string.language_filtering_summary) - .customView(R.layout.eh_dialog_languages, scrollable = true) - .positiveButton(android.R.string.ok) { - val customView = it.view.contentLayout.customView!! - val binding = EhDialogLanguagesBinding.bind(customView) - - val languages = with(binding) { - listOf( - "${japaneseOriginal.isChecked}*${japaneseTranslated.isChecked}*${japaneseRewrite.isChecked}", - "${englishOriginal.isChecked}*${englishTranslated.isChecked}*${englishRewrite.isChecked}", - "${chineseOriginal.isChecked}*${chineseTranslated.isChecked}*${chineseRewrite.isChecked}", - "${dutchOriginal.isChecked}*${dutchTranslated.isChecked}*${dutchRewrite.isChecked}", - "${frenchOriginal.isChecked}*${frenchTranslated.isChecked}*${frenchRewrite.isChecked}", - "${germanOriginal.isChecked}*${germanTranslated.isChecked}*${germanRewrite.isChecked}", - "${hungarianOriginal.isChecked}*${hungarianTranslated.isChecked}*${hungarianRewrite.isChecked}", - "${italianOriginal.isChecked}*${italianTranslated.isChecked}*${italianRewrite.isChecked}", - "${koreanOriginal.isChecked}*${koreanTranslated.isChecked}*${koreanRewrite.isChecked}", - "${polishOriginal.isChecked}*${polishTranslated.isChecked}*${polishRewrite.isChecked}", - "${portugueseOriginal.isChecked}*${portugueseTranslated.isChecked}*${portugueseRewrite.isChecked}", - "${russianOriginal.isChecked}*${russianTranslated.isChecked}*${russianRewrite.isChecked}", - "${spanishOriginal.isChecked}*${spanishTranslated.isChecked}*${spanishRewrite.isChecked}", - "${thaiOriginal.isChecked}*${thaiTranslated.isChecked}*${thaiRewrite.isChecked}", - "${vietnameseOriginal.isChecked}*${vietnameseTranslated.isChecked}*${vietnameseRewrite.isChecked}", - "${notAvailableOriginal.isChecked}*${notAvailableTranslated.isChecked}*${notAvailableRewrite.isChecked}", - "${otherOriginal.isChecked}*${otherTranslated.isChecked}*${otherRewrite.isChecked}" - ).joinToString("\n") - } - - preferences.exhSettingsLanguages().set(languages) - - preferences.exhSettingsLanguages().reconfigure() - } - .show { - val customView = this.view.contentLayout.customView!! - val binding = EhDialogLanguagesBinding.bind(customView) - val settingsLanguages = preferences.exhSettingsLanguages().get().split("\n") - - val japanese = settingsLanguages[0].split("*").map { it.toBoolean() } - val english = settingsLanguages[1].split("*").map { it.toBoolean() } - val chinese = settingsLanguages[2].split("*").map { it.toBoolean() } - val dutch = settingsLanguages[3].split("*").map { it.toBoolean() } - val french = settingsLanguages[4].split("*").map { it.toBoolean() } - val german = settingsLanguages[5].split("*").map { it.toBoolean() } - val hungarian = settingsLanguages[6].split("*").map { it.toBoolean() } - val italian = settingsLanguages[7].split("*").map { it.toBoolean() } - val korean = settingsLanguages[8].split("*").map { it.toBoolean() } - val polish = settingsLanguages[9].split("*").map { it.toBoolean() } - val portuguese = settingsLanguages[10].split("*").map { it.toBoolean() } - val russian = settingsLanguages[11].split("*").map { it.toBoolean() } - val spanish = settingsLanguages[12].split("*").map { it.toBoolean() } - val thai = settingsLanguages[13].split("*").map { it.toBoolean() } - val vietnamese = settingsLanguages[14].split("*").map { it.toBoolean() } - val notAvailable = - settingsLanguages[15].split("*").map { it.toBoolean() } - val other = settingsLanguages[16].split("*").map { it.toBoolean() } - - with(binding) { - japaneseOriginal.isChecked = japanese[0] - japaneseTranslated.isChecked = japanese[1] - japaneseRewrite.isChecked = japanese[2] - - japaneseOriginal.isChecked = japanese[0] - japaneseTranslated.isChecked = japanese[1] - japaneseRewrite.isChecked = japanese[2] - - englishOriginal.isChecked = english[0] - englishTranslated.isChecked = english[1] - englishRewrite.isChecked = english[2] - - chineseOriginal.isChecked = chinese[0] - chineseTranslated.isChecked = chinese[1] - chineseRewrite.isChecked = chinese[2] - - dutchOriginal.isChecked = dutch[0] - dutchTranslated.isChecked = dutch[1] - dutchRewrite.isChecked = dutch[2] - - frenchOriginal.isChecked = french[0] - frenchTranslated.isChecked = french[1] - frenchRewrite.isChecked = french[2] - - germanOriginal.isChecked = german[0] - germanTranslated.isChecked = german[1] - germanRewrite.isChecked = german[2] - - hungarianOriginal.isChecked = hungarian[0] - hungarianTranslated.isChecked = hungarian[1] - hungarianRewrite.isChecked = hungarian[2] - - italianOriginal.isChecked = italian[0] - italianTranslated.isChecked = italian[1] - italianRewrite.isChecked = italian[2] - - koreanOriginal.isChecked = korean[0] - koreanTranslated.isChecked = korean[1] - koreanRewrite.isChecked = korean[2] - - polishOriginal.isChecked = polish[0] - polishTranslated.isChecked = polish[1] - polishRewrite.isChecked = polish[2] - - portugueseOriginal.isChecked = portuguese[0] - portugueseTranslated.isChecked = portuguese[1] - portugueseRewrite.isChecked = portuguese[2] - - russianOriginal.isChecked = russian[0] - russianTranslated.isChecked = russian[1] - russianRewrite.isChecked = russian[2] - - spanishOriginal.isChecked = spanish[0] - spanishTranslated.isChecked = spanish[1] - spanishRewrite.isChecked = spanish[2] - - thaiOriginal.isChecked = thai[0] - thaiTranslated.isChecked = thai[1] - thaiRewrite.isChecked = thai[2] - - vietnameseOriginal.isChecked = vietnamese[0] - vietnameseTranslated.isChecked = vietnamese[1] - vietnameseRewrite.isChecked = vietnamese[2] - - notAvailableOriginal.isChecked = notAvailable[0] - notAvailableTranslated.isChecked = notAvailable[1] - notAvailableRewrite.isChecked = notAvailable[2] - - otherOriginal.isChecked = other[0] - otherTranslated.isChecked = other[1] - otherRewrite.isChecked = other[2] - } - } + val dialog = LanguagesDialog() + dialog.targetController = this@SettingsEhController + dialog.showDialog(router) } preferences.enableExhentai().asImmediateFlow { isVisible = it } @@ -402,56 +287,14 @@ class SettingsEhController : SettingsController() { } preference { - key = "pref_front_page_categories" + key = PreferenceKeys.eh_enabled_categories titleRes = R.string.frong_page_categories summaryRes = R.string.fromt_page_categories_summary onClick { - MaterialDialog(activity!!) - .title(R.string.frong_page_categories) - .message(R.string.fromt_page_categories_summary) - .customView(R.layout.eh_dialog_categories, scrollable = true) - .positiveButton { dialog -> - val customView = dialog.view.contentLayout.customView!! - val binding = EhDialogCategoriesBinding.bind(customView) - - with(binding) { - preferences.exhEnabledCategories().set( - listOf( - (!doujinshiCheckbox.isChecked), - (!mangaCheckbox.isChecked), - (!artistCgCheckbox.isChecked), - (!gameCgCheckbox.isChecked), - (!westernCheckbox.isChecked), - (!nonHCheckbox.isChecked), - (!imageSetCheckbox.isChecked), - (!cosplayCheckbox.isChecked), - (!asianPornCheckbox.isChecked), - (!miscCheckbox.isChecked) - ).joinToString(separator = ",") { it.toString() } - ) - } - - preferences.exhEnabledCategories().reconfigure() - } - .show { - val customView = this.view.contentLayout.customView!! - val binding = EhDialogCategoriesBinding.bind(customView) - - with(binding) { - val list = preferences.exhEnabledCategories().get().split(",").map { !it.toBoolean() } - doujinshiCheckbox.isChecked = list[0] - mangaCheckbox.isChecked = list[1] - artistCgCheckbox.isChecked = list[2] - gameCgCheckbox.isChecked = list[3] - westernCheckbox.isChecked = list[4] - nonHCheckbox.isChecked = list[5] - imageSetCheckbox.isChecked = list[6] - cosplayCheckbox.isChecked = list[7] - asianPornCheckbox.isChecked = list[8] - miscCheckbox.isChecked = list[9] - } - } + val dialog = FrontPageCategoriesDialog() + dialog.targetController = this@SettingsEhController + dialog.showDialog(router) } preferences.enableExhentai().asImmediateFlow { isVisible = it } @@ -540,10 +383,10 @@ class SettingsEhController : SettingsController() { onClick { activity?.let { activity -> - MaterialDialog(activity) - .title(R.string.favorites_sync_reset) - .message(R.string.favorites_sync_reset_message) - .positiveButton(android.R.string.ok) { + MaterialAlertDialogBuilder(activity) + .setTitle(R.string.favorites_sync_reset) + .setMessage(R.string.favorites_sync_reset_message) + .setPositiveButton(android.R.string.ok) { _, _ -> LocalFavoritesStorage().apply { getRealm().use { it.trans { @@ -553,8 +396,8 @@ class SettingsEhController : SettingsController() { } activity.toast(context.getString(R.string.sync_state_reset), Toast.LENGTH_LONG) } - .negativeButton(android.R.string.cancel) - .cancelable(false) + .setNegativeButton(android.R.string.cancel, null) + .setCancelable(false) .show() } } @@ -642,9 +485,10 @@ class SettingsEhController : SettingsController() { titleRes = R.string.show_updater_statistics onClick { - val progress = MaterialDialog(context) - .message(R.string.gallery_updater_statistics_collection) - .cancelable(false) + val progress = MaterialAlertDialogBuilder(context) + .setMessage(R.string.gallery_updater_statistics_collection) + .setCancelable(false) + .create() progress.show() viewScope.launch(Dispatchers.IO) { @@ -688,10 +532,10 @@ class SettingsEhController : SettingsController() { } withContext(Dispatchers.Main) { - MaterialDialog(context) - .title(R.string.gallery_updater_statistics) - .message(text = updateInfo) - .positiveButton(android.R.string.ok) + MaterialAlertDialogBuilder(context) + .setTitle(R.string.gallery_updater_statistics) + .setMessage(updateInfo) + .setPositiveButton(android.R.string.ok, null) .show() } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsMangaDexController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsMangaDexController.kt index a5cbc9758..997954b07 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsMangaDexController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsMangaDexController.kt @@ -1,8 +1,7 @@ package eu.kanade.tachiyomi.ui.setting import androidx.preference.PreferenceScreen -import com.afollestad.materialdialogs.MaterialDialog -import com.afollestad.materialdialogs.list.listItemsMultiChoice +import com.google.android.material.dialog.MaterialAlertDialogBuilder import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.data.library.LibraryUpdateService import eu.kanade.tachiyomi.data.preference.PreferenceKeys @@ -67,21 +66,33 @@ class SettingsMangaDexController : summaryRes = R.string.mangadex_sync_follows_to_library_summary onClick { - MaterialDialog(context) - .title(R.string.mangadex_sync_follows_to_library) - .message(R.string.mangadex_sync_follows_to_library_message) - .listItemsMultiChoice( - items = context.resources.getStringArray(R.array.md_follows_options).toList().let { it.subList(1, it.size) }, - initialSelection = intArrayOf(0, 5) - ) { _, indices, _ -> - preferences.mangadexSyncToLibraryIndexes().set(indices.map { (it + 1).toString() }.toSet()) + val items = context.resources.getStringArray(R.array.md_follows_options) + .drop(1) + .toTypedArray() + val selection = items.mapIndexed { index, _ -> + index == 0 || index == 5 + }.toBooleanArray() + MaterialAlertDialogBuilder(context) + .setTitle(R.string.mangadex_sync_follows_to_library) + // .setMessage(R.string.mangadex_sync_follows_to_library_message) + .setMultiChoiceItems( + items, + selection + ) { _, which, selected -> + selection[which] = selected + } + .setPositiveButton(android.R.string.ok) { _, _ -> + preferences.mangadexSyncToLibraryIndexes().set( + items.filterIndexed { index, _ -> selection[index] } + .mapIndexed { index, _ -> (index + 1).toString() } + .toSet() + ) LibraryUpdateService.start( context, target = LibraryUpdateService.Target.SYNC_FOLLOWS ) } - .positiveButton(android.R.string.ok) - .negativeButton(android.R.string.cancel) + .setNegativeButton(android.R.string.cancel, null) .show() } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsReaderController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsReaderController.kt index 662163e79..28f9ec41a 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsReaderController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsReaderController.kt @@ -4,8 +4,7 @@ import android.app.Dialog import android.os.Build import android.os.Bundle import androidx.preference.PreferenceScreen -import com.afollestad.materialdialogs.MaterialDialog -import com.afollestad.materialdialogs.list.listItemsMultiChoice +import com.google.android.material.dialog.MaterialAlertDialogBuilder import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.data.preference.PreferenceValues.TappingInvertMode import eu.kanade.tachiyomi.data.preference.PreferencesHelper @@ -543,27 +542,32 @@ class SettingsReaderController : SettingsController() { private val preferences: PreferencesHelper = Injekt.get() override fun onCreateDialog(savedViewState: Bundle?): Dialog { - val selected = preferences.readerBottomButtons().get() + val oldSelection = preferences.readerBottomButtons().get() val values = ReaderBottomButton.values() - val items = values.map { it.value } - val preselected = selected.mapNotNull { selection -> items.indexOf(selection).takeUnless { it == -1 } } - .toIntArray() + val selection = values.map { it.value in oldSelection } + .toBooleanArray() - return MaterialDialog(activity!!) - .title(R.string.reader_bottom_buttons) - .listItemsMultiChoice( - items = values.map { activity!!.getString(it.stringRes) }, - initialSelection = preselected - ) { _, selections: IntArray, _ -> - val included = selections - .map { values[it].value } + return MaterialAlertDialogBuilder(activity!!) + .setTitle(R.string.reader_bottom_buttons) + .setMultiChoiceItems( + values.map { activity!!.getString(it.stringRes) }.toTypedArray(), + selection + ) { _, which, selected -> + selection[which] = selected + } + .setPositiveButton(android.R.string.ok) { _, _ -> + val included = values + .filterIndexed { index, _ -> + selection[index] + } + .map { it.value } .toSet() preferences.readerBottomButtons().set(included) } - .positiveButton(android.R.string.ok) - .negativeButton(android.R.string.cancel) + .setNegativeButton(android.R.string.cancel, null) + .create() } } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsSecurityController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsSecurityController.kt index fdd7dd23b..c05c4512e 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsSecurityController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsSecurityController.kt @@ -3,8 +3,7 @@ package eu.kanade.tachiyomi.ui.setting import android.app.Dialog import android.os.Bundle import androidx.preference.PreferenceScreen -import com.afollestad.materialdialogs.MaterialDialog -import com.afollestad.materialdialogs.list.listItemsMultiChoice +import com.google.android.material.dialog.MaterialAlertDialogBuilder import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.data.preference.PreferencesHelper import eu.kanade.tachiyomi.data.preference.asImmediateFlow @@ -99,7 +98,7 @@ class SettingsSecurityController : SettingsController() { override fun onCreateDialog(savedViewState: Bundle?): Dialog { val activity = activity!! - val options = arrayOf( + val options = listOf( R.string.sunday, R.string.monday, R.string.tuesday, @@ -109,10 +108,11 @@ class SettingsSecurityController : SettingsController() { R.string.saturday ) .map { activity.getString(it) } + .toTypedArray() val lockDays = preferences.authenticatorDays().get() - val initialSelection = List(7) { - val locked = when (it) { + val selection = BooleanArray(7) { + when (it) { 0 -> (lockDays and SecureActivityDelegate.LOCK_SUNDAY) == SecureActivityDelegate.LOCK_SUNDAY 1 -> (lockDays and SecureActivityDelegate.LOCK_MONDAY) == SecureActivityDelegate.LOCK_MONDAY 2 -> (lockDays and SecureActivityDelegate.LOCK_TUESDAY) == SecureActivityDelegate.LOCK_TUESDAY @@ -122,35 +122,36 @@ class SettingsSecurityController : SettingsController() { 6 -> (lockDays and SecureActivityDelegate.LOCK_SATURDAY) == SecureActivityDelegate.LOCK_SATURDAY else -> false } - if (locked) { - it - } else null - }.filterNotNull().toIntArray() + } - return MaterialDialog(activity) - .title(R.string.biometric_lock_days) - .message(R.string.biometric_lock_days_summary) - .listItemsMultiChoice( - items = options, - initialSelection = initialSelection - ) { _, positions, _ -> + return MaterialAlertDialogBuilder(activity) + .setTitle(R.string.biometric_lock_days) + .setMultiChoiceItems( + options, + selection + ) { _, which, selected -> + selection[which] = selected + } + .setPositiveButton(android.R.string.ok) { _, _ -> var flags = 0 - positions.forEach { - when (it) { - 0 -> flags = flags or SecureActivityDelegate.LOCK_SUNDAY - 1 -> flags = flags or SecureActivityDelegate.LOCK_MONDAY - 2 -> flags = flags or SecureActivityDelegate.LOCK_TUESDAY - 3 -> flags = flags or SecureActivityDelegate.LOCK_WEDNESDAY - 4 -> flags = flags or SecureActivityDelegate.LOCK_THURSDAY - 5 -> flags = flags or SecureActivityDelegate.LOCK_FRIDAY - 6 -> flags = flags or SecureActivityDelegate.LOCK_SATURDAY + selection.forEachIndexed { index, checked -> + if (checked) { + when (index) { + 0 -> flags = flags or SecureActivityDelegate.LOCK_SUNDAY + 1 -> flags = flags or SecureActivityDelegate.LOCK_MONDAY + 2 -> flags = flags or SecureActivityDelegate.LOCK_TUESDAY + 3 -> flags = flags or SecureActivityDelegate.LOCK_WEDNESDAY + 4 -> flags = flags or SecureActivityDelegate.LOCK_THURSDAY + 5 -> flags = flags or SecureActivityDelegate.LOCK_FRIDAY + 6 -> flags = flags or SecureActivityDelegate.LOCK_SATURDAY + } } } preferences.authenticatorDays().set(flags) } - .positiveButton(android.R.string.ok) - .negativeButton(android.R.string.cancel) + .setNegativeButton(android.R.string.cancel, null) + .create() } } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/eh/FrontPageCategoriesDialog.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/eh/FrontPageCategoriesDialog.kt index 71a7359ea..323519a50 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/eh/FrontPageCategoriesDialog.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/eh/FrontPageCategoriesDialog.kt @@ -1,2 +1,93 @@ package eu.kanade.tachiyomi.ui.setting.eh +import android.app.Dialog +import android.os.Bundle +import android.view.LayoutInflater +import android.widget.ScrollView +import com.bluelinelabs.conductor.ControllerChangeHandler +import com.bluelinelabs.conductor.ControllerChangeType +import com.google.android.material.dialog.MaterialAlertDialogBuilder +import eu.kanade.tachiyomi.R +import eu.kanade.tachiyomi.data.preference.PreferencesHelper +import eu.kanade.tachiyomi.databinding.EhDialogCategoriesBinding +import eu.kanade.tachiyomi.ui.base.controller.DialogController +import eu.kanade.tachiyomi.ui.setting.SettingsEhController +import uy.kohesive.injekt.injectLazy + +class FrontPageCategoriesDialog( + bundle: Bundle? = null +) : DialogController(bundle) { + + var binding: EhDialogCategoriesBinding? = null + private set + + val preferences: PreferencesHelper by injectLazy() + + override fun onCreateDialog(savedViewState: Bundle?): Dialog { + binding = EhDialogCategoriesBinding.inflate(LayoutInflater.from(activity!!)) + val view = ScrollView(binding!!.root.context).apply { + addView(binding!!.root) + } + onViewCreated() + return MaterialAlertDialogBuilder(activity!!) + .setTitle(R.string.language_filtering) + .setMessage(R.string.language_filtering_summary) + .setView(view) + .setPositiveButton(android.R.string.ok) { _, _ -> + onPositive() + } + .setOnDismissListener { + onPositive() + } + .setOnCancelListener { + onPositive() + } + .setNegativeButton(android.R.string.cancel, null) + .create() + } + + fun onViewCreated() { + with(binding!!) { + val list = preferences.exhEnabledCategories().get().split(",").map { !it.toBoolean() } + doujinshiCheckbox.isChecked = list[0] + mangaCheckbox.isChecked = list[1] + artistCgCheckbox.isChecked = list[2] + gameCgCheckbox.isChecked = list[3] + westernCheckbox.isChecked = list[4] + nonHCheckbox.isChecked = list[5] + imageSetCheckbox.isChecked = list[6] + cosplayCheckbox.isChecked = list[7] + asianPornCheckbox.isChecked = list[8] + miscCheckbox.isChecked = list[9] + } + } + + fun onPositive() { + with(binding!!) { + preferences.exhEnabledCategories().set( + listOf( + (!doujinshiCheckbox.isChecked), + (!mangaCheckbox.isChecked), + (!artistCgCheckbox.isChecked), + (!gameCgCheckbox.isChecked), + (!westernCheckbox.isChecked), + (!nonHCheckbox.isChecked), + (!imageSetCheckbox.isChecked), + (!cosplayCheckbox.isChecked), + (!asianPornCheckbox.isChecked), + (!miscCheckbox.isChecked) + ).joinToString(separator = ",") { it.toString() } + ) + } + with(targetController as? SettingsEhController ?: return) { + preferences.exhSettingsLanguages().reconfigure() + } + } + + override fun onChangeStarted(handler: ControllerChangeHandler, type: ControllerChangeType) { + super.onChangeStarted(handler, type) + if (!type.isEnter) { + binding = null + } + } +} diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/eh/LanguagesDialog.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/eh/LanguagesDialog.kt index a773f072f..821ab2321 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/eh/LanguagesDialog.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/eh/LanguagesDialog.kt @@ -1,4 +1,183 @@ package eu.kanade.tachiyomi.ui.setting.eh -class LanguagesDialog { -} \ No newline at end of file +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 + } + } +} diff --git a/app/src/main/java/exh/debug/SettingsDebugController.kt b/app/src/main/java/exh/debug/SettingsDebugController.kt index bfa725768..36c5a74e8 100644 --- a/app/src/main/java/exh/debug/SettingsDebugController.kt +++ b/app/src/main/java/exh/debug/SettingsDebugController.kt @@ -5,7 +5,7 @@ import android.app.Activity import android.util.Log import androidx.core.text.HtmlCompat import androidx.preference.PreferenceScreen -import com.afollestad.materialdialogs.MaterialDialog +import com.google.android.material.dialog.MaterialAlertDialogBuilder import eu.kanade.tachiyomi.ui.setting.SettingsController import eu.kanade.tachiyomi.util.preference.defaultValue import eu.kanade.tachiyomi.util.preference.onClick @@ -36,23 +36,13 @@ class SettingsDebugController : SettingsController() { try { val result = it.call(DebugFunctions) val text = "Function returned result:\n\n$result" - MaterialDialog(context) - .title(text = title.toString()) - .message(text = text) { - messageTextView.apply { - setHorizontallyScrolling(true) - setTextIsSelectable(true) - } - } + MaterialAlertDialogBuilder(context) + .setTitle(title.toString()) + .setMessage(text) } catch (t: Throwable) { val text = "Function threw exception:\n\n${Log.getStackTraceString(t)}" - MaterialDialog(context) - .message(text = text) { - messageTextView.apply { - setHorizontallyScrolling(true) - setTextIsSelectable(true) - } - } + MaterialAlertDialogBuilder(context) + .setMessage(text) }.show() } } diff --git a/app/src/main/java/exh/favorites/FavoritesIntroDialog.kt b/app/src/main/java/exh/favorites/FavoritesIntroDialog.kt index 124129f81..a50911626 100644 --- a/app/src/main/java/exh/favorites/FavoritesIntroDialog.kt +++ b/app/src/main/java/exh/favorites/FavoritesIntroDialog.kt @@ -2,7 +2,7 @@ package exh.favorites import android.content.Context import androidx.core.text.HtmlCompat -import com.afollestad.materialdialogs.MaterialDialog +import com.google.android.material.dialog.MaterialAlertDialogBuilder import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.data.preference.PreferencesHelper import uy.kohesive.injekt.injectLazy @@ -10,12 +10,12 @@ import uy.kohesive.injekt.injectLazy class FavoritesIntroDialog { private val prefs: PreferencesHelper by injectLazy() - fun show(context: Context) = MaterialDialog(context) - .title(R.string.favorites_sync_notes) - .message(text = HtmlCompat.fromHtml(context.getString(R.string.favorites_sync_notes_message), HtmlCompat.FROM_HTML_MODE_LEGACY)) - .positiveButton(android.R.string.ok) { + fun show(context: Context) = MaterialAlertDialogBuilder(context) + .setTitle(R.string.favorites_sync_notes) + .setMessage(HtmlCompat.fromHtml(context.getString(R.string.favorites_sync_notes_message), HtmlCompat.FROM_HTML_MODE_LEGACY)) + .setPositiveButton(android.R.string.ok) { _, _ -> prefs.exhShowSyncIntro().set(false) } - .cancelable(false) + .setCancelable(false) .show() } diff --git a/app/src/main/java/exh/uconfig/ConfiguringDialogController.kt b/app/src/main/java/exh/uconfig/ConfiguringDialogController.kt index 065c975b4..ebc127a65 100644 --- a/app/src/main/java/exh/uconfig/ConfiguringDialogController.kt +++ b/app/src/main/java/exh/uconfig/ConfiguringDialogController.kt @@ -3,7 +3,8 @@ package exh.uconfig import android.app.Dialog import android.os.Bundle import android.view.View -import com.afollestad.materialdialogs.MaterialDialog +import androidx.appcompat.app.AlertDialog +import com.google.android.material.dialog.MaterialAlertDialogBuilder import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.ui.base.controller.DialogController import eu.kanade.tachiyomi.util.lang.launchIO @@ -14,7 +15,7 @@ import kotlinx.coroutines.MainScope import kotlinx.coroutines.cancel class ConfiguringDialogController : DialogController() { - private var materialDialog: MaterialDialog? = null + private var materialDialog: AlertDialog? = null val scope = MainScope() override fun onCreateDialog(savedViewState: Bundle?): Dialog { @@ -28,10 +29,10 @@ class ConfiguringDialogController : DialogController() { } catch (e: Exception) { launchUI { activity?.let { - MaterialDialog(it) - .title(R.string.eh_settings_configuration_failed) - .message(text = it.getString(R.string.eh_settings_configuration_failed_message, e.message)) - .positiveButton(android.R.string.ok) + MaterialAlertDialogBuilder(it) + .setTitle(R.string.eh_settings_configuration_failed) + .setMessage(it.getString(R.string.eh_settings_configuration_failed_message, e.message)) + .setPositiveButton(android.R.string.ok, null) .show() } } @@ -43,10 +44,11 @@ class ConfiguringDialogController : DialogController() { } } - return MaterialDialog(activity!!) - .title(R.string.eh_settings_uploading_to_server) - .message(R.string.eh_settings_uploading_to_server_message) - .cancelable(false) + return MaterialAlertDialogBuilder(activity!!) + .setTitle(R.string.eh_settings_uploading_to_server) + .setMessage(R.string.eh_settings_uploading_to_server_message) + .setCancelable(false) + .create() .also { materialDialog = it } diff --git a/app/src/main/java/exh/uconfig/WarnConfigureDialogController.kt b/app/src/main/java/exh/uconfig/WarnConfigureDialogController.kt index 5765851b1..a9329aeb8 100644 --- a/app/src/main/java/exh/uconfig/WarnConfigureDialogController.kt +++ b/app/src/main/java/exh/uconfig/WarnConfigureDialogController.kt @@ -2,8 +2,8 @@ package exh.uconfig import android.app.Dialog import android.os.Bundle -import com.afollestad.materialdialogs.MaterialDialog import com.bluelinelabs.conductor.Router +import com.google.android.material.dialog.MaterialAlertDialogBuilder import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.data.preference.PreferencesHelper import eu.kanade.tachiyomi.ui.base.controller.DialogController @@ -14,14 +14,15 @@ import uy.kohesive.injekt.injectLazy class WarnConfigureDialogController : DialogController() { private val prefs: PreferencesHelper by injectLazy() override fun onCreateDialog(savedViewState: Bundle?): Dialog { - return MaterialDialog(activity!!) - .title(R.string.settings_profile_note) - .message(R.string.settings_profile_note_message) - .positiveButton(android.R.string.ok) { + return MaterialAlertDialogBuilder(activity!!) + .setTitle(R.string.settings_profile_note) + .setMessage(R.string.settings_profile_note_message) + .setPositiveButton(android.R.string.ok) { _, _ -> prefs.exhShowSettingsUploadWarning().set(false) ConfiguringDialogController().showDialog(router) } - .cancelable(false) + .setCancelable(false) + .create() } companion object { diff --git a/app/src/main/java/exh/ui/batchadd/BatchAddController.kt b/app/src/main/java/exh/ui/batchadd/BatchAddController.kt index 58ee53183..d94974047 100755 --- a/app/src/main/java/exh/ui/batchadd/BatchAddController.kt +++ b/app/src/main/java/exh/ui/batchadd/BatchAddController.kt @@ -3,7 +3,7 @@ package exh.ui.batchadd import android.view.LayoutInflater import android.view.View import android.widget.TextView -import com.afollestad.materialdialogs.MaterialDialog +import com.google.android.material.dialog.MaterialAlertDialogBuilder import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.databinding.EhFragmentBatchAddBinding import eu.kanade.tachiyomi.ui.base.controller.NucleusController @@ -143,12 +143,10 @@ class BatchAddController : NucleusController materialDialog.dismiss() } - .cancelable(true) - .cancelOnTouchOutside(true) + MaterialAlertDialogBuilder(it) + .setTitle(R.string.batch_add_no_valid_galleries) + .setMessage(R.string.batch_add_no_valid_galleries_message) + .setPositiveButton(android.R.string.ok, null) .show() } } diff --git a/app/src/main/java/exh/ui/captcha/BrowserActionActivity.kt b/app/src/main/java/exh/ui/captcha/BrowserActionActivity.kt index 59dac52b0..79103444a 100644 --- a/app/src/main/java/exh/ui/captcha/BrowserActionActivity.kt +++ b/app/src/main/java/exh/ui/captcha/BrowserActionActivity.kt @@ -11,7 +11,7 @@ import android.webkit.JsResult import android.webkit.WebChromeClient import android.webkit.WebView import androidx.appcompat.app.AppCompatActivity -import com.afollestad.materialdialogs.MaterialDialog +import com.google.android.material.dialog.MaterialAlertDialogBuilder import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.data.preference.PreferencesHelper import eu.kanade.tachiyomi.databinding.EhActivityCaptchaBinding @@ -190,12 +190,10 @@ class BrowserActionActivity : AppCompatActivity() { xLogE("Captcha solve Error", IllegalStateException("Captcha solve failure!")) withUIContext { binding.webview.evaluateJavascript(SOLVE_UI_SCRIPT_HIDE, null) - MaterialDialog(this@BrowserActionActivity) - .title(R.string.captcha_solve_failure) - .message(R.string.captcha_solve_failure_message) - .cancelable(true) - .cancelOnTouchOutside(true) - .positiveButton(android.R.string.ok) + MaterialAlertDialogBuilder(this@BrowserActionActivity) + .setTitle(R.string.captcha_solve_failure) + .setMessage(R.string.captcha_solve_failure_message) + .setPositiveButton(android.R.string.ok, null) .show() } } diff --git a/app/src/main/java/exh/ui/intercept/InterceptActivity.kt b/app/src/main/java/exh/ui/intercept/InterceptActivity.kt index 2af1bf80f..090df62d8 100755 --- a/app/src/main/java/exh/ui/intercept/InterceptActivity.kt +++ b/app/src/main/java/exh/ui/intercept/InterceptActivity.kt @@ -5,10 +5,7 @@ import android.os.Bundle import android.view.MenuItem import androidx.core.view.isVisible import androidx.lifecycle.lifecycleScope -import com.afollestad.materialdialogs.MaterialDialog -import com.afollestad.materialdialogs.callbacks.onCancel -import com.afollestad.materialdialogs.callbacks.onDismiss -import com.afollestad.materialdialogs.list.listItemsSingleChoice +import com.google.android.material.dialog.MaterialAlertDialogBuilder import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.data.database.models.Chapter import eu.kanade.tachiyomi.data.database.models.Manga @@ -83,14 +80,12 @@ class InterceptActivity : BaseViewBindingActivity() is InterceptResult.Failure -> { binding.interceptProgress.isVisible = false binding.interceptStatus.text = this.getString(R.string.error_with_reason, it.reason) - MaterialDialog(this) - .title(R.string.chapter_error) - .message(text = this.getString(R.string.could_not_open_manga, it.reason)) - .cancelable(true) - .cancelOnTouchOutside(true) - .positiveButton(android.R.string.ok) - .onCancel { onBackPressed() } - .onDismiss { onBackPressed() } + MaterialAlertDialogBuilder(this) + .setTitle(R.string.chapter_error) + .setMessage(getString(R.string.could_not_open_manga, it.reason)) + .setPositiveButton(android.R.string.ok, null) + .setOnCancelListener { onBackPressed() } + .setOnDismissListener { onBackPressed() } .show() } } @@ -114,9 +109,10 @@ class InterceptActivity : BaseViewBindingActivity() status.value = InterceptResult.Loading val sources = galleryAdder.pickSource(gallery) if (sources.size > 1) { - MaterialDialog(this) - .title(R.string.label_sources) - .listItemsSingleChoice(items = sources.map { it.toString() }) { _, index, _ -> + MaterialAlertDialogBuilder(this) + .setTitle(R.string.label_sources) + .setSingleChoiceItems(sources.map { it.toString() }.toTypedArray(), 0) { dialog, index -> + dialog.dismiss() loadGalleryEnd(gallery, sources[index]) } .show() diff --git a/app/src/main/java/exh/ui/login/EhLoginActivity.kt b/app/src/main/java/exh/ui/login/EhLoginActivity.kt index 7ba5ee4af..8651817c6 100644 --- a/app/src/main/java/exh/ui/login/EhLoginActivity.kt +++ b/app/src/main/java/exh/ui/login/EhLoginActivity.kt @@ -13,8 +13,7 @@ import android.widget.Toast import androidx.core.view.isInvisible import androidx.core.view.isVisible import androidx.lifecycle.lifecycleScope -import com.afollestad.materialdialogs.MaterialDialog -import com.afollestad.materialdialogs.input.input +import com.google.android.material.dialog.MaterialAlertDialogBuilder import eu.kanade.tachiyomi.BuildConfig import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.data.preference.PreferencesHelper @@ -25,6 +24,7 @@ import eu.kanade.tachiyomi.util.lang.launchUI import eu.kanade.tachiyomi.util.system.WebViewUtil import eu.kanade.tachiyomi.util.system.setDefaultSettings import eu.kanade.tachiyomi.util.system.toast +import eu.kanade.tachiyomi.widget.materialdialogs.setTextInput import exh.log.xLogD import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach @@ -147,18 +147,18 @@ class EhLoginActivity : BaseViewBindingActivity() { private fun openIgneousDialog() { var igneous: CharSequence? = null - MaterialDialog(this) - .title(R.string.custom_igneous_cookie) - .message(R.string.custom_igneous_cookie_message) - .input { _, charSequence -> - igneous = charSequence + MaterialAlertDialogBuilder(this) + .setTitle(R.string.custom_igneous_cookie) + .setMessage(R.string.custom_igneous_cookie_message) + .setTextInput { igneousText -> + igneous = igneousText } - .positiveButton(android.R.string.ok) { + .setPositiveButton(android.R.string.ok) { _, _ -> if (!igneous.isNullOrBlank()) { this.igneous = igneous?.toString()?.trim() } } - .negativeButton(android.R.string.cancel) + .setNegativeButton(android.R.string.cancel, null) .show() } diff --git a/app/src/main/java/exh/widget/preference/MangadexLoginDialog.kt b/app/src/main/java/exh/widget/preference/MangadexLoginDialog.kt index d05442760..036de4bc6 100644 --- a/app/src/main/java/exh/widget/preference/MangadexLoginDialog.kt +++ b/app/src/main/java/exh/widget/preference/MangadexLoginDialog.kt @@ -5,11 +5,10 @@ import android.os.Bundle import android.view.LayoutInflater import androidx.core.os.bundleOf import androidx.core.view.isVisible -import com.afollestad.materialdialogs.MaterialDialog -import com.afollestad.materialdialogs.customview.customView import com.bluelinelabs.conductor.ControllerChangeHandler import com.bluelinelabs.conductor.ControllerChangeType import com.dd.processbutton.iml.ActionProcessButton +import com.google.android.material.dialog.MaterialAlertDialogBuilder import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.data.preference.PreferencesHelper import eu.kanade.tachiyomi.databinding.PrefSiteLoginTwoFactorAuthBinding @@ -48,12 +47,10 @@ class MangadexLoginDialog(bundle: Bundle? = null) : DialogController(bundle) { override fun onCreateDialog(savedViewState: Bundle?): Dialog { binding = PrefSiteLoginTwoFactorAuthBinding.inflate(LayoutInflater.from(activity!!)) - val dialog = MaterialDialog(activity!!) - .customView(view = binding.root, scrollable = false) - onViewCreated() - - return dialog + return MaterialAlertDialogBuilder(activity!!) + .setView(binding.root) + .create() } fun onViewCreated() { diff --git a/app/src/main/java/exh/widget/preference/MangadexLogoutDialog.kt b/app/src/main/java/exh/widget/preference/MangadexLogoutDialog.kt index 29b180062..d3312bc38 100644 --- a/app/src/main/java/exh/widget/preference/MangadexLogoutDialog.kt +++ b/app/src/main/java/exh/widget/preference/MangadexLogoutDialog.kt @@ -3,7 +3,7 @@ package exh.widget.preference import android.app.Dialog import android.os.Bundle import androidx.core.os.bundleOf -import com.afollestad.materialdialogs.MaterialDialog +import com.google.android.material.dialog.MaterialAlertDialogBuilder import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.data.track.TrackManager import eu.kanade.tachiyomi.source.Source @@ -34,9 +34,9 @@ class MangadexLogoutDialog(bundle: Bundle? = null) : DialogController(bundle) { ) override fun onCreateDialog(savedViewState: Bundle?): Dialog { - return MaterialDialog(activity!!) - .title(R.string.logout) - .positiveButton(R.string.logout) { + return MaterialAlertDialogBuilder(activity!!) + .setTitle(R.string.logout) + .setPositiveButton(R.string.logout) { _, _ -> launchNow { supervisorScope { if (source != null) { @@ -66,7 +66,8 @@ class MangadexLogoutDialog(bundle: Bundle? = null) : DialogController(bundle) { } } } - .negativeButton(android.R.string.cancel) + .setNegativeButton(android.R.string.cancel, null) + .create() } interface Listener { diff --git a/app/src/main/res/values/strings_sy.xml b/app/src/main/res/values/strings_sy.xml index 07a2f88a0..8022d2d60 100644 --- a/app/src/main/res/values/strings_sy.xml +++ b/app/src/main/res/values/strings_sy.xml @@ -221,7 +221,7 @@ Enter starting time Enter end time - Biometric lock time completed + Biometric lock time deleted Invalid time selected Biometric lock days Days to have the app locked