mirror of
https://github.com/meowarex/rl-mobile.git
synced 2026-08-26 22:17:44 +10:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
49fe4c0d91 | ||
|
|
189e3d28a2 | ||
|
|
aae2f54fab |
@@ -228,3 +228,13 @@ fun ProviderFactory.execIgnoreCode(vararg command: String): String = try {
|
||||
} catch (_: Exception) {
|
||||
""
|
||||
}
|
||||
|
||||
// Sync Local Cached Assets with Repo Releases to keep them up to date
|
||||
val syncBundledManifest by tasks.registering(Copy::class) {
|
||||
val src = rootProject.rootDir.resolve("../patches/manifest.json")
|
||||
onlyIf { src.exists() }
|
||||
from(src)
|
||||
into(layout.projectDirectory.dir("src/main/assets"))
|
||||
rename { "patches-manifest.json" }
|
||||
}
|
||||
tasks.named("preBuild") { dependsOn(syncBundledManifest) }
|
||||
|
||||
@@ -0,0 +1,357 @@
|
||||
{
|
||||
"version": 1,
|
||||
"patches": [
|
||||
{
|
||||
"id": "EnableLegacyUi",
|
||||
"order": 10,
|
||||
"fileNames": [
|
||||
"enable-legacy-ui.patch"
|
||||
],
|
||||
"title": "Enable Legacy UI",
|
||||
"description": "[This patch will stop working soon] - Replaces the New Compose based UI with the Legacy UI (disables player-market-ui feature flag)",
|
||||
"default": false,
|
||||
"requires": [
|
||||
"DebugMenuUnlock"
|
||||
],
|
||||
"disables": [
|
||||
"LyricsDisableCover",
|
||||
"LyricsReplaceLyricsButton",
|
||||
"LyricsReplaceShareButton",
|
||||
"LyricsRlApi",
|
||||
"LyricsKeepControlsVisible",
|
||||
"PlayerBackdrop",
|
||||
"QualityBadgeColors",
|
||||
"LyricsProgressPill",
|
||||
"MiniPlayerRedesign"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "LyricsRlApi",
|
||||
"order": 20,
|
||||
"fileNames": [
|
||||
"lyrics-rl-api.patch",
|
||||
"lyrics-rl-api-observer.patch"
|
||||
],
|
||||
"title": "Radiant Lyrics API - WIP",
|
||||
"description": "Use Radiant Lyrics API to fetch Lyrics (Higher quality & More providers)",
|
||||
"default": false
|
||||
},
|
||||
{
|
||||
"id": "PlayerBackdrop",
|
||||
"order": 30,
|
||||
"fileNames": [
|
||||
"player-backdrop.patch"
|
||||
],
|
||||
"title": "Player Backdrop",
|
||||
"description": "Restores the legacy translucent backdrop blur behind the player",
|
||||
"default": true,
|
||||
"advancedOptions": [
|
||||
{
|
||||
"type": "slider",
|
||||
"key": "blur_strength",
|
||||
"title": "Blur Strength",
|
||||
"description": "How strongly the album art behind the player is blurred",
|
||||
"default": 50,
|
||||
"min": 0,
|
||||
"max": 100,
|
||||
"steps": 19,
|
||||
"displayAsPercent": true,
|
||||
"token": "RL_BLUR_BITS",
|
||||
"encode": {
|
||||
"kind": "floatBits",
|
||||
"scale": 1.8
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "slider",
|
||||
"key": "dimming",
|
||||
"title": "Backdrop Dimming",
|
||||
"description": "Darkens the backdrop so the foreground controls stay legible",
|
||||
"default": 50,
|
||||
"min": 0,
|
||||
"max": 100,
|
||||
"steps": 19,
|
||||
"displayAsPercent": true,
|
||||
"token": "RL_SCRIM_ARGB",
|
||||
"encode": {
|
||||
"kind": "argbAlpha"
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "toggle",
|
||||
"key": "cover_everywhere",
|
||||
"title": "Cover Everywhere - WIP",
|
||||
"description": "Applies the blurred backdrop to every Compose based page (Home & Collection)",
|
||||
"default": false,
|
||||
"inline": true,
|
||||
"fileNames": [
|
||||
"home-backdrop.patch",
|
||||
"collection-backdrop.patch",
|
||||
"cover-capture.patch"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "QualityBadgeColors",
|
||||
"order": 36,
|
||||
"fileNames": [
|
||||
"player-quality-badge-colors.patch"
|
||||
],
|
||||
"title": "Quality Badge Colors",
|
||||
"description": "Brings color back to the player quality badge.",
|
||||
"default": true
|
||||
},
|
||||
{
|
||||
"id": "PlayerMovePlayingFrom",
|
||||
"order": 37,
|
||||
"fileNames": [
|
||||
"player-move-playing-from.patch"
|
||||
],
|
||||
"extensionFiles": [
|
||||
"radiant/PlayingFrom.smali"
|
||||
],
|
||||
"title": "Playing From",
|
||||
"description": "Shows the source name (playlist/album/mix) above the track title",
|
||||
"default": true
|
||||
},
|
||||
{
|
||||
"id": "PlayerOneHanded",
|
||||
"order": 38,
|
||||
"fileNames": [
|
||||
"player-one-handed.patch"
|
||||
],
|
||||
"title": "One-Handed Mode",
|
||||
"description": "Mirrors the bottom player buttons left-to-right for easier one-handed reach.",
|
||||
"default": false
|
||||
},
|
||||
{
|
||||
"id": "LyricsProgressPill",
|
||||
"order": 40,
|
||||
"fileNames": [
|
||||
"lyrics-progress-pill.patch",
|
||||
"lyrics-fade-region.patch"
|
||||
],
|
||||
"title": "Lyrics Progress Pill",
|
||||
"description": "Restores the old Track Progress Pill in the top of the Lyrics screen!",
|
||||
"default": true,
|
||||
"requires": [
|
||||
"LyricsDisableCover",
|
||||
"LyricsReplaceLyricsButton",
|
||||
"LyricsReplaceShareButton"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "LyricsDisableCover",
|
||||
"order": 41,
|
||||
"fileNames": [
|
||||
"lyrics-disable-cover.patch"
|
||||
],
|
||||
"title": "Disable Lyrics Cover",
|
||||
"description": "Removes the mini track cover from the lyrics screen.",
|
||||
"default": true
|
||||
},
|
||||
{
|
||||
"id": "LyricsReplaceLyricsButton",
|
||||
"order": 42,
|
||||
"fileNames": [
|
||||
"lyrics-replace-lyrics-button.patch",
|
||||
"lyrics-sparkle-conditional-visibility.patch"
|
||||
],
|
||||
"title": "Replace Lyrics Button",
|
||||
"description": "Replaces the Lyrics button with the RL Sparkle!",
|
||||
"default": true
|
||||
},
|
||||
{
|
||||
"id": "LyricsReplaceShareButton",
|
||||
"order": 43,
|
||||
"fileNames": [
|
||||
"lyrics-replace-share-button.patch"
|
||||
],
|
||||
"title": "Replace Share Button",
|
||||
"description": "Replaces the share button with the Tidal Connect button from the top of the screen. (it's in the menu already)",
|
||||
"default": true
|
||||
},
|
||||
{
|
||||
"id": "MiniPlayerRedesign",
|
||||
"order": 50,
|
||||
"fileNames": [],
|
||||
"title": "Redesigned Mini-Player",
|
||||
"description": "Integrates the Seekbar into the control panel at the bottom of the screen.",
|
||||
"default": false,
|
||||
"defaultVariantIndex": 2,
|
||||
"variants": [
|
||||
{
|
||||
"title": "Floating",
|
||||
"fileNames": []
|
||||
},
|
||||
{
|
||||
"title": "Grey",
|
||||
"fileNames": [
|
||||
"mini-player-grey.patch"
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Black",
|
||||
"fileNames": [
|
||||
"mini-player-black.patch"
|
||||
]
|
||||
}
|
||||
],
|
||||
"advancedOptions": [
|
||||
{
|
||||
"type": "toggle",
|
||||
"key": "dynamic_bg",
|
||||
"title": "Mini-Player Dynamic Background",
|
||||
"description": "Colorizes the Mini-Player depending on the currently playing track.",
|
||||
"default": false,
|
||||
"inline": true,
|
||||
"fileNames": [
|
||||
"mini-player-dynamic-bg.patch"
|
||||
],
|
||||
"extensionFiles": [
|
||||
"radiant/MiniPlayerBackground.smali"
|
||||
],
|
||||
"hidesVariants": [
|
||||
2
|
||||
],
|
||||
"relabelVariants": {
|
||||
"1": "Legacy"
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "toggle",
|
||||
"key": "border",
|
||||
"title": "Progress Border",
|
||||
"description": "Draws an animated progress ring around the floating mini-player. Requires the Floating style.",
|
||||
"default": false,
|
||||
"requiresVariant": 0,
|
||||
"fileNames": [
|
||||
"mini-player-floating-border.patch"
|
||||
],
|
||||
"extensionFiles": [
|
||||
"radiant/MiniSeekerFloating.smali"
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "toggle",
|
||||
"key": "gestures",
|
||||
"title": "Mini-Player Gestures",
|
||||
"description": "Adds swipe up gesture to the mini-player to reopen the player",
|
||||
"default": true,
|
||||
"fileNames": [
|
||||
"mini-player-gestures.patch"
|
||||
],
|
||||
"extensionFiles": [
|
||||
"radiant/MiniPlayerGestures.smali",
|
||||
"radiant/MiniPlayerGestures$Gesture.smali",
|
||||
"radiant/MiniPlayerGestures$FeedbackLayer.smali",
|
||||
"radiant/MiniPlayerGestures$FeedbackResetAnimator.smali",
|
||||
"radiant/MiniPlayerGestures$RootGesture.smali",
|
||||
"radiant/MiniPlayerGestures$ApplyPending.smali"
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "choice",
|
||||
"key": "swipe_up_drag",
|
||||
"title": "Swipe Up Style",
|
||||
"entries": [
|
||||
"Static",
|
||||
"Drag"
|
||||
],
|
||||
"values": [
|
||||
"0x0",
|
||||
"0x1"
|
||||
],
|
||||
"defaultIndex": 1,
|
||||
"requiresOption": "gestures",
|
||||
"token": "RL_MINI_PLAYER_SWIPE_UP_DRAG"
|
||||
},
|
||||
{
|
||||
"type": "toggle",
|
||||
"key": "next_prev",
|
||||
"title": "Next/Previous Gestures",
|
||||
"description": "Swipe left or right on the mini-player to skip tracks.",
|
||||
"default": false,
|
||||
"requiresOption": "gestures",
|
||||
"fileNames": [
|
||||
"mini-player-gestures-left-right.patch"
|
||||
],
|
||||
"extensionFiles": [
|
||||
"radiant/MiniPlayerTrackGestures.smali",
|
||||
"radiant/MiniPlayerTrackGestures$Gesture.smali",
|
||||
"radiant/MiniPlayerTrackGestures$OffsetLayer.smali",
|
||||
"radiant/MiniPlayerTrackGestures$ResetAnimator.smali",
|
||||
"radiant/MiniPlayerTrackGestures$TextDraw.smali",
|
||||
"com/tidal/android/feature/appscaffold/ui/s$c.smali"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "LyricsKeepControlsVisible",
|
||||
"order": 60,
|
||||
"fileNames": [
|
||||
"lyrics-keep-controls-visible.patch"
|
||||
],
|
||||
"extensionFiles": [
|
||||
"radiant/LyricsReinitGuard.smali"
|
||||
],
|
||||
"title": "Keep Controls Visible",
|
||||
"description": "Inverts the auto-hide behavior on the lyrics screen, playback controls stay visible by default and only hide when you tap them off. Also stops the open lyrics view from randomly closing when the player re-fetches the same track.",
|
||||
"default": true
|
||||
},
|
||||
{
|
||||
"id": "WazeIntegration",
|
||||
"order": 90,
|
||||
"category": "integration",
|
||||
"pathLocked": true,
|
||||
"fileNames": [
|
||||
"integration-waze-playback.patch"
|
||||
],
|
||||
"extensionFiles": [
|
||||
"radiant/WazeInitReceiver.smali",
|
||||
"radiant/WazeServiceConnection.smali"
|
||||
],
|
||||
"title": "Waze Integration",
|
||||
"description": "Control TIDAL playback from the Waze app",
|
||||
"default": true,
|
||||
"advancedOptions": [
|
||||
{
|
||||
"type": "choice",
|
||||
"key": "browse_root",
|
||||
"title": "Media Menu",
|
||||
"entries": [
|
||||
"Auto Menu",
|
||||
"Home",
|
||||
"Recents"
|
||||
],
|
||||
"values": [
|
||||
"ROOT_AUTO",
|
||||
"HOME_V2::home_page_v2_id",
|
||||
"RECENTLY_PLAYED::home/pages/CONTINUE_LISTEN_TO/view-all"
|
||||
],
|
||||
"defaultIndex": 0,
|
||||
"token": "RL_WAZE_ROOT_ID"
|
||||
},
|
||||
{
|
||||
"type": "color",
|
||||
"key": "accent_color",
|
||||
"title": "Accent Color",
|
||||
"default": -16747037,
|
||||
"token": "RL_WAZE_THEME_COLOR"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "DebugMenuUnlock",
|
||||
"order": 100,
|
||||
"fileNames": [
|
||||
"debug-menu-unlock.patch"
|
||||
],
|
||||
"title": "Unlock Debug Menu",
|
||||
"description": "Reveals TIDAL's hidden Debug Menu in Settings. (Unlocks Feature Flags & the legacy Debug Options)",
|
||||
"default": false
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -22,7 +22,8 @@ class PathManager(
|
||||
|
||||
val patchingDownloadDir = patchingDir.resolve("downloads")
|
||||
|
||||
val cacheDownloadDir = context.cacheDir.resolve("downloads")
|
||||
// Persistent Stash of assets for Offline Repatching
|
||||
val cacheDownloadDir = patchingDir.resolve("downloads-cache")
|
||||
|
||||
val customComponentsDir = patchingDir.resolve("custom")
|
||||
|
||||
@@ -34,11 +35,15 @@ class PathManager(
|
||||
|
||||
val patchedApk = patchingWorkingDir.resolve("patched.apk")
|
||||
|
||||
// Persistent snapshot of the last successful release fetch (build info + patches asset URL)
|
||||
val cachedReleaseInfo = patchingDir.resolve("release-info.json")
|
||||
|
||||
fun clearCache() {
|
||||
val targets = arrayOf(
|
||||
patchingDownloadDir,
|
||||
patchingWorkingDir,
|
||||
cacheDownloadDir,
|
||||
cachedReleaseInfo,
|
||||
context.cacheDir,
|
||||
)
|
||||
for (dir in targets) {
|
||||
@@ -54,6 +59,16 @@ class PathManager(
|
||||
.resolve("patches")
|
||||
.resolve("$version.zip")
|
||||
|
||||
fun hasCachedTidalApk(version: Int, split: String = "base"): Boolean {
|
||||
val rel = "tidal/$version/$split.apk"
|
||||
return patchingDownloadDir.resolve(rel).exists() || cacheDownloadDir.resolve(rel).exists()
|
||||
}
|
||||
|
||||
fun hasCachedSmaliPatches(version: SemVer): Boolean {
|
||||
val rel = "patches/$version.zip"
|
||||
return patchingDownloadDir.resolve(rel).exists() || cacheDownloadDir.resolve(rel).exists()
|
||||
}
|
||||
|
||||
fun customTidalApks() = customTidalApksDir.listFiles()?.asList() ?: emptyList()
|
||||
|
||||
fun customSmaliPatches() = customPatchesDir.listFiles()?.asList() ?: emptyList()
|
||||
|
||||
@@ -12,6 +12,8 @@ class PreferencesManager(preferences: SharedPreferences) : BasePreferenceManager
|
||||
var devMode by booleanPreference("dev_mode", false)
|
||||
var installer by enumPreference<InstallerSetting>("installer", InstallerSetting.PackageInstaller)
|
||||
var keepPatchedApks by booleanPreference("keep_patched_apks", false)
|
||||
// Dev: force-apply path-gated ("incompatible") patches even under a non-stock package name
|
||||
var bypassIncompatible by booleanPreference("bypass_incompatible", false)
|
||||
var showPlayProtectWarning by booleanPreference("show_play_protect_warning", true)
|
||||
var autoUpdateCheck by booleanPreference("auto_update_check", true)
|
||||
|
||||
|
||||
@@ -0,0 +1,32 @@
|
||||
package com.meowarex.rlmobile.manager
|
||||
|
||||
import android.util.Log
|
||||
import com.meowarex.rlmobile.BuildConfig
|
||||
import com.meowarex.rlmobile.network.models.RLBuildInfo
|
||||
import kotlinx.serialization.Serializable
|
||||
import kotlinx.serialization.json.Json
|
||||
|
||||
// Snapshot of the last successful release fetch (build info + patches asset URL)
|
||||
@Serializable
|
||||
data class CachedReleaseInfo(
|
||||
val data: RLBuildInfo,
|
||||
val patchesAssetUrl: String,
|
||||
)
|
||||
|
||||
object ReleaseInfoCache {
|
||||
fun load(paths: PathManager, json: Json): CachedReleaseInfo? = try {
|
||||
paths.cachedReleaseInfo
|
||||
.takeIf { it.exists() }
|
||||
?.let { json.decodeFromString<CachedReleaseInfo>(it.readText()) }
|
||||
} catch (t: Throwable) {
|
||||
Log.w(BuildConfig.TAG, "Failed to read cached release info", t)
|
||||
null
|
||||
}
|
||||
|
||||
fun save(paths: PathManager, json: Json, info: CachedReleaseInfo) = try {
|
||||
paths.cachedReleaseInfo.parentFile?.mkdirs()
|
||||
paths.cachedReleaseInfo.writeText(json.encodeToString(info))
|
||||
} catch (t: Throwable) {
|
||||
Log.w(BuildConfig.TAG, "Failed to cache release info", t)
|
||||
}
|
||||
}
|
||||
+3
-3
@@ -6,7 +6,6 @@ import com.meowarex.rlmobile.patcher.steps.StepGroup
|
||||
import com.meowarex.rlmobile.patcher.steps.base.Step
|
||||
import com.meowarex.rlmobile.patcher.steps.download.CopyDependenciesStep
|
||||
import com.meowarex.rlmobile.patcher.util.ManifestPatcher
|
||||
import com.meowarex.rlmobile.ui.screens.patchopts.KnownPatch
|
||||
import com.meowarex.rlmobile.ui.screens.patchopts.PatchOptions
|
||||
import com.github.diamondminer88.zip.ZipReader
|
||||
import com.github.diamondminer88.zip.ZipWriter
|
||||
@@ -27,8 +26,9 @@ class PatchManifestStep(private val options: PatchOptions) : Step() {
|
||||
?: throw IllegalArgumentException("No manifest found in APK")
|
||||
|
||||
container.log("Patching manifest")
|
||||
val enableWazeIntegration =
|
||||
options.patchStates[KnownPatch.WazeIntegration.name] ?: KnownPatch.WazeIntegration.default.isEnabled
|
||||
val wazeDefault = container.getStep<SmaliPatchStep>().specs
|
||||
.firstOrNull { it.id == "WazeIntegration" }?.defaultEnabled ?: false
|
||||
val enableWazeIntegration = options.patchStates["WazeIntegration"] ?: wazeDefault
|
||||
|
||||
val patchedManifest = ManifestPatcher.patchManifest(
|
||||
manifestBytes = manifest,
|
||||
|
||||
+7
-1
@@ -1,5 +1,6 @@
|
||||
package com.meowarex.rlmobile.patcher.steps.patch
|
||||
|
||||
import android.content.Context
|
||||
import com.meowarex.rlmobile.R
|
||||
import com.meowarex.rlmobile.manager.PathManager
|
||||
import com.meowarex.rlmobile.patcher.StepRunner
|
||||
@@ -10,6 +11,7 @@ import com.meowarex.rlmobile.patcher.steps.download.CopyDependenciesStep
|
||||
import com.meowarex.rlmobile.patcher.steps.download.DownloadPatchesStep
|
||||
import com.meowarex.rlmobile.ui.screens.patchopts.PatchManifest
|
||||
import com.meowarex.rlmobile.ui.screens.patchopts.PatchOptions
|
||||
import com.meowarex.rlmobile.ui.screens.patchopts.PatchSpec
|
||||
import com.meowarex.rlmobile.ui.screens.patchopts.builtinPatchSpecs
|
||||
import com.android.tools.smali.baksmali.Baksmali
|
||||
import com.android.tools.smali.baksmali.BaksmaliOptions
|
||||
@@ -31,6 +33,10 @@ class SmaliPatchStep(
|
||||
) : Step(), IDexProvider, KoinComponent {
|
||||
private val paths: PathManager by inject()
|
||||
private val json: Json by inject()
|
||||
private val context: Context by inject()
|
||||
|
||||
var specs: List<PatchSpec> = emptyList()
|
||||
private set
|
||||
|
||||
override val group = StepGroup.Patch
|
||||
override val localizedName = R.string.patch_step_patch_smali
|
||||
@@ -55,7 +61,7 @@ class SmaliPatchStep(
|
||||
container.log("Failed to parse manifest.json (${t.message}); using built-in patch specs")
|
||||
null
|
||||
}
|
||||
val specs = manifestSpecs ?: builtinPatchSpecs { "" }
|
||||
specs = manifestSpecs ?: builtinPatchSpecs(context, json)
|
||||
container.log(
|
||||
"Loaded ${specs.size} patch specs from " +
|
||||
if (manifestSpecs != null) "manifest.json" else "built-in list"
|
||||
|
||||
+45
-2
@@ -1,19 +1,30 @@
|
||||
package com.meowarex.rlmobile.patcher.steps.prepare
|
||||
|
||||
import android.app.Application
|
||||
import android.util.Log
|
||||
import androidx.compose.runtime.Stable
|
||||
import com.meowarex.rlmobile.R
|
||||
import com.meowarex.rlmobile.manager.CachedReleaseInfo
|
||||
import com.meowarex.rlmobile.manager.PathManager
|
||||
import com.meowarex.rlmobile.manager.ReleaseInfoCache
|
||||
import com.meowarex.rlmobile.network.models.RLBuildInfo
|
||||
import com.meowarex.rlmobile.network.services.RadiantLyricsGithubService
|
||||
import com.meowarex.rlmobile.network.utils.getOrThrow
|
||||
import com.meowarex.rlmobile.patcher.StepRunner
|
||||
import com.meowarex.rlmobile.patcher.steps.StepGroup
|
||||
import com.meowarex.rlmobile.patcher.steps.base.Step
|
||||
import com.meowarex.rlmobile.util.isOnline
|
||||
import kotlinx.serialization.json.Json
|
||||
import org.koin.core.component.KoinComponent
|
||||
import org.koin.core.component.inject
|
||||
import kotlin.coroutines.cancellation.CancellationException
|
||||
|
||||
@Stable
|
||||
class FetchInfoStep : Step(), KoinComponent {
|
||||
private val github: RadiantLyricsGithubService by inject()
|
||||
private val context: Application by inject()
|
||||
private val paths: PathManager by inject()
|
||||
private val json: Json by inject()
|
||||
|
||||
override val group = StepGroup.Prepare
|
||||
override val localizedName = R.string.patch_step_fetch_info
|
||||
@@ -25,6 +36,33 @@ class FetchInfoStep : Step(), KoinComponent {
|
||||
private set
|
||||
|
||||
override suspend fun execute(container: StepRunner) {
|
||||
// Fetch the latest release and refresh the cache (when online)
|
||||
if (context.isOnline()) {
|
||||
try {
|
||||
fetchFromRemote(container)
|
||||
return
|
||||
} catch (e: CancellationException) {
|
||||
throw e
|
||||
} catch (t: Throwable) {
|
||||
container.log("Failed to fetch latest release: ${Log.getStackTraceString(t)}")
|
||||
container.log("Falling back to cached release info for a local re-patch")
|
||||
}
|
||||
} else {
|
||||
container.log("No network connection — using cached release info for a local re-patch")
|
||||
}
|
||||
|
||||
val cached = ReleaseInfoCache.load(paths, json)
|
||||
?: throw IllegalStateException(
|
||||
"Could not fetch the latest release and no cached release info is available. " +
|
||||
"Connect to the internet and try again."
|
||||
)
|
||||
data = cached.data
|
||||
patchesAssetUrl = cached.patchesAssetUrl
|
||||
container.log("Using cached build info: $data")
|
||||
container.log("Cached patches asset URL: $patchesAssetUrl")
|
||||
}
|
||||
|
||||
private suspend fun fetchFromRemote(container: StepRunner) {
|
||||
container.log("Fetching latest release from ${RadiantLyricsGithubService.REPO_OWNER}/${RadiantLyricsGithubService.REPO_NAME}")
|
||||
val release = github.getLatestRelease(force = true).getOrThrow()
|
||||
|
||||
@@ -33,14 +71,19 @@ class FetchInfoStep : Step(), KoinComponent {
|
||||
?.browserDownloadUrl
|
||||
?: throw IllegalStateException("No ${RadiantLyricsGithubService.DATA_JSON_ASSET_NAME} asset found in latest release ${release.tagName}")
|
||||
|
||||
patchesAssetUrl = release.assets
|
||||
val patchesUrl = release.assets
|
||||
.find { it.name == RadiantLyricsGithubService.PATCHES_ASSET_NAME }
|
||||
?.browserDownloadUrl
|
||||
?: throw IllegalStateException("No ${RadiantLyricsGithubService.PATCHES_ASSET_NAME} asset found in latest release ${release.tagName}")
|
||||
|
||||
container.log("Fetching build info from $dataJsonUrl")
|
||||
data = github.getBuildInfo(dataJsonUrl, force = true).getOrThrow()
|
||||
val buildInfo = github.getBuildInfo(dataJsonUrl, force = true).getOrThrow()
|
||||
|
||||
data = buildInfo
|
||||
patchesAssetUrl = patchesUrl
|
||||
container.log("Fetched build info: $data")
|
||||
container.log("Patches asset URL: $patchesAssetUrl")
|
||||
|
||||
ReleaseInfoCache.save(paths, json, CachedReleaseInfo(buildInfo, patchesUrl))
|
||||
}
|
||||
}
|
||||
|
||||
+4
-1
@@ -9,6 +9,7 @@ import com.meowarex.rlmobile.network.utils.SemVer
|
||||
import com.meowarex.rlmobile.ui.screens.componentopts.PatchComponent
|
||||
import com.meowarex.rlmobile.ui.screens.patchopts.*
|
||||
import com.meowarex.rlmobile.ui.theme.ManagerTheme
|
||||
import kotlinx.serialization.json.Json
|
||||
import kotlin.time.Clock
|
||||
|
||||
// This preview has scrollable/interactable content that cannot be tested from an IDE preview
|
||||
@@ -21,7 +22,7 @@ private fun PatchOptionsScreenPreview(
|
||||
parameters: PatchOptionsParameters,
|
||||
) {
|
||||
val context = LocalContext.current
|
||||
val specs = remember { builtinPatchSpecs { context.getString(it) } }
|
||||
val specs = remember { builtinPatchSpecs(context, Json { ignoreUnknownKeys = true }) }
|
||||
|
||||
ManagerTheme {
|
||||
PatchOptionsScreenContent(
|
||||
@@ -29,6 +30,8 @@ private fun PatchOptionsScreenPreview(
|
||||
isDevMode = parameters.isDevMode,
|
||||
debuggable = parameters.debuggable,
|
||||
setDebuggable = {},
|
||||
bypassIncompatible = false,
|
||||
setBypassIncompatible = {},
|
||||
appName = parameters.appName,
|
||||
appNameIsError = parameters.appNameIsError,
|
||||
setAppName = {},
|
||||
|
||||
@@ -19,7 +19,9 @@ import cafe.adriel.voyager.core.model.screenModelScope
|
||||
import com.github.diamondminer88.zip.ZipReader
|
||||
import com.meowarex.rlmobile.BuildConfig
|
||||
import com.meowarex.rlmobile.R
|
||||
import com.meowarex.rlmobile.manager.PathManager
|
||||
import com.meowarex.rlmobile.manager.PreferencesManager
|
||||
import com.meowarex.rlmobile.manager.ReleaseInfoCache
|
||||
import com.meowarex.rlmobile.network.models.GithubCommit
|
||||
import com.meowarex.rlmobile.network.models.RLBuildInfo
|
||||
import com.meowarex.rlmobile.network.services.RadiantLyricsGithubService
|
||||
@@ -42,6 +44,7 @@ class HomeModel(
|
||||
private val github: RadiantLyricsGithubService,
|
||||
private val json: Json,
|
||||
private val prefs: PreferencesManager,
|
||||
private val paths: PathManager,
|
||||
) : ScreenModel {
|
||||
|
||||
var state by mutableStateOf<HomeState>(HomeState.Loading)
|
||||
@@ -170,16 +173,23 @@ class HomeModel(
|
||||
|
||||
refreshingLock.withLock {
|
||||
val pkg = fetchInstalled()
|
||||
// Skip the remote fetch entirely when offline
|
||||
val online = application.isOnline()
|
||||
if (online) {
|
||||
val remote = async(Dispatchers.IO) { if (remoteDataJson == null) fetchRemoteData() }
|
||||
remote.await()
|
||||
}
|
||||
|
||||
val install = pkg?.toInstallData()
|
||||
val latest = remoteDataJson?.tidalVersionCode
|
||||
val offlineRepatchReady = hasOfflineRepatchAssets()
|
||||
|
||||
mainThread {
|
||||
state = HomeState.Loaded(
|
||||
install = install,
|
||||
latestTidalVersionCode = latest,
|
||||
offline = !online,
|
||||
offlineRepatchReady = offlineRepatchReady,
|
||||
)
|
||||
maybeCheckManagerUpdate(pkg)
|
||||
}
|
||||
@@ -257,6 +267,13 @@ class HomeModel(
|
||||
)
|
||||
}
|
||||
|
||||
// check if an offline "Local Repatch" is possible
|
||||
private fun hasOfflineRepatchAssets(): Boolean {
|
||||
val info = ReleaseInfoCache.load(paths, json) ?: return false
|
||||
return paths.hasCachedTidalApk(info.data.tidalVersionCode) &&
|
||||
paths.hasCachedSmaliPatches(info.data.patchesVersion)
|
||||
}
|
||||
|
||||
private suspend fun fetchRemoteData() {
|
||||
val release = try {
|
||||
github.getLatestRelease().fold(
|
||||
|
||||
@@ -210,14 +210,19 @@ private fun ColumnScope.HomeContent(
|
||||
}
|
||||
|
||||
val blockedByManagerUpdate = managerUpdateAvailable && (patchesBehind || tidalBehind)
|
||||
val canLocalRepatch = install != null && state.offlineRepatchReady
|
||||
val onlineEnabled = state.latestTidalVersionCode != null || install != null
|
||||
val buttonEnabled = !blockedByManagerUpdate && (if (state.offline) canLocalRepatch else onlineEnabled)
|
||||
Button(
|
||||
onClick = if (install == null) onInstall else onRepatch,
|
||||
enabled = state.latestTidalVersionCode != null && !blockedByManagerUpdate,
|
||||
enabled = buttonEnabled,
|
||||
modifier = Modifier.fillMaxWidth(),
|
||||
) {
|
||||
val label = when {
|
||||
blockedByManagerUpdate -> "Manager Update Required"
|
||||
state.latestTidalVersionCode == null -> "Loading…"
|
||||
state.offline && install != null -> "Local Repatch"
|
||||
state.offline -> "No Network"
|
||||
install == null && state.latestTidalVersionCode == null -> "Loading…"
|
||||
install == null -> "Install"
|
||||
patchesBehind && tidalBehind -> "Update Patches & TIDAL"
|
||||
patchesBehind -> "Update Patches"
|
||||
@@ -234,6 +239,18 @@ private fun ColumnScope.HomeContent(
|
||||
)
|
||||
}
|
||||
|
||||
if (state.offline && install != null) {
|
||||
Text(
|
||||
text = "No Network Connection",
|
||||
style = MaterialTheme.typography.bodySmall,
|
||||
color = MaterialTheme.colorScheme.onSurfaceVariant,
|
||||
textAlign = TextAlign.Center,
|
||||
modifier = Modifier
|
||||
.fillMaxWidth()
|
||||
.padding(top = 6.dp),
|
||||
)
|
||||
}
|
||||
|
||||
AnimatedVisibility(visible = install != null) {
|
||||
Row(
|
||||
horizontalArrangement = Arrangement.spacedBy(2.dp),
|
||||
|
||||
@@ -8,5 +8,7 @@ sealed interface HomeState {
|
||||
data class Loaded(
|
||||
val install: InstallData?,
|
||||
val latestTidalVersionCode: Int?,
|
||||
val offline: Boolean = false,
|
||||
val offlineRepatchReady: Boolean = false,
|
||||
) : HomeState
|
||||
}
|
||||
|
||||
@@ -1,296 +0,0 @@
|
||||
package com.meowarex.rlmobile.ui.screens.patchopts
|
||||
|
||||
import androidx.annotation.StringRes
|
||||
import com.meowarex.rlmobile.R
|
||||
import com.meowarex.rlmobile.ui.screens.patchopts.PatchDefault.Disabled
|
||||
import com.meowarex.rlmobile.ui.screens.patchopts.PatchDefault.Enabled
|
||||
|
||||
data class PatchVariant(
|
||||
@StringRes val titleRes: Int,
|
||||
val fileNames: List<String>,
|
||||
val extensionFiles: List<String> = emptyList(),
|
||||
)
|
||||
|
||||
|
||||
enum class KnownPatch(
|
||||
val order: Int, // Patch order in the UI List (lower = higher up) [Main Patches: multiples of 10 | Sub Patches: multiples of 1]
|
||||
val fileNames: List<String>,
|
||||
val extensionFiles: List<String> = emptyList(),
|
||||
@StringRes val titleRes: Int,
|
||||
@StringRes val descRes: Int,
|
||||
val default: PatchDefault, // Default state of the patch in the UI List (enabled/disabled)
|
||||
val requires: List<KnownPatch> = emptyList(),
|
||||
val disables: List<KnownPatch> = emptyList(),
|
||||
val variants: List<PatchVariant> = emptyList(),
|
||||
val defaultVariantIndex: Int = 0,
|
||||
val advancedOptions: List<PatchOption> = emptyList(),
|
||||
val category: String = PatchSpec.CATEGORY_PATCH,
|
||||
val pathLocked: Boolean = false,
|
||||
) {
|
||||
LyricsDisableCover(
|
||||
order = 41,
|
||||
fileNames = listOf("lyrics-disable-cover.patch"),
|
||||
titleRes = R.string.patch_lyrics_disable_cover_title,
|
||||
descRes = R.string.patch_lyrics_disable_cover_desc,
|
||||
default = Enabled,
|
||||
),
|
||||
LyricsReplaceLyricsButton(
|
||||
order = 42,
|
||||
fileNames = listOf(
|
||||
"lyrics-replace-lyrics-button.patch",
|
||||
"lyrics-sparkle-conditional-visibility.patch",
|
||||
),
|
||||
titleRes = R.string.patch_lyrics_replace_button_title,
|
||||
descRes = R.string.patch_lyrics_replace_button_desc,
|
||||
default = Enabled,
|
||||
),
|
||||
LyricsReplaceShareButton(
|
||||
order = 43,
|
||||
fileNames = listOf("lyrics-replace-share-button.patch"),
|
||||
titleRes = R.string.patch_lyrics_replace_share_button_title,
|
||||
descRes = R.string.patch_lyrics_replace_share_button_desc,
|
||||
default = Enabled,
|
||||
),
|
||||
LyricsRlApi(
|
||||
order = 20,
|
||||
fileNames = listOf(
|
||||
"lyrics-rl-api.patch",
|
||||
"lyrics-rl-api-observer.patch",
|
||||
),
|
||||
titleRes = R.string.patch_lyrics_rl_api_title,
|
||||
descRes = R.string.patch_lyrics_rl_api_desc,
|
||||
default = Disabled,
|
||||
),
|
||||
LyricsKeepControlsVisible(
|
||||
order = 60,
|
||||
fileNames = listOf("lyrics-keep-controls-visible.patch"),
|
||||
titleRes = R.string.patch_lyrics_keep_controls_title,
|
||||
descRes = R.string.patch_lyrics_keep_controls_desc,
|
||||
default = Enabled,
|
||||
),
|
||||
PlayerBackdrop(
|
||||
order = 30,
|
||||
fileNames = listOf("player-backdrop.patch"),
|
||||
titleRes = R.string.patch_player_backdrop_title,
|
||||
descRes = R.string.patch_player_backdrop_desc,
|
||||
default = Enabled,
|
||||
advancedOptions = listOf(
|
||||
PatchOption.Slider(
|
||||
key = "blur_strength",
|
||||
titleRes = R.string.patch_opt_backdrop_blur_title,
|
||||
descRes = R.string.patch_opt_backdrop_blur_desc,
|
||||
default = 50f,
|
||||
valueRange = 0f..100f,
|
||||
steps = 19, // dots every 5% (0,5,…,100); snap only when locked
|
||||
displayAsPercent = true,
|
||||
token = "RL_BLUR_BITS",
|
||||
encode = SmaliEncode(EncodeKind.FloatBits, scale = 1.8f),
|
||||
),
|
||||
PatchOption.Slider(
|
||||
key = "dimming",
|
||||
titleRes = R.string.patch_opt_backdrop_dimming_title,
|
||||
descRes = R.string.patch_opt_backdrop_dimming_desc,
|
||||
default = 50f, // 50% == the original -0x80000000
|
||||
valueRange = 0f..100f,
|
||||
steps = 19, // dots every 5%
|
||||
displayAsPercent = true,
|
||||
token = "RL_SCRIM_ARGB",
|
||||
encode = SmaliEncode(EncodeKind.ArgbAlpha),
|
||||
),
|
||||
PatchOption.Toggle(
|
||||
key = "cover_everywhere",
|
||||
titleRes = R.string.patch_cover_everywhere_title,
|
||||
descRes = R.string.patch_cover_everywhere_desc,
|
||||
default = false,
|
||||
inline = true,
|
||||
fileNames = listOf(
|
||||
"home-backdrop.patch",
|
||||
"collection-backdrop.patch",
|
||||
"cover-capture.patch",
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
QualityBadgeColors(
|
||||
order = 36,
|
||||
fileNames = listOf("player-quality-badge-colors.patch"),
|
||||
titleRes = R.string.patch_quality_badge_colors_title,
|
||||
descRes = R.string.patch_quality_badge_colors_desc,
|
||||
default = Enabled,
|
||||
),
|
||||
PlayerOneHanded(
|
||||
order = 37,
|
||||
fileNames = listOf("player-one-handed.patch"),
|
||||
titleRes = R.string.patch_player_one_handed_title,
|
||||
descRes = R.string.patch_player_one_handed_desc,
|
||||
default = Disabled,
|
||||
),
|
||||
DebugMenuUnlock(
|
||||
order = 100,
|
||||
fileNames = listOf("debug-menu-unlock.patch"),
|
||||
titleRes = R.string.patch_debug_menu_unlock_title,
|
||||
descRes = R.string.patch_debug_menu_unlock_desc,
|
||||
default = Disabled,
|
||||
),
|
||||
WazeIntegration(
|
||||
order = 90,
|
||||
fileNames = listOf("waze-media-browser.patch"),
|
||||
extensionFiles = listOf(
|
||||
"radiant/WazeInitReceiver.smali",
|
||||
"radiant/WazeServiceConnection.smali",
|
||||
),
|
||||
titleRes = R.string.patch_waze_integration_title,
|
||||
descRes = R.string.patch_waze_integration_desc,
|
||||
default = Disabled,
|
||||
category = PatchSpec.CATEGORY_INTEGRATION,
|
||||
pathLocked = true,
|
||||
advancedOptions = listOf(
|
||||
PatchOption.Choice(
|
||||
key = "browse_root",
|
||||
titleRes = R.string.patch_waze_browse_root_title,
|
||||
entries = listOf(
|
||||
ChoiceEntry(R.string.patch_waze_root_auto, value = "ROOT_AUTO"),
|
||||
ChoiceEntry(R.string.patch_waze_root_home, value = "HOME_V2::home_page_v2_id"),
|
||||
ChoiceEntry(
|
||||
R.string.patch_waze_root_recents,
|
||||
value = "RECENTLY_PLAYED::home/pages/CONTINUE_LISTEN_TO/view-all",
|
||||
),
|
||||
),
|
||||
defaultIndex = 0,
|
||||
token = "RL_WAZE_ROOT_ID",
|
||||
),
|
||||
PatchOption.Color(
|
||||
key = "accent_color",
|
||||
titleRes = R.string.patch_waze_accent_color_title,
|
||||
default = -16747037, // Waze default #ff0075e3
|
||||
token = "RL_WAZE_THEME_COLOR",
|
||||
),
|
||||
),
|
||||
),
|
||||
LyricsProgressPill(
|
||||
order = 40,
|
||||
fileNames = listOf(
|
||||
"lyrics-progress-pill.patch",
|
||||
"lyrics-fade-region.patch",
|
||||
),
|
||||
titleRes = R.string.patch_lyrics_progress_pill_title,
|
||||
descRes = R.string.patch_lyrics_progress_pill_desc,
|
||||
default = Enabled,
|
||||
requires = listOf(LyricsDisableCover, LyricsReplaceLyricsButton, LyricsReplaceShareButton),
|
||||
),
|
||||
MiniPlayerRedesign(
|
||||
order = 50,
|
||||
fileNames = emptyList(),
|
||||
titleRes = R.string.patch_mini_player_redesign_title,
|
||||
descRes = R.string.patch_mini_player_redesign_desc,
|
||||
default = Disabled,
|
||||
defaultVariantIndex = 2,
|
||||
variants = listOf(
|
||||
PatchVariant( // 0: Floating — stock rounded pill
|
||||
titleRes = R.string.patch_mini_player_variant_floating_title,
|
||||
fileNames = emptyList(),
|
||||
),
|
||||
PatchVariant( // 1: Grey — square
|
||||
titleRes = R.string.patch_mini_player_variant_square_grey_title,
|
||||
fileNames = listOf("mini-player-grey.patch"),
|
||||
),
|
||||
PatchVariant( // 2: Black — square black background
|
||||
titleRes = R.string.patch_mini_player_variant_square_black_title,
|
||||
fileNames = listOf("mini-player-black.patch"),
|
||||
),
|
||||
),
|
||||
advancedOptions = listOf(
|
||||
PatchOption.Toggle(
|
||||
key = "dynamic_bg",
|
||||
titleRes = R.string.patch_mini_player_dynamic_bg_title,
|
||||
descRes = R.string.patch_mini_player_dynamic_bg_desc,
|
||||
default = false,
|
||||
inline = true,
|
||||
fileNames = listOf("mini-player-dynamic-bg.patch"),
|
||||
extensionFiles = listOf("radiant/MiniPlayerBackground.smali"),
|
||||
hidesVariants = listOf(2),
|
||||
relabelVariants = mapOf(1 to R.string.patch_mini_player_variant_legacy_title),
|
||||
),
|
||||
// Animated progress border around the floating pill
|
||||
PatchOption.Toggle(
|
||||
key = "border",
|
||||
titleRes = R.string.patch_mini_player_border_title,
|
||||
descRes = R.string.patch_mini_player_border_desc,
|
||||
default = false,
|
||||
requiresVariant = 0,
|
||||
fileNames = listOf("mini-player-floating-border.patch"),
|
||||
extensionFiles = listOf("radiant/MiniSeekerFloating.smali"),
|
||||
),
|
||||
// Swipe up to open the full player
|
||||
PatchOption.Toggle(
|
||||
key = "gestures",
|
||||
titleRes = R.string.patch_mini_player_gestures_title,
|
||||
descRes = R.string.patch_mini_player_gestures_desc,
|
||||
default = true,
|
||||
fileNames = listOf("mini-player-gestures.patch"),
|
||||
extensionFiles = listOf(
|
||||
"radiant/MiniPlayerGestures.smali",
|
||||
"radiant/MiniPlayerGestures\$Gesture.smali",
|
||||
"radiant/MiniPlayerGestures\$FeedbackLayer.smali",
|
||||
"radiant/MiniPlayerGestures\$FeedbackResetAnimator.smali",
|
||||
"radiant/MiniPlayerGestures\$RootGesture.smali",
|
||||
"radiant/MiniPlayerGestures\$ApplyPending.smali",
|
||||
),
|
||||
),
|
||||
PatchOption.Choice(
|
||||
key = "swipe_up_drag",
|
||||
titleRes = R.string.patch_mini_player_drag_title,
|
||||
descRes = R.string.patch_mini_player_drag_desc,
|
||||
entries = listOf(
|
||||
ChoiceEntry(R.string.patch_mini_player_drag_static, value = "0x0"),
|
||||
ChoiceEntry(R.string.patch_mini_player_drag_drag, value = "0x1"),
|
||||
),
|
||||
defaultIndex = 1,
|
||||
requiresOption = "gestures",
|
||||
token = "RL_MINI_PLAYER_SWIPE_UP_DRAG",
|
||||
),
|
||||
// Swipe left/right to skip
|
||||
PatchOption.Toggle(
|
||||
key = "next_prev",
|
||||
titleRes = R.string.patch_mini_player_left_right_gestures_title,
|
||||
descRes = R.string.patch_mini_player_left_right_gestures_desc,
|
||||
default = false,
|
||||
requiresOption = "gestures",
|
||||
fileNames = listOf("mini-player-gestures-left-right.patch"),
|
||||
extensionFiles = listOf(
|
||||
"radiant/MiniPlayerTrackGestures.smali",
|
||||
"radiant/MiniPlayerTrackGestures\$Gesture.smali",
|
||||
"radiant/MiniPlayerTrackGestures\$OffsetLayer.smali",
|
||||
"radiant/MiniPlayerTrackGestures\$ResetAnimator.smali",
|
||||
"radiant/MiniPlayerTrackGestures\$TextDraw.smali",
|
||||
"com/tidal/android/feature/appscaffold/ui/q\$c.smali",
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
EnableLegacyUi(
|
||||
order = 10,
|
||||
fileNames = listOf("enable-legacy-ui.patch"),
|
||||
titleRes = R.string.patch_enable_legacy_ui_title,
|
||||
descRes = R.string.patch_enable_legacy_ui_desc,
|
||||
default = Disabled,
|
||||
requires = listOf(DebugMenuUnlock),
|
||||
disables = listOf(
|
||||
LyricsDisableCover,
|
||||
LyricsReplaceLyricsButton,
|
||||
LyricsReplaceShareButton,
|
||||
LyricsRlApi,
|
||||
LyricsKeepControlsVisible,
|
||||
PlayerBackdrop,
|
||||
QualityBadgeColors,
|
||||
LyricsProgressPill,
|
||||
MiniPlayerRedesign,
|
||||
),
|
||||
);
|
||||
|
||||
companion object {
|
||||
val All: List<KnownPatch> = entries.sortedWith(
|
||||
compareBy({ it.order }, { it.fileNames.firstOrNull() ?: it.name })
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -1,6 +0,0 @@
|
||||
package com.meowarex.rlmobile.ui.screens.patchopts
|
||||
|
||||
enum class PatchDefault(val isEnabled: Boolean) {
|
||||
Enabled(true),
|
||||
Disabled(false),
|
||||
}
|
||||
@@ -1,81 +0,0 @@
|
||||
package com.meowarex.rlmobile.ui.screens.patchopts
|
||||
|
||||
import androidx.annotation.StringRes
|
||||
|
||||
sealed interface PatchOption {
|
||||
/** Stable identifier, unique within a single patch. */
|
||||
val key: String
|
||||
|
||||
@get:StringRes
|
||||
val titleRes: Int
|
||||
|
||||
@get:StringRes
|
||||
val descRes: Int
|
||||
|
||||
/** A simple on/off switch. */
|
||||
data class Toggle(
|
||||
override val key: String,
|
||||
@StringRes override val titleRes: Int,
|
||||
@StringRes override val descRes: Int,
|
||||
val default: Boolean,
|
||||
/** Patch files applied only while this toggle is on (and its patch is enabled). */
|
||||
val fileNames: List<String> = emptyList(),
|
||||
/** Helper smali extracted only while this toggle is on. */
|
||||
val extensionFiles: List<String> = emptyList(),
|
||||
/** Render inline beneath the variant selector instead of inside the advanced sheet. */
|
||||
val inline: Boolean = false,
|
||||
/** Greyed out (with the lock dialog) unless this variant index is the selected one. */
|
||||
val requiresVariant: Int? = null,
|
||||
/** Greyed out unless the sibling option with this key is currently on. */
|
||||
val requiresOption: String? = null,
|
||||
/** Variant indices hidden from the picker while this toggle is on. */
|
||||
val hidesVariants: List<Int> = emptyList(),
|
||||
/** Variant title overrides (index -> @StringRes) applied while this toggle is on. */
|
||||
val relabelVariants: Map<Int, Int> = emptyMap(),
|
||||
/** Placeholder name (without the surrounding `__`) baked into the `.patch` files. */
|
||||
val token: String? = null,
|
||||
) : PatchOption
|
||||
|
||||
/** A continuous (or stepped) numeric value within [valueRange]. */
|
||||
data class Slider(
|
||||
override val key: String,
|
||||
@StringRes override val titleRes: Int,
|
||||
@StringRes override val descRes: Int,
|
||||
val default: Float,
|
||||
val valueRange: ClosedFloatingPointRange<Float>,
|
||||
/** Number of discrete steps between the range ends (0 = continuous). */
|
||||
val steps: Int = 0,
|
||||
/** Render the value as a rounded percentage (e.g. "50%"). */
|
||||
val displayAsPercent: Boolean = false,
|
||||
/** Optional unit suffix shown after the value (e.g. "dp"). */
|
||||
@StringRes val unitRes: Int? = null,
|
||||
/** Placeholder name (without the surrounding `__`) baked into the `.patch` files. */
|
||||
val token: String? = null,
|
||||
/** How the chosen value becomes the smali literal that replaces the [token]. */
|
||||
val encode: SmaliEncode? = null,
|
||||
) : PatchOption
|
||||
|
||||
/** A single choice out of a small list, rendered as a segmented control. */
|
||||
data class Choice(
|
||||
override val key: String,
|
||||
@StringRes override val titleRes: Int,
|
||||
@StringRes override val descRes: Int = 0,
|
||||
val entries: List<ChoiceEntry>,
|
||||
val defaultIndex: Int = 0,
|
||||
val requiresOption: String? = null,
|
||||
val token: String? = null,
|
||||
) : PatchOption
|
||||
|
||||
data class Color(
|
||||
override val key: String,
|
||||
@StringRes override val titleRes: Int,
|
||||
@StringRes override val descRes: Int = 0,
|
||||
val default: Int,
|
||||
val token: String? = null,
|
||||
) : PatchOption
|
||||
}
|
||||
|
||||
data class ChoiceEntry(
|
||||
@StringRes val labelRes: Int,
|
||||
val value: String? = null,
|
||||
)
|
||||
+24
-4
@@ -45,7 +45,7 @@ class PatchOptionsModel(
|
||||
|
||||
/** Patches flagged [PatchSpec.pathLocked] only work under the stock package name. */
|
||||
fun isBlockedByPackageName(spec: PatchSpec): Boolean =
|
||||
spec.pathLocked && packageName != PatchOptions.Default.packageName
|
||||
spec.pathLocked && packageName != PatchOptions.Default.packageName && !bypassIncompatible
|
||||
|
||||
/** The package-name field starts locked & editing requires confirming the unlock dialog */
|
||||
var packageNameLocked by mutableStateOf(prefilledOptions.packageName == PatchOptions.Default.packageName)
|
||||
@@ -79,10 +79,20 @@ class PatchOptionsModel(
|
||||
debuggable = value
|
||||
}
|
||||
|
||||
/** Dev override: force-allow path-gated ("incompatible") patches under a non-stock package name. */
|
||||
var bypassIncompatible by mutableStateOf(prefs.bypassIncompatible)
|
||||
private set
|
||||
|
||||
fun changeBypassIncompatible(value: Boolean) {
|
||||
bypassIncompatible = value
|
||||
prefs.bypassIncompatible = value
|
||||
validatePatchSelection()
|
||||
}
|
||||
|
||||
// The accordion renders from [specs]. It defaults to the compiled-in (localized) list and is
|
||||
// rebuilt from a custom zip's manifest.json whenever a custom patch set is selected. (Rminder for others about the new custom patch selection flow)
|
||||
|
||||
private val builtinSpecs: List<PatchSpec> = builtinPatchSpecs { context.getString(it) }
|
||||
private val builtinSpecs: List<PatchSpec> = builtinPatchSpecs(context, json)
|
||||
|
||||
var specs by mutableStateOf(builtinSpecs)
|
||||
private set
|
||||
@@ -281,6 +291,7 @@ class PatchOptionsModel(
|
||||
val bytes = ZipReader(file).use { it.openEntry(MANIFEST_NAME)?.read() } ?: return null
|
||||
json.decodeFromString(PatchManifest.serializer(), bytes.decodeToString())
|
||||
.patches
|
||||
.sortedBy { it.order } // manifest is authoritative for UI order (not KnownPatch)
|
||||
.takeIf { it.isNotEmpty() }
|
||||
} catch (t: Throwable) {
|
||||
Log.w(BuildConfig.TAG, "Failed to parse $MANIFEST_NAME; using built-in list", t)
|
||||
@@ -320,10 +331,19 @@ class PatchOptionsModel(
|
||||
null
|
||||
}
|
||||
|
||||
/** Default (non-custom) source: the latest release manifest, falling back to the built-in list. */
|
||||
private fun loadCachedReleaseManifestSpecs(): List<PatchSpec>? =
|
||||
paths.cacheDownloadDir
|
||||
.listFiles { f -> f.name.startsWith("manifest-") && f.name.endsWith(".zip") }
|
||||
?.maxByOrNull { it.lastModified() }
|
||||
?.let { loadManifestSpecs(it) }
|
||||
?.also { Log.i(BuildConfig.TAG, "Loaded ${it.size} patches from cached release manifest (offline)") }
|
||||
|
||||
/** Default (non-custom) source: latest release manifest → last cached manifest → built-in list. */
|
||||
private fun loadDefaultSpecs() = screenModelScope.launchIO {
|
||||
mainThread { specsLoading = true }
|
||||
val loaded = loadLatestReleaseSpecs() ?: builtinSpecs
|
||||
// Only hit the network when actually online
|
||||
val loaded = (if (context.isOnline()) loadLatestReleaseSpecs() else null)
|
||||
?: loadCachedReleaseManifestSpecs() ?: builtinSpecs
|
||||
mainThread {
|
||||
specs = loaded
|
||||
validatePatchSelection()
|
||||
|
||||
+14
-1
@@ -48,6 +48,8 @@ class PatchOptionsScreen(
|
||||
|
||||
debuggable = model.debuggable,
|
||||
setDebuggable = model::changeDebuggable,
|
||||
bypassIncompatible = model.bypassIncompatible,
|
||||
setBypassIncompatible = model::changeBypassIncompatible,
|
||||
|
||||
appName = model.appName,
|
||||
appNameIsError = model.appNameIsError,
|
||||
@@ -89,6 +91,8 @@ fun PatchOptionsScreenContent(
|
||||
|
||||
debuggable: Boolean,
|
||||
setDebuggable: (Boolean) -> Unit,
|
||||
bypassIncompatible: Boolean,
|
||||
setBypassIncompatible: (Boolean) -> Unit,
|
||||
|
||||
appName: String,
|
||||
appNameIsError: Boolean,
|
||||
@@ -121,7 +125,8 @@ fun PatchOptionsScreenContent(
|
||||
var showPkgUnlockDialog by rememberSaveable { mutableStateOf(false) }
|
||||
if (showPkgUnlockDialog) {
|
||||
PackageNameUnlockDialog(
|
||||
blockedTitles = specs.filter { it.pathLocked }.map { it.title },
|
||||
// With "Bypass Incompatible" on, path-gated patches are force-applied, not disabled.
|
||||
blockedTitles = if (bypassIncompatible) emptyList() else specs.filter { it.pathLocked }.map { it.title },
|
||||
onConfirm = {
|
||||
showPkgUnlockDialog = false
|
||||
onUnlockPackageName()
|
||||
@@ -268,6 +273,14 @@ fun PatchOptionsScreenContent(
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
SwitchPatchOption(
|
||||
icon = painterResource(R.drawable.ic_lock_open),
|
||||
name = stringResource(R.string.patchopts_bypass_incompatible_title),
|
||||
description = stringResource(R.string.patchopts_bypass_incompatible_desc),
|
||||
value = bypassIncompatible,
|
||||
onValueChange = setBypassIncompatible,
|
||||
)
|
||||
}
|
||||
|
||||
Spacer(Modifier.weight(1f))
|
||||
|
||||
+12
-67
@@ -1,9 +1,11 @@
|
||||
package com.meowarex.rlmobile.ui.screens.patchopts
|
||||
|
||||
import android.content.Context
|
||||
import androidx.compose.runtime.Immutable
|
||||
import androidx.compose.runtime.Stable
|
||||
import kotlinx.serialization.SerialName
|
||||
import kotlinx.serialization.Serializable
|
||||
import kotlinx.serialization.json.Json
|
||||
import kotlin.math.roundToInt
|
||||
|
||||
@Serializable
|
||||
@@ -157,74 +159,17 @@ data class SmaliEncode(
|
||||
}
|
||||
}
|
||||
|
||||
fun builtinPatchSpecs(resolve: (Int) -> String): List<PatchSpec> =
|
||||
KnownPatch.All.map { patch ->
|
||||
PatchSpec(
|
||||
id = patch.name,
|
||||
order = patch.order,
|
||||
fileNames = patch.fileNames,
|
||||
extensionFiles = patch.extensionFiles,
|
||||
title = resolve(patch.titleRes),
|
||||
description = resolve(patch.descRes),
|
||||
defaultEnabled = patch.default.isEnabled,
|
||||
requires = patch.requires.map { it.name },
|
||||
disables = patch.disables.map { it.name },
|
||||
variants = patch.variants.map { VariantSpec(resolve(it.titleRes), it.fileNames, it.extensionFiles) },
|
||||
defaultVariantIndex = patch.defaultVariantIndex,
|
||||
advancedOptions = patch.advancedOptions.map { it.toSpec(resolve) },
|
||||
category = patch.category,
|
||||
pathLocked = patch.pathLocked,
|
||||
)
|
||||
}
|
||||
/** Asset filename of the bundled fallback manifest snapshot (a copy of the release manifest.json). */
|
||||
const val BUNDLED_MANIFEST_ASSET = "patches-manifest.json"
|
||||
|
||||
private fun PatchOption.toSpec(resolve: (Int) -> String): OptionSpec = when (this) {
|
||||
is PatchOption.Toggle -> OptionSpec.Toggle(
|
||||
key = key,
|
||||
title = resolve(titleRes),
|
||||
description = resolve(descRes),
|
||||
default = default,
|
||||
fileNames = fileNames,
|
||||
extensionFiles = extensionFiles,
|
||||
inline = inline,
|
||||
requiresVariant = requiresVariant,
|
||||
requiresOption = requiresOption,
|
||||
hidesVariants = hidesVariants,
|
||||
relabelVariants = relabelVariants.mapValues { resolve(it.value) },
|
||||
token = token,
|
||||
)
|
||||
|
||||
is PatchOption.Slider -> OptionSpec.Slider(
|
||||
key = key,
|
||||
title = resolve(titleRes),
|
||||
description = resolve(descRes),
|
||||
default = default,
|
||||
min = valueRange.start,
|
||||
max = valueRange.endInclusive,
|
||||
steps = steps,
|
||||
displayAsPercent = displayAsPercent,
|
||||
unit = unitRes?.let(resolve),
|
||||
token = token,
|
||||
encode = encode,
|
||||
)
|
||||
|
||||
is PatchOption.Choice -> OptionSpec.Choice(
|
||||
key = key,
|
||||
title = resolve(titleRes),
|
||||
description = if (descRes != 0) resolve(descRes) else "",
|
||||
entries = entries.map { resolve(it.labelRes) },
|
||||
defaultIndex = defaultIndex,
|
||||
values = entries.map { it.value ?: "" },
|
||||
requiresOption = requiresOption,
|
||||
token = token,
|
||||
)
|
||||
|
||||
is PatchOption.Color -> OptionSpec.Color(
|
||||
key = key,
|
||||
title = resolve(titleRes),
|
||||
description = if (descRes != 0) resolve(descRes) else "",
|
||||
default = default,
|
||||
token = token,
|
||||
)
|
||||
// Fallback patch list (snapshot of the release manifest bundled in the app's assets)
|
||||
fun builtinPatchSpecs(context: Context, json: Json): List<PatchSpec> = try {
|
||||
context.assets.open(BUNDLED_MANIFEST_ASSET).use { it.readBytes() }
|
||||
.let { json.decodeFromString(PatchManifest.serializer(), it.decodeToString()) }
|
||||
.patches
|
||||
.sortedBy { it.order }
|
||||
} catch (t: Throwable) {
|
||||
emptyList()
|
||||
}
|
||||
|
||||
@Immutable
|
||||
|
||||
@@ -5,6 +5,8 @@ import android.app.Activity
|
||||
import android.content.*
|
||||
import android.content.pm.PackageManager
|
||||
import android.content.res.Resources
|
||||
import android.net.ConnectivityManager
|
||||
import android.net.NetworkCapabilities
|
||||
import android.net.Uri
|
||||
import android.os.*
|
||||
import android.provider.Settings
|
||||
@@ -63,6 +65,15 @@ fun Context.getPackageVersion(pkg: String): Pair<String?, Int> {
|
||||
.let { it.versionName to it.versionCode }
|
||||
}
|
||||
|
||||
// Whether the device currently has a validated internet connection
|
||||
fun Context.isOnline(): Boolean {
|
||||
val cm = getSystemService<ConnectivityManager>() ?: return true
|
||||
val network = cm.activeNetwork ?: return false
|
||||
val caps = cm.getNetworkCapabilities(network) ?: return false
|
||||
return caps.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) &&
|
||||
caps.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED)
|
||||
}
|
||||
|
||||
fun Context.isPackageInstalled(packageName: String): Boolean {
|
||||
return try {
|
||||
packageManager.getPackageInfo(packageName, 0)
|
||||
|
||||
@@ -180,7 +180,7 @@
|
||||
<string name="install_error_timeout">Installer timed out</string>
|
||||
|
||||
<string name="install_group_prepare">Prepare</string>
|
||||
<string name="install_group_download">Download dependencies</string>
|
||||
<string name="install_group_download">Download Batteries</string>
|
||||
<string name="install_group_patch">Patch APK</string>
|
||||
<string name="install_group_install">Install APK</string>
|
||||
|
||||
@@ -247,6 +247,8 @@
|
||||
<string name="patchopts_custom_tidal_apk_desc">Provide your own Stock TIDAL APK to patch instead of the version from Github.</string>
|
||||
<string name="patchopts_custom_patches_title">Custom Patches</string>
|
||||
<string name="patchopts_custom_patches_desc">Provide your own Patches Zip to use instead of the ones from Github.</string>
|
||||
<string name="patchopts_bypass_incompatible_title">Bypass Incompatible</string>
|
||||
<string name="patchopts_bypass_incompatible_desc">Force-allow path-gated patches. This can be VERY DANGEROUS!</string>
|
||||
<string name="patchopts_divider_basic">Basic</string>
|
||||
<string name="patchopts_divider_advanced">Advanced</string>
|
||||
<string name="patchopts_patches_title">Patches</string>
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
--- a/com/tidal/android/feature/appscaffold/ui/p.smali
|
||||
+++ b/com/tidal/android/feature/appscaffold/ui/p.smali
|
||||
@@ -51,6 +51,8 @@
|
||||
.line 10
|
||||
iput-object p4, p0, Lcom/tidal/android/feature/appscaffold/ui/p;->d:Ljava/lang/String;
|
||||
--- a/com/tidal/android/feature/appscaffold/ui/r.smali
|
||||
+++ b/com/tidal/android/feature/appscaffold/ui/r.smali
|
||||
@@ -48,6 +48,8 @@
|
||||
.line 5
|
||||
iput-object p4, p0, Lcom/tidal/android/feature/appscaffold/ui/r;->d:Ljava/lang/String;
|
||||
|
||||
+ invoke-static {p3, p4}, Lradiant/HomeBackdrop;->fromMiniPlayer(ILjava/lang/String;)V # capture cover state
|
||||
+
|
||||
.line 11
|
||||
.line 12
|
||||
iput-boolean p5, p0, Lcom/tidal/android/feature/appscaffold/ui/p;->e:Z
|
||||
.line 6
|
||||
iput-boolean p5, p0, Lcom/tidal/android/feature/appscaffold/ui/r;->e:Z
|
||||
|
||||
|
||||
+2
-2
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"tidalVersionCode": 9090,
|
||||
"tidalVersionCode": 10002,
|
||||
"tidalApkUrl": "https://github.com/meowarex/rl-mobile/releases/download/latest/tidal-stock.apk",
|
||||
"patchesVersion": "0.9.15"
|
||||
"patchesVersion": "0.10.0"
|
||||
}
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
.line 1
|
||||
iget-object v0, p0, Lcom/tidal/android/core/debug/DebugFeatureInteractorDefault;->a:Lcom/tidal/android/featureflags/l;
|
||||
|
||||
@@ -98,6 +101,14 @@
|
||||
@@ -99,6 +102,14 @@
|
||||
}
|
||||
.end annotation
|
||||
|
||||
@@ -23,9 +23,9 @@
|
||||
+ return-object v0 # short-circuit b()
|
||||
+
|
||||
.line 1
|
||||
sget-object v0, Lj50/a;->a:Ljava/lang/String;
|
||||
sget-object v0, Lp50/a;->a:Ljava/lang/String;
|
||||
|
||||
@@ -261,5 +272,8 @@
|
||||
@@ -261,6 +272,9 @@
|
||||
.method public final c()Z
|
||||
.locals 3
|
||||
|
||||
@@ -33,4 +33,5 @@
|
||||
+ return v0 # bypass debug flag
|
||||
+
|
||||
.line 1
|
||||
sget-object v0, Lj50/a;->a:Ljava/lang/String;
|
||||
sget-object v0, Lp50/a;->a:Ljava/lang/String;
|
||||
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
--- a/kg/e.smali
|
||||
+++ b/kg/e.smali
|
||||
@@ -26,8 +26,8 @@
|
||||
new-instance v0, Lkg/e;
|
||||
--- a/jg/d.smali
|
||||
+++ b/jg/d.smali
|
||||
@@ -27,7 +27,7 @@
|
||||
|
||||
.line 2
|
||||
.line 3
|
||||
|
||||
+8
-9
@@ -1,13 +1,12 @@
|
||||
.class public final Lcom/tidal/android/feature/appscaffold/ui/q$c;
|
||||
.super Lcom/tidal/android/feature/appscaffold/ui/q;
|
||||
.class public final Lcom/tidal/android/feature/appscaffold/ui/s$c;
|
||||
.super Lcom/tidal/android/feature/appscaffold/ui/s;
|
||||
.source "SourceFile"
|
||||
|
||||
# Synthetic mini-player event used by right swipe (previous/rewind).
|
||||
# TIDAL already exposes q$a for next in this path
|
||||
|
||||
# annotations
|
||||
.annotation system Ldalvik/annotation/EnclosingClass;
|
||||
value = Lcom/tidal/android/feature/appscaffold/ui/q;
|
||||
value = Lcom/tidal/android/feature/appscaffold/ui/s;
|
||||
.end annotation
|
||||
|
||||
.annotation system Ldalvik/annotation/InnerClass;
|
||||
@@ -17,18 +16,18 @@
|
||||
|
||||
|
||||
# static fields
|
||||
.field public static final a:Lcom/tidal/android/feature/appscaffold/ui/q$c;
|
||||
.field public static final a:Lcom/tidal/android/feature/appscaffold/ui/s$c;
|
||||
|
||||
|
||||
# direct methods
|
||||
.method static constructor <clinit>()V
|
||||
.locals 1
|
||||
|
||||
new-instance v0, Lcom/tidal/android/feature/appscaffold/ui/q$c;
|
||||
new-instance v0, Lcom/tidal/android/feature/appscaffold/ui/s$c;
|
||||
|
||||
invoke-direct {v0}, Lcom/tidal/android/feature/appscaffold/ui/q;-><init>()V
|
||||
invoke-direct {v0}, Lcom/tidal/android/feature/appscaffold/ui/s;-><init>()V
|
||||
|
||||
sput-object v0, Lcom/tidal/android/feature/appscaffold/ui/q$c;->a:Lcom/tidal/android/feature/appscaffold/ui/q$c;
|
||||
sput-object v0, Lcom/tidal/android/feature/appscaffold/ui/s$c;->a:Lcom/tidal/android/feature/appscaffold/ui/s$c;
|
||||
|
||||
return-void
|
||||
.end method
|
||||
@@ -45,7 +44,7 @@
|
||||
return v0
|
||||
|
||||
:cond_0
|
||||
instance-of p1, p1, Lcom/tidal/android/feature/appscaffold/ui/q$c;
|
||||
instance-of p1, p1, Lcom/tidal/android/feature/appscaffold/ui/s$c;
|
||||
|
||||
if-nez p1, :cond_1
|
||||
|
||||
@@ -273,9 +273,9 @@
|
||||
|
||||
sget v2, Lradiant/HomeBackdrop;->currentAlbumId:I
|
||||
|
||||
new-instance v3, Lcom/tidal/android/feature/playerscreen/ui/composables/n0;
|
||||
new-instance v3, Lcom/tidal/android/feature/playerscreen/ui/composables/o0;
|
||||
|
||||
invoke-direct {v3, v2, v1}, Lcom/tidal/android/feature/playerscreen/ui/composables/n0;-><init>(ILjava/lang/String;)V
|
||||
invoke-direct {v3, v2, v1}, Lcom/tidal/android/feature/playerscreen/ui/composables/o0;-><init>(ILjava/lang/String;)V
|
||||
|
||||
sget-object v4, Landroidx/compose/ui/Modifier;->Companion:Landroidx/compose/ui/Modifier$Companion;
|
||||
|
||||
@@ -331,7 +331,7 @@
|
||||
|
||||
const/16 v15, 0x48
|
||||
|
||||
invoke-static/range {v6 .. v15}, Lxd0/f;->a(Lyl0/l;Ljava/lang/String;Landroidx/compose/ui/Modifier;Landroidx/compose/ui/graphics/ColorFilter;Landroidx/compose/ui/layout/ContentScale;Ljava/lang/Object;Lyl0/a;Landroidx/compose/runtime/Composer;II)V
|
||||
invoke-static/range {v6 .. v15}, Lee0/e;->a(Lem0/l;Ljava/lang/String;Landroidx/compose/ui/Modifier;Landroidx/compose/ui/graphics/ColorFilter;Landroidx/compose/ui/layout/ContentScale;Ljava/lang/Object;Lem0/a;Landroidx/compose/runtime/Composer;II)V
|
||||
|
||||
sget-object v3, Landroidx/compose/ui/Modifier;->Companion:Landroidx/compose/ui/Modifier$Companion;
|
||||
|
||||
|
||||
@@ -0,0 +1,21 @@
|
||||
.class public final Lradiant/LyricsReinitGuard;
|
||||
.super Ljava/lang/Object;
|
||||
.source "LyricsReinitGuard.smali"
|
||||
|
||||
|
||||
# static fields
|
||||
|
||||
# stuff that makes lyrics view stays open.. i forgot what it actually does other than short circuit a call or some shit <3
|
||||
.field public static lastMediaId:I
|
||||
|
||||
|
||||
# direct methods
|
||||
.method static constructor <clinit>()V
|
||||
.locals 1
|
||||
|
||||
const/4 v0, -0x1
|
||||
|
||||
sput v0, Lradiant/LyricsReinitGuard;->lastMediaId:I
|
||||
|
||||
return-void
|
||||
.end method
|
||||
@@ -83,7 +83,7 @@
|
||||
|
||||
const/16 v7, 0x8
|
||||
|
||||
invoke-static/range {v0 .. v7}, Landroidx/compose/animation/SingleValueAnimationKt;->animateColorAsState-euL9pac(JLandroidx/compose/animation/core/AnimationSpec;Ljava/lang/String;Lyl0/l;Landroidx/compose/runtime/Composer;II)Landroidx/compose/runtime/State;
|
||||
invoke-static/range {v0 .. v7}, Landroidx/compose/animation/SingleValueAnimationKt;->animateColorAsState-euL9pac(JLandroidx/compose/animation/core/AnimationSpec;Ljava/lang/String;Lem0/l;Landroidx/compose/runtime/Composer;II)Landroidx/compose/runtime/State;
|
||||
|
||||
move-result-object v0
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
.class public final Lradiant/MiniPlayerGestures$FeedbackLayer;
|
||||
.super Ljava/lang/Object;
|
||||
.implements Lyl0/l;
|
||||
.implements Lem0/l;
|
||||
|
||||
|
||||
# annotations
|
||||
@@ -41,7 +41,7 @@
|
||||
|
||||
|
||||
# virtual methods
|
||||
.method public final invoke(Landroidx/compose/ui/graphics/GraphicsLayerScope;)Lkotlin/u;
|
||||
.method public final invoke(Landroidx/compose/ui/graphics/GraphicsLayerScope;)Lkotlin/v;
|
||||
.locals 1
|
||||
|
||||
sget-object v0, Lradiant/MiniPlayerGestures;->v:Landroidx/compose/runtime/MutableFloatState;
|
||||
@@ -52,7 +52,7 @@
|
||||
|
||||
invoke-interface {p1, v0}, Landroidx/compose/ui/graphics/GraphicsLayerScope;->setTranslationY(F)V
|
||||
|
||||
sget-object p1, Lkotlin/u;->a:Lkotlin/u;
|
||||
sget-object p1, Lkotlin/v;->a:Lkotlin/v;
|
||||
|
||||
return-object p1
|
||||
.end method
|
||||
@@ -62,7 +62,7 @@
|
||||
|
||||
check-cast p1, Landroidx/compose/ui/graphics/GraphicsLayerScope;
|
||||
|
||||
invoke-virtual {p0, p1}, Lradiant/MiniPlayerGestures$FeedbackLayer;->invoke(Landroidx/compose/ui/graphics/GraphicsLayerScope;)Lkotlin/u;
|
||||
invoke-virtual {p0, p1}, Lradiant/MiniPlayerGestures$FeedbackLayer;->invoke(Landroidx/compose/ui/graphics/GraphicsLayerScope;)Lkotlin/v;
|
||||
|
||||
move-result-object p1
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
.class public final Lradiant/MiniPlayerGestures$Gesture;
|
||||
.super Ljava/lang/Object;
|
||||
.implements Lyl0/l;
|
||||
.implements Lem0/l;
|
||||
|
||||
# annotations
|
||||
.annotation system Ldalvik/annotation/EnclosingClass;
|
||||
@@ -14,7 +14,7 @@
|
||||
|
||||
|
||||
# instance fields
|
||||
.field public final a:Lyl0/l;
|
||||
.field public final a:Lem0/l;
|
||||
|
||||
# Y at ACTION_DOWN
|
||||
.field public b:F
|
||||
@@ -43,12 +43,12 @@
|
||||
|
||||
|
||||
# direct methods
|
||||
.method public constructor <init>(Lyl0/l;Landroidx/compose/material3/SheetState;Z)V
|
||||
.method public constructor <init>(Lem0/l;Landroidx/compose/material3/SheetState;Z)V
|
||||
.locals 0
|
||||
|
||||
invoke-direct {p0}, Ljava/lang/Object;-><init>()V
|
||||
|
||||
iput-object p1, p0, Lradiant/MiniPlayerGestures$Gesture;->a:Lyl0/l;
|
||||
iput-object p1, p0, Lradiant/MiniPlayerGestures$Gesture;->a:Lem0/l;
|
||||
|
||||
iput-object p2, p0, Lradiant/MiniPlayerGestures$Gesture;->f:Landroidx/compose/material3/SheetState;
|
||||
|
||||
@@ -90,9 +90,9 @@
|
||||
|
||||
iget-object v0, p0, Lradiant/MiniPlayerGestures$Gesture;->f:Landroidx/compose/material3/SheetState;
|
||||
|
||||
iget-object v1, p0, Lradiant/MiniPlayerGestures$Gesture;->a:Lyl0/l;
|
||||
iget-object v1, p0, Lradiant/MiniPlayerGestures$Gesture;->a:Lem0/l;
|
||||
|
||||
invoke-static {v0, v1, p1}, Lradiant/MiniPlayerGestures;->finishDrag(Landroidx/compose/material3/SheetState;Lyl0/l;F)V
|
||||
invoke-static {v0, v1, p1}, Lradiant/MiniPlayerGestures;->finishDrag(Landroidx/compose/material3/SheetState;Lem0/l;F)V
|
||||
|
||||
return-void
|
||||
.end method
|
||||
@@ -100,11 +100,11 @@
|
||||
.method private openPlayer()V
|
||||
.locals 2
|
||||
|
||||
iget-object v0, p0, Lradiant/MiniPlayerGestures$Gesture;->a:Lyl0/l;
|
||||
iget-object v0, p0, Lradiant/MiniPlayerGestures$Gesture;->a:Lem0/l;
|
||||
|
||||
sget-object v1, Lcom/tidal/android/feature/appscaffold/ui/b$b;->a:Lcom/tidal/android/feature/appscaffold/ui/b$b;
|
||||
|
||||
invoke-interface {v0, v1}, Lyl0/l;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
|
||||
invoke-interface {v0, v1}, Lem0/l;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
|
||||
|
||||
return-void
|
||||
.end method
|
||||
@@ -174,7 +174,7 @@
|
||||
|
||||
# virtual methods
|
||||
# Listens for MotionEvents
|
||||
.method public final invoke(Landroid/view/MotionEvent;)Lkotlin/u;
|
||||
.method public final invoke(Landroid/view/MotionEvent;)Lkotlin/v;
|
||||
.locals 11
|
||||
|
||||
invoke-virtual {p1}, Landroid/view/MotionEvent;->getActionMasked()I
|
||||
@@ -467,9 +467,9 @@
|
||||
|
||||
move-result v0
|
||||
|
||||
iget-object v1, p0, Lradiant/MiniPlayerGestures$Gesture;->a:Lyl0/l;
|
||||
iget-object v1, p0, Lradiant/MiniPlayerGestures$Gesture;->a:Lem0/l;
|
||||
|
||||
invoke-static {v1, v0}, Lradiant/MiniPlayerGestures;->completeSimpleSwipe(Lyl0/l;F)Z
|
||||
invoke-static {v1, v0}, Lradiant/MiniPlayerGestures;->completeSimpleSwipe(Lem0/l;F)Z
|
||||
|
||||
invoke-static {}, Lradiant/MiniPlayerGestures;->animateSwipeFeedbackReset()V
|
||||
|
||||
@@ -489,9 +489,9 @@
|
||||
|
||||
iget-object v0, p0, Lradiant/MiniPlayerGestures$Gesture;->f:Landroidx/compose/material3/SheetState;
|
||||
|
||||
iget-object v1, p0, Lradiant/MiniPlayerGestures$Gesture;->a:Lyl0/l;
|
||||
iget-object v1, p0, Lradiant/MiniPlayerGestures$Gesture;->a:Lem0/l;
|
||||
|
||||
invoke-static {v0, v1}, Lradiant/MiniPlayerGestures;->cancelDrag(Landroidx/compose/material3/SheetState;Lyl0/l;)V
|
||||
invoke-static {v0, v1}, Lradiant/MiniPlayerGestures;->cancelDrag(Landroidx/compose/material3/SheetState;Lem0/l;)V
|
||||
|
||||
goto :cancel_reset
|
||||
|
||||
@@ -503,7 +503,7 @@
|
||||
|
||||
|
||||
:done
|
||||
sget-object p1, Lkotlin/u;->a:Lkotlin/u;
|
||||
sget-object p1, Lkotlin/v;->a:Lkotlin/v;
|
||||
|
||||
return-object p1
|
||||
.end method
|
||||
@@ -513,7 +513,7 @@
|
||||
|
||||
check-cast p1, Landroid/view/MotionEvent;
|
||||
|
||||
invoke-virtual {p0, p1}, Lradiant/MiniPlayerGestures$Gesture;->invoke(Landroid/view/MotionEvent;)Lkotlin/u;
|
||||
invoke-virtual {p0, p1}, Lradiant/MiniPlayerGestures$Gesture;->invoke(Landroid/view/MotionEvent;)Lkotlin/v;
|
||||
|
||||
move-result-object p1
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
.class public final Lradiant/MiniPlayerGestures$RootGesture;
|
||||
.super Ljava/lang/Object;
|
||||
.implements Lyl0/l;
|
||||
.implements Lem0/l;
|
||||
|
||||
|
||||
# annotations
|
||||
@@ -15,18 +15,18 @@
|
||||
|
||||
|
||||
# instance fields
|
||||
.field public final a:Lyl0/l;
|
||||
.field public final a:Lem0/l;
|
||||
|
||||
.field public final b:Landroidx/compose/material3/SheetState;
|
||||
|
||||
|
||||
# direct methods
|
||||
.method public constructor <init>(Lyl0/l;Landroidx/compose/material3/SheetState;)V
|
||||
.method public constructor <init>(Lem0/l;Landroidx/compose/material3/SheetState;)V
|
||||
.locals 0
|
||||
|
||||
invoke-direct {p0}, Ljava/lang/Object;-><init>()V
|
||||
|
||||
iput-object p1, p0, Lradiant/MiniPlayerGestures$RootGesture;->a:Lyl0/l;
|
||||
iput-object p1, p0, Lradiant/MiniPlayerGestures$RootGesture;->a:Lem0/l;
|
||||
|
||||
iput-object p2, p0, Lradiant/MiniPlayerGestures$RootGesture;->b:Landroidx/compose/material3/SheetState;
|
||||
|
||||
@@ -35,7 +35,7 @@
|
||||
|
||||
|
||||
# virtual methods
|
||||
.method public final invoke(Landroid/view/MotionEvent;)Lkotlin/u;
|
||||
.method public final invoke(Landroid/view/MotionEvent;)Lkotlin/v;
|
||||
.locals 6
|
||||
|
||||
iget-object v0, p0, Lradiant/MiniPlayerGestures$RootGesture;->b:Landroidx/compose/material3/SheetState;
|
||||
@@ -100,9 +100,9 @@
|
||||
|
||||
move-result v1
|
||||
|
||||
iget-object v2, p0, Lradiant/MiniPlayerGestures$RootGesture;->a:Lyl0/l;
|
||||
iget-object v2, p0, Lradiant/MiniPlayerGestures$RootGesture;->a:Lem0/l;
|
||||
|
||||
invoke-static {v2, v1}, Lradiant/MiniPlayerGestures;->completeSimpleSwipe(Lyl0/l;F)Z
|
||||
invoke-static {v2, v1}, Lradiant/MiniPlayerGestures;->completeSimpleSwipe(Lem0/l;F)Z
|
||||
|
||||
invoke-static {}, Lradiant/MiniPlayerGestures;->animateSwipeFeedbackReset()V
|
||||
|
||||
@@ -143,9 +143,9 @@
|
||||
|
||||
move-result v1
|
||||
|
||||
iget-object v2, p0, Lradiant/MiniPlayerGestures$RootGesture;->a:Lyl0/l;
|
||||
iget-object v2, p0, Lradiant/MiniPlayerGestures$RootGesture;->a:Lem0/l;
|
||||
|
||||
invoke-static {v0, v2, v1}, Lradiant/MiniPlayerGestures;->finishDrag(Landroidx/compose/material3/SheetState;Lyl0/l;F)V
|
||||
invoke-static {v0, v2, v1}, Lradiant/MiniPlayerGestures;->finishDrag(Landroidx/compose/material3/SheetState;Lem0/l;F)V
|
||||
|
||||
invoke-static {}, Lradiant/MiniPlayerGestures;->animateSwipeFeedbackReset()V
|
||||
|
||||
@@ -153,14 +153,14 @@
|
||||
|
||||
# ACTION_CANCEL
|
||||
:cancel
|
||||
iget-object v2, p0, Lradiant/MiniPlayerGestures$RootGesture;->a:Lyl0/l;
|
||||
iget-object v2, p0, Lradiant/MiniPlayerGestures$RootGesture;->a:Lem0/l;
|
||||
|
||||
invoke-static {v0, v2}, Lradiant/MiniPlayerGestures;->cancelDrag(Landroidx/compose/material3/SheetState;Lyl0/l;)V
|
||||
invoke-static {v0, v2}, Lradiant/MiniPlayerGestures;->cancelDrag(Landroidx/compose/material3/SheetState;Lem0/l;)V
|
||||
|
||||
invoke-static {}, Lradiant/MiniPlayerGestures;->animateSwipeFeedbackReset()V
|
||||
|
||||
:done
|
||||
sget-object p1, Lkotlin/u;->a:Lkotlin/u;
|
||||
sget-object p1, Lkotlin/v;->a:Lkotlin/v;
|
||||
|
||||
return-object p1
|
||||
.end method
|
||||
@@ -170,7 +170,7 @@
|
||||
|
||||
check-cast p1, Landroid/view/MotionEvent;
|
||||
|
||||
invoke-virtual {p0, p1}, Lradiant/MiniPlayerGestures$RootGesture;->invoke(Landroid/view/MotionEvent;)Lkotlin/u;
|
||||
invoke-virtual {p0, p1}, Lradiant/MiniPlayerGestures$RootGesture;->invoke(Landroid/view/MotionEvent;)Lkotlin/v;
|
||||
|
||||
move-result-object p1
|
||||
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
.field private static g:Landroidx/compose/material3/SheetState;
|
||||
|
||||
# Material3 settle lambda
|
||||
.field private static h:Lyl0/l;
|
||||
.field private static h:Lem0/l;
|
||||
|
||||
# Latest MotionEvent eventTime for drag updates
|
||||
.field private static i:J
|
||||
@@ -51,7 +51,7 @@
|
||||
.field private static r:Z
|
||||
|
||||
# AppScaffold context
|
||||
.field private static s:Lyl0/l;
|
||||
.field private static s:Lem0/l;
|
||||
|
||||
.field private static t:Landroidx/compose/material3/SheetState;
|
||||
|
||||
@@ -321,7 +321,7 @@
|
||||
|
||||
sput-object v0, Lradiant/MiniPlayerGestures;->g:Landroidx/compose/material3/SheetState;
|
||||
|
||||
sput-object v0, Lradiant/MiniPlayerGestures;->h:Lyl0/l;
|
||||
sput-object v0, Lradiant/MiniPlayerGestures;->h:Lem0/l;
|
||||
|
||||
sput v0, Lradiant/MiniPlayerGestures;->d:F
|
||||
|
||||
@@ -437,7 +437,7 @@
|
||||
return-void
|
||||
.end method
|
||||
|
||||
.method public static cancelDrag(Landroidx/compose/material3/SheetState;Lyl0/l;)V
|
||||
.method public static cancelDrag(Landroidx/compose/material3/SheetState;Lem0/l;)V
|
||||
.locals 1
|
||||
|
||||
invoke-static {p0}, Lradiant/MiniPlayerGestures;->isDragging(Landroidx/compose/material3/SheetState;)Z
|
||||
@@ -450,13 +450,13 @@
|
||||
|
||||
sget-object p0, Lcom/tidal/android/feature/appscaffold/ui/b$a;->a:Lcom/tidal/android/feature/appscaffold/ui/b$a;
|
||||
|
||||
invoke-interface {p1, p0}, Lyl0/l;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
|
||||
invoke-interface {p1, p0}, Lem0/l;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
|
||||
|
||||
:done
|
||||
return-void
|
||||
.end method
|
||||
|
||||
.method public static finishDrag(Landroidx/compose/material3/SheetState;Lyl0/l;F)V
|
||||
.method public static finishDrag(Landroidx/compose/material3/SheetState;Lem0/l;F)V
|
||||
.locals 6
|
||||
|
||||
invoke-static {p0}, Lradiant/MiniPlayerGestures;->isDragging(Landroidx/compose/material3/SheetState;)Z
|
||||
@@ -469,7 +469,7 @@
|
||||
|
||||
if-ne v0, p0, :fallback_snap
|
||||
|
||||
sget-object v0, Lradiant/MiniPlayerGestures;->h:Lyl0/l;
|
||||
sget-object v0, Lradiant/MiniPlayerGestures;->h:Lem0/l;
|
||||
|
||||
if-eqz v0, :fallback_snap
|
||||
|
||||
@@ -485,7 +485,7 @@
|
||||
|
||||
move-result-object p0
|
||||
|
||||
invoke-interface {v0, p0}, Lyl0/l;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
|
||||
invoke-interface {v0, p0}, Lem0/l;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
|
||||
|
||||
goto/16 :done
|
||||
|
||||
@@ -589,7 +589,7 @@
|
||||
|
||||
sget-object p0, Lcom/tidal/android/feature/appscaffold/ui/b$a;->a:Lcom/tidal/android/feature/appscaffold/ui/b$a;
|
||||
|
||||
invoke-interface {p1, p0}, Lyl0/l;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
|
||||
invoke-interface {p1, p0}, Lem0/l;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
|
||||
|
||||
:done
|
||||
return-void
|
||||
@@ -748,10 +748,10 @@
|
||||
return-void
|
||||
.end method
|
||||
|
||||
.method public static configure(Lyl0/l;Landroidx/compose/material3/SheetState;Z)V
|
||||
.method public static configure(Lem0/l;Landroidx/compose/material3/SheetState;Z)V
|
||||
.locals 0
|
||||
|
||||
sput-object p0, Lradiant/MiniPlayerGestures;->s:Lyl0/l;
|
||||
sput-object p0, Lradiant/MiniPlayerGestures;->s:Lem0/l;
|
||||
|
||||
sput-object p1, Lradiant/MiniPlayerGestures;->t:Landroidx/compose/material3/SheetState;
|
||||
|
||||
@@ -798,7 +798,7 @@
|
||||
|
||||
sget-object v0, Lradiant/MiniPlayerGestures$FeedbackLayer;->INSTANCE:Lradiant/MiniPlayerGestures$FeedbackLayer;
|
||||
|
||||
invoke-static {p0, v0}, Landroidx/compose/ui/graphics/GraphicsLayerModifierKt;->graphicsLayer(Landroidx/compose/ui/Modifier;Lyl0/l;)Landroidx/compose/ui/Modifier;
|
||||
invoke-static {p0, v0}, Landroidx/compose/ui/graphics/GraphicsLayerModifierKt;->graphicsLayer(Landroidx/compose/ui/Modifier;Lem0/l;)Landroidx/compose/ui/Modifier;
|
||||
|
||||
move-result-object p0
|
||||
|
||||
@@ -848,14 +848,14 @@
|
||||
return p0
|
||||
.end method
|
||||
|
||||
.method public static modifier(Landroidx/compose/ui/Modifier;Lyl0/l;Landroidx/compose/material3/SheetState;Z)Landroidx/compose/ui/Modifier;
|
||||
.method public static modifier(Landroidx/compose/ui/Modifier;Lem0/l;Landroidx/compose/material3/SheetState;Z)Landroidx/compose/ui/Modifier;
|
||||
.locals 1
|
||||
|
||||
new-instance v0, Lradiant/MiniPlayerGestures$Gesture;
|
||||
|
||||
invoke-direct {v0, p1, p2, p3}, Lradiant/MiniPlayerGestures$Gesture;-><init>(Lyl0/l;Landroidx/compose/material3/SheetState;Z)V
|
||||
invoke-direct {v0, p1, p2, p3}, Lradiant/MiniPlayerGestures$Gesture;-><init>(Lem0/l;Landroidx/compose/material3/SheetState;Z)V
|
||||
|
||||
invoke-static {p0, v0}, Landroidx/compose/ui/input/pointer/PointerInteropFilter_androidKt;->motionEventSpy(Landroidx/compose/ui/Modifier;Lyl0/l;)Landroidx/compose/ui/Modifier;
|
||||
invoke-static {p0, v0}, Landroidx/compose/ui/input/pointer/PointerInteropFilter_androidKt;->motionEventSpy(Landroidx/compose/ui/Modifier;Lem0/l;)Landroidx/compose/ui/Modifier;
|
||||
|
||||
move-result-object p0
|
||||
|
||||
@@ -865,7 +865,7 @@
|
||||
.method public static trackAreaModifier(Landroidx/compose/ui/Modifier;)Landroidx/compose/ui/Modifier;
|
||||
.locals 3
|
||||
|
||||
sget-object v0, Lradiant/MiniPlayerGestures;->s:Lyl0/l;
|
||||
sget-object v0, Lradiant/MiniPlayerGestures;->s:Lem0/l;
|
||||
|
||||
if-eqz v0, :done
|
||||
|
||||
@@ -875,7 +875,7 @@
|
||||
|
||||
sget-boolean v2, Lradiant/MiniPlayerGestures;->u:Z
|
||||
|
||||
invoke-static {p0, v0, v1, v2}, Lradiant/MiniPlayerGestures;->modifier(Landroidx/compose/ui/Modifier;Lyl0/l;Landroidx/compose/material3/SheetState;Z)Landroidx/compose/ui/Modifier;
|
||||
invoke-static {p0, v0, v1, v2}, Lradiant/MiniPlayerGestures;->modifier(Landroidx/compose/ui/Modifier;Lem0/l;Landroidx/compose/material3/SheetState;Z)Landroidx/compose/ui/Modifier;
|
||||
|
||||
move-result-object p0
|
||||
|
||||
@@ -988,7 +988,7 @@
|
||||
return-void
|
||||
.end method
|
||||
|
||||
.method public static completeSimpleSwipe(Lyl0/l;F)Z
|
||||
.method public static completeSimpleSwipe(Lem0/l;F)Z
|
||||
.locals 4
|
||||
|
||||
sget-boolean v0, Lradiant/MiniPlayerGestures;->u:Z
|
||||
@@ -1035,7 +1035,7 @@
|
||||
|
||||
sget-object v0, Lcom/tidal/android/feature/appscaffold/ui/b$b;->a:Lcom/tidal/android/feature/appscaffold/ui/b$b;
|
||||
|
||||
invoke-interface {p0, v0}, Lyl0/l;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
|
||||
invoke-interface {p0, v0}, Lem0/l;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
|
||||
|
||||
const/4 v0, 0x1
|
||||
|
||||
@@ -1307,26 +1307,26 @@
|
||||
return p0
|
||||
.end method
|
||||
|
||||
.method public static rootModifier(Landroidx/compose/ui/Modifier;Lyl0/l;Landroidx/compose/material3/SheetState;)Landroidx/compose/ui/Modifier;
|
||||
.method public static rootModifier(Landroidx/compose/ui/Modifier;Lem0/l;Landroidx/compose/material3/SheetState;)Landroidx/compose/ui/Modifier;
|
||||
.locals 1
|
||||
|
||||
new-instance v0, Lradiant/MiniPlayerGestures$RootGesture;
|
||||
|
||||
invoke-direct {v0, p1, p2}, Lradiant/MiniPlayerGestures$RootGesture;-><init>(Lyl0/l;Landroidx/compose/material3/SheetState;)V
|
||||
invoke-direct {v0, p1, p2}, Lradiant/MiniPlayerGestures$RootGesture;-><init>(Lem0/l;Landroidx/compose/material3/SheetState;)V
|
||||
|
||||
invoke-static {p0, v0}, Landroidx/compose/ui/input/pointer/PointerInteropFilter_androidKt;->motionEventSpy(Landroidx/compose/ui/Modifier;Lyl0/l;)Landroidx/compose/ui/Modifier;
|
||||
invoke-static {p0, v0}, Landroidx/compose/ui/input/pointer/PointerInteropFilter_androidKt;->motionEventSpy(Landroidx/compose/ui/Modifier;Lem0/l;)Landroidx/compose/ui/Modifier;
|
||||
|
||||
move-result-object p0
|
||||
|
||||
return-object p0
|
||||
.end method
|
||||
|
||||
.method public static setSettleCallback(Landroidx/compose/material3/SheetState;Lyl0/l;)V
|
||||
.method public static setSettleCallback(Landroidx/compose/material3/SheetState;Lem0/l;)V
|
||||
.locals 0
|
||||
|
||||
sput-object p0, Lradiant/MiniPlayerGestures;->g:Landroidx/compose/material3/SheetState;
|
||||
|
||||
sput-object p1, Lradiant/MiniPlayerGestures;->h:Lyl0/l;
|
||||
sput-object p1, Lradiant/MiniPlayerGestures;->h:Lem0/l;
|
||||
|
||||
return-void
|
||||
.end method
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
.class public final Lradiant/MiniPlayerTrackGestures$Gesture;
|
||||
.super Ljava/lang/Object;
|
||||
.implements Lyl0/l;
|
||||
.implements Lem0/l;
|
||||
|
||||
|
||||
# annotations
|
||||
@@ -15,16 +15,16 @@
|
||||
|
||||
|
||||
# instance fields
|
||||
.field public final a:Lyl0/l;
|
||||
.field public final a:Lem0/l;
|
||||
|
||||
|
||||
# direct methods
|
||||
.method public constructor <init>(Lyl0/l;)V
|
||||
.method public constructor <init>(Lem0/l;)V
|
||||
.locals 0
|
||||
|
||||
invoke-direct {p0}, Ljava/lang/Object;-><init>()V
|
||||
|
||||
iput-object p1, p0, Lradiant/MiniPlayerTrackGestures$Gesture;->a:Lyl0/l;
|
||||
iput-object p1, p0, Lradiant/MiniPlayerTrackGestures$Gesture;->a:Lem0/l;
|
||||
|
||||
return-void
|
||||
.end method
|
||||
@@ -32,11 +32,11 @@
|
||||
.method private nextTrack()V
|
||||
.locals 2
|
||||
|
||||
iget-object v0, p0, Lradiant/MiniPlayerTrackGestures$Gesture;->a:Lyl0/l;
|
||||
iget-object v0, p0, Lradiant/MiniPlayerTrackGestures$Gesture;->a:Lem0/l;
|
||||
|
||||
sget-object v1, Lcom/tidal/android/feature/appscaffold/ui/q$a;->a:Lcom/tidal/android/feature/appscaffold/ui/q$a; # Tidal's built-in next track mini-player event
|
||||
sget-object v1, Lcom/tidal/android/feature/appscaffold/ui/s$a;->a:Lcom/tidal/android/feature/appscaffold/ui/s$a; # Tidal's built-in next track mini-player event
|
||||
|
||||
invoke-interface {v0, v1}, Lyl0/l;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
|
||||
invoke-interface {v0, v1}, Lem0/l;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
|
||||
|
||||
return-void
|
||||
.end method
|
||||
@@ -44,18 +44,18 @@
|
||||
.method private previousTrack()V
|
||||
.locals 2
|
||||
|
||||
iget-object v0, p0, Lradiant/MiniPlayerTrackGestures$Gesture;->a:Lyl0/l;
|
||||
iget-object v0, p0, Lradiant/MiniPlayerTrackGestures$Gesture;->a:Lem0/l;
|
||||
|
||||
sget-object v1, Lcom/tidal/android/feature/appscaffold/ui/q$c;->a:Lcom/tidal/android/feature/appscaffold/ui/q$c; # Our synthetic previous track event
|
||||
sget-object v1, Lcom/tidal/android/feature/appscaffold/ui/s$c;->a:Lcom/tidal/android/feature/appscaffold/ui/s$c; # Our synthetic previous track event
|
||||
|
||||
invoke-interface {v0, v1}, Lyl0/l;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
|
||||
invoke-interface {v0, v1}, Lem0/l;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
|
||||
|
||||
return-void
|
||||
.end method
|
||||
|
||||
|
||||
# virtual methods
|
||||
.method public final invoke(Landroid/view/MotionEvent;)Lkotlin/u;
|
||||
.method public final invoke(Landroid/view/MotionEvent;)Lkotlin/v;
|
||||
.locals 3
|
||||
|
||||
invoke-virtual {p1}, Landroid/view/MotionEvent;->getActionMasked()I
|
||||
@@ -132,7 +132,7 @@
|
||||
invoke-static {}, Lradiant/MiniPlayerTrackGestures;->cancelDrag()V
|
||||
|
||||
:done
|
||||
sget-object p1, Lkotlin/u;->a:Lkotlin/u;
|
||||
sget-object p1, Lkotlin/v;->a:Lkotlin/v;
|
||||
|
||||
return-object p1
|
||||
.end method
|
||||
@@ -142,7 +142,7 @@
|
||||
|
||||
check-cast p1, Landroid/view/MotionEvent;
|
||||
|
||||
invoke-virtual {p0, p1}, Lradiant/MiniPlayerTrackGestures$Gesture;->invoke(Landroid/view/MotionEvent;)Lkotlin/u;
|
||||
invoke-virtual {p0, p1}, Lradiant/MiniPlayerTrackGestures$Gesture;->invoke(Landroid/view/MotionEvent;)Lkotlin/v;
|
||||
|
||||
move-result-object p1
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
.class public final Lradiant/MiniPlayerTrackGestures$OffsetLayer;
|
||||
.super Ljava/lang/Object;
|
||||
.implements Lyl0/l;
|
||||
.implements Lem0/l;
|
||||
|
||||
|
||||
# annotations
|
||||
@@ -41,7 +41,7 @@
|
||||
|
||||
|
||||
# virtual methods
|
||||
.method public final invoke(Landroidx/compose/ui/graphics/GraphicsLayerScope;)Lkotlin/u;
|
||||
.method public final invoke(Landroidx/compose/ui/graphics/GraphicsLayerScope;)Lkotlin/v;
|
||||
.locals 1
|
||||
|
||||
sget-object v0, Lradiant/MiniPlayerTrackGestures;->b:Landroidx/compose/runtime/MutableFloatState;
|
||||
@@ -52,7 +52,7 @@
|
||||
|
||||
invoke-interface {p1, v0}, Landroidx/compose/ui/graphics/GraphicsLayerScope;->setTranslationX(F)V
|
||||
|
||||
sget-object p1, Lkotlin/u;->a:Lkotlin/u;
|
||||
sget-object p1, Lkotlin/v;->a:Lkotlin/v;
|
||||
|
||||
return-object p1
|
||||
.end method
|
||||
@@ -62,7 +62,7 @@
|
||||
|
||||
check-cast p1, Landroidx/compose/ui/graphics/GraphicsLayerScope;
|
||||
|
||||
invoke-virtual {p0, p1}, Lradiant/MiniPlayerTrackGestures$OffsetLayer;->invoke(Landroidx/compose/ui/graphics/GraphicsLayerScope;)Lkotlin/u;
|
||||
invoke-virtual {p0, p1}, Lradiant/MiniPlayerTrackGestures$OffsetLayer;->invoke(Landroidx/compose/ui/graphics/GraphicsLayerScope;)Lkotlin/v;
|
||||
|
||||
move-result-object p1
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
.class public final Lradiant/MiniPlayerTrackGestures$TextDraw;
|
||||
.super Ljava/lang/Object;
|
||||
.implements Lyl0/l;
|
||||
.implements Lem0/l;
|
||||
|
||||
|
||||
# annotations
|
||||
@@ -41,7 +41,7 @@
|
||||
|
||||
|
||||
# virtual methods
|
||||
.method public final invoke(Landroidx/compose/ui/graphics/drawscope/ContentDrawScope;)Lkotlin/u;
|
||||
.method public final invoke(Landroidx/compose/ui/graphics/drawscope/ContentDrawScope;)Lkotlin/v;
|
||||
.locals 12
|
||||
|
||||
sget-object v0, Lradiant/MiniPlayerTrackGestures;->b:Landroidx/compose/runtime/MutableFloatState;
|
||||
@@ -101,16 +101,28 @@
|
||||
:try_end_0
|
||||
.catchall {:try_start_0 .. :try_end_0} :catchall_0
|
||||
|
||||
invoke-static {v7, v8, v9}, Landroidx/compose/animation/i;->b(Landroidx/compose/ui/graphics/drawscope/DrawContext;J)V
|
||||
invoke-interface {v7}, Landroidx/compose/ui/graphics/drawscope/DrawContext;->getCanvas()Landroidx/compose/ui/graphics/Canvas;
|
||||
|
||||
sget-object p1, Lkotlin/u;->a:Lkotlin/u;
|
||||
move-result-object v0
|
||||
|
||||
invoke-interface {v0}, Landroidx/compose/ui/graphics/Canvas;->restore()V
|
||||
|
||||
invoke-interface {v7, v8, v9}, Landroidx/compose/ui/graphics/drawscope/DrawContext;->setSize-uvyYCjk(J)V
|
||||
|
||||
sget-object p1, Lkotlin/v;->a:Lkotlin/v;
|
||||
|
||||
return-object p1
|
||||
|
||||
:catchall_0
|
||||
move-exception v0
|
||||
|
||||
invoke-static {v7, v8, v9}, Landroidx/compose/animation/i;->b(Landroidx/compose/ui/graphics/drawscope/DrawContext;J)V
|
||||
invoke-interface {v7}, Landroidx/compose/ui/graphics/drawscope/DrawContext;->getCanvas()Landroidx/compose/ui/graphics/Canvas;
|
||||
|
||||
move-result-object v1
|
||||
|
||||
invoke-interface {v1}, Landroidx/compose/ui/graphics/Canvas;->restore()V
|
||||
|
||||
invoke-interface {v7, v8, v9}, Landroidx/compose/ui/graphics/drawscope/DrawContext;->setSize-uvyYCjk(J)V
|
||||
|
||||
throw v0
|
||||
.end method
|
||||
@@ -120,7 +132,7 @@
|
||||
|
||||
check-cast p1, Landroidx/compose/ui/graphics/drawscope/ContentDrawScope;
|
||||
|
||||
invoke-virtual {p0, p1}, Lradiant/MiniPlayerTrackGestures$TextDraw;->invoke(Landroidx/compose/ui/graphics/drawscope/ContentDrawScope;)Lkotlin/u;
|
||||
invoke-virtual {p0, p1}, Lradiant/MiniPlayerTrackGestures$TextDraw;->invoke(Landroidx/compose/ui/graphics/drawscope/ContentDrawScope;)Lkotlin/v;
|
||||
|
||||
move-result-object p1
|
||||
|
||||
|
||||
@@ -419,7 +419,7 @@
|
||||
|
||||
sget-object v0, Lradiant/MiniPlayerTrackGestures$OffsetLayer;->INSTANCE:Lradiant/MiniPlayerTrackGestures$OffsetLayer;
|
||||
|
||||
invoke-static {p0, v0}, Landroidx/compose/ui/graphics/GraphicsLayerModifierKt;->graphicsLayer(Landroidx/compose/ui/Modifier;Lyl0/l;)Landroidx/compose/ui/Modifier;
|
||||
invoke-static {p0, v0}, Landroidx/compose/ui/graphics/GraphicsLayerModifierKt;->graphicsLayer(Landroidx/compose/ui/Modifier;Lem0/l;)Landroidx/compose/ui/Modifier;
|
||||
|
||||
move-result-object p0
|
||||
|
||||
@@ -431,7 +431,7 @@
|
||||
|
||||
sget-object v0, Lradiant/MiniPlayerTrackGestures$TextDraw;->INSTANCE:Lradiant/MiniPlayerTrackGestures$TextDraw; # text clip on right only
|
||||
|
||||
invoke-static {p0, v0}, Landroidx/compose/ui/draw/DrawModifierKt;->drawWithContent(Landroidx/compose/ui/Modifier;Lyl0/l;)Landroidx/compose/ui/Modifier;
|
||||
invoke-static {p0, v0}, Landroidx/compose/ui/draw/DrawModifierKt;->drawWithContent(Landroidx/compose/ui/Modifier;Lem0/l;)Landroidx/compose/ui/Modifier;
|
||||
|
||||
move-result-object p0
|
||||
|
||||
@@ -590,14 +590,14 @@
|
||||
return-void
|
||||
.end method
|
||||
|
||||
.method public static trackModifier(Landroidx/compose/ui/Modifier;Lyl0/l;)Landroidx/compose/ui/Modifier;
|
||||
.method public static trackModifier(Landroidx/compose/ui/Modifier;Lem0/l;)Landroidx/compose/ui/Modifier;
|
||||
.locals 1
|
||||
|
||||
new-instance v0, Lradiant/MiniPlayerTrackGestures$Gesture;
|
||||
|
||||
invoke-direct {v0, p1}, Lradiant/MiniPlayerTrackGestures$Gesture;-><init>(Lyl0/l;)V
|
||||
invoke-direct {v0, p1}, Lradiant/MiniPlayerTrackGestures$Gesture;-><init>(Lem0/l;)V
|
||||
|
||||
invoke-static {p0, v0}, Landroidx/compose/ui/input/pointer/PointerInteropFilter_androidKt;->motionEventSpy(Landroidx/compose/ui/Modifier;Lyl0/l;)Landroidx/compose/ui/Modifier;
|
||||
invoke-static {p0, v0}, Landroidx/compose/ui/input/pointer/PointerInteropFilter_androidKt;->motionEventSpy(Landroidx/compose/ui/Modifier;Lem0/l;)Landroidx/compose/ui/Modifier;
|
||||
|
||||
move-result-object p0
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
.class public final Lradiant/MiniSeekerFloating;
|
||||
.super Ljava/lang/Object;
|
||||
|
||||
.implements Lyl0/l;
|
||||
.implements Lem0/l;
|
||||
|
||||
|
||||
# static fields
|
||||
@@ -46,7 +46,7 @@
|
||||
.catch Ljava/lang/Throwable; {:try_start .. :try_end} :swallow
|
||||
|
||||
:swallow
|
||||
sget-object v0, Lkotlin/u;->a:Lkotlin/u; # Unit
|
||||
sget-object v0, Lkotlin/v;->a:Lkotlin/v; # Unit
|
||||
|
||||
return-object v0
|
||||
.end method
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
# static fields
|
||||
.field public static progressState:Landroidx/compose/runtime/MutableFloatState;
|
||||
|
||||
.field public static volatile vm:Ljh/h;
|
||||
.field public static volatile vm:Lih/g;
|
||||
|
||||
.field public static volatile sub:Lio/reactivex/disposables/Disposable;
|
||||
|
||||
@@ -57,7 +57,7 @@
|
||||
|
||||
:start_block
|
||||
:try_start
|
||||
sget-object v0, Lradiant/MiniSeekerLine;->vm:Ljh/h; # cached vm
|
||||
sget-object v0, Lradiant/MiniSeekerLine;->vm:Lih/g; # cached vm
|
||||
|
||||
if-nez v0, :got_vm # reuse if present
|
||||
|
||||
@@ -65,32 +65,32 @@
|
||||
|
||||
move-result-object v0 # app
|
||||
|
||||
invoke-virtual {v0}, Lcom/aspiro/wamp/App;->e()Lf5/c; # dagger component
|
||||
invoke-virtual {v0}, Lcom/aspiro/wamp/App;->e()Le5/c; # dagger component
|
||||
|
||||
move-result-object v0 # component
|
||||
|
||||
check-cast v0, Lf5/d0$n2; # narrow type
|
||||
check-cast v0, Le5/u$n2; # narrow type
|
||||
|
||||
iget-object v0, v0, Lf5/d0$n2;->z0:Ldagger/internal/j; # playqueue provider
|
||||
iget-object v0, v0, Le5/u$n2;->z0:Ldagger/internal/j; # playqueue provider
|
||||
|
||||
invoke-interface {v0}, Lol0/a;->get()Ljava/lang/Object; # resolve
|
||||
invoke-interface {v0}, Lul0/a;->get()Ljava/lang/Object; # resolve
|
||||
|
||||
move-result-object v0 # playqueue
|
||||
|
||||
check-cast v0, Lcom/aspiro/wamp/playqueue/z0; # narrow type
|
||||
check-cast v0, Lcom/aspiro/wamp/playqueue/y0; # narrow type
|
||||
|
||||
new-instance v1, Ljh/h; # build vm
|
||||
new-instance v1, Lih/g; # build vm
|
||||
|
||||
invoke-direct {v1, v0}, Ljh/h;-><init>(Lcom/aspiro/wamp/playqueue/z0;)V # ctor
|
||||
invoke-direct {v1, v0}, Lih/g;-><init>(Lcom/aspiro/wamp/playqueue/y0;)V # ctor
|
||||
|
||||
sput-object v1, Lradiant/MiniSeekerLine;->vm:Ljh/h; # cache
|
||||
sput-object v1, Lradiant/MiniSeekerLine;->vm:Lih/g; # cache
|
||||
|
||||
:got_vm
|
||||
sget-object v0, Lradiant/MiniSeekerLine;->vm:Ljh/h; # vm ref
|
||||
sget-object v0, Lradiant/MiniSeekerLine;->vm:Lih/g; # vm ref
|
||||
|
||||
invoke-virtual {v0}, Ljh/h;->a()V # activate emission
|
||||
invoke-virtual {v0}, Lih/g;->a()V # activate emission
|
||||
|
||||
iget-object v0, v0, Ljh/h;->d:Lio/reactivex/subjects/BehaviorSubject; # position subject
|
||||
iget-object v0, v0, Lih/g;->d:Lio/reactivex/subjects/BehaviorSubject; # position subject
|
||||
|
||||
invoke-static {}, Lio/reactivex/android/schedulers/AndroidSchedulers;->mainThread()Lio/reactivex/Scheduler; # main scheduler
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
.class public final Lradiant/NoOp;
|
||||
.super Ljava/lang/Object;
|
||||
.implements Lyl0/a;
|
||||
.implements Lem0/a;
|
||||
|
||||
|
||||
# static fields
|
||||
@@ -33,7 +33,7 @@
|
||||
.method public final invoke()Ljava/lang/Object;
|
||||
.locals 1
|
||||
|
||||
sget-object v0, Lkotlin/u;->a:Lkotlin/u;
|
||||
sget-object v0, Lkotlin/v;->a:Lkotlin/v;
|
||||
|
||||
return-object v0
|
||||
.end method
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
.class public final Lradiant/PlayingFrom;
|
||||
.super Ljava/lang/Object;
|
||||
.source "PlayingFrom.smali"
|
||||
|
||||
|
||||
# static fields
|
||||
|
||||
# puts the "Playing from" source above track title
|
||||
.field public static a:Ljava/lang/String;
|
||||
@@ -85,15 +85,15 @@
|
||||
return-object p0
|
||||
.end method
|
||||
|
||||
.method public static style(ILn20/e2;)Ln20/e2;
|
||||
.method public static style(ILr20/c2;)Lr20/c2;
|
||||
.registers 16
|
||||
|
||||
invoke-static {p0}, Lradiant/QualityBadge;->textArgb(I)I
|
||||
|
||||
move-result v0
|
||||
new-instance v1, Lc20/a;
|
||||
invoke-direct {v1, v0}, Lc20/a;-><init>(I)V
|
||||
new-instance v0, Lc20/d;
|
||||
new-instance v1, Lg20/a;
|
||||
invoke-direct {v1, v0}, Lg20/a;-><init>(I)V
|
||||
new-instance v0, Lg20/d;
|
||||
const/4 v2, 0x0
|
||||
const/4 v3, 0x0
|
||||
const/4 v4, 0x0
|
||||
@@ -107,7 +107,7 @@
|
||||
const/4 v12, 0x0
|
||||
const/16 v13, 0xffe
|
||||
const/4 v14, 0x0
|
||||
invoke-direct/range {v0 .. v14}, Lc20/d;-><init>(Lc20/a;Lc20/a;Lc20/a;Lc20/a;Lc20/a;Lc20/a;Lc20/a;Lc20/a;Lc20/a;Lc20/a;Lc20/a;Lc20/a;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
|
||||
invoke-direct/range {v0 .. v14}, Lg20/d;-><init>(Lg20/a;Lg20/a;Lg20/a;Lg20/a;Lg20/a;Lg20/a;Lg20/a;Lg20/a;Lg20/a;Lg20/a;Lg20/a;Lg20/a;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
|
||||
|
||||
move-object v9, v0
|
||||
move-object/from16 v0, p1
|
||||
@@ -118,7 +118,7 @@
|
||||
const/4 v5, 0x0
|
||||
const/16 v6, 0x1d
|
||||
const/4 v7, 0x0
|
||||
invoke-static/range {v0 .. v7}, Ln20/e2;->g(Ln20/e2;Ln20/u4;Lc20/d;Lcom/squareup/ui/market/core/text/MarketTextAlignment;Lcom/squareup/ui/market/core/text/MarketTextTransform;Ln20/t4;ILjava/lang/Object;)Ln20/e2;
|
||||
invoke-static/range {v0 .. v7}, Lr20/c2;->g(Lr20/c2;Lr20/s4;Lg20/d;Lcom/squareup/ui/market/core/text/MarketTextAlignment;Lcom/squareup/ui/market/core/text/MarketTextTransform;Lr20/r4;ILjava/lang/Object;)Lr20/c2;
|
||||
move-result-object p0
|
||||
return-object p0
|
||||
.end method
|
||||
@@ -65,10 +65,6 @@
|
||||
|
||||
invoke-static {p1}, Lradiant/HomeBackdrop;->onTrack(Lcom/aspiro/wamp/model/Track;)V
|
||||
|
||||
const/4 v3, 0x0
|
||||
|
||||
sput-boolean v3, Lradiant/RLAPILyricsHook;->isRlState:Z
|
||||
|
||||
const-string v3, "onWampTrack: hook entered"
|
||||
|
||||
invoke-static {v3}, Lradiant/RLAPILyricsHook;->dlog(Ljava/lang/String;)V
|
||||
@@ -157,6 +153,25 @@
|
||||
|
||||
move-result-object v4
|
||||
|
||||
sget-object v5, Lradiant/RLAPILyricsHook;->currentKey:Ljava/lang/String;
|
||||
|
||||
invoke-virtual {v4, v5}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z
|
||||
|
||||
move-result v5
|
||||
|
||||
if-eqz v5, :rl_new_track
|
||||
|
||||
const-string v5, "onWampTrack: same track re-fired, skipping duplicate fetch"
|
||||
|
||||
invoke-static {v5}, Lradiant/RLAPILyricsHook;->dlog(Ljava/lang/String;)V
|
||||
|
||||
return-void
|
||||
|
||||
:rl_new_track
|
||||
const/4 v5, 0x0
|
||||
|
||||
sput-boolean v5, Lradiant/RLAPILyricsHook;->isRlState:Z
|
||||
|
||||
sput-object v4, Lradiant/RLAPILyricsHook;->currentKey:Ljava/lang/String;
|
||||
|
||||
new-instance v5, Ljava/lang/StringBuilder;
|
||||
|
||||
@@ -396,13 +396,23 @@
|
||||
|
||||
invoke-static {v4}, Lradiant/RLAPILyricsHook;->dlog(Ljava/lang/String;)V
|
||||
|
||||
iget-object v4, p0, Lradiant/RLAPILyricsWorker;->key:Ljava/lang/String;
|
||||
|
||||
sget-object v5, Lradiant/RLAPILyricsHook;->currentKey:Ljava/lang/String;
|
||||
|
||||
invoke-virtual {v4, v5}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z
|
||||
|
||||
move-result v4
|
||||
|
||||
if-eqz v4, :no_close # Smthn needed to keep lyrics open
|
||||
|
||||
sget-boolean v4, Lradiant/StickyLyrics;->enabled:Z
|
||||
|
||||
if-nez v4, :no_close
|
||||
|
||||
iget-object v4, p0, Lradiant/RLAPILyricsWorker;->vm:Lcom/tidal/android/feature/playerscreen/ui/PlayerViewModel;
|
||||
|
||||
iget-object v5, v4, Lcom/tidal/android/feature/playerscreen/ui/PlayerViewModel;->N:Lkotlinx/coroutines/flow/MutableStateFlow;
|
||||
iget-object v5, v4, Lcom/tidal/android/feature/playerscreen/ui/PlayerViewModel;->O:Lkotlinx/coroutines/flow/MutableStateFlow;
|
||||
|
||||
sget-object v6, Ljava/lang/Boolean;->FALSE:Ljava/lang/Boolean;
|
||||
|
||||
@@ -475,9 +485,9 @@
|
||||
:key_ok
|
||||
iget-object v4, p0, Lradiant/RLAPILyricsWorker;->vm:Lcom/tidal/android/feature/playerscreen/ui/PlayerViewModel;
|
||||
|
||||
iget-object v5, v4, Lcom/tidal/android/feature/playerscreen/ui/PlayerViewModel;->M:Lkotlinx/coroutines/flow/MutableStateFlow;
|
||||
iget-object v5, v4, Lcom/tidal/android/feature/playerscreen/ui/PlayerViewModel;->N:Lkotlinx/coroutines/flow/MutableStateFlow;
|
||||
|
||||
invoke-static {v3}, Ltn0/a;->c(Ljava/lang/Iterable;)Ltn0/b;
|
||||
invoke-static {v3}, Lzn0/a;->c(Ljava/lang/Iterable;)Lzn0/b;
|
||||
|
||||
move-result-object v6
|
||||
|
||||
@@ -494,9 +504,9 @@
|
||||
|
||||
const/4 v10, 0x0
|
||||
|
||||
invoke-direct {v8, v7, v6, v9, v10}, Lcom/tidal/android/feature/playerscreen/ui/g$c;-><init>(Ljava/lang/String;Ltn0/b;IZ)V
|
||||
invoke-direct {v8, v7, v6, v9, v10}, Lcom/tidal/android/feature/playerscreen/ui/g$c;-><init>(Ljava/lang/String;Lzn0/b;IZ)V
|
||||
|
||||
const-string v6, "publishing g$c -> J=true N=true M=g$c"
|
||||
const-string v6, "publishing g$c -> K=true (O=true if sticky) N=g$c"
|
||||
|
||||
invoke-static {v6}, Lradiant/RLAPILyricsHook;->dlog(Ljava/lang/String;)V
|
||||
|
||||
@@ -504,7 +514,7 @@
|
||||
|
||||
sput-boolean v6, Lradiant/RLAPILyricsHook;->isRlState:Z
|
||||
|
||||
iget-object v6, v4, Lcom/tidal/android/feature/playerscreen/ui/PlayerViewModel;->J:Lkotlinx/coroutines/flow/MutableStateFlow;
|
||||
iget-object v6, v4, Lcom/tidal/android/feature/playerscreen/ui/PlayerViewModel;->K:Lkotlinx/coroutines/flow/MutableStateFlow;
|
||||
|
||||
sget-object v7, Ljava/lang/Boolean;->TRUE:Ljava/lang/Boolean;
|
||||
|
||||
@@ -514,7 +524,7 @@
|
||||
|
||||
if-eqz v9, :skip_n
|
||||
|
||||
iget-object v6, v4, Lcom/tidal/android/feature/playerscreen/ui/PlayerViewModel;->N:Lkotlinx/coroutines/flow/MutableStateFlow;
|
||||
iget-object v6, v4, Lcom/tidal/android/feature/playerscreen/ui/PlayerViewModel;->O:Lkotlinx/coroutines/flow/MutableStateFlow;
|
||||
|
||||
invoke-interface {v6, v7}, Lkotlinx/coroutines/flow/MutableStateFlow;->setValue(Ljava/lang/Object;)V
|
||||
|
||||
|
||||
@@ -20,13 +20,13 @@
|
||||
|
||||
if-eqz p1, :ret # null guard
|
||||
|
||||
instance-of v0, p1, Ljh/b; # type guard
|
||||
instance-of v0, p1, Lih/b; # type guard
|
||||
|
||||
if-eqz v0, :ret # skip if wrong type
|
||||
|
||||
check-cast p1, Ljh/b; # narrow type
|
||||
check-cast p1, Lih/b; # narrow type
|
||||
|
||||
iget v0, p1, Ljh/b;->b:F # raw progress
|
||||
iget v0, p1, Lih/b;->b:F # raw progress
|
||||
|
||||
invoke-static {v0}, Ljava/lang/Float;->isNaN(F)Z # nan check
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
|
||||
|
||||
# direct methods
|
||||
.method public static final a(ILandroidx/compose/runtime/Composer;Landroidx/compose/ui/Modifier;Lyl0/a;)V
|
||||
.method public static final a(ILandroidx/compose/runtime/Composer;Landroidx/compose/ui/Modifier;Lem0/a;)V
|
||||
.locals 21
|
||||
.annotation build Landroidx/compose/runtime/Composable;
|
||||
.end annotation
|
||||
@@ -98,7 +98,7 @@
|
||||
|
||||
const/4 v4, 0x6
|
||||
|
||||
invoke-static {v2, v11, v4}, Lcom/squareup/ui/market/core/theme/x;->t(Lcom/squareup/ui/market/core/theme/k$a;Landroidx/compose/runtime/Composer;I)Lcom/squareup/ui/market/core/theme/MarketStylesheet;
|
||||
invoke-static {v2, v11, v4}, Lcom/squareup/ui/market/core/theme/y;->t(Lcom/squareup/ui/market/core/theme/k$a;Landroidx/compose/runtime/Composer;I)Lcom/squareup/ui/market/core/theme/MarketStylesheet;
|
||||
|
||||
move-result-object v15
|
||||
|
||||
@@ -131,7 +131,7 @@
|
||||
|
||||
const/16 v18, 0x0
|
||||
|
||||
invoke-static/range {v15 .. v20}, Lcom/squareup/ui/market/components/MarketIconButtonKt;->P(Lcom/squareup/ui/market/core/theme/MarketStylesheet;Lcom/squareup/ui/market/core/components/properties/IconButton$Size;Lcom/squareup/ui/market/core/components/properties/IconButton$Rank;Lcom/squareup/ui/market/core/components/properties/IconButton$Variant;ILjava/lang/Object;)Ln20/w1;
|
||||
invoke-static/range {v15 .. v20}, Lcom/squareup/ui/market/components/MarketIconButtonKt;->P(Lcom/squareup/ui/market/core/theme/MarketStylesheet;Lcom/squareup/ui/market/core/components/properties/IconButton$Size;Lcom/squareup/ui/market/core/components/properties/IconButton$Rank;Lcom/squareup/ui/market/core/components/properties/IconButton$Variant;ILjava/lang/Object;)Lr20/u1;
|
||||
|
||||
move-result-object v4
|
||||
|
||||
@@ -140,7 +140,7 @@
|
||||
:cond_5
|
||||
move-object v9, v4
|
||||
|
||||
check-cast v9, Ln20/w1;
|
||||
check-cast v9, Lr20/u1;
|
||||
|
||||
sget v2, Lcom/tidal/android/feature/playerscreen/ui/R$string;->lyrics:I
|
||||
|
||||
@@ -172,7 +172,7 @@
|
||||
|
||||
const/4 v8, 0x0
|
||||
|
||||
invoke-static/range {v1 .. v13}, Lcom/squareup/ui/market/components/MarketIconButtonKt;->c(Lyl0/a;Ljava/lang/String;Landroidx/compose/ui/Modifier;Landroidx/compose/foundation/interaction/MutableInteractionSource;ZLcom/squareup/ui/market/components/n;Lyl0/a;Ljava/lang/String;Ln20/w1;Lyl0/p;Landroidx/compose/runtime/Composer;II)V
|
||||
invoke-static/range {v1 .. v13}, Lcom/squareup/ui/market/components/MarketIconButtonKt;->c(Lem0/a;Ljava/lang/String;Landroidx/compose/ui/Modifier;Landroidx/compose/foundation/interaction/MutableInteractionSource;ZLcom/squareup/ui/market/components/n;Lem0/a;Ljava/lang/String;Lr20/u1;Lem0/p;Landroidx/compose/runtime/Composer;II)V
|
||||
|
||||
invoke-static {}, Landroidx/compose/runtime/ComposerKt;->isTraceInProgress()Z
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
.source "SourceFile"
|
||||
|
||||
# interfaces
|
||||
.implements Lyl0/p;
|
||||
.implements Lem0/p;
|
||||
|
||||
|
||||
# virtual methods
|
||||
@@ -35,7 +35,7 @@
|
||||
invoke-static {v0, p2, v1, v2}, Landroidx/compose/runtime/ComposerKt;->traceEventStart(IIILjava/lang/String;)V
|
||||
|
||||
:cond_0
|
||||
const p2, 0x7f08051d
|
||||
const p2, 0x7f080521
|
||||
|
||||
const/4 v0, 0x0
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
.class public final Lradiant/SpvFactory;
|
||||
.super Ljava/lang/Object;
|
||||
.implements Lyl0/l;
|
||||
.implements Lem0/l;
|
||||
|
||||
|
||||
# static fields
|
||||
|
||||
@@ -1,16 +1,16 @@
|
||||
--- a/com/tidal/android/feature/home/ui/k.smali
|
||||
+++ b/com/tidal/android/feature/home/ui/k.smali
|
||||
@@ -424,7 +424,7 @@
|
||||
@@ -427,7 +427,7 @@
|
||||
const/4 v6, 0x0
|
||||
|
||||
.line 181
|
||||
- move-wide v7, v8
|
||||
.line 182
|
||||
- move-wide v7, v9
|
||||
+ const-wide/16 v7, 0x0 # transparent containerColor
|
||||
|
||||
.line 182
|
||||
.line 183
|
||||
const-wide/16 v9, 0x0
|
||||
--- a/com/tidal/android/feature/home/ui/p.smali
|
||||
+++ b/com/tidal/android/feature/home/ui/p.smali
|
||||
--- a/com/tidal/android/feature/home/ui/n.smali
|
||||
+++ b/com/tidal/android/feature/home/ui/n.smali
|
||||
@@ -187,6 +187,10 @@
|
||||
.line 61
|
||||
.line 62
|
||||
@@ -22,8 +22,8 @@
|
||||
invoke-interface {p1}, Landroidx/compose/foundation/layout/PaddingValues;->calculateTopPadding-D9Ej5fM()F
|
||||
|
||||
.line 63
|
||||
--- a/com/tidal/android/feature/home/ui/composables/e.smali
|
||||
+++ b/com/tidal/android/feature/home/ui/composables/e.smali
|
||||
--- a/com/tidal/android/feature/home/ui/composables/f.smali
|
||||
+++ b/com/tidal/android/feature/home/ui/composables/f.smali
|
||||
@@ -790,6 +790,8 @@
|
||||
.line 104
|
||||
move-result-wide v14
|
||||
@@ -41,3 +41,4 @@
|
||||
+
|
||||
.line 135
|
||||
sget-object v3, Landroidx/compose/ui/graphics/Color;->Companion:Landroidx/compose/ui/graphics/Color$Companion;
|
||||
|
||||
|
||||
@@ -1,8 +1,7 @@
|
||||
--- a/pb/c.smali
|
||||
+++ b/pb/c.smali
|
||||
@@ -801,6 +801,26 @@
|
||||
-
|
||||
+
|
||||
--- a/ob/e.smali
|
||||
+++ b/ob/e.smali
|
||||
@@ -613,6 +613,25 @@
|
||||
|
||||
.line 236
|
||||
:goto_8
|
||||
+ const-string/jumbo v5, "com.waze"
|
||||
@@ -24,16 +23,13 @@
|
||||
+ goto :goto_9 # trust Waze
|
||||
+
|
||||
+ :rl_waze_done
|
||||
+
|
||||
invoke-static {}, Landroid/os/Process;->myUid()I
|
||||
-
|
||||
+
|
||||
|
||||
.line 237
|
||||
@@ -957,6 +977,26 @@
|
||||
@@ -769,6 +788,26 @@
|
||||
:goto_b
|
||||
if-eqz v2, :cond_14
|
||||
-
|
||||
+
|
||||
|
||||
+ const-string/jumbo v1, "com.waze"
|
||||
+
|
||||
+ invoke-static {v3, v1}, Lkotlin/jvm/internal/n;->b(Ljava/lang/Object;Ljava/lang/Object;)Z # package match
|
||||
@@ -56,4 +52,4 @@
|
||||
+
|
||||
.line 306
|
||||
.line 307
|
||||
iget-object v1, v0, Lpb/c;->c:Ljava/util/Map;
|
||||
iget-object v1, v0, Lob/e;->c:Ljava/util/Map;
|
||||
@@ -1,5 +1,5 @@
|
||||
--- a/com/tidal/android/feature/playerscreen/ui/h0.smali
|
||||
+++ b/com/tidal/android/feature/playerscreen/ui/h0.smali
|
||||
--- a/com/tidal/android/feature/playerscreen/ui/v0.smali
|
||||
+++ b/com/tidal/android/feature/playerscreen/ui/v0.smali
|
||||
@@ -669,8 +669,23 @@
|
||||
move-object v5, v1
|
||||
|
||||
@@ -8,15 +8,15 @@
|
||||
+
|
||||
+ invoke-interface {v7, v1}, Landroidx/compose/runtime/Composer;->startReplaceGroup(I)V # open group around the cover
|
||||
+
|
||||
+ iget-object v1, v0, Lcom/tidal/android/feature/playerscreen/ui/h0;->b:Lcom/tidal/android/feature/playerscreen/ui/r$a; # player state
|
||||
+ iget-object v1, v0, Lcom/tidal/android/feature/playerscreen/ui/v0;->b:Lcom/tidal/android/feature/playerscreen/ui/s$a; # player state
|
||||
+
|
||||
+ iget-object v1, v1, Lcom/tidal/android/feature/playerscreen/ui/r$a;->j:Lcom/tidal/android/feature/playerscreen/ui/g; # current view mode
|
||||
+ iget-object v1, v1, Lcom/tidal/android/feature/playerscreen/ui/s$a;->j:Lcom/tidal/android/feature/playerscreen/ui/g; # current view mode
|
||||
+
|
||||
+ instance-of v1, v1, Lcom/tidal/android/feature/playerscreen/ui/g$a; # cover mode only
|
||||
+
|
||||
+ if-eqz v1, :radiant_after_cover # lyrics/credits mode -> skip cover
|
||||
+
|
||||
invoke-static/range {v2 .. v9}, Lcom/tidal/android/feature/playerscreen/ui/composables/CoverPagerKt;->c(Lcom/tidal/android/feature/playerscreen/ui/d;Lyl0/l;FLandroidx/compose/ui/Modifier;ZLandroidx/compose/runtime/Composer;II)V
|
||||
invoke-static/range {v2 .. v9}, Lcom/tidal/android/feature/playerscreen/ui/composables/CoverPagerKt;->c(Lcom/tidal/android/feature/playerscreen/ui/d;Lem0/l;FLandroidx/compose/ui/Modifier;ZLandroidx/compose/runtime/Composer;II)V
|
||||
|
||||
+ :radiant_after_cover # skip target
|
||||
+ invoke-interface {v7}, Landroidx/compose/runtime/Composer;->endReplaceGroup()V # close group
|
||||
|
||||
@@ -1,16 +1,15 @@
|
||||
--- a/com/tidal/android/feature/playerscreen/ui/composables/o1.smali
|
||||
+++ b/com/tidal/android/feature/playerscreen/ui/composables/o1.smali
|
||||
@@ -64,26 +64,29 @@
|
||||
--- a/com/tidal/android/feature/playerscreen/ui/composables/l1.smali
|
||||
+++ b/com/tidal/android/feature/playerscreen/ui/composables/l1.smali
|
||||
@@ -64,7 +64,7 @@
|
||||
|
||||
.line 16
|
||||
.line 17
|
||||
- iget v2, p0, Lcom/tidal/android/feature/playerscreen/ui/composables/o1;->a:F
|
||||
- iget v2, p0, Lcom/tidal/android/feature/playerscreen/ui/composables/l1;->a:F
|
||||
+ const/high16 v2, 0x43200000 # 160f start dp
|
||||
|
||||
.line 18
|
||||
.line 19
|
||||
invoke-interface {p1, v2}, Landroidx/compose/ui/unit/Density;->toPx-0680j_4(F)F
|
||||
|
||||
@@ -73,7 +73,13 @@
|
||||
.line 20
|
||||
.line 21
|
||||
.line 22
|
||||
@@ -25,8 +24,7 @@
|
||||
|
||||
.line 23
|
||||
const/16 v5, 0x8
|
||||
|
||||
.line 24
|
||||
@@ -82,9 +88,6 @@
|
||||
.line 25
|
||||
const/4 v6, 0x0
|
||||
|
||||
@@ -35,3 +33,4 @@
|
||||
-
|
||||
.line 27
|
||||
const/4 v4, 0x0
|
||||
|
||||
|
||||
@@ -13,3 +13,20 @@
|
||||
.line 27
|
||||
.line 28
|
||||
iput v2, p0, Lcom/tidal/android/feature/playerscreen/ui/PlayerScreenKt$PlayerScreenPortrait$2$1;->label:I
|
||||
--- a/com/tidal/android/feature/playerscreen/ui/PlayerViewModel.smali
|
||||
+++ b/com/tidal/android/feature/playerscreen/ui/PlayerViewModel.smali
|
||||
@@ -1299,6 +1299,14 @@
|
||||
.line 109
|
||||
.line 110
|
||||
move-result v1
|
||||
+ sget v4, Lradiant/LyricsReinitGuard;->lastMediaId:I
|
||||
+ if-eq v1, v4, :rl_skip_reinit # same track re-emitted -> skip the redundant re-init (avoids the loading-state flash)
|
||||
+ sput v1, Lradiant/LyricsReinitGuard;->lastMediaId:I
|
||||
+ goto :rl_reinit_ok
|
||||
+ :rl_skip_reinit
|
||||
+ sget-object v4, Lkotlin/v;->a:Lkotlin/v;
|
||||
+ return-object v4
|
||||
+ :rl_reinit_ok
|
||||
|
||||
.line 111
|
||||
invoke-static {v1}, Ljava/lang/String;->valueOf(I)Ljava/lang/String;
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
--- a/com/tidal/android/feature/playerscreen/ui/c0.smali
|
||||
+++ b/com/tidal/android/feature/playerscreen/ui/c0.smali
|
||||
@@ -47,7 +47,7 @@
|
||||
--- a/com/tidal/android/feature/playerscreen/ui/s0.smali
|
||||
+++ b/com/tidal/android/feature/playerscreen/ui/s0.smali
|
||||
@@ -45,7 +45,7 @@
|
||||
|
||||
# virtual methods
|
||||
.method public final invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
|
||||
@@ -9,9 +9,9 @@
|
||||
|
||||
.line 1
|
||||
move-object/from16 v0, p0
|
||||
@@ -461,6 +461,64 @@
|
||||
@@ -460,6 +460,64 @@
|
||||
.line 200
|
||||
invoke-static/range {v2 .. v9}, Lcom/tidal/android/feature/playerscreen/ui/composables/LyricsKt;->a(Lcom/tidal/android/feature/playerscreen/ui/g;Lyl0/l;Landroidx/compose/ui/Modifier;Landroidx/compose/foundation/layout/PaddingValues;Lyl0/l;Landroidx/compose/runtime/Composer;II)V
|
||||
invoke-static/range {v2 .. v9}, Lcom/tidal/android/feature/playerscreen/ui/composables/LyricsKt;->a(Lcom/tidal/android/feature/playerscreen/ui/g;Lem0/l;Landroidx/compose/ui/Modifier;Landroidx/compose/foundation/layout/PaddingValues;Lem0/l;Landroidx/compose/runtime/Composer;II)V
|
||||
|
||||
+ sget-object v17, Lradiant/SpvFactory;->a:Lradiant/SpvFactory; # progress view factory
|
||||
+
|
||||
@@ -29,7 +29,7 @@
|
||||
+
|
||||
+ const/16 v24, 0x0 # synthetic null
|
||||
+
|
||||
+ invoke-static/range {v18 .. v24}, Landroidx/compose/foundation/ClickableKt;->clickable-XHw0xAI$default(Landroidx/compose/ui/Modifier;ZLjava/lang/String;Landroidx/compose/ui/semantics/Role;Lyl0/a;ILjava/lang/Object;)Landroidx/compose/ui/Modifier; # apply clickable
|
||||
+ invoke-static/range {v18 .. v24}, Landroidx/compose/foundation/ClickableKt;->clickable-XHw0xAI$default(Landroidx/compose/ui/Modifier;ZLjava/lang/String;Landroidx/compose/ui/semantics/Role;Lem0/a;ILjava/lang/Object;)Landroidx/compose/ui/Modifier; # apply clickable
|
||||
+
|
||||
+ move-result-object v23 # clickable modifier
|
||||
+
|
||||
@@ -69,7 +69,7 @@
|
||||
+
|
||||
+ const/16 v22, 0x4 # default mask
|
||||
+
|
||||
+ invoke-static/range {v17 .. v22}, Landroidx/compose/ui/viewinterop/AndroidView_androidKt;->AndroidView(Lyl0/l;Landroidx/compose/ui/Modifier;Lyl0/l;Landroidx/compose/runtime/Composer;II)V # mount progress pill
|
||||
+ invoke-static/range {v17 .. v22}, Landroidx/compose/ui/viewinterop/AndroidView_androidKt;->AndroidView(Lem0/l;Landroidx/compose/ui/Modifier;Lem0/l;Landroidx/compose/runtime/Composer;II)V # mount progress pill
|
||||
+
|
||||
.line 201
|
||||
.line 202
|
||||
|
||||
@@ -1,34 +1,30 @@
|
||||
# rl-locals: com/tidal/android/feature/playerscreen/ui/PlayerScreenKt.smali e( 79
|
||||
--- a/com/tidal/android/feature/playerscreen/ui/PlayerScreenKt.smali
|
||||
+++ b/com/tidal/android/feature/playerscreen/ui/PlayerScreenKt.smali
|
||||
@@ -4945,7 +4945,11 @@
|
||||
const/4 v7, 0x0
|
||||
@@ -5002,7 +5002,11 @@
|
||||
const/4 v13, 0x0
|
||||
|
||||
.line 226
|
||||
- invoke-static {v7, v9, v4, v2, v10}, Lcom/tidal/android/feature/playerscreen/ui/composables/k1;->a(Landroidx/compose/ui/Modifier;Lyl0/a;ZLandroidx/compose/runtime/Composer;I)V
|
||||
+ const v10, 0x52414448 # empty group key
|
||||
.line 230
|
||||
- invoke-static {v13, v6, v4, v14, v11}, Lcom/tidal/android/feature/playerscreen/ui/composables/h1;->a(Landroidx/compose/ui/Modifier;Lem0/a;ZLandroidx/compose/runtime/Composer;I)V
|
||||
+ const v13, 0x52414448 # empty group key
|
||||
+
|
||||
+ invoke-interface {v2, v10}, Landroidx/compose/runtime/Composer;->startReplaceGroup(I)V # open empty
|
||||
+ invoke-interface {v14, v13}, Landroidx/compose/runtime/Composer;->startReplaceGroup(I)V # open empty
|
||||
+
|
||||
+ invoke-interface {v2}, Landroidx/compose/runtime/Composer;->endReplaceGroup()V # close empty
|
||||
+ invoke-interface {v14}, Landroidx/compose/runtime/Composer;->endReplaceGroup()V # close empty
|
||||
|
||||
.line 227
|
||||
invoke-interface {v2}, Landroidx/compose/runtime/Composer;->endReplaceGroup()V
|
||||
@@ -5720,6 +5724,22 @@
|
||||
:cond_51
|
||||
check-cast v4, Lyl0/a;
|
||||
.line 231
|
||||
invoke-interface {v14}, Landroidx/compose/runtime/Composer;->endReplaceGroup()V
|
||||
@@ -5791,6 +5795,22 @@
|
||||
|
||||
const/4 v2, 0x0
|
||||
invoke-static {v15, v7, v8, v3}, Lcom/tidal/android/feature/playerscreen/ui/composables/i3;->a(ILandroidx/compose/runtime/Composer;Landroidx/compose/ui/Modifier;Lem0/a;)V
|
||||
|
||||
invoke-static {v13, v7, v2, v4}, Lcom/tidal/android/feature/playerscreen/ui/composables/l3;->a(ILandroidx/compose/runtime/Composer;Landroidx/compose/ui/Modifier;Lyl0/a;)V
|
||||
+
|
||||
+ new-instance v74, Lcom/tidal/android/feature/playerscreen/ui/g0; # lyrics toggle lambda
|
||||
+ new-instance v74, Lcom/tidal/android/feature/playerscreen/ui/u0; # lyrics toggle lambda
|
||||
+
|
||||
+ move-object/from16 v75, p5 # action dispatcher
|
||||
+
|
||||
+ const/16 v76, 0x0 # lyrics action disc
|
||||
+
|
||||
+ invoke-direct/range {v74 .. v76}, Lcom/tidal/android/feature/playerscreen/ui/g0;-><init>(Ljava/lang/Object;I)V # build lambda
|
||||
+ invoke-direct/range {v74 .. v76}, Lcom/tidal/android/feature/playerscreen/ui/u0;-><init>(Ljava/lang/Object;I)V # build lambda
|
||||
+
|
||||
+ const/16 v71, 0x0 # changed flags
|
||||
+
|
||||
@@ -36,4 +32,8 @@
|
||||
+
|
||||
+ const/16 v73, 0x0 # null modifier
|
||||
+
|
||||
+ invoke-static/range {v71 .. v74}, Lradiant/SparkleButton;->a(ILandroidx/compose/runtime/Composer;Landroidx/compose/ui/Modifier;Lyl0/a;)V # render sparkle button
|
||||
+ invoke-static/range {v71 .. v74}, Lradiant/SparkleButton;->a(ILandroidx/compose/runtime/Composer;Landroidx/compose/ui/Modifier;Lem0/a;)V # render sparkle button
|
||||
+
|
||||
.line 336
|
||||
iget-object v3, v10, Lcom/tidal/android/feature/playerscreen/ui/s$a;->l:Lcom/tidal/android/feature/playerscreen/ui/p;
|
||||
|
||||
|
||||
@@ -1,50 +1,46 @@
|
||||
--- a/com/tidal/android/feature/playerscreen/ui/PlayerScreenKt.smali
|
||||
+++ b/com/tidal/android/feature/playerscreen/ui/PlayerScreenKt.smali
|
||||
@@ -5094,7 +5094,11 @@
|
||||
@@ -5155,7 +5155,11 @@
|
||||
const/4 v13, 0x0
|
||||
|
||||
.line 247
|
||||
- invoke-static {v9, v0, v10, v2, v13}, Lcom/tidal/android/feature/playerscreen/ui/composables/BroadcastButtonKt;->b(Lcom/tidal/android/feature/playerscreen/ui/b;Lyl0/a;Landroidx/compose/ui/Modifier;Landroidx/compose/runtime/Composer;I)V
|
||||
+ const v9, 0x52414244 # empty group key
|
||||
.line 251
|
||||
- invoke-static {v6, v10, v13, v14, v7}, Lcom/tidal/android/feature/playerscreen/ui/composables/BroadcastButtonKt;->b(Lcom/tidal/android/feature/playerscreen/ui/b;Lem0/a;Landroidx/compose/ui/Modifier;Landroidx/compose/runtime/Composer;I)V
|
||||
+ const v13, 0x52414244 # empty group key
|
||||
+
|
||||
+ invoke-interface {v2, v9}, Landroidx/compose/runtime/Composer;->startReplaceGroup(I)V # open empty
|
||||
+ invoke-interface {v14, v13}, Landroidx/compose/runtime/Composer;->startReplaceGroup(I)V # open empty
|
||||
+
|
||||
+ invoke-interface {v2}, Landroidx/compose/runtime/Composer;->endReplaceGroup()V # close empty
|
||||
+ invoke-interface {v14}, Landroidx/compose/runtime/Composer;->endReplaceGroup()V # close empty
|
||||
|
||||
.line 248
|
||||
invoke-interface {v2}, Landroidx/compose/runtime/Composer;->endNode()V
|
||||
@@ -5770,16 +5774,20 @@
|
||||
.line 335
|
||||
:cond_53
|
||||
- new-instance v4, Lcom/aspiro/wamp/tidalconnect/playback/i;
|
||||
-
|
||||
- invoke-direct {v4, v11, v1}, Lcom/aspiro/wamp/tidalconnect/playback/i;-><init>(Ljava/lang/Object;I)V
|
||||
-
|
||||
- .line 336
|
||||
- invoke-interface {v7, v4}, Landroidx/compose/runtime/Composer;->updateRememberedValue(Ljava/lang/Object;)V
|
||||
-
|
||||
- .line 337
|
||||
- :cond_54
|
||||
- check-cast v4, Lyl0/a;
|
||||
-
|
||||
- const/4 v2, 0x0
|
||||
-
|
||||
- invoke-static {v13, v7, v2, v4}, Lcom/tidal/android/feature/playerscreen/ui/composables/x4;->a(ILandroidx/compose/runtime/Composer;Landroidx/compose/ui/Modifier;Lyl0/a;)V
|
||||
+ new-instance v4, Landroidx/navigation/fragment/k; # connect click lambda factory
|
||||
.line 252
|
||||
invoke-interface {v14}, Landroidx/compose/runtime/Composer;->endNode()V
|
||||
@@ -5978,11 +5982,11 @@
|
||||
.line 356
|
||||
:cond_59
|
||||
:goto_29
|
||||
- new-instance v0, Lcom/tidal/android/feature/playerscreen/ui/i0;
|
||||
+ new-instance v0, Lcom/squareup/ui/market/modal/o; # connect click lambda (was share i0)
|
||||
|
||||
- const/4 v15, 0x0
|
||||
+ const/4 v15, 0x1 # connect-clicked disc
|
||||
|
||||
- invoke-direct {v0, v11, v15}, Lcom/tidal/android/feature/playerscreen/ui/i0;-><init>(Ljava/lang/Object;I)V
|
||||
+ invoke-direct {v0, v11, v15}, Lcom/squareup/ui/market/modal/o;-><init>(Ljava/lang/Object;I)V # build connect lambda
|
||||
|
||||
.line 357
|
||||
invoke-interface {v7, v0}, Landroidx/compose/runtime/Composer;->updateRememberedValue(Ljava/lang/Object;)V
|
||||
@@ -5991,9 +5995,13 @@
|
||||
:goto_2a
|
||||
check-cast v0, Lem0/a;
|
||||
|
||||
- const/4 v8, 0x0
|
||||
+ iget-object v8, v10, Lcom/tidal/android/feature/playerscreen/ui/s$a;->d:Lcom/tidal/android/feature/playerscreen/ui/b; # broadcast state
|
||||
+
|
||||
+ move-object/from16 v6, p5 # action dispatcher
|
||||
+ const/4 v13, 0x0 # null modifier
|
||||
+
|
||||
+ const/4 v8, 0x1 # connect-clicked disc
|
||||
+
|
||||
+ invoke-direct {v4, v6, v8}, Landroidx/navigation/fragment/k;-><init>(Ljava/lang/Object;I)V # build lambda
|
||||
+
|
||||
+ invoke-interface {v7, v4}, Landroidx/compose/runtime/Composer;->updateRememberedValue(Ljava/lang/Object;)V # cache lambda
|
||||
+
|
||||
+ :cond_54 # cache join
|
||||
+ check-cast v4, Lyl0/a; # cast to Function0
|
||||
+
|
||||
+ iget-object v8, v10, Lcom/tidal/android/feature/playerscreen/ui/r$a;->d:Lcom/tidal/android/feature/playerscreen/ui/b; # broadcast state
|
||||
+
|
||||
+ const/4 v2, 0x0 # changed flags
|
||||
+
|
||||
+ invoke-static {v8, v4, v13, v7, v2}, Lcom/tidal/android/feature/playerscreen/ui/composables/BroadcastButtonKt;->b(Lcom/tidal/android/feature/playerscreen/ui/b;Lyl0/a;Landroidx/compose/ui/Modifier;Landroidx/compose/runtime/Composer;I)V # render connect button
|
||||
+ const/4 v15, 0x0 # changed flags
|
||||
|
||||
- invoke-static {v15, v7, v8, v0}, Lcom/tidal/android/feature/playerscreen/ui/composables/t4;->a(ILandroidx/compose/runtime/Composer;Landroidx/compose/ui/Modifier;Lem0/a;)V
|
||||
+ invoke-static {v8, v0, v13, v7, v15}, Lcom/tidal/android/feature/playerscreen/ui/composables/BroadcastButtonKt;->b(Lcom/tidal/android/feature/playerscreen/ui/b;Lem0/a;Landroidx/compose/ui/Modifier;Landroidx/compose/runtime/Composer;I)V # render connect button
|
||||
|
||||
if-ne v1, v2, :cond_5a
|
||||
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
--- a/com/tidal/android/feature/playerscreen/ui/PlayerViewModel.smali
|
||||
+++ b/com/tidal/android/feature/playerscreen/ui/PlayerViewModel.smali
|
||||
@@ -1277,7 +1277,9 @@
|
||||
.line 104
|
||||
@@ -1291,6 +1291,8 @@
|
||||
.line 105
|
||||
check-cast v1, Lcom/aspiro/wamp/model/Track;
|
||||
|
||||
@@ -10,12 +9,58 @@
|
||||
.line 106
|
||||
.line 107
|
||||
invoke-virtual {v1}, Lcom/aspiro/wamp/model/MediaItem;->getId()I
|
||||
@@ -1551,7 +1553,7 @@
|
||||
@@ -1564,7 +1566,7 @@
|
||||
.line 235
|
||||
.line 236
|
||||
.line 237
|
||||
- if-nez v9, :cond_a
|
||||
+ goto :cond_a # skip TIDAL N=false setter
|
||||
+ goto :cond_a # RL: skip TIDAL O=false in the has-lyrics path
|
||||
|
||||
.line 238
|
||||
.line 239
|
||||
@@ -2256,7 +2258,10 @@
|
||||
|
||||
.line 568
|
||||
:goto_c
|
||||
+ sget-boolean v5, Lradiant/RLAPILyricsHook;->isRlState:Z
|
||||
+ if-nez v5, :rl_keep_n2 # RL active -> keep worker content
|
||||
invoke-interface {v9, v1}, Lkotlinx/coroutines/flow/MutableStateFlow;->setValue(Ljava/lang/Object;)V
|
||||
+ :rl_keep_n2
|
||||
|
||||
.line 569
|
||||
.line 570
|
||||
@@ -2305,7 +2310,10 @@
|
||||
|
||||
.line 591
|
||||
.line 592
|
||||
+ sget-boolean v7, Lradiant/RLAPILyricsHook;->isRlState:Z
|
||||
+ if-nez v7, :rl_keep_o # RL active -> keep view-open flag
|
||||
invoke-interface {v1, v5}, Lkotlinx/coroutines/flow/MutableStateFlow;->setValue(Ljava/lang/Object;)V
|
||||
+ :rl_keep_o
|
||||
|
||||
.line 593
|
||||
.line 594
|
||||
@@ -2334,7 +2342,10 @@
|
||||
|
||||
.line 606
|
||||
.line 607
|
||||
+ sget-boolean v7, Lradiant/RLAPILyricsHook;->isRlState:Z
|
||||
+ if-nez v7, :rl_keep_n # RL active -> keep worker content
|
||||
invoke-interface {v1, v6}, Lkotlinx/coroutines/flow/MutableStateFlow;->setValue(Ljava/lang/Object;)V
|
||||
+ :rl_keep_n
|
||||
|
||||
.line 608
|
||||
.line 609
|
||||
--- a/com/tidal/android/feature/playerscreen/ui/PlayerViewModel$special$$inlined$mapNotNull$1$2.smali
|
||||
+++ b/com/tidal/android/feature/playerscreen/ui/PlayerViewModel$special$$inlined$mapNotNull$1$2.smali
|
||||
@@ -2202,6 +2202,10 @@
|
||||
.line 1011
|
||||
.line 1012
|
||||
move-result v31
|
||||
+ sget-boolean v5, Lradiant/RLAPILyricsHook;->isRlState:Z
|
||||
+ if-eqz v5, :rl_hl_done # not RL -> use TIDAL's hasLyrics
|
||||
+ const/16 v31, 0x1 # RL lyrics active -> force hasLyrics so the sparkle stays
|
||||
+ :rl_hl_done
|
||||
|
||||
.line 1013
|
||||
iget-object v5, v1, Lcom/tidal/android/feature/playerscreen/ui/PlayerViewModel;->O:Lkotlinx/coroutines/flow/MutableStateFlow;
|
||||
|
||||
@@ -1,32 +1,24 @@
|
||||
--- a/com/tidal/android/feature/playerscreen/ui/PlayerScreenKt.smali
|
||||
+++ b/com/tidal/android/feature/playerscreen/ui/PlayerScreenKt.smali
|
||||
@@ -5725,17 +5725,38 @@
|
||||
invoke-static {v13, v7, v2, v4}, Lcom/tidal/android/feature/playerscreen/ui/composables/l3;->a(ILandroidx/compose/runtime/Composer;Landroidx/compose/ui/Modifier;Lyl0/a;)V
|
||||
+
|
||||
+ iget-boolean v2, v10, Lcom/tidal/android/feature/playerscreen/ui/r$a;->i:Z # hasLyrics flag
|
||||
@@ -5795,6 +5795,14 @@
|
||||
|
||||
invoke-static {v15, v7, v8, v3}, Lcom/tidal/android/feature/playerscreen/ui/composables/i3;->a(ILandroidx/compose/runtime/Composer;Landroidx/compose/ui/Modifier;Lem0/a;)V
|
||||
|
||||
+ iget-boolean v2, v10, Lcom/tidal/android/feature/playerscreen/ui/s$a;->i:Z # hasLyrics flag
|
||||
+
|
||||
+ if-eqz v2, :cond_sparkle_no_lyrics # branch when no lyrics
|
||||
+
|
||||
+ const v2, 0x30551b59 # group key (lyrics)
|
||||
+
|
||||
+ invoke-interface {v7, v2}, Landroidx/compose/runtime/Composer;->startReplaceGroup(I)V # open lyrics branch
|
||||
|
||||
new-instance v74, Lcom/tidal/android/feature/playerscreen/ui/g0; # lyrics toggle lambda
|
||||
+
|
||||
new-instance v74, Lcom/tidal/android/feature/playerscreen/ui/u0; # lyrics toggle lambda
|
||||
|
||||
move-object/from16 v75, p5 # action dispatcher
|
||||
@@ -5811,6 +5819,19 @@
|
||||
|
||||
const/16 v76, 0x0 # lyrics action disc
|
||||
invoke-static/range {v71 .. v74}, Lradiant/SparkleButton;->a(ILandroidx/compose/runtime/Composer;Landroidx/compose/ui/Modifier;Lem0/a;)V # render sparkle button
|
||||
|
||||
invoke-direct/range {v74 .. v76}, Lcom/tidal/android/feature/playerscreen/ui/g0;-><init>(Ljava/lang/Object;I)V # build lambda
|
||||
|
||||
const/16 v71, 0x0 # changed flags
|
||||
|
||||
move-object/from16 v72, v7 # composer
|
||||
|
||||
const/16 v73, 0x0 # null modifier
|
||||
|
||||
invoke-static/range {v71 .. v74}, Lradiant/SparkleButton;->a(ILandroidx/compose/runtime/Composer;Landroidx/compose/ui/Modifier;Lyl0/a;)V # render sparkle button
|
||||
+
|
||||
+ invoke-interface {v7}, Landroidx/compose/runtime/Composer;->endReplaceGroup()V # close lyrics branch
|
||||
+
|
||||
+ goto :goto_sparkle_done # skip empty branch
|
||||
@@ -39,3 +31,7 @@
|
||||
+ invoke-interface {v7}, Landroidx/compose/runtime/Composer;->endReplaceGroup()V # close empty
|
||||
+
|
||||
+ :goto_sparkle_done # join target
|
||||
+
|
||||
.line 336
|
||||
iget-object v3, v10, Lcom/tidal/android/feature/playerscreen/ui/s$a;->l:Lcom/tidal/android/feature/playerscreen/ui/p;
|
||||
|
||||
|
||||
+135
-35
@@ -4,11 +4,15 @@
|
||||
{
|
||||
"id": "EnableLegacyUi",
|
||||
"order": 10,
|
||||
"fileNames": ["enable-legacy-ui.patch"],
|
||||
"fileNames": [
|
||||
"enable-legacy-ui.patch"
|
||||
],
|
||||
"title": "Enable Legacy UI",
|
||||
"description": "[This patch will stop working soon] - Replaces the New Compose based UI with the Legacy UI (disables player-market-ui feature flag)",
|
||||
"default": false,
|
||||
"requires": ["DebugMenuUnlock"],
|
||||
"requires": [
|
||||
"DebugMenuUnlock"
|
||||
],
|
||||
"disables": [
|
||||
"LyricsDisableCover",
|
||||
"LyricsReplaceLyricsButton",
|
||||
@@ -24,7 +28,10 @@
|
||||
{
|
||||
"id": "LyricsRlApi",
|
||||
"order": 20,
|
||||
"fileNames": ["lyrics-rl-api.patch", "lyrics-rl-api-observer.patch"],
|
||||
"fileNames": [
|
||||
"lyrics-rl-api.patch",
|
||||
"lyrics-rl-api-observer.patch"
|
||||
],
|
||||
"title": "Radiant Lyrics API - WIP",
|
||||
"description": "Use Radiant Lyrics API to fetch Lyrics (Higher quality & More providers)",
|
||||
"default": false
|
||||
@@ -32,7 +39,9 @@
|
||||
{
|
||||
"id": "PlayerBackdrop",
|
||||
"order": 30,
|
||||
"fileNames": ["player-backdrop.patch"],
|
||||
"fileNames": [
|
||||
"player-backdrop.patch"
|
||||
],
|
||||
"title": "Player Backdrop",
|
||||
"description": "Restores the legacy translucent backdrop blur behind the player",
|
||||
"default": true,
|
||||
@@ -48,7 +57,10 @@
|
||||
"steps": 19,
|
||||
"displayAsPercent": true,
|
||||
"token": "RL_BLUR_BITS",
|
||||
"encode": { "kind": "floatBits", "scale": 1.8 }
|
||||
"encode": {
|
||||
"kind": "floatBits",
|
||||
"scale": 1.8
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "slider",
|
||||
@@ -61,7 +73,9 @@
|
||||
"steps": 19,
|
||||
"displayAsPercent": true,
|
||||
"token": "RL_SCRIM_ARGB",
|
||||
"encode": { "kind": "argbAlpha" }
|
||||
"encode": {
|
||||
"kind": "argbAlpha"
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "toggle",
|
||||
@@ -70,22 +84,43 @@
|
||||
"description": "Applies the blurred backdrop to every Compose based page (Home & Collection)",
|
||||
"default": false,
|
||||
"inline": true,
|
||||
"fileNames": ["home-backdrop.patch", "collection-backdrop.patch", "cover-capture.patch"]
|
||||
"fileNames": [
|
||||
"home-backdrop.patch",
|
||||
"collection-backdrop.patch",
|
||||
"cover-capture.patch"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "QualityBadgeColors",
|
||||
"order": 36,
|
||||
"fileNames": ["player-quality-badge-colors.patch"],
|
||||
"fileNames": [
|
||||
"player-quality-badge-colors.patch"
|
||||
],
|
||||
"title": "Quality Badge Colors",
|
||||
"description": "Brings color back to the player quality badge.",
|
||||
"default": true
|
||||
},
|
||||
{
|
||||
"id": "PlayerOneHanded",
|
||||
"id": "PlayerMovePlayingFrom",
|
||||
"order": 37,
|
||||
"fileNames": ["player-one-handed.patch"],
|
||||
"fileNames": [
|
||||
"player-move-playing-from.patch"
|
||||
],
|
||||
"extensionFiles": [
|
||||
"radiant/PlayingFrom.smali"
|
||||
],
|
||||
"title": "Playing From",
|
||||
"description": "Shows the source name (playlist/album/mix) above the track title",
|
||||
"default": true
|
||||
},
|
||||
{
|
||||
"id": "PlayerOneHanded",
|
||||
"order": 38,
|
||||
"fileNames": [
|
||||
"player-one-handed.patch"
|
||||
],
|
||||
"title": "One-Handed Mode",
|
||||
"description": "Mirrors the bottom player buttons left-to-right for easier one-handed reach.",
|
||||
"default": false
|
||||
@@ -93,16 +128,25 @@
|
||||
{
|
||||
"id": "LyricsProgressPill",
|
||||
"order": 40,
|
||||
"fileNames": ["lyrics-progress-pill.patch", "lyrics-fade-region.patch"],
|
||||
"fileNames": [
|
||||
"lyrics-progress-pill.patch",
|
||||
"lyrics-fade-region.patch"
|
||||
],
|
||||
"title": "Lyrics Progress Pill",
|
||||
"description": "Restores the old Track Progress Pill in the top of the Lyrics screen!",
|
||||
"default": true,
|
||||
"requires": ["LyricsDisableCover", "LyricsReplaceLyricsButton", "LyricsReplaceShareButton"]
|
||||
"requires": [
|
||||
"LyricsDisableCover",
|
||||
"LyricsReplaceLyricsButton",
|
||||
"LyricsReplaceShareButton"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "LyricsDisableCover",
|
||||
"order": 41,
|
||||
"fileNames": ["lyrics-disable-cover.patch"],
|
||||
"fileNames": [
|
||||
"lyrics-disable-cover.patch"
|
||||
],
|
||||
"title": "Disable Lyrics Cover",
|
||||
"description": "Removes the mini track cover from the lyrics screen.",
|
||||
"default": true
|
||||
@@ -110,7 +154,10 @@
|
||||
{
|
||||
"id": "LyricsReplaceLyricsButton",
|
||||
"order": 42,
|
||||
"fileNames": ["lyrics-replace-lyrics-button.patch", "lyrics-sparkle-conditional-visibility.patch"],
|
||||
"fileNames": [
|
||||
"lyrics-replace-lyrics-button.patch",
|
||||
"lyrics-sparkle-conditional-visibility.patch"
|
||||
],
|
||||
"title": "Replace Lyrics Button",
|
||||
"description": "Replaces the Lyrics button with the RL Sparkle!",
|
||||
"default": true
|
||||
@@ -118,7 +165,9 @@
|
||||
{
|
||||
"id": "LyricsReplaceShareButton",
|
||||
"order": 43,
|
||||
"fileNames": ["lyrics-replace-share-button.patch"],
|
||||
"fileNames": [
|
||||
"lyrics-replace-share-button.patch"
|
||||
],
|
||||
"title": "Replace Share Button",
|
||||
"description": "Replaces the share button with the Tidal Connect button from the top of the screen. (it's in the menu already)",
|
||||
"default": true
|
||||
@@ -132,9 +181,22 @@
|
||||
"default": false,
|
||||
"defaultVariantIndex": 2,
|
||||
"variants": [
|
||||
{ "title": "Floating", "fileNames": [] },
|
||||
{ "title": "Grey", "fileNames": ["mini-player-grey.patch"] },
|
||||
{ "title": "Black", "fileNames": ["mini-player-black.patch"] }
|
||||
{
|
||||
"title": "Floating",
|
||||
"fileNames": []
|
||||
},
|
||||
{
|
||||
"title": "Grey",
|
||||
"fileNames": [
|
||||
"mini-player-grey.patch"
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Black",
|
||||
"fileNames": [
|
||||
"mini-player-black.patch"
|
||||
]
|
||||
}
|
||||
],
|
||||
"advancedOptions": [
|
||||
{
|
||||
@@ -144,10 +206,18 @@
|
||||
"description": "Colorizes the Mini-Player depending on the currently playing track.",
|
||||
"default": false,
|
||||
"inline": true,
|
||||
"fileNames": ["mini-player-dynamic-bg.patch"],
|
||||
"extensionFiles": ["radiant/MiniPlayerBackground.smali"],
|
||||
"hidesVariants": [2],
|
||||
"relabelVariants": { "1": "Legacy" }
|
||||
"fileNames": [
|
||||
"mini-player-dynamic-bg.patch"
|
||||
],
|
||||
"extensionFiles": [
|
||||
"radiant/MiniPlayerBackground.smali"
|
||||
],
|
||||
"hidesVariants": [
|
||||
2
|
||||
],
|
||||
"relabelVariants": {
|
||||
"1": "Legacy"
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "toggle",
|
||||
@@ -156,8 +226,12 @@
|
||||
"description": "Draws an animated progress ring around the floating mini-player. Requires the Floating style.",
|
||||
"default": false,
|
||||
"requiresVariant": 0,
|
||||
"fileNames": ["mini-player-floating-border.patch"],
|
||||
"extensionFiles": ["radiant/MiniSeekerFloating.smali"]
|
||||
"fileNames": [
|
||||
"mini-player-floating-border.patch"
|
||||
],
|
||||
"extensionFiles": [
|
||||
"radiant/MiniSeekerFloating.smali"
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "toggle",
|
||||
@@ -165,7 +239,9 @@
|
||||
"title": "Mini-Player Gestures",
|
||||
"description": "Adds swipe up gesture to the mini-player to reopen the player",
|
||||
"default": true,
|
||||
"fileNames": ["mini-player-gestures.patch"],
|
||||
"fileNames": [
|
||||
"mini-player-gestures.patch"
|
||||
],
|
||||
"extensionFiles": [
|
||||
"radiant/MiniPlayerGestures.smali",
|
||||
"radiant/MiniPlayerGestures$Gesture.smali",
|
||||
@@ -179,8 +255,14 @@
|
||||
"type": "choice",
|
||||
"key": "swipe_up_drag",
|
||||
"title": "Swipe Up Style",
|
||||
"entries": ["Static", "Drag"],
|
||||
"values": ["0x0", "0x1"],
|
||||
"entries": [
|
||||
"Static",
|
||||
"Drag"
|
||||
],
|
||||
"values": [
|
||||
"0x0",
|
||||
"0x1"
|
||||
],
|
||||
"defaultIndex": 1,
|
||||
"requiresOption": "gestures",
|
||||
"token": "RL_MINI_PLAYER_SWIPE_UP_DRAG"
|
||||
@@ -192,14 +274,16 @@
|
||||
"description": "Swipe left or right on the mini-player to skip tracks.",
|
||||
"default": false,
|
||||
"requiresOption": "gestures",
|
||||
"fileNames": ["mini-player-gestures-left-right.patch"],
|
||||
"fileNames": [
|
||||
"mini-player-gestures-left-right.patch"
|
||||
],
|
||||
"extensionFiles": [
|
||||
"radiant/MiniPlayerTrackGestures.smali",
|
||||
"radiant/MiniPlayerTrackGestures$Gesture.smali",
|
||||
"radiant/MiniPlayerTrackGestures$OffsetLayer.smali",
|
||||
"radiant/MiniPlayerTrackGestures$ResetAnimator.smali",
|
||||
"radiant/MiniPlayerTrackGestures$TextDraw.smali",
|
||||
"com/tidal/android/feature/appscaffold/ui/q$c.smali"
|
||||
"com/tidal/android/feature/appscaffold/ui/s$c.smali"
|
||||
]
|
||||
}
|
||||
]
|
||||
@@ -207,9 +291,14 @@
|
||||
{
|
||||
"id": "LyricsKeepControlsVisible",
|
||||
"order": 60,
|
||||
"fileNames": ["lyrics-keep-controls-visible.patch"],
|
||||
"fileNames": [
|
||||
"lyrics-keep-controls-visible.patch"
|
||||
],
|
||||
"extensionFiles": [
|
||||
"radiant/LyricsReinitGuard.smali"
|
||||
],
|
||||
"title": "Keep Controls Visible",
|
||||
"description": "Inverts the auto-hide behavior on the lyrics screen, playback controls stay visible by default and only hide when you tap them off.",
|
||||
"description": "Inverts the auto-hide behavior on the lyrics screen, playback controls stay visible by default and only hide when you tap them off. Also stops the open lyrics view from randomly closing when the player re-fetches the same track.",
|
||||
"default": true
|
||||
},
|
||||
{
|
||||
@@ -217,8 +306,13 @@
|
||||
"order": 90,
|
||||
"category": "integration",
|
||||
"pathLocked": true,
|
||||
"fileNames": ["waze-media-browser.patch"],
|
||||
"extensionFiles": ["radiant/WazeInitReceiver.smali", "radiant/WazeServiceConnection.smali"],
|
||||
"fileNames": [
|
||||
"integration-waze-playback.patch"
|
||||
],
|
||||
"extensionFiles": [
|
||||
"radiant/WazeInitReceiver.smali",
|
||||
"radiant/WazeServiceConnection.smali"
|
||||
],
|
||||
"title": "Waze Integration",
|
||||
"description": "Control TIDAL playback from the Waze app",
|
||||
"default": true,
|
||||
@@ -227,7 +321,11 @@
|
||||
"type": "choice",
|
||||
"key": "browse_root",
|
||||
"title": "Media Menu",
|
||||
"entries": ["Auto Menu", "Home", "Recents"],
|
||||
"entries": [
|
||||
"Auto Menu",
|
||||
"Home",
|
||||
"Recents"
|
||||
],
|
||||
"values": [
|
||||
"ROOT_AUTO",
|
||||
"HOME_V2::home_page_v2_id",
|
||||
@@ -248,7 +346,9 @@
|
||||
{
|
||||
"id": "DebugMenuUnlock",
|
||||
"order": 100,
|
||||
"fileNames": ["debug-menu-unlock.patch"],
|
||||
"fileNames": [
|
||||
"debug-menu-unlock.patch"
|
||||
],
|
||||
"title": "Unlock Debug Menu",
|
||||
"description": "Reveals TIDAL's hidden Debug Menu in Settings. (Unlocks Feature Flags & the legacy Debug Options)",
|
||||
"default": false
|
||||
|
||||
@@ -20,61 +20,60 @@
|
||||
.line 71
|
||||
--- a/com/tidal/android/feature/appscaffold/ui/composable/i.smali
|
||||
+++ b/com/tidal/android/feature/appscaffold/ui/composable/i.smali
|
||||
@@ -2756,12 +2756,7 @@
|
||||
invoke-static {v0, v8, v11, v12}, Landroidx/compose/foundation/layout/SizeKt;->fillMaxWidth$default(Landroidx/compose/ui/Modifier;FILjava/lang/Object;)Landroidx/compose/ui/Modifier;
|
||||
@@ -2275,11 +2275,7 @@
|
||||
|
||||
move-result-object v0
|
||||
move-result-object v2
|
||||
|
||||
- .line 143
|
||||
- invoke-static {v2}, Landroidx/compose/foundation/layout/WindowInsetsPadding_androidKt;->navigationBarsPadding(Landroidx/compose/ui/Modifier;)Landroidx/compose/ui/Modifier;
|
||||
-
|
||||
- .line 140
|
||||
- invoke-static {v0}, Landroidx/compose/foundation/layout/WindowInsetsPadding_androidKt;->navigationBarsPadding(Landroidx/compose/ui/Modifier;)Landroidx/compose/ui/Modifier;
|
||||
-
|
||||
- move-result-object v0
|
||||
- move-result-object v2
|
||||
-
|
||||
+ # flush bottom; skip nav inset
|
||||
.line 141
|
||||
invoke-interface/range {v17 .. v17}, Landroidx/compose/runtime/State;->getValue()Ljava/lang/Object;
|
||||
.line 144
|
||||
invoke-interface/range {v21 .. v21}, Landroidx/compose/runtime/State;->getValue()Ljava/lang/Object;
|
||||
|
||||
@@ -2773,6 +2768,8 @@
|
||||
@@ -2291,6 +2287,8 @@
|
||||
|
||||
move-result v10
|
||||
move-result v4
|
||||
|
||||
+ const/4 v10, 0x0 # zero horizontal padding
|
||||
+ const/4 v4, 0x0 # zero horizontal padding
|
||||
+
|
||||
const/4 v11, 0x2
|
||||
const/4 v6, 0x2
|
||||
|
||||
.line 142
|
||||
@@ -2816,6 +2813,12 @@
|
||||
.line 145
|
||||
@@ -2334,6 +2332,12 @@
|
||||
|
||||
move-result-wide v10
|
||||
move-result-wide v3
|
||||
|
||||
+ const v8, -0x1000000 # 0xFF000000 opaque black
|
||||
+ const v5, -0x1000000 # 0xFF000000 opaque black
|
||||
+
|
||||
+ invoke-static {v8}, Landroidx/compose/ui/graphics/ColorKt;->Color(I)J # pack to color long
|
||||
+ invoke-static {v5}, Landroidx/compose/ui/graphics/ColorKt;->Color(I)J # pack to color long
|
||||
+
|
||||
+ move-result-wide v10 # override theme color
|
||||
+ move-result-wide v3 # override theme color
|
||||
+
|
||||
.line 147
|
||||
sget-object v8, Lcom/tidal/android/feature/appscaffold/ui/composable/a;->c:Landroidx/compose/foundation/shape/RoundedCornerShape;
|
||||
.line 150
|
||||
sget-object v5, Lcom/tidal/android/feature/appscaffold/ui/composable/a;->c:Landroidx/compose/foundation/shape/RoundedCornerShape;
|
||||
|
||||
@@ -2857,6 +2860,10 @@
|
||||
@@ -2375,6 +2379,10 @@
|
||||
|
||||
move-result-object v0
|
||||
move-result-object v2
|
||||
|
||||
+ invoke-static {v0}, Landroidx/compose/foundation/layout/WindowInsetsPadding_androidKt;->navigationBarsPadding(Landroidx/compose/ui/Modifier;)Landroidx/compose/ui/Modifier; # inset bar content above nav bar (Prevents Bleeding behind Nav Buttons)
|
||||
+ invoke-static {v2}, Landroidx/compose/foundation/layout/WindowInsetsPadding_androidKt;->navigationBarsPadding(Landroidx/compose/ui/Modifier;)Landroidx/compose/ui/Modifier; # inset bar content above nav bar (Prevents Bleeding behind Nav Buttons)
|
||||
+
|
||||
+ move-result-object v0
|
||||
+ move-result-object v2
|
||||
+
|
||||
.line 155
|
||||
sget-object v8, Landroidx/compose/foundation/layout/Arrangement;->INSTANCE:Landroidx/compose/foundation/layout/Arrangement;
|
||||
.line 158
|
||||
sget-object v3, Landroidx/compose/foundation/layout/Arrangement;->INSTANCE:Landroidx/compose/foundation/layout/Arrangement;
|
||||
|
||||
@@ -2969,6 +2976,10 @@
|
||||
@@ -2487,6 +2495,10 @@
|
||||
|
||||
invoke-static {v12, v0, v8}, Landroidx/compose/runtime/Updater;->set-impl(Landroidx/compose/runtime/Composer;Ljava/lang/Object;Lyl0/p;)V
|
||||
invoke-static {v6, v2, v3}, Landroidx/compose/runtime/Updater;->set-impl(Landroidx/compose/runtime/Composer;Ljava/lang/Object;Lem0/p;)V
|
||||
|
||||
+ const/4 v8, 0x0 # composer $changed flags
|
||||
+
|
||||
+ invoke-static {v15, v8}, Lradiant/MiniSeekerLine;->render(Landroidx/compose/runtime/Composer;I)V # draw top-edge seeker
|
||||
+ invoke-static {v7, v8}, Lradiant/MiniSeekerLine;->render(Landroidx/compose/runtime/Composer;I)V # draw top-edge seeker
|
||||
+
|
||||
.line 172
|
||||
sget-object v0, Landroidx/compose/foundation/layout/ColumnScopeInstance;->INSTANCE:Landroidx/compose/foundation/layout/ColumnScopeInstance;
|
||||
.line 175
|
||||
sget-object v2, Landroidx/compose/foundation/layout/ColumnScopeInstance;->INSTANCE:Landroidx/compose/foundation/layout/ColumnScopeInstance;
|
||||
|
||||
|
||||
@@ -1,33 +1,32 @@
|
||||
--- a/com/tidal/android/feature/appscaffold/ui/composable/i.smali
|
||||
+++ b/com/tidal/android/feature/appscaffold/ui/composable/i.smali
|
||||
@@ -2819,4 +2819,10 @@
|
||||
.line 147
|
||||
+ const/4 v8, 0x0
|
||||
@@ -2334,6 +2334,12 @@
|
||||
|
||||
move-result-wide v3
|
||||
|
||||
+ const/4 v5, 0x0
|
||||
+
|
||||
+ invoke-static {v10, v11, v15, v8}, Lradiant/MiniPlayerBackground;->color(JLandroidx/compose/runtime/Composer;I)J # dynamic bg or fallback
|
||||
+ invoke-static {v3, v4, v7, v5}, Lradiant/MiniPlayerBackground;->color(JLandroidx/compose/runtime/Composer;I)J # dynamic bg or fallback
|
||||
+
|
||||
+ move-result-wide v10
|
||||
+ move-result-wide v3
|
||||
+
|
||||
sget-object v8, Lcom/tidal/android/feature/appscaffold/ui/composable/a;->c:Landroidx/compose/foundation/shape/RoundedCornerShape;
|
||||
.line 150
|
||||
sget-object v5, Lcom/tidal/android/feature/appscaffold/ui/composable/a;->c:Landroidx/compose/foundation/shape/RoundedCornerShape;
|
||||
|
||||
.line 148
|
||||
--- a/com/tidal/android/feature/playerscreen/ui/PlayerViewModel.smali
|
||||
+++ b/com/tidal/android/feature/playerscreen/ui/PlayerViewModel.smali
|
||||
@@ -1047,9 +1047,13 @@
|
||||
invoke-static {v2, v1, v4, v3}, Lkotlinx/coroutines/flow/FlowKt;->stateIn(Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/CoroutineScope;Lkotlinx/coroutines/flow/SharingStarted;Ljava/lang/Object;)Lkotlinx/coroutines/flow/StateFlow;
|
||||
@@ -1063,6 +1063,10 @@
|
||||
|
||||
move-result-object v1
|
||||
iput-object v1, v0, Lcom/tidal/android/feature/playerscreen/ui/PlayerViewModel;->V:Lkotlinx/coroutines/flow/StateFlow;
|
||||
|
||||
iput-object v1, v0, Lcom/tidal/android/feature/playerscreen/ui/PlayerViewModel;->U:Lkotlinx/coroutines/flow/StateFlow;
|
||||
|
||||
+ iget-object v1, v0, Lcom/tidal/android/feature/playerscreen/ui/PlayerViewModel;->O:Lkotlin/h;
|
||||
+ iget-object v1, v0, Lcom/tidal/android/feature/playerscreen/ui/PlayerViewModel;->P:Lkotlin/i;
|
||||
+
|
||||
+ invoke-interface {v1}, Lkotlin/h;->getValue()Ljava/lang/Object; # init player bg color
|
||||
+ invoke-interface {v1}, Lkotlin/i;->getValue()Ljava/lang/Object; # init player bg color
|
||||
+
|
||||
return-void
|
||||
.end method
|
||||
|
||||
@@ -1607,6 +1611,8 @@
|
||||
@@ -1620,6 +1624,8 @@
|
||||
:goto_6
|
||||
invoke-interface {v9, v10}, Lkotlinx/coroutines/flow/MutableStateFlow;->setValue(Ljava/lang/Object;)V
|
||||
|
||||
@@ -36,7 +35,7 @@
|
||||
.line 263
|
||||
.line 264
|
||||
.line 265
|
||||
@@ -2306,6 +2312,8 @@
|
||||
@@ -2319,6 +2325,8 @@
|
||||
.line 598
|
||||
invoke-interface {v1, v5}, Lkotlinx/coroutines/flow/MutableStateFlow;->setValue(Ljava/lang/Object;)V
|
||||
|
||||
@@ -45,7 +44,7 @@
|
||||
.line 599
|
||||
.line 600
|
||||
.line 601
|
||||
@@ -2523,6 +2531,8 @@
|
||||
@@ -2536,6 +2544,8 @@
|
||||
.line 704
|
||||
invoke-interface {v1, v5}, Lkotlinx/coroutines/flow/MutableStateFlow;->setValue(Ljava/lang/Object;)V
|
||||
|
||||
|
||||
@@ -1,15 +1,15 @@
|
||||
--- a/com/tidal/android/feature/appscaffold/ui/composable/i.smali
|
||||
+++ b/com/tidal/android/feature/appscaffold/ui/composable/i.smali
|
||||
@@ -2829,6 +2829,12 @@
|
||||
@@ -2347,6 +2347,12 @@
|
||||
|
||||
move-result-object v0
|
||||
move-result-object v2
|
||||
|
||||
+ sget-object v8, Lradiant/MiniSeekerFloating;->INSTANCE:Lradiant/MiniSeekerFloating; # draw lambda
|
||||
+ sget-object v5, Lradiant/MiniSeekerFloating;->INSTANCE:Lradiant/MiniSeekerFloating; # draw lambda
|
||||
+
|
||||
+ invoke-static {v0, v8}, Landroidx/compose/ui/draw/DrawModifierKt;->drawWithContent(Landroidx/compose/ui/Modifier;Lyl0/l;)Landroidx/compose/ui/Modifier; # overlay perimeter stroke
|
||||
+ invoke-static {v2, v5}, Landroidx/compose/ui/draw/DrawModifierKt;->drawWithContent(Landroidx/compose/ui/Modifier;Lem0/l;)Landroidx/compose/ui/Modifier; # overlay perimeter stroke
|
||||
+
|
||||
+ move-result-object v0 # updated modifier
|
||||
+ move-result-object v2 # updated modifier
|
||||
+
|
||||
.line 150
|
||||
sget-object v8, Lkotlin/u;->a:Lkotlin/u;
|
||||
.line 153
|
||||
sget-object v3, Lkotlin/v;->a:Lkotlin/v;
|
||||
|
||||
|
||||
@@ -1,40 +1,50 @@
|
||||
--- a/com/tidal/android/feature/appscaffold/ui/composable/MiniPlayerKt.smali
|
||||
+++ b/com/tidal/android/feature/appscaffold/ui/composable/MiniPlayerKt.smali
|
||||
@@ -1768,3 +1768,7 @@
|
||||
@@ -1215,6 +1215,10 @@
|
||||
|
||||
move-result-object v6
|
||||
-
|
||||
+
|
||||
+ invoke-static {v6, v1}, Lradiant/MiniPlayerTrackGestures;->trackModifier(Landroidx/compose/ui/Modifier;Lyl0/l;)Landroidx/compose/ui/Modifier; # attach horizontal swipe listener
|
||||
|
||||
+ invoke-static {v6, v1}, Lradiant/MiniPlayerTrackGestures;->trackModifier(Landroidx/compose/ui/Modifier;Lem0/l;)Landroidx/compose/ui/Modifier; # attach horizontal swipe listener
|
||||
+
|
||||
+ move-result-object v6
|
||||
+
|
||||
.line 38
|
||||
@@ -1884,5 +1888,5 @@
|
||||
sget-object v21, Landroidx/compose/ui/Alignment;->Companion:Landroidx/compose/ui/Alignment$Companion;
|
||||
|
||||
@@ -1352,6 +1356,8 @@
|
||||
.line 56
|
||||
iget-object v6, v0, Lcom/tidal/android/feature/appscaffold/ui/s;->b:Lcom/tidal/android/feature/appscaffold/ui/p;
|
||||
-
|
||||
iget-object v6, v0, Lcom/tidal/android/feature/appscaffold/ui/u;->b:Lcom/tidal/android/feature/appscaffold/ui/r;
|
||||
|
||||
+ invoke-static {v6}, Lradiant/MiniPlayerTrackGestures;->onRenderedItem(Ljava/lang/Object;)V # reset stale drag offset if track metadata changes mid-gesture
|
||||
+
|
||||
.line 57
|
||||
invoke-virtual/range {v16 .. v16}, Lcom/squareup/ui/market/core/theme/MarketStylesheet;->getBorderRadii()Lcom/squareup/ui/market/core/theme/MarketStylesheet$b;
|
||||
@@ -1919,5 +1923,6 @@
|
||||
invoke-static {v5, v4}, Landroidx/compose/foundation/layout/SizeKt;->size-3ABfNKs(Landroidx/compose/ui/Modifier;F)Landroidx/compose/ui/Modifier;
|
||||
-
|
||||
|
||||
@@ -1388,6 +1394,10 @@
|
||||
|
||||
move-result-object v4
|
||||
-
|
||||
|
||||
+ invoke-static {v4}, Lradiant/MiniPlayerTrackGestures;->feedbackModifier(Landroidx/compose/ui/Modifier;)Landroidx/compose/ui/Modifier; # move the whole cover container with horizontal swipe
|
||||
+
|
||||
+ move-result-object v4
|
||||
+
|
||||
.line 63
|
||||
@@ -2032,3 +2038,5 @@
|
||||
invoke-virtual/range {v22 .. v22}, Lcom/squareup/ui/market/core/theme/MarketStylesheet$c;->p0()Lg20/a;
|
||||
|
||||
@@ -1499,6 +1509,10 @@
|
||||
|
||||
move-result-object v4
|
||||
-
|
||||
|
||||
+ invoke-static {v4}, Lradiant/MiniPlayerTrackGestures;->textFeedbackModifier(Landroidx/compose/ui/Modifier;)Landroidx/compose/ui/Modifier; # move title/artist
|
||||
+
|
||||
+ move-result-object v4
|
||||
+
|
||||
.line 72
|
||||
invoke-virtual/range {v31 .. v31}, Landroidx/compose/foundation/layout/Arrangement;->getTop()Landroidx/compose/foundation/layout/Arrangement$Vertical;
|
||||
|
||||
--- a/com/tidal/android/feature/appscaffold/ui/MiniPlayerViewModel.smali
|
||||
+++ b/com/tidal/android/feature/appscaffold/ui/MiniPlayerViewModel.smali
|
||||
@@ -816,10 +816,10 @@
|
||||
@@ -595,10 +595,10 @@
|
||||
.line 111
|
||||
.line 112
|
||||
.line 113
|
||||
@@ -47,21 +57,19 @@
|
||||
|
||||
.line 115
|
||||
.line 116
|
||||
@@ -997,11 +997,32 @@
|
||||
:cond_e
|
||||
return-void
|
||||
@@ -778,6 +778,28 @@
|
||||
|
||||
- .line 195
|
||||
.line 195
|
||||
:cond_f
|
||||
+ sget-object v0, Lcom/tidal/android/feature/appscaffold/ui/q$c;->a:Lcom/tidal/android/feature/appscaffold/ui/q$c;
|
||||
+ sget-object v0, Lcom/tidal/android/feature/appscaffold/ui/s$c;->a:Lcom/tidal/android/feature/appscaffold/ui/s$c; # our synthetic previous-track event
|
||||
+
|
||||
+ invoke-virtual {p1, v0}, Ljava/lang/Object;->equals(Ljava/lang/Object;)Z
|
||||
+ invoke-virtual {p1, v0}, Ljava/lang/Object;->equals(Ljava/lang/Object;)Z # is this the swipe-previous event?
|
||||
+
|
||||
+ move-result p1
|
||||
+
|
||||
+ if-eqz p1, :unknown_event
|
||||
+
|
||||
+ invoke-interface {v3}, Lei/e;->canSkipToPreviousOrRewind()Z
|
||||
+ invoke-interface {v3}, Ldi/e;->canSkipToPreviousOrRewind()Z
|
||||
+
|
||||
+ move-result p1
|
||||
+
|
||||
@@ -69,36 +77,32 @@
|
||||
+
|
||||
+ const/4 p1, 0x0
|
||||
+
|
||||
+ invoke-interface {v3, p1}, Lei/e;->h(Z)V # false = previous/rewind
|
||||
+ invoke-interface {v3, p1}, Ldi/e;->h(Z)V # false = previous/rewind
|
||||
+
|
||||
+ :previous_done
|
||||
+ return-void
|
||||
+
|
||||
+ :unknown_event
|
||||
invoke-static {}, Landroidx/compose/ui/graphics/y;->b()V
|
||||
invoke-static {}, Lcoil/util/i;->a()V
|
||||
|
||||
.line 196
|
||||
.line 197
|
||||
.line 198
|
||||
return-void
|
||||
--- a/com/tidal/android/feature/appscaffold/ui/composable/e.smali
|
||||
+++ b/com/tidal/android/feature/appscaffold/ui/composable/e.smali
|
||||
@@ -75,6 +75,18 @@
|
||||
.line 22
|
||||
--- a/com/aspiro/wamp/util/m.smali
|
||||
+++ b/com/aspiro/wamp/util/m.smali
|
||||
@@ -61,6 +61,17 @@
|
||||
|
||||
.line 15
|
||||
:pswitch_0
|
||||
+ invoke-static {}, Lradiant/MiniPlayerTrackGestures;->consumeTapOpenSuppression()Z # prevent tap open after horizontal swipe
|
||||
+ invoke-static {}, Lradiant/MiniPlayerTrackGestures;->consumeTapOpenSuppression()Z # skip open-player if a horizontal skip-swipe just happened
|
||||
+
|
||||
+ move-result v0
|
||||
+
|
||||
+ if-eqz v0, :continue_open
|
||||
+ if-eqz v0, :rl_continue_open
|
||||
+
|
||||
+ sget-object v0, Lkotlin/u;->a:Lkotlin/u;
|
||||
+ sget-object v0, Lkotlin/v;->a:Lkotlin/v;
|
||||
+
|
||||
+ return-object v0
|
||||
+
|
||||
+ :continue_open
|
||||
+
|
||||
iget-object v0, p0, Lcom/tidal/android/feature/appscaffold/ui/composable/e;->b:Ljava/lang/Object;
|
||||
+ :rl_continue_open
|
||||
iget-object v0, p0, Lcom/aspiro/wamp/util/m;->b:Ljava/lang/Object;
|
||||
|
||||
.line 23
|
||||
.line 24
|
||||
.line 16
|
||||
|
||||
@@ -1,39 +1,32 @@
|
||||
# rl-locals: com/tidal/android/feature/appscaffold/ui/composable/i.smali b( 52
|
||||
--- a/com/tidal/android/feature/appscaffold/ui/composable/i.smali
|
||||
+++ b/com/tidal/android/feature/appscaffold/ui/composable/i.smali
|
||||
@@ -2427,6 +2427,12 @@
|
||||
move-object/from16 v16, v9
|
||||
@@ -1691,6 +1691,14 @@
|
||||
|
||||
.line 99
|
||||
+ move-object/from16 v9, v25 # SheetState
|
||||
+
|
||||
+ invoke-static {v5, v6, v9}, Lradiant/MiniPlayerGestures;->rootModifier(Landroidx/compose/ui/Modifier;Lyl0/l;Landroidx/compose/material3/SheetState;)Landroidx/compose/ui/Modifier; # continue drag after player recomposition
|
||||
+
|
||||
+ move-result-object v5
|
||||
+
|
||||
invoke-static {v15, v5}, Landroidx/compose/ui/ComposedModifierKt;->materializeModifier(Landroidx/compose/runtime/Composer;Landroidx/compose/ui/Modifier;)Landroidx/compose/ui/Modifier;
|
||||
move-result-object v24
|
||||
|
||||
move-result-object v9
|
||||
@@ -2832,2 +2838,8 @@
|
||||
+ move-object/from16 v8, v25 # SheetState from AppScaffold
|
||||
+ move-object/from16 v49, p5 # gesture expand lambda (AppScaffold Function1 param)
|
||||
+
|
||||
+ const/4 v10, __RL_MINI_PLAYER_SWIPE_UP_DRAG__ # Enable Drag option
|
||||
+ move-object/from16 v50, v24 # SheetState
|
||||
+
|
||||
+ invoke-static {v6, v8, v10}, Lradiant/MiniPlayerGestures;->configure(Lyl0/l;Landroidx/compose/material3/SheetState;Z)V
|
||||
+ const/16 v51, __RL_MINI_PLAYER_SWIPE_UP_DRAG__ # Enable Drag option
|
||||
+
|
||||
.line 150
|
||||
sget-object v8, Lkotlin/u;->a:Lkotlin/u;
|
||||
+ invoke-static/range {v49 .. v51}, Lradiant/MiniPlayerGestures;->configure(Lem0/l;Landroidx/compose/material3/SheetState;Z)V # wire swipe-up to expand the sheet
|
||||
+
|
||||
.line 69
|
||||
invoke-static {}, Landroidx/compose/ui/platform/CompositionLocalsKt;->getLocalDensity()Landroidx/compose/runtime/ProvidableCompositionLocal;
|
||||
|
||||
--- a/com/tidal/android/feature/appscaffold/ui/composable/MiniPlayerKt.smali
|
||||
+++ b/com/tidal/android/feature/appscaffold/ui/composable/MiniPlayerKt.smali
|
||||
@@ -1243,5 +1243,21 @@
|
||||
invoke-virtual {v0}, Ljava/lang/Object;->getClass()Ljava/lang/Class;
|
||||
@@ -712,6 +712,22 @@
|
||||
|
||||
iget-object v3, v0, Lcom/tidal/android/feature/appscaffold/ui/s;->c:Lcom/tidal/android/feature/appscaffold/ui/MiniPlayerContract$PlayState;
|
||||
iget-object v3, v0, Lcom/tidal/android/feature/appscaffold/ui/u;->c:Lcom/tidal/android/feature/appscaffold/ui/MiniPlayerContract$PlayState;
|
||||
|
||||
+ iget-object v5, v0, Lcom/tidal/android/feature/appscaffold/ui/u;->a:Lcom/tidal/android/feature/appscaffold/ui/MiniPlayerContract$ItemType; # currently rendered mini player media type
|
||||
+
|
||||
+ iget-object v5, v0, Lcom/tidal/android/feature/appscaffold/ui/s;->a:Lcom/tidal/android/feature/appscaffold/ui/MiniPlayerContract$ItemType; # currently rendered mini player media type
|
||||
+ sget-object v6, Lcom/tidal/android/feature/appscaffold/ui/MiniPlayerContract$ItemType;->Unknown:Lcom/tidal/android/feature/appscaffold/ui/MiniPlayerContract$ItemType; # Unknown = no media playing
|
||||
+
|
||||
+ sget-object v6, Lcom/tidal/android/feature/appscaffold/ui/MiniPlayerContract$ItemType;->Unknown:Lcom/tidal/android/feature/appscaffold/ui/MiniPlayerContract$ItemType; # Unknown = no media playing. other media types : Track, Video.
|
||||
+
|
||||
+ if-ne v5, v6, :rl_has_media # used to prevent swipe up when nothing is playing
|
||||
+ if-ne v5, v6, :rl_has_media # prevent swipe up when nothing playing
|
||||
+
|
||||
+ const/4 v5, 0x0
|
||||
+
|
||||
@@ -44,69 +37,89 @@
|
||||
+
|
||||
+ :rl_set_media
|
||||
+ invoke-static {v5}, Lradiant/MiniPlayerGestures;->setHasMiniPlayerMedia(Z)V
|
||||
-
|
||||
+
|
||||
invoke-virtual {v1}, Ljava/lang/Object;->getClass()Ljava/lang/Class;
|
||||
@@ -1750,2 +1766,6 @@
|
||||
|
||||
const v4, -0x571456a1
|
||||
@@ -1215,6 +1231,10 @@
|
||||
|
||||
move-result-object v6
|
||||
|
||||
+ invoke-static {v6}, Lradiant/MiniPlayerGestures;->trackAreaModifier(Landroidx/compose/ui/Modifier;)Landroidx/compose/ui/Modifier; # attach swipe up listener
|
||||
+
|
||||
+ move-result-object v6
|
||||
+
|
||||
.line 38
|
||||
sget-object v21, Landroidx/compose/ui/Alignment;->Companion:Landroidx/compose/ui/Alignment$Companion;
|
||||
@@ -1923,2 +1943,6 @@
|
||||
|
||||
@@ -1388,6 +1408,10 @@
|
||||
|
||||
move-result-object v4
|
||||
|
||||
+ invoke-static {v4}, Lradiant/MiniPlayerGestures;->feedbackModifier(Landroidx/compose/ui/Modifier;)Landroidx/compose/ui/Modifier; # move cover (swipe up feedback)
|
||||
+
|
||||
+ move-result-object v4
|
||||
+
|
||||
.line 63
|
||||
invoke-virtual/range {v22 .. v22}, Lcom/squareup/ui/market/core/theme/MarketStylesheet$c;->p0()Lc20/a;
|
||||
@@ -2034,2 +2058,6 @@
|
||||
invoke-virtual/range {v22 .. v22}, Lcom/squareup/ui/market/core/theme/MarketStylesheet$c;->p0()Lg20/a;
|
||||
|
||||
@@ -1499,6 +1523,10 @@
|
||||
|
||||
move-result-object v4
|
||||
|
||||
+ invoke-static {v4}, Lradiant/MiniPlayerGestures;->feedbackModifier(Landroidx/compose/ui/Modifier;)Landroidx/compose/ui/Modifier; # move title/artist (swipe up feedback)
|
||||
+
|
||||
+ move-result-object v4
|
||||
+
|
||||
.line 72
|
||||
invoke-virtual/range {p2 .. p2}, Landroidx/compose/foundation/layout/Arrangement;->getTop()Landroidx/compose/foundation/layout/Arrangement$Vertical;
|
||||
invoke-virtual/range {v31 .. v31}, Landroidx/compose/foundation/layout/Arrangement;->getTop()Landroidx/compose/foundation/layout/Arrangement$Vertical;
|
||||
|
||||
--- a/androidx/compose/material3/ModalBottomSheetKt$ModalBottomSheet$4$1.smali
|
||||
+++ b/androidx/compose/material3/ModalBottomSheetKt$ModalBottomSheet$4$1.smali
|
||||
@@ -210,8 +210,10 @@
|
||||
.line 22
|
||||
.line 23
|
||||
@@ -212,6 +212,12 @@
|
||||
.line 24
|
||||
iget-object p1, p0, Landroidx/compose/material3/ModalBottomSheetKt$ModalBottomSheet$4$1;->$sheetState:Landroidx/compose/material3/SheetState;
|
||||
-
|
||||
|
||||
+ invoke-static {p1}, Lradiant/MiniPlayerGestures;->suppressAutoShow(Landroidx/compose/material3/SheetState;)Z # avoid Material3 show() taking over manual drag
|
||||
+
|
||||
+ move-result v1
|
||||
+
|
||||
+ if-nez v1, :skip_show
|
||||
+
|
||||
.line 25
|
||||
.line 26
|
||||
iput v2, p0, Landroidx/compose/material3/ModalBottomSheetKt$ModalBottomSheet$4$1;->label:I
|
||||
@@ -231,7 +233,7 @@
|
||||
.line 33
|
||||
@@ -232,6 +238,7 @@
|
||||
.line 34
|
||||
return-object v0
|
||||
-
|
||||
|
||||
+ :skip_show
|
||||
.line 35
|
||||
:cond_2
|
||||
:goto_0
|
||||
--- a/androidx/compose/material3/ModalBottomSheetKt.smali
|
||||
+++ b/androidx/compose/material3/ModalBottomSheetKt.smali
|
||||
@@ -1370,3 +1370,6 @@
|
||||
@@ -1291,6 +1291,12 @@
|
||||
|
||||
.line 34
|
||||
:cond_47
|
||||
+ move-object v14, v12
|
||||
+ check-cast v14, Lyl0/l;
|
||||
+ invoke-static {v13, v14}, Lradiant/MiniPlayerGestures;->setSettleCallback(Landroidx/compose/material3/SheetState;Lyl0/l;)V # reuse native settle animation on release
|
||||
+ move-object v14, v12 # settle callback
|
||||
+
|
||||
+ check-cast v14, Lem0/l; # to Function1
|
||||
+
|
||||
+ invoke-static {v13, v14}, Lradiant/MiniPlayerGestures;->setSettleCallback(Landroidx/compose/material3/SheetState;Lem0/l;)V # reuse native settle animation on release
|
||||
+
|
||||
move-object/from16 v32, v12
|
||||
|
||||
check-cast v32, Lem0/l;
|
||||
--- a/androidx/compose/material3/SheetDefaultsKt.smali
|
||||
+++ b/androidx/compose/material3/SheetDefaultsKt.smali
|
||||
@@ -100,6 +100,5 @@
|
||||
@@ -98,7 +98,7 @@
|
||||
const/4 v2, 0x0
|
||||
|
||||
.line 16
|
||||
- const/16 v3, 0x12c
|
||||
-
|
||||
+ const/16 v3, 0x64 # 100ms
|
||||
|
||||
.line 17
|
||||
.line 18
|
||||
const/4 v4, 0x0
|
||||
|
||||
@@ -20,48 +20,47 @@
|
||||
.line 71
|
||||
--- a/com/tidal/android/feature/appscaffold/ui/composable/i.smali
|
||||
+++ b/com/tidal/android/feature/appscaffold/ui/composable/i.smali
|
||||
@@ -2756,12 +2756,7 @@
|
||||
invoke-static {v0, v8, v11, v12}, Landroidx/compose/foundation/layout/SizeKt;->fillMaxWidth$default(Landroidx/compose/ui/Modifier;FILjava/lang/Object;)Landroidx/compose/ui/Modifier;
|
||||
@@ -2275,11 +2275,7 @@
|
||||
|
||||
move-result-object v0
|
||||
move-result-object v2
|
||||
|
||||
- .line 143
|
||||
- invoke-static {v2}, Landroidx/compose/foundation/layout/WindowInsetsPadding_androidKt;->navigationBarsPadding(Landroidx/compose/ui/Modifier;)Landroidx/compose/ui/Modifier;
|
||||
-
|
||||
- .line 140
|
||||
- invoke-static {v0}, Landroidx/compose/foundation/layout/WindowInsetsPadding_androidKt;->navigationBarsPadding(Landroidx/compose/ui/Modifier;)Landroidx/compose/ui/Modifier;
|
||||
-
|
||||
- move-result-object v0
|
||||
- move-result-object v2
|
||||
-
|
||||
+ # flush bottom; skip nav inset
|
||||
.line 141
|
||||
invoke-interface/range {v17 .. v17}, Landroidx/compose/runtime/State;->getValue()Ljava/lang/Object;
|
||||
.line 144
|
||||
invoke-interface/range {v21 .. v21}, Landroidx/compose/runtime/State;->getValue()Ljava/lang/Object;
|
||||
|
||||
@@ -2773,6 +2768,8 @@
|
||||
@@ -2291,6 +2287,8 @@
|
||||
|
||||
move-result v10
|
||||
move-result v4
|
||||
|
||||
+ const/4 v10, 0x0 # zero horizontal padding
|
||||
+ const/4 v4, 0x0 # zero horizontal padding
|
||||
+
|
||||
const/4 v11, 0x2
|
||||
const/4 v6, 0x2
|
||||
|
||||
.line 142
|
||||
@@ -2857,6 +2854,10 @@
|
||||
.line 145
|
||||
@@ -2375,6 +2373,10 @@
|
||||
|
||||
move-result-object v0
|
||||
move-result-object v2
|
||||
|
||||
+ invoke-static {v0}, Landroidx/compose/foundation/layout/WindowInsetsPadding_androidKt;->navigationBarsPadding(Landroidx/compose/ui/Modifier;)Landroidx/compose/ui/Modifier; # inset bar content above nav bar (Prevents Bleeding behind Nav Buttons)
|
||||
+ invoke-static {v2}, Landroidx/compose/foundation/layout/WindowInsetsPadding_androidKt;->navigationBarsPadding(Landroidx/compose/ui/Modifier;)Landroidx/compose/ui/Modifier; # inset bar content above nav bar (Prevents Bleeding behind Nav Buttons)
|
||||
+
|
||||
+ move-result-object v0
|
||||
+ move-result-object v2
|
||||
+
|
||||
.line 155
|
||||
sget-object v8, Landroidx/compose/foundation/layout/Arrangement;->INSTANCE:Landroidx/compose/foundation/layout/Arrangement;
|
||||
.line 158
|
||||
sget-object v3, Landroidx/compose/foundation/layout/Arrangement;->INSTANCE:Landroidx/compose/foundation/layout/Arrangement;
|
||||
|
||||
@@ -2969,6 +2970,10 @@
|
||||
@@ -2487,6 +2489,10 @@
|
||||
|
||||
invoke-static {v12, v0, v8}, Landroidx/compose/runtime/Updater;->set-impl(Landroidx/compose/runtime/Composer;Ljava/lang/Object;Lyl0/p;)V
|
||||
invoke-static {v6, v2, v3}, Landroidx/compose/runtime/Updater;->set-impl(Landroidx/compose/runtime/Composer;Ljava/lang/Object;Lem0/p;)V
|
||||
|
||||
+ const/4 v8, 0x0 # composer $changed flags
|
||||
+
|
||||
+ invoke-static {v15, v8}, Lradiant/MiniSeekerLine;->render(Landroidx/compose/runtime/Composer;I)V # draw top-edge seeker
|
||||
+ invoke-static {v7, v8}, Lradiant/MiniSeekerLine;->render(Landroidx/compose/runtime/Composer;I)V # draw top-edge seeker
|
||||
+
|
||||
.line 172
|
||||
sget-object v0, Landroidx/compose/foundation/layout/ColumnScopeInstance;->INSTANCE:Landroidx/compose/foundation/layout/ColumnScopeInstance;
|
||||
.line 175
|
||||
sget-object v2, Landroidx/compose/foundation/layout/ColumnScopeInstance;->INSTANCE:Landroidx/compose/foundation/layout/ColumnScopeInstance;
|
||||
|
||||
|
||||
@@ -1,19 +1,21 @@
|
||||
# rl-locals: com/tidal/android/feature/playerscreen/ui/PlayerScreenKt.smali e( 71
|
||||
--- a/com/tidal/android/feature/playerscreen/ui/PlayerScreenKt.smali
|
||||
+++ b/com/tidal/android/feature/playerscreen/ui/PlayerScreenKt.smali
|
||||
@@ -4172,6 +4172,148 @@
|
||||
@@ -4221,6 +4221,153 @@
|
||||
|
||||
invoke-static {v5, v3, v4}, Landroidx/compose/runtime/Updater;->set-impl(Landroidx/compose/runtime/Composer;Ljava/lang/Object;Lyl0/p;)V
|
||||
invoke-static {v6, v3, v4}, Landroidx/compose/runtime/Updater;->set-impl(Landroidx/compose/runtime/Composer;Ljava/lang/Object;Lem0/p;)V
|
||||
|
||||
+ const v3, 0x52414449 # slot table key
|
||||
+ move-object/from16 v57, v6 # capture live composer into free reg
|
||||
+
|
||||
+ invoke-interface {v10, v3}, Landroidx/compose/runtime/Composer;->startReplaceGroup(I)V # open group
|
||||
+ const v58, 0x52414449 # slot table key
|
||||
+
|
||||
+ invoke-interface/range {v57 .. v58}, Landroidx/compose/runtime/Composer;->startReplaceGroup(I)V # open group
|
||||
+
|
||||
+ move-object/from16 v3, p3 # player state
|
||||
+
|
||||
+ iget-object v3, v3, Lcom/tidal/android/feature/playerscreen/ui/r$a;->c:Lcom/tidal/android/feature/playerscreen/ui/d; # cover pager
|
||||
+ iget-object v3, v3, Lcom/tidal/android/feature/playerscreen/ui/s$a;->c:Lcom/tidal/android/feature/playerscreen/ui/d; # cover pager
|
||||
+
|
||||
+ iget-object v4, v3, Lcom/tidal/android/feature/playerscreen/ui/d;->a:Ltn0/b; # item list
|
||||
+ iget-object v4, v3, Lcom/tidal/android/feature/playerscreen/ui/d;->a:Lzn0/b; # item list
|
||||
+
|
||||
+ iget v5, v3, Lcom/tidal/android/feature/playerscreen/ui/d;->b:I # current index
|
||||
+
|
||||
@@ -53,10 +55,9 @@
|
||||
+ iget-object v4, v4, Lcom/tidal/android/feature/playerscreen/ui/c$b;->c:Ljava/lang/String; # still cover uuid (blur this)
|
||||
+
|
||||
+ :radiant_have_cover # v5 = album id, v4 = cover uuid
|
||||
+ new-instance v6, Lcom/tidal/android/feature/playerscreen/ui/composables/o0; # cover request lambda
|
||||
+
|
||||
+ new-instance v6, Lcom/tidal/android/feature/playerscreen/ui/composables/n0; # cover request lambda
|
||||
+
|
||||
+ invoke-direct {v6, v5, v4}, Lcom/tidal/android/feature/playerscreen/ui/composables/n0;-><init>(ILjava/lang/String;)V # build request
|
||||
+ invoke-direct {v6, v5, v4}, Lcom/tidal/android/feature/playerscreen/ui/composables/o0;-><init>(ILjava/lang/String;)V # build request
|
||||
+
|
||||
+ sget-object v5, Landroidx/compose/ui/Modifier;->Companion:Landroidx/compose/ui/Modifier$Companion; # base modifier
|
||||
+
|
||||
@@ -106,13 +107,13 @@
|
||||
+
|
||||
+ const/16 v67, 0x0 # null onError
|
||||
+
|
||||
+ move-object/from16 v68, v10 # composer
|
||||
+ move-object/from16 v68, v57 # composer
|
||||
+
|
||||
+ const/16 v69, 0x0 # changed flags
|
||||
+
|
||||
+ const/16 v70, 0x48 # default mask
|
||||
+
|
||||
+ invoke-static/range {v61 .. v70}, Lxd0/f;->a(Lyl0/l;Ljava/lang/String;Landroidx/compose/ui/Modifier;Landroidx/compose/ui/graphics/ColorFilter;Landroidx/compose/ui/layout/ContentScale;Ljava/lang/Object;Lyl0/a;Landroidx/compose/runtime/Composer;II)V # render blurred cover
|
||||
+ invoke-static/range {v61 .. v70}, Lee0/e;->a(Lem0/l;Ljava/lang/String;Landroidx/compose/ui/Modifier;Landroidx/compose/ui/graphics/ColorFilter;Landroidx/compose/ui/layout/ContentScale;Ljava/lang/Object;Lem0/a;Landroidx/compose/runtime/Composer;II)V # render blurred cover
|
||||
+
|
||||
+ sget-object v3, Landroidx/compose/ui/Modifier;->Companion:Landroidx/compose/ui/Modifier$Companion; # scrim chain start
|
||||
+
|
||||
@@ -140,13 +141,17 @@
|
||||
+
|
||||
+ move-result-object v3 # tinted modifier
|
||||
+
|
||||
+ const/4 v4, 0x0 # changed flags
|
||||
+ move-object/from16 v58, v3 # scrim modifier
|
||||
+
|
||||
+ invoke-static {v3, v10, v4}, Landroidx/compose/foundation/layout/SpacerKt;->Spacer(Landroidx/compose/ui/Modifier;Landroidx/compose/runtime/Composer;I)V # draw scrim
|
||||
+ move-object/from16 v59, v57 # composer
|
||||
+
|
||||
+ const/16 v60, 0x0 # changed flags
|
||||
+
|
||||
+ invoke-static/range {v58 .. v60}, Landroidx/compose/foundation/layout/SpacerKt;->Spacer(Landroidx/compose/ui/Modifier;Landroidx/compose/runtime/Composer;I)V # draw scrim
|
||||
+
|
||||
+ :radiant_skip # skip target
|
||||
+ invoke-interface {v10}, Landroidx/compose/runtime/Composer;->endReplaceGroup()V # close group
|
||||
+ invoke-interface/range {v57 .. v57}, Landroidx/compose/runtime/Composer;->endReplaceGroup()V # close group
|
||||
+
|
||||
.line 138
|
||||
.line 142
|
||||
sget-object v3, Landroidx/compose/foundation/layout/BoxScopeInstance;->INSTANCE:Landroidx/compose/foundation/layout/BoxScopeInstance;
|
||||
|
||||
|
||||
@@ -1,24 +1,24 @@
|
||||
--- a/com/tidal/android/feature/playerscreen/ui/composables/c1.smali
|
||||
+++ b/com/tidal/android/feature/playerscreen/ui/composables/c1.smali
|
||||
@@ -259,7 +259,7 @@
|
||||
--- a/com/tidal/android/feature/playerscreen/ui/composables/z0.smali
|
||||
+++ b/com/tidal/android/feature/playerscreen/ui/composables/z0.smali
|
||||
@@ -91,7 +91,7 @@
|
||||
|
||||
.line 109
|
||||
.line 110
|
||||
.line 32
|
||||
.line 33
|
||||
- sget p2, Lcom/tidal/android/feature/playerscreen/ui/R$drawable;->ic_circle_checked:I
|
||||
+ sget p2, Lcom/tidal/android/feature/playerscreen/ui/R$drawable;->ic_shapes_heart_filled_medium:I # favorited: filled heart (was circle-check)
|
||||
|
||||
.line 111
|
||||
.line 112
|
||||
@@ -267,11 +267,7 @@
|
||||
.line 34
|
||||
.line 35
|
||||
@@ -99,11 +99,7 @@
|
||||
|
||||
.line 113
|
||||
:cond_5
|
||||
- sget-object p2, Lx20/b;->O:Lx20/a;
|
||||
.line 36
|
||||
:cond_1
|
||||
- sget-object p2, Lb30/b;->O:Lb30/a;
|
||||
-
|
||||
- .line 114
|
||||
- .line 115
|
||||
- iget p2, p2, Lx20/a;->a:I
|
||||
- .line 37
|
||||
- .line 38
|
||||
- iget p2, p2, Lb30/a;->a:I
|
||||
+ sget p2, Lcom/tidal/android/feature/playerscreen/ui/R$drawable;->ic_shapes_heart_medium:I # not favorited: outline heart (was market plus)
|
||||
|
||||
.line 116
|
||||
.line 117
|
||||
.line 39
|
||||
.line 40
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
--- a/com/tidal/android/feature/playerscreen/ui/PlayerScreenKt.smali
|
||||
+++ b/com/tidal/android/feature/playerscreen/ui/PlayerScreenKt.smali
|
||||
@@ -5794,6 +5794,8 @@
|
||||
.line 336
|
||||
iget-object v3, v10, Lcom/tidal/android/feature/playerscreen/ui/s$a;->l:Lcom/tidal/android/feature/playerscreen/ui/p;
|
||||
|
||||
+ const/4 v3, 0x0 # Never show the "Playing from" source at the bottom (relocated above the title, or hidden when off)
|
||||
+
|
||||
if-nez v3, :cond_52
|
||||
|
||||
const v3, 0x26ba353b
|
||||
@@ -0,0 +1,66 @@
|
||||
# rl-locals: com/tidal/android/feature/playerscreen/ui/composables/k2.smali a( 42
|
||||
--- a/com/tidal/android/feature/playerscreen/ui/PlayerScreenKt.smali
|
||||
+++ b/com/tidal/android/feature/playerscreen/ui/PlayerScreenKt.smali
|
||||
@@ -5023,6 +5023,20 @@
|
||||
|
||||
.line 233
|
||||
:goto_1d
|
||||
+ iget-object v0, v3, Lcom/tidal/android/feature/playerscreen/ui/s$a;->l:Lcom/tidal/android/feature/playerscreen/ui/p; # RL move-playing-from: SourceLabel — published in BOTH cover & lyrics view (may be null)
|
||||
+
|
||||
+ if-eqz v0, :rl_pf_null # no source -> clear
|
||||
+
|
||||
+ iget-object v0, v0, Lcom/tidal/android/feature/playerscreen/ui/p;->a:Ljava/lang/String; # sourceName
|
||||
+
|
||||
+ goto :rl_pf_set
|
||||
+
|
||||
+ :rl_pf_null
|
||||
+ const/4 v0, 0x0
|
||||
+
|
||||
+ :rl_pf_set
|
||||
+ sput-object v0, Lradiant/PlayingFrom;->a:Ljava/lang/String; # publish for k2 (rendered above the title)
|
||||
+
|
||||
iget-object v0, v3, Lcom/tidal/android/feature/playerscreen/ui/s$a;->c:Lcom/tidal/android/feature/playerscreen/ui/d;
|
||||
|
||||
.line 234
|
||||
--- a/com/tidal/android/feature/playerscreen/ui/composables/k2.smali
|
||||
+++ b/com/tidal/android/feature/playerscreen/ui/composables/k2.smali
|
||||
@@ -632,6 +632,39 @@
|
||||
.line 42
|
||||
:cond_1c
|
||||
check-cast v5, Lr20/c2;
|
||||
+ sget-object v30, Lradiant/PlayingFrom;->a:Ljava/lang/String; # RL: published "Playing from" source name
|
||||
+
|
||||
+ const v13, 0x52414450 # RL group key (v13 is dead here; the title setup below resets it)
|
||||
+
|
||||
+ invoke-interface {v1, v13}, Landroidx/compose/runtime/Composer;->startReplaceGroup(I)V
|
||||
+
|
||||
+ if-eqz v30, :rl_pf_skip # no source -> render nothing above the title
|
||||
+
|
||||
+ sget-object v31, Landroidx/compose/ui/Modifier;->Companion:Landroidx/compose/ui/Modifier$Companion;
|
||||
+
|
||||
+ const/16 v32, 0x1 # maxLines = 1
|
||||
+
|
||||
+ const/16 v33, 0x0
|
||||
+
|
||||
+ const/16 v34, 0x0
|
||||
+
|
||||
+ const/16 v35, 0x0
|
||||
+
|
||||
+ const/16 v36, 0x0
|
||||
+
|
||||
+ move-object/from16 v37, v5 # reuse the artist PARAGRAPH_30 style (same colour + size as the artist names)
|
||||
+
|
||||
+ move-object/from16 v38, v1 # composer
|
||||
+
|
||||
+ const/16 v39, 0x0
|
||||
+
|
||||
+ const/16 v40, 0x78 # default-arg mask (matches the artist MarketLabel.e call)
|
||||
+
|
||||
+ invoke-static/range {v30 .. v40}, Lcom/squareup/ui/market/components/MarketLabelKt;->e(Ljava/lang/String;Landroidx/compose/ui/Modifier;IILcom/squareup/ui/market/text/a;Landroidx/compose/foundation/interaction/MutableInteractionSource;Lem0/l;Lr20/c2;Landroidx/compose/runtime/Composer;II)V
|
||||
+
|
||||
+ :rl_pf_skip
|
||||
+ invoke-interface {v1}, Landroidx/compose/runtime/Composer;->endReplaceGroup()V
|
||||
+
|
||||
|
||||
.line 43
|
||||
sget-object v13, Landroidx/compose/ui/Modifier;->Companion:Landroidx/compose/ui/Modifier$Companion;
|
||||
@@ -1,10 +1,7 @@
|
||||
# rl-locals: com/tidal/android/feature/playerscreen/ui/PlayerScreenKt.smali e( 80
|
||||
--- a/com/tidal/android/feature/playerscreen/ui/PlayerScreenKt.smali
|
||||
+++ b/com/tidal/android/feature/playerscreen/ui/PlayerScreenKt.smali
|
||||
@@ -5650,12 +5650,26 @@
|
||||
invoke-static {v2, v15, v7, v9}, Lcom/aspiro/wamp/dynamicpages/ui/compose/f;->a(FLandroidx/compose/ui/Modifier$Companion;Landroidx/compose/runtime/Composer;I)V
|
||||
|
||||
const/4 v2, 0x0
|
||||
@@ -5579,6 +5579,20 @@
|
||||
|
||||
const/4 v9, 0x0
|
||||
|
||||
@@ -22,24 +19,15 @@
|
||||
+
|
||||
+ invoke-interface/range {v76 .. v77}, Landroidx/compose/runtime/Composer;->startProvider(Landroidx/compose/runtime/ProvidedValue;)V # open Rtl scope (mirror row)
|
||||
+
|
||||
.line 302
|
||||
invoke-static {v15, v9, v1, v2}, Landroidx/compose/foundation/layout/SizeKt;->fillMaxWidth$default(Landroidx/compose/ui/Modifier;FILjava/lang/Object;)Landroidx/compose/ui/Modifier;
|
||||
.line 306
|
||||
invoke-static {v0, v9, v14, v8}, Landroidx/compose/foundation/layout/SizeKt;->fillMaxWidth$default(Landroidx/compose/ui/Modifier;FILjava/lang/Object;)Landroidx/compose/ui/Modifier;
|
||||
|
||||
move-result-object v4
|
||||
|
||||
move/from16 v5, v58
|
||||
@@ -6001,12 +6015,14 @@
|
||||
|
||||
invoke-static {v13, v7, v2, v4}, Lcom/tidal/android/feature/playerscreen/ui/composables/m0;->a(ILandroidx/compose/runtime/Composer;Landroidx/compose/ui/Modifier;Lyl0/a;)V
|
||||
|
||||
.line 343
|
||||
@@ -6049,6 +6063,8 @@
|
||||
.line 364
|
||||
invoke-interface {v7}, Landroidx/compose/runtime/Composer;->endNode()V
|
||||
|
||||
+ invoke-interface {v7}, Landroidx/compose/runtime/Composer;->endProvider()V # close Rtl scope (end mirror)
|
||||
+
|
||||
.line 344
|
||||
invoke-static/range {v40 .. v40}, Landroidx/compose/ui/unit/Dp;->constructor-impl(F)F
|
||||
.line 365
|
||||
invoke-static/range {v27 .. v27}, Landroidx/compose/ui/unit/Dp;->constructor-impl(F)F
|
||||
|
||||
move-result v20
|
||||
|
||||
const/16 v21, 0x7
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
+++ b/com/tidal/android/feature/playerscreen/ui/composables/SeekbarAndTimeKt.smali
|
||||
@@ -372,6 +372,10 @@
|
||||
.line 158
|
||||
sget v4, Lcom/tidal/android/feature/playerscreen/ui/composables/o4;->g:F
|
||||
sget v4, Lcom/tidal/android/feature/playerscreen/ui/composables/m4;->g:F
|
||||
|
||||
+ const/high16 v11, 0x40000000 # 2.0f
|
||||
+
|
||||
@@ -30,7 +30,7 @@
|
||||
+
|
||||
+ move-object/from16 v3, p1
|
||||
+
|
||||
+ invoke-static {v13, v3}, Lradiant/QualityBadge;->style(ILn20/e2;)Ln20/e2;
|
||||
+ invoke-static {v13, v3}, Lradiant/QualityBadge;->style(ILr20/c2;)Lr20/c2;
|
||||
+
|
||||
+ move-result-object v8
|
||||
+
|
||||
@@ -72,45 +72,46 @@
|
||||
return-void
|
||||
--- a/com/tidal/android/feature/playerscreen/ui/PlayerViewModel$special$$inlined$mapNotNull$1$2.smali
|
||||
+++ b/com/tidal/android/feature/playerscreen/ui/PlayerViewModel$special$$inlined$mapNotNull$1$2.smali
|
||||
@@ -1356,6 +1356,14 @@
|
||||
.line 617
|
||||
- move-result v10
|
||||
+ move-result v10 # isCurrentStreamHiResLosslessQuality() result
|
||||
|
||||
@@ -1399,7 +1399,15 @@
|
||||
.line 634
|
||||
.line 635
|
||||
.line 636
|
||||
- move-result v9
|
||||
+ move-result v9 # isCurrentStreamHiResLosslessQuality() result
|
||||
+
|
||||
+ const/16 v31, 0x0 # LOW / HIGH quality
|
||||
+
|
||||
+ if-eqz v10, :radiant_qbc_not_hires
|
||||
+ if-eqz v9, :radiant_qbc_not_hires
|
||||
+
|
||||
+ const/16 v31, 0x2 # HI_RES_LOSSLESS quality
|
||||
+
|
||||
+ :radiant_qbc_not_hires
|
||||
|
||||
.line 637
|
||||
if-nez v9, :cond_1e
|
||||
@@ -1411,7 +1419,13 @@
|
||||
.line 640
|
||||
.line 641
|
||||
.line 642
|
||||
- move-result v9
|
||||
+ move-result v9 # isCurrentStreamLossless() result
|
||||
+
|
||||
.line 618
|
||||
if-nez v10, :cond_19
|
||||
|
||||
@@ -1368,6 +1376,12 @@
|
||||
.line 623
|
||||
- move-result v10
|
||||
+ move-result v10 # isCurrentStreamLossless() result
|
||||
|
||||
+ if-eqz v10, :radiant_qbc_not_lossless
|
||||
+ if-eqz v9, :radiant_qbc_not_lossless
|
||||
+
|
||||
+ const/16 v31, 0x1 # LOSSLESS quality
|
||||
+
|
||||
+ :radiant_qbc_not_lossless
|
||||
+
|
||||
.line 624
|
||||
if-eqz v10, :cond_18
|
||||
|
||||
@@ -1695,7 +1709,10 @@
|
||||
.line 643
|
||||
if-eqz v9, :cond_1d
|
||||
@@ -1740,7 +1754,9 @@
|
||||
|
||||
.line 771
|
||||
.line 772
|
||||
- invoke-direct {v8, v5}, Lcom/tidal/android/feature/playerscreen/ui/i$a;-><init>(Ljava/lang/String;)V
|
||||
+ move/from16 v10, v31 # quality
|
||||
+
|
||||
+ invoke-direct {v8, v5, v10}, Lcom/tidal/android/feature/playerscreen/ui/i$a;-><init>(Ljava/lang/String;I)V
|
||||
.line 790
|
||||
.line 791
|
||||
- invoke-direct {v7, v5}, Lcom/tidal/android/feature/playerscreen/ui/i$a;-><init>(Ljava/lang/String;)V
|
||||
+ move/from16 v9, v31 # quality
|
||||
+
|
||||
+ invoke-direct {v7, v5, v9}, Lcom/tidal/android/feature/playerscreen/ui/i$a;-><init>(Ljava/lang/String;I)V
|
||||
|
||||
.line 773
|
||||
.line 774
|
||||
.line 792
|
||||
.line 793
|
||||
|
||||
Reference in New Issue
Block a user