Skip to content

Commit

Permalink
Improve the signOut method of AuthSignInService
Browse files Browse the repository at this point in the history
  • Loading branch information
DaVinci9196 authored and mar-v-in committed Aug 11, 2024
1 parent 2fae497 commit 9fe37ab
Show file tree
Hide file tree
Showing 4 changed files with 53 additions and 12 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,7 @@ public class GoogleSignInOptions extends AutoSafeParcelable {
private String logSessionId;

private GoogleSignInOptions() {
this.scopes = new ArrayList<>();
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -104,8 +104,12 @@ class AuthSignInServiceImpl(
lifecycleScope.launchWhenStarted {
try {
val account = account ?: options?.account ?: SignInConfigurationService.getDefaultAccount(context, packageName)
if (account != null) performSignOut(context, packageName, options, account)
SignInConfigurationService.setDefaultAccount(context, packageName, null)
if (account != null) {
val defaultOptions = SignInConfigurationService.getDefaultOptions(context, packageName)
Log.d(TAG, "$packageName:signOut defaultOptions:($defaultOptions)")
performSignOut(context, packageName, defaultOptions ?: options, account)
}
SignInConfigurationService.setDefaultSignInInfo(context, packageName, null, null)
runCatching { callbacks.onSignOut(Status.SUCCESS) }
} catch (e: Exception) {
Log.w(TAG, e)
Expand Down Expand Up @@ -138,7 +142,7 @@ class AuthSignInServiceImpl(
authManager.invalidateAuthToken(token)
authManager.isPermitted = false
}
SignInConfigurationService.setDefaultAccount(context, packageName, account)
SignInConfigurationService.setDefaultSignInInfo(context, packageName, account, options?.toJson())
runCatching { callbacks.onRevokeAccess(Status.SUCCESS) }
} catch (e: Exception) {
Log.w(TAG, e)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import android.content.*
import android.os.*
import androidx.core.content.getSystemService
import androidx.core.os.bundleOf
import com.google.android.gms.auth.api.signin.GoogleSignInOptions
import org.microg.gms.auth.AuthConstants
import org.microg.gms.common.PackageUtils
import kotlin.coroutines.resume
Expand All @@ -20,12 +21,15 @@ import kotlin.coroutines.suspendCoroutine

private const val PREFERENCES_NAME = "google_account_cache"
private const val DEFAULT_ACCOUNT_PREFIX = "default_google_account_"
private const val DEFAULT_SIGN_IN_OPTIONS_PREFIX = "default_sign_in_options_"

private const val MSG_GET_DEFAULT_ACCOUNT = 1
private const val MSG_SET_DEFAULT_ACCOUNT = 2
private const val MSG_SET_DEFAULT_SIGN_IN_INFO = 2
private const val MSG_GET_DEFAULT_OPTIONS = 3

private const val MSG_DATA_PACKAGE_NAME = "package_name"
private const val MSG_DATA_ACCOUNT = "account"
private const val MSG_DATA_SIGN_IN_OPTIONS = "google_sign_in_options"

class SignInConfigurationService : Service() {
private val preferences: SharedPreferences
Expand All @@ -46,13 +50,24 @@ class SignInConfigurationService : Service() {
)
}

MSG_SET_DEFAULT_ACCOUNT -> {
MSG_SET_DEFAULT_SIGN_IN_INFO -> {
val packageName = msg.data?.getString(MSG_DATA_PACKAGE_NAME)
val account = msg.data?.getParcelable<Account>(MSG_DATA_ACCOUNT)
packageName?.let { setDefaultAccount(it, account) }
val googleSignInOptions = msg.data?.getString(MSG_DATA_SIGN_IN_OPTIONS)
packageName?.let { setDefaultSignInInfo(it, account, googleSignInOptions) }
bundleOf(
MSG_DATA_PACKAGE_NAME to packageName,
MSG_DATA_ACCOUNT to account
MSG_DATA_ACCOUNT to account,
MSG_DATA_SIGN_IN_OPTIONS to googleSignInOptions,
)
}

MSG_GET_DEFAULT_OPTIONS -> {
val packageName = msg.data?.getString(MSG_DATA_PACKAGE_NAME)
val googleSignInOptions = packageName?.let { getDefaultOptions(it) }
bundleOf(
MSG_DATA_PACKAGE_NAME to packageName,
MSG_DATA_SIGN_IN_OPTIONS to googleSignInOptions
)
}

Expand Down Expand Up @@ -80,13 +95,24 @@ class SignInConfigurationService : Service() {
return null
}

private fun setDefaultAccount(packageName: String, account: Account?) {
private fun getDefaultOptions(packageName: String): String? {
val data = preferences.getString(DEFAULT_SIGN_IN_OPTIONS_PREFIX + getPackageNameSuffix(packageName), null)
if (data.isNullOrBlank()) return null
return data
}

private fun setDefaultSignInInfo(packageName: String, account: Account?, optionsJson: String?) {
val editor: SharedPreferences.Editor = preferences.edit()
if (account == null || account.name == AuthConstants.DEFAULT_ACCOUNT) {
editor.remove(DEFAULT_ACCOUNT_PREFIX + getPackageNameSuffix(packageName))
} else {
editor.putString(DEFAULT_ACCOUNT_PREFIX + getPackageNameSuffix(packageName), account.name)
}
if (optionsJson == null) {
editor.remove(DEFAULT_SIGN_IN_OPTIONS_PREFIX + getPackageNameSuffix(packageName))
} else {
editor.putString(DEFAULT_SIGN_IN_OPTIONS_PREFIX + getPackageNameSuffix(packageName), optionsJson)
}
editor.apply()
}

Expand Down Expand Up @@ -130,12 +156,22 @@ class SignInConfigurationService : Service() {
}).data?.getParcelable(MSG_DATA_ACCOUNT)
}

suspend fun setDefaultAccount(context: Context, packageName: String, account: Account?) {
suspend fun getDefaultOptions(context: Context, packageName: String): GoogleSignInOptions? {
return singleRequest(context, Message.obtain().apply {
what = MSG_GET_DEFAULT_OPTIONS
data = bundleOf(
MSG_DATA_PACKAGE_NAME to packageName
)
}).data?.getString(MSG_DATA_SIGN_IN_OPTIONS)?.let { GoogleSignInOptions.fromJson(it) }
}

suspend fun setDefaultSignInInfo(context: Context, packageName: String, account: Account?, optionsJson: String?) {
singleRequest(context, Message.obtain().apply {
what = MSG_SET_DEFAULT_ACCOUNT
what = MSG_SET_DEFAULT_SIGN_IN_INFO
data = bundleOf(
MSG_DATA_PACKAGE_NAME to packageName,
MSG_DATA_ACCOUNT to account
MSG_DATA_ACCOUNT to account,
MSG_DATA_SIGN_IN_OPTIONS to optionsJson
)
})
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -151,7 +151,7 @@ suspend fun performSignIn(context: Context, packageName: String, options: Google
databaseHelper.close()
}
} else listOf(null, null, null, null)
SignInConfigurationService.setDefaultAccount(context, packageName, account)
SignInConfigurationService.setDefaultSignInInfo(context, packageName, account, options?.toJson())
return GoogleSignInAccount(
id,
tokenId,
Expand Down

0 comments on commit 9fe37ab

Please sign in to comment.