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", +)