Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,8 @@ android {
applicationId 'org.draken.usagi'
minSdk = 21
targetSdk = 37
versionCode = 18
versionName = '1.0.0-rc1'
versionCode = 19
versionName = '1.0.0-rc2'
generatedDensities = []
testInstrumentationRunner 'org.draken.usagi.HiltTestRunner'
ksp {
Expand Down
12 changes: 12 additions & 0 deletions app/proguard-rules.pro
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
-dontwarn com.google.j2objc.annotations.**
-dontwarn com.google.re2j.**
-dontwarn coil3.PlatformContext
-dontwarn rx.internal.util.unsafe.**

-keep class org.draken.usagi.settings.NotificationSettingsLegacyFragment
-keep class org.draken.usagi.settings.about.changelog.ChangelogFragment
Expand Down Expand Up @@ -90,6 +91,17 @@
-keep class rx.functions.Func7 { public protected *; }
-keep class rx.functions.Func8 { public protected *; }
-keep class rx.functions.Func9 { public protected *; }
-keep class rx.internal.util.unsafe.** { *; }
-keepclassmembers class rx.internal.util.unsafe.*ArrayQueue*Field* {
long producerIndex;
long consumerIndex;
}
-keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueProducerNodeRef {
rx.internal.util.atomic.LinkedQueueNode producerNode;
}
-keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueConsumerNodeRef {
rx.internal.util.atomic.LinkedQueueNode consumerNode;
}
-keep class uy.kohesive.injekt.** { public protected *; }
-keep class * extends uy.kohesive.injekt.api.TypeReference { *; }
-keep class * extends uy.kohesive.injekt.api.FullTypeReference { *; }
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package org.draken.usagi.browser

import android.os.Bundle
import android.view.View
import android.webkit.CookieManager
import androidx.core.view.WindowInsetsCompat
import androidx.core.view.isVisible
import androidx.core.view.updatePadding
Expand Down Expand Up @@ -81,6 +82,7 @@ abstract class BaseBrowserActivity :
}

override fun onPause() {
runCatching { CookieManager.getInstance().flush() }
viewBinding.webView.onPause()
super.onPause()
}
Expand All @@ -93,6 +95,7 @@ abstract class BaseBrowserActivity :
override fun onDestroy() {
super.onDestroy()
if (hasViewBinding()) {
runCatching { CookieManager.getInstance().flush() }
viewBinding.webView.stopLoading()
viewBinding.webView.destroy()
}
Expand Down
69 changes: 66 additions & 3 deletions app/src/main/kotlin/org/draken/usagi/core/AppModule.kt
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,11 @@ import kotlinx.coroutines.flow.MutableSharedFlow
import kotlinx.coroutines.flow.SharedFlow
import kotlinx.coroutines.flow.asSharedFlow
import okhttp3.OkHttpClient
import org.draken.tsukimix.core.parser.external.ExtRuntime
import org.draken.tsukimix.core.parser.external.ExtensionProvider
import org.draken.tsukimix.core.parser.external.NativeExtManager
import org.draken.tsukimix.core.parser.external.RuntimeInitializer
import org.draken.tsukimix.core.parser.external.model.Manga
import org.draken.usagi.BuildConfig
import org.draken.usagi.backups.domain.BackupObserver
import org.draken.usagi.core.db.MangaDatabase
Expand All @@ -38,6 +43,8 @@ import org.draken.usagi.core.image.AvifImageDecoder
import org.draken.usagi.core.image.CbzFetcher
import org.draken.usagi.core.image.ExternalSourceFetcher
import org.draken.usagi.core.image.MangaSourceHeaderInterceptor
import org.draken.usagi.core.model.MangaSourceRegistry
import org.draken.usagi.core.network.BaseHttpClient
import org.draken.usagi.core.network.MangaHttpClient
import org.draken.usagi.core.network.imageproxy.ImageProxyInterceptor
import org.draken.usagi.core.network.webview.WebViewExecutor
Expand Down Expand Up @@ -69,9 +76,10 @@ import tsuki.MangaLoaderContext
import tsuki.network.UserAgents
import javax.inject.Provider
import javax.inject.Singleton
import org.draken.tsukimix.core.parser.tachiyomi.TachiyomiExtensionLoader as Loader
import org.draken.tsukimix.core.parser.tachiyomi.TachiyomiExtensionManager as Manager
import org.draken.tsukimix.core.parser.tachiyomi.TachiyomiInjektBridge as Bridge
import org.draken.tsukimix.core.parser.external.ExtensionBridge as Bridge
import org.draken.tsukimix.core.parser.external.ExtensionLoader as Loader
import org.draken.tsukimix.core.parser.external.ExtensionManager as Manager
import org.draken.usagi.core.model.DirectExternalPluginMetadata as Metadata

@Module
@InstallIn(SingletonComponent::class)
Expand Down Expand Up @@ -265,5 +273,60 @@ interface AppModule {
@ApplicationContext context: Context,
loader: Loader,
): Manager = Manager(context, loader)

@Provides
@Singleton
fun provideNativeExtManager(
@ApplicationContext context: Context,
@BaseHttpClient httpClient: OkHttpClient,
injektBridge: Bridge,
): NativeExtManager = NativeExtManager(context, httpClient, injektBridge)

@Provides
@Singleton
fun provideExtensionProvider(
@ApplicationContext context: Context,
@BaseHttpClient httpClient: OkHttpClient,
): ExtensionProvider = ExtensionProvider(context, httpClient)

@Provides
@Singleton
fun provideExtRuntime(
installedManager: Manager,
directManager: NativeExtManager,
catalogProvider: ExtensionProvider,
database: MangaDatabase,
settings: AppSettings,
): ExtRuntime =
ExtRuntime(
installedManager = installedManager,
directManager = directManager,
disabledSourceProvider =
{
if (settings.isAllSourcesEnabled) {
emptySet()
} else {
database
.getSourcesDao()
.findAll()
.asSequence()
.filterNot { it.isEnabled }
.map { it.source }
.toSet()
}
},
sourcesPublisher =
{ sources ->
Metadata.update(directManager.installed.value) { catalogProvider.repositoryName(it) }
val non = MangaSourceRegistry.sources.filterNot { it is Manga }
MangaSourceRegistry.publish(non + sources)
},
)

@Provides
@Singleton
fun provideExtRuntimeInitializer(
extRuntime: Provider<ExtRuntime>,
): RuntimeInitializer = RuntimeInitializer { extRuntime.get() }
}
}
22 changes: 9 additions & 13 deletions app/src/main/kotlin/org/draken/usagi/core/BaseApp.kt
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@ import okhttp3.internal.platform.PlatformRegistry
import org.conscrypt.Conscrypt
import org.draken.usagi.BuildConfig
import org.draken.usagi.core.db.MangaDatabase
import org.draken.usagi.core.model.MangaSourceRegistry
import org.draken.usagi.core.model.PluginKeyResolver
import org.draken.usagi.core.os.AppValidator
import org.draken.usagi.core.parser.MangaDynamicRepository
Expand All @@ -34,8 +33,7 @@ import org.draken.usagi.settings.work.WorkScheduleManager
import java.security.Security
import javax.inject.Inject
import javax.inject.Provider
import org.draken.tsukimix.core.parser.tachiyomi.TachiyomiExtensionManager as ExternalManager
import org.draken.tsukimix.core.parser.tachiyomi.model.TachiyomiMangaSource as External
import org.draken.tsukimix.core.parser.external.RuntimeInitializer as RuntimeInit

open class BaseApp :
Application(),
Expand Down Expand Up @@ -74,7 +72,7 @@ open class BaseApp :
lateinit var pluginKeyResolver: PluginKeyResolver

@Inject
lateinit var externalManager: ExternalManager
lateinit var runtimeInit: dagger.Lazy<RuntimeInit>

@Inject
@LocalStorageChanges
Expand Down Expand Up @@ -105,18 +103,16 @@ open class BaseApp :
localStorageChanges.collect(localMangaIndexProvider.get())
}
launch {
externalManager.sources.collect {
val e = MangaSourceRegistry.sources.filterNot { it is External }
MangaSourceRegistry.publish(e + externalManager.getActiveSources())
}
runCatching { runtimeInit.get().initialize() }
}
mangaDynamicRepository.load(mangaDynamicRepository.getDir())
externalManager.ensureReady()
withContext(Dispatchers.Default) {
pluginKeyResolver.normalize(database.get(), savedFiltersRepository)
runCatching {
mangaDynamicRepository.load(mangaDynamicRepository.getDir())
withContext(Dispatchers.Default) {
pluginKeyResolver.normalize(database.get(), savedFiltersRepository)
}
}
workScheduleManager.init()
}
workScheduleManager.init()
}

override fun attachBaseContext(base: Context) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ import okhttp3.Request
import org.draken.usagi.core.model.unwrap
import org.draken.usagi.core.util.ext.mangaSourceKey
import coil3.Uri as CoilUri
import org.draken.tsukimix.core.parser.tachiyomi.model.TachiyomiMangaSource as External
import org.draken.tsukimix.core.parser.external.model.Manga as External

class ExternalSourceFetcher(
private val httpSource: HttpSource,
Expand All @@ -24,7 +24,7 @@ class ExternalSourceFetcher(
) : Fetcher {
override suspend fun fetch(): FetchResult {
val response =
withContext(Dispatchers.IO) {
withContext(Dispatchers.Default) {
httpSource.client
.newCall(
Request
Expand Down
Loading
Loading