Merge changes I5e589b2b,I821a700c

* changes:
  Prevent VvmNetworkRequestCallback from releasing twice
  By pass media player strict mode violation
diff --git a/java/com/android/dialer/voicemail/listui/NewVoicemailMediaPlayer.java b/java/com/android/dialer/voicemail/listui/NewVoicemailMediaPlayer.java
index 48062a8..519a0df 100644
--- a/java/com/android/dialer/voicemail/listui/NewVoicemailMediaPlayer.java
+++ b/java/com/android/dialer/voicemail/listui/NewVoicemailMediaPlayer.java
@@ -26,6 +26,7 @@
 import android.support.annotation.Nullable;
 import com.android.dialer.common.Assert;
 import com.android.dialer.common.LogUtil;
+import com.android.dialer.strictmode.StrictModeUtils;
 import java.io.IOException;
 
 /** A wrapper around {@link MediaPlayer} */
@@ -45,6 +46,7 @@
     mediaPlayer = Assert.isNotNull(player);
   }
 
+  // TODO(uabdullah): Consider removing the StrictModeUtils.bypass (a bug)
   public void prepareMediaPlayerAndPlayVoicemailWhenReady(Context context, Uri uri)
       throws IOException {
     Assert.checkArgument(uri != null, "Media player cannot play a null uri");
@@ -57,9 +59,23 @@
       voicemailUriLastPreparedOrPreparingToPlay = uri;
       verifyListenersNotNull();
       LogUtil.i("NewVoicemailMediaPlayer", "setData source");
-      mediaPlayer.setDataSource(context, uri);
+      StrictModeUtils.bypass(
+          () -> {
+            try {
+              mediaPlayer.setDataSource(context, uri);
+            } catch (IOException e) {
+              LogUtil.i(
+                  "NewVoicemailMediaPlayer",
+                  "threw an Exception when setting datasource "
+                      + e
+                      + " for uri: "
+                      + uri
+                      + "for context : "
+                      + context);
+            }
+          });
       LogUtil.i("NewVoicemailMediaPlayer", "prepare async");
-      mediaPlayer.prepareAsync();
+      StrictModeUtils.bypass(() -> mediaPlayer.prepareAsync());
     } catch (IllegalStateException e) {
       LogUtil.i(
           "NewVoicemailMediaPlayer", "caught an IllegalStateException state exception : \n" + e);
diff --git a/java/com/android/voicemail/impl/sync/VvmNetworkRequestCallback.java b/java/com/android/voicemail/impl/sync/VvmNetworkRequestCallback.java
index 60ba166..c0ab678 100644
--- a/java/com/android/voicemail/impl/sync/VvmNetworkRequestCallback.java
+++ b/java/com/android/voicemail/impl/sync/VvmNetworkRequestCallback.java
@@ -56,6 +56,7 @@
   private final VoicemailStatus.Editor status;
   private boolean requestSent = false;
   private boolean resultReceived = false;
+  private boolean released = false;
 
   public VvmNetworkRequestCallback(
       Context context, PhoneAccountHandle phoneAccount, VoicemailStatus.Editor status) {
@@ -112,7 +113,7 @@
   @Override
   @CallSuper
   public void onLost(Network network) {
-    VvmLog.d(TAG, "onLost");
+    VvmLog.i(TAG, "onLost");
     resultReceived = true;
     onFailed(NETWORK_REQUEST_FAILED_LOST);
   }
@@ -126,7 +127,7 @@
 
   @CallSuper
   public void onUnavailable() {
-    // TODO(twyen): a bug this is hidden, do we really need this?
+    VvmLog.i(TAG, "onUnavailable");
     resultReceived = true;
     onFailed(NETWORK_REQUEST_FAILED_TIMEOUT);
   }
@@ -156,8 +157,13 @@
   }
 
   public void releaseNetwork() {
-    VvmLog.d(TAG, "releaseNetwork");
-    getConnectivityManager().unregisterNetworkCallback(this);
+    VvmLog.i(TAG, "releaseNetwork");
+    if (!released) {
+      getConnectivityManager().unregisterNetworkCallback(this);
+      released = true;
+    } else {
+      VvmLog.w(TAG, "already released");
+    }
   }
 
   public ConnectivityManager getConnectivityManager() {
@@ -170,7 +176,7 @@
 
   @CallSuper
   public void onFailed(String reason) {
-    VvmLog.d(TAG, "onFailed: " + reason);
+    VvmLog.i(TAG, "onFailed: " + reason);
     if (carrierConfigHelper.isCellularDataRequired()) {
       carrierConfigHelper.handleEvent(status, OmtpEvents.DATA_NO_CONNECTION_CELLULAR_REQUIRED);
     } else {