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 1471ed6..d05da44 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 @@ -135,6 +135,13 @@ enum class KnownPatch( ), ), ), + MiniPlayerDynamicBackground( + order = 51, + fileNames = listOf("mini-player-dynamic-bg.patch"), + titleRes = R.string.patch_mini_player_dynamic_bg_title, + descRes = R.string.patch_mini_player_dynamic_bg_desc, + default = Disabled, + ), EnableLegacyUi( order = 10, fileNames = listOf("enable-legacy-ui.patch"), @@ -151,6 +158,7 @@ enum class KnownPatch( PlayerBackdrop, QualityBadgeColors, LyricsProgressPill, + MiniPlayerDynamicBackground, CoverEverywhere, ), ); diff --git a/Manager/app/src/main/res/values/strings.xml b/Manager/app/src/main/res/values/strings.xml index abe8cef..35a768f 100644 --- a/Manager/app/src/main/res/values/strings.xml +++ b/Manager/app/src/main/res/values/strings.xml @@ -289,6 +289,8 @@ Redesigned Mini-Player Integrates the Seekbar into the control panel at the bottom of the screen. + Mini-Player Dynamic Background + Colorizes the Mini-Player depending on the currently playing track. Floating Grey Black diff --git a/patches/data.json b/patches/data.json index cd58bee..786689d 100644 --- a/patches/data.json +++ b/patches/data.json @@ -1,5 +1,5 @@ { "tidalVersionCode": 9090, "tidalApkUrl": "https://github.com/meowarex/rl-mobile/releases/download/latest/tidal-stock.apk", - "patchesVersion": "0.9.10" + "patchesVersion": "0.9.11" } diff --git a/patches/extension/radiant/MiniPlayerBackground.smali b/patches/extension/radiant/MiniPlayerBackground.smali new file mode 100644 index 0000000..62c6999 --- /dev/null +++ b/patches/extension/radiant/MiniPlayerBackground.smali @@ -0,0 +1,139 @@ +.class public final Lradiant/MiniPlayerBackground; +.super Ljava/lang/Object; + + +# static fields +.field public static final colorState:Landroidx/compose/runtime/MutableState; # player bg color + + +# direct methods +.method static constructor ()V + .locals 2 + + const/4 v0, 0x0 + + const/4 v1, 0x2 + + invoke-static {v0, v0, v1, v0}, Landroidx/compose/runtime/SnapshotStateKt;->mutableStateOf$default(Ljava/lang/Object;Landroidx/compose/runtime/SnapshotMutationPolicy;ILjava/lang/Object;)Landroidx/compose/runtime/MutableState; + + move-result-object v0 + + sput-object v0, Lradiant/MiniPlayerBackground;->colorState:Landroidx/compose/runtime/MutableState; + + return-void +.end method + + +.method private constructor ()V + .locals 0 + + invoke-direct {p0}, Ljava/lang/Object;->()V + + return-void +.end method + + +.method public static color(JLandroidx/compose/runtime/Composer;I)J + .locals 8 + .annotation build Landroidx/compose/runtime/Composable; + .end annotation + + const v0, 0x4d504442 # compose group key + + invoke-interface {p2, v0}, Landroidx/compose/runtime/Composer;->startReplaceGroup(I)V + + sget-object v0, Lradiant/MiniPlayerBackground;->colorState:Landroidx/compose/runtime/MutableState; + + invoke-interface {v0}, Landroidx/compose/runtime/MutableState;->getValue()Ljava/lang/Object; # read player color + + move-result-object v0 + + check-cast v0, Landroidx/compose/ui/graphics/Color; + + if-eqz v0, :fallback + + invoke-virtual {v0}, Landroidx/compose/ui/graphics/Color;->unbox-impl()J + + move-result-wide p0 + + :fallback + const/16 v0, 0x2ee # 750ms + + const/4 v1, 0x0 + + const/4 v2, 0x0 + + const/4 v3, 0x6 + + const/4 v4, 0x0 + + invoke-static {v0, v1, v2, v3, v4}, Landroidx/compose/animation/core/AnimationSpecKt;->tween$default(IILandroidx/compose/animation/core/Easing;ILjava/lang/Object;)Landroidx/compose/animation/core/TweenSpec; + + move-result-object v2 + + move-wide v0, p0 + + const-string v3, "miniPlayerBackgroundColorAnimation" + + const/4 v4, 0x0 + + move-object v5, p2 + + const/16 v6, 0x1b0 + + const/16 v7, 0x8 + + invoke-static/range {v0 .. v7}, Landroidx/compose/animation/SingleValueAnimationKt;->animateColorAsState-euL9pac(JLandroidx/compose/animation/core/AnimationSpec;Ljava/lang/String;Lyl0/l;Landroidx/compose/runtime/Composer;II)Landroidx/compose/runtime/State; + + move-result-object v0 + + invoke-interface {v0}, Landroidx/compose/runtime/State;->getValue()Ljava/lang/Object; + + move-result-object v0 + + check-cast v0, Landroidx/compose/ui/graphics/Color; + + invoke-virtual {v0}, Landroidx/compose/ui/graphics/Color;->unbox-impl()J + + move-result-wide p0 + + invoke-interface {p2}, Landroidx/compose/runtime/Composer;->endReplaceGroup()V + + return-wide p0 +.end method + + +.method public static setHex(Ljava/lang/String;)V + .locals 3 + + const/4 v0, 0x0 + + if-eqz p0, :set_color + + :try_start + invoke-static {p0}, Landroid/graphics/Color;->parseColor(Ljava/lang/String;)I + + move-result p0 + + invoke-static {p0}, Landroidx/compose/ui/graphics/ColorKt;->Color(I)J # pack ARGB color + + move-result-wide v1 + + invoke-static {v1, v2}, Landroidx/compose/ui/graphics/Color;->box-impl(J)Landroidx/compose/ui/graphics/Color; + + move-result-object v0 + :try_end + .catch Ljava/lang/Throwable; {:try_start .. :try_end} :catch_parse + + goto :set_color + + :catch_parse + move-exception p0 + + :set_color + sget-object p0, Lradiant/MiniPlayerBackground;->colorState:Landroidx/compose/runtime/MutableState; + + invoke-interface {p0, v0}, Landroidx/compose/runtime/MutableState;->setValue(Ljava/lang/Object;)V + + return-void +.end method diff --git a/patches/mini-player-dynamic-bg.patch b/patches/mini-player-dynamic-bg.patch new file mode 100644 index 0000000..9c31f1f --- /dev/null +++ b/patches/mini-player-dynamic-bg.patch @@ -0,0 +1,56 @@ +--- a/com/tidal/android/feature/appscaffold/ui/composable/i.smali ++++ b/com/tidal/android/feature/appscaffold/ui/composable/i.smali +@@ -2819,4 +2819,10 @@ + .line 147 ++ const/4 v8, 0x0 ++ ++ invoke-static {v10, v11, v15, v8}, Lradiant/MiniPlayerBackground;->color(JLandroidx/compose/runtime/Composer;I)J # dynamic bg or fallback ++ ++ move-result-wide v10 ++ + sget-object v8, Lcom/tidal/android/feature/appscaffold/ui/composable/a;->c:Landroidx/compose/foundation/shape/RoundedCornerShape; + + .line 148 +--- a/com/tidal/android/feature/playerscreen/ui/PlayerViewModel.smali ++++ b/com/tidal/android/feature/playerscreen/ui/PlayerViewModel.smali +@@ -1047,9 +1047,13 @@ + invoke-static {v2, v1, v4, v3}, Lkotlinx/coroutines/flow/FlowKt;->stateIn(Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/CoroutineScope;Lkotlinx/coroutines/flow/SharingStarted;Ljava/lang/Object;)Lkotlinx/coroutines/flow/StateFlow; + + move-result-object v1 + + iput-object v1, v0, Lcom/tidal/android/feature/playerscreen/ui/PlayerViewModel;->U:Lkotlinx/coroutines/flow/StateFlow; + ++ iget-object v1, v0, Lcom/tidal/android/feature/playerscreen/ui/PlayerViewModel;->O:Lkotlin/h; ++ ++ invoke-interface {v1}, Lkotlin/h;->getValue()Ljava/lang/Object; # init player bg color ++ + return-void + .end method + +@@ -1607,6 +1611,8 @@ + :goto_6 + invoke-interface {v9, v10}, Lkotlinx/coroutines/flow/MutableStateFlow;->setValue(Ljava/lang/Object;)V + ++ invoke-static {v10}, Lradiant/MiniPlayerBackground;->setHex(Ljava/lang/String;)V # store player bg hex ++ + .line 263 + .line 264 + .line 265 +@@ -2306,6 +2312,8 @@ + .line 598 + invoke-interface {v1, v5}, Lkotlinx/coroutines/flow/MutableStateFlow;->setValue(Ljava/lang/Object;)V + ++ invoke-static {v5}, Lradiant/MiniPlayerBackground;->setHex(Ljava/lang/String;)V # clear bg color ++ + .line 599 + .line 600 + .line 601 +@@ -2523,6 +2531,8 @@ + .line 704 + invoke-interface {v1, v5}, Lkotlinx/coroutines/flow/MutableStateFlow;->setValue(Ljava/lang/Object;)V + ++ invoke-static {v5}, Lradiant/MiniPlayerBackground;->setHex(Ljava/lang/String;)V # clear bg color ++ + .line 705 + .line 706 + .line 707