Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions app/src/main/java/com/geode/launcher/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -716,6 +716,9 @@ fun GeodeUpdateIndicator(snackbarHostState: SnackbarHostState, onRetry: () -> Un
ReleaseManager.UpdateException.Reason.EXTERNAL_FILE_IN_USE -> stringResource(
R.string.release_fetch_external_in_use_short
)
ReleaseManager.UpdateException.Reason.HASH_VALIDATION_FAILED -> stringResource(
R.string.release_fetch_hash_validation_failed_short
)
else -> stringResource(R.string.release_fetch_generic_short)
}
}
Expand Down
80 changes: 52 additions & 28 deletions app/src/main/java/com/geode/launcher/updater/Release.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,21 +3,21 @@ package com.geode.launcher.updater
import com.geode.launcher.utils.LaunchUtils
import kotlin.time.Instant
import kotlinx.serialization.Serializable
import kotlin.time.ExperimentalTime

@Serializable
data class Asset @OptIn(ExperimentalTime::class) constructor(
data class Asset(
val url: String,
val id: Int,
val name: String,
val size: Int,
val createdAt: Instant,
val updatedAt: Instant,
val browserDownloadUrl: String,
val digest: String?,
)

@Serializable
data class Release @OptIn(ExperimentalTime::class) constructor(
data class Release(
val url: String,
val id: Int,
val targetCommitish: String,
Expand All @@ -31,12 +31,29 @@ data class Release @OptIn(ExperimentalTime::class) constructor(
)

@Serializable
data class LoaderVersion @OptIn(ExperimentalTime::class) constructor(
data class LoaderPlatformDownload(
val url: String,
val hash: String?,
)

@Serializable
data class LoaderDownload(
val win: LoaderPlatformDownload,
val mac: LoaderPlatformDownload,
val android32: LoaderPlatformDownload,
val android64: LoaderPlatformDownload,
val ios: LoaderPlatformDownload,
val resources: LoaderPlatformDownload,
)

@Serializable
data class LoaderVersion(
val tag: String,
val version: String,
val createdAt: Instant,
val commitHash: String,
val prerelease: Boolean
val prerelease: Boolean,
val downloads: LoaderDownload,
)

@Serializable
Expand All @@ -45,7 +62,25 @@ data class LoaderPayload<T>(
val error: String
)

data class DownloadableAsset(val url: String, val filename: String, val size: Long? = null)
data class DownloadableAsset(
val url: String,
val filename: String,
val size: Long? = null,
val hash: String? = null,
)

private fun mapDownload(download: Asset): DownloadableAsset {
val hash = if (download.digest?.startsWith("sha256:") == true)
download.digest.removePrefix("sha256:")
else null

return DownloadableAsset(
url = download.browserDownloadUrl,
filename = download.name,
size = download.size.toLong(),
hash = hash,
)
}

abstract class Downloadable {
/**
Expand Down Expand Up @@ -83,7 +118,6 @@ class DownloadableGitHubLoaderRelease(private val release: Release) : Downloadab
return release.tagName
}

@OptIn(ExperimentalTime::class)
override fun getDescriptor(): Long {
return release.createdAt.epochSeconds
}
Expand All @@ -100,23 +134,15 @@ class DownloadableGitHubLoaderRelease(private val release: Release) : Downloadab

override fun getDownload(): DownloadableAsset? {
val download = getGitHubDownload() ?: return null
return DownloadableAsset(
url = download.browserDownloadUrl,
filename = download.name,
size = download.size.toLong()
)
return mapDownload(download)
}

override fun getResourcesDownload(): DownloadableAsset? {
val download = release.assets.find {
it.name == "resources.zip"
} ?: return null

return DownloadableAsset(
url = download.browserDownloadUrl,
filename = download.name,
size = download.size.toLong()
)
return mapDownload(download)
}
}

Expand All @@ -125,7 +151,6 @@ class DownloadableLauncherRelease(val release: Release) : Downloadable() {
return release.tagName
}

@OptIn(ExperimentalTime::class)
override fun getDescriptor(): Long {
return release.createdAt.epochSeconds
}
Expand All @@ -149,11 +174,7 @@ class DownloadableLauncherRelease(val release: Release) : Downloadable() {

override fun getDownload(): DownloadableAsset? {
val download = getGitHubDownload() ?: return null
return DownloadableAsset(
url = download.browserDownloadUrl,
filename = download.name,
size = download.size.toLong()
)
return mapDownload(download)
}

override fun getResourcesDownload(): DownloadableAsset? {
Expand All @@ -166,24 +187,27 @@ class DownloadableLoaderRelease(private val version: LoaderVersion) : Downloadab
return version.tag
}

@OptIn(ExperimentalTime::class)
override fun getDescriptor(): Long {
return version.createdAt.epochSeconds
}

override fun getDownload(): DownloadableAsset {
val data = if (LaunchUtils.is64bit) version.downloads.android64 else version.downloads.android32
val filename = "geode-${version.tag}-${LaunchUtils.platformName}.zip"
return DownloadableAsset(
url = "https://github.com/geode-sdk/geode/releases/download/${version.tag}/$filename",
filename = filename
url = data.url,
filename = filename,
hash = data.hash,
)
}

override fun getResourcesDownload(): DownloadableAsset {
val data = version.downloads.resources
val filename = "resources.zip"
return DownloadableAsset(
url = "https://github.com/geode-sdk/geode/releases/download/${version.tag}/resources.zip",
filename = filename
url = data.url,
filename = filename,
hash = data.hash,
)
}
}
Loading