From 56e145420ca9a5790bec996341c2bb18e689466b Mon Sep 17 00:00:00 2001 From: Koitharu Date: Sun, 18 Oct 2020 19:05:15 +0300 Subject: [PATCH] DI refactoring --- app/build.gradle | 2 +- .../java/org/koitharu/kotatsu/KotatsuApp.kt | 98 ++++--------------- .../kotatsu/core/db/DatabaseModule.kt | 25 +++++ .../koitharu/kotatsu/core/db/HistoryDao.kt | 47 --------- .../koitharu/kotatsu/core/db/MangaDatabase.kt | 1 + .../db/{ => dao}/FavouriteCategoriesDao.kt | 2 +- .../core/db/{ => dao}/FavouritesDao.kt | 2 +- .../kotatsu/core/db/dao/HistoryDao.kt | 54 ++++++++++ .../kotatsu/core/db/{ => dao}/MangaDao.kt | 2 +- .../core/db/{ => dao}/PreferencesDao.kt | 2 +- .../kotatsu/core/db/{ => dao}/TagsDao.kt | 2 +- .../kotatsu/core/db/{ => dao}/TrackLogsDao.kt | 2 +- .../kotatsu/core/db/{ => dao}/TracksDao.kt | 2 +- .../core/db/migrations/Migration1To2.kt | 2 +- .../core/db/migrations/Migration2To3.kt | 2 +- .../core/db/migrations/Migration3To4.kt | 2 +- .../core/db/migrations/Migration4To5.kt | 2 +- .../core/db/migrations/Migration5To6.kt | 2 +- .../kotatsu/core/github/GithubModule.kt | 10 ++ .../kotatsu/core/github/GithubRepository.kt | 6 +- .../koitharu/kotatsu/core/local/CbzFilter.kt | 7 +- .../kotatsu/core/network/NetworkModule.kt | 32 ++++++ .../cookies/ClearableCookieJar.kt | 2 +- .../cookies/PersistentCookieJar.kt | 6 +- .../cookies/cache/CookieCache.kt | 2 +- .../cookies/cache/IdentifiableCookie.kt | 2 +- .../cookies/cache/SetCookieCache.kt | 7 +- .../cookies/persistence/CookiePersistor.kt | 3 +- .../cookies/persistence/SerializableCookie.kt | 8 +- .../persistence/SharedPrefsCookiePersistor.kt | 9 +- .../kotatsu/core/parser/ParserModule.kt | 9 ++ .../core/parser/UserAgentInterceptor.kt | 4 +- .../kotatsu/domain/MangaDataRepository.kt | 6 +- .../kotatsu/domain/MangaProviderFactory.kt | 1 + .../kotatsu/domain/MangaSearchRepository.kt | 3 +- .../domain/favourites/FavouritesRepository.kt | 6 +- .../favourites/OnFavouritesChangeListener.kt | 4 +- .../domain/history/HistoryRepository.kt | 5 +- .../domain/tracking/TrackingRepository.kt | 6 +- .../{common => base}/AlertDialogFragment.kt | 10 +- .../ui/{common => base}/BaseActivity.kt | 2 +- .../ui/{common => base}/BaseBottomSheet.kt | 4 +- .../ui/{common => base}/BaseFragment.kt | 11 ++- .../BaseFullscreenActivity.kt | 6 +- .../ui/{common => base}/BaseMvpView.kt | 2 +- .../BasePreferenceFragment.kt | 2 +- .../ui/{common => base}/BasePresenter.kt | 2 +- .../ui/{common => base}/BaseService.kt | 14 ++- .../ui/{common => base}/ChipsFactory.kt | 8 +- .../{common => base}/SharedPresenterHolder.kt | 2 +- .../dialog/CheckBoxAlertDialog.kt | 2 +- .../dialog/StorageSelectDialog.kt | 2 +- .../dialog/TextInputDialog.kt | 10 +- .../{common => base}/list/AdapterUpdater.kt | 2 +- .../list/BaseRecyclerAdapter.kt | 5 +- .../{common => base}/list/BaseViewHolder.kt | 2 +- .../list/BoundsScrollListener.kt | 2 +- .../list/OnRecyclerItemClickListener.kt | 2 +- .../list/PaginationScrollListener.kt | 2 +- .../list/ProgressBarAdapter.kt | 2 +- .../list/ProgressBarHolder.kt | 2 +- .../list/decor/ItemTypeDividerDecoration.kt | 2 +- .../list/decor/SectionItemDecoration.kt | 2 +- .../list/decor/SpacingItemDecoration.kt | 2 +- .../org/koitharu/kotatsu/ui/base/uiModule.kt | 21 ++++ .../widgets/CheckableImageView.kt | 3 +- .../widgets/CoverImageView.kt | 11 +-- .../{common => base}/widgets/SquareLayout.kt | 2 +- .../kotatsu/ui/browser/BrowserActivity.kt | 2 +- .../kotatsu/ui/details/ChapterHolder.kt | 2 +- .../kotatsu/ui/details/ChaptersAdapter.kt | 4 +- .../kotatsu/ui/details/ChaptersFragment.kt | 4 +- .../ui/details/MangaDetailsActivity.kt | 2 +- .../ui/details/MangaDetailsFragment.kt | 26 +++-- .../ui/details/MangaDetailsPresenter.kt | 24 ++--- .../kotatsu/ui/details/MangaDetailsView.kt | 2 +- .../kotatsu/ui/download/DownloadService.kt | 11 ++- .../kotatsu/ui/list/ListModeSelectDialog.kt | 5 +- .../koitharu/kotatsu/ui/list/MainActivity.kt | 2 +- .../koitharu/kotatsu/ui/list/MainPresenter.kt | 6 +- .../org/koitharu/kotatsu/ui/list/MainView.kt | 2 +- .../kotatsu/ui/list/MangaGridHolder.kt | 30 +++--- .../kotatsu/ui/list/MangaListAdapter.kt | 6 +- .../kotatsu/ui/list/MangaListDetailsHolder.kt | 33 ++++--- .../kotatsu/ui/list/MangaListFragment.kt | 16 +-- .../kotatsu/ui/list/MangaListHolder.kt | 32 +++--- .../kotatsu/ui/list/MangaListSheet.kt | 10 +- .../koitharu/kotatsu/ui/list/MangaListView.kt | 2 +- .../favourites/FavouritesContainerFragment.kt | 5 +- .../favourites/FavouritesListPresenter.kt | 22 ++--- .../list/favourites/FavouritesPagerAdapter.kt | 5 +- .../categories/CategoriesActivity.kt | 10 +- .../categories/CategoriesAdapter.kt | 12 ++- .../favourites/categories/CategoryHolder.kt | 2 +- .../FavouriteCategoriesPresenter.kt | 10 +- .../categories/FavouriteCategoriesView.kt | 2 +- .../select/CategoriesSelectAdapter.kt | 4 +- .../select/CategoryCheckableHolder.kt | 2 +- .../select/FavouriteCategoriesDialog.kt | 15 +-- .../kotatsu/ui/list/feed/FeedAdapter.kt | 6 +- .../kotatsu/ui/list/feed/FeedFragment.kt | 10 +- .../kotatsu/ui/list/feed/FeedHolder.kt | 27 +++-- .../kotatsu/ui/list/feed/FeedPresenter.kt | 10 +- .../koitharu/kotatsu/ui/list/feed/FeedView.kt | 2 +- .../kotatsu/ui/list/filter/FilterAdapter.kt | 2 +- .../ui/list/filter/FilterSortHolder.kt | 2 +- .../kotatsu/ui/list/filter/FilterTagHolder.kt | 2 +- .../ui/list/history/HistoryListPresenter.kt | 9 +- .../ui/list/local/LocalListPresenter.kt | 14 +-- .../ui/list/remote/RemoteListPresenter.kt | 2 +- .../kotatsu/ui/reader/ChaptersDialog.kt | 4 +- .../kotatsu/ui/reader/ReaderActivity.kt | 2 +- .../kotatsu/ui/reader/ReaderConfigDialog.kt | 2 +- .../kotatsu/ui/reader/ReaderListener.kt | 2 +- .../kotatsu/ui/reader/ReaderPresenter.kt | 22 +++-- .../koitharu/kotatsu/ui/reader/ReaderView.kt | 2 +- .../ui/reader/SimpleSettingsActivity.kt | 22 +++-- .../kotatsu/ui/reader/base/AbstractReader.kt | 2 +- .../ui/reader/base/BaseReaderAdapter.kt | 7 +- .../kotatsu/ui/reader/standard/PageHolder.kt | 2 +- .../reader/thumbnails/PageThumbnailHolder.kt | 38 ++++--- .../thumbnails/PagesThumbnailsAdapter.kt | 4 +- .../reader/thumbnails/PagesThumbnailsSheet.kt | 6 +- .../kotatsu/ui/reader/wetoon/WebtoonHolder.kt | 2 +- .../kotatsu/ui/search/SearchActivity.kt | 2 +- .../kotatsu/ui/search/SearchPresenter.kt | 35 ++----- .../ui/search/global/GlobalSearchActivity.kt | 2 +- .../ui/search/global/GlobalSearchPresenter.kt | 57 +++++------ .../kotatsu/ui/settings/AppUpdateChecker.kt | 16 ++- .../ui/settings/HistorySettingsFragment.kt | 7 +- .../ui/settings/MainSettingsFragment.kt | 6 +- .../ui/settings/NetworkSettingsFragment.kt | 2 +- .../NotificationSettingsLegacyFragment.kt | 2 +- .../ui/settings/ReaderSettingsFragment.kt | 2 +- .../kotatsu/ui/settings/SettingsActivity.kt | 7 +- .../ui/settings/sources/SourceViewHolder.kt | 8 +- .../ui/settings/sources/SourcesAdapter.kt | 2 +- .../sources/SourcesSettingsFragment.kt | 8 +- .../kotatsu/ui/tracker/TrackWorker.kt | 21 ++-- .../ui/utils/protect/ProtectActivity.kt | 2 +- .../ui/utils/protect/ProtectPresenter.kt | 2 +- .../kotatsu/ui/utils/protect/ProtectView.kt | 2 +- .../kotatsu/ui/widget/WidgetUpdater.kt | 2 - .../ui/widget/recent/RecentListFactory.kt | 12 ++- .../ui/widget/recent/RecentWidgetService.kt | 3 +- .../ui/widget/shelf/CategorySelectAdapter.kt | 4 +- .../ui/widget/shelf/CategorySelectHolder.kt | 2 +- .../ui/widget/shelf/ShelfConfigActivity.kt | 4 +- .../ui/widget/shelf/ShelfListFactory.kt | 16 +-- .../ui/widget/shelf/ShelfWidgetService.kt | 9 +- .../org/koitharu/kotatsu/utils/CacheUtils.kt | 31 ++++-- .../koitharu/kotatsu/utils/MangaShortcut.kt | 12 ++- .../org/koitharu/kotatsu/utils/UiUtils.kt | 2 - .../org/koitharu/kotatsu/utils/ext/CoilExt.kt | 11 +++ .../kotatsu/utils/ext/CoroutineExt.kt | 9 +- .../org/koitharu/kotatsu/utils/ext/FileExt.kt | 3 +- .../org/koitharu/kotatsu/utils/ext/ViewExt.kt | 2 +- app/src/main/res/layout/item_manga_grid.xml | 2 +- app/src/main/res/layout/item_manga_list.xml | 6 +- .../res/layout/item_manga_list_details.xml | 10 +- app/src/main/res/layout/item_page_thumb.xml | 2 +- .../main/res/layout/item_source_config.xml | 2 +- app/src/main/res/layout/item_tracklog.xml | 2 +- .../kotatsu/parsers/TemporaryCookieJar.kt | 2 +- 164 files changed, 735 insertions(+), 637 deletions(-) create mode 100644 app/src/main/java/org/koitharu/kotatsu/core/db/DatabaseModule.kt delete mode 100644 app/src/main/java/org/koitharu/kotatsu/core/db/HistoryDao.kt rename app/src/main/java/org/koitharu/kotatsu/core/db/{ => dao}/FavouriteCategoriesDao.kt (96%) rename app/src/main/java/org/koitharu/kotatsu/core/db/{ => dao}/FavouritesDao.kt (97%) create mode 100644 app/src/main/java/org/koitharu/kotatsu/core/db/dao/HistoryDao.kt rename app/src/main/java/org/koitharu/kotatsu/core/db/{ => dao}/MangaDao.kt (96%) rename app/src/main/java/org/koitharu/kotatsu/core/db/{ => dao}/PreferencesDao.kt (92%) rename app/src/main/java/org/koitharu/kotatsu/core/db/{ => dao}/TagsDao.kt (92%) rename app/src/main/java/org/koitharu/kotatsu/core/db/{ => dao}/TrackLogsDao.kt (94%) rename app/src/main/java/org/koitharu/kotatsu/core/db/{ => dao}/TracksDao.kt (95%) create mode 100644 app/src/main/java/org/koitharu/kotatsu/core/github/GithubModule.kt create mode 100644 app/src/main/java/org/koitharu/kotatsu/core/network/NetworkModule.kt rename app/src/main/java/org/koitharu/kotatsu/core/{local => network}/cookies/ClearableCookieJar.kt (95%) rename app/src/main/java/org/koitharu/kotatsu/core/{local => network}/cookies/PersistentCookieJar.kt (91%) rename app/src/main/java/org/koitharu/kotatsu/core/{local => network}/cookies/cache/CookieCache.kt (94%) rename app/src/main/java/org/koitharu/kotatsu/core/{local => network}/cookies/cache/IdentifiableCookie.kt (97%) rename app/src/main/java/org/koitharu/kotatsu/core/{local => network}/cookies/cache/SetCookieCache.kt (83%) rename app/src/main/java/org/koitharu/kotatsu/core/{local => network}/cookies/persistence/CookiePersistor.kt (94%) rename app/src/main/java/org/koitharu/kotatsu/core/{local => network}/cookies/persistence/SerializableCookie.kt (97%) rename app/src/main/java/org/koitharu/kotatsu/core/{local => network}/cookies/persistence/SharedPrefsCookiePersistor.kt (91%) create mode 100644 app/src/main/java/org/koitharu/kotatsu/core/parser/ParserModule.kt rename app/src/main/java/org/koitharu/kotatsu/ui/{common => base}/AlertDialogFragment.kt (77%) rename app/src/main/java/org/koitharu/kotatsu/ui/{common => base}/BaseActivity.kt (94%) rename app/src/main/java/org/koitharu/kotatsu/ui/{common => base}/BaseBottomSheet.kt (91%) rename app/src/main/java/org/koitharu/kotatsu/ui/{common => base}/BaseFragment.kt (69%) rename app/src/main/java/org/koitharu/kotatsu/ui/{common => base}/BaseFullscreenActivity.kt (83%) rename app/src/main/java/org/koitharu/kotatsu/ui/{common => base}/BaseMvpView.kt (86%) rename app/src/main/java/org/koitharu/kotatsu/ui/{common => base}/BasePreferenceFragment.kt (93%) rename app/src/main/java/org/koitharu/kotatsu/ui/{common => base}/BasePresenter.kt (96%) rename app/src/main/java/org/koitharu/kotatsu/ui/{common => base}/BaseService.kt (55%) rename app/src/main/java/org/koitharu/kotatsu/ui/{common => base}/ChipsFactory.kt (75%) rename app/src/main/java/org/koitharu/kotatsu/ui/{common => base}/SharedPresenterHolder.kt (92%) rename app/src/main/java/org/koitharu/kotatsu/ui/{common => base}/dialog/CheckBoxAlertDialog.kt (97%) rename app/src/main/java/org/koitharu/kotatsu/ui/{common => base}/dialog/StorageSelectDialog.kt (98%) rename app/src/main/java/org/koitharu/kotatsu/ui/{common => base}/dialog/TextInputDialog.kt (89%) rename app/src/main/java/org/koitharu/kotatsu/ui/{common => base}/list/AdapterUpdater.kt (94%) rename app/src/main/java/org/koitharu/kotatsu/ui/{common => base}/list/BaseRecyclerAdapter.kt (95%) rename app/src/main/java/org/koitharu/kotatsu/ui/{common => base}/list/BaseViewHolder.kt (97%) rename app/src/main/java/org/koitharu/kotatsu/ui/{common => base}/list/BoundsScrollListener.kt (95%) rename app/src/main/java/org/koitharu/kotatsu/ui/{common => base}/list/OnRecyclerItemClickListener.kt (80%) rename app/src/main/java/org/koitharu/kotatsu/ui/{common => base}/list/PaginationScrollListener.kt (93%) rename app/src/main/java/org/koitharu/kotatsu/ui/{common => base}/list/ProgressBarAdapter.kt (91%) rename app/src/main/java/org/koitharu/kotatsu/ui/{common => base}/list/ProgressBarHolder.kt (94%) rename app/src/main/java/org/koitharu/kotatsu/ui/{common => base}/list/decor/ItemTypeDividerDecoration.kt (97%) rename app/src/main/java/org/koitharu/kotatsu/ui/{common => base}/list/decor/SectionItemDecoration.kt (98%) rename app/src/main/java/org/koitharu/kotatsu/ui/{common => base}/list/decor/SpacingItemDecoration.kt (93%) create mode 100644 app/src/main/java/org/koitharu/kotatsu/ui/base/uiModule.kt rename app/src/main/java/org/koitharu/kotatsu/ui/{common => base}/widgets/CheckableImageView.kt (96%) rename app/src/main/java/org/koitharu/kotatsu/ui/{common => base}/widgets/CoverImageView.kt (82%) rename app/src/main/java/org/koitharu/kotatsu/ui/{common => base}/widgets/SquareLayout.kt (89%) diff --git a/app/build.gradle b/app/build.gradle index fecc06bcb..4327e9e90 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -95,7 +95,7 @@ dependencies { implementation 'org.jsoup:jsoup:1.13.1' implementation 'org.koin:koin-android:2.2.0-rc-2' - implementation 'io.coil-kt:coil:1.0.0-rc3' + implementation 'io.coil-kt:coil-base:1.0.0-rc3' implementation 'com.davemorrissey.labs:subsampling-scale-image-view:3.10.0' implementation 'com.tomclaw.cache:cache:1.0' diff --git a/app/src/main/java/org/koitharu/kotatsu/KotatsuApp.kt b/app/src/main/java/org/koitharu/kotatsu/KotatsuApp.kt index 81d4a5b40..5200ce5d6 100644 --- a/app/src/main/java/org/koitharu/kotatsu/KotatsuApp.kt +++ b/app/src/main/java/org/koitharu/kotatsu/KotatsuApp.kt @@ -3,37 +3,25 @@ package org.koitharu.kotatsu import android.app.Application import android.os.StrictMode import androidx.appcompat.app.AppCompatDelegate -import androidx.room.Room -import coil.Coil -import coil.ComponentRegistry -import coil.ImageLoader -import coil.util.CoilUtils -import okhttp3.CookieJar -import okhttp3.OkHttpClient import org.koin.android.ext.android.get import org.koin.android.ext.koin.androidContext -import org.koin.android.ext.koin.androidLogger import org.koin.core.context.startKoin -import org.koin.core.logger.Level import org.koin.dsl.module -import org.koitharu.kotatsu.core.db.DatabasePrePopulateCallback -import org.koitharu.kotatsu.core.db.MangaDatabase -import org.koitharu.kotatsu.core.db.migrations.* -import org.koitharu.kotatsu.core.local.CbzFetcher +import org.koitharu.kotatsu.core.db.databaseModule +import org.koitharu.kotatsu.core.github.githubModule import org.koitharu.kotatsu.core.local.PagesCache -import org.koitharu.kotatsu.core.local.cookies.PersistentCookieJar -import org.koitharu.kotatsu.core.local.cookies.cache.SetCookieCache -import org.koitharu.kotatsu.core.local.cookies.persistence.SharedPrefsCookiePersistor +import org.koitharu.kotatsu.core.network.networkModule import org.koitharu.kotatsu.core.parser.LocalMangaRepository -import org.koitharu.kotatsu.core.parser.UserAgentInterceptor import org.koitharu.kotatsu.core.prefs.AppSettings +import org.koitharu.kotatsu.domain.MangaDataRepository import org.koitharu.kotatsu.domain.MangaLoaderContext +import org.koitharu.kotatsu.domain.MangaSearchRepository import org.koitharu.kotatsu.domain.favourites.FavouritesRepository import org.koitharu.kotatsu.domain.history.HistoryRepository +import org.koitharu.kotatsu.domain.tracking.TrackingRepository +import org.koitharu.kotatsu.ui.base.uiModule import org.koitharu.kotatsu.ui.utils.AppCrashHandler import org.koitharu.kotatsu.ui.widget.WidgetUpdater -import org.koitharu.kotatsu.utils.CacheUtils -import java.util.concurrent.TimeUnit class KotatsuApp : Application() { @@ -57,9 +45,8 @@ class KotatsuApp : Application() { ) } initKoin() - initCoil(get()) Thread.setDefaultUncaughtExceptionHandler(AppCrashHandler(applicationContext)) - AppCompatDelegate.setDefaultNightMode(AppSettings(this).theme) + AppCompatDelegate.setDefaultNightMode(get().theme) val widgetUpdater = WidgetUpdater(applicationContext) FavouritesRepository.subscribe(widgetUpdater) HistoryRepository.subscribe(widgetUpdater) @@ -67,66 +54,23 @@ class KotatsuApp : Application() { private fun initKoin() { startKoin { - androidLogger(Level.ERROR) - androidContext(applicationContext) + androidContext(this@KotatsuApp) modules( + networkModule, + databaseModule, + githubModule, + uiModule, module { - single { - PersistentCookieJar( - SetCookieCache(), - SharedPrefsCookiePersistor(applicationContext) - ) - } - factory { - okHttp(get()) - .cache(CacheUtils.createHttpCache(applicationContext)) - .build() - } - single { - mangaDb().build() - } - single { - MangaLoaderContext() - } - single { - AppSettings(applicationContext) - } - single { - PagesCache(applicationContext) - } + single { FavouritesRepository(get()) } + single { HistoryRepository(get()) } + single { TrackingRepository(get()) } + single { MangaDataRepository(get()) } + single { MangaSearchRepository() } + single { MangaLoaderContext() } + single { AppSettings(get()) } + single { PagesCache(get()) } } ) } } - - private fun initCoil(cookieJar: CookieJar) { - Coil.setImageLoader( - ImageLoader.Builder(applicationContext) - .okHttpClient( - okHttp(cookieJar) - .cache(CoilUtils.createDefaultCache(applicationContext)) - .build() - ).componentRegistry( - ComponentRegistry.Builder() - .add(CbzFetcher()) - .build() - ) - .build() - ) - } - - private fun okHttp(cookieJar: CookieJar) = OkHttpClient.Builder().apply { - connectTimeout(20, TimeUnit.SECONDS) - readTimeout(60, TimeUnit.SECONDS) - writeTimeout(20, TimeUnit.SECONDS) - cookieJar(cookieJar) - addInterceptor(UserAgentInterceptor) - } - - private fun mangaDb() = Room.databaseBuilder( - applicationContext, - MangaDatabase::class.java, - "kotatsu-db" - ).addMigrations(Migration1To2, Migration2To3, Migration3To4, Migration4To5, Migration5To6) - .addCallback(DatabasePrePopulateCallback(resources)) } \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/core/db/DatabaseModule.kt b/app/src/main/java/org/koitharu/kotatsu/core/db/DatabaseModule.kt new file mode 100644 index 000000000..44463143f --- /dev/null +++ b/app/src/main/java/org/koitharu/kotatsu/core/db/DatabaseModule.kt @@ -0,0 +1,25 @@ +package org.koitharu.kotatsu.core.db + +import androidx.room.Room +import org.koin.android.ext.koin.androidContext +import org.koin.dsl.module +import org.koitharu.kotatsu.core.db.migrations.* + +val databaseModule + get() = module { + single { + Room.databaseBuilder( + androidContext(), + MangaDatabase::class.java, + "kotatsu-db" + ).addMigrations( + Migration1To2(), + Migration2To3(), + Migration3To4(), + Migration4To5(), + Migration5To6() + ).addCallback( + DatabasePrePopulateCallback(androidContext().resources) + ).build() + } + } \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/core/db/HistoryDao.kt b/app/src/main/java/org/koitharu/kotatsu/core/db/HistoryDao.kt deleted file mode 100644 index 23c006949..000000000 --- a/app/src/main/java/org/koitharu/kotatsu/core/db/HistoryDao.kt +++ /dev/null @@ -1,47 +0,0 @@ -package org.koitharu.kotatsu.core.db - -import androidx.room.* -import org.koitharu.kotatsu.core.db.entity.HistoryEntity -import org.koitharu.kotatsu.core.db.entity.HistoryWithManga -import org.koitharu.kotatsu.core.db.entity.MangaEntity - - -@Dao -abstract class HistoryDao { - - /** - * @hide - */ - @Transaction - @Query("SELECT * FROM history ORDER BY updated_at DESC LIMIT :limit OFFSET :offset") - abstract suspend fun findAll(offset: Int, limit: Int): List - - @Query("SELECT * FROM manga WHERE manga_id IN (SELECT manga_id FROM history)") - abstract suspend fun findAllManga(): List - - @Query("SELECT * FROM history WHERE manga_id = :id") - abstract suspend fun find(id: Long): HistoryEntity? - - @Query("DELETE FROM history") - abstract suspend fun clear() - - @Insert(onConflict = OnConflictStrategy.IGNORE) - abstract suspend fun insert(entity: HistoryEntity): Long - - @Query("UPDATE history SET page = :page, chapter_id = :chapterId, scroll = :scroll, updated_at = :updatedAt WHERE manga_id = :mangaId") - abstract suspend fun update(mangaId: Long, page: Int, chapterId: Long, scroll: Float, updatedAt: Long): Int - - @Query("DELETE FROM history WHERE manga_id = :mangaId") - abstract suspend fun delete(mangaId: Long) - - suspend fun update(entity: HistoryEntity) = update(entity.mangaId, entity.page, entity.chapterId, entity.scroll, entity.updatedAt) - - @Transaction - open suspend fun upsert(entity: HistoryEntity): Boolean { - return if (update(entity) == 0) { - insert(entity) - true - } else false - } - -} \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/core/db/MangaDatabase.kt b/app/src/main/java/org/koitharu/kotatsu/core/db/MangaDatabase.kt index 1587bd37d..386b9e4ab 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/db/MangaDatabase.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/db/MangaDatabase.kt @@ -2,6 +2,7 @@ package org.koitharu.kotatsu.core.db import androidx.room.Database import androidx.room.RoomDatabase +import org.koitharu.kotatsu.core.db.dao.* import org.koitharu.kotatsu.core.db.entity.* @Database( diff --git a/app/src/main/java/org/koitharu/kotatsu/core/db/FavouriteCategoriesDao.kt b/app/src/main/java/org/koitharu/kotatsu/core/db/dao/FavouriteCategoriesDao.kt similarity index 96% rename from app/src/main/java/org/koitharu/kotatsu/core/db/FavouriteCategoriesDao.kt rename to app/src/main/java/org/koitharu/kotatsu/core/db/dao/FavouriteCategoriesDao.kt index 8753431f7..aad1cd592 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/db/FavouriteCategoriesDao.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/db/dao/FavouriteCategoriesDao.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.core.db +package org.koitharu.kotatsu.core.db.dao import androidx.room.Dao import androidx.room.Insert diff --git a/app/src/main/java/org/koitharu/kotatsu/core/db/FavouritesDao.kt b/app/src/main/java/org/koitharu/kotatsu/core/db/dao/FavouritesDao.kt similarity index 97% rename from app/src/main/java/org/koitharu/kotatsu/core/db/FavouritesDao.kt rename to app/src/main/java/org/koitharu/kotatsu/core/db/dao/FavouritesDao.kt index 78e6c1a05..552f1ca74 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/db/FavouritesDao.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/db/dao/FavouritesDao.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.core.db +package org.koitharu.kotatsu.core.db.dao import androidx.room.* import org.koitharu.kotatsu.core.db.entity.FavouriteEntity diff --git a/app/src/main/java/org/koitharu/kotatsu/core/db/dao/HistoryDao.kt b/app/src/main/java/org/koitharu/kotatsu/core/db/dao/HistoryDao.kt new file mode 100644 index 000000000..ca768f982 --- /dev/null +++ b/app/src/main/java/org/koitharu/kotatsu/core/db/dao/HistoryDao.kt @@ -0,0 +1,54 @@ +package org.koitharu.kotatsu.core.db.dao + +import androidx.room.* +import org.koitharu.kotatsu.core.db.entity.HistoryEntity +import org.koitharu.kotatsu.core.db.entity.HistoryWithManga +import org.koitharu.kotatsu.core.db.entity.MangaEntity + + +@Dao +abstract class HistoryDao { + + /** + * @hide + */ + @Transaction + @Query("SELECT * FROM history ORDER BY updated_at DESC LIMIT :limit OFFSET :offset") + abstract suspend fun findAll(offset: Int, limit: Int): List + + @Query("SELECT * FROM manga WHERE manga_id IN (SELECT manga_id FROM history)") + abstract suspend fun findAllManga(): List + + @Query("SELECT * FROM history WHERE manga_id = :id") + abstract suspend fun find(id: Long): HistoryEntity? + + @Query("DELETE FROM history") + abstract suspend fun clear() + + @Insert(onConflict = OnConflictStrategy.IGNORE) + abstract suspend fun insert(entity: HistoryEntity): Long + + @Query("UPDATE history SET page = :page, chapter_id = :chapterId, scroll = :scroll, updated_at = :updatedAt WHERE manga_id = :mangaId") + abstract suspend fun update( + mangaId: Long, + page: Int, + chapterId: Long, + scroll: Float, + updatedAt: Long + ): Int + + @Query("DELETE FROM history WHERE manga_id = :mangaId") + abstract suspend fun delete(mangaId: Long) + + suspend fun update(entity: HistoryEntity) = + update(entity.mangaId, entity.page, entity.chapterId, entity.scroll, entity.updatedAt) + + @Transaction + open suspend fun upsert(entity: HistoryEntity): Boolean { + return if (update(entity) == 0) { + insert(entity) + true + } else false + } + +} \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/core/db/MangaDao.kt b/app/src/main/java/org/koitharu/kotatsu/core/db/dao/MangaDao.kt similarity index 96% rename from app/src/main/java/org/koitharu/kotatsu/core/db/MangaDao.kt rename to app/src/main/java/org/koitharu/kotatsu/core/db/dao/MangaDao.kt index e50a3a557..51b7571db 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/db/MangaDao.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/db/dao/MangaDao.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.core.db +package org.koitharu.kotatsu.core.db.dao import androidx.room.* import org.koitharu.kotatsu.core.db.entity.MangaEntity diff --git a/app/src/main/java/org/koitharu/kotatsu/core/db/PreferencesDao.kt b/app/src/main/java/org/koitharu/kotatsu/core/db/dao/PreferencesDao.kt similarity index 92% rename from app/src/main/java/org/koitharu/kotatsu/core/db/PreferencesDao.kt rename to app/src/main/java/org/koitharu/kotatsu/core/db/dao/PreferencesDao.kt index bc910f6b0..9a957b206 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/db/PreferencesDao.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/db/dao/PreferencesDao.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.core.db +package org.koitharu.kotatsu.core.db.dao import androidx.room.* import org.koitharu.kotatsu.core.db.entity.MangaPrefsEntity diff --git a/app/src/main/java/org/koitharu/kotatsu/core/db/TagsDao.kt b/app/src/main/java/org/koitharu/kotatsu/core/db/dao/TagsDao.kt similarity index 92% rename from app/src/main/java/org/koitharu/kotatsu/core/db/TagsDao.kt rename to app/src/main/java/org/koitharu/kotatsu/core/db/dao/TagsDao.kt index bb3deb27c..0cd94ba37 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/db/TagsDao.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/db/dao/TagsDao.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.core.db +package org.koitharu.kotatsu.core.db.dao import androidx.room.* import org.koitharu.kotatsu.core.db.entity.TagEntity diff --git a/app/src/main/java/org/koitharu/kotatsu/core/db/TrackLogsDao.kt b/app/src/main/java/org/koitharu/kotatsu/core/db/dao/TrackLogsDao.kt similarity index 94% rename from app/src/main/java/org/koitharu/kotatsu/core/db/TrackLogsDao.kt rename to app/src/main/java/org/koitharu/kotatsu/core/db/dao/TrackLogsDao.kt index dc4ce6e01..8ddc723d5 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/db/TrackLogsDao.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/db/dao/TrackLogsDao.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.core.db +package org.koitharu.kotatsu.core.db.dao import androidx.room.* import org.koitharu.kotatsu.core.db.entity.TrackLogEntity diff --git a/app/src/main/java/org/koitharu/kotatsu/core/db/TracksDao.kt b/app/src/main/java/org/koitharu/kotatsu/core/db/dao/TracksDao.kt similarity index 95% rename from app/src/main/java/org/koitharu/kotatsu/core/db/TracksDao.kt rename to app/src/main/java/org/koitharu/kotatsu/core/db/dao/TracksDao.kt index e3f0ea701..d6f7fc571 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/db/TracksDao.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/db/dao/TracksDao.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.core.db +package org.koitharu.kotatsu.core.db.dao import androidx.room.* import org.koitharu.kotatsu.core.db.entity.TrackEntity diff --git a/app/src/main/java/org/koitharu/kotatsu/core/db/migrations/Migration1To2.kt b/app/src/main/java/org/koitharu/kotatsu/core/db/migrations/Migration1To2.kt index 3ff91de78..8e99a65a3 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/db/migrations/Migration1To2.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/db/migrations/Migration1To2.kt @@ -3,7 +3,7 @@ package org.koitharu.kotatsu.core.db.migrations import androidx.room.migration.Migration import androidx.sqlite.db.SupportSQLiteDatabase -object Migration1To2 : Migration(1, 2) { +class Migration1To2 : Migration(1, 2) { /** * Adding foreign keys */ diff --git a/app/src/main/java/org/koitharu/kotatsu/core/db/migrations/Migration2To3.kt b/app/src/main/java/org/koitharu/kotatsu/core/db/migrations/Migration2To3.kt index 61c2a63a7..018f186a4 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/db/migrations/Migration2To3.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/db/migrations/Migration2To3.kt @@ -3,7 +3,7 @@ package org.koitharu.kotatsu.core.db.migrations import androidx.room.migration.Migration import androidx.sqlite.db.SupportSQLiteDatabase -object Migration2To3 : Migration(2, 3) { +class Migration2To3 : Migration(2, 3) { override fun migrate(database: SupportSQLiteDatabase) { database.execSQL("ALTER TABLE history ADD COLUMN scroll REAL NOT NULL DEFAULT 0") diff --git a/app/src/main/java/org/koitharu/kotatsu/core/db/migrations/Migration3To4.kt b/app/src/main/java/org/koitharu/kotatsu/core/db/migrations/Migration3To4.kt index 786e27ade..47fca3fce 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/db/migrations/Migration3To4.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/db/migrations/Migration3To4.kt @@ -3,7 +3,7 @@ package org.koitharu.kotatsu.core.db.migrations import androidx.room.migration.Migration import androidx.sqlite.db.SupportSQLiteDatabase -object Migration3To4 : Migration(3, 4) { +class Migration3To4 : Migration(3, 4) { override fun migrate(database: SupportSQLiteDatabase) { database.execSQL("CREATE TABLE IF NOT EXISTS tracks (manga_id INTEGER NOT NULL, chapters_total INTEGER NOT NULL, last_chapter_id INTEGER NOT NULL, chapters_new INTEGER NOT NULL, last_check INTEGER NOT NULL, last_notified_id INTEGER NOT NULL, PRIMARY KEY(manga_id), FOREIGN KEY(manga_id) REFERENCES manga(manga_id) ON UPDATE NO ACTION ON DELETE CASCADE )") diff --git a/app/src/main/java/org/koitharu/kotatsu/core/db/migrations/Migration4To5.kt b/app/src/main/java/org/koitharu/kotatsu/core/db/migrations/Migration4To5.kt index 81f7b0a94..a2445ef01 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/db/migrations/Migration4To5.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/db/migrations/Migration4To5.kt @@ -3,7 +3,7 @@ package org.koitharu.kotatsu.core.db.migrations import androidx.room.migration.Migration import androidx.sqlite.db.SupportSQLiteDatabase -object Migration4To5 : Migration(4, 5) { +class Migration4To5 : Migration(4, 5) { override fun migrate(database: SupportSQLiteDatabase) { database.execSQL("ALTER TABLE favourite_categories ADD COLUMN sort_key INTEGER NOT NULL DEFAULT 0") diff --git a/app/src/main/java/org/koitharu/kotatsu/core/db/migrations/Migration5To6.kt b/app/src/main/java/org/koitharu/kotatsu/core/db/migrations/Migration5To6.kt index 13c8935f1..4541bf6bb 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/db/migrations/Migration5To6.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/db/migrations/Migration5To6.kt @@ -3,7 +3,7 @@ package org.koitharu.kotatsu.core.db.migrations import androidx.room.migration.Migration import androidx.sqlite.db.SupportSQLiteDatabase -object Migration5To6 : Migration(5, 6) { +class Migration5To6 : Migration(5, 6) { override fun migrate(database: SupportSQLiteDatabase) { database.execSQL("CREATE TABLE IF NOT EXISTS track_logs (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, manga_id INTEGER NOT NULL, chapters TEXT NOT NULL, created_at INTEGER NOT NULL, FOREIGN KEY(manga_id) REFERENCES manga(manga_id) ON UPDATE NO ACTION ON DELETE CASCADE)") diff --git a/app/src/main/java/org/koitharu/kotatsu/core/github/GithubModule.kt b/app/src/main/java/org/koitharu/kotatsu/core/github/GithubModule.kt new file mode 100644 index 000000000..de5256337 --- /dev/null +++ b/app/src/main/java/org/koitharu/kotatsu/core/github/GithubModule.kt @@ -0,0 +1,10 @@ +package org.koitharu.kotatsu.core.github + +import org.koin.dsl.module + +val githubModule + get() = module { + single { + GithubRepository(get()) + } + } \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/core/github/GithubRepository.kt b/app/src/main/java/org/koitharu/kotatsu/core/github/GithubRepository.kt index 0828f1155..b7b3e110e 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/github/GithubRepository.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/github/GithubRepository.kt @@ -2,14 +2,10 @@ package org.koitharu.kotatsu.core.github import okhttp3.OkHttpClient import okhttp3.Request -import org.koin.core.component.KoinComponent -import org.koin.core.component.inject import org.koitharu.kotatsu.utils.ext.await import org.koitharu.kotatsu.utils.ext.parseJson -class GithubRepository : KoinComponent { - - private val okHttp by inject() +class GithubRepository(private val okHttp: OkHttpClient) { suspend fun getLatestVersion(): AppVersion { val request = Request.Builder() diff --git a/app/src/main/java/org/koitharu/kotatsu/core/local/CbzFilter.kt b/app/src/main/java/org/koitharu/kotatsu/core/local/CbzFilter.kt index 0cdd9b914..3080f1fb9 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/local/CbzFilter.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/local/CbzFilter.kt @@ -2,9 +2,12 @@ package org.koitharu.kotatsu.core.local import java.io.File import java.io.FilenameFilter +import java.util.* class CbzFilter : FilenameFilter { - override fun accept(dir: File, name: String) = - name.endsWith(".cbz", ignoreCase = true) || name.endsWith(".zip", ignoreCase = true) + override fun accept(dir: File, name: String): Boolean { + val ext = name.substringAfterLast('.', "").toLowerCase(Locale.ROOT) + return ext == "cbz" || ext == "zip" + } } \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/core/network/NetworkModule.kt b/app/src/main/java/org/koitharu/kotatsu/core/network/NetworkModule.kt new file mode 100644 index 000000000..32a5d922e --- /dev/null +++ b/app/src/main/java/org/koitharu/kotatsu/core/network/NetworkModule.kt @@ -0,0 +1,32 @@ +package org.koitharu.kotatsu.core.network + +import okhttp3.CookieJar +import okhttp3.OkHttpClient +import org.koin.android.ext.koin.androidContext +import org.koin.dsl.module +import org.koitharu.kotatsu.core.network.cookies.PersistentCookieJar +import org.koitharu.kotatsu.core.network.cookies.cache.SetCookieCache +import org.koitharu.kotatsu.core.network.cookies.persistence.SharedPrefsCookiePersistor +import org.koitharu.kotatsu.core.parser.UserAgentInterceptor +import org.koitharu.kotatsu.utils.CacheUtils +import java.util.concurrent.TimeUnit + +val networkModule + get() = module { + single { + PersistentCookieJar( + SetCookieCache(), + SharedPrefsCookiePersistor(androidContext()) + ) + } + single { + OkHttpClient.Builder().apply { + connectTimeout(20, TimeUnit.SECONDS) + readTimeout(60, TimeUnit.SECONDS) + writeTimeout(20, TimeUnit.SECONDS) + cookieJar(get()) + cache(CacheUtils.createHttpCache(androidContext())) + addInterceptor(UserAgentInterceptor()) + }.build() + } + } \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/core/local/cookies/ClearableCookieJar.kt b/app/src/main/java/org/koitharu/kotatsu/core/network/cookies/ClearableCookieJar.kt similarity index 95% rename from app/src/main/java/org/koitharu/kotatsu/core/local/cookies/ClearableCookieJar.kt rename to app/src/main/java/org/koitharu/kotatsu/core/network/cookies/ClearableCookieJar.kt index 9f93debf3..ced957752 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/local/cookies/ClearableCookieJar.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/network/cookies/ClearableCookieJar.kt @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.koitharu.kotatsu.core.local.cookies +package org.koitharu.kotatsu.core.network.cookies import okhttp3.CookieJar diff --git a/app/src/main/java/org/koitharu/kotatsu/core/local/cookies/PersistentCookieJar.kt b/app/src/main/java/org/koitharu/kotatsu/core/network/cookies/PersistentCookieJar.kt similarity index 91% rename from app/src/main/java/org/koitharu/kotatsu/core/local/cookies/PersistentCookieJar.kt rename to app/src/main/java/org/koitharu/kotatsu/core/network/cookies/PersistentCookieJar.kt index 0ce55d1a6..4761051ff 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/local/cookies/PersistentCookieJar.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/network/cookies/PersistentCookieJar.kt @@ -13,12 +13,12 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.koitharu.kotatsu.core.local.cookies +package org.koitharu.kotatsu.core.network.cookies import okhttp3.Cookie import okhttp3.HttpUrl -import org.koitharu.kotatsu.core.local.cookies.cache.CookieCache -import org.koitharu.kotatsu.core.local.cookies.persistence.CookiePersistor +import org.koitharu.kotatsu.core.network.cookies.cache.CookieCache +import org.koitharu.kotatsu.core.network.cookies.persistence.CookiePersistor import java.util.* class PersistentCookieJar( diff --git a/app/src/main/java/org/koitharu/kotatsu/core/local/cookies/cache/CookieCache.kt b/app/src/main/java/org/koitharu/kotatsu/core/network/cookies/cache/CookieCache.kt similarity index 94% rename from app/src/main/java/org/koitharu/kotatsu/core/local/cookies/cache/CookieCache.kt rename to app/src/main/java/org/koitharu/kotatsu/core/network/cookies/cache/CookieCache.kt index 177d468c0..6eaacb539 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/local/cookies/cache/CookieCache.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/network/cookies/cache/CookieCache.kt @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.koitharu.kotatsu.core.local.cookies.cache +package org.koitharu.kotatsu.core.network.cookies.cache import okhttp3.Cookie diff --git a/app/src/main/java/org/koitharu/kotatsu/core/local/cookies/cache/IdentifiableCookie.kt b/app/src/main/java/org/koitharu/kotatsu/core/network/cookies/cache/IdentifiableCookie.kt similarity index 97% rename from app/src/main/java/org/koitharu/kotatsu/core/local/cookies/cache/IdentifiableCookie.kt rename to app/src/main/java/org/koitharu/kotatsu/core/network/cookies/cache/IdentifiableCookie.kt index 6ff70030e..374697c74 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/local/cookies/cache/IdentifiableCookie.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/network/cookies/cache/IdentifiableCookie.kt @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.koitharu.kotatsu.core.local.cookies.cache +package org.koitharu.kotatsu.core.network.cookies.cache import okhttp3.Cookie import java.util.* diff --git a/app/src/main/java/org/koitharu/kotatsu/core/local/cookies/cache/SetCookieCache.kt b/app/src/main/java/org/koitharu/kotatsu/core/network/cookies/cache/SetCookieCache.kt similarity index 83% rename from app/src/main/java/org/koitharu/kotatsu/core/local/cookies/cache/SetCookieCache.kt rename to app/src/main/java/org/koitharu/kotatsu/core/network/cookies/cache/SetCookieCache.kt index b9c899630..e2c0804d8 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/local/cookies/cache/SetCookieCache.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/network/cookies/cache/SetCookieCache.kt @@ -13,16 +13,17 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.koitharu.kotatsu.core.local.cookies.cache +package org.koitharu.kotatsu.core.network.cookies.cache import okhttp3.Cookie -import org.koitharu.kotatsu.core.local.cookies.cache.IdentifiableCookie.Companion.decorateAll +import org.koitharu.kotatsu.core.network.cookies.cache.IdentifiableCookie.Companion.decorateAll import java.util.* import java.util.concurrent.ConcurrentHashMap class SetCookieCache : CookieCache { - private val cookies: MutableSet = Collections.newSetFromMap(ConcurrentHashMap()) + private val cookies: MutableSet = + Collections.newSetFromMap(ConcurrentHashMap()) override fun addAll(newCookies: Collection) { for (cookie in decorateAll(newCookies)) { diff --git a/app/src/main/java/org/koitharu/kotatsu/core/local/cookies/persistence/CookiePersistor.kt b/app/src/main/java/org/koitharu/kotatsu/core/network/cookies/persistence/CookiePersistor.kt similarity index 94% rename from app/src/main/java/org/koitharu/kotatsu/core/local/cookies/persistence/CookiePersistor.kt rename to app/src/main/java/org/koitharu/kotatsu/core/network/cookies/persistence/CookiePersistor.kt index 197b02b85..fa7b1886a 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/local/cookies/persistence/CookiePersistor.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/network/cookies/persistence/CookiePersistor.kt @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.koitharu.kotatsu.core.local.cookies.persistence +package org.koitharu.kotatsu.core.network.cookies.persistence import okhttp3.Cookie @@ -23,6 +23,7 @@ import okhttp3.Cookie interface CookiePersistor { fun loadAll(): List + /** * Persist all cookies, existing cookies will be overwritten. * diff --git a/app/src/main/java/org/koitharu/kotatsu/core/local/cookies/persistence/SerializableCookie.kt b/app/src/main/java/org/koitharu/kotatsu/core/network/cookies/persistence/SerializableCookie.kt similarity index 97% rename from app/src/main/java/org/koitharu/kotatsu/core/local/cookies/persistence/SerializableCookie.kt rename to app/src/main/java/org/koitharu/kotatsu/core/network/cookies/persistence/SerializableCookie.kt index 88f882633..2feea3450 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/local/cookies/persistence/SerializableCookie.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/network/cookies/persistence/SerializableCookie.kt @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.koitharu.kotatsu.core.local.cookies.persistence +package org.koitharu.kotatsu.core.network.cookies.persistence import android.util.Log import okhttp3.Cookie @@ -49,7 +49,8 @@ class SerializableCookie : Serializable { fun decode(encodedCookie: String): Cookie? { val bytes = hexStringToByteArray(encodedCookie) val byteArrayInputStream = ByteArrayInputStream( - bytes) + bytes + ) var cookie: Cookie? = null var objectInputStream: ObjectInputStream? = null try { @@ -107,6 +108,7 @@ class SerializableCookie : Serializable { const val serialVersionUID = -8594045714036645534L private const val NON_VALID_EXPIRES_AT = -1L + /** * Using some super basic byte array <-> hex conversions so we don't * have to rely on any large Base64 libraries. Can be overridden if you @@ -141,7 +143,7 @@ class SerializableCookie : Serializable { var i = 0 while (i < len) { data[i / 2] = ((Character.digit(hexString[i], 16) shl 4) + Character - .digit(hexString[i + 1], 16)).toByte() + .digit(hexString[i + 1], 16)).toByte() i += 2 } return data diff --git a/app/src/main/java/org/koitharu/kotatsu/core/local/cookies/persistence/SharedPrefsCookiePersistor.kt b/app/src/main/java/org/koitharu/kotatsu/core/network/cookies/persistence/SharedPrefsCookiePersistor.kt similarity index 91% rename from app/src/main/java/org/koitharu/kotatsu/core/local/cookies/persistence/SharedPrefsCookiePersistor.kt rename to app/src/main/java/org/koitharu/kotatsu/core/network/cookies/persistence/SharedPrefsCookiePersistor.kt index 044180bb4..2a80a19b1 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/local/cookies/persistence/SharedPrefsCookiePersistor.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/network/cookies/persistence/SharedPrefsCookiePersistor.kt @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.koitharu.kotatsu.core.local.cookies.persistence +package org.koitharu.kotatsu.core.network.cookies.persistence import android.annotation.SuppressLint import android.content.Context @@ -25,7 +25,12 @@ import java.util.* class SharedPrefsCookiePersistor(private val sharedPreferences: SharedPreferences) : CookiePersistor { - constructor(context: Context) : this(context.getSharedPreferences("cookies", Context.MODE_PRIVATE)) + constructor(context: Context) : this( + context.getSharedPreferences( + "cookies", + Context.MODE_PRIVATE + ) + ) override fun loadAll(): List { val cookies: MutableList = ArrayList(sharedPreferences.all.size) diff --git a/app/src/main/java/org/koitharu/kotatsu/core/parser/ParserModule.kt b/app/src/main/java/org/koitharu/kotatsu/core/parser/ParserModule.kt new file mode 100644 index 000000000..14cddf3b7 --- /dev/null +++ b/app/src/main/java/org/koitharu/kotatsu/core/parser/ParserModule.kt @@ -0,0 +1,9 @@ +package org.koitharu.kotatsu.core.parser + +import org.koin.dsl.bind +import org.koin.dsl.module + +val parserModule + get() = module { + single { LocalMangaRepository() } bind MangaRepository::class + } \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/core/parser/UserAgentInterceptor.kt b/app/src/main/java/org/koitharu/kotatsu/core/parser/UserAgentInterceptor.kt index dd00cfdc2..7d2e73d1a 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/parser/UserAgentInterceptor.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/parser/UserAgentInterceptor.kt @@ -1,13 +1,11 @@ package org.koitharu.kotatsu.core.parser -import android.annotation.SuppressLint import android.os.Build import okhttp3.Interceptor import org.koitharu.kotatsu.BuildConfig import java.util.* -@SuppressLint("ConstantLocale") -object UserAgentInterceptor : Interceptor { +class UserAgentInterceptor : Interceptor { private val userAgent = "Kotatsu/%s (Android %s; %s; %s %s; %s)".format( BuildConfig.VERSION_NAME, diff --git a/app/src/main/java/org/koitharu/kotatsu/domain/MangaDataRepository.kt b/app/src/main/java/org/koitharu/kotatsu/domain/MangaDataRepository.kt index adbb3b59f..5be65ce1c 100644 --- a/app/src/main/java/org/koitharu/kotatsu/domain/MangaDataRepository.kt +++ b/app/src/main/java/org/koitharu/kotatsu/domain/MangaDataRepository.kt @@ -1,8 +1,6 @@ package org.koitharu.kotatsu.domain import androidx.room.withTransaction -import org.koin.core.component.KoinComponent -import org.koin.core.component.inject import org.koitharu.kotatsu.core.db.MangaDatabase import org.koitharu.kotatsu.core.db.entity.MangaEntity import org.koitharu.kotatsu.core.db.entity.MangaPrefsEntity @@ -10,9 +8,7 @@ import org.koitharu.kotatsu.core.db.entity.TagEntity import org.koitharu.kotatsu.core.model.Manga import org.koitharu.kotatsu.core.prefs.ReaderMode -class MangaDataRepository : KoinComponent { - - private val db: MangaDatabase by inject() +class MangaDataRepository(private val db: MangaDatabase) { suspend fun savePreferences(manga: Manga, mode: ReaderMode) { val tags = manga.tags.map(TagEntity.Companion::fromMangaTag) diff --git a/app/src/main/java/org/koitharu/kotatsu/domain/MangaProviderFactory.kt b/app/src/main/java/org/koitharu/kotatsu/domain/MangaProviderFactory.kt index e5d109c77..7cbb93647 100644 --- a/app/src/main/java/org/koitharu/kotatsu/domain/MangaProviderFactory.kt +++ b/app/src/main/java/org/koitharu/kotatsu/domain/MangaProviderFactory.kt @@ -34,6 +34,7 @@ object MangaProviderFactory : KoinComponent { } } + @Deprecated("Use DI") fun createLocal(): LocalMangaRepository { var instance = cache[MangaSource.LOCAL]?.get() if (instance == null) { diff --git a/app/src/main/java/org/koitharu/kotatsu/domain/MangaSearchRepository.kt b/app/src/main/java/org/koitharu/kotatsu/domain/MangaSearchRepository.kt index 10dbdf72d..c45c4e967 100644 --- a/app/src/main/java/org/koitharu/kotatsu/domain/MangaSearchRepository.kt +++ b/app/src/main/java/org/koitharu/kotatsu/domain/MangaSearchRepository.kt @@ -2,13 +2,12 @@ package org.koitharu.kotatsu.domain import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.flow -import org.koin.core.component.KoinComponent import org.koitharu.kotatsu.core.model.Manga import org.koitharu.kotatsu.core.model.MangaSource import org.koitharu.kotatsu.core.model.SortOrder import java.util.* -class MangaSearchRepository : KoinComponent { +class MangaSearchRepository { fun globalSearch(query: String, batchSize: Int = 4): Flow> = flow { val sources = MangaProviderFactory.getSources(false) diff --git a/app/src/main/java/org/koitharu/kotatsu/domain/favourites/FavouritesRepository.kt b/app/src/main/java/org/koitharu/kotatsu/domain/favourites/FavouritesRepository.kt index 059c91563..b6444a3ff 100644 --- a/app/src/main/java/org/koitharu/kotatsu/domain/favourites/FavouritesRepository.kt +++ b/app/src/main/java/org/koitharu/kotatsu/domain/favourites/FavouritesRepository.kt @@ -4,8 +4,6 @@ import androidx.collection.ArraySet import androidx.room.withTransaction import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext -import org.koin.core.component.KoinComponent -import org.koin.core.component.inject import org.koitharu.kotatsu.core.db.MangaDatabase import org.koitharu.kotatsu.core.db.entity.FavouriteCategoryEntity import org.koitharu.kotatsu.core.db.entity.FavouriteEntity @@ -14,9 +12,7 @@ import org.koitharu.kotatsu.core.db.entity.TagEntity import org.koitharu.kotatsu.core.model.FavouriteCategory import org.koitharu.kotatsu.core.model.Manga -class FavouritesRepository : KoinComponent { - - private val db: MangaDatabase by inject() +class FavouritesRepository(private val db: MangaDatabase) { suspend fun getAllManga(): List { val entities = db.favouritesDao.findAll() diff --git a/app/src/main/java/org/koitharu/kotatsu/domain/favourites/OnFavouritesChangeListener.kt b/app/src/main/java/org/koitharu/kotatsu/domain/favourites/OnFavouritesChangeListener.kt index 5021e96d7..8796b4439 100644 --- a/app/src/main/java/org/koitharu/kotatsu/domain/favourites/OnFavouritesChangeListener.kt +++ b/app/src/main/java/org/koitharu/kotatsu/domain/favourites/OnFavouritesChangeListener.kt @@ -1,8 +1,8 @@ package org.koitharu.kotatsu.domain.favourites -interface OnFavouritesChangeListener { +fun interface OnFavouritesChangeListener { fun onFavouritesChanged(mangaId: Long) - fun onCategoriesChanged() + fun onCategoriesChanged() = Unit } \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/domain/history/HistoryRepository.kt b/app/src/main/java/org/koitharu/kotatsu/domain/history/HistoryRepository.kt index d374b21d3..3dde43d1a 100644 --- a/app/src/main/java/org/koitharu/kotatsu/domain/history/HistoryRepository.kt +++ b/app/src/main/java/org/koitharu/kotatsu/domain/history/HistoryRepository.kt @@ -14,10 +14,9 @@ import org.koitharu.kotatsu.core.model.Manga import org.koitharu.kotatsu.core.model.MangaHistory import org.koitharu.kotatsu.domain.tracking.TrackingRepository -class HistoryRepository : KoinComponent { +class HistoryRepository(private val db: MangaDatabase) : KoinComponent { - private val db: MangaDatabase by inject() - private val trackingRepository by lazy(::TrackingRepository) + private val trackingRepository by inject() suspend fun getList(offset: Int, limit: Int = 20): List { val entities = db.historyDao.findAll(offset, limit) diff --git a/app/src/main/java/org/koitharu/kotatsu/domain/tracking/TrackingRepository.kt b/app/src/main/java/org/koitharu/kotatsu/domain/tracking/TrackingRepository.kt index e9dff68cf..1947f19c8 100644 --- a/app/src/main/java/org/koitharu/kotatsu/domain/tracking/TrackingRepository.kt +++ b/app/src/main/java/org/koitharu/kotatsu/domain/tracking/TrackingRepository.kt @@ -1,8 +1,6 @@ package org.koitharu.kotatsu.domain.tracking import androidx.room.withTransaction -import org.koin.core.component.KoinComponent -import org.koin.core.component.inject import org.koitharu.kotatsu.core.db.MangaDatabase import org.koitharu.kotatsu.core.db.entity.TrackEntity import org.koitharu.kotatsu.core.db.entity.TrackLogEntity @@ -10,9 +8,7 @@ import org.koitharu.kotatsu.core.model.* import org.koitharu.kotatsu.domain.MangaProviderFactory import java.util.* -class TrackingRepository : KoinComponent { - - private val db: MangaDatabase by inject() +class TrackingRepository(private val db: MangaDatabase) { suspend fun getNewChaptersCount(mangaId: Long): Int { val entity = db.tracksDao.find(mangaId) ?: return 0 diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/common/AlertDialogFragment.kt b/app/src/main/java/org/koitharu/kotatsu/ui/base/AlertDialogFragment.kt similarity index 77% rename from app/src/main/java/org/koitharu/kotatsu/ui/common/AlertDialogFragment.kt rename to app/src/main/java/org/koitharu/kotatsu/ui/base/AlertDialogFragment.kt index 8154dc348..cdc3633a6 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/common/AlertDialogFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/base/AlertDialogFragment.kt @@ -1,14 +1,17 @@ -package org.koitharu.kotatsu.ui.common +package org.koitharu.kotatsu.ui.base import android.app.Dialog import android.os.Bundle import android.view.View +import androidx.annotation.CallSuper import androidx.annotation.LayoutRes import androidx.appcompat.app.AlertDialog import com.google.android.material.dialog.MaterialAlertDialogBuilder import moxy.MvpAppCompatDialogFragment -abstract class AlertDialogFragment(@LayoutRes private val layoutResId: Int) : MvpAppCompatDialogFragment() { +abstract class AlertDialogFragment( + @LayoutRes private val layoutResId: Int +) : MvpAppCompatDialogFragment() { private var rootView: View? = null @@ -24,12 +27,13 @@ abstract class AlertDialogFragment(@LayoutRes private val layoutResId: Int) : Mv .create() } + @CallSuper override fun onDestroyView() { rootView = null super.onDestroyView() } - override fun getView(): View? { + final override fun getView(): View? { return rootView } diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/common/BaseActivity.kt b/app/src/main/java/org/koitharu/kotatsu/ui/base/BaseActivity.kt similarity index 94% rename from app/src/main/java/org/koitharu/kotatsu/ui/common/BaseActivity.kt rename to app/src/main/java/org/koitharu/kotatsu/ui/base/BaseActivity.kt index 996f26d94..eb4f3565e 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/common/BaseActivity.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/base/BaseActivity.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.ui.common +package org.koitharu.kotatsu.ui.base import android.view.MenuItem import android.view.View diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/common/BaseBottomSheet.kt b/app/src/main/java/org/koitharu/kotatsu/ui/base/BaseBottomSheet.kt similarity index 91% rename from app/src/main/java/org/koitharu/kotatsu/ui/common/BaseBottomSheet.kt rename to app/src/main/java/org/koitharu/kotatsu/ui/base/BaseBottomSheet.kt index 090d58c3b..4faa58305 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/common/BaseBottomSheet.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/base/BaseBottomSheet.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.ui.common +package org.koitharu.kotatsu.ui.base import android.app.Dialog import android.os.Bundle @@ -13,7 +13,7 @@ import org.koitharu.kotatsu.utils.UiUtils abstract class BaseBottomSheet(@LayoutRes private val layoutResId: Int) : MvpBottomSheetDialogFragment() { - override fun onCreateView( + final override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/common/BaseFragment.kt b/app/src/main/java/org/koitharu/kotatsu/ui/base/BaseFragment.kt similarity index 69% rename from app/src/main/java/org/koitharu/kotatsu/ui/common/BaseFragment.kt rename to app/src/main/java/org/koitharu/kotatsu/ui/base/BaseFragment.kt index d7711a2e3..2ca06c78d 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/common/BaseFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/base/BaseFragment.kt @@ -1,14 +1,19 @@ -package org.koitharu.kotatsu.ui.common +package org.koitharu.kotatsu.ui.base import android.content.Context import android.os.Parcelable import androidx.annotation.LayoutRes +import coil.ImageLoader import moxy.MvpAppCompatFragment +import org.koin.android.ext.android.inject import org.koitharu.kotatsu.utils.delegates.ParcelableArgumentDelegate import org.koitharu.kotatsu.utils.delegates.StringArgumentDelegate -abstract class BaseFragment(@LayoutRes contentLayoutId: Int) : - MvpAppCompatFragment(contentLayoutId) { +abstract class BaseFragment( + @LayoutRes contentLayoutId: Int +) : MvpAppCompatFragment(contentLayoutId) { + + protected val coil by inject() fun stringArg(name: String) = StringArgumentDelegate(name) diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/common/BaseFullscreenActivity.kt b/app/src/main/java/org/koitharu/kotatsu/ui/base/BaseFullscreenActivity.kt similarity index 83% rename from app/src/main/java/org/koitharu/kotatsu/ui/common/BaseFullscreenActivity.kt rename to app/src/main/java/org/koitharu/kotatsu/ui/base/BaseFullscreenActivity.kt index f51235f31..5528576ea 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/common/BaseFullscreenActivity.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/base/BaseFullscreenActivity.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.ui.common +package org.koitharu.kotatsu.ui.base import android.graphics.Color import android.os.Build @@ -12,11 +12,11 @@ abstract class BaseFullscreenActivity : BaseActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) with(window) { - // addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS) statusBarColor = Color.TRANSPARENT navigationBarColor = Color.TRANSPARENT if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { - attributes.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES + attributes.layoutInDisplayCutoutMode = + WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES } } showSystemUI() diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/common/BaseMvpView.kt b/app/src/main/java/org/koitharu/kotatsu/ui/base/BaseMvpView.kt similarity index 86% rename from app/src/main/java/org/koitharu/kotatsu/ui/common/BaseMvpView.kt rename to app/src/main/java/org/koitharu/kotatsu/ui/base/BaseMvpView.kt index 7189baff5..da4a75439 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/common/BaseMvpView.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/base/BaseMvpView.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.ui.common +package org.koitharu.kotatsu.ui.base import moxy.MvpView import moxy.viewstate.strategy.alias.AddToEndSingle diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/common/BasePreferenceFragment.kt b/app/src/main/java/org/koitharu/kotatsu/ui/base/BasePreferenceFragment.kt similarity index 93% rename from app/src/main/java/org/koitharu/kotatsu/ui/common/BasePreferenceFragment.kt rename to app/src/main/java/org/koitharu/kotatsu/ui/base/BasePreferenceFragment.kt index 862aa94b9..f7ebbb69f 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/common/BasePreferenceFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/base/BasePreferenceFragment.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.ui.common +package org.koitharu.kotatsu.ui.base import androidx.annotation.StringRes import androidx.preference.Preference diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/common/BasePresenter.kt b/app/src/main/java/org/koitharu/kotatsu/ui/base/BasePresenter.kt similarity index 96% rename from app/src/main/java/org/koitharu/kotatsu/ui/common/BasePresenter.kt rename to app/src/main/java/org/koitharu/kotatsu/ui/base/BasePresenter.kt index 087a6bd70..a267efd03 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/common/BasePresenter.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/base/BasePresenter.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.ui.common +package org.koitharu.kotatsu.ui.base import kotlinx.coroutines.* import moxy.MvpPresenter diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/common/BaseService.kt b/app/src/main/java/org/koitharu/kotatsu/ui/base/BaseService.kt similarity index 55% rename from app/src/main/java/org/koitharu/kotatsu/ui/common/BaseService.kt rename to app/src/main/java/org/koitharu/kotatsu/ui/base/BaseService.kt index 6ab2cd307..b9ab215da 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/common/BaseService.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/base/BaseService.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.ui.common +package org.koitharu.kotatsu.ui.base import android.app.Service import android.content.Intent @@ -7,18 +7,16 @@ import androidx.annotation.CallSuper import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.SupervisorJob -import kotlin.coroutines.CoroutineContext +import kotlinx.coroutines.cancel -abstract class BaseService : Service(), CoroutineScope { +abstract class BaseService : Service() { - private val job = SupervisorJob() - - final override val coroutineContext: CoroutineContext - get() = Dispatchers.Main.immediate + job + @Suppress("MemberVisibilityCanBePrivate") + val serviceScope = CoroutineScope(SupervisorJob() + Dispatchers.Main.immediate) @CallSuper override fun onDestroy() { - job.cancel() + serviceScope.cancel() super.onDestroy() } diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/common/ChipsFactory.kt b/app/src/main/java/org/koitharu/kotatsu/ui/base/ChipsFactory.kt similarity index 75% rename from app/src/main/java/org/koitharu/kotatsu/ui/common/ChipsFactory.kt rename to app/src/main/java/org/koitharu/kotatsu/ui/base/ChipsFactory.kt index 1b8a773ae..9120721a5 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/common/ChipsFactory.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/base/ChipsFactory.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.ui.common +package org.koitharu.kotatsu.ui.base import android.content.Context import android.view.View @@ -8,8 +8,10 @@ import org.koitharu.kotatsu.utils.ext.getThemeColor class ChipsFactory(val context: Context) { - fun create(convertView: Chip? = null, text: CharSequence, @DrawableRes iconRes: Int = 0, - tag: Any? = null, onClickListener: View.OnClickListener? = null): Chip { + fun create( + convertView: Chip? = null, text: CharSequence, @DrawableRes iconRes: Int = 0, + tag: Any? = null, onClickListener: View.OnClickListener? = null + ): Chip { val chip = convertView ?: Chip(context).apply { setTextColor(context.getThemeColor(android.R.attr.textColorPrimary)) isCloseIconVisible = false diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/common/SharedPresenterHolder.kt b/app/src/main/java/org/koitharu/kotatsu/ui/base/SharedPresenterHolder.kt similarity index 92% rename from app/src/main/java/org/koitharu/kotatsu/ui/common/SharedPresenterHolder.kt rename to app/src/main/java/org/koitharu/kotatsu/ui/base/SharedPresenterHolder.kt index 05b676d5d..130008862 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/common/SharedPresenterHolder.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/base/SharedPresenterHolder.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.ui.common +package org.koitharu.kotatsu.ui.base import android.util.ArrayMap import moxy.MvpPresenter diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/common/dialog/CheckBoxAlertDialog.kt b/app/src/main/java/org/koitharu/kotatsu/ui/base/dialog/CheckBoxAlertDialog.kt similarity index 97% rename from app/src/main/java/org/koitharu/kotatsu/ui/common/dialog/CheckBoxAlertDialog.kt rename to app/src/main/java/org/koitharu/kotatsu/ui/base/dialog/CheckBoxAlertDialog.kt index e647614cd..3a56aed74 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/common/dialog/CheckBoxAlertDialog.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/base/dialog/CheckBoxAlertDialog.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.ui.common.dialog +package org.koitharu.kotatsu.ui.base.dialog import android.annotation.SuppressLint import android.content.Context diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/common/dialog/StorageSelectDialog.kt b/app/src/main/java/org/koitharu/kotatsu/ui/base/dialog/StorageSelectDialog.kt similarity index 98% rename from app/src/main/java/org/koitharu/kotatsu/ui/common/dialog/StorageSelectDialog.kt rename to app/src/main/java/org/koitharu/kotatsu/ui/base/dialog/StorageSelectDialog.kt index e718bb27c..bfcc37f58 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/common/dialog/StorageSelectDialog.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/base/dialog/StorageSelectDialog.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.ui.common.dialog +package org.koitharu.kotatsu.ui.base.dialog import android.content.Context import android.content.DialogInterface diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/common/dialog/TextInputDialog.kt b/app/src/main/java/org/koitharu/kotatsu/ui/base/dialog/TextInputDialog.kt similarity index 89% rename from app/src/main/java/org/koitharu/kotatsu/ui/common/dialog/TextInputDialog.kt rename to app/src/main/java/org/koitharu/kotatsu/ui/base/dialog/TextInputDialog.kt index d4e4f3d8a..f78ef32c1 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/common/dialog/TextInputDialog.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/base/dialog/TextInputDialog.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.ui.common.dialog +package org.koitharu.kotatsu.ui.base.dialog import android.annotation.SuppressLint import android.content.Context @@ -11,15 +11,17 @@ import com.google.android.material.dialog.MaterialAlertDialogBuilder import kotlinx.android.synthetic.main.dialog_input.view.* import org.koitharu.kotatsu.R -class TextInputDialog private constructor(private val delegate: AlertDialog) : - DialogInterface by delegate { +class TextInputDialog private constructor( + private val delegate: AlertDialog +) : DialogInterface by delegate { fun show() = delegate.show() class Builder(context: Context) { @SuppressLint("InflateParams") - private val view = LayoutInflater.from(context).inflate(R.layout.dialog_input, null, false) + private val view = LayoutInflater.from(context) + .inflate(R.layout.dialog_input, null, false) private val delegate = MaterialAlertDialogBuilder(context) .setView(view) diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/common/list/AdapterUpdater.kt b/app/src/main/java/org/koitharu/kotatsu/ui/base/list/AdapterUpdater.kt similarity index 94% rename from app/src/main/java/org/koitharu/kotatsu/ui/common/list/AdapterUpdater.kt rename to app/src/main/java/org/koitharu/kotatsu/ui/base/list/AdapterUpdater.kt index 60a9242c4..f0e982c4a 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/common/list/AdapterUpdater.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/base/list/AdapterUpdater.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.ui.common.list +package org.koitharu.kotatsu.ui.base.list import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.RecyclerView diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/common/list/BaseRecyclerAdapter.kt b/app/src/main/java/org/koitharu/kotatsu/ui/base/list/BaseRecyclerAdapter.kt similarity index 95% rename from app/src/main/java/org/koitharu/kotatsu/ui/common/list/BaseRecyclerAdapter.kt rename to app/src/main/java/org/koitharu/kotatsu/ui/base/list/BaseRecyclerAdapter.kt index e5fa1da0b..ca8245603 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/common/list/BaseRecyclerAdapter.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/base/list/BaseRecyclerAdapter.kt @@ -1,8 +1,7 @@ -package org.koitharu.kotatsu.ui.common.list +package org.koitharu.kotatsu.ui.base.list import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView -import okhttp3.internal.toImmutableList import org.koin.core.component.KoinComponent import org.koitharu.kotatsu.utils.ext.replaceWith @@ -12,7 +11,7 @@ abstract class BaseRecyclerAdapter(private val onItemClickListener: OnRecy protected val dataSet = ArrayList() //TODO make private - val items get() = dataSet.toImmutableList() + val items get() = dataSet as List val hasItems get() = dataSet.isNotEmpty() diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/common/list/BaseViewHolder.kt b/app/src/main/java/org/koitharu/kotatsu/ui/base/list/BaseViewHolder.kt similarity index 97% rename from app/src/main/java/org/koitharu/kotatsu/ui/common/list/BaseViewHolder.kt rename to app/src/main/java/org/koitharu/kotatsu/ui/base/list/BaseViewHolder.kt index 44185f22e..4de7c3f91 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/common/list/BaseViewHolder.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/base/list/BaseViewHolder.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.ui.common.list +package org.koitharu.kotatsu.ui.base.list import android.view.View import android.view.ViewGroup diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/common/list/BoundsScrollListener.kt b/app/src/main/java/org/koitharu/kotatsu/ui/base/list/BoundsScrollListener.kt similarity index 95% rename from app/src/main/java/org/koitharu/kotatsu/ui/common/list/BoundsScrollListener.kt rename to app/src/main/java/org/koitharu/kotatsu/ui/base/list/BoundsScrollListener.kt index a97dfce74..79b7f55ca 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/common/list/BoundsScrollListener.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/base/list/BoundsScrollListener.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.ui.common.list +package org.koitharu.kotatsu.ui.base.list import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/common/list/OnRecyclerItemClickListener.kt b/app/src/main/java/org/koitharu/kotatsu/ui/base/list/OnRecyclerItemClickListener.kt similarity index 80% rename from app/src/main/java/org/koitharu/kotatsu/ui/common/list/OnRecyclerItemClickListener.kt rename to app/src/main/java/org/koitharu/kotatsu/ui/base/list/OnRecyclerItemClickListener.kt index de1143d2d..6d6f659d1 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/common/list/OnRecyclerItemClickListener.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/base/list/OnRecyclerItemClickListener.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.ui.common.list +package org.koitharu.kotatsu.ui.base.list import android.view.View diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/common/list/PaginationScrollListener.kt b/app/src/main/java/org/koitharu/kotatsu/ui/base/list/PaginationScrollListener.kt similarity index 93% rename from app/src/main/java/org/koitharu/kotatsu/ui/common/list/PaginationScrollListener.kt rename to app/src/main/java/org/koitharu/kotatsu/ui/base/list/PaginationScrollListener.kt index 0ffa5353f..4395da3fa 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/common/list/PaginationScrollListener.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/base/list/PaginationScrollListener.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.ui.common.list +package org.koitharu.kotatsu.ui.base.list import androidx.recyclerview.widget.RecyclerView diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/common/list/ProgressBarAdapter.kt b/app/src/main/java/org/koitharu/kotatsu/ui/base/list/ProgressBarAdapter.kt similarity index 91% rename from app/src/main/java/org/koitharu/kotatsu/ui/common/list/ProgressBarAdapter.kt rename to app/src/main/java/org/koitharu/kotatsu/ui/base/list/ProgressBarAdapter.kt index b3adbaf23..a589c92c7 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/common/list/ProgressBarAdapter.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/base/list/ProgressBarAdapter.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.ui.common.list +package org.koitharu.kotatsu.ui.base.list import android.view.ViewGroup diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/common/list/ProgressBarHolder.kt b/app/src/main/java/org/koitharu/kotatsu/ui/base/list/ProgressBarHolder.kt similarity index 94% rename from app/src/main/java/org/koitharu/kotatsu/ui/common/list/ProgressBarHolder.kt rename to app/src/main/java/org/koitharu/kotatsu/ui/base/list/ProgressBarHolder.kt index 6cc0f5e46..87070c7d3 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/common/list/ProgressBarHolder.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/base/list/ProgressBarHolder.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.ui.common.list +package org.koitharu.kotatsu.ui.base.list import android.view.View import android.view.ViewGroup diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/common/list/decor/ItemTypeDividerDecoration.kt b/app/src/main/java/org/koitharu/kotatsu/ui/base/list/decor/ItemTypeDividerDecoration.kt similarity index 97% rename from app/src/main/java/org/koitharu/kotatsu/ui/common/list/decor/ItemTypeDividerDecoration.kt rename to app/src/main/java/org/koitharu/kotatsu/ui/base/list/decor/ItemTypeDividerDecoration.kt index d4920f9fe..2ed17fd9f 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/common/list/decor/ItemTypeDividerDecoration.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/base/list/decor/ItemTypeDividerDecoration.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.ui.common.list.decor +package org.koitharu.kotatsu.ui.base.list.decor import android.content.Context import android.graphics.Canvas diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/common/list/decor/SectionItemDecoration.kt b/app/src/main/java/org/koitharu/kotatsu/ui/base/list/decor/SectionItemDecoration.kt similarity index 98% rename from app/src/main/java/org/koitharu/kotatsu/ui/common/list/decor/SectionItemDecoration.kt rename to app/src/main/java/org/koitharu/kotatsu/ui/base/list/decor/SectionItemDecoration.kt index 7b5f383f6..0fb82c73b 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/common/list/decor/SectionItemDecoration.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/base/list/decor/SectionItemDecoration.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.ui.common.list.decor +package org.koitharu.kotatsu.ui.base.list.decor import android.graphics.Canvas import android.graphics.Rect diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/common/list/decor/SpacingItemDecoration.kt b/app/src/main/java/org/koitharu/kotatsu/ui/base/list/decor/SpacingItemDecoration.kt similarity index 93% rename from app/src/main/java/org/koitharu/kotatsu/ui/common/list/decor/SpacingItemDecoration.kt rename to app/src/main/java/org/koitharu/kotatsu/ui/base/list/decor/SpacingItemDecoration.kt index 3305bfde3..1fe6d1a34 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/common/list/decor/SpacingItemDecoration.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/base/list/decor/SpacingItemDecoration.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.ui.common.list.decor +package org.koitharu.kotatsu.ui.base.list.decor import android.graphics.Rect import android.view.View diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/base/uiModule.kt b/app/src/main/java/org/koitharu/kotatsu/ui/base/uiModule.kt new file mode 100644 index 000000000..d4706cc3f --- /dev/null +++ b/app/src/main/java/org/koitharu/kotatsu/ui/base/uiModule.kt @@ -0,0 +1,21 @@ +package org.koitharu.kotatsu.ui.base + +import coil.ComponentRegistry +import coil.ImageLoader +import okhttp3.OkHttpClient +import org.koin.android.ext.koin.androidContext +import org.koin.dsl.module +import org.koitharu.kotatsu.core.local.CbzFetcher + +val uiModule + get() = module { + single { + ImageLoader.Builder(androidContext()) + .okHttpClient(get()) + .componentRegistry( + ComponentRegistry.Builder() + .add(CbzFetcher()) + .build() + ).build() + } + } \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/common/widgets/CheckableImageView.kt b/app/src/main/java/org/koitharu/kotatsu/ui/base/widgets/CheckableImageView.kt similarity index 96% rename from app/src/main/java/org/koitharu/kotatsu/ui/common/widgets/CheckableImageView.kt rename to app/src/main/java/org/koitharu/kotatsu/ui/base/widgets/CheckableImageView.kt index 7513e3605..09dc3f97f 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/common/widgets/CheckableImageView.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/base/widgets/CheckableImageView.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.ui.common.widgets +package org.koitharu.kotatsu.ui.base.widgets import android.content.Context import android.util.AttributeSet @@ -61,7 +61,6 @@ class CheckableImageView @JvmOverloads constructor( private companion object { - @JvmStatic private val CHECKED_STATE_SET = intArrayOf(android.R.attr.state_checked) } } \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/common/widgets/CoverImageView.kt b/app/src/main/java/org/koitharu/kotatsu/ui/base/widgets/CoverImageView.kt similarity index 82% rename from app/src/main/java/org/koitharu/kotatsu/ui/common/widgets/CoverImageView.kt rename to app/src/main/java/org/koitharu/kotatsu/ui/base/widgets/CoverImageView.kt index f8878ece7..4b0e4e1bf 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/common/widgets/CoverImageView.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/base/widgets/CoverImageView.kt @@ -1,10 +1,10 @@ -package org.koitharu.kotatsu.ui.common.widgets +package org.koitharu.kotatsu.ui.base.widgets import android.content.Context import android.util.AttributeSet import android.widget.LinearLayout import androidx.appcompat.widget.AppCompatImageView -import androidx.core.content.res.use +import androidx.core.content.withStyledAttributes import org.koitharu.kotatsu.R @@ -15,10 +15,9 @@ class CoverImageView @JvmOverloads constructor( private var orientation: Int = HORIZONTAL init { - context.theme.obtainStyledAttributes(attrs, R.styleable.CoverImageView, defStyleAttr, 0) - .use { - orientation = it.getInt(R.styleable.CoverImageView_android_orientation, HORIZONTAL) - } + context.withStyledAttributes(attrs, R.styleable.CoverImageView, defStyleAttr) { + orientation = getInt(R.styleable.CoverImageView_android_orientation, HORIZONTAL) + } } override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) { diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/common/widgets/SquareLayout.kt b/app/src/main/java/org/koitharu/kotatsu/ui/base/widgets/SquareLayout.kt similarity index 89% rename from app/src/main/java/org/koitharu/kotatsu/ui/common/widgets/SquareLayout.kt rename to app/src/main/java/org/koitharu/kotatsu/ui/base/widgets/SquareLayout.kt index 33cbef26b..3eeb91043 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/common/widgets/SquareLayout.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/base/widgets/SquareLayout.kt @@ -1,4 +1,4 @@ -package org.koitharu.kotatsu.ui.common.widgets +package org.koitharu.kotatsu.ui.base.widgets import android.content.Context import android.util.AttributeSet diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/browser/BrowserActivity.kt b/app/src/main/java/org/koitharu/kotatsu/ui/browser/BrowserActivity.kt index a616b6172..5edd7b5ab 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/browser/BrowserActivity.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/browser/BrowserActivity.kt @@ -11,7 +11,7 @@ import android.view.MenuItem import androidx.core.view.isVisible import kotlinx.android.synthetic.main.activity_browser.* import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.ui.common.BaseActivity +import org.koitharu.kotatsu.ui.base.BaseActivity @SuppressLint("SetJavaScriptEnabled") class BrowserActivity : BaseActivity(), BrowserCallback { diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/details/ChapterHolder.kt b/app/src/main/java/org/koitharu/kotatsu/ui/details/ChapterHolder.kt index 31c5a4043..7afbc88e1 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/details/ChapterHolder.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/details/ChapterHolder.kt @@ -7,7 +7,7 @@ import kotlinx.android.synthetic.main.item_chapter.* import org.koitharu.kotatsu.R import org.koitharu.kotatsu.core.model.MangaChapter import org.koitharu.kotatsu.domain.history.ChapterExtra -import org.koitharu.kotatsu.ui.common.list.BaseViewHolder +import org.koitharu.kotatsu.ui.base.list.BaseViewHolder import org.koitharu.kotatsu.utils.ext.getThemeColor class ChapterHolder(parent: ViewGroup) : diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/details/ChaptersAdapter.kt b/app/src/main/java/org/koitharu/kotatsu/ui/details/ChaptersAdapter.kt index 8127ed0e2..6748b539d 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/details/ChaptersAdapter.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/details/ChaptersAdapter.kt @@ -4,8 +4,8 @@ import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView import org.koitharu.kotatsu.core.model.MangaChapter import org.koitharu.kotatsu.domain.history.ChapterExtra -import org.koitharu.kotatsu.ui.common.list.BaseRecyclerAdapter -import org.koitharu.kotatsu.ui.common.list.OnRecyclerItemClickListener +import org.koitharu.kotatsu.ui.base.list.BaseRecyclerAdapter +import org.koitharu.kotatsu.ui.base.list.OnRecyclerItemClickListener class ChaptersAdapter(onItemClickListener: OnRecyclerItemClickListener) : BaseRecyclerAdapter(onItemClickListener) { diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/details/ChaptersFragment.kt b/app/src/main/java/org/koitharu/kotatsu/ui/details/ChaptersFragment.kt index 7c96faa0c..305ee35ce 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/details/ChaptersFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/details/ChaptersFragment.kt @@ -15,8 +15,8 @@ import kotlinx.android.synthetic.main.fragment_chapters.* import moxy.ktx.moxyPresenter import org.koitharu.kotatsu.R import org.koitharu.kotatsu.core.model.* -import org.koitharu.kotatsu.ui.common.BaseFragment -import org.koitharu.kotatsu.ui.common.list.OnRecyclerItemClickListener +import org.koitharu.kotatsu.ui.base.BaseFragment +import org.koitharu.kotatsu.ui.base.list.OnRecyclerItemClickListener import org.koitharu.kotatsu.ui.download.DownloadService import org.koitharu.kotatsu.ui.reader.ReaderActivity import org.koitharu.kotatsu.utils.ext.resolveDp diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/details/MangaDetailsActivity.kt b/app/src/main/java/org/koitharu/kotatsu/ui/details/MangaDetailsActivity.kt index 12443692e..a4ed4cfd3 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/details/MangaDetailsActivity.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/details/MangaDetailsActivity.kt @@ -26,8 +26,8 @@ import org.koitharu.kotatsu.core.model.FavouriteCategory import org.koitharu.kotatsu.core.model.Manga import org.koitharu.kotatsu.core.model.MangaHistory import org.koitharu.kotatsu.core.model.MangaSource +import org.koitharu.kotatsu.ui.base.BaseActivity import org.koitharu.kotatsu.ui.browser.BrowserActivity -import org.koitharu.kotatsu.ui.common.BaseActivity import org.koitharu.kotatsu.ui.download.DownloadService import org.koitharu.kotatsu.utils.MangaShortcut import org.koitharu.kotatsu.utils.ShareHelper diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/details/MangaDetailsFragment.kt b/app/src/main/java/org/koitharu/kotatsu/ui/details/MangaDetailsFragment.kt index a4a2710ea..8458ad3cc 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/details/MangaDetailsFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/details/MangaDetailsFragment.kt @@ -6,7 +6,6 @@ import androidx.core.net.toUri import androidx.core.text.parseAsHtml import androidx.core.view.isVisible import androidx.lifecycle.lifecycleScope -import coil.load import com.google.android.material.chip.Chip import kotlinx.android.synthetic.main.fragment_details.* import kotlinx.coroutines.Dispatchers @@ -17,15 +16,12 @@ import org.koitharu.kotatsu.R import org.koitharu.kotatsu.core.model.FavouriteCategory import org.koitharu.kotatsu.core.model.Manga import org.koitharu.kotatsu.core.model.MangaHistory -import org.koitharu.kotatsu.ui.common.BaseFragment +import org.koitharu.kotatsu.ui.base.BaseFragment import org.koitharu.kotatsu.ui.list.favourites.categories.select.FavouriteCategoriesDialog import org.koitharu.kotatsu.ui.reader.ReaderActivity import org.koitharu.kotatsu.ui.search.MangaSearchSheet import org.koitharu.kotatsu.utils.FileSizeUtils -import org.koitharu.kotatsu.utils.ext.addChips -import org.koitharu.kotatsu.utils.ext.showPopupMenu -import org.koitharu.kotatsu.utils.ext.textAndVisible -import org.koitharu.kotatsu.utils.ext.toFileOrNull +import org.koitharu.kotatsu.utils.ext.* import kotlin.math.roundToInt class MangaDetailsFragment : BaseFragment(R.layout.fragment_details), MangaDetailsView, @@ -42,11 +38,11 @@ class MangaDetailsFragment : BaseFragment(R.layout.fragment_details), MangaDetai override fun onMangaUpdated(manga: Manga) { this.manga = manga - imageView_cover.load(manga.largeCoverUrl ?: manga.coverUrl) { - fallback(R.drawable.ic_placeholder) - crossfade(true) - lifecycle(this@MangaDetailsFragment) - } + imageView_cover.newImageRequest(manga.largeCoverUrl ?: manga.coverUrl) + .fallback(R.drawable.ic_placeholder) + .crossfade(true) + .lifecycle(this) + .enqueueWith(coil) textView_title.text = manga.title textView_subtitle.textAndVisible = manga.altTitle textView_description.text = manga.description?.parseAsHtml()?.takeUnless(Spanned::isBlank) @@ -138,9 +134,11 @@ class MangaDetailsFragment : BaseFragment(R.layout.fragment_details), MangaDetai } v is Chip -> { when (val tag = v.tag) { - is String -> MangaSearchSheet.show(activity?.supportFragmentManager - ?: childFragmentManager, - manga?.source ?: return, tag) + is String -> MangaSearchSheet.show( + activity?.supportFragmentManager + ?: childFragmentManager, + manga?.source ?: return, tag + ) } } } diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/details/MangaDetailsPresenter.kt b/app/src/main/java/org/koitharu/kotatsu/ui/details/MangaDetailsPresenter.kt index a380926e7..108005347 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/details/MangaDetailsPresenter.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/details/MangaDetailsPresenter.kt @@ -7,6 +7,7 @@ import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import moxy.InjectViewState import moxy.presenterScope +import org.koin.core.component.inject import org.koitharu.kotatsu.BuildConfig import org.koitharu.kotatsu.core.exceptions.MangaNotFoundException import org.koitharu.kotatsu.core.model.Manga @@ -20,8 +21,8 @@ import org.koitharu.kotatsu.domain.favourites.OnFavouritesChangeListener import org.koitharu.kotatsu.domain.history.HistoryRepository import org.koitharu.kotatsu.domain.history.OnHistoryChangeListener import org.koitharu.kotatsu.domain.tracking.TrackingRepository -import org.koitharu.kotatsu.ui.common.BasePresenter -import org.koitharu.kotatsu.ui.common.SharedPresenterHolder +import org.koitharu.kotatsu.ui.base.BasePresenter +import org.koitharu.kotatsu.ui.base.SharedPresenterHolder import org.koitharu.kotatsu.utils.ext.safe import java.io.IOException @@ -29,18 +30,15 @@ import java.io.IOException class MangaDetailsPresenter private constructor(private val key: Int) : BasePresenter(), OnHistoryChangeListener, OnFavouritesChangeListener { - private lateinit var historyRepository: HistoryRepository - private lateinit var favouritesRepository: FavouritesRepository - private lateinit var trackingRepository: TrackingRepository - private lateinit var searchRepository: MangaSearchRepository + private val historyRepository by inject() + private val favouritesRepository by inject() + private val trackingRepository by inject() + private val searchRepository by inject() + private val mangaDataRepository by inject() private var manga: Manga? = null override fun onFirstViewAttach() { - historyRepository = HistoryRepository() - favouritesRepository = FavouritesRepository() - trackingRepository = TrackingRepository() - searchRepository = MangaSearchRepository() super.onFirstViewAttach() HistoryRepository.subscribe(this) FavouritesRepository.subscribe(this) @@ -51,7 +49,7 @@ class MangaDetailsPresenter private constructor(private val key: Int) : viewState.onLoadingStateChanged(true) try { val manga = withContext(Dispatchers.IO) { - MangaDataRepository().findMangaById(id) + mangaDataRepository.findMangaById(id) } ?: throw MangaNotFoundException("Cannot find manga by id") viewState.onMangaUpdated(manga) loadDetails(manga, true) @@ -105,7 +103,7 @@ class MangaDetailsPresenter private constructor(private val key: Int) : val original = repository.getRemoteManga(manga) repository.delete(manga) || throw IOException("Unable to delete file") safe { - HistoryRepository().deleteOrSwap(manga, original) + historyRepository.deleteOrSwap(manga, original) } } viewState.onMangaRemoved(manga) @@ -193,8 +191,6 @@ class MangaDetailsPresenter private constructor(private val key: Int) : } } - override fun onCategoriesChanged() = Unit - override fun onDestroy() { HistoryRepository.unsubscribe(this) FavouritesRepository.unsubscribe(this) diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/details/MangaDetailsView.kt b/app/src/main/java/org/koitharu/kotatsu/ui/details/MangaDetailsView.kt index e23feb3c9..be9143067 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/details/MangaDetailsView.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/details/MangaDetailsView.kt @@ -8,7 +8,7 @@ import moxy.viewstate.strategy.alias.SingleState import org.koitharu.kotatsu.core.model.FavouriteCategory import org.koitharu.kotatsu.core.model.Manga import org.koitharu.kotatsu.core.model.MangaHistory -import org.koitharu.kotatsu.ui.common.BaseMvpView +import org.koitharu.kotatsu.ui.base.BaseMvpView interface MangaDetailsView : BaseMvpView { diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/download/DownloadService.kt b/app/src/main/java/org/koitharu/kotatsu/ui/download/DownloadService.kt index b819f385d..b2d9626e2 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/download/DownloadService.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/download/DownloadService.kt @@ -7,7 +7,7 @@ import android.os.PowerManager import android.webkit.MimeTypeMap import android.widget.Toast import androidx.core.content.ContextCompat -import coil.Coil +import coil.ImageLoader import coil.request.ImageRequest import kotlinx.coroutines.* import kotlinx.coroutines.sync.Mutex @@ -22,8 +22,8 @@ import org.koitharu.kotatsu.core.model.Manga import org.koitharu.kotatsu.core.prefs.AppSettings import org.koitharu.kotatsu.domain.MangaProviderFactory import org.koitharu.kotatsu.domain.local.MangaZip -import org.koitharu.kotatsu.ui.common.BaseService -import org.koitharu.kotatsu.ui.common.dialog.CheckBoxAlertDialog +import org.koitharu.kotatsu.ui.base.BaseService +import org.koitharu.kotatsu.ui.base.dialog.CheckBoxAlertDialog import org.koitharu.kotatsu.utils.CacheUtils import org.koitharu.kotatsu.utils.ext.* import java.io.File @@ -40,6 +40,7 @@ class DownloadService : BaseService() { private val okHttp by inject() private val cache by inject() private val settings by inject() + private val imageLoader by inject() private val jobs = HashMap() private val mutex = Mutex() @@ -74,7 +75,7 @@ class DownloadService : BaseService() { } private fun downloadManga(manga: Manga, chaptersIds: Set?, startId: Int): Job { - return launch(Dispatchers.Default) { + return serviceScope.launch(Dispatchers.Default) { mutex.lock() wakeLock.acquire(TimeUnit.HOURS.toMillis(1)) notification.fillFrom(manga) @@ -88,7 +89,7 @@ class DownloadService : BaseService() { try { val repo = MangaProviderFactory.create(manga.source) val cover = safe { - Coil.execute( + imageLoader.execute( ImageRequest.Builder(this@DownloadService) .data(manga.coverUrl) .build() diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/list/ListModeSelectDialog.kt b/app/src/main/java/org/koitharu/kotatsu/ui/list/ListModeSelectDialog.kt index 5ca1bdb28..ac4d29fc3 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/list/ListModeSelectDialog.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/list/ListModeSelectDialog.kt @@ -9,7 +9,7 @@ import org.koin.android.ext.android.inject import org.koitharu.kotatsu.R import org.koitharu.kotatsu.core.prefs.AppSettings import org.koitharu.kotatsu.core.prefs.ListMode -import org.koitharu.kotatsu.ui.common.AlertDialogFragment +import org.koitharu.kotatsu.ui.base.AlertDialogFragment class ListModeSelectDialog : AlertDialogFragment(R.layout.dialog_list_mode), View.OnClickListener { @@ -56,7 +56,8 @@ class ListModeSelectDialog : AlertDialogFragment(R.layout.dialog_list_mode), Vie private const val TAG = "ListModeSelectDialog" fun show(fm: FragmentManager) = ListModeSelectDialog() - .show(fm, + .show( + fm, TAG ) } diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/list/MainActivity.kt b/app/src/main/java/org/koitharu/kotatsu/ui/list/MainActivity.kt index 697cceec7..11bcbb098 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/list/MainActivity.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/list/MainActivity.kt @@ -24,7 +24,7 @@ import org.koitharu.kotatsu.core.model.MangaSource import org.koitharu.kotatsu.core.prefs.AppSection import org.koitharu.kotatsu.core.prefs.AppSettings import org.koitharu.kotatsu.domain.MangaProviderFactory -import org.koitharu.kotatsu.ui.common.BaseActivity +import org.koitharu.kotatsu.ui.base.BaseActivity import org.koitharu.kotatsu.ui.list.favourites.FavouritesContainerFragment import org.koitharu.kotatsu.ui.list.feed.FeedFragment import org.koitharu.kotatsu.ui.list.history.HistoryListFragment diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/list/MainPresenter.kt b/app/src/main/java/org/koitharu/kotatsu/ui/list/MainPresenter.kt index 6cab9febb..337c9e3c7 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/list/MainPresenter.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/list/MainPresenter.kt @@ -1,18 +1,20 @@ package org.koitharu.kotatsu.ui.list import moxy.InjectViewState +import org.koin.core.component.inject import org.koitharu.kotatsu.core.exceptions.EmptyHistoryException import org.koitharu.kotatsu.domain.MangaProviderFactory import org.koitharu.kotatsu.domain.history.HistoryRepository -import org.koitharu.kotatsu.ui.common.BasePresenter +import org.koitharu.kotatsu.ui.base.BasePresenter import org.koitharu.kotatsu.ui.reader.ReaderState @InjectViewState class MainPresenter : BasePresenter() { + private val historyRepository by inject() + fun openLastReader() { launchLoadingJob { - val historyRepository = HistoryRepository() val manga = historyRepository.getList(0, 1).firstOrNull() ?: throw EmptyHistoryException() val history = historyRepository.getOne(manga) ?: throw EmptyHistoryException() diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/list/MainView.kt b/app/src/main/java/org/koitharu/kotatsu/ui/list/MainView.kt index 2c33e191e..f41fcd03f 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/list/MainView.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/list/MainView.kt @@ -1,7 +1,7 @@ package org.koitharu.kotatsu.ui.list import moxy.viewstate.strategy.alias.OneExecution -import org.koitharu.kotatsu.ui.common.BaseMvpView +import org.koitharu.kotatsu.ui.base.BaseMvpView import org.koitharu.kotatsu.ui.reader.ReaderState interface MainView : BaseMvpView { diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/list/MangaGridHolder.kt b/app/src/main/java/org/koitharu/kotatsu/ui/list/MangaGridHolder.kt index 81bce2d21..45486b144 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/list/MangaGridHolder.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/list/MangaGridHolder.kt @@ -1,27 +1,35 @@ package org.koitharu.kotatsu.ui.list import android.view.ViewGroup -import coil.clear -import coil.load +import coil.ImageLoader +import coil.request.Disposable import kotlinx.android.synthetic.main.item_manga_grid.* +import org.koin.core.component.inject import org.koitharu.kotatsu.R import org.koitharu.kotatsu.core.model.Manga import org.koitharu.kotatsu.core.model.MangaHistory -import org.koitharu.kotatsu.ui.common.list.BaseViewHolder +import org.koitharu.kotatsu.ui.base.list.BaseViewHolder +import org.koitharu.kotatsu.utils.ext.enqueueWith +import org.koitharu.kotatsu.utils.ext.newImageRequest -class MangaGridHolder(parent: ViewGroup) : BaseViewHolder(parent, R.layout.item_manga_grid) { +class MangaGridHolder(parent: ViewGroup) : + BaseViewHolder(parent, R.layout.item_manga_grid) { + + private val coil by inject() + private var imageRequest: Disposable? = null override fun onBind(data: Manga, extra: MangaHistory?) { - imageView_cover.clear() textView_title.text = data.title - imageView_cover.load(data.coverUrl) { - placeholder(R.drawable.ic_placeholder) - fallback(R.drawable.ic_placeholder) - error(R.drawable.ic_placeholder) - } + imageRequest?.dispose() + imageRequest = imageView_cover.newImageRequest(data.coverUrl) + .placeholder(R.drawable.ic_placeholder) + .fallback(R.drawable.ic_placeholder) + .error(R.drawable.ic_placeholder) + .enqueueWith(coil) } override fun onRecycled() { - imageView_cover.clear() + imageRequest?.dispose() + imageView_cover.setImageDrawable(null) } } \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/list/MangaListAdapter.kt b/app/src/main/java/org/koitharu/kotatsu/ui/list/MangaListAdapter.kt index cd9a9dbfd..0f8ad99b2 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/list/MangaListAdapter.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/list/MangaListAdapter.kt @@ -4,15 +4,15 @@ import android.view.ViewGroup import org.koitharu.kotatsu.core.model.Manga import org.koitharu.kotatsu.core.model.MangaHistory import org.koitharu.kotatsu.core.prefs.ListMode -import org.koitharu.kotatsu.ui.common.list.BaseRecyclerAdapter -import org.koitharu.kotatsu.ui.common.list.OnRecyclerItemClickListener +import org.koitharu.kotatsu.ui.base.list.BaseRecyclerAdapter +import org.koitharu.kotatsu.ui.base.list.OnRecyclerItemClickListener class MangaListAdapter(onItemClickListener: OnRecyclerItemClickListener) : BaseRecyclerAdapter(onItemClickListener) { var listMode: ListMode = ListMode.LIST - override fun onCreateViewHolder(parent: ViewGroup) = when(listMode) { + override fun onCreateViewHolder(parent: ViewGroup) = when (listMode) { ListMode.LIST -> MangaListHolder(parent) ListMode.DETAILED_LIST -> MangaListDetailsHolder( parent diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/list/MangaListDetailsHolder.kt b/app/src/main/java/org/koitharu/kotatsu/ui/list/MangaListDetailsHolder.kt index 6dd46919b..28908bbad 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/list/MangaListDetailsHolder.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/list/MangaListDetailsHolder.kt @@ -3,29 +3,37 @@ package org.koitharu.kotatsu.ui.list import android.annotation.SuppressLint import android.view.ViewGroup import androidx.core.view.isVisible -import coil.clear -import coil.load +import coil.ImageLoader +import coil.request.Disposable import kotlinx.android.synthetic.main.item_manga_list_details.* +import org.koin.core.component.inject import org.koitharu.kotatsu.R import org.koitharu.kotatsu.core.model.Manga import org.koitharu.kotatsu.core.model.MangaHistory -import org.koitharu.kotatsu.ui.common.list.BaseViewHolder +import org.koitharu.kotatsu.ui.base.list.BaseViewHolder +import org.koitharu.kotatsu.utils.ext.enqueueWith +import org.koitharu.kotatsu.utils.ext.newImageRequest import org.koitharu.kotatsu.utils.ext.textAndVisible import kotlin.math.roundToInt -class MangaListDetailsHolder(parent: ViewGroup) : BaseViewHolder(parent, R.layout.item_manga_list_details) { +class MangaListDetailsHolder( + parent: ViewGroup +) : BaseViewHolder(parent, R.layout.item_manga_list_details) { + + private val coil by inject() + private var imageRequest: Disposable? = null @SuppressLint("SetTextI18n") override fun onBind(data: Manga, extra: MangaHistory?) { - imageView_cover.clear() + imageRequest?.dispose() textView_title.text = data.title textView_subtitle.textAndVisible = data.altTitle - imageView_cover.load(data.coverUrl) { - placeholder(R.drawable.ic_placeholder) - fallback(R.drawable.ic_placeholder) - error(R.drawable.ic_placeholder) - } - if(data.rating == Manga.NO_RATING) { + imageView_cover.newImageRequest(data.coverUrl) + .placeholder(R.drawable.ic_placeholder) + .fallback(R.drawable.ic_placeholder) + .error(R.drawable.ic_placeholder) + .enqueueWith(coil) + if (data.rating == Manga.NO_RATING) { textView_rating.isVisible = false } else { textView_rating.text = "${(data.rating * 10).roundToInt()}/10" @@ -37,6 +45,7 @@ class MangaListDetailsHolder(parent: ViewGroup) : BaseViewHolder : BaseFragment(R.layout.fragment_list), private var adapter: MangaListAdapter? = null private var progressAdapter: ProgressBarAdapter? = null - private var paginationListener : PaginationScrollListener? = null + private var paginationListener: PaginationScrollListener? = null protected var isSwipeRefreshEnabled = true override fun onCreate(savedInstanceState: Bundle?) { diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/list/MangaListHolder.kt b/app/src/main/java/org/koitharu/kotatsu/ui/list/MangaListHolder.kt index 560f4a835..55ea6b8ab 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/list/MangaListHolder.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/list/MangaListHolder.kt @@ -1,30 +1,38 @@ package org.koitharu.kotatsu.ui.list import android.view.ViewGroup -import coil.clear -import coil.load +import coil.ImageLoader +import coil.request.Disposable import kotlinx.android.synthetic.main.item_manga_list.* +import org.koin.core.component.inject import org.koitharu.kotatsu.R import org.koitharu.kotatsu.core.model.Manga import org.koitharu.kotatsu.core.model.MangaHistory -import org.koitharu.kotatsu.ui.common.list.BaseViewHolder +import org.koitharu.kotatsu.ui.base.list.BaseViewHolder +import org.koitharu.kotatsu.utils.ext.enqueueWith +import org.koitharu.kotatsu.utils.ext.newImageRequest import org.koitharu.kotatsu.utils.ext.textAndVisible -class MangaListHolder(parent: ViewGroup) : - BaseViewHolder(parent, R.layout.item_manga_list) { +class MangaListHolder( + parent: ViewGroup +) : BaseViewHolder(parent, R.layout.item_manga_list) { + + private val coil by inject() + private var imageRequest: Disposable? = null override fun onBind(data: Manga, extra: MangaHistory?) { - imageView_cover.clear() + imageRequest?.dispose() textView_title.text = data.title textView_subtitle.textAndVisible = data.tags.joinToString(", ") { it.title } - imageView_cover.load(data.coverUrl) { - placeholder(R.drawable.ic_placeholder) - fallback(R.drawable.ic_placeholder) - error(R.drawable.ic_placeholder) - } + imageRequest = imageView_cover.newImageRequest(data.coverUrl) + .placeholder(R.drawable.ic_placeholder) + .fallback(R.drawable.ic_placeholder) + .error(R.drawable.ic_placeholder) + .enqueueWith(coil) } override fun onRecycled() { - imageView_cover.clear() + imageRequest?.dispose() + imageView_cover.setImageDrawable(null) } } \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/list/MangaListSheet.kt b/app/src/main/java/org/koitharu/kotatsu/ui/list/MangaListSheet.kt index eddfdf2c4..cab06fe49 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/list/MangaListSheet.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/list/MangaListSheet.kt @@ -21,11 +21,11 @@ import org.koitharu.kotatsu.core.model.MangaTag import org.koitharu.kotatsu.core.model.SortOrder import org.koitharu.kotatsu.core.prefs.AppSettings import org.koitharu.kotatsu.core.prefs.ListMode -import org.koitharu.kotatsu.ui.common.BaseBottomSheet -import org.koitharu.kotatsu.ui.common.list.OnRecyclerItemClickListener -import org.koitharu.kotatsu.ui.common.list.PaginationScrollListener -import org.koitharu.kotatsu.ui.common.list.ProgressBarAdapter -import org.koitharu.kotatsu.ui.common.list.decor.SpacingItemDecoration +import org.koitharu.kotatsu.ui.base.BaseBottomSheet +import org.koitharu.kotatsu.ui.base.list.OnRecyclerItemClickListener +import org.koitharu.kotatsu.ui.base.list.PaginationScrollListener +import org.koitharu.kotatsu.ui.base.list.ProgressBarAdapter +import org.koitharu.kotatsu.ui.base.list.decor.SpacingItemDecoration import org.koitharu.kotatsu.ui.details.MangaDetailsActivity import org.koitharu.kotatsu.utils.UiUtils import org.koitharu.kotatsu.utils.ext.* diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/list/MangaListView.kt b/app/src/main/java/org/koitharu/kotatsu/ui/list/MangaListView.kt index 9df53d158..5954d9369 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/list/MangaListView.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/list/MangaListView.kt @@ -9,7 +9,7 @@ import org.koitharu.kotatsu.core.model.Manga import org.koitharu.kotatsu.core.model.MangaFilter import org.koitharu.kotatsu.core.model.MangaTag import org.koitharu.kotatsu.core.model.SortOrder -import org.koitharu.kotatsu.ui.common.BaseMvpView +import org.koitharu.kotatsu.ui.base.BaseMvpView interface MangaListView : BaseMvpView { diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/list/favourites/FavouritesContainerFragment.kt b/app/src/main/java/org/koitharu/kotatsu/ui/list/favourites/FavouritesContainerFragment.kt index 781badd2f..8cad00353 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/list/favourites/FavouritesContainerFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/list/favourites/FavouritesContainerFragment.kt @@ -13,14 +13,15 @@ import org.koitharu.kotatsu.R import org.koitharu.kotatsu.core.model.FavouriteCategory import org.koitharu.kotatsu.domain.favourites.FavouritesRepository import org.koitharu.kotatsu.domain.favourites.OnFavouritesChangeListener -import org.koitharu.kotatsu.ui.common.BaseFragment +import org.koitharu.kotatsu.ui.base.BaseFragment import org.koitharu.kotatsu.ui.list.favourites.categories.CategoriesActivity import org.koitharu.kotatsu.ui.list.favourites.categories.FavouriteCategoriesPresenter import org.koitharu.kotatsu.ui.list.favourites.categories.FavouriteCategoriesView import java.util.* import kotlin.collections.ArrayList -class FavouritesContainerFragment : BaseFragment(R.layout.fragment_favourites), FavouriteCategoriesView, +class FavouritesContainerFragment : BaseFragment(R.layout.fragment_favourites), + FavouriteCategoriesView, OnFavouritesChangeListener { private val presenter by moxyPresenter(factory = ::FavouriteCategoriesPresenter) diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/list/favourites/FavouritesListPresenter.kt b/app/src/main/java/org/koitharu/kotatsu/ui/list/favourites/FavouritesListPresenter.kt index 45e1d6cab..17ef27b1e 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/list/favourites/FavouritesListPresenter.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/list/favourites/FavouritesListPresenter.kt @@ -1,36 +1,28 @@ package org.koitharu.kotatsu.ui.list.favourites import kotlinx.coroutines.CancellationException -import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch -import kotlinx.coroutines.withContext import moxy.InjectViewState import moxy.presenterScope +import org.koin.core.component.get import org.koitharu.kotatsu.BuildConfig import org.koitharu.kotatsu.domain.favourites.FavouritesRepository -import org.koitharu.kotatsu.ui.common.BasePresenter +import org.koitharu.kotatsu.ui.base.BasePresenter import org.koitharu.kotatsu.ui.list.MangaListView @InjectViewState class FavouritesListPresenter : BasePresenter>() { - private lateinit var repository: FavouritesRepository - - override fun onFirstViewAttach() { - repository = FavouritesRepository() - super.onFirstViewAttach() - } + private val repository = get() fun loadList(categoryId: Long, offset: Int) { presenterScope.launch { viewState.onLoadingStateChanged(true) try { - val list = withContext(Dispatchers.IO) { - if (categoryId == 0L) { - repository.getAllManga(offset = offset) - } else { - repository.getManga(categoryId = categoryId, offset = offset) - } + val list = if (categoryId == 0L) { + repository.getAllManga(offset = offset) + } else { + repository.getManga(categoryId = categoryId, offset = offset) } if (offset == 0) { viewState.onListChanged(list) diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/list/favourites/FavouritesPagerAdapter.kt b/app/src/main/java/org/koitharu/kotatsu/ui/list/favourites/FavouritesPagerAdapter.kt index c8ddc7c8c..7c7f1ffb4 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/list/favourites/FavouritesPagerAdapter.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/list/favourites/FavouritesPagerAdapter.kt @@ -5,10 +5,11 @@ import androidx.viewpager2.adapter.FragmentStateAdapter import com.google.android.material.tabs.TabLayout import com.google.android.material.tabs.TabLayoutMediator import org.koitharu.kotatsu.core.model.FavouriteCategory -import org.koitharu.kotatsu.ui.common.list.AdapterUpdater +import org.koitharu.kotatsu.ui.base.list.AdapterUpdater import org.koitharu.kotatsu.utils.ext.replaceWith -class FavouritesPagerAdapter(fragment: Fragment) : FragmentStateAdapter(fragment), TabLayoutMediator.TabConfigurationStrategy { +class FavouritesPagerAdapter(fragment: Fragment) : FragmentStateAdapter(fragment), + TabLayoutMediator.TabConfigurationStrategy { private val dataSet = ArrayList() diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/list/favourites/categories/CategoriesActivity.kt b/app/src/main/java/org/koitharu/kotatsu/ui/list/favourites/categories/CategoriesActivity.kt index 433aef940..d7dee74c7 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/list/favourites/categories/CategoriesActivity.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/list/favourites/categories/CategoriesActivity.kt @@ -17,9 +17,9 @@ import kotlinx.android.synthetic.main.activity_categories.* import moxy.ktx.moxyPresenter import org.koitharu.kotatsu.R import org.koitharu.kotatsu.core.model.FavouriteCategory -import org.koitharu.kotatsu.ui.common.BaseActivity -import org.koitharu.kotatsu.ui.common.dialog.TextInputDialog -import org.koitharu.kotatsu.ui.common.list.OnRecyclerItemClickListener +import org.koitharu.kotatsu.ui.base.BaseActivity +import org.koitharu.kotatsu.ui.base.dialog.TextInputDialog +import org.koitharu.kotatsu.ui.base.list.OnRecyclerItemClickListener import org.koitharu.kotatsu.utils.ext.getDisplayMessage import org.koitharu.kotatsu.utils.ext.showPopupMenu @@ -61,7 +61,9 @@ class CategoriesActivity : BaseActivity(), OnRecyclerItemClickListener) : BaseRecyclerAdapter() { @@ -25,7 +25,11 @@ class CategoriesAdapter(private val onItemClickListener: OnRecyclerItemClickList } holder.imageView_handle.setOnTouchListener { v, event -> if (event.actionMasked == MotionEvent.ACTION_DOWN) { - onItemClickListener.onItemLongClick(holder.requireData(), holder.bindingAdapterPosition, v) + onItemClickListener.onItemLongClick( + holder.requireData(), + holder.bindingAdapterPosition, + v + ) } else { false } diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/list/favourites/categories/CategoryHolder.kt b/app/src/main/java/org/koitharu/kotatsu/ui/list/favourites/categories/CategoryHolder.kt index f77e66454..b70fc3ddd 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/list/favourites/categories/CategoryHolder.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/list/favourites/categories/CategoryHolder.kt @@ -4,7 +4,7 @@ import android.view.ViewGroup import kotlinx.android.synthetic.main.item_category.* import org.koitharu.kotatsu.R import org.koitharu.kotatsu.core.model.FavouriteCategory -import org.koitharu.kotatsu.ui.common.list.BaseViewHolder +import org.koitharu.kotatsu.ui.base.list.BaseViewHolder class CategoryHolder(parent: ViewGroup) : BaseViewHolder(parent, R.layout.item_category) { diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/list/favourites/categories/FavouriteCategoriesPresenter.kt b/app/src/main/java/org/koitharu/kotatsu/ui/list/favourites/categories/FavouriteCategoriesPresenter.kt index cfc90e07f..6a7dfefc1 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/list/favourites/categories/FavouriteCategoriesPresenter.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/list/favourites/categories/FavouriteCategoriesPresenter.kt @@ -3,20 +3,18 @@ package org.koitharu.kotatsu.ui.list.favourites.categories import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.withLock import moxy.InjectViewState +import org.koin.core.component.get import org.koitharu.kotatsu.core.model.Manga import org.koitharu.kotatsu.domain.favourites.FavouritesRepository -import org.koitharu.kotatsu.ui.common.BasePresenter +import org.koitharu.kotatsu.ui.base.BasePresenter @InjectViewState class FavouriteCategoriesPresenter : BasePresenter() { - private lateinit var repository: FavouritesRepository - private val reorderMutex by lazy { - Mutex() - } + private val repository = get() + private val reorderMutex by lazy(LazyThreadSafetyMode.NONE) { Mutex() } override fun onFirstViewAttach() { - repository = FavouritesRepository() super.onFirstViewAttach() loadAllCategories() } diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/list/favourites/categories/FavouriteCategoriesView.kt b/app/src/main/java/org/koitharu/kotatsu/ui/list/favourites/categories/FavouriteCategoriesView.kt index 4c0d80a63..b4eb1de8f 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/list/favourites/categories/FavouriteCategoriesView.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/list/favourites/categories/FavouriteCategoriesView.kt @@ -4,7 +4,7 @@ import moxy.viewstate.strategy.AddToEndSingleStrategy import moxy.viewstate.strategy.StateStrategyType import moxy.viewstate.strategy.alias.AddToEndSingle import org.koitharu.kotatsu.core.model.FavouriteCategory -import org.koitharu.kotatsu.ui.common.BaseMvpView +import org.koitharu.kotatsu.ui.base.BaseMvpView interface FavouriteCategoriesView : BaseMvpView { diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/list/favourites/categories/select/CategoriesSelectAdapter.kt b/app/src/main/java/org/koitharu/kotatsu/ui/list/favourites/categories/select/CategoriesSelectAdapter.kt index 1385be8b7..b79143f92 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/list/favourites/categories/select/CategoriesSelectAdapter.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/list/favourites/categories/select/CategoriesSelectAdapter.kt @@ -5,8 +5,8 @@ import android.view.ViewGroup import android.widget.Checkable import androidx.core.util.set import org.koitharu.kotatsu.core.model.FavouriteCategory -import org.koitharu.kotatsu.ui.common.list.BaseRecyclerAdapter -import org.koitharu.kotatsu.ui.common.list.BaseViewHolder +import org.koitharu.kotatsu.ui.base.list.BaseRecyclerAdapter +import org.koitharu.kotatsu.ui.base.list.BaseViewHolder class CategoriesSelectAdapter(private val listener: OnCategoryCheckListener) : BaseRecyclerAdapter() { diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/list/favourites/categories/select/CategoryCheckableHolder.kt b/app/src/main/java/org/koitharu/kotatsu/ui/list/favourites/categories/select/CategoryCheckableHolder.kt index 4a29cb5d9..a02d7ebed 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/list/favourites/categories/select/CategoryCheckableHolder.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/list/favourites/categories/select/CategoryCheckableHolder.kt @@ -4,7 +4,7 @@ import android.view.ViewGroup import kotlinx.android.synthetic.main.item_category_checkable.* import org.koitharu.kotatsu.R import org.koitharu.kotatsu.core.model.FavouriteCategory -import org.koitharu.kotatsu.ui.common.list.BaseViewHolder +import org.koitharu.kotatsu.ui.base.list.BaseViewHolder class CategoryCheckableHolder(parent: ViewGroup) : BaseViewHolder(parent, R.layout.item_category_checkable) { diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/list/favourites/categories/select/FavouriteCategoriesDialog.kt b/app/src/main/java/org/koitharu/kotatsu/ui/list/favourites/categories/select/FavouriteCategoriesDialog.kt index 62e4b1eec..31ea5d817 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/list/favourites/categories/select/FavouriteCategoriesDialog.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/list/favourites/categories/select/FavouriteCategoriesDialog.kt @@ -10,8 +10,8 @@ import moxy.ktx.moxyPresenter import org.koitharu.kotatsu.R import org.koitharu.kotatsu.core.model.FavouriteCategory import org.koitharu.kotatsu.core.model.Manga -import org.koitharu.kotatsu.ui.common.BaseBottomSheet -import org.koitharu.kotatsu.ui.common.dialog.TextInputDialog +import org.koitharu.kotatsu.ui.base.BaseBottomSheet +import org.koitharu.kotatsu.ui.base.dialog.TextInputDialog import org.koitharu.kotatsu.ui.list.favourites.categories.FavouriteCategoriesPresenter import org.koitharu.kotatsu.ui.list.favourites.categories.FavouriteCategoriesView import org.koitharu.kotatsu.utils.ext.getDisplayMessage @@ -31,7 +31,8 @@ class FavouriteCategoriesDialog : BaseBottomSheet(R.layout.dialog_favorite_categ super.onViewCreated(view, savedInstanceState) adapter = CategoriesSelectAdapter( - this) + this + ) recyclerView_categories.adapter = adapter textView_add.setOnClickListener { createCategory() @@ -86,8 +87,10 @@ class FavouriteCategoriesDialog : BaseBottomSheet(R.layout.dialog_favorite_categ fun show(fm: FragmentManager, manga: Manga) = FavouriteCategoriesDialog() .withArgs(1) { - putParcelable(ARG_MANGA, manga) - }.show(fm, - TAG) + putParcelable(ARG_MANGA, manga) + }.show( + fm, + TAG + ) } } \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/list/feed/FeedAdapter.kt b/app/src/main/java/org/koitharu/kotatsu/ui/list/feed/FeedAdapter.kt index 8cd901fcf..35f5c2581 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/list/feed/FeedAdapter.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/list/feed/FeedAdapter.kt @@ -2,9 +2,9 @@ package org.koitharu.kotatsu.ui.list.feed import android.view.ViewGroup import org.koitharu.kotatsu.core.model.TrackingLogItem -import org.koitharu.kotatsu.ui.common.list.BaseRecyclerAdapter -import org.koitharu.kotatsu.ui.common.list.BaseViewHolder -import org.koitharu.kotatsu.ui.common.list.OnRecyclerItemClickListener +import org.koitharu.kotatsu.ui.base.list.BaseRecyclerAdapter +import org.koitharu.kotatsu.ui.base.list.BaseViewHolder +import org.koitharu.kotatsu.ui.base.list.OnRecyclerItemClickListener class FeedAdapter(onItemClickListener: OnRecyclerItemClickListener? = null) : BaseRecyclerAdapter(onItemClickListener) { diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/list/feed/FeedFragment.kt b/app/src/main/java/org/koitharu/kotatsu/ui/list/feed/FeedFragment.kt index b286fbca4..e9078831c 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/list/feed/FeedFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/list/feed/FeedFragment.kt @@ -12,10 +12,10 @@ import moxy.MvpDelegate import moxy.ktx.moxyPresenter import org.koitharu.kotatsu.R import org.koitharu.kotatsu.core.model.TrackingLogItem -import org.koitharu.kotatsu.ui.common.BaseFragment -import org.koitharu.kotatsu.ui.common.list.OnRecyclerItemClickListener -import org.koitharu.kotatsu.ui.common.list.PaginationScrollListener -import org.koitharu.kotatsu.ui.common.list.decor.SpacingItemDecoration +import org.koitharu.kotatsu.ui.base.BaseFragment +import org.koitharu.kotatsu.ui.base.list.OnRecyclerItemClickListener +import org.koitharu.kotatsu.ui.base.list.PaginationScrollListener +import org.koitharu.kotatsu.ui.base.list.decor.SpacingItemDecoration import org.koitharu.kotatsu.ui.details.MangaDetailsActivity import org.koitharu.kotatsu.ui.tracker.TrackWorker import org.koitharu.kotatsu.utils.ext.callOnScrollListeners @@ -55,7 +55,7 @@ class FeedFragment : BaseFragment(R.layout.fragment_tracklogs), FeedView, inflater.inflate(R.menu.opt_feed, menu) } - override fun onOptionsItemSelected(item: MenuItem) = when(item.itemId) { + override fun onOptionsItemSelected(item: MenuItem) = when (item.itemId) { R.id.action_update -> { TrackWorker.startNow(requireContext()) Snackbar.make(recyclerView, R.string.feed_will_update_soon, Snackbar.LENGTH_LONG).show() diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/list/feed/FeedHolder.kt b/app/src/main/java/org/koitharu/kotatsu/ui/list/feed/FeedHolder.kt index a1c61fa51..3ec2eb4c9 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/list/feed/FeedHolder.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/list/feed/FeedHolder.kt @@ -2,23 +2,30 @@ package org.koitharu.kotatsu.ui.list.feed import android.text.format.DateUtils import android.view.ViewGroup -import coil.clear -import coil.load +import coil.ImageLoader +import coil.request.Disposable import kotlinx.android.synthetic.main.item_tracklog.* +import org.koin.core.component.inject import org.koitharu.kotatsu.R import org.koitharu.kotatsu.core.model.TrackingLogItem -import org.koitharu.kotatsu.ui.common.list.BaseViewHolder +import org.koitharu.kotatsu.ui.base.list.BaseViewHolder +import org.koitharu.kotatsu.utils.ext.enqueueWith import org.koitharu.kotatsu.utils.ext.formatRelative +import org.koitharu.kotatsu.utils.ext.newImageRequest class FeedHolder(parent: ViewGroup) : BaseViewHolder(parent, R.layout.item_tracklog) { + private val coil by inject() + private var imageRequest: Disposable? = null + override fun onBind(data: TrackingLogItem, extra: Unit) { - imageView_cover.load(data.manga.coverUrl) { - placeholder(R.drawable.ic_placeholder) - fallback(R.drawable.ic_placeholder) - error(R.drawable.ic_placeholder) - } + imageRequest?.dispose() + imageRequest = imageView_cover.newImageRequest(data.manga.coverUrl) + .placeholder(R.drawable.ic_placeholder) + .fallback(R.drawable.ic_placeholder) + .error(R.drawable.ic_placeholder) + .enqueueWith(coil) textView_title.text = data.manga.title textView_subtitle.text = buildString { append(data.createdAt.formatRelative(DateUtils.DAY_IN_MILLIS)) @@ -35,7 +42,7 @@ class FeedHolder(parent: ViewGroup) : } override fun onRecycled() { - super.onRecycled() - imageView_cover.clear() + imageRequest?.dispose() + imageView_cover.setImageDrawable(null) } } \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/list/feed/FeedPresenter.kt b/app/src/main/java/org/koitharu/kotatsu/ui/list/feed/FeedPresenter.kt index 5c778a0c0..c9d7e5a34 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/list/feed/FeedPresenter.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/list/feed/FeedPresenter.kt @@ -5,18 +5,14 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import moxy.presenterScope +import org.koin.core.component.inject import org.koitharu.kotatsu.BuildConfig import org.koitharu.kotatsu.domain.tracking.TrackingRepository -import org.koitharu.kotatsu.ui.common.BasePresenter +import org.koitharu.kotatsu.ui.base.BasePresenter class FeedPresenter : BasePresenter() { - private lateinit var repository: TrackingRepository - - override fun onFirstViewAttach() { - repository = TrackingRepository() - super.onFirstViewAttach() - } + private val repository by inject() fun loadList(offset: Int) { presenterScope.launch { diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/list/feed/FeedView.kt b/app/src/main/java/org/koitharu/kotatsu/ui/list/feed/FeedView.kt index 4fcaaf967..8ff33007e 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/list/feed/FeedView.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/list/feed/FeedView.kt @@ -4,7 +4,7 @@ import moxy.viewstate.strategy.AddToEndSingleTagStrategy import moxy.viewstate.strategy.AddToEndStrategy import moxy.viewstate.strategy.StateStrategyType import org.koitharu.kotatsu.core.model.TrackingLogItem -import org.koitharu.kotatsu.ui.common.BaseMvpView +import org.koitharu.kotatsu.ui.base.BaseMvpView interface FeedView : BaseMvpView { diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/list/filter/FilterAdapter.kt b/app/src/main/java/org/koitharu/kotatsu/ui/list/filter/FilterAdapter.kt index cbd840538..da8de8fa4 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/list/filter/FilterAdapter.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/list/filter/FilterAdapter.kt @@ -5,7 +5,7 @@ import androidx.recyclerview.widget.RecyclerView import org.koitharu.kotatsu.core.model.MangaFilter import org.koitharu.kotatsu.core.model.MangaTag import org.koitharu.kotatsu.core.model.SortOrder -import org.koitharu.kotatsu.ui.common.list.BaseViewHolder +import org.koitharu.kotatsu.ui.base.list.BaseViewHolder import java.util.* import kotlin.collections.ArrayList diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/list/filter/FilterSortHolder.kt b/app/src/main/java/org/koitharu/kotatsu/ui/list/filter/FilterSortHolder.kt index 66d6c60dc..9b6d5e8c3 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/list/filter/FilterSortHolder.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/list/filter/FilterSortHolder.kt @@ -4,7 +4,7 @@ import android.view.ViewGroup import kotlinx.android.synthetic.main.item_checkable_single.* import org.koitharu.kotatsu.R import org.koitharu.kotatsu.core.model.SortOrder -import org.koitharu.kotatsu.ui.common.list.BaseViewHolder +import org.koitharu.kotatsu.ui.base.list.BaseViewHolder class FilterSortHolder(parent: ViewGroup) : BaseViewHolder(parent, R.layout.item_checkable_single) { diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/list/filter/FilterTagHolder.kt b/app/src/main/java/org/koitharu/kotatsu/ui/list/filter/FilterTagHolder.kt index 74200e26c..d1fcd95d4 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/list/filter/FilterTagHolder.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/list/filter/FilterTagHolder.kt @@ -4,7 +4,7 @@ import android.view.ViewGroup import kotlinx.android.synthetic.main.item_checkable_single.* import org.koitharu.kotatsu.R import org.koitharu.kotatsu.core.model.MangaTag -import org.koitharu.kotatsu.ui.common.list.BaseViewHolder +import org.koitharu.kotatsu.ui.base.list.BaseViewHolder class FilterTagHolder(parent: ViewGroup) : BaseViewHolder(parent, R.layout.item_checkable_single) { diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/list/history/HistoryListPresenter.kt b/app/src/main/java/org/koitharu/kotatsu/ui/list/history/HistoryListPresenter.kt index f8532630a..fa403185b 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/list/history/HistoryListPresenter.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/list/history/HistoryListPresenter.kt @@ -12,19 +12,14 @@ import org.koitharu.kotatsu.BuildConfig import org.koitharu.kotatsu.core.model.Manga import org.koitharu.kotatsu.core.model.MangaHistory import org.koitharu.kotatsu.domain.history.HistoryRepository -import org.koitharu.kotatsu.ui.common.BasePresenter +import org.koitharu.kotatsu.ui.base.BasePresenter import org.koitharu.kotatsu.ui.list.MangaListView import org.koitharu.kotatsu.utils.MangaShortcut @InjectViewState class HistoryListPresenter : BasePresenter>() { - private lateinit var repository: HistoryRepository - - override fun onFirstViewAttach() { - repository = HistoryRepository() - super.onFirstViewAttach() - } + private val repository = get() fun loadList(offset: Int) { presenterScope.launch { diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/list/local/LocalListPresenter.kt b/app/src/main/java/org/koitharu/kotatsu/ui/list/local/LocalListPresenter.kt index 2f14836af..45f6d1ff2 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/list/local/LocalListPresenter.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/list/local/LocalListPresenter.kt @@ -10,14 +10,14 @@ import kotlinx.coroutines.withContext import moxy.InjectViewState import moxy.presenterScope import org.koin.core.component.get +import org.koin.core.component.inject import org.koitharu.kotatsu.BuildConfig import org.koitharu.kotatsu.core.exceptions.UnsupportedFileException import org.koitharu.kotatsu.core.model.Manga import org.koitharu.kotatsu.core.parser.LocalMangaRepository import org.koitharu.kotatsu.core.prefs.AppSettings -import org.koitharu.kotatsu.domain.MangaProviderFactory import org.koitharu.kotatsu.domain.history.HistoryRepository -import org.koitharu.kotatsu.ui.common.BasePresenter +import org.koitharu.kotatsu.ui.base.BasePresenter import org.koitharu.kotatsu.ui.list.MangaListView import org.koitharu.kotatsu.utils.MangaShortcut import org.koitharu.kotatsu.utils.MediaStoreCompat @@ -29,13 +29,7 @@ import java.io.IOException @InjectViewState class LocalListPresenter : BasePresenter>() { - private lateinit var repository: LocalMangaRepository - - override fun onFirstViewAttach() { - repository = MangaProviderFactory.createLocal() - - super.onFirstViewAttach() - } + private val repository by inject() fun loadList(offset: Int) { presenterScope.launch { @@ -88,7 +82,7 @@ class LocalListPresenter : BasePresenter>() { val original = repository.getRemoteManga(manga) repository.delete(manga) || throw IOException("Unable to delete file") safe { - HistoryRepository().deleteOrSwap(manga, original) + get().deleteOrSwap(manga, original) } } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1) { diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/list/remote/RemoteListPresenter.kt b/app/src/main/java/org/koitharu/kotatsu/ui/list/remote/RemoteListPresenter.kt index 05e2a7899..0a422cd86 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/list/remote/RemoteListPresenter.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/list/remote/RemoteListPresenter.kt @@ -10,7 +10,7 @@ import org.koitharu.kotatsu.BuildConfig import org.koitharu.kotatsu.core.model.MangaFilter import org.koitharu.kotatsu.core.model.MangaSource import org.koitharu.kotatsu.domain.MangaProviderFactory -import org.koitharu.kotatsu.ui.common.BasePresenter +import org.koitharu.kotatsu.ui.base.BasePresenter import org.koitharu.kotatsu.ui.list.MangaListView @InjectViewState diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/reader/ChaptersDialog.kt b/app/src/main/java/org/koitharu/kotatsu/ui/reader/ChaptersDialog.kt index 9e10d7f68..c99be2c1b 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/reader/ChaptersDialog.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/reader/ChaptersDialog.kt @@ -10,8 +10,8 @@ import androidx.recyclerview.widget.RecyclerView import kotlinx.android.synthetic.main.dialog_chapters.* import org.koitharu.kotatsu.R import org.koitharu.kotatsu.core.model.MangaChapter -import org.koitharu.kotatsu.ui.common.AlertDialogFragment -import org.koitharu.kotatsu.ui.common.list.OnRecyclerItemClickListener +import org.koitharu.kotatsu.ui.base.AlertDialogFragment +import org.koitharu.kotatsu.ui.base.list.OnRecyclerItemClickListener import org.koitharu.kotatsu.ui.details.ChaptersAdapter import org.koitharu.kotatsu.utils.ext.withArgs diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/reader/ReaderActivity.kt b/app/src/main/java/org/koitharu/kotatsu/ui/reader/ReaderActivity.kt index 96ca1e6b8..3671da94b 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/reader/ReaderActivity.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/reader/ReaderActivity.kt @@ -36,7 +36,7 @@ import org.koitharu.kotatsu.core.model.MangaHistory import org.koitharu.kotatsu.core.model.MangaPage import org.koitharu.kotatsu.core.prefs.AppSettings import org.koitharu.kotatsu.core.prefs.ReaderMode -import org.koitharu.kotatsu.ui.common.BaseFullscreenActivity +import org.koitharu.kotatsu.ui.base.BaseFullscreenActivity import org.koitharu.kotatsu.ui.reader.base.AbstractReader import org.koitharu.kotatsu.ui.reader.standard.PagerReaderFragment import org.koitharu.kotatsu.ui.reader.thumbnails.OnPageSelectListener diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/reader/ReaderConfigDialog.kt b/app/src/main/java/org/koitharu/kotatsu/ui/reader/ReaderConfigDialog.kt index b37711986..33033ea98 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/reader/ReaderConfigDialog.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/reader/ReaderConfigDialog.kt @@ -8,7 +8,7 @@ import kotlinx.android.synthetic.main.dialog_list_mode.button_ok import kotlinx.android.synthetic.main.dialog_reader_config.* import org.koitharu.kotatsu.R import org.koitharu.kotatsu.core.prefs.ReaderMode -import org.koitharu.kotatsu.ui.common.AlertDialogFragment +import org.koitharu.kotatsu.ui.base.AlertDialogFragment import org.koitharu.kotatsu.utils.ext.withArgs class ReaderConfigDialog : AlertDialogFragment(R.layout.dialog_reader_config), diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/reader/ReaderListener.kt b/app/src/main/java/org/koitharu/kotatsu/ui/reader/ReaderListener.kt index 83d30a546..943f15444 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/reader/ReaderListener.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/reader/ReaderListener.kt @@ -1,7 +1,7 @@ package org.koitharu.kotatsu.ui.reader import org.koitharu.kotatsu.core.model.MangaChapter -import org.koitharu.kotatsu.ui.common.BaseMvpView +import org.koitharu.kotatsu.ui.base.BaseMvpView interface ReaderListener : BaseMvpView { diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/reader/ReaderPresenter.kt b/app/src/main/java/org/koitharu/kotatsu/ui/reader/ReaderPresenter.kt index a94ccb9dc..ab173c92d 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/reader/ReaderPresenter.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/reader/ReaderPresenter.kt @@ -7,7 +7,9 @@ import moxy.InjectViewState import moxy.presenterScope import okhttp3.OkHttpClient import okhttp3.Request +import org.koin.core.component.KoinComponent import org.koin.core.component.get +import org.koin.core.component.inject import org.koitharu.kotatsu.BuildConfig import org.koitharu.kotatsu.core.model.Manga import org.koitharu.kotatsu.core.model.MangaPage @@ -16,8 +18,9 @@ import org.koitharu.kotatsu.domain.MangaDataRepository import org.koitharu.kotatsu.domain.MangaProviderFactory import org.koitharu.kotatsu.domain.MangaUtils import org.koitharu.kotatsu.domain.history.HistoryRepository -import org.koitharu.kotatsu.ui.common.BasePresenter +import org.koitharu.kotatsu.ui.base.BasePresenter import org.koitharu.kotatsu.utils.MediaStoreCompat +import org.koitharu.kotatsu.utils.ext.IgnoreErrors import org.koitharu.kotatsu.utils.ext.await import org.koitharu.kotatsu.utils.ext.contentDisposition import org.koitharu.kotatsu.utils.ext.mimeType @@ -25,6 +28,8 @@ import org.koitharu.kotatsu.utils.ext.mimeType @InjectViewState class ReaderPresenter : BasePresenter() { + private val dataRepository by inject() + fun init(manga: Manga) { presenterScope.launch { viewState.onLoadingStateChanged(isLoading = true) @@ -33,13 +38,12 @@ class ReaderPresenter : BasePresenter() { val repo = MangaProviderFactory.create(manga.source) val chapter = (manga.chapters ?: throw RuntimeException("Chapters is null")).random() - val prefs = MangaDataRepository() - var mode = prefs.getReaderMode(manga.id) + var mode = dataRepository.getReaderMode(manga.id) if (mode == null) { val pages = repo.getPages(chapter) mode = MangaUtils.determineReaderMode(pages) if (mode != null) { - prefs.savePreferences( + dataRepository.savePreferences( manga = manga, mode = mode ) @@ -61,8 +65,8 @@ class ReaderPresenter : BasePresenter() { } fun setMode(manga: Manga, mode: ReaderMode) { - presenterScope.launch(Dispatchers.IO) { - MangaDataRepository().savePreferences( + presenterScope.launch { + dataRepository.savePreferences( manga = manga, mode = mode ) @@ -98,11 +102,11 @@ class ReaderPresenter : BasePresenter() { } } - companion object { + companion object : KoinComponent { fun saveState(state: ReaderState) { - GlobalScope.launch(Dispatchers.IO) { - HistoryRepository().addOrUpdate( + GlobalScope.launch(Dispatchers.Default + IgnoreErrors) { + get().addOrUpdate( manga = state.manga, chapterId = state.chapterId, page = state.page, diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/reader/ReaderView.kt b/app/src/main/java/org/koitharu/kotatsu/ui/reader/ReaderView.kt index 97b0f1da6..fb28407cb 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/reader/ReaderView.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/reader/ReaderView.kt @@ -5,7 +5,7 @@ import moxy.viewstate.strategy.alias.AddToEndSingle import moxy.viewstate.strategy.alias.OneExecution import org.koitharu.kotatsu.core.model.Manga import org.koitharu.kotatsu.core.prefs.ReaderMode -import org.koitharu.kotatsu.ui.common.BaseMvpView +import org.koitharu.kotatsu.ui.base.BaseMvpView interface ReaderView : BaseMvpView { diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/reader/SimpleSettingsActivity.kt b/app/src/main/java/org/koitharu/kotatsu/ui/reader/SimpleSettingsActivity.kt index 8c7f20ac0..1b832cd9f 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/reader/SimpleSettingsActivity.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/reader/SimpleSettingsActivity.kt @@ -6,7 +6,7 @@ import android.os.Bundle import androidx.fragment.app.commit import org.koitharu.kotatsu.BuildConfig import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.ui.common.BaseActivity +import org.koitharu.kotatsu.ui.base.BaseActivity import org.koitharu.kotatsu.ui.settings.MainSettingsFragment import org.koitharu.kotatsu.ui.settings.NetworkSettingsFragment import org.koitharu.kotatsu.ui.settings.ReaderSettingsFragment @@ -18,19 +18,23 @@ class SimpleSettingsActivity : BaseActivity() { setContentView(R.layout.activity_settings_simple) supportActionBar?.setDisplayHomeAsUpEnabled(true) supportFragmentManager.commit { - replace(R.id.container, when(intent?.action) { - Intent.ACTION_MANAGE_NETWORK_USAGE -> NetworkSettingsFragment() - ACTION_READER -> ReaderSettingsFragment() - else -> MainSettingsFragment() - }) + replace( + R.id.container, when (intent?.action) { + Intent.ACTION_MANAGE_NETWORK_USAGE -> NetworkSettingsFragment() + ACTION_READER -> ReaderSettingsFragment() + else -> MainSettingsFragment() + } + ) } } companion object { - private const val ACTION_READER = "${BuildConfig.APPLICATION_ID}.action.MANAGE_READER_SETTINGS" + private const val ACTION_READER = + "${BuildConfig.APPLICATION_ID}.action.MANAGE_READER_SETTINGS" - fun newReaderSettingsIntent(context: Context) = Intent(context, SimpleSettingsActivity::class.java) - .setAction(ACTION_READER) + fun newReaderSettingsIntent(context: Context) = + Intent(context, SimpleSettingsActivity::class.java) + .setAction(ACTION_READER) } } \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/reader/base/AbstractReader.kt b/app/src/main/java/org/koitharu/kotatsu/ui/reader/base/AbstractReader.kt index 8050fc518..2332f278a 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/reader/base/AbstractReader.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/reader/base/AbstractReader.kt @@ -12,7 +12,7 @@ import kotlinx.coroutines.withContext import org.koitharu.kotatsu.core.model.Manga import org.koitharu.kotatsu.core.model.MangaPage import org.koitharu.kotatsu.domain.MangaProviderFactory -import org.koitharu.kotatsu.ui.common.BaseFragment +import org.koitharu.kotatsu.ui.base.BaseFragment import org.koitharu.kotatsu.ui.reader.PageLoader import org.koitharu.kotatsu.ui.reader.ReaderListener import org.koitharu.kotatsu.ui.reader.ReaderState diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/reader/base/BaseReaderAdapter.kt b/app/src/main/java/org/koitharu/kotatsu/ui/reader/base/BaseReaderAdapter.kt index 25b2dc03c..b3f7e9223 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/reader/base/BaseReaderAdapter.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/reader/base/BaseReaderAdapter.kt @@ -3,7 +3,7 @@ package org.koitharu.kotatsu.ui.reader.base import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView import org.koitharu.kotatsu.core.model.MangaPage -import org.koitharu.kotatsu.ui.common.list.BaseViewHolder +import org.koitharu.kotatsu.ui.base.list.BaseViewHolder abstract class BaseReaderAdapter(private val pages: GroupedList) : RecyclerView.Adapter>() { @@ -40,7 +40,10 @@ abstract class BaseReaderAdapter(private val pages: GroupedList final override fun getItemCount() = pages.size - final override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BaseViewHolder { + final override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): BaseViewHolder { return onCreateViewHolder(parent).also(this::onViewHolderCreated) } diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/reader/standard/PageHolder.kt b/app/src/main/java/org/koitharu/kotatsu/ui/reader/standard/PageHolder.kt index feab5a8da..57e71b9e7 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/reader/standard/PageHolder.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/reader/standard/PageHolder.kt @@ -8,7 +8,7 @@ import com.davemorrissey.labs.subscaleview.ImageSource import kotlinx.android.synthetic.main.item_page.* import org.koitharu.kotatsu.R import org.koitharu.kotatsu.core.model.MangaPage -import org.koitharu.kotatsu.ui.common.list.BaseViewHolder +import org.koitharu.kotatsu.ui.base.list.BaseViewHolder import org.koitharu.kotatsu.ui.reader.PageLoader import org.koitharu.kotatsu.ui.reader.base.PageHolderDelegate import org.koitharu.kotatsu.utils.ext.getDisplayMessage diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/reader/thumbnails/PageThumbnailHolder.kt b/app/src/main/java/org/koitharu/kotatsu/ui/reader/thumbnails/PageThumbnailHolder.kt index c881a11b7..736bd198b 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/reader/thumbnails/PageThumbnailHolder.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/reader/thumbnails/PageThumbnailHolder.kt @@ -2,23 +2,26 @@ package org.koitharu.kotatsu.ui.reader.thumbnails import android.view.ViewGroup import androidx.core.net.toUri -import coil.Coil +import coil.ImageLoader import coil.request.ImageRequest import coil.size.PixelSize import coil.size.Size import kotlinx.android.synthetic.main.item_page_thumb.* import kotlinx.coroutines.* +import org.koin.core.component.inject import org.koitharu.kotatsu.R import org.koitharu.kotatsu.core.local.PagesCache import org.koitharu.kotatsu.core.model.MangaPage import org.koitharu.kotatsu.domain.MangaProviderFactory -import org.koitharu.kotatsu.ui.common.list.BaseViewHolder +import org.koitharu.kotatsu.ui.base.list.BaseViewHolder +import org.koitharu.kotatsu.utils.ext.IgnoreErrors class PageThumbnailHolder(parent: ViewGroup, private val scope: CoroutineScope) : BaseViewHolder(parent, R.layout.item_page_thumb) { private var job: Job? = null private val thumbSize: Size + private val coil by inject() init { val width = itemView.context.resources.getDimensionPixelSize(R.dimen.preferred_grid_width) @@ -32,24 +35,19 @@ class PageThumbnailHolder(parent: ViewGroup, private val scope: CoroutineScope) imageView_thumb.setImageDrawable(null) textView_number.text = (bindingAdapterPosition + 1).toString() job?.cancel() - job = scope.launch(Dispatchers.IO) { - try { - val url = data.preview ?: data.url.let { - val pageUrl = MangaProviderFactory.create(data.source).getPageFullUrl(data) - extra[pageUrl]?.toUri()?.toString() ?: pageUrl - } - val drawable = Coil.execute( - ImageRequest.Builder(context) - .data(url) - .size(thumbSize) - .build() - ).drawable - withContext(Dispatchers.Main.immediate) { - imageView_thumb.setImageDrawable(drawable) - } - } catch (e: CancellationException) { - } catch (e: Exception) { - e.printStackTrace() + job = scope.launch(Dispatchers.IO + IgnoreErrors) { + val url = data.preview ?: data.url.let { + val pageUrl = MangaProviderFactory.create(data.source).getPageFullUrl(data) + extra[pageUrl]?.toUri()?.toString() ?: pageUrl + } + val drawable = coil.execute( + ImageRequest.Builder(context) + .data(url) + .size(thumbSize) + .build() + ).drawable + withContext(Dispatchers.Main.immediate) { + imageView_thumb.setImageDrawable(drawable) } } } diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/reader/thumbnails/PagesThumbnailsAdapter.kt b/app/src/main/java/org/koitharu/kotatsu/ui/reader/thumbnails/PagesThumbnailsAdapter.kt index 19b248c93..ea488ba02 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/reader/thumbnails/PagesThumbnailsAdapter.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/reader/thumbnails/PagesThumbnailsAdapter.kt @@ -8,8 +8,8 @@ import kotlinx.coroutines.SupervisorJob import org.koin.core.component.inject import org.koitharu.kotatsu.core.local.PagesCache import org.koitharu.kotatsu.core.model.MangaPage -import org.koitharu.kotatsu.ui.common.list.BaseRecyclerAdapter -import org.koitharu.kotatsu.ui.common.list.OnRecyclerItemClickListener +import org.koitharu.kotatsu.ui.base.list.BaseRecyclerAdapter +import org.koitharu.kotatsu.ui.base.list.OnRecyclerItemClickListener import kotlin.coroutines.CoroutineContext class PagesThumbnailsAdapter(onItemClickListener: OnRecyclerItemClickListener?) : diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/reader/thumbnails/PagesThumbnailsSheet.kt b/app/src/main/java/org/koitharu/kotatsu/ui/reader/thumbnails/PagesThumbnailsSheet.kt index c672e0bd0..f47d85fdc 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/reader/thumbnails/PagesThumbnailsSheet.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/reader/thumbnails/PagesThumbnailsSheet.kt @@ -10,9 +10,9 @@ import kotlinx.android.synthetic.main.sheet_pages.* import kotlinx.coroutines.DisposableHandle import org.koitharu.kotatsu.R import org.koitharu.kotatsu.core.model.MangaPage -import org.koitharu.kotatsu.ui.common.BaseBottomSheet -import org.koitharu.kotatsu.ui.common.list.OnRecyclerItemClickListener -import org.koitharu.kotatsu.ui.common.list.decor.SpacingItemDecoration +import org.koitharu.kotatsu.ui.base.BaseBottomSheet +import org.koitharu.kotatsu.ui.base.list.OnRecyclerItemClickListener +import org.koitharu.kotatsu.ui.base.list.decor.SpacingItemDecoration import org.koitharu.kotatsu.utils.UiUtils import org.koitharu.kotatsu.utils.ext.resolveDp import org.koitharu.kotatsu.utils.ext.withArgs diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/reader/wetoon/WebtoonHolder.kt b/app/src/main/java/org/koitharu/kotatsu/ui/reader/wetoon/WebtoonHolder.kt index 1522210a3..044ce4732 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/reader/wetoon/WebtoonHolder.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/reader/wetoon/WebtoonHolder.kt @@ -9,7 +9,7 @@ import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView import kotlinx.android.synthetic.main.item_page_webtoon.* import org.koitharu.kotatsu.R import org.koitharu.kotatsu.core.model.MangaPage -import org.koitharu.kotatsu.ui.common.list.BaseViewHolder +import org.koitharu.kotatsu.ui.base.list.BaseViewHolder import org.koitharu.kotatsu.ui.reader.PageLoader import org.koitharu.kotatsu.ui.reader.base.PageHolderDelegate import org.koitharu.kotatsu.utils.ext.getDisplayMessage diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/search/SearchActivity.kt b/app/src/main/java/org/koitharu/kotatsu/ui/search/SearchActivity.kt index 2a60f89e8..681aed11b 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/search/SearchActivity.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/search/SearchActivity.kt @@ -8,7 +8,7 @@ import androidx.appcompat.widget.SearchView import kotlinx.android.synthetic.main.activity_search.* import org.koitharu.kotatsu.R import org.koitharu.kotatsu.core.model.MangaSource -import org.koitharu.kotatsu.ui.common.BaseActivity +import org.koitharu.kotatsu.ui.base.BaseActivity import org.koitharu.kotatsu.utils.ext.showKeyboard class SearchActivity : BaseActivity(), SearchView.OnQueryTextListener { diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/search/SearchPresenter.kt b/app/src/main/java/org/koitharu/kotatsu/ui/search/SearchPresenter.kt index 1c436fdbc..c6af5e499 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/search/SearchPresenter.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/search/SearchPresenter.kt @@ -1,41 +1,26 @@ package org.koitharu.kotatsu.ui.search -import kotlinx.coroutines.CancellationException import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import moxy.InjectViewState -import moxy.presenterScope -import org.koitharu.kotatsu.BuildConfig import org.koitharu.kotatsu.core.model.MangaSource import org.koitharu.kotatsu.domain.MangaProviderFactory -import org.koitharu.kotatsu.ui.common.BasePresenter +import org.koitharu.kotatsu.ui.base.BasePresenter import org.koitharu.kotatsu.ui.list.MangaListView @InjectViewState class SearchPresenter : BasePresenter>() { fun loadList(source: MangaSource, query: String, offset: Int) { - presenterScope.launch { - viewState.onLoadingStateChanged(true) - try { - val list = withContext(Dispatchers.IO) { - MangaProviderFactory.create(source) - .getList(offset, query = query) - } - if (offset == 0) { - viewState.onListChanged(list) - } else { - viewState.onListAppended(list) - } - } catch (_: CancellationException) { - } catch (e: Throwable) { - if (BuildConfig.DEBUG) { - e.printStackTrace() - } - viewState.onError(e) - } finally { - viewState.onLoadingStateChanged(false) + launchLoadingJob { + val list = withContext(Dispatchers.Default) { + MangaProviderFactory.create(source) + .getList(offset, query = query) + } + if (offset == 0) { + viewState.onListChanged(list) + } else { + viewState.onListAppended(list) } } } diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/search/global/GlobalSearchActivity.kt b/app/src/main/java/org/koitharu/kotatsu/ui/search/global/GlobalSearchActivity.kt index 726d4300b..1adb63af6 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/search/global/GlobalSearchActivity.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/search/global/GlobalSearchActivity.kt @@ -4,7 +4,7 @@ import android.content.Context import android.content.Intent import android.os.Bundle import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.ui.common.BaseActivity +import org.koitharu.kotatsu.ui.base.BaseActivity class GlobalSearchActivity : BaseActivity() { diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/search/global/GlobalSearchPresenter.kt b/app/src/main/java/org/koitharu/kotatsu/ui/search/global/GlobalSearchPresenter.kt index 47e713056..3addb3e3e 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/search/global/GlobalSearchPresenter.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/search/global/GlobalSearchPresenter.kt @@ -2,48 +2,41 @@ package org.koitharu.kotatsu.ui.search.global import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.* -import kotlinx.coroutines.launch +import kotlinx.coroutines.plus import moxy.presenterScope +import org.koin.core.component.get import org.koitharu.kotatsu.domain.MangaSearchRepository -import org.koitharu.kotatsu.ui.common.BasePresenter +import org.koitharu.kotatsu.ui.base.BasePresenter import org.koitharu.kotatsu.ui.list.MangaListView import java.io.IOException class GlobalSearchPresenter : BasePresenter>() { - private lateinit var repository: MangaSearchRepository - - override fun onFirstViewAttach() { - repository = MangaSearchRepository() - super.onFirstViewAttach() - } + private val repository = get() fun startSearch(query: String) { - presenterScope.launch { - viewState.onLoadingStateChanged(isLoading = true) - var isFirstCall = true - repository.globalSearch(query) - .flowOn(Dispatchers.IO) - .catch { e -> - if (e is IOException) { - viewState.onError(e) - } - }.filterNot { x -> x.isEmpty() } - .onEmpty { - viewState.onListChanged(emptyList()) - viewState.onLoadingStateChanged(isLoading = false) - }.onCompletion { - viewState.onListAppended(emptyList()) - }.collect { - if (isFirstCall) { - isFirstCall = false - viewState.onListChanged(it) - viewState.onLoadingStateChanged(isLoading = false) - } else { - viewState.onListAppended(it) - } + viewState.onLoadingStateChanged(isLoading = true) + var isFirstCall = true + repository.globalSearch(query) + .catch { e -> + if (e is IOException) { + viewState.onError(e) } - } + }.filterNot { x -> x.isEmpty() } + .onEmpty { + viewState.onListChanged(emptyList()) + viewState.onLoadingStateChanged(isLoading = false) + }.onCompletion { + viewState.onListAppended(emptyList()) + }.onEach { + if (isFirstCall) { + isFirstCall = false + viewState.onListChanged(it) + viewState.onLoadingStateChanged(isLoading = false) + } else { + viewState.onListAppended(it) + } + }.launchIn(presenterScope + Dispatchers.Default) } } \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/settings/AppUpdateChecker.kt b/app/src/main/java/org/koitharu/kotatsu/ui/settings/AppUpdateChecker.kt index 6eac3ce7a..78ff43e12 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/settings/AppUpdateChecker.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/settings/AppUpdateChecker.kt @@ -11,9 +11,7 @@ import com.google.android.material.dialog.MaterialAlertDialogBuilder import kotlinx.coroutines.CancellationException import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch -import kotlinx.coroutines.withContext -import org.koin.core.component.KoinComponent -import org.koin.core.component.inject +import org.koin.android.ext.android.inject import org.koitharu.kotatsu.BuildConfig import org.koitharu.kotatsu.R import org.koitharu.kotatsu.core.github.AppVersion @@ -32,9 +30,10 @@ import java.security.cert.CertificateFactory import java.security.cert.X509Certificate import java.util.concurrent.TimeUnit -class AppUpdateChecker(private val activity: ComponentActivity) : KoinComponent { +class AppUpdateChecker(private val activity: ComponentActivity) { - private val settings by inject() + private val settings by activity.inject() + private val repo by activity.inject() operator fun invoke() { if (isUpdateSupported(activity) && settings.appUpdateAuto && settings.appUpdate + PERIOD < System.currentTimeMillis()) { @@ -42,12 +41,9 @@ class AppUpdateChecker(private val activity: ComponentActivity) : KoinComponent } } - private fun launch() = activity.lifecycleScope.launch { + private fun launch() = activity.lifecycleScope.launch(Dispatchers.Main) { try { - val repo = GithubRepository() - val version = withContext(Dispatchers.IO) { - repo.getLatestVersion() - } + val version = repo.getLatestVersion() val newVersionId = VersionId.parse(version.name) val currentVersionId = VersionId.parse(BuildConfig.VERSION_NAME) if (newVersionId > currentVersionId) { diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/settings/HistorySettingsFragment.kt b/app/src/main/java/org/koitharu/kotatsu/ui/settings/HistorySettingsFragment.kt index 435b73b23..dc73e5056 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/settings/HistorySettingsFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/settings/HistorySettingsFragment.kt @@ -7,10 +7,11 @@ import com.google.android.material.snackbar.Snackbar import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext +import org.koin.android.ext.android.inject import org.koitharu.kotatsu.R import org.koitharu.kotatsu.core.local.Cache import org.koitharu.kotatsu.domain.tracking.TrackingRepository -import org.koitharu.kotatsu.ui.common.BasePreferenceFragment +import org.koitharu.kotatsu.ui.base.BasePreferenceFragment import org.koitharu.kotatsu.ui.search.MangaSuggestionsProvider import org.koitharu.kotatsu.utils.CacheUtils import org.koitharu.kotatsu.utils.FileSizeUtils @@ -18,9 +19,7 @@ import org.koitharu.kotatsu.utils.ext.getDisplayMessage class HistorySettingsFragment : BasePreferenceFragment(R.string.history_and_cache) { - private val trackerRepo by lazy { - TrackingRepository() - } + private val trackerRepo by inject() override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { addPreferencesFromResource(R.xml.pref_history) diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/settings/MainSettingsFragment.kt b/app/src/main/java/org/koitharu/kotatsu/ui/settings/MainSettingsFragment.kt index d4c8274fc..299c08a91 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/settings/MainSettingsFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/settings/MainSettingsFragment.kt @@ -15,9 +15,9 @@ import com.google.android.material.snackbar.Snackbar import org.koitharu.kotatsu.R import org.koitharu.kotatsu.core.model.MangaSource import org.koitharu.kotatsu.core.prefs.ListMode -import org.koitharu.kotatsu.ui.common.BasePreferenceFragment -import org.koitharu.kotatsu.ui.common.dialog.StorageSelectDialog -import org.koitharu.kotatsu.ui.common.dialog.TextInputDialog +import org.koitharu.kotatsu.ui.base.BasePreferenceFragment +import org.koitharu.kotatsu.ui.base.dialog.StorageSelectDialog +import org.koitharu.kotatsu.ui.base.dialog.TextInputDialog import org.koitharu.kotatsu.ui.list.ListModeSelectDialog import org.koitharu.kotatsu.ui.settings.utils.MultiSummaryProvider import org.koitharu.kotatsu.ui.tracker.TrackWorker diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/settings/NetworkSettingsFragment.kt b/app/src/main/java/org/koitharu/kotatsu/ui/settings/NetworkSettingsFragment.kt index b4109e45c..435702315 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/settings/NetworkSettingsFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/settings/NetworkSettingsFragment.kt @@ -2,7 +2,7 @@ package org.koitharu.kotatsu.ui.settings import android.os.Bundle import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.ui.common.BasePreferenceFragment +import org.koitharu.kotatsu.ui.base.BasePreferenceFragment class NetworkSettingsFragment : BasePreferenceFragment(R.string.settings) { diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/settings/NotificationSettingsLegacyFragment.kt b/app/src/main/java/org/koitharu/kotatsu/ui/settings/NotificationSettingsLegacyFragment.kt index 0a598c773..e4958649f 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/settings/NotificationSettingsLegacyFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/settings/NotificationSettingsLegacyFragment.kt @@ -4,7 +4,7 @@ import android.media.RingtoneManager import android.os.Bundle import androidx.preference.Preference import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.ui.common.BasePreferenceFragment +import org.koitharu.kotatsu.ui.base.BasePreferenceFragment import org.koitharu.kotatsu.ui.settings.utils.RingtonePickContract import org.koitharu.kotatsu.utils.ext.toUriOrNull diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/settings/ReaderSettingsFragment.kt b/app/src/main/java/org/koitharu/kotatsu/ui/settings/ReaderSettingsFragment.kt index a08633075..7fe7c061b 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/settings/ReaderSettingsFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/settings/ReaderSettingsFragment.kt @@ -3,7 +3,7 @@ package org.koitharu.kotatsu.ui.settings import android.os.Bundle import androidx.preference.MultiSelectListPreference import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.ui.common.BasePreferenceFragment +import org.koitharu.kotatsu.ui.base.BasePreferenceFragment import org.koitharu.kotatsu.ui.settings.utils.MultiSummaryProvider class ReaderSettingsFragment : BasePreferenceFragment(R.string.reader_settings) { diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/settings/SettingsActivity.kt b/app/src/main/java/org/koitharu/kotatsu/ui/settings/SettingsActivity.kt index 42c9a487b..8154fc47d 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/settings/SettingsActivity.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/settings/SettingsActivity.kt @@ -9,7 +9,7 @@ import androidx.preference.Preference import androidx.preference.PreferenceFragmentCompat import org.koitharu.kotatsu.R import org.koitharu.kotatsu.core.model.MangaSource -import org.koitharu.kotatsu.ui.common.BaseActivity +import org.koitharu.kotatsu.ui.base.BaseActivity class SettingsActivity : BaseActivity(), PreferenceFragmentCompat.OnPreferenceStartFragmentCallback { @@ -27,7 +27,10 @@ class SettingsActivity : BaseActivity(), } @Suppress("DEPRECATION") - override fun onPreferenceStartFragment(caller: PreferenceFragmentCompat, pref: Preference): Boolean { + override fun onPreferenceStartFragment( + caller: PreferenceFragmentCompat, + pref: Preference + ): Boolean { val fm = supportFragmentManager val fragment = fm.fragmentFactory.instantiate(classLoader, pref.fragment) fragment.arguments = pref.extras diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/settings/sources/SourceViewHolder.kt b/app/src/main/java/org/koitharu/kotatsu/ui/settings/sources/SourceViewHolder.kt index 4440b2aac..dccb053b8 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/settings/sources/SourceViewHolder.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/settings/sources/SourceViewHolder.kt @@ -4,13 +4,13 @@ import android.view.ViewGroup import kotlinx.android.synthetic.main.item_source_config.* import org.koitharu.kotatsu.R import org.koitharu.kotatsu.core.model.MangaSource -import org.koitharu.kotatsu.ui.common.list.BaseViewHolder +import org.koitharu.kotatsu.ui.base.list.BaseViewHolder class SourceViewHolder(parent: ViewGroup) : BaseViewHolder(parent, R.layout.item_source_config) { - override fun onBind(data: MangaSource, extra: Boolean) { - textView_title.text = data.title + override fun onBind(data: MangaSource, extra: Boolean) { + textView_title.text = data.title imageView_hidden.isChecked = extra - } + } } \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/settings/sources/SourcesAdapter.kt b/app/src/main/java/org/koitharu/kotatsu/ui/settings/sources/SourcesAdapter.kt index 4081dc37b..5525ddd36 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/settings/sources/SourcesAdapter.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/settings/sources/SourcesAdapter.kt @@ -10,7 +10,7 @@ import org.koin.core.component.inject import org.koitharu.kotatsu.core.model.MangaSource import org.koitharu.kotatsu.core.prefs.AppSettings import org.koitharu.kotatsu.domain.MangaProviderFactory -import org.koitharu.kotatsu.ui.common.list.OnRecyclerItemClickListener +import org.koitharu.kotatsu.ui.base.list.OnRecyclerItemClickListener import org.koitharu.kotatsu.utils.ext.safe class SourcesAdapter(private val onItemClickListener: OnRecyclerItemClickListener) : diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/settings/sources/SourcesSettingsFragment.kt b/app/src/main/java/org/koitharu/kotatsu/ui/settings/sources/SourcesSettingsFragment.kt index c97276681..ba39fa748 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/settings/sources/SourcesSettingsFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/settings/sources/SourcesSettingsFragment.kt @@ -8,8 +8,8 @@ import androidx.recyclerview.widget.RecyclerView import kotlinx.android.synthetic.main.fragment_settings_sources.* import org.koitharu.kotatsu.R import org.koitharu.kotatsu.core.model.MangaSource -import org.koitharu.kotatsu.ui.common.BaseFragment -import org.koitharu.kotatsu.ui.common.list.OnRecyclerItemClickListener +import org.koitharu.kotatsu.ui.base.BaseFragment +import org.koitharu.kotatsu.ui.base.list.OnRecyclerItemClickListener import org.koitharu.kotatsu.ui.settings.SettingsActivity class SourcesSettingsFragment : BaseFragment(R.layout.fragment_settings_sources), @@ -44,7 +44,9 @@ class SourcesSettingsFragment : BaseFragment(R.layout.fragment_settings_sources) } override fun onItemLongClick(item: MangaSource, position: Int, view: View): Boolean { - reorderHelper.startDrag(recyclerView.findViewHolderForAdapterPosition(position) ?: return false) + reorderHelper.startDrag( + recyclerView.findViewHolderForAdapterPosition(position) ?: return false + ) return true } } \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/tracker/TrackWorker.kt b/app/src/main/java/org/koitharu/kotatsu/ui/tracker/TrackWorker.kt index 45d66bf5a..a7a7b909f 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/tracker/TrackWorker.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/tracker/TrackWorker.kt @@ -9,7 +9,7 @@ import androidx.annotation.RequiresApi import androidx.core.app.NotificationCompat import androidx.core.content.ContextCompat import androidx.work.* -import coil.Coil +import coil.ImageLoader import coil.request.ImageRequest import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext @@ -34,6 +34,8 @@ class TrackWorker(context: Context, workerParams: WorkerParameters) : applicationContext.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager } + private val coil by inject() + private val repository by inject() private val settings by inject() override suspend fun doWork(): Result = withContext(Dispatchers.Default) { @@ -41,8 +43,7 @@ class TrackWorker(context: Context, workerParams: WorkerParameters) : if (trackSources.isEmpty()) { return@withContext Result.success() } - val repo = TrackingRepository() - val tracks = repo.getAllTracks( + val tracks = repository.getAllTracks( useFavourites = AppSettings.TRACK_FAVOURITES in trackSources, useHistory = AppSettings.TRACK_HISTORY in trackSources ) @@ -58,7 +59,7 @@ class TrackWorker(context: Context, workerParams: WorkerParameters) : val chapters = details?.chapters ?: continue when { track.knownChaptersCount == -1 -> { //first check - repo.storeTrackResult( + repository.storeTrackResult( mangaId = track.manga.id, knownChaptersCount = chapters.size, lastChapterId = chapters.lastOrNull()?.id ?: 0L, @@ -67,7 +68,7 @@ class TrackWorker(context: Context, workerParams: WorkerParameters) : ) } track.knownChaptersCount == 0 && track.lastChapterId == 0L -> { //manga was empty on last check - repo.storeTrackResult( + repository.storeTrackResult( mangaId = track.manga.id, knownChaptersCount = track.knownChaptersCount, lastChapterId = 0L, @@ -85,7 +86,7 @@ class TrackWorker(context: Context, workerParams: WorkerParameters) : val knownChapter = chapters.indexOfLast { it.id == track.lastChapterId } if (knownChapter == -1) { // confuse. reset anything - repo.storeTrackResult( + repository.storeTrackResult( mangaId = track.manga.id, knownChaptersCount = chapters.size, lastChapterId = chapters.lastOrNull()?.id ?: 0L, @@ -94,7 +95,7 @@ class TrackWorker(context: Context, workerParams: WorkerParameters) : ) } else { val newChapters = chapters.takeLast(chapters.size - knownChapter + 1) - repo.storeTrackResult( + repository.storeTrackResult( mangaId = track.manga.id, knownChaptersCount = knownChapter + 1, lastChapterId = track.lastChapterId, @@ -110,7 +111,7 @@ class TrackWorker(context: Context, workerParams: WorkerParameters) : } else -> { val newChapters = chapters.takeLast(chapters.size - track.knownChaptersCount) - repo.storeTrackResult( + repository.storeTrackResult( mangaId = track.manga.id, knownChaptersCount = track.knownChaptersCount, lastChapterId = track.lastChapterId, @@ -125,7 +126,7 @@ class TrackWorker(context: Context, workerParams: WorkerParameters) : } success++ } - repo.cleanup() + repository.cleanup() if (success == 0) { Result.retry() } else { @@ -149,7 +150,7 @@ class TrackWorker(context: Context, workerParams: WorkerParameters) : setContentTitle(manga.title) setNumber(newChapters.size) setLargeIcon( - Coil.execute( + coil.execute( ImageRequest.Builder(applicationContext) .data(manga.coverUrl) .build() diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/utils/protect/ProtectActivity.kt b/app/src/main/java/org/koitharu/kotatsu/ui/utils/protect/ProtectActivity.kt index de6621bd8..5fa104455 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/utils/protect/ProtectActivity.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/utils/protect/ProtectActivity.kt @@ -13,7 +13,7 @@ import android.widget.TextView import kotlinx.android.synthetic.main.activity_protect.* import moxy.ktx.moxyPresenter import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.ui.common.BaseActivity +import org.koitharu.kotatsu.ui.base.BaseActivity import org.koitharu.kotatsu.utils.ext.getDisplayMessage class ProtectActivity : BaseActivity(), ProtectView, TextView.OnEditorActionListener, TextWatcher { diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/utils/protect/ProtectPresenter.kt b/app/src/main/java/org/koitharu/kotatsu/ui/utils/protect/ProtectPresenter.kt index aab2ecf29..51d404adb 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/utils/protect/ProtectPresenter.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/utils/protect/ProtectPresenter.kt @@ -4,7 +4,7 @@ import kotlinx.coroutines.delay import org.koin.core.component.inject import org.koitharu.kotatsu.core.exceptions.WrongPasswordException import org.koitharu.kotatsu.core.prefs.AppSettings -import org.koitharu.kotatsu.ui.common.BasePresenter +import org.koitharu.kotatsu.ui.base.BasePresenter import org.koitharu.kotatsu.utils.ext.md5 class ProtectPresenter : BasePresenter() { diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/utils/protect/ProtectView.kt b/app/src/main/java/org/koitharu/kotatsu/ui/utils/protect/ProtectView.kt index f2c7e4188..8ab4781d1 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/utils/protect/ProtectView.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/utils/protect/ProtectView.kt @@ -1,7 +1,7 @@ package org.koitharu.kotatsu.ui.utils.protect import moxy.viewstate.strategy.alias.SingleState -import org.koitharu.kotatsu.ui.common.BaseMvpView +import org.koitharu.kotatsu.ui.base.BaseMvpView interface ProtectView : BaseMvpView { diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/widget/WidgetUpdater.kt b/app/src/main/java/org/koitharu/kotatsu/ui/widget/WidgetUpdater.kt index 68bc02675..ac762dc3c 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/widget/WidgetUpdater.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/widget/WidgetUpdater.kt @@ -20,8 +20,6 @@ class WidgetUpdater(private val context: Context) : OnFavouritesChangeListener, updateWidget(RecentWidgetProvider::class.java) } - override fun onCategoriesChanged() = Unit - private fun updateWidget(cls: Class<*>) { val intent = Intent(context, cls) intent.action = AppWidgetManager.ACTION_APPWIDGET_UPDATE diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/widget/recent/RecentListFactory.kt b/app/src/main/java/org/koitharu/kotatsu/ui/widget/recent/RecentListFactory.kt index ca7b7341f..45ae59b7c 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/widget/recent/RecentListFactory.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/widget/recent/RecentListFactory.kt @@ -4,7 +4,7 @@ import android.content.Context import android.content.Intent import android.widget.RemoteViews import android.widget.RemoteViewsService -import coil.Coil +import coil.ImageLoader import coil.executeBlocking import coil.request.ImageRequest import kotlinx.coroutines.runBlocking @@ -15,7 +15,11 @@ import org.koitharu.kotatsu.ui.details.MangaDetailsActivity import org.koitharu.kotatsu.utils.ext.requireBitmap import java.io.IOException -class RecentListFactory(private val context: Context) : RemoteViewsService.RemoteViewsFactory { +class RecentListFactory( + private val context: Context, + private val historyRepository: HistoryRepository, + private val coil: ImageLoader +) : RemoteViewsService.RemoteViewsFactory { private val dataSet = ArrayList() @@ -28,7 +32,7 @@ class RecentListFactory(private val context: Context) : RemoteViewsService.Remot override fun onDataSetChanged() { dataSet.clear() - val data = runBlocking { HistoryRepository().getList(0, 10) } + val data = runBlocking { historyRepository.getList(0, 10) } dataSet.addAll(data) } @@ -38,7 +42,7 @@ class RecentListFactory(private val context: Context) : RemoteViewsService.Remot val views = RemoteViews(context.packageName, R.layout.item_recent) val item = dataSet[position] try { - val cover = Coil.imageLoader(context).executeBlocking( + val cover = coil.executeBlocking( ImageRequest.Builder(context) .data(item.coverUrl) .build() diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/widget/recent/RecentWidgetService.kt b/app/src/main/java/org/koitharu/kotatsu/ui/widget/recent/RecentWidgetService.kt index 77fde8ae3..230c9e1f3 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/widget/recent/RecentWidgetService.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/widget/recent/RecentWidgetService.kt @@ -2,10 +2,11 @@ package org.koitharu.kotatsu.ui.widget.recent import android.content.Intent import android.widget.RemoteViewsService +import org.koin.android.ext.android.get class RecentWidgetService : RemoteViewsService() { override fun onGetViewFactory(intent: Intent): RemoteViewsFactory { - return RecentListFactory(this) + return RecentListFactory(this, get(), get()) } } \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/widget/shelf/CategorySelectAdapter.kt b/app/src/main/java/org/koitharu/kotatsu/ui/widget/shelf/CategorySelectAdapter.kt index 16b366fda..f9b7dfcf1 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/widget/shelf/CategorySelectAdapter.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/widget/shelf/CategorySelectAdapter.kt @@ -2,8 +2,8 @@ package org.koitharu.kotatsu.ui.widget.shelf import android.view.ViewGroup import org.koitharu.kotatsu.core.model.FavouriteCategory -import org.koitharu.kotatsu.ui.common.list.BaseRecyclerAdapter -import org.koitharu.kotatsu.ui.common.list.OnRecyclerItemClickListener +import org.koitharu.kotatsu.ui.base.list.BaseRecyclerAdapter +import org.koitharu.kotatsu.ui.base.list.OnRecyclerItemClickListener class CategorySelectAdapter(onItemClickListener: OnRecyclerItemClickListener? = null) : BaseRecyclerAdapter(onItemClickListener) { diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/widget/shelf/CategorySelectHolder.kt b/app/src/main/java/org/koitharu/kotatsu/ui/widget/shelf/CategorySelectHolder.kt index 3dc667da9..3e1871a5e 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/widget/shelf/CategorySelectHolder.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/widget/shelf/CategorySelectHolder.kt @@ -4,7 +4,7 @@ import android.view.ViewGroup import kotlinx.android.synthetic.main.item_category_checkable.* import org.koitharu.kotatsu.R import org.koitharu.kotatsu.core.model.FavouriteCategory -import org.koitharu.kotatsu.ui.common.list.BaseViewHolder +import org.koitharu.kotatsu.ui.base.list.BaseViewHolder class CategorySelectHolder(parent: ViewGroup) : BaseViewHolder(parent, R.layout.item_category_checkable_single) { diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/widget/shelf/ShelfConfigActivity.kt b/app/src/main/java/org/koitharu/kotatsu/ui/widget/shelf/ShelfConfigActivity.kt index 308ea678e..bd217cc04 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/widget/shelf/ShelfConfigActivity.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/widget/shelf/ShelfConfigActivity.kt @@ -18,8 +18,8 @@ import moxy.ktx.moxyPresenter import org.koitharu.kotatsu.R import org.koitharu.kotatsu.core.model.FavouriteCategory import org.koitharu.kotatsu.core.prefs.AppWidgetConfig -import org.koitharu.kotatsu.ui.common.BaseActivity -import org.koitharu.kotatsu.ui.common.list.OnRecyclerItemClickListener +import org.koitharu.kotatsu.ui.base.BaseActivity +import org.koitharu.kotatsu.ui.base.list.OnRecyclerItemClickListener import org.koitharu.kotatsu.ui.list.favourites.categories.FavouriteCategoriesPresenter import org.koitharu.kotatsu.ui.list.favourites.categories.FavouriteCategoriesView import org.koitharu.kotatsu.utils.ext.getDisplayMessage diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/widget/shelf/ShelfListFactory.kt b/app/src/main/java/org/koitharu/kotatsu/ui/widget/shelf/ShelfListFactory.kt index 532f95038..f3b5b1e09 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/widget/shelf/ShelfListFactory.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/widget/shelf/ShelfListFactory.kt @@ -4,7 +4,7 @@ import android.content.Context import android.content.Intent import android.widget.RemoteViews import android.widget.RemoteViewsService -import coil.Coil +import coil.ImageLoader import coil.executeBlocking import coil.request.ImageRequest import kotlinx.coroutines.runBlocking @@ -16,7 +16,12 @@ import org.koitharu.kotatsu.ui.details.MangaDetailsActivity import org.koitharu.kotatsu.utils.ext.requireBitmap import java.io.IOException -class ShelfListFactory(private val context: Context, widgetId: Int) : RemoteViewsService.RemoteViewsFactory { +class ShelfListFactory( + private val context: Context, + private val favouritesRepository: FavouritesRepository, + private val coil: ImageLoader, + widgetId: Int +) : RemoteViewsService.RemoteViewsFactory { private val dataSet = ArrayList() private val config = AppWidgetConfig.getInstance(context, widgetId) @@ -32,11 +37,10 @@ class ShelfListFactory(private val context: Context, widgetId: Int) : RemoteView dataSet.clear() val data = runBlocking { val category = config.categoryId - val repo = FavouritesRepository() if (category == 0L) { - repo.getAllManga() + favouritesRepository.getAllManga() } else { - repo.getManga(category) + favouritesRepository.getManga(category) } } dataSet.addAll(data) @@ -49,7 +53,7 @@ class ShelfListFactory(private val context: Context, widgetId: Int) : RemoteView val item = dataSet[position] views.setTextViewText(R.id.textView_title, item.title) try { - val cover = Coil.imageLoader(context).executeBlocking( + val cover = coil.executeBlocking( ImageRequest.Builder(context) .data(item.coverUrl) .build() diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/widget/shelf/ShelfWidgetService.kt b/app/src/main/java/org/koitharu/kotatsu/ui/widget/shelf/ShelfWidgetService.kt index f2d6a63de..1ad3032b5 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/widget/shelf/ShelfWidgetService.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/widget/shelf/ShelfWidgetService.kt @@ -3,12 +3,15 @@ package org.koitharu.kotatsu.ui.widget.shelf import android.appwidget.AppWidgetManager import android.content.Intent import android.widget.RemoteViewsService +import org.koin.android.ext.android.get class ShelfWidgetService : RemoteViewsService() { override fun onGetViewFactory(intent: Intent): RemoteViewsFactory { - val widgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, - AppWidgetManager.INVALID_APPWIDGET_ID) - return ShelfListFactory(this, widgetId) + val widgetId = intent.getIntExtra( + AppWidgetManager.EXTRA_APPWIDGET_ID, + AppWidgetManager.INVALID_APPWIDGET_ID + ) + return ShelfListFactory(this, get(), get(), widgetId) } } \ No newline at end of file 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 3f80f7cb5..420d92bde 100644 --- a/app/src/main/java/org/koitharu/kotatsu/utils/CacheUtils.kt +++ b/app/src/main/java/org/koitharu/kotatsu/utils/CacheUtils.kt @@ -1,40 +1,53 @@ package org.koitharu.kotatsu.utils import android.content.Context +import android.os.StatFs import androidx.annotation.WorkerThread import okhttp3.Cache import okhttp3.CacheControl import org.koitharu.kotatsu.utils.ext.computeSize import org.koitharu.kotatsu.utils.ext.sub import org.koitharu.kotatsu.utils.ext.sumByLong +import java.io.File object CacheUtils { - @JvmStatic val CONTROL_DISABLED = CacheControl.Builder() .noStore() .build() - @JvmStatic fun getCacheDirs(context: Context) = (context.externalCacheDirs + context.cacheDir) .filterNotNull() .distinctBy { it.absolutePath } - @JvmStatic @WorkerThread fun computeCacheSize(context: Context, name: String) = getCacheDirs(context) .map { it.sub(name) } .sumByLong { x -> x.computeSize() } - @JvmStatic @WorkerThread fun clearCache(context: Context, name: String) = getCacheDirs(context) .map { it.sub(name) } .forEach { it.deleteRecursively() } - @JvmStatic - fun createHttpCache(context: Context) = Cache( - directory = (context.externalCacheDir ?: context.cacheDir).sub("http"), - maxSize = FileSizeUtils.mbToBytes(60) - ) + fun createHttpCache(context: Context): Cache { + val directory = (context.externalCacheDir ?: context.cacheDir).sub("http") + directory.mkdirs() + val maxSize = calculateDiskCacheSize(directory) + return Cache(directory, maxSize) + } + + private fun calculateDiskCacheSize(cacheDirectory: File): Long { + return try { + val cacheDir = StatFs(cacheDirectory.absolutePath) + val size = DISK_CACHE_PERCENTAGE * cacheDir.blockCountLong * cacheDir.blockSizeLong + return size.toLong().coerceIn(MIN_DISK_CACHE_SIZE, MAX_DISK_CACHE_SIZE) + } catch (_: Exception) { + MIN_DISK_CACHE_SIZE + } + } + + private const val DISK_CACHE_PERCENTAGE = 0.02 + private const val MIN_DISK_CACHE_SIZE: Long = 10 * 1024 * 1024 // 10MB + private const val MAX_DISK_CACHE_SIZE: Long = 250 * 1024 * 1024 // 250MB } \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/MangaShortcut.kt b/app/src/main/java/org/koitharu/kotatsu/utils/MangaShortcut.kt index 536ad8243..b1d712b2e 100644 --- a/app/src/main/java/org/koitharu/kotatsu/utils/MangaShortcut.kt +++ b/app/src/main/java/org/koitharu/kotatsu/utils/MangaShortcut.kt @@ -9,11 +9,13 @@ import androidx.annotation.RequiresApi import androidx.core.content.pm.ShortcutInfoCompat import androidx.core.content.pm.ShortcutManagerCompat import androidx.core.graphics.drawable.IconCompat -import coil.Coil +import coil.ImageLoader import coil.request.ImageRequest import coil.size.PixelSize import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext +import org.koin.core.component.KoinComponent +import org.koin.core.component.inject import org.koitharu.kotatsu.R import org.koitharu.kotatsu.core.model.Manga import org.koitharu.kotatsu.domain.MangaDataRepository @@ -21,9 +23,11 @@ import org.koitharu.kotatsu.ui.details.MangaDetailsActivity import org.koitharu.kotatsu.utils.ext.requireBitmap import org.koitharu.kotatsu.utils.ext.safe -class MangaShortcut(private val manga: Manga) { +class MangaShortcut(private val manga: Manga) : KoinComponent { private val shortcutId = manga.id.toString() + private val coil by inject() + private val mangaRepository by inject() @RequiresApi(Build.VERSION_CODES.N_MR1) suspend fun addAppShortcut(context: Context) { @@ -66,7 +70,7 @@ class MangaShortcut(private val manga: Manga) { val icon = safe { val size = getIconSize(context) withContext(Dispatchers.IO) { - val bmp = Coil.execute( + val bmp = coil.execute( ImageRequest.Builder(context) .data(manga.coverUrl) .build() @@ -74,7 +78,7 @@ class MangaShortcut(private val manga: Manga) { ThumbnailUtils.extractThumbnail(bmp, size.width, size.height, 0) } } - MangaDataRepository().storeManga(manga) + mangaRepository.storeManga(manga) return ShortcutInfoCompat.Builder(context, manga.id.toString()) .setShortLabel(manga.title) .setLongLabel(manga.title) diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/UiUtils.kt b/app/src/main/java/org/koitharu/kotatsu/utils/UiUtils.kt index 1b268a848..d2c93ba5a 100644 --- a/app/src/main/java/org/koitharu/kotatsu/utils/UiUtils.kt +++ b/app/src/main/java/org/koitharu/kotatsu/utils/UiUtils.kt @@ -12,7 +12,6 @@ import kotlin.math.roundToInt object UiUtils { - @JvmStatic fun resolveGridSpanCount(context: Context, width: Int = 0): Int { val scaleFactor = AppSettings(context).gridSize / 100f val cellWidth = context.resources.getDimension(R.dimen.preferred_grid_width) * scaleFactor @@ -23,7 +22,6 @@ object UiUtils { return estimatedCount.coerceAtLeast(2) } - @JvmStatic fun isTablet(context: Context) = context.resources.getBoolean(R.bool.is_tablet) object SpanCountResolver : View.OnLayoutChangeListener { diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/ext/CoilExt.kt b/app/src/main/java/org/koitharu/kotatsu/utils/ext/CoilExt.kt index 8fb7b5b3e..13239be72 100644 --- a/app/src/main/java/org/koitharu/kotatsu/utils/ext/CoilExt.kt +++ b/app/src/main/java/org/koitharu/kotatsu/utils/ext/CoilExt.kt @@ -1,10 +1,21 @@ package org.koitharu.kotatsu.utils.ext +import android.widget.ImageView import androidx.core.graphics.drawable.toBitmap +import coil.ImageLoader import coil.request.ErrorResult +import coil.request.ImageRequest import coil.request.ImageResult import coil.request.SuccessResult +@Suppress("NOTHING_TO_INLINE") +inline fun ImageView.newImageRequest(url: String) = ImageRequest.Builder(context) + .data(url) + .target(this) + +@Suppress("NOTHING_TO_INLINE") +inline fun ImageRequest.Builder.enqueueWith(loader: ImageLoader) = loader.enqueue(build()) + fun ImageResult.requireBitmap() = when (this) { is SuccessResult -> drawable.toBitmap() is ErrorResult -> throw throwable diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/ext/CoroutineExt.kt b/app/src/main/java/org/koitharu/kotatsu/utils/ext/CoroutineExt.kt index f078d3180..50a29db9f 100644 --- a/app/src/main/java/org/koitharu/kotatsu/utils/ext/CoroutineExt.kt +++ b/app/src/main/java/org/koitharu/kotatsu/utils/ext/CoroutineExt.kt @@ -72,4 +72,11 @@ fun CoroutineScope.launchInstead( } } block() -} \ No newline at end of file +} + +val IgnoreErrors + get() = CoroutineExceptionHandler { _, e -> + if (BuildConfig.DEBUG) { + e.printStackTrace() + } + } \ No newline at end of file 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 812c33971..fc11e622d 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 @@ -10,7 +10,8 @@ import java.io.File import java.util.zip.ZipEntry import java.util.zip.ZipFile -fun File.sub(name: String) = File(this, name) +@Suppress("NOTHING_TO_INLINE") +inline fun File.sub(name: String) = File(this, name) fun File.takeIfReadable() = takeIf { it.exists() && it.canRead() } diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/ext/ViewExt.kt b/app/src/main/java/org/koitharu/kotatsu/utils/ext/ViewExt.kt index 02dc03d56..c79e54c35 100644 --- a/app/src/main/java/org/koitharu/kotatsu/utils/ext/ViewExt.kt +++ b/app/src/main/java/org/koitharu/kotatsu/utils/ext/ViewExt.kt @@ -20,7 +20,7 @@ import androidx.recyclerview.widget.RecyclerView import androidx.viewpager2.widget.ViewPager2 import com.google.android.material.chip.Chip import com.google.android.material.chip.ChipGroup -import org.koitharu.kotatsu.ui.common.ChipsFactory +import org.koitharu.kotatsu.ui.base.ChipsFactory fun View.hideKeyboard() { val imm = context.getSystemService(Activity.INPUT_METHOD_SERVICE) as InputMethodManager diff --git a/app/src/main/res/layout/item_manga_grid.xml b/app/src/main/res/layout/item_manga_grid.xml index 879ddd85e..05a81777d 100644 --- a/app/src/main/res/layout/item_manga_grid.xml +++ b/app/src/main/res/layout/item_manga_grid.xml @@ -15,7 +15,7 @@ android:layout_height="wrap_content" android:orientation="vertical"> - - + android:orientation="vertical" + android:scaleType="centerCrop" /> - + android:orientation="vertical" + android:scaleType="centerCrop" /> + app:drawableStartCompat="@drawable/ic_star_rating" + tools:text="10/10" /> diff --git a/app/src/main/res/layout/item_page_thumb.xml b/app/src/main/res/layout/item_page_thumb.xml index f59ed2e9a..f0d14883b 100644 --- a/app/src/main/res/layout/item_page_thumb.xml +++ b/app/src/main/res/layout/item_page_thumb.xml @@ -6,7 +6,7 @@ android:layout_height="wrap_content" android:background="?attr/scrimBackground"> - - -