From 135913adaa32ab0cecbedf410ae12b1bff767706 Mon Sep 17 00:00:00 2001 From: MrBoom Date: Wed, 29 Jan 2025 20:39:56 +0500 Subject: [PATCH] Navigation labels can be hidden, Ask to restart for some experiments, Tv app flavor, Generate unique keys for each route, Crash handler can be disabled, Move some yomi stuff to the shared module, Migrate some db parts to kmp, Move UniqueIdGenerator.kt to the shared module, Delete SettingsActivity2.kt, Don't generate maps for AwerySettings, Fixed crash when trying to deserialize an saved route state, Don't serialize CatalogVideoFile duplicate fields, Added missing android classes to jvm so that yomi extensions would work on desktop, Correctly delete crash logs on the new splash screen, Made AwerySettings available at the shared module, Extension icons in the shared module Signed-off-by: MrBoom --- androidApp/build.gradle.kts | 69 +++--- androidApp/src/main/AndroidManifest.xml | 5 - .../java/com/mrboomdev/awery/MainActivity.kt | 9 +- .../main/java/com/mrboomdev/awery/app/App.kt | 5 +- .../awery/app/AweryNotifications.java | 2 +- .../awery/sources/BootstrapManager.kt | 98 --------- .../awery/ui/mobile/screens/SplashActivity.kt | 30 +-- .../screens/catalog/MediaCatalogAdapter.java | 2 +- .../screens/catalog/MediaCategoriesAdapter.kt | 2 +- .../catalog/feeds/PagesFeedViewHolder.kt | 2 +- .../screens/media/MediaCommentsFragment.java | 2 +- .../media/MediaPlayEpisodesAdapter.java | 3 +- .../mobile/screens/media/MediaPlayFragment.kt | 2 + .../mobile/screens/search/SearchActivity.kt | 2 +- .../screens/settings/SettingsActivity.java | 2 +- .../screens/settings/SettingsActivity2.kt | 133 ----------- .../screens/settings/SettingsAdapter.java | 3 +- .../ui/mobile/screens/setup/SetupActivity.kt | 6 +- .../mobile/screens/setup/SetupThemeAdapter.kt | 24 +- .../mrboomdev/awery/ui/tv/TvMainActivity.kt | 7 +- .../awery/ui/tv/components/FeedsGroup.kt | 2 +- .../awery/ui/tv/screens/home/HomeViewModel.kt | 3 +- .../ui/tv/screens/media/MediaInfoScreen.kt | 3 +- .../com/mrboomdev/awery/util/NiceUtils.java | 4 +- .../main/java/eu/kanade/tachiyomi/AppInfo.kt | 23 -- .../animesource/AnimeCatalogueSource.kt | 80 ------- .../tachiyomi/animesource/AnimeSource.kt | 85 ------- .../animesource/AnimeSourceFactory.kt | 12 - .../animesource/ConfigurableAnimeSource.kt | 16 -- .../tachiyomi/animesource/UnmeteredSource.kt | 8 - .../animesource/online/AnimeHttpSource.kt | 1 - .../tachiyomi/network/JavaScriptEngine.kt | 5 +- .../kanade/tachiyomi/network/NetworkHelper.kt | 70 ------ .../java/javax/lang/model/SourceVersion.java | 97 -------- .../core/util/lang/CoroutineExtensions.kt | 14 -- .../mrboomdev/awery/app/ExtensionsManager.kt | 207 ------------------ .../settings/GenerateSettingsExtensions.kt | 13 -- .../gradle/settings/GenerateSettingsImpl.kt | 56 +---- .../gradle/settings/GenerateSettingsTask.kt | 5 + compat/.gitignore | 1 + compat/build.gradle.kts | 16 ++ .../main/java/android/content/Context.java | 3 + .../main/java/android/widget/EditText.java | 7 + .../preference/CheckBoxPreference.java | 8 + .../androidx/preference/DialogPreference.java | 21 ++ .../preference/EditTextPreference.java | 31 +++ .../androidx/preference/ListPreference.java | 41 ++++ .../preference/MultiSelectListPreference.java | 40 ++++ .../java/androidx/preference/Preference.java | 62 ++++++ .../androidx/preference/PreferenceScreen.java | 18 ++ .../preference/SwitchPreferenceCompat.java | 9 + .../preference/TwoStatePreference.java | 41 ++++ .../mrboomdev/awery/ext/data/CatalogFile.kt | 11 +- .../com/mrboomdev/awery/ext/data/Setting.kt | 30 --- .../awery/ext/source/AbstractSource.kt | 2 +- .../com/mrboomdev/awery/ext/source/Context.kt | 20 +- .../com/mrboomdev/awery/ext/source/Source.kt | 2 +- .../awery/ext/source/SourcesManager.kt | 6 +- gradle.properties | 2 +- gradle/libs.versions.toml | 61 +++--- resources/build.gradle.kts | 25 +-- .../drawable/ic_book_filled.xml | 10 + .../drawable/ic_book_outlined.xml | 10 + .../composeResources/drawable/ic_download.xml | 10 + .../drawable/ic_movie_filled.xml | 10 + .../drawable/ic_movie_outlined.xml | 10 + .../drawable/logo_aniyomi.png | Bin 0 -> 57054 bytes .../drawable/logo_dantotsu.png | Bin 0 -> 8328 bytes .../drawable/logo_tachiyomi.jpg | Bin 0 -> 11607 bytes .../composeResources/files}/app_settings.json | 43 +++- .../files}/system_settings.json | 0 .../composeResources/values/strings.xml | 2 + settings.gradle.kts | 4 +- shared/build.gradle.kts | 137 +++++++++--- shared/src/androidMain/AndroidManifest.xml | 4 + .../awery/PlatformAliases.android.kt | 13 ++ .../mrboomdev/awery/data/AweryDB.android.kt | 12 + .../awery/platform/Platform.android.kt | 4 + .../sources/ExtensionsManager.android.kt | 15 ++ .../awery/sources/yomi/YomiManager.kt | 98 +++++---- .../awery/sources/yomi/YomiSource.kt | 0 .../sources/yomi/aniyomi/AniyomiManager.kt | 8 +- .../sources/yomi/aniyomi/AniyomiMedia.kt | 0 .../sources/yomi/aniyomi/AniyomiSource.kt | 2 +- .../yomi/tachiyomi/TachiyomiManager.kt | 8 +- .../sources/yomi/tachiyomi/TachiyomiMedia.kt | 0 .../sources/yomi/tachiyomi/TachiyomiSource.kt | 2 +- .../mrboomdev/awery/utils/ActivityUtils.kt | 1 + .../mrboomdev/awery/utils/FileExtensions.kt | 4 + .../com/mrboomdev/awery/utils/IntentUtils.kt | 14 +- .../network/NetworkHelper.android.kt | 11 + .../awery/ui/routes/MainRoute.android.kt | 0 .../awery/ui/routes/MainRoute.android.kt | 13 ++ .../awery/ui/screens/TvMainScreen.kt | 13 ++ .../com/mrboomdev/awery/PlatformAliases.kt | 13 ++ .../com/mrboomdev/awery/data/AppTabs.kt | 89 -------- .../com/mrboomdev/awery/data/AweryDB.kt | 148 ++++++++++++- .../com/mrboomdev/awery/data/dao/MediaDao.kt | 7 + .../mrboomdev/awery/data/entity/DBMedia.kt | 93 ++++++++ .../awery/data/entity/DBRepository.kt | 10 + .../awery/data/settings/PlatformSetting.kt | 5 +- .../awery/data/settings/SettingsExtensions.kt | 33 +++ .../awery/generated/GeneratedSetting.kt | 66 ++---- .../com/mrboomdev/awery/platform/Platform.kt | 3 + .../awery/sources/ExtensionsManager.kt | 159 ++++++++++++++ .../com/mrboomdev/awery/sources/FeedLoader.kt | 126 +++++++++++ .../com/mrboomdev/awery/ui/components/Feed.kt | 26 +++ .../ui/navigation/NavigationExperience.kt | 16 ++ .../awery/ui/navigation/NavigationRoute.kt | 10 + .../ui/navigation/NavigationTemplates.kt | 78 +++++++ .../mrboomdev/awery/ui/routes/BaseRoute.kt | 18 ++ .../mrboomdev/awery/ui/routes/GalleryRoute.kt | 3 +- .../mrboomdev/awery/ui/routes/MainRoute.kt | 3 +- .../awery/ui/routes/NotificationsRoute.kt | 13 ++ .../mrboomdev/awery/ui/routes/PlayerRoute.kt | 3 +- .../mrboomdev/awery/ui/routes/ReaderRoute.kt | 3 +- .../mrboomdev/awery/ui/routes/SearchRoute.kt | 13 ++ .../awery/ui/routes/SettingsRoute.kt | 4 +- .../mrboomdev/awery/ui/routes/SplashRoute.kt | 3 +- .../mrboomdev/awery/ui/screens/MainScreen.kt | 203 ++++++++++++----- .../awery/ui/screens/SplashScreen.kt | 16 +- .../awery/ui/utils/ComposeExtensions.kt | 13 +- .../ui/utils/KSerializerNavigatorSaver.kt | 2 +- .../com/mrboomdev/awery/ui/utils/Tab.kt | 10 - .../awery/ui}/utils/UniqueIdGenerator.kt | 2 +- .../mrboomdev/awery/utils/FileExtensions.kt | 23 ++ .../mrboomdev/awery/utils/StringExtensions.kt | 6 +- .../kotlin/eu/kanade/tachiyomi/AppInfo.kt | 15 ++ .../animesource/AnimeCatalogueSource.kt | 37 ++++ .../tachiyomi/animesource/AnimeSource.kt | 30 +++ .../animesource/AnimeSourceFactory.kt | 5 + .../animesource/ConfigurableAnimeSource.kt | 7 + .../tachiyomi/animesource/UnmeteredSource.kt | 3 + .../kanade/tachiyomi/network/NetworkHelper.kt | 48 ++++ .../tachiyomi/network/OkHttpExtensions.kt | 0 .../eu/kanade/tachiyomi/network/Requests.kt | 6 +- .../awery/PlatformAliases.desktop.kt | 13 ++ .../awery/platform/Platform.desktop.kt | 4 + 138 files changed, 1959 insertions(+), 1456 deletions(-) delete mode 100644 androidApp/src/main/java/com/mrboomdev/awery/sources/BootstrapManager.kt delete mode 100644 androidApp/src/main/java/com/mrboomdev/awery/ui/mobile/screens/settings/SettingsActivity2.kt delete mode 100644 androidApp/src/main/java/eu/kanade/tachiyomi/AppInfo.kt delete mode 100644 androidApp/src/main/java/eu/kanade/tachiyomi/animesource/AnimeCatalogueSource.kt delete mode 100644 androidApp/src/main/java/eu/kanade/tachiyomi/animesource/AnimeSource.kt delete mode 100644 androidApp/src/main/java/eu/kanade/tachiyomi/animesource/AnimeSourceFactory.kt delete mode 100644 androidApp/src/main/java/eu/kanade/tachiyomi/animesource/ConfigurableAnimeSource.kt delete mode 100644 androidApp/src/main/java/eu/kanade/tachiyomi/animesource/UnmeteredSource.kt delete mode 100644 androidApp/src/main/java/eu/kanade/tachiyomi/network/NetworkHelper.kt delete mode 100644 androidApp/src/main/java/javax/lang/model/SourceVersion.java delete mode 100644 androidApp/src/main/java/tachiyomi/core/util/lang/CoroutineExtensions.kt delete mode 100644 androidApp/src/main/kotlin/com/mrboomdev/awery/app/ExtensionsManager.kt delete mode 100644 buildSrc/src/main/kotlin/com/mrboomdev/awery/gradle/settings/GenerateSettingsExtensions.kt create mode 100644 compat/.gitignore create mode 100644 compat/build.gradle.kts create mode 100644 compat/src/main/java/android/content/Context.java create mode 100644 compat/src/main/java/android/widget/EditText.java create mode 100644 compat/src/main/java/androidx/preference/CheckBoxPreference.java create mode 100644 compat/src/main/java/androidx/preference/DialogPreference.java create mode 100644 compat/src/main/java/androidx/preference/EditTextPreference.java create mode 100644 compat/src/main/java/androidx/preference/ListPreference.java create mode 100644 compat/src/main/java/androidx/preference/MultiSelectListPreference.java create mode 100644 compat/src/main/java/androidx/preference/Preference.java create mode 100644 compat/src/main/java/androidx/preference/PreferenceScreen.java create mode 100644 compat/src/main/java/androidx/preference/SwitchPreferenceCompat.java create mode 100644 compat/src/main/java/androidx/preference/TwoStatePreference.java create mode 100644 resources/src/commonMain/composeResources/drawable/ic_book_filled.xml create mode 100644 resources/src/commonMain/composeResources/drawable/ic_book_outlined.xml create mode 100644 resources/src/commonMain/composeResources/drawable/ic_download.xml create mode 100644 resources/src/commonMain/composeResources/drawable/ic_movie_filled.xml create mode 100644 resources/src/commonMain/composeResources/drawable/ic_movie_outlined.xml create mode 100644 resources/src/commonMain/composeResources/drawable/logo_aniyomi.png create mode 100644 resources/src/commonMain/composeResources/drawable/logo_dantotsu.png create mode 100644 resources/src/commonMain/composeResources/drawable/logo_tachiyomi.jpg rename {androidApp/src/main/assets => resources/src/commonMain/composeResources/files}/app_settings.json (93%) rename {androidApp/src/main/assets => resources/src/commonMain/composeResources/files}/system_settings.json (100%) create mode 100644 shared/src/androidMain/kotlin/com/mrboomdev/awery/PlatformAliases.android.kt create mode 100644 shared/src/androidMain/kotlin/com/mrboomdev/awery/data/AweryDB.android.kt create mode 100644 shared/src/androidMain/kotlin/com/mrboomdev/awery/sources/ExtensionsManager.android.kt rename {androidApp/src/main/java => shared/src/androidMain/kotlin}/com/mrboomdev/awery/sources/yomi/YomiManager.kt (87%) rename {androidApp/src/main/java => shared/src/androidMain/kotlin}/com/mrboomdev/awery/sources/yomi/YomiSource.kt (100%) rename {androidApp/src/main/java => shared/src/androidMain/kotlin}/com/mrboomdev/awery/sources/yomi/aniyomi/AniyomiManager.kt (92%) rename {androidApp/src/main/java => shared/src/androidMain/kotlin}/com/mrboomdev/awery/sources/yomi/aniyomi/AniyomiMedia.kt (100%) rename {androidApp/src/main/java => shared/src/androidMain/kotlin}/com/mrboomdev/awery/sources/yomi/aniyomi/AniyomiSource.kt (98%) rename {androidApp/src/main/java => shared/src/androidMain/kotlin}/com/mrboomdev/awery/sources/yomi/tachiyomi/TachiyomiManager.kt (92%) rename {androidApp/src/main/java => shared/src/androidMain/kotlin}/com/mrboomdev/awery/sources/yomi/tachiyomi/TachiyomiMedia.kt (100%) rename {androidApp/src/main/java => shared/src/androidMain/kotlin}/com/mrboomdev/awery/sources/yomi/tachiyomi/TachiyomiSource.kt (98%) create mode 100644 shared/src/androidMain/kotlin/eu/kanade/tachiyomi/network/NetworkHelper.android.kt rename shared/src/{androidMain => androidMobile}/kotlin/com/mrboomdev/awery/ui/routes/MainRoute.android.kt (100%) create mode 100644 shared/src/androidTv/kotlin/com/mrboomdev/awery/ui/routes/MainRoute.android.kt create mode 100644 shared/src/androidTv/kotlin/com/mrboomdev/awery/ui/screens/TvMainScreen.kt create mode 100644 shared/src/commonMain/kotlin/com/mrboomdev/awery/PlatformAliases.kt delete mode 100644 shared/src/commonMain/kotlin/com/mrboomdev/awery/data/AppTabs.kt create mode 100644 shared/src/commonMain/kotlin/com/mrboomdev/awery/data/entity/DBMedia.kt create mode 100644 shared/src/commonMain/kotlin/com/mrboomdev/awery/data/entity/DBRepository.kt create mode 100644 shared/src/commonMain/kotlin/com/mrboomdev/awery/data/settings/SettingsExtensions.kt create mode 100644 shared/src/commonMain/kotlin/com/mrboomdev/awery/sources/ExtensionsManager.kt create mode 100644 shared/src/commonMain/kotlin/com/mrboomdev/awery/sources/FeedLoader.kt create mode 100644 shared/src/commonMain/kotlin/com/mrboomdev/awery/ui/components/Feed.kt create mode 100644 shared/src/commonMain/kotlin/com/mrboomdev/awery/ui/navigation/NavigationExperience.kt create mode 100644 shared/src/commonMain/kotlin/com/mrboomdev/awery/ui/navigation/NavigationRoute.kt create mode 100644 shared/src/commonMain/kotlin/com/mrboomdev/awery/ui/navigation/NavigationTemplates.kt create mode 100644 shared/src/commonMain/kotlin/com/mrboomdev/awery/ui/routes/BaseRoute.kt create mode 100644 shared/src/commonMain/kotlin/com/mrboomdev/awery/ui/routes/NotificationsRoute.kt create mode 100644 shared/src/commonMain/kotlin/com/mrboomdev/awery/ui/routes/SearchRoute.kt delete mode 100644 shared/src/commonMain/kotlin/com/mrboomdev/awery/ui/utils/Tab.kt rename shared/src/{androidMain/kotlin/com/mrboomdev/awery => commonMain/kotlin/com/mrboomdev/awery/ui}/utils/UniqueIdGenerator.kt (97%) create mode 100644 shared/src/commonMain/kotlin/eu/kanade/tachiyomi/AppInfo.kt create mode 100644 shared/src/commonMain/kotlin/eu/kanade/tachiyomi/animesource/AnimeCatalogueSource.kt create mode 100644 shared/src/commonMain/kotlin/eu/kanade/tachiyomi/animesource/AnimeSource.kt create mode 100644 shared/src/commonMain/kotlin/eu/kanade/tachiyomi/animesource/AnimeSourceFactory.kt create mode 100644 shared/src/commonMain/kotlin/eu/kanade/tachiyomi/animesource/ConfigurableAnimeSource.kt create mode 100644 shared/src/commonMain/kotlin/eu/kanade/tachiyomi/animesource/UnmeteredSource.kt create mode 100644 shared/src/commonMain/kotlin/eu/kanade/tachiyomi/network/NetworkHelper.kt rename {androidApp/src/main/java => shared/src/commonMain/kotlin}/eu/kanade/tachiyomi/network/OkHttpExtensions.kt (100%) rename {androidApp/src/main/java => shared/src/commonMain/kotlin}/eu/kanade/tachiyomi/network/Requests.kt (95%) create mode 100644 shared/src/desktopMain/kotlin/com/mrboomdev/awery/PlatformAliases.desktop.kt diff --git a/androidApp/build.gradle.kts b/androidApp/build.gradle.kts index 2ddc0e83..49731af6 100644 --- a/androidApp/build.gradle.kts +++ b/androidApp/build.gradle.kts @@ -1,9 +1,6 @@ import com.android.build.api.dsl.ApplicationProductFlavor import com.mrboomdev.awery.gradle.ProjectVersion.generateVersionCode import com.mrboomdev.awery.gradle.ProjectVersion.getGitCommitHash -import com.mrboomdev.awery.gradle.settings.GenerateSettingsTask -import com.mrboomdev.awery.gradle.settings.generatedSettingsKotlinDirectory -import com.mrboomdev.awery.gradle.settings.generatedSettingsResourcesDirectory plugins { alias(libs.plugins.android.app) @@ -37,11 +34,6 @@ android { buildConfigField("long", "BUILD_TIME", "${System.currentTimeMillis()}") } - sourceSets["main"].apply { - kotlin.srcDir(generatedSettingsKotlinDirectory) - resources.srcDir(generatedSettingsResourcesDirectory) - } - buildTypes { debug { isDebuggable = true @@ -76,10 +68,10 @@ android { kotlinOptions { jvmTarget = "17" - freeCompilerArgs = listOf("-Xcontext-receivers", "-Xmulti-platform", "-opt-in=kotlin.ExperimentalStdlibApi") + freeCompilerArgs = listOf("-Xcontext-receivers", "-Xmulti-platform") } - flavorDimensions += "channel" + flavorDimensions += listOf("channel", "platform") productFlavors { fun ApplicationProductFlavor.createChannelProductFlavor(id: String, title: String) { @@ -114,6 +106,15 @@ android { manifestPlaceholders["appLabel"] = "Awery" applicationIdSuffix = null } + + register("mobile") { + isDefault = true + dimension = "platform" + } + + register("tv") { + dimension = "platform" + } } } @@ -126,13 +127,16 @@ dependencies { implementation(libs.androidx.fragment) implementation(libs.androidx.shortcuts) implementation(libs.androidx.preference) - implementation(libs.bundles.aniyomi) implementation(projects.ext) implementation(projects.resources) + + // Yomi + implementation(libs.bundles.yomi) + implementation(libs.bundles.okhttp) // Database - ksp(libs.androidx.room.compiler) - implementation(libs.androidx.room.runtime) + ksp(libs.room.compiler) + implementation(libs.room.runtime) // UI implementation(libs.androidx.splashscreen) @@ -152,16 +156,16 @@ dependencies { implementation(projects.shared) // Compose - implementation(platform(libs.androidx.compose.bom)) - implementation(libs.androidx.compose.activity) - implementation(libs.androidx.compose.ui) - implementation(libs.androidx.compose.material3) + implementation(platform(libs.compose.bom)) + implementation(libs.compose.activity) + implementation(libs.compose.ui) + implementation(libs.compose.material3) implementation(libs.androidx.navigation.compose) implementation(libs.compose.tv.material) implementation(libs.compose.tv.foundation) - implementation(libs.androidx.adaptive) - implementation(libs.androidx.adaptive.layout) - implementation(libs.androidx.adaptive.navigation) + implementation(libs.adaptive) + implementation(libs.adaptive.layout) + implementation(libs.adaptive.navigation) implementation(compose.components.resources) // Markdown @@ -174,12 +178,12 @@ dependencies { implementation(libs.markwon.linkify) // Exoplayer - implementation(libs.androidx.media3.exoplayer) - implementation(libs.androidx.media3.exoplayer.hls) - implementation(libs.androidx.media3.exoplayer.dash) - implementation(libs.androidx.media3.datasource.okhttp) - implementation(libs.androidx.media3.session) - implementation(libs.androidx.media3.ui) + implementation(libs.media3.exoplayer) + implementation(libs.media3.exoplayer.hls) + implementation(libs.media3.exoplayer.dash) + implementation(libs.media3.datasource.okhttp) + implementation(libs.media3.session) + implementation(libs.media3.ui) // Networking implementation(libs.coil.compose) @@ -197,11 +201,10 @@ dependencies { implementation(libs.moshi.kotlin) implementation(libs.glide) implementation(libs.glide.okhttp3) - implementation(libs.bundles.okhttp) implementation(libs.retrostreams) // Debugging - implementation(libs.androidx.compose.ui.tooling) + implementation(libs.compose.ui.tooling) implementation(libs.xcrash) debugImplementation(libs.leakcanary) } @@ -210,12 +213,4 @@ composeCompiler { stabilityConfigurationFiles.add( rootProject.layout.projectDirectory.file( "compose-stability.txt")) -} - -tasks.register("generateSettings") { - className = "AwerySettings" - inputFiles = listOf( - layout.projectDirectory.file("src/main/assets/app_settings.json"), - layout.projectDirectory.file("src/main/assets/system_settings.json") - ) -}.let { tasks["preBuild"].dependsOn(it) } \ No newline at end of file +} \ No newline at end of file diff --git a/androidApp/src/main/AndroidManifest.xml b/androidApp/src/main/AndroidManifest.xml index f725d6f8..df771bdc 100644 --- a/androidApp/src/main/AndroidManifest.xml +++ b/androidApp/src/main/AndroidManifest.xml @@ -232,11 +232,6 @@ android:windowSoftInputMode="adjustPan" android:exported="false" /> - - diff --git a/androidApp/src/main/java/com/mrboomdev/awery/MainActivity.kt b/androidApp/src/main/java/com/mrboomdev/awery/MainActivity.kt index 9abf50f3..7e0fdc55 100644 --- a/androidApp/src/main/java/com/mrboomdev/awery/MainActivity.kt +++ b/androidApp/src/main/java/com/mrboomdev/awery/MainActivity.kt @@ -30,10 +30,12 @@ import com.mrboomdev.awery.generated.* import com.mrboomdev.awery.platform.android.AndroidGlobals.toast import com.mrboomdev.awery.platform.i18n import com.mrboomdev.awery.ui.mobile.components.EmptyStateView +import com.mrboomdev.awery.ui.mobile.screens.SPLASH_EXTRA_BOOLEAN_ENABLE_COMPOSE +import com.mrboomdev.awery.ui.mobile.screens.SPLASH_EXTRA_BOOLEAN_REDIRECT_SETTINGS +import com.mrboomdev.awery.ui.mobile.screens.SplashActivity import com.mrboomdev.awery.ui.mobile.screens.catalog.feeds.FeedsFragment import com.mrboomdev.awery.ui.mobile.screens.search.MultiSearchActivity import com.mrboomdev.awery.ui.mobile.screens.settings.SettingsActivity -import com.mrboomdev.awery.ui.mobile.screens.settings.SettingsActivity2 import com.mrboomdev.awery.util.IconStateful import com.mrboomdev.awery.util.TabsTemplate import com.mrboomdev.awery.util.extensions.UI_INSETS @@ -343,7 +345,10 @@ class MainActivity : AppCompatActivity() { binding.settingsWrapper.setOnClickListener { if(AwerySettings.EXPERIMENT_SETTINGS2.value) { - startActivity(SettingsActivity2::class) + startActivity(requireContext().buildIntent(SplashActivity::class) { + putExtra(SPLASH_EXTRA_BOOLEAN_ENABLE_COMPOSE, true) + putExtra(SPLASH_EXTRA_BOOLEAN_REDIRECT_SETTINGS, true) + }) } else { startActivity(SettingsActivity::class) } diff --git a/androidApp/src/main/java/com/mrboomdev/awery/app/App.kt b/androidApp/src/main/java/com/mrboomdev/awery/app/App.kt index b0ae69bd..7e7a5388 100644 --- a/androidApp/src/main/java/com/mrboomdev/awery/app/App.kt +++ b/androidApp/src/main/java/com/mrboomdev/awery/app/App.kt @@ -95,7 +95,10 @@ class App : Application() { override fun attachBaseContext(base: Context) { AndroidGlobals.applicationContext = this super.attachBaseContext(base) - CrashHandler.setup() + + if(AwerySettings.ENABLE_CRASH_HANDLER.value) { + CrashHandler.setup() + } } @OptIn(DelicateCoroutinesApi::class) diff --git a/androidApp/src/main/java/com/mrboomdev/awery/app/AweryNotifications.java b/androidApp/src/main/java/com/mrboomdev/awery/app/AweryNotifications.java index d7ac7198..fa7e4c79 100644 --- a/androidApp/src/main/java/com/mrboomdev/awery/app/AweryNotifications.java +++ b/androidApp/src/main/java/com/mrboomdev/awery/app/AweryNotifications.java @@ -11,7 +11,7 @@ import androidx.core.app.NotificationCompat; import androidx.core.app.NotificationManagerCompat; -import com.mrboomdev.awery.utils.UniqueIdGenerator; +import com.mrboomdev.awery.ui.utils.UniqueIdGenerator; import org.jetbrains.annotations.Contract; diff --git a/androidApp/src/main/java/com/mrboomdev/awery/sources/BootstrapManager.kt b/androidApp/src/main/java/com/mrboomdev/awery/sources/BootstrapManager.kt deleted file mode 100644 index c0c95228..00000000 --- a/androidApp/src/main/java/com/mrboomdev/awery/sources/BootstrapManager.kt +++ /dev/null @@ -1,98 +0,0 @@ -package com.mrboomdev.awery.sources - -import com.mrboomdev.awery.ext.constants.AweryFeature -import com.mrboomdev.awery.ext.source.AbstractSource -import com.mrboomdev.awery.ext.source.Context -import com.mrboomdev.awery.ext.source.SourcesManager -import com.mrboomdev.awery.ext.util.PendingTask -import com.mrboomdev.awery.ext.util.Progress -import com.mrboomdev.awery.sources.yomi.YomiManager -import com.mrboomdev.awery.sources.yomi.aniyomi.AniyomiManager -import com.mrboomdev.awery.sources.yomi.tachiyomi.TachiyomiManager -import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.channelFlow -import kotlinx.coroutines.flow.collectIndexed -import java.io.InputStream -import android.content.Context as AndroidContext - -/** - * This is an pre-installed extensions manager, which does control ALL extensions. - * Every manager may have nested managers, so this one is the ROOT of all. - * @author MrBoomDev - */ -class BootstrapManager( - private val androidContext: AndroidContext -): SourcesManager(object : Context() { - override val features = arrayOf() - override val id = ID - override val isEnabled = true - override val name = "Bootstrap Sources Manager" - override val exception = null - override val icon = null -}) { - private val managers = mutableMapOf() - - override fun get(id: String): AbstractSource? = managers[id] - override fun getAll(): List = managers.values.toList() - - override fun onLoad(): PendingTask> { - YomiManager.initYomiShit(androidContext) - var totalSize = 0L - - managers[AniyomiManager.ID] = AniyomiManager(androidContext) - managers[TachiyomiManager.ID] = TachiyomiManager(androidContext) -// managers[CloudstreamManager.ID] = CloudstreamManager() -// managers[LnReaderManager.ID] = LnReaderManager() -// managers[KaguyaManager.ID] = KaguyaManager() -// managers[MiruManager.ID] = MiruManager() - - val pendingTasks = managers.values.map { manager -> - val task = manager.onLoad() - task.size?.let { totalSize += it } - manager to task - } - - return object : PendingTask>() { - override val size = totalSize - - override val data: Flow - get() = channelFlow { - val progresses = mutableMapOf() - val progress = Progress(totalSize) - - for((manager, task) in pendingTasks) { - task.data.collectIndexed { index, it -> - if(index == 0) { - progress.max += it.max - } - - progresses[manager] = it.value - progress.value = progresses.values.sum() - send(progress) - } - } - - if(!progress.isCompleted) { - progress.finish() - send(progress) - } - } - } - } - - override fun onUnload() { - for(manager in managers.values) { - manager.onUnload() - } - } - - // These methods aren't supposed to be invoked! - override suspend fun install(data: PendingTask) = throw UnsupportedOperationException() - override suspend fun uninstall(id: String) = throw UnsupportedOperationException() - override suspend fun load(id: String) = throw UnsupportedOperationException() - override fun unload(id: String, removeFromSource: Boolean) = throw UnsupportedOperationException() - - companion object { - const val ID = "BOOTSTRAP" - } -} \ No newline at end of file diff --git a/androidApp/src/main/java/com/mrboomdev/awery/ui/mobile/screens/SplashActivity.kt b/androidApp/src/main/java/com/mrboomdev/awery/ui/mobile/screens/SplashActivity.kt index ffc3eeb6..f2eb0551 100644 --- a/androidApp/src/main/java/com/mrboomdev/awery/ui/mobile/screens/SplashActivity.kt +++ b/androidApp/src/main/java/com/mrboomdev/awery/ui/mobile/screens/SplashActivity.kt @@ -3,17 +3,14 @@ package com.mrboomdev.awery.ui.mobile.screens import android.annotation.SuppressLint import android.os.Bundle import android.util.Log -import androidx.activity.compose.setContent import androidx.appcompat.app.AppCompatActivity import androidx.compose.runtime.CompositionLocalProvider import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen -import androidx.lifecycle.compose.LocalLifecycleOwner import androidx.lifecycle.lifecycleScope import cafe.adriel.voyager.core.annotation.ExperimentalVoyagerApi import cafe.adriel.voyager.navigator.LocalNavigatorSaver import cafe.adriel.voyager.navigator.Navigator import cafe.adriel.voyager.navigator.NavigatorDisposeBehavior -import cafe.adriel.voyager.navigator.parcelableNavigatorSaver import cafe.adriel.voyager.transitions.FadeTransition import com.dokar.sonner.Toaster import com.dokar.sonner.rememberToasterState @@ -21,7 +18,7 @@ import com.mrboomdev.awery.app.App import com.mrboomdev.awery.app.App.Companion.database import com.mrboomdev.awery.app.AweryLifecycle.Companion.runDelayed import com.mrboomdev.awery.app.CrashHandler -import com.mrboomdev.awery.app.ExtensionsManager +import com.mrboomdev.awery.sources.ExtensionsManager import com.mrboomdev.awery.app.theme.ThemeManager.applyTheme import com.mrboomdev.awery.databinding.ScreenSplashBinding import com.mrboomdev.awery.extensions.ExtensionsFactory @@ -30,7 +27,6 @@ import com.mrboomdev.awery.app.theme.LocalAweryTheme import com.mrboomdev.awery.app.theme.ThemeManager.setThemedContent import com.mrboomdev.awery.data.settings.PlatformSetting import com.mrboomdev.awery.ext.data.Setting -import com.mrboomdev.awery.ext.data.getRecursively import com.mrboomdev.awery.generated.* import com.mrboomdev.awery.platform.LocalSettingHandler import com.mrboomdev.awery.platform.PlatformSettingHandler @@ -40,23 +36,22 @@ import com.mrboomdev.awery.platform.i18n import com.mrboomdev.awery.ui.mobile.screens.setup.SetupActivity import com.mrboomdev.awery.ui.routes.SettingsRoute import com.mrboomdev.awery.ui.routes.SplashRoute -import com.mrboomdev.awery.ui.screens.SplashScreen import com.mrboomdev.awery.ui.tv.TvMainActivity import com.mrboomdev.awery.ui.utils.KSerializerNavigatorSaver import com.mrboomdev.awery.ui.utils.LocalToaster import com.mrboomdev.awery.util.async.AsyncFuture import com.mrboomdev.awery.util.extensions.enableEdgeToEdge import com.mrboomdev.awery.util.extensions.resolveAttrColor -import com.mrboomdev.awery.util.extensions.startActivity import com.mrboomdev.awery.utils.buildIntent -import com.mrboomdev.awery.utils.readAssets import com.mrboomdev.awery.utils.tryOr import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.collect import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.launch +import kotlinx.coroutines.runBlocking import kotlinx.serialization.ExperimentalSerializationApi import kotlinx.serialization.json.Json +import org.jetbrains.compose.resources.ExperimentalResourceApi private const val TAG = "SplashActivity" const val SPLASH_EXTRA_BOOLEAN_ENABLE_COMPOSE = "enable_compose" @@ -66,7 +61,7 @@ const val SPLASH_EXTRA_BOOLEAN_REDIRECT_SETTINGS = "redirect_settings" class SplashActivity : AppCompatActivity() { private lateinit var binding: ScreenSplashBinding - @OptIn(ExperimentalSerializationApi::class) + @OptIn(ExperimentalSerializationApi::class, ExperimentalResourceApi::class) override fun onCreate(savedInstanceState: Bundle?) { installSplashScreen() @@ -81,13 +76,18 @@ class SplashActivity : AppCompatActivity() { if(AwerySettings.EXPERIMENT_COMPOSE_UI.value || intent.getBooleanExtra(SPLASH_EXTRA_BOOLEAN_ENABLE_COMPOSE, false)) { val initialRoute = when { intent.getBooleanExtra(SPLASH_EXTRA_BOOLEAN_REDIRECT_SETTINGS, false) -> { + val settings = runBlocking { + Res.readBytes("files/app_settings.json").toString(Charsets.UTF_8) + }.let { + @Suppress("JSON_FORMAT_REDUNDANT") + Json { + decodeEnumsCaseInsensitive = true + isLenient = true + }.decodeFromString(it).apply { restoreValues() } + } + @Suppress("JSON_FORMAT_REDUNDANT") - SettingsRoute(Json { - decodeEnumsCaseInsensitive = true - isLenient = true - }.decodeFromString(readAssets("app_settings.json")).apply { - restoreValues() - }) + SettingsRoute(settings) } else -> SplashRoute() diff --git a/androidApp/src/main/java/com/mrboomdev/awery/ui/mobile/screens/catalog/MediaCatalogAdapter.java b/androidApp/src/main/java/com/mrboomdev/awery/ui/mobile/screens/catalog/MediaCatalogAdapter.java index 3abd71cf..6d18e5d5 100644 --- a/androidApp/src/main/java/com/mrboomdev/awery/ui/mobile/screens/catalog/MediaCatalogAdapter.java +++ b/androidApp/src/main/java/com/mrboomdev/awery/ui/mobile/screens/catalog/MediaCatalogAdapter.java @@ -20,7 +20,7 @@ import com.mrboomdev.awery.ext.data.CatalogMedia; import com.mrboomdev.awery.ui.mobile.dialogs.MediaActionsDialog; import com.mrboomdev.awery.util.MediaUtils; -import com.mrboomdev.awery.utils.UniqueIdGenerator; +import com.mrboomdev.awery.ui.utils.UniqueIdGenerator; import java.util.List; import java.util.WeakHashMap; diff --git a/androidApp/src/main/java/com/mrboomdev/awery/ui/mobile/screens/catalog/MediaCategoriesAdapter.kt b/androidApp/src/main/java/com/mrboomdev/awery/ui/mobile/screens/catalog/MediaCategoriesAdapter.kt index 87baa7ea..7c0ae5e1 100644 --- a/androidApp/src/main/java/com/mrboomdev/awery/ui/mobile/screens/catalog/MediaCategoriesAdapter.kt +++ b/androidApp/src/main/java/com/mrboomdev/awery/ui/mobile/screens/catalog/MediaCategoriesAdapter.kt @@ -9,7 +9,7 @@ import com.mrboomdev.awery.ui.mobile.screens.catalog.feeds.FeedViewHolder import com.mrboomdev.awery.ui.mobile.screens.catalog.feeds.FeedViewHolder.Feed import com.mrboomdev.awery.ui.mobile.screens.catalog.feeds.ListFeedViewHolder import com.mrboomdev.awery.ui.mobile.screens.catalog.feeds.PagesFeedViewHolder -import com.mrboomdev.awery.utils.UniqueIdGenerator +import com.mrboomdev.awery.ui.utils.UniqueIdGenerator import java.util.WeakHashMap class MediaCategoriesAdapter : RecyclerView.Adapter() { diff --git a/androidApp/src/main/java/com/mrboomdev/awery/ui/mobile/screens/catalog/feeds/PagesFeedViewHolder.kt b/androidApp/src/main/java/com/mrboomdev/awery/ui/mobile/screens/catalog/feeds/PagesFeedViewHolder.kt index c064aa77..3a5a5079 100644 --- a/androidApp/src/main/java/com/mrboomdev/awery/ui/mobile/screens/catalog/feeds/PagesFeedViewHolder.kt +++ b/androidApp/src/main/java/com/mrboomdev/awery/ui/mobile/screens/catalog/feeds/PagesFeedViewHolder.kt @@ -23,7 +23,7 @@ import com.mrboomdev.awery.ui.mobile.dialogs.MediaActionsDialog import com.mrboomdev.awery.ui.mobile.dialogs.MediaBookmarkDialog import com.mrboomdev.awery.ui.mobile.screens.media.MediaActivity import com.mrboomdev.awery.util.MediaUtils -import com.mrboomdev.awery.utils.UniqueIdGenerator +import com.mrboomdev.awery.ui.utils.UniqueIdGenerator import com.mrboomdev.awery.util.extensions.UI_INSETS import com.mrboomdev.awery.util.extensions.applyInsets import com.mrboomdev.awery.util.extensions.dpPx diff --git a/androidApp/src/main/java/com/mrboomdev/awery/ui/mobile/screens/media/MediaCommentsFragment.java b/androidApp/src/main/java/com/mrboomdev/awery/ui/mobile/screens/media/MediaCommentsFragment.java index 753e07b9..c3ded76e 100644 --- a/androidApp/src/main/java/com/mrboomdev/awery/ui/mobile/screens/media/MediaCommentsFragment.java +++ b/androidApp/src/main/java/com/mrboomdev/awery/ui/mobile/screens/media/MediaCommentsFragment.java @@ -65,7 +65,7 @@ import com.mrboomdev.awery.util.ui.adapter.DropdownBindingAdapter; import com.mrboomdev.awery.util.ui.adapter.SingleViewAdapter; import com.mrboomdev.awery.util.ui.dialog.DialogBuilder; -import com.mrboomdev.awery.utils.UniqueIdGenerator; +import com.mrboomdev.awery.ui.utils.UniqueIdGenerator; import java.util.ArrayList; import java.util.List; diff --git a/androidApp/src/main/java/com/mrboomdev/awery/ui/mobile/screens/media/MediaPlayEpisodesAdapter.java b/androidApp/src/main/java/com/mrboomdev/awery/ui/mobile/screens/media/MediaPlayEpisodesAdapter.java index c3fcae84..5f441949 100644 --- a/androidApp/src/main/java/com/mrboomdev/awery/ui/mobile/screens/media/MediaPlayEpisodesAdapter.java +++ b/androidApp/src/main/java/com/mrboomdev/awery/ui/mobile/screens/media/MediaPlayEpisodesAdapter.java @@ -22,7 +22,6 @@ import com.bumptech.glide.Glide; import com.google.android.material.theme.overlay.MaterialThemeOverlay; -import com.mrboomdev.awery.R; import com.mrboomdev.awery.app.App; import com.mrboomdev.awery.databinding.ItemListEpisodeBinding; import com.mrboomdev.awery.ext.data.CatalogMedia; @@ -30,7 +29,7 @@ import com.mrboomdev.awery.extensions.data.CatalogVideo; import com.mrboomdev.awery.generated.Res; import com.mrboomdev.awery.generated.String0_commonMainKt; -import com.mrboomdev.awery.utils.UniqueIdGenerator; +import com.mrboomdev.awery.ui.utils.UniqueIdGenerator; import java.util.ArrayList; import java.util.Calendar; diff --git a/androidApp/src/main/java/com/mrboomdev/awery/ui/mobile/screens/media/MediaPlayFragment.kt b/androidApp/src/main/java/com/mrboomdev/awery/ui/mobile/screens/media/MediaPlayFragment.kt index 705e33de..4e0ba4b4 100644 --- a/androidApp/src/main/java/com/mrboomdev/awery/ui/mobile/screens/media/MediaPlayFragment.kt +++ b/androidApp/src/main/java/com/mrboomdev/awery/ui/mobile/screens/media/MediaPlayFragment.kt @@ -170,6 +170,7 @@ class MediaPlayFragment: Fragment(), SafeArgsFragment, O changeSettings = false } + @OptIn(ExperimentalStdlibApi::class) override fun onViewCreated(view: View, savedInstanceState: Bundle?): Unit = with(view.context) { if(media == null) { media = rememberSafeArgs!!.media @@ -396,6 +397,7 @@ class MediaPlayFragment: Fragment(), SafeArgsFragment, O variantsAdapter!!.getBinding { binding -> binding.variantWrapper.visibility = View.GONE } } + @OptIn(ExperimentalStdlibApi::class) private fun loadEpisodesFromSource(source: ExtensionProvider, media: CatalogMedia) { val myId = ++loadId diff --git a/androidApp/src/main/java/com/mrboomdev/awery/ui/mobile/screens/search/SearchActivity.kt b/androidApp/src/main/java/com/mrboomdev/awery/ui/mobile/screens/search/SearchActivity.kt index 56449805..abafe0b2 100644 --- a/androidApp/src/main/java/com/mrboomdev/awery/ui/mobile/screens/search/SearchActivity.kt +++ b/androidApp/src/main/java/com/mrboomdev/awery/ui/mobile/screens/search/SearchActivity.kt @@ -37,7 +37,7 @@ import com.mrboomdev.awery.ui.mobile.dialogs.FiltersDialog import com.mrboomdev.awery.ui.mobile.dialogs.MediaActionsDialog import com.mrboomdev.awery.util.MediaUtils import com.mrboomdev.awery.util.Selection -import com.mrboomdev.awery.utils.UniqueIdGenerator +import com.mrboomdev.awery.ui.utils.UniqueIdGenerator import com.mrboomdev.awery.util.async.AsyncFuture import com.mrboomdev.awery.util.exceptions.ExtensionNotInstalledException import com.mrboomdev.awery.util.extensions.UI_INSETS diff --git a/androidApp/src/main/java/com/mrboomdev/awery/ui/mobile/screens/settings/SettingsActivity.java b/androidApp/src/main/java/com/mrboomdev/awery/ui/mobile/screens/settings/SettingsActivity.java index 84da550a..2b89649c 100644 --- a/androidApp/src/main/java/com/mrboomdev/awery/ui/mobile/screens/settings/SettingsActivity.java +++ b/androidApp/src/main/java/com/mrboomdev/awery/ui/mobile/screens/settings/SettingsActivity.java @@ -41,7 +41,7 @@ import com.mrboomdev.awery.ui.mobile.components.EmptyStateView; import com.mrboomdev.awery.util.exceptions.OkiThrowableMessageKt; import com.mrboomdev.awery.util.extensions.ActivityExtensionsKt; -import com.mrboomdev.awery.utils.UniqueIdGenerator; +import com.mrboomdev.awery.ui.utils.UniqueIdGenerator; import com.squareup.moshi.Moshi; import java.io.IOException; diff --git a/androidApp/src/main/java/com/mrboomdev/awery/ui/mobile/screens/settings/SettingsActivity2.kt b/androidApp/src/main/java/com/mrboomdev/awery/ui/mobile/screens/settings/SettingsActivity2.kt deleted file mode 100644 index 04b07233..00000000 --- a/androidApp/src/main/java/com/mrboomdev/awery/ui/mobile/screens/settings/SettingsActivity2.kt +++ /dev/null @@ -1,133 +0,0 @@ -package com.mrboomdev.awery.ui.mobile.screens.settings - -import android.content.Intent -import android.os.Bundle -import androidx.activity.ComponentActivity -import androidx.activity.compose.PredictiveBackHandler -import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.Spacer -import androidx.compose.foundation.layout.WindowInsets -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.safeContent -import androidx.compose.foundation.layout.windowInsetsEndWidth -import androidx.compose.foundation.layout.windowInsetsStartWidth -import androidx.compose.material3.adaptive.ExperimentalMaterial3AdaptiveApi -import androidx.compose.material3.adaptive.currentWindowAdaptiveInfo -import androidx.compose.material3.adaptive.layout.ListDetailPaneScaffoldRole -import androidx.compose.material3.adaptive.layout.calculatePaneScaffoldDirective -import androidx.compose.material3.adaptive.navigation.BackNavigationBehavior -import androidx.compose.material3.adaptive.navigation.rememberListDetailPaneScaffoldNavigator -import androidx.compose.runtime.CompositionLocalProvider -import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember -import androidx.compose.runtime.setValue -import androidx.compose.ui.Modifier -import com.dokar.sonner.Toaster -import com.dokar.sonner.rememberToasterState -import com.mrboomdev.awery.app.theme.LocalAweryTheme -import com.mrboomdev.awery.app.theme.ThemeManager.setThemedContent -import com.mrboomdev.awery.data.settings.PlatformSetting -import com.mrboomdev.awery.ext.data.Setting -import com.mrboomdev.awery.ui.mobile.screens.SPLASH_EXTRA_BOOLEAN_ENABLE_COMPOSE -import com.mrboomdev.awery.ui.mobile.screens.SPLASH_EXTRA_BOOLEAN_REDIRECT_SETTINGS -import com.mrboomdev.awery.ui.mobile.screens.SplashActivity -import com.mrboomdev.awery.ui.screens.settings.SettingsScreen -import com.mrboomdev.awery.ui.screens.settings.historyState -import com.mrboomdev.awery.ui.utils.LocalToaster -import com.mrboomdev.awery.util.extensions.enableEdgeToEdge -import com.mrboomdev.awery.utils.readAssets -import kotlinx.coroutines.CancellationException -import kotlinx.coroutines.flow.collect -import kotlinx.serialization.ExperimentalSerializationApi -import kotlinx.serialization.json.Json - -class SettingsActivity2: ComponentActivity() { - - @Suppress("JSON_FORMAT_REDUNDANT") - @OptIn(ExperimentalMaterial3AdaptiveApi::class, ExperimentalSerializationApi::class) - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - enableEdgeToEdge() - - // Always true - if("0".toInt() == 0) { - startActivity(Intent(this, SplashActivity::class.java).apply { - putExtra(SPLASH_EXTRA_BOOLEAN_ENABLE_COMPOSE, true) - putExtra(SPLASH_EXTRA_BOOLEAN_REDIRECT_SETTINGS, true) - }) - - finish() - return - } - - val settings = Json { - decodeEnumsCaseInsensitive = true - isLenient = true - }.decodeFromString(readAssets("app_settings.json")).apply { - restoreValues() - } - - setThemedContent { - var didOpenAnyScreen by remember { mutableStateOf(false) } - val scaffoldDirective = calculatePaneScaffoldDirective(currentWindowAdaptiveInfo()) - val navigator = rememberListDetailPaneScaffoldNavigator(scaffoldDirective) - val navigatorHistory = remember { navigator.historyState } - val toaster = rememberToasterState() - - PredictiveBackHandler( - (didOpenAnyScreen && !navigatorHistory.isEmpty()) || navigator.canNavigateBack(BackNavigationBehavior.PopLatest) - ) { progress -> - try { - progress.collect() - navigator.navigateBack(BackNavigationBehavior.PopLatest) - - if(didOpenAnyScreen && navigatorHistory.isEmpty() && scaffoldDirective.maxHorizontalPartitions == 1) { - navigator.navigateTo(ListDetailPaneScaffoldRole.List, settings) - didOpenAnyScreen = false - } - } catch(_: CancellationException) {} - } - - CompositionLocalProvider(LocalToaster provides toaster) { - Row(Modifier.fillMaxSize()) { - Spacer(Modifier.windowInsetsStartWidth(WindowInsets.safeContent)) - - SettingsScreen( - modifier = Modifier.weight(1f), - screen = settings, - navigator = navigator, - - /*settingComposable = { setting, onOpenScreen, isSelected -> - MobileSetting( - setting = setting, - isSelected = isSelected, - - onOpenScreen = { - coroutineScope.cancel() - - if(it is PlatformSetting && it.isLazy) { - toast("TODO: IMPLEMENT LAZY SCREEN LOADING") - } - - if(!didOpenAnyScreen) { - didOpenAnyScreen = true - } - - onOpenScreen(it) - } - ) - }*/ - ) - - Spacer(Modifier.windowInsetsEndWidth(WindowInsets.safeContent)) - } - } - - Toaster( - state = toaster, - darkTheme = LocalAweryTheme.current.isDark - ) - } - } -} \ No newline at end of file diff --git a/androidApp/src/main/java/com/mrboomdev/awery/ui/mobile/screens/settings/SettingsAdapter.java b/androidApp/src/main/java/com/mrboomdev/awery/ui/mobile/screens/settings/SettingsAdapter.java index 736ecf9f..3e0cfa8e 100644 --- a/androidApp/src/main/java/com/mrboomdev/awery/ui/mobile/screens/settings/SettingsAdapter.java +++ b/androidApp/src/main/java/com/mrboomdev/awery/ui/mobile/screens/settings/SettingsAdapter.java @@ -41,7 +41,6 @@ import com.google.android.material.checkbox.MaterialCheckBox; import com.google.android.material.slider.Slider; import com.mrboomdev.awery.R; -import com.mrboomdev.awery.app.AweryLifecycle; import com.mrboomdev.awery.data.settings.CustomSettingsItem; import com.mrboomdev.awery.data.settings.ObservableSettingsItem; import com.mrboomdev.awery.data.settings.SettingsData; @@ -56,7 +55,7 @@ import com.mrboomdev.awery.util.ui.dialog.SelectionDialog; import com.mrboomdev.awery.util.ui.fields.EditTextField; import com.mrboomdev.awery.util.ui.fields.FancyField; -import com.mrboomdev.awery.utils.UniqueIdGenerator; +import com.mrboomdev.awery.ui.utils.UniqueIdGenerator; import java.util.ArrayList; import java.util.Collections; diff --git a/androidApp/src/main/java/com/mrboomdev/awery/ui/mobile/screens/setup/SetupActivity.kt b/androidApp/src/main/java/com/mrboomdev/awery/ui/mobile/screens/setup/SetupActivity.kt index 26c73bb2..15c54523 100644 --- a/androidApp/src/main/java/com/mrboomdev/awery/ui/mobile/screens/setup/SetupActivity.kt +++ b/androidApp/src/main/java/com/mrboomdev/awery/ui/mobile/screens/setup/SetupActivity.kt @@ -1,6 +1,5 @@ package com.mrboomdev.awery.ui.mobile.screens.setup -import android.content.Intent import android.os.Bundle import android.view.View import androidx.appcompat.app.AppCompatActivity @@ -10,6 +9,7 @@ import com.google.android.material.materialswitch.MaterialSwitch import com.mrboomdev.awery.R import com.mrboomdev.awery.app.App.Companion.database import com.mrboomdev.awery.app.theme.ThemeManager.applyTheme +import com.mrboomdev.awery.data.settings.PlatformSetting import com.mrboomdev.awery.databinding.ScreenSetupBinding import com.mrboomdev.awery.generated.* import com.mrboomdev.awery.platform.PlatformSettingHandler @@ -18,12 +18,10 @@ import com.mrboomdev.awery.ui.mobile.screens.SplashActivity import com.mrboomdev.awery.ui.mobile.screens.setup.SetupThemeAdapter.Companion.create import com.mrboomdev.awery.util.extensions.UI_INSETS import com.mrboomdev.awery.util.extensions.applyInsets -import com.mrboomdev.awery.util.extensions.dpPx import com.mrboomdev.awery.util.extensions.enableEdgeToEdge import com.mrboomdev.awery.util.extensions.resolveAttrColor import com.mrboomdev.awery.util.extensions.setImageTintAttr import com.mrboomdev.awery.util.extensions.setMarkwon -import com.mrboomdev.awery.util.extensions.startActivity import com.mrboomdev.awery.util.ui.RecyclerItemDecoration import com.mrboomdev.awery.util.ui.adapter.SingleViewAdapter import com.mrboomdev.awery.util.ui.dialog.DialogBuilder @@ -85,7 +83,7 @@ class SetupActivity : AppCompatActivity(), SafeArgsActivity()) { activity.recreate() } diff --git a/androidApp/src/main/java/com/mrboomdev/awery/ui/tv/TvMainActivity.kt b/androidApp/src/main/java/com/mrboomdev/awery/ui/tv/TvMainActivity.kt index aa193438..4cfbe5f3 100644 --- a/androidApp/src/main/java/com/mrboomdev/awery/ui/tv/TvMainActivity.kt +++ b/androidApp/src/main/java/com/mrboomdev/awery/ui/tv/TvMainActivity.kt @@ -24,6 +24,7 @@ import com.mrboomdev.awery.ui.tv.screens.media.MediaScreen import com.mrboomdev.awery.util.NavUtils import com.mrboomdev.awery.util.extensions.enableEdgeToEdge import com.mrboomdev.awery.utils.readAssets +import com.mrboomdev.awery.utils.readClasspath import kotlinx.serialization.ExperimentalSerializationApi import kotlinx.serialization.Serializable import kotlinx.serialization.json.Json @@ -65,9 +66,9 @@ class TvMainActivity : ComponentActivity() { Json { decodeEnumsCaseInsensitive = true isLenient = true - }.decodeFromString(readAssets("app_settings.json")).apply { - restoreValues() - } + }.decodeFromString( + readClasspath("composeResources/com.mrboomdev.awery.generated/files/app_settings.json").toString(Charsets.UTF_8) + ).apply { restoreValues() } } SettingsScreen( diff --git a/androidApp/src/main/java/com/mrboomdev/awery/ui/tv/components/FeedsGroup.kt b/androidApp/src/main/java/com/mrboomdev/awery/ui/tv/components/FeedsGroup.kt index e40657d6..7cb37d84 100644 --- a/androidApp/src/main/java/com/mrboomdev/awery/ui/tv/components/FeedsGroup.kt +++ b/androidApp/src/main/java/com/mrboomdev/awery/ui/tv/components/FeedsGroup.kt @@ -38,9 +38,9 @@ import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp import androidx.tv.material3.MaterialTheme import androidx.tv.material3.Text +import com.mrboomdev.awery.data.settings.get import com.mrboomdev.awery.ext.data.CatalogFeed import com.mrboomdev.awery.ext.data.CatalogMedia -import com.mrboomdev.awery.ext.data.get import com.mrboomdev.awery.ext.util.exceptions.ZeroResultsException import kotlinx.coroutines.delay import kotlinx.coroutines.launch diff --git a/androidApp/src/main/java/com/mrboomdev/awery/ui/tv/screens/home/HomeViewModel.kt b/androidApp/src/main/java/com/mrboomdev/awery/ui/tv/screens/home/HomeViewModel.kt index 38ec0f7a..eeec2375 100644 --- a/androidApp/src/main/java/com/mrboomdev/awery/ui/tv/screens/home/HomeViewModel.kt +++ b/androidApp/src/main/java/com/mrboomdev/awery/ui/tv/screens/home/HomeViewModel.kt @@ -11,7 +11,7 @@ import androidx.tv.material3.DrawerState import androidx.tv.material3.DrawerValue import com.mrboomdev.awery.R import com.mrboomdev.awery.app.App.Companion.getMoshi -import com.mrboomdev.awery.app.ExtensionsManager.loadAll +import com.mrboomdev.awery.sources.ExtensionsManager.loadAll import com.mrboomdev.awery.ext.data.CatalogFeed import com.mrboomdev.awery.ext.util.exceptions.ZeroResultsException import com.mrboomdev.awery.generated.* @@ -74,6 +74,7 @@ class HomeViewModel : ViewModel() { var drawerState: DrawerState = DrawerState(DrawerValue.Closed) var listState: LazyListState = LazyListState() + @OptIn(ExperimentalStdlibApi::class) fun loadTabsList() { if(tabs.isEmpty()) { val template = AwerySettings.TABS_TEMPLATE.value diff --git a/androidApp/src/main/java/com/mrboomdev/awery/ui/tv/screens/media/MediaInfoScreen.kt b/androidApp/src/main/java/com/mrboomdev/awery/ui/tv/screens/media/MediaInfoScreen.kt index 6b474f61..50749584 100644 --- a/androidApp/src/main/java/com/mrboomdev/awery/ui/tv/screens/media/MediaInfoScreen.kt +++ b/androidApp/src/main/java/com/mrboomdev/awery/ui/tv/screens/media/MediaInfoScreen.kt @@ -33,14 +33,13 @@ import com.mrboomdev.awery.AweryDebug import com.mrboomdev.awery.R import com.mrboomdev.awery.app.AweryLifecycle.Companion.getAnyActivity import com.mrboomdev.awery.app.AweryLocales -import com.mrboomdev.awery.app.ExtensionsManager +import com.mrboomdev.awery.sources.ExtensionsManager import com.mrboomdev.awery.ext.data.CatalogMedia import com.mrboomdev.awery.generated.* import com.mrboomdev.awery.platform.android.AndroidGlobals.toast import com.mrboomdev.awery.ui.mobile.dialogs.MediaBookmarkDialog import com.mrboomdev.awery.ui.mobile.screens.BrowserActivity import com.mrboomdev.awery.util.extensions.plus -import com.mrboomdev.awery.util.extensions.startActivity import com.mrboomdev.awery.util.extensions.toCalendar import com.mrboomdev.awery.utils.buildIntent import org.jetbrains.compose.resources.stringResource diff --git a/androidApp/src/main/java/com/mrboomdev/awery/util/NiceUtils.java b/androidApp/src/main/java/com/mrboomdev/awery/util/NiceUtils.java index dbb1af1d..a2e39e49 100644 --- a/androidApp/src/main/java/com/mrboomdev/awery/util/NiceUtils.java +++ b/androidApp/src/main/java/com/mrboomdev/awery/util/NiceUtils.java @@ -14,7 +14,7 @@ import androidx.fragment.app.Fragment; import androidx.media3.common.MimeTypes; -import com.mrboomdev.awery.utils.UniqueIdGenerator; +import com.mrboomdev.awery.ui.utils.UniqueIdGenerator; import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; @@ -221,6 +221,7 @@ public static boolean isUrlValid(String url) { * @see #uniqueStringToList(String) */ @NotNull + @Deprecated(forRemoval = true) public static String listToUniqueString(@NotNull Iterable iterable) { var builder = new StringBuilder(";;;"); @@ -237,6 +238,7 @@ public static String listToUniqueString(@NotNull Iterable iterable) { * @param uniqueString - String of format ";;;value1;;;value2;;;value3;;;";;; */ @NotNull + @Deprecated(forRemoval = true) public static @Unmodifiable List uniqueStringToList(@NotNull String uniqueString) { if(uniqueString.length() <= 3) return Collections.emptyList(); return List.of(uniqueString.substring(3, uniqueString.length() - 3).split(";;;")); diff --git a/androidApp/src/main/java/eu/kanade/tachiyomi/AppInfo.kt b/androidApp/src/main/java/eu/kanade/tachiyomi/AppInfo.kt deleted file mode 100644 index 80fc06af..00000000 --- a/androidApp/src/main/java/eu/kanade/tachiyomi/AppInfo.kt +++ /dev/null @@ -1,23 +0,0 @@ -package eu.kanade.tachiyomi - -/** - * Used by extensions. - */ -@Suppress("UNUSED") -object AppInfo { - /** - * Version code of the host application. May be useful for sharing as User-Agent information. - * Note that this value differs between forks so logic should not rely on it. - * - * @since extension-lib 1.3 - */ - fun getVersionCode(): Int = com.mrboomdev.awery.BuildConfig.VERSION_CODE - - /** - * Version name of the host application. May be useful for sharing as User-Agent information. - * Note that this value differs between forks so logic should not rely on it. - * - * @since extension-lib 1.3 - */ - fun getVersionName(): String = com.mrboomdev.awery.BuildConfig.VERSION_NAME -} \ No newline at end of file diff --git a/androidApp/src/main/java/eu/kanade/tachiyomi/animesource/AnimeCatalogueSource.kt b/androidApp/src/main/java/eu/kanade/tachiyomi/animesource/AnimeCatalogueSource.kt deleted file mode 100644 index 42ba5c1c..00000000 --- a/androidApp/src/main/java/eu/kanade/tachiyomi/animesource/AnimeCatalogueSource.kt +++ /dev/null @@ -1,80 +0,0 @@ -package eu.kanade.tachiyomi.animesource - -import eu.kanade.tachiyomi.animesource.model.AnimeFilterList -import eu.kanade.tachiyomi.animesource.model.AnimesPage -import eu.kanade.tachiyomi.util.lang.awaitSingle -import rx.Observable - -interface AnimeCatalogueSource : AnimeSource { - - /** - * An ISO 639-1 compliant language code (two letters in lower case). - */ - override val lang: String - - /** - * Whether the source has support for latest updates. - */ - val supportsLatest: Boolean - - /** - * Get a page with a list of anime. - * - * @since extensions-lib 1.5 - * @param page the page number to retrieve. - */ - @Suppress("DEPRECATION") - suspend fun getPopularAnime(page: Int): AnimesPage { - return fetchPopularAnime(page).awaitSingle() - } - - /** - * Get a page with a list of anime. - * - * @since extensions-lib 1.5 - * @param page the page number to retrieve. - * @param query the search query. - * @param filters the list of filters to apply. - */ - @Suppress("DEPRECATION") - suspend fun getSearchAnime(page: Int, query: String, filters: AnimeFilterList): AnimesPage { - return fetchSearchAnime(page, query, filters).awaitSingle() - } - - /** - * Get a page with a list of latest anime updates. - * - * @since extensions-lib 1.5 - * @param page the page number to retrieve. - */ - @Suppress("DEPRECATION") - suspend fun getLatestUpdates(page: Int): AnimesPage { - return fetchLatestUpdates(page).awaitSingle() - } - - /** - * Returns the list of filters for the source. - */ - fun getFilterList(): AnimeFilterList - - // Should be replaced as soon as Anime Extension reach 1.5 - @Deprecated( - "Use the non-RxJava API instead", - ReplaceWith("getPopularAnime"), - ) - fun fetchPopularAnime(page: Int): Observable - - // Should be replaced as soon as Anime Extension reach 1.5 - @Deprecated( - "Use the non-RxJava API instead", - ReplaceWith("getSearchAnime"), - ) - fun fetchSearchAnime(page: Int, query: String, filters: AnimeFilterList): Observable - - // Should be replaced as soon as Anime Extension reach 1.5 - @Deprecated( - "Use the non-RxJava API instead", - ReplaceWith("getLatestUpdates"), - ) - fun fetchLatestUpdates(page: Int): Observable -} \ No newline at end of file diff --git a/androidApp/src/main/java/eu/kanade/tachiyomi/animesource/AnimeSource.kt b/androidApp/src/main/java/eu/kanade/tachiyomi/animesource/AnimeSource.kt deleted file mode 100644 index 210e04df..00000000 --- a/androidApp/src/main/java/eu/kanade/tachiyomi/animesource/AnimeSource.kt +++ /dev/null @@ -1,85 +0,0 @@ -package eu.kanade.tachiyomi.animesource - -import eu.kanade.tachiyomi.animesource.model.SAnime -import eu.kanade.tachiyomi.animesource.model.SEpisode -import eu.kanade.tachiyomi.animesource.model.Video -import eu.kanade.tachiyomi.util.lang.awaitSingle -import rx.Observable - -/** - * A basic interface for creating a source. It could be an online source, a local source, etc. - */ -interface AnimeSource { - - /** - * ID for the source. Must be unique. - */ - val id: Long - - /** - * Name of the source. - */ - val name: String - - val lang: String - get() = "" - - /** - * Returns an observable with the updated details for a anime. - * - * @param anime the anime to update. - */ - @Deprecated( - "Use the 1.x API instead", - ReplaceWith("getAnimeDetails"), - ) - fun fetchAnimeDetails(anime: SAnime): Observable = throw IllegalStateException("Not used") - - /** - * Returns an observable with all the available episodes for a anime. - * - * @param anime the anime to update. - */ - @Deprecated( - "Use the 1.x API instead", - ReplaceWith("getEpisodeList"), - ) - fun fetchEpisodeList(anime: SAnime): Observable> = throw IllegalStateException("Not used") - - /** - * Returns an observable with the list of videos a episode has. Videos should be returned - * in the expected order; the index is ignored. - * - * @param episode the episode. - */ - @Deprecated( - "Use the 1.x API instead", - ReplaceWith("getVideoList"), - ) - fun fetchVideoList(episode: SEpisode): Observable> = Observable.empty() - - /** - * [1.x API] Get the updated details for a anime. - */ - @Suppress("DEPRECATION") - suspend fun getAnimeDetails(anime: SAnime): SAnime { - return fetchAnimeDetails(anime).awaitSingle() - } - - /** - * [1.x API] Get all the available episodes for a anime. - */ - @Suppress("DEPRECATION") - suspend fun getEpisodeList(anime: SAnime): List { - return fetchEpisodeList(anime).awaitSingle() - } - - /** - * [1.x API] Get the list of videos a episode has. Videos should be returned - * in the expected order; the index is ignored. - */ - @Suppress("DEPRECATION") - suspend fun getVideoList(episode: SEpisode): List