From 8a5830bd10ee8607eb213bf332296d31ccc1af46 Mon Sep 17 00:00:00 2001 From: Tsang <249315285+William17738@users.noreply.github.com> Date: Sun, 22 Mar 2026 02:24:29 +0800 Subject: [PATCH 1/2] init --- .../microg/gms/auth/login/LoginActivity.java | 21 +++++++------------ 1 file changed, 8 insertions(+), 13 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 8b55858e8e..c06a57a75b 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 @@ -290,20 +290,15 @@ private static void prepareWebViewSettings(Context context, WebSettings settings } private void start() { - ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); - NetworkInfo networkInfo = cm.getActiveNetworkInfo(); - if (networkInfo != null && networkInfo.isConnected()) { - if (LastCheckinInfo.read(this).getAndroidId() == 0) { - new Thread(() -> { - Runnable next; - next = checkin(false) ? this::loadLoginPage : () -> showError(R.string.auth_general_error_desc); - LoginActivity.this.runOnUiThread(next); - }).start(); - } else { - loadLoginPage(); - } + // Network check bypassed - always proceed (VPN/proxy connections not detected by getActiveNetworkInfo) + if (LastCheckinInfo.read(this).getAndroidId() == 0) { + new Thread(() -> { + Runnable next; + next = checkin(false) ? this::loadLoginPage : () -> showError(R.string.auth_general_error_desc); + LoginActivity.this.runOnUiThread(next); + }).start(); } else { - showError(R.string.no_network_error_desc); + loadLoginPage(); } } From 915f9bfa3870984a506e131d69b2b2e38d3f466f Mon Sep 17 00:00:00 2001 From: Tsang <249315285+William17738@users.noreply.github.com> Date: Sun, 22 Mar 2026 03:11:45 +0800 Subject: [PATCH 2/2] fix(auth): use NetworkCapabilities API for login network check Replace deprecated NetworkInfo.isConnected() with NetworkCapabilities.hasCapability(NET_CAPABILITY_INTERNET) on Android M+, with fallback to the old API for older versions. The deprecated getActiveNetworkInfo() returns null on Android 14 for non-system apps using VPN connections, causing the login screen to incorrectly show "no network" on devices like Honor/Huawei where microG is installed as a user app rather than a system app. The new NetworkCapabilities API correctly detects VPN and proxy connections, fixing Google Account login on stock ROM devices. Co-Authored-By: Claude Opus 4.6 (1M context) --- .../microg/gms/auth/login/LoginActivity.java | 35 ++++++++++++++----- 1 file changed, 27 insertions(+), 8 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 c06a57a75b..29b7055859 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 @@ -25,6 +25,8 @@ import android.content.Intent; import android.graphics.Color; import android.net.ConnectivityManager; +import android.net.Network; +import android.net.NetworkCapabilities; import android.net.NetworkInfo; import android.net.Uri; import android.os.Bundle; @@ -290,15 +292,32 @@ private static void prepareWebViewSettings(Context context, WebSettings settings } private void start() { - // Network check bypassed - always proceed (VPN/proxy connections not detected by getActiveNetworkInfo) - if (LastCheckinInfo.read(this).getAndroidId() == 0) { - new Thread(() -> { - Runnable next; - next = checkin(false) ? this::loadLoginPage : () -> showError(R.string.auth_general_error_desc); - LoginActivity.this.runOnUiThread(next); - }).start(); + if (isNetworkAvailable()) { + if (LastCheckinInfo.read(this).getAndroidId() == 0) { + new Thread(() -> { + Runnable next; + next = checkin(false) ? this::loadLoginPage : () -> showError(R.string.auth_general_error_desc); + LoginActivity.this.runOnUiThread(next); + }).start(); + } else { + loadLoginPage(); + } + } else { + showError(R.string.no_network_error_desc); + } + } + + private boolean isNetworkAvailable() { + ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); + if (cm == null) return false; + if (SDK_INT >= android.os.Build.VERSION_CODES.M) { + Network network = cm.getActiveNetwork(); + if (network == null) return false; + NetworkCapabilities caps = cm.getNetworkCapabilities(network); + return caps != null && caps.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET); } else { - loadLoginPage(); + NetworkInfo networkInfo = cm.getActiveNetworkInfo(); + return networkInfo != null && networkInfo.isConnected(); } }