diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/browser/BaseBrowserActivity.kt b/app/src/main/kotlin/org/koitharu/kotatsu/browser/BaseBrowserActivity.kt index f9cb346c9..95f69e868 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/browser/BaseBrowserActivity.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/browser/BaseBrowserActivity.kt @@ -20,7 +20,7 @@ abstract class BaseBrowserActivity : BaseActivity(), Bro private lateinit var onBackPressedCallback: WebViewBackPressedCallback - final override fun onCreate(savedInstanceState: Bundle?) { + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) if (!setContentViewWebViewSafe { ActivityBrowserBinding.inflate(layoutInflater) }) { return diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/core/image/CoilMemoryCacheKey.kt b/app/src/main/kotlin/org/koitharu/kotatsu/core/image/CoilMemoryCacheKey.kt new file mode 100644 index 000000000..2550f0e9e --- /dev/null +++ b/app/src/main/kotlin/org/koitharu/kotatsu/core/image/CoilMemoryCacheKey.kt @@ -0,0 +1,48 @@ +package org.koitharu.kotatsu.core.image + +import android.os.Parcel +import android.os.Parcelable +import android.view.View +import androidx.collection.ArrayMap +import coil3.memory.MemoryCache +import coil3.request.SuccessResult +import coil3.util.CoilUtils +import kotlinx.parcelize.Parceler +import kotlinx.parcelize.Parcelize + +@Parcelize +class CoilMemoryCacheKey( + val data: MemoryCache.Key +) : Parcelable { + + companion object : Parceler { + override fun CoilMemoryCacheKey.write(parcel: Parcel, flags: Int) = with(data) { + parcel.writeString(key) + parcel.writeInt(extras.size) + for (entry in extras.entries) { + parcel.writeString(entry.key) + parcel.writeString(entry.value) + } + } + + override fun create(parcel: Parcel): CoilMemoryCacheKey = CoilMemoryCacheKey( + MemoryCache.Key( + key = parcel.readString().orEmpty(), + extras = run { + val size = parcel.readInt() + val map = ArrayMap(size) + repeat(size) { + map.put(parcel.readString(), parcel.readString()) + } + map + }, + ), + ) + + fun from(view: View): CoilMemoryCacheKey? { + return (CoilUtils.result(view) as? SuccessResult)?.memoryCacheKey?.let { + CoilMemoryCacheKey(it) + } + } + } +} diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/core/model/MangaSource.kt b/app/src/main/kotlin/org/koitharu/kotatsu/core/model/MangaSource.kt index 7305386b0..d51a22430 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/core/model/MangaSource.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/core/model/MangaSource.kt @@ -18,6 +18,7 @@ import org.koitharu.kotatsu.core.parser.external.ExternalMangaSource import org.koitharu.kotatsu.core.util.ext.getDisplayName import org.koitharu.kotatsu.core.util.ext.getThemeColor import org.koitharu.kotatsu.core.util.ext.toLocale +import org.koitharu.kotatsu.core.util.ext.toLocaleOrNull import org.koitharu.kotatsu.parsers.model.ContentType import org.koitharu.kotatsu.parsers.model.MangaParserSource import org.koitharu.kotatsu.parsers.model.MangaSource @@ -80,7 +81,7 @@ tailrec fun MangaSource.unwrap(): MangaSource = if (this is MangaSourceInfo) { this } -fun MangaSource.getLocale(): Locale? = (unwrap() as? MangaParserSource)?.locale?.toLocale() +fun MangaSource.getLocale(): Locale? = (unwrap() as? MangaParserSource)?.locale?.toLocaleOrNull() fun MangaSource.getSummary(context: Context): String? = when (val source = unwrap()) { is MangaParserSource -> { diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/core/nav/AppRouter.kt b/app/src/main/kotlin/org/koitharu/kotatsu/core/nav/AppRouter.kt index 0e6919c20..60e17d0bf 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/core/nav/AppRouter.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/core/nav/AppRouter.kt @@ -29,6 +29,7 @@ import org.koitharu.kotatsu.bookmarks.ui.AllBookmarksActivity import org.koitharu.kotatsu.browser.BrowserActivity import org.koitharu.kotatsu.browser.cloudflare.CloudFlareActivity import org.koitharu.kotatsu.core.exceptions.CloudFlareProtectedException +import org.koitharu.kotatsu.core.image.CoilMemoryCacheKey import org.koitharu.kotatsu.core.model.FavouriteCategory import org.koitharu.kotatsu.core.model.MangaSourceInfo import org.koitharu.kotatsu.core.model.appUrl @@ -180,11 +181,12 @@ class AppRouter private constructor( ) } - fun openImage(url: String, source: MangaSource?, anchor: View? = null) { + fun openImage(url: String, source: MangaSource?, anchor: View? = null, preview: CoilMemoryCacheKey? = null) { startActivity( Intent(contextOrNull(), ImageActivity::class.java) .setData(url.toUri()) - .putExtra(KEY_SOURCE, source?.name), + .putExtra(KEY_SOURCE, source?.name) + .putExtra(KEY_PREVIEW, preview), anchor?.let { scaleUpActivityOptionsOf(it) }, ) } @@ -768,6 +770,7 @@ class AppRouter private constructor( const val KEY_MANGA = "manga" const val KEY_MANGA_LIST = "manga_list" const val KEY_PAGES = "pages" + const val KEY_PREVIEW = "preview" const val KEY_QUERY = "query" const val KEY_READER_MODE = "reader_mode" const val KEY_SORT_ORDER = "sort_order" diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/core/util/ext/LocaleList.kt b/app/src/main/kotlin/org/koitharu/kotatsu/core/util/ext/LocaleList.kt index 8a500b026..cc55831ff 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/core/util/ext/LocaleList.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/core/util/ext/LocaleList.kt @@ -21,7 +21,13 @@ inline fun LocaleListCompat.mapToSet(block: (Locale) -> T): Set { fun LocaleListCompat.getOrThrow(index: Int) = get(index) ?: throw NoSuchElementException() -fun String.toLocale() = Locale(this) +fun String.toLocale(): Locale = Locale.forLanguageTag(this) + +fun String.toLocaleOrNull() = if (isEmpty()) { + null +} else { + toLocale().takeUnless { it.displayName == this } +} fun Locale?.getDisplayName(context: Context): String = when (this) { null -> context.getString(R.string.all_languages) diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/details/data/MangaDetails.kt b/app/src/main/kotlin/org/koitharu/kotatsu/details/data/MangaDetails.kt index 8e7f25864..e2f796f7e 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/details/data/MangaDetails.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/details/data/MangaDetails.kt @@ -1,5 +1,6 @@ package org.koitharu.kotatsu.details.data +import org.koitharu.kotatsu.core.model.getLocale import org.koitharu.kotatsu.core.model.isLocal import org.koitharu.kotatsu.local.domain.model.LocalManga import org.koitharu.kotatsu.parsers.model.Manga @@ -7,6 +8,7 @@ import org.koitharu.kotatsu.parsers.model.MangaChapter import org.koitharu.kotatsu.parsers.util.ifNullOrEmpty import org.koitharu.kotatsu.parsers.util.nullIfEmpty import org.koitharu.kotatsu.reader.data.filterChapters +import java.util.Locale data class MangaDetails( private val manga: Manga, @@ -39,6 +41,13 @@ data class MangaDetails( fun toManga() = manga + fun getLocale(): Locale? { + findAppropriateLocale(chapters.keys.singleOrNull())?.let { + return it + } + return manga.source.getLocale() + } + fun filterChapters(branch: String?) = MangaDetails( manga = manga.filterChapters(branch), localManga = localManga?.run { @@ -69,4 +78,16 @@ data class MangaDetails( } return result } + + private fun findAppropriateLocale(name: String?): Locale? { + if (name.isNullOrEmpty()) { + return null + } + return Locale.getAvailableLocales().find { lc -> + name.contains(lc.getDisplayName(lc), ignoreCase = true) || + name.contains(lc.getDisplayName(Locale.ENGLISH), ignoreCase = true) || + name.contains(lc.getDisplayLanguage(lc), ignoreCase = true) || + name.contains(lc.getDisplayLanguage(Locale.ENGLISH), ignoreCase = true) + } + } } diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/details/ui/DetailsActivity.kt b/app/src/main/kotlin/org/koitharu/kotatsu/details/ui/DetailsActivity.kt index b3349f74e..1591f625d 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/details/ui/DetailsActivity.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/details/ui/DetailsActivity.kt @@ -43,6 +43,7 @@ import kotlinx.coroutines.flow.filterNotNull import kotlinx.coroutines.flow.map import org.koitharu.kotatsu.R import org.koitharu.kotatsu.bookmarks.domain.Bookmark +import org.koitharu.kotatsu.core.image.CoilMemoryCacheKey import org.koitharu.kotatsu.core.model.FavouriteCategory import org.koitharu.kotatsu.core.model.LocalMangaSource import org.koitharu.kotatsu.core.model.UnknownMangaSource @@ -100,10 +101,12 @@ import org.koitharu.kotatsu.list.ui.adapter.mangaGridItemAD import org.koitharu.kotatsu.list.ui.model.ListModel import org.koitharu.kotatsu.list.ui.model.MangaListModel import org.koitharu.kotatsu.list.ui.size.StaticItemSizeResolver +import org.koitharu.kotatsu.parsers.model.ContentRating import org.koitharu.kotatsu.parsers.model.Manga import org.koitharu.kotatsu.parsers.model.MangaTag import org.koitharu.kotatsu.parsers.util.ifNullOrEmpty import org.koitharu.kotatsu.parsers.util.nullIfEmpty +import org.koitharu.kotatsu.parsers.util.toTitleCase import org.koitharu.kotatsu.scrobbling.common.domain.model.ScrobblingInfo import javax.inject.Inject import kotlin.math.roundToInt @@ -179,16 +182,6 @@ class DetailsActivity : viewModel.isStatsAvailable.observe(this, menuInvalidator) viewModel.remoteManga.observe(this, menuInvalidator) viewModel.tags.observe(this, ::onTagsChanged) - viewModel.branches.observe(this) { - val branch = it.singleOrNull() - infoBinding.textViewTranslation.textAndVisible = branch?.name - infoBinding.textViewTranslation.drawableStart = branch?.locale?.let { - LocaleUtils.getEmojiFlag(it) - }?.let { - TextDrawable.compound(infoBinding.textViewTranslation, it) - } - infoBinding.textViewTranslationLabel.isVisible = infoBinding.textViewTranslation.isVisible - } viewModel.chapters.observe(this, PrefetchObserver(this)) viewModel.onDownloadStarted .filterNot { appRouter.isChapterPagesSheetShown() } @@ -202,7 +195,7 @@ class DetailsActivity : addMenuProvider(menuProvider) } - override fun isNsfwContent(): Flow = viewModel.manga.map { it?.isNsfw == true } + override fun isNsfwContent(): Flow = viewModel.manga.map { it?.contentRating == ContentRating.ADULT } override fun onClick(v: View) { when (v.id) { @@ -232,6 +225,7 @@ class DetailsActivity : router.openImage( url = viewModel.coverUrl.value ?: return, source = manga.source, + preview = CoilMemoryCacheKey.from(viewBinding.imageViewCover), anchor = v, ) } @@ -407,10 +401,20 @@ class DetailsActivity : with(viewBinding) { textViewTitle.text = manga.title textViewSubtitle.textAndVisible = manga.altTitles.joinToString("\n") - textViewNsfw.isVisible = manga.isNsfw + textViewNsfw16.isVisible = manga.contentRating == ContentRating.SUGGESTIVE + textViewNsfw18.isVisible = manga.contentRating == ContentRating.ADULT textViewDescription.text = details.description.ifNullOrEmpty { getString(R.string.no_description) } } with(infoBinding) { + val translation = details.getLocale() + infoBinding.textViewTranslation.textAndVisible = translation?.getDisplayLanguage(translation) + ?.toTitleCase(translation) + infoBinding.textViewTranslation.drawableStart = translation?.let { + LocaleUtils.getEmojiFlag(it) + }?.let { + TextDrawable.compound(infoBinding.textViewTranslation, it) + } + infoBinding.textViewTranslationLabel.isVisible = infoBinding.textViewTranslation.isVisible textViewAuthor.textAndVisible = manga.author textViewAuthorLabel.isVisible = textViewAuthor.isVisible if (manga.hasRating) { diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/details/ui/model/MangaBranch.kt b/app/src/main/kotlin/org/koitharu/kotatsu/details/ui/model/MangaBranch.kt index 03eb72c95..520f1de41 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/details/ui/model/MangaBranch.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/details/ui/model/MangaBranch.kt @@ -2,7 +2,6 @@ package org.koitharu.kotatsu.details.ui.model import org.koitharu.kotatsu.list.ui.ListModelDiffCallback import org.koitharu.kotatsu.list.ui.model.ListModel -import java.util.Locale data class MangaBranch( val name: String?, @@ -11,8 +10,6 @@ data class MangaBranch( val isCurrent: Boolean, ) : ListModel { - val locale: Locale? by lazy(::findAppropriateLocale) - override fun areItemsTheSame(other: ListModel): Boolean { return other is MangaBranch && other.name == name } @@ -28,16 +25,4 @@ data class MangaBranch( override fun toString(): String { return "$name: $count" } - - private fun findAppropriateLocale(): Locale? { - if (name.isNullOrEmpty()) { - return null - } - return Locale.getAvailableLocales().find { lc -> - name.contains(lc.getDisplayName(lc), ignoreCase = true) || - name.contains(lc.getDisplayName(Locale.ENGLISH), ignoreCase = true) || - name.contains(lc.getDisplayLanguage(lc), ignoreCase = true) || - name.contains(lc.getDisplayLanguage(Locale.ENGLISH), ignoreCase = true) - } - } } diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/details/ui/pager/bookmarks/BookmarksViewModel.kt b/app/src/main/kotlin/org/koitharu/kotatsu/details/ui/pager/bookmarks/BookmarksViewModel.kt index e6a68d27e..c0d0f4377 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/details/ui/pager/bookmarks/BookmarksViewModel.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/details/ui/pager/bookmarks/BookmarksViewModel.kt @@ -71,7 +71,7 @@ class BookmarksViewModel @Inject constructor( if (b.isNullOrEmpty()) { continue } - result += ListHeader(chapter.name) + result += ListHeader(chapter) result.addAll(b) } if (result.isEmpty()) { diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/details/ui/pager/pages/PagesViewModel.kt b/app/src/main/kotlin/org/koitharu/kotatsu/details/ui/pager/pages/PagesViewModel.kt index 082c5ecc2..0b14dbbf7 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/details/ui/pager/pages/PagesViewModel.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/details/ui/pager/pages/PagesViewModel.kt @@ -130,7 +130,7 @@ class PagesViewModel @Inject constructor( for (page in snapshot) { if (page.chapterId != previousChapterId) { chaptersLoader.peekChapter(page.chapterId)?.let { - add(ListHeader(it.name)) + add(ListHeader(it)) } previousChapterId = page.chapterId } diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/image/ui/ImageActivity.kt b/app/src/main/kotlin/org/koitharu/kotatsu/image/ui/ImageActivity.kt index 12ebc8d07..245fe256a 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/image/ui/ImageActivity.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/image/ui/ImageActivity.kt @@ -11,21 +11,20 @@ import androidx.core.view.WindowInsetsCompat import androidx.core.view.isVisible import androidx.core.view.updateLayoutParams import androidx.swiperefreshlayout.widget.CircularProgressDrawable -import coil3.Image import coil3.ImageLoader -import coil3.asDrawable import coil3.request.CachePolicy import coil3.request.ErrorResult import coil3.request.ImageRequest import coil3.request.SuccessResult import coil3.request.lifecycle -import coil3.target.ViewTarget +import coil3.target.GenericViewTarget import com.davemorrissey.labs.subscaleview.ImageSource import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView import com.google.android.material.snackbar.Snackbar import dagger.hilt.android.AndroidEntryPoint import org.koitharu.kotatsu.R import org.koitharu.kotatsu.core.exceptions.resolve.SnackbarErrorObserver +import org.koitharu.kotatsu.core.image.CoilMemoryCacheKey import org.koitharu.kotatsu.core.model.MangaSource import org.koitharu.kotatsu.core.nav.AppRouter import org.koitharu.kotatsu.core.ui.BaseActivity @@ -36,6 +35,7 @@ import org.koitharu.kotatsu.core.util.ext.end import org.koitharu.kotatsu.core.util.ext.enqueueWith import org.koitharu.kotatsu.core.util.ext.getDisplayIcon import org.koitharu.kotatsu.core.util.ext.getDisplayMessage +import org.koitharu.kotatsu.core.util.ext.getParcelableExtraCompat import org.koitharu.kotatsu.core.util.ext.getThemeColor import org.koitharu.kotatsu.core.util.ext.mangaSourceExtra import org.koitharu.kotatsu.core.util.ext.observe @@ -63,7 +63,6 @@ class ImageActivity : BaseActivity(), setContentView(ActivityImageBinding.inflate(layoutInflater)) viewBinding.buttonBack.setOnClickListener(this) viewBinding.buttonMenu.setOnClickListener(this) - val imageUrl = requireNotNull(intent.data) val menuProvider = ImageMenuProvider( activity = this, @@ -74,14 +73,14 @@ class ImageActivity : BaseActivity(), viewModel.isLoading.observe(this, ::onLoadingStateChanged) viewModel.onError.observeEvent(this, SnackbarErrorObserver(viewBinding.root, null)) viewModel.onImageSaved.observeEvent(this, ::onImageSaved) - loadImage(imageUrl) + loadImage() } override fun onClick(v: View) { when (v.id) { R.id.button_back -> dispatchNavigateUp() R.id.button_menu -> menuMediator.onLongClick(v) - else -> loadImage(intent.data) + else -> loadImage() } } @@ -122,10 +121,11 @@ class ImageActivity : BaseActivity(), return insets.consumeAll(typeMask) } - private fun loadImage(url: Uri?) { + private fun loadImage() { ImageRequest.Builder(this) - .data(url) - .memoryCachePolicy(CachePolicy.DISABLED) + .data(intent.data) + .memoryCacheKey(intent.getParcelableExtraCompat(AppRouter.KEY_PREVIEW)?.data) + .memoryCachePolicy(CachePolicy.READ_ONLY) .lifecycle(this) .listener(this) .mangaSourceExtra(MangaSource(intent.getStringExtra(AppRouter.KEY_SOURCE))) @@ -158,11 +158,13 @@ class ImageActivity : BaseActivity(), private class SsivTarget( override val view: SubsamplingScaleImageView, - ) : ViewTarget { + ) : GenericViewTarget() { - override fun onError(error: Image?) = setDrawable(error?.asDrawable(view.resources)) - - override fun onSuccess(result: Image) = setDrawable(result.asDrawable(view.resources)) + override var drawable: Drawable? = null + set(value) { + field = value + setImageDrawable(value) + } override fun equals(other: Any?): Boolean { return (this === other) || (other is SsivTarget && view == other.view) @@ -172,7 +174,7 @@ class ImageActivity : BaseActivity(), override fun toString() = "SsivTarget(view=$view)" - private fun setDrawable(drawable: Drawable?) { + private fun setImageDrawable(drawable: Drawable?) { if (drawable != null) { view.setImage(ImageSource.bitmap(drawable.toBitmap())) } else { diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/list/ui/model/ListHeader.kt b/app/src/main/kotlin/org/koitharu/kotatsu/list/ui/model/ListHeader.kt index 940dec657..8fda6f89e 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/list/ui/model/ListHeader.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/list/ui/model/ListHeader.kt @@ -2,8 +2,11 @@ package org.koitharu.kotatsu.list.ui.model import android.content.Context import androidx.annotation.StringRes +import org.koitharu.kotatsu.core.model.getLocalizedTitle import org.koitharu.kotatsu.core.ui.model.DateTimeAgo +import org.koitharu.kotatsu.parsers.model.MangaChapter +@ConsistentCopyVisibility data class ListHeader private constructor( private val textRaw: Any, @StringRes val buttonTextRes: Int, @@ -25,6 +28,13 @@ data class ListHeader private constructor( badge: String? = null, ) : this(textRaw = textRes, buttonTextRes, payload, badge) + constructor( + chapter: MangaChapter, + @StringRes buttonTextRes: Int = 0, + payload: Any? = null, + badge: String? = null, + ) : this(textRaw = chapter, buttonTextRes, payload, badge) + constructor( dateTimeAgo: DateTimeAgo, @StringRes buttonTextRes: Int = 0, @@ -36,6 +46,7 @@ data class ListHeader private constructor( is CharSequence -> textRaw is Int -> if (textRaw != 0) context.getString(textRaw) else null is DateTimeAgo -> textRaw.format(context) + is MangaChapter -> textRaw.getLocalizedTitle(context.resources) else -> null } diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/ReaderViewModel.kt b/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/ReaderViewModel.kt index 2610754db..b7d2267ce 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/ReaderViewModel.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/ReaderViewModel.kt @@ -50,6 +50,7 @@ import org.koitharu.kotatsu.list.domain.ReadingProgress.Companion.PROGRESS_NONE import org.koitharu.kotatsu.local.data.LocalStorageChanges import org.koitharu.kotatsu.local.domain.DeleteLocalMangaUseCase import org.koitharu.kotatsu.local.domain.model.LocalManga +import org.koitharu.kotatsu.parsers.model.ContentRating import org.koitharu.kotatsu.parsers.model.Manga import org.koitharu.kotatsu.parsers.model.MangaPage import org.koitharu.kotatsu.parsers.util.ifNullOrEmpty @@ -177,7 +178,7 @@ class ReaderViewModel @Inject constructor( }.stateIn(viewModelScope + Dispatchers.Default, SharingStarted.Eagerly, null), ) - val isMangaNsfw = manga.map { it?.isNsfw == true } + val isMangaNsfw = manga.map { it?.contentRating == ContentRating.ADULT } val isBookmarkAdded = readingState.flatMapLatest { state -> val manga = mangaDetails.value?.toManga() diff --git a/app/src/main/res/layout-w600dp-land/activity_details.xml b/app/src/main/res/layout-w600dp-land/activity_details.xml index 387b50f43..864939788 100644 --- a/app/src/main/res/layout-w600dp-land/activity_details.xml +++ b/app/src/main/res/layout-w600dp-land/activity_details.xml @@ -74,19 +74,27 @@ tools:ignore="ContentDescription,UnusedAttribute" /> + + diff --git a/app/src/main/res/layout/activity_details.xml b/app/src/main/res/layout/activity_details.xml index 8fcc8ecad..cc9a471a9 100644 --- a/app/src/main/res/layout/activity_details.xml +++ b/app/src/main/res/layout/activity_details.xml @@ -66,19 +66,27 @@ tools:ignore="ContentDescription,UnusedAttribute" /> + + diff --git a/app/src/main/res/values-night/colors.xml b/app/src/main/res/values-night/colors.xml index 8b306ab21..2853b45f2 100644 --- a/app/src/main/res/values-night/colors.xml +++ b/app/src/main/res/values-night/colors.xml @@ -10,6 +10,8 @@ #81C784 #E57373 #C8000000 + #BF360C + #FF6F00 #191C1C diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 61c1d843c..3e7240fd2 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -20,6 +20,8 @@ #FFFFFF #388E3C #D32F2F + #FF8A65 + #FFD54F #F7FAF8 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index ca880912c..5a8f6c680 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -215,6 +215,7 @@ Preload pages Logged in as %s 18+ + 16+ Various languages Find chapter No chapters in this manga diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 5b741b49e..36bbbc778 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -229,6 +229,18 @@ ?textAppearanceLabelMedium + +