diff --git a/play-services-base/src/main/aidl/com/google/android/gms/common/internal/service/ICommonCallbacks.aidl b/play-services-base/src/main/aidl/com/google/android/gms/common/internal/service/ICommonCallbacks.aidl new file mode 100644 index 0000000000..4862a846bf --- /dev/null +++ b/play-services-base/src/main/aidl/com/google/android/gms/common/internal/service/ICommonCallbacks.aidl @@ -0,0 +1,10 @@ +/* + * SPDX-FileCopyrightText: 2026 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.common.internal.service; + +interface ICommonCallbacks { + void onClearDefaultAccountResult(int statusCode); +} \ No newline at end of file diff --git a/play-services-base/src/main/aidl/com/google/android/gms/common/internal/service/ICommonService.aidl b/play-services-base/src/main/aidl/com/google/android/gms/common/internal/service/ICommonService.aidl new file mode 100644 index 0000000000..a07a454db5 --- /dev/null +++ b/play-services-base/src/main/aidl/com/google/android/gms/common/internal/service/ICommonService.aidl @@ -0,0 +1,12 @@ +/* + * SPDX-FileCopyrightText: 2026 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.common.internal.service; + +import com.google.android.gms.common.internal.service.ICommonCallbacks; + +interface ICommonService { + void clearDefaultAccount(in ICommonCallbacks callbacks) = 0; +} \ No newline at end of file diff --git a/play-services-core/src/main/AndroidManifest.xml b/play-services-core/src/main/AndroidManifest.xml index 6f593efdf8..92096c2db5 100644 --- a/play-services-core/src/main/AndroidManifest.xml +++ b/play-services-core/src/main/AndroidManifest.xml @@ -1164,6 +1164,12 @@ + + + + + + - diff --git a/play-services-core/src/main/kotlin/org/microg/gms/common/GmsCommonService.kt b/play-services-core/src/main/kotlin/org/microg/gms/common/GmsCommonService.kt new file mode 100644 index 0000000000..4cb8af1e7e --- /dev/null +++ b/play-services-core/src/main/kotlin/org/microg/gms/common/GmsCommonService.kt @@ -0,0 +1,50 @@ +/* + * SPDX-FileCopyrightText: 2026 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package org.microg.gms.common + +import android.content.Context +import android.util.Log +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.LifecycleOwner +import androidx.lifecycle.lifecycleScope +import com.google.android.gms.common.ConnectionResult +import com.google.android.gms.common.internal.GetServiceRequest +import com.google.android.gms.common.internal.IGmsCallbacks +import com.google.android.gms.common.internal.service.ICommonCallbacks +import com.google.android.gms.common.internal.service.ICommonService +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext +import org.microg.gms.BaseService +import org.microg.gms.auth.signin.SignInConfigurationService +import org.microg.gms.auth.signin.performSignOut + +private const val TAG = "GmsCommonService" + +class GmsCommonService : BaseService(TAG, GmsService.COMMON) { + override fun handleServiceRequest(callback: IGmsCallbacks?, request: GetServiceRequest, service: GmsService?) { + val packageName = PackageUtils.getAndCheckCallingPackage(this, request.packageName) ?: throw IllegalArgumentException("Missing package name") + Log.d(TAG, "handleServiceRequest: start: $packageName") + callback?.onPostInitComplete(ConnectionResult.SUCCESS, GmsCommonServiceImpl(this, packageName, lifecycle).asBinder(), null) + } +} + +class GmsCommonServiceImpl(val context: Context, val packageName: String, override val lifecycle: Lifecycle) : ICommonService.Stub(), LifecycleOwner { + override fun clearDefaultAccount(callbacks: ICommonCallbacks?) { + Log.d(TAG, "clearDefaultAccount: packageName: $packageName") + lifecycleScope.launchWhenStarted { + withContext(Dispatchers.IO) { + val authOptions = SignInConfigurationService.getDefaultOptions(context, packageName) + val authAccount = SignInConfigurationService.getDefaultAccount(context, packageName) + if (authOptions != null && authAccount != null) { + Log.d(TAG, "$packageName:clear authAccount: ${authAccount.name} authOption:($authOptions)") + performSignOut(context, packageName, authOptions, authAccount) + } + SignInConfigurationService.setDefaultSignInInfo(context, packageName, null, null) + } + runCatching { callbacks?.onClearDefaultAccountResult(0) } + } + } +} \ No newline at end of file