Skip to content

Commit

Permalink
Koin SetUp Starting MVVM
Browse files Browse the repository at this point in the history
  • Loading branch information
arya458 committed May 15, 2024
1 parent 3ff1a48 commit 932d22d
Show file tree
Hide file tree
Showing 16 changed files with 320 additions and 91 deletions.
12 changes: 10 additions & 2 deletions composeApp/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -9,16 +9,24 @@ kotlin {
jvm("desktop")
sourceSets {
val desktopMain by getting

val koin_version = "3.2.0"

commonMain.dependencies {
implementation(compose.runtime)
implementation(compose.foundation)
implementation(compose.material)
implementation(compose.ui)
implementation(compose.components.resources)
implementation(compose.components.uiToolingPreview)
implementation( "de.sfuhrm:radiobrowser4j:3.0.0")
implementation("de.sfuhrm:radiobrowser4j:3.0.0")
implementation("com.darkrockstudios:mpfilepicker:3.1.0")

implementation("io.insert-koin:koin-core:$koin_version")
// implementation("io.insert-koin:koin-core-coroutines:$koin_version")
// implementation("io.insert-koin:koin-compose:$koin_version")
implementation("io.insert-koin:koin-logger-slf4j:$koin_version")


}
desktopMain.dependencies {
implementation(compose.desktop.currentOs)
Expand Down
55 changes: 19 additions & 36 deletions composeApp/src/desktopMain/kotlin/App.kt
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
import Player.PlayerImpl
import Radio.RadioImpl
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.lazy.grid.GridCells
Expand All @@ -12,47 +10,34 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import com.darkrockstudios.libraries.mpfilepicker.FilePicker
import de.sfuhrm.radiobrowser4j.*
import org.jetbrains.compose.resources.ExperimentalResourceApi
import org.jetbrains.compose.ui.tooling.preview.Preview

import de.sfuhrm.radiobrowser4j.Station
import org.koin.java.KoinJavaComponent
import org.koin.java.KoinJavaComponent.getKoin
import player.domain.repository.PlayerRepository
import player.presentation.compose.SetupPlayer
import player.presentation.viewmodel.PlayerViewModel
import player.util.PlayerState
import radio.data.repository.RadioImpl
import java.io.File

@OptIn(ExperimentalResourceApi::class)
@Composable
@Preview
fun App() {
fun App(player: PlayerViewModel = getKoin().get()) {
MaterialTheme {

val playerDir: MutableState<File?> = remember { mutableStateOf(null) }
val showPicker = remember { mutableStateOf(false) }


val lazyState = rememberLazyGridState()
val playerState by player.playerState.collectAsState()



FilePicker(
show = showPicker.value, fileExtensions = listOf("exe"), title = "mpc-hc64"
) { platformFile ->
if (platformFile != null) {
playerDir.value = File(platformFile.path)
}
showPicker.value = false
}
Surface(Modifier.fillMaxSize(), color = MaterialTheme.colors.background) {
when (playerDir.value) {
null -> {
Column(
Modifier.fillMaxSize(),
horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.Center
) {
when (playerState) {

Text("Please Download And Select K-Lite Codec exe")
Button({
showPicker.value = true
}) {
Text("Select")
}
is PlayerState.Empty -> {

SetupPlayer()

}
}

else -> {
Expand All @@ -63,8 +48,6 @@ fun App() {
radioList.add(it)
}
}
val player = PlayerImpl(playerDir.value!!)


LazyVerticalGrid(
modifier = Modifier.padding(10.dp).fillMaxSize(),
Expand All @@ -73,7 +56,7 @@ fun App() {
) {
items(radioList) {
Card(modifier = Modifier.padding(10.dp).size(100.dp).clickable {
player.play(it.url)
player.play(it)
}, backgroundColor = MaterialTheme.colors.surface, elevation = 10.dp) {

Column(
Expand Down
7 changes: 0 additions & 7 deletions composeApp/src/desktopMain/kotlin/Greeting.kt

This file was deleted.

5 changes: 0 additions & 5 deletions composeApp/src/desktopMain/kotlin/Platform.kt

This file was deleted.

27 changes: 0 additions & 27 deletions composeApp/src/desktopMain/kotlin/Player/PlayerImpl.kt

This file was deleted.

9 changes: 0 additions & 9 deletions composeApp/src/desktopMain/kotlin/Player/PlayerRepository.kt

This file was deleted.

11 changes: 11 additions & 0 deletions composeApp/src/desktopMain/kotlin/main.kt
Original file line number Diff line number Diff line change
@@ -1,9 +1,20 @@
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.window.Window
import androidx.compose.ui.window.application
import org.koin.core.context.startKoin
import player.di.PlayerModule
import radio.di.RadioModule


fun main() = application {
val icon = painterResource("drawable/icon.png")



startKoin {
modules(RadioModule)
modules(PlayerModule)
}
Window(
onCloseRequest = ::exitApplication,
icon = icon,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
package player.data.repository

import player.domain.repository.PlayerRepository
import kotlinx.coroutines.*
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.flow.flow
import player.util.PlayerState
import java.io.File

class PlayerImpl: PlayerRepository {
private var runtime: Runtime = Runtime.getRuntime()
private var playerDir: File? =null

init {
println("PlayerImpl Created")
}
override fun setPlayerDir(playerEXE: String): Flow<PlayerState<String>> {
return flow<PlayerState<String>> {

emit(PlayerState.Empty())
try {
playerDir = File(playerEXE)
emit(PlayerState.Ready(playerEXE))
}catch (e:Exception){
emit(PlayerState.Error(e.message.toString()))
}
}
}

override fun checkPlayerDefaultPath(): Flow<PlayerState<String>> {
val defPath = "C:\\Program Files (x86)\\K-Lite Codec Pack\\MPC-HC64\\mpc-hc64.exe"

return flow<PlayerState<String>> {
emit(PlayerState.Empty())
try {
val def = File(defPath)
if (def.exists() && def.isFile){
playerDir = File(defPath)
emit(PlayerState.Ready(defPath))
}
} catch (e: Exception) {
println(e.message)
}
}
}


override fun play(link: String): Process? {
return runtime.exec("${playerDir?.path} $link")
}



override fun shutdown() {
println("Player.Player Cancelled")
runtime.addShutdownHook(Thread("Cancelled"))
}


}
43 changes: 43 additions & 0 deletions composeApp/src/desktopMain/kotlin/player/di/PlayerModule.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package player.di

import org.koin.core.module.dsl.bind
import org.koin.core.module.dsl.createdAtStart
import org.koin.core.module.dsl.singleOf
import org.koin.core.module.dsl.withOptions
import player.data.repository.PlayerImpl
import org.koin.core.qualifier.named
import org.koin.dsl.module
import player.domain.repository.PlayerRepository
import player.presentation.viewmodel.PlayerViewModel


val PlayerModule = module(createdAtStart=true) {

// single<PlayerRepository>(named("playerRepository")) {
// PlayerImpl()
// }

singleOf(::PlayerImpl) withOptions {
// definition options
named("playerRepository")
bind<PlayerRepository>()
createdAtStart()
}


single<PlayerViewModel>{
PlayerViewModel()
} withOptions {
// definition options
named("playerViewModel")
createdAtStart()
}




// single<PlayerRepository> { PlayerImpl() as PlayerRepository } withOptions {
// named("playerRepository")
// createdAtStart()
// }
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package player.domain.repository

import kotlinx.coroutines.flow.Flow
import player.util.PlayerState

interface PlayerRepository {

fun setPlayerDir(playerEXE: String): Flow<PlayerState<String>>

fun checkPlayerDefaultPath(): Flow<PlayerState<String>>

fun play(link: String): Process?

fun shutdown()

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
package player.presentation.compose

import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.material.Button
import androidx.compose.material.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.MutableState
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import com.darkrockstudios.libraries.mpfilepicker.FilePicker
import org.koin.java.KoinJavaComponent
import player.domain.repository.PlayerRepository
import player.presentation.viewmodel.PlayerViewModel
import java.io.File

@Composable
fun SetupPlayer(viewModel: PlayerViewModel = KoinJavaComponent.getKoin().get()){

val showPicker = remember { mutableStateOf(false) }
FilePicker(
show = showPicker.value, fileExtensions = listOf("exe"), title = "mpc-hc64"
) { platformFile ->
if (platformFile != null) {
viewModel.setPlayerDir(platformFile.path)
}
showPicker.value = false
}

Column(
Modifier.fillMaxSize(),
horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.Center
) {

Text("Please Download And Select K-Lite Codec exe")
Button({
showPicker.value = true
}) {
Text("Select")
}

}

}
Loading

0 comments on commit 932d22d

Please sign in to comment.