Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Games: Store player details per account, not per game #2485

Merged
merged 5 commits into from
Nov 10, 2024
Merged
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
Original file line number Diff line number Diff line change
Expand Up @@ -62,23 +62,19 @@ class GamesConfigurationService : Service() {
}

MSG_GET_PLAYER -> {
val packageName = msg.data?.getString(MSG_DATA_PACKAGE_NAME)
val account = msg.data?.getParcelable<Account>(MSG_DATA_ACCOUNT)
val player = if (packageName != null && account != null) getPlayer(packageName, account) else null
val player = if (account != null) getPlayer(account) else null
bundleOf(
MSG_DATA_PACKAGE_NAME to packageName,
MSG_DATA_ACCOUNT to account,
MSG_DATA_PLAYER to player
)
}

MSG_SET_PLAYER -> {
val packageName = msg.data?.getString(MSG_DATA_PACKAGE_NAME)
val account = msg.data?.getParcelable<Account>(MSG_DATA_ACCOUNT)
val player = msg.data?.getString(MSG_DATA_PLAYER)
if (packageName != null && account != null) setPlayer(packageName, account, player)
if (account != null) setPlayer(account, player)
bundleOf(
MSG_DATA_PACKAGE_NAME to packageName,
MSG_DATA_ACCOUNT to account,
MSG_DATA_PLAYER to player
)
Expand Down Expand Up @@ -141,18 +137,18 @@ class GamesConfigurationService : Service() {
return getPackageNameSuffix(packageName) + ":" + account.name
}

private fun getPlayer(packageName: String, account: Account): String? {
val player = preferences.getString(PREF_PLAYER_PREFIX + getPackageAndAccountSuffix(packageName, account), null)
private fun getPlayer(account: Account): String? {
val player = preferences.getString(PREF_PLAYER_PREFIX + getPackageAndAccountSuffix(GAMES_PACKAGE_NAME, account), null)
if (player.isNullOrBlank()) return null
return player
}

private fun setPlayer(packageName: String, account: Account, player: String?) {
private fun setPlayer(account: Account, player: String?) {
val editor: SharedPreferences.Editor = preferences.edit()
if (player.isNullOrBlank()) {
editor.remove(PREF_PLAYER_PREFIX + getPackageAndAccountSuffix(packageName, account))
editor.remove(PREF_PLAYER_PREFIX + getPackageAndAccountSuffix(GAMES_PACKAGE_NAME, account))
} else {
editor.putString(PREF_PLAYER_PREFIX + getPackageAndAccountSuffix(packageName, account), player)
editor.putString(PREF_PLAYER_PREFIX + getPackageAndAccountSuffix(GAMES_PACKAGE_NAME, account), player)
}
editor.apply()
}
Expand Down Expand Up @@ -208,21 +204,19 @@ class GamesConfigurationService : Service() {
})
}

suspend fun getPlayer(context: Context, packageName: String, account: Account): String? {
suspend fun getPlayer(context: Context, account: Account): String? {
return singleRequest(context, Message.obtain().apply {
what = MSG_GET_PLAYER
data = bundleOf(
MSG_DATA_PACKAGE_NAME to packageName,
MSG_DATA_ACCOUNT to account
)
}).data?.getString(MSG_DATA_PLAYER)
}

suspend fun setPlayer(context: Context, packageName: String, account: Account, player: String?) {
suspend fun setPlayer(context: Context, account: Account, player: String?) {
singleRequest(context, Message.obtain().apply {
what = MSG_SET_PLAYER
data = bundleOf(
MSG_DATA_PACKAGE_NAME to packageName,
MSG_DATA_ACCOUNT to account,
MSG_DATA_PLAYER to player
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@ class GamesService : BaseService(TAG, GmsService.GAMES) {
return@launchWhenStarted sendSignInRequired()
}

val player = JSONObject(GamesConfigurationService.getPlayer(this@GamesService, packageName, account)).toPlayer()
val player = JSONObject(GamesConfigurationService.getPlayer(this@GamesService, account)).toPlayer()

callback.onPostInitCompleteWithConnectionInfo(
CommonStatusCodes.SUCCESS,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -216,9 +216,9 @@ suspend fun performGamesSignIn(
val authManager = AuthManager(context, account.name, packageName, "oauth2:${realScopes.joinToString(" ")}")
if (realScopes.size == 1) authManager.setItCaveatTypes("2")
if (permitted) authManager.isPermitted = true
val authResponse = withContext(Dispatchers.IO) { authManager.requestAuthWithBackgroundResolution(true) }
var authResponse = withContext(Dispatchers.IO) { authManager.requestAuthWithBackgroundResolution(true) }
if (authResponse.auth == null) return false
if (authResponse.issueAdvice != "stored" || GamesConfigurationService.getPlayer(context, packageName, account) == null) {
if (authResponse.issueAdvice != "stored" || GamesConfigurationService.getPlayer(context, account) == null) {
suspend fun fetchSelfPlayer() = suspendCoroutine<JSONObject> { continuation ->
queue.add(
object : JsonObjectRequest(
Expand All @@ -237,39 +237,27 @@ suspend fun performGamesSignIn(
val result = try {
fetchSelfPlayer()
} catch (e: Exception) {
if (e is VolleyError && e.networkResponse?.statusCode == 404) {
registerForGames(context, account, queue)
fetchSelfPlayer()
if (e is VolleyError) {
val statusCode = e.networkResponse?.statusCode
when (statusCode) {
404 -> {
registerForGames(context, account, queue)
fetchSelfPlayer()
}
403 -> {
val gameAuthManager = AuthManager(context, account.name, GAMES_PACKAGE_NAME, authManager.service)
gameAuthManager.isPermitted = authManager.isPermitted
authResponse = withContext(Dispatchers.IO) { gameAuthManager.requestAuth(true) }
if (authResponse.auth == null) return false
fetchSelfPlayer()
}
else -> throw e
}
} else {
throw e
}
}
GamesConfigurationService.setPlayer(context, packageName, account, result.toString())
if (packageName != GAMES_PACKAGE_NAME) {
try {
suspendCoroutine { continuation ->
queue.add(object : Request<Unit>(Method.POST, "https://www.googleapis.com/games/v1/applications/played", {
continuation.resumeWithException(it)
}) {
override fun parseNetworkResponse(response: NetworkResponse): Response<Unit> {
if (response.statusCode == 204) return success(Unit, null)
return Response.error(VolleyError(response))
}

override fun deliverResponse(response: Unit) {
continuation.resume(response)
}

override fun getHeaders(): MutableMap<String, String> {
return mutableMapOf(
"Authorization" to "OAuth ${authResponse.auth}"
)
}
})
}
} catch (ignored: Exception) {
}
}
GamesConfigurationService.setPlayer(context, account, result.toString())
}
return true
}
}