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