From 271cdd25a22bb770edfa48af0807f8cec19a3eb4 Mon Sep 17 00:00:00 2001 From: DaVinci9196 Date: Thu, 29 Jan 2026 20:11:06 +0800 Subject: [PATCH 1/5] 1.Avoiding ANR that may occur during login 2.fix google login missing droidguard --- .../microg/gms/auth/login/LoginActivity.java | 47 +++++++++++++++++-- .../gms/auth/login/DroidGuardHandler.kt | 42 +++++++++++++++-- 2 files changed, 79 insertions(+), 10 deletions(-) diff --git a/play-services-core/src/main/java/org/microg/gms/auth/login/LoginActivity.java b/play-services-core/src/main/java/org/microg/gms/auth/login/LoginActivity.java index 9e63a92cf5..9c2c7d480d 100644 --- a/play-services-core/src/main/java/org/microg/gms/auth/login/LoginActivity.java +++ b/play-services-core/src/main/java/org/microg/gms/auth/login/LoginActivity.java @@ -20,7 +20,6 @@ import android.accounts.AccountAuthenticatorResponse; import android.accounts.AccountManager; import android.annotation.SuppressLint; -import android.annotation.TargetApi; import android.content.Context; import android.content.Intent; import android.graphics.Color; @@ -48,11 +47,13 @@ import com.google.android.gms.R; +import org.jetbrains.annotations.NotNull; import org.json.JSONArray; import org.microg.gms.accountaction.AccountNotificationKt; import org.microg.gms.accountsettings.ui.MainActivity; import org.microg.gms.auth.AuthConstants; import org.microg.gms.auth.AuthManager; +import org.microg.gms.auth.AuthPrefs; import org.microg.gms.auth.AuthRequest; import org.microg.gms.auth.AuthResponse; import org.microg.gms.checkin.CheckinManager; @@ -66,7 +67,9 @@ import java.io.IOException; import java.security.MessageDigest; +import java.util.HashMap; import java.util.Locale; +import java.util.Map; import static android.accounts.AccountManager.PACKAGE_NAME_KEY_LEGACY_NOT_VISIBLE; import static android.accounts.AccountManager.VISIBILITY_USER_MANAGED_VISIBLE; @@ -116,6 +119,7 @@ public class LoginActivity extends AssistantActivity { private int state = 0; private boolean isReAuth = false; private Account reAuthAccount; + private volatile boolean isDestroyed = false; @SuppressLint("AddJavascriptInterface") @Override @@ -188,7 +192,7 @@ public void onPageFinished(WebView view, String url) { } retrieveGmsToken(account); } else { - retrieveRtToken(getIntent().getStringExtra(EXTRA_TOKEN)); + getAddAccountDroidGuard(getIntent().getStringExtra(EXTRA_TOKEN)); } } else if (android.os.Build.VERSION.SDK_INT < 21 || isReAuth) { init(); @@ -242,6 +246,12 @@ public void onBackPressed() { loginCanceled(); } + @Override + protected void onDestroy() { + super.onDestroy(); + isDestroyed = true; + } + private void init() { setTitle(R.string.just_a_sec); setBackButtonText(null); @@ -338,14 +348,41 @@ private void closeWeb(boolean programmaticAuth) { for (String ar1 : temp) { if (ar1.trim().startsWith(COOKIE_OAUTH_TOKEN + "=")) { String[] temp1 = ar1.split("="); - retrieveRtToken(temp1[1]); + getAddAccountDroidGuard(temp1[1]); return; } } showError(R.string.auth_general_error_desc); } - private void retrieveRtToken(String oAuthToken) { + private void getAddAccountDroidGuard(String oAuthToken) { + Map params = new HashMap<>(); + if (AuthPrefs.shouldIncludeAndroidId(this)) { + params.put("dg_androidId", Long.toHexString(LastCheckinInfo.read(this).getAndroidId())); + } + + params.put("dg_gmsCoreVersion", String.valueOf(GMS_VERSION_CODE)); + params.put("dg_package", GMS_PACKAGE_NAME); + dgHandler.getDroidGuardResultAsync("addAccount", params, new DroidGuardCallback() { + @Override + public void onSuccess(@NotNull String result) { + retrieveRtToken(oAuthToken, result); + } + + @Override + public void onError(@NotNull Throwable error) { + retrieveRtToken(oAuthToken, null); + } + }); + } + + private void retrieveRtToken(String oAuthToken, String droidguardResults) { + // Check if Activity is destroyed before proceeding + if (isDestroyed || isFinishing()) { + Log.d(TAG, "retrieveRtToken: Activity destroyed, aborting"); + return; + } + new AuthRequest().fromContext(this) .appIsGms() .callerIsGms() @@ -353,7 +390,7 @@ private void retrieveRtToken(String oAuthToken) { .token(oAuthToken).isAccessToken() .addAccount() .getAccountId() - .droidguardResults(null /*TODO*/) + .droidguardResults(droidguardResults) .getResponseAsync(new HttpFormClient.Callback() { @Override public void onResponse(AuthResponse response) { diff --git a/play-services-core/src/main/kotlin/org/microg/gms/auth/login/DroidGuardHandler.kt b/play-services-core/src/main/kotlin/org/microg/gms/auth/login/DroidGuardHandler.kt index a3b9c80c7b..cc0ec6f229 100644 --- a/play-services-core/src/main/kotlin/org/microg/gms/auth/login/DroidGuardHandler.kt +++ b/play-services-core/src/main/kotlin/org/microg/gms/auth/login/DroidGuardHandler.kt @@ -5,20 +5,52 @@ package org.microg.gms.auth.login +import android.util.Log import androidx.lifecycle.lifecycleScope import com.google.android.gms.droidguard.DroidGuardClient -import com.google.android.gms.tasks.await -import java.util.* +import com.google.android.gms.tasks.Tasks +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext +import java.util.Collections +import java.util.concurrent.TimeUnit + +private const val TAG = "DroidGuardHandler" + +interface DroidGuardCallback { + fun onSuccess(result: String) + fun onError(error: Throwable) +} class DroidGuardHandler(private val activity: LoginActivity) { fun start(dg: String) { + getDroidGuardResultAsync("minute_maid", Collections.singletonMap("dg_minutemaid", dg), object : DroidGuardCallback { + override fun onSuccess(result: String) { + Log.d(TAG, "start: result: $result") + activity.runScript("window.setDgResult('$result')") + } + + override fun onError(error: Throwable) { + Log.w(TAG, "onError: ", error) + }}) + } + + fun getDroidGuardResultAsync(flow: String, data: Map, callback: DroidGuardCallback) { activity.lifecycleScope.launchWhenStarted { + val start = System.currentTimeMillis() try { - val result = DroidGuardClient.getResults(activity, "minute_maid", Collections.singletonMap("dg_minutemaid", dg)).await() - activity.runScript("window.setDgResult('$result')") + val result = withContext(Dispatchers.IO) { + val resultTask = DroidGuardClient.getResults(activity, flow, data) + Tasks.await(resultTask, 5000, TimeUnit.MILLISECONDS) + } + Log.d(TAG, "getDroidGuardResultAsync flow:$flow result:$result") + withContext(Dispatchers.Main) { + callback.onSuccess(result) + } } catch (e: Exception) { - // Ignore + callback.onError(e) + Log.w(TAG, "getDroidGuardResultAsync : ", e) } + Log.d(TAG, "getDroidGuardResultAsync end " + (System.currentTimeMillis() - start)) } } } From 488ae5320bd149822a89e04d5b8915fddf55c4b0 Mon Sep 17 00:00:00 2001 From: DaVinci9196 Date: Wed, 4 Feb 2026 15:55:31 +0800 Subject: [PATCH 2/5] Add a check to see if droidguard is enabled. --- .../microg/gms/auth/login/LoginActivity.java | 38 +++++++++++-------- 1 file changed, 22 insertions(+), 16 deletions(-) diff --git a/play-services-core/src/main/java/org/microg/gms/auth/login/LoginActivity.java b/play-services-core/src/main/java/org/microg/gms/auth/login/LoginActivity.java index 9c2c7d480d..0bf74d4002 100644 --- a/play-services-core/src/main/java/org/microg/gms/auth/login/LoginActivity.java +++ b/play-services-core/src/main/java/org/microg/gms/auth/login/LoginActivity.java @@ -61,6 +61,7 @@ import org.microg.gms.common.Constants; import org.microg.gms.common.HttpFormClient; import org.microg.gms.common.Utils; +import org.microg.gms.droidguard.core.DroidGuardPreferences; import org.microg.gms.people.PeopleManager; import org.microg.gms.profile.Build; import org.microg.gms.profile.ProfileManager; @@ -356,24 +357,29 @@ private void closeWeb(boolean programmaticAuth) { } private void getAddAccountDroidGuard(String oAuthToken) { - Map params = new HashMap<>(); - if (AuthPrefs.shouldIncludeAndroidId(this)) { - params.put("dg_androidId", Long.toHexString(LastCheckinInfo.read(this).getAndroidId())); - } - - params.put("dg_gmsCoreVersion", String.valueOf(GMS_VERSION_CODE)); - params.put("dg_package", GMS_PACKAGE_NAME); - dgHandler.getDroidGuardResultAsync("addAccount", params, new DroidGuardCallback() { - @Override - public void onSuccess(@NotNull String result) { - retrieveRtToken(oAuthToken, result); + if (DroidGuardPreferences.isEnabled(this)) { + Map params = new HashMap<>(); + if (AuthPrefs.shouldIncludeAndroidId(this)) { + params.put("dg_androidId", Long.toHexString(LastCheckinInfo.read(this).getAndroidId())); } - @Override - public void onError(@NotNull Throwable error) { - retrieveRtToken(oAuthToken, null); - } - }); + params.put("dg_gmsCoreVersion", String.valueOf(GMS_VERSION_CODE)); + params.put("dg_package", GMS_PACKAGE_NAME); + dgHandler.getDroidGuardResultAsync("addAccount", params, new DroidGuardCallback() { + @Override + public void onSuccess(@NotNull String result) { + retrieveRtToken(oAuthToken, result); + } + + @Override + public void onError(@NotNull Throwable error) { + retrieveRtToken(oAuthToken, null); + } + }); + } else { + Log.d(TAG, "getAddAccountDroidGuard droidguard disabled"); + retrieveRtToken(oAuthToken, null); + } } private void retrieveRtToken(String oAuthToken, String droidguardResults) { From ed6210efc840a67f544644150df4b6606af6ee84 Mon Sep 17 00:00:00 2001 From: DaVinci9196 Date: Wed, 4 Feb 2026 18:58:30 +0800 Subject: [PATCH 3/5] Revert "Add a check to see if droidguard is enabled." This reverts commit 488ae5320bd149822a89e04d5b8915fddf55c4b0. --- .../microg/gms/auth/login/LoginActivity.java | 38 ++++++++----------- 1 file changed, 16 insertions(+), 22 deletions(-) diff --git a/play-services-core/src/main/java/org/microg/gms/auth/login/LoginActivity.java b/play-services-core/src/main/java/org/microg/gms/auth/login/LoginActivity.java index 0bf74d4002..9c2c7d480d 100644 --- a/play-services-core/src/main/java/org/microg/gms/auth/login/LoginActivity.java +++ b/play-services-core/src/main/java/org/microg/gms/auth/login/LoginActivity.java @@ -61,7 +61,6 @@ import org.microg.gms.common.Constants; import org.microg.gms.common.HttpFormClient; import org.microg.gms.common.Utils; -import org.microg.gms.droidguard.core.DroidGuardPreferences; import org.microg.gms.people.PeopleManager; import org.microg.gms.profile.Build; import org.microg.gms.profile.ProfileManager; @@ -357,29 +356,24 @@ private void closeWeb(boolean programmaticAuth) { } private void getAddAccountDroidGuard(String oAuthToken) { - if (DroidGuardPreferences.isEnabled(this)) { - Map params = new HashMap<>(); - if (AuthPrefs.shouldIncludeAndroidId(this)) { - params.put("dg_androidId", Long.toHexString(LastCheckinInfo.read(this).getAndroidId())); - } + Map params = new HashMap<>(); + if (AuthPrefs.shouldIncludeAndroidId(this)) { + params.put("dg_androidId", Long.toHexString(LastCheckinInfo.read(this).getAndroidId())); + } - params.put("dg_gmsCoreVersion", String.valueOf(GMS_VERSION_CODE)); - params.put("dg_package", GMS_PACKAGE_NAME); - dgHandler.getDroidGuardResultAsync("addAccount", params, new DroidGuardCallback() { - @Override - public void onSuccess(@NotNull String result) { - retrieveRtToken(oAuthToken, result); - } + params.put("dg_gmsCoreVersion", String.valueOf(GMS_VERSION_CODE)); + params.put("dg_package", GMS_PACKAGE_NAME); + dgHandler.getDroidGuardResultAsync("addAccount", params, new DroidGuardCallback() { + @Override + public void onSuccess(@NotNull String result) { + retrieveRtToken(oAuthToken, result); + } - @Override - public void onError(@NotNull Throwable error) { - retrieveRtToken(oAuthToken, null); - } - }); - } else { - Log.d(TAG, "getAddAccountDroidGuard droidguard disabled"); - retrieveRtToken(oAuthToken, null); - } + @Override + public void onError(@NotNull Throwable error) { + retrieveRtToken(oAuthToken, null); + } + }); } private void retrieveRtToken(String oAuthToken, String droidguardResults) { From 43fc555fa135a9ccf90fc0c6663e3bd1347b7a33 Mon Sep 17 00:00:00 2001 From: DaVinci9196 Date: Wed, 4 Feb 2026 18:58:37 +0800 Subject: [PATCH 4/5] Revert "1.Avoiding ANR that may occur during login" This reverts commit 271cdd25a22bb770edfa48af0807f8cec19a3eb4. --- .../microg/gms/auth/login/LoginActivity.java | 47 ++----------------- .../gms/auth/login/DroidGuardHandler.kt | 42 ++--------------- 2 files changed, 10 insertions(+), 79 deletions(-) diff --git a/play-services-core/src/main/java/org/microg/gms/auth/login/LoginActivity.java b/play-services-core/src/main/java/org/microg/gms/auth/login/LoginActivity.java index 9c2c7d480d..9e63a92cf5 100644 --- a/play-services-core/src/main/java/org/microg/gms/auth/login/LoginActivity.java +++ b/play-services-core/src/main/java/org/microg/gms/auth/login/LoginActivity.java @@ -20,6 +20,7 @@ import android.accounts.AccountAuthenticatorResponse; import android.accounts.AccountManager; import android.annotation.SuppressLint; +import android.annotation.TargetApi; import android.content.Context; import android.content.Intent; import android.graphics.Color; @@ -47,13 +48,11 @@ import com.google.android.gms.R; -import org.jetbrains.annotations.NotNull; import org.json.JSONArray; import org.microg.gms.accountaction.AccountNotificationKt; import org.microg.gms.accountsettings.ui.MainActivity; import org.microg.gms.auth.AuthConstants; import org.microg.gms.auth.AuthManager; -import org.microg.gms.auth.AuthPrefs; import org.microg.gms.auth.AuthRequest; import org.microg.gms.auth.AuthResponse; import org.microg.gms.checkin.CheckinManager; @@ -67,9 +66,7 @@ import java.io.IOException; import java.security.MessageDigest; -import java.util.HashMap; import java.util.Locale; -import java.util.Map; import static android.accounts.AccountManager.PACKAGE_NAME_KEY_LEGACY_NOT_VISIBLE; import static android.accounts.AccountManager.VISIBILITY_USER_MANAGED_VISIBLE; @@ -119,7 +116,6 @@ public class LoginActivity extends AssistantActivity { private int state = 0; private boolean isReAuth = false; private Account reAuthAccount; - private volatile boolean isDestroyed = false; @SuppressLint("AddJavascriptInterface") @Override @@ -192,7 +188,7 @@ public void onPageFinished(WebView view, String url) { } retrieveGmsToken(account); } else { - getAddAccountDroidGuard(getIntent().getStringExtra(EXTRA_TOKEN)); + retrieveRtToken(getIntent().getStringExtra(EXTRA_TOKEN)); } } else if (android.os.Build.VERSION.SDK_INT < 21 || isReAuth) { init(); @@ -246,12 +242,6 @@ public void onBackPressed() { loginCanceled(); } - @Override - protected void onDestroy() { - super.onDestroy(); - isDestroyed = true; - } - private void init() { setTitle(R.string.just_a_sec); setBackButtonText(null); @@ -348,41 +338,14 @@ private void closeWeb(boolean programmaticAuth) { for (String ar1 : temp) { if (ar1.trim().startsWith(COOKIE_OAUTH_TOKEN + "=")) { String[] temp1 = ar1.split("="); - getAddAccountDroidGuard(temp1[1]); + retrieveRtToken(temp1[1]); return; } } showError(R.string.auth_general_error_desc); } - private void getAddAccountDroidGuard(String oAuthToken) { - Map params = new HashMap<>(); - if (AuthPrefs.shouldIncludeAndroidId(this)) { - params.put("dg_androidId", Long.toHexString(LastCheckinInfo.read(this).getAndroidId())); - } - - params.put("dg_gmsCoreVersion", String.valueOf(GMS_VERSION_CODE)); - params.put("dg_package", GMS_PACKAGE_NAME); - dgHandler.getDroidGuardResultAsync("addAccount", params, new DroidGuardCallback() { - @Override - public void onSuccess(@NotNull String result) { - retrieveRtToken(oAuthToken, result); - } - - @Override - public void onError(@NotNull Throwable error) { - retrieveRtToken(oAuthToken, null); - } - }); - } - - private void retrieveRtToken(String oAuthToken, String droidguardResults) { - // Check if Activity is destroyed before proceeding - if (isDestroyed || isFinishing()) { - Log.d(TAG, "retrieveRtToken: Activity destroyed, aborting"); - return; - } - + private void retrieveRtToken(String oAuthToken) { new AuthRequest().fromContext(this) .appIsGms() .callerIsGms() @@ -390,7 +353,7 @@ private void retrieveRtToken(String oAuthToken, String droidguardResults) { .token(oAuthToken).isAccessToken() .addAccount() .getAccountId() - .droidguardResults(droidguardResults) + .droidguardResults(null /*TODO*/) .getResponseAsync(new HttpFormClient.Callback() { @Override public void onResponse(AuthResponse response) { diff --git a/play-services-core/src/main/kotlin/org/microg/gms/auth/login/DroidGuardHandler.kt b/play-services-core/src/main/kotlin/org/microg/gms/auth/login/DroidGuardHandler.kt index cc0ec6f229..a3b9c80c7b 100644 --- a/play-services-core/src/main/kotlin/org/microg/gms/auth/login/DroidGuardHandler.kt +++ b/play-services-core/src/main/kotlin/org/microg/gms/auth/login/DroidGuardHandler.kt @@ -5,52 +5,20 @@ package org.microg.gms.auth.login -import android.util.Log import androidx.lifecycle.lifecycleScope import com.google.android.gms.droidguard.DroidGuardClient -import com.google.android.gms.tasks.Tasks -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.withContext -import java.util.Collections -import java.util.concurrent.TimeUnit - -private const val TAG = "DroidGuardHandler" - -interface DroidGuardCallback { - fun onSuccess(result: String) - fun onError(error: Throwable) -} +import com.google.android.gms.tasks.await +import java.util.* class DroidGuardHandler(private val activity: LoginActivity) { fun start(dg: String) { - getDroidGuardResultAsync("minute_maid", Collections.singletonMap("dg_minutemaid", dg), object : DroidGuardCallback { - override fun onSuccess(result: String) { - Log.d(TAG, "start: result: $result") - activity.runScript("window.setDgResult('$result')") - } - - override fun onError(error: Throwable) { - Log.w(TAG, "onError: ", error) - }}) - } - - fun getDroidGuardResultAsync(flow: String, data: Map, callback: DroidGuardCallback) { activity.lifecycleScope.launchWhenStarted { - val start = System.currentTimeMillis() try { - val result = withContext(Dispatchers.IO) { - val resultTask = DroidGuardClient.getResults(activity, flow, data) - Tasks.await(resultTask, 5000, TimeUnit.MILLISECONDS) - } - Log.d(TAG, "getDroidGuardResultAsync flow:$flow result:$result") - withContext(Dispatchers.Main) { - callback.onSuccess(result) - } + val result = DroidGuardClient.getResults(activity, "minute_maid", Collections.singletonMap("dg_minutemaid", dg)).await() + activity.runScript("window.setDgResult('$result')") } catch (e: Exception) { - callback.onError(e) - Log.w(TAG, "getDroidGuardResultAsync : ", e) + // Ignore } - Log.d(TAG, "getDroidGuardResultAsync end " + (System.currentTimeMillis() - start)) } } } From 3a68bc3f1fd412cd6a9e3534d809b1ad01983423 Mon Sep 17 00:00:00 2001 From: DaVinci9196 Date: Wed, 4 Feb 2026 20:46:15 +0800 Subject: [PATCH 5/5] Setting `droidguardResults` to "null" resolves the login failure issue. --- .../src/main/java/org/microg/gms/auth/login/LoginActivity.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/play-services-core/src/main/java/org/microg/gms/auth/login/LoginActivity.java b/play-services-core/src/main/java/org/microg/gms/auth/login/LoginActivity.java index 9e63a92cf5..8b55858e8e 100644 --- a/play-services-core/src/main/java/org/microg/gms/auth/login/LoginActivity.java +++ b/play-services-core/src/main/java/org/microg/gms/auth/login/LoginActivity.java @@ -353,7 +353,7 @@ private void retrieveRtToken(String oAuthToken) { .token(oAuthToken).isAccessToken() .addAccount() .getAccountId() - .droidguardResults(null /*TODO*/) + .droidguardResults("null" /*TODO*/) .getResponseAsync(new HttpFormClient.Callback() { @Override public void onResponse(AuthResponse response) { @@ -430,6 +430,7 @@ private void retrieveGmsToken(final Account account) { .hasPermission(true) .addAccount() .getAccountId() + .droidguardResults("null") .getResponseAsync(new HttpFormClient.Callback() { @Override public void onResponse(AuthResponse response) {