RL Pebble <3

This commit is contained in:
meoware.exe committed 2026-09-17 23:20:29 +10:00
1 parent aaf2d9e99d
commit 1ab876ea59
25 files changed
+2202 -6

No files matched your search

+15 -3
View File
@@ -49,7 +49,15 @@ That script regenerates `extension/radiant/Kawarp.smali` and
The Java side under `tools/kawarp-build/{src,stubs}` is not regenerated and keeps its
markers.
## 1. Rolled class references (268)
## Gotcha: Pebble integration hooks
`extension/radiant/PebbleBridge*.smali` is built by `tools/pebble-bridge-build/build.sh`.
- `integration-pebble-playback.patch` hooks `bk0/e`, TIDAL's 200 ms position poller.
It holds `Lbk0/d;`, `ExoPlayer` and `Handler` and reposts with `0xc8`.
- `integration-pebble-lyrics.patch` hooks our `RLAPILyricsWorker`, so no markers there.
## 1. Rolled class references (270)
| symbol | uses | referenced from |
|---|---:|---|
@@ -298,6 +306,8 @@ markers.
| `Lxf/d$a;` | 2 | `extension/radiant/gestures/queue/SearchPlaylistsResolver.smali` |
| `La30/b;` | 1 | `player-favorite-heart.patch` |
| `Landroidx/compose/foundation/text/input/a;` | 1 | `player-backdrop-playback.patch` |
| `Lbk0/d;` | 1 | `integration-pebble-playback.patch` |
| `Lbk0/e;` | 1 | `integration-pebble-playback.patch` |
| `Lcom/aspiro/wamp/mycollection/subpages/favoritetracks/n;` | 1 | `gestures/queue/swipe-to-queue.patch` |
| `Lcom/aspiro/wamp/nowplaying/view/playqueue/l;` | 1 | `gestures/queue/swipe-to-queue.patch` |
| `Lcom/aspiro/wamp/nowplaying/view/playqueue/touchmanagement/a;` | 1 | `gestures/queue/swipe-to-queue.patch` |
@@ -676,12 +686,13 @@ The owner name survives R8; only the member name rolls. Match on the descriptor.
| `Lz70/a;` | `c` | `:Lcom/aspiro/wamp/model/AvailabilityInteractor;` | 1 |
| `Lzf/c;` | `c` | `:Lcom/tidal/android/navigation/NavigationInfo;` | 1 |
## 3. Rolled patch target classes (64)
## 3. Rolled patch target classes (65)
`--- a/` headers naming an obfuscated class. If these move the hunk cannot even be located.
| target | hooked by |
|---|---|
| `bk0/e.smali` | `integration-pebble-playback.patch` |
| `cg0/h.smali` | `lyrics-rl-api-isrc.patch` |
| `com/aspiro/wamp/mycollection/subpages/albums/myalbums/MyAlbumsView.smali` | `gestures/queue/swipe-to-queue.patch` |
| `com/aspiro/wamp/mycollection/subpages/albums/search/SearchAlbumsView.smali` | `gestures/queue/swipe-to-queue.patch` |
@@ -747,7 +758,7 @@ The owner name survives R8; only the member name rolls. Match on the descriptor.
| `p7/a.smali` | `gestures/queue/swipe-to-queue.patch` |
| `v6/e.smali` | `gestures/queue/swipe-to-queue.patch` |
## 4. Occurrences inside .patch files - not marked inline (220)
## 4. Occurrences inside .patch files - not marked inline (221)
| file | line | kind | symbols |
|---|---:|---|---|
@@ -883,6 +894,7 @@ The owner name survives R8; only the member name rolls. Match on the descriptor.
| `gestures/queue/swipe-to-queue.patch` | 469 | context | `Lcom/tidal/android/feature/appscaffold/ui/recyclerview/b; Lcom/tidal/android/feature/appscaffold/ui/recyclerview/a; a` |
| `gestures/queue/swipe-to-queue.patch` | 482 | context | `Lcom/tidal/android/feature/appscaffold/ui/recyclerview/b; Lcom/tidal/android/feature/appscaffold/ui/recyclerview/a; a` |
| `gestures/queue/swipe-to-queue.patch` | 500 | context | `Lcom/aspiro/wamp/nowplaying/view/suggestions/o0; Lcom/aspiro/wamp/nowplaying/view/suggestions/l; M` |
| `integration-pebble-playback.patch` | 30 | context | `Lbk0/d; Lbk0/e;` |
| `integration-waze-playback.patch` | 9 | added | `Lkotlin/jvm/internal/n;` |
| `integration-waze-playback.patch` | 17 | added | `Lkotlin/jvm/internal/n;` |
| `integration-waze-playback.patch` | 35 | added | `Lkotlin/jvm/internal/n;` |
@@ -0,0 +1,56 @@
.class Lradiant/PebbleBridge$1;
.super Ljava/lang/Object;
# interfaces
.implements Ljava/lang/Runnable;
# annotations
.annotation system Ldalvik/annotation/EnclosingMethod;
value = Lradiant/PebbleBridge;->onPosition(J)V
.end annotation
.annotation system Ldalvik/annotation/InnerClass;
accessFlags = 0x0
name = null
.end annotation
# instance fields
.field final synthetic val$at:J
.field final synthetic val$position:J
# direct methods
.method constructor <init>(JJ)V
.registers 5
.annotation system Ldalvik/annotation/Signature;
value = {
"()V"
}
.end annotation
iput-wide p1, p0, Lradiant/PebbleBridge$1;->val$position:J
iput-wide p3, p0, Lradiant/PebbleBridge$1;->val$at:J
invoke-direct {p0}, Ljava/lang/Object;-><init>()V
return-void
.end method
# virtual methods
.method public run()V
.registers 5
iget-wide v0, p0, Lradiant/PebbleBridge$1;->val$position:J
iget-wide v2, p0, Lradiant/PebbleBridge$1;->val$at:J
# invokes: Lradiant/PebbleBridge;->onSample(JJ)V
invoke-static {v0, v1, v2, v3}, Lradiant/PebbleBridge;->access$000(JJ)V
return-void
.end method
@@ -0,0 +1,50 @@
.class Lradiant/PebbleBridge$2;
.super Ljava/lang/Object;
# interfaces
.implements Ljava/lang/Runnable;
# annotations
.annotation system Ldalvik/annotation/EnclosingMethod;
value = Lradiant/PebbleBridge;->onLyrics(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
.end annotation
.annotation system Ldalvik/annotation/InnerClass;
accessFlags = 0x0
name = null
.end annotation
# direct methods
.method constructor <init>()V
.registers 1
invoke-direct {p0}, Ljava/lang/Object;-><init>()V
return-void
.end method
# virtual methods
.method public run()V
.registers 2
# getter for: Lradiant/PebbleBridge;->instance:Lradiant/PebbleBridge;
invoke-static {}, Lradiant/PebbleBridge;->access$100()Lradiant/PebbleBridge;
move-result-object v0
if-eqz v0, :cond_d
# getter for: Lradiant/PebbleBridge;->instance:Lradiant/PebbleBridge;
invoke-static {}, Lradiant/PebbleBridge;->access$100()Lradiant/PebbleBridge;
move-result-object v0
# invokes: Lradiant/PebbleBridge;->sendLyrics()V
invoke-static {v0}, Lradiant/PebbleBridge;->access$200(Lradiant/PebbleBridge;)V
:cond_d
return-void
.end method
File diff suppressed because it is too large. Load diff
+30
View File
@@ -0,0 +1,30 @@
--- a/radiant/RLAPILyricsWorker.smali
+++ b/radiant/RLAPILyricsWorker.smali
@@ -794,6 +794,12 @@
:got_body
move-object v11, v3
+ iget-object v4, p0, Lradiant/RLAPILyricsWorker;->key:Ljava/lang/String;
+
+ iget-object v5, p0, Lradiant/RLAPILyricsWorker;->title:Ljava/lang/String;
+
+ invoke-static {v4, v5, v3}, Lradiant/PebbleBridge;->onLyrics(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
+
invoke-static {v3}, Lradiant/RLAPILyricsWorker;->parseLines(Ljava/lang/String;)Ljava/util/ArrayList;
move-result-object v3
@@ -911,6 +917,14 @@
return-void
:request_failed
+ iget-object v0, p0, Lradiant/RLAPILyricsWorker;->key:Ljava/lang/String;
+
+ iget-object v1, p0, Lradiant/RLAPILyricsWorker;->title:Ljava/lang/String;
+
+ const/4 v2, 0x0
+
+ invoke-static {v0, v1, v2}, Lradiant/PebbleBridge;->onLyrics(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
+
invoke-direct {p0}, Lradiant/RLAPILyricsWorker;->failCurrent()V
return-void
+31
View File
@@ -0,0 +1,31 @@
--- a/com/aspiro/wamp/player/MusicService.smali
+++ b/com/aspiro/wamp/player/MusicService.smali
@@ -1495,6 +1495,8 @@
.line 36
invoke-virtual {p1, v0}, Landroid/support/v4/media/session/MediaSessionCompat;->setPlaybackState(Landroid/support/v4/media/session/PlaybackStateCompat;)V
+ invoke-static {p0, p1}, Lradiant/PebbleBridge;->onState(Landroid/content/Context;Landroid/support/v4/media/session/MediaSessionCompat;)V
+
.line 37
.line 38
.line 39
@@ -2669,6 +2671,8 @@
.line 1
invoke-super {p0}, Landroidx/media/MediaBrowserServiceCompat;->onDestroy()V
+ invoke-static {}, Lradiant/PebbleBridge;->onDestroy()V
+
.line 2
.line 3
.line 4
--- a/bk0/e.smali
+++ b/bk0/e.smali
@@ -56,6 +56,8 @@
.line 6
move-result-wide v0
+ invoke-static {v0, v1}, Lradiant/PebbleBridge;->onPosition(J)V
+
.line 7
iget-object v2, p0, Lbk0/e;->a:Lbk0/d;
+24
View File
@@ -780,6 +780,30 @@
}
]
},
{
"id": "PebbleIntegration",
"order": 91,
"category": "integration",
"fileNames": [
"integration-pebble-playback.patch",
"integration-pebble-lyrics.patch"
],
"extensionFiles": [
"radiant/PebbleBridge.smali",
"radiant/PebbleBridge$1.smali",
"radiant/PebbleBridge$2.smali"
],
"title": "Pebble Watch",
"description": "Shows synced lyrics on your Pebble Time 2 when listening, Everything is configured and managed in the Pebble App",
"default": false,
"requires": [
"LyricsRlApi"
],
"companionApp": {
"storeId": "02b779dcf9084fecb0375df1",
"storeSource": "https://appstore-api.repebble.com/api"
}
},
{
"id": "DebugMenuUnlock",
"order": 100,