From 6a9b3f9d0542b6fc4ba02a7a1447dd8b95ce8580 Mon Sep 17 00:00:00 2001 From: meowarex Date: Sun, 24 May 2026 01:20:09 +1000 Subject: [PATCH] New Patches: Debug Menu & Legacy UI --- patches/debug-menu-unlock.patch | 43 ++++++++++++++++ patches/enable-legacy-ui.patch | 12 +++++ patches/lyrics-replace-lyrics-button.patch | 39 ++++++++++++++ patches/lyrics-replace-share-button.patch | 51 +++++++++++++++++++ ...yrics-sparkle-conditional-visibility.patch | 41 +++++++++++++++ 5 files changed, 186 insertions(+) create mode 100644 patches/debug-menu-unlock.patch create mode 100644 patches/enable-legacy-ui.patch create mode 100644 patches/lyrics-replace-lyrics-button.patch create mode 100644 patches/lyrics-replace-share-button.patch create mode 100644 patches/lyrics-sparkle-conditional-visibility.patch diff --git a/patches/debug-menu-unlock.patch b/patches/debug-menu-unlock.patch new file mode 100644 index 0000000..63f57ab --- /dev/null +++ b/patches/debug-menu-unlock.patch @@ -0,0 +1,43 @@ +--- a/com/tidal/android/core/debug/DebugFeatureInteractorDefault.smali ++++ b/com/tidal/android/core/debug/DebugFeatureInteractorDefault.smali +@@ -53,6 +53,11 @@ + .method public final a()Z + .locals 2 + ++ # rl-debug-unlock: force a() to always return true, bypassing the ++ # "debug-menu" feature flag check that normally hides the Settings entry. ++ const/4 v0, 0x1 ++ return v0 ++ + .line 1 + iget-object v0, p0, Lcom/tidal/android/core/debug/DebugFeatureInteractorDefault;->a:Lcom/tidal/android/featureflags/l; + +@@ -97,6 +102,14 @@ + } + .end annotation + ++ # rl-debug-unlock: short-circuit b() to always emit MutableStateFlow(TRUE). ++ # Mirrors the original ":cond_1 :goto_0" path the app uses for internal/test builds. ++ sget-object v0, Ljava/lang/Boolean;->TRUE:Ljava/lang/Boolean; ++ ++ invoke-static {v0}, Lkotlinx/coroutines/flow/StateFlowKt;->MutableStateFlow(Ljava/lang/Object;)Lkotlinx/coroutines/flow/MutableStateFlow; ++ ++ move-result-object v0 ++ ++ return-object v0 ++ + .line 1 + sget-object v0, Lh50/a;->a:Ljava/lang/String; + +@@ -261,6 +274,11 @@ + .method public final c()Z + .locals 3 + ++ # rl-debug-unlock: force c() to always return true, bypassing the ++ # applicationId-substring / in-app-bug-reports / export-logs flag checks. ++ const/4 v0, 0x1 ++ return v0 ++ + .line 1 + sget-object v0, Lh50/a;->a:Ljava/lang/String; + diff --git a/patches/enable-legacy-ui.patch b/patches/enable-legacy-ui.patch new file mode 100644 index 0000000..aa9d04c --- /dev/null +++ b/patches/enable-legacy-ui.patch @@ -0,0 +1,12 @@ +--- a/ig/d.smali ++++ b/ig/d.smali +@@ -26,8 +26,8 @@ + new-instance v0, Lig/d; + + .line 2 + .line 3 +- const-string v1, "player-market-ui" ++ const-string v1, "player-market-ui-rl-forced-off" # break flag key lookup + + .line 4 + .line 5 diff --git a/patches/lyrics-replace-lyrics-button.patch b/patches/lyrics-replace-lyrics-button.patch new file mode 100644 index 0000000..408fb5f --- /dev/null +++ b/patches/lyrics-replace-lyrics-button.patch @@ -0,0 +1,39 @@ +# rl-locals: com/tidal/android/feature/playerscreen/ui/PlayerScreenKt.smali e( 79 +--- a/com/tidal/android/feature/playerscreen/ui/PlayerScreenKt.smali ++++ b/com/tidal/android/feature/playerscreen/ui/PlayerScreenKt.smali +@@ -4931,7 +4931,11 @@ + const/4 v10, 0x0 + + .line 226 +- invoke-static {v10, v9, v4, v2, v7}, Lcom/tidal/android/feature/playerscreen/ui/composables/h1;->a(Landroidx/compose/ui/Modifier;Ltl0/a;ZLandroidx/compose/runtime/Composer;I)V ++ const v10, 0x52414448 # empty group key ++ ++ invoke-interface {v2, v10}, Landroidx/compose/runtime/Composer;->startReplaceGroup(I)V # open empty ++ ++ invoke-interface {v2}, Landroidx/compose/runtime/Composer;->endReplaceGroup()V # close empty + + .line 227 + invoke-interface {v2}, Landroidx/compose/runtime/Composer;->endReplaceGroup()V +@@ -5838,6 +5838,22 @@ + :cond_51 + check-cast v4, Ltl0/a; + + const/4 v2, 0x0 + + invoke-static {v13, v7, v2, v4}, Lcom/tidal/android/feature/playerscreen/ui/composables/h3;->a(ILandroidx/compose/runtime/Composer;Landroidx/compose/ui/Modifier;Ltl0/a;)V ++ ++ new-instance v74, Lc8/j; # lyrics-toggle lambda ++ ++ move-object/from16 v75, p5 # lambda receiver ++ ++ const/16 v76, 0x1 # lyrics action ++ ++ invoke-direct/range {v74 .. v76}, Lc8/j;->(Ljava/lang/Object;I)V # build lambda ++ ++ const/16 v71, 0x0 # changed flags ++ ++ move-object/from16 v72, v7 # composer ++ ++ const/16 v73, 0x0 # null modifier ++ ++ invoke-static/range {v71 .. v74}, Lradiant/SparkleButton;->a(ILandroidx/compose/runtime/Composer;Landroidx/compose/ui/Modifier;Ltl0/a;)V # render sparkle button diff --git a/patches/lyrics-replace-share-button.patch b/patches/lyrics-replace-share-button.patch new file mode 100644 index 0000000..942320d --- /dev/null +++ b/patches/lyrics-replace-share-button.patch @@ -0,0 +1,51 @@ +--- a/com/tidal/android/feature/playerscreen/ui/PlayerScreenKt.smali ++++ b/com/tidal/android/feature/playerscreen/ui/PlayerScreenKt.smali +@@ -5086,7 +5086,11 @@ + const/4 v13, 0x0 + + .line 247 +- invoke-static {v9, v0, v13, v2, v10}, Lcom/tidal/android/feature/playerscreen/ui/composables/BroadcastButtonKt;->b(Lcom/tidal/android/feature/playerscreen/ui/b;Ltl0/a;Landroidx/compose/ui/Modifier;Landroidx/compose/runtime/Composer;I)V ++ const v9, 0x52414244 # empty group key ++ ++ invoke-interface {v2, v9}, Landroidx/compose/runtime/Composer;->startReplaceGroup(I)V # open empty ++ ++ invoke-interface {v2}, Landroidx/compose/runtime/Composer;->endReplaceGroup()V # close empty + + .line 248 + invoke-interface {v2}, Landroidx/compose/runtime/Composer;->endNode()V +@@ -5758,17 +5758,19 @@ + :cond_53 +- new-instance v4, Landroidx/compose/foundation/text/input/internal/selection/l; +- +- const/4 v6, 0x2 +- +- invoke-direct {v4, v11, v6}, Landroidx/compose/foundation/text/input/internal/selection/l;->(Ljava/lang/Object;I)V +- +- .line 336 +- invoke-interface {v7, v4}, Landroidx/compose/runtime/Composer;->updateRememberedValue(Ljava/lang/Object;)V +- +- .line 337 +- :cond_54 +- check-cast v4, Ltl0/a; +- +- const/4 v2, 0x0 +- +- invoke-static {v13, v7, v2, v4}, Lcom/tidal/android/feature/playerscreen/ui/composables/u4;->a(ILandroidx/compose/runtime/Composer;Landroidx/compose/ui/Modifier;Ltl0/a;)V ++ new-instance v4, Lcom/tidal/android/feature/playerscreen/ui/f0; # connect click lambda ++ ++ move-object/from16 v6, p5 # action dispatcher ++ ++ const/4 v8, 0x0 # connect-clicked discriminator ++ ++ invoke-direct {v4, v6, v8}, Lcom/tidal/android/feature/playerscreen/ui/f0;->(Ljava/lang/Object;I)V # build lambda ++ ++ invoke-interface {v7, v4}, Landroidx/compose/runtime/Composer;->updateRememberedValue(Ljava/lang/Object;)V # cache lambda ++ ++ :cond_54 ++ check-cast v4, Ltl0/a; ++ ++ iget-object v8, v10, Lcom/tidal/android/feature/playerscreen/ui/r$a;->d:Lcom/tidal/android/feature/playerscreen/ui/b; # broadcast state ++ ++ const/4 v2, 0x0 # changed flags ++ ++ invoke-static {v8, v4, v13, v7, v2}, Lcom/tidal/android/feature/playerscreen/ui/composables/BroadcastButtonKt;->b(Lcom/tidal/android/feature/playerscreen/ui/b;Ltl0/a;Landroidx/compose/ui/Modifier;Landroidx/compose/runtime/Composer;I)V # render connect button diff --git a/patches/lyrics-sparkle-conditional-visibility.patch b/patches/lyrics-sparkle-conditional-visibility.patch new file mode 100644 index 0000000..1646829 --- /dev/null +++ b/patches/lyrics-sparkle-conditional-visibility.patch @@ -0,0 +1,41 @@ +--- a/com/tidal/android/feature/playerscreen/ui/PlayerScreenKt.smali ++++ b/com/tidal/android/feature/playerscreen/ui/PlayerScreenKt.smali +@@ -5854,17 +5854,38 @@ + invoke-static {v13, v7, v2, v4}, Lcom/tidal/android/feature/playerscreen/ui/composables/h3;->a(ILandroidx/compose/runtime/Composer;Landroidx/compose/ui/Modifier;Ltl0/a;)V ++ ++ iget-boolean v2, v10, Lcom/tidal/android/feature/playerscreen/ui/r$a;->i:Z # hasLyrics flag ++ ++ if-eqz v2, :cond_sparkle_no_lyrics # branch when no lyrics ++ ++ const v2, 0x30551b59 # group key (lyrics) ++ ++ invoke-interface {v7, v2}, Landroidx/compose/runtime/Composer;->startReplaceGroup(I)V # open lyrics branch + + new-instance v74, Lc8/j; # lyrics-toggle lambda + + move-object/from16 v75, p5 # lambda receiver + + const/16 v76, 0x1 # lyrics action + + invoke-direct/range {v74 .. v76}, Lc8/j;->(Ljava/lang/Object;I)V # build lambda + + const/16 v71, 0x0 # changed flags + + move-object/from16 v72, v7 # composer + + const/16 v73, 0x0 # null modifier + + invoke-static/range {v71 .. v74}, Lradiant/SparkleButton;->a(ILandroidx/compose/runtime/Composer;Landroidx/compose/ui/Modifier;Ltl0/a;)V # render sparkle button ++ ++ invoke-interface {v7}, Landroidx/compose/runtime/Composer;->endReplaceGroup()V # close lyrics branch ++ ++ goto :goto_sparkle_done # skip empty branch ++ ++ :cond_sparkle_no_lyrics ++ const v2, 0x3057f75c # group key (no lyrics) ++ ++ invoke-interface {v7, v2}, Landroidx/compose/runtime/Composer;->startReplaceGroup(I)V # open empty ++ ++ invoke-interface {v7}, Landroidx/compose/runtime/Composer;->endReplaceGroup()V # close empty ++ ++ :goto_sparkle_done