Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
61 commits
Select commit Hold shift + click to select a range
074eab2
Increase memory for CI builds (#1954)
damontecres Sep 12, 2026
98fba13
Fix OS screensaver starting during playback with dim enabled (#1956)
damontecres Sep 12, 2026
02163ba
Translated using Weblate (Russian)
Aug 22, 2026
f7c391a
Translated using Weblate (Russian)
Aug 22, 2026
f3239c7
Translated using Weblate (Russian)
Aug 22, 2026
d6eb23d
Translated using Weblate (Portuguese (Brazil))
Aug 23, 2026
9602b4f
Translated using Weblate (Swedish)
Aug 23, 2026
048a5f3
Translated using Weblate (Italian)
Aug 23, 2026
db7cfae
Translated using Weblate (Hebrew)
Aug 24, 2026
4f4e137
Translated using Weblate (Estonian)
Aug 24, 2026
8931bf5
Translated using Weblate (Spanish)
Aug 27, 2026
0b275a2
Translated using Weblate (Estonian)
Aug 27, 2026
c040191
Translated using Weblate (Chinese (Traditional Han script))
Aug 27, 2026
5a9e5c4
Translated using Weblate (Chinese (Simplified Han script))
Aug 27, 2026
e73d096
Translated using Weblate (Italian)
Aug 28, 2026
cbebc9e
Translated using Weblate (Hebrew)
Aug 29, 2026
0398f3f
Translated using Weblate (Slovak)
Aug 29, 2026
cf83266
Translated using Weblate (Swedish)
Aug 31, 2026
7f587b9
Translated using Weblate (Norwegian Bokmål)
Aug 30, 2026
c8d202c
Translated using Weblate (Polish)
Aug 30, 2026
de6cf7f
Translated using Weblate (Portuguese)
Sep 1, 2026
8c2cbcb
Translated using Weblate (English (United Kingdom))
andibing Sep 1, 2026
2ade817
Translated using Weblate (Danish)
Sep 1, 2026
026f8c7
Added translation using Weblate (Lao)
Sep 2, 2026
6e12b0c
Translated using Weblate (Dutch)
Sep 4, 2026
d6b1d77
Translated using Weblate (German)
Sep 5, 2026
114df65
Translated using Weblate (Chinese (Traditional Han script))
Sep 5, 2026
8e050a0
Translated using Weblate (Dutch)
Sep 5, 2026
7b39854
Translated using Weblate (Hebrew)
Sep 4, 2026
1e86616
Translated using Weblate (Turkish)
Sep 4, 2026
5ee6b31
Translated using Weblate (Spanish)
Sep 6, 2026
60a0d63
Translated using Weblate (Estonian)
Sep 5, 2026
3598e30
Translated using Weblate (Greek)
Sep 6, 2026
6647cf3
Translated using Weblate (Swedish)
Sep 7, 2026
c0f6293
Translated using Weblate (Slovak)
Sep 7, 2026
7bd1e99
Translated using Weblate (Indonesian)
Sep 8, 2026
8a570b8
Translated using Weblate (English (United Kingdom))
andibing Sep 7, 2026
bad47eb
Translated using Weblate (Croatian)
Sep 8, 2026
f79c0bd
Translated using Weblate (Portuguese)
Sep 9, 2026
584c356
Translated using Weblate (Swedish)
Sep 9, 2026
0db4d45
Translated using Weblate (Estonian)
Sep 11, 2026
cd0128e
Translated using Weblate (Chinese (Traditional Han script))
Sep 11, 2026
391a38e
Translated using Weblate (Polish)
Sep 11, 2026
923f0b7
Translated using Weblate (Chinese (Traditional Han script))
Sep 12, 2026
f181770
Translated using Weblate (Italian)
Sep 11, 2026
a60433d
Translated using Weblate (Polish)
Sep 12, 2026
af6a3b9
Translated using Weblate (Swedish)
Sep 12, 2026
190c6be
Run pre-commit
damontecres Sep 12, 2026
2fb295c
Translations 2026-09-12 (#1957)
damontecres Sep 12, 2026
45c1cec
Fix favorites not querying for people & fix restoring focus on search…
damontecres Sep 14, 2026
7af7bc0
Release v1.0.8
damontecres Sep 14, 2026
62965ea
Fix CI setup step (#1974)
damontecres Sep 15, 2026
61f7f70
Update dependency org.robolectric:robolectric to v4.17 (#1446)
renovate[bot] Sep 15, 2026
8effd2b
Update actions/setup-java action to v6 (#1907)
renovate[bot] Sep 15, 2026
ffdebd4
Update intent parsing to allow for user switching to home page (#1962)
damontecres Sep 15, 2026
32a56e8
Wait for switched user's home settings before fetching data (#1981)
damontecres Sep 17, 2026
170989c
Guard against crash if episode has `seasonId` but no `seriesId` (#1964)
damontecres Sep 17, 2026
365f8f8
Update android-actions/setup-android digest to be39fa8 (#1986)
renovate[bot] Sep 18, 2026
bc7d7fe
Prepare semantic upstream review 365f8f8adacf4dcaf7d05317917830ed3a43…
github-actions[bot] Sep 21, 2026
ffe5c64
Reconcile Mosaic main c4458a739e2bc9551b69e892f95055994b994c71 into u…
constbogdan Sep 21, 2026
13101e5
Resolve official upstream 365f8f8adacf4dcaf7d05317917830ed3a439668 ag…
constbogdan Sep 21, 2026
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
4 changes: 2 additions & 2 deletions .github/actions/setup/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ runs:
with:
python-version: '3.14'
- name: Set up JDK
uses: actions/setup-java@b6effb05e454b25005698d916606bdc6ffcbf961 # v5
uses: actions/setup-java@de7274f081f381c8f8158605e0321c36c376e2e6 # v6
with:
distribution: zulu
java-version: '21'
Expand All @@ -21,7 +21,7 @@ runs:
echo "BUILD_TOOLS_VERSION=36.0.0" >> $GITHUB_ENV
echo "NDK_VERSION=29.0.14206865" >> $GITHUB_ENV
- name: Set up Android SDK
uses: android-actions/setup-android@40fd30fb8d7440372e1316f5d1809ec01dcd3699 # v4
uses: android-actions/setup-android@be39fa834029ff78f1a44aa3bb0819b8fc2bd8fd # v4
with:
packages: "platform-tools platforms;android-37.0 build-tools;${{ env.BUILD_TOOLS_VERSION }} ndk;${{ env.NDK_VERSION }}"
- name: Add NDK tools to PATH
Expand Down
10 changes: 9 additions & 1 deletion Intents.md
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ Action: `android.intent.action.VIEW`
Shorthand action: `view`

Parameters:
- `itemId` - Required, the UUID of the media item
- `itemId` - Optional, the UUID of the media item, if not set, goes to home screen


### Examples
Expand Down Expand Up @@ -135,12 +135,20 @@ adb shell am start -d 'mosaic://play?itemId=5cf8f8e7-2a5f-4aa9-8c12-ddf63d42ee6d

Full format
```bash
# Switch user, go to item
adb shell am start \
-a android.intent.action.VIEW \
-n 'com.github.damontecres.wholphin/.MainActivity' \
--es itemId "5cf8f8e7-2a5f-4aa9-8c12-ddf63d42ee6d" \
--es serverId "341880f9-ca88-4038-8718-f6b2407950b1" \
--es userId "5c8575e0-468d-44fb-8c70-00aa79160587"

# Switch user, go to home screen
adb shell am start \
-a android.intent.action.VIEW \
-n 'com.github.damontecres.wholphin/.MainActivity' \
--es serverId "341880f9-ca88-4038-8718-f6b2407950b1" \
--es userId "5c8575e0-468d-44fb-8c70-00aa79160587"
```

URI based
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -237,21 +237,30 @@ data class BaseItem(
// Redirect episodes & seasons to their series if possible
when (type) {
BaseItemKind.EPISODE -> {
data.seasonId?.let { seasonId ->
val seasonId = data.seasonId
val seriesId = data.seriesId
if (seasonId != null && seriesId != null) {
Destination.SeriesOverview(
data.seriesId!!,
seriesId,
BaseItemKind.SERIES,
SeasonEpisodeIds(seasonId, data.parentIndexNumber, id, indexNumber),
)
} ?: Destination.MediaItem(this)
} else {
Destination.MediaItem(this)
}
}

BaseItemKind.SEASON -> {
Destination.SeriesOverview(
data.seriesId!!,
BaseItemKind.SERIES,
SeasonEpisodeIds(id, indexNumber, null, null),
)
val seriesId = data.seriesId
if (seriesId != null) {
Destination.SeriesOverview(
seriesId,
BaseItemKind.SERIES,
SeasonEpisodeIds(id, indexNumber, null, null),
)
} else {
Destination.MediaItem(this)
}
}

BaseItemKind.TV_CHANNEL -> {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -245,7 +245,7 @@ class HomeSettingsService
settings.rows.mapIndexed { index, config ->
resolve(index, config)
}
HomePageResolvedSettings(resolvedRows)
HomePageResolvedSettings(userId, resolvedRows)
} else {
createDefault(userId)
}
Expand All @@ -256,12 +256,15 @@ class HomeSettingsService
/**
* Resolve the settings and set them to be the current settings
*/
suspend fun updateCurrent(settings: HomePageSettings) {
suspend fun updateCurrent(
userId: UUID,
settings: HomePageSettings,
) {
val resolvedRows =
settings.rows.mapIndexed { index, config ->
resolve(index, config)
}
val resolvedSettings = HomePageResolvedSettings(resolvedRows)
val resolvedSettings = HomePageResolvedSettings(userId, resolvedRows)
currentSettings.update { resolvedSettings }
}

Expand Down Expand Up @@ -312,7 +315,7 @@ class HomeSettingsService
),
)
val rowConfig = continueWatchingRow + includedIds
return HomePageResolvedSettings(rowConfig)
return HomePageResolvedSettings(userId, rowConfig)
}

/**
Expand Down Expand Up @@ -428,7 +431,7 @@ class HomeSettingsService
null
}
}.flatten()
HomePageResolvedSettings(rowConfigs)
HomePageResolvedSettings(userId, rowConfigs)
} else {
null
}
Expand Down Expand Up @@ -1224,10 +1227,11 @@ data class HomeRowConfigDisplay(
* @see HomePageSettings
*/
data class HomePageResolvedSettings(
val userId: UUID,
val rows: List<HomeRowConfigDisplay>,
) {
companion object {
val EMPTY = HomePageResolvedSettings(listOf())
val EMPTY = HomePageResolvedSettings(UUID.randomUUID(), emptyList())
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,30 +56,37 @@ class IntentService
val query = intent.getStringParam(SearchManager.QUERY)
return IntentResult.Target(listOf(Destination.Search(query ?: "")))
}
val itemId =
intent.getStringParam("itemId")?.toUUIDOrNull()
?: return IntentResult.Error("No item id provided")

val itemId = intent.getStringParam("itemId")?.toUUIDOrNull()
val item =
try {
api.userLibraryApi
.getItem(itemId)
.content
.let { BaseItem(it) }
} catch (ex: Exception) {
Timber.w(ex, "Error fetching item %s", itemId)
return IntentResult.Error("Could not fetch item $itemId")
itemId?.let {
try {
api.userLibraryApi
.getItem(itemId)
.content
.let { BaseItem(it) }
} catch (ex: Exception) {
Timber.w(ex, "Error fetching item %s", itemId)
return IntentResult.Error("Could not fetch item $itemId")
}
}

val itemDestination = item.destination()
val itemDestination = item?.destination()

val destinations =
when (action) {
Intent.ACTION_VIEW, "view" -> {
listOf(itemDestination)
if (itemDestination != null) {
listOf(itemDestination)
} else {
// Will go to the home page
emptyList()
}
}

"${BuildConfig.APPLICATION_ID}.PLAYBACK", "com.github.damontecres.wholphin.PLAYBACK", "play" -> {
if (itemId == null || itemDestination == null) {
return IntentResult.Error("Cannot start playback with no itemId")
}
val position = intent.getLongParam("position")?.coerceAtLeast(0)
val shuffle = intent.getBooleanExtra("shuffle", false)

Expand All @@ -105,7 +112,7 @@ class IntentService
}
}

return IntentResult.Target(destinations)
return IntentResult.Target(destinations, true)
}

internal suspend fun prepare(intent: Intent): IntentResult? {
Expand Down Expand Up @@ -196,6 +203,8 @@ class IntentService
const val INTENT_SEASON_ID = "seaId"
const val INTENT_SERVER_ID = "serverId"
const val INTENT_USER_ID = "userId"

const val ACTION_PLAYBACK = "com.github.damontecres.wholphin.PLAYBACK"
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -173,9 +173,10 @@ class ScreensaverService
*/
fun keepScreenOn(keep: Boolean) {
scope.launchDefault {
val screensaverEnabled = _state.value.run { enabled || dimEnabled }
val screensaverEnabled = state.value.enabled
val dimEnabled = state.value.dimEnabled
Timber.d("Keep screen on: %s, screensaverEnabled=%s", keep, screensaverEnabled)
if (screensaverEnabled) {
if (screensaverEnabled || dimEnabled) {
// Page is requesting to keep screen on, so we don't wait to show the screensaver
_state.update {
it.copy(
Expand All @@ -187,7 +188,9 @@ class ScreensaverService
if (!keep) {
pulse()
}
} else {
}
if (!screensaverEnabled) {
// If in-app screensaver is not enabled, send keep screen on to the OS
keepScreenOnInternal(keep)
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,9 +27,6 @@ class SetupNavigationManager
fun navigateTo(destination: SetupDestination) {
backStack[0] = destination
log()
if (destination !is SetupDestination.AppContent) {
navigationManager.reloadHome()
}
}

private fun log() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -787,7 +787,9 @@ fun List<Library>.possibleFavoriteTypes(sort: Boolean) =
flatMap { it.collectionType.baseItemKinds }
.distinct()
.filter { it in favoriteOptions }
.let { list ->
.let {
// No library for persons, so always include it
val list = it + listOf(BaseItemKind.PERSON)
if (sort) {
list.sortedWith(compareBy { favoriteOptions.indexOf(it) })
} else {
Expand Down
Loading
Loading