Merge branch 'feature/nextgen_dagger' into feature/nextgen
commit
532ec0129a
@ -1,76 +0,0 @@
|
|||||||
package org.koitharu.kotatsu.base.domain
|
|
||||||
|
|
||||||
import android.graphics.BitmapFactory
|
|
||||||
import android.net.Uri
|
|
||||||
import android.util.Size
|
|
||||||
import kotlinx.coroutines.Dispatchers
|
|
||||||
import kotlinx.coroutines.runInterruptible
|
|
||||||
import okhttp3.OkHttpClient
|
|
||||||
import okhttp3.Request
|
|
||||||
import org.koin.core.component.KoinComponent
|
|
||||||
import org.koin.core.component.get
|
|
||||||
import org.koitharu.kotatsu.core.network.CommonHeaders
|
|
||||||
import org.koitharu.kotatsu.core.parser.MangaRepository
|
|
||||||
import org.koitharu.kotatsu.parsers.model.MangaPage
|
|
||||||
import org.koitharu.kotatsu.parsers.util.await
|
|
||||||
import java.io.File
|
|
||||||
import java.io.InputStream
|
|
||||||
import java.util.zip.ZipFile
|
|
||||||
import kotlin.math.roundToInt
|
|
||||||
|
|
||||||
object MangaUtils : KoinComponent {
|
|
||||||
|
|
||||||
private const val MIN_WEBTOON_RATIO = 2
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Automatic determine type of manga by page size
|
|
||||||
* @return ReaderMode.WEBTOON if page is wide
|
|
||||||
*/
|
|
||||||
suspend fun determineMangaIsWebtoon(pages: List<MangaPage>): Boolean {
|
|
||||||
val pageIndex = (pages.size * 0.3).roundToInt()
|
|
||||||
val page = requireNotNull(pages.getOrNull(pageIndex)) { "No pages" }
|
|
||||||
val url = MangaRepository(page.source).getPageUrl(page)
|
|
||||||
val uri = Uri.parse(url)
|
|
||||||
val size = if (uri.scheme == "cbz") {
|
|
||||||
runInterruptible(Dispatchers.IO) {
|
|
||||||
val zip = ZipFile(uri.schemeSpecificPart)
|
|
||||||
val entry = zip.getEntry(uri.fragment)
|
|
||||||
zip.getInputStream(entry).use {
|
|
||||||
getBitmapSize(it)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
val request = Request.Builder()
|
|
||||||
.url(url)
|
|
||||||
.get()
|
|
||||||
.header(CommonHeaders.REFERER, page.referer)
|
|
||||||
.cacheControl(CommonHeaders.CACHE_CONTROL_DISABLED)
|
|
||||||
.build()
|
|
||||||
get<OkHttpClient>().newCall(request).await().use {
|
|
||||||
runInterruptible(Dispatchers.IO) {
|
|
||||||
getBitmapSize(it.body?.byteStream())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return size.width * MIN_WEBTOON_RATIO < size.height
|
|
||||||
}
|
|
||||||
|
|
||||||
suspend fun getImageMimeType(file: File): String? = runInterruptible(Dispatchers.IO) {
|
|
||||||
val options = BitmapFactory.Options().apply {
|
|
||||||
inJustDecodeBounds = true
|
|
||||||
}
|
|
||||||
BitmapFactory.decodeFile(file.path, options)?.recycle()
|
|
||||||
options.outMimeType
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun getBitmapSize(input: InputStream?): Size {
|
|
||||||
val options = BitmapFactory.Options().apply {
|
|
||||||
inJustDecodeBounds = true
|
|
||||||
}
|
|
||||||
BitmapFactory.decodeStream(input, null, options)?.recycle()
|
|
||||||
val imageHeight: Int = options.outHeight
|
|
||||||
val imageWidth: Int = options.outWidth
|
|
||||||
check(imageHeight > 0 && imageWidth > 0)
|
|
||||||
return Size(imageWidth, imageHeight)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -0,0 +1,18 @@
|
|||||||
|
package org.koitharu.kotatsu.base.ui.util
|
||||||
|
|
||||||
|
import dagger.hilt.EntryPoint
|
||||||
|
import dagger.hilt.InstallIn
|
||||||
|
import dagger.hilt.components.SingletonComponent
|
||||||
|
import org.koitharu.kotatsu.base.ui.BaseActivity
|
||||||
|
import org.koitharu.kotatsu.core.prefs.AppSettings
|
||||||
|
|
||||||
|
@EntryPoint
|
||||||
|
@InstallIn(SingletonComponent::class)
|
||||||
|
interface BaseActivityEntryPoint {
|
||||||
|
val settings: AppSettings
|
||||||
|
}
|
||||||
|
|
||||||
|
// Hilt cannot inject into parametrized classes
|
||||||
|
fun BaseActivityEntryPoint.inject(activity: BaseActivity<*>) {
|
||||||
|
activity.settings = settings
|
||||||
|
}
|
||||||
@ -1,14 +0,0 @@
|
|||||||
package org.koitharu.kotatsu.bookmarks
|
|
||||||
|
|
||||||
import org.koin.androidx.viewmodel.dsl.viewModel
|
|
||||||
import org.koin.dsl.module
|
|
||||||
import org.koitharu.kotatsu.bookmarks.domain.BookmarksRepository
|
|
||||||
import org.koitharu.kotatsu.bookmarks.ui.BookmarksViewModel
|
|
||||||
|
|
||||||
val bookmarksModule
|
|
||||||
get() = module {
|
|
||||||
|
|
||||||
factory { BookmarksRepository(get()) }
|
|
||||||
|
|
||||||
viewModel { BookmarksViewModel(get()) }
|
|
||||||
}
|
|
||||||
@ -0,0 +1,160 @@
|
|||||||
|
package org.koitharu.kotatsu.core
|
||||||
|
|
||||||
|
import android.app.Application
|
||||||
|
import android.content.Context
|
||||||
|
import android.provider.SearchRecentSuggestions
|
||||||
|
import android.text.Html
|
||||||
|
import androidx.collection.arraySetOf
|
||||||
|
import androidx.room.InvalidationTracker
|
||||||
|
import coil.ComponentRegistry
|
||||||
|
import coil.ImageLoader
|
||||||
|
import coil.decode.SvgDecoder
|
||||||
|
import coil.disk.DiskCache
|
||||||
|
import coil.util.DebugLogger
|
||||||
|
import dagger.Binds
|
||||||
|
import dagger.Module
|
||||||
|
import dagger.Provides
|
||||||
|
import dagger.hilt.InstallIn
|
||||||
|
import dagger.hilt.android.qualifiers.ApplicationContext
|
||||||
|
import dagger.hilt.components.SingletonComponent
|
||||||
|
import dagger.multibindings.ElementsIntoSet
|
||||||
|
import java.util.concurrent.TimeUnit
|
||||||
|
import javax.inject.Singleton
|
||||||
|
import kotlinx.coroutines.Dispatchers
|
||||||
|
import okhttp3.CookieJar
|
||||||
|
import okhttp3.OkHttpClient
|
||||||
|
import org.koitharu.kotatsu.BuildConfig
|
||||||
|
import org.koitharu.kotatsu.base.ui.util.ActivityRecreationHandle
|
||||||
|
import org.koitharu.kotatsu.core.db.MangaDatabase
|
||||||
|
import org.koitharu.kotatsu.core.network.*
|
||||||
|
import org.koitharu.kotatsu.core.os.ShortcutsUpdater
|
||||||
|
import org.koitharu.kotatsu.core.parser.MangaLoaderContextImpl
|
||||||
|
import org.koitharu.kotatsu.core.parser.MangaRepository
|
||||||
|
import org.koitharu.kotatsu.core.parser.favicon.FaviconFetcher
|
||||||
|
import org.koitharu.kotatsu.core.prefs.AppSettings
|
||||||
|
import org.koitharu.kotatsu.local.data.CacheDir
|
||||||
|
import org.koitharu.kotatsu.local.data.CbzFetcher
|
||||||
|
import org.koitharu.kotatsu.local.data.LocalStorageManager
|
||||||
|
import org.koitharu.kotatsu.main.ui.protect.AppProtectHelper
|
||||||
|
import org.koitharu.kotatsu.parsers.MangaLoaderContext
|
||||||
|
import org.koitharu.kotatsu.search.ui.MangaSuggestionsProvider
|
||||||
|
import org.koitharu.kotatsu.settings.backup.BackupObserver
|
||||||
|
import org.koitharu.kotatsu.sync.domain.SyncController
|
||||||
|
import org.koitharu.kotatsu.utils.ext.isLowRamDevice
|
||||||
|
import org.koitharu.kotatsu.utils.image.CoilImageGetter
|
||||||
|
import org.koitharu.kotatsu.widget.WidgetUpdater
|
||||||
|
|
||||||
|
@Module
|
||||||
|
@InstallIn(SingletonComponent::class)
|
||||||
|
interface AppModule {
|
||||||
|
|
||||||
|
@Binds
|
||||||
|
fun bindCookieJar(androidCookieJar: AndroidCookieJar): CookieJar
|
||||||
|
|
||||||
|
@Binds
|
||||||
|
fun bindMangaLoaderContext(mangaLoaderContextImpl: MangaLoaderContextImpl): MangaLoaderContext
|
||||||
|
|
||||||
|
@Binds
|
||||||
|
fun bindImageGetter(coilImageGetter: CoilImageGetter): Html.ImageGetter
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
|
||||||
|
@Provides
|
||||||
|
@Singleton
|
||||||
|
fun provideOkHttpClient(
|
||||||
|
localStorageManager: LocalStorageManager,
|
||||||
|
cookieJar: CookieJar,
|
||||||
|
settings: AppSettings,
|
||||||
|
): OkHttpClient {
|
||||||
|
val cache = localStorageManager.createHttpCache()
|
||||||
|
return OkHttpClient.Builder().apply {
|
||||||
|
connectTimeout(20, TimeUnit.SECONDS)
|
||||||
|
readTimeout(60, TimeUnit.SECONDS)
|
||||||
|
writeTimeout(20, TimeUnit.SECONDS)
|
||||||
|
cookieJar(cookieJar)
|
||||||
|
dns(DoHManager(cache, settings))
|
||||||
|
cache(cache)
|
||||||
|
addInterceptor(GZipInterceptor())
|
||||||
|
addInterceptor(UserAgentInterceptor())
|
||||||
|
addInterceptor(CloudFlareInterceptor())
|
||||||
|
}.build()
|
||||||
|
}
|
||||||
|
|
||||||
|
@Provides
|
||||||
|
@Singleton
|
||||||
|
fun provideMangaDatabase(
|
||||||
|
@ApplicationContext context: Context,
|
||||||
|
): MangaDatabase {
|
||||||
|
return MangaDatabase(context)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Provides
|
||||||
|
@Singleton
|
||||||
|
fun provideCoil(
|
||||||
|
@ApplicationContext context: Context,
|
||||||
|
okHttpClient: OkHttpClient,
|
||||||
|
mangaRepositoryFactory: MangaRepository.Factory,
|
||||||
|
): ImageLoader {
|
||||||
|
val httpClientFactory = {
|
||||||
|
okHttpClient.newBuilder()
|
||||||
|
.cache(null)
|
||||||
|
.build()
|
||||||
|
}
|
||||||
|
val diskCacheFactory = {
|
||||||
|
val rootDir = context.externalCacheDir ?: context.cacheDir
|
||||||
|
DiskCache.Builder()
|
||||||
|
.directory(rootDir.resolve(CacheDir.THUMBS.dir))
|
||||||
|
.build()
|
||||||
|
}
|
||||||
|
return ImageLoader.Builder(context)
|
||||||
|
.okHttpClient(httpClientFactory)
|
||||||
|
.interceptorDispatcher(Dispatchers.Default)
|
||||||
|
.fetcherDispatcher(Dispatchers.IO)
|
||||||
|
.decoderDispatcher(Dispatchers.Default)
|
||||||
|
.transformationDispatcher(Dispatchers.Default)
|
||||||
|
.diskCache(diskCacheFactory)
|
||||||
|
.logger(if (BuildConfig.DEBUG) DebugLogger() else null)
|
||||||
|
.allowRgb565(isLowRamDevice(context))
|
||||||
|
.components(
|
||||||
|
ComponentRegistry.Builder()
|
||||||
|
.add(SvgDecoder.Factory())
|
||||||
|
.add(CbzFetcher.Factory())
|
||||||
|
.add(FaviconFetcher.Factory(context, okHttpClient, mangaRepositoryFactory))
|
||||||
|
.build(),
|
||||||
|
).build()
|
||||||
|
}
|
||||||
|
|
||||||
|
@Provides
|
||||||
|
fun provideSearchSuggestions(
|
||||||
|
@ApplicationContext context: Context,
|
||||||
|
): SearchRecentSuggestions {
|
||||||
|
return MangaSuggestionsProvider.createSuggestions(context)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Provides
|
||||||
|
@Singleton
|
||||||
|
@ElementsIntoSet
|
||||||
|
fun provideDatabaseObservers(
|
||||||
|
widgetUpdater: WidgetUpdater,
|
||||||
|
shortcutsUpdater: ShortcutsUpdater,
|
||||||
|
backupObserver: BackupObserver,
|
||||||
|
syncController: SyncController,
|
||||||
|
): Set<@JvmSuppressWildcards InvalidationTracker.Observer> = arraySetOf(
|
||||||
|
widgetUpdater,
|
||||||
|
shortcutsUpdater,
|
||||||
|
backupObserver,
|
||||||
|
syncController,
|
||||||
|
)
|
||||||
|
|
||||||
|
@Provides
|
||||||
|
@Singleton
|
||||||
|
@ElementsIntoSet
|
||||||
|
fun provideActivityLifecycleCallbacks(
|
||||||
|
appProtectHelper: AppProtectHelper,
|
||||||
|
activityRecreationHandle: ActivityRecreationHandle,
|
||||||
|
): Set<@JvmSuppressWildcards Application.ActivityLifecycleCallbacks> = arraySetOf(
|
||||||
|
appProtectHelper,
|
||||||
|
activityRecreationHandle,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -1,9 +0,0 @@
|
|||||||
package org.koitharu.kotatsu.core.db
|
|
||||||
|
|
||||||
import org.koin.android.ext.koin.androidContext
|
|
||||||
import org.koin.dsl.module
|
|
||||||
|
|
||||||
val databaseModule
|
|
||||||
get() = module {
|
|
||||||
single { MangaDatabase(androidContext()) }
|
|
||||||
}
|
|
||||||
@ -1,9 +0,0 @@
|
|||||||
package org.koitharu.kotatsu.core.github
|
|
||||||
|
|
||||||
import org.koin.android.ext.koin.androidContext
|
|
||||||
import org.koin.dsl.module
|
|
||||||
|
|
||||||
val appUpdateModule
|
|
||||||
get() = module {
|
|
||||||
single { AppUpdateRepository(androidContext(), get()) }
|
|
||||||
}
|
|
||||||
@ -1,30 +0,0 @@
|
|||||||
package org.koitharu.kotatsu.core.network
|
|
||||||
|
|
||||||
import okhttp3.CookieJar
|
|
||||||
import okhttp3.OkHttpClient
|
|
||||||
import org.koin.dsl.bind
|
|
||||||
import org.koin.dsl.module
|
|
||||||
import org.koitharu.kotatsu.core.parser.MangaLoaderContextImpl
|
|
||||||
import org.koitharu.kotatsu.local.data.LocalStorageManager
|
|
||||||
import org.koitharu.kotatsu.parsers.MangaLoaderContext
|
|
||||||
import java.util.concurrent.TimeUnit
|
|
||||||
|
|
||||||
val networkModule
|
|
||||||
get() = module {
|
|
||||||
single { AndroidCookieJar() } bind CookieJar::class
|
|
||||||
single {
|
|
||||||
val cache = get<LocalStorageManager>().createHttpCache()
|
|
||||||
OkHttpClient.Builder().apply {
|
|
||||||
connectTimeout(20, TimeUnit.SECONDS)
|
|
||||||
readTimeout(60, TimeUnit.SECONDS)
|
|
||||||
writeTimeout(20, TimeUnit.SECONDS)
|
|
||||||
cookieJar(get())
|
|
||||||
dns(DoHManager(cache, get()))
|
|
||||||
cache(cache)
|
|
||||||
addInterceptor(GZipInterceptor())
|
|
||||||
addInterceptor(UserAgentInterceptor())
|
|
||||||
addInterceptor(CloudFlareInterceptor())
|
|
||||||
}.build()
|
|
||||||
}
|
|
||||||
single<MangaLoaderContext> { MangaLoaderContextImpl(get(), get(), get()) }
|
|
||||||
}
|
|
||||||
@ -1,53 +0,0 @@
|
|||||||
package org.koitharu.kotatsu.core.ui
|
|
||||||
|
|
||||||
import android.text.Html
|
|
||||||
import coil.ComponentRegistry
|
|
||||||
import coil.ImageLoader
|
|
||||||
import coil.decode.SvgDecoder
|
|
||||||
import coil.disk.DiskCache
|
|
||||||
import coil.util.DebugLogger
|
|
||||||
import kotlinx.coroutines.Dispatchers
|
|
||||||
import okhttp3.OkHttpClient
|
|
||||||
import org.koin.android.ext.koin.androidContext
|
|
||||||
import org.koin.dsl.module
|
|
||||||
import org.koitharu.kotatsu.BuildConfig
|
|
||||||
import org.koitharu.kotatsu.core.parser.favicon.FaviconFetcher
|
|
||||||
import org.koitharu.kotatsu.local.data.CacheDir
|
|
||||||
import org.koitharu.kotatsu.local.data.CbzFetcher
|
|
||||||
import org.koitharu.kotatsu.utils.ext.isLowRamDevice
|
|
||||||
import org.koitharu.kotatsu.utils.image.CoilImageGetter
|
|
||||||
|
|
||||||
val uiModule
|
|
||||||
get() = module {
|
|
||||||
single {
|
|
||||||
val httpClientFactory = {
|
|
||||||
get<OkHttpClient>().newBuilder()
|
|
||||||
.cache(null)
|
|
||||||
.build()
|
|
||||||
}
|
|
||||||
val diskCacheFactory = {
|
|
||||||
val context = androidContext()
|
|
||||||
val rootDir = context.externalCacheDir ?: context.cacheDir
|
|
||||||
DiskCache.Builder()
|
|
||||||
.directory(rootDir.resolve(CacheDir.THUMBS.dir))
|
|
||||||
.build()
|
|
||||||
}
|
|
||||||
ImageLoader.Builder(androidContext())
|
|
||||||
.okHttpClient(httpClientFactory)
|
|
||||||
.interceptorDispatcher(Dispatchers.Default)
|
|
||||||
.fetcherDispatcher(Dispatchers.IO)
|
|
||||||
.decoderDispatcher(Dispatchers.Default)
|
|
||||||
.transformationDispatcher(Dispatchers.Default)
|
|
||||||
.diskCache(diskCacheFactory)
|
|
||||||
.logger(if (BuildConfig.DEBUG) DebugLogger() else null)
|
|
||||||
.allowRgb565(isLowRamDevice(androidContext()))
|
|
||||||
.components(
|
|
||||||
ComponentRegistry.Builder()
|
|
||||||
.add(SvgDecoder.Factory())
|
|
||||||
.add(CbzFetcher.Factory())
|
|
||||||
.add(FaviconFetcher.Factory(androidContext(), get()))
|
|
||||||
.build()
|
|
||||||
).build()
|
|
||||||
}
|
|
||||||
factory<Html.ImageGetter> { CoilImageGetter(androidContext(), get()) }
|
|
||||||
}
|
|
||||||
@ -1,13 +0,0 @@
|
|||||||
package org.koitharu.kotatsu.details
|
|
||||||
|
|
||||||
import org.koin.androidx.viewmodel.dsl.viewModel
|
|
||||||
import org.koin.dsl.module
|
|
||||||
import org.koitharu.kotatsu.details.ui.DetailsViewModel
|
|
||||||
|
|
||||||
val detailsModule
|
|
||||||
get() = module {
|
|
||||||
|
|
||||||
viewModel { intent ->
|
|
||||||
DetailsViewModel(intent.get(), get(), get(), get(), get(), get(), get(), get(), get(), get())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,14 +0,0 @@
|
|||||||
package org.koitharu.kotatsu.explore
|
|
||||||
|
|
||||||
import org.koin.androidx.viewmodel.dsl.viewModel
|
|
||||||
import org.koin.dsl.module
|
|
||||||
import org.koitharu.kotatsu.explore.domain.ExploreRepository
|
|
||||||
import org.koitharu.kotatsu.explore.ui.ExploreViewModel
|
|
||||||
|
|
||||||
val exploreModule
|
|
||||||
get() = module {
|
|
||||||
|
|
||||||
factory { ExploreRepository(get(), get()) }
|
|
||||||
|
|
||||||
viewModel { ExploreViewModel(get(), get()) }
|
|
||||||
}
|
|
||||||
@ -1,24 +0,0 @@
|
|||||||
package org.koitharu.kotatsu.favourites
|
|
||||||
|
|
||||||
import org.koin.androidx.viewmodel.dsl.viewModel
|
|
||||||
import org.koin.dsl.module
|
|
||||||
import org.koitharu.kotatsu.favourites.domain.FavouritesRepository
|
|
||||||
import org.koitharu.kotatsu.favourites.ui.categories.FavouritesCategoriesViewModel
|
|
||||||
import org.koitharu.kotatsu.favourites.ui.categories.edit.FavouritesCategoryEditViewModel
|
|
||||||
import org.koitharu.kotatsu.favourites.ui.categories.select.MangaCategoriesViewModel
|
|
||||||
import org.koitharu.kotatsu.favourites.ui.list.FavouritesListViewModel
|
|
||||||
|
|
||||||
val favouritesModule
|
|
||||||
get() = module {
|
|
||||||
|
|
||||||
single { FavouritesRepository(get(), get()) }
|
|
||||||
|
|
||||||
viewModel { categoryId ->
|
|
||||||
FavouritesListViewModel(categoryId.get(), get(), get(), get(), get())
|
|
||||||
}
|
|
||||||
viewModel { FavouritesCategoriesViewModel(get(), get()) }
|
|
||||||
viewModel { manga ->
|
|
||||||
MangaCategoriesViewModel(manga.get(), get())
|
|
||||||
}
|
|
||||||
viewModel { params -> FavouritesCategoryEditViewModel(params[0], get(), get()) }
|
|
||||||
}
|
|
||||||
@ -1,14 +0,0 @@
|
|||||||
package org.koitharu.kotatsu.history
|
|
||||||
|
|
||||||
import org.koin.androidx.viewmodel.dsl.viewModel
|
|
||||||
import org.koin.dsl.module
|
|
||||||
import org.koitharu.kotatsu.history.domain.HistoryRepository
|
|
||||||
import org.koitharu.kotatsu.history.ui.HistoryListViewModel
|
|
||||||
|
|
||||||
val historyModule
|
|
||||||
get() = module {
|
|
||||||
|
|
||||||
single { HistoryRepository(get(), get(), get(), getAll()) }
|
|
||||||
|
|
||||||
viewModel { HistoryListViewModel(get(), get(), get()) }
|
|
||||||
}
|
|
||||||
@ -1,16 +0,0 @@
|
|||||||
package org.koitharu.kotatsu.library
|
|
||||||
|
|
||||||
import org.koin.androidx.viewmodel.dsl.viewModel
|
|
||||||
import org.koin.dsl.module
|
|
||||||
import org.koitharu.kotatsu.library.domain.LibraryRepository
|
|
||||||
import org.koitharu.kotatsu.library.ui.LibraryViewModel
|
|
||||||
import org.koitharu.kotatsu.library.ui.config.categories.LibraryCategoriesConfigViewModel
|
|
||||||
|
|
||||||
val libraryModule
|
|
||||||
get() = module {
|
|
||||||
|
|
||||||
factory { LibraryRepository(get()) }
|
|
||||||
|
|
||||||
viewModel { LibraryViewModel(get(), get(), get(), get(), get()) }
|
|
||||||
viewModel { LibraryCategoriesConfigViewModel(get()) }
|
|
||||||
}
|
|
||||||
@ -1,20 +1 @@
|
|||||||
package org.koitharu.kotatsu.local
|
package org.koitharu.kotatsu.local
|
||||||
|
|
||||||
import org.koin.android.ext.koin.androidContext
|
|
||||||
import org.koin.androidx.viewmodel.dsl.viewModel
|
|
||||||
import org.koin.dsl.module
|
|
||||||
import org.koitharu.kotatsu.download.domain.DownloadManager
|
|
||||||
import org.koitharu.kotatsu.local.data.LocalStorageManager
|
|
||||||
import org.koitharu.kotatsu.local.domain.LocalMangaRepository
|
|
||||||
import org.koitharu.kotatsu.local.ui.LocalListViewModel
|
|
||||||
|
|
||||||
val localModule
|
|
||||||
get() = module {
|
|
||||||
|
|
||||||
factory { LocalStorageManager(androidContext(), get()) }
|
|
||||||
single { LocalMangaRepository(get()) }
|
|
||||||
|
|
||||||
factory { DownloadManager.Factory(androidContext(), get(), get(), get(), get(), get()) }
|
|
||||||
|
|
||||||
viewModel { LocalListViewModel(get(), get(), get()) }
|
|
||||||
}
|
|
||||||
@ -1,29 +0,0 @@
|
|||||||
package org.koitharu.kotatsu.main
|
|
||||||
|
|
||||||
import android.app.Application
|
|
||||||
import android.os.Build
|
|
||||||
import androidx.room.InvalidationTracker
|
|
||||||
import org.koin.android.ext.koin.androidContext
|
|
||||||
import org.koin.androidx.viewmodel.dsl.viewModel
|
|
||||||
import org.koin.dsl.bind
|
|
||||||
import org.koin.dsl.module
|
|
||||||
import org.koitharu.kotatsu.base.ui.util.ActivityRecreationHandle
|
|
||||||
import org.koitharu.kotatsu.core.os.ShortcutsUpdater
|
|
||||||
import org.koitharu.kotatsu.main.ui.MainViewModel
|
|
||||||
import org.koitharu.kotatsu.main.ui.protect.AppProtectHelper
|
|
||||||
import org.koitharu.kotatsu.main.ui.protect.ProtectViewModel
|
|
||||||
|
|
||||||
val mainModule
|
|
||||||
get() = module {
|
|
||||||
single { AppProtectHelper(get()) } bind Application.ActivityLifecycleCallbacks::class
|
|
||||||
single { ActivityRecreationHandle() } bind Application.ActivityLifecycleCallbacks::class
|
|
||||||
|
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1) {
|
|
||||||
single { ShortcutsUpdater(androidContext(), get(), get(), get()) } bind InvalidationTracker.Observer::class
|
|
||||||
} else {
|
|
||||||
factory { ShortcutsUpdater(androidContext(), get(), get(), get()) }
|
|
||||||
}
|
|
||||||
|
|
||||||
viewModel { MainViewModel(get(), get(), get(), get()) }
|
|
||||||
viewModel { ProtectViewModel(get(), get()) }
|
|
||||||
}
|
|
||||||
@ -1,31 +0,0 @@
|
|||||||
package org.koitharu.kotatsu.reader
|
|
||||||
|
|
||||||
import org.koin.android.ext.koin.androidContext
|
|
||||||
import org.koin.androidx.viewmodel.dsl.viewModel
|
|
||||||
import org.koin.dsl.module
|
|
||||||
import org.koitharu.kotatsu.base.domain.MangaDataRepository
|
|
||||||
import org.koitharu.kotatsu.local.data.PagesCache
|
|
||||||
import org.koitharu.kotatsu.reader.ui.PageSaveHelper
|
|
||||||
import org.koitharu.kotatsu.reader.ui.ReaderViewModel
|
|
||||||
|
|
||||||
val readerModule
|
|
||||||
get() = module {
|
|
||||||
|
|
||||||
factory { MangaDataRepository(get()) }
|
|
||||||
single { PagesCache(get()) }
|
|
||||||
|
|
||||||
factory { PageSaveHelper(get(), androidContext()) }
|
|
||||||
|
|
||||||
viewModel { params ->
|
|
||||||
ReaderViewModel(
|
|
||||||
intent = params[0],
|
|
||||||
initialState = params[1],
|
|
||||||
preselectedBranch = params[2],
|
|
||||||
dataRepository = get(),
|
|
||||||
historyRepository = get(),
|
|
||||||
settings = get(),
|
|
||||||
pageSaveHelper = get(),
|
|
||||||
bookmarksRepository = get(),
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue