From 9bc1bb23f216cd4bf67618dadaab390518cb9eb0 Mon Sep 17 00:00:00 2001 From: meowarex Date: Thu, 21 May 2026 05:28:40 +1000 Subject: [PATCH] Fully Recreat Legacy Blur --- patches/lyrics-button-remove.patch | 15 ++++ ...ayerscreen.patch => player-backdrop.patch} | 72 +++++++++---------- patches/sparkle-button.patch | 34 +++++++++ scripts/MergeApk.java | 61 ---------------- 4 files changed, 82 insertions(+), 100 deletions(-) create mode 100644 patches/lyrics-button-remove.patch rename patches/{playerscreen.patch => player-backdrop.patch} (73%) create mode 100644 patches/sparkle-button.patch delete mode 100644 scripts/MergeApk.java diff --git a/patches/lyrics-button-remove.patch b/patches/lyrics-button-remove.patch new file mode 100644 index 0000000..411439e --- /dev/null +++ b/patches/lyrics-button-remove.patch @@ -0,0 +1,15 @@ +--- 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 diff --git a/patches/playerscreen.patch b/patches/player-backdrop.patch similarity index 73% rename from patches/playerscreen.patch rename to patches/player-backdrop.patch index 413473f..216fb23 100644 --- a/patches/playerscreen.patch +++ b/patches/player-backdrop.patch @@ -5,11 +5,11 @@ .method public static final e(ILandroidx/compose/runtime/Composer;Lcom/tidal/android/feature/playerscreen/ui/k;Lcom/tidal/android/feature/playerscreen/ui/r$a;Ltl0/a;Ltl0/l;Z)V - .locals 61 -+ .locals 89 # extra regs for blur + sparkle ++ .locals 71 # extra regs for blur backdrop .annotation build Landroidx/compose/runtime/Composable; .end annotation -@@ -4164,6 +4164,103 @@ +@@ -4164,6 +4164,133 @@ invoke-static {v5, v3, v4}, Landroidx/compose/runtime/Updater;->set-impl(Landroidx/compose/runtime/Composer;Ljava/lang/Object;Ltl0/p;)V @@ -63,7 +63,7 @@ + + move-result-object v5 + -+ const/high16 v7, 0x44b40000 # 1440f (blur radius dp) ++ const/high16 v7, 0x42b40000 # 90f (blur radius dp) + + invoke-static {v7}, Landroidx/compose/ui/unit/Dp;->constructor-impl(F)F + @@ -107,45 +107,39 @@ + + invoke-static/range {v61 .. v70}, Lsd0/f;->a(Ltl0/l;Ljava/lang/String;Landroidx/compose/ui/Modifier;Landroidx/compose/ui/graphics/ColorFilter;Landroidx/compose/ui/layout/ContentScale;Ljava/lang/Object;Ltl0/a;Landroidx/compose/runtime/Composer;II)V # render blurred cover + ++ sget-object v3, Landroidx/compose/ui/Modifier;->Companion:Landroidx/compose/ui/Modifier$Companion; # scrim chain start ++ ++ const/4 v4, 0x0 # fraction unused ++ ++ const/4 v5, 0x1 # $default mask ++ ++ const/4 v6, 0x0 # null obj ++ ++ invoke-static {v3, v4, v5, v6}, Landroidx/compose/foundation/layout/SizeKt;->fillMaxSize$default(Landroidx/compose/ui/Modifier;FILjava/lang/Object;)Landroidx/compose/ui/Modifier; # fill screen ++ ++ move-result-object v3 # modifier ++ ++ const v6, -0x80000000 # 0x80000000 = 50% black ++ ++ invoke-static {v6}, Landroidx/compose/ui/graphics/ColorKt;->Color(I)J # pack ARGB long ++ ++ move-result-wide v6 # color ++ ++ invoke-static {}, Landroidx/compose/ui/graphics/RectangleShapeKt;->getRectangleShape()Landroidx/compose/ui/graphics/Shape; # rect shape ++ ++ move-result-object v4 # shape ++ ++ invoke-static {v3, v6, v7, v4}, Landroidx/compose/foundation/BackgroundKt;->background-bw27NRU(Landroidx/compose/ui/Modifier;JLandroidx/compose/ui/graphics/Shape;)Landroidx/compose/ui/Modifier; # tint with scrim ++ ++ move-result-object v3 # modifier ++ ++ const/4 v4, 0x0 # $changed flags ++ ++ invoke-static {v3, v10, v4}, Landroidx/compose/foundation/layout/SpacerKt;->Spacer(Landroidx/compose/ui/Modifier;Landroidx/compose/runtime/Composer;I)V # draw scrim ++ + :radiant_skip + invoke-interface {v10}, Landroidx/compose/runtime/Composer;->endReplaceGroup()V # close group + .line 138 sget-object v3, Landroidx/compose/foundation/layout/BoxScopeInstance;->INSTANCE:Landroidx/compose/foundation/layout/BoxScopeInstance; -@@ -4931,7 +5028,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 replaces removed top-right lyrics pill -+ -+ invoke-interface {v2, v10}, Landroidx/compose/runtime/Composer;->startReplaceGroup(I)V -+ -+ invoke-interface {v2}, Landroidx/compose/runtime/Composer;->endReplaceGroup()V - - .line 227 - invoke-interface {v2}, Landroidx/compose/runtime/Composer;->endReplaceGroup()V -@@ -5707,6 +5808,22 @@ - :cond_8de - check-cast v4, Ltl0/a; - -+ new-instance v74, Lc8/j; # build lyrics-toggle lambda (same one h1 used) -+ -+ move-object/from16 v75, p5 -+ -+ const/16 v76, 0x1 # discriminator 1 = lyrics action -+ -+ invoke-direct/range {v74 .. v76}, Lc8/j;->(Ljava/lang/Object;I)V -+ -+ const/16 v71, 0x0 # $$changed flags -+ -+ move-object/from16 v72, v7 # composer -+ -+ const/16 v73, 0x0 # modifier (null -> Companion) -+ -+ invoke-static/range {v71 .. v74}, Lradiant/SparkleButton;->a(ILandroidx/compose/runtime/Composer;Landroidx/compose/ui/Modifier;Ltl0/a;)V # render bottom-left sparkle -+ - 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 diff --git a/patches/sparkle-button.patch b/patches/sparkle-button.patch new file mode 100644 index 0000000..b6b3af7 --- /dev/null +++ b/patches/sparkle-button.patch @@ -0,0 +1,34 @@ +--- a/com/tidal/android/feature/playerscreen/ui/PlayerScreenKt.smali ++++ b/com/tidal/android/feature/playerscreen/ui/PlayerScreenKt.smali +@@ -2966,7 +2966,7 @@ + .end method + + .method public static final e(ILandroidx/compose/runtime/Composer;Lcom/tidal/android/feature/playerscreen/ui/k;Lcom/tidal/android/feature/playerscreen/ui/r$a;Ltl0/a;Ltl0/l;Z)V +- .locals 71 # extra regs for blur backdrop ++ .locals 89 # extra regs for sparkle button + .annotation build Landroidx/compose/runtime/Composable; + .end annotation + +@@ -5838,6 +5838,22 @@ + :cond_51 + check-cast v4, Ltl0/a; + ++ new-instance v74, Lc8/j; # build lyrics-toggle lambda (same one h1 used) ++ ++ move-object/from16 v75, p5 # p5 holds the lambda receiver ++ ++ const/16 v76, 0x1 # discriminator 1 = lyrics action ++ ++ invoke-direct/range {v74 .. v76}, Lc8/j;->(Ljava/lang/Object;I)V # construct lambda ++ ++ const/16 v71, 0x0 # $$changed flags ++ ++ move-object/from16 v72, v7 # composer ++ ++ const/16 v73, 0x0 # modifier (null -> Companion) ++ ++ invoke-static/range {v71 .. v74}, Lradiant/SparkleButton;->a(ILandroidx/compose/runtime/Composer;Landroidx/compose/ui/Modifier;Ltl0/a;)V # render bottom-left sparkle ++ + 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 diff --git a/scripts/MergeApk.java b/scripts/MergeApk.java deleted file mode 100644 index dd90e74..0000000 --- a/scripts/MergeApk.java +++ /dev/null @@ -1,61 +0,0 @@ -import java.io.*; -import java.util.*; -import java.util.zip.*; - -// Merges an APKMirror split-APK bundle into a single installable APK. -// Usage: java MergeApk out.apk base.apk split1.apk split2.apk ... -public class MergeApk { - public static void main(String[] args) throws Exception { - if (args.length < 2) { - System.err.println("Usage: java MergeApk out.apk base.apk [split.apk ...]"); - System.exit(1); - } - String out = args[0]; - Set seen = new HashSet<>(); - try (ZipOutputStream zos = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(out)))) { - for (int i = 1; i < args.length; i++) { - String src = args[i]; - boolean isBase = i == 1; - int added = 0, skipped = 0; - try (ZipFile zip = new ZipFile(src)) { - Enumeration entries = zip.entries(); - while (entries.hasMoreElements()) { - ZipEntry e = entries.nextElement(); - if (e.isDirectory()) { skipped++; continue; } - String name = e.getName(); - if (!isBase && ( - name.equals("AndroidManifest.xml") || - name.equals("resources.arsc") || - name.startsWith("META-INF/") || - name.equals("stamp-cert-sha256"))) { - skipped++; - continue; - } - if (seen.contains(name)) { skipped++; continue; } - seen.add(name); - - ZipEntry ne = new ZipEntry(name); - if (e.getMethod() == ZipEntry.STORED) { - ne.setMethod(ZipEntry.STORED); - ne.setSize(e.getSize()); - ne.setCompressedSize(e.getSize()); - ne.setCrc(e.getCrc()); - } else { - ne.setMethod(ZipEntry.DEFLATED); - } - zos.putNextEntry(ne); - try (InputStream is = zip.getInputStream(e)) { - byte[] buf = new byte[16384]; - int n; - while ((n = is.read(buf)) > 0) zos.write(buf, 0, n); - } - zos.closeEntry(); - added++; - } - } - System.out.printf("%s: +%d added, %d skipped%n", src, added, skipped); - } - } - System.out.printf("Wrote %d entries to %s%n", seen.size(), out); - } -}