Compare commits

..
13 Commits
Author SHA1 Message Date
meoware.exe bdbcc4fc62 Merge pull request #44 from meowarex/dev
New Patch: Quality Badge Color
2026-06-20 23:06:36 +10:00
meoware.exe 3b893c12ff Renamed Patch File <3 2026-06-20 23:05:28 +10:00
meoware.exe 9d60e3dc80 Merge pull request #43 from Se7en-dev/feat/quality-badge-colors-patch
[PATCH] Quality Badge Colors
2026-06-20 22:55:24 +10:00
Se7en-dev 36382437f1 feat(patches): added quality badge colors patch 2026-06-19 17:29:19 +02:00
meoware.exe 5dc9188772 Merge pull request #41 from meowarex/dev
Mark RL API as WIP
2026-06-16 02:44:23 +10:00
meoware.exe 7823a54d11 Mark RL API as WIP 2026-06-16 02:43:35 +10:00
meoware.exe 4d5fea843e Merge pull request #40 from meowarex/dev
Rework Update Notification
2026-06-16 02:31:19 +10:00
meoware.exe d6bc889387 Rework Update Notification 2026-06-16 02:19:33 +10:00
meoware.exe 8501ccb0a9 Merge pull request #39 from meowarex/dev
Dev
2026-06-16 02:13:17 +10:00
meoware.exe ad6ebac6ce Bump Patch Version 2026-06-16 02:13:02 +10:00
meoware.exe 320148e774 Update RL-API Platform (DX) <3 2026-06-16 02:11:23 +10:00
meoware.exe d8e119eb4b Merge pull request #34 from meowarex/dev
Forgot to Bump Patches Version <3
2026-06-02 11:02:34 +10:00
meoware.exe 10e5dcf365 Forgot to Bump Patches Version <3 2026-06-02 11:02:12 +10:00
7 changed files with 261 additions and 8 deletions
@@ -70,6 +70,12 @@ enum class KnownPatch(
titleRes = R.string.patch_player_backdrop_title, titleRes = R.string.patch_player_backdrop_title,
descRes = R.string.patch_player_backdrop_desc, descRes = R.string.patch_player_backdrop_desc,
), ),
QualityBadgeColors(
order = 36,
fileNames = listOf("player-quality-badge-colors.patch"),
titleRes = R.string.patch_quality_badge_colors_title,
descRes = R.string.patch_quality_badge_colors_desc,
),
CoverEverywhere( CoverEverywhere(
order = 35, order = 35,
fileNames = listOf( fileNames = listOf(
@@ -130,6 +136,7 @@ enum class KnownPatch(
LyricsRlApi, LyricsRlApi,
LyricsKeepControlsVisible, LyricsKeepControlsVisible,
PlayerBackdrop, PlayerBackdrop,
QualityBadgeColors,
LyricsProgressPill, LyricsProgressPill,
CoverEverywhere, CoverEverywhere,
), ),
@@ -7,7 +7,6 @@ import android.app.PendingIntent
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
import android.content.pm.PackageManager import android.content.pm.PackageManager
import android.net.Uri
import android.os.Build import android.os.Build
import android.util.Log import android.util.Log
import androidx.core.app.ActivityCompat import androidx.core.app.ActivityCompat
@@ -51,15 +50,15 @@ class UpdateCheckWorker(
.maxByOrNull { it.first } .maxByOrNull { it.first }
?: return Result.success() ?: return Result.success()
val (version, release) = latestVersion val (version, _) = latestVersion
if (current >= version) return Result.success() if (current >= version) return Result.success()
Log.i(BuildConfig.TAG, "Update available: $version (installed $current)") Log.i(BuildConfig.TAG, "Update available: $version (installed $current)")
postUpdateNotification(version.toString(), release.htmlUrl) postUpdateNotification(version.toString())
return Result.success() return Result.success()
} }
private fun postUpdateNotification(version: String, releaseUrl: String) { private fun postUpdateNotification(version: String) {
val nm = applicationContext.getSystemService<NotificationManager>() ?: return val nm = applicationContext.getSystemService<NotificationManager>() ?: return
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
@@ -78,10 +77,15 @@ class UpdateCheckWorker(
return return
} }
val launchIntent = applicationContext.packageManager
.getLaunchIntentForPackage(applicationContext.packageName)
?.apply { addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) }
?: return
val pendingIntent = PendingIntent.getActivity( val pendingIntent = PendingIntent.getActivity(
applicationContext, applicationContext,
0, 0,
Intent(Intent.ACTION_VIEW, Uri.parse(releaseUrl)).apply { addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) }, launchIntent,
PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_UPDATE_CURRENT, PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_UPDATE_CURRENT,
) )
+3 -1
View File
@@ -258,7 +258,7 @@
<string name="patch_lyrics_progress_pill_desc">Restores the old Track Progress Pill in the top of the Lyrics screen!</string> <string name="patch_lyrics_progress_pill_desc">Restores the old Track Progress Pill in the top of the Lyrics screen!</string>
<string name="patch_lyrics_replace_button_title">Replace Lyrics Button</string> <string name="patch_lyrics_replace_button_title">Replace Lyrics Button</string>
<string name="patch_lyrics_replace_button_desc">Replaces the Lyrics button with the RL Sparkle!</string> <string name="patch_lyrics_replace_button_desc">Replaces the Lyrics button with the RL Sparkle!</string>
<string name="patch_lyrics_rl_api_title">Radiant Lyrics API</string> <string name="patch_lyrics_rl_api_title">Radiant Lyrics API - WIP</string>
<string name="patch_lyrics_rl_api_desc">Use Radiant Lyrics API to fetch Lyrics (Higher quality &amp; More providers)</string> <string name="patch_lyrics_rl_api_desc">Use Radiant Lyrics API to fetch Lyrics (Higher quality &amp; More providers)</string>
<string name="patch_sticky_lyrics_title">Sticky Lyrics</string> <string name="patch_sticky_lyrics_title">Sticky Lyrics</string>
<string name="patch_sticky_lyrics_desc">Always Forces the Lyrics page to be opened (aslong as the track has lyrics)</string> <string name="patch_sticky_lyrics_desc">Always Forces the Lyrics page to be opened (aslong as the track has lyrics)</string>
@@ -268,6 +268,8 @@
>Inverts the auto-hide behavior on the lyrics screen, playback controls stay visible by default and only hide when you tap them off.</string> >Inverts the auto-hide behavior on the lyrics screen, playback controls stay visible by default and only hide when you tap them off.</string>
<string name="patch_player_backdrop_title">Player Backdrop</string> <string name="patch_player_backdrop_title">Player Backdrop</string>
<string name="patch_player_backdrop_desc">Restores the legacy translucent backdrop blur behind the player.</string> <string name="patch_player_backdrop_desc">Restores the legacy translucent backdrop blur behind the player.</string>
<string name="patch_quality_badge_colors_title">Quality Badge Colors</string>
<string name="patch_quality_badge_colors_desc">Brings color back to the player quality badge.</string>
<string name="patch_cover_everywhere_title">Cover Everywhere - WIP</string> <string name="patch_cover_everywhere_title">Cover Everywhere - WIP</string>
<string name="patch_cover_everywhere_desc">Applies the blurred backdrop to every Compose based page (Home &amp; Collection)</string> <string name="patch_cover_everywhere_desc">Applies the blurred backdrop to every Compose based page (Home &amp; Collection)</string>
<string name="patch_lyrics_replace_share_button_title">Replace Share Button</string> <string name="patch_lyrics_replace_share_button_title">Replace Share Button</string>
+1 -1
View File
@@ -1,5 +1,5 @@
{ {
"tidalVersionCode": 9090, "tidalVersionCode": 9090,
"tidalApkUrl": "https://github.com/meowarex/rl-mobile/releases/download/latest/tidal-stock.apk", "tidalApkUrl": "https://github.com/meowarex/rl-mobile/releases/download/latest/tidal-stock.apk",
"patchesVersion": "0.9.5" "patchesVersion": "0.9.8"
} }
@@ -0,0 +1,124 @@
.class public final Lradiant/QualityBadge;
.super Ljava/lang/Object;
# direct methods
.method private constructor <init>()V
.locals 0
invoke-direct {p0}, Ljava/lang/Object;-><init>()V
return-void
.end method
# qualities : 0 = LOW / HIGH, 1 = LOSSLESS, 2 = HI_RES_LOSSLESS
.method private static backgroundArgb(I)I
.locals 0
packed-switch p0, :quality_switch
const p0, 0x66475569 # LOW / HIGH bg
return p0
:lossless
const p0, 0x3306b6d4 # LOSSLESS bg
return p0
:hires
const p0, 0x40f59e0b # HI_RES_LOSSLESS bg
return p0
:quality_switch
.packed-switch 0x1
:lossless
:hires
.end packed-switch
.end method
.method private static textArgb(I)I
.locals 0
packed-switch p0, :quality_switch
const p0, -0x1d1710 # LOW / HIGH text
return p0
:lossless
const p0, -0x5a0c04 # LOSSLESS text
return p0
:hires
const p0, -0x21976 # HI_RES_LOSSLESS text
return p0
:quality_switch
.packed-switch 0x1
:lossless
:hires
.end packed-switch
.end method
.method public static modifier(Landroidx/compose/ui/Modifier;I)Landroidx/compose/ui/Modifier;
.locals 3
invoke-static {p1}, Lradiant/QualityBadge;->backgroundArgb(I)I
move-result p1
invoke-static {p1}, Landroidx/compose/ui/graphics/ColorKt;->Color(I)J
move-result-wide v0
const/high16 p1, 0x40800000 # 4.0f
invoke-static {p1}, Landroidx/compose/ui/unit/Dp;->constructor-impl(F)F
move-result p1
invoke-static {p1}, Landroidx/compose/foundation/shape/RoundedCornerShapeKt;->RoundedCornerShape-0680j_4(F)Landroidx/compose/foundation/shape/RoundedCornerShape;
move-result-object v2
invoke-static {p0, v0, v1, v2}, Landroidx/compose/foundation/BackgroundKt;->background-bw27NRU(Landroidx/compose/ui/Modifier;JLandroidx/compose/ui/graphics/Shape;)Landroidx/compose/ui/Modifier;
move-result-object p0
const/high16 p1, 0x40c00000 # 6.0f
invoke-static {p1}, Landroidx/compose/ui/unit/Dp;->constructor-impl(F)F
move-result p1
const/high16 v0, 0x40000000 # 2.0f
invoke-static {v0}, Landroidx/compose/ui/unit/Dp;->constructor-impl(F)F
move-result v0
invoke-static {p0, p1, v0}, Landroidx/compose/foundation/layout/PaddingKt;->padding-VpY3zN4(Landroidx/compose/ui/Modifier;FF)Landroidx/compose/ui/Modifier;
move-result-object p0
return-object p0
.end method
.method public static style(ILn20/e2;)Ln20/e2;
.registers 16
invoke-static {p0}, Lradiant/QualityBadge;->textArgb(I)I
move-result v0
new-instance v1, Lc20/a;
invoke-direct {v1, v0}, Lc20/a;-><init>(I)V
new-instance v0, Lc20/d;
const/4 v2, 0x0
const/4 v3, 0x0
const/4 v4, 0x0
const/4 v5, 0x0
const/4 v6, 0x0
const/4 v7, 0x0
const/4 v8, 0x0
const/4 v9, 0x0
const/4 v10, 0x0
const/4 v11, 0x0
const/4 v12, 0x0
const/16 v13, 0xffe
const/4 v14, 0x0
invoke-direct/range {v0 .. v14}, Lc20/d;-><init>(Lc20/a;Lc20/a;Lc20/a;Lc20/a;Lc20/a;Lc20/a;Lc20/a;Lc20/a;Lc20/a;Lc20/a;Lc20/a;Lc20/a;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
move-object v9, v0
move-object/from16 v0, p1
const/4 v1, 0x0
move-object v2, v9
const/4 v3, 0x0
const/4 v4, 0x0
const/4 v5, 0x0
const/16 v6, 0x1d
const/4 v7, 0x0
invoke-static/range {v0 .. v7}, Ln20/e2;->g(Ln20/e2;Ln20/u4;Lc20/d;Lcom/squareup/ui/market/core/text/MarketTextAlignment;Lcom/squareup/ui/market/core/text/MarketTextTransform;Ln20/t4;ILjava/lang/Object;)Ln20/e2;
move-result-object p0
return-object p0
.end method
@@ -344,7 +344,7 @@
invoke-virtual {v2, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; invoke-virtual {v2, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
const-string v0, "&platform=Radiant%20Lyrics" const-string v0, "&platform=rl-mobile"
invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
+116
View File
@@ -0,0 +1,116 @@
--- a/com/tidal/android/feature/playerscreen/ui/composables/SeekbarAndTimeKt.smali
+++ b/com/tidal/android/feature/playerscreen/ui/composables/SeekbarAndTimeKt.smali
@@ -372,6 +372,10 @@
.line 158
sget v4, Lcom/tidal/android/feature/playerscreen/ui/composables/o4;->g:F
+ const/high16 v11, 0x40000000 # 2.0f
+
+ mul-float/2addr v4, v11 # scale atmos icon 2x as it is too small in stock app
+
.line 159
.line 160
invoke-static {v2, v4}, Landroidx/compose/foundation/layout/SizeKt;->height-3ABfNKs(Landroidx/compose/ui/Modifier;F)Landroidx/compose/ui/Modifier;
@@ -461,6 +465,8 @@
.line 200
check-cast v3, Lcom/tidal/android/feature/playerscreen/ui/i$a;
+ iget v13, v3, Lcom/tidal/android/feature/playerscreen/ui/i$a;->b:I
+
.line 201
.line 202
iget-object v3, v3, Lcom/tidal/android/feature/playerscreen/ui/i$a;->a:Ljava/lang/String;
@@ -481,6 +487,16 @@
.line 210
move-object v1, v3
+ invoke-static {v2, v13}, Lradiant/QualityBadge;->modifier(Landroidx/compose/ui/Modifier;I)Landroidx/compose/ui/Modifier;
+
+ move-result-object v2
+
+ move-object/from16 v3, p1
+
+ invoke-static {v13, v3}, Lradiant/QualityBadge;->style(ILn20/e2;)Ln20/e2;
+
+ move-result-object v8
+
.line 211
const/4 v3, 0x0
--- a/com/tidal/android/feature/playerscreen/ui/i$a.smali
+++ b/com/tidal/android/feature/playerscreen/ui/i$a.smali
@@ -21,9 +21,21 @@
# instance fields
.field public final a:Ljava/lang/String;
+.field public final b:I
+
# direct methods
.method public constructor <init>(Ljava/lang/String;)V
+ .locals 1
+
+ const/4 v0, 0x0
+
+ invoke-direct {p0, p1, v0}, Lcom/tidal/android/feature/playerscreen/ui/i$a;-><init>(Ljava/lang/String;I)V
+
+ return-void
+.end method
+
+.method public constructor <init>(Ljava/lang/String;I)V
.locals 0
.line 1
@@ -34,6 +46,8 @@
.line 4
iput-object p1, p0, Lcom/tidal/android/feature/playerscreen/ui/i$a;->a:Ljava/lang/String;
+ iput p2, p0, Lcom/tidal/android/feature/playerscreen/ui/i$a;->b:I
+
.line 5
.line 6
return-void
--- a/com/tidal/android/feature/playerscreen/ui/PlayerViewModel$special$$inlined$mapNotNull$1$2.smali
+++ b/com/tidal/android/feature/playerscreen/ui/PlayerViewModel$special$$inlined$mapNotNull$1$2.smali
@@ -1356,6 +1356,14 @@
.line 617
- move-result v10
+ move-result v10 # isCurrentStreamHiResLosslessQuality() result
+ const/16 v31, 0x0 # LOW / HIGH quality
+
+ if-eqz v10, :radiant_qbc_not_hires
+
+ const/16 v31, 0x2 # HI_RES_LOSSLESS quality
+
+ :radiant_qbc_not_hires
+
.line 618
if-nez v10, :cond_19
@@ -1368,6 +1376,12 @@
.line 623
- move-result v10
+ move-result v10 # isCurrentStreamLossless() result
+ if-eqz v10, :radiant_qbc_not_lossless
+
+ const/16 v31, 0x1 # LOSSLESS quality
+
+ :radiant_qbc_not_lossless
+
.line 624
if-eqz v10, :cond_18
@@ -1695,7 +1709,10 @@
.line 771
.line 772
- invoke-direct {v8, v5}, Lcom/tidal/android/feature/playerscreen/ui/i$a;-><init>(Ljava/lang/String;)V
+ move/from16 v10, v31 # quality
+
+ invoke-direct {v8, v5, v10}, Lcom/tidal/android/feature/playerscreen/ui/i$a;-><init>(Ljava/lang/String;I)V
+
.line 773
.line 774