From 43e4f64faf7bdba66aed9ed53f9cfbe17f9e02a9 Mon Sep 17 00:00:00 2001 From: Hans-Peter Lehmann Date: Thu, 2 Jul 2026 07:55:14 +0200 Subject: [PATCH] Support dynamic color theme on WearOS (#8559) ### Description Support dynamic color theme on WearOS ### Checklist - [x] I have read the contribution guidelines: https://github.com/AntennaPod/AntennaPod/blob/develop/CONTRIBUTING.md#submit-a-pull-request - [x] I have performed a self-review of my code, going through my changes line by line and carefully considering why this line change is necessary - [x] I have run the automated code checks using `./gradlew checkstyle lint` - [x] My code follows the style guidelines of the AntennaPod project: https://antennapod.org/contribute/develop/app/code-style - [x] I have mentioned the corresponding issue and the relevant keyword (e.g., "Closes: #xy") in the description (see https://docs.github.com/en/issues/tracking-your-work-with-issues/linking-a-pull-request-to-an-issue) - [x] If it is a core feature, I have added automated tests --- .../wearos/EpisodeDetailActivity.kt | 17 ++++---- .../antennapod/wearos/EpisodeListActivity.kt | 22 ++++++----- .../antennapod/wearos/FeedListActivity.kt | 18 +++++---- .../antennapod/wearos/MainListActivity.kt | 39 ++++++++++--------- 4 files changed, 55 insertions(+), 41 deletions(-) diff --git a/app-wearos/src/main/java/de/danoeh/antennapod/wearos/EpisodeDetailActivity.kt b/app-wearos/src/main/java/de/danoeh/antennapod/wearos/EpisodeDetailActivity.kt index 651c2ad63..0532ed4f5 100644 --- a/app-wearos/src/main/java/de/danoeh/antennapod/wearos/EpisodeDetailActivity.kt +++ b/app-wearos/src/main/java/de/danoeh/antennapod/wearos/EpisodeDetailActivity.kt @@ -36,6 +36,7 @@ import androidx.wear.compose.material3.LinearProgressIndicator import androidx.wear.compose.material3.MaterialTheme import androidx.wear.compose.material3.ScrollIndicator import androidx.wear.compose.material3.Text +import androidx.wear.compose.material3.dynamicColorScheme import de.danoeh.antennapod.model.feed.FeedItem import de.danoeh.antennapod.ui.common.Converter import de.danoeh.antennapod.ui.common.DateFormatter @@ -53,13 +54,15 @@ class EpisodeDetailActivity : ComponentActivity() { .get(EpisodeDetailViewModel::class.java) setContent { - val uiState by viewModel.uiState.collectAsState() - EpisodeDetailScreen( - uiState = uiState, - onPlay = { viewModel.play() }, - onPause = { viewModel.pause() }, - onOpenOnPhone = { viewModel.openOnPhone() } - ) + MaterialTheme(colorScheme = dynamicColorScheme(this) ?: MaterialTheme.colorScheme) { + val uiState by viewModel.uiState.collectAsState() + EpisodeDetailScreen( + uiState = uiState, + onPlay = { viewModel.play() }, + onPause = { viewModel.pause() }, + onOpenOnPhone = { viewModel.openOnPhone() } + ) + } } } diff --git a/app-wearos/src/main/java/de/danoeh/antennapod/wearos/EpisodeListActivity.kt b/app-wearos/src/main/java/de/danoeh/antennapod/wearos/EpisodeListActivity.kt index 255f474fa..767f809fc 100644 --- a/app-wearos/src/main/java/de/danoeh/antennapod/wearos/EpisodeListActivity.kt +++ b/app-wearos/src/main/java/de/danoeh/antennapod/wearos/EpisodeListActivity.kt @@ -10,6 +10,8 @@ import androidx.compose.runtime.getValue import androidx.lifecycle.ViewModelProvider import androidx.wear.compose.foundation.lazy.items import androidx.wear.compose.foundation.lazy.rememberScalingLazyListState +import androidx.wear.compose.material3.MaterialTheme +import androidx.wear.compose.material3.dynamicColorScheme import de.danoeh.antennapod.model.feed.FeedItem import de.danoeh.antennapod.wearos.composable.ListItem import de.danoeh.antennapod.wearos.composable.ListScaffold @@ -24,16 +26,18 @@ class EpisodeListActivity : ComponentActivity() { val viewModel = ViewModelProvider(this, EpisodeListViewModel.factory(path))[EpisodeListViewModel::class.java] setContent { - val uiState by viewModel.uiState.collectAsState() - EpisodeListScreen( - uiState = uiState, - onOpenEpisodeDetail = { episode -> - val intent = Intent(this, EpisodeDetailActivity::class.java).apply { - putExtra(EpisodeDetailActivity.EXTRA_EPISODE, episode) + MaterialTheme(colorScheme = dynamicColorScheme(this) ?: MaterialTheme.colorScheme) { + val uiState by viewModel.uiState.collectAsState() + EpisodeListScreen( + uiState = uiState, + onOpenEpisodeDetail = { episode -> + val intent = Intent(this, EpisodeDetailActivity::class.java).apply { + putExtra(EpisodeDetailActivity.EXTRA_EPISODE, episode) + } + startActivity(intent) } - startActivity(intent) - } - ) + ) + } } } diff --git a/app-wearos/src/main/java/de/danoeh/antennapod/wearos/FeedListActivity.kt b/app-wearos/src/main/java/de/danoeh/antennapod/wearos/FeedListActivity.kt index b2452cfe3..009558a96 100644 --- a/app-wearos/src/main/java/de/danoeh/antennapod/wearos/FeedListActivity.kt +++ b/app-wearos/src/main/java/de/danoeh/antennapod/wearos/FeedListActivity.kt @@ -10,6 +10,8 @@ import androidx.compose.runtime.getValue import androidx.lifecycle.ViewModelProvider import androidx.wear.compose.foundation.lazy.items import androidx.wear.compose.foundation.lazy.rememberScalingLazyListState +import androidx.wear.compose.material3.MaterialTheme +import androidx.wear.compose.material3.dynamicColorScheme import de.danoeh.antennapod.model.feed.Feed import de.danoeh.antennapod.net.sync.wearinterface.WearDataPaths import de.danoeh.antennapod.wearos.composable.ListItem @@ -21,13 +23,15 @@ class FeedListActivity : ComponentActivity() { val viewModel = ViewModelProvider(this)[FeedListViewModel::class.java] setContent { - val uiState by viewModel.uiState.collectAsState() - FeedListScreen(uiState = uiState, onOpenFeedEpisodes = { feedId -> - val intent = Intent(this, EpisodeListActivity::class.java).apply { - putExtra(EpisodeListActivity.EXTRA_PATH, WearDataPaths.feedEpisodesPath(feedId)) - } - startActivity(intent) - }) + MaterialTheme(colorScheme = dynamicColorScheme(this) ?: MaterialTheme.colorScheme) { + val uiState by viewModel.uiState.collectAsState() + FeedListScreen(uiState = uiState, onOpenFeedEpisodes = { feedId -> + val intent = Intent(this, EpisodeListActivity::class.java).apply { + putExtra(EpisodeListActivity.EXTRA_PATH, WearDataPaths.feedEpisodesPath(feedId)) + } + startActivity(intent) + }) + } } } } diff --git a/app-wearos/src/main/java/de/danoeh/antennapod/wearos/MainListActivity.kt b/app-wearos/src/main/java/de/danoeh/antennapod/wearos/MainListActivity.kt index 0badff686..419781a97 100644 --- a/app-wearos/src/main/java/de/danoeh/antennapod/wearos/MainListActivity.kt +++ b/app-wearos/src/main/java/de/danoeh/antennapod/wearos/MainListActivity.kt @@ -25,6 +25,7 @@ import androidx.wear.compose.material3.ListHeader import androidx.wear.compose.material3.MaterialTheme import androidx.wear.compose.material3.ScrollIndicator import androidx.wear.compose.material3.Text +import androidx.wear.compose.material3.dynamicColorScheme import de.danoeh.antennapod.model.feed.FeedItem import de.danoeh.antennapod.net.sync.wearinterface.WearDataPaths import de.danoeh.antennapod.ui.common.R as CommonR @@ -36,25 +37,27 @@ class MainListActivity : ComponentActivity() { val viewModel = ViewModelProvider(this)[MainViewModel::class.java] setContent { - val uiState by viewModel.uiState.collectAsState() - MainListScreen( - uiState = uiState, - onOpenEpisodeDetail = { episode -> - val intent = Intent(this, EpisodeDetailActivity::class.java).apply { - putExtra(EpisodeDetailActivity.EXTRA_EPISODE, episode) + MaterialTheme(colorScheme = dynamicColorScheme(this) ?: MaterialTheme.colorScheme) { + val uiState by viewModel.uiState.collectAsState() + MainListScreen( + uiState = uiState, + onOpenEpisodeDetail = { episode -> + val intent = Intent(this, EpisodeDetailActivity::class.java).apply { + putExtra(EpisodeDetailActivity.EXTRA_EPISODE, episode) + } + startActivity(intent) + }, + onOpenFeedList = { + startActivity(Intent(this, FeedListActivity::class.java)) + }, + onOpenEpisodeList = { path -> + val intent = Intent(this, EpisodeListActivity::class.java).apply { + putExtra(EpisodeListActivity.EXTRA_PATH, path) + } + startActivity(intent) } - startActivity(intent) - }, - onOpenFeedList = { - startActivity(Intent(this, FeedListActivity::class.java)) - }, - onOpenEpisodeList = { path -> - val intent = Intent(this, EpisodeListActivity::class.java).apply { - putExtra(EpisodeListActivity.EXTRA_PATH, path) - } - startActivity(intent) - } - ) + ) + } } } }