diff --git a/app/src/main/java/com/github/damontecres/wholphin/preferences/AppPreferencesSerializer.kt b/app/src/main/java/com/github/damontecres/wholphin/preferences/AppPreferencesSerializer.kt index 75fbb979..f55b4ea9 100644 --- a/app/src/main/java/com/github/damontecres/wholphin/preferences/AppPreferencesSerializer.kt +++ b/app/src/main/java/com/github/damontecres/wholphin/preferences/AppPreferencesSerializer.kt @@ -152,6 +152,15 @@ class AppPreferencesSerializer slideshowDuration = AppPreference.SlideshowDuration.defaultValue slideshowPlayVideos = AppPreference.SlideshowPlayVideos.defaultValue }.build() + + musicPreferences = + MusicPreferences + .newBuilder() + .apply { + showBackdrop = true + showLyrics = true + showAlbumArt = true + }.build() }.build() override suspend fun readFrom(input: InputStream): AppPreferences { diff --git a/app/src/main/java/com/github/damontecres/wholphin/services/AppUpgradeHandler.kt b/app/src/main/java/com/github/damontecres/wholphin/services/AppUpgradeHandler.kt index 23d6cef6..f665da1c 100644 --- a/app/src/main/java/com/github/damontecres/wholphin/services/AppUpgradeHandler.kt +++ b/app/src/main/java/com/github/damontecres/wholphin/services/AppUpgradeHandler.kt @@ -15,6 +15,7 @@ import com.github.damontecres.wholphin.preferences.updateHomePagePreferences import com.github.damontecres.wholphin.preferences.updateInterfacePreferences import com.github.damontecres.wholphin.preferences.updateLiveTvPreferences import com.github.damontecres.wholphin.preferences.updateMpvOptions +import com.github.damontecres.wholphin.preferences.updateMusicPreferences import com.github.damontecres.wholphin.preferences.updatePhotoPreferences import com.github.damontecres.wholphin.preferences.updatePlaybackOverrides import com.github.damontecres.wholphin.preferences.updateScreensaverPreferences @@ -263,4 +264,14 @@ suspend fun upgradeApp( } } } + + if (previous.isEqualOrBefore(Version.fromString("0.5.2-1=g0"))) { + appPreferences.updateData { + it.updateMusicPreferences { + showBackdrop = true + showLyrics = true + showAlbumArt = true + } + } + } } diff --git a/app/src/main/java/com/github/damontecres/wholphin/services/NavDrawerService.kt b/app/src/main/java/com/github/damontecres/wholphin/services/NavDrawerService.kt index 0eb1c4e8..8dbf49ee 100644 --- a/app/src/main/java/com/github/damontecres/wholphin/services/NavDrawerService.kt +++ b/app/src/main/java/com/github/damontecres/wholphin/services/NavDrawerService.kt @@ -36,7 +36,7 @@ import timber.log.Timber import java.util.UUID import javax.inject.Inject import javax.inject.Singleton -import kotlin.time.Duration.Companion.minutes +import kotlin.time.Duration.Companion.hours @Singleton class NavDrawerService @@ -101,7 +101,7 @@ class NavDrawerService } NowPlayingStatus.PAUSED -> { - delay(2.minutes) + delay(2.hours) _state.update { it.copy( nowPlayingEnabled = false, diff --git a/app/src/main/java/com/github/damontecres/wholphin/ui/detail/music/BarVisualizer.kt b/app/src/main/java/com/github/damontecres/wholphin/ui/detail/music/BarVisualizer.kt index e707b93e..b9976916 100644 --- a/app/src/main/java/com/github/damontecres/wholphin/ui/detail/music/BarVisualizer.kt +++ b/app/src/main/java/com/github/damontecres/wholphin/ui/detail/music/BarVisualizer.kt @@ -49,7 +49,6 @@ fun BoxScope.BarVisualizer( .width(width) .padding(start = if (index == 0) 0.dp else padding) .background(MaterialTheme.colorScheme.border), -// .align(Alignment.Bottom), ) } } diff --git a/app/src/main/java/com/github/damontecres/wholphin/ui/detail/music/NowPlayingOverlay.kt b/app/src/main/java/com/github/damontecres/wholphin/ui/detail/music/NowPlayingOverlay.kt index 4b1481a1..deb76aa4 100644 --- a/app/src/main/java/com/github/damontecres/wholphin/ui/detail/music/NowPlayingOverlay.kt +++ b/app/src/main/java/com/github/damontecres/wholphin/ui/detail/music/NowPlayingOverlay.kt @@ -168,9 +168,10 @@ fun NowPlayingOverlay( Modifier .fillMaxWidth() .background( - color = MaterialTheme.colorScheme.surface.copy(alpha = .75f), + color = MaterialTheme.colorScheme.surface.copy(alpha = .5f), shape = RoundedCornerShape(8.dp), - ).onFocusChanged { + ).padding(end = 8.dp) + .onFocusChanged { if (it.hasFocus) showButtons = index < 3 controllerViewState.pulseControls() }.animateItem(), diff --git a/app/src/main/java/com/github/damontecres/wholphin/ui/detail/music/NowPlayingPage.kt b/app/src/main/java/com/github/damontecres/wholphin/ui/detail/music/NowPlayingPage.kt index a6235688..06997742 100644 --- a/app/src/main/java/com/github/damontecres/wholphin/ui/detail/music/NowPlayingPage.kt +++ b/app/src/main/java/com/github/damontecres/wholphin/ui/detail/music/NowPlayingPage.kt @@ -19,6 +19,7 @@ import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.width +import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState @@ -28,6 +29,7 @@ import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip import androidx.compose.ui.draw.drawBehind import androidx.compose.ui.focus.FocusRequester import androidx.compose.ui.focus.focusRequester @@ -165,7 +167,8 @@ fun NowPlayingPage( model = current?.imageUrl, modifier = Modifier - .height(320.dp), + .height(320.dp) + .clip(RoundedCornerShape(16.dp)), ) current?.title?.let { Text( diff --git a/app/src/main/java/com/github/damontecres/wholphin/ui/detail/music/NowPlayingViewModel.kt b/app/src/main/java/com/github/damontecres/wholphin/ui/detail/music/NowPlayingViewModel.kt index 8517cce1..27a075f1 100644 --- a/app/src/main/java/com/github/damontecres/wholphin/ui/detail/music/NowPlayingViewModel.kt +++ b/app/src/main/java/com/github/damontecres/wholphin/ui/detail/music/NowPlayingViewModel.kt @@ -1,6 +1,5 @@ package com.github.damontecres.wholphin.ui.detail.music -import android.content.Context import android.media.audiofx.Visualizer import androidx.datastore.core.DataStore import androidx.lifecycle.ViewModel @@ -13,9 +12,9 @@ import com.github.damontecres.wholphin.data.model.BaseItem import com.github.damontecres.wholphin.preferences.AppPreference import com.github.damontecres.wholphin.preferences.AppPreferences import com.github.damontecres.wholphin.services.BackdropService -import com.github.damontecres.wholphin.services.ImageUrlService import com.github.damontecres.wholphin.services.MusicService import com.github.damontecres.wholphin.services.NavigationManager +import com.github.damontecres.wholphin.services.NowPlayingStatus import com.github.damontecres.wholphin.services.UserPreferencesService import com.github.damontecres.wholphin.ui.launchDefault import com.github.damontecres.wholphin.ui.main.settings.MoveDirection @@ -25,7 +24,6 @@ import com.mayakapps.kache.InMemoryKache import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject import dagger.hilt.android.lifecycle.HiltViewModel -import dagger.hilt.android.qualifiers.ApplicationContext import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.delay @@ -51,12 +49,10 @@ class NowPlayingViewModel @AssistedInject constructor( private val api: ApiClient, - @param:ApplicationContext private val context: Context, - val navigationManager: NavigationManager, private val musicService: MusicService, - private val imageUrlService: ImageUrlService, private val backdropService: BackdropService, private val preferencesDataStore: DataStore, + val navigationManager: NavigationManager, val userPreferencesService: UserPreferencesService, ) : ViewModel(), Visualizer.OnDataCaptureListener, @@ -66,15 +62,11 @@ class NowPlayingViewModel fun create(): NowPlayingViewModel } - private val visualizer by lazy { - Visualizer(player.audioSessionId).apply { - captureSize = Visualizer.getCaptureSizeRange()[1] - } - } + private var visualizer: Visualizer? = null val controllerViewState = ControllerViewState( - AppPreference.Companion.ControllerTimeout.defaultValue, + AppPreference.ControllerTimeout.defaultValue, true, ) @@ -90,20 +82,32 @@ class NowPlayingViewModel init { player.addListener(this) - visualizer.setDataCaptureListener( - this, - Visualizer.getMaxCaptureRate() / 2, - true, - false, - ) - visualizer.enabled = true addCloseable { player.removeListener(this) - visualizer.release() + visualizer?.release() } viewModelScope.launchDefault { musicService.state.collectLatest { musicServiceState -> + if (musicServiceState.status != NowPlayingStatus.IDLE) { + viewModelScope.launchDefault { + if (visualizer == null) { + visualizer = + Visualizer(onMain { player.audioSessionId }).apply { + captureSize = Visualizer.getCaptureSizeRange()[1] + setDataCaptureListener( + this@NowPlayingViewModel, + Visualizer.getMaxCaptureRate() / 2, + true, + false, + ) + } + } + visualizer?.enabled = + musicServiceState.status == NowPlayingStatus.PLAYING + } + } + state.update { it.copy(musicServiceState = musicServiceState) } } } @@ -265,18 +269,10 @@ class NowPlayingViewModel val processed = IntArray(resolution) val captureSize = Visualizer.getCaptureSizeRange()[1] -// val groupSize = captureSize / resolution val groupSize = captureSize / resolution.toFloat() for (i in 0 until resolution) { -// processed[i] = -// waveform -// .map { abs(it.toInt()) } -// .map { it.toInt() } -// .subList(i * groupSize, min((i + 1) * groupSize, waveform.size)) -// .average() -// .toInt() val v = abs(waveform[ceil(i * groupSize).toInt()].toInt()) - processed[i] = v * v / (128) + processed[i] = abs(v * v / (128) - 128) } viz.update { processed } }