mirror of
https://github.com/meowarex/rl-mobile.git
synced 2026-08-26 22:17:44 +10:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
bbd0876324 | ||
|
|
5e150d10e3 | ||
|
|
225ebe3413 | ||
|
|
b175890e9d | ||
|
|
4531e6e259 | ||
|
|
a7fa8f7d30 | ||
|
|
2cb0e1a67e |
@@ -31,8 +31,8 @@ android {
|
||||
defaultConfig {
|
||||
minSdk = 24
|
||||
targetSdk = 36
|
||||
versionCode = 68
|
||||
versionName = "1.1.6"
|
||||
versionCode = 66
|
||||
versionName = "1.1.4"
|
||||
|
||||
vectorDrawables {
|
||||
useSupportLibrary = true
|
||||
|
||||
+4
-16
@@ -39,14 +39,10 @@ class RadiantLyricsGithubService(
|
||||
/**
|
||||
* Fetches manager self-update releases.
|
||||
*/
|
||||
suspend fun getManagerReleases(force: Boolean = false): ApiResponse<List<GithubRelease>> =
|
||||
suspend fun getManagerReleases(): ApiResponse<List<GithubRelease>> =
|
||||
http.request {
|
||||
url("https://api.github.com/repos/${BuildConfig.PATCHES_REPO_OWNER}/${BuildConfig.PATCHES_REPO_NAME}/releases")
|
||||
if (force) {
|
||||
header(HttpHeaders.CacheControl, "no-cache")
|
||||
} else {
|
||||
header(HttpHeaders.CacheControl, "public, max-age=60, s-maxage=60")
|
||||
}
|
||||
header(HttpHeaders.CacheControl, "public, max-age=60, s-maxage=60")
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -70,18 +66,10 @@ class RadiantLyricsGithubService(
|
||||
/**
|
||||
* Fetches a page of commits (paginated). Used by the Home screen's commit list.
|
||||
*/
|
||||
suspend fun getCommits(
|
||||
page: Int,
|
||||
perPage: Int = 30,
|
||||
force: Boolean = false,
|
||||
): ApiResponse<List<com.meowarex.rlmobile.network.models.GithubCommit>> =
|
||||
suspend fun getCommits(page: Int, perPage: Int = 30): ApiResponse<List<com.meowarex.rlmobile.network.models.GithubCommit>> =
|
||||
http.request {
|
||||
url("https://api.github.com/repos/${BuildConfig.PATCHES_REPO_OWNER}/${BuildConfig.PATCHES_REPO_NAME}/commits?per_page=$perPage&page=${page + 1}")
|
||||
if (force) {
|
||||
header(HttpHeaders.CacheControl, "no-cache")
|
||||
} else {
|
||||
header(HttpHeaders.CacheControl, "public, max-age=120, s-maxage=120")
|
||||
}
|
||||
header(HttpHeaders.CacheControl, "public, max-age=120, s-maxage=120")
|
||||
}
|
||||
|
||||
companion object {
|
||||
|
||||
+1
-4
@@ -7,8 +7,6 @@ import com.meowarex.rlmobile.network.services.RadiantLyricsGithubService
|
||||
|
||||
class CommitsPagingSource(
|
||||
private val github: RadiantLyricsGithubService,
|
||||
/** Bypasses the http response cache */
|
||||
private val force: Boolean = false,
|
||||
) : PagingSource<Int, GithubCommit>() {
|
||||
private val seenShas = mutableSetOf<String>()
|
||||
private val seenTitles = mutableSetOf<String>()
|
||||
@@ -21,8 +19,7 @@ class CommitsPagingSource(
|
||||
|
||||
override suspend fun load(params: LoadParams<Int>): LoadResult<Int, GithubCommit> {
|
||||
val page = params.key ?: 0
|
||||
// Only the first page skips the cache
|
||||
return when (val r = github.getCommits(page, force = force && page == 0)) {
|
||||
return when (val r = github.getCommits(page)) {
|
||||
is ApiResponse.Success -> LoadResult.Page(
|
||||
data = r.data.filter { commit ->
|
||||
val title = commit.commit.message.lineSequence().first().trim()
|
||||
|
||||
+1
-13
@@ -15,7 +15,6 @@ import androidx.compose.ui.Alignment
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.draw.clip
|
||||
import androidx.compose.ui.graphics.asImageBitmap
|
||||
import androidx.compose.ui.graphics.graphicsLayer
|
||||
import androidx.compose.ui.graphics.painter.BitmapPainter
|
||||
import androidx.activity.ComponentActivity
|
||||
import androidx.compose.ui.platform.LocalContext
|
||||
@@ -58,8 +57,6 @@ class HomeScreen : Screen, Parcelable {
|
||||
val activity = LocalContext.current as ComponentActivity
|
||||
val updater = koinViewModel<UpdaterViewModel>(viewModelStoreOwner = activity)
|
||||
val managerUpdateAvailable = updater.targetVersion != null
|
||||
val refreshing = model.refreshing
|
||||
val refreshAngle = rememberRefreshAngle()
|
||||
|
||||
LifecycleResumeEffect(Unit) {
|
||||
model.refresh(delay = true)
|
||||
@@ -71,19 +68,10 @@ class HomeScreen : Screen, Parcelable {
|
||||
TopAppBar(
|
||||
title = { Text(stringResource(R.string.navigation_home)) },
|
||||
actions = {
|
||||
IconButton(
|
||||
onClick = {
|
||||
model.refresh(force = true)
|
||||
updater.checkForUpdates(force = true)
|
||||
},
|
||||
enabled = !refreshing,
|
||||
) {
|
||||
IconButton(onClick = { model.refresh() }) {
|
||||
Icon(
|
||||
painterResource(R.drawable.ic_refresh),
|
||||
contentDescription = stringResource(R.string.navigation_refresh),
|
||||
modifier = Modifier.graphicsLayer {
|
||||
rotationZ = if (refreshing) refreshAngle() else 0f
|
||||
},
|
||||
)
|
||||
}
|
||||
if (managerUpdateAvailable) {
|
||||
|
||||
@@ -34,9 +34,6 @@ import com.meowarex.rlmobile.ui.util.TidalVersion
|
||||
import com.meowarex.rlmobile.ui.widgets.managerupdate.VersionDelta
|
||||
import com.meowarex.rlmobile.util.*
|
||||
import kotlinx.coroutines.*
|
||||
import kotlinx.coroutines.flow.MutableStateFlow
|
||||
import kotlinx.coroutines.flow.flatMapLatest
|
||||
import kotlinx.coroutines.flow.update
|
||||
import kotlinx.coroutines.sync.Mutex
|
||||
import kotlinx.coroutines.sync.withLock
|
||||
import kotlinx.serialization.json.Json
|
||||
@@ -56,22 +53,9 @@ class HomeModel(
|
||||
var managerUpdateDeltas by mutableStateOf<List<VersionDelta>?>(null)
|
||||
private set
|
||||
|
||||
/** Whether a user-initiated refresh is currently in flight */
|
||||
var refreshing by mutableStateOf(false)
|
||||
private set
|
||||
|
||||
// Bumped by every forced refresh, which restarts the pager with a fresh (cache-skipping) source.
|
||||
// Without this the commit list would stay pinned to whatever it loaded on process start.
|
||||
private val commitsGeneration = MutableStateFlow(0)
|
||||
|
||||
@OptIn(ExperimentalCoroutinesApi::class)
|
||||
val commits = commitsGeneration
|
||||
.flatMapLatest { generation ->
|
||||
Pager(PagingConfig(pageSize = 30)) {
|
||||
CommitsPagingSource(github, force = generation > 0)
|
||||
}.flow
|
||||
}
|
||||
.cachedIn(screenModelScope)
|
||||
val commits = Pager(PagingConfig(pageSize = 30)) {
|
||||
CommitsPagingSource(github)
|
||||
}.flow.cachedIn(screenModelScope)
|
||||
|
||||
private val refreshingLock = Mutex()
|
||||
private var remoteDataJson: RLBuildInfo? = null
|
||||
@@ -180,10 +164,7 @@ class HomeModel(
|
||||
)
|
||||
}
|
||||
|
||||
/**
|
||||
* @param delay Waits a moment before starting
|
||||
*/
|
||||
fun refresh(delay: Boolean = false, force: Boolean = false) = screenModelScope.launchIO {
|
||||
fun refresh(delay: Boolean = false) = screenModelScope.launchIO {
|
||||
if (refreshingLock.isLocked) return@launchIO
|
||||
if (delay) {
|
||||
delay(250)
|
||||
@@ -191,32 +172,26 @@ class HomeModel(
|
||||
}
|
||||
|
||||
refreshingLock.withLock {
|
||||
if (force) mainThread { refreshing = true }
|
||||
try {
|
||||
val pkg = fetchInstalled()
|
||||
// Skip the remote fetch entirely when offline
|
||||
val online = application.isOnline()
|
||||
if (online && (force || remoteDataJson == null)) {
|
||||
fetchRemoteData(force)
|
||||
}
|
||||
// Offline the reload would only replace the visible list with a load error
|
||||
if (force && online) commitsGeneration.update { it + 1 }
|
||||
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()
|
||||
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)
|
||||
}
|
||||
} finally {
|
||||
if (force) mainThread { refreshing = false }
|
||||
mainThread {
|
||||
state = HomeState.Loaded(
|
||||
install = install,
|
||||
latestTidalVersionCode = latest,
|
||||
offline = !online,
|
||||
offlineRepatchReady = offlineRepatchReady,
|
||||
)
|
||||
maybeCheckManagerUpdate(pkg)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -308,9 +283,9 @@ class HomeModel(
|
||||
paths.hasCachedSmaliPatches(info.data.patchesVersion)
|
||||
}
|
||||
|
||||
private suspend fun fetchRemoteData(force: Boolean = false) {
|
||||
private suspend fun fetchRemoteData() {
|
||||
val release = try {
|
||||
github.getLatestRelease(force).fold(
|
||||
github.getLatestRelease().fold(
|
||||
success = { it },
|
||||
fail = { Log.w(BuildConfig.TAG, "Failed to fetch latest release", it); return },
|
||||
)
|
||||
@@ -324,7 +299,7 @@ class HomeModel(
|
||||
?.browserDownloadUrl
|
||||
?: return
|
||||
|
||||
github.getBuildInfo(dataJsonUrl, force).fold(
|
||||
github.getBuildInfo(dataJsonUrl).fold(
|
||||
success = { remoteDataJson = it },
|
||||
fail = { Log.w(BuildConfig.TAG, "Failed to fetch build info", it) },
|
||||
)
|
||||
|
||||
@@ -3,11 +3,6 @@ package com.meowarex.rlmobile.ui.screens.home
|
||||
import android.os.Parcelable
|
||||
import androidx.activity.ComponentActivity
|
||||
import androidx.compose.animation.AnimatedVisibility
|
||||
import androidx.compose.animation.core.LinearEasing
|
||||
import androidx.compose.animation.core.animateFloat
|
||||
import androidx.compose.animation.core.infiniteRepeatable
|
||||
import androidx.compose.animation.core.rememberInfiniteTransition
|
||||
import androidx.compose.animation.core.tween
|
||||
import androidx.compose.foundation.Image
|
||||
import androidx.compose.foundation.basicMarquee
|
||||
import androidx.compose.foundation.interaction.MutableInteractionSource
|
||||
@@ -19,7 +14,6 @@ import androidx.compose.ui.Alignment
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.draw.clip
|
||||
import androidx.compose.ui.graphics.asImageBitmap
|
||||
import androidx.compose.ui.graphics.graphicsLayer
|
||||
import androidx.compose.ui.graphics.painter.BitmapPainter
|
||||
import androidx.compose.ui.input.nestedscroll.nestedScroll
|
||||
import androidx.compose.ui.platform.LocalContext
|
||||
@@ -76,8 +70,6 @@ class HomeScreen : Screen, Parcelable {
|
||||
val activity = LocalContext.current as ComponentActivity
|
||||
val updater = koinViewModel<UpdaterViewModel>(viewModelStoreOwner = activity)
|
||||
val managerUpdateAvailable = updater.targetVersion != null
|
||||
val refreshing = model.refreshing
|
||||
val refreshAngle = rememberRefreshAngle()
|
||||
|
||||
LifecycleResumeEffect(Unit) {
|
||||
model.refresh(delay = true)
|
||||
@@ -94,14 +86,7 @@ class HomeScreen : Screen, Parcelable {
|
||||
icon = painterResource(R.drawable.ic_refresh),
|
||||
contentDescription = stringResource(R.string.navigation_refresh),
|
||||
subtle = true,
|
||||
enabled = !refreshing,
|
||||
onClick = {
|
||||
model.refresh(force = true)
|
||||
updater.checkForUpdates(force = true)
|
||||
},
|
||||
modifier = Modifier.graphicsLayer {
|
||||
rotationZ = if (refreshing) refreshAngle() else 0f
|
||||
},
|
||||
onClick = { model.refresh() },
|
||||
)
|
||||
if (managerUpdateAvailable) {
|
||||
RadiantIconButton(
|
||||
@@ -379,18 +364,3 @@ private fun HeroContainer(
|
||||
Column(modifier = Modifier.fillMaxWidth(), content = content)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Refresh Spinner thing
|
||||
*/
|
||||
@Composable
|
||||
internal fun rememberRefreshAngle(): () -> Float {
|
||||
val transition = rememberInfiniteTransition(label = "RefreshSpin")
|
||||
val angle by transition.animateFloat(
|
||||
initialValue = 0f,
|
||||
targetValue = 360f,
|
||||
animationSpec = infiniteRepeatable(tween(900, easing = LinearEasing)),
|
||||
label = "RefreshSpinAngle",
|
||||
)
|
||||
return { angle }
|
||||
}
|
||||
|
||||
+12
-26
@@ -37,29 +37,17 @@ class UpdaterViewModel(
|
||||
field = MutableStateFlow(null)
|
||||
val isWorking: StateFlow<Boolean>
|
||||
field = MutableStateFlow(false)
|
||||
val isChecking: StateFlow<Boolean>
|
||||
field = MutableStateFlow(false)
|
||||
|
||||
private var targetApkUrl: String? = null
|
||||
|
||||
init {
|
||||
checkForUpdates()
|
||||
}
|
||||
|
||||
/**
|
||||
* Re-runs the update check
|
||||
*/
|
||||
fun checkForUpdates(force: Boolean = false) = viewModelScope.launchIO {
|
||||
if (!isChecking.compareAndSet(expect = false, update = true))
|
||||
return@launchIO
|
||||
|
||||
try {
|
||||
fetchInfo(force)
|
||||
} catch (t: Throwable) {
|
||||
Log.e(BuildConfig.TAG, "Failed to check for updates!", t)
|
||||
mainThread { application.showToast(R.string.updater_check_fail) }
|
||||
} finally {
|
||||
isChecking.value = false
|
||||
viewModelScope.launchIO {
|
||||
try {
|
||||
fetchInfo()
|
||||
} catch (t: Throwable) {
|
||||
Log.e(BuildConfig.TAG, "Failed to check for updates!", t)
|
||||
mainThread { application.showToast(R.string.updater_check_fail) }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -154,14 +142,14 @@ class UpdaterViewModel(
|
||||
* then finds the latest release based on the largest semantic version extracted from the tag name (`v1.0.0`),
|
||||
* and populates the state to show to the user.
|
||||
*/
|
||||
private suspend fun fetchInfo(force: Boolean = false) {
|
||||
private suspend fun fetchInfo() {
|
||||
Log.d(BuildConfig.TAG, "Checking for updates...")
|
||||
|
||||
val currentVersion = SemVer.parseOrNull(BuildConfig.VERSION_NAME)
|
||||
?: throw Error("Failed to parse current app version")
|
||||
|
||||
// Fetch releases from GitHub (60s local cache)
|
||||
val releases = github.getManagerReleases(force).getOrThrow()
|
||||
val releases = github.getManagerReleases().getOrThrow()
|
||||
|
||||
// Find the latest release by parsed version
|
||||
val (version, release, apkUrl) = releases
|
||||
@@ -183,14 +171,12 @@ class UpdaterViewModel(
|
||||
return
|
||||
}
|
||||
|
||||
Log.d(BuildConfig.TAG, "Found an update! $version $apkUrl")
|
||||
val newVersion = version.toString()
|
||||
Log.d(BuildConfig.TAG, "Found an update! $targetVersion $targetApkUrl")
|
||||
mainThread {
|
||||
val alreadyKnown = targetVersion == newVersion
|
||||
targetReleaseUrl = release.htmlUrl
|
||||
targetVersion = newVersion
|
||||
targetVersion = version.toString()
|
||||
targetApkUrl = apkUrl
|
||||
if (!alreadyKnown) showDialog = true
|
||||
showDialog = true
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+1
-1
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"tidalVersionCode": 10004,
|
||||
"tidalApkUrl": "https://github.com/meowarex/rl-mobile/releases/download/latest/tidal-stock.apk",
|
||||
"patchesVersion": "1.2.5"
|
||||
"patchesVersion": "1.2.4"
|
||||
}
|
||||
|
||||
@@ -5,7 +5,6 @@
|
||||
.implements Lam0/l;
|
||||
.implements Ljava/lang/Runnable;
|
||||
.implements Landroid/view/Choreographer$FrameCallback;
|
||||
.implements Lb0/c;
|
||||
|
||||
|
||||
# static fields
|
||||
@@ -15,7 +14,7 @@
|
||||
|
||||
.field private static final LOADER:Ljava/util/concurrent/ExecutorService;
|
||||
|
||||
.field private static volatile appContext:Landroid/content/Context;
|
||||
.field private static final TAG:Ljava/lang/String; = "RLKawarp"
|
||||
|
||||
.field private static engine:Ldev/kawarp/KawarpEngine;
|
||||
|
||||
@@ -31,14 +30,12 @@
|
||||
|
||||
.field private static volatile loadToken:I
|
||||
|
||||
.field private static volatile loader:Lcoil/f;
|
||||
.field private static loggedDraw:Z
|
||||
|
||||
.field private static volatile requestedUuid:Ljava/lang/String;
|
||||
|
||||
|
||||
# instance fields
|
||||
.field private final albumId:I
|
||||
|
||||
.field private final token:I
|
||||
|
||||
.field private final uuid:Ljava/lang/String;
|
||||
@@ -76,101 +73,22 @@
|
||||
|
||||
new-instance v1, Lradiant/Kawarp;
|
||||
|
||||
invoke-direct {v1, v0, v3, v0}, Lradiant/Kawarp;-><init>(ILjava/lang/String;I)V
|
||||
invoke-direct {v1, v3, v0}, Lradiant/Kawarp;-><init>(Ljava/lang/String;I)V
|
||||
|
||||
sput-object v1, Lradiant/Kawarp;->DRAW:Lradiant/Kawarp;
|
||||
|
||||
return-void
|
||||
.end method
|
||||
|
||||
.method private constructor <init>(ILjava/lang/String;I)V
|
||||
.registers 4
|
||||
.method private constructor <init>(Ljava/lang/String;I)V
|
||||
.registers 3
|
||||
|
||||
invoke-direct {p0}, Ljava/lang/Object;-><init>()V
|
||||
|
||||
iput p1, p0, Lradiant/Kawarp;->albumId:I
|
||||
iput-object p1, p0, Lradiant/Kawarp;->uuid:Ljava/lang/String;
|
||||
|
||||
iput-object p2, p0, Lradiant/Kawarp;->uuid:Ljava/lang/String;
|
||||
iput p2, p0, Lradiant/Kawarp;->token:I
|
||||
|
||||
iput p3, p0, Lradiant/Kawarp;->token:I
|
||||
|
||||
return-void
|
||||
.end method
|
||||
|
||||
.method private static attach(Landroidx/compose/runtime/Composer;)V
|
||||
.registers 3
|
||||
|
||||
sget-object v0, Lradiant/Kawarp;->loader:Lcoil/f;
|
||||
|
||||
if-eqz v0, :cond_5
|
||||
|
||||
return-void
|
||||
|
||||
:cond_5
|
||||
:try_start_5
|
||||
invoke-static {}, Landroidx/compose/ui/platform/AndroidCompositionLocals_androidKt;->getLocalContext()Landroidx/compose/runtime/ProvidableCompositionLocal;
|
||||
|
||||
move-result-object v0
|
||||
|
||||
invoke-interface {p0, v0}, Landroidx/compose/runtime/Composer;->consume(Landroidx/compose/runtime/CompositionLocal;)Ljava/lang/Object;
|
||||
|
||||
move-result-object p0
|
||||
|
||||
instance-of v0, p0, Landroid/content/Context;
|
||||
|
||||
if-nez v0, :cond_12
|
||||
|
||||
return-void
|
||||
|
||||
:cond_12
|
||||
check-cast p0, Landroid/content/Context;
|
||||
|
||||
invoke-virtual {p0}, Landroid/content/Context;->getApplicationContext()Landroid/content/Context;
|
||||
|
||||
move-result-object p0
|
||||
|
||||
instance-of v0, p0, Lce0/b$a;
|
||||
|
||||
if-nez v0, :cond_1d
|
||||
|
||||
return-void
|
||||
|
||||
:cond_1d
|
||||
move-object v0, p0
|
||||
|
||||
check-cast v0, Lce0/b$a;
|
||||
|
||||
invoke-interface {v0}, Lce0/b$a;->a()Lce0/b;
|
||||
|
||||
move-result-object v0
|
||||
|
||||
invoke-interface {v0}, Lce0/b;->a()Lxd0/e;
|
||||
|
||||
move-result-object v0
|
||||
|
||||
instance-of v1, v0, Lcom/tidal/android/image/coil/base/CoilImageLoader;
|
||||
|
||||
if-nez v1, :cond_2d
|
||||
|
||||
return-void
|
||||
|
||||
:cond_2d
|
||||
sput-object p0, Lradiant/Kawarp;->appContext:Landroid/content/Context;
|
||||
|
||||
check-cast v0, Lcom/tidal/android/image/coil/base/CoilImageLoader;
|
||||
|
||||
iget-object p0, v0, Lcom/tidal/android/image/coil/base/CoilImageLoader;->a:Lcoil/f;
|
||||
|
||||
sput-object p0, Lradiant/Kawarp;->loader:Lcoil/f;
|
||||
:try_end_35
|
||||
.catchall {:try_start_5 .. :try_end_35} :catchall_36
|
||||
|
||||
goto :goto_37
|
||||
|
||||
:catchall_36
|
||||
move-exception p0
|
||||
|
||||
:goto_37
|
||||
return-void
|
||||
.end method
|
||||
|
||||
@@ -183,7 +101,7 @@
|
||||
.end method
|
||||
|
||||
.method private static draw(Landroidx/compose/ui/graphics/drawscope/DrawScope;)V
|
||||
.registers 4
|
||||
.registers 6
|
||||
|
||||
sget-object v0, Lradiant/Kawarp;->frameState:Landroidx/compose/runtime/MutableIntState;
|
||||
|
||||
@@ -209,7 +127,64 @@
|
||||
|
||||
move-result v0
|
||||
|
||||
:try_start_1a
|
||||
sget-boolean v1, Lradiant/Kawarp;->loggedDraw:Z
|
||||
|
||||
const-string v3, "RLKawarp"
|
||||
|
||||
if-nez v1, :cond_53
|
||||
|
||||
const/4 v1, 0x1
|
||||
|
||||
sput-boolean v1, Lradiant/Kawarp;->loggedDraw:Z
|
||||
|
||||
new-instance v1, Ljava/lang/StringBuilder;
|
||||
|
||||
invoke-direct {v1}, Ljava/lang/StringBuilder;-><init>()V
|
||||
|
||||
const-string v4, "first draw: "
|
||||
|
||||
invoke-virtual {v1, v4}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
|
||||
|
||||
move-result-object v1
|
||||
|
||||
invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(F)Ljava/lang/StringBuilder;
|
||||
|
||||
move-result-object v1
|
||||
|
||||
const-string v4, "x"
|
||||
|
||||
invoke-virtual {v1, v4}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
|
||||
|
||||
move-result-object v1
|
||||
|
||||
invoke-virtual {v1, v0}, Ljava/lang/StringBuilder;->append(F)Ljava/lang/StringBuilder;
|
||||
|
||||
move-result-object v1
|
||||
|
||||
const-string v4, " ready="
|
||||
|
||||
invoke-virtual {v1, v4}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
|
||||
|
||||
move-result-object v1
|
||||
|
||||
sget-object v4, Lradiant/Kawarp;->engine:Ldev/kawarp/KawarpEngine;
|
||||
|
||||
invoke-virtual {v4}, Ldev/kawarp/KawarpEngine;->isReady()Z
|
||||
|
||||
move-result v4
|
||||
|
||||
invoke-virtual {v1, v4}, Ljava/lang/StringBuilder;->append(Z)Ljava/lang/StringBuilder;
|
||||
|
||||
move-result-object v1
|
||||
|
||||
invoke-virtual {v1}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
|
||||
|
||||
move-result-object v1
|
||||
|
||||
invoke-static {v3, v1}, Landroid/util/Log;->i(Ljava/lang/String;Ljava/lang/String;)I
|
||||
|
||||
:cond_53
|
||||
:try_start_53
|
||||
sget-object v1, Lradiant/Kawarp;->engine:Ldev/kawarp/KawarpEngine;
|
||||
|
||||
invoke-interface {p0}, Landroidx/compose/ui/graphics/drawscope/DrawScope;->getDrawContext()Landroidx/compose/ui/graphics/drawscope/DrawContext;
|
||||
@@ -225,21 +200,41 @@
|
||||
move-result-object p0
|
||||
|
||||
invoke-virtual {v1, p0, v2, v0}, Ldev/kawarp/KawarpEngine;->draw(Landroid/graphics/Canvas;FF)Z
|
||||
:try_end_2b
|
||||
.catchall {:try_start_1a .. :try_end_2b} :catchall_2c
|
||||
:try_end_64
|
||||
.catchall {:try_start_53 .. :try_end_64} :catchall_65
|
||||
|
||||
goto :goto_34
|
||||
goto :goto_83
|
||||
|
||||
:catchall_2c
|
||||
:catchall_65
|
||||
move-exception p0
|
||||
|
||||
new-instance v0, Ljava/lang/StringBuilder;
|
||||
|
||||
invoke-direct {v0}, Ljava/lang/StringBuilder;-><init>()V
|
||||
|
||||
const-string v1, "AGSL draw failed, falling back: "
|
||||
|
||||
invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
|
||||
|
||||
move-result-object v0
|
||||
|
||||
invoke-virtual {v0, p0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder;
|
||||
|
||||
move-result-object p0
|
||||
|
||||
invoke-virtual {p0}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
|
||||
|
||||
move-result-object p0
|
||||
|
||||
invoke-static {v3, p0}, Landroid/util/Log;->i(Ljava/lang/String;Ljava/lang/String;)I
|
||||
|
||||
sget-object p0, Lradiant/Kawarp;->fallbackState:Landroidx/compose/runtime/MutableState;
|
||||
|
||||
sget-object v0, Ljava/lang/Boolean;->TRUE:Ljava/lang/Boolean;
|
||||
|
||||
invoke-interface {p0, v0}, Landroidx/compose/runtime/MutableState;->setValue(Ljava/lang/Object;)V
|
||||
|
||||
:goto_34
|
||||
:goto_83
|
||||
return-void
|
||||
.end method
|
||||
|
||||
@@ -402,6 +397,28 @@
|
||||
:catchall_9f
|
||||
move-exception v0
|
||||
|
||||
new-instance v1, Ljava/lang/StringBuilder;
|
||||
|
||||
invoke-direct {v1}, Ljava/lang/StringBuilder;-><init>()V
|
||||
|
||||
const-string v3, "AGSL rejected, staying on the native backdrop: "
|
||||
|
||||
invoke-virtual {v1, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
|
||||
|
||||
move-result-object v1
|
||||
|
||||
invoke-virtual {v1, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder;
|
||||
|
||||
move-result-object v0
|
||||
|
||||
invoke-virtual {v0}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
|
||||
|
||||
move-result-object v0
|
||||
|
||||
const-string v1, "RLKawarp"
|
||||
|
||||
invoke-static {v1, v0}, Landroid/util/Log;->i(Ljava/lang/String;Ljava/lang/String;)I
|
||||
|
||||
sget-object v0, Lradiant/Kawarp;->fallbackState:Landroidx/compose/runtime/MutableState;
|
||||
|
||||
sget-object v1, Ljava/lang/Boolean;->TRUE:Ljava/lang/Boolean;
|
||||
@@ -411,23 +428,6 @@
|
||||
return v2
|
||||
.end method
|
||||
|
||||
.method private fail()V
|
||||
.registers 3
|
||||
|
||||
iget v0, p0, Lradiant/Kawarp;->token:I
|
||||
|
||||
sget v1, Lradiant/Kawarp;->loadToken:I
|
||||
|
||||
if-ne v0, v1, :cond_9
|
||||
|
||||
const/4 v0, 0x0
|
||||
|
||||
sput-object v0, Lradiant/Kawarp;->requestedUuid:Ljava/lang/String;
|
||||
|
||||
:cond_9
|
||||
return-void
|
||||
.end method
|
||||
|
||||
.method public static render(ILjava/lang/String;ZLandroidx/compose/ui/Modifier;Landroidx/compose/runtime/Composer;)V
|
||||
.registers 13
|
||||
|
||||
@@ -435,8 +435,6 @@
|
||||
|
||||
invoke-interface {p4, v0}, Landroidx/compose/runtime/Composer;->startReplaceGroup(I)V
|
||||
|
||||
invoke-static {p4}, Lradiant/Kawarp;->attach(Landroidx/compose/runtime/Composer;)V
|
||||
|
||||
sget-object v0, Lradiant/Kawarp;->fallbackState:Landroidx/compose/runtime/MutableState;
|
||||
|
||||
invoke-interface {v0}, Landroidx/compose/runtime/MutableState;->getValue()Ljava/lang/Object;
|
||||
@@ -449,19 +447,19 @@
|
||||
|
||||
move-result v0
|
||||
|
||||
if-nez v0, :cond_37
|
||||
if-nez v0, :cond_34
|
||||
|
||||
invoke-static {}, Lradiant/Kawarp;->ensureEngine()Z
|
||||
|
||||
move-result v0
|
||||
|
||||
if-eqz v0, :cond_37
|
||||
if-eqz v0, :cond_34
|
||||
|
||||
sget-object v0, Lradiant/Kawarp;->engine:Ldev/kawarp/KawarpEngine;
|
||||
sget-object p0, Lradiant/Kawarp;->engine:Ldev/kawarp/KawarpEngine;
|
||||
|
||||
invoke-virtual {v0, p2}, Ldev/kawarp/KawarpEngine;->setPlaying(Z)V
|
||||
invoke-virtual {p0, p2}, Ldev/kawarp/KawarpEngine;->setPlaying(Z)V
|
||||
|
||||
invoke-static {p0, p1}, Lradiant/Kawarp;->request(ILjava/lang/String;)V
|
||||
invoke-static {p1}, Lradiant/Kawarp;->request(Ljava/lang/String;)V
|
||||
|
||||
const/high16 p0, 0x3f800000 # 1.0f
|
||||
|
||||
@@ -481,9 +479,9 @@
|
||||
|
||||
move-object v6, p4
|
||||
|
||||
goto :goto_42
|
||||
goto :goto_3f
|
||||
|
||||
:cond_37
|
||||
:cond_34
|
||||
const/4 v4, 0x0
|
||||
|
||||
const/4 v7, 0x0
|
||||
@@ -502,42 +500,35 @@
|
||||
|
||||
invoke-static/range {v0 .. v7}, Lcom/tidal/android/feature/playerscreen/ui/composables/p3;->a(ILjava/lang/String;ZZLam0/a;Landroidx/compose/ui/Modifier;Landroidx/compose/runtime/Composer;I)V
|
||||
|
||||
:goto_42
|
||||
:goto_3f
|
||||
invoke-interface {v6}, Landroidx/compose/runtime/Composer;->endReplaceGroup()V
|
||||
|
||||
return-void
|
||||
.end method
|
||||
|
||||
.method private static request(ILjava/lang/String;)V
|
||||
.registers 5
|
||||
.method private static request(Ljava/lang/String;)V
|
||||
.registers 4
|
||||
|
||||
if-eqz p1, :cond_28
|
||||
if-eqz p0, :cond_23
|
||||
|
||||
invoke-virtual {p1}, Ljava/lang/String;->length()I
|
||||
invoke-virtual {p0}, Ljava/lang/String;->length()I
|
||||
|
||||
move-result v0
|
||||
|
||||
if-eqz v0, :cond_28
|
||||
if-eqz v0, :cond_23
|
||||
|
||||
sget-object v0, Lradiant/Kawarp;->requestedUuid:Ljava/lang/String;
|
||||
|
||||
invoke-virtual {p1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z
|
||||
invoke-virtual {p0, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z
|
||||
|
||||
move-result v0
|
||||
|
||||
if-eqz v0, :cond_11
|
||||
|
||||
goto :goto_28
|
||||
goto :goto_23
|
||||
|
||||
:cond_11
|
||||
sget-object v0, Lradiant/Kawarp;->loader:Lcoil/f;
|
||||
|
||||
if-nez v0, :cond_16
|
||||
|
||||
return-void
|
||||
|
||||
:cond_16
|
||||
sput-object p1, Lradiant/Kawarp;->requestedUuid:Ljava/lang/String;
|
||||
sput-object p0, Lradiant/Kawarp;->requestedUuid:Ljava/lang/String;
|
||||
|
||||
sget-object v0, Lradiant/Kawarp;->LOADER:Ljava/util/concurrent/ExecutorService;
|
||||
|
||||
@@ -549,12 +540,12 @@
|
||||
|
||||
sput v2, Lradiant/Kawarp;->loadToken:I
|
||||
|
||||
invoke-direct {v1, p0, p1, v2}, Lradiant/Kawarp;-><init>(ILjava/lang/String;I)V
|
||||
invoke-direct {v1, p0, v2}, Lradiant/Kawarp;-><init>(Ljava/lang/String;I)V
|
||||
|
||||
invoke-interface {v0, v1}, Ljava/util/concurrent/ExecutorService;->execute(Ljava/lang/Runnable;)V
|
||||
|
||||
:cond_28
|
||||
:goto_28
|
||||
:cond_23
|
||||
:goto_23
|
||||
return-void
|
||||
.end method
|
||||
|
||||
@@ -589,96 +580,8 @@
|
||||
return p0
|
||||
.end method
|
||||
|
||||
.method private static toBitmap(Landroid/graphics/drawable/Drawable;)Landroid/graphics/Bitmap;
|
||||
.registers 4
|
||||
|
||||
if-nez p0, :cond_4
|
||||
|
||||
const/4 p0, 0x0
|
||||
|
||||
return-object p0
|
||||
|
||||
:cond_4
|
||||
instance-of v0, p0, Landroid/graphics/drawable/BitmapDrawable;
|
||||
|
||||
if-eqz v0, :cond_f
|
||||
|
||||
check-cast p0, Landroid/graphics/drawable/BitmapDrawable;
|
||||
|
||||
invoke-virtual {p0}, Landroid/graphics/drawable/BitmapDrawable;->getBitmap()Landroid/graphics/Bitmap;
|
||||
|
||||
move-result-object p0
|
||||
|
||||
return-object p0
|
||||
|
||||
:cond_f
|
||||
sget-object v0, Landroid/graphics/Bitmap$Config;->ARGB_8888:Landroid/graphics/Bitmap$Config;
|
||||
|
||||
const/16 v1, 0x100
|
||||
|
||||
invoke-static {v1, v1, v0}, Landroid/graphics/Bitmap;->createBitmap(IILandroid/graphics/Bitmap$Config;)Landroid/graphics/Bitmap;
|
||||
|
||||
move-result-object v0
|
||||
|
||||
const/4 v2, 0x0
|
||||
|
||||
invoke-virtual {p0, v2, v2, v1, v1}, Landroid/graphics/drawable/Drawable;->setBounds(IIII)V
|
||||
|
||||
new-instance v1, Landroid/graphics/Canvas;
|
||||
|
||||
invoke-direct {v1, v0}, Landroid/graphics/Canvas;-><init>(Landroid/graphics/Bitmap;)V
|
||||
|
||||
invoke-virtual {p0, v1}, Landroid/graphics/drawable/Drawable;->draw(Landroid/graphics/Canvas;)V
|
||||
|
||||
return-object v0
|
||||
.end method
|
||||
|
||||
|
||||
# virtual methods
|
||||
.method public a(Landroid/graphics/drawable/Drawable;)V
|
||||
.registers 4
|
||||
|
||||
iget v0, p0, Lradiant/Kawarp;->token:I
|
||||
|
||||
sget v1, Lradiant/Kawarp;->loadToken:I
|
||||
|
||||
if-eq v0, v1, :cond_7
|
||||
|
||||
return-void
|
||||
|
||||
:cond_7
|
||||
invoke-static {p1}, Lradiant/Kawarp;->toBitmap(Landroid/graphics/drawable/Drawable;)Landroid/graphics/Bitmap;
|
||||
|
||||
move-result-object p1
|
||||
|
||||
if-nez p1, :cond_11
|
||||
|
||||
invoke-direct {p0}, Lradiant/Kawarp;->fail()V
|
||||
|
||||
return-void
|
||||
|
||||
:cond_11
|
||||
sget-object v0, Lradiant/Kawarp;->engine:Ldev/kawarp/KawarpEngine;
|
||||
|
||||
invoke-virtual {v0, p1}, Ldev/kawarp/KawarpEngine;->setCover(Landroid/graphics/Bitmap;)V
|
||||
|
||||
return-void
|
||||
.end method
|
||||
|
||||
.method public b(Landroid/graphics/drawable/Drawable;)V
|
||||
.registers 2
|
||||
|
||||
return-void
|
||||
.end method
|
||||
|
||||
.method public d(Landroid/graphics/drawable/Drawable;)V
|
||||
.registers 2
|
||||
|
||||
invoke-direct {p0}, Lradiant/Kawarp;->fail()V
|
||||
|
||||
return-void
|
||||
.end method
|
||||
|
||||
.method public doFrame(J)V
|
||||
.registers 5
|
||||
|
||||
@@ -731,98 +634,206 @@
|
||||
.end method
|
||||
|
||||
.method public run()V
|
||||
.registers 15
|
||||
.registers 8
|
||||
|
||||
:try_start_0
|
||||
new-instance v0, Lxd0/g;
|
||||
const-string v0, "RLKawarp"
|
||||
|
||||
sget-object v1, Lradiant/Kawarp;->appContext:Landroid/content/Context;
|
||||
const/4 v1, 0x0
|
||||
|
||||
new-instance v2, Lcom/tidal/android/image/core/b$a;
|
||||
:try_start_3
|
||||
new-instance v2, Ljava/net/URL;
|
||||
|
||||
iget v3, p0, Lradiant/Kawarp;->albumId:I
|
||||
new-instance v3, Ljava/lang/StringBuilder;
|
||||
|
||||
invoke-static {v3}, Ljava/lang/String;->valueOf(I)Ljava/lang/String;
|
||||
invoke-direct {v3}, Ljava/lang/StringBuilder;-><init>()V
|
||||
|
||||
const-string v4, "https://resources.tidal.com/images/"
|
||||
|
||||
invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
|
||||
|
||||
move-result-object v3
|
||||
|
||||
iget-object v4, p0, Lradiant/Kawarp;->uuid:Ljava/lang/String;
|
||||
|
||||
invoke-direct {v2, v3, v4}, Lcom/tidal/android/image/core/b$a;-><init>(Ljava/lang/String;Ljava/lang/String;)V
|
||||
const/16 v5, 0x2d
|
||||
|
||||
const/4 v7, 0x0
|
||||
const/16 v6, 0x2f
|
||||
|
||||
const/4 v8, 0x0
|
||||
invoke-virtual {v4, v5, v6}, Ljava/lang/String;->replace(CC)Ljava/lang/String;
|
||||
|
||||
const/4 v3, 0x0
|
||||
move-result-object v4
|
||||
|
||||
const/4 v4, 0x0
|
||||
invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
|
||||
|
||||
const/4 v5, 0x0
|
||||
move-result-object v3
|
||||
|
||||
const/4 v6, 0x0
|
||||
const-string v4, "/640x640.jpg"
|
||||
|
||||
invoke-direct/range {v0 .. v8}, Lxd0/g;-><init>(Landroid/content/Context;Lcom/tidal/android/image/core/b;Lcom/tidal/android/image/core/b$h$a;Lcom/tidal/android/image/core/b$h$a;ZLjava/util/List;Lxd0/f;Z)V
|
||||
invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
|
||||
|
||||
const/4 v1, 0x0
|
||||
move-result-object v3
|
||||
|
||||
invoke-static {v0, v1}, Lcom/tidal/android/image/coil/c;->a(Lxd0/g;Landroidx/compose/ui/layout/ContentScale;)Lcoil/request/h;
|
||||
invoke-virtual {v3}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
|
||||
|
||||
move-result-object v0
|
||||
move-result-object v3
|
||||
|
||||
invoke-static {v0}, Lcoil/request/h;->a(Lcoil/request/h;)Lcoil/request/h$a;
|
||||
invoke-direct {v2, v3}, Ljava/net/URL;-><init>(Ljava/lang/String;)V
|
||||
|
||||
move-result-object v0
|
||||
invoke-virtual {v2}, Ljava/net/URL;->openConnection()Ljava/net/URLConnection;
|
||||
|
||||
iget-object v1, v0, Lcoil/request/h$a;->b:Lcoil/request/b;
|
||||
move-result-object v2
|
||||
|
||||
new-instance v2, Lcoil/request/b;
|
||||
check-cast v2, Ljava/net/HttpURLConnection;
|
||||
:try_end_31
|
||||
.catchall {:try_start_3 .. :try_end_31} :catchall_7f
|
||||
|
||||
iget-object v3, v1, Lcoil/request/b;->a:Lkotlinx/coroutines/CoroutineDispatcher;
|
||||
const/16 v3, 0x2710
|
||||
|
||||
iget-object v4, v1, Lcoil/request/b;->b:Lkotlinx/coroutines/CoroutineDispatcher;
|
||||
:try_start_33
|
||||
invoke-virtual {v2, v3}, Ljava/net/HttpURLConnection;->setConnectTimeout(I)V
|
||||
|
||||
iget-object v5, v1, Lcoil/request/b;->c:Lkotlinx/coroutines/CoroutineDispatcher;
|
||||
const/16 v3, 0x3a98
|
||||
|
||||
iget-object v6, v1, Lcoil/request/b;->d:Lkotlinx/coroutines/CoroutineDispatcher;
|
||||
invoke-virtual {v2, v3}, Ljava/net/HttpURLConnection;->setReadTimeout(I)V
|
||||
|
||||
iget-object v7, v1, Lcoil/request/b;->e:Ld0/c$a;
|
||||
invoke-virtual {v2}, Ljava/net/HttpURLConnection;->getInputStream()Ljava/io/InputStream;
|
||||
|
||||
iget-object v8, v1, Lcoil/request/b;->f:Lcoil/size/Precision;
|
||||
move-result-object v3
|
||||
:try_end_3f
|
||||
.catchall {:try_start_33 .. :try_end_3f} :catchall_7d
|
||||
|
||||
iget-object v9, v1, Lcoil/request/b;->g:Landroid/graphics/Bitmap$Config;
|
||||
:try_start_3f
|
||||
invoke-static {v3}, Landroid/graphics/BitmapFactory;->decodeStream(Ljava/io/InputStream;)Landroid/graphics/Bitmap;
|
||||
|
||||
iget-boolean v10, v1, Lcoil/request/b;->h:Z
|
||||
move-result-object v4
|
||||
:try_end_43
|
||||
.catchall {:try_start_3f .. :try_end_43} :catchall_78
|
||||
|
||||
iget-object v11, v1, Lcoil/request/b;->i:Lcoil/request/CachePolicy;
|
||||
:try_start_43
|
||||
invoke-virtual {v3}, Ljava/io/InputStream;->close()V
|
||||
|
||||
iget-object v12, v1, Lcoil/request/b;->j:Lcoil/request/CachePolicy;
|
||||
if-eqz v4, :cond_72
|
||||
|
||||
sget-object v13, Lcoil/request/CachePolicy;->DISABLED:Lcoil/request/CachePolicy;
|
||||
iget v3, p0, Lradiant/Kawarp;->token:I
|
||||
|
||||
invoke-direct/range {v2 .. v13}, Lcoil/request/b;-><init>(Lkotlinx/coroutines/CoroutineDispatcher;Lkotlinx/coroutines/CoroutineDispatcher;Lkotlinx/coroutines/CoroutineDispatcher;Lkotlinx/coroutines/CoroutineDispatcher;Ld0/c$a;Lcoil/size/Precision;Landroid/graphics/Bitmap$Config;ZLcoil/request/CachePolicy;Lcoil/request/CachePolicy;Lcoil/request/CachePolicy;)V
|
||||
sget v5, Lradiant/Kawarp;->loadToken:I
|
||||
|
||||
iput-object v2, v0, Lcoil/request/h$a;->b:Lcoil/request/b;
|
||||
if-eq v3, v5, :cond_4f
|
||||
|
||||
iput-object p0, v0, Lcoil/request/h$a;->d:Lb0/c;
|
||||
goto :goto_72
|
||||
|
||||
sget-object v1, Lradiant/Kawarp;->loader:Lcoil/f;
|
||||
:cond_4f
|
||||
sget-object v3, Lradiant/Kawarp;->engine:Ldev/kawarp/KawarpEngine;
|
||||
|
||||
invoke-virtual {v0}, Lcoil/request/h$a;->a()Lcoil/request/h;
|
||||
invoke-virtual {v3, v4}, Ldev/kawarp/KawarpEngine;->setCover(Landroid/graphics/Bitmap;)V
|
||||
|
||||
move-result-object v0
|
||||
invoke-virtual {v4}, Landroid/graphics/Bitmap;->recycle()V
|
||||
|
||||
invoke-interface {v1, v0}, Lcoil/f;->b(Lcoil/request/h;)Lcoil/request/d;
|
||||
:try_end_4d
|
||||
.catchall {:try_start_0 .. :try_end_4d} :catchall_4e
|
||||
new-instance v3, Ljava/lang/StringBuilder;
|
||||
|
||||
goto :goto_52
|
||||
invoke-direct {v3}, Ljava/lang/StringBuilder;-><init>()V
|
||||
|
||||
:catchall_4e
|
||||
const-string v4, "cover submitted: "
|
||||
|
||||
invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
|
||||
|
||||
move-result-object v3
|
||||
|
||||
iget-object v4, p0, Lradiant/Kawarp;->uuid:Ljava/lang/String;
|
||||
|
||||
invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
|
||||
|
||||
move-result-object v3
|
||||
|
||||
invoke-virtual {v3}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
|
||||
|
||||
move-result-object v3
|
||||
|
||||
invoke-static {v0, v3}, Landroid/util/Log;->i(Ljava/lang/String;Ljava/lang/String;)I
|
||||
:try_end_6f
|
||||
.catchall {:try_start_43 .. :try_end_6f} :catchall_7d
|
||||
|
||||
if-eqz v2, :cond_a4
|
||||
|
||||
goto :goto_a1
|
||||
|
||||
:cond_72
|
||||
:goto_72
|
||||
if-eqz v2, :cond_77
|
||||
|
||||
invoke-virtual {v2}, Ljava/net/HttpURLConnection;->disconnect()V
|
||||
|
||||
:cond_77
|
||||
return-void
|
||||
|
||||
:catchall_78
|
||||
move-exception v4
|
||||
|
||||
:try_start_79
|
||||
invoke-virtual {v3}, Ljava/io/InputStream;->close()V
|
||||
|
||||
throw v4
|
||||
:try_end_7d
|
||||
.catchall {:try_start_79 .. :try_end_7d} :catchall_7d
|
||||
|
||||
:catchall_7d
|
||||
move-exception v3
|
||||
|
||||
goto :goto_81
|
||||
|
||||
:catchall_7f
|
||||
move-exception v3
|
||||
|
||||
move-object v2, v1
|
||||
|
||||
:goto_81
|
||||
:try_start_81
|
||||
new-instance v4, Ljava/lang/StringBuilder;
|
||||
|
||||
invoke-direct {v4}, Ljava/lang/StringBuilder;-><init>()V
|
||||
|
||||
const-string v5, "cover load failed: "
|
||||
|
||||
invoke-virtual {v4, v5}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
|
||||
|
||||
move-result-object v4
|
||||
|
||||
invoke-virtual {v4, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder;
|
||||
|
||||
move-result-object v3
|
||||
|
||||
invoke-virtual {v3}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
|
||||
|
||||
move-result-object v3
|
||||
|
||||
invoke-static {v0, v3}, Landroid/util/Log;->i(Ljava/lang/String;Ljava/lang/String;)I
|
||||
|
||||
iget v0, p0, Lradiant/Kawarp;->token:I
|
||||
|
||||
sget v3, Lradiant/Kawarp;->loadToken:I
|
||||
|
||||
if-ne v0, v3, :cond_9f
|
||||
|
||||
sput-object v1, Lradiant/Kawarp;->requestedUuid:Ljava/lang/String;
|
||||
:try_end_9f
|
||||
.catchall {:try_start_81 .. :try_end_9f} :catchall_a5
|
||||
|
||||
:cond_9f
|
||||
if-eqz v2, :cond_a4
|
||||
|
||||
:goto_a1
|
||||
invoke-virtual {v2}, Ljava/net/HttpURLConnection;->disconnect()V
|
||||
|
||||
:cond_a4
|
||||
return-void
|
||||
|
||||
:catchall_a5
|
||||
move-exception v0
|
||||
|
||||
invoke-direct {p0}, Lradiant/Kawarp;->fail()V
|
||||
if-eqz v2, :cond_ab
|
||||
|
||||
:goto_52
|
||||
return-void
|
||||
invoke-virtual {v2}, Ljava/net/HttpURLConnection;->disconnect()V
|
||||
|
||||
:cond_ab
|
||||
throw v0
|
||||
.end method
|
||||
|
||||
@@ -375,7 +375,7 @@
|
||||
.end method
|
||||
|
||||
.method public static parseLines(Ljava/lang/String;)Ljava/util/ArrayList;
|
||||
.locals 13
|
||||
.locals 11
|
||||
|
||||
:try_start
|
||||
new-instance v0, Lorg/json/JSONObject;
|
||||
@@ -466,46 +466,6 @@
|
||||
|
||||
double-to-long v7, v7
|
||||
|
||||
# Prefer the first syllable time
|
||||
const-string v6, "syllabus"
|
||||
|
||||
invoke-virtual {v4, v6}, Lorg/json/JSONObject;->optJSONArray(Ljava/lang/String;)Lorg/json/JSONArray;
|
||||
|
||||
move-result-object v6
|
||||
|
||||
if-eqz v6, :no_syl
|
||||
|
||||
invoke-virtual {v6}, Lorg/json/JSONArray;->length()I
|
||||
|
||||
move-result v9
|
||||
|
||||
if-eqz v9, :no_syl
|
||||
|
||||
const/4 v9, 0x0
|
||||
|
||||
invoke-virtual {v6, v9}, Lorg/json/JSONArray;->optJSONObject(I)Lorg/json/JSONObject;
|
||||
|
||||
move-result-object v6
|
||||
|
||||
if-eqz v6, :no_syl
|
||||
|
||||
const-string v9, "time"
|
||||
|
||||
const-wide/16 v11, -0x1
|
||||
|
||||
invoke-virtual {v6, v9, v11, v12}, Lorg/json/JSONObject;->optLong(Ljava/lang/String;J)J
|
||||
|
||||
move-result-wide v11
|
||||
|
||||
const-wide/16 v9, 0x0
|
||||
|
||||
cmp-long v6, v11, v9
|
||||
|
||||
if-ltz v6, :no_syl
|
||||
|
||||
move-wide v7, v11
|
||||
|
||||
:no_syl
|
||||
new-instance v4, Lcom/tidal/android/feature/playerscreen/ui/f;
|
||||
|
||||
invoke-direct {v4, v5, v7, v8}, Lcom/tidal/android/feature/playerscreen/ui/f;-><init>(Ljava/lang/String;J)V
|
||||
|
||||
@@ -1,11 +1,9 @@
|
||||
package radiant;
|
||||
|
||||
import android.content.Context;
|
||||
import android.graphics.Bitmap;
|
||||
import android.graphics.Canvas;
|
||||
import android.graphics.drawable.BitmapDrawable;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.graphics.BitmapFactory;
|
||||
import android.os.SystemClock;
|
||||
import android.util.Log;
|
||||
import android.view.Choreographer;
|
||||
|
||||
import androidx.compose.foundation.layout.SizeKt;
|
||||
@@ -20,17 +18,15 @@ import androidx.compose.ui.draw.DrawModifierKt;
|
||||
import androidx.compose.ui.geometry.Size;
|
||||
import androidx.compose.ui.graphics.AndroidCanvas_androidKt;
|
||||
import androidx.compose.ui.graphics.drawscope.DrawScope;
|
||||
import androidx.compose.ui.platform.AndroidCompositionLocals_androidKt;
|
||||
|
||||
import coil.request.CachePolicy;
|
||||
|
||||
import com.tidal.android.feature.playerscreen.ui.composables.p3;
|
||||
import com.tidal.android.feature.playerscreen.ui.model.PlayerBackgroundStyle;
|
||||
import com.tidal.android.image.coil.base.CoilImageLoader;
|
||||
import com.tidal.android.image.core.b;
|
||||
|
||||
import dev.kawarp.KawarpEngine;
|
||||
|
||||
import java.io.InputStream;
|
||||
import java.net.HttpURLConnection;
|
||||
import java.net.URL;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
import java.util.concurrent.Executors;
|
||||
|
||||
@@ -39,10 +35,17 @@ import java.util.concurrent.Executors;
|
||||
*
|
||||
* The engine (shader, blur pipeline, settings, crossfade) lives in the Kawarp-AGSL library
|
||||
* (cloned at tools/kawarp-agsl) and is compiled into this bundle by tools/kawarp-build/build.sh;
|
||||
* this class only holds what is TIDAL/Compose-specific
|
||||
* this class only holds what is TIDAL/Compose-specific:
|
||||
* the patched-in composable entry points, cover fetching by TIDAL uuid, the Choreographer ->
|
||||
* snapshot-state frame clock, the Manager's option tokens, and the fallback to TIDAL's own
|
||||
* blurred backdrop.
|
||||
*
|
||||
* One class on purpose (its own draw lambda, frame callback and loader) - see the engine's
|
||||
* class doc for the dex-injection constraints.
|
||||
*/
|
||||
public final class Kawarp implements am0.l, Runnable, Choreographer.FrameCallback, b0.c {
|
||||
public final class Kawarp implements am0.l, Runnable, Choreographer.FrameCallback {
|
||||
|
||||
private static final String TAG = "RLKawarp";
|
||||
/** Stop the frame loop once nothing has drawn for this long (player left / backgrounded). */
|
||||
private static final long IDLE_STOP_MS = 500L;
|
||||
|
||||
@@ -66,31 +69,26 @@ public final class Kawarp implements am0.l, Runnable, Choreographer.FrameCallbac
|
||||
SnapshotStateKt.mutableStateOf$default(Boolean.FALSE, null, 2, null);
|
||||
|
||||
/** The shared instance render passes to drawBehind (also serves as the frame callback). */
|
||||
private static final Kawarp DRAW = new Kawarp(0, null, 0);
|
||||
private static final Kawarp DRAW = new Kawarp(null, 0);
|
||||
|
||||
private static KawarpEngine engine;
|
||||
/** TIDAL's application-scoped Coil loader and the context its requests are built with. */
|
||||
private static volatile coil.f loader;
|
||||
private static volatile Context appContext;
|
||||
private static volatile String requestedUuid;
|
||||
private static volatile int loadToken;
|
||||
|
||||
private static long lastDrawUptime;
|
||||
private static boolean frameScheduled;
|
||||
private static boolean frameScheduled, loggedDraw;
|
||||
private static int frameTick;
|
||||
|
||||
/** Set when this instance is a queued cover load; 0/null/0 on the shared DRAW instance. */
|
||||
private final int albumId;
|
||||
/** Set when this instance is a queued cover load; null/0 on the shared DRAW instance. */
|
||||
private final String uuid;
|
||||
private final int token;
|
||||
|
||||
private Kawarp(int albumId, String uuid, int token) {
|
||||
this.albumId = albumId;
|
||||
private Kawarp(String uuid, int token) {
|
||||
this.uuid = uuid;
|
||||
this.token = token;
|
||||
}
|
||||
|
||||
|
||||
|
||||
// Composition
|
||||
|
||||
|
||||
@@ -108,39 +106,19 @@ public final class Kawarp implements am0.l, Runnable, Choreographer.FrameCallbac
|
||||
public static void render(int albumId, String coverUuid, boolean isPlaying,
|
||||
Modifier modifier, Composer composer) {
|
||||
composer.startReplaceGroup(0x52415750);
|
||||
attach(composer);
|
||||
boolean ok = !((Boolean) fallbackState.getValue()).booleanValue() && ensureEngine();
|
||||
if (!ok) {
|
||||
// No (working) AGSL here - fall back to TIDAL's own blurred backdrop.
|
||||
p3.a(albumId, coverUuid, isPlaying, false, null, modifier, composer, 0);
|
||||
} else {
|
||||
engine.setPlaying(isPlaying);
|
||||
request(albumId, coverUuid);
|
||||
request(coverUuid);
|
||||
Modifier m = DrawModifierKt.drawBehind(SizeKt.fillMaxSize(modifier, 1.0f), DRAW);
|
||||
SpacerKt.Spacer(m, composer, 0);
|
||||
}
|
||||
composer.endReplaceGroup();
|
||||
}
|
||||
|
||||
/**
|
||||
* Grab the app's image loader the same way TIDAL's composables do (yd0.c)
|
||||
*/
|
||||
private static void attach(Composer composer) {
|
||||
if (loader != null) return;
|
||||
try {
|
||||
Object local = composer.consume(AndroidCompositionLocals_androidKt.getLocalContext());
|
||||
if (!(local instanceof Context)) return;
|
||||
Context app = ((Context) local).getApplicationContext();
|
||||
if (!(app instanceof ce0.b.a)) return;
|
||||
Object tidalLoader = ((ce0.b.a) app).a().a();
|
||||
if (!(tidalLoader instanceof CoilImageLoader)) return;
|
||||
appContext = app;
|
||||
loader = ((CoilImageLoader) tidalLoader).a;
|
||||
} catch (Throwable t) {
|
||||
// No loader -> request() never runs and the backdrop simply stays on the last cover.
|
||||
}
|
||||
}
|
||||
|
||||
/** Engine construction compiles the AGSL so this doubles as the support probe. */
|
||||
private static boolean ensureEngine() {
|
||||
if (engine != null) return true;
|
||||
@@ -160,69 +138,52 @@ public final class Kawarp implements am0.l, Runnable, Choreographer.FrameCallbac
|
||||
engine = e;
|
||||
return true;
|
||||
} catch (Throwable t) {
|
||||
fallbackState.setValue(Boolean.TRUE); // AGSL rejected: stay on the native backdrop
|
||||
Log.i(TAG, "AGSL rejected, staying on the native backdrop: " + t);
|
||||
fallbackState.setValue(Boolean.TRUE);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Cover loading (Runnable on LOADER)
|
||||
|
||||
|
||||
// Cover loading: a queued Kawarp is both the LOADER task and the request's Coil Target
|
||||
|
||||
|
||||
private static void request(int albumId, String coverUuid) {
|
||||
private static void request(String coverUuid) {
|
||||
if (coverUuid == null || coverUuid.length() == 0 || coverUuid.equals(requestedUuid)) return;
|
||||
if (loader == null) return; // attach() failed; retried next composition
|
||||
requestedUuid = coverUuid;
|
||||
LOADER.execute(new Kawarp(albumId, coverUuid, ++loadToken));
|
||||
LOADER.execute(new Kawarp(coverUuid, ++loadToken));
|
||||
}
|
||||
|
||||
/**
|
||||
* TIDAL's own backdrop request (PlayerBackgroundKt.rememberBlurredArtwork)
|
||||
*/
|
||||
public void run() {
|
||||
HttpURLConnection connection = null;
|
||||
try {
|
||||
xd0.g tidal = new xd0.g(appContext, new b.a(String.valueOf(albumId), uuid),
|
||||
null, null, false, null, null, false);
|
||||
coil.request.h.a req = coil.request.h.a(com.tidal.android.image.coil.c.a(tidal, null));
|
||||
coil.request.b d = req.b;
|
||||
req.b = new coil.request.b(d.a, d.b, d.c, d.d, d.e, d.f, d.g, d.h,
|
||||
d.i, d.j, CachePolicy.DISABLED);
|
||||
req.d = this;
|
||||
loader.b(req.a());
|
||||
// Same URL shape TIDAL itself builds in he0.a; 640 is plenty ahead of a 128 downscale.
|
||||
URL url = new URL("https://resources.tidal.com/images/"
|
||||
+ uuid.replace('-', '/') + "/640x640.jpg");
|
||||
connection = (HttpURLConnection) url.openConnection();
|
||||
connection.setConnectTimeout(10000);
|
||||
connection.setReadTimeout(15000);
|
||||
InputStream stream = connection.getInputStream();
|
||||
Bitmap source;
|
||||
try {
|
||||
source = BitmapFactory.decodeStream(stream);
|
||||
} finally {
|
||||
stream.close();
|
||||
}
|
||||
if (source == null || token != loadToken) return;
|
||||
engine.setCover(source);
|
||||
source.recycle();
|
||||
Log.i(TAG, "cover submitted: " + uuid);
|
||||
} catch (Throwable t) {
|
||||
fail();
|
||||
Log.i(TAG, "cover load failed: " + t);
|
||||
// Let the next track (or a re-entry into the player) retry this cover.
|
||||
if (token == loadToken) requestedUuid = null;
|
||||
} finally {
|
||||
if (connection != null) connection.disconnect();
|
||||
}
|
||||
}
|
||||
|
||||
/** Target.onSuccess */
|
||||
public void a(Drawable drawable) {
|
||||
if (token != loadToken) return; // user skipped on
|
||||
Bitmap cover = toBitmap(drawable);
|
||||
if (cover == null) { fail(); return; }
|
||||
// setCover copies, the bitmap stays Coil's (memory cache)
|
||||
engine.setCover(cover);
|
||||
}
|
||||
|
||||
/** Target.onStart - nothing to show while loading. */
|
||||
public void b(Drawable placeholder) {}
|
||||
|
||||
/** Target.onError - not in any of TIDAL's stores. */
|
||||
public void d(Drawable error) { fail(); }
|
||||
|
||||
private void fail() {
|
||||
if (token == loadToken) requestedUuid = null;
|
||||
}
|
||||
|
||||
private static Bitmap toBitmap(Drawable d) {
|
||||
if (d == null) return null;
|
||||
if (d instanceof BitmapDrawable) return ((BitmapDrawable) d).getBitmap();
|
||||
Bitmap out = Bitmap.createBitmap(256, 256, Bitmap.Config.ARGB_8888);
|
||||
d.setBounds(0, 0, 256, 256);
|
||||
d.draw(new Canvas(out));
|
||||
return out;
|
||||
}
|
||||
|
||||
|
||||
|
||||
// Frame loop
|
||||
|
||||
|
||||
@@ -254,11 +215,16 @@ public final class Kawarp implements am0.l, Runnable, Choreographer.FrameCallbac
|
||||
long packed = scope.getSizeNHjbRc();
|
||||
float width = Size.getWidthImpl(packed);
|
||||
float height = Size.getHeightImpl(packed);
|
||||
if (!loggedDraw) {
|
||||
loggedDraw = true;
|
||||
Log.i(TAG, "first draw: " + width + "x" + height + " ready=" + engine.isReady());
|
||||
}
|
||||
try {
|
||||
engine.draw(AndroidCanvas_androidKt.getNativeCanvas(scope.getDrawContext().getCanvas()),
|
||||
width, height);
|
||||
} catch (Throwable t) {
|
||||
fallbackState.setValue(Boolean.TRUE); // AGSL draw failed: recompose onto p3.a
|
||||
Log.i(TAG, "AGSL draw failed, falling back: " + t);
|
||||
fallbackState.setValue(Boolean.TRUE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,5 +2,4 @@ package androidx.compose.runtime;
|
||||
public interface Composer {
|
||||
void startReplaceGroup(int key);
|
||||
void endReplaceGroup();
|
||||
Object consume(CompositionLocal key);
|
||||
}
|
||||
|
||||
@@ -1,2 +0,0 @@
|
||||
package androidx.compose.runtime;
|
||||
public abstract class CompositionLocal {}
|
||||
@@ -1,2 +0,0 @@
|
||||
package androidx.compose.runtime;
|
||||
public abstract class ProvidableCompositionLocal extends CompositionLocal {}
|
||||
@@ -1,2 +0,0 @@
|
||||
package androidx.compose.ui.layout;
|
||||
public interface ContentScale {}
|
||||
-5
@@ -1,5 +0,0 @@
|
||||
package androidx.compose.ui.platform;
|
||||
import androidx.compose.runtime.ProvidableCompositionLocal;
|
||||
public final class AndroidCompositionLocals_androidKt {
|
||||
public static ProvidableCompositionLocal getLocalContext() { return null; }
|
||||
}
|
||||
@@ -1,8 +0,0 @@
|
||||
package b0;
|
||||
import android.graphics.drawable.Drawable;
|
||||
/** coil.target.Target (R8 name in TIDAL 2.200): a=onSuccess, b=onStart, d=onError. */
|
||||
public interface c {
|
||||
void a(Drawable success);
|
||||
void b(Drawable start);
|
||||
void d(Drawable error);
|
||||
}
|
||||
@@ -1,6 +0,0 @@
|
||||
package ce0;
|
||||
/** Dagger image component; the Application implements b.a and hands out the loader. */
|
||||
public interface b {
|
||||
xd0.e a();
|
||||
interface a { b a(); }
|
||||
}
|
||||
@@ -1,5 +0,0 @@
|
||||
package coil;
|
||||
/** coil.ImageLoader; b() is enqueue(). */
|
||||
public interface f {
|
||||
coil.request.d b(coil.request.h request);
|
||||
}
|
||||
@@ -1,2 +0,0 @@
|
||||
package coil.request;
|
||||
public enum CachePolicy { ENABLED, READ_ONLY, WRITE_ONLY, DISABLED }
|
||||
@@ -1,19 +0,0 @@
|
||||
package coil.request;
|
||||
import kotlinx.coroutines.CoroutineDispatcher;
|
||||
/**
|
||||
* coil.request.DefaultRequestOptions; i/j/k are the memory/disk/network cache policies (proven
|
||||
* via h$a.a() -> ImageRequest.o/p/q -> Options.m/n/o, the last of which HttpUriFetcher gates on).
|
||||
* Fields are deliberately non-final: a `final boolean h = false` would be a compile-time constant
|
||||
* and javac would fold the read away instead of emitting iget-boolean. (claude)
|
||||
*/
|
||||
public final class b {
|
||||
public CoroutineDispatcher a, b, c, d;
|
||||
public d0.c.a e;
|
||||
public coil.size.Precision f;
|
||||
public android.graphics.Bitmap.Config g;
|
||||
public boolean h;
|
||||
public CachePolicy i, j, k;
|
||||
public b(CoroutineDispatcher a, CoroutineDispatcher b, CoroutineDispatcher c, CoroutineDispatcher d,
|
||||
d0.c.a transition, coil.size.Precision precision, android.graphics.Bitmap.Config config,
|
||||
boolean h, CachePolicy memory, CachePolicy disk, CachePolicy network) {}
|
||||
}
|
||||
@@ -1,3 +0,0 @@
|
||||
package coil.request;
|
||||
/** coil.request.Disposable */
|
||||
public interface d {}
|
||||
@@ -1,12 +0,0 @@
|
||||
package coil.request;
|
||||
/** coil.request.ImageRequest; a(h) is newBuilder(), h.a is the Builder. */
|
||||
public final class h {
|
||||
public static a a(h request) { return null; }
|
||||
public static final class a {
|
||||
/** defaults block the built request copies its cache policies from */
|
||||
public b b;
|
||||
/** target */
|
||||
public b0.c d;
|
||||
public h a() { return null; }
|
||||
}
|
||||
}
|
||||
@@ -1,2 +0,0 @@
|
||||
package coil.size;
|
||||
public enum Precision { EXACT, INEXACT, AUTOMATIC }
|
||||
@@ -1,5 +0,0 @@
|
||||
package com.tidal.android.image.coil.base;
|
||||
/** TIDAL's xd0.e implementation; a is the underlying Coil ImageLoader. */
|
||||
public final class CoilImageLoader implements xd0.e {
|
||||
public final coil.f a = null;
|
||||
}
|
||||
@@ -1,5 +0,0 @@
|
||||
package com.tidal.android.image.coil;
|
||||
/** TIDAL request -> Coil request; installs the AlbumCover data the interceptor resolves. */
|
||||
public final class c {
|
||||
public static coil.request.h a(xd0.g request, androidx.compose.ui.layout.ContentScale scale) { return null; }
|
||||
}
|
||||
@@ -1,7 +0,0 @@
|
||||
package com.tidal.android.image.core;
|
||||
/** TIDAL's sealed image-source type; b$a is AlbumCover(albumId, coverUuid). */
|
||||
public abstract class b {
|
||||
public static final class a extends b { public a(String albumId, String cover) {} }
|
||||
/** b$h = a resolved location; b$h$a is the placeholder/error drawable spec. */
|
||||
public interface h { interface a {} }
|
||||
}
|
||||
@@ -1,3 +0,0 @@
|
||||
package d0;
|
||||
/** coil.transition.Transition; c.a is Transition.Factory. */
|
||||
public interface c { interface a {} }
|
||||
@@ -1,2 +0,0 @@
|
||||
package kotlinx.coroutines;
|
||||
public abstract class CoroutineDispatcher {}
|
||||
@@ -1,3 +0,0 @@
|
||||
package xd0;
|
||||
/** TIDAL's ImageLoader interface (implemented by CoilImageLoader). */
|
||||
public interface e {}
|
||||
@@ -1,3 +0,0 @@
|
||||
package xd0;
|
||||
/** Size spec wrapper accepted by xd0.g's constructor; we always pass null. */
|
||||
public final class f {}
|
||||
@@ -1,8 +0,0 @@
|
||||
package xd0;
|
||||
import android.content.Context;
|
||||
import com.tidal.android.image.core.b;
|
||||
/** TIDAL's ImageRequest. */
|
||||
public final class g {
|
||||
public g(Context context, b source, b.h.a placeholder, b.h.a error, boolean crossfade,
|
||||
java.util.List transformations, f size, boolean allowHardware) {}
|
||||
}
|
||||
Reference in New Issue
Block a user