diff --git a/app/build.gradle b/app/build.gradle index c48cd97fc..85d26d71c 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -49,7 +49,7 @@ android { defaultConfig { applicationId "io.legato.kazusa" - minSdk 24 + minSdk 26 targetSdk 35 versionCode 10000 + gitCommits versionName version @@ -81,7 +81,7 @@ android { signingConfig signingConfigs.myConfig } //applicationIdSuffix '.release' - manifestPlaceholders.put("app_name", "@string/app_name_a") + manifestPlaceholders.put("app_name", "@string/app_name") minifyEnabled true shrinkResources true @@ -104,6 +104,7 @@ android { abi { enable true reset() + //noinspection ChromeOsAbiSupport include 'armeabi-v7a', 'arm64-v8a' universalApk true } @@ -306,4 +307,5 @@ dependencies { //epubLib集成到应用内 implementation libs.androidx.datastore.preferences + implementation libs.androidx.palette } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 1874401e3..f82bca392 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -114,7 +114,7 @@ android:name=".ui.main.MainActivity" android:alwaysRetainTaskState="true" android:enableOnBackInvokedCallback="true" - android:configChanges="locale|keyboardHidden|orientation|screenSize|smallestScreenSize|screenLayout" + android:configChanges="locale|keyboardHidden|smallestScreenSize|screenLayout" android:exported="true"> @@ -125,7 +125,7 @@ diff --git a/app/src/main/java/io/legato/kazusa/App.kt b/app/src/main/java/io/legato/kazusa/App.kt index 352efe1cb..dd453396d 100644 --- a/app/src/main/java/io/legato/kazusa/App.kt +++ b/app/src/main/java/io/legato/kazusa/App.kt @@ -69,6 +69,7 @@ class App : Application() { override fun onCreate() { super.onCreate() + DynamicColors.applyToActivitiesIfAvailable(this) CrashHandler(this) if (isDebuggable) { ThreadUtils.setThreadAssertsDisabledForTesting(true) diff --git a/app/src/main/java/io/legato/kazusa/base/BaseActivity.kt b/app/src/main/java/io/legato/kazusa/base/BaseActivity.kt index 26e9d82e0..7fea81159 100644 --- a/app/src/main/java/io/legato/kazusa/base/BaseActivity.kt +++ b/app/src/main/java/io/legato/kazusa/base/BaseActivity.kt @@ -14,6 +14,7 @@ import android.view.MotionEvent import android.view.View import android.widget.FrameLayout import androidx.activity.addCallback +import androidx.activity.enableEdgeToEdge import androidx.annotation.RequiresApi import androidx.appcompat.app.AppCompatActivity import androidx.viewbinding.ViewBinding @@ -78,7 +79,7 @@ abstract class BaseActivity( window.decorView.disableAutoFill() AppContextWrapper.applyLocaleAndFont(this) super.onCreate(savedInstanceState) - + enableEdgeToEdge() //setupSystemBar() setContentView(binding.root) upBackgroundImage() @@ -90,9 +91,9 @@ abstract class BaseActivity( onActivityCreated(savedInstanceState) } - @RequiresApi(Build.VERSION_CODES.O) override fun onMultiWindowModeChanged(isInMultiWindowMode: Boolean, newConfig: Configuration) { super.onMultiWindowModeChanged(isInMultiWindowMode, newConfig) + // findViewById(R.id.title_bar) // ?.onMultiWindowModeChanged(isInMultiWindowMode, fullScreen) //setupSystemBar() diff --git a/app/src/main/java/io/legato/kazusa/base/BaseFragment.kt b/app/src/main/java/io/legato/kazusa/base/BaseFragment.kt index 9278d7d3e..dc423f7f8 100644 --- a/app/src/main/java/io/legato/kazusa/base/BaseFragment.kt +++ b/app/src/main/java/io/legato/kazusa/base/BaseFragment.kt @@ -37,10 +37,10 @@ abstract class BaseFragment(@LayoutRes layoutID: Int) : Fragment(layoutID) { onMultiWindowModeChanged() } - override fun onConfigurationChanged(newConfig: Configuration) { - super.onConfigurationChanged(newConfig) - onMultiWindowModeChanged() - } +// override fun onConfigurationChanged(newConfig: Configuration) { +// super.onConfigurationChanged(newConfig) +// onMultiWindowModeChanged() +// } private fun onMultiWindowModeChanged() { // (activity as? BaseActivity<*>)?.let { diff --git a/app/src/main/java/io/legato/kazusa/constant/PreferKey.kt b/app/src/main/java/io/legato/kazusa/constant/PreferKey.kt index 7bbc5eedf..e44d01ce9 100644 --- a/app/src/main/java/io/legato/kazusa/constant/PreferKey.kt +++ b/app/src/main/java/io/legato/kazusa/constant/PreferKey.kt @@ -37,6 +37,8 @@ object PreferKey { const val enableReview = "enableReview" const val showRss = "showRss" const val bookshelfLayout = "bookshelfLayout" + const val bookshelfLayoutPortrait = "bookshelfLayoutPortrait" + const val bookshelfLayoutLandscape = "bookshelf_layout_landscape" const val bookshelfSort = "bookshelfSort" const val bookExportFileName = "bookExportFileName" const val bookImportFileName = "bookImportFileName" diff --git a/app/src/main/java/io/legato/kazusa/help/config/AppConfig.kt b/app/src/main/java/io/legato/kazusa/help/config/AppConfig.kt index 26e8fc5f9..3c7a8b132 100644 --- a/app/src/main/java/io/legato/kazusa/help/config/AppConfig.kt +++ b/app/src/main/java/io/legato/kazusa/help/config/AppConfig.kt @@ -159,12 +159,19 @@ object AppConfig : SharedPreferences.OnSharedPreferenceChangeListener { appCtx.putPrefInt(PreferKey.bookGroupStyle, value) } - var bookshelfLayout: Int - get() = appCtx.getPrefInt(PreferKey.bookshelfLayout, 0) + var bookshelfLayoutPortrait: Int + get() = appCtx.getPrefInt(PreferKey.bookshelfLayoutPortrait, 3) set(value) { - appCtx.putPrefInt(PreferKey.bookshelfLayout, value) + appCtx.putPrefInt(PreferKey.bookshelfLayoutPortrait, value) } + var bookshelfLayoutLandscape: Int + get() = appCtx.getPrefInt(PreferKey.bookshelfLayoutLandscape, 5) + set(value) { + appCtx.putPrefInt(PreferKey.bookshelfLayoutLandscape, value) + } + + var saveTabPosition: Int get() = appCtx.getPrefInt(PreferKey.saveTabPosition, 0) set(value) { diff --git a/app/src/main/java/io/legato/kazusa/help/glide/ImageLoader.kt b/app/src/main/java/io/legato/kazusa/help/glide/ImageLoader.kt index 745fa5a3b..e3c03c700 100644 --- a/app/src/main/java/io/legato/kazusa/help/glide/ImageLoader.kt +++ b/app/src/main/java/io/legato/kazusa/help/glide/ImageLoader.kt @@ -14,6 +14,7 @@ import io.legato.kazusa.utils.isContentScheme import io.legato.kazusa.utils.isDataUrl import io.legato.kazusa.utils.lifecycle import java.io.File +import androidx.core.net.toUri //https://bumptech.github.io/glide/doc/generatedapi.html //Instead of GlideApp, use com.bumptech.Glide @@ -28,7 +29,7 @@ object ImageLoader { path.isNullOrEmpty() -> Glide.with(context).load(path) path.isDataUrl() -> Glide.with(context).load(path) path.isAbsUrl() -> Glide.with(context).load(path) - path.isContentScheme() -> Glide.with(context).load(Uri.parse(path)) + path.isContentScheme() -> Glide.with(context).load(path.toUri()) else -> kotlin.runCatching { Glide.with(context).load(File(path)) }.getOrElse { diff --git a/app/src/main/java/io/legato/kazusa/lib/permission/PermissionActivity.kt b/app/src/main/java/io/legato/kazusa/lib/permission/PermissionActivity.kt index 8102be060..131e12364 100644 --- a/app/src/main/java/io/legato/kazusa/lib/permission/PermissionActivity.kt +++ b/app/src/main/java/io/legato/kazusa/lib/permission/PermissionActivity.kt @@ -12,6 +12,7 @@ import androidx.activity.result.contract.ActivityResultContracts import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.lifecycleScope +import com.google.android.material.dialog.MaterialAlertDialogBuilder import io.legato.kazusa.R import io.legato.kazusa.constant.AppLog import io.legato.kazusa.exception.NoStackTraceException @@ -195,7 +196,7 @@ class PermissionActivity : AppCompatActivity() { finish() return } - rationaleDialog = AlertDialog.Builder(this) + rationaleDialog = MaterialAlertDialogBuilder(this) .setTitle(R.string.dialog_title) .setMessage(rationale) .setPositiveButton(R.string.dialog_setting) { _, _ -> diff --git a/app/src/main/java/io/legato/kazusa/lib/theme/ThemeStore.kt b/app/src/main/java/io/legato/kazusa/lib/theme/ThemeStore.kt index 1ff177ada..ac47d9727 100644 --- a/app/src/main/java/io/legato/kazusa/lib/theme/ThemeStore.kt +++ b/app/src/main/java/io/legato/kazusa/lib/theme/ThemeStore.kt @@ -22,18 +22,6 @@ private constructor(private val mContext: Context) : ThemeStoreInterface { private val mEditor = prefs(mContext).edit() -// override fun enableDynamicColors(context: Context, enable: Boolean): ThemeStore { -// mEditor.putBoolean(ThemeStorePrefKeys.KEY_DYNAMIC_COLORS_ENABLED, enable) -// if (enable && Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { -// // 使用系统动态颜色 -// val dynamicColors = DynamicColorsOptions.Builder() -// .setThemeOverlay(R.style.Theme_App_Dynamic) -// .build() -// DynamicColors.applyToActivitiesIfAvailable(context.applicationContext, dynamicColors) -// } -// return this -// } - override fun primaryColor(@ColorInt color: Int): ThemeStore { mEditor.putInt(ThemeStorePrefKeys.KEY_PRIMARY_COLOR, color) if (autoGeneratePrimaryDark(mContext)) diff --git a/app/src/main/java/io/legato/kazusa/lib/theme/view/ThemeBottomNavigationVIew.kt b/app/src/main/java/io/legato/kazusa/lib/theme/view/ThemeBottomNavigationVIew.kt index 67e5f0899..5a6c70249 100644 --- a/app/src/main/java/io/legato/kazusa/lib/theme/view/ThemeBottomNavigationVIew.kt +++ b/app/src/main/java/io/legato/kazusa/lib/theme/view/ThemeBottomNavigationVIew.kt @@ -18,22 +18,6 @@ class ThemeBottomNavigationVIew(context: Context, attrs: AttributeSet) : BottomNavigationView(context, attrs) { init { -// val bgColor = context.bottomBackground -// setBackgroundColor(bgColor) -// val textIsDark = ColorUtils.isColorLight(bgColor) -// val textColor = context.getSecondaryTextColor(textIsDark) -// -// val colorStateList = Selector.colorBuild() -// .setDefaultColor(textColor) -// .setSelectedColor(ThemeStore.accentColor(context)).create() -// itemIconTintList = colorStateList -// itemTextColor = colorStateList - - if (AppConfig.isEInkMode) { - isItemHorizontalTranslationEnabled = false - itemBackground = Color.TRANSPARENT.toDrawable() - } - ViewCompat.setOnApplyWindowInsetsListener(this, null) } diff --git a/app/src/main/java/io/legato/kazusa/model/BookCover.kt b/app/src/main/java/io/legato/kazusa/model/BookCover.kt index 49ac7024b..91c101d2d 100644 --- a/app/src/main/java/io/legato/kazusa/model/BookCover.kt +++ b/app/src/main/java/io/legato/kazusa/model/BookCover.kt @@ -78,6 +78,7 @@ object BookCover { }.getOrDefault(appCtx.resources.getDrawable(R.drawable.image_cover_default, null)) } + /** * 加载封面 */ @@ -127,6 +128,8 @@ object BookCover { .centerCrop() } + + /** * 加载漫画图片 */ diff --git a/app/src/main/java/io/legato/kazusa/ui/association/OpenUrlConfirmDialog.kt b/app/src/main/java/io/legato/kazusa/ui/association/OpenUrlConfirmDialog.kt index 84236a97c..0a9c3c90f 100644 --- a/app/src/main/java/io/legato/kazusa/ui/association/OpenUrlConfirmDialog.kt +++ b/app/src/main/java/io/legato/kazusa/ui/association/OpenUrlConfirmDialog.kt @@ -63,7 +63,7 @@ class OpenUrlConfirmDialog() : BaseDialogFragment(R.layout.dialog_open_url_confi private fun initMenu() { binding.toolBar.setOnMenuItemClickListener(this) binding.toolBar.inflateMenu(R.menu.open_url_confirm) - binding.toolBar.menu.applyTint(requireContext()) + //binding.toolBar.menu.applyTint(requireContext()) } private fun initView() { diff --git a/app/src/main/java/io/legato/kazusa/ui/association/VerificationCodeDialog.kt b/app/src/main/java/io/legato/kazusa/ui/association/VerificationCodeDialog.kt index 79bcb0fe1..43cf2ae73 100644 --- a/app/src/main/java/io/legato/kazusa/ui/association/VerificationCodeDialog.kt +++ b/app/src/main/java/io/legato/kazusa/ui/association/VerificationCodeDialog.kt @@ -79,7 +79,7 @@ class VerificationCodeDialog() : BaseDialogFragment(R.layout.dialog_verification private fun initMenu() { binding.toolBar.setOnMenuItemClickListener(this) binding.toolBar.inflateMenu(R.menu.verification_code) - binding.toolBar.menu.applyTint(requireContext()) + //binding.toolBar.menu.applyTint(requireContext()) } @SuppressLint("CheckResult") diff --git a/app/src/main/java/io/legato/kazusa/ui/book/bookmark/BookmarkDialog.kt b/app/src/main/java/io/legato/kazusa/ui/book/bookmark/BookmarkDialog.kt index e485855d8..a7bbe2d80 100644 --- a/app/src/main/java/io/legato/kazusa/ui/book/bookmark/BookmarkDialog.kt +++ b/app/src/main/java/io/legato/kazusa/ui/book/bookmark/BookmarkDialog.kt @@ -40,14 +40,14 @@ class BookmarkDialog() : BaseBottomSheetDialogFragment(R.layout.dialog_bookmark) return } - //@Suppress("DEPRECATION") + @Suppress("DEPRECATION") val bookmark = arguments.getParcelable("bookmark") bookmark ?: let { dismiss() return } val editPos = arguments.getInt("editPos", -1) - binding.btnDelete.visible(editPos >= 0) // 替换 tvFooterLeft + binding.btnDelete.visible(editPos >= 0) binding.run { tvChapterName.text = bookmark.chapterName diff --git a/app/src/main/java/io/legato/kazusa/ui/book/changecover/ChangeCoverDialog.kt b/app/src/main/java/io/legato/kazusa/ui/book/changecover/ChangeCoverDialog.kt index be86f4401..1e7530c8b 100644 --- a/app/src/main/java/io/legato/kazusa/ui/book/changecover/ChangeCoverDialog.kt +++ b/app/src/main/java/io/legato/kazusa/ui/book/changecover/ChangeCoverDialog.kt @@ -59,7 +59,7 @@ class ChangeCoverDialog() : BaseDialogFragment(R.layout.dialog_change_cover), private fun initMenu() { binding.toolBar.inflateMenu(R.menu.change_cover) - binding.toolBar.menu.applyTint(requireContext()) + //binding.toolBar.menu.applyTint(requireContext()) binding.toolBar.setOnMenuItemClickListener(this) } @@ -94,7 +94,7 @@ class ChangeCoverDialog() : BaseDialogFragment(R.layout.dialog_change_cover), item.setTitle(R.string.refresh) } } - binding.toolBar.menu.applyTint(requireContext()) + //binding.toolBar.menu.applyTint(requireContext()) } } diff --git a/app/src/main/java/io/legato/kazusa/ui/book/changesource/ChangeChapterSourceDialog.kt b/app/src/main/java/io/legato/kazusa/ui/book/changesource/ChangeChapterSourceDialog.kt index 9059de566..58f018803 100644 --- a/app/src/main/java/io/legato/kazusa/ui/book/changesource/ChangeChapterSourceDialog.kt +++ b/app/src/main/java/io/legato/kazusa/ui/book/changesource/ChangeChapterSourceDialog.kt @@ -140,7 +140,7 @@ class ChangeChapterSourceDialog() : BaseDialogFragment(R.layout.dialog_chapter_c private fun initMenu() { binding.toolBar.inflateMenu(R.menu.change_source) - binding.toolBar.menu.applyTint(requireContext()) + //binding.toolBar.menu.applyTint(requireContext()) binding.toolBar.setOnMenuItemClickListener(this) binding.toolBar.menu.findItem(R.id.menu_check_author) ?.isChecked = AppConfig.changeSourceCheckAuthor diff --git a/app/src/main/java/io/legato/kazusa/ui/book/group/GroupManageDialog.kt b/app/src/main/java/io/legato/kazusa/ui/book/group/GroupManageDialog.kt index 5b92c14d9..cd379d890 100644 --- a/app/src/main/java/io/legato/kazusa/ui/book/group/GroupManageDialog.kt +++ b/app/src/main/java/io/legato/kazusa/ui/book/group/GroupManageDialog.kt @@ -86,7 +86,7 @@ class GroupManageDialog : BaseBottomSheetDialogFragment(R.layout.dialog_recycler private fun initMenu() { binding.toolBar.setOnMenuItemClickListener(this) binding.toolBar.inflateMenu(R.menu.book_group_manage) - binding.toolBar.menu.applyTint(requireContext()) + //binding.toolBar.menu.applyTint(requireContext()) } override fun onMenuItemClick(item: MenuItem?): Boolean { diff --git a/app/src/main/java/io/legato/kazusa/ui/book/group/GroupSelectDialog.kt b/app/src/main/java/io/legato/kazusa/ui/book/group/GroupSelectDialog.kt index a5ebb3e16..1ce8dc67c 100644 --- a/app/src/main/java/io/legato/kazusa/ui/book/group/GroupSelectDialog.kt +++ b/app/src/main/java/io/legato/kazusa/ui/book/group/GroupSelectDialog.kt @@ -66,7 +66,7 @@ class GroupSelectDialog() : BaseBottomSheetDialogFragment(R.layout.dialog_book_g private fun initView() { binding.toolBar.title = getString(R.string.group_select) binding.toolBar.inflateMenu(R.menu.book_group_manage) - binding.toolBar.menu.applyTint(requireContext()) + //binding.toolBar.menu.applyTint(requireContext()) binding.toolBar.setOnMenuItemClickListener(this) binding.recyclerView.layoutManager = LinearLayoutManager(requireContext()) binding.recyclerView.addItemDecoration(VerticalDivider(requireContext())) diff --git a/app/src/main/java/io/legato/kazusa/ui/book/import/remote/ServerConfigDialog.kt b/app/src/main/java/io/legato/kazusa/ui/book/import/remote/ServerConfigDialog.kt index 6839b624c..94d3710f4 100644 --- a/app/src/main/java/io/legato/kazusa/ui/book/import/remote/ServerConfigDialog.kt +++ b/app/src/main/java/io/legato/kazusa/ui/book/import/remote/ServerConfigDialog.kt @@ -46,7 +46,7 @@ class ServerConfigDialog() : BaseDialogFragment(R.layout.dialog_webdav_server, t override fun onFragmentCreated(view: View, savedInstanceState: Bundle?) { //inding.toolBar.setBackgroundColor(primaryColor) binding.toolBar.inflateMenu(R.menu.server_config) - binding.toolBar.menu.applyTint(requireContext()) + //binding.toolBar.menu.applyTint(requireContext()) binding.toolBar.setOnMenuItemClickListener(this) viewModel.init(arguments?.getLong("id")) { upConfigView(viewModel.mServer) diff --git a/app/src/main/java/io/legato/kazusa/ui/book/info/BookInfoActivity.kt b/app/src/main/java/io/legato/kazusa/ui/book/info/BookInfoActivity.kt index 17ed4e8fa..046c6adea 100644 --- a/app/src/main/java/io/legato/kazusa/ui/book/info/BookInfoActivity.kt +++ b/app/src/main/java/io/legato/kazusa/ui/book/info/BookInfoActivity.kt @@ -2,19 +2,28 @@ package io.legato.kazusa.ui.book.info import android.annotation.SuppressLint import android.content.Intent +import android.graphics.Bitmap +import android.graphics.Color import android.graphics.RenderEffect import android.graphics.Shader +import android.graphics.drawable.BitmapDrawable +import android.graphics.drawable.Drawable import android.net.Uri import android.os.Build import android.os.Bundle import android.view.Menu import android.view.MenuItem +import android.view.View import android.widget.CheckBox import android.widget.LinearLayout import androidx.activity.result.contract.ActivityResultContracts import androidx.activity.viewModels import androidx.core.content.ContextCompat import androidx.lifecycle.lifecycleScope +import androidx.palette.graphics.Palette +import com.google.android.material.button.MaterialButton +import com.google.android.material.color.utilities.Hct +import com.google.android.material.color.utilities.SchemeTonalSpot import io.legato.kazusa.R import io.legato.kazusa.base.VMBaseActivity import io.legato.kazusa.constant.BookType @@ -75,6 +84,7 @@ import io.legato.kazusa.utils.startActivity import io.legato.kazusa.utils.toastOnUi import io.legato.kazusa.utils.viewbindingdelegate.viewBinding import io.legato.kazusa.utils.visible +import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers.IO import kotlinx.coroutines.launch import kotlinx.coroutines.withContext @@ -161,12 +171,10 @@ class BookInfoActivity : // binding.llInfo.setBackgroundColor(backgroundColor) // binding.flAction.setBackgroundColor(bottomBackground) //binding.flAction.applyNavigationBarPadding() - binding.btnShelf?.text = getString(R.string.remove_from_bookshelf) + binding.btnShelf.text = getString(R.string.remove_from_bookshelf) binding.tvToc.text = getString(R.string.toc_s, getString(R.string.loading)) - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1) { - binding.tvDetail?.let { it.revealOnFocusHint = false } - } + binding.tvDetail.revealOnFocusHint = false viewModel.bookData.observe(this) { showBook(it) } viewModel.chapterListData.observe(this) { upLoading(false, it) } @@ -340,8 +348,8 @@ class BookInfoActivity : tvAuthor.text = getString(R.string.author_show, book.getRealAuthor()) tvOrigin.text = getString(R.string.origin_show, book.originName) tvLasted.text = getString(R.string.lasted_show, book.latestChapterTitle) - tvDetail?.let { it.text = book.getDisplayIntro() } - llToc?.visible(!book.isWebFile) + tvDetail.let { it.text = book.getDisplayIntro() } + llToc.visible(!book.isWebFile) upTvBookshelf() upKinds(book) upGroup(book.group) @@ -412,10 +420,10 @@ class BookInfoActivity : } private fun upTvBookshelf() { - binding.btnShelf?.apply { + binding.btnShelf.apply { if (viewModel.inBookshelf) { text = getString(R.string.remove_from_bookshelf) - icon = ContextCompat.getDrawable(context, R.drawable.ic_clear_all) + icon = ContextCompat.getDrawable(context, R.drawable.ic_star_fill) } else { text = getString(R.string.add_to_bookshelf) icon = ContextCompat.getDrawable(context, R.drawable.ic_star) @@ -427,13 +435,15 @@ class BookInfoActivity : private fun upGroup(groupId: Long) { viewModel.loadGroup(groupId) { if (it.isNullOrEmpty()) { - binding.tvGroup.text = if (book?.isLocal == true) { - getString(R.string.group_s, getString(R.string.local_no_group)) + binding.tvChangeGroup.text = if (book?.isLocal == true) { + getString(R.string.local_no_group) } else { - getString(R.string.group_s, getString(R.string.no_group)) + getString(R.string.no_group) } + binding.tvChangeGroup.setIconResource(R.drawable.ic_groups) } else { - binding.tvGroup.text = getString(R.string.group_s, it) + binding.tvChangeGroup.text = getString(R.string.group_s, it) + binding.tvChangeGroup.setIconResource(R.drawable.ic_groups_fill) } } } @@ -452,7 +462,7 @@ class BookInfoActivity : } true } - btnRead?.setOnClickListener { + btnRead.setOnClickListener { viewModel.getBook()?.let { book -> if (book.isWebFile) { showWebFileDownloadAlert { @@ -463,7 +473,7 @@ class BookInfoActivity : } } } - btnShelf?.setOnClickListener { + btnShelf.setOnClickListener { viewModel.getBook()?.let { book -> if (viewModel.inBookshelf) { deleteBook() @@ -490,7 +500,7 @@ class BookInfoActivity : } } } - btnChangeSource?.setOnClickListener { + btnChangeSource.setOnClickListener { viewModel.getBook()?.let { book -> showDialogFragment(ChangeBookSourceDialog(book.name, book.author)) } @@ -533,7 +543,7 @@ class BookInfoActivity : } } } - refreshLayout?.setOnRefreshListener { + refreshLayout.setOnRefreshListener { refreshLayout.isRefreshing = false refreshBook() } @@ -784,4 +794,16 @@ class BookInfoActivity : } } + // 扩展函数:从Drawable中提取主色调 + suspend fun Drawable.extractDominantColor(): Int = withContext(Dispatchers.Default) { + // 将Drawable转换为Bitmap + val bitmap = (this@extractDominantColor as? BitmapDrawable)?.bitmap ?: return@withContext Color.TRANSPARENT + + // 生成Palette + val palette = Palette.from(bitmap).generate() + + // 返回主色调,若未找到则使用默认值 + palette.getDominantColor(Color.WHITE) + } + } \ No newline at end of file diff --git a/app/src/main/java/io/legato/kazusa/ui/book/manage/SourcePickerDialog.kt b/app/src/main/java/io/legato/kazusa/ui/book/manage/SourcePickerDialog.kt index 7ea4b1643..c114f0907 100644 --- a/app/src/main/java/io/legato/kazusa/ui/book/manage/SourcePickerDialog.kt +++ b/app/src/main/java/io/legato/kazusa/ui/book/manage/SourcePickerDialog.kt @@ -101,7 +101,7 @@ class SourcePickerDialog : BaseDialogFragment(R.layout.dialog_source_picker), private fun initMenu() { toolBar.setOnMenuItemClickListener(this) toolBar.inflateMenu(R.menu.source_picker) - toolBar.menu.applyTint(requireContext()) + //toolBar.menu.applyTint(requireContext()) } override fun onMenuItemClick(item: MenuItem?): Boolean { diff --git a/app/src/main/java/io/legato/kazusa/ui/book/manga/ReadMangaActivity.kt b/app/src/main/java/io/legato/kazusa/ui/book/manga/ReadMangaActivity.kt index 3fe2c8ad9..dc29c513e 100644 --- a/app/src/main/java/io/legato/kazusa/ui/book/manga/ReadMangaActivity.kt +++ b/app/src/main/java/io/legato/kazusa/ui/book/manga/ReadMangaActivity.kt @@ -121,9 +121,9 @@ class ReadMangaActivity : VMBaseActivity { diff --git a/app/src/main/java/io/legato/kazusa/ui/book/read/ReadBookActivity.kt b/app/src/main/java/io/legato/kazusa/ui/book/read/ReadBookActivity.kt index 0cc9de242..91394eed3 100644 --- a/app/src/main/java/io/legato/kazusa/ui/book/read/ReadBookActivity.kt +++ b/app/src/main/java/io/legato/kazusa/ui/book/read/ReadBookActivity.kt @@ -34,6 +34,7 @@ import io.legato.kazusa.data.entities.Book import io.legato.kazusa.data.entities.BookChapter import io.legato.kazusa.data.entities.BookProgress import io.legato.kazusa.data.entities.BookSource +import io.legato.kazusa.data.entities.ReplaceRule import io.legato.kazusa.exception.NoStackTraceException import io.legato.kazusa.help.AppWebDav import io.legato.kazusa.help.IntentData @@ -508,6 +509,7 @@ class ReadBookActivity : BaseReadBookActivity(), } } + R.id.menu_setting_replace -> openReplaceRule() R.id.menu_download -> showDownloadDialog() R.id.menu_add_bookmark -> addBookmark() R.id.menu_simulated_reading -> showSimulatedReading() @@ -1203,19 +1205,23 @@ class ReadBookActivity : BaseReadBookActivity(), /** * 显示阅读样式配置 */ - override fun showReadStyle() { +// override fun showReadStyle() { +// showDialogFragment() +// } +// +// /** +// * 显示更多设置 +// */ +// override fun showMoreSetting() { +// showDialogFragment() +// } +// + override fun showSearchSetting() { showDialogFragment() } - /** - * 显示更多设置 - */ - override fun showMoreSetting() { - showDialogFragment() - } - - override fun showSearchSetting() { - showDialogFragment() + override fun showReadStyle() { + showDialogFragment() } /** diff --git a/app/src/main/java/io/legato/kazusa/ui/book/read/ReadMenu.kt b/app/src/main/java/io/legato/kazusa/ui/book/read/ReadMenu.kt index e8936c4b1..9a450d29d 100644 --- a/app/src/main/java/io/legato/kazusa/ui/book/read/ReadMenu.kt +++ b/app/src/main/java/io/legato/kazusa/ui/book/read/ReadMenu.kt @@ -31,6 +31,7 @@ import io.legato.kazusa.lib.dialogs.alert //import io.legado.app.lib.theme.primaryColor //import io.legado.app.lib.theme.primaryTextColor import io.legato.kazusa.model.ReadBook +import io.legato.kazusa.ui.book.read.config.MoreConfigDialog import io.legato.kazusa.ui.browser.WebViewActivity import io.legato.kazusa.ui.widget.seekbar.SeekBarChangeListener import io.legato.kazusa.utils.ConstraintModify @@ -44,6 +45,7 @@ import io.legato.kazusa.utils.loadAnimation import io.legato.kazusa.utils.modifyBegin import io.legato.kazusa.utils.openUrl import io.legato.kazusa.utils.putPrefBoolean +import io.legato.kazusa.utils.showDialogFragment import io.legato.kazusa.utils.startActivity import io.legato.kazusa.utils.visible import splitties.views.onClick @@ -159,11 +161,11 @@ class ReadMenu @JvmOverloads constructor( } private fun initView(reset: Boolean = false) = binding.run { - if (AppConfig.isNightTheme) { - fabNightTheme.setImageResource(R.drawable.ic_daytime) - } else { - fabNightTheme.setImageResource(R.drawable.ic_brightness) - } +// if (AppConfig.isNightTheme) { +// fabNightTheme.setIconResource(R.drawable.ic_daytime) +// } else { +// fabNightTheme.setIconResource(R.drawable.ic_brightness) +// } initAnimation() if (immersiveMenu) { // val lightTextColor = ColorUtils.withAlpha(ColorUtils.lightenColor(textColor), 0.75f) @@ -223,7 +225,7 @@ class ReadMenu @JvmOverloads constructor( /** * 确保视图不被导航栏遮挡 */ - applyNavigationBarPadding() + binding.bottomView.applyNavigationBarPadding() } fun reset() { @@ -361,8 +363,6 @@ class ReadMenu @JvmOverloads constructor( } tvChapterName.setOnClickListener(chapterViewClickListener) tvChapterName.setOnLongClickListener(chapterViewLongClickListener) - tvChapterUrl.setOnClickListener(chapterViewClickListener) - tvChapterUrl.setOnLongClickListener(chapterViewLongClickListener) //书源操作 tvSourceAction.onClick { sourceMenu.menu.findItem(R.id.menu_login).isVisible = @@ -446,13 +446,13 @@ class ReadMenu @JvmOverloads constructor( } //替换 - fabReplaceRule.setOnClickListener { callBack.openReplaceRule() } + //fabReplaceRule.setOnClickListener { callBack.openReplaceRule() } //夜间模式 - fabNightTheme.setOnClickListener { - AppConfig.isNightTheme = !AppConfig.isNightTheme - ThemeConfig.applyDayNight(context) - } +// fabNightTheme.setOnClickListener { +// AppConfig.isNightTheme = !AppConfig.isNightTheme +// ThemeConfig.applyDayNight(context) +// } //上一章 tvPre.setOnClickListener { ReadBook.moveToPrevChapter(upContent = true, toLast = false) } @@ -461,37 +461,31 @@ class ReadMenu @JvmOverloads constructor( tvNext.setOnClickListener { ReadBook.moveToNextChapter(true) } //目录 - llCatalog.setOnClickListener { + ivCatalog.setOnClickListener { runMenuOut { callBack.openChapterList() } } //朗读 - llReadAloud.setOnClickListener { + ivReadAloud.setOnClickListener { runMenuOut { callBack.onClickReadAloud() } } - llReadAloud.onLongClick { + + ivReadAloud.onLongClick { runMenuOut { callBack.showReadAloudDialog() } } - //界面 - llFont.setOnClickListener { + //设置 + ivSetting.setOnClickListener { runMenuOut { callBack.showReadStyle() } } - - //设置 - llSetting.setOnClickListener { - runMenuOut { - callBack.showMoreSetting() - } - } } private fun initAnimation() { @@ -500,13 +494,13 @@ class ReadMenu @JvmOverloads constructor( } fun upBookView() { - binding.titleBar.title = ReadBook.book?.name + binding.titleBar.title = " " + binding.tvBookName.text = ReadBook.book?.name ReadBook.curTextChapter?.let { binding.tvChapterName.text = it.title - binding.tvChapterName.visible() if (!ReadBook.isLocalBook) { binding.tvChapterUrl.text = it.chapter.getAbsoluteURL() - binding.tvChapterUrl.visible() + //binding.tvChapterUrl.visible() } else { binding.tvChapterUrl.gone() } @@ -514,7 +508,6 @@ class ReadMenu @JvmOverloads constructor( binding.tvPre.isEnabled = ReadBook.durChapterIndex != 0 binding.tvNext.isEnabled = ReadBook.durChapterIndex != ReadBook.simulatedChapterSize - 1 } ?: let { - binding.tvChapterName.gone() binding.tvChapterUrl.gone() } } @@ -526,20 +519,16 @@ class ReadMenu @JvmOverloads constructor( when (AppConfig.progressBarBehavior) { "page" -> { ReadBook.curTextChapter?.let { chapter -> - if (chapter.pageSize > 0 && ReadBook.durPageIndex > 0) { + if (chapter.pageSize >= 0 && ReadBook.durPageIndex >= 0) { valueFrom = 1f valueTo = chapter.pageSize.toFloat().coerceAtLeast(2f) - value = (ReadBook.durPageIndex).coerceIn(1, chapter.pageSize).toFloat() stepSize = 1f + value = (ReadBook.durPageIndex).coerceIn(1, chapter.pageSize).toFloat() } else { - valueFrom = 1f - valueTo = 2f - value = 1f + value = 0f + valueFrom = 0f + valueTo = 1000f } - }?: run { - valueFrom = 1f - valueTo = 2f - value = 1f } } @@ -548,12 +537,12 @@ class ReadMenu @JvmOverloads constructor( { valueFrom = 1f valueTo = ReadBook.simulatedChapterSize.toFloat().coerceAtLeast(2f) - value = (ReadBook.durChapterIndex).coerceIn(1, ReadBook.simulatedChapterSize).toFloat() stepSize = 1f + value = (ReadBook.durChapterIndex).coerceIn(1, ReadBook.simulatedChapterSize).toFloat() } else { - valueFrom = 1f - valueTo = 2f - value = 1f + valueFrom = 0f + value = 0f + valueTo = 1000f } } } @@ -579,15 +568,15 @@ class ReadMenu @JvmOverloads constructor( // } fun setSeekPage(seek: Int) { - binding.seekReadPage.value = 1f + binding.seekReadPage.value = seek.toFloat() + 1 } fun setAutoPage(autoPage: Boolean) = binding.run { if (autoPage) { - fabAutoPage.setImageResource(R.drawable.ic_auto_page_stop) + fabAutoPage.setIconResource(R.drawable.ic_auto_page_stop) fabAutoPage.contentDescription = context.getString(R.string.auto_next_page_stop) } else { - fabAutoPage.setImageResource(R.drawable.ic_auto_page) + fabAutoPage.setIconResource(R.drawable.ic_auto_page) fabAutoPage.contentDescription = context.getString(R.string.auto_next_page) } //fabAutoPage.setColorFilter(textColor) @@ -615,7 +604,6 @@ class ReadMenu @JvmOverloads constructor( fun openSourceEditActivity() fun openBookInfoActivity() fun showReadStyle() - fun showMoreSetting() fun showReadAloudDialog() fun upSystemUiVisibility() fun onClickReadAloud() diff --git a/app/src/main/java/io/legato/kazusa/ui/book/read/config/HttpTtsEditDialog.kt b/app/src/main/java/io/legato/kazusa/ui/book/read/config/HttpTtsEditDialog.kt index 7fe7ce57f..abafb0a6a 100644 --- a/app/src/main/java/io/legato/kazusa/ui/book/read/config/HttpTtsEditDialog.kt +++ b/app/src/main/java/io/legato/kazusa/ui/book/read/config/HttpTtsEditDialog.kt @@ -71,7 +71,7 @@ class HttpTtsEditDialog() : BaseBottomSheetDialogFragment(R.layout.dialog_http_t fun initMenu() { binding.toolBar.inflateMenu(R.menu.speak_engine_edit) - binding.toolBar.menu.applyTint(requireContext()) + //binding.toolBar.menu.applyTint(requireContext()) binding.toolBar.setOnMenuItemClickListener(this) } diff --git a/app/src/main/java/io/legato/kazusa/ui/book/read/config/MoreConfigDialog.kt b/app/src/main/java/io/legato/kazusa/ui/book/read/config/MoreConfigDialog.kt index 0bbeee6ac..728734cef 100644 --- a/app/src/main/java/io/legato/kazusa/ui/book/read/config/MoreConfigDialog.kt +++ b/app/src/main/java/io/legato/kazusa/ui/book/read/config/MoreConfigDialog.kt @@ -10,6 +10,7 @@ import android.view.ViewConfiguration import android.view.ViewGroup import android.widget.LinearLayout import androidx.preference.Preference +import androidx.preference.PreferenceFragmentCompat import io.legato.kazusa.R import io.legato.kazusa.base.BasePrefDialogFragment import io.legato.kazusa.constant.EventBus @@ -31,20 +32,6 @@ import io.legato.kazusa.utils.removePref class MoreConfigDialog : BasePrefDialogFragment() { private val readPreferTag = "readPreferenceFragment" - override fun onStart() { - super.onStart() -// dialog?.window?.run { -// clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND) -// setBackgroundDrawableResource(R.color.background) -// decorView.setPadding(0, 0, 0, 0) -// val attr = attributes -// attr.dimAmount = 0.0f -// attr.gravity = Gravity.BOTTOM -// attributes = attr -// setLayout(ViewGroup.LayoutParams.MATCH_PARENT, 360.dpToPx()) -// } - } - override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -67,12 +54,7 @@ class MoreConfigDialog : BasePrefDialogFragment() { .commit() } - override fun onDismiss(dialog: DialogInterface) { - super.onDismiss(dialog) - (activity as ReadBookActivity).bottomDialog-- - } - - class ReadPreferenceFragment : PreferenceFragment(), + class ReadPreferenceFragment : PreferenceFragmentCompat(), SharedPreferences.OnSharedPreferenceChangeListener { private val slopSquare by lazy { ViewConfiguration.get(requireContext()).scaledTouchSlop } @@ -198,6 +180,5 @@ class MoreConfigDialog : BasePrefDialogFragment() { getString(R.string.page_touch_slop_summary, value) } } - } } \ No newline at end of file diff --git a/app/src/main/java/io/legato/kazusa/ui/book/read/config/ReadStyleDialog.kt b/app/src/main/java/io/legato/kazusa/ui/book/read/config/ReadStyleDialog.kt index b6bf06b76..032909201 100644 --- a/app/src/main/java/io/legato/kazusa/ui/book/read/config/ReadStyleDialog.kt +++ b/app/src/main/java/io/legato/kazusa/ui/book/read/config/ReadStyleDialog.kt @@ -29,6 +29,7 @@ import splitties.views.onLongClick import androidx.core.graphics.drawable.toDrawable import androidx.transition.TransitionManager import com.google.android.material.bottomsheet.BottomSheetBehavior +import io.legato.kazusa.help.config.ThemeConfig class ReadStyleDialog : BaseBottomSheetDialogFragment(R.layout.dialog_read_book_style), FontSelectDialog.CallBack { @@ -39,21 +40,6 @@ class ReadStyleDialog : BaseBottomSheetDialogFragment(R.layout.dialog_read_book_ private lateinit var allSliders: List - - override fun onStart() { - super.onStart() -// dialog?.window?.run { -// clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND) -// setBackgroundDrawableResource(R.color.background) -// decorView.setPadding(0, 0, 0, 0) -// val attr = attributes -// attr.dimAmount = 0.0f -// attr.gravity = Gravity.BOTTOM -// attributes = attr -// setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT) -// } - } - override fun onFragmentCreated(view: View, savedInstanceState: Bundle?) { (activity as ReadBookActivity).bottomDialog++ initView() @@ -75,6 +61,11 @@ class ReadStyleDialog : BaseBottomSheetDialogFragment(R.layout.dialog_read_book_ // tvPageAnim.setTextColor(textColor) // tvBgTs.setTextColor(textColor) // tvShareLayout.setTextColor(textColor) + if (AppConfig.isNightTheme) { + tvDayNight.setIconResource(R.drawable.ic_daytime) + } else { + tvDayNight.setIconResource(R.drawable.ic_brightness) + } dsbTextSize.valueFormat = { (it + 5).toString() } @@ -133,6 +124,13 @@ class ReadStyleDialog : BaseBottomSheetDialogFragment(R.layout.dialog_read_book_ tvTip.setOnClickListener { TipConfigDialog().show(childFragmentManager, "tipConfigDialog") } + tvMore.setOnClickListener { + showDialogFragment() + } + tvDayNight.setOnClickListener { + AppConfig.isNightTheme = !AppConfig.isNightTheme + ThemeConfig.applyDayNight(requireContext()) + } // rgPageAnim.setOnCheckedChangeListener { _, checkedId -> // ReadBook.book?.setPageAnim(-1) // ReadBookConfig.pageAnim = binding.rgPageAnim.getIndexById(checkedId) @@ -299,6 +297,5 @@ class ReadStyleDialog : BaseBottomSheetDialogFragment(R.layout.dialog_read_book_ } } } - } } \ No newline at end of file diff --git a/app/src/main/java/io/legato/kazusa/ui/book/read/config/SpeakEngineDialog.kt b/app/src/main/java/io/legato/kazusa/ui/book/read/config/SpeakEngineDialog.kt index 12628cae2..3c6765fe0 100644 --- a/app/src/main/java/io/legato/kazusa/ui/book/read/config/SpeakEngineDialog.kt +++ b/app/src/main/java/io/legato/kazusa/ui/book/read/config/SpeakEngineDialog.kt @@ -161,7 +161,7 @@ class SpeakEngineDialog() : BaseBottomSheetDialogFragment(R.layout.dialog_recycl private fun initMenu() = binding.run { toolBar.inflateMenu(R.menu.speak_engine) - toolBar.menu.applyTint(requireContext()) + //toolBar.menu.applyTint(requireContext()) toolBar.setOnMenuItemClickListener(this@SpeakEngineDialog) } diff --git a/app/src/main/java/io/legato/kazusa/ui/book/read/page/PageView.kt b/app/src/main/java/io/legato/kazusa/ui/book/read/page/PageView.kt index d7f79914f..59a801ffd 100644 --- a/app/src/main/java/io/legato/kazusa/ui/book/read/page/PageView.kt +++ b/app/src/main/java/io/legato/kazusa/ui/book/read/page/PageView.kt @@ -26,6 +26,7 @@ import io.legato.kazusa.utils.applyStatusBarPadding import io.legato.kazusa.utils.dpToPx import io.legato.kazusa.utils.gone import io.legato.kazusa.utils.setTextIfNotEqual +import io.legato.kazusa.utils.statusBarHeight import splitties.views.backgroundColor import java.util.Date @@ -59,11 +60,9 @@ class PageView(context: Context) : FrameLayout(context) { } init { - if (!isInEditMode) { - upStyle() - binding.vwStatusBar.applyStatusBarPadding() - binding.vwNavigationBar.applyNavigationBarPadding() - } + upStyle() + binding.vwStatusBar.applyStatusBarPadding() + binding.vwNavigationBar.applyNavigationBarPadding() } override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) { @@ -118,8 +117,8 @@ class PageView(context: Context) : FrameLayout(context) { * 显示状态栏时隐藏header */ fun upStatusBar() = with(binding.vwStatusBar) { -// setPadding(paddingLeft, context.statusBarHeight, paddingRight, paddingBottom) - isGone = ReadBookConfig.hideStatusBar || readBookActivity?.isInMultiWindow == true + setPadding(paddingLeft, context.statusBarHeight, paddingRight, paddingBottom) + isGone = ReadBookConfig.hideStatusBar } fun upNavigationBar() { diff --git a/app/src/main/java/io/legato/kazusa/ui/book/search/SearchScopeDialog.kt b/app/src/main/java/io/legato/kazusa/ui/book/search/SearchScopeDialog.kt index 39434c546..7af618473 100644 --- a/app/src/main/java/io/legato/kazusa/ui/book/search/SearchScopeDialog.kt +++ b/app/src/main/java/io/legato/kazusa/ui/book/search/SearchScopeDialog.kt @@ -60,7 +60,7 @@ class SearchScopeDialog : BaseDialogFragment(R.layout.dialog_search_scope) { private fun initMenu() { binding.toolBar.inflateMenu(R.menu.book_search_scope) - binding.toolBar.menu.applyTint(requireContext()) + //binding.toolBar.menu.applyTint(requireContext()) } private fun initSearchView() { diff --git a/app/src/main/java/io/legato/kazusa/ui/book/source/manage/GroupManageDialog.kt b/app/src/main/java/io/legato/kazusa/ui/book/source/manage/GroupManageDialog.kt index 0903aa47b..4d430e8bb 100644 --- a/app/src/main/java/io/legato/kazusa/ui/book/source/manage/GroupManageDialog.kt +++ b/app/src/main/java/io/legato/kazusa/ui/book/source/manage/GroupManageDialog.kt @@ -46,7 +46,7 @@ class GroupManageDialog : BaseDialogFragment(R.layout.dialog_recycler_view), // binding.toolBar.setBackgroundColor(primaryColor) binding.toolBar.title = getString(R.string.group_manage) binding.toolBar.inflateMenu(R.menu.group_manage) - binding.toolBar.menu.applyTint(requireContext()) + //binding.toolBar.menu.applyTint(requireContext()) binding.toolBar.setOnMenuItemClickListener(this) binding.recyclerView.layoutManager = LinearLayoutManager(requireContext()) binding.recyclerView.addItemDecoration(VerticalDivider(requireContext())) diff --git a/app/src/main/java/io/legato/kazusa/ui/book/toc/rule/TxtTocRuleDialog.kt b/app/src/main/java/io/legato/kazusa/ui/book/toc/rule/TxtTocRuleDialog.kt index 4b76561c3..974410f31 100644 --- a/app/src/main/java/io/legato/kazusa/ui/book/toc/rule/TxtTocRuleDialog.kt +++ b/app/src/main/java/io/legato/kazusa/ui/book/toc/rule/TxtTocRuleDialog.kt @@ -90,7 +90,7 @@ class TxtTocRuleDialog() : BaseDialogFragment(R.layout.dialog_toc_regex), durRegex = arguments?.getString("tocRegex") binding.toolBar.setTitle(R.string.txt_toc_rule) binding.toolBar.inflateMenu(R.menu.txt_toc_rule) - binding.toolBar.menu.applyTint(requireContext()) + //binding.toolBar.menu.applyTint(requireContext()) binding.toolBar.setOnMenuItemClickListener(this) initView() initData() diff --git a/app/src/main/java/io/legato/kazusa/ui/book/toc/rule/TxtTocRuleEditDialog.kt b/app/src/main/java/io/legato/kazusa/ui/book/toc/rule/TxtTocRuleEditDialog.kt index 7d914de8f..dc041ef04 100644 --- a/app/src/main/java/io/legato/kazusa/ui/book/toc/rule/TxtTocRuleEditDialog.kt +++ b/app/src/main/java/io/legato/kazusa/ui/book/toc/rule/TxtTocRuleEditDialog.kt @@ -51,7 +51,7 @@ class TxtTocRuleEditDialog() : BaseBottomSheetDialogFragment(R.layout.dialog_toc private fun initMenu() { binding.toolBar.inflateMenu(R.menu.txt_toc_rule_edit) - binding.toolBar.menu.applyTint(requireContext()) + //binding.toolBar.menu.applyTint(requireContext()) binding.toolBar.setOnMenuItemClickListener(this) } diff --git a/app/src/main/java/io/legato/kazusa/ui/dict/rule/DictRuleEditDialog.kt b/app/src/main/java/io/legato/kazusa/ui/dict/rule/DictRuleEditDialog.kt index 187169766..2675b5531 100644 --- a/app/src/main/java/io/legato/kazusa/ui/dict/rule/DictRuleEditDialog.kt +++ b/app/src/main/java/io/legato/kazusa/ui/dict/rule/DictRuleEditDialog.kt @@ -38,7 +38,7 @@ class DictRuleEditDialog() : BaseBottomSheetDialogFragment(R.layout.dialog_dict_ override fun onFragmentCreated(view: View, savedInstanceState: Bundle?) { //binding.toolBar.setBackgroundColor(primaryColor) binding.toolBar.inflateMenu(R.menu.dict_rule_edit) - binding.toolBar.menu.applyTint(requireContext()) + //binding.toolBar.menu.applyTint(requireContext()) binding.toolBar.setOnMenuItemClickListener(this) viewModel.initData(arguments?.getString("name")) { upRuleView(viewModel.dictRule) diff --git a/app/src/main/java/io/legato/kazusa/ui/font/FontSelectDialog.kt b/app/src/main/java/io/legato/kazusa/ui/font/FontSelectDialog.kt index 6bdfd356a..42b7af054 100644 --- a/app/src/main/java/io/legato/kazusa/ui/font/FontSelectDialog.kt +++ b/app/src/main/java/io/legato/kazusa/ui/font/FontSelectDialog.kt @@ -9,6 +9,7 @@ import androidx.documentfile.provider.DocumentFile import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.LinearLayoutManager import io.legato.kazusa.R +import io.legato.kazusa.base.BaseBottomSheetDialogFragment import io.legato.kazusa.base.BaseDialogFragment import io.legato.kazusa.constant.AppLog import io.legato.kazusa.constant.PreferKey @@ -36,11 +37,12 @@ import io.legato.kazusa.utils.toastOnUi import io.legato.kazusa.utils.viewbindingdelegate.viewBinding import kotlinx.coroutines.launch import java.io.File +import androidx.core.net.toUri /** * 字体选择对话框 */ -class FontSelectDialog : BaseDialogFragment(R.layout.dialog_font_select), +class FontSelectDialog : BaseBottomSheetDialogFragment(R.layout.dialog_font_select), Toolbar.OnMenuItemClickListener, FontAdapter.CallBack { private val fontRegex = Regex("(?i).*\\.[ot]tf") @@ -70,11 +72,6 @@ class FontSelectDialog : BaseDialogFragment(R.layout.dialog_font_select), } } - override fun onStart() { - super.onStart() - setLayout(0.9f, 0.9f) - } - override fun onFragmentCreated(view: View, savedInstanceState: Bundle?) { //binding.toolBar.setBackgroundColor(primaryColor) binding.toolBar.setTitle(R.string.select_font) @@ -89,7 +86,7 @@ class FontSelectDialog : BaseDialogFragment(R.layout.dialog_font_select), openFolder() } else { if (fontPath.isContentScheme()) { - val doc = DocumentFile.fromTreeUri(requireContext(), Uri.parse(fontPath)) + val doc = DocumentFile.fromTreeUri(requireContext(), fontPath.toUri()) if (doc?.canRead() == true) { loadFontFiles(FileDoc.fromDocumentFile(doc)) } else { diff --git a/app/src/main/java/io/legato/kazusa/ui/main/MainActivity.kt b/app/src/main/java/io/legato/kazusa/ui/main/MainActivity.kt index c378fe14b..73cd83792 100644 --- a/app/src/main/java/io/legato/kazusa/ui/main/MainActivity.kt +++ b/app/src/main/java/io/legato/kazusa/ui/main/MainActivity.kt @@ -2,12 +2,14 @@ package io.legato.kazusa.ui.main +import android.content.res.Configuration import android.os.Bundle import android.text.format.DateUtils import android.view.MenuItem import android.view.MotionEvent import android.view.ViewGroup import androidx.activity.addCallback +import androidx.activity.enableEdgeToEdge import androidx.activity.viewModels import androidx.core.view.postDelayed import androidx.fragment.app.Fragment @@ -57,7 +59,10 @@ import splitties.views.bottomPadding import kotlin.coroutines.resume import kotlin.coroutines.suspendCoroutine import androidx.core.view.get +import com.google.android.material.navigation.NavigationBarView import io.legato.kazusa.ui.welcome.WelcomeActivity +import io.legato.kazusa.utils.applyNavigationBarPadding +import io.legato.kazusa.utils.applyStatusBarPadding /** * 主界面 @@ -84,10 +89,12 @@ class MainActivity : VMBaseActivity(), private val adapter by lazy { TabFragmentPageAdapter(supportFragmentManager) } - private val onUpBooksBadgeView by lazy { - binding.bottomNavigationView.addBadgeView(0) + + private val badge by lazy { + getNavigationBarView().getOrCreateBadge(R.id.menu_bookshelf) } + override fun onActivityCreated(savedInstanceState: Bundle?) { upBottomMenu() initView() @@ -197,13 +204,18 @@ class MainActivity : VMBaseActivity(), viewPagerMain.adapter = adapter viewPagerMain.addOnPageChangeListener(PageChangeCallback()) //bottomNavigationView.elevation = elevation - bottomNavigationView.setOnNavigationItemSelectedListener(this@MainActivity) - bottomNavigationView.setOnNavigationItemReselectedListener(this@MainActivity) - bottomNavigationView.setOnApplyWindowInsetsListenerCompat { view, windowInsets -> - val height = windowInsets.navigationBarHeight - view.bottomPadding = height - windowInsets.inset(0, 0, 0, height) + getNavigationBarView().apply { + setOnItemSelectedListener { onNavigationItemSelected(it) } + setOnItemReselectedListener { onNavigationItemReselected(it) } } + + //getNavigationBarView().applyNavigationBarPadding() + +// bottomNavigationView.setOnApplyWindowInsetsListenerCompat { view, windowInsets -> +// val height = windowInsets.navigationBarHeight +// view.bottomPadding = height +// windowInsets.inset(0, 0, 0, height) +// } } /** @@ -344,8 +356,10 @@ class MainActivity : VMBaseActivity(), override fun observeLiveBus() { super.observeLiveBus() viewModel.onUpBooksLiveData.observe(this) { - onUpBooksBadgeView.setBadgeCount(it) + badge.isVisible = it > 0 + badge.number = it } + observeEvent(EventBus.NOTIFY_MAIN) { binding.apply { upBottomMenu() @@ -359,13 +373,24 @@ class MainActivity : VMBaseActivity(), } } + private fun getNavigationBarView(): NavigationBarView { + return findViewById( + if (resources.configuration.orientation == Configuration.ORIENTATION_PORTRAIT) + R.id.bottom_navigation_view + else + R.id.navigation_rail_view + ) + } + + private fun upBottomMenu() { + val showDiscovery = AppConfig.showDiscovery val showRss = AppConfig.showRSS - binding.bottomNavigationView.menu.let { menu -> - menu.findItem(R.id.menu_discovery).isVisible = showDiscovery - menu.findItem(R.id.menu_rss).isVisible = showRss - } + val menu = getNavigationBarView().menu + menu.findItem(R.id.menu_discovery).isVisible = showDiscovery + menu.findItem(R.id.menu_rss).isVisible = showRss + var index = 0 if (showDiscovery) { index++ @@ -408,8 +433,9 @@ class MainActivity : VMBaseActivity(), override fun onPageSelected(position: Int) { pagePosition = position - binding.bottomNavigationView.menu[realPositions[position]].isChecked = true + getNavigationBarView().menu[realPositions[position]].isChecked = true } + } diff --git a/app/src/main/java/io/legato/kazusa/ui/main/bookshelf/BaseBookshelfFragment.kt b/app/src/main/java/io/legato/kazusa/ui/main/bookshelf/BaseBookshelfFragment.kt index 6bceaa246..c091db0a6 100644 --- a/app/src/main/java/io/legato/kazusa/ui/main/bookshelf/BaseBookshelfFragment.kt +++ b/app/src/main/java/io/legato/kazusa/ui/main/bookshelf/BaseBookshelfFragment.kt @@ -1,8 +1,10 @@ package io.legato.kazusa.ui.main.bookshelf import android.annotation.SuppressLint +import android.content.res.Configuration import android.view.Menu import android.view.MenuItem +import androidx.core.view.isVisible import androidx.fragment.app.activityViewModels import androidx.fragment.app.viewModels import androidx.lifecycle.LiveData @@ -28,6 +30,7 @@ import io.legato.kazusa.ui.file.HandleFileContract import io.legato.kazusa.ui.main.MainFragmentInterface import io.legato.kazusa.ui.main.MainViewModel import io.legato.kazusa.ui.widget.dialog.WaitDialog +import io.legato.kazusa.utils.bookshelfLayout import io.legato.kazusa.utils.checkByIndex import io.legato.kazusa.utils.getCheckedIndex import io.legato.kazusa.utils.isAbsUrl @@ -164,7 +167,17 @@ abstract class BaseBookshelfFragment(layoutId: Int) : VMBaseFragment 0 + val columnCount = (bookshelfLayout.takeIf { it > 0 } ?: 1) + val bookshelfSort = AppConfig.bookshelfSort val alertBinding = DialogBookshelfConfigBinding.inflate(layoutInflater) @@ -174,10 +187,20 @@ abstract class BaseBookshelfFragment(layoutId: Int) : VMBaseFragment + llGridSlider.isVisible = checkedId == R.id.chip_grid + } + } customView { alertBinding.root } + okButton { alertBinding.apply { var notifyMain = false @@ -206,15 +229,30 @@ abstract class BaseBookshelfFragment(layoutId: Int) : VMBaseFragment() - private val bookshelfLayout by lazy { AppConfig.bookshelfLayout } + + private val bookshelfLayout by lazy { requireContext().bookshelfLayout } + + private val booksAdapter: BaseBooksAdapter<*> by lazy { if (bookshelfLayout == 0) { BooksAdapterList(requireContext(), this, this, viewLifecycleOwner.lifecycle) @@ -102,7 +107,7 @@ class BooksFragment() : BaseFragment(R.layout.fragment_books), if (bookshelfLayout == 0) { binding.rvBookshelf.layoutManager = LinearLayoutManager(context) } else { - binding.rvBookshelf.layoutManager = GridLayoutManager(context, bookshelfLayout + 2) + binding.rvBookshelf.layoutManager = GridLayoutManager(context, bookshelfLayout) } if (bookshelfLayout == 0) { binding.rvBookshelf.setRecycledViewPool(activityViewModel.booksListRecycledViewPool) diff --git a/app/src/main/java/io/legato/kazusa/ui/main/bookshelf/style2/BookshelfFragment2.kt b/app/src/main/java/io/legato/kazusa/ui/main/bookshelf/style2/BookshelfFragment2.kt index 780777a1d..2fd729138 100644 --- a/app/src/main/java/io/legato/kazusa/ui/main/bookshelf/style2/BookshelfFragment2.kt +++ b/app/src/main/java/io/legato/kazusa/ui/main/bookshelf/style2/BookshelfFragment2.kt @@ -25,6 +25,7 @@ import io.legato.kazusa.ui.book.group.GroupEditDialog import io.legato.kazusa.ui.book.info.BookInfoActivity import io.legato.kazusa.ui.book.search.SearchActivity import io.legato.kazusa.ui.main.bookshelf.BaseBookshelfFragment +import io.legato.kazusa.utils.bookshelfLayout import io.legato.kazusa.utils.cnCompare import io.legato.kazusa.utils.flowWithLifecycleAndDatabaseChangeFirst import io.legato.kazusa.utils.observeEvent @@ -56,7 +57,9 @@ class BookshelfFragment2() : BaseBookshelfFragment(R.layout.fragment_bookshelf2) } private val binding by viewBinding(FragmentBookshelf2Binding::bind) - private val bookshelfLayout by lazy { AppConfig.bookshelfLayout } + + private val bookshelfLayout by lazy { requireContext().bookshelfLayout } + private val booksAdapter: BaseBooksAdapter<*> by lazy { if (bookshelfLayout == 0) { BooksAdapterList(requireContext(), this) @@ -87,7 +90,7 @@ class BookshelfFragment2() : BaseBookshelfFragment(R.layout.fragment_bookshelf2) if (bookshelfLayout == 0) { binding.rvBookshelf.layoutManager = LinearLayoutManager(context) } else { - binding.rvBookshelf.layoutManager = GridLayoutManager(context, bookshelfLayout + 2) + binding.rvBookshelf.layoutManager = GridLayoutManager(context, bookshelfLayout) } binding.rvBookshelf.itemAnimator = null binding.rvBookshelf.adapter = booksAdapter diff --git a/app/src/main/java/io/legato/kazusa/ui/main/explore/ExploreAdapter.kt b/app/src/main/java/io/legato/kazusa/ui/main/explore/ExploreAdapter.kt index 816a70258..1abf1de4b 100644 --- a/app/src/main/java/io/legato/kazusa/ui/main/explore/ExploreAdapter.kt +++ b/app/src/main/java/io/legato/kazusa/ui/main/explore/ExploreAdapter.kt @@ -8,6 +8,7 @@ import android.widget.TextView import androidx.core.content.ContextCompat import androidx.core.view.children import com.google.android.flexbox.FlexboxLayout +import com.google.android.material.card.MaterialCardView import io.legato.kazusa.R import io.legato.kazusa.base.adapter.ItemViewHolder import io.legato.kazusa.base.adapter.RecyclerAdapter @@ -85,14 +86,17 @@ class ExploreAdapter(context: Context, val callBack: CallBack) : recyclerFlexbox(flexbox) flexbox.visible() kinds.forEach { kind -> - val tv = getFlexboxChild(flexbox) - flexbox.addView(tv) - tv.text = kind.title - kind.style().apply(tv) + val cardView = getFlexboxChild(flexbox) + val textView = cardView.findViewById(R.id.text_view) + flexbox.addView(cardView) + + textView.text = kind.title + //kind.style().apply(textView) + if (kind.url.isNullOrBlank()) { - tv.setOnClickListener(null) + cardView.setOnClickListener(null) } else { - tv.setOnClickListener { + cardView.setOnClickListener { if (kind.title.startsWith("ERROR:")) { it.activity?.showDialogFragment(TextDialog("ERROR", kind.url)) } else { @@ -104,12 +108,13 @@ class ExploreAdapter(context: Context, val callBack: CallBack) : } } + @Synchronized - private fun getFlexboxChild(flexbox: FlexboxLayout): TextView { + private fun getFlexboxChild(flexbox: FlexboxLayout): MaterialCardView { return if (recycler.isEmpty()) { ItemFilletTextBinding.inflate(inflater, flexbox, false).root } else { - recycler.removeLastElement() as TextView + recycler.removeLastElement() as MaterialCardView } } diff --git a/app/src/main/java/io/legato/kazusa/ui/rss/source/manage/GroupManageDialog.kt b/app/src/main/java/io/legato/kazusa/ui/rss/source/manage/GroupManageDialog.kt index f1b988eaf..39d6b9af4 100644 --- a/app/src/main/java/io/legato/kazusa/ui/rss/source/manage/GroupManageDialog.kt +++ b/app/src/main/java/io/legato/kazusa/ui/rss/source/manage/GroupManageDialog.kt @@ -47,7 +47,7 @@ class GroupManageDialog : BaseBottomSheetDialogFragment(R.layout.dialog_recycler //toolBar.setBackgroundColor(primaryColor) toolBar.title = getString(R.string.group_manage) toolBar.inflateMenu(R.menu.group_manage) - toolBar.menu.applyTint(requireContext()) + //toolBar.menu.applyTint(requireContext()) toolBar.setOnMenuItemClickListener(this@GroupManageDialog) recyclerView.layoutManager = LinearLayoutManager(requireContext()) recyclerView.addItemDecoration(VerticalDivider(requireContext())) diff --git a/app/src/main/java/io/legato/kazusa/ui/widget/TitleBar.kt b/app/src/main/java/io/legato/kazusa/ui/widget/TitleBar.kt index 520f2fdd6..da7909598 100644 --- a/app/src/main/java/io/legato/kazusa/ui/widget/TitleBar.kt +++ b/app/src/main/java/io/legato/kazusa/ui/widget/TitleBar.kt @@ -167,12 +167,6 @@ class TitleBar @JvmOverloads constructor( } } - if (AppConfig.isEInkMode) { - setBackgroundResource(R.drawable.bg_eink_border_bottom) - } else { - //setBackgroundColor(context.primaryColor) - } - stateListAnimator = null //elevation = context.elevation } diff --git a/app/src/main/java/io/legato/kazusa/ui/widget/recycler/LoadMoreView.kt b/app/src/main/java/io/legato/kazusa/ui/widget/recycler/LoadMoreView.kt index db4bf63e3..6e8215598 100644 --- a/app/src/main/java/io/legato/kazusa/ui/widget/recycler/LoadMoreView.kt +++ b/app/src/main/java/io/legato/kazusa/ui/widget/recycler/LoadMoreView.kt @@ -6,6 +6,8 @@ import android.view.LayoutInflater import android.view.ViewGroup import android.widget.FrameLayout import androidx.annotation.ColorRes +import androidx.core.view.isInvisible +import androidx.core.view.isVisible import io.legato.kazusa.R import io.legato.kazusa.databinding.ViewLoadMoreBinding import io.legato.kazusa.lib.dialogs.alert @@ -51,7 +53,7 @@ class LoadMoreView(context: Context, attrs: AttributeSet? = null) : FrameLayout( fun stopLoad() { isLoading = false - binding.rotateLoading.inVisible() + binding.rotateLoading.invisible() } fun hasMore() { @@ -81,14 +83,6 @@ class LoadMoreView(context: Context, attrs: AttributeSet? = null) : FrameLayout( binding.tvText.visible() } - fun setLoadingColor(@ColorRes color: Int) { - binding.rotateLoading.loadingColor = context.getCompatColor(color) - } - - fun setLoadingTextColor(@ColorRes color: Int) { - binding.tvText.setTextColor(context.getCompatColor(color)) - } - private fun showErrorDialog(): Boolean { if (errorMsg.isBlank()) { return false diff --git a/app/src/main/java/io/legato/kazusa/ui/widget/recycler/scroller/FastScroller.kt b/app/src/main/java/io/legato/kazusa/ui/widget/recycler/scroller/FastScroller.kt index 0963556be..fa558b23d 100644 --- a/app/src/main/java/io/legato/kazusa/ui/widget/recycler/scroller/FastScroller.kt +++ b/app/src/main/java/io/legato/kazusa/ui/widget/recycler/scroller/FastScroller.kt @@ -290,7 +290,7 @@ class FastScroller : LinearLayout { override fun onTouchEvent(event: MotionEvent): Boolean { when (event.action) { MotionEvent.ACTION_DOWN -> { - if (event.x < mHandleView.x - ViewCompat.getPaddingStart(mHandleView)) { + if (event.x < mHandleView.x - mHandleView.paddingStart) { return false } if (!mScrollbar.isVisible) { diff --git a/app/src/main/java/io/legato/kazusa/utils/ContextExtensions.kt b/app/src/main/java/io/legato/kazusa/utils/ContextExtensions.kt index 4c876ef9a..0c736ebfe 100644 --- a/app/src/main/java/io/legato/kazusa/utils/ContextExtensions.kt +++ b/app/src/main/java/io/legato/kazusa/utils/ContextExtensions.kt @@ -418,6 +418,13 @@ val Context.isDebuggable: Boolean val Context.dataStore by preferencesDataStore(name = "settings") +val Context.bookshelfLayout: Int + get() = if (resources.configuration.orientation == Configuration.ORIENTATION_LANDSCAPE) { + AppConfig.bookshelfLayoutLandscape + } else { + AppConfig.bookshelfLayoutPortrait + } + fun Context.themeColor(attr: Int): Int { val typedValue = TypedValue() theme.resolveAttribute(attr, typedValue, true) diff --git a/app/src/main/java/io/legato/kazusa/utils/DataStoreUtil.kt b/app/src/main/java/io/legato/kazusa/utils/DataStoreUtil.kt index 8b619abdf..48cdf6292 100644 --- a/app/src/main/java/io/legato/kazusa/utils/DataStoreUtil.kt +++ b/app/src/main/java/io/legato/kazusa/utils/DataStoreUtil.kt @@ -24,6 +24,7 @@ object DataStoreUtil { } } + @Suppress("UNCHECKED_CAST") suspend fun read(context: Context, key: String, defaultValue: T): T { return context.dataStore.data.map { preferences -> when (defaultValue) { diff --git a/app/src/main/java/io/legato/kazusa/utils/FragmentExtensions.kt b/app/src/main/java/io/legato/kazusa/utils/FragmentExtensions.kt index c867d95ff..b1b600ce2 100644 --- a/app/src/main/java/io/legato/kazusa/utils/FragmentExtensions.kt +++ b/app/src/main/java/io/legato/kazusa/utils/FragmentExtensions.kt @@ -26,7 +26,7 @@ import io.legato.kazusa.ui.widget.dialog.TextDialog inline fun Fragment.showDialogFragment( arguments: Bundle.() -> Unit = {} ) { - val dialog = T::class.java.newInstance() + val dialog = T::class.java.getDeclaredConstructor().newInstance() val bundle = Bundle() bundle.apply(arguments) dialog.arguments = bundle diff --git a/app/src/main/java/io/legato/kazusa/utils/ViewExtensions.kt b/app/src/main/java/io/legato/kazusa/utils/ViewExtensions.kt index b42b4b08b..f97145828 100644 --- a/app/src/main/java/io/legato/kazusa/utils/ViewExtensions.kt +++ b/app/src/main/java/io/legato/kazusa/utils/ViewExtensions.kt @@ -69,9 +69,7 @@ fun EditText.showSoftInput() = run { } fun View.disableAutoFill() = run { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - this.importantForAutofill = IMPORTANT_FOR_AUTOFILL_NO_EXCLUDE_DESCENDANTS - } + this.importantForAutofill = IMPORTANT_FOR_AUTOFILL_NO_EXCLUDE_DESCENDANTS } fun View.applyTint( diff --git a/app/src/main/res/anim/anim_readbook_bottom_in.xml b/app/src/main/res/anim/anim_readbook_bottom_in.xml index 48fe0c0aa..792ae66b0 100644 --- a/app/src/main/res/anim/anim_readbook_bottom_in.xml +++ b/app/src/main/res/anim/anim_readbook_bottom_in.xml @@ -1,6 +1,7 @@ + android:duration="320" + android:interpolator="@android:interpolator/decelerate_cubic"> diff --git a/app/src/main/res/anim/anim_readbook_bottom_out.xml b/app/src/main/res/anim/anim_readbook_bottom_out.xml index 2e91beb95..be185435e 100644 --- a/app/src/main/res/anim/anim_readbook_bottom_out.xml +++ b/app/src/main/res/anim/anim_readbook_bottom_out.xml @@ -1,6 +1,7 @@ + android:duration="320" + android:interpolator="@android:interpolator/decelerate_cubic"> diff --git a/app/src/main/res/anim/anim_readbook_top_in.xml b/app/src/main/res/anim/anim_readbook_top_in.xml index e36360bc0..82dcc33e4 100644 --- a/app/src/main/res/anim/anim_readbook_top_in.xml +++ b/app/src/main/res/anim/anim_readbook_top_in.xml @@ -1,7 +1,8 @@ + android:duration="320" + android:interpolator="@android:interpolator/decelerate_cubic"> - \ No newline at end of file + diff --git a/app/src/main/res/anim/anim_readbook_top_out.xml b/app/src/main/res/anim/anim_readbook_top_out.xml index 0b8acbceb..cb38faed6 100644 --- a/app/src/main/res/anim/anim_readbook_top_out.xml +++ b/app/src/main/res/anim/anim_readbook_top_out.xml @@ -1,6 +1,7 @@ + android:duration="320" + android:interpolator="@android:interpolator/decelerate_cubic"> diff --git a/app/src/main/res/drawable/ic_groups_fill.xml b/app/src/main/res/drawable/ic_groups_fill.xml new file mode 100644 index 000000000..ff37b1eab --- /dev/null +++ b/app/src/main/res/drawable/ic_groups_fill.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_star_fill.xml b/app/src/main/res/drawable/ic_star_fill.xml new file mode 100644 index 000000000..17542eaf2 --- /dev/null +++ b/app/src/main/res/drawable/ic_star_fill.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout-land/activity_book_info.xml b/app/src/main/res/layout-land/activity_book_info.xml index 829cf336e..aa03af64d 100644 --- a/app/src/main/res/layout-land/activity_book_info.xml +++ b/app/src/main/res/layout-land/activity_book_info.xml @@ -1,409 +1,389 @@ - + android:layout_height="match_parent"> + android:foreground="@drawable/bg_book_mask" + android:scaleType="centerCrop" /> - - - + android:background="@android:color/transparent" + android:fitsSystemWindows="true"> - + + + + + + + + android:layout_height="match_parent" + android:background="@drawable/bg_gradient_mask" + app:layout_behavior="@string/appbar_scrolling_view_behavior"> + android:orientation="horizontal"> - - - + + android:layout_marginEnd="96dp" + android:layout_marginStart="16dp" + app:cardCornerRadius="16dp"> + android:src="@drawable/image_cover_default" /> - - - - - - - - - - + android:orientation="vertical" + android:padding="12dp"> - - - - - - - - - - - - - - + android:maxLines="2" + android:text="@string/book_name" + style="@style/TextAppearance.Material3.ActionBar.Title" + tools:ignore="RtlHardcoded" /> + android:gravity="center" + android:orientation="horizontal" + android:paddingTop="6dp" + android:paddingBottom="2dp" + tools:ignore="UseCompoundDrawables"> - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + android:layout_weight="1" + android:layout_marginStart="2dp" + android:ellipsize="end" + android:singleLine="true" + android:text="@string/author" + android:textSize="14sp" + tools:ignore="NestedWeights,RtlHardcoded,RtlSymmetry" /> - + android:gravity="center_vertical" + android:orientation="horizontal"> + + + + + - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - - + diff --git a/app/src/main/res/layout-land/activity_main.xml b/app/src/main/res/layout-land/activity_main.xml new file mode 100644 index 000000000..630038e98 --- /dev/null +++ b/app/src/main/res/layout-land/activity_main.xml @@ -0,0 +1,28 @@ + + + + + + + + + diff --git a/app/src/main/res/layout-land/view_read_menu.xml b/app/src/main/res/layout-land/view_read_menu.xml new file mode 100644 index 000000000..40556870d --- /dev/null +++ b/app/src/main/res/layout-land/view_read_menu.xml @@ -0,0 +1,264 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_book_info.xml b/app/src/main/res/layout/activity_book_info.xml index ff5fe962f..61713abb4 100644 --- a/app/src/main/res/layout/activity_book_info.xml +++ b/app/src/main/res/layout/activity_book_info.xml @@ -66,12 +66,9 @@ android:layout_height="wrap_content" android:background="@drawable/bg_gradient_mask" android:paddingHorizontal="16dp" - android:paddingTop="8dp"> + android:paddingVertical="8dp"> + - - + - - diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index b73488073..cdc794141 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -1,25 +1,28 @@ - - + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:menu="@menu/main_bnv" /> - + diff --git a/app/src/main/res/layout/dialog_bookshelf_config.xml b/app/src/main/res/layout/dialog_bookshelf_config.xml index 49c20c663..cdbc40086 100644 --- a/app/src/main/res/layout/dialog_bookshelf_config.xml +++ b/app/src/main/res/layout/dialog_bookshelf_config.xml @@ -1,185 +1,184 @@ - + xmlns:app="http://schemas.android.com/apk/res-auto" + android:fillViewport="true"> + android:orientation="vertical" + android:padding="16dp"> - - - - - - - - - - - - - - - - - - + android:padding="8dp" + android:text="@string/show_last_update_time" + tools:ignore="TouchTargetSizeCheck" /> - - - - - - - - - - - - - - - - - - + android:padding="8dp" + android:text="@string/show_wait_up_count" + tools:ignore="TouchTargetSizeCheck" /> - + + + + + + + + + + + + + + + + + + + + + android:paddingVertical="8dp" + android:valueFrom="1" + android:valueTo="9" + android:stepSize="1" + android:value="3" /> + - + + + android:layout_weight="1" + android:orientation="vertical"> - + - + - + - + - + + + + + + + + + - - \ No newline at end of file + diff --git a/app/src/main/res/layout/dialog_read_book_style.xml b/app/src/main/res/layout/dialog_read_book_style.xml index 9f9f576a3..0685e48ee 100644 --- a/app/src/main/res/layout/dialog_read_book_style.xml +++ b/app/src/main/res/layout/dialog_read_book_style.xml @@ -1,298 +1,312 @@ - - + android:layout_height="wrap_content"> - - - - - - - - + - - + android:orientation="vertical" + android:gravity="center" + android:paddingVertical="16dp" + android:paddingHorizontal="16dp"> + android:layout_width="36dp" + android:layout_height="4dp" + android:layout_gravity="center_horizontal" + android:background="@drawable/bg_bottom_sheet_handle" + android:layout_marginBottom="16dp" /> - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + app:isBottomBackground="true" + app:max="45" + app:title="@string/text_size" /> - - - - - - - - - - - - - - - - - - - + app:isBottomBackground="true" + app:max="100" + app:title="@string/text_letter_spacing" /> - - - - - - - - - - - - - - - - - - - - - - + app:isBottomBackground="true" + app:max="20" + app:title="@string/line_size" /> + + + android:orientation="vertical"> + + - + + + + + + + + + + + + + + + + + + + + + + + + + + - - - \ No newline at end of file + diff --git a/app/src/main/res/layout/dialog_wait.xml b/app/src/main/res/layout/dialog_wait.xml index 7f1608de9..e9d3fadbd 100644 --- a/app/src/main/res/layout/dialog_wait.xml +++ b/app/src/main/res/layout/dialog_wait.xml @@ -3,10 +3,10 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center" - android:padding="20dp" + android:padding="16dp" android:orientation="horizontal"> - \ No newline at end of file diff --git a/app/src/main/res/layout/item_fillet_text.xml b/app/src/main/res/layout/item_fillet_text.xml index 5a749fe93..f44af0fbe 100644 --- a/app/src/main/res/layout/item_fillet_text.xml +++ b/app/src/main/res/layout/item_fillet_text.xml @@ -1,17 +1,24 @@ - + android:clickable="true" + android:focusable="true"> + + + diff --git a/app/src/main/res/layout/item_replace_rule.xml b/app/src/main/res/layout/item_replace_rule.xml index 375b4c7ca..5c1ffbedb 100644 --- a/app/src/main/res/layout/item_replace_rule.xml +++ b/app/src/main/res/layout/item_replace_rule.xml @@ -28,8 +28,8 @@ android:name="@string/enable" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginLeft="6dp" - android:layout_marginRight="6dp" + android:layout_marginStart="8dp" + android:layout_marginEnd="8dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintRight_toLeftOf="@id/iv_edit" app:layout_constraintTop_toTopOf="parent" @@ -37,12 +37,12 @@ + android:paddingHorizontal="16dp" + android:paddingVertical="8dp"> - - - + android:indeterminate="true" /> @@ -53,10 +50,8 @@ - + android:layout_height="wrap_content" + android:orientation="vertical" + android:paddingHorizontal="16dp"> - - - - + android:layout_height="wrap_content" + style="@style/TextAppearance.Material3.TitleLarge" + android:singleLine="true" /> + + + + + + + + + + + + - @@ -119,113 +121,32 @@ android:id="@+id/bottom_menu" android:layout_width="match_parent" android:layout_height="wrap_content" + android:alpha="0.92" android:orientation="vertical" app:layout_constraintBottom_toBottomOf="parent"> - - - - - - - - - - - - - - - - - - - - + app:cardCornerRadius="32dp" + app:cardBackgroundColor="?attr/colorSurfaceContainer" + app:strokeWidth="0dp"> + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + android:maxHeight="24dp" + app:icon="@drawable/ic_read_aloud" + app:iconGravity="textStart" + tools:ignore="NestedWeights" /> + + + + + + + + + + - \ No newline at end of file diff --git a/app/src/main/res/menu/book_read.xml b/app/src/main/res/menu/book_read.xml index 08d58c4d9..bc4212bc8 100644 --- a/app/src/main/res/menu/book_read.xml +++ b/app/src/main/res/menu/book_read.xml @@ -88,6 +88,16 @@ android:title="@string/replace_rule_title" app:showAsAction="never" /> + + + + - - 导入选择书籍 更新和搜索线程数(太多会卡顿) 切换图标 - 删除书籍 + 已在书架 开始阅读 加载数据中… 加载失败,点击重试 @@ -589,7 +589,7 @@ 移除分组 新建替换 分组 - 分组:%s + %s 已读:%s 启用发现 禁用发现 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 0dc4c8db9..3118c8731 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1221,4 +1221,6 @@ 未分组 动态取色 图标已修改 + 配置替换规则 + 更多设置 diff --git a/app/src/main/res/xml/pref_config_read.xml b/app/src/main/res/xml/pref_config_read.xml index 5f528e4ae..8d685fdde 100644 --- a/app/src/main/res/xml/pref_config_read.xml +++ b/app/src/main/res/xml/pref_config_read.xml @@ -2,6 +2,14 @@ + + @@ -53,7 +53,7 @@ @@ -84,7 +84,7 @@ diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 725e9fc7d..0d312523c 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -33,6 +33,7 @@ media = "1.7.0" media3 = "1.6.1" nanoHttpd = "2.3.1" okhttp = "4.12.0" +palette = "1.0.0" preference = "1.2.1" protobufJavalite = "4.26.1" quickChineseTransfer = "0.2.16" @@ -65,6 +66,7 @@ androidx-annotation = { group = "androidx.annotation", name = "annotation", vers androidx-collection = { module = "androidx.collection:collection", version.ref = "collection" } androidx-datastore-preferences = { module = "androidx.datastore:datastore-preferences", version.ref = "datastorePreferences" } +androidx-palette = { module = "androidx.palette:palette", version.ref = "palette" } appcompat-appcompat = { module = "androidx.appcompat:appcompat", version.ref = "appcompat" } androidx-constraintlayout = { module = "androidx.constraintlayout:constraintlayout", version.ref = "constraintlayout" }