diff --git a/.github/workflows/build_windows.yml b/.github/workflows/build_windows.yml
index c7b5e1500..5548bb698 100644
--- a/.github/workflows/build_windows.yml
+++ b/.github/workflows/build_windows.yml
@@ -7,7 +7,7 @@ on:
pull_request:
concurrency:
- group: build-${{ github.ref }}
+ group: build-on-windows-${{ github.ref }}
cancel-in-progress: true
jobs:
diff --git a/.github/workflows/gradle_wrapper_validation.yml b/.github/workflows/gradle_wrapper_validation.yml
index 67fa2f6b6..bad869271 100644
--- a/.github/workflows/gradle_wrapper_validation.yml
+++ b/.github/workflows/gradle_wrapper_validation.yml
@@ -7,7 +7,7 @@ on:
pull_request:
concurrency:
- group: build-${{ github.ref }}
+ group: gradle-wrapper-validation-${{ github.ref }}
cancel-in-progress: true
jobs:
diff --git a/buildSrc/src/main/java/AppConfig.kt b/buildSrc/src/main/java/AppConfig.kt
index abb4bb3a8..e0e53a436 100644
--- a/buildSrc/src/main/java/AppConfig.kt
+++ b/buildSrc/src/main/java/AppConfig.kt
@@ -12,9 +12,6 @@ object AppConfig {
const val compileSdk = 34
val javaVersion = JavaVersion.VERSION_17
- // https://developer.android.com/jetpack/androidx/releases/compose-kotlin
- const val composeCompiler = "1.5.8"
-
@Suppress("SimpleDateFormat")
fun getBuildDate(): String {
val sdf = java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
diff --git a/buildSrc/src/main/java/VersionConfig.kt b/buildSrc/src/main/java/VersionConfig.kt
index ce638900d..eda02fa56 100644
--- a/buildSrc/src/main/java/VersionConfig.kt
+++ b/buildSrc/src/main/java/VersionConfig.kt
@@ -10,57 +10,42 @@
*/
object VersionConfig {
/**
- * Environement variable automatically set by Github actions.
- * @see [github](https://docs.github.com/en/actions/learn-github-actions/variables#default-environment-variables)
+ * Environment variable automatically set by GitHub actions.
+ * @see [GitHub](https://docs.github.com/en/actions/learn-github-actions/variables#default-environment-variables)
*/
val isCI: Boolean = System.getenv("CI")?.toBooleanStrictOrNull() ?: false
/**
- * Environement variable set by workflow.
+ * Environment variable set by workflow.
*/
private val ENV_VERSION_NAME: String? = System.getenv("VERSION_NAME")
- private val versionRegex = "[0-9]+.[0-9].[0-9]-?\\S*".toRegex()
private val versionOnlyRegex = "[0-9]+.[0-9].[0-9]".toRegex()
- private val versionSuffixRegex = "-\\S*".toRegex()
/**
* Maven artifact group
*/
const val GROUP = "ch.srgssr.pillarbox"
- /**
- * Semantic version
- * @return Major.Minor.Patch string from [ENV_VERSION_NAME] or null if not set.
- */
- fun semanticVersion(): String? {
- return ENV_VERSION_NAME?.let { versionOnlyRegex.find(it)?.value }
- }
-
/**
* Version name
*
- * @return Local if [ENV_VERSION_NAME] no set.
+ * @return "Local" if [ENV_VERSION_NAME] no set.
*/
fun versionName(): String {
return ENV_VERSION_NAME ?: "Local"
}
- /**
- * @return -suffix from MARJOR.MINOR.PATCH-Suffix
- */
- fun versionNameSuffix(): String? {
- return ENV_VERSION_NAME?.let { versionSuffixRegex.find(it)?.value }
- }
-
/**
* Version code
* It assumes that major.minor.patch each <= 99
* 0.0.0, 0.0.99, 0.1.0, 0.99.99
*/
fun versionCode(): Int {
- return semanticVersion()?.let {
- val versions = it.split(".").map { value -> value.toInt() }
- versions[0] * 10000 + versions[1] * 100 + versions[2]
- } ?: 9999
+ return ENV_VERSION_NAME
+ ?.let { versionOnlyRegex.find(it)?.value }
+ ?.let {
+ val versions = it.split(".").map { value -> value.toInt() }
+ versions[0] * 10000 + versions[1] * 100 + versions[2]
+ } ?: 9999
}
}
diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml
index 7c3b6b7f7..836a0a617 100644
--- a/gradle/libs.versions.toml
+++ b/gradle/libs.versions.toml
@@ -1,16 +1,18 @@
[versions]
-accompanist = "0.32.0"
-android-gradle-plugin = "8.2.1"
+accompanist = "0.34.0"
+android-gradle-plugin = "8.2.2"
androidx-activity = "1.8.2"
androidx-annotation = "1.7.1"
-androidx-compose = "2023.10.01"
+androidx-compose = "2024.02.00"
+# https://developer.android.com/jetpack/androidx/releases/compose-kotlin
+androidx-compose-compiler = "1.5.9"
androidx-core = "1.12.0"
androidx-fragment = "1.6.2"
androidx-leanback = "1.0.0"
androidx-lifecycle = "2.7.0"
androidx-media = "1.7.0"
androidx-media3 = "1.2.1"
-androidx-navigation = "2.7.6"
+androidx-navigation = "2.7.7"
androidx-paging = "3.2.1"
androidx-test-core = "1.5.0"
androidx-test-ext-junit = "1.1.5"
@@ -20,7 +22,7 @@ androidx-tv = "1.0.0-alpha10"
coil = "2.5.0"
comscore = "6.10.0"
dependency-analysis-gradle-plugin = "1.29.0"
-detekt = "1.23.4"
+detekt = "1.23.5"
guava = "31.1-android"
jacoco = "0.8.11"
json = "20231013"
@@ -29,12 +31,12 @@ kotlin = "1.9.22"
kotlinx-coroutines = "1.7.3"
kotlinx-kover = "0.7.5"
kotlinx-serialization = "1.6.2"
-ktor = "2.3.7"
+ktor = "2.3.8"
mockk = "1.13.9"
okhttp = "4.12.0"
robolectric = "4.11.1"
srg-data-provider = "0.8.0"
-tag-commander-core = "5.4.2"
+tag-commander-core = "5.4.3"
tag-commander-server-side = "5.5.2"
turbine = "1.0.0"
diff --git a/pillarbox-analytics/build.gradle.kts b/pillarbox-analytics/build.gradle.kts
index de9e73091..05e1c3cec 100644
--- a/pillarbox-analytics/build.gradle.kts
+++ b/pillarbox-analytics/build.gradle.kts
@@ -43,6 +43,7 @@ android {
}
buildFeatures {
buildConfig = true
+ resValues = false
}
publishing {
singleVariant("release") {
diff --git a/pillarbox-analytics/src/main/AndroidManifest.xml b/pillarbox-analytics/src/main/AndroidManifest.xml
index 8551f6b43..45afd74bf 100644
--- a/pillarbox-analytics/src/main/AndroidManifest.xml
+++ b/pillarbox-analytics/src/main/AndroidManifest.xml
@@ -2,6 +2,4 @@
~ Copyright (c) SRG SSR. All rights reserved.
~ License information is available from the LICENSE file.
-->
-
-
-
+
diff --git a/pillarbox-core-business/build.gradle.kts b/pillarbox-core-business/build.gradle.kts
index d2ec25a36..93ab2f874 100644
--- a/pillarbox-core-business/build.gradle.kts
+++ b/pillarbox-core-business/build.gradle.kts
@@ -38,6 +38,7 @@ android {
}
buildFeatures {
buildConfig = true
+ resValues = false
}
publishing {
singleVariant("release") {
diff --git a/pillarbox-core-business/src/androidTest/java/ch/srgssr/pillarbox/core/business/CommandersActTrackerTest.kt b/pillarbox-core-business/src/androidTest/java/ch/srgssr/pillarbox/core/business/CommandersActTrackerTest.kt
index 92cd48feb..54d96f367 100644
--- a/pillarbox-core-business/src/androidTest/java/ch/srgssr/pillarbox/core/business/CommandersActTrackerTest.kt
+++ b/pillarbox-core-business/src/androidTest/java/ch/srgssr/pillarbox/core/business/CommandersActTrackerTest.kt
@@ -31,7 +31,6 @@ import kotlin.time.Duration.Companion.seconds
class CommandersActTrackerTest {
private lateinit var commandersActDelegate: CommandersActDelegate
-
@Before
fun setup() {
CommandersActStreaming.HEART_BEAT_DELAY = HEART_BEAT_DELAY
@@ -259,7 +258,6 @@ class CommandersActTrackerTest {
val eventNames = ArrayList()
val events = ArrayList()
-
override fun sendTcMediaEvent(event: TCMediaEvent) {
if (event.isPeriodicEvent() && ignorePeriodicEvents) return
eventNames.add(event.name)
diff --git a/pillarbox-core-business/src/androidTest/java/ch/srgssr/pillarbox/core/business/LocalMediaCompositionDataSource.kt b/pillarbox-core-business/src/androidTest/java/ch/srgssr/pillarbox/core/business/LocalMediaCompositionDataSource.kt
index a343fd578..7a295275b 100644
--- a/pillarbox-core-business/src/androidTest/java/ch/srgssr/pillarbox/core/business/LocalMediaCompositionDataSource.kt
+++ b/pillarbox-core-business/src/androidTest/java/ch/srgssr/pillarbox/core/business/LocalMediaCompositionDataSource.kt
@@ -40,5 +40,4 @@ class LocalMediaCompositionDataSource(context: Context) : MediaCompositionDataSo
*/
const val VodShort = "urn:rts:video:13444428"
}
-
}
diff --git a/pillarbox-demo-shared/build.gradle.kts b/pillarbox-demo-shared/build.gradle.kts
index 2a793c0f8..efc908347 100644
--- a/pillarbox-demo-shared/build.gradle.kts
+++ b/pillarbox-demo-shared/build.gradle.kts
@@ -31,6 +31,9 @@ android {
kotlinOptions {
jvmTarget = AppConfig.javaVersion.majorVersion
}
+ buildFeatures {
+ resValues = false
+ }
}
dependencies {
diff --git a/pillarbox-demo-shared/src/main/AndroidManifest.xml b/pillarbox-demo-shared/src/main/AndroidManifest.xml
index 8551f6b43..45afd74bf 100644
--- a/pillarbox-demo-shared/src/main/AndroidManifest.xml
+++ b/pillarbox-demo-shared/src/main/AndroidManifest.xml
@@ -2,6 +2,4 @@
~ Copyright (c) SRG SSR. All rights reserved.
~ License information is available from the LICENSE file.
-->
-
-
-
+
diff --git a/pillarbox-demo-shared/src/main/java/ch/srgssr/pillarbox/demo/shared/ui/HomeDestination.kt b/pillarbox-demo-shared/src/main/java/ch/srgssr/pillarbox/demo/shared/ui/HomeDestination.kt
index 7f3867299..d3f1db2e0 100644
--- a/pillarbox-demo-shared/src/main/java/ch/srgssr/pillarbox/demo/shared/ui/HomeDestination.kt
+++ b/pillarbox-demo-shared/src/main/java/ch/srgssr/pillarbox/demo/shared/ui/HomeDestination.kt
@@ -6,10 +6,10 @@ package ch.srgssr.pillarbox.demo.shared.ui
import androidx.annotation.StringRes
import androidx.compose.material.icons.Icons
+import androidx.compose.material.icons.automirrored.filled.ViewList
import androidx.compose.material.icons.filled.Home
import androidx.compose.material.icons.filled.Movie
import androidx.compose.material.icons.filled.Search
-import androidx.compose.material.icons.filled.ViewList
import androidx.compose.ui.graphics.vector.ImageVector
import androidx.navigation.NavController
import androidx.navigation.NavGraph.Companion.findStartDestination
@@ -40,7 +40,7 @@ sealed class HomeDestination(
/**
* Integration layer list home page
*/
- data object Lists : HomeDestination(NavigationRoutes.homeLists, R.string.lists, Icons.Default.ViewList)
+ data object Lists : HomeDestination(NavigationRoutes.homeLists, R.string.lists, Icons.AutoMirrored.Filled.ViewList)
/**
* Info home page
diff --git a/pillarbox-demo-tv/build.gradle.kts b/pillarbox-demo-tv/build.gradle.kts
index eec7dd968..540d0bb9d 100644
--- a/pillarbox-demo-tv/build.gradle.kts
+++ b/pillarbox-demo-tv/build.gradle.kts
@@ -48,6 +48,7 @@ android {
}
buildFeatures {
compose = true
+ resValues = false
}
lint {
// https://developer.android.com/reference/tools/gradle-api/8.1/com/android/build/api/dsl/Lint
@@ -58,7 +59,7 @@ android {
sarifOutput = file("${rootProject.rootDir}/build/reports/android-lint/pillarbox-demo-tv.sarif")
}
composeOptions {
- kotlinCompilerExtensionVersion = AppConfig.composeCompiler
+ kotlinCompilerExtensionVersion = libs.versions.androidx.compose.compiler.get()
}
}
diff --git a/pillarbox-demo/build.gradle.kts b/pillarbox-demo/build.gradle.kts
index 456e755ae..2044b5cff 100644
--- a/pillarbox-demo/build.gradle.kts
+++ b/pillarbox-demo/build.gradle.kts
@@ -68,10 +68,11 @@ android {
buildFeatures {
buildConfig = true
compose = true
+ resValues = false
}
composeOptions {
- kotlinCompilerExtensionVersion = AppConfig.composeCompiler
+ kotlinCompilerExtensionVersion = libs.versions.androidx.compose.compiler.get()
}
lint {
// https://developer.android.com/reference/tools/gradle-api/8.1/com/android/build/api/dsl/Lint
diff --git a/pillarbox-demo/src/main/java/ch/srgssr/pillarbox/demo/MainNavigation.kt b/pillarbox-demo/src/main/java/ch/srgssr/pillarbox/demo/MainNavigation.kt
index 9d9df9101..7b107ee22 100644
--- a/pillarbox-demo/src/main/java/ch/srgssr/pillarbox/demo/MainNavigation.kt
+++ b/pillarbox-demo/src/main/java/ch/srgssr/pillarbox/demo/MainNavigation.kt
@@ -6,7 +6,7 @@ package ch.srgssr.pillarbox.demo
import androidx.compose.foundation.layout.padding
import androidx.compose.material.icons.Icons
-import androidx.compose.material.icons.filled.ArrowBack
+import androidx.compose.material.icons.automirrored.filled.ArrowBack
import androidx.compose.material.icons.filled.Check
import androidx.compose.material.icons.filled.Settings
import androidx.compose.material3.DropdownMenu
@@ -97,7 +97,7 @@ fun MainNavigation() {
if (!topLevelRoutes.contains(it)) {
IconButton(onClick = { navController.navigateUp() }) {
Icon(
- imageVector = Icons.Default.ArrowBack,
+ imageVector = Icons.AutoMirrored.Filled.ArrowBack,
contentDescription = stringResource(R.string.navigate_up)
)
}
diff --git a/pillarbox-demo/src/main/java/ch/srgssr/pillarbox/demo/ui/player/SimplePlayerViewModel.kt b/pillarbox-demo/src/main/java/ch/srgssr/pillarbox/demo/ui/player/SimplePlayerViewModel.kt
index 4233c8e76..e3115c587 100644
--- a/pillarbox-demo/src/main/java/ch/srgssr/pillarbox/demo/ui/player/SimplePlayerViewModel.kt
+++ b/pillarbox-demo/src/main/java/ch/srgssr/pillarbox/demo/ui/player/SimplePlayerViewModel.kt
@@ -21,7 +21,6 @@ import ch.srgssr.pillarbox.demo.shared.data.DemoItem
import ch.srgssr.pillarbox.demo.shared.di.PlayerModule
import ch.srgssr.pillarbox.player.extension.toRational
import kotlinx.coroutines.flow.MutableStateFlow
-import kotlinx.coroutines.flow.StateFlow
import java.net.URL
/**
@@ -33,15 +32,6 @@ class SimplePlayerViewModel(application: Application, ilHost: URL) : AndroidView
*/
val player = PlayerModule.provideDefaultPlayer(application, ilHost)
- private val _pauseOnBackground = MutableStateFlow(true)
- private val _displayNotification = MutableStateFlow(false)
-
- /**
- * Pause on background state
- * True means playback is paused when Activity goes in background
- */
- val pauseOnBackground: StateFlow = _pauseOnBackground
-
/**
* Picture in picture enabled
*/
@@ -84,29 +74,6 @@ class SimplePlayerViewModel(application: Application, ilHost: URL) : AndroidView
player.play()
}
- /**
- * Enable pause on background
- *
- * @param enabled
- */
- fun enablePauseOnBackground(enabled: Boolean) {
- _pauseOnBackground.value = enabled
- }
-
- /**
- * Toggle pause on background
- */
- fun togglePauseOnBackground() {
- _pauseOnBackground.value = !_pauseOnBackground.value
- }
-
- /**
- * Toggle display notification
- */
- fun toggleDisplayNotification() {
- _displayNotification.value = !_displayNotification.value
- }
-
override fun onCleared() {
super.onCleared()
Log.d(TAG, "onCleared => releasing the player")
diff --git a/pillarbox-demo/src/main/java/ch/srgssr/pillarbox/demo/ui/player/controls/PlaybackSettingsDropDownMenu.kt b/pillarbox-demo/src/main/java/ch/srgssr/pillarbox/demo/ui/player/controls/PlaybackSettingsDropDownMenu.kt
deleted file mode 100644
index 5fd137940..000000000
--- a/pillarbox-demo/src/main/java/ch/srgssr/pillarbox/demo/ui/player/controls/PlaybackSettingsDropDownMenu.kt
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Copyright (c) SRG SSR. All rights reserved.
- * License information is available from the LICENSE file.
- */
-package ch.srgssr.pillarbox.demo.ui.player.controls
-
-import androidx.compose.foundation.layout.padding
-import androidx.compose.material.icons.Icons
-import androidx.compose.material.icons.filled.Check
-import androidx.compose.material3.Divider
-import androidx.compose.material3.DropdownMenu
-import androidx.compose.material3.DropdownMenuItem
-import androidx.compose.material3.Icon
-import androidx.compose.material3.MaterialTheme
-import androidx.compose.material3.Text
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.getValue
-import androidx.compose.ui.Modifier
-import androidx.media3.common.Player
-import ch.srgssr.pillarbox.demo.ui.theme.paddings
-import ch.srgssr.pillarbox.ui.extension.playbackSpeedAsState
-
-private val speeds = mapOf(
- Pair("0.25", 0.25f),
- Pair("0.5", 0.5f),
- Pair("0.75", 0.75f),
- Pair("Normal", 1.0f),
- Pair("1.25", 1.25f),
- Pair("1.5", 1.5f),
- Pair("2", 2.0f),
-)
-
-/**
- * Playback settings drop down menu
- *
- * @param player The player to display the settings.
- * @param expanded display or not the menu
- * @param onDismissed action when dismissing the menu.
- */
-@Composable
-fun PlaybackSettingsDropDownMenu(
- player: Player,
- expanded: Boolean = false,
- onDismissed: () -> Unit = {},
-) {
- val currentPlaybackSpeed by player.playbackSpeedAsState()
- DropdownMenu(expanded = expanded, onDismissRequest = onDismissed) {
- Text(
- text = "Playbacks options",
- modifier = Modifier.padding(horizontal = MaterialTheme.paddings.baseline)
- )
- Divider()
- for (speed in speeds) {
- val selected = speed.value == currentPlaybackSpeed
- DropdownMenuItem(
- text = {
- Text(speed.key)
- if (selected) {
- Icon(imageVector = Icons.Default.Check, contentDescription = "Selected")
- }
- },
- enabled = !selected,
- onClick = {
- player.setPlaybackSpeed(speed.value)
- onDismissed()
- }
- )
- Divider()
- }
- }
-}
diff --git a/pillarbox-player-testutils/build.gradle.kts b/pillarbox-player-testutils/build.gradle.kts
index 1b6f94066..f0a91a529 100644
--- a/pillarbox-player-testutils/build.gradle.kts
+++ b/pillarbox-player-testutils/build.gradle.kts
@@ -39,6 +39,9 @@ android {
kotlinOptions {
jvmTarget = AppConfig.javaVersion.majorVersion
}
+ buildFeatures {
+ resValues = false
+ }
}
dependencies {
diff --git a/pillarbox-player-testutils/src/main/AndroidManifest.xml b/pillarbox-player-testutils/src/main/AndroidManifest.xml
index c8d085c00..318bb552a 100644
--- a/pillarbox-player-testutils/src/main/AndroidManifest.xml
+++ b/pillarbox-player-testutils/src/main/AndroidManifest.xml
@@ -2,8 +2,8 @@
~ Copyright (c) SRG SSR. All rights reserved.
~ License information is available from the LICENSE file.
-->
-
+
Unit) {
+ private fun notifyAll(run: (player: AnalyticsListener) -> Unit) {
val list = listeners.toList()
for (listener in list) {
run(listener)
diff --git a/pillarbox-player/build.gradle.kts b/pillarbox-player/build.gradle.kts
index b2a1062e2..34ade538d 100644
--- a/pillarbox-player/build.gradle.kts
+++ b/pillarbox-player/build.gradle.kts
@@ -40,6 +40,7 @@ android {
}
buildFeatures {
buildConfig = true
+ resValues = false
}
publishing {
singleVariant("release") {
diff --git a/pillarbox-player/src/main/java/ch/srgssr/pillarbox/player/source/PillarboxMediaSource.kt b/pillarbox-player/src/main/java/ch/srgssr/pillarbox/player/source/PillarboxMediaSource.kt
index c82017cc0..957286c0f 100644
--- a/pillarbox-player/src/main/java/ch/srgssr/pillarbox/player/source/PillarboxMediaSource.kt
+++ b/pillarbox-player/src/main/java/ch/srgssr/pillarbox/player/source/PillarboxMediaSource.kt
@@ -63,8 +63,8 @@ class PillarboxMediaSource(
* @return
*/
override fun canUpdateMediaItem(mediaItem: MediaItem): Boolean {
- if (mediaItem.mediaId != this.mediaItem.mediaId || mediaItem.localConfiguration != this.mediaItem.localConfiguration) return false
- return true
+ return mediaItem.mediaId == this.mediaItem.mediaId &&
+ mediaItem.localConfiguration == this.mediaItem.localConfiguration
}
override fun updateMediaItem(mediaItem: MediaItem) {
diff --git a/pillarbox-ui/build.gradle.kts b/pillarbox-ui/build.gradle.kts
index 0dbb442e9..6c82b550b 100644
--- a/pillarbox-ui/build.gradle.kts
+++ b/pillarbox-ui/build.gradle.kts
@@ -37,9 +37,10 @@ android {
}
buildFeatures {
compose = true
+ resValues = false
}
composeOptions {
- kotlinCompilerExtensionVersion = AppConfig.composeCompiler
+ kotlinCompilerExtensionVersion = libs.versions.androidx.compose.compiler.get()
}
publishing {
singleVariant("release") {
diff --git a/pillarbox-ui/src/main/AndroidManifest.xml b/pillarbox-ui/src/main/AndroidManifest.xml
index 8551f6b43..45afd74bf 100644
--- a/pillarbox-ui/src/main/AndroidManifest.xml
+++ b/pillarbox-ui/src/main/AndroidManifest.xml
@@ -2,6 +2,4 @@
~ Copyright (c) SRG SSR. All rights reserved.
~ License information is available from the LICENSE file.
-->
-
-
-
+
diff --git a/settings.gradle.kts b/settings.gradle.kts
index 99f0f5c0e..7e53fc23d 100644
--- a/settings.gradle.kts
+++ b/settings.gradle.kts
@@ -36,11 +36,13 @@ dependencyResolutionManagement {
rootProject.name = "Pillarbox"
-include(":pillarbox-demo")
-include(":pillarbox-player")
-include(":pillarbox-analytics")
-include(":pillarbox-core-business")
-include(":pillarbox-ui")
-include(":pillarbox-player-testutils")
-include(":pillarbox-demo-tv")
-include(":pillarbox-demo-shared")
+include(
+ ":pillarbox-analytics",
+ ":pillarbox-core-business",
+ ":pillarbox-demo",
+ ":pillarbox-demo-shared",
+ ":pillarbox-demo-tv",
+ ":pillarbox-player",
+ ":pillarbox-player-testutils",
+ ":pillarbox-ui",
+)