diff --git a/app/src/main/java/com/droiddeck/launcher/stores/gog/GogBackend.kt b/app/src/main/java/com/droiddeck/launcher/stores/gog/GogBackend.kt index fb6b0c890..e36f0fc16 100644 --- a/app/src/main/java/com/droiddeck/launcher/stores/gog/GogBackend.kt +++ b/app/src/main/java/com/droiddeck/launcher/stores/gog/GogBackend.kt @@ -64,6 +64,8 @@ object GogBackend : StoreBackend { }, "gog-sync").start() } + override fun search(context: Context, query: String): List = GogStoreCatalog.search(query) + override fun loadShelves(context: Context, force: Boolean) { val app = context.applicationContext GogStoreCatalog.cachedFeatured(app)?.let { StoresState.post { StoresState.shelves[store] = it } } diff --git a/app/src/main/java/com/droiddeck/launcher/stores/gog/GogLibrary.kt b/app/src/main/java/com/droiddeck/launcher/stores/gog/GogLibrary.kt index 8f48740ee..5b8be2230 100644 --- a/app/src/main/java/com/droiddeck/launcher/stores/gog/GogLibrary.kt +++ b/app/src/main/java/com/droiddeck/launcher/stores/gog/GogLibrary.kt @@ -58,16 +58,17 @@ object GogLibrary { val token = GogAuth.validToken(app) ?: return SyncResult.NotLoggedIn onStatus(app.getString(R.string.stores_sync_game_list)) val listing = ownedListing(token) + val account = ownedIds(token) val listed: List = listing?.games - ?: ownedIds(token)?.map { GogGame(it, "", "", "", "", "", 1, null, "", "") } + ?: account?.map { GogGame(it, "", "", "", "", "", 1, null, "", "") } ?: return SyncResult.Failed(app.getString(R.string.stores_sync_gog_unreachable)) val named = listing != null - StoresState.logLine(if (named) "GOG: listing ${listed.size} games" else "GOG: listing unreadable, ${listed.size} owned ids") - val ownedSet = listing?.owned ?: listed.mapTo(HashSet()) { it.gameId } val cachedList = cached(app) + val cachedIds = cachedList.mapTo(HashSet()) { it.gameId } + val ownedSet = ownedSet(listing?.owned ?: listed.mapTo(HashSet()) { it.gameId }, account, cachedIds) + StoresState.logLine(if (named) "GOG: listing ${listed.size} games, ${ownedSet.size} owned ids" else "GOG: listing unreadable, ${listed.size} owned ids") val stale = System.currentTimeMillis() - p.getLong(LAST_SYNC_KEY, 0L) >= THROTTLE_MS val heavy = force || cachedList.isEmpty() || stale - val cachedIds = cachedList.mapTo(HashSet()) { it.gameId } val skipped = java.util.Collections.newSetFromMap(java.util.concurrent.ConcurrentHashMap()) skipped.addAll(p.getStringSet(SKIPPED_KEY, emptySet()).orEmpty()) val idsToFetch = if (heavy) ownedSet.toList() else ownedSet.filter { it !in cachedIds && it !in skipped } @@ -133,6 +134,9 @@ object GogLibrary { return all.ifEmpty { null }?.let { Listing(it, owned) } } + fun ownedSet(listed: Set, account: List?, cached: Set = emptySet()): Set = + if (account == null) listed + cached else listed + account + private fun ownedIds(token: String): List? { val json = StoreNet.get(OWNED_URL, bearer = token, userAgent = GogAuth.GALAXY_UA) ?: return null val owned = runCatching { JSONObject(json).optJSONArray("owned") }.getOrNull() ?: return null diff --git a/app/src/test/java/com/droiddeck/launcher/stores/gog/GogListingTest.kt b/app/src/test/java/com/droiddeck/launcher/stores/gog/GogListingTest.kt index 5aace971f..86e54aad0 100644 --- a/app/src/test/java/com/droiddeck/launcher/stores/gog/GogListingTest.kt +++ b/app/src/test/java/com/droiddeck/launcher/stores/gog/GogListingTest.kt @@ -24,6 +24,23 @@ class GogListingTest { assertEquals("", shadowrun.description) } + @Test + fun ownedGamesTheListingLeavesOutStayOwned() { + assertEquals(setOf("1", "2", "1086370078"), GogLibrary.ownedSet(setOf("1", "2"), listOf("2", "1086370078"))) + } + + @Test + fun withoutTheAccountListTheListingStillCounts() { + assertEquals(setOf("1", "2"), GogLibrary.ownedSet(setOf("1", "2"), null)) + assertEquals(setOf("3"), GogLibrary.ownedSet(emptySet(), listOf("3"))) + } + + @Test + fun cachedGamesStayWhenTheAccountListIsUnavailable() { + assertEquals(setOf("1", "2", "1086370078"), GogLibrary.ownedSet(setOf("1", "2"), null, setOf("1086370078"))) + assertEquals(setOf("1", "2", "3"), GogLibrary.ownedSet(setOf("1"), listOf("2", "3"), setOf("1086370078"))) + } + @Test fun moviesOtherPlatformsAndGalaxysOwnEntryAreLeftOut() { assertEquals(listOf("1207660413", "1207664663"), GogLibrary.parseListing(PAGE)!!.games.map { it.gameId })