From cf7341b065f8a3f522cff80b7583a07ab1e3a770 Mon Sep 17 00:00:00 2001 From: Koitharu Date: Sun, 20 Jun 2021 14:55:22 +0300 Subject: [PATCH 01/11] Update translations --- app/src/main/res/values-ru/strings.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 4638416bc..7144ace74 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -203,11 +203,11 @@ …и ещё %1$d Далее Введите пароль, который вам понадобится при запуске приложения - Confirm + Подтвердить Пароль должен содержать не менее 4 символов Прятать заголовок при прокрутке Поиск только по %s Другие - Languages - Welcome + Языки + Добро пожаловать \ No newline at end of file From 867812b8e3138ddc5620f4d152ae9673987caeb9 Mon Sep 17 00:00:00 2001 From: Koitharu Date: Sun, 20 Jun 2021 15:15:38 +0300 Subject: [PATCH 02/11] Update koin --- app/build.gradle | 11 +++++------ .../org/koitharu/kotatsu/details/DetailsModule.kt | 5 ++--- .../koitharu/kotatsu/favourites/FavouritesModule.kt | 9 ++++----- .../java/org/koitharu/kotatsu/reader/ReaderModule.kt | 6 ++---- .../koitharu/kotatsu/remotelist/RemoteListModule.kt | 4 ++-- .../java/org/koitharu/kotatsu/search/SearchModule.kt | 9 ++++----- .../org/koitharu/kotatsu/settings/SettingsModule.kt | 4 +++- 7 files changed, 22 insertions(+), 26 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 2bc93b43f..8571e25d4 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -13,8 +13,8 @@ android { applicationId 'org.koitharu.kotatsu' minSdkVersion 21 targetSdkVersion 30 - versionCode 364 - versionName '1.0.1' + versionCode 365 + versionName '1.1' kapt { arguments { @@ -93,9 +93,8 @@ dependencies { implementation 'com.hannesdorfmann:adapterdelegates4-kotlin-dsl:4.3.0' implementation 'com.hannesdorfmann:adapterdelegates4-kotlin-dsl-viewbinding:4.3.0' - implementation 'io.insert-koin:koin-android:3.0.2' - implementation 'io.insert-koin:koin-android-ext:3.0.2' - implementation 'io.coil-kt:coil-base:1.2.1' + implementation 'io.insert-koin:koin-android:3.1.0' + implementation 'io.coil-kt:coil-base:1.2.2' implementation 'com.davemorrissey.labs:subsampling-scale-image-view-androidx:3.10.0' implementation 'com.github.solkin:disk-lru-cache:1.2' @@ -103,5 +102,5 @@ dependencies { testImplementation 'junit:junit:4.13.2' testImplementation 'org.json:json:20210307' - testImplementation 'io.insert-koin:koin-test-junit4:3.0.2' + testImplementation 'io.insert-koin:koin-test-junit4:3.1.0' } \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/details/DetailsModule.kt b/app/src/main/java/org/koitharu/kotatsu/details/DetailsModule.kt index bc8ec0a3d..7e3bd8622 100644 --- a/app/src/main/java/org/koitharu/kotatsu/details/DetailsModule.kt +++ b/app/src/main/java/org/koitharu/kotatsu/details/DetailsModule.kt @@ -2,13 +2,12 @@ package org.koitharu.kotatsu.details import org.koin.androidx.viewmodel.dsl.viewModel import org.koin.dsl.module -import org.koitharu.kotatsu.base.domain.MangaIntent import org.koitharu.kotatsu.details.ui.DetailsViewModel val detailsModule get() = module { - viewModel { (intent: MangaIntent) -> - DetailsViewModel(intent, get(), get(), get(), get(), get(), get()) + viewModel { intent -> + DetailsViewModel(intent.get(), get(), get(), get(), get(), get(), get()) } } \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/favourites/FavouritesModule.kt b/app/src/main/java/org/koitharu/kotatsu/favourites/FavouritesModule.kt index c0237f1cf..4db6c0c27 100644 --- a/app/src/main/java/org/koitharu/kotatsu/favourites/FavouritesModule.kt +++ b/app/src/main/java/org/koitharu/kotatsu/favourites/FavouritesModule.kt @@ -2,7 +2,6 @@ package org.koitharu.kotatsu.favourites import org.koin.androidx.viewmodel.dsl.viewModel import org.koin.dsl.module -import org.koitharu.kotatsu.core.model.Manga import org.koitharu.kotatsu.favourites.domain.FavouritesRepository import org.koitharu.kotatsu.favourites.ui.categories.FavouritesCategoriesViewModel import org.koitharu.kotatsu.favourites.ui.categories.select.MangaCategoriesViewModel @@ -13,11 +12,11 @@ val favouritesModule single { FavouritesRepository(get()) } - viewModel { (categoryId: Long) -> - FavouritesListViewModel(categoryId, get(), get()) + viewModel { categoryId -> + FavouritesListViewModel(categoryId.get(), get(), get()) } viewModel { FavouritesCategoriesViewModel(get()) } - viewModel { (manga: Manga) -> - MangaCategoriesViewModel(manga, get()) + viewModel { manga -> + MangaCategoriesViewModel(manga.get(), get()) } } \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/reader/ReaderModule.kt b/app/src/main/java/org/koitharu/kotatsu/reader/ReaderModule.kt index d031b9aec..74ea5b618 100644 --- a/app/src/main/java/org/koitharu/kotatsu/reader/ReaderModule.kt +++ b/app/src/main/java/org/koitharu/kotatsu/reader/ReaderModule.kt @@ -3,9 +3,7 @@ package org.koitharu.kotatsu.reader import org.koin.androidx.viewmodel.dsl.viewModel import org.koin.dsl.module import org.koitharu.kotatsu.base.domain.MangaDataRepository -import org.koitharu.kotatsu.base.domain.MangaIntent import org.koitharu.kotatsu.local.data.PagesCache -import org.koitharu.kotatsu.reader.ui.ReaderState import org.koitharu.kotatsu.reader.ui.ReaderViewModel val readerModule @@ -14,7 +12,7 @@ val readerModule single { MangaDataRepository(get()) } single { PagesCache(get()) } - viewModel { (intent: MangaIntent, state: ReaderState?) -> - ReaderViewModel(intent, state, get(), get(), get(), get()) + viewModel { params -> + ReaderViewModel(params[0], params[1], get(), get(), get(), get()) } } \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/remotelist/RemoteListModule.kt b/app/src/main/java/org/koitharu/kotatsu/remotelist/RemoteListModule.kt index 802d35ab9..4555fe10e 100644 --- a/app/src/main/java/org/koitharu/kotatsu/remotelist/RemoteListModule.kt +++ b/app/src/main/java/org/koitharu/kotatsu/remotelist/RemoteListModule.kt @@ -9,7 +9,7 @@ import org.koitharu.kotatsu.remotelist.ui.RemoteListViewModel val remoteListModule get() = module { - viewModel { (source: MangaSource) -> - RemoteListViewModel(get(named(source)), get()) + viewModel { source -> + RemoteListViewModel(get(named(source.get())), get()) } } \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/search/SearchModule.kt b/app/src/main/java/org/koitharu/kotatsu/search/SearchModule.kt index da6239420..587d2cdef 100644 --- a/app/src/main/java/org/koitharu/kotatsu/search/SearchModule.kt +++ b/app/src/main/java/org/koitharu/kotatsu/search/SearchModule.kt @@ -4,7 +4,6 @@ import org.koin.android.ext.koin.androidContext import org.koin.androidx.viewmodel.dsl.viewModel import org.koin.core.qualifier.named import org.koin.dsl.module -import org.koitharu.kotatsu.core.model.MangaSource import org.koitharu.kotatsu.search.domain.MangaSearchRepository import org.koitharu.kotatsu.search.ui.MangaSuggestionsProvider import org.koitharu.kotatsu.search.ui.SearchViewModel @@ -18,11 +17,11 @@ val searchModule factory { MangaSuggestionsProvider.createSuggestions(androidContext()) } - viewModel { (source: MangaSource, query: String) -> - SearchViewModel(get(named(source)), query, get()) + viewModel { params -> + SearchViewModel(get(named(params[0])), params[1], get()) } - viewModel { (query: String) -> - GlobalSearchViewModel(query, get(), get()) + viewModel { query -> + GlobalSearchViewModel(query.get(), get(), get()) } viewModel { SearchSuggestionViewModel(get()) } } \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/settings/SettingsModule.kt b/app/src/main/java/org/koitharu/kotatsu/settings/SettingsModule.kt index 435847a8e..24fe705d3 100644 --- a/app/src/main/java/org/koitharu/kotatsu/settings/SettingsModule.kt +++ b/app/src/main/java/org/koitharu/kotatsu/settings/SettingsModule.kt @@ -20,7 +20,9 @@ val settingsModule single { AppSettings(androidContext()) } viewModel { BackupViewModel(get(), androidContext()) } - viewModel { (uri: Uri?) -> RestoreViewModel(uri, get(), androidContext()) } + viewModel { params -> + RestoreViewModel(params.getOrNull(Uri::class), get(), androidContext()) + } viewModel { ProtectSetupViewModel(get()) } viewModel { OnboardViewModel(get()) } } \ No newline at end of file From 973a4073f070fed8df3c2aecdea9a995ab8a1f57 Mon Sep 17 00:00:00 2001 From: Koitharu Date: Sun, 20 Jun 2021 15:59:24 +0300 Subject: [PATCH 03/11] Fix crash in history settings --- .../org/koitharu/kotatsu/local/data/PagesCache.kt | 12 +++++++----- .../kotatsu/search/domain/MangaSearchRepository.kt | 2 +- .../java/org/koitharu/kotatsu/utils/CacheUtils.kt | 4 ++-- .../java/org/koitharu/kotatsu/utils/ext/FileExt.kt | 5 +++++ 4 files changed, 15 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/org/koitharu/kotatsu/local/data/PagesCache.kt b/app/src/main/java/org/koitharu/kotatsu/local/data/PagesCache.kt index 66d1b2f4d..82e70a650 100644 --- a/app/src/main/java/org/koitharu/kotatsu/local/data/PagesCache.kt +++ b/app/src/main/java/org/koitharu/kotatsu/local/data/PagesCache.kt @@ -4,7 +4,7 @@ import android.content.Context import com.tomclaw.cache.DiskLruCache import org.koitharu.kotatsu.utils.FileSizeUtils import org.koitharu.kotatsu.utils.ext.longHashCode -import org.koitharu.kotatsu.utils.ext.sub +import org.koitharu.kotatsu.utils.ext.subdir import org.koitharu.kotatsu.utils.ext.takeIfReadable import java.io.File import java.io.InputStream @@ -13,8 +13,10 @@ import java.io.OutputStream class PagesCache(context: Context) { private val cacheDir = context.externalCacheDir ?: context.cacheDir - private val lruCache = - DiskLruCache.create(cacheDir.sub(Cache.PAGES.dir), FileSizeUtils.mbToBytes(200)) + private val lruCache = DiskLruCache.create( + cacheDir.subdir(Cache.PAGES.dir), + FileSizeUtils.mbToBytes(200) + ) operator fun get(url: String): File? { return lruCache.get(url)?.takeIfReadable() @@ -22,7 +24,7 @@ class PagesCache(context: Context) { @Deprecated("Useless lambda") fun put(url: String, writer: (OutputStream) -> Unit): File { - val file = cacheDir.sub(url.longHashCode().toString()) + val file = File(cacheDir, url.longHashCode().toString()) file.outputStream().use(writer) val res = lruCache.put(url, file) file.delete() @@ -30,7 +32,7 @@ class PagesCache(context: Context) { } fun put(url: String, inputStream: InputStream): File { - val file = cacheDir.sub(url.longHashCode().toString()) + val file = File(cacheDir, url.longHashCode().toString()) file.outputStream().use { out -> inputStream.copyTo(out) } diff --git a/app/src/main/java/org/koitharu/kotatsu/search/domain/MangaSearchRepository.kt b/app/src/main/java/org/koitharu/kotatsu/search/domain/MangaSearchRepository.kt index 63e774884..a58e5098c 100644 --- a/app/src/main/java/org/koitharu/kotatsu/search/domain/MangaSearchRepository.kt +++ b/app/src/main/java/org/koitharu/kotatsu/search/domain/MangaSearchRepository.kt @@ -96,7 +96,7 @@ class MangaSearchRepository( MangaSuggestionsProvider.QUERY_URI, SUGGESTION_PROJECTION, null, - null, + arrayOfNulls(1), null )?.use { cursor -> cursor.count } ?: 0 } diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/CacheUtils.kt b/app/src/main/java/org/koitharu/kotatsu/utils/CacheUtils.kt index 2760b831e..37487e297 100644 --- a/app/src/main/java/org/koitharu/kotatsu/utils/CacheUtils.kt +++ b/app/src/main/java/org/koitharu/kotatsu/utils/CacheUtils.kt @@ -23,12 +23,12 @@ object CacheUtils { @WorkerThread fun computeCacheSize(context: Context, name: String) = getCacheDirs(context) - .map { it.sub(name) } + .map { File(it, name) } .sumOf { x -> x.computeSize() } @WorkerThread fun clearCache(context: Context, name: String) = getCacheDirs(context) - .map { it.sub(name) } + .map { File(it, name) } .forEach { it.deleteRecursively() } // FIXME need async implementation diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/ext/FileExt.kt b/app/src/main/java/org/koitharu/kotatsu/utils/ext/FileExt.kt index 0c2d9b579..248f0f158 100644 --- a/app/src/main/java/org/koitharu/kotatsu/utils/ext/FileExt.kt +++ b/app/src/main/java/org/koitharu/kotatsu/utils/ext/FileExt.kt @@ -13,8 +13,13 @@ import java.util.zip.ZipEntry import java.util.zip.ZipFile @Suppress("NOTHING_TO_INLINE") +@Deprecated("Useless", ReplaceWith("File(this, name)", "java.io.File")) inline fun File.sub(name: String) = File(this, name) +fun File.subdir(name: String) = File(this, name).also { + if (!it.exists()) it.mkdirs() +} + fun File.takeIfReadable() = takeIf { it.exists() && it.canRead() } fun ZipFile.readText(entry: ZipEntry) = getInputStream(entry).bufferedReader().use { From 83a9570961780965cbe2505dd87963c5e678756e Mon Sep 17 00:00:00 2001 From: Koitharu Date: Sun, 20 Jun 2021 16:04:12 +0300 Subject: [PATCH 04/11] Prompt before search history clear --- .../settings/HistorySettingsFragment.kt | 31 +++++++++++++------ app/src/main/res/values-ru/strings.xml | 1 + 2 files changed, 22 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/org/koitharu/kotatsu/settings/HistorySettingsFragment.kt b/app/src/main/java/org/koitharu/kotatsu/settings/HistorySettingsFragment.kt index a2710540e..8380e414f 100644 --- a/app/src/main/java/org/koitharu/kotatsu/settings/HistorySettingsFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/settings/HistorySettingsFragment.kt @@ -2,6 +2,7 @@ package org.koitharu.kotatsu.settings import android.os.Bundle import android.view.View +import androidx.appcompat.app.AlertDialog import androidx.preference.Preference import com.google.android.material.snackbar.Snackbar import kotlinx.coroutines.Dispatchers @@ -87,16 +88,7 @@ class HistorySettingsFragment : BasePreferenceFragment(R.string.history_and_cach true } AppSettings.KEY_SEARCH_HISTORY_CLEAR -> { - viewLifecycleScope.launch { - searchRepository.clearSearchHistory() - preference.summary = preference.context.resources - .getQuantityString(R.plurals.items, 0, 0) - Snackbar.make( - view ?: return@launch, - R.string.search_history_cleared, - Snackbar.LENGTH_SHORT - ).show() - } + clearSearchHistory(preference) true } AppSettings.KEY_UPDATES_FEED_CLEAR -> { @@ -133,4 +125,23 @@ class HistorySettingsFragment : BasePreferenceFragment(R.string.history_and_cach } } } + + private fun clearSearchHistory(preference: Preference) { + AlertDialog.Builder(context ?: return) + .setTitle(R.string.clear_search_history) + .setMessage(R.string.text_clear_search_history_prompt) + .setNegativeButton(android.R.string.cancel, null) + .setPositiveButton(R.string.clear) { _, _ -> + viewLifecycleScope.launch { + searchRepository.clearSearchHistory() + preference.summary = preference.context.resources + .getQuantityString(R.plurals.items, 0, 0) + Snackbar.make( + view ?: return@launch, + R.string.search_history_cleared, + Snackbar.LENGTH_SHORT + ).show() + } + }.show() + } } \ No newline at end of file diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 7144ace74..54e3c6178 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -210,4 +210,5 @@ Другие Языки Добро пожаловать + Вы действительно хотите удалить все недавние поисковые запросы? Это действие не может быть отменено. \ No newline at end of file From bd4efcf11080e3e0ed306a4b98bc74aa6372e575 Mon Sep 17 00:00:00 2001 From: Koitharu Date: Mon, 21 Jun 2021 17:32:23 +0300 Subject: [PATCH 05/11] Remove old search option from menu --- .idea/misc.xml | 1 + .../remotelist/ui/RemoteListFragment.kt | 20 +------------------ app/src/main/res/menu/opt_remote.xml | 12 ----------- 3 files changed, 2 insertions(+), 31 deletions(-) delete mode 100644 app/src/main/res/menu/opt_remote.xml diff --git a/.idea/misc.xml b/.idea/misc.xml index bb01f41af..6d6229d16 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -50,6 +50,7 @@ + diff --git a/app/src/main/java/org/koitharu/kotatsu/remotelist/ui/RemoteListFragment.kt b/app/src/main/java/org/koitharu/kotatsu/remotelist/ui/RemoteListFragment.kt index b16d446d6..1c5004eb4 100644 --- a/app/src/main/java/org/koitharu/kotatsu/remotelist/ui/RemoteListFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/remotelist/ui/RemoteListFragment.kt @@ -1,15 +1,10 @@ package org.koitharu.kotatsu.remotelist.ui -import android.view.Menu -import android.view.MenuInflater -import android.view.MenuItem import org.koin.androidx.viewmodel.ext.android.viewModel import org.koin.core.parameter.parametersOf -import org.koitharu.kotatsu.R import org.koitharu.kotatsu.core.model.MangaFilter import org.koitharu.kotatsu.core.model.MangaSource import org.koitharu.kotatsu.list.ui.MangaListFragment -import org.koitharu.kotatsu.search.ui.SearchActivity import org.koitharu.kotatsu.utils.ext.parcelableArgument import org.koitharu.kotatsu.utils.ext.withArgs @@ -25,7 +20,7 @@ class RemoteListFragment : MangaListFragment() { viewModel.loadNextPage() } - override fun getTitle(): CharSequence? { + override fun getTitle(): CharSequence { return source.title } @@ -34,19 +29,6 @@ class RemoteListFragment : MangaListFragment() { super.onFilterChanged(filter) } - override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { - inflater.inflate(R.menu.opt_remote, menu) - super.onCreateOptionsMenu(menu, inflater) - } - - override fun onOptionsItemSelected(item: MenuItem) = when (item.itemId) { - R.id.action_search_internal -> { - context?.startActivity(SearchActivity.newIntent(requireContext(), source, null)) - true - } - else -> super.onOptionsItemSelected(item) - } - companion object { private const val ARG_SOURCE = "provider" diff --git a/app/src/main/res/menu/opt_remote.xml b/app/src/main/res/menu/opt_remote.xml deleted file mode 100644 index e18367ea1..000000000 --- a/app/src/main/res/menu/opt_remote.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - \ No newline at end of file From e08a4cf1b25649759ee8052bda3d13abcdf69e1f Mon Sep 17 00:00:00 2001 From: Koitharu Date: Mon, 21 Jun 2021 17:50:16 +0300 Subject: [PATCH 06/11] Fix crash if title is empty --- .../java/org/koitharu/kotatsu/core/os/ShortcutsRepository.kt | 1 + app/src/main/java/org/koitharu/kotatsu/search/SearchModule.kt | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/org/koitharu/kotatsu/core/os/ShortcutsRepository.kt b/app/src/main/java/org/koitharu/kotatsu/core/os/ShortcutsRepository.kt index 03cfdbbe4..d8c3db0c4 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/os/ShortcutsRepository.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/os/ShortcutsRepository.kt @@ -35,6 +35,7 @@ class ShortcutsRepository( if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N_MR1) return val manager = context.getSystemService(Context.SHORTCUT_SERVICE) as ShortcutManager val shortcuts = historyRepository.getList(0, manager.maxShortcutCountPerActivity) + .filter { x -> x.title.isNotEmpty() } .map { buildShortcutInfo(it).build().toShortcutInfo() } manager.dynamicShortcuts = shortcuts } diff --git a/app/src/main/java/org/koitharu/kotatsu/search/SearchModule.kt b/app/src/main/java/org/koitharu/kotatsu/search/SearchModule.kt index 587d2cdef..d0b42326b 100644 --- a/app/src/main/java/org/koitharu/kotatsu/search/SearchModule.kt +++ b/app/src/main/java/org/koitharu/kotatsu/search/SearchModule.kt @@ -4,6 +4,7 @@ import org.koin.android.ext.koin.androidContext import org.koin.androidx.viewmodel.dsl.viewModel import org.koin.core.qualifier.named import org.koin.dsl.module +import org.koitharu.kotatsu.core.model.MangaSource import org.koitharu.kotatsu.search.domain.MangaSearchRepository import org.koitharu.kotatsu.search.ui.MangaSuggestionsProvider import org.koitharu.kotatsu.search.ui.SearchViewModel @@ -18,7 +19,7 @@ val searchModule factory { MangaSuggestionsProvider.createSuggestions(androidContext()) } viewModel { params -> - SearchViewModel(get(named(params[0])), params[1], get()) + SearchViewModel(get(named(params.get(0))), params[1], get()) } viewModel { query -> GlobalSearchViewModel(query.get(), get(), get()) From b90ebdabf927640ce7fec3f44772c53a1a433ec9 Mon Sep 17 00:00:00 2001 From: Koitharu Date: Mon, 21 Jun 2021 17:53:04 +0300 Subject: [PATCH 07/11] Fix storage dirs enumeration --- .../koitharu/kotatsu/local/domain/LocalMangaRepository.kt | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) 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 9f84ab52a..2f82366af 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 @@ -175,10 +175,12 @@ class LocalMangaRepository(private val context: Context) : MangaRepository { } fun getAvailableStorageDirs(context: Context): List { - val result = ArrayList(5) - result += context.filesDir.sub(DIR_NAME) + val result = ArrayList(5) + result += File(context.filesDir, DIR_NAME) result += context.getExternalFilesDirs(DIR_NAME) - return result.distinctBy { it.canonicalPath }.filter { it.exists() || it.mkdir() } + return result.filterNotNull() + .distinctBy { it.canonicalPath } + .filter { it.exists() || it.mkdir() } } fun getFallbackStorageDir(context: Context): File? { From 9fcc19ef7e80d065220c8014e51ccaff2305e830 Mon Sep 17 00:00:00 2001 From: Koitharu Date: Wed, 23 Jun 2021 19:34:10 +0300 Subject: [PATCH 08/11] Fix filename transliteration --- .idea/misc.xml | 66 ------------------- .../koitharu/kotatsu/utils/ext/StringExt.kt | 16 +++-- 2 files changed, 10 insertions(+), 72 deletions(-) delete mode 100644 .idea/misc.xml diff --git a/.idea/misc.xml b/.idea/misc.xml deleted file mode 100644 index 6d6229d16..000000000 --- a/.idea/misc.xml +++ /dev/null @@ -1,66 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/ext/StringExt.kt b/app/src/main/java/org/koitharu/kotatsu/utils/ext/StringExt.kt index 834a4158f..cc6a7d295 100644 --- a/app/src/main/java/org/koitharu/kotatsu/utils/ext/StringExt.kt +++ b/app/src/main/java/org/koitharu/kotatsu/utils/ext/StringExt.kt @@ -50,18 +50,22 @@ fun String.toCamelCase(): String { fun String.transliterate(skipMissing: Boolean): String { val cyr = charArrayOf( - 'a', 'б', 'в', 'г', 'д', 'ё', 'ж', 'з', 'и', 'к', 'л', 'м', 'н', - 'п', 'р', 'с', 'т', 'у', 'ў', 'ф', 'х', 'ц', 'ш', 'щ', 'ы', 'э', 'ю', 'я' + 'а', 'б', 'в', 'г', 'д', 'е', 'ж', 'з', 'и', 'й', 'к', 'л', 'м', 'н', 'о', 'п', + 'р', 'с', 'т', 'у', 'ф', 'х', 'ц', 'ч', 'ш', 'щ', 'ъ', 'ы', 'ь', 'э', 'ю', 'я', 'ё', 'ў' ) val lat = arrayOf( - "a", "b", "v", "g", "d", "jo", "zh", "z", "i", "k", "l", "m", "n", - "p", "r", "s", "t", "u", "w", "f", "h", "ts", "sh", "sch", "", "e", "ju", "ja" + "a", "b", "v", "g", "d", "e", "zh", "z", "i", "y", "k", "l", "m", "n", "o", "p", + "r", "s", "t", "u", "f", "h", "ts", "ch", "sh", "sch", "", "i", "", "e", "ju", "ja", "jo", "w" ) return buildString(length + 5) { for (c in this@transliterate) { - val p = cyr.binarySearch(c.toLowerCase()) + val p = cyr.binarySearch(c.lowercaseChar()) if (p in lat.indices) { - append(lat[p]) + if (c.isUpperCase()) { + append(lat[p].uppercase()) + } else { + append(lat[p]) + } } else if (!skipMissing) { append(c) } From b6c50d59ede0dfffd8a430a15e63914bf71bbde6 Mon Sep 17 00:00:00 2001 From: Koitharu Date: Thu, 24 Jun 2021 07:27:07 +0300 Subject: [PATCH 09/11] #35 Fix Mangaread parser --- .../koitharu/kotatsu/core/parser/site/MangareadRepository.kt | 5 ++--- app/src/main/java/org/koitharu/kotatsu/utils/ext/ParseExt.kt | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/org/koitharu/kotatsu/core/parser/site/MangareadRepository.kt b/app/src/main/java/org/koitharu/kotatsu/core/parser/site/MangareadRepository.kt index e4677e1be..384e71077 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/parser/site/MangareadRepository.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/parser/site/MangareadRepository.kt @@ -49,8 +49,7 @@ class MangareadRepository( id = generateUid(href), url = href, publicUrl = href.inContextOf(div), - coverUrl = div.selectFirst("img").attr("data-srcset") - .split(',').firstOrNull()?.substringBeforeLast(' ').orEmpty(), + coverUrl = div.selectFirst("img").absUrl("src"), title = summary.selectFirst("h3").text(), rating = div.selectFirst("span.total_votes")?.ownText() ?.toFloatOrNull()?.div(5f) ?: -1f, @@ -148,7 +147,7 @@ class MangareadRepository( ?: throw ParseException("Root not found") return root.select("div.page-break").map { div -> val img = div.selectFirst("img") - val url = img.relUrl("data-src") + val url = img.relUrl("src") MangaPage( id = generateUid(url), url = url, diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/ext/ParseExt.kt b/app/src/main/java/org/koitharu/kotatsu/utils/ext/ParseExt.kt index 0e0c10433..c6e46b05e 100644 --- a/app/src/main/java/org/koitharu/kotatsu/utils/ext/ParseExt.kt +++ b/app/src/main/java/org/koitharu/kotatsu/utils/ext/ParseExt.kt @@ -80,7 +80,7 @@ fun String.toRelativeUrl(domain: String): String { } fun Element.relUrl(attributeKey: String): String { - val attr = attr(attributeKey) + val attr = attr(attributeKey).trim() if (attr.isEmpty()) { return "" } From f0d4deffd713eaca05a46d95a198c68590e5cf9d Mon Sep 17 00:00:00 2001 From: Koitharu Date: Sat, 26 Jun 2021 14:49:13 +0300 Subject: [PATCH 10/11] Fix Mangaread parser --- .../koitharu/kotatsu/core/parser/site/MangareadRepository.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/org/koitharu/kotatsu/core/parser/site/MangareadRepository.kt b/app/src/main/java/org/koitharu/kotatsu/core/parser/site/MangareadRepository.kt index 384e71077..96430b755 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/parser/site/MangareadRepository.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/parser/site/MangareadRepository.kt @@ -53,13 +53,13 @@ class MangareadRepository( title = summary.selectFirst("h3").text(), rating = div.selectFirst("span.total_votes")?.ownText() ?.toFloatOrNull()?.div(5f) ?: -1f, - tags = summary.selectFirst(".mg_genres").select("a").mapToSet { a -> + tags = summary.selectFirst(".mg_genres")?.select("a")?.mapToSet { a -> MangaTag( key = a.attr("href").removeSuffix("/").substringAfterLast('/'), title = a.text(), source = MangaSource.MANGAREAD ) - }, + }.orEmpty(), author = summary.selectFirst(".mg_author")?.selectFirst("a")?.ownText(), state = when (summary.selectFirst(".mg_status")?.selectFirst(".summary-content") ?.ownText()?.trim()) { From 873b41e4f90e6b5868fae7943ead545965c387cd Mon Sep 17 00:00:00 2001 From: Koitharu Date: Sat, 26 Jun 2021 15:03:04 +0300 Subject: [PATCH 11/11] Fix default languages selector --- .../koitharu/kotatsu/settings/onboard/OnboardViewModel.kt | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/org/koitharu/kotatsu/settings/onboard/OnboardViewModel.kt b/app/src/main/java/org/koitharu/kotatsu/settings/onboard/OnboardViewModel.kt index 9f8d9e65a..b0f2a4ee4 100644 --- a/app/src/main/java/org/koitharu/kotatsu/settings/onboard/OnboardViewModel.kt +++ b/app/src/main/java/org/koitharu/kotatsu/settings/onboard/OnboardViewModel.kt @@ -8,7 +8,6 @@ import org.koitharu.kotatsu.core.model.MangaSource import org.koitharu.kotatsu.core.prefs.AppSettings import org.koitharu.kotatsu.settings.onboard.model.SourceLocale import org.koitharu.kotatsu.utils.ext.map -import org.koitharu.kotatsu.utils.ext.mapTo import org.koitharu.kotatsu.utils.ext.mapToSet import java.util.* @@ -30,10 +29,10 @@ class OnboardViewModel( if (settings.isSourcesSelected) { selectedLocales.removeAll(settings.hiddenSources.map { x -> MangaSource.valueOf(x).locale }) } else { - LocaleListCompat.getDefault().mapTo(selectedLocales) { x -> + val deviceLocales = LocaleListCompat.getDefault().map { x -> x.language } - selectedLocales.retainAll(allSources.map { x -> x.locale }) + selectedLocales.retainAll(deviceLocales) if (selectedLocales.isEmpty()) { selectedLocales += "en" } @@ -71,7 +70,7 @@ class OnboardViewModel( }.sortedWith(SourceLocaleComparator()) } - private class SourceLocaleComparator : Comparator { + private class SourceLocaleComparator : Comparator { private val deviceLocales = LocaleListCompat.getAdjustedDefault() .map { it.language }