Skip to content

Commit 7a61954

Browse files
Bundle Jetbrains Runtime with desktop app,
Correct format for Windows shortcut, Nicer extension installation snack bar, Nicer ui on desktop, Fixed android build, Fixed crash once opening episode, Fixed state observation in the HomePage
1 parent 0d86779 commit 7a61954

File tree

27 files changed

+933
-938
lines changed

27 files changed

+933
-938
lines changed
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<component name="ProjectRunConfigurationManager">
2-
<configuration default="false" name="Android App" type="AndroidRunConfigurationType" factoryName="Android App" activateToolWindowBeforeRun="false">
2+
<configuration default="false" name="Run Android" type="AndroidRunConfigurationType" factoryName="Android App" activateToolWindowBeforeRun="false">
33
<module name="Awery.app" />
44
<option name="ANDROID_RUN_CONFIGURATION_SCHEMA_VERSION" value="1" />
55
<option name="DEPLOY" value="true" />
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<component name="ProjectRunConfigurationManager">
2-
<configuration default="false" name="Desktop App" type="GradleRunConfiguration" factoryName="Gradle">
2+
<configuration default="false" name="Run Desktop" type="GradleRunConfiguration" factoryName="Gradle">
33
<ExternalSystemSettings>
44
<option name="executionName" />
55
<option name="externalProjectPath" value="$PROJECT_DIR$" />

app/build.gradle.kts

Lines changed: 123 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import android.databinding.tool.ext.joinToCamelCase
2+
import com.android.build.gradle.internal.tasks.factory.dependsOn
13
import org.jetbrains.compose.desktop.application.dsl.TargetFormat
24
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
35

@@ -21,30 +23,6 @@ fun getLocales(): Collection<String> {
2123
}
2224
}
2325

24-
val generateAndroidLocaleConfig by tasks.registering {
25-
val outputDir = layout.projectDirectory.dir("src/androidMain/res/xml")
26-
val outputFile = outputDir.file("awery_generated_locales_config.xml")
27-
val locales = getLocales()
28-
29-
// For task caching
30-
inputs.property("locales", locales)
31-
outputs.file(outputFile)
32-
33-
doLast {
34-
outputDir.asFile.mkdirs()
35-
outputFile.asFile.writeText(buildString {
36-
appendLine("""<?xml version="1.0" encoding="utf-8"?>""")
37-
appendLine("""<locale-config xmlns:android="http://schemas.android.com/apk/res/android">""")
38-
39-
for(locale in locales) {
40-
appendLine(""" <locale android:name="$locale" />""")
41-
}
42-
43-
appendLine("""</locale-config>""")
44-
})
45-
}
46-
}
47-
4826
kotlin {
4927
jvm("desktop")
5028

@@ -92,10 +70,9 @@ kotlin {
9270
val desktopMain by getting {
9371
dependencies {
9472
implementation(composeLibs.navigation.jetpack)
73+
implementation(composeLibs.jewel.standalone)
74+
implementation(composeLibs.jewel.window)
9575
implementation(libs.kotlinx.coroutines.desktop)
96-
97-
implementation("org.jetbrains.jewel:jewel-int-ui-standalone:0.30.0-252.26252")
98-
implementation("org.jetbrains.jewel:jewel-int-ui-decorated-window:0.30.0-252.26252")
9976

10077
implementation(composeLibs.desktop.get().let {
10178
"${it.group}:${it.name}:${it.version}"
@@ -135,14 +112,13 @@ kotlin {
135112

136113
android {
137114
namespace = "com.mrboomdev.awery"
138-
compileSdk = properties["awery.sdk.target"].toString().toInt()
115+
compileSdk = property("awery.sdk.target").toString().toInt()
139116

140117
defaultConfig {
141-
versionName = properties["awery.app.versionName"].toString()
142-
versionCode = properties["awery.app.versionCode"].toString().toInt()
143-
144-
targetSdk = properties["awery.sdk.target"].toString().toInt()
145-
minSdk = properties["awery.sdk.min"].toString().toInt()
118+
versionName = property("awery.app.versionName").toString()
119+
versionCode = property("awery.app.versionCode").toString().toInt()
120+
targetSdk = property("awery.sdk.target").toString().toInt()
121+
minSdk = property("awery.sdk.min").toString().toInt()
146122
}
147123

148124
buildTypes {
@@ -188,27 +164,131 @@ android {
188164
}
189165
}
190166

167+
enum class DesktopTarget(
168+
val os: String,
169+
val arch: String,
170+
val targetFormat: TargetFormat
171+
) {
172+
// WINDOWS_AARCH64(
173+
// os = "windows",
174+
// arch = "aarch64",
175+
// targetFormat = TargetFormat.Exe
176+
// ),
177+
178+
WINDOWS_X64(
179+
os = "windows",
180+
arch = "x64",
181+
targetFormat = TargetFormat.Exe
182+
),
183+
184+
// WINDOWS_X86(
185+
// os = "windows",
186+
// arch = "x86",
187+
// targetFormat = TargetFormat.Exe
188+
// ),
189+
//
190+
// LINUX_AARCH64(
191+
// os = "linux",
192+
// arch = "aarch64",
193+
// targetFormat = TargetFormat.Deb
194+
// ),
195+
//
196+
// LINUX_X64(
197+
// os = "linux",
198+
// arch = "x64",
199+
// targetFormat = TargetFormat.Deb
200+
// )
201+
}
202+
203+
DesktopTarget.values().map { target ->
204+
target to tasks.register(listOf("download", target.os, target.arch, "jre").joinToCamelCase()) {
205+
val version = property("awery.jre.version").toString()
206+
val variant = property("awery.jre.variant").toString()
207+
208+
inputs.property("jreVersion", version)
209+
inputs.property("jreVariant", variant)
210+
211+
doLast {
212+
val url = buildString {
213+
214+
}
215+
216+
// TODO: Download jre at build time and cache it for each target
217+
}
218+
}
219+
}
220+
191221
compose.desktop {
192222
application {
193223
mainClass = "com.mrboomdev.awery.app.MainKt"
224+
javaHome = rootProject.layout.projectDirectory.dir("jre/windows-x64").asFile.absolutePath
194225

195226
nativeDistributions {
196-
targetFormats(TargetFormat.Exe, TargetFormat.Deb, TargetFormat.Msi)
197-
packageName = "com.mrboomdev.awery"
198-
packageVersion = properties["awery.app.versionName"].toString()
227+
targetFormats = DesktopTarget.values().map { it.targetFormat }.toSet()
228+
packageName = "Awery"
229+
packageVersion = property("awery.app.versionName").toString()
230+
includeAllModules = true
199231

200232
windows {
201-
console = true
202-
perUserInstall = true
233+
iconFile = rootProject.file("app_icon.ico")
234+
shortcut = true
203235
menu = true
204236
menuGroup = "Awery"
205-
includeAllModules = true
206-
upgradeUuid = "6a7f9795-c323-4c10-a73a-55ac5506af01"
237+
perUserInstall = true
207238
}
239+
240+
// This block finds each packaging task (packageMsi, packageDmg, etc.)
241+
// and configures it to depend on and use the correct JBR.
242+
// tasks.withType<AbstractJPackageTask>().configureEach {
243+
// javaHome = when(targetFormat) {
244+
// else -> ""
245+
// }
246+
//
247+
// val task = this
248+
//
249+
// DesktopTarget.values().find {
250+
// it.targetFormat.name.equals(task.targetFormat.name, ignoreCase = true)
251+
// }?.let { config ->
252+
// val jbrTargetDir = layout.buildDirectory.file("jbr/${config.os}-${config.arch}").get().asFile
253+
// val setupTaskName = "setupJbr_${config.os}_${config.arch}"
254+
// println("Configuring task ${task.name} to use JBR from ${jbrTargetDir.path}")
255+
//
256+
// // Set the correct javaHome path for this specific task
257+
// val macOsHome = jbrTargetDir.resolve("jbr_home/Contents/Home")
258+
// val otherHome = jbrTargetDir.resolve("jbr_home")
259+
//
260+
// task.javaHome = (if(config.os == "osx" && macOsHome.exists()) {
261+
// macOsHome
262+
// } else otherHome).absolutePath
263+
//
264+
// // Make this packaging task depend on its specific download task
265+
// task.dependsOn(/*setupTaskName*/ "downloadJbr")
266+
// }
267+
// }
208268
}
209269
}
210270
}
211271

212-
tasks.named("preBuild") {
213-
dependsOn(generateAndroidLocaleConfig)
214-
}
272+
tasks.register("generateAndroidLocaleConfig") {
273+
val outputDir = layout.projectDirectory.dir("src/androidMain/res/xml")
274+
val outputFile = outputDir.file("awery_generated_locales_config.xml")
275+
val locales = getLocales()
276+
277+
// For task caching
278+
inputs.property("locales", locales)
279+
outputs.file(outputFile)
280+
281+
doLast {
282+
outputDir.asFile.mkdirs()
283+
outputFile.asFile.writeText(buildString {
284+
appendLine("""<?xml version="1.0" encoding="utf-8"?>""")
285+
appendLine("""<locale-config xmlns:android="http://schemas.android.com/apk/res/android">""")
286+
287+
for(locale in locales) {
288+
appendLine(""" <locale android:name="$locale" />""")
289+
}
290+
291+
appendLine("""</locale-config>""")
292+
})
293+
}
294+
}.let { tasks.named("preBuild").dependsOn(it) }
915 Bytes
Binary file not shown.
954 Bytes
Binary file not shown.

app/release/output-metadata.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@
1111
"type": "SINGLE",
1212
"filters": [],
1313
"attributes": [],
14-
"versionCode": 1,
15-
"versionName": "2.0.0-release",
14+
"versionCode": 2,
15+
"versionName": "2.0.1-release",
1616
"outputFile": "app-release.apk"
1717
}
1818
],

app/src/desktopMain/kotlin/com/mrboomdev/awery/app/Main.kt

Lines changed: 3 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -4,110 +4,48 @@ import androidx.compose.animation.Crossfade
44
import androidx.compose.foundation.ComposeFoundationFlags
55
import androidx.compose.foundation.ExperimentalFoundationApi
66
import androidx.compose.foundation.Image
7-
import androidx.compose.foundation.background
8-
import androidx.compose.foundation.clickable
9-
import androidx.compose.foundation.isSystemInDarkTheme
10-
import androidx.compose.foundation.layout.Arrangement
11-
import androidx.compose.foundation.layout.Box
12-
import androidx.compose.foundation.layout.Row
13-
import androidx.compose.foundation.layout.Spacer
14-
import androidx.compose.foundation.layout.aspectRatio
15-
import androidx.compose.foundation.layout.fillMaxHeight
16-
import androidx.compose.foundation.layout.fillMaxWidth
17-
import androidx.compose.foundation.layout.padding
18-
import androidx.compose.foundation.layout.width
19-
import androidx.compose.foundation.shape.RoundedCornerShape
20-
import androidx.compose.foundation.text.BasicTextField
21-
import androidx.compose.foundation.text.input.TextFieldLineLimits
22-
import androidx.compose.foundation.text.input.rememberTextFieldState
23-
import androidx.compose.material3.Icon
24-
import androidx.compose.material3.IconButtonColors
7+
import androidx.compose.foundation.layout.*
258
import androidx.compose.material3.IconButtonDefaults
26-
import androidx.compose.material3.LocalContentColor
27-
import androidx.compose.material3.MaterialTheme
28-
import androidx.compose.material3.MaterialTheme.colorScheme
299
import androidx.compose.material3.Text
30-
import androidx.compose.material3.TextField
31-
import androidx.compose.material3.TextFieldDefaults
32-
import androidx.compose.runtime.CompositionLocalProvider
3310
import androidx.compose.runtime.LaunchedEffect
3411
import androidx.compose.runtime.collectAsState
35-
import androidx.compose.runtime.getValue
36-
import androidx.compose.runtime.mutableStateOf
37-
import androidx.compose.runtime.remember
38-
import androidx.compose.runtime.saveable.rememberSaveable
39-
import androidx.compose.runtime.setValue
4012
import androidx.compose.ui.Alignment
4113
import androidx.compose.ui.Modifier
42-
import androidx.compose.ui.draw.clip
43-
import androidx.compose.ui.focus.FocusRequester
44-
import androidx.compose.ui.focus.focusRequester
45-
import androidx.compose.ui.graphics.Color
46-
import androidx.compose.ui.text.font.FontWeight
4714
import androidx.compose.ui.unit.DpSize
4815
import androidx.compose.ui.unit.dp
49-
import androidx.compose.ui.window.Window
50-
import androidx.compose.ui.window.WindowPlacement
51-
import androidx.compose.ui.window.WindowPosition
52-
import androidx.compose.ui.window.WindowState
5316
import androidx.compose.ui.window.application
5417
import androidx.compose.ui.window.rememberWindowState
55-
import androidx.compose.ui.zIndex
56-
import coil3.compose.AsyncImagePainter.State.Empty.painter
5718
import com.formdev.flatlaf.intellijthemes.FlatOneDarkIJTheme
5819
import com.mrboomdev.awery.core.Awery
59-
import com.mrboomdev.awery.core.utils.Log
6020
import com.mrboomdev.awery.resources.AweryFonts
6121
import com.mrboomdev.awery.resources.Res
6222
import com.mrboomdev.awery.resources.ic_back
6323
import com.mrboomdev.awery.resources.logo_awery
64-
import com.mrboomdev.awery.resources.search
6524
import com.mrboomdev.awery.ui.App
6625
import com.mrboomdev.awery.ui.Routes
6726
import com.mrboomdev.awery.ui.components.IconButton
6827
import com.mrboomdev.awery.ui.theme.AweryTheme
6928
import com.mrboomdev.awery.ui.theme.aweryColorScheme
70-
import com.mrboomdev.awery.ui.utils.WindowSizeType
7129
import com.mrboomdev.navigation.core.safePop
7230
import com.mrboomdev.navigation.jetpack.rememberJetpackNavigation
7331
import de.milchreis.uibooster.UiBooster
7432
import de.milchreis.uibooster.model.UiBoosterOptions
75-
import io.github.vinceglb.filekit.FileKit
76-
import io.github.vinceglb.filekit.exists
77-
import io.github.vinceglb.filekit.filesDir
78-
import io.github.vinceglb.filekit.readString
79-
import io.github.vinceglb.filekit.resolve
80-
import io.github.vinceglb.filekit.writeString
81-
import kotlinx.serialization.decodeFromString
82-
import kotlinx.serialization.json.Json
83-
import kotlinx.serialization.json.JsonNull.content
8433
import org.jetbrains.compose.resources.painterResource
85-
import org.jetbrains.compose.resources.stringResource
86-
import org.jetbrains.jewel.foundation.BorderColors
8734
import org.jetbrains.jewel.foundation.DisabledAppearanceValues
8835
import org.jetbrains.jewel.foundation.GlobalColors
89-
import org.jetbrains.jewel.foundation.OutlineColors
90-
import org.jetbrains.jewel.foundation.TextColors
9136
import org.jetbrains.jewel.foundation.theme.JewelTheme
92-
import org.jetbrains.jewel.foundation.theme.ThemeDefinition
9337
import org.jetbrains.jewel.intui.standalone.theme.IntUiTheme
94-
import org.jetbrains.jewel.intui.standalone.theme.createDefaultTextStyle
95-
import org.jetbrains.jewel.intui.standalone.theme.createEditorTextStyle
9638
import org.jetbrains.jewel.intui.standalone.theme.dark
9739
import org.jetbrains.jewel.intui.standalone.theme.darkThemeDefinition
9840
import org.jetbrains.jewel.intui.standalone.theme.default
9941
import org.jetbrains.jewel.intui.window.decoratedWindow
10042
import org.jetbrains.jewel.intui.window.styling.dark
10143
import org.jetbrains.jewel.ui.ComponentStyling
102-
import org.jetbrains.jewel.ui.component.ContextMenuDivider.onClick
10344
import org.jetbrains.jewel.window.DecoratedWindow
10445
import org.jetbrains.jewel.window.TitleBar
105-
import org.jetbrains.jewel.window.defaultDecoratedWindowStyle
106-
import org.jetbrains.jewel.window.defaultTitleBarStyle
10746
import org.jetbrains.jewel.window.newFullscreenControls
10847
import org.jetbrains.jewel.window.styling.DecoratedWindowColors
10948
import org.jetbrains.jewel.window.styling.DecoratedWindowStyle
110-
import org.jetbrains.jewel.window.styling.LocalDecoratedWindowStyle
11149
import org.jetbrains.jewel.window.styling.TitleBarColors
11250
import org.jetbrains.jewel.window.styling.TitleBarStyle
11351
import java.awt.Dimension
@@ -279,6 +217,8 @@ fun main() {
279217
}
280218
}
281219
)
220+
221+
282222
}
283223
}
284224

app_icon.ico

72.8 KB
Binary file not shown.

core/src/commonMain/kotlin/com/mrboomdev/awery/core/utils/CollectionUtils.kt renamed to core/src/commonMain/kotlin/com/mrboomdev/awery/core/utils/collection/CollectionUtils.kt

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
1-
package com.mrboomdev.awery.core.utils
2-
3-
import kotlin.enums.enumEntries
1+
package com.mrboomdev.awery.core.utils.collection
42

53
fun MutableIterator<*>.removeAll() {
64
remove()

0 commit comments

Comments
 (0)