Merge "Wait for IPv4 before sending VVM requests."
diff --git a/java/com/android/voicemail/impl/fetch/FetchVoicemailReceiver.java b/java/com/android/voicemail/impl/fetch/FetchVoicemailReceiver.java
index 9fda373..7be22e4 100644
--- a/java/com/android/voicemail/impl/fetch/FetchVoicemailReceiver.java
+++ b/java/com/android/voicemail/impl/fetch/FetchVoicemailReceiver.java
@@ -202,6 +202,9 @@
         new Runnable() {
           @Override
           public void run() {
+            if (networkCallback != null) {
+                networkCallback.waitForIpv4();
+            }
             try {
               while (retryCount > 0) {
                 VvmLog.i(TAG, "fetching voicemail, retry count=" + retryCount);
diff --git a/java/com/android/voicemail/impl/sync/VvmNetworkRequest.java b/java/com/android/voicemail/impl/sync/VvmNetworkRequest.java
index 86d6452..a7d578d 100644
--- a/java/com/android/voicemail/impl/sync/VvmNetworkRequest.java
+++ b/java/com/android/voicemail/impl/sync/VvmNetworkRequest.java
@@ -77,7 +77,11 @@
         new FutureNetworkRequestCallback(config, handle, status);
     callback.requestNetwork();
     try {
-      return callback.getFuture().get();
+      NetworkWrapper ret = callback.getFuture().get();
+      if (ret != null) {
+          callback.waitForIpv4();
+      }
+      return ret;
     } catch (InterruptedException | ExecutionException e) {
       callback.releaseNetwork();
       VvmLog.e(TAG, "can't get future network", e);
diff --git a/java/com/android/voicemail/impl/sync/VvmNetworkRequestCallback.java b/java/com/android/voicemail/impl/sync/VvmNetworkRequestCallback.java
index c0ab678..5762a09 100644
--- a/java/com/android/voicemail/impl/sync/VvmNetworkRequestCallback.java
+++ b/java/com/android/voicemail/impl/sync/VvmNetworkRequestCallback.java
@@ -18,9 +18,12 @@
 import android.annotation.TargetApi;
 import android.content.Context;
 import android.net.ConnectivityManager;
+import android.net.InetAddresses;
+import android.net.LinkProperties;
 import android.net.Network;
 import android.net.NetworkCapabilities;
 import android.net.NetworkRequest;
+import android.os.ConditionVariable;
 import android.os.Build.VERSION_CODES;
 import android.os.Handler;
 import android.os.Looper;
@@ -125,6 +128,22 @@
     resultReceived = true;
   }
 
+  private static final int DEFAULT_IPV4_WAIT_DELAY_MS = 500; // in milliseconds
+  private final ConditionVariable mWaitV4Cv = new ConditionVariable();
+  @Override
+  @CallSuper
+  public void onLinkPropertiesChanged(Network network, LinkProperties lp) {
+    boolean hasIPv4 = (lp != null) &&
+            (lp.isReachable(InetAddresses.parseNumericAddress("8.8.8.8")));
+    if(hasIPv4) {
+        mWaitV4Cv.open();
+    }
+  }
+  public void waitForIpv4() {
+    VvmLog.w(TAG, "Waiting for IPV4 address...");
+    mWaitV4Cv.block(DEFAULT_IPV4_WAIT_DELAY_MS);
+  }
+
   @CallSuper
   public void onUnavailable() {
     VvmLog.i(TAG, "onUnavailable");