Make network connectivity nonblocking for boot.

This brings auto to VIRTUAL_DEVICE_BOOT_COMPLETED even with both RIL and
wifi missing. VIRTUAL_DEVICE_MOBILE_NETWORK_CONNECTED comes up when the
mobile network is present. On auto, the mobile network connected message
still only comes up after the setup flow is completed.

Bug: 110720387
Test: Ran cuttlefish auto target locally.
Change-Id: I8bcee212f68db809fcffbba2ac16dd4628edf3ca
diff --git a/guest/monitoring/vsoc_service/java/com/android/google/gce/gceservice/ConnectivityChecker.java b/guest/monitoring/vsoc_service/java/com/android/google/gce/gceservice/ConnectivityChecker.java
index dfa23d6..1354021 100644
--- a/guest/monitoring/vsoc_service/java/com/android/google/gce/gceservice/ConnectivityChecker.java
+++ b/guest/monitoring/vsoc_service/java/com/android/google/gce/gceservice/ConnectivityChecker.java
@@ -17,6 +17,8 @@
 
 import android.content.Context;
 import android.net.ConnectivityManager;
+import android.net.Network;
+import android.net.NetworkCapabilities;
 import android.net.NetworkInfo;
 import android.util.Log;
 
@@ -24,37 +26,42 @@
 
 public class ConnectivityChecker extends JobBase {
     private static final String LOG_TAG = "GceConnChecker";
+    private static final String MOBILE_NETWORK_CONNECTED_MESSAGE =
+        "VIRTUAL_DEVICE_NETWORK_MOBILE_CONNECTED";
 
     private final Context mContext;
+    private final BootReporter mBootReporter;
     private final GceFuture<Boolean> mConnected = new GceFuture<Boolean>("Connectivity");
+    // TODO(schuffelen): Figure out why this has to be static in order to not report 3 times.
+    private static boolean reportedMobileConnectivity = false;
 
-
-    public ConnectivityChecker(Context context) {
+    public ConnectivityChecker(Context context, BootReporter bootReporter) {
         super(LOG_TAG);
         mContext = context;
+        mBootReporter = bootReporter;
     }
 
 
     @Override
     public int execute() {
         ConnectivityManager connManager = (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
-        if (mConnected.isDone()) return 0;
-
-        NetworkInfo[] networks = connManager.getAllNetworkInfo();
-        ArrayList<String> connected = new ArrayList<String>();
-        ArrayList<String> disconnected = new ArrayList<String>();
-
-        for (NetworkInfo network : networks) {
-            if (network.isConnected()) {
-                connected.add(network.getTypeName());
-                mConnected.set(true);
-                break;
-            } else {
-                disconnected.add(network.getTypeName());
-            }
+        if (mConnected.isDone()) {
+            return 0;
         }
 
-        Log.i(LOG_TAG, "Connectivity status: connected:" + connected + ", disconnected:" + disconnected);
+        Network[] networks = connManager.getAllNetworks();
+        for (Network network : networks) {
+            NetworkInfo info = connManager.getNetworkInfo(network);
+            if (info.isConnected()) {
+                NetworkCapabilities capabilities = connManager.getNetworkCapabilities(network);
+                if (capabilities != null
+                        && capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)
+                        && !reportedMobileConnectivity) {
+                    mBootReporter.reportMessage(MOBILE_NETWORK_CONNECTED_MESSAGE);
+                    reportedMobileConnectivity = true;
+                }
+            }
+        }
 
         return 0;
     }
diff --git a/guest/monitoring/vsoc_service/java/com/android/google/gce/gceservice/GceService.java b/guest/monitoring/vsoc_service/java/com/android/google/gce/gceservice/GceService.java
index 9517e57..6e8b842 100644
--- a/guest/monitoring/vsoc_service/java/com/android/google/gce/gceservice/GceService.java
+++ b/guest/monitoring/vsoc_service/java/com/android/google/gce/gceservice/GceService.java
@@ -41,7 +41,6 @@
     private static final int NETWORK_OR_BOOT_TIMEOUT = 30;
 
     private final JobExecutor mExecutor = new JobExecutor();
-    private final ConnectivityChecker mConnChecker = new ConnectivityChecker(this);
     private final LocationServicesManager mLocationServices = new LocationServicesManager(this);
     private final PackageVerifierManager mPackageVerifier = new PackageVerifierManager(this);
     private final PackageVerificationConsentEnforcer mConsentEnforcer = new PackageVerificationConsentEnforcer(this);
@@ -50,6 +49,7 @@
     private final BluetoothChecker mBluetoothChecker = new BluetoothChecker();
     private final TombstoneChecker mTombstoneChecker = new TombstoneChecker();
 
+    private ConnectivityChecker mConnChecker;
     private GceWifiManager mWifiManager = null;
     private String mMostRecentAction = null;
 
@@ -63,6 +63,7 @@
             mBootReporter.reportBootStarted();
             registerBroadcastReceivers();
 
+            mConnChecker = new ConnectivityChecker(this, mBootReporter);
             mWifiManager = new GceWifiManager(this, mBootReporter, mExecutor);
 
             mExecutor.schedule(mLocationServices);
@@ -70,6 +71,7 @@
             mExecutor.schedule(mConsentEnforcer);
             mExecutor.schedule(mWifiManager);
             mExecutor.schedule(mBluetoothChecker);
+            mExecutor.schedule(mConnChecker);
             // TODO(ender): TombstoneChecker is disabled, because we no longer have the code that
             // produces /ts_snap.txt file. We need to rethink how TombstoneChecker should work.
             // mExecutor.schedule(mTombstoneChecker);
@@ -77,7 +79,6 @@
             mExecutor.schedule(mBootReporter,
                     mLocationServices.getLocationServicesReady(),
                     mPackageVerifier.getPackageVerifierReady(),
-                    mConnChecker.getConnected(),
                     mBluetoothChecker.getEnabled()
                     // mTombstoneChecker.getTombstoneResult()
                     );
diff --git a/host/libs/monitor/kernel_log_server.cpp b/host/libs/monitor/kernel_log_server.cpp
index dcf8bce..8896b98 100644
--- a/host/libs/monitor/kernel_log_server.cpp
+++ b/host/libs/monitor/kernel_log_server.cpp
@@ -27,6 +27,7 @@
   "VIRTUAL_DEVICE_BOOT_STARTED",
   "VIRTUAL_DEVICE_BOOT_COMPLETED",
   "VIRTUAL_DEVICE_BOOT_FAILED",
+  "VIRTUAL_DEVICE_NETWORK_MOBILE_CONNECTED",
   "VIRTUAL_DEVICE_NETWORK_WIFI_CONNECTED",
 };
 }  // namespace