Skip to content
Open
Show file tree
Hide file tree
Changes from 2 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
49 changes: 49 additions & 0 deletions app/src/main/java/app/gamenative/PrefManager.kt
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,7 @@ object PrefManager {
pref.remove(STEAM_USER_NAME)
pref.remove(LAST_PICS_CHANGE_NUMBER)
pref.remove(STEAM_GAMES_COUNT)
pref.remove(PREFERRED_FAMILY_LENDERS_JSON)
}
}
}
Expand Down Expand Up @@ -1406,4 +1407,52 @@ object PrefManager {
setPref(NEXUS_LAST_PLACEMENT_JSON, value)
}
}

/**
* Preferred Steam Families lender per appId (appId string → lender steamId64).
* Empty / missing entry means use the account's own copy when available.
*/
private val PREFERRED_FAMILY_LENDERS_JSON = stringPreferencesKey("preferred_family_lenders_json")

private fun decodePreferredFamilyLenders(value: String): Map<Int, Long> =
runCatching {
Json.decodeFromString<Map<String, Long>>(value)
.mapNotNull { (key, lenderSteamId) ->
key.toIntOrNull()?.let { appId -> appId to lenderSteamId }
}
.toMap()
}.getOrDefault(emptyMap())

var preferredFamilyLenders: Map<Int, Long>
get() = decodePreferredFamilyLenders(getPref(PREFERRED_FAMILY_LENDERS_JSON, "{}"))
set(value) {
if (value.isEmpty()) {
removePref(PREFERRED_FAMILY_LENDERS_JSON)
} else {
setPref(
PREFERRED_FAMILY_LENDERS_JSON,
Json.encodeToString(value.mapKeys { it.key.toString() }),
)
}
}

fun setPreferredFamilyLender(appId: Int, lenderSteamId: Long?) {
scope.launch {
dataStore.edit { pref ->
val current = decodePreferredFamilyLenders(pref[PREFERRED_FAMILY_LENDERS_JSON] ?: "{}")
val updated = current.toMutableMap()
if (lenderSteamId == null || lenderSteamId == 0L) {
updated.remove(appId)
} else {
updated[appId] = lenderSteamId
}
if (updated.isEmpty()) {
pref.remove(PREFERRED_FAMILY_LENDERS_JSON)
} else {
pref[PREFERRED_FAMILY_LENDERS_JSON] =
Json.encodeToString(updated.mapKeys { it.key.toString() })
}
}
}
}
Comment thread
coderabbitai[bot] marked this conversation as resolved.
}
13 changes: 13 additions & 0 deletions app/src/main/java/app/gamenative/data/PreferredCopyOption.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package app.gamenative.data

/**
* One selectable Steam Families library copy for an app.
*/
data class PreferredCopyOption(
val lenderSteamId: Long,
val accountId: Int,
val displayName: String,
val isSelf: Boolean,
val packageId: Int?,
val ownedDlcCount: Int? = null,
)
1 change: 1 addition & 0 deletions app/src/main/java/app/gamenative/events/AndroidEvent.kt
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ interface AndroidEvent<T> : Event<T> {
data class DownloadStatusChanged(val appId: Int, val isDownloading: Boolean) : AndroidEvent<Unit>
data class PostInstallSyncStatusChanged(val appId: Int, val isSyncing: Boolean) : AndroidEvent<Unit>
data class LibraryInstallStatusChanged(val appId: Int, val source: GameSource) : AndroidEvent<Unit>
data class PreferredCopyChanged(val appId: Int) : AndroidEvent<Unit>
data class CustomGameImagesFetched(val appId: String) : AndroidEvent<Unit>
data object RecommendationToggleChanged : AndroidEvent<Unit>
data class GOGAuthCodeReceived(val authCode: String) : AndroidEvent<Unit>
Expand Down
Loading