diff --git a/app/build.gradle b/app/build.gradle index b963878c5..ee10ac380 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -15,8 +15,8 @@ android { applicationId 'org.koitharu.kotatsu' minSdkVersion 21 targetSdkVersion 33 - versionCode 539 - versionName '5.0.1' + versionCode 540 + versionName '5.0.2' generatedDensities = [] testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" @@ -78,7 +78,7 @@ afterEvaluate { } dependencies { //noinspection GradleDependency - implementation('com.github.KotatsuApp:kotatsu-parsers:3e349d3db3') { + implementation('com.github.KotatsuApp:kotatsu-parsers:96b9ac36f3') { exclude group: 'org.json', module: 'json' } @@ -99,7 +99,7 @@ dependencies { implementation 'androidx.viewpager2:viewpager2:1.1.0-beta01' implementation 'androidx.preference:preference-ktx:1.2.0' implementation 'androidx.biometric:biometric-ktx:1.2.0-alpha05' - implementation 'com.google.android.material:material:1.8.0' + implementation 'com.google.android.material:material:1.9.0' //noinspection LifecycleAnnotationProcessorWithJava8 kapt 'androidx.lifecycle:lifecycle-compiler:2.6.1' implementation 'androidx.work:work-runtime-ktx:2.8.1' diff --git a/app/sampledata/covers/Forget-me-not Volume 1.jpg b/app/sampledata/covers/Forget-me-not Volume 1.jpg deleted file mode 100644 index f5bbc36e5..000000000 Binary files a/app/sampledata/covers/Forget-me-not Volume 1.jpg and /dev/null differ diff --git a/app/sampledata/covers/Forget-me-not Volume 2.jpg b/app/sampledata/covers/Forget-me-not Volume 2.jpg deleted file mode 100644 index fea5eaaba..000000000 Binary files a/app/sampledata/covers/Forget-me-not Volume 2.jpg and /dev/null differ diff --git a/app/sampledata/covers/La Pomme Prisoinniere.jpg b/app/sampledata/covers/La Pomme Prisoinniere.jpg deleted file mode 100644 index f82af29a7..000000000 Binary files a/app/sampledata/covers/La Pomme Prisoinniere.jpg and /dev/null differ diff --git a/app/sampledata/covers/Momo Kanchou no Himitsu Kichi.jpg b/app/sampledata/covers/Momo Kanchou no Himitsu Kichi.jpg deleted file mode 100644 index 6a5207cf7..000000000 Binary files a/app/sampledata/covers/Momo Kanchou no Himitsu Kichi.jpg and /dev/null differ diff --git a/app/sampledata/covers/Omoide Emanon.jpg b/app/sampledata/covers/Omoide Emanon.jpg deleted file mode 100644 index b078f670a..000000000 Binary files a/app/sampledata/covers/Omoide Emanon.jpg and /dev/null differ diff --git a/app/sampledata/covers/Sasurai Emanon Volume 1.jpg b/app/sampledata/covers/Sasurai Emanon Volume 1.jpg deleted file mode 100644 index 4a185e835..000000000 Binary files a/app/sampledata/covers/Sasurai Emanon Volume 1.jpg and /dev/null differ diff --git a/app/sampledata/covers/Sasurai Emanon Volume 2.jpg b/app/sampledata/covers/Sasurai Emanon Volume 2.jpg deleted file mode 100644 index f7f745f23..000000000 Binary files a/app/sampledata/covers/Sasurai Emanon Volume 2.jpg and /dev/null differ diff --git a/app/sampledata/covers/Sasurai Emanon Volume 3.jpg b/app/sampledata/covers/Sasurai Emanon Volume 3.jpg deleted file mode 100644 index 714538ff8..000000000 Binary files a/app/sampledata/covers/Sasurai Emanon Volume 3.jpg and /dev/null differ diff --git a/app/sampledata/covers/Wandering Island Volume 1.jpg b/app/sampledata/covers/Wandering Island Volume 1.jpg deleted file mode 100644 index 2d6edccee..000000000 Binary files a/app/sampledata/covers/Wandering Island Volume 1.jpg and /dev/null differ diff --git a/app/sampledata/covers/Wandering Island Volume 2.jpg b/app/sampledata/covers/Wandering Island Volume 2.jpg deleted file mode 100644 index 52e1e5562..000000000 Binary files a/app/sampledata/covers/Wandering Island Volume 2.jpg and /dev/null differ diff --git a/app/sampledata/genres b/app/sampledata/genres deleted file mode 100644 index 017d3ee73..000000000 --- a/app/sampledata/genres +++ /dev/null @@ -1,10 +0,0 @@ -Slice of Life, Mystery -Slice of Life, Mystery -Psychological, Romance, Comedy, Slice of Life, Supernatural -Sci-Fi, Comedy -Reincarnation, Sci-Fi, Historical, Psychological, Drama, Slice of Life, Supernatural, Mystery -Reincarnation, Sci-Fi, Historical, Psychological, Drama, Slice of Life, Supernatural, Mystery -Reincarnation, Sci-Fi, Historical, Psychological, Drama, Slice of Life, Supernatural, Mystery -Reincarnation, Sci-Fi, Historical, Psychological, Drama, Slice of Life, Supernatural, Mystery -Adventure, Slice of Life, Mystery -Adventure, Slice of Life, Mystery diff --git a/app/sampledata/titles b/app/sampledata/titles deleted file mode 100644 index 9bdeb7594..000000000 --- a/app/sampledata/titles +++ /dev/null @@ -1,10 +0,0 @@ -Forget-me-not Vol. 1 -Forget-me-not Vol. 2 -La Pomme Prisoinniere -Momo Kanchou no Himitsu Kichi -Omoide Emanon -Sasurai Emanon Vol. 1 -Sasurai Emanon Vol. 2 -Sasurai Emanon Vol. 3 -Wandering Island Vol. 1 -Wandering Island Vol. 2 diff --git a/app/src/main/java/org/koitharu/kotatsu/list/ui/adapter/BadgeADUtil.kt b/app/src/main/java/org/koitharu/kotatsu/list/ui/adapter/BadgeADUtil.kt index 2ec86a91d..4e598c86b 100644 --- a/app/src/main/java/org/koitharu/kotatsu/list/ui/adapter/BadgeADUtil.kt +++ b/app/src/main/java/org/koitharu/kotatsu/list/ui/adapter/BadgeADUtil.kt @@ -4,6 +4,7 @@ package org.koitharu.kotatsu.list.ui.adapter import android.view.View import androidx.annotation.CheckResult +import androidx.cardview.widget.CardView import androidx.core.view.doOnNextLayout import com.google.android.material.badge.BadgeDrawable import com.google.android.material.badge.BadgeUtils @@ -16,7 +17,7 @@ fun View.bindBadge(badge: BadgeDrawable?, counter: Int): BadgeDrawable? { val badgeDrawable = badge ?: initBadge(this) badgeDrawable.number = counter badgeDrawable.isVisible = true - badgeDrawable.align() + badgeDrawable.align(this) badgeDrawable } else { badge?.isVisible = false @@ -34,12 +35,17 @@ private fun initBadge(anchor: View): BadgeDrawable { badge.maxCharacterCount = resources.getInteger(R.integer.manga_badge_max_character_count) anchor.doOnNextLayout { BadgeUtils.attachBadgeDrawable(badge, it) - badge.align() + badge.align(it) } return badge } -private fun BadgeDrawable.align() { - horizontalOffset = intrinsicWidth - verticalOffset = intrinsicHeight +private fun BadgeDrawable.align(anchor: View) { + val extraOffset = if (anchor is CardView) { + (anchor.radius / 2f).toInt() + } else { + 0 + } + horizontalOffset = intrinsicWidth + extraOffset + verticalOffset = intrinsicHeight + extraOffset } diff --git a/app/src/main/java/org/koitharu/kotatsu/local/domain/LocalMangaRepository.kt b/app/src/main/java/org/koitharu/kotatsu/local/domain/LocalMangaRepository.kt index f28d05262..2ca31d0e5 100644 --- a/app/src/main/java/org/koitharu/kotatsu/local/domain/LocalMangaRepository.kt +++ b/app/src/main/java/org/koitharu/kotatsu/local/domain/LocalMangaRepository.kt @@ -6,12 +6,14 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.async import kotlinx.coroutines.awaitAll import kotlinx.coroutines.coroutineScope +import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.channelFlow import kotlinx.coroutines.flow.firstOrNull import kotlinx.coroutines.launch import kotlinx.coroutines.runInterruptible import org.koitharu.kotatsu.core.parser.MangaRepository import org.koitharu.kotatsu.local.data.LocalManga +import org.koitharu.kotatsu.local.data.LocalStorageChanges import org.koitharu.kotatsu.local.data.LocalStorageManager import org.koitharu.kotatsu.local.data.TempFileFilter import org.koitharu.kotatsu.local.data.input.LocalMangaInput @@ -35,7 +37,10 @@ import javax.inject.Singleton private const val MAX_PARALLELISM = 4 @Singleton -class LocalMangaRepository @Inject constructor(private val storageManager: LocalStorageManager) : MangaRepository { +class LocalMangaRepository @Inject constructor( + private val storageManager: LocalStorageManager, + @LocalStorageChanges private val localStorageChanges: MutableSharedFlow, +) : MangaRepository { override val source = MangaSource.LOCAL private val locks = CompositeMutex() @@ -85,13 +90,18 @@ class LocalMangaRepository @Inject constructor(private val storageManager: Local suspend fun delete(manga: Manga): Boolean { val file = Uri.parse(manga.url).toFile() - return file.deleteAwait() + val result = file.deleteAwait() + if (result) { + localStorageChanges.emit(null) + } + return result } suspend fun deleteChapters(manga: Manga, ids: Set) { lockManga(manga.id) try { LocalMangaUtil(manga).deleteChapters(ids) + localStorageChanges.emit(LocalManga(manga)) } finally { unlockManga(manga.id) } diff --git a/app/src/main/res/layout/activity_color_filter.xml b/app/src/main/res/layout/activity_color_filter.xml index 0d198d9d6..f11930675 100644 --- a/app/src/main/res/layout/activity_color_filter.xml +++ b/app/src/main/res/layout/activity_color_filter.xml @@ -51,7 +51,7 @@ app:shapeAppearance="?shapeAppearanceCornerLarge" app:strokeColor="?colorOutline" app:strokeWidth="1dp" - tools:src="@sample/covers" /> + tools:src="@tools:sample/backgrounds/scenic" /> + tools:src="@tools:sample/backgrounds/scenic" /> + tools:text="@tools:sample/lorem" /> + tools:src="@tools:sample/backgrounds/scenic" /> + tools:text="@tools:sample/lorem" /> + tools:src="@tools:sample/backgrounds/scenic" /> + tools:src="@tools:sample/backgrounds/scenic" /> + tools:text="@tools:sample/lorem" /> + tools:src="@tools:sample/backgrounds/scenic" /> + tools:text="@tools:sample/lorem" /> + tools:src="@tools:sample/backgrounds/scenic[5]" /> + tools:text="@tools:sample/lorem" /> diff --git a/app/src/main/res/layout/item_manga_list.xml b/app/src/main/res/layout/item_manga_list.xml index 668b163c8..14309a582 100644 --- a/app/src/main/res/layout/item_manga_list.xml +++ b/app/src/main/res/layout/item_manga_list.xml @@ -18,7 +18,7 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:shapeAppearanceOverlay="@style/ShapeAppearanceOverlay.Kotatsu.Cover.Small" - tools:src="@sample/covers" /> + tools:src="@tools:sample/backgrounds/scenic" /> + tools:text="@tools:sample/lorem" /> + tools:text="@tools:sample/lorem/random" /> diff --git a/app/src/main/res/layout/item_manga_list_details.xml b/app/src/main/res/layout/item_manga_list_details.xml index ab20434bc..7e1472cdc 100644 --- a/app/src/main/res/layout/item_manga_list_details.xml +++ b/app/src/main/res/layout/item_manga_list_details.xml @@ -20,7 +20,7 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:shapeAppearanceOverlay="@style/ShapeAppearanceOverlay.Kotatsu.Cover" - tools:src="@sample/covers" /> + tools:src="@tools:sample/backgrounds/scenic" /> + tools:text="@tools:sample/lorem" /> + tools:src="@tools:sample/backgrounds/scenic[7]" /> + tools:text="@tools:sample/lorem" /> + tools:src="@tools:sample/backgrounds/scenic" /> + tools:text="@tools:sample/lorem" /> + tools:src="@tools:sample/backgrounds/scenic" /> + tools:text="@tools:sample/lorem" /> diff --git a/app/src/main/res/layout/item_shelf.xml b/app/src/main/res/layout/item_shelf.xml index 4d5d9d2bb..b7d427b8b 100644 --- a/app/src/main/res/layout/item_shelf.xml +++ b/app/src/main/res/layout/item_shelf.xml @@ -24,7 +24,7 @@ android:layout_height="@dimen/widget_cover_height" android:scaleType="centerCrop" tools:ignore="ContentDescription" - tools:src="@sample/covers" /> + tools:src="@tools:sample/backgrounds/scenic" /> + tools:text="@tools:sample/lorem" /> diff --git a/app/src/main/res/layout/sheet_scrobbling.xml b/app/src/main/res/layout/sheet_scrobbling.xml index a79e7ba7d..81984bdcb 100644 --- a/app/src/main/res/layout/sheet_scrobbling.xml +++ b/app/src/main/res/layout/sheet_scrobbling.xml @@ -33,7 +33,7 @@ app:layout_constraintTop_toBottomOf="@id/dragHandle" app:layout_constraintWidth_percent="0.3" app:shapeAppearanceOverlay="@style/ShapeAppearanceOverlay.Kotatsu.Cover" - tools:background="@sample/covers[9]" + tools:background="@tools:sample/backgrounds/scenic" tools:ignore="ContentDescription,UnusedAttribute" /> + tools:text="@tools:sample/lorem[9]" /> Хуткасць Імпарт раней створанай рэзервовай копіі дадзеных карыстальніка Паказаць на паліцы + Знайсці падобныя + Вы можаце ўвайсці ў існуючы ўліковы запіс або стварыць новы \ No newline at end of file diff --git a/app/src/main/res/values-fil/strings.xml b/app/src/main/res/values-fil/strings.xml index d5c6a22aa..8da7ef153 100644 --- a/app/src/main/res/values-fil/strings.xml +++ b/app/src/main/res/values-fil/strings.xml @@ -421,4 +421,13 @@ Domain LED indicator Mangyaring i-restart ang application upang ilapat ang mga pagbabagong ito + Nakuha ko + I-tap at hawakan ang isang aytem upang muling ayusin ang mga ito + Mag-import ng dating ginawa na backup ng data ng user + Ipakita sa Istante + Bilis + Maaari kang pumili ng isa o higit pang .cbz o .zip file, ang bawat file ay makikilala bilang isang hiwalay na manga. + Maaari kang pumili ng isang directory na may mga archive o mga larawan. Ang bawat archive (o subdirectory) ay makikilala bilang isang kabanata. + Maghanap ng katulad + Maaari kang mag-sign in sa isang umiiral na account o lumikha ng bago \ No newline at end of file diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index a7f6db7d7..df31363b4 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -11,7 +11,7 @@ お気に入り エラーが発生しました 詳細 - チャプター + リスト 詳細リスト グリッド @@ -55,8 +55,8 @@ 履歴とキャッシュ ページのキャッシュをクリアする B|kB|MB|GB|TB - 閉じる - 開く + メニューを閉じる + メニューを開く 設定 ライトテーマ フィルター diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 42fb96504..fdd4b0e6a 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -428,4 +428,6 @@ Імпортуйте раніше створену резервну копію даних користувача Показати на полиці Натисніть і утримуйте елемент, щоб змінити його порядок + Ви можете увійти в існуючий обліковий запис або створити новий + Знайти схожі \ No newline at end of file