Merge "Wait for IPv4 before sending VVM requests." am: 787c53e1a1 am: f82b164366
Original change: https://android-review.googlesource.com/c/platform/packages/apps/Dialer/+/1724610
Change-Id: I0accb088c4ca7d9d9b19bde7d00ab4b5806ac41a
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");