From 75f81875265fb0999db6059508de3a5d8c3c4723 Mon Sep 17 00:00:00 2001 From: Se7en-dev Date: Thu, 2 Jul 2026 20:26:12 +0200 Subject: [PATCH] feat(waze patch): waze media menu browse source options --- .../ui/screens/patchopts/KnownPatch.kt | 16 ++++++ .../ui/screens/patchopts/PatchOption.kt | 2 +- .../ui/screens/patchopts/PatchSpec.kt | 2 +- .../components/PatchAdvancedOptionsSheet.kt | 33 +++++++++++ Manager/app/src/main/res/values/strings.xml | 4 ++ patches/manifest.json | 17 +++++- patches/waze-media-browser.patch | 56 +++++++++++++++---- 7 files changed, 115 insertions(+), 15 deletions(-) diff --git a/Manager/app/src/main/kotlin/com/meowarex/rlmobile/ui/screens/patchopts/KnownPatch.kt b/Manager/app/src/main/kotlin/com/meowarex/rlmobile/ui/screens/patchopts/KnownPatch.kt index 3f1c27e..fce43e7 100644 --- a/Manager/app/src/main/kotlin/com/meowarex/rlmobile/ui/screens/patchopts/KnownPatch.kt +++ b/Manager/app/src/main/kotlin/com/meowarex/rlmobile/ui/screens/patchopts/KnownPatch.kt @@ -140,6 +140,22 @@ enum class KnownPatch( titleRes = R.string.patch_waze_integration_title, descRes = R.string.patch_waze_integration_desc, default = Disabled, + advancedOptions = listOf( + PatchOption.Choice( + key = "browse_root", + titleRes = R.string.patch_waze_browse_root_title, + entries = listOf( + ChoiceEntry(R.string.patch_waze_root_auto, value = "ROOT_AUTO"), + ChoiceEntry(R.string.patch_waze_root_home, value = "HOME_V2::home_page_v2_id"), + ChoiceEntry( + R.string.patch_waze_root_recents, + value = "RECENTLY_PLAYED::home/pages/CONTINUE_LISTEN_TO/view-all", + ), + ), + defaultIndex = 0, + token = "RL_WAZE_ROOT_ID", + ), + ), ), LyricsProgressPill( order = 40, diff --git a/Manager/app/src/main/kotlin/com/meowarex/rlmobile/ui/screens/patchopts/PatchOption.kt b/Manager/app/src/main/kotlin/com/meowarex/rlmobile/ui/screens/patchopts/PatchOption.kt index 4ce2e8e..78d895b 100644 --- a/Manager/app/src/main/kotlin/com/meowarex/rlmobile/ui/screens/patchopts/PatchOption.kt +++ b/Manager/app/src/main/kotlin/com/meowarex/rlmobile/ui/screens/patchopts/PatchOption.kt @@ -59,7 +59,7 @@ sealed interface PatchOption { data class Choice( override val key: String, @StringRes override val titleRes: Int, - @StringRes override val descRes: Int, + @StringRes override val descRes: Int = 0, val entries: List, val defaultIndex: Int = 0, val requiresOption: String? = null, diff --git a/Manager/app/src/main/kotlin/com/meowarex/rlmobile/ui/screens/patchopts/PatchSpec.kt b/Manager/app/src/main/kotlin/com/meowarex/rlmobile/ui/screens/patchopts/PatchSpec.kt index 22aa3d7..c0bca4c 100644 --- a/Manager/app/src/main/kotlin/com/meowarex/rlmobile/ui/screens/patchopts/PatchSpec.kt +++ b/Manager/app/src/main/kotlin/com/meowarex/rlmobile/ui/screens/patchopts/PatchSpec.kt @@ -187,7 +187,7 @@ private fun PatchOption.toSpec(resolve: (Int) -> String): OptionSpec = when (thi is PatchOption.Choice -> OptionSpec.Choice( key = key, title = resolve(titleRes), - description = resolve(descRes), + description = if (descRes != 0) resolve(descRes) else "", entries = entries.map { resolve(it.labelRes) }, defaultIndex = defaultIndex, values = entries.map { it.value ?: "" }, diff --git a/Manager/app/src/main/kotlin/com/meowarex/rlmobile/ui/screens/patchopts/components/PatchAdvancedOptionsSheet.kt b/Manager/app/src/main/kotlin/com/meowarex/rlmobile/ui/screens/patchopts/components/PatchAdvancedOptionsSheet.kt index 6c1b8cf..f21d4d5 100644 --- a/Manager/app/src/main/kotlin/com/meowarex/rlmobile/ui/screens/patchopts/components/PatchAdvancedOptionsSheet.kt +++ b/Manager/app/src/main/kotlin/com/meowarex/rlmobile/ui/screens/patchopts/components/PatchAdvancedOptionsSheet.kt @@ -378,6 +378,39 @@ private fun ChoiceOptionRow( textAlign = TextAlign.Center, ) } + if (entries.size > 3) { + var expanded by rememberSaveable { mutableStateOf(false) } + val selectedLabel = entries.getOrNull(selectedIndex).orEmpty() + + Box(modifier = Modifier.fillMaxWidth()) { + OutlinedButton( + onClick = { expanded = true }, + modifier = Modifier.fillMaxWidth(), + ) { + Text( + text = selectedLabel, + maxLines = 1, + overflow = TextOverflow.Ellipsis, + ) + } + DropdownMenu( + expanded = expanded, + onDismissRequest = { expanded = false }, + modifier = Modifier.fillMaxWidth(), + ) { + entries.forEachIndexed { index, entry -> + DropdownMenuItem( + text = { Text(entry) }, + onClick = { + onSelect(index) + expanded = false + }, + ) + } + } + } + return@Column + } SingleChoiceSegmentedButtonRow(modifier = Modifier.fillMaxWidth()) { entries.forEachIndexed { index, entry -> SegmentedButton( diff --git a/Manager/app/src/main/res/values/strings.xml b/Manager/app/src/main/res/values/strings.xml index a6db93e..3241b18 100644 --- a/Manager/app/src/main/res/values/strings.xml +++ b/Manager/app/src/main/res/values/strings.xml @@ -288,6 +288,10 @@ >Reveals TIDAL\'s hidden Debug Menu in Settings. (Unlocks Feature Flags & the legacy Debug Options) Waze Integration Control TIDAL playback from the Waze app + Media Menu + Auto Menu + Home + Recents Enable Legacy UI b:Ljava/lang/String; +@@ -801,6 +801,26 @@ +- + -+ const-string/jumbo v14, "com.waze" + .line 236 + :goto_8 ++ const-string/jumbo v5, "com.waze" + -+ invoke-static {v15, v14}, Lkotlin/jvm/internal/n;->b(Ljava/lang/Object;Ljava/lang/Object;)Z # check caller ++ invoke-static {v3, v5}, Lkotlin/jvm/internal/n;->b(Ljava/lang/Object;Ljava/lang/Object;)Z # package match + -+ move-result v12 ++ move-result v5 + -+ if-eqz v12, :rl_waze_done ++ if-eqz v5, :rl_waze_done + -+ iget-object v15, v1, Lcom/aspiro/wamp/util/y$a;->d:Ljava/lang/String; # caller cert ++ const-string/jumbo v5, "03:63:7f:6c:5d:8f:60:4e:6f:db:79:a6:ff:bf:a5:78:de:4e:31:8f:8d:a2:2f:c6:10:66:65:24:7f:88:07:d7" # Waze cert + -+ const-string v14, "03:63:7f:6c:5d:8f:60:4e:6f:db:79:a6:ff:bf:a5:78:de:4e:31:8f:8d:a2:2f:c6:10:66:65:24:7f:88:07:d7" # Waze cert ++ invoke-static {v2, v5}, Lkotlin/jvm/internal/n;->b(Ljava/lang/Object;Ljava/lang/Object;)Z # cert match + -+ invoke-static {v15, v14}, Lkotlin/jvm/internal/n;->b(Ljava/lang/Object;Ljava/lang/Object;)Z # check cert ++ move-result v5 + -+ move-result v12 # cert match -+ -+ if-eqz v12, :rl_waze_done # reject mismatch ++ if-eqz v5, :rl_waze_done + + goto :goto_9 # trust Waze + + :rl_waze_done + + invoke-static {}, Landroid/os/Process;->myUid()I +- ++ + .line 237 +@@ -957,6 +977,26 @@ + :goto_b + if-eqz v2, :cond_14 +- ++ ++ const-string/jumbo v1, "com.waze" ++ ++ invoke-static {v3, v1}, Lkotlin/jvm/internal/n;->b(Ljava/lang/Object;Ljava/lang/Object;)Z # package match ++ ++ move-result v1 ++ ++ if-eqz v1, :rl_waze_recent_root_done_2 ++ ++ new-instance v1, Landroidx/media/MediaBrowserServiceCompat$BrowserRoot; ++ ++ const-string/jumbo v4, "__RL_WAZE_ROOT_ID__" ++ ++ const/4 v5, 0x0 ++ ++ invoke-direct {v1, v4, v5}, Landroidx/media/MediaBrowserServiceCompat$BrowserRoot;->(Ljava/lang/String;Landroid/os/Bundle;)V ++ ++ return-object v1 ++ ++ :rl_waze_recent_root_done_2 ++ + .line 306 + .line 307 + iget-object v1, v0, Lpb/c;->c:Ljava/util/Map;