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
3 changes: 2 additions & 1 deletion app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -64,8 +64,9 @@ dependencies {

ksp(libs.hilt.android.compiler)
implementation(libs.hilt.android)
implementation(libs.androidx.hilt.navigation.compose)
implementation(libs.androidx.hilt.lifecycle.viewmodel.compose)
implementation(libs.androidx.core.ktx)
implementation(libs.androidx.datastore.preferences)
implementation(libs.androidx.lifecycle.runtime.compose)
implementation(libs.androidx.lifecycle.runtime.ktx)
implementation(libs.androidx.lifecycle.viewmodel.compose)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ import org.junit.Test
import tech.capullo.radio.snapcast.Client
import tech.capullo.radio.ui.BroadcasterScreenContent
import tech.capullo.radio.ui.model.AudioChannel
import tech.capullo.radio.viewmodels.RadioBroadcasterUiState
import tech.capullo.radio.viewmodels.BroadcasterUiState

class RadioBroadcasterEspotiConnectTest {

Expand All @@ -23,7 +23,7 @@ class RadioBroadcasterEspotiConnectTest {
@Test
fun whenEspotiConnectState_showsEspotiConnectScreen() {
// Given: UI state is EspotiConnect
val uiState = RadioBroadcasterUiState.EspotiConnect(
val uiState = BroadcasterUiState.EspotiConnect(
isLoading = false,
deviceName = "Test Device",
)
Expand Down Expand Up @@ -54,7 +54,7 @@ class RadioBroadcasterEspotiConnectTest {
@Test
fun whenLoadingPreviousPlaybackSessionState_showsLoadingIndicator() {
// Given: UI state is EspotiConnect with loadingStoredCredentials = true
val uiState = RadioBroadcasterUiState.EspotiConnect(
val uiState = BroadcasterUiState.EspotiConnect(
isLoading = true,
deviceName = "Test Device",
)
Expand All @@ -80,7 +80,7 @@ class RadioBroadcasterEspotiConnectTest {
val hostAddresses = listOf("192.168.0.1", "10.0.0.2")
val mockClients = emptyList<Client>()

val uiState = RadioBroadcasterUiState.EspotiPlayerReady(
val uiState = BroadcasterUiState.EspotiPlayerReady(
hostAddresses = hostAddresses,
snapcastClients = mockClients,
audioChannel = AudioChannel.STEREO,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package tech.capullo.radio

import android.content.Context
import android.net.nsd.NsdManager
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.platform.app.InstrumentationRegistry
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking
import org.junit.Test
import org.junit.runner.RunWith
import tech.capullo.radio.snapcast.SnapserverDiscoveryManager
import tech.capullo.radio.snapcast.SnapserverNsdManager

@RunWith(AndroidJUnit4::class)
class SnapserverDiscoveryTest {

@Test
fun testDiscoversSnapserverServices() = runBlocking {
val appContext = InstrumentationRegistry.getInstrumentation().targetContext
val nsdManager = appContext.getSystemService(Context.NSD_SERVICE) as NsdManager

launch {
SnapserverNsdManager(nsdManager).start()
}

val snapserverDiscoveryManager = SnapserverDiscoveryManager(nsdManager)
snapserverDiscoveryManager.startDiscovery()

delay(5000)
assert(snapserverDiscoveryManager.discoveredServices.value.isNotEmpty())
}
}
119 changes: 0 additions & 119 deletions app/src/androidTest/java/tech/capullo/radio/TuneInScreen.kt

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,8 @@ import org.junit.runner.RunWith
import tech.capullo.radio.data.PipeFileDataSource
import tech.capullo.radio.data.RadioAdvertisingDataSource
import tech.capullo.radio.data.RadioRepository
import tech.capullo.radio.viewmodels.RadioBroadcasterUiState
import tech.capullo.radio.viewmodels.RadioBroadcasterViewModel
import tech.capullo.radio.viewmodels.BroadcasterUiState
import tech.capullo.radio.viewmodels.BroadcasterViewModel
import java.io.File
import kotlin.system.measureTimeMillis

Expand Down Expand Up @@ -48,15 +48,15 @@ class EspotiSessionRepositoryInstrumentedTest {
val espotiConnectHandler = EspotiConnectHandler(sessionRepository)
val espotiZeroconfServer = EspotiZeroconfServer(espotiConnectHandler)
val espotiNsdManager = EspotiNsdManager(nsdManager, espotiZeroconfServer)
val viewModel = RadioBroadcasterViewModel(
val viewModel = BroadcasterViewModel(
appContext,
radioRepository,
espotiNsdManager,
sessionRepository,
)
var resultState = viewModel.uiState.take(2).toList()
assertEquals(
RadioBroadcasterUiState.EspotiConnect(
BroadcasterUiState.EspotiConnect(
isLoading = true,
deviceName = radioAdvertisingDataSource.getDeviceName(),
),
Expand All @@ -67,7 +67,7 @@ class EspotiSessionRepositoryInstrumentedTest {

if (!credentialsFile.exists()) {
assertEquals(
RadioBroadcasterUiState.EspotiConnect(
BroadcasterUiState.EspotiConnect(
isLoading = false,
deviceName = radioAdvertisingDataSource.getDeviceName(),
),
Expand Down
3 changes: 1 addition & 2 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,7 @@
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"
/>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.NEARBY_WIFI_DEVICES"
android:usesPermissionFlags="neverForLocation"
tools:targetApi="tiramisu" />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ import tech.capullo.radio.espoti.AudioFocusManager
import tech.capullo.radio.espoti.EspotiPlayerManager
import tech.capullo.radio.espoti.EspotiSessionRepository
import tech.capullo.radio.snapcast.SnapclientProcess
import tech.capullo.radio.snapcast.SnapserverNsdManager
import tech.capullo.radio.snapcast.SnapserverProcess
import tech.capullo.radio.ui.model.AudioChannel
import xyz.gianlu.librespot.audio.MetadataWrapper
Expand All @@ -48,6 +49,8 @@ class RadioBroadcasterService : Service() {

@Inject lateinit var snapserverProcess: SnapserverProcess

@Inject lateinit var snapserverNsdManager: SnapserverNsdManager

private val playbackExecutor: ExecutorService = Executors.newSingleThreadExecutor()
private var player: Player? = null
private var session: Session? = null
Expand Down Expand Up @@ -123,6 +126,7 @@ class RadioBroadcasterService : Service() {

override fun onTaskRemoved(rootIntent: Intent?) {
super.onTaskRemoved(rootIntent)
snapserverNsdManager.stop()
scope.cancel()
player?.close()
session?.close()
Expand Down Expand Up @@ -258,6 +262,7 @@ class RadioBroadcasterService : Service() {
fun startSnapcast() {
snapserverJob = scope.launch { snapserverProcess.start() }
snapclientJob = scope.launch { snapclientProcess.start() }
scope.launch { snapserverNsdManager.start() }
}

fun updateAudioChannel(channel: AudioChannel) {
Expand Down
Loading