Explorar el Código

new project structure

Milan Jurkulak hace 3 meses
padre
commit
7adf5cb934
Se han modificado 100 ficheros con 160 adiciones y 168 borrados
  1. 2 1
      .claude/settings.local.json
  2. 1 1
      .run/android.run.xml
  3. 2 2
      .run/desktop.run.xml
  4. 69 0
      androidApp/androidApp.gradle.kts
  5. 0 0
      androidApp/src/main/AndroidManifest.xml
  6. 0 0
      androidApp/src/main/kotlin/org/mjdev/desktop/activity/MainActivity.kt
  7. 0 0
      androidApp/src/main/kotlin/org/mjdev/desktop/app/App.kt
  8. 0 0
      androidApp/src/main/kotlin/org/mjdev/desktop/extensions/ComponentActivity.kt
  9. 0 0
      androidApp/src/main/kotlin/org/mjdev/desktop/main/MainView.kt
  10. 0 0
      androidApp/src/main/res/mipmap-anydpi-v26/ic_banner.xml
  11. 0 0
      androidApp/src/main/res/mipmap-hdpi/ic_launcher.webp
  12. 0 0
      androidApp/src/main/res/mipmap-hdpi/ic_launcher_foreground.webp
  13. 0 0
      androidApp/src/main/res/mipmap-hdpi/ic_launcher_round.webp
  14. 0 0
      androidApp/src/main/res/mipmap-mdpi/ic_launcher.webp
  15. 0 0
      androidApp/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp
  16. 0 0
      androidApp/src/main/res/mipmap-mdpi/ic_launcher_round.webp
  17. 0 0
      androidApp/src/main/res/mipmap-xhdpi/ic_banner.png
  18. 0 0
      androidApp/src/main/res/mipmap-xhdpi/ic_banner_foreground.png
  19. 0 0
      androidApp/src/main/res/mipmap-xhdpi/ic_launcher.webp
  20. 0 0
      androidApp/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp
  21. 0 0
      androidApp/src/main/res/mipmap-xhdpi/ic_launcher_round.webp
  22. 0 0
      androidApp/src/main/res/mipmap-xxhdpi/ic_launcher.webp
  23. 0 0
      androidApp/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp
  24. 0 0
      androidApp/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp
  25. 0 0
      androidApp/src/main/res/mipmap-xxxhdpi/ic_launcher.webp
  26. 0 0
      androidApp/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp
  27. 0 0
      androidApp/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp
  28. 0 0
      androidApp/src/main/res/values/ic_banner_background.xml
  29. 0 0
      androidApp/src/main/res/values/splash.xml
  30. 0 0
      androidApp/src/main/res/xml/network_security_config.xml
  31. 7 7
      build.gradle.kts
  32. 0 6
      buildSrc/build.gradle.kts
  33. 56 0
      desktopApp/desktopApp.gradle.kts
  34. 0 0
      desktopApp/desktopApp.pro
  35. 0 0
      desktopApp/src/main/kotlin/org/mjdev/desktop/main/Main.kt
  36. 3 1
      gradle.properties
  37. 3 2
      gradle/libs.versions.toml
  38. 3 1
      settings.gradle.kts
  39. 14 147
      shared/shared.gradle.kts
  40. 0 0
      shared/src/androidMain/kotlin/org/mjdev/desktop/components/video/MediaPlayer.kt
  41. 0 0
      shared/src/androidMain/kotlin/org/mjdev/desktop/components/video/VideoPlayer.kt
  42. 0 0
      shared/src/androidMain/kotlin/org/mjdev/desktop/components/video/VideoPlayerState.kt
  43. 0 0
      shared/src/androidMain/kotlin/org/mjdev/desktop/context/DesktopContext.kt
  44. 0 0
      shared/src/androidMain/kotlin/org/mjdev/desktop/context/LocalDesktopContext.android.kt
  45. 0 0
      shared/src/androidMain/kotlin/org/mjdev/desktop/data/App.kt
  46. 0 0
      shared/src/androidMain/kotlin/org/mjdev/desktop/data/Theme.kt
  47. 0 0
      shared/src/androidMain/kotlin/org/mjdev/desktop/data/User.kt
  48. 0 0
      shared/src/androidMain/kotlin/org/mjdev/desktop/data/UserDirs.kt
  49. 0 0
      shared/src/androidMain/kotlin/org/mjdev/desktop/extensions/ImageBitmapExt.kt
  50. 0 0
      shared/src/androidMain/kotlin/org/mjdev/desktop/helpers/DecoderAndroid.kt
  51. 0 0
      shared/src/androidMain/kotlin/org/mjdev/desktop/helpers/WakeLockHelper.kt
  52. 0 0
      shared/src/androidMain/kotlin/org/mjdev/desktop/helpers/crash/CrashHandler.kt
  53. 0 0
      shared/src/androidMain/kotlin/org/mjdev/desktop/helpers/font/CodePointsFile.kt
  54. 0 0
      shared/src/androidMain/kotlin/org/mjdev/desktop/helpers/font/FontDescriptor.kt
  55. 0 0
      shared/src/androidMain/kotlin/org/mjdev/desktop/helpers/font/MaterialIconFont.android.kt
  56. 0 0
      shared/src/androidMain/kotlin/org/mjdev/desktop/helpers/permission/PermissonManager.kt
  57. 0 0
      shared/src/androidMain/kotlin/org/mjdev/desktop/helpers/persistence/StorageProvider.kt
  58. 0 0
      shared/src/androidMain/kotlin/org/mjdev/desktop/helpers/streams/ResourceStream.android.kt
  59. 0 0
      shared/src/androidMain/kotlin/org/mjdev/desktop/helpers/system/meminfo/MemInfo.android.kt
  60. 0 0
      shared/src/androidMain/kotlin/org/mjdev/desktop/helpers/system/meminfo/MemInfoAndroid.kt
  61. 0 0
      shared/src/androidMain/kotlin/org/mjdev/desktop/managers/ai/tts/TTSPluginAndroid.kt
  62. 0 0
      shared/src/androidMain/kotlin/org/mjdev/desktop/managers/apps/AppsManager.kt
  63. 0 0
      shared/src/androidMain/kotlin/org/mjdev/desktop/managers/connectivity/ConnectivityManager.kt
  64. 0 0
      shared/src/androidMain/kotlin/org/mjdev/desktop/managers/connectivity/ConnectivityManagerStub.kt
  65. 0 0
      shared/src/androidMain/kotlin/org/mjdev/desktop/managers/keys/KeysManager.kt
  66. 0 0
      shared/src/androidMain/kotlin/org/mjdev/desktop/managers/os/OSManager.kt
  67. 0 0
      shared/src/androidMain/kotlin/org/mjdev/desktop/managers/processes/ProcessManager.kt
  68. 0 0
      shared/src/androidMain/kotlin/org/mjdev/desktop/managers/theme/ThemeManager.kt
  69. 0 0
      shared/src/androidMain/kotlin/org/mjdev/desktop/managers/theme/base/ThemeManagerStub.kt
  70. 0 0
      shared/src/androidMain/kotlin/org/mjdev/desktop/system/Filesystem.android.kt
  71. 0 0
      shared/src/androidMain/kotlin/org/mjdev/desktop/system/Platform.android.kt
  72. 0 0
      shared/src/androidMain/kotlin/org/mjdev/desktop/wayland/WaylandDisplay.android.kt
  73. 0 0
      shared/src/androidMain/kotlin/org/mjdev/desktop/windows/ChromeWindow.kt
  74. 0 0
      shared/src/commonMain/composeResources/drawable/blur4.webp
  75. 0 0
      shared/src/commonMain/composeResources/drawable/icon.png
  76. 0 0
      shared/src/commonMain/composeResources/drawable/icon.svg
  77. 0 0
      shared/src/commonMain/composeResources/values/strings.xml
  78. 0 0
      shared/src/commonMain/kotlin/org/mjdev/desktop/components/adb/AdbScreenMirror.kt
  79. 0 0
      shared/src/commonMain/kotlin/org/mjdev/desktop/components/appbar/AppBar.kt
  80. 0 0
      shared/src/commonMain/kotlin/org/mjdev/desktop/components/appsmenu/AppsMenu.kt
  81. 0 0
      shared/src/commonMain/kotlin/org/mjdev/desktop/components/appsmenu/components/AppsBottomBar.kt
  82. 0 0
      shared/src/commonMain/kotlin/org/mjdev/desktop/components/appsmenu/components/AppsList.kt
  83. 0 0
      shared/src/commonMain/kotlin/org/mjdev/desktop/components/appsmenu/components/AppsMenuActions.kt
  84. 0 0
      shared/src/commonMain/kotlin/org/mjdev/desktop/components/appsmenu/components/AppsMenuApp.kt
  85. 0 0
      shared/src/commonMain/kotlin/org/mjdev/desktop/components/appsmenu/components/AppsMenuCategory.kt
  86. 0 0
      shared/src/commonMain/kotlin/org/mjdev/desktop/components/background/BackgroundImage.kt
  87. 0 0
      shared/src/commonMain/kotlin/org/mjdev/desktop/components/blur/BlurPanel.kt
  88. 0 0
      shared/src/commonMain/kotlin/org/mjdev/desktop/components/blur/BlurPanelHaze.kt
  89. 0 0
      shared/src/commonMain/kotlin/org/mjdev/desktop/components/button/ButtonPrimary.kt
  90. 0 0
      shared/src/commonMain/kotlin/org/mjdev/desktop/components/button/ButtonSecondary.kt
  91. 0 0
      shared/src/commonMain/kotlin/org/mjdev/desktop/components/button/TransparentButton.kt
  92. 0 0
      shared/src/commonMain/kotlin/org/mjdev/desktop/components/card/Card.kt
  93. 0 0
      shared/src/commonMain/kotlin/org/mjdev/desktop/components/card/CardContent.kt
  94. 0 0
      shared/src/commonMain/kotlin/org/mjdev/desktop/components/card/ClassicCard.kt
  95. 0 0
      shared/src/commonMain/kotlin/org/mjdev/desktop/components/card/CompactCard.kt
  96. 0 0
      shared/src/commonMain/kotlin/org/mjdev/desktop/components/card/FocusableCard.kt
  97. 0 0
      shared/src/commonMain/kotlin/org/mjdev/desktop/components/card/ItemCard.kt
  98. 0 0
      shared/src/commonMain/kotlin/org/mjdev/desktop/components/card/PhotoCard.kt
  99. 0 0
      shared/src/commonMain/kotlin/org/mjdev/desktop/components/card/WideClassicCard.kt
  100. 0 0
      shared/src/commonMain/kotlin/org/mjdev/desktop/components/card/base/CardBorder.kt

+ 2 - 1
.claude/settings.local.json

@@ -32,7 +32,8 @@
       "Bash(git checkout *)",
       "Bash(cd *)",
       "Bash(./gradlew buildAll -PdepCheck=false --console=plain)",
-      "Bash(awk '{printf \"  %-34s %s\\\\n\",$NF,$5}')"
+      "Bash(awk '{printf \"  %-34s %s\\\\n\",$NF,$5}')",
+      "WebFetch(domain:blog.jetbrains.com)"
     ]
   }
 }

+ 1 - 1
.run/android.run.xml

@@ -1,6 +1,6 @@
 <component name="ProjectRunConfigurationManager">
   <configuration default="false" name="android" type="AndroidRunConfigurationType" factoryName="Android App" activateToolWindowBeforeRun="false">
-    <module name="mjdev-desktop.composeApp" />
+    <module name="mjdev-desktop.androidApp" />
     <option name="ANDROID_RUN_CONFIGURATION_SCHEMA_VERSION" value="1" />
     <option name="DEPLOY" value="true" />
     <option name="DEPLOY_APK_FROM_BUNDLE" value="false" />

+ 2 - 2
.run/desktop.run.xml

@@ -2,7 +2,7 @@
   <configuration default="false" name="desktop" type="GradleRunConfiguration" factoryName="Gradle">
     <ExternalSystemSettings>
       <option name="executionName" />
-      <option name="externalProjectPath" value="$PROJECT_DIR$/composeApp" />
+      <option name="externalProjectPath" value="$PROJECT_DIR$/desktopApp" />
       <option name="externalSystemIdString" value="GRADLE" />
       <option name="scriptParameters" value="-DmainClass=org.mjdev.desktop.main.MainKt --quiet" />
       <option name="taskDescriptions">
@@ -10,7 +10,7 @@
       </option>
       <option name="taskNames">
         <list>
-          <option value="desktopRun" />
+          <option value="run" />
         </list>
       </option>
       <option name="vmOptions" />

+ 69 - 0
androidApp/androidApp.gradle.kts

@@ -0,0 +1,69 @@
+plugins {
+    alias(libs.plugins.android.application)
+    alias(libs.plugins.compose)
+    alias(libs.plugins.compose.compiler)
+}
+
+android {
+    namespace = "org.mjdev.desktop"
+    compileSdk = libs.versions.android.compile.sdk.get().toInt()
+    // shared resources packaged into the APK (lost when composeApp was split):
+    //  - assets  <- commonMain/resources (icon fonts, translations, widgets, …)
+    //  - resources <- commonMain/composeResources
+    sourceSets["main"].assets.srcDirs(rootDir.resolve("shared/src/commonMain/resources"))
+    sourceSets["main"].resources.srcDirs(rootDir.resolve("shared/src/commonMain/composeResources"))
+    defaultConfig {
+        applicationId = "org.mjdev.desktop"
+        minSdk = libs.versions.android.min.sdk.get().toInt()
+        targetSdk = libs.versions.android.target.sdk.get().toInt()
+        versionCode = libs.versions.app.pkg.version.get().replace(".", "").toInt()
+        versionName = libs.versions.app.pkg.version.get()
+        resValue("string", "app_name", libs.versions.app.name.get())
+    }
+    packaging {
+        resources {
+            excludes += "META-INF/{AL2.0,LGPL2.1}"
+            excludes += "META-INF/INDEX.LIST"
+            excludes += "META-INF/DEPENDENCIES"
+            excludes += "META-INF/io.netty.versions.properties"
+            pickFirsts += "META-INF/native-image/**"
+        }
+    }
+    buildTypes {
+        getByName("release") {
+            isDebuggable = true
+            isJniDebuggable = true
+            isMinifyEnabled = false
+            isShrinkResources = false
+            isPseudoLocalesEnabled = true
+        }
+    }
+    compileOptions {
+        sourceCompatibility = JavaVersion.VERSION_17
+        targetCompatibility = JavaVersion.VERSION_17
+    }
+    buildFeatures {
+        compose = true
+        buildConfig = true
+    }
+}
+
+dependencies {
+    implementation(projects.shared)
+    implementation(compose.runtime)
+    implementation(compose.foundation)
+    implementation(compose.material3)
+    implementation(compose.materialIconsExtended)
+    implementation(compose.ui)
+    implementation(compose.components.resources)
+    implementation(compose.components.uiToolingPreview)
+    implementation(libs.androidx.activity.compose)
+    implementation(libs.androidx.core.ktx)
+    implementation(libs.androidx.lifecycle.viewmodel)
+    implementation(libs.androidx.lifecycle.runtime.compose)
+    implementation(libs.androidx.core.splashscreen)
+    implementation(libs.accompanist.permissions)
+    implementation(libs.coil.compose)
+    implementation(libs.napier)
+    debugImplementation(libs.androidx.ui.tooling)
+}

+ 0 - 0
composeApp/src/androidMain/AndroidManifest.xml → androidApp/src/main/AndroidManifest.xml


+ 0 - 0
composeApp/src/androidMain/kotlin/org/mjdev/desktop/activity/MainActivity.kt → androidApp/src/main/kotlin/org/mjdev/desktop/activity/MainActivity.kt


+ 0 - 0
composeApp/src/androidMain/kotlin/org/mjdev/desktop/app/App.kt → androidApp/src/main/kotlin/org/mjdev/desktop/app/App.kt


+ 0 - 0
composeApp/src/androidMain/kotlin/org/mjdev/desktop/extensions/ComponentActivity.kt → androidApp/src/main/kotlin/org/mjdev/desktop/extensions/ComponentActivity.kt


+ 0 - 0
composeApp/src/androidMain/kotlin/org/mjdev/desktop/main/MainView.kt → androidApp/src/main/kotlin/org/mjdev/desktop/main/MainView.kt


+ 0 - 0
composeApp/src/androidMain/res/mipmap-anydpi-v26/ic_banner.xml → androidApp/src/main/res/mipmap-anydpi-v26/ic_banner.xml


+ 0 - 0
composeApp/src/androidMain/res/mipmap-hdpi/ic_launcher.webp → androidApp/src/main/res/mipmap-hdpi/ic_launcher.webp


+ 0 - 0
composeApp/src/androidMain/res/mipmap-hdpi/ic_launcher_foreground.webp → androidApp/src/main/res/mipmap-hdpi/ic_launcher_foreground.webp


+ 0 - 0
composeApp/src/androidMain/res/mipmap-hdpi/ic_launcher_round.webp → androidApp/src/main/res/mipmap-hdpi/ic_launcher_round.webp


+ 0 - 0
composeApp/src/androidMain/res/mipmap-mdpi/ic_launcher.webp → androidApp/src/main/res/mipmap-mdpi/ic_launcher.webp


+ 0 - 0
composeApp/src/androidMain/res/mipmap-mdpi/ic_launcher_foreground.webp → androidApp/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp


+ 0 - 0
composeApp/src/androidMain/res/mipmap-mdpi/ic_launcher_round.webp → androidApp/src/main/res/mipmap-mdpi/ic_launcher_round.webp


+ 0 - 0
composeApp/src/androidMain/res/mipmap-xhdpi/ic_banner.png → androidApp/src/main/res/mipmap-xhdpi/ic_banner.png


+ 0 - 0
composeApp/src/androidMain/res/mipmap-xhdpi/ic_banner_foreground.png → androidApp/src/main/res/mipmap-xhdpi/ic_banner_foreground.png


+ 0 - 0
composeApp/src/androidMain/res/mipmap-xhdpi/ic_launcher.webp → androidApp/src/main/res/mipmap-xhdpi/ic_launcher.webp


+ 0 - 0
composeApp/src/androidMain/res/mipmap-xhdpi/ic_launcher_foreground.webp → androidApp/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp


+ 0 - 0
composeApp/src/androidMain/res/mipmap-xhdpi/ic_launcher_round.webp → androidApp/src/main/res/mipmap-xhdpi/ic_launcher_round.webp


+ 0 - 0
composeApp/src/androidMain/res/mipmap-xxhdpi/ic_launcher.webp → androidApp/src/main/res/mipmap-xxhdpi/ic_launcher.webp


+ 0 - 0
composeApp/src/androidMain/res/mipmap-xxhdpi/ic_launcher_foreground.webp → androidApp/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp


+ 0 - 0
composeApp/src/androidMain/res/mipmap-xxhdpi/ic_launcher_round.webp → androidApp/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp


+ 0 - 0
composeApp/src/androidMain/res/mipmap-xxxhdpi/ic_launcher.webp → androidApp/src/main/res/mipmap-xxxhdpi/ic_launcher.webp


+ 0 - 0
composeApp/src/androidMain/res/mipmap-xxxhdpi/ic_launcher_foreground.webp → androidApp/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp


+ 0 - 0
composeApp/src/androidMain/res/mipmap-xxxhdpi/ic_launcher_round.webp → androidApp/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp


+ 0 - 0
composeApp/src/androidMain/res/values/ic_banner_background.xml → androidApp/src/main/res/values/ic_banner_background.xml


+ 0 - 0
composeApp/src/androidMain/res/values/splash.xml → androidApp/src/main/res/values/splash.xml


+ 0 - 0
composeApp/src/androidMain/res/xml/network_security_config.xml → androidApp/src/main/res/xml/network_security_config.xml


+ 7 - 7
build.gradle.kts

@@ -86,8 +86,8 @@ val postBuildCodeCheck by tasks.registering {
     description = "Auto-formats code (ktlintFormat) and runs the gated dependency-update report into /reports"
     // Auto-format on build. Safe because .editorconfig disables no-unused-imports — the one
     // rule that stripped receiver/extension-member imports and broke compilation.
-    dependsOn(":composeApp:ktlintFormat")
-    if (depCheckEnabled) dependsOn(":composeApp:dependencyUpdates")
+    dependsOn(":shared:ktlintFormat")
+    if (depCheckEnabled) dependsOn(":shared:dependencyUpdates")
     finalizedBy(collectKtlintReports)
 }
 
@@ -152,7 +152,7 @@ val ensureAppImageTool = tasks.register<EnsureAppImageToolTask>("ensureAppImageT
 val packageAppImageFile = tasks.register<PackageAppImageTask>("packageAppImageFile") {
     group = "mjdev"
     description = "Builds a single-file .AppImage from the jpackage app-image (skips if appimagetool unavailable)."
-    dependsOn(ensureAppImageTool, ":composeApp:packageReleaseAppImage")
+    dependsOn(ensureAppImageTool, ":desktopApp:packageReleaseAppImage")
     appName.set(appNameV)
     appImagePath.set(pkgDirV.resolve("app/$appNameV").absolutePath)
     outputPath.set(pkgDirV.resolve("appimage/$appNameV.AppImage").absolutePath)
@@ -165,8 +165,8 @@ val collectReleases = tasks.register<Copy>("collectReleases") {
     group = "mjdev"
     description = "Copies the built distributables into releases/ (versioned filenames)."
     dependsOn(
-        ":composeApp:packageReleaseDistributionForCurrentOS",
-        ":composeApp:assembleRelease",
+        ":desktopApp:packageReleaseDistributionForCurrentOS",
+        ":androidApp:assembleRelease",
         packageAppImageFile,
     )
     // local copies so the rename closures capture plain Strings (configuration-cache safe)
@@ -176,7 +176,7 @@ val collectReleases = tasks.register<Copy>("collectReleases") {
     from(pkgDirV.resolve("rpm")) { include("*.rpm"); rename { "$base.rpm" } }
     from(pkgDirV.resolve("exe")) { include("*.exe"); rename { "$base.exe" } } // present only on a Windows host
     from(pkgDirV.resolve("appimage")) { include("*.AppImage"); rename { "$base.AppImage" } }
-    from(rootDir.resolve("composeApp/build/outputs/apk/release")) {
+    from(rootDir.resolve("androidApp/build/outputs/apk/release")) {
         include("*.apk"); rename { "$base.apk" }
     }
 }
@@ -189,7 +189,7 @@ val buildAll = tasks.register("buildAll") {
 
 // Attach iOS framework build only when an iOS target actually exists in composeApp
 // (it never does on a Linux/Windows host — Kotlin/Native iOS requires macOS + Xcode).
-project(":composeApp").afterEvaluate {
+project(":shared").afterEvaluate {
     val iosTask = tasks.names.firstOrNull {
         it.startsWith("linkReleaseFrameworkIos") || it == "embedAndSignAppleFrameworkForXcode"
     }

+ 0 - 6
buildSrc/build.gradle.kts

@@ -45,12 +45,6 @@ dependencies {
 
 gradlePlugin {
     plugins {
-        register("MultiPlatformPlugin") {
-            id = "MultiPlatformPlugin"
-            displayName = "MultiPlatformPlugin"
-            description = "Common library plugin to handle all stuffs needed."
-            implementationClass = "MultiPlatformPlugin"
-        }
         register("AiAgentPlugin") {
             id = "AiAgentPlugin"
             displayName = "AiAgentPlugin"

+ 56 - 0
desktopApp/desktopApp.gradle.kts

@@ -0,0 +1,56 @@
+import org.jetbrains.compose.desktop.application.dsl.TargetFormat
+
+plugins {
+    alias(libs.plugins.kotlin.jvm)
+    alias(libs.plugins.compose)
+    alias(libs.plugins.compose.compiler)
+}
+
+kotlin {
+    jvmToolchain(libs.versions.java.language.version.get().toInt())
+}
+
+dependencies {
+    implementation(projects.shared)
+    implementation(compose.desktop.currentOs)
+}
+
+// IDE run-config compatibility: the old KMP module exposed `desktopRun`; a plain JVM
+// Compose Desktop module exposes `run`. Keep `desktopRun` working as an alias.
+tasks.register("desktopRun") {
+    group = "compose desktop"
+    description = "Alias for :desktopApp:run (IDE run configuration compatibility)."
+    dependsOn("run")
+}
+
+compose.desktop {
+    application {
+        jvmArgs("-Dprism.order=sw")
+        mainClass = "org.mjdev.desktop.main.MainKt"
+        nativeDistributions {
+            packageName = libs.versions.app.name.get()
+            packageVersion = libs.versions.app.pkg.version.get()
+            description = libs.versions.app.description.get()
+            copyright = libs.versions.app.copyright.get()
+            outputBaseDir.set(rootProject.rootDir.resolve("packages"))
+            linux {
+                appCategory = libs.versions.app.category.get()
+                debMaintainer = libs.versions.app.maintainer.get()
+                menuGroup = libs.versions.app.menu.group.get()
+                vendor = libs.versions.app.vendor.get()
+            }
+            targetFormats(
+                TargetFormat.Deb,
+                TargetFormat.Exe, // Windows installer — only built on a Windows host
+                TargetFormat.AppImage,
+                TargetFormat.Rpm,
+            )
+            buildTypes.release.proguard {
+                configurationFiles.from("desktopApp.pro")
+                // optional transitive deps (netty -> log4j2) defeat the optimizer's class
+                // hierarchy analysis (IncompleteClassHierarchyException); shrink+obfuscate stay on
+                optimize.set(false)
+            }
+        }
+    }
+}

+ 0 - 0
composeApp/composeApp.pro → desktopApp/desktopApp.pro


+ 0 - 0
composeApp/src/desktopMain/kotlin/org/mjdev/desktop/main/Main.kt → desktopApp/src/main/kotlin/org/mjdev/desktop/main/Main.kt


+ 3 - 1
gradle.properties

@@ -47,6 +47,8 @@ android.uniquePackageNames=false
 android.dependency.useConstraints=true
 android.r8.strictFullModeForKeepRules=false
 android.r8.optimizedResourceShrinking=false
-android.builtInKotlin=false
+# android.builtInKotlin must be enabled (AGP 9 default) so androidApp's own Kotlin
+# (App, MainActivity) compiles — with it false the entry classes were missing from the APK.
+# android.builtInKotlin=false
 android.newDsl=false
 ####################################################################################################

+ 3 - 2
gradle/libs.versions.toml

@@ -17,7 +17,7 @@ android-min-sdk = "26"
 android-target-sdk = "36"
 ### custom versions ################################################################################
 vlc-version = "3.0.21-2"
-vlc-dir = "composeApp/src/commonMain/resources/vlc/"
+vlc-dir = "shared/src/commonMain/resources/vlc/"
 ### lib versions ###################################################################################
 gradle = "9.0.1"
 #gradle-kotlinter = "4.3.0"
@@ -26,7 +26,7 @@ androidx-lifecycle = "2.9.1"
 androidx-ui-tooling = "1.8.3"
 app-icon = "1.2.6"
 coil = "3.2.0"
-compose-plugin = "1.8.2"
+compose-plugin = "1.10.0"
 core-splash-screen = "1.0.1"
 generative-ai = "0.9.0-1.1.0"
 gettext-lib = "1.11.0"
@@ -178,6 +178,7 @@ cryptography-provider-optimal = { module = "dev.whyoleg.cryptography:cryptograph
 ####################################################################################################
 android-application = { id = "com.android.application", version.ref = "gradle" }
 android-library = { id = "com.android.library", version.ref = "gradle" }
+android-kotlin-multiplatform-library = { id = "com.android.kotlin.multiplatform.library", version.ref = "gradle" }
 app-icon-generator = { id = "io.github.qamarelsafadi.kmp.app.icon.generator", version.ref = "app-icon" }
 compose = { id = "org.jetbrains.compose", version.ref = "compose-plugin" }
 compose-compiler = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" }

+ 3 - 1
settings.gradle.kts

@@ -78,7 +78,9 @@ dependencyResolutionManagement {
 //</editor-fold>------------------------------------------------------------------------------------
 
 //<editor-fold desc="includes">---------------------------------------------------------------------
-include(":composeApp")
+include(":shared")
+include(":androidApp")
+include(":desktopApp")
 //</editor-fold>------------------------------------------------------------------------------------
 
 //<editor-fold desc="rename gradle build files">----------------------------------------------------

+ 14 - 147
composeApp/composeApp.gradle.kts → shared/shared.gradle.kts

@@ -24,7 +24,7 @@ import org.jetbrains.kotlin.gradle.targets.jvm.KotlinJvmTarget
 
 plugins {
     alias(libs.plugins.kotlin.multiplatform)
-    alias(libs.plugins.android.application)
+    id("com.android.kotlin.multiplatform.library")
     alias(libs.plugins.compose)
     alias(libs.plugins.compose.compiler)
     alias(libs.plugins.vlc.setup)
@@ -101,7 +101,17 @@ targets {
     desktopTarget {
     }
 
-    androidTarget {
+    androidLibrary {
+        namespace = "org.mjdev.desktop.shared"
+        compileSdk =
+            libs.versions.android.compile.sdk
+                .get()
+                .toInt()
+        minSdk =
+            libs.versions.android.min.sdk
+                .get()
+                .toInt()
+        androidResources { enable = true }
         compilerOptions {
             jvmTarget.set(JvmTarget.JVM_17)
         }
@@ -322,150 +332,7 @@ kotlin {
 
 // <editor-fold desc="platforms">--------------------------------------------------------------------
 
-// android app config
-android {
-    namespace = "org.mjdev.desktop"
-    compileSdk =
-        libs.versions.android.compile.sdk
-            .get()
-            .toInt()
-    sourceSets["main"].manifest.srcFile("src/androidMain/AndroidManifest.xml")
-    sourceSets["main"].res.srcDirs("src/androidMain/res")
-    sourceSets["main"].resources.srcDirs("src/commonMain/composeResources")
-    sourceSets["main"].assets.srcDirs("src/commonMain/resources")
-    defaultConfig {
-        applicationId = "org.mjdev.desktop"
-        minSdk =
-            libs.versions.android.min.sdk
-                .get()
-                .toInt()
-        targetSdk =
-            libs.versions.android.target.sdk
-                .get()
-                .toInt()
-        versionCode =
-            libs.versions.app.pkg.version
-                .get()
-                .replace(".", "")
-                .toInt()
-        versionName =
-            libs.versions.app.pkg.version
-                .get()
-        resValue(
-            "string",
-            "app_name",
-            libs.versions.app.name
-                .get(),
-        )
-    }
-    packaging {
-        resources {
-            excludes += "META-INF/{AL2.0,LGPL2.1}"
-            excludes += "META-INF/INDEX.LIST"
-            excludes += "META-INF/DEPENDENCIES"
-            excludes += "META-INF/io.netty.versions.properties"
-            pickFirsts += "META-INF/native-image/**"
-        }
-    }
-    buildTypes {
-        getByName("release") {
-            isDebuggable = true
-            isJniDebuggable = true
-            isMinifyEnabled = false
-            isShrinkResources = false
-//            isRenderscriptDebuggable = true
-            isPseudoLocalesEnabled = true
-        }
-    }
-    compileOptions {
-        sourceCompatibility = JavaVersion.VERSION_17
-        targetCompatibility = JavaVersion.VERSION_17
-    }
-    buildFeatures {
-        compose = true
-        buildConfig = true
-    }
-    dependencies {
-        debugImplementation(libs.androidx.ui.tooling)
-    }
-}
-
-// desktop app config
-desktop {
-    group =
-        libs.versions.app.pkg.name
-            .get()
-    version =
-        libs.versions.app.pkg.version
-            .get()
-    application {
-        jvmArgs("-Dprism.order=sw")
-        mainClass = "org.mjdev.desktop.main.MainKt"
-        nativeDistributions {
-            packageName =
-                libs.versions.app.name
-                    .get()
-            packageVersion =
-                libs.versions.app.pkg.version
-                    .get()
-            description =
-                libs.versions.app.description
-                    .get()
-            copyright =
-                libs.versions.app.copyright
-                    .get()
-            outputBaseDir.set(project.rootDir.resolve("packages"))
-//                macOS {
-//                    iconFile.set(project.rootDir.resolve("icons").resolve("icon.icns"))
-//                }
-//                windows {
-//                    iconFile.set(project.rootDir.resolve("icons").resolve("icon.ico"))
-//                    exePackageVersion = "1.0.0"
-//                    msiPackageVersion = "1.0.0"
-//                }
-            linux {
-//                    iconFile.set(
-//                        project.rootDir
-//                            .resolve("composeApp")
-//                            .resolve("src")
-//                            .resolve("commonMain")
-//                            .resolve("resources")
-//                            .resolve("drawable")
-//                            .resolve("icon.png")
-//                    )
-//                    licenseFile.set(project.rootDir.resolve("LICENSE.txt"))
-                appCategory =
-                    libs.versions.app.category
-                        .get()
-                debMaintainer =
-                    libs.versions.app.maintainer
-                        .get()
-                menuGroup =
-                    libs.versions.app.menu.group
-                        .get()
-                vendor =
-                    libs.versions.app.vendor
-                        .get()
-            }
-            targetFormats(
-//                TargetFormat.Dmg,
-//                TargetFormat.Msi,
-                TargetFormat.Deb,
-                TargetFormat.Exe, // Windows installer — only built when running on a Windows host
-                TargetFormat.AppImage,
-//                TargetFormat.Pkg,
-                TargetFormat.Rpm,
-            )
-            buildTypes.release.proguard {
-                configurationFiles.from("composeApp.pro")
-                // The optimization pass can't resolve the class hierarchy of optional
-                // transitive deps (e.g. netty's Log4J2Logger -> log4j2, absent at runtime),
-                // throwing IncompleteClassHierarchyException. Shrinking + obfuscation stay on.
-                optimize.set(false)
-            }
-//            appResourcesRootDir.set(project.rootDir.resolve("resources"))
-        }
-    }
-}
+// android app config -> moved to :androidApp module
+// desktop app config -> moved to :desktopApp module
 
 // </editor-fold>------------------------------------------------------------------------------------

+ 0 - 0
composeApp/src/androidMain/kotlin/org/mjdev/desktop/components/video/MediaPlayer.kt → shared/src/androidMain/kotlin/org/mjdev/desktop/components/video/MediaPlayer.kt


+ 0 - 0
composeApp/src/androidMain/kotlin/org/mjdev/desktop/components/video/VideoPlayer.kt → shared/src/androidMain/kotlin/org/mjdev/desktop/components/video/VideoPlayer.kt


+ 0 - 0
composeApp/src/androidMain/kotlin/org/mjdev/desktop/components/video/VideoPlayerState.kt → shared/src/androidMain/kotlin/org/mjdev/desktop/components/video/VideoPlayerState.kt


+ 0 - 0
composeApp/src/androidMain/kotlin/org/mjdev/desktop/context/DesktopContext.kt → shared/src/androidMain/kotlin/org/mjdev/desktop/context/DesktopContext.kt


+ 0 - 0
composeApp/src/androidMain/kotlin/org/mjdev/desktop/context/LocalDesktopContext.android.kt → shared/src/androidMain/kotlin/org/mjdev/desktop/context/LocalDesktopContext.android.kt


+ 0 - 0
composeApp/src/androidMain/kotlin/org/mjdev/desktop/data/App.kt → shared/src/androidMain/kotlin/org/mjdev/desktop/data/App.kt


+ 0 - 0
composeApp/src/androidMain/kotlin/org/mjdev/desktop/data/Theme.kt → shared/src/androidMain/kotlin/org/mjdev/desktop/data/Theme.kt


+ 0 - 0
composeApp/src/androidMain/kotlin/org/mjdev/desktop/data/User.kt → shared/src/androidMain/kotlin/org/mjdev/desktop/data/User.kt


+ 0 - 0
composeApp/src/androidMain/kotlin/org/mjdev/desktop/data/UserDirs.kt → shared/src/androidMain/kotlin/org/mjdev/desktop/data/UserDirs.kt


+ 0 - 0
composeApp/src/androidMain/kotlin/org/mjdev/desktop/extensions/ImageBitmapExt.kt → shared/src/androidMain/kotlin/org/mjdev/desktop/extensions/ImageBitmapExt.kt


+ 0 - 0
composeApp/src/androidMain/kotlin/org/mjdev/desktop/helpers/DecoderAndroid.kt → shared/src/androidMain/kotlin/org/mjdev/desktop/helpers/DecoderAndroid.kt


+ 0 - 0
composeApp/src/androidMain/kotlin/org/mjdev/desktop/helpers/WakeLockHelper.kt → shared/src/androidMain/kotlin/org/mjdev/desktop/helpers/WakeLockHelper.kt


+ 0 - 0
composeApp/src/androidMain/kotlin/org/mjdev/desktop/helpers/crash/CrashHandler.kt → shared/src/androidMain/kotlin/org/mjdev/desktop/helpers/crash/CrashHandler.kt


+ 0 - 0
composeApp/src/androidMain/kotlin/org/mjdev/desktop/helpers/font/CodePointsFile.kt → shared/src/androidMain/kotlin/org/mjdev/desktop/helpers/font/CodePointsFile.kt


+ 0 - 0
composeApp/src/androidMain/kotlin/org/mjdev/desktop/helpers/font/FontDescriptor.kt → shared/src/androidMain/kotlin/org/mjdev/desktop/helpers/font/FontDescriptor.kt


+ 0 - 0
composeApp/src/androidMain/kotlin/org/mjdev/desktop/helpers/font/MaterialIconFont.android.kt → shared/src/androidMain/kotlin/org/mjdev/desktop/helpers/font/MaterialIconFont.android.kt


+ 0 - 0
composeApp/src/androidMain/kotlin/org/mjdev/desktop/helpers/permission/PermissonManager.kt → shared/src/androidMain/kotlin/org/mjdev/desktop/helpers/permission/PermissonManager.kt


+ 0 - 0
composeApp/src/androidMain/kotlin/org/mjdev/desktop/helpers/persistence/StorageProvider.kt → shared/src/androidMain/kotlin/org/mjdev/desktop/helpers/persistence/StorageProvider.kt


+ 0 - 0
composeApp/src/androidMain/kotlin/org/mjdev/desktop/helpers/streams/ResourceStream.android.kt → shared/src/androidMain/kotlin/org/mjdev/desktop/helpers/streams/ResourceStream.android.kt


+ 0 - 0
composeApp/src/androidMain/kotlin/org/mjdev/desktop/helpers/system/meminfo/MemInfo.android.kt → shared/src/androidMain/kotlin/org/mjdev/desktop/helpers/system/meminfo/MemInfo.android.kt


+ 0 - 0
composeApp/src/androidMain/kotlin/org/mjdev/desktop/helpers/system/meminfo/MemInfoAndroid.kt → shared/src/androidMain/kotlin/org/mjdev/desktop/helpers/system/meminfo/MemInfoAndroid.kt


+ 0 - 0
composeApp/src/androidMain/kotlin/org/mjdev/desktop/managers/ai/tts/TTSPluginAndroid.kt → shared/src/androidMain/kotlin/org/mjdev/desktop/managers/ai/tts/TTSPluginAndroid.kt


+ 0 - 0
composeApp/src/androidMain/kotlin/org/mjdev/desktop/managers/apps/AppsManager.kt → shared/src/androidMain/kotlin/org/mjdev/desktop/managers/apps/AppsManager.kt


+ 0 - 0
composeApp/src/androidMain/kotlin/org/mjdev/desktop/managers/connectivity/ConnectivityManager.kt → shared/src/androidMain/kotlin/org/mjdev/desktop/managers/connectivity/ConnectivityManager.kt


+ 0 - 0
composeApp/src/androidMain/kotlin/org/mjdev/desktop/managers/connectivity/ConnectivityManagerStub.kt → shared/src/androidMain/kotlin/org/mjdev/desktop/managers/connectivity/ConnectivityManagerStub.kt


+ 0 - 0
composeApp/src/androidMain/kotlin/org/mjdev/desktop/managers/keys/KeysManager.kt → shared/src/androidMain/kotlin/org/mjdev/desktop/managers/keys/KeysManager.kt


+ 0 - 0
composeApp/src/androidMain/kotlin/org/mjdev/desktop/managers/os/OSManager.kt → shared/src/androidMain/kotlin/org/mjdev/desktop/managers/os/OSManager.kt


+ 0 - 0
composeApp/src/androidMain/kotlin/org/mjdev/desktop/managers/processes/ProcessManager.kt → shared/src/androidMain/kotlin/org/mjdev/desktop/managers/processes/ProcessManager.kt


+ 0 - 0
composeApp/src/androidMain/kotlin/org/mjdev/desktop/managers/theme/ThemeManager.kt → shared/src/androidMain/kotlin/org/mjdev/desktop/managers/theme/ThemeManager.kt


+ 0 - 0
composeApp/src/androidMain/kotlin/org/mjdev/desktop/managers/theme/base/ThemeManagerStub.kt → shared/src/androidMain/kotlin/org/mjdev/desktop/managers/theme/base/ThemeManagerStub.kt


+ 0 - 0
composeApp/src/androidMain/kotlin/org/mjdev/desktop/system/Filesystem.android.kt → shared/src/androidMain/kotlin/org/mjdev/desktop/system/Filesystem.android.kt


+ 0 - 0
composeApp/src/androidMain/kotlin/org/mjdev/desktop/system/Platform.android.kt → shared/src/androidMain/kotlin/org/mjdev/desktop/system/Platform.android.kt


+ 0 - 0
composeApp/src/androidMain/kotlin/org/mjdev/desktop/wayland/WaylandDisplay.android.kt → shared/src/androidMain/kotlin/org/mjdev/desktop/wayland/WaylandDisplay.android.kt


+ 0 - 0
composeApp/src/androidMain/kotlin/org/mjdev/desktop/windows/ChromeWindow.kt → shared/src/androidMain/kotlin/org/mjdev/desktop/windows/ChromeWindow.kt


+ 0 - 0
composeApp/src/commonMain/composeResources/drawable/blur4.webp → shared/src/commonMain/composeResources/drawable/blur4.webp


+ 0 - 0
composeApp/src/commonMain/composeResources/drawable/icon.png → shared/src/commonMain/composeResources/drawable/icon.png


+ 0 - 0
composeApp/src/commonMain/composeResources/drawable/icon.svg → shared/src/commonMain/composeResources/drawable/icon.svg


+ 0 - 0
composeApp/src/commonMain/composeResources/values/strings.xml → shared/src/commonMain/composeResources/values/strings.xml


+ 0 - 0
composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/adb/AdbScreenMirror.kt → shared/src/commonMain/kotlin/org/mjdev/desktop/components/adb/AdbScreenMirror.kt


+ 0 - 0
composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/appbar/AppBar.kt → shared/src/commonMain/kotlin/org/mjdev/desktop/components/appbar/AppBar.kt


+ 0 - 0
composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/appsmenu/AppsMenu.kt → shared/src/commonMain/kotlin/org/mjdev/desktop/components/appsmenu/AppsMenu.kt


+ 0 - 0
composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/appsmenu/components/AppsBottomBar.kt → shared/src/commonMain/kotlin/org/mjdev/desktop/components/appsmenu/components/AppsBottomBar.kt


+ 0 - 0
composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/appsmenu/components/AppsList.kt → shared/src/commonMain/kotlin/org/mjdev/desktop/components/appsmenu/components/AppsList.kt


+ 0 - 0
composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/appsmenu/components/AppsMenuActions.kt → shared/src/commonMain/kotlin/org/mjdev/desktop/components/appsmenu/components/AppsMenuActions.kt


+ 0 - 0
composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/appsmenu/components/AppsMenuApp.kt → shared/src/commonMain/kotlin/org/mjdev/desktop/components/appsmenu/components/AppsMenuApp.kt


+ 0 - 0
composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/appsmenu/components/AppsMenuCategory.kt → shared/src/commonMain/kotlin/org/mjdev/desktop/components/appsmenu/components/AppsMenuCategory.kt


+ 0 - 0
composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/background/BackgroundImage.kt → shared/src/commonMain/kotlin/org/mjdev/desktop/components/background/BackgroundImage.kt


+ 0 - 0
composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/blur/BlurPanel.kt → shared/src/commonMain/kotlin/org/mjdev/desktop/components/blur/BlurPanel.kt


+ 0 - 0
composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/blur/BlurPanelHaze.kt → shared/src/commonMain/kotlin/org/mjdev/desktop/components/blur/BlurPanelHaze.kt


+ 0 - 0
composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/button/ButtonPrimary.kt → shared/src/commonMain/kotlin/org/mjdev/desktop/components/button/ButtonPrimary.kt


+ 0 - 0
composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/button/ButtonSecondary.kt → shared/src/commonMain/kotlin/org/mjdev/desktop/components/button/ButtonSecondary.kt


+ 0 - 0
composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/button/TransparentButton.kt → shared/src/commonMain/kotlin/org/mjdev/desktop/components/button/TransparentButton.kt


+ 0 - 0
composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/card/Card.kt → shared/src/commonMain/kotlin/org/mjdev/desktop/components/card/Card.kt


+ 0 - 0
composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/card/CardContent.kt → shared/src/commonMain/kotlin/org/mjdev/desktop/components/card/CardContent.kt


+ 0 - 0
composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/card/ClassicCard.kt → shared/src/commonMain/kotlin/org/mjdev/desktop/components/card/ClassicCard.kt


+ 0 - 0
composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/card/CompactCard.kt → shared/src/commonMain/kotlin/org/mjdev/desktop/components/card/CompactCard.kt


+ 0 - 0
composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/card/FocusableCard.kt → shared/src/commonMain/kotlin/org/mjdev/desktop/components/card/FocusableCard.kt


+ 0 - 0
composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/card/ItemCard.kt → shared/src/commonMain/kotlin/org/mjdev/desktop/components/card/ItemCard.kt


+ 0 - 0
composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/card/PhotoCard.kt → shared/src/commonMain/kotlin/org/mjdev/desktop/components/card/PhotoCard.kt


+ 0 - 0
composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/card/WideClassicCard.kt → shared/src/commonMain/kotlin/org/mjdev/desktop/components/card/WideClassicCard.kt


+ 0 - 0
composeApp/src/commonMain/kotlin/org/mjdev/desktop/components/card/base/CardBorder.kt → shared/src/commonMain/kotlin/org/mjdev/desktop/components/card/base/CardBorder.kt


Algunos archivos no se mostraron porque demasiados archivos cambiaron en este cambio