From eed8ef7010480e514974abea6c0a866cb5a06212 Mon Sep 17 00:00:00 2001 From: Zakhar Timoshenko Date: Sun, 16 Jan 2022 17:53:03 +0300 Subject: [PATCH] Initial Material 3 theming --- app/src/main/AndroidManifest.xml | 2 +- .../kotatsu/base/ui/AlertDialogFragment.kt | 6 +- .../koitharu/kotatsu/base/ui/BaseActivity.kt | 2 +- .../kotatsu/base/ui/BaseBottomSheet.kt | 2 +- .../base/ui/dialog/CheckBoxAlertDialog.kt | 3 +- .../base/ui/dialog/StorageSelectDialog.kt | 3 +- .../kotatsu/base/ui/dialog/TextInputDialog.kt | 3 +- .../kotatsu/base/ui/widgets/ChipsView.kt | 2 - .../browser/cloudflare/CloudFlareDialog.kt | 4 +- .../kotatsu/core/prefs/AppSettings.kt | 1 + .../kotatsu/details/ui/DetailsActivity.kt | 22 +-- .../kotatsu/details/ui/DetailsFragment.kt | 10 +- .../kotatsu/download/ui/DownloadsActivity.kt | 16 ++- .../ui/categories/CategoriesActivity.kt | 18 ++- .../ui/categories/CategoriesEditDelegate.kt | 4 +- .../kotatsu/history/ui/HistoryListFragment.kt | 4 +- .../kotatsu/image/ui/ImageActivity.kt | 16 ++- .../kotatsu/list/ui/ListModeSelectDialog.kt | 4 +- .../kotatsu/list/ui/MangaListFragment.kt | 7 +- .../kotatsu/local/ui/LocalListFragment.kt | 4 +- .../koitharu/kotatsu/main/ui/MainActivity.kt | 57 +------- .../kotatsu/reader/ui/ChaptersDialog.kt | 4 +- .../kotatsu/reader/ui/ReaderActivity.kt | 4 +- .../kotatsu/reader/ui/ReaderConfigDialog.kt | 4 +- .../reader/ui/SimpleSettingsActivity.kt | 16 ++- .../ui/thumbnails/PagesThumbnailsSheet.kt | 2 +- .../kotatsu/search/ui/SearchActivity.kt | 16 ++- .../search/ui/global/GlobalSearchActivity.kt | 16 ++- .../kotatsu/settings/AppUpdateChecker.kt | 4 +- .../settings/HistorySettingsFragment.kt | 6 +- .../kotatsu/settings/MainSettingsFragment.kt | 3 + .../kotatsu/settings/SettingsActivity.kt | 16 ++- .../settings/backup/BackupDialogFragment.kt | 6 +- .../settings/backup/RestoreDialogFragment.kt | 8 +- .../settings/onboard/OnboardDialogFragment.kt | 4 +- .../kotatsu/tracker/ui/FeedFragment.kt | 4 +- .../koitharu/kotatsu/utils/ext/AndroidExt.kt | 5 +- app/src/main/res/color/ripple_toolbar.xml | 5 + app/src/main/res/color/selector_overlay.xml | 2 +- .../res/drawable-w600dp/tab_indicator.xml | 11 -- app/src/main/res/drawable/badge.xml | 2 +- .../main/res/drawable/bg_badge_default.xml | 2 +- app/src/main/res/drawable/ic_close.xml | 6 + app/src/main/res/drawable/ic_placeholder.xml | 2 +- app/src/main/res/drawable/ic_totoro.xml | 2 +- app/src/main/res/drawable/tab_indicator.xml | 9 -- app/src/main/res/drawable/tabs_background.xml | 20 --- .../main/res/drawable/toolbar_background.xml | 8 ++ .../layout-w600dp-land/fragment_details.xml | 38 ++--- .../layout-w600dp-port/fragment_details.xml | 39 ++---- .../res/layout-w600dp/activity_details.xml | 5 +- .../res/layout-w600dp/activity_settings.xml | 3 - .../main/res/layout-w600dp/fragment_list.xml | 2 +- app/src/main/res/layout/activity_browser.xml | 3 - .../main/res/layout/activity_categories.xml | 12 +- app/src/main/res/layout/activity_details.xml | 8 +- .../main/res/layout/activity_downloads.xml | 11 +- app/src/main/res/layout/activity_image.xml | 1 - app/src/main/res/layout/activity_main.xml | 20 +-- app/src/main/res/layout/activity_protect.xml | 7 +- app/src/main/res/layout/activity_reader.xml | 11 +- app/src/main/res/layout/activity_search.xml | 5 +- .../res/layout/activity_search_global.xml | 9 +- app/src/main/res/layout/activity_settings.xml | 20 ++- .../res/layout/activity_settings_simple.xml | 7 +- .../res/layout/activity_setup_protect.xml | 7 +- .../res/layout/dialog_favorite_categories.xml | 9 +- app/src/main/res/layout/dialog_onboard.xml | 2 +- app/src/main/res/layout/dialog_progress.xml | 4 +- .../main/res/layout/dialog_reader_config.xml | 2 +- app/src/main/res/layout/fragment_details.xml | 39 ++---- app/src/main/res/layout/fragment_feed.xml | 5 - app/src/main/res/layout/item_branch.xml | 2 +- .../main/res/layout/item_branch_dropdown.xml | 4 +- app/src/main/res/layout/item_category.xml | 3 +- .../res/layout/item_category_checkable.xml | 3 +- .../layout/item_category_checkable_single.xml | 3 +- app/src/main/res/layout/item_chapter.xml | 8 +- .../res/layout/item_checkable_multiple.xml | 1 + .../main/res/layout/item_checkable_single.xml | 1 + app/src/main/res/layout/item_download.xml | 10 +- app/src/main/res/layout/item_empty_state.xml | 8 +- app/src/main/res/layout/item_error_footer.xml | 6 +- app/src/main/res/layout/item_error_state.xml | 4 +- app/src/main/res/layout/item_expandable.xml | 1 + .../main/res/layout/item_filter_header.xml | 3 +- app/src/main/res/layout/item_header.xml | 5 +- app/src/main/res/layout/item_manga_grid.xml | 7 +- app/src/main/res/layout/item_manga_list.xml | 9 +- .../res/layout/item_manga_list_details.xml | 15 +- app/src/main/res/layout/item_page.xml | 6 +- app/src/main/res/layout/item_page_thumb.xml | 2 +- .../layout/item_search_suggestion_manga.xml | 4 +- .../layout/item_search_suggestion_query.xml | 2 +- .../main/res/layout/item_source_config.xml | 3 +- .../main/res/layout/item_source_locale.xml | 3 +- app/src/main/res/layout/item_storage.xml | 14 +- app/src/main/res/layout/item_tracklog.xml | 4 +- app/src/main/res/layout/navigation_header.xml | 9 +- app/src/main/res/layout/sheet_pages.xml | 5 +- app/src/main/res/values-night/bools.xml | 6 + app/src/main/res/values-night/colors.xml | 21 +-- .../main/res/values-night/colors_kotatsu.xml | 29 ++++ app/src/main/res/values-night/colors_test.xml | 25 ++++ app/src/main/res/values-night/themes.xml | 14 +- .../main/res/values-notnight-v23/bools.xml | 4 - .../main/res/values-notnight-v23/colors.xml | 5 - .../main/res/values-notnight-v27/bools.xml | 4 - .../main/res/values-notnight-v27/colors.xml | 5 - app/src/main/res/values-v27/bools.xml | 5 + app/src/main/res/values-v27/themes.xml | 11 ++ app/src/main/res/values-v29/themes.xml | 10 -- app/src/main/res/values-w600dp/bools.xml | 2 +- app/src/main/res/values/attrs.xml | 3 + app/src/main/res/values/bools.xml | 7 +- app/src/main/res/values/colors.xml | 31 ++-- app/src/main/res/values/colors_kotatsu.xml | 29 ++++ app/src/main/res/values/colors_test.xml | 25 ++++ app/src/main/res/values/strings.xml | 7 + app/src/main/res/values/styles.xml | 132 ++++++++++-------- app/src/main/res/values/themes.xml | 107 +++++++++----- app/src/main/res/xml/pref_main.xml | 7 + 122 files changed, 654 insertions(+), 626 deletions(-) create mode 100644 app/src/main/res/color/ripple_toolbar.xml delete mode 100644 app/src/main/res/drawable-w600dp/tab_indicator.xml create mode 100644 app/src/main/res/drawable/ic_close.xml delete mode 100644 app/src/main/res/drawable/tab_indicator.xml delete mode 100644 app/src/main/res/drawable/tabs_background.xml create mode 100644 app/src/main/res/drawable/toolbar_background.xml create mode 100644 app/src/main/res/values-night/bools.xml create mode 100644 app/src/main/res/values-night/colors_kotatsu.xml create mode 100644 app/src/main/res/values-night/colors_test.xml delete mode 100644 app/src/main/res/values-notnight-v23/bools.xml delete mode 100644 app/src/main/res/values-notnight-v23/colors.xml delete mode 100644 app/src/main/res/values-notnight-v27/bools.xml delete mode 100644 app/src/main/res/values-notnight-v27/colors.xml create mode 100644 app/src/main/res/values-v27/bools.xml create mode 100644 app/src/main/res/values-v27/themes.xml delete mode 100644 app/src/main/res/values-v29/themes.xml create mode 100644 app/src/main/res/values/colors_kotatsu.xml create mode 100644 app/src/main/res/values/colors_test.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 2cc8e53e2..04826207b 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -20,7 +20,7 @@ android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" - android:theme="@style/AppTheme" + android:theme="@style/Theme.Kotatsu" android:networkSecurityConfig="@xml/network_security_config" tools:ignore="UnusedAttribute"> : DialogFragment() { @@ -20,7 +20,7 @@ abstract class AlertDialogFragment : DialogFragment() { val inflater = activity?.layoutInflater ?: LayoutInflater.from(requireContext()) val binding = onInflateView(inflater, null) viewBinding = binding - return AlertDialog.Builder(requireContext(), theme) + return MaterialAlertDialogBuilder(requireContext(), theme) .setView(binding.root) .also(::onBuildDialog) .create() @@ -38,7 +38,7 @@ abstract class AlertDialogFragment : DialogFragment() { super.onDestroyView() } - open fun onBuildDialog(builder: AlertDialog.Builder) = Unit + open fun onBuildDialog(builder: MaterialAlertDialogBuilder) = Unit protected fun bindingOrNull(): B? = viewBinding diff --git a/app/src/main/java/org/koitharu/kotatsu/base/ui/BaseActivity.kt b/app/src/main/java/org/koitharu/kotatsu/base/ui/BaseActivity.kt index 5e91880a1..2be9a19c6 100644 --- a/app/src/main/java/org/koitharu/kotatsu/base/ui/BaseActivity.kt +++ b/app/src/main/java/org/koitharu/kotatsu/base/ui/BaseActivity.kt @@ -36,7 +36,7 @@ abstract class BaseActivity : AppCompatActivity(), OnApplyWindo override fun onCreate(savedInstanceState: Bundle?) { if (get().isAmoledTheme) { - setTheme(R.style.AppTheme_AMOLED) + setTheme(R.style.ThemeOverlay_Kotatsu_AMOLED) } super.onCreate(savedInstanceState) WindowCompat.setDecorFitsSystemWindows(window, false) diff --git a/app/src/main/java/org/koitharu/kotatsu/base/ui/BaseBottomSheet.kt b/app/src/main/java/org/koitharu/kotatsu/base/ui/BaseBottomSheet.kt index 1a522dfb0..b2921cdbd 100644 --- a/app/src/main/java/org/koitharu/kotatsu/base/ui/BaseBottomSheet.kt +++ b/app/src/main/java/org/koitharu/kotatsu/base/ui/BaseBottomSheet.kt @@ -34,7 +34,7 @@ abstract class BaseBottomSheet : } override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { - return if (resources.getBoolean(R.bool.is_tablet)) { + return if (resources.getBoolean(R.bool.isTablet)) { AppCompatDialog(context, theme) } else super.onCreateDialog(savedInstanceState) } diff --git a/app/src/main/java/org/koitharu/kotatsu/base/ui/dialog/CheckBoxAlertDialog.kt b/app/src/main/java/org/koitharu/kotatsu/base/ui/dialog/CheckBoxAlertDialog.kt index ef059eff7..c452bd1ce 100644 --- a/app/src/main/java/org/koitharu/kotatsu/base/ui/dialog/CheckBoxAlertDialog.kt +++ b/app/src/main/java/org/koitharu/kotatsu/base/ui/dialog/CheckBoxAlertDialog.kt @@ -6,6 +6,7 @@ import android.view.LayoutInflater import androidx.annotation.DrawableRes import androidx.annotation.StringRes import androidx.appcompat.app.AlertDialog +import com.google.android.material.dialog.MaterialAlertDialogBuilder import org.koitharu.kotatsu.databinding.DialogCheckboxBinding class CheckBoxAlertDialog private constructor(private val delegate: AlertDialog) : @@ -17,7 +18,7 @@ class CheckBoxAlertDialog private constructor(private val delegate: AlertDialog) private val binding = DialogCheckboxBinding.inflate(LayoutInflater.from(context)) - private val delegate = AlertDialog.Builder(context) + private val delegate = MaterialAlertDialogBuilder(context) .setView(binding.root) fun setTitle(@StringRes titleResId: Int): Builder { diff --git a/app/src/main/java/org/koitharu/kotatsu/base/ui/dialog/StorageSelectDialog.kt b/app/src/main/java/org/koitharu/kotatsu/base/ui/dialog/StorageSelectDialog.kt index 5b843358f..481b54dcf 100644 --- a/app/src/main/java/org/koitharu/kotatsu/base/ui/dialog/StorageSelectDialog.kt +++ b/app/src/main/java/org/koitharu/kotatsu/base/ui/dialog/StorageSelectDialog.kt @@ -7,6 +7,7 @@ import android.view.ViewGroup import android.widget.BaseAdapter import androidx.annotation.StringRes import androidx.appcompat.app.AlertDialog +import com.google.android.material.dialog.MaterialAlertDialogBuilder import org.koitharu.kotatsu.R import org.koitharu.kotatsu.databinding.ItemStorageBinding import org.koitharu.kotatsu.local.domain.LocalMangaRepository @@ -23,7 +24,7 @@ class StorageSelectDialog private constructor(private val delegate: AlertDialog) class Builder(context: Context, defaultValue: File?, listener: OnStorageSelectListener) { private val adapter = VolumesAdapter(context) - private val delegate = AlertDialog.Builder(context) + private val delegate = MaterialAlertDialogBuilder(context) init { if (adapter.isEmpty) { diff --git a/app/src/main/java/org/koitharu/kotatsu/base/ui/dialog/TextInputDialog.kt b/app/src/main/java/org/koitharu/kotatsu/base/ui/dialog/TextInputDialog.kt index c2ff116eb..4b5c02ca6 100644 --- a/app/src/main/java/org/koitharu/kotatsu/base/ui/dialog/TextInputDialog.kt +++ b/app/src/main/java/org/koitharu/kotatsu/base/ui/dialog/TextInputDialog.kt @@ -6,6 +6,7 @@ import android.text.InputFilter import android.view.LayoutInflater import androidx.annotation.StringRes import androidx.appcompat.app.AlertDialog +import com.google.android.material.dialog.MaterialAlertDialogBuilder import org.koitharu.kotatsu.databinding.DialogInputBinding class TextInputDialog private constructor( @@ -18,7 +19,7 @@ class TextInputDialog private constructor( private val binding = DialogInputBinding.inflate(LayoutInflater.from(context)) - private val delegate = AlertDialog.Builder(context) + private val delegate = MaterialAlertDialogBuilder(context) .setView(binding.root) fun setTitle(@StringRes titleResId: Int): Builder { diff --git a/app/src/main/java/org/koitharu/kotatsu/base/ui/widgets/ChipsView.kt b/app/src/main/java/org/koitharu/kotatsu/base/ui/widgets/ChipsView.kt index d9ee9f535..7d8730c33 100644 --- a/app/src/main/java/org/koitharu/kotatsu/base/ui/widgets/ChipsView.kt +++ b/app/src/main/java/org/koitharu/kotatsu/base/ui/widgets/ChipsView.kt @@ -4,7 +4,6 @@ import android.content.Context import android.util.AttributeSet import android.view.View.OnClickListener import androidx.annotation.DrawableRes -import androidx.core.content.ContextCompat import androidx.core.view.children import com.google.android.material.chip.Chip import com.google.android.material.chip.ChipDrawable @@ -77,7 +76,6 @@ class ChipsView @JvmOverloads constructor( val chip = Chip(context) val drawable = ChipDrawable.createFromAttributes(context, null, 0, R.style.Widget_Kotatsu_Chip) chip.setChipDrawable(drawable) - chip.setTextColor(ContextCompat.getColor(context, R.color.color_primary)) chip.isCloseIconVisible = onChipCloseClickListener != null chip.setOnCloseIconClickListener(chipOnCloseListener) chip.setEnsureMinTouchTargetSize(false) diff --git a/app/src/main/java/org/koitharu/kotatsu/browser/cloudflare/CloudFlareDialog.kt b/app/src/main/java/org/koitharu/kotatsu/browser/cloudflare/CloudFlareDialog.kt index 641a17a6a..8c1de2625 100644 --- a/app/src/main/java/org/koitharu/kotatsu/browser/cloudflare/CloudFlareDialog.kt +++ b/app/src/main/java/org/koitharu/kotatsu/browser/cloudflare/CloudFlareDialog.kt @@ -8,9 +8,9 @@ import android.view.View import android.view.ViewGroup import android.webkit.CookieManager import android.webkit.WebSettings -import androidx.appcompat.app.AlertDialog import androidx.core.view.isInvisible import androidx.fragment.app.setFragmentResult +import com.google.android.material.dialog.MaterialAlertDialogBuilder import org.koin.android.ext.android.get import org.koitharu.kotatsu.base.ui.AlertDialogFragment import org.koitharu.kotatsu.core.network.UserAgentInterceptor @@ -52,7 +52,7 @@ class CloudFlareDialog : AlertDialogFragment(), Cloud super.onDestroyView() } - override fun onBuildDialog(builder: AlertDialog.Builder) { + override fun onBuildDialog(builder: MaterialAlertDialogBuilder) { builder.setNegativeButton(android.R.string.cancel, null) } diff --git a/app/src/main/java/org/koitharu/kotatsu/core/prefs/AppSettings.kt b/app/src/main/java/org/koitharu/kotatsu/core/prefs/AppSettings.kt index da6b349b6..b861986fd 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/prefs/AppSettings.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/prefs/AppSettings.kt @@ -164,6 +164,7 @@ class AppSettings private constructor(private val prefs: SharedPreferences) : const val KEY_LIST_MODE = "list_mode_2" const val KEY_APP_SECTION = "app_section" const val KEY_THEME = "theme" + const val KEY_DYNAMIC_THEME = "dynamic_theme" const val KEY_THEME_AMOLED = "amoled_theme" const val KEY_DATE_FORMAT = "date_format" const val KEY_HIDE_TOOLBAR = "hide_toolbar" diff --git a/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsActivity.kt b/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsActivity.kt index 2d7166ae6..6b0b78279 100644 --- a/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsActivity.kt +++ b/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsActivity.kt @@ -6,15 +6,17 @@ import android.net.Uri import android.os.Bundle import android.view.Menu import android.view.MenuItem +import android.view.ViewGroup import android.widget.Toast -import androidx.appcompat.app.AlertDialog import androidx.appcompat.view.ActionMode import androidx.appcompat.widget.Toolbar import androidx.core.content.pm.ShortcutManagerCompat import androidx.core.graphics.Insets import androidx.core.net.toFile +import androidx.core.view.updateLayoutParams import androidx.core.view.updatePadding import androidx.lifecycle.lifecycleScope +import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.snackbar.Snackbar import com.google.android.material.tabs.TabLayout import com.google.android.material.tabs.TabLayoutMediator @@ -94,11 +96,15 @@ class DetailsActivity : BaseActivity(), binding.snackbar.updatePadding( bottom = insets.bottom ) - binding.toolbar.updatePadding( - top = insets.top, - left = insets.left, - right = insets.right - ) + with(binding.toolbar) { + updatePadding( + left = insets.left, + right = insets.right + ) + updateLayoutParams { + topMargin = insets.top + } + } if (binding.tabs.parent !is Toolbar) { binding.tabs.updatePadding( left = insets.left, @@ -149,7 +155,7 @@ class DetailsActivity : BaseActivity(), } R.id.action_delete -> { viewModel.manga.value?.let { m -> - AlertDialog.Builder(this) + MaterialAlertDialogBuilder(this) .setTitle(R.string.delete_manga) .setMessage(getString(R.string.text_delete_local_manga, m.title)) .setPositiveButton(R.string.delete) { _, _ -> @@ -164,7 +170,7 @@ class DetailsActivity : BaseActivity(), viewModel.manga.value?.let { val chaptersCount = it.chapters?.size ?: 0 if (chaptersCount > 5) { - AlertDialog.Builder(this) + MaterialAlertDialogBuilder(this) .setTitle(R.string.save_manga) .setMessage( getString( diff --git a/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsFragment.kt b/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsFragment.kt index 844cb06ac..3d6ce19f0 100644 --- a/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsFragment.kt @@ -44,7 +44,7 @@ class DetailsFragment : BaseFragment(), View.OnClickList override fun onInflateView( inflater: LayoutInflater, - container: ViewGroup? + container: ViewGroup?, ) = FragmentDetailsBinding.inflate(inflater, container, false) override fun onViewCreated(view: View, savedInstanceState: Bundle?) { @@ -76,13 +76,17 @@ class DetailsFragment : BaseFragment(), View.OnClickList MangaState.FINISHED -> { textViewState.apply { textAndVisible = resources.getString(R.string.state_finished) - drawableStart = ResourcesCompat.getDrawable(resources, R.drawable.ic_state_finished, context.theme) + drawableStart = ResourcesCompat.getDrawable(resources, + R.drawable.ic_state_finished, + context.theme) } } MangaState.ONGOING -> { textViewState.apply { textAndVisible = resources.getString(R.string.state_ongoing) - drawableStart = ResourcesCompat.getDrawable(resources, R.drawable.ic_state_ongoing, context.theme) + drawableStart = ResourcesCompat.getDrawable(resources, + R.drawable.ic_state_ongoing, + context.theme) } } else -> textViewState.isVisible = false diff --git a/app/src/main/java/org/koitharu/kotatsu/download/ui/DownloadsActivity.kt b/app/src/main/java/org/koitharu/kotatsu/download/ui/DownloadsActivity.kt index b9f3695da..d590a724d 100644 --- a/app/src/main/java/org/koitharu/kotatsu/download/ui/DownloadsActivity.kt +++ b/app/src/main/java/org/koitharu/kotatsu/download/ui/DownloadsActivity.kt @@ -3,8 +3,10 @@ package org.koitharu.kotatsu.download.ui import android.content.Context import android.content.Intent import android.os.Bundle +import android.view.ViewGroup import androidx.core.graphics.Insets import androidx.core.view.isVisible +import androidx.core.view.updateLayoutParams import androidx.core.view.updatePadding import androidx.lifecycle.lifecycleScope import kotlinx.coroutines.flow.flatMapLatest @@ -45,11 +47,15 @@ class DownloadsActivity : BaseActivity() { right = insets.right, bottom = insets.bottom ) - binding.toolbar.updatePadding( - left = insets.left, - right = insets.right, - top = insets.top - ) + with(binding.toolbar) { + updatePadding( + left = insets.left, + right = insets.right + ) + updateLayoutParams { + topMargin = insets.top + } + } } companion object { diff --git a/app/src/main/java/org/koitharu/kotatsu/favourites/ui/categories/CategoriesActivity.kt b/app/src/main/java/org/koitharu/kotatsu/favourites/ui/categories/CategoriesActivity.kt index 5461152a6..9d6afe202 100644 --- a/app/src/main/java/org/koitharu/kotatsu/favourites/ui/categories/CategoriesActivity.kt +++ b/app/src/main/java/org/koitharu/kotatsu/favourites/ui/categories/CategoriesActivity.kt @@ -24,6 +24,7 @@ import org.koitharu.kotatsu.core.model.FavouriteCategory import org.koitharu.kotatsu.core.model.SortOrder import org.koitharu.kotatsu.databinding.ActivityCategoriesBinding import org.koitharu.kotatsu.utils.ext.getDisplayMessage +import org.koitharu.kotatsu.utils.ext.measureHeight import org.koitharu.kotatsu.utils.ext.showPopupMenu class CategoriesActivity : BaseActivity(), @@ -40,7 +41,6 @@ class CategoriesActivity : BaseActivity(), super.onCreate(savedInstanceState) setContentView(ActivityCategoriesBinding.inflate(layoutInflater)) supportActionBar?.setDisplayHomeAsUpEnabled(true) - binding.fabAdd.imageTintList = ColorStateList.valueOf(Color.WHITE) adapter = CategoriesAdapter(this) editDelegate = CategoriesEditDelegate(this, this) binding.recyclerView.addItemDecoration(DividerItemDecoration(this, RecyclerView.VERTICAL)) @@ -93,13 +93,17 @@ class CategoriesActivity : BaseActivity(), binding.recyclerView.updatePadding( left = insets.left, right = insets.right, - bottom = insets.bottom - ) - binding.toolbar.updatePadding( - left = insets.left, - right = insets.right, - top = insets.top + bottom = 2 * insets.bottom + binding.fabAdd.measureHeight() ) + with(binding.toolbar) { + updatePadding( + left = insets.left, + right = insets.right + ) + updateLayoutParams { + topMargin = insets.top + } + } } private fun onCategoriesChanged(categories: List) { diff --git a/app/src/main/java/org/koitharu/kotatsu/favourites/ui/categories/CategoriesEditDelegate.kt b/app/src/main/java/org/koitharu/kotatsu/favourites/ui/categories/CategoriesEditDelegate.kt index 7c93f3d25..bae47cc45 100644 --- a/app/src/main/java/org/koitharu/kotatsu/favourites/ui/categories/CategoriesEditDelegate.kt +++ b/app/src/main/java/org/koitharu/kotatsu/favourites/ui/categories/CategoriesEditDelegate.kt @@ -3,7 +3,7 @@ package org.koitharu.kotatsu.favourites.ui.categories import android.content.Context import android.text.InputType import android.widget.Toast -import androidx.appcompat.app.AlertDialog +import com.google.android.material.dialog.MaterialAlertDialogBuilder import org.koitharu.kotatsu.R import org.koitharu.kotatsu.base.ui.dialog.TextInputDialog import org.koitharu.kotatsu.core.model.FavouriteCategory @@ -14,7 +14,7 @@ class CategoriesEditDelegate( ) { fun deleteCategory(category: FavouriteCategory) { - AlertDialog.Builder(context) + MaterialAlertDialogBuilder(context) .setMessage(context.getString(R.string.category_delete_confirm, category.title)) .setTitle(R.string.remove_category) .setNegativeButton(android.R.string.cancel, null) diff --git a/app/src/main/java/org/koitharu/kotatsu/history/ui/HistoryListFragment.kt b/app/src/main/java/org/koitharu/kotatsu/history/ui/HistoryListFragment.kt index 76dc36ee8..550fab1a5 100644 --- a/app/src/main/java/org/koitharu/kotatsu/history/ui/HistoryListFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/history/ui/HistoryListFragment.kt @@ -5,7 +5,7 @@ import android.view.Menu import android.view.MenuInflater import android.view.MenuItem import android.view.View -import androidx.appcompat.app.AlertDialog +import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.snackbar.Snackbar import org.koin.androidx.viewmodel.ext.android.viewModel import org.koitharu.kotatsu.R @@ -42,7 +42,7 @@ class HistoryListFragment : MangaListFragment() { override fun onOptionsItemSelected(item: MenuItem): Boolean { return when (item.itemId) { R.id.action_clear_history -> { - AlertDialog.Builder(context ?: return false) + MaterialAlertDialogBuilder(context ?: return false) .setTitle(R.string.clear_history) .setMessage(R.string.text_clear_history_prompt) .setNegativeButton(android.R.string.cancel, null) diff --git a/app/src/main/java/org/koitharu/kotatsu/image/ui/ImageActivity.kt b/app/src/main/java/org/koitharu/kotatsu/image/ui/ImageActivity.kt index ca14d2f4d..8e674701a 100644 --- a/app/src/main/java/org/koitharu/kotatsu/image/ui/ImageActivity.kt +++ b/app/src/main/java/org/koitharu/kotatsu/image/ui/ImageActivity.kt @@ -5,9 +5,11 @@ import android.content.Intent import android.graphics.drawable.Drawable import android.net.Uri import android.os.Bundle +import android.view.ViewGroup import androidx.appcompat.app.AppCompatDelegate import androidx.core.graphics.Insets import androidx.core.graphics.drawable.toBitmap +import androidx.core.view.updateLayoutParams import androidx.core.view.updatePadding import coil.ImageLoader import coil.request.CachePolicy @@ -36,11 +38,15 @@ class ImageActivity : BaseActivity() { } override fun onWindowInsetsChanged(insets: Insets) { - binding.toolbar.updatePadding( - left = insets.left, - right = insets.right, - top = insets.top, - ) + with(binding.toolbar) { + updatePadding( + left = insets.left, + right = insets.right + ) + updateLayoutParams { + topMargin = insets.top + } + } } private fun loadImage(url: Uri?) { diff --git a/app/src/main/java/org/koitharu/kotatsu/list/ui/ListModeSelectDialog.kt b/app/src/main/java/org/koitharu/kotatsu/list/ui/ListModeSelectDialog.kt index 56dc55d19..dabe18a33 100644 --- a/app/src/main/java/org/koitharu/kotatsu/list/ui/ListModeSelectDialog.kt +++ b/app/src/main/java/org/koitharu/kotatsu/list/ui/ListModeSelectDialog.kt @@ -5,9 +5,9 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.SeekBar -import androidx.appcompat.app.AlertDialog import androidx.core.view.isVisible import androidx.fragment.app.FragmentManager +import com.google.android.material.dialog.MaterialAlertDialogBuilder import org.koin.android.ext.android.inject import org.koitharu.kotatsu.R import org.koitharu.kotatsu.base.ui.AlertDialogFragment @@ -34,7 +34,7 @@ class ListModeSelectDialog : AlertDialogFragment(), View. container: ViewGroup? ) = DialogListModeBinding.inflate(inflater, container, false) - override fun onBuildDialog(builder: AlertDialog.Builder) { + override fun onBuildDialog(builder: MaterialAlertDialogBuilder) { builder.setTitle(R.string.list_mode) .setPositiveButton(R.string.done, null) .setCancelable(true) diff --git a/app/src/main/java/org/koitharu/kotatsu/list/ui/MangaListFragment.kt b/app/src/main/java/org/koitharu/kotatsu/list/ui/MangaListFragment.kt index 11b29eaa4..130c2a2ee 100644 --- a/app/src/main/java/org/koitharu/kotatsu/list/ui/MangaListFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/list/ui/MangaListFragment.kt @@ -21,7 +21,6 @@ import org.koitharu.kotatsu.R import org.koitharu.kotatsu.base.ui.BaseFragment import org.koitharu.kotatsu.base.ui.list.OnListItemClickListener import org.koitharu.kotatsu.base.ui.list.PaginationScrollListener -import org.koitharu.kotatsu.base.ui.list.decor.ItemTypeDividerDecoration import org.koitharu.kotatsu.base.ui.list.decor.SpacingItemDecoration import org.koitharu.kotatsu.browser.cloudflare.CloudFlareDialog import org.koitharu.kotatsu.core.exceptions.CloudFlareProtectedException @@ -85,10 +84,8 @@ abstract class MangaListFragment : BaseFragment(), addOnScrollListener(paginationListener!!) } with(binding.swipeRefreshLayout) { - setColorSchemeColors( - ContextCompat.getColor(context, R.color.color_primary), - ContextCompat.getColor(context, R.color.color_primary_variant) - ) + setProgressBackgroundColorSchemeColor(ContextCompat.getColor(context, R.color.kotatsu_primary)) + setColorSchemeColors(ContextCompat.getColor(context, R.color.kotatsu_onPrimary)) setOnRefreshListener(this@MangaListFragment) isEnabled = isSwipeRefreshEnabled } diff --git a/app/src/main/java/org/koitharu/kotatsu/local/ui/LocalListFragment.kt b/app/src/main/java/org/koitharu/kotatsu/local/ui/LocalListFragment.kt index 63a0e6c66..586e96bfc 100644 --- a/app/src/main/java/org/koitharu/kotatsu/local/ui/LocalListFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/local/ui/LocalListFragment.kt @@ -9,7 +9,7 @@ import android.view.MenuItem import android.view.View import androidx.activity.result.ActivityResultCallback import androidx.activity.result.contract.ActivityResultContracts -import androidx.appcompat.app.AlertDialog +import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.snackbar.Snackbar import org.koin.androidx.viewmodel.ext.android.viewModel import org.koitharu.kotatsu.BuildConfig @@ -98,7 +98,7 @@ class LocalListFragment : MangaListFragment(), ActivityResultCallback { override fun onPopupMenuItemSelected(item: MenuItem, data: Manga): Boolean { return when (item.itemId) { R.id.action_delete -> { - AlertDialog.Builder(context ?: return false) + MaterialAlertDialogBuilder(context ?: return false) .setTitle(R.string.delete_manga) .setMessage(getString(R.string.text_delete_local_manga, data.title)) .setPositiveButton(R.string.delete) { _, _ -> diff --git a/app/src/main/java/org/koitharu/kotatsu/main/ui/MainActivity.kt b/app/src/main/java/org/koitharu/kotatsu/main/ui/MainActivity.kt index 182323855..c0c610ca1 100644 --- a/app/src/main/java/org/koitharu/kotatsu/main/ui/MainActivity.kt +++ b/app/src/main/java/org/koitharu/kotatsu/main/ui/MainActivity.kt @@ -1,17 +1,13 @@ package org.koitharu.kotatsu.main.ui import android.app.ActivityOptions -import android.content.res.ColorStateList import android.content.res.Configuration -import android.graphics.Color import android.os.Build import android.os.Bundle import android.view.MenuItem import android.view.View import android.view.ViewGroup.MarginLayoutParams import androidx.appcompat.app.ActionBarDrawerToggle -import androidx.appcompat.app.AlertDialog -import androidx.appcompat.app.AppCompatDelegate import androidx.core.content.ContextCompat import androidx.core.graphics.Insets import androidx.core.view.* @@ -21,8 +17,8 @@ import androidx.fragment.app.FragmentTransaction import androidx.fragment.app.commit import androidx.recyclerview.widget.RecyclerView import androidx.swiperefreshlayout.widget.CircularProgressDrawable -import androidx.transition.TransitionManager import com.google.android.material.appbar.AppBarLayout +import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.navigation.NavigationView import com.google.android.material.snackbar.Snackbar import org.koin.android.ext.android.get @@ -32,7 +28,6 @@ import org.koitharu.kotatsu.base.ui.BaseActivity import org.koitharu.kotatsu.core.model.Manga import org.koitharu.kotatsu.core.model.MangaSource import org.koitharu.kotatsu.core.prefs.AppSection -import org.koitharu.kotatsu.core.prefs.AppSettings import org.koitharu.kotatsu.databinding.ActivityMainBinding import org.koitharu.kotatsu.databinding.NavigationHeaderBinding import org.koitharu.kotatsu.details.ui.DetailsActivity @@ -62,7 +57,6 @@ class MainActivity : BaseActivity(), private lateinit var navHeaderBinding: NavigationHeaderBinding private lateinit var drawerToggle: ActionBarDrawerToggle - private var searchViewElevation = 0f override val appBar: AppBarLayout get() = binding.appbar @@ -70,7 +64,6 @@ class MainActivity : BaseActivity(), override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(ActivityMainBinding.inflate(layoutInflater)) - searchViewElevation = binding.toolbarCard.cardElevation navHeaderBinding = NavigationHeaderBinding.inflate(layoutInflater) drawerToggle = ActionBarDrawerToggle( this, @@ -87,13 +80,6 @@ class MainActivity : BaseActivity(), binding.drawer.addDrawerListener(drawerToggle) supportActionBar?.setDisplayHomeAsUpEnabled(true) - if (get().isAmoledTheme && get().theme == AppCompatDelegate.MODE_NIGHT_YES) { - binding.appbar.setBackgroundColor(Color.BLACK) - binding.toolbar.setBackgroundColor(ContextCompat.getColor(this, R.color.color_background)) - } else { - binding.toolbar.setBackgroundColor(ContextCompat.getColor(this, R.color.color_surface)) - } - with(binding.searchView) { onFocusChangeListener = this@MainActivity searchSuggestionListener = this@MainActivity @@ -110,14 +96,10 @@ class MainActivity : BaseActivity(), insets } addHeaderView(navHeaderBinding.root) - itemBackground = navigationItemBackground(context) setNavigationItemSelectedListener(this@MainActivity) } - with(binding.fab) { - imageTintList = ColorStateList.valueOf(Color.WHITE) - setOnClickListener(this@MainActivity) - } + binding.fab.setOnClickListener(this@MainActivity) supportFragmentManager.findFragmentByTag(TAG_PRIMARY)?.let { binding.fab.isVisible = it is HistoryListFragment @@ -263,7 +245,7 @@ class MainActivity : BaseActivity(), } override fun onClearSearchHistory() { - AlertDialog.Builder(this) + MaterialAlertDialogBuilder(this) .setTitle(R.string.clear_search_history) .setMessage(R.string.text_clear_search_history_prompt) .setNegativeButton(android.R.string.cancel, null) @@ -294,7 +276,7 @@ class MainActivity : BaseActivity(), binding.fab.isEnabled = !isLoading if (isLoading) { binding.fab.setImageDrawable(CircularProgressDrawable(this).also { - it.setColorSchemeColors(Color.WHITE) + it.setColorSchemeColors(R.color.kotatsu_onPrimaryContainer) it.strokeWidth = resources.resolveDp(2f) it.start() }) @@ -344,42 +326,11 @@ class MainActivity : BaseActivity(), private fun onSearchOpened() { binding.drawer.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED) drawerToggle.isDrawerIndicatorEnabled = false - TransitionManager.beginDelayedTransition(binding.appbar) - // Avoiding shadows on the sides if the color is transparent, so we make the AppBarLayout white/grey/black - if (isDarkAmoledTheme()) { - binding.toolbar.setBackgroundColor(Color.BLACK) - } else { - binding.appbar.setBackgroundColor(ContextCompat.getColor(this, R.color.color_surface)) - } - binding.toolbarCard.apply { - cardElevation = 0f - // Remove margin - updateLayoutParams { - leftMargin = 0 - rightMargin = 0 - } - - } - binding.appbar.elevation = searchViewElevation } private fun onSearchClosed() { binding.drawer.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED) drawerToggle.isDrawerIndicatorEnabled = true - if (isDarkAmoledTheme()) { - binding.toolbar.setBackgroundColor(ContextCompat.getColor(this, R.color.color_background)) - } - TransitionManager.beginDelayedTransition(binding.appbar) - // Returning transparent color - binding.appbar.setBackgroundColor(Color.TRANSPARENT) - binding.appbar.elevation = 0f - binding.toolbarCard.apply { - cardElevation = searchViewElevation - updateLayoutParams { - leftMargin = resources.resolveDp(16) - rightMargin = resources.resolveDp(16) - } - } } private fun onFirstStart() { diff --git a/app/src/main/java/org/koitharu/kotatsu/reader/ui/ChaptersDialog.kt b/app/src/main/java/org/koitharu/kotatsu/reader/ui/ChaptersDialog.kt index 37fb8f8fd..b971d4065 100644 --- a/app/src/main/java/org/koitharu/kotatsu/reader/ui/ChaptersDialog.kt +++ b/app/src/main/java/org/koitharu/kotatsu/reader/ui/ChaptersDialog.kt @@ -4,11 +4,11 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import androidx.appcompat.app.AlertDialog import androidx.fragment.app.FragmentManager import androidx.recyclerview.widget.DividerItemDecoration import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView +import com.google.android.material.dialog.MaterialAlertDialogBuilder import org.koin.android.ext.android.get import org.koitharu.kotatsu.R import org.koitharu.kotatsu.base.ui.AlertDialogFragment @@ -30,7 +30,7 @@ class ChaptersDialog : AlertDialogFragment(), container: ViewGroup?, ) = DialogChaptersBinding.inflate(inflater, container, false) - override fun onBuildDialog(builder: AlertDialog.Builder) { + override fun onBuildDialog(builder: MaterialAlertDialogBuilder) { builder.setTitle(R.string.chapters) .setNegativeButton(R.string.close, null) .setCancelable(true) diff --git a/app/src/main/java/org/koitharu/kotatsu/reader/ui/ReaderActivity.kt b/app/src/main/java/org/koitharu/kotatsu/reader/ui/ReaderActivity.kt index c745d2071..fa6f1fa41 100644 --- a/app/src/main/java/org/koitharu/kotatsu/reader/ui/ReaderActivity.kt +++ b/app/src/main/java/org/koitharu/kotatsu/reader/ui/ReaderActivity.kt @@ -10,7 +10,6 @@ import android.view.* import android.widget.Toast import androidx.activity.result.ActivityResultCallback import androidx.activity.result.contract.ActivityResultContracts -import androidx.appcompat.app.AlertDialog import androidx.core.content.ContextCompat import androidx.core.graphics.Insets import androidx.core.view.WindowInsetsCompat @@ -19,6 +18,7 @@ import androidx.core.view.postDelayed import androidx.core.view.updatePadding import androidx.fragment.app.commit import androidx.lifecycle.lifecycleScope +import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.snackbar.Snackbar import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.launchIn @@ -211,7 +211,7 @@ class ReaderActivity : BaseFullscreenActivity(), } private fun onError(e: Throwable) { - val dialog = AlertDialog.Builder(this) + val dialog = MaterialAlertDialogBuilder(this) .setTitle(R.string.error_occurred) .setMessage(e.getDisplayMessage(resources)) .setPositiveButton(R.string.close, null) diff --git a/app/src/main/java/org/koitharu/kotatsu/reader/ui/ReaderConfigDialog.kt b/app/src/main/java/org/koitharu/kotatsu/reader/ui/ReaderConfigDialog.kt index 42824267d..8ef5ecd12 100644 --- a/app/src/main/java/org/koitharu/kotatsu/reader/ui/ReaderConfigDialog.kt +++ b/app/src/main/java/org/koitharu/kotatsu/reader/ui/ReaderConfigDialog.kt @@ -5,8 +5,8 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import androidx.appcompat.app.AlertDialog import androidx.fragment.app.FragmentManager +import com.google.android.material.dialog.MaterialAlertDialogBuilder import org.koitharu.kotatsu.R import org.koitharu.kotatsu.base.ui.AlertDialogFragment import org.koitharu.kotatsu.core.prefs.ReaderMode @@ -30,7 +30,7 @@ class ReaderConfigDialog : AlertDialogFragment(), ?: ReaderMode.STANDARD } - override fun onBuildDialog(builder: AlertDialog.Builder) { + override fun onBuildDialog(builder: MaterialAlertDialogBuilder) { builder.setTitle(R.string.read_mode) .setPositiveButton(R.string.done, null) .setCancelable(true) diff --git a/app/src/main/java/org/koitharu/kotatsu/reader/ui/SimpleSettingsActivity.kt b/app/src/main/java/org/koitharu/kotatsu/reader/ui/SimpleSettingsActivity.kt index 0113bb475..8efab6827 100644 --- a/app/src/main/java/org/koitharu/kotatsu/reader/ui/SimpleSettingsActivity.kt +++ b/app/src/main/java/org/koitharu/kotatsu/reader/ui/SimpleSettingsActivity.kt @@ -4,7 +4,9 @@ import android.content.Context import android.content.Intent import android.os.Bundle import android.os.Parcelable +import android.view.ViewGroup import androidx.core.graphics.Insets +import androidx.core.view.updateLayoutParams import androidx.core.view.updatePadding import androidx.fragment.app.commit import org.koitharu.kotatsu.BuildConfig @@ -38,11 +40,15 @@ class SimpleSettingsActivity : BaseActivity() { } override fun onWindowInsetsChanged(insets: Insets) { - binding.toolbar.updatePadding( - top = insets.top, - left = insets.left, - right = insets.right - ) + with(binding.toolbar) { + updatePadding( + left = insets.left, + right = insets.right + ) + updateLayoutParams { + topMargin = insets.top + } + } } companion object { diff --git a/app/src/main/java/org/koitharu/kotatsu/reader/ui/thumbnails/PagesThumbnailsSheet.kt b/app/src/main/java/org/koitharu/kotatsu/reader/ui/thumbnails/PagesThumbnailsSheet.kt index 0a2f4f2cb..9ad62224c 100644 --- a/app/src/main/java/org/koitharu/kotatsu/reader/ui/thumbnails/PagesThumbnailsSheet.kt +++ b/app/src/main/java/org/koitharu/kotatsu/reader/ui/thumbnails/PagesThumbnailsSheet.kt @@ -60,7 +60,7 @@ class PagesThumbnailsSheet : BaseBottomSheet(), binding.toolbar.setNavigationOnClickListener { dismiss() } binding.toolbar.subtitle = null - if (!resources.getBoolean(R.bool.is_tablet)) { + if (!resources.getBoolean(R.bool.isTablet)) { binding.toolbar.navigationIcon = null } else { binding.toolbar.subtitle = diff --git a/app/src/main/java/org/koitharu/kotatsu/search/ui/SearchActivity.kt b/app/src/main/java/org/koitharu/kotatsu/search/ui/SearchActivity.kt index 2484dcb76..725a11303 100644 --- a/app/src/main/java/org/koitharu/kotatsu/search/ui/SearchActivity.kt +++ b/app/src/main/java/org/koitharu/kotatsu/search/ui/SearchActivity.kt @@ -4,8 +4,10 @@ import android.content.Context import android.content.Intent import android.os.Bundle import android.os.Parcelable +import android.view.ViewGroup import androidx.appcompat.widget.SearchView import androidx.core.graphics.Insets +import androidx.core.view.updateLayoutParams import androidx.core.view.updatePadding import androidx.fragment.app.commit import org.koin.androidx.viewmodel.ext.android.viewModel @@ -44,11 +46,15 @@ class SearchActivity : BaseActivity(), SearchView.OnQuery } override fun onWindowInsetsChanged(insets: Insets) { - binding.toolbar.updatePadding( - top = insets.top, - left = insets.left, - right = insets.right - ) + with(binding.toolbar) { + updatePadding( + left = insets.left, + right = insets.right + ) + updateLayoutParams { + topMargin = insets.top + } + } binding.container.updatePadding( bottom = insets.bottom ) diff --git a/app/src/main/java/org/koitharu/kotatsu/search/ui/global/GlobalSearchActivity.kt b/app/src/main/java/org/koitharu/kotatsu/search/ui/global/GlobalSearchActivity.kt index b1228d4bf..ad23f0b98 100644 --- a/app/src/main/java/org/koitharu/kotatsu/search/ui/global/GlobalSearchActivity.kt +++ b/app/src/main/java/org/koitharu/kotatsu/search/ui/global/GlobalSearchActivity.kt @@ -3,7 +3,9 @@ package org.koitharu.kotatsu.search.ui.global import android.content.Context import android.content.Intent import android.os.Bundle +import android.view.ViewGroup import androidx.core.graphics.Insets +import androidx.core.view.updateLayoutParams import androidx.core.view.updatePadding import org.koitharu.kotatsu.R import org.koitharu.kotatsu.base.ui.BaseActivity @@ -31,11 +33,15 @@ class GlobalSearchActivity : BaseActivity() { } override fun onWindowInsetsChanged(insets: Insets) { - binding.toolbar.updatePadding( - top = insets.top, - left = insets.left, - right = insets.right - ) + with(binding.toolbar) { + updatePadding( + left = insets.left, + right = insets.right + ) + updateLayoutParams { + topMargin = insets.top + } + } } companion object { diff --git a/app/src/main/java/org/koitharu/kotatsu/settings/AppUpdateChecker.kt b/app/src/main/java/org/koitharu/kotatsu/settings/AppUpdateChecker.kt index 0b6b67e5e..90e9f9bbe 100644 --- a/app/src/main/java/org/koitharu/kotatsu/settings/AppUpdateChecker.kt +++ b/app/src/main/java/org/koitharu/kotatsu/settings/AppUpdateChecker.kt @@ -7,8 +7,8 @@ import android.content.pm.PackageManager import android.net.Uri import androidx.activity.ComponentActivity import androidx.annotation.MainThread -import androidx.appcompat.app.AlertDialog import androidx.lifecycle.lifecycleScope +import com.google.android.material.dialog.MaterialAlertDialogBuilder import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job import kotlinx.coroutines.launch @@ -77,7 +77,7 @@ class AppUpdateChecker(private val activity: ComponentActivity) { @MainThread private fun showUpdateDialog(version: AppVersion) { - AlertDialog.Builder(activity) + MaterialAlertDialogBuilder(activity) .setTitle(R.string.app_update_available) .setMessage(buildString { append(activity.getString(R.string.new_version_s, version.name)) diff --git a/app/src/main/java/org/koitharu/kotatsu/settings/HistorySettingsFragment.kt b/app/src/main/java/org/koitharu/kotatsu/settings/HistorySettingsFragment.kt index 99ec51e9c..82abffced 100644 --- a/app/src/main/java/org/koitharu/kotatsu/settings/HistorySettingsFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/settings/HistorySettingsFragment.kt @@ -2,8 +2,8 @@ package org.koitharu.kotatsu.settings import android.os.Bundle import android.view.View -import androidx.appcompat.app.AlertDialog import androidx.preference.Preference +import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.snackbar.Snackbar import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch @@ -119,7 +119,7 @@ class HistorySettingsFragment : BasePreferenceFragment(R.string.history_and_cach } private fun clearSearchHistory(preference: Preference) { - AlertDialog.Builder(context ?: return) + MaterialAlertDialogBuilder(context ?: return) .setTitle(R.string.clear_search_history) .setMessage(R.string.text_clear_search_history_prompt) .setNegativeButton(android.R.string.cancel, null) @@ -138,7 +138,7 @@ class HistorySettingsFragment : BasePreferenceFragment(R.string.history_and_cach } private fun clearCookies() { - AlertDialog.Builder(context ?: return) + MaterialAlertDialogBuilder(context ?: return) .setTitle(R.string.clear_cookies) .setMessage(R.string.text_clear_cookies_prompt) .setNegativeButton(android.R.string.cancel, null) diff --git a/app/src/main/java/org/koitharu/kotatsu/settings/MainSettingsFragment.kt b/app/src/main/java/org/koitharu/kotatsu/settings/MainSettingsFragment.kt index 17ecdf9ab..006a29f24 100644 --- a/app/src/main/java/org/koitharu/kotatsu/settings/MainSettingsFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/settings/MainSettingsFragment.kt @@ -6,6 +6,7 @@ import android.os.Bundle import android.view.View import androidx.appcompat.app.AppCompatDelegate import androidx.preference.* +import com.google.android.material.color.DynamicColors import org.koitharu.kotatsu.R import org.koitharu.kotatsu.base.ui.BasePreferenceFragment import org.koitharu.kotatsu.base.ui.dialog.StorageSelectDialog @@ -55,6 +56,8 @@ class MainSettingsFragment : BasePreferenceFragment(R.string.settings), override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) + findPreference(AppSettings.KEY_DYNAMIC_THEME)?.isVisible = + DynamicColors.isDynamicColorAvailable() findPreference(AppSettings.KEY_LOCAL_STORAGE)?.run { summary = settings.getStorageDir(context)?.getStorageName(context) ?: getString(R.string.not_available) diff --git a/app/src/main/java/org/koitharu/kotatsu/settings/SettingsActivity.kt b/app/src/main/java/org/koitharu/kotatsu/settings/SettingsActivity.kt index c7cdef0d4..24d85fc7f 100644 --- a/app/src/main/java/org/koitharu/kotatsu/settings/SettingsActivity.kt +++ b/app/src/main/java/org/koitharu/kotatsu/settings/SettingsActivity.kt @@ -3,7 +3,9 @@ package org.koitharu.kotatsu.settings import android.content.Context import android.content.Intent import android.os.Bundle +import android.view.ViewGroup import androidx.core.graphics.Insets +import androidx.core.view.updateLayoutParams import androidx.core.view.updatePadding import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentTransaction @@ -60,11 +62,15 @@ class SettingsActivity : BaseActivity(), } override fun onWindowInsetsChanged(insets: Insets) { - binding.toolbar.updatePadding( - top = insets.top, - left = insets.left, - right = insets.right - ) + with(binding.toolbar) { + updatePadding( + left = insets.left, + right = insets.right + ) + updateLayoutParams { + topMargin = insets.top + } + } } companion object { diff --git a/app/src/main/java/org/koitharu/kotatsu/settings/backup/BackupDialogFragment.kt b/app/src/main/java/org/koitharu/kotatsu/settings/backup/BackupDialogFragment.kt index f7181bb20..b1d63684b 100644 --- a/app/src/main/java/org/koitharu/kotatsu/settings/backup/BackupDialogFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/settings/backup/BackupDialogFragment.kt @@ -7,8 +7,8 @@ import android.view.View import android.view.ViewGroup import android.widget.Toast import androidx.activity.result.contract.ActivityResultContracts -import androidx.appcompat.app.AlertDialog import androidx.core.view.isVisible +import com.google.android.material.dialog.MaterialAlertDialogBuilder import org.koin.androidx.viewmodel.ext.android.viewModel import org.koitharu.kotatsu.R import org.koitharu.kotatsu.base.ui.AlertDialogFragment @@ -49,13 +49,13 @@ class BackupDialogFragment : AlertDialogFragment() { viewModel.onError.observe(viewLifecycleOwner, this::onError) } - override fun onBuildDialog(builder: AlertDialog.Builder) { + override fun onBuildDialog(builder: MaterialAlertDialogBuilder) { builder.setCancelable(false) .setNegativeButton(android.R.string.cancel, null) } private fun onError(e: Throwable) { - AlertDialog.Builder(context ?: return) + MaterialAlertDialogBuilder(context ?: return) .setNegativeButton(R.string.close, null) .setTitle(R.string.error) .setMessage(e.getDisplayMessage(resources)) diff --git a/app/src/main/java/org/koitharu/kotatsu/settings/backup/RestoreDialogFragment.kt b/app/src/main/java/org/koitharu/kotatsu/settings/backup/RestoreDialogFragment.kt index 97701f82b..9ccb5e1b8 100644 --- a/app/src/main/java/org/koitharu/kotatsu/settings/backup/RestoreDialogFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/settings/backup/RestoreDialogFragment.kt @@ -5,8 +5,8 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import androidx.appcompat.app.AlertDialog import androidx.core.view.isVisible +import com.google.android.material.dialog.MaterialAlertDialogBuilder import org.koin.androidx.viewmodel.ext.android.viewModel import org.koin.core.parameter.parametersOf import org.koitharu.kotatsu.R @@ -39,12 +39,12 @@ class RestoreDialogFragment : AlertDialogFragment() { viewModel.onError.observe(viewLifecycleOwner, this::onError) } - override fun onBuildDialog(builder: AlertDialog.Builder) { + override fun onBuildDialog(builder: MaterialAlertDialogBuilder) { builder.setCancelable(false) } private fun onError(e: Throwable) { - AlertDialog.Builder(context ?: return) + MaterialAlertDialogBuilder(context ?: return) .setNegativeButton(R.string.close, null) .setTitle(R.string.error) .setMessage(e.getDisplayMessage(resources)) @@ -64,7 +64,7 @@ class RestoreDialogFragment : AlertDialogFragment() { } private fun onRestoreDone(result: CompositeResult) { - val builder = AlertDialog.Builder(context ?: return) + val builder = MaterialAlertDialogBuilder(context ?: return) when { result.isAllSuccess -> builder.setTitle(R.string.data_restored) .setMessage(R.string.data_restored_success) diff --git a/app/src/main/java/org/koitharu/kotatsu/settings/onboard/OnboardDialogFragment.kt b/app/src/main/java/org/koitharu/kotatsu/settings/onboard/OnboardDialogFragment.kt index d732abaef..5c0b94478 100644 --- a/app/src/main/java/org/koitharu/kotatsu/settings/onboard/OnboardDialogFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/settings/onboard/OnboardDialogFragment.kt @@ -5,8 +5,8 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import androidx.appcompat.app.AlertDialog import androidx.fragment.app.FragmentManager +import com.google.android.material.dialog.MaterialAlertDialogBuilder import org.koin.androidx.viewmodel.ext.android.viewModel import org.koitharu.kotatsu.R import org.koitharu.kotatsu.base.ui.AlertDialogFragment @@ -36,7 +36,7 @@ class OnboardDialogFragment : AlertDialogFragment(), container: ViewGroup?, ) = DialogOnboardBinding.inflate(inflater, container, false) - override fun onBuildDialog(builder: AlertDialog.Builder) { + override fun onBuildDialog(builder: MaterialAlertDialogBuilder) { builder .setPositiveButton(R.string.done, this) .setCancelable(true) diff --git a/app/src/main/java/org/koitharu/kotatsu/tracker/ui/FeedFragment.kt b/app/src/main/java/org/koitharu/kotatsu/tracker/ui/FeedFragment.kt index 57605b4d4..510fe083b 100644 --- a/app/src/main/java/org/koitharu/kotatsu/tracker/ui/FeedFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/tracker/ui/FeedFragment.kt @@ -2,9 +2,9 @@ package org.koitharu.kotatsu.tracker.ui import android.os.Bundle import android.view.* -import androidx.appcompat.app.AlertDialog import androidx.core.graphics.Insets import androidx.core.view.updatePadding +import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.snackbar.Snackbar import org.koin.android.ext.android.get import org.koin.androidx.viewmodel.ext.android.viewModel @@ -78,7 +78,7 @@ class FeedFragment : BaseFragment(), PaginationScrollListen true } R.id.action_clear_feed -> { - AlertDialog.Builder(context ?: return false) + MaterialAlertDialogBuilder(context ?: return false) .setTitle(R.string.clear_updates_feed) .setMessage(R.string.text_clear_updates_feed_prompt) .setNegativeButton(android.R.string.cancel, null) diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/ext/AndroidExt.kt b/app/src/main/java/org/koitharu/kotatsu/utils/ext/AndroidExt.kt index 87278b1d7..215e2d185 100644 --- a/app/src/main/java/org/koitharu/kotatsu/utils/ext/AndroidExt.kt +++ b/app/src/main/java/org/koitharu/kotatsu/utils/ext/AndroidExt.kt @@ -5,6 +5,7 @@ import android.net.ConnectivityManager import android.net.Network import android.net.NetworkRequest import androidx.appcompat.app.AlertDialog +import com.google.android.material.dialog.MaterialAlertDialogBuilder import kotlinx.coroutines.suspendCancellableCoroutine import kotlin.coroutines.resume @@ -23,6 +24,6 @@ suspend fun ConnectivityManager.waitForNetwork(): Network { } } -inline fun buildAlertDialog(context: Context, block: AlertDialog.Builder.() -> Unit): AlertDialog { - return AlertDialog.Builder(context).apply(block).create() +inline fun buildAlertDialog(context: Context, block: MaterialAlertDialogBuilder.() -> Unit): AlertDialog { + return MaterialAlertDialogBuilder(context).apply(block).create() } \ No newline at end of file diff --git a/app/src/main/res/color/ripple_toolbar.xml b/app/src/main/res/color/ripple_toolbar.xml new file mode 100644 index 000000000..7ef8081de --- /dev/null +++ b/app/src/main/res/color/ripple_toolbar.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/color/selector_overlay.xml b/app/src/main/res/color/selector_overlay.xml index c99447ac2..26cdc3acd 100644 --- a/app/src/main/res/color/selector_overlay.xml +++ b/app/src/main/res/color/selector_overlay.xml @@ -1,4 +1,4 @@ - + \ No newline at end of file diff --git a/app/src/main/res/drawable-w600dp/tab_indicator.xml b/app/src/main/res/drawable-w600dp/tab_indicator.xml deleted file mode 100644 index e2b1ad5c9..000000000 --- a/app/src/main/res/drawable-w600dp/tab_indicator.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/badge.xml b/app/src/main/res/drawable/badge.xml index dc4263e17..de6af63f4 100644 --- a/app/src/main/res/drawable/badge.xml +++ b/app/src/main/res/drawable/badge.xml @@ -2,5 +2,5 @@ - + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_badge_default.xml b/app/src/main/res/drawable/bg_badge_default.xml index 847a0497b..4a30a76f4 100644 --- a/app/src/main/res/drawable/bg_badge_default.xml +++ b/app/src/main/res/drawable/bg_badge_default.xml @@ -2,7 +2,7 @@ - + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_placeholder.xml b/app/src/main/res/drawable/ic_placeholder.xml index c7eb74389..6a2464393 100644 --- a/app/src/main/res/drawable/ic_placeholder.xml +++ b/app/src/main/res/drawable/ic_placeholder.xml @@ -1,7 +1,7 @@ - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/tabs_background.xml b/app/src/main/res/drawable/tabs_background.xml deleted file mode 100644 index 9743b040f..000000000 --- a/app/src/main/res/drawable/tabs_background.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/toolbar_background.xml b/app/src/main/res/drawable/toolbar_background.xml new file mode 100644 index 000000000..f20301a39 --- /dev/null +++ b/app/src/main/res/drawable/toolbar_background.xml @@ -0,0 +1,8 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout-w600dp-land/fragment_details.xml b/app/src/main/res/layout-w600dp-land/fragment_details.xml index c7295768c..3d985c834 100644 --- a/app/src/main/res/layout-w600dp-land/fragment_details.xml +++ b/app/src/main/res/layout-w600dp-land/fragment_details.xml @@ -30,9 +30,7 @@ android:layout_width="0dp" android:layout_height="wrap_content" android:layout_margin="8dp" - android:layout_weight="1" - app:cardCornerRadius="4dp" - app:cardElevation="4dp"> + android:layout_weight="1"> - - diff --git a/app/src/main/res/layout-w600dp-port/fragment_details.xml b/app/src/main/res/layout-w600dp-port/fragment_details.xml index 25b0b326d..96e5232d9 100644 --- a/app/src/main/res/layout-w600dp-port/fragment_details.xml +++ b/app/src/main/res/layout-w600dp-port/fragment_details.xml @@ -30,9 +30,7 @@ android:layout_width="0dp" android:layout_height="wrap_content" android:layout_margin="8dp" - android:layout_weight="1" - app:cardCornerRadius="4dp" - app:cardElevation="4dp"> + android:layout_weight="1"> - - diff --git a/app/src/main/res/layout-w600dp/activity_details.xml b/app/src/main/res/layout-w600dp/activity_details.xml index 6e89585c7..6bf664eea 100644 --- a/app/src/main/res/layout-w600dp/activity_details.xml +++ b/app/src/main/res/layout-w600dp/activity_details.xml @@ -10,14 +10,11 @@ + android:layout_height="wrap_content"> diff --git a/app/src/main/res/layout-w600dp/activity_settings.xml b/app/src/main/res/layout-w600dp/activity_settings.xml index 3b6db9d0b..b257facd3 100644 --- a/app/src/main/res/layout-w600dp/activity_settings.xml +++ b/app/src/main/res/layout-w600dp/activity_settings.xml @@ -8,17 +8,14 @@ diff --git a/app/src/main/res/layout-w600dp/fragment_list.xml b/app/src/main/res/layout-w600dp/fragment_list.xml index befce9ebf..cc60564d7 100644 --- a/app/src/main/res/layout-w600dp/fragment_list.xml +++ b/app/src/main/res/layout-w600dp/fragment_list.xml @@ -36,7 +36,7 @@ android:id="@+id/divider_filter" android:layout_width="1dp" android:layout_height="match_parent" - android:background="?dividerVertical" + android:background="?attr/colorOutline" android:visibility="gone" tools:visibility="visible" /> diff --git a/app/src/main/res/layout/activity_browser.xml b/app/src/main/res/layout/activity_browser.xml index b230edce1..b9a3c6992 100644 --- a/app/src/main/res/layout/activity_browser.xml +++ b/app/src/main/res/layout/activity_browser.xml @@ -8,17 +8,14 @@ diff --git a/app/src/main/res/layout/activity_categories.xml b/app/src/main/res/layout/activity_categories.xml index 48043eb74..9c05aee7f 100644 --- a/app/src/main/res/layout/activity_categories.xml +++ b/app/src/main/res/layout/activity_categories.xml @@ -8,16 +8,14 @@ + android:layout_height="wrap_content"> + android:layout_height="?attr/actionBarSize" + android:theme="?attr/actionBarTheme"/> @@ -39,8 +37,7 @@ android:layout_margin="20dp" android:gravity="center" android:text="@string/text_categories_holder" - android:textAppearance="?android:textAppearanceMedium" - android:textColor="?android:textColorSecondary" + android:textAppearance="?attr/textAppearanceBody2" android:visibility="gone" tools:visibility="visible" /> @@ -51,7 +48,6 @@ android:layout_margin="16dp" android:contentDescription="@string/add_new_category" android:src="@drawable/ic_add" - app:backgroundTint="?colorAccent" app:fabSize="normal" app:layout_anchor="@id/recyclerView" app:layout_anchorGravity="bottom|end" diff --git a/app/src/main/res/layout/activity_details.xml b/app/src/main/res/layout/activity_details.xml index 39f3f7d81..5a723948f 100644 --- a/app/src/main/res/layout/activity_details.xml +++ b/app/src/main/res/layout/activity_details.xml @@ -10,17 +10,17 @@ + android:layout_height="?attr/actionBarSize" + android:theme="?attr/actionBarTheme" + app:layout_scrollFlags="scroll|enterAlways"/> + android:fitsSystemWindows="true" + app:elevation="0dp"> + android:layout_height="?attr/actionBarSize" + android:theme="?attr/actionBarTheme"/> @@ -39,8 +39,7 @@ android:layout_margin="20dp" android:gravity="center" android:text="@string/text_downloads_holder" - android:textAppearance="?android:textAppearanceMedium" - android:textColor="?android:textColorSecondary" + android:textAppearance="?attr/textAppearanceBody2" android:visibility="gone" tools:visibility="visible" /> diff --git a/app/src/main/res/layout/activity_image.xml b/app/src/main/res/layout/activity_image.xml index 251ff1c27..108024a8c 100644 --- a/app/src/main/res/layout/activity_image.xml +++ b/app/src/main/res/layout/activity_image.xml @@ -12,7 +12,6 @@ diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 64e125d8d..667c821b1 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -20,31 +20,28 @@ + android:stateListAnimator="@null"> - + android:layout_marginBottom="8dp"> - + @@ -77,7 +74,6 @@ android:contentDescription="@string/_continue" android:src="@drawable/ic_read_fill" android:visibility="gone" - app:backgroundTint="?colorAccent" app:fabSize="normal" app:layout_anchor="@id/container" app:layout_anchorGravity="bottom|end" @@ -92,10 +88,8 @@ android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_gravity="start" + android:fitsSystemWindows="true" app:insetForeground="@android:color/transparent" - app:itemHorizontalPadding="16dp" - app:itemIconPadding="24dp" - app:itemIconTint="@color/navigation_item_color_tint" app:menu="@menu/nav_drawer" /> \ No newline at end of file diff --git a/app/src/main/res/layout/activity_protect.xml b/app/src/main/res/layout/activity_protect.xml index 28cc9060b..3cba1f000 100644 --- a/app/src/main/res/layout/activity_protect.xml +++ b/app/src/main/res/layout/activity_protect.xml @@ -60,17 +60,18 @@ -