From 10f3dd724d2db91563394925a773d721c9bb9caf Mon Sep 17 00:00:00 2001 From: Se7en-dev Date: Thu, 20 Aug 2026 15:33:30 +0200 Subject: [PATCH] feat(swipe to queue): add compose / dynamic list + compose search refactor support --- .../app/src/main/assets/patches-manifest.json | 22 +- patches/extension/radiant/SwipeToQueue.smali | 8 + .../radiant/swipe/AlbumItemQueueAction.smali | 183 +++++ .../radiant/swipe/ComposeSearchQueue.smali | 270 +++++++ .../swipe/ComposeSearchQueueAction.smali | 220 ++++++ .../swipe/ComposeSearchQueueEvent.smali | 40 ++ .../radiant/swipe/ComposeSwipeAction.smali | 14 + .../swipe/ComposeSwipeState$Draw.smali | 227 ++++++ .../swipe/ComposeSwipeState$Gesture.smali | 231 ++++++ .../ComposeSwipeState$ResetAnimator.smali | 67 ++ .../radiant/swipe/ComposeSwipeState.smali | 657 ++++++++++++++++++ .../radiant/swipe/ComposeTapGuard.smali | 97 +++ .../radiant/swipe/DynamicTrackQueue.smali | 169 +++++ .../swipe/DynamicTrackQueueAction.smali | 95 +++ .../swipe/DynamicTrackQueueEvent.smali | 34 + .../radiant/swipe/DynamicTrackResolver.smali | 268 +++++++ .../radiant/swipe/QueueExecutor.smali | 99 +-- .../radiant/swipe/ViewAllTrackQueue.smali | 200 ++++++ .../swipe/ViewAllTrackQueueAction.smali | 89 +++ patches/manifest.json | 20 +- patches/swipe-to-queue-compose.patch | 253 +++++++ patches/swipe-to-queue.patch | 16 +- 22 files changed, 3232 insertions(+), 47 deletions(-) create mode 100644 patches/extension/radiant/swipe/AlbumItemQueueAction.smali create mode 100644 patches/extension/radiant/swipe/ComposeSearchQueue.smali create mode 100644 patches/extension/radiant/swipe/ComposeSearchQueueAction.smali create mode 100644 patches/extension/radiant/swipe/ComposeSearchQueueEvent.smali create mode 100644 patches/extension/radiant/swipe/ComposeSwipeAction.smali create mode 100644 patches/extension/radiant/swipe/ComposeSwipeState$Draw.smali create mode 100644 patches/extension/radiant/swipe/ComposeSwipeState$Gesture.smali create mode 100644 patches/extension/radiant/swipe/ComposeSwipeState$ResetAnimator.smali create mode 100644 patches/extension/radiant/swipe/ComposeSwipeState.smali create mode 100644 patches/extension/radiant/swipe/ComposeTapGuard.smali create mode 100644 patches/extension/radiant/swipe/DynamicTrackQueue.smali create mode 100644 patches/extension/radiant/swipe/DynamicTrackQueueAction.smali create mode 100644 patches/extension/radiant/swipe/DynamicTrackQueueEvent.smali create mode 100644 patches/extension/radiant/swipe/ViewAllTrackQueue.smali create mode 100644 patches/extension/radiant/swipe/ViewAllTrackQueueAction.smali create mode 100644 patches/swipe-to-queue-compose.patch diff --git a/Manager/app/src/main/assets/patches-manifest.json b/Manager/app/src/main/assets/patches-manifest.json index c36c802..748ae88 100644 --- a/Manager/app/src/main/assets/patches-manifest.json +++ b/Manager/app/src/main/assets/patches-manifest.json @@ -426,7 +426,8 @@ "id": "SwipeToQueue", "order": 39, "fileNames": [ - "swipe-to-queue.patch" + "swipe-to-queue.patch", + "swipe-to-queue-compose.patch" ], "extensionFiles": [ "radiant/SwipeToQueue.smali", @@ -442,10 +443,25 @@ "radiant/swipe/SearchAlbumsResolver.smali", "radiant/swipe/SearchPlaylistsResolver.smali", "radiant/swipe/PlaylistItemsResolver.smali", - "radiant/swipe/UnifiedSearchResolver.smali" + "radiant/swipe/UnifiedSearchResolver.smali", + "radiant/swipe/ComposeSwipeAction.smali", + "radiant/swipe/ComposeSwipeState.smali", + "radiant/swipe/ComposeSwipeState$Gesture.smali", + "radiant/swipe/ComposeSwipeState$Draw.smali", + "radiant/swipe/ComposeSwipeState$ResetAnimator.smali", + "radiant/swipe/ComposeTapGuard.smali", + "radiant/swipe/AlbumItemQueueAction.smali", + "radiant/swipe/DynamicTrackQueueEvent.smali", + "radiant/swipe/DynamicTrackQueueAction.smali", + "radiant/swipe/DynamicTrackQueue.smali", + "radiant/swipe/ViewAllTrackQueueAction.smali", + "radiant/swipe/ViewAllTrackQueue.smali", + "radiant/swipe/ComposeSearchQueueEvent.smali", + "radiant/swipe/ComposeSearchQueueAction.smali", + "radiant/swipe/ComposeSearchQueue.smali" ], "title": "Swipe to Queue", - "description": "Swipe on tracks/albums/playlists to add them to the play queue.", + "description": "Swipe on tracks/albums/playlists to add them to the play queue", "default": false, "advancedOptions": [ { diff --git a/patches/extension/radiant/SwipeToQueue.smali b/patches/extension/radiant/SwipeToQueue.smali index 111afcf..bf20676 100644 --- a/patches/extension/radiant/SwipeToQueue.smali +++ b/patches/extension/radiant/SwipeToQueue.smali @@ -130,6 +130,14 @@ .end method # virtual methods +.method public getAnimationDuration(Landroidx/recyclerview/widget/RecyclerView;IFF)J + .locals 2 + + const-wide/16 v0, 0x50 + + return-wide v0 +.end method + .method public getSwipeDirs(Landroidx/recyclerview/widget/RecyclerView;Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)I .locals 2 diff --git a/patches/extension/radiant/swipe/AlbumItemQueueAction.smali b/patches/extension/radiant/swipe/AlbumItemQueueAction.smali new file mode 100644 index 0000000..b598eda --- /dev/null +++ b/patches/extension/radiant/swipe/AlbumItemQueueAction.smali @@ -0,0 +1,183 @@ +.class public final Lradiant/swipe/AlbumItemQueueAction; +.super Ljava/lang/Object; +.source "AlbumItemQueueAction.smali" + +# interfaces +.implements Lradiant/swipe/ComposeSwipeAction; + + +# instance fields +.field private final callback:Lu5/b$a$a; + +.field private context:Landroid/content/Context; + +.field private final mediaItemId:I + +.field private final moduleId:Ljava/lang/String; + + +# direct methods +.method public constructor (Lu5/b$a;)V + .locals 2 + + invoke-direct {p0}, Ljava/lang/Object;->()V + + iget-object v0, p1, Lu5/b$a;->a:Lu5/b$a$a; + + iput-object v0, p0, Lradiant/swipe/AlbumItemQueueAction;->callback:Lu5/b$a$a; + + iget-object v0, p1, Lu5/b$a;->c:Lu5/b$a$b; + + iget v1, v0, Lu5/b$a$b;->r:I + + iput v1, p0, Lradiant/swipe/AlbumItemQueueAction;->mediaItemId:I + + iget-object v0, v0, Lu5/b$a$b;->s:Ljava/lang/String; + + iput-object v0, p0, Lradiant/swipe/AlbumItemQueueAction;->moduleId:Ljava/lang/String; + + return-void +.end method + + +# virtual methods +.method public invoke()Ljava/lang/Object; + .locals 10 + + iget-object v0, p0, Lradiant/swipe/AlbumItemQueueAction;->callback:Lu5/b$a$a; + + iget v1, p0, Lradiant/swipe/AlbumItemQueueAction;->mediaItemId:I + + iget-object v2, p0, Lradiant/swipe/AlbumItemQueueAction;->moduleId:Ljava/lang/String; + + invoke-static {}, Lradiant/swipe/QueueExecutor;->hasActiveQueue()Z + + move-result v3 + + if-nez v3, :active_queue + + invoke-interface {v0, v1, v2}, Lu5/b$a$a;->g(ILjava/lang/String;)V + + goto :done + + :active_queue + iget-object v3, p0, Lradiant/swipe/AlbumItemQueueAction;->context:Landroid/content/Context; + + if-eqz v3, :done + + instance-of v4, v0, Lu5/g; + + if-eqz v4, :done + + check-cast v0, Lu5/g; + + invoke-virtual {v0, v2}, Lk5/f;->l(Ljava/lang/String;)Lcom/aspiro/wamp/dynamicpages/data/model/Module; + + move-result-object v4 + + instance-of v5, v4, Lcom/aspiro/wamp/dynamicpages/data/model/collection/AlbumItemCollectionModule; + + if-eqz v5, :done + + check-cast v4, Lcom/aspiro/wamp/dynamicpages/data/model/collection/AlbumItemCollectionModule; + + invoke-virtual {v4}, Lcom/aspiro/wamp/dynamicpages/data/model/collection/AlbumItemCollectionModule;->getMediaItemParents()Ljava/util/List; + + move-result-object v5 + + invoke-interface {v5}, Ljava/lang/Iterable;->iterator()Ljava/util/Iterator; + + move-result-object v5 + + :find_item + invoke-interface {v5}, Ljava/util/Iterator;->hasNext()Z + + move-result v6 + + if-eqz v6, :done + + invoke-interface {v5}, Ljava/util/Iterator;->next()Ljava/lang/Object; + + move-result-object v6 + + check-cast v6, Lcom/aspiro/wamp/model/MediaItemParent; + + invoke-virtual {v6}, Lcom/aspiro/wamp/model/MediaItemParent;->getMediaItem()Lcom/aspiro/wamp/model/MediaItem; + + move-result-object v7 + + if-eqz v7, :find_item + + invoke-virtual {v7}, Lcom/aspiro/wamp/model/MediaItem;->getId()I + + move-result v8 + + if-ne v8, v1, :find_item + + instance-of v8, v7, Lcom/aspiro/wamp/model/Track; + + if-eqz v8, :done + + check-cast v7, Lcom/aspiro/wamp/model/Track; + + iget-object v8, v0, Lu5/g;->h:Lcom/aspiro/wamp/model/AvailabilityInteractor; + + invoke-interface {v8, v7}, Lcom/aspiro/wamp/model/AvailabilityInteractor;->getAvailability(Lcom/aspiro/wamp/model/MediaItem;)Lcom/aspiro/wamp/model/Availability$MediaItem; + + move-result-object v8 + + invoke-virtual {v8}, Lcom/aspiro/wamp/model/Availability$MediaItem;->isAvailable()Z + + move-result v8 + + if-eqz v8, :done + + new-instance v5, Lcom/aspiro/wamp/eventtracking/model/ContextualMetadata; + + invoke-virtual {v4}, Lcom/aspiro/wamp/dynamicpages/data/model/Module;->getPageId()Ljava/lang/String; + + move-result-object v6 + + invoke-virtual {v4}, Lcom/aspiro/wamp/dynamicpages/data/model/Module;->getId()Ljava/lang/String; + + move-result-object v8 + + invoke-virtual {v4}, Lcom/aspiro/wamp/dynamicpages/data/model/Module;->getPosition()I + + move-result v9 + + invoke-static {v9}, Ljava/lang/String;->valueOf(I)Ljava/lang/String; + + move-result-object v9 + + invoke-direct {v5, v6, v8, v9}, Lcom/aspiro/wamp/eventtracking/model/ContextualMetadata;->(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V + + invoke-virtual {v7}, Lcom/aspiro/wamp/model/MediaItem;->getAlbum()Lcom/aspiro/wamp/model/Album; + + move-result-object v6 + + if-eqz v6, :done + + iget-object v8, v0, Lu5/g;->j:Lcom/tidal/android/navigation/NavigationInfo; + + invoke-static {v6, v8}, Lcom/aspiro/wamp/playqueue/source/model/b;->c(Lcom/aspiro/wamp/model/Album;Lcom/tidal/android/navigation/NavigationInfo;)Lcom/aspiro/wamp/playqueue/source/model/AlbumSource; + + move-result-object v6 + + invoke-virtual {v6, v7}, Lcom/aspiro/wamp/playqueue/source/model/Source;->addSourceItem(Lcom/aspiro/wamp/model/MediaItem;)V + + invoke-static {v3, v7, v5, v6}, Lradiant/swipe/QueueExecutor;->track(Landroid/content/Context;Lcom/aspiro/wamp/model/Track;Lcom/aspiro/wamp/eventtracking/model/ContextualMetadata;Lcom/aspiro/wamp/playqueue/source/model/Source;)Z + + :done + sget-object v0, Lkotlin/u;->a:Lkotlin/u; + + return-object v0 +.end method + +.method public setContext(Landroid/content/Context;)V + .locals 0 + + iput-object p1, p0, Lradiant/swipe/AlbumItemQueueAction;->context:Landroid/content/Context; + + return-void +.end method diff --git a/patches/extension/radiant/swipe/ComposeSearchQueue.smali b/patches/extension/radiant/swipe/ComposeSearchQueue.smali new file mode 100644 index 0000000..1f20e8c --- /dev/null +++ b/patches/extension/radiant/swipe/ComposeSearchQueue.smali @@ -0,0 +1,270 @@ +.class public final Lradiant/swipe/ComposeSearchQueue; +.super Ljava/lang/Object; +.source "ComposeSearchQueue.smali" + + +# direct methods +.method public static handle(Lcom/tidal/android/feature/search/ui/SearchScreenViewModel;Lradiant/swipe/ComposeSearchQueueEvent;)V + .locals 10 + + if-eqz p0, :done + + if-eqz p1, :done + + iget-object v8, p1, Lradiant/swipe/ComposeSearchQueueEvent;->context:Landroid/content/Context; + + if-eqz v8, :done + + iget-object v2, p1, Lradiant/swipe/ComposeSearchQueueEvent;->id:Ljava/lang/String; + + if-eqz v2, :done + + iget v4, p1, Lradiant/swipe/ComposeSearchQueueEvent;->type:I + + const/4 v0, 0x1 + + if-lt v4, v0, :done + + const/4 v0, 0x4 + + if-gt v4, v0, :done + + iget-object v0, p0, Lcom/tidal/android/feature/search/ui/SearchScreenViewModel;->n:Ljava/util/List; + + invoke-interface {v0}, Ljava/lang/Iterable;->iterator()Ljava/util/Iterator; + + move-result-object v0 + + :find_row + invoke-interface {v0}, Ljava/util/Iterator;->hasNext()Z + + move-result v1 + + if-eqz v1, :done + + invoke-interface {v0}, Ljava/util/Iterator;->next()Ljava/lang/Object; + + move-result-object v1 + + check-cast v1, Lmb0/e; + + invoke-static {v1}, Lmb0/f;->a(Lmb0/e;)Ljava/lang/String; + + move-result-object v9 + + invoke-virtual {v2, v9}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z + + move-result v9 + + if-eqz v9, :find_row + + instance-of v9, v1, Lmb0/a; + + if-eqz v9, :find_row + + check-cast v1, Lmb0/a; + + iget-object v3, v1, Lmb0/a;->a:Lh40/n; + + const/4 v9, 0x1 + + if-ne v4, v9, :check_album + + instance-of v9, v3, Lh40/p; + + if-eqz v9, :find_row + + goto :recover_dependencies + + :check_album + const/4 v9, 0x2 + + if-ne v4, v9, :check_playlist + + instance-of v9, v3, Lh40/a; + + if-eqz v9, :find_row + + goto :recover_dependencies + + :check_playlist + const/4 v9, 0x3 + + if-ne v4, v9, :check_mix + + instance-of v9, v3, Lh40/j; + + if-eqz v9, :find_row + + goto :recover_dependencies + + :check_mix + instance-of v9, v3, Lh40/i; + + if-eqz v9, :find_row + + :recover_dependencies + iget-object v9, p0, Lcom/tidal/android/feature/search/ui/SearchScreenViewModel;->d:Lcom/tidal/android/feature/search/ui/e; + + instance-of v0, v9, Lv9/e; + + if-eqz v0, :done + + check-cast v9, Lv9/e; + + iget-object v5, v9, Lv9/e;->b:Lcom/tidal/android/navigation/NavigationInfo; + + iget-object v9, v9, Lv9/e;->a:Lcom/aspiro/wamp/core/k; + + const/4 v6, 0x0 + + const/4 v0, 0x2 + + if-eq v4, v0, :recover_menu + + const/4 v0, 0x4 + + if-ne v4, v0, :dependencies_ready + + :recover_menu + + instance-of v0, v9, Lh9/p1; + + if-eqz v0, :done + + check-cast v9, Lh9/p1; + + iget-object v9, v9, Lh9/p1;->b:Lx40/a; + + instance-of v0, v9, Lh4/a; + + if-eqz v0, :done + + move-object v6, v9 + + check-cast v6, Lh4/a; + + :dependencies_ready + + new-instance v7, Lcom/aspiro/wamp/eventtracking/model/ContextualMetadata; + + const-string v0, "search" + + invoke-direct {v7, v0, v2}, Lcom/aspiro/wamp/eventtracking/model/ContextualMetadata;->(Ljava/lang/String;Ljava/lang/String;)V + + const/4 v0, 0x1 + + if-ne v4, v0, :album + + check-cast v3, Lh40/p; + + invoke-static {}, Lradiant/swipe/QueueExecutor;->hasActiveQueue()Z + + move-result v0 + + if-eqz v0, :play_track + + invoke-static {v3}, Lie0/i;->a(Lh40/p;)Lcom/aspiro/wamp/model/Track; + + move-result-object v9 + + iget-object v4, p0, Lcom/tidal/android/feature/search/ui/SearchScreenViewModel;->m:Lkotlinx/coroutines/flow/MutableStateFlow; + + invoke-interface {v4}, Lkotlinx/coroutines/flow/MutableStateFlow;->getValue()Ljava/lang/Object; + + move-result-object v4 + + check-cast v4, Lcom/tidal/android/feature/search/ui/SearchQuery; + + iget-object v4, v4, Lcom/tidal/android/feature/search/ui/SearchQuery;->a:Ljava/lang/String; + + if-nez v4, :track_query_ready + + const-string v4, "" + + :track_query_ready + const/4 v1, 0x0 + + if-eqz v5, :track_navigation_ready + + invoke-static {v5}, Lcom/tidal/android/navigation/a;->b(Lcom/tidal/android/navigation/NavigationInfo;)Lcom/tidal/android/navigation/NavigationInfo$Node; + + move-result-object v1 + + :track_navigation_ready + invoke-static {v2, v4, v1}, Lcom/aspiro/wamp/playqueue/source/model/b;->o(Ljava/lang/String;Ljava/lang/String;Lcom/tidal/android/navigation/NavigationInfo;)Lcom/aspiro/wamp/playqueue/source/model/ItemSource; + + move-result-object v4 + + invoke-virtual {v4, v9}, Lcom/aspiro/wamp/playqueue/source/model/Source;->addSourceItem(Lcom/aspiro/wamp/model/MediaItem;)V + + invoke-static {v8, v9, v7, v4}, Lradiant/swipe/QueueExecutor;->track(Landroid/content/Context;Lcom/aspiro/wamp/model/Track;Lcom/aspiro/wamp/eventtracking/model/ContextualMetadata;Lcom/aspiro/wamp/playqueue/source/model/Source;)Z + + goto :done + + :play_track + iget-object v5, p0, Lcom/tidal/android/feature/search/ui/SearchScreenViewModel;->m:Lkotlinx/coroutines/flow/MutableStateFlow; + + invoke-interface {v5}, Lkotlinx/coroutines/flow/MutableStateFlow;->getValue()Ljava/lang/Object; + + move-result-object v5 + + check-cast v5, Lcom/tidal/android/feature/search/ui/SearchQuery; + + iget-object v5, v5, Lcom/tidal/android/feature/search/ui/SearchQuery;->a:Ljava/lang/String; + + if-nez v5, :play_query_ready + + const-string v5, "" + + :play_query_ready + iget-object v9, p0, Lcom/tidal/android/feature/search/ui/SearchScreenViewModel;->f:Lcom/tidal/android/feature/search/ui/f; + + iget-wide v0, v3, Lh40/p;->a:J + + invoke-interface {v9, v0, v1, v3, v5}, Lcom/tidal/android/feature/search/ui/f;->a(JLh40/p;Ljava/lang/String;)V + + goto :done + + :album + const/4 v0, 0x2 + + if-ne v4, v0, :playlist + + check-cast v3, Lh40/a; + + invoke-static {v3}, Lie0/a;->a(Lh40/a;)Lcom/aspiro/wamp/model/Album; + + move-result-object v9 + + invoke-static {v8, v9, v7, v5, v6}, Lradiant/swipe/QueueExecutor;->album(Landroid/content/Context;Lcom/aspiro/wamp/model/Album;Lcom/aspiro/wamp/eventtracking/model/ContextualMetadata;Lcom/tidal/android/navigation/NavigationInfo;Lh4/a;)Lio/reactivex/disposables/Disposable; + + goto :done + + :playlist + const/4 v0, 0x3 + + if-ne v4, v0, :mix + + check-cast v3, Lh40/j; + + invoke-static {v3}, Lie0/h;->a(Lh40/j;)Lcom/aspiro/wamp/model/Playlist; + + move-result-object v9 + + invoke-static {v8, v9, v7, v5}, Lradiant/swipe/QueueExecutor;->playlist(Landroid/content/Context;Lcom/aspiro/wamp/model/Playlist;Lcom/aspiro/wamp/eventtracking/model/ContextualMetadata;Lcom/tidal/android/navigation/NavigationInfo;)V + + goto :done + + :mix + check-cast v3, Lh40/i; + + invoke-static {v3}, Lie0/g;->b(Lh40/i;)Lcom/aspiro/wamp/mix/model/Mix; + + move-result-object v9 + + invoke-static {v8, v9, v7, v5, v6}, Lradiant/swipe/QueueExecutor;->mix(Landroid/content/Context;Lcom/aspiro/wamp/mix/model/Mix;Lcom/aspiro/wamp/eventtracking/model/ContextualMetadata;Lcom/tidal/android/navigation/NavigationInfo;Lh4/a;)Lio/reactivex/disposables/Disposable; + + :done + return-void +.end method diff --git a/patches/extension/radiant/swipe/ComposeSearchQueueAction.smali b/patches/extension/radiant/swipe/ComposeSearchQueueAction.smali new file mode 100644 index 0000000..1b2ccf9 --- /dev/null +++ b/patches/extension/radiant/swipe/ComposeSearchQueueAction.smali @@ -0,0 +1,220 @@ +.class public final Lradiant/swipe/ComposeSearchQueueAction; +.super Ljava/lang/Object; +.source "ComposeSearchQueueAction.smali" + +# interfaces +.implements Lradiant/swipe/ComposeSwipeAction; + + +# instance fields +.field private final callback:Lam0/l; + +.field private context:Landroid/content/Context; + +.field private final id:Ljava/lang/String; + +.field private final type:I + + +# direct methods +.method public constructor (Lam0/l;Lpb0/b;)V + .locals 1 + + invoke-direct {p0}, Ljava/lang/Object;->()V + + iput-object p1, p0, Lradiant/swipe/ComposeSearchQueueAction;->callback:Lam0/l; + + invoke-static {p2}, Lradiant/swipe/ComposeSearchQueueAction;->key(Lpb0/b;)Ljava/lang/String; + + move-result-object v0 + + iput-object v0, p0, Lradiant/swipe/ComposeSearchQueueAction;->id:Ljava/lang/String; + + invoke-static {p2}, Lradiant/swipe/ComposeSearchQueueAction;->type(Lpb0/b;)I + + move-result p1 + + iput p1, p0, Lradiant/swipe/ComposeSearchQueueAction;->type:I + + return-void +.end method + +.method public static key(Lpb0/b;)Ljava/lang/String; + .locals 2 + + instance-of v0, p0, Lpb0/b$i; + + if-eqz v0, :album + + check-cast p0, Lpb0/b$i; + + iget-wide v0, p0, Lpb0/b$i;->a:J + + invoke-static {v0, v1}, Ljava/lang/String;->valueOf(J)Ljava/lang/String; + + move-result-object p0 + + return-object p0 + + :album + instance-of v0, p0, Lpb0/b$a; + + if-eqz v0, :playlist + + check-cast p0, Lpb0/b$a; + + iget-wide v0, p0, Lpb0/b$a;->a:J + + invoke-static {v0, v1}, Ljava/lang/String;->valueOf(J)Ljava/lang/String; + + move-result-object p0 + + return-object p0 + + :playlist + instance-of v0, p0, Lpb0/b$f; + + if-eqz v0, :mix + + check-cast p0, Lpb0/b$f; + + iget-object p0, p0, Lpb0/b$f;->a:Ljava/lang/String; + + return-object p0 + + :mix + instance-of v0, p0, Lpb0/b$e; + + if-eqz v0, :invalid + + check-cast p0, Lpb0/b$e; + + iget-object p0, p0, Lpb0/b$e;->a:Ljava/lang/String; + + return-object p0 + + :invalid + const/4 p0, 0x0 + + return-object p0 +.end method + +.method public stableKey()Ljava/lang/String; + .locals 3 + + iget-object v0, p0, Lradiant/swipe/ComposeSearchQueueAction;->id:Ljava/lang/String; + + if-eqz v0, :invalid + + iget v1, p0, Lradiant/swipe/ComposeSearchQueueAction;->type:I + + if-eqz v1, :invalid + + new-instance v2, Ljava/lang/StringBuilder; + + invoke-direct {v2}, Ljava/lang/StringBuilder;->()V + + invoke-virtual {v2, v1}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder; + + const/16 v1, 0x3a + + invoke-virtual {v2, v1}, Ljava/lang/StringBuilder;->append(C)Ljava/lang/StringBuilder; + + invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; + + invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; + + move-result-object v0 + + return-object v0 + + :invalid + const/4 v0, 0x0 + + return-object v0 +.end method + +.method private static type(Lpb0/b;)I + .locals 1 + + instance-of v0, p0, Lpb0/b$i; + + if-eqz v0, :album + + const/4 p0, 0x1 + + return p0 + + :album + instance-of v0, p0, Lpb0/b$a; + + if-eqz v0, :playlist + + const/4 p0, 0x2 + + return p0 + + :playlist + instance-of v0, p0, Lpb0/b$f; + + if-eqz v0, :mix + + const/4 p0, 0x3 + + return p0 + + :mix + instance-of p0, p0, Lpb0/b$e; + + if-eqz p0, :invalid + + const/4 p0, 0x4 + + return p0 + + :invalid + const/4 p0, 0x0 + + return p0 +.end method + + +# virtual methods +.method public invoke()Ljava/lang/Object; + .locals 4 + + iget-object v0, p0, Lradiant/swipe/ComposeSearchQueueAction;->callback:Lam0/l; + + if-eqz v0, :done + + iget-object v1, p0, Lradiant/swipe/ComposeSearchQueueAction;->context:Landroid/content/Context; + + if-eqz v1, :done + + iget-object v2, p0, Lradiant/swipe/ComposeSearchQueueAction;->id:Ljava/lang/String; + + if-eqz v2, :done + + iget v3, p0, Lradiant/swipe/ComposeSearchQueueAction;->type:I + + if-eqz v3, :done + + new-instance p0, Lradiant/swipe/ComposeSearchQueueEvent; + + invoke-direct {p0, v1, v2, v3}, Lradiant/swipe/ComposeSearchQueueEvent;->(Landroid/content/Context;Ljava/lang/String;I)V + + invoke-interface {v0, p0}, Lam0/l;->invoke(Ljava/lang/Object;)Ljava/lang/Object; + + :done + sget-object v0, Lkotlin/u;->a:Lkotlin/u; + + return-object v0 +.end method + +.method public setContext(Landroid/content/Context;)V + .locals 0 + + iput-object p1, p0, Lradiant/swipe/ComposeSearchQueueAction;->context:Landroid/content/Context; + + return-void +.end method diff --git a/patches/extension/radiant/swipe/ComposeSearchQueueEvent.smali b/patches/extension/radiant/swipe/ComposeSearchQueueEvent.smali new file mode 100644 index 0000000..c5eeeed --- /dev/null +++ b/patches/extension/radiant/swipe/ComposeSearchQueueEvent.smali @@ -0,0 +1,40 @@ +.class public final Lradiant/swipe/ComposeSearchQueueEvent; +.super Ljava/lang/Object; +.source "ComposeSearchQueueEvent.smali" + +# interfaces +.implements Lcom/tidal/android/feature/search/ui/b; + + +# static fields +.field public static final TYPE_ALBUM:I = 0x2 + +.field public static final TYPE_MIX:I = 0x4 + +.field public static final TYPE_PLAYLIST:I = 0x3 + +.field public static final TYPE_TRACK:I = 0x1 + + +# instance fields +.field public final context:Landroid/content/Context; + +.field public final id:Ljava/lang/String; + +.field public final type:I + + +# direct methods +.method public constructor (Landroid/content/Context;Ljava/lang/String;I)V + .locals 0 + + invoke-direct {p0}, Ljava/lang/Object;->()V + + iput-object p1, p0, Lradiant/swipe/ComposeSearchQueueEvent;->context:Landroid/content/Context; + + iput-object p2, p0, Lradiant/swipe/ComposeSearchQueueEvent;->id:Ljava/lang/String; + + iput p3, p0, Lradiant/swipe/ComposeSearchQueueEvent;->type:I + + return-void +.end method diff --git a/patches/extension/radiant/swipe/ComposeSwipeAction.smali b/patches/extension/radiant/swipe/ComposeSwipeAction.smali new file mode 100644 index 0000000..afd97e3 --- /dev/null +++ b/patches/extension/radiant/swipe/ComposeSwipeAction.smali @@ -0,0 +1,14 @@ +.class public interface abstract Lradiant/swipe/ComposeSwipeAction; +.super Ljava/lang/Object; +.source "ComposeSwipeAction.smali" + +# interfaces +.implements Lam0/a; + + +# virtual methods +.method public abstract invoke()Ljava/lang/Object; +.end method + +.method public abstract setContext(Landroid/content/Context;)V +.end method diff --git a/patches/extension/radiant/swipe/ComposeSwipeState$Draw.smali b/patches/extension/radiant/swipe/ComposeSwipeState$Draw.smali new file mode 100644 index 0000000..52bc098 --- /dev/null +++ b/patches/extension/radiant/swipe/ComposeSwipeState$Draw.smali @@ -0,0 +1,227 @@ +.class public final Lradiant/swipe/ComposeSwipeState$Draw; +.super Ljava/lang/Object; +.implements Lam0/l; + + +# annotations +.annotation system Ldalvik/annotation/EnclosingClass; + value = Lradiant/swipe/ComposeSwipeState; +.end annotation + +.annotation system Ldalvik/annotation/InnerClass; + accessFlags = 0x19 + name = "Draw" +.end annotation + + +# instance fields +.field private final state:Lradiant/swipe/ComposeSwipeState; + + +# direct methods +.method public constructor (Lradiant/swipe/ComposeSwipeState;)V + .locals 0 + + invoke-direct {p0}, Ljava/lang/Object;->()V + + iput-object p1, p0, Lradiant/swipe/ComposeSwipeState$Draw;->state:Lradiant/swipe/ComposeSwipeState; + + return-void +.end method + + +# virtual methods +.method public invoke(Landroidx/compose/ui/graphics/drawscope/ContentDrawScope;)Lkotlin/u; + .locals 16 + + move-object/from16 v0, p1 + + move-object/from16 v5, p0 + + invoke-interface {v0}, Landroidx/compose/ui/graphics/drawscope/DrawScope;->getSize-NH-jbRc()J + + move-result-wide v1 + + invoke-static {v1, v2}, Landroidx/compose/ui/geometry/Size;->getWidth-impl(J)F + + move-result v3 + + invoke-static {v1, v2}, Landroidx/compose/ui/geometry/Size;->getHeight-impl(J)F + + move-result v4 + + iget-object v5, v5, Lradiant/swipe/ComposeSwipeState$Draw;->state:Lradiant/swipe/ComposeSwipeState; + + iput v3, v5, Lradiant/swipe/ComposeSwipeState;->rowWidth:F + + iget-object v1, v5, Lradiant/swipe/ComposeSwipeState;->translation:Landroidx/compose/runtime/MutableFloatState; + + invoke-interface {v1}, Landroidx/compose/runtime/MutableFloatState;->getFloatValue()F + + move-result v6 + + const/4 v1, 0x0 + + cmpl-float v2, v6, v1 + + if-eqz v2, :draw_plain + + invoke-interface {v0}, Landroidx/compose/ui/graphics/drawscope/DrawScope;->getDrawContext()Landroidx/compose/ui/graphics/drawscope/DrawContext; + + move-result-object v2 + + invoke-interface {v2}, Landroidx/compose/ui/graphics/drawscope/DrawContext;->getCanvas()Landroidx/compose/ui/graphics/Canvas; + + move-result-object v2 + + invoke-static {v2}, Landroidx/compose/ui/graphics/AndroidCanvas_androidKt;->getNativeCanvas(Landroidx/compose/ui/graphics/Canvas;)Landroid/graphics/Canvas; + + move-result-object v7 + + invoke-virtual {v7}, Landroid/graphics/Canvas;->save()I + + move-result v8 + + const/16 v9, __RL_SWIPE_TO_QUEUE_DIRECTION__ + + const/4 v10, 0x4 + + if-ne v9, v10, :right_exposure + + add-float v9, v3, v6 + + invoke-static {v1, v9}, Ljava/lang/Math;->max(FF)F + + move-result v9 + + move v10, v3 + + goto :exposure_ready + + :right_exposure + move v9, v1 + + invoke-static {v3, v6}, Ljava/lang/Math;->min(FF)F + + move-result v10 + + :exposure_ready + invoke-virtual {v7, v9, v1, v10, v4}, Landroid/graphics/Canvas;->clipRect(FFFF)Z + + iget v11, v5, Lradiant/swipe/ComposeSwipeState;->green:I + + invoke-virtual {v7, v11}, Landroid/graphics/Canvas;->drawColor(I)V + + iget-object v11, v5, Lradiant/swipe/ComposeSwipeState;->icon:Landroid/graphics/drawable/Drawable; + + if-eqz v11, :background_done + + invoke-virtual {v11}, Landroid/graphics/drawable/Drawable;->getIntrinsicWidth()I + + move-result v12 + + invoke-virtual {v11}, Landroid/graphics/drawable/Drawable;->getIntrinsicHeight()I + + move-result v13 + + if-lez v12, :background_done + + if-lez v13, :background_done + + const/high16 v14, 0x41800000 # 16.0f + + invoke-virtual {v5, v14}, Lradiant/swipe/ComposeSwipeState;->dp(F)F + + move-result v14 + + const/16 v15, __RL_SWIPE_TO_QUEUE_DIRECTION__ + + const/4 v1, 0x4 + + if-ne v15, v1, :right_icon + + int-to-float v1, v12 + + sub-float v1, v3, v1 + + sub-float/2addr v1, v14 + + goto :icon_x_ready + + :right_icon + move v1, v14 + + :icon_x_ready + int-to-float v14, v13 + + sub-float v14, v4, v14 + + const/high16 v15, 0x40000000 # 2.0f + + div-float/2addr v14, v15 + + float-to-int v15, v1 + + float-to-int v14, v14 + + add-int v1, v15, v12 + + add-int v12, v14, v13 + + invoke-virtual {v11, v15, v14, v1, v12}, Landroid/graphics/drawable/Drawable;->setBounds(IIII)V + + const/16 v1, 0xff + + invoke-virtual {v11, v1}, Landroid/graphics/drawable/Drawable;->setAlpha(I)V + + invoke-virtual {v11, v7}, Landroid/graphics/drawable/Drawable;->draw(Landroid/graphics/Canvas;)V + + :background_done + invoke-virtual {v7, v8}, Landroid/graphics/Canvas;->restoreToCount(I)V + + invoke-virtual {v7}, Landroid/graphics/Canvas;->save()I + + move-result v8 + + const/4 v1, 0x0 + + invoke-virtual {v7, v1, v1, v3, v4}, Landroid/graphics/Canvas;->clipRect(FFFF)Z + + invoke-virtual {v7, v6, v1}, Landroid/graphics/Canvas;->translate(FF)V + + :try_start_0 + invoke-interface {v0}, Landroidx/compose/ui/graphics/drawscope/ContentDrawScope;->drawContent()V + :try_end_0 + .catchall {:try_start_0 .. :try_end_0} :catchall_0 + + invoke-virtual {v7, v8}, Landroid/graphics/Canvas;->restoreToCount(I)V + + goto :done + + :catchall_0 + move-exception v0 + + invoke-virtual {v7, v8}, Landroid/graphics/Canvas;->restoreToCount(I)V + + throw v0 + + :draw_plain + invoke-interface {v0}, Landroidx/compose/ui/graphics/drawscope/ContentDrawScope;->drawContent()V + + :done + sget-object v0, Lkotlin/u;->a:Lkotlin/u; + + return-object v0 +.end method + +.method public bridge synthetic invoke(Ljava/lang/Object;)Ljava/lang/Object; + .locals 1 + + check-cast p1, Landroidx/compose/ui/graphics/drawscope/ContentDrawScope; + + invoke-virtual {p0, p1}, Lradiant/swipe/ComposeSwipeState$Draw;->invoke(Landroidx/compose/ui/graphics/drawscope/ContentDrawScope;)Lkotlin/u; + + move-result-object v0 + + return-object v0 +.end method diff --git a/patches/extension/radiant/swipe/ComposeSwipeState$Gesture.smali b/patches/extension/radiant/swipe/ComposeSwipeState$Gesture.smali new file mode 100644 index 0000000..7968b03 --- /dev/null +++ b/patches/extension/radiant/swipe/ComposeSwipeState$Gesture.smali @@ -0,0 +1,231 @@ +.class public final Lradiant/swipe/ComposeSwipeState$Gesture; +.super Landroidx/compose/ui/input/pointer/PointerInputFilter; +.implements Lam0/l; +.implements Landroidx/compose/ui/input/pointer/PointerInputModifier; + + +# annotations +.annotation system Ldalvik/annotation/EnclosingClass; + value = Lradiant/swipe/ComposeSwipeState; +.end annotation + +.annotation system Ldalvik/annotation/InnerClass; + accessFlags = 0x19 + name = "Gesture" +.end annotation + + +# instance fields +.field private consumeAfterDispatch:Z + +.field private final state:Lradiant/swipe/ComposeSwipeState; + + +# direct methods +.method public constructor (Lradiant/swipe/ComposeSwipeState;)V + .locals 0 + + invoke-direct {p0}, Landroidx/compose/ui/input/pointer/PointerInputFilter;->()V + + iput-object p1, p0, Lradiant/swipe/ComposeSwipeState$Gesture;->state:Lradiant/swipe/ComposeSwipeState; + + return-void +.end method + + +# virtual methods +.method public getInterceptOutOfBoundsChildEvents()Z + .locals 1 + + const/4 v0, 0x1 + + return v0 +.end method + +.method public getPointerInputFilter()Landroidx/compose/ui/input/pointer/PointerInputFilter; + .locals 0 + + return-object p0 +.end method + +.method public invoke(Landroid/view/MotionEvent;)Lkotlin/u; + .locals 3 + + invoke-virtual {p1}, Landroid/view/MotionEvent;->getActionMasked()I + + move-result v0 + + const/4 v1, 0x0 + + iput-boolean v1, p0, Lradiant/swipe/ComposeSwipeState$Gesture;->consumeAfterDispatch:Z + + if-eqz v0, :down + + const/4 v1, 0x1 + + if-eq v0, v1, :up + + const/4 v1, 0x2 + + if-eq v0, v1, :move + + const/4 v1, 0x3 + + if-eq v0, v1, :cancel + + const/4 v1, 0x5 + + if-eq v0, v1, :cancel + + const/4 v1, 0x6 + + if-eq v0, v1, :cancel + + goto :done + + :down + invoke-virtual {p1}, Landroid/view/MotionEvent;->getRawX()F + + move-result v0 + + invoke-virtual {p1}, Landroid/view/MotionEvent;->getRawY()F + + move-result v1 + + iget-object v2, p0, Lradiant/swipe/ComposeSwipeState$Gesture;->state:Lradiant/swipe/ComposeSwipeState; + + invoke-virtual {v2, v0, v1}, Lradiant/swipe/ComposeSwipeState;->begin(FF)V + + goto :done + + :move + invoke-virtual {p1}, Landroid/view/MotionEvent;->getRawX()F + + move-result v0 + + invoke-virtual {p1}, Landroid/view/MotionEvent;->getRawY()F + + move-result v1 + + iget-object v2, p0, Lradiant/swipe/ComposeSwipeState$Gesture;->state:Lradiant/swipe/ComposeSwipeState; + + invoke-virtual {v2, v0, v1}, Lradiant/swipe/ComposeSwipeState;->move(FF)V + + goto :done + + :up + invoke-virtual {p1}, Landroid/view/MotionEvent;->getRawX()F + + move-result v0 + + invoke-virtual {p1}, Landroid/view/MotionEvent;->getRawY()F + + move-result v1 + + iget-object v2, p0, Lradiant/swipe/ComposeSwipeState$Gesture;->state:Lradiant/swipe/ComposeSwipeState; + + invoke-virtual {v2, v0, v1}, Lradiant/swipe/ComposeSwipeState;->move(FF)V + + iget-boolean v0, v2, Lradiant/swipe/ComposeSwipeState;->locked:Z + + iput-boolean v0, p0, Lradiant/swipe/ComposeSwipeState$Gesture;->consumeAfterDispatch:Z + + invoke-virtual {v2}, Lradiant/swipe/ComposeSwipeState;->finish()V + + goto :done + + :cancel + iget-object v0, p0, Lradiant/swipe/ComposeSwipeState$Gesture;->state:Lradiant/swipe/ComposeSwipeState; + + invoke-virtual {v0}, Lradiant/swipe/ComposeSwipeState;->cancelGesture()V + + :done + sget-object p1, Lkotlin/u;->a:Lkotlin/u; + + return-object p1 +.end method + +.method public bridge synthetic invoke(Ljava/lang/Object;)Ljava/lang/Object; + .locals 1 + + check-cast p1, Landroid/view/MotionEvent; + + invoke-virtual {p0, p1}, Lradiant/swipe/ComposeSwipeState$Gesture;->invoke(Landroid/view/MotionEvent;)Lkotlin/u; + + move-result-object v0 + + return-object v0 +.end method + +.method public onCancel()V + .locals 1 + + iget-object v0, p0, Lradiant/swipe/ComposeSwipeState$Gesture;->state:Lradiant/swipe/ComposeSwipeState; + + invoke-virtual {v0}, Lradiant/swipe/ComposeSwipeState;->cancelGesture()V + + return-void +.end method + +.method public onPointerEvent-H0pRuoY(Landroidx/compose/ui/input/pointer/PointerEvent;Landroidx/compose/ui/input/pointer/PointerEventPass;J)V + .locals 4 + + sget-object v0, Landroidx/compose/ui/input/pointer/PointerEventPass;->Initial:Landroidx/compose/ui/input/pointer/PointerEventPass; + + if-ne p2, v0, :done + + iget-object v0, p0, Lradiant/swipe/ComposeSwipeState$Gesture;->state:Lradiant/swipe/ComposeSwipeState; + + iget-boolean v1, v0, Lradiant/swipe/ComposeSwipeState;->locked:Z + + const/4 v2, 0x0 + + iput-boolean v2, p0, Lradiant/swipe/ComposeSwipeState$Gesture;->consumeAfterDispatch:Z + + invoke-virtual {p1}, Landroidx/compose/ui/input/pointer/PointerEvent;->getMotionEvent()Landroid/view/MotionEvent; + + move-result-object v2 + + if-eqz v2, :after_dispatch + + invoke-virtual {p0, v2}, Lradiant/swipe/ComposeSwipeState$Gesture;->invoke(Landroid/view/MotionEvent;)Lkotlin/u; + + :after_dispatch + iget-boolean v2, p0, Lradiant/swipe/ComposeSwipeState$Gesture;->consumeAfterDispatch:Z + + or-int/2addr v1, v2 + + iget-boolean v2, v0, Lradiant/swipe/ComposeSwipeState;->locked:Z + + or-int/2addr v1, v2 + + if-eqz v1, :done + + invoke-virtual {p1}, Landroidx/compose/ui/input/pointer/PointerEvent;->getChanges()Ljava/util/List; + + move-result-object v0 + + invoke-interface {v0}, Ljava/util/List;->size()I + + move-result v1 + + const/4 v2, 0x0 + + :consume_loop + if-ge v2, v1, :done + + invoke-interface {v0, v2}, Ljava/util/List;->get(I)Ljava/lang/Object; + + move-result-object v3 + + check-cast v3, Landroidx/compose/ui/input/pointer/PointerInputChange; + + invoke-virtual {v3}, Landroidx/compose/ui/input/pointer/PointerInputChange;->consume()V + + add-int/lit8 v2, v2, 0x1 + + goto :consume_loop + + :done + return-void +.end method diff --git a/patches/extension/radiant/swipe/ComposeSwipeState$ResetAnimator.smali b/patches/extension/radiant/swipe/ComposeSwipeState$ResetAnimator.smali new file mode 100644 index 0000000..34a747b --- /dev/null +++ b/patches/extension/radiant/swipe/ComposeSwipeState$ResetAnimator.smali @@ -0,0 +1,67 @@ +.class public final Lradiant/swipe/ComposeSwipeState$ResetAnimator; +.super Ljava/lang/Object; +.implements Landroid/animation/ValueAnimator$AnimatorUpdateListener; + + +# annotations +.annotation system Ldalvik/annotation/EnclosingClass; + value = Lradiant/swipe/ComposeSwipeState; +.end annotation + +.annotation system Ldalvik/annotation/InnerClass; + accessFlags = 0x19 + name = "ResetAnimator" +.end annotation + + +# instance fields +.field private final state:Lradiant/swipe/ComposeSwipeState; + + +# direct methods +.method public constructor (Lradiant/swipe/ComposeSwipeState;)V + .locals 0 + + invoke-direct {p0}, Ljava/lang/Object;->()V + + iput-object p1, p0, Lradiant/swipe/ComposeSwipeState$ResetAnimator;->state:Lradiant/swipe/ComposeSwipeState; + + return-void +.end method + + +# virtual methods +.method public onAnimationUpdate(Landroid/animation/ValueAnimator;)V + .locals 3 + + invoke-virtual {p1}, Landroid/animation/ValueAnimator;->getAnimatedValue()Ljava/lang/Object; + + move-result-object v0 + + check-cast v0, Ljava/lang/Float; + + invoke-virtual {v0}, Ljava/lang/Float;->floatValue()F + + move-result v0 + + iget-object v1, p0, Lradiant/swipe/ComposeSwipeState$ResetAnimator;->state:Lradiant/swipe/ComposeSwipeState; + + invoke-virtual {v1, v0}, Lradiant/swipe/ComposeSwipeState;->setOffset(F)V + + invoke-virtual {p1}, Landroid/animation/ValueAnimator;->getAnimatedFraction()F + + move-result v0 + + const/high16 v2, 0x3f800000 # 1.0f + + cmpg-float v0, v0, v2 + + if-gez v0, :finished + + return-void + + :finished + invoke-virtual {v1, p1}, Lradiant/swipe/ComposeSwipeState;->clearAnimator(Landroid/animation/ValueAnimator;)V + + return-void +.end method diff --git a/patches/extension/radiant/swipe/ComposeSwipeState.smali b/patches/extension/radiant/swipe/ComposeSwipeState.smali new file mode 100644 index 0000000..9e91c76 --- /dev/null +++ b/patches/extension/radiant/swipe/ComposeSwipeState.smali @@ -0,0 +1,657 @@ +.class public final Lradiant/swipe/ComposeSwipeState; +.super Ljava/lang/Object; + + +# instance fields +.field translation:Landroidx/compose/runtime/MutableFloatState; + +.field action:Lradiant/swipe/ComposeSwipeAction; + +.field context:Landroid/content/Context; + +.field view:Landroid/view/View; + +.field enabled:Z + +.field downX:F + +.field downY:F + +.field tracking:Z + +.field locked:Z + +.field armed:Z + +.field rowWidth:F + +.field animator:Landroid/animation/ValueAnimator; + +.field final gesture:Lradiant/swipe/ComposeSwipeState$Gesture; + +.field final draw:Lradiant/swipe/ComposeSwipeState$Draw; + +.field icon:Landroid/graphics/drawable/Drawable; + +.field green:I + + +# direct methods +.method public constructor ()V + .locals 2 + + invoke-direct {p0}, Ljava/lang/Object;->()V + + const/4 v0, 0x0 + + invoke-static {v0}, Landroidx/compose/runtime/PrimitiveSnapshotStateKt;->mutableFloatStateOf(F)Landroidx/compose/runtime/MutableFloatState; + + move-result-object v0 + + iput-object v0, p0, Lradiant/swipe/ComposeSwipeState;->translation:Landroidx/compose/runtime/MutableFloatState; + + new-instance v0, Lradiant/swipe/ComposeSwipeState$Gesture; + + invoke-direct {v0, p0}, Lradiant/swipe/ComposeSwipeState$Gesture;->(Lradiant/swipe/ComposeSwipeState;)V + + iput-object v0, p0, Lradiant/swipe/ComposeSwipeState;->gesture:Lradiant/swipe/ComposeSwipeState$Gesture; + + new-instance v1, Lradiant/swipe/ComposeSwipeState$Draw; + + invoke-direct {v1, p0}, Lradiant/swipe/ComposeSwipeState$Draw;->(Lradiant/swipe/ComposeSwipeState;)V + + iput-object v1, p0, Lradiant/swipe/ComposeSwipeState;->draw:Lradiant/swipe/ComposeSwipeState$Draw; + + return-void +.end method + +.method public static attach(Landroidx/compose/ui/Modifier;Ljava/lang/Object;Lradiant/swipe/ComposeSwipeAction;ZLandroidx/compose/runtime/Composer;)Landroidx/compose/ui/Modifier; + .locals 5 + .annotation build Landroidx/compose/runtime/Composable; + .end annotation + + const v0, 0x4a33c921 + + invoke-interface {p4, v0}, Landroidx/compose/runtime/Composer;->startReplaceGroup(I)V + + invoke-static {}, Landroidx/compose/ui/platform/AndroidCompositionLocals_androidKt;->getLocalView()Landroidx/compose/runtime/ProvidableCompositionLocal; + + move-result-object v0 + + invoke-interface {p4, v0}, Landroidx/compose/runtime/Composer;->consume(Landroidx/compose/runtime/CompositionLocal;)Ljava/lang/Object; + + move-result-object v0 + + check-cast v0, Landroid/view/View; + + invoke-interface {p4, p1}, Landroidx/compose/runtime/Composer;->changed(Ljava/lang/Object;)Z + + move-result v1 + + invoke-interface {p4}, Landroidx/compose/runtime/Composer;->rememberedValue()Ljava/lang/Object; + + move-result-object v2 + + if-nez v1, :new_state + + sget-object v3, Landroidx/compose/runtime/Composer;->Companion:Landroidx/compose/runtime/Composer$Companion; + + invoke-virtual {v3}, Landroidx/compose/runtime/Composer$Companion;->getEmpty()Ljava/lang/Object; + + move-result-object v3 + + if-ne v2, v3, :state_ready + + :new_state + new-instance v2, Lradiant/swipe/ComposeSwipeState; + + invoke-direct {v2}, Lradiant/swipe/ComposeSwipeState;->()V + + invoke-interface {p4, v2}, Landroidx/compose/runtime/Composer;->updateRememberedValue(Ljava/lang/Object;)V + + :state_ready + check-cast v2, Lradiant/swipe/ComposeSwipeState; + + invoke-virtual {v2, p2, p3, v0}, Lradiant/swipe/ComposeSwipeState;->update(Lradiant/swipe/ComposeSwipeAction;ZLandroid/view/View;)V + + iget-object v1, v2, Lradiant/swipe/ComposeSwipeState;->gesture:Lradiant/swipe/ComposeSwipeState$Gesture; + + check-cast v1, Landroidx/compose/ui/Modifier; + + invoke-interface {p0, v1}, Landroidx/compose/ui/Modifier;->then(Landroidx/compose/ui/Modifier;)Landroidx/compose/ui/Modifier; + + move-result-object p0 + + iget-object v1, v2, Lradiant/swipe/ComposeSwipeState;->draw:Lradiant/swipe/ComposeSwipeState$Draw; + + invoke-static {p0, v1}, Landroidx/compose/ui/draw/DrawModifierKt;->drawWithContent(Landroidx/compose/ui/Modifier;Lam0/l;)Landroidx/compose/ui/Modifier; + + move-result-object p0 + + invoke-interface {p4}, Landroidx/compose/runtime/Composer;->endReplaceGroup()V + + return-object p0 +.end method + + +# virtual methods +.method animateReset()V + .locals 7 + + iget-object v0, p0, Lradiant/swipe/ComposeSwipeState;->animator:Landroid/animation/ValueAnimator; + + const/4 v1, 0x0 + + if-eqz v0, :read_offset + + invoke-virtual {v0}, Landroid/animation/ValueAnimator;->cancel()V + + iput-object v1, p0, Lradiant/swipe/ComposeSwipeState;->animator:Landroid/animation/ValueAnimator; + + :read_offset + iget-object v0, p0, Lradiant/swipe/ComposeSwipeState;->translation:Landroidx/compose/runtime/MutableFloatState; + + invoke-interface {v0}, Landroidx/compose/runtime/MutableFloatState;->getFloatValue()F + + move-result v0 + + invoke-static {v0}, Ljava/lang/Math;->abs(F)F + + move-result v2 + + const/high16 v3, 0x3f000000 # 0.5f + + cmpg-float v2, v2, v3 + + if-lez v2, :snap + + const/4 v2, 0x2 + + new-array v2, v2, [F + + const/4 v3, 0x0 + + aput v0, v2, v3 + + const/4 v0, 0x1 + + const/4 v3, 0x0 + + aput v3, v2, v0 + + invoke-static {v2}, Landroid/animation/ValueAnimator;->ofFloat([F)Landroid/animation/ValueAnimator; + + move-result-object v0 + + const-wide/16 v4, 0xb4 + + invoke-virtual {v0, v4, v5}, Landroid/animation/ValueAnimator;->setDuration(J)Landroid/animation/ValueAnimator; + + new-instance v2, Landroid/view/animation/DecelerateInterpolator; + + const/high16 v4, 0x3fc00000 # 1.5f + + invoke-direct {v2, v4}, Landroid/view/animation/DecelerateInterpolator;->(F)V + + invoke-virtual {v0, v2}, Landroid/animation/ValueAnimator;->setInterpolator(Landroid/animation/TimeInterpolator;)V + + new-instance v2, Lradiant/swipe/ComposeSwipeState$ResetAnimator; + + invoke-direct {v2, p0}, Lradiant/swipe/ComposeSwipeState$ResetAnimator;->(Lradiant/swipe/ComposeSwipeState;)V + + invoke-virtual {v0, v2}, Landroid/animation/ValueAnimator;->addUpdateListener(Landroid/animation/ValueAnimator$AnimatorUpdateListener;)V + + iput-object v0, p0, Lradiant/swipe/ComposeSwipeState;->animator:Landroid/animation/ValueAnimator; + + invoke-virtual {v0}, Landroid/animation/ValueAnimator;->start()V + + return-void + + :snap + const/4 v3, 0x0 + + invoke-virtual {p0, v3}, Lradiant/swipe/ComposeSwipeState;->setOffset(F)V + + return-void +.end method + +.method begin(FF)V + .locals 3 + + invoke-virtual {p0}, Lradiant/swipe/ComposeSwipeState;->releaseParent()V + + iget-object v0, p0, Lradiant/swipe/ComposeSwipeState;->animator:Landroid/animation/ValueAnimator; + + const/4 v1, 0x0 + + if-eqz v0, :initialize + + invoke-virtual {v0}, Landroid/animation/ValueAnimator;->cancel()V + + iput-object v1, p0, Lradiant/swipe/ComposeSwipeState;->animator:Landroid/animation/ValueAnimator; + + :initialize + iput p1, p0, Lradiant/swipe/ComposeSwipeState;->downX:F + + iput p2, p0, Lradiant/swipe/ComposeSwipeState;->downY:F + + const/4 v0, 0x0 + + iput-boolean v0, p0, Lradiant/swipe/ComposeSwipeState;->locked:Z + + iput-boolean v0, p0, Lradiant/swipe/ComposeSwipeState;->armed:Z + + invoke-virtual {p0, v0}, Lradiant/swipe/ComposeSwipeState;->setOffset(F)V + + iget-boolean v2, p0, Lradiant/swipe/ComposeSwipeState;->enabled:Z + + if-eqz v2, :inactive + + iget-object v2, p0, Lradiant/swipe/ComposeSwipeState;->action:Lradiant/swipe/ComposeSwipeAction; + + if-eqz v2, :inactive + + const/4 v0, 0x1 + + :inactive + iput-boolean v0, p0, Lradiant/swipe/ComposeSwipeState;->tracking:Z + + return-void +.end method + +.method cancelGesture()V + .locals 1 + + const/4 v0, 0x0 + + iput-boolean v0, p0, Lradiant/swipe/ComposeSwipeState;->tracking:Z + + iput-boolean v0, p0, Lradiant/swipe/ComposeSwipeState;->locked:Z + + iput-boolean v0, p0, Lradiant/swipe/ComposeSwipeState;->armed:Z + + invoke-virtual {p0}, Lradiant/swipe/ComposeSwipeState;->releaseParent()V + + invoke-virtual {p0}, Lradiant/swipe/ComposeSwipeState;->animateReset()V + + return-void +.end method + +.method clearAnimator(Landroid/animation/ValueAnimator;)V + .locals 1 + + iget-object v0, p0, Lradiant/swipe/ComposeSwipeState;->animator:Landroid/animation/ValueAnimator; + + if-ne v0, p1, :done + + const/4 v0, 0x0 + + iput-object v0, p0, Lradiant/swipe/ComposeSwipeState;->animator:Landroid/animation/ValueAnimator; + + :done + return-void +.end method + +.method dp(F)F + .locals 1 + + iget-object v0, p0, Lradiant/swipe/ComposeSwipeState;->context:Landroid/content/Context; + + if-eqz v0, :done + + invoke-virtual {v0}, Landroid/content/Context;->getResources()Landroid/content/res/Resources; + + move-result-object v0 + + invoke-virtual {v0}, Landroid/content/res/Resources;->getDisplayMetrics()Landroid/util/DisplayMetrics; + + move-result-object v0 + + iget v0, v0, Landroid/util/DisplayMetrics;->density:F + + mul-float/2addr p1, v0 + + :done + return p1 +.end method + +.method finish()V + .locals 3 + + iget-boolean v0, p0, Lradiant/swipe/ComposeSwipeState;->tracking:Z + + if-eqz v0, :reset_only + + iget-boolean v0, p0, Lradiant/swipe/ComposeSwipeState;->locked:Z + + if-eqz v0, :not_complete + + iget-boolean v0, p0, Lradiant/swipe/ComposeSwipeState;->armed:Z + + if-eqz v0, :not_complete + + iget-object v0, p0, Lradiant/swipe/ComposeSwipeState;->translation:Landroidx/compose/runtime/MutableFloatState; + + invoke-interface {v0}, Landroidx/compose/runtime/MutableFloatState;->getFloatValue()F + + move-result v0 + + invoke-virtual {p0, v0}, Lradiant/swipe/ComposeSwipeState;->isCorrectDirection(F)Z + + move-result v0 + + goto :complete_ready + + :not_complete + const/4 v0, 0x0 + + :complete_ready + const/4 v1, 0x0 + + iput-boolean v1, p0, Lradiant/swipe/ComposeSwipeState;->tracking:Z + + iput-boolean v1, p0, Lradiant/swipe/ComposeSwipeState;->locked:Z + + iput-boolean v1, p0, Lradiant/swipe/ComposeSwipeState;->armed:Z + + invoke-virtual {p0}, Lradiant/swipe/ComposeSwipeState;->releaseParent()V + + invoke-virtual {p0}, Lradiant/swipe/ComposeSwipeState;->animateReset()V + + if-eqz v0, :done + + invoke-static {}, Lradiant/swipe/ComposeTapGuard;->suppressAfterSwipe()V + + iget-object v0, p0, Lradiant/swipe/ComposeSwipeState;->action:Lradiant/swipe/ComposeSwipeAction; + + if-eqz v0, :done + + invoke-interface {v0}, Lradiant/swipe/ComposeSwipeAction;->invoke()Ljava/lang/Object; + + goto :done + + :reset_only + invoke-virtual {p0}, Lradiant/swipe/ComposeSwipeState;->releaseParent()V + + invoke-virtual {p0}, Lradiant/swipe/ComposeSwipeState;->animateReset()V + + :done + return-void +.end method + +.method isCorrectDirection(F)Z + .locals 3 + + const/16 v0, __RL_SWIPE_TO_QUEUE_DIRECTION__ + + const/4 v1, 0x4 + + const/4 v2, 0x0 + + if-ne v0, v1, :expect_right + + cmpg-float v0, p1, v2 + + if-gez v0, :wrong + + const/4 v0, 0x1 + + return v0 + + :expect_right + cmpl-float v0, p1, v2 + + if-lez v0, :wrong + + const/4 v0, 0x1 + + return v0 + + :wrong + const/4 v0, 0x0 + + return v0 +.end method + +.method move(FF)V + .locals 8 + + iget-boolean v0, p0, Lradiant/swipe/ComposeSwipeState;->tracking:Z + + if-eqz v0, :done + + iget v0, p0, Lradiant/swipe/ComposeSwipeState;->downX:F + + sub-float v0, p1, v0 + + iget v1, p0, Lradiant/swipe/ComposeSwipeState;->downY:F + + sub-float v1, p2, v1 + + iget-boolean v2, p0, Lradiant/swipe/ComposeSwipeState;->locked:Z + + if-nez v2, :publish + + invoke-static {v0}, Ljava/lang/Math;->abs(F)F + + move-result v2 + + invoke-static {v1}, Ljava/lang/Math;->abs(F)F + + move-result v3 + + const/high16 v4, 0x41000000 # 8.0f + + invoke-virtual {p0, v4}, Lradiant/swipe/ComposeSwipeState;->dp(F)F + + move-result v4 + + cmpg-float v5, v2, v4 + + if-gez v5, :axis_ready + + cmpg-float v5, v3, v4 + + if-ltz v5, :done + + :axis_ready + cmpg-float v5, v2, v3 + + if-gtz v5, :horizontal_candidate + + invoke-virtual {p0}, Lradiant/swipe/ComposeSwipeState;->cancelGesture()V + + return-void + + :horizontal_candidate + invoke-virtual {p0, v0}, Lradiant/swipe/ComposeSwipeState;->isCorrectDirection(F)Z + + move-result v5 + + if-nez v5, :lock + + invoke-virtual {p0}, Lradiant/swipe/ComposeSwipeState;->cancelGesture()V + + return-void + + :lock + const/4 v5, 0x1 + + iput-boolean v5, p0, Lradiant/swipe/ComposeSwipeState;->locked:Z + + iget-object v6, p0, Lradiant/swipe/ComposeSwipeState;->view:Landroid/view/View; + + if-eqz v6, :publish + + invoke-virtual {v6}, Landroid/view/View;->getParent()Landroid/view/ViewParent; + + move-result-object v6 + + if-eqz v6, :publish + + invoke-interface {v6, v5}, Landroid/view/ViewParent;->requestDisallowInterceptTouchEvent(Z)V + + :publish + invoke-virtual {p0, v0}, Lradiant/swipe/ComposeSwipeState;->isCorrectDirection(F)Z + + move-result v2 + + if-nez v2, :set_offset + + const/4 v2, 0x0 + + invoke-virtual {p0, v2}, Lradiant/swipe/ComposeSwipeState;->setOffset(F)V + + iput-boolean v2, p0, Lradiant/swipe/ComposeSwipeState;->armed:Z + + return-void + + :set_offset + invoke-virtual {p0, v0}, Lradiant/swipe/ComposeSwipeState;->setOffset(F)V + + iget v2, p0, Lradiant/swipe/ComposeSwipeState;->rowWidth:F + + const/4 v3, 0x0 + + cmpg-float v4, v2, v3 + + if-lez v4, :done + + const v4, 0x3e99999a # 0.3f + + mul-float/2addr v2, v4 + + invoke-static {v0}, Ljava/lang/Math;->abs(F)F + + move-result v0 + + cmpg-float v0, v0, v2 + + if-ltz v0, :below_threshold + + const/4 v0, 0x1 + + goto :arm_ready + + :below_threshold + const/4 v0, 0x0 + + :arm_ready + iget-boolean v1, p0, Lradiant/swipe/ComposeSwipeState;->armed:Z + + if-eq v0, v1, :done + + iput-boolean v0, p0, Lradiant/swipe/ComposeSwipeState;->armed:Z + + iget-object v0, p0, Lradiant/swipe/ComposeSwipeState;->view:Landroid/view/View; + + if-eqz v0, :done + + const/4 v1, 0x4 + + invoke-virtual {v0, v1}, Landroid/view/View;->performHapticFeedback(I)Z + + :done + return-void +.end method + +.method releaseParent()V + .locals 2 + + iget-object v0, p0, Lradiant/swipe/ComposeSwipeState;->view:Landroid/view/View; + + if-eqz v0, :done + + invoke-virtual {v0}, Landroid/view/View;->getParent()Landroid/view/ViewParent; + + move-result-object v0 + + if-eqz v0, :done + + const/4 v1, 0x0 + + invoke-interface {v0, v1}, Landroid/view/ViewParent;->requestDisallowInterceptTouchEvent(Z)V + + :done + return-void +.end method + +.method setOffset(F)V + .locals 1 + + iget-object v0, p0, Lradiant/swipe/ComposeSwipeState;->translation:Landroidx/compose/runtime/MutableFloatState; + + invoke-interface {v0, p1}, Landroidx/compose/runtime/MutableFloatState;->setFloatValue(F)V + + return-void +.end method + +.method update(Lradiant/swipe/ComposeSwipeAction;ZLandroid/view/View;)V + .locals 4 + + iput-object p1, p0, Lradiant/swipe/ComposeSwipeState;->action:Lradiant/swipe/ComposeSwipeAction; + + iput-object p3, p0, Lradiant/swipe/ComposeSwipeState;->view:Landroid/view/View; + + invoke-virtual {p3}, Landroid/view/View;->getContext()Landroid/content/Context; + + move-result-object v0 + + iget-object v1, p0, Lradiant/swipe/ComposeSwipeState;->context:Landroid/content/Context; + + if-ne v0, v1, :load_resources + + goto :context_ready + + :load_resources + iput-object v0, p0, Lradiant/swipe/ComposeSwipeState;->context:Landroid/content/Context; + + sget v1, Lcom/aspiro/wamp/R$color;->green:I + + invoke-virtual {v0, v1}, Landroid/content/Context;->getColor(I)I + + move-result v1 + + iput v1, p0, Lradiant/swipe/ComposeSwipeState;->green:I + + sget v1, Lcom/aspiro/wamp/R$drawable;->ic_add_to_queue_last:I + + invoke-virtual {v0, v1}, Landroid/content/Context;->getDrawable(I)Landroid/graphics/drawable/Drawable; + + move-result-object v1 + + if-eqz v1, :store_icon + + invoke-virtual {v1}, Landroid/graphics/drawable/Drawable;->mutate()Landroid/graphics/drawable/Drawable; + + move-result-object v1 + + const/4 v2, -0x1 + + invoke-virtual {v1, v2}, Landroid/graphics/drawable/Drawable;->setTint(I)V + + :store_icon + iput-object v1, p0, Lradiant/swipe/ComposeSwipeState;->icon:Landroid/graphics/drawable/Drawable; + + :context_ready + if-eqz p1, :enabled_ready + + invoke-interface {p1, v0}, Lradiant/swipe/ComposeSwipeAction;->setContext(Landroid/content/Context;)V + + :enabled_ready + iget-boolean v1, p0, Lradiant/swipe/ComposeSwipeState;->enabled:Z + + iput-boolean p2, p0, Lradiant/swipe/ComposeSwipeState;->enabled:Z + + if-nez v1, :was_enabled + + return-void + + :was_enabled + if-nez p2, :done + + invoke-virtual {p0}, Lradiant/swipe/ComposeSwipeState;->cancelGesture()V + + :done + return-void +.end method diff --git a/patches/extension/radiant/swipe/ComposeTapGuard.smali b/patches/extension/radiant/swipe/ComposeTapGuard.smali new file mode 100644 index 0000000..e10ac68 --- /dev/null +++ b/patches/extension/radiant/swipe/ComposeTapGuard.smali @@ -0,0 +1,97 @@ +.class public final Lradiant/swipe/ComposeTapGuard; +.super Ljava/lang/Object; +.implements Lam0/a; + + +# static fields +.field private static volatile deadline:J + + +# instance fields +.field private final delegate:Lam0/a; + + +# direct methods +.method public constructor (Lam0/a;)V + .locals 0 + + invoke-direct {p0}, Ljava/lang/Object;->()V + + iput-object p1, p0, Lradiant/swipe/ComposeTapGuard;->delegate:Lam0/a; + + return-void +.end method + +.method public static isSuppressed()Z + .locals 5 + + invoke-static {}, Landroid/os/SystemClock;->uptimeMillis()J + + move-result-wide v0 + + sget-wide v2, Lradiant/swipe/ComposeTapGuard;->deadline:J + + cmp-long v4, v0, v2 + + if-ltz v4, :suppressed + + const/4 v0, 0x0 + + return v0 + + :suppressed + const/4 v0, 0x1 + + return v0 +.end method + +.method public static suppressAfterSwipe()V + .locals 4 + + invoke-static {}, Landroid/os/SystemClock;->uptimeMillis()J + + move-result-wide v0 + + const-wide/16 v2, 0x96 + + add-long/2addr v0, v2 + + sput-wide v0, Lradiant/swipe/ComposeTapGuard;->deadline:J + + return-void +.end method + +.method public static wrap(Lam0/a;)Lam0/a; + .locals 1 + + new-instance v0, Lradiant/swipe/ComposeTapGuard; + + invoke-direct {v0, p0}, Lradiant/swipe/ComposeTapGuard;->(Lam0/a;)V + + return-object v0 +.end method + + +# virtual methods +.method public invoke()Ljava/lang/Object; + .locals 1 + + invoke-static {}, Lradiant/swipe/ComposeTapGuard;->isSuppressed()Z + + move-result v0 + + if-eqz v0, :dispatch + + sget-object v0, Lkotlin/u;->a:Lkotlin/u; + + return-object v0 + + :dispatch + iget-object v0, p0, Lradiant/swipe/ComposeTapGuard;->delegate:Lam0/a; + + invoke-interface {v0}, Lam0/a;->invoke()Ljava/lang/Object; + + move-result-object v0 + + return-object v0 +.end method diff --git a/patches/extension/radiant/swipe/DynamicTrackQueue.smali b/patches/extension/radiant/swipe/DynamicTrackQueue.smali new file mode 100644 index 0000000..5042d46 --- /dev/null +++ b/patches/extension/radiant/swipe/DynamicTrackQueue.smali @@ -0,0 +1,169 @@ +.class public final Lradiant/swipe/DynamicTrackQueue; +.super Ljava/lang/Object; +.source "DynamicTrackQueue.smali" + + +# direct methods +.method public static handle(Lcom/tidal/android/dynamicpages/ui/modules/tracklist/TrackListModuleManager;Lradiant/swipe/DynamicTrackQueueEvent;)V + .locals 11 + + if-eqz p0, :done + + if-eqz p1, :done + + iget-object v0, p1, Lradiant/swipe/DynamicTrackQueueEvent;->pageId:Ljava/lang/String; + + if-eqz v0, :done + + invoke-virtual {v0}, Ljava/lang/String;->length()I + + move-result v1 + + if-lez v1, :done + + iget-object v1, p1, Lradiant/swipe/DynamicTrackQueueEvent;->moduleUuid:Ljava/lang/String; + + if-eqz v1, :done + + invoke-virtual {v1}, Ljava/lang/String;->length()I + + move-result v2 + + if-lez v2, :done + + iget-wide v2, p1, Lradiant/swipe/DynamicTrackQueueEvent;->trackId:J + + const-wide/16 v4, 0x0 + + cmp-long v4, v2, v4 + + if-lez v4, :done + + invoke-virtual {p0, v1}, Li60/c;->c(Ljava/lang/String;)Lc60/h; + + move-result-object v4 + + instance-of v5, v4, Lc60/b0; + + if-eqz v5, :done + + check-cast v4, Lc60/b0; + + iget-object v5, v4, Lc60/b0;->b:Ljava/lang/String; + + invoke-virtual {v1, v5}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z + + move-result v1 + + if-eqz v1, :done + + iget-object v1, v4, Lc60/b0;->f:Ljava/util/ArrayList; + + if-eqz v1, :done + + invoke-virtual {v1}, Ljava/util/ArrayList;->iterator()Ljava/util/Iterator; + + move-result-object v1 + + :find_track + invoke-interface {v1}, Ljava/util/Iterator;->hasNext()Z + + move-result v5 + + if-eqz v5, :done + + invoke-interface {v1}, Ljava/util/Iterator;->next()Ljava/lang/Object; + + move-result-object v5 + + instance-of v6, v5, Lc60/r$b; + + if-eqz v6, :find_track + + check-cast v5, Lc60/r$b; + + iget-object v5, v5, Lc60/r$b;->a:Lh40/n; + + instance-of v6, v5, Lh40/p; + + if-eqz v6, :find_track + + check-cast v5, Lh40/p; + + iget-wide v6, v5, Lh40/p;->a:J + + cmp-long v6, v6, v2 + + if-nez v6, :find_track + + iget-object v1, p0, Lcom/tidal/android/dynamicpages/ui/modules/tracklist/TrackListModuleManager;->b:Lcom/tidal/android/dynamicpages/ui/b; + + instance-of v2, v1, Lcom/tidal/android/dynamicpages/ui/c; + + if-eqz v2, :done + + check-cast v1, Lcom/tidal/android/dynamicpages/ui/c; + + iget-object v6, v1, Lcom/tidal/android/dynamicpages/ui/c;->b:Lcom/tidal/android/navigation/NavigationInfo; + + if-eqz v6, :done + + iget-object v1, p1, Lradiant/swipe/DynamicTrackQueueEvent;->context:Landroid/content/Context; + + if-eqz v1, :done + + invoke-static {v5}, Lie0/i;->a(Lh40/p;)Lcom/aspiro/wamp/model/Track; + + move-result-object v7 + + if-eqz v7, :done + + iget-object v2, v4, Lc60/b0;->a:Ljava/lang/String; + + if-eqz v2, :done + + invoke-virtual {v2}, Ljava/lang/String;->length()I + + move-result v3 + + if-lez v3, :done + + new-instance v8, Lcom/aspiro/wamp/eventtracking/model/ContextualMetadata; + + iget v3, v4, Lc60/b0;->e:I + + invoke-static {v3}, Ljava/lang/String;->valueOf(I)Ljava/lang/String; + + move-result-object v3 + + invoke-direct {v8, v0, v2, v3}, Lcom/aspiro/wamp/eventtracking/model/ContextualMetadata;->(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V + + iget-wide v2, p1, Lradiant/swipe/DynamicTrackQueueEvent;->trackId:J + + invoke-static {v2, v3}, Ljava/lang/String;->valueOf(J)Ljava/lang/String; + + move-result-object v2 + + iget-object v3, v4, Lc60/b0;->c:Ljava/lang/String; + + if-eqz v3, :done + + iget-object v10, v4, Lc60/b0;->g:Ljava/lang/String; + + invoke-static {v10}, Lcom/aspiro/wamp/playqueue/source/model/ItemSource$NavigationType$a;->a(Ljava/lang/String;)Lcom/aspiro/wamp/playqueue/source/model/ItemSource$NavigationType; + + move-result-object v4 + + invoke-static {v2, v3, v6, v4}, Lcom/aspiro/wamp/playqueue/source/model/b;->j(Ljava/lang/String;Ljava/lang/String;Lcom/tidal/android/navigation/NavigationInfo;Lcom/aspiro/wamp/playqueue/source/model/ItemSource$NavigationType;)Lcom/aspiro/wamp/playqueue/source/model/ItemSource; + + move-result-object v9 + + if-eqz v9, :done + + invoke-virtual {v9, v7}, Lcom/aspiro/wamp/playqueue/source/model/Source;->addSourceItem(Lcom/aspiro/wamp/model/MediaItem;)V + + invoke-static {v1, v7, v8, v9}, Lradiant/swipe/QueueExecutor;->track(Landroid/content/Context;Lcom/aspiro/wamp/model/Track;Lcom/aspiro/wamp/eventtracking/model/ContextualMetadata;Lcom/aspiro/wamp/playqueue/source/model/Source;)Z + + :done + return-void +.end method diff --git a/patches/extension/radiant/swipe/DynamicTrackQueueAction.smali b/patches/extension/radiant/swipe/DynamicTrackQueueAction.smali new file mode 100644 index 0000000..a138a82 --- /dev/null +++ b/patches/extension/radiant/swipe/DynamicTrackQueueAction.smali @@ -0,0 +1,95 @@ +.class public final Lradiant/swipe/DynamicTrackQueueAction; +.super Ljava/lang/Object; +.source "DynamicTrackQueueAction.smali" + +# interfaces +.implements Lradiant/swipe/ComposeSwipeAction; + + +# instance fields +.field private final callback:Lam0/l; + +.field private context:Landroid/content/Context; + +.field private final moduleUuid:Ljava/lang/String; + +.field private final pageId:Ljava/lang/String; + +.field private final trackId:J + + +# direct methods +.method public constructor (Lam0/l;Ljava/lang/String;Ljava/lang/String;Lm40/e$e;)V + .locals 2 + + invoke-direct {p0}, Ljava/lang/Object;->()V + + iput-object p1, p0, Lradiant/swipe/DynamicTrackQueueAction;->callback:Lam0/l; + + iput-object p2, p0, Lradiant/swipe/DynamicTrackQueueAction;->pageId:Ljava/lang/String; + + iput-object p3, p0, Lradiant/swipe/DynamicTrackQueueAction;->moduleUuid:Ljava/lang/String; + + iget-wide v0, p4, Lm40/e$e;->a:J + + iput-wide v0, p0, Lradiant/swipe/DynamicTrackQueueAction;->trackId:J + + return-void +.end method + + +# virtual methods +.method public invoke()Ljava/lang/Object; + .locals 7 + + iget-wide v1, p0, Lradiant/swipe/DynamicTrackQueueAction;->trackId:J + + invoke-static {}, Lradiant/swipe/QueueExecutor;->hasActiveQueue()Z + + move-result v0 + + if-nez v0, :active_queue + + new-instance v0, Lcom/tidal/android/dynamicpages/ui/modules/tracklist/b$a; + + iget-object v3, p0, Lradiant/swipe/DynamicTrackQueueAction;->pageId:Ljava/lang/String; + + iget-object v4, p0, Lradiant/swipe/DynamicTrackQueueAction;->moduleUuid:Ljava/lang/String; + + invoke-direct {v0, v1, v2, v3, v4}, Lcom/tidal/android/dynamicpages/ui/modules/tracklist/b$a;->(JLjava/lang/String;Ljava/lang/String;)V + + goto :emit + + :active_queue + new-instance v0, Lradiant/swipe/DynamicTrackQueueEvent; + + iget-object v1, p0, Lradiant/swipe/DynamicTrackQueueAction;->context:Landroid/content/Context; + + if-eqz v1, :done + + iget-object v2, p0, Lradiant/swipe/DynamicTrackQueueAction;->pageId:Ljava/lang/String; + + iget-object v3, p0, Lradiant/swipe/DynamicTrackQueueAction;->moduleUuid:Ljava/lang/String; + + iget-wide v4, p0, Lradiant/swipe/DynamicTrackQueueAction;->trackId:J + + invoke-direct/range {v0 .. v5}, Lradiant/swipe/DynamicTrackQueueEvent;->(Landroid/content/Context;Ljava/lang/String;Ljava/lang/String;J)V + + :emit + iget-object v6, p0, Lradiant/swipe/DynamicTrackQueueAction;->callback:Lam0/l; + + invoke-interface {v6, v0}, Lam0/l;->invoke(Ljava/lang/Object;)Ljava/lang/Object; + + :done + sget-object v0, Lkotlin/u;->a:Lkotlin/u; + + return-object v0 +.end method + +.method public setContext(Landroid/content/Context;)V + .locals 0 + + iput-object p1, p0, Lradiant/swipe/DynamicTrackQueueAction;->context:Landroid/content/Context; + + return-void +.end method diff --git a/patches/extension/radiant/swipe/DynamicTrackQueueEvent.smali b/patches/extension/radiant/swipe/DynamicTrackQueueEvent.smali new file mode 100644 index 0000000..e666ca6 --- /dev/null +++ b/patches/extension/radiant/swipe/DynamicTrackQueueEvent.smali @@ -0,0 +1,34 @@ +.class public final Lradiant/swipe/DynamicTrackQueueEvent; +.super Ljava/lang/Object; +.source "DynamicTrackQueueEvent.smali" + +# interfaces +.implements Lcom/tidal/android/dynamicpages/ui/modules/tracklist/b; + + +# instance fields +.field public final context:Landroid/content/Context; + +.field public final moduleUuid:Ljava/lang/String; + +.field public final pageId:Ljava/lang/String; + +.field public final trackId:J + + +# direct methods +.method public constructor (Landroid/content/Context;Ljava/lang/String;Ljava/lang/String;J)V + .locals 0 + + invoke-direct {p0}, Ljava/lang/Object;->()V + + iput-object p1, p0, Lradiant/swipe/DynamicTrackQueueEvent;->context:Landroid/content/Context; + + iput-object p2, p0, Lradiant/swipe/DynamicTrackQueueEvent;->pageId:Ljava/lang/String; + + iput-object p3, p0, Lradiant/swipe/DynamicTrackQueueEvent;->moduleUuid:Ljava/lang/String; + + iput-wide p4, p0, Lradiant/swipe/DynamicTrackQueueEvent;->trackId:J + + return-void +.end method diff --git a/patches/extension/radiant/swipe/DynamicTrackResolver.smali b/patches/extension/radiant/swipe/DynamicTrackResolver.smali index 721717e..354fe10 100644 --- a/patches/extension/radiant/swipe/DynamicTrackResolver.smali +++ b/patches/extension/radiant/swipe/DynamicTrackResolver.smali @@ -11,6 +11,136 @@ # direct methods +.method private currentAlbumRow(Lradiant/swipe/QueueRequest;)Lu5/b$a; + .locals 9 + + if-eqz p1, :invalid + + iget-object v0, p1, Lradiant/swipe/QueueRequest;->media:Ljava/lang/Object; + + instance-of v1, v0, Lu5/b$a; + + if-eqz v1, :invalid + + check-cast v0, Lu5/b$a; + + iget-object v1, p0, Lradiant/swipe/DynamicTrackResolver;->recycler:Ljava/lang/ref/WeakReference; + + invoke-virtual {v1}, Ljava/lang/ref/Reference;->get()Ljava/lang/Object; + + move-result-object v1 + + check-cast v1, Landroidx/recyclerview/widget/RecyclerView; + + if-eqz v1, :invalid + + invoke-virtual {v1}, Landroidx/recyclerview/widget/RecyclerView;->getAdapter()Landroidx/recyclerview/widget/RecyclerView$Adapter; + + move-result-object v2 + + instance-of v1, v2, Lcom/tidal/android/core/adapterdelegate/c; + + if-eqz v1, :invalid + + check-cast v2, Lcom/tidal/android/core/adapterdelegate/c; + + invoke-virtual {v2}, Landroidx/recyclerview/widget/ListAdapter;->getCurrentList()Ljava/util/List; + + move-result-object v2 + + iget v3, p1, Lradiant/swipe/QueueRequest;->position:I + + if-gez v3, :check_size + + goto :invalid + + :check_size + invoke-interface {v2}, Ljava/util/List;->size()I + + move-result v4 + + if-lt v3, v4, :read_row + + goto :invalid + + :read_row + invoke-interface {v2, v3}, Ljava/util/List;->get(I)Ljava/lang/Object; + + move-result-object v2 + + instance-of v3, v2, Lu5/b$a; + + if-eqz v3, :invalid + + check-cast v2, Lu5/b$a; + + iget-object v3, v0, Lu5/b$a;->a:Lu5/b$a$a; + + iget-object v4, v2, Lu5/b$a;->a:Lu5/b$a$a; + + if-ne v3, v4, :invalid + + iget-wide v3, v0, Lu5/b$a;->b:J + + iget-wide v5, v2, Lu5/b$a;->b:J + + cmp-long v7, v3, v5 + + if-nez v7, :invalid + + iget-object v3, v0, Lu5/b$a;->c:Lu5/b$a$b; + + iget-object v4, v2, Lu5/b$a;->c:Lu5/b$a$b; + + if-eqz v3, :invalid + + if-eqz v4, :invalid + + iget v5, v3, Lu5/b$a$b;->r:I + + iget v6, v4, Lu5/b$a$b;->r:I + + iget v7, p1, Lradiant/swipe/QueueRequest;->id:I + + if-ne v5, v7, :invalid + + if-ne v6, v7, :invalid + + iget-object v5, v3, Lu5/b$a$b;->s:Ljava/lang/String; + + iget-object v6, v4, Lu5/b$a$b;->s:Ljava/lang/String; + + if-eq v5, v6, :module_valid + + if-eqz v5, :invalid + + invoke-virtual {v5, v6}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z + + move-result v5 + + if-eqz v5, :invalid + + :module_valid + iget-object v5, v4, Lu5/b$a$b;->g:Lcom/aspiro/wamp/model/Availability; + + invoke-interface {v5}, Lcom/aspiro/wamp/model/Availability;->isAvailable()Z + + move-result v5 + + if-eqz v5, :invalid + + iget-boolean v5, v4, Lu5/b$a$b;->p:Z + + if-nez v5, :invalid + + return-object v2 + + :invalid + const/4 v0, 0x0 + + return-object v0 +.end method + .method private constructor (Landroidx/recyclerview/widget/RecyclerView;)V .locals 1 @@ -234,6 +364,96 @@ return-object v0 .end method +.method private resolveAlbum(Landroidx/recyclerview/widget/RecyclerView;Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)Lradiant/swipe/QueueRequest; + .locals 5 + + iget-object v0, p0, Lradiant/swipe/DynamicTrackResolver;->recycler:Ljava/lang/ref/WeakReference; + + invoke-virtual {v0}, Ljava/lang/ref/Reference;->get()Ljava/lang/Object; + + move-result-object v0 + + if-ne v0, p1, :invalid + + invoke-virtual {p2}, Landroidx/recyclerview/widget/RecyclerView$ViewHolder;->getBindingAdapterPosition()I + + move-result p2 + + const/4 v0, -0x1 + + if-ne p2, v0, :has_position + + goto :invalid + + :has_position + invoke-virtual {p1}, Landroidx/recyclerview/widget/RecyclerView;->getAdapter()Landroidx/recyclerview/widget/RecyclerView$Adapter; + + move-result-object p1 + + instance-of v0, p1, Lcom/tidal/android/core/adapterdelegate/c; + + if-eqz v0, :invalid + + check-cast p1, Lcom/tidal/android/core/adapterdelegate/c; + + invoke-virtual {p1}, Landroidx/recyclerview/widget/ListAdapter;->getCurrentList()Ljava/util/List; + + move-result-object p1 + + if-gez p2, :check_size + + goto :invalid + + :check_size + invoke-interface {p1}, Ljava/util/List;->size()I + + move-result v0 + + if-lt p2, v0, :read_row + + goto :invalid + + :read_row + invoke-interface {p1, p2}, Ljava/util/List;->get(I)Ljava/lang/Object; + + move-result-object p1 + + instance-of v0, p1, Lu5/b$a; + + if-eqz v0, :invalid + + check-cast p1, Lu5/b$a; + + iget-object v0, p1, Lu5/b$a;->c:Lu5/b$a$b; + + if-eqz v0, :invalid + + iget-object v1, v0, Lu5/b$a$b;->g:Lcom/aspiro/wamp/model/Availability; + + invoke-interface {v1}, Lcom/aspiro/wamp/model/Availability;->isAvailable()Z + + move-result v1 + + if-eqz v1, :invalid + + iget-boolean v1, v0, Lu5/b$a$b;->p:Z + + if-nez v1, :invalid + + iget v0, v0, Lu5/b$a$b;->r:I + + new-instance v1, Lradiant/swipe/QueueRequest; + + invoke-direct {v1, p2, p1, v0}, Lradiant/swipe/QueueRequest;->(ILjava/lang/Object;I)V + + return-object v1 + + :invalid + const/4 p1, 0x0 + + return-object p1 +.end method + .method public static install(Landroidx/recyclerview/widget/RecyclerView;)V .locals 1 @@ -254,6 +474,43 @@ .method public execute(Lradiant/swipe/QueueRequest;)V .locals 8 + iget-object v0, p1, Lradiant/swipe/QueueRequest;->media:Ljava/lang/Object; + + instance-of v1, v0, Lu5/b$a; + + if-eqz v1, :dynamic_track + + invoke-direct {p0, p1}, Lradiant/swipe/DynamicTrackResolver;->currentAlbumRow(Lradiant/swipe/QueueRequest;)Lu5/b$a; + + move-result-object v0 + + if-eqz v0, :done + + new-instance v1, Lradiant/swipe/AlbumItemQueueAction; + + invoke-direct {v1, v0}, Lradiant/swipe/AlbumItemQueueAction;->(Lu5/b$a;)V + + iget-object v2, p0, Lradiant/swipe/DynamicTrackResolver;->recycler:Ljava/lang/ref/WeakReference; + + invoke-virtual {v2}, Ljava/lang/ref/Reference;->get()Ljava/lang/Object; + + move-result-object v2 + + check-cast v2, Landroidx/recyclerview/widget/RecyclerView; + + if-eqz v2, :done + + invoke-virtual {v2}, Landroid/view/View;->getContext()Landroid/content/Context; + + move-result-object v2 + + invoke-virtual {v1, v2}, Lradiant/swipe/AlbumItemQueueAction;->setContext(Landroid/content/Context;)V + + invoke-virtual {v1}, Lradiant/swipe/AlbumItemQueueAction;->invoke()Ljava/lang/Object; + + return-void + + :dynamic_track invoke-direct {p0, p1}, Lradiant/swipe/DynamicTrackResolver;->currentRow(Lradiant/swipe/QueueRequest;)Lo6/b; move-result-object v0 @@ -374,6 +631,17 @@ .method public resolve(Landroidx/recyclerview/widget/RecyclerView;Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)Lradiant/swipe/QueueRequest; .locals 5 + instance-of v0, p2, Lv6/e$a; + + if-eqz v0, :dynamic_holder + + invoke-direct {p0, p1, p2}, Lradiant/swipe/DynamicTrackResolver;->resolveAlbum(Landroidx/recyclerview/widget/RecyclerView;Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)Lradiant/swipe/QueueRequest; + + move-result-object p1 + + return-object p1 + + :dynamic_holder instance-of v0, p2, Lp7/a$a; if-eqz v0, :invalid diff --git a/patches/extension/radiant/swipe/QueueExecutor.smali b/patches/extension/radiant/swipe/QueueExecutor.smali index 3b20d5f..2d39530 100644 --- a/patches/extension/radiant/swipe/QueueExecutor.smali +++ b/patches/extension/radiant/swipe/QueueExecutor.smali @@ -9,8 +9,6 @@ const/4 v0, 0x0 - if-eqz p0, :done - if-eqz p1, :done invoke-static {}, Lcom/aspiro/wamp/App$a;->a()Lcom/aspiro/wamp/App; @@ -39,6 +37,31 @@ if-eqz p4, :done + :unwrap_context + instance-of v2, p0, Landroidx/fragment/app/FragmentActivity; + + if-nez v2, :has_activity + + instance-of v2, p0, Landroid/content/ContextWrapper; + + if-eqz v2, :done + + move-object v2, p0 + + check-cast v2, Landroid/content/ContextWrapper; + + invoke-virtual {v2}, Landroid/content/ContextWrapper;->getBaseContext()Landroid/content/Context; + + move-result-object v2 + + if-eq v2, p0, :done + + move-object p0, v2 + + goto :unwrap_context + + :has_activity + iget-object v2, p4, Lh4/a;->b:Lo3/a$a; invoke-interface {v2, p1, p2, p3}, Lo3/a$a;->a(Lcom/aspiro/wamp/model/Album;Lcom/aspiro/wamp/eventtracking/model/ContextualMetadata;Lcom/tidal/android/navigation/NavigationInfo;)Lo3/a; @@ -51,10 +74,6 @@ move-result-object p1 - instance-of p2, p0, Landroidx/fragment/app/FragmentActivity; - - if-eqz p2, :done - check-cast p0, Landroidx/fragment/app/FragmentActivity; invoke-virtual {p1, p0}, Lc3/i;->b(Landroidx/fragment/app/FragmentActivity;)V @@ -122,10 +141,16 @@ const/4 v0, 0x0 - if-eqz p0, :done - if-eqz p1, :done + invoke-static {}, Lradiant/swipe/QueueExecutor;->hasActiveQueue()Z + + move-result v1 + + if-eqz v1, :play + + if-eqz p4, :done + :unwrap_context instance-of v1, p0, Landroidx/fragment/app/FragmentActivity; @@ -150,13 +175,6 @@ goto :unwrap_context :has_activity - invoke-static {}, Lradiant/swipe/QueueExecutor;->hasActiveQueue()Z - - move-result v1 - - if-eqz v1, :play - - if-eqz p4, :done iget-object v1, p4, Lh4/a;->h:Lu3/a$a; @@ -208,8 +226,6 @@ .method public static playlist(Landroid/content/Context;Lcom/aspiro/wamp/model/Playlist;Lcom/aspiro/wamp/eventtracking/model/ContextualMetadata;Lcom/tidal/android/navigation/NavigationInfo;)V .locals 4 - if-eqz p0, :done - if-eqz p1, :done invoke-virtual {p1}, Lcom/aspiro/wamp/model/Playlist;->getNumberOfItems()I @@ -218,30 +234,6 @@ if-lez v0, :done - :unwrap_context - instance-of v0, p0, Landroidx/fragment/app/FragmentActivity; - - if-nez v0, :has_activity - - instance-of v0, p0, Landroid/content/ContextWrapper; - - if-eqz v0, :done - - move-object v0, p0 - - check-cast v0, Landroid/content/ContextWrapper; - - invoke-virtual {v0}, Landroid/content/ContextWrapper;->getBaseContext()Landroid/content/Context; - - move-result-object v0 - - if-eq v0, p0, :done - - move-object p0, v0 - - goto :unwrap_context - - :has_activity invoke-static {}, Lcom/aspiro/wamp/App$a;->a()Lcom/aspiro/wamp/App; move-result-object v0 @@ -258,6 +250,31 @@ if-eqz v1, :play + :unwrap_context + instance-of v1, p0, Landroidx/fragment/app/FragmentActivity; + + if-nez v1, :has_activity + + instance-of v1, p0, Landroid/content/ContextWrapper; + + if-eqz v1, :done + + move-object v1, p0 + + check-cast v1, Landroid/content/ContextWrapper; + + invoke-virtual {v1}, Landroid/content/ContextWrapper;->getBaseContext()Landroid/content/Context; + + move-result-object v1 + + if-eq v1, p0, :done + + move-object p0, v1 + + goto :unwrap_context + + :has_activity + iget-object v1, v0, Le5/z$n2;->w8:Ldagger/internal/f; invoke-interface {v1}, Lql0/a;->get()Ljava/lang/Object; diff --git a/patches/extension/radiant/swipe/ViewAllTrackQueue.smali b/patches/extension/radiant/swipe/ViewAllTrackQueue.smali new file mode 100644 index 0000000..8c63dfe --- /dev/null +++ b/patches/extension/radiant/swipe/ViewAllTrackQueue.smali @@ -0,0 +1,200 @@ +.class public final Lradiant/swipe/ViewAllTrackQueue; +.super Ljava/lang/Object; +.source "ViewAllTrackQueue.smali" + + +# static fields +.field private static context:Ljava/lang/ref/WeakReference; + + +# direct methods +.method public static handle(Lcom/tidal/android/feature/viewall/ui/ViewAllScreenViewModel;Landroid/content/Context;J)V + .locals 10 + + if-eqz p0, :done + + if-eqz p1, :done + + const-wide/16 v0, 0x0 + + cmp-long v2, p2, v0 + + if-lez v2, :done + + iget-object v0, p0, Lcom/tidal/android/feature/viewall/ui/ViewAllScreenViewModel;->n:Lcom/tidal/android/feature/viewall/ui/c; + + iget-object v0, v0, Lcom/tidal/android/feature/viewall/ui/c;->f:Ljava/util/ArrayList; + + invoke-virtual {v0}, Ljava/util/ArrayList;->iterator()Ljava/util/Iterator; + + move-result-object v0 + + :find_track + invoke-interface {v0}, Ljava/util/Iterator;->hasNext()Z + + move-result v2 + + if-eqz v2, :done + + invoke-interface {v0}, Ljava/util/Iterator;->next()Ljava/lang/Object; + + move-result-object v1 + + instance-of v2, v1, Lpd0/a; + + if-eqz v2, :find_track + + check-cast v1, Lpd0/a; + + iget-object v1, v1, Lpd0/a;->a:Lh40/n; + + instance-of v2, v1, Lh40/p; + + if-eqz v2, :find_track + + check-cast v1, Lh40/p; + + iget-wide v3, v1, Lh40/p;->a:J + + cmp-long v2, v3, p2 + + if-nez v2, :find_track + + iget-object v0, p0, Lcom/tidal/android/feature/viewall/ui/ViewAllScreenViewModel;->f:Lcom/tidal/android/feature/viewall/ui/u; + + instance-of v2, v0, Lra/d; + + if-eqz v2, :done + + check-cast v0, Lra/d; + + iget-object v2, v0, Lra/d;->b:Lcom/tidal/android/navigation/NavigationInfo; + + invoke-static {v1}, Lie0/i;->a(Lh40/p;)Lcom/aspiro/wamp/model/Track; + + move-result-object v3 + + if-eqz v3, :done + + const-string v5, "null" + + new-instance v4, Lcom/aspiro/wamp/eventtracking/model/ContextualMetadata; + + invoke-direct {v4, v5, v5}, Lcom/aspiro/wamp/eventtracking/model/ContextualMetadata;->(Ljava/lang/String;Ljava/lang/String;)V + + const/4 v6, 0x0 + + if-eqz v2, :navigation_ready + + invoke-static {v2}, Lcom/tidal/android/navigation/a;->b(Lcom/tidal/android/navigation/NavigationInfo;)Lcom/tidal/android/navigation/NavigationInfo$Node; + + move-result-object v6 + + :navigation_ready + sget-object v7, Lcom/aspiro/wamp/playqueue/source/model/ItemSource$NavigationType$None;->INSTANCE:Lcom/aspiro/wamp/playqueue/source/model/ItemSource$NavigationType$None; + + const/4 v8, 0x0 + + invoke-static {v5, v8, v6, v7}, Lcom/aspiro/wamp/playqueue/source/model/b;->j(Ljava/lang/String;Ljava/lang/String;Lcom/tidal/android/navigation/NavigationInfo;Lcom/aspiro/wamp/playqueue/source/model/ItemSource$NavigationType;)Lcom/aspiro/wamp/playqueue/source/model/ItemSource; + + move-result-object v9 + + invoke-virtual {v9, v3}, Lcom/aspiro/wamp/playqueue/source/model/Source;->addSourceItem(Lcom/aspiro/wamp/model/MediaItem;)V + + invoke-static {p1, v3, v4, v9}, Lradiant/swipe/QueueExecutor;->track(Landroid/content/Context;Lcom/aspiro/wamp/model/Track;Lcom/aspiro/wamp/eventtracking/model/ContextualMetadata;Lcom/aspiro/wamp/playqueue/source/model/Source;)Z + + :done + return-void +.end method + +.method public static handleEvent(Lcom/tidal/android/feature/viewall/ui/ViewAllScreenViewModel;Lcom/tidal/android/feature/viewall/ui/e;)Z + .locals 5 + + instance-of v0, p1, Lcom/tidal/android/feature/viewall/ui/e$c; + + if-eqz v0, :not_handled + + check-cast p1, Lcom/tidal/android/feature/viewall/ui/e$c; + + iget-object v0, p1, Lcom/tidal/android/feature/viewall/ui/e$c;->a:Ljava/lang/Object; + + instance-of v1, v0, Ljava/lang/String; + + if-eqz v1, :not_handled + + check-cast v0, Ljava/lang/String; + + const-string v1, "rl-swipe:" + + invoke-virtual {v0, v1}, Ljava/lang/String;->startsWith(Ljava/lang/String;)Z + + move-result v2 + + if-eqz v2, :not_handled + + const/16 v1, 0x9 + + invoke-virtual {v0, v1}, Ljava/lang/String;->substring(I)Ljava/lang/String; + + move-result-object v0 + + invoke-static {v0}, Ljava/lang/Long;->parseLong(Ljava/lang/String;)J + + move-result-wide v1 + + sget-object v3, Lradiant/swipe/ViewAllTrackQueue;->context:Ljava/lang/ref/WeakReference; + + const/4 v4, 0x0 + + sput-object v4, Lradiant/swipe/ViewAllTrackQueue;->context:Ljava/lang/ref/WeakReference; + + if-eqz v3, :handled + + invoke-virtual {v3}, Ljava/lang/ref/Reference;->get()Ljava/lang/Object; + + move-result-object v3 + + check-cast v3, Landroid/content/Context; + + invoke-static {p0, v3, v1, v2}, Lradiant/swipe/ViewAllTrackQueue;->handle(Lcom/tidal/android/feature/viewall/ui/ViewAllScreenViewModel;Landroid/content/Context;J)V + + :handled + const/4 v0, 0x1 + + return v0 + + :not_handled + const/4 v0, 0x0 + + return v0 +.end method + +.method public static marker(J)Ljava/lang/String; + .locals 2 + + new-instance v0, Ljava/lang/StringBuilder; + + const-string v1, "rl-swipe:" + + invoke-direct {v0, v1}, Ljava/lang/StringBuilder;->(Ljava/lang/String;)V + + invoke-virtual {v0, p0, p1}, Ljava/lang/StringBuilder;->append(J)Ljava/lang/StringBuilder; + + invoke-virtual {v0}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String; + + move-result-object v0 + + return-object v0 +.end method + +.method public static setContext(Landroid/content/Context;)V + .locals 1 + + new-instance v0, Ljava/lang/ref/WeakReference; + + invoke-direct {v0, p0}, Ljava/lang/ref/WeakReference;->(Ljava/lang/Object;)V + + sput-object v0, Lradiant/swipe/ViewAllTrackQueue;->context:Ljava/lang/ref/WeakReference; + + return-void +.end method diff --git a/patches/extension/radiant/swipe/ViewAllTrackQueueAction.smali b/patches/extension/radiant/swipe/ViewAllTrackQueueAction.smali new file mode 100644 index 0000000..cf8dee1 --- /dev/null +++ b/patches/extension/radiant/swipe/ViewAllTrackQueueAction.smali @@ -0,0 +1,89 @@ +.class public final Lradiant/swipe/ViewAllTrackQueueAction; +.super Ljava/lang/Object; +.source "ViewAllTrackQueueAction.smali" + +# interfaces +.implements Lradiant/swipe/ComposeSwipeAction; + + +# instance fields +.field private final callback:Lam0/l; + +.field private context:Landroid/content/Context; + +.field private final trackId:J + + +# direct methods +.method public constructor (Lam0/l;Lm40/e$e;)V + .locals 2 + + invoke-direct {p0}, Ljava/lang/Object;->()V + + iput-object p1, p0, Lradiant/swipe/ViewAllTrackQueueAction;->callback:Lam0/l; + + iget-wide v0, p2, Lm40/e$e;->a:J + + iput-wide v0, p0, Lradiant/swipe/ViewAllTrackQueueAction;->trackId:J + + return-void +.end method + + +# virtual methods +.method public invoke()Ljava/lang/Object; + .locals 5 + + iget-object v0, p0, Lradiant/swipe/ViewAllTrackQueueAction;->callback:Lam0/l; + + if-eqz v0, :done + + iget-wide v1, p0, Lradiant/swipe/ViewAllTrackQueueAction;->trackId:J + + invoke-static {}, Lradiant/swipe/QueueExecutor;->hasActiveQueue()Z + + move-result v3 + + if-eqz v3, :play_existing + + iget-object v3, p0, Lradiant/swipe/ViewAllTrackQueueAction;->context:Landroid/content/Context; + + if-eqz v3, :done + + invoke-static {v3}, Lradiant/swipe/ViewAllTrackQueue;->setContext(Landroid/content/Context;)V + + invoke-static {v1, v2}, Lradiant/swipe/ViewAllTrackQueue;->marker(J)Ljava/lang/String; + + move-result-object v3 + + new-instance v4, Li40/c$b; + + invoke-direct {v4, v3}, Li40/c$b;->(Ljava/lang/Object;)V + + goto :emit + + :play_existing + invoke-static {v1, v2}, Ljava/lang/Long;->valueOf(J)Ljava/lang/Long; + + move-result-object v3 + + new-instance v4, Li40/c$b; + + invoke-direct {v4, v3}, Li40/c$b;->(Ljava/lang/Object;)V + + :emit + invoke-interface {v0, v4}, Lam0/l;->invoke(Ljava/lang/Object;)Ljava/lang/Object; + + :done + sget-object v0, Lkotlin/u;->a:Lkotlin/u; + + return-object v0 +.end method + +.method public setContext(Landroid/content/Context;)V + .locals 0 + + iput-object p1, p0, Lradiant/swipe/ViewAllTrackQueueAction;->context:Landroid/content/Context; + + return-void +.end method diff --git a/patches/manifest.json b/patches/manifest.json index 48194eb..748ae88 100644 --- a/patches/manifest.json +++ b/patches/manifest.json @@ -426,7 +426,8 @@ "id": "SwipeToQueue", "order": 39, "fileNames": [ - "swipe-to-queue.patch" + "swipe-to-queue.patch", + "swipe-to-queue-compose.patch" ], "extensionFiles": [ "radiant/SwipeToQueue.smali", @@ -442,7 +443,22 @@ "radiant/swipe/SearchAlbumsResolver.smali", "radiant/swipe/SearchPlaylistsResolver.smali", "radiant/swipe/PlaylistItemsResolver.smali", - "radiant/swipe/UnifiedSearchResolver.smali" + "radiant/swipe/UnifiedSearchResolver.smali", + "radiant/swipe/ComposeSwipeAction.smali", + "radiant/swipe/ComposeSwipeState.smali", + "radiant/swipe/ComposeSwipeState$Gesture.smali", + "radiant/swipe/ComposeSwipeState$Draw.smali", + "radiant/swipe/ComposeSwipeState$ResetAnimator.smali", + "radiant/swipe/ComposeTapGuard.smali", + "radiant/swipe/AlbumItemQueueAction.smali", + "radiant/swipe/DynamicTrackQueueEvent.smali", + "radiant/swipe/DynamicTrackQueueAction.smali", + "radiant/swipe/DynamicTrackQueue.smali", + "radiant/swipe/ViewAllTrackQueueAction.smali", + "radiant/swipe/ViewAllTrackQueue.smali", + "radiant/swipe/ComposeSearchQueueEvent.smali", + "radiant/swipe/ComposeSearchQueueAction.smali", + "radiant/swipe/ComposeSearchQueue.smali" ], "title": "Swipe to Queue", "description": "Swipe on tracks/albums/playlists to add them to the play queue", diff --git a/patches/swipe-to-queue-compose.patch b/patches/swipe-to-queue-compose.patch new file mode 100644 index 0000000..09d0570 --- /dev/null +++ b/patches/swipe-to-queue-compose.patch @@ -0,0 +1,253 @@ +--- a/com/tidal/android/dynamicpages/ui/composables/verticaltracklist/j.smali ++++ b/com/tidal/android/dynamicpages/ui/composables/verticaltracklist/j.smali +@@ -1791,6 +1791,10 @@ + .line 391 + check-cast v34, Lam0/a; + ++ invoke-static/range {v34 .. v34}, Lradiant/swipe/ComposeTapGuard;->wrap(Lam0/a;)Lam0/a; ++ ++ move-result-object v34 ++ + .line 392 + .line 393 + const/16 v35, 0x6f +@@ -1832,6 +1836,22 @@ + .line 412 + move-result-object v0 + ++ iget-wide v14, v3, Lm40/e$e;->a:J ++ ++ invoke-static {v14, v15}, Ljava/lang/Long;->valueOf(J)Ljava/lang/Long; ++ ++ move-result-object v14 ++ ++ new-instance v15, Lradiant/swipe/DynamicTrackQueueAction; ++ ++ invoke-direct {v15, v4, v1, v2, v3}, Lradiant/swipe/DynamicTrackQueueAction;->(Lam0/l;Ljava/lang/String;Ljava/lang/String;Lm40/e$e;)V ++ ++ iget-boolean v5, v3, Lm40/e$e;->j:Z ++ ++ invoke-static {v0, v14, v15, v5, v11}, Lradiant/swipe/ComposeSwipeState;->attach(Landroidx/compose/ui/Modifier;Ljava/lang/Object;Lradiant/swipe/ComposeSwipeAction;ZLandroidx/compose/runtime/Composer;)Landroidx/compose/ui/Modifier; ++ ++ move-result-object v0 ++ + .line 413 + const/4 v14, 0x0 + +--- a/com/tidal/android/dynamicpages/ui/modules/tracklist/TrackListModuleManager$createModuleViewState$3.smali ++++ b/com/tidal/android/dynamicpages/ui/modules/tracklist/TrackListModuleManager$createModuleViewState$3.smali +@@ -601,6 +601,17 @@ + + .line 248 + :cond_c ++ instance-of p2, p1, Lradiant/swipe/DynamicTrackQueueEvent; ++ ++ if-eqz p2, :cond_d ++ ++ check-cast p1, Lradiant/swipe/DynamicTrackQueueEvent; ++ ++ invoke-static {v0, p1}, Lradiant/swipe/DynamicTrackQueue;->handle(Lcom/tidal/android/dynamicpages/ui/modules/tracklist/TrackListModuleManager;Lradiant/swipe/DynamicTrackQueueEvent;)V ++ ++ goto :goto_4 ++ ++ :cond_d + invoke-static {}, Landroidx/navigation/f0;->a()V + + .line 249 +--- a/com/tidal/android/feature/search/ui/SearchScreenViewModel.smali ++++ b/com/tidal/android/feature/search/ui/SearchScreenViewModel.smali +@@ -926,6 +926,17 @@ + + .line 4 + .line 5 ++ instance-of v2, v1, Lradiant/swipe/ComposeSearchQueueEvent; ++ ++ if-eqz v2, :rl_search_queue_continue ++ ++ check-cast v1, Lradiant/swipe/ComposeSearchQueueEvent; ++ ++ invoke-static {v0, v1}, Lradiant/swipe/ComposeSearchQueue;->handle(Lcom/tidal/android/feature/search/ui/SearchScreenViewModel;Lradiant/swipe/ComposeSearchQueueEvent;)V ++ ++ return-void ++ ++ :rl_search_queue_continue + invoke-virtual {v1}, Ljava/lang/Object;->getClass()Ljava/lang/Class; + + .line 6 +--- a/com/tidal/android/feature/search/ui/composables/u0.smali ++++ b/com/tidal/android/feature/search/ui/composables/u0.smali +@@ -243,6 +243,24 @@ + + check-cast v2, Lam0/a; + ++ invoke-static {v1}, Lradiant/swipe/ComposeTapGuard;->wrap(Lam0/a;)Lam0/a; ++ ++ move-result-object v1 ++ ++ new-instance v6, Lradiant/swipe/ComposeSearchQueueAction; ++ ++ invoke-direct {v6, p3, v0}, Lradiant/swipe/ComposeSearchQueueAction;->(Lam0/l;Lpb0/b;)V ++ ++ invoke-virtual {v6}, Lradiant/swipe/ComposeSearchQueueAction;->stableKey()Ljava/lang/String; ++ ++ move-result-object v7 ++ ++ iget-boolean p1, v0, Lpb0/b$a;->f:Z ++ ++ invoke-static {v3, v7, v6, p1, v4}, Lradiant/swipe/ComposeSwipeState;->attach(Landroidx/compose/ui/Modifier;Ljava/lang/Object;Lradiant/swipe/ComposeSwipeAction;ZLandroidx/compose/runtime/Composer;)Landroidx/compose/ui/Modifier; ++ ++ move-result-object v3 ++ + const/4 v5, 0x0 + + .line 20 +@@ -467,7 +485,25 @@ + + const/4 v5, 0x0 + +- const/4 v2, 0x0 ++ invoke-static {v1}, Lradiant/swipe/ComposeTapGuard;->wrap(Lam0/a;)Lam0/a; ++ ++ move-result-object v1 ++ ++ new-instance v6, Lradiant/swipe/ComposeSearchQueueAction; ++ ++ invoke-direct {v6, p3, v0}, Lradiant/swipe/ComposeSearchQueueAction;->(Lam0/l;Lpb0/b;)V ++ ++ invoke-virtual {v6}, Lradiant/swipe/ComposeSearchQueueAction;->stableKey()Ljava/lang/String; ++ ++ move-result-object v7 ++ ++ sget-object v2, Landroidx/compose/ui/Modifier;->Companion:Landroidx/compose/ui/Modifier$Companion; ++ ++ const/4 p1, 0x1 ++ ++ invoke-static {v2, v7, v6, p1, v4}, Lradiant/swipe/ComposeSwipeState;->attach(Landroidx/compose/ui/Modifier;Ljava/lang/Object;Lradiant/swipe/ComposeSwipeAction;ZLandroidx/compose/runtime/Composer;)Landroidx/compose/ui/Modifier; ++ ++ move-result-object v2 + + .line 52 + invoke-static/range {v0 .. v5}, Lob0/w;->a(Lpb0/b$f;Lam0/a;Landroidx/compose/ui/Modifier;Lam0/a;Landroidx/compose/runtime/Composer;I)V +@@ -593,6 +629,24 @@ + + check-cast v3, Lam0/a; + ++ invoke-static {v1}, Lradiant/swipe/ComposeTapGuard;->wrap(Lam0/a;)Lam0/a; ++ ++ move-result-object v1 ++ ++ new-instance v6, Lradiant/swipe/ComposeSearchQueueAction; ++ ++ invoke-direct {v6, p3, v0}, Lradiant/swipe/ComposeSearchQueueAction;->(Lam0/l;Lpb0/b;)V ++ ++ invoke-virtual {v6}, Lradiant/swipe/ComposeSearchQueueAction;->stableKey()Ljava/lang/String; ++ ++ move-result-object v7 ++ ++ iget-boolean p1, v0, Lpb0/b$i;->i:Z ++ ++ invoke-static {v2, v7, v6, p1, v4}, Lradiant/swipe/ComposeSwipeState;->attach(Landroidx/compose/ui/Modifier;Ljava/lang/Object;Lradiant/swipe/ComposeSwipeAction;ZLandroidx/compose/runtime/Composer;)Landroidx/compose/ui/Modifier; ++ ++ move-result-object v2 ++ + const/4 v5, 0x0 + + .line 70 +@@ -828,7 +882,25 @@ + + const/4 v5, 0x0 + +- const/4 v2, 0x0 ++ invoke-static {v1}, Lradiant/swipe/ComposeTapGuard;->wrap(Lam0/a;)Lam0/a; ++ ++ move-result-object v1 ++ ++ new-instance v6, Lradiant/swipe/ComposeSearchQueueAction; ++ ++ invoke-direct {v6, p3, v0}, Lradiant/swipe/ComposeSearchQueueAction;->(Lam0/l;Lpb0/b;)V ++ ++ invoke-virtual {v6}, Lradiant/swipe/ComposeSearchQueueAction;->stableKey()Ljava/lang/String; ++ ++ move-result-object v7 ++ ++ sget-object v2, Landroidx/compose/ui/Modifier;->Companion:Landroidx/compose/ui/Modifier$Companion; ++ ++ const/4 p1, 0x1 ++ ++ invoke-static {v2, v7, v6, p1, v4}, Lradiant/swipe/ComposeSwipeState;->attach(Landroidx/compose/ui/Modifier;Ljava/lang/Object;Lradiant/swipe/ComposeSwipeAction;ZLandroidx/compose/runtime/Composer;)Landroidx/compose/ui/Modifier; ++ ++ move-result-object v2 + + .line 104 + invoke-static/range {v0 .. v5}, Lob0/q;->a(Lpb0/b$e;Lam0/a;Landroidx/compose/ui/Modifier;Lam0/a;Landroidx/compose/runtime/Composer;I)V +--- a/com/tidal/android/feature/viewall/ui/l.smali ++++ b/com/tidal/android/feature/viewall/ui/l.smali +@@ -317,6 +317,31 @@ + .line 132 + check-cast v3, Lam0/l; + ++ instance-of p1, v2, Lm40/e$e; ++ ++ if-eqz p1, :rl_viewall_swipe_attached ++ ++ move-object p1, v2 ++ ++ check-cast p1, Lm40/e$e; ++ ++ iget-wide p2, p1, Lm40/e$e;->a:J ++ ++ invoke-static {p2, p3}, Ljava/lang/Long;->valueOf(J)Ljava/lang/Long; ++ ++ move-result-object p2 ++ ++ new-instance p3, Lradiant/swipe/ViewAllTrackQueueAction; ++ ++ invoke-direct {p3, v3, p1}, Lradiant/swipe/ViewAllTrackQueueAction;->(Lam0/l;Lm40/e$e;)V ++ ++ iget-boolean p1, p1, Lm40/e$e;->j:Z ++ ++ invoke-static {v1, p2, p3, p1, v5}, Lradiant/swipe/ComposeSwipeState;->attach(Landroidx/compose/ui/Modifier;Ljava/lang/Object;Lradiant/swipe/ComposeSwipeAction;ZLandroidx/compose/runtime/Composer;)Landroidx/compose/ui/Modifier; ++ ++ move-result-object v1 ++ ++ :rl_viewall_swipe_attached + .line 133 + .line 134 + const/4 v6, 0x0 +--- a/j40/p2.smali ++++ b/j40/p2.smali +@@ -3240,5 +3240,14 @@ + move-object/from16 v16, v1 + ++ instance-of v3, v14, Lcom/tidal/android/feature/viewall/ui/n; ++ ++ if-eqz v3, :rl_viewall_tap_guard_done ++ ++ invoke-static/range {v24 .. v24}, Lradiant/swipe/ComposeTapGuard;->wrap(Lam0/a;)Lam0/a; ++ ++ move-result-object v24 ++ ++ :rl_viewall_tap_guard_done + .line 718 + .line 719 + move-object/from16 v25, v9 +--- a/com/tidal/android/feature/viewall/ui/ViewAllScreenViewModel.smali ++++ b/com/tidal/android/feature/viewall/ui/ViewAllScreenViewModel.smali +@@ -1718,6 +1718,17 @@ + } + .end annotation + ++ invoke-static {p0, p1}, Lradiant/swipe/ViewAllTrackQueue;->handleEvent(Lcom/tidal/android/feature/viewall/ui/ViewAllScreenViewModel;Lcom/tidal/android/feature/viewall/ui/e;)Z ++ ++ move-result v0 ++ ++ if-eqz v0, :rl_viewall_regular_event ++ ++ sget-object v0, Lkotlin/u;->a:Lkotlin/u; ++ ++ return-object v0 ++ ++ :rl_viewall_regular_event + .line 1 + instance-of v0, p1, Lcom/tidal/android/feature/viewall/ui/e$a; + diff --git a/patches/swipe-to-queue.patch b/patches/swipe-to-queue.patch index d4bcc4a..cab3cac 100644 --- a/patches/swipe-to-queue.patch +++ b/patches/swipe-to-queue.patch @@ -146,7 +146,21 @@ +++ b/p7/a.smali @@ -33,3 +33,11 @@ .end method - + ++.method public b(Landroidx/recyclerview/widget/RecyclerView;)V ++ .locals 0 ++ ++ invoke-static {p1}, Lradiant/swipe/DynamicTrackResolver;->install(Landroidx/recyclerview/widget/RecyclerView;)V ++ ++ return-void ++.end method ++ + .method public final c(Ljava/lang/Object;Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)V +--- a/v6/e.smali ++++ b/v6/e.smali +@@ -62,3 +62,11 @@ + .end method + +.method public b(Landroidx/recyclerview/widget/RecyclerView;)V + .locals 0 +