Skip to content
10 changes: 10 additions & 0 deletions app/src/main/java/app/gamenative/data/DownloadDisplayDetails.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package app.gamenative.ui.data

data class DownloadDisplayDetails (
val isInstalled: Boolean,
val isValidToDownload: Boolean,
val isDownloading: Boolean,
val hasPartialDownload: Boolean,
val downloadProgress: Float,
val isUpdatePending: Boolean
)
26 changes: 26 additions & 0 deletions app/src/main/java/app/gamenative/service/SteamService.kt
Original file line number Diff line number Diff line change
Expand Up @@ -174,6 +174,7 @@ import com.winlator.container.ContainerManager
import app.gamenative.statsgen.StatType
import app.gamenative.statsgen.StatsAchievementsGenerator
import app.gamenative.statsgen.VdfParser
import app.gamenative.ui.data.Achievement
import app.gamenative.utils.DownloadSpeedConfig
import app.gamenative.utils.CustomGameScanner
import java.nio.ByteBuffer
Expand Down Expand Up @@ -3068,6 +3069,31 @@ class SteamService : Service(), IChallengeUrlChanged {
}
}

// Fetches achievements for a Steam app for display in the game details page.
suspend fun fetchAchievementsForDisplay(appId: Int): List<Achievement>? {
if (!isConnected) return null
return try {
val steamUser = instance?._steamUser ?: return null
val userStats = instance?._steamUserStats?.getUserStats(appId, steamUser.steamID!!)?.await() ?: return null
val baseIconUrl = SteamUtils.getBaseAchievementIconUrl(appId)
userStats.getExpandedAchievements().map { block ->
Achievement(
displayName = block.displayName ?: block.name ?: "",
name = block.name,
isUnlocked = block.isUnlocked,
description = block.description ?: "",
unlockTimestamp = block.unlockTimestamp,
hidden = block.hidden,
icon = if (!block.icon.isNullOrEmpty()) "$baseIconUrl${block.icon}" else "",
iconGray = if (!block.iconGray.isNullOrEmpty()) "$baseIconUrl${block.iconGray}" else null,
)
}
} catch (e: Exception) {
Timber.e(e, "fetchAchievementsForDisplay failed for appId=$appId")
null
}
}

suspend fun generateAchievements(appId: Int, configDirectory: String) {
val steamUser = instance!!._steamUser!!
val userStats = instance?._steamUserStats!!.getUserStats(appId, steamUser.steamID!!).await()
Expand Down
18 changes: 18 additions & 0 deletions app/src/main/java/app/gamenative/ui/data/Achievement.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package app.gamenative.ui.data

data class Achievement(
val displayName: String,
val name: String?,
val isUnlocked: Boolean,
val description: String,
val unlockTimestamp: Int,
val hidden: Boolean,
val icon: String,
val iconGray: String?
){
fun getFormattedUnlockTime(): String? {
if (unlockTimestamp == 0) return null
val dateFormat = java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss", java.util.Locale.getDefault())
return dateFormat.format(java.util.Date(unlockTimestamp * 1000L))
}
}
2 changes: 2 additions & 0 deletions app/src/main/java/app/gamenative/ui/data/GameDisplayInfo.kt
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package app.gamenative.ui.data

import app.gamenative.data.GameSource

/**
* Common data structure for displaying game information in the UI.
* This allows both Steam and Custom Games to use the same UI layout.
Expand Down
Loading
Loading