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

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions gradle/libs.versions.toml
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ compose-ui-tooling = { module = "org.jetbrains.compose.ui:ui-tooling", version.r
compose-ui-tooling-preview = { module = "org.jetbrains.compose.components:components-ui-tooling-preview", version.ref = "compose" }
compose-material-icons-extended = { module = "org.jetbrains.compose.material:material-icons-extended", version = "1.7.3" }
androidx-lifecycle-runtime-ktx = { group = "androidx.lifecycle", name = "lifecycle-runtime-ktx", version.ref = "androidx-lifecycle-runtime-ktx" }
nucleus-graalvm-runtime = { module = "io.github.kdroidfilter:nucleus.graalvm-runtime", version = "1.9.1" }

[plugins]

Expand All @@ -57,3 +58,4 @@ vannitktech-maven-publish = {id = "com.vanniktech.maven.publish", version = "0.3
dokka = { id = "org.jetbrains.dokka" , version = "2.2.0"}
detekt = { id = "io.gitlab.arturbosch.detekt", version.ref = "detekt" }
ktlint = { id = "org.jlleitschuh.gradle.ktlint", version.ref = "ktlint" }
nucleus = { id = "io.github.kdroidfilter.nucleus", version = "1.9.1" }

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,26 +1,39 @@
[
{
"type": "io.github.kdroidfilter.composemediaplayer.linux.LinuxNativeBridge",
"allDeclaredFields": true,
"allDeclaredMethods": true,
"allDeclaredConstructors": true
},
{
"type": "io.github.kdroidfilter.composemediaplayer.mac.MacNativeBridge",
"allDeclaredFields": true,
"allDeclaredMethods": true,
"allDeclaredConstructors": true
},
{
"type": "io.github.kdroidfilter.composemediaplayer.windows.WindowsNativeBridge",
"allDeclaredFields": true,
"allDeclaredMethods": true,
"allDeclaredConstructors": true
},
{
"type": "java.lang.Runnable",
"methods": [
{ "name": "run", "parameterTypes": [] }
{
"reflection": [
{
"type": "io.github.kdroidfilter.composemediaplayer.linux.LinuxNativeBridge",
"allDeclaredFields": true,
"allDeclaredMethods": true,
"allDeclaredConstructors": true,
"jniAccessible": true
},
{
"type": "io.github.kdroidfilter.composemediaplayer.mac.MacNativeBridge",
"allDeclaredFields": true,
"allDeclaredMethods": true,
"allDeclaredConstructors": true,
"jniAccessible": true
},
{
"type": "io.github.kdroidfilter.composemediaplayer.windows.WindowsNativeBridge",
"allDeclaredFields": true,
"allDeclaredMethods": true,
"allDeclaredConstructors": true,
"jniAccessible": true
},
{
"type": "java.lang.Runnable",
"methods": [
{
"name": "run",
"parameterTypes": []
}
]
}
],
"resources": [
{
"glob": "composemediaplayer/native/**"
}
]
}
]
}
45 changes: 28 additions & 17 deletions sample/composeApp/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
@file:OptIn(ExperimentalWasmDsl::class)

import io.github.kdroidfilter.nucleus.desktop.application.dsl.CompressionLevel
import org.apache.tools.ant.taskdefs.condition.Os
import org.jetbrains.compose.desktop.application.dsl.TargetFormat
import io.github.kdroidfilter.nucleus.desktop.application.dsl.TargetFormat
import org.jetbrains.kotlin.gradle.ExperimentalWasmDsl
import org.jetbrains.kotlin.gradle.targets.js.webpack.KotlinWebpackConfig

Expand All @@ -10,6 +11,7 @@ plugins {
alias(libs.plugins.compose.compiler)
alias(libs.plugins.compose)
alias(libs.plugins.android.application)
alias(libs.plugins.nucleus)
}


Expand Down Expand Up @@ -81,6 +83,7 @@ kotlin {

jvmMain.dependencies {
implementation(compose.desktop.currentOs)
implementation(libs.nucleus.graalvm.runtime)
}
webMain.dependencies {
implementation(libs.kotlinx.browser)
Expand All @@ -106,24 +109,32 @@ dependencies {
debugImplementation(libs.compose.ui.tooling)
}

compose.desktop {
application {
mainClass = "sample.app.MainKt"

nativeDistributions {
targetFormats(TargetFormat.Dmg, TargetFormat.Msi, TargetFormat.Deb)
packageName = "sample"
packageVersion = "1.0.0"
linux {
modules("jdk.security.auth", "jdk.accessibility")
}
macOS {
jvmArgs(
"-Dapple.awt.application.appearance=system"
)
}
nucleus.application {
mainClass = "sample.app.MainKt"

nativeDistributions {
targetFormats(TargetFormat.Dmg, TargetFormat.Nsis, TargetFormat.Deb)
packageName = "Compose Media Player"
description = "A Kotlin Multiplatform media player built with Compose"
vendor = "KDroidFilter"
cleanupNativeLibs = true
packageVersion = "1.0.0"
compressionLevel = CompressionLevel.Maximum
windows {
shortcut = true
}
}

graalvm {
isEnabled = true
imageName = "compose-media-player"
javaLanguageVersion = 25
jvmVendor = JvmVendorSpec.BELLSOFT
buildArgs.addAll(
"-H:+AddAllCharsets",
"-Djava.awt.headless=false"
)
}
}


19 changes: 11 additions & 8 deletions sample/composeApp/src/commonMain/kotlin/sample/app/App.kt
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@ import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.unit.dp
import io.github.kdroidfilter.composemediaplayer.VideoPlayerState
import io.github.kdroidfilter.composemediaplayer.rememberVideoPlayerState
import sample.app.feed.FeedScreen
import sample.app.gallery.GalleryScreen
import sample.app.player.PlayerScreen
Expand All @@ -40,22 +42,23 @@ private enum class Screen(val label: String, val icon: ImageVector) {
fun App() {
AppTheme {
var currentScreen by remember { mutableStateOf(Screen.Player) }
val playerState = rememberVideoPlayerState()

BoxWithConstraints(modifier = Modifier.fillMaxSize()) {
val useRail = maxWidth >= 600.dp

if (useRail) {
RailLayout(currentScreen, onScreenChange = { currentScreen = it })
RailLayout(currentScreen, onScreenChange = { currentScreen = it }, playerState = playerState)
} else {
BarLayout(currentScreen, onScreenChange = { currentScreen = it })
BarLayout(currentScreen, onScreenChange = { currentScreen = it }, playerState = playerState)
}
}
}
}

// Compact: bottom NavigationBar
@Composable
private fun BarLayout(current: Screen, onScreenChange: (Screen) -> Unit) {
private fun BarLayout(current: Screen, onScreenChange: (Screen) -> Unit, playerState: VideoPlayerState) {
Scaffold(
bottomBar = {
NavigationBar {
Expand All @@ -70,13 +73,13 @@ private fun BarLayout(current: Screen, onScreenChange: (Screen) -> Unit) {
}
},
) { padding ->
ScreenContent(current, Modifier.fillMaxSize().padding(padding))
ScreenContent(current, Modifier.fillMaxSize().padding(padding), playerState)
}
}

// Medium+: side NavigationRail
@Composable
private fun RailLayout(current: Screen, onScreenChange: (Screen) -> Unit) {
private fun RailLayout(current: Screen, onScreenChange: (Screen) -> Unit, playerState: VideoPlayerState) {
Row(modifier = Modifier.fillMaxSize()) {
NavigationRail {
Spacer(Modifier.weight(1f))
Expand All @@ -90,14 +93,14 @@ private fun RailLayout(current: Screen, onScreenChange: (Screen) -> Unit) {
}
Spacer(Modifier.weight(1f))
}
ScreenContent(current, Modifier.weight(1f).fillMaxHeight())
ScreenContent(current, Modifier.weight(1f).fillMaxHeight(), playerState)
}
}

@Composable
private fun ScreenContent(screen: Screen, modifier: Modifier) {
private fun ScreenContent(screen: Screen, modifier: Modifier, playerState: VideoPlayerState) {
when (screen) {
Screen.Player -> PlayerScreen(modifier)
Screen.Player -> PlayerScreen(modifier, playerState)
Screen.Gallery -> GalleryScreen(modifier)
Screen.Feed -> FeedScreen(modifier)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ import androidx.compose.material3.Snackbar
import androidx.compose.material3.Text
import androidx.compose.material3.TextButton
import androidx.compose.runtime.Composable
import androidx.compose.runtime.DisposableEffect
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateListOf
Expand Down Expand Up @@ -73,8 +74,17 @@ import kotlinx.coroutines.launch

@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun PlayerScreen(modifier: Modifier = Modifier) {
val playerState = rememberVideoPlayerState()
fun PlayerScreen(modifier: Modifier = Modifier, playerState: VideoPlayerState = rememberVideoPlayerState()) {
// Pause when leaving the screen, resume when coming back
DisposableEffect(playerState) {
val wasPlaying = playerState.isPlaying
onDispose {
if (playerState.isPlaying) {
playerState.pause()
}
}
}

val scope = rememberCoroutineScope()

var videoUrl by remember { mutableStateOf(SAMPLE_VIDEOS.first().second) }
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,7 @@
package sample.app.theme

import androidx.compose.foundation.isSystemInDarkTheme
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.darkColorScheme
import androidx.compose.material3.lightColorScheme
import androidx.compose.runtime.Composable
import androidx.compose.ui.graphics.Color

Expand Down Expand Up @@ -33,34 +31,12 @@ private val DarkScheme = darkColorScheme(
outlineVariant = Color(0xFF49454F),
)

private val LightScheme = lightColorScheme(
primary = Color(0xFF5B4FC4),
onPrimary = Color.White,
primaryContainer = Color(0xFFE8DEFF),
onPrimaryContainer = Color(0xFF1A0063),
secondary = Color(0xFF006A6A),
onSecondary = Color.White,
secondaryContainer = Color(0xFF9CF1F0),
onSecondaryContainer = Color(0xFF002020),
tertiary = Color(0xFF8C4A3B),
onTertiary = Color.White,
tertiaryContainer = Color(0xFFFFDAD4),
onTertiaryContainer = Color(0xFF3A0905),
background = Color(0xFFFCF8FF),
onBackground = Color(0xFF1C1B1F),
surface = Color(0xFFFCF8FF),
onSurface = Color(0xFF1C1B1F),
surfaceVariant = Color(0xFFE8E0F0),
onSurfaceVariant = Color(0xFF49454F),
)

@Composable
fun AppTheme(
darkTheme: Boolean = isSystemInDarkTheme(),
content: @Composable () -> Unit,
) {
MaterialTheme(
colorScheme = if (darkTheme) DarkScheme else LightScheme,
colorScheme = DarkScheme,
content = content,
)
}
5 changes: 4 additions & 1 deletion sample/composeApp/src/jvmMain/kotlin/sample/app/main.kt
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,10 @@ import androidx.compose.ui.unit.dp
import androidx.compose.ui.window.Window
import androidx.compose.ui.window.application
import androidx.compose.ui.window.rememberWindowState
fun main() {
import io.github.kdroidfilter.nucleus.graalvm.GraalVmInitializer

fun main() {
GraalVmInitializer.initialize()
application {
val windowState = rememberWindowState(width = 720.dp, height = 1000.dp)
Window(
Expand Down