Fix for http://b/issue?id=2178179 - revert to previous provider if settings change fails
diff --git a/src/com/android/phone/CallFeaturesSetting.java b/src/com/android/phone/CallFeaturesSetting.java
index 6c61a7b..154f0dc 100644
--- a/src/com/android/phone/CallFeaturesSetting.java
+++ b/src/com/android/phone/CallFeaturesSetting.java
@@ -313,6 +313,13 @@
      * due to vm provider change.
      */
     boolean mVMProviderSettingsForced = false;
+
+    /**
+     * Flag indicating that we are making changes to vm or fwd numbers
+     * due to vm provider change.
+     */
+    boolean mChangingVMorFwdDueToProviderChange = false;
+
     /**
      * Data about discovered voice mail settings providers.
      * Is populated by querying which activities can handle ACTION_CONFIGURE_VOICEMAIL.
@@ -539,6 +546,7 @@
                 }
                 return;
             }
+            mChangingVMorFwdDueToProviderChange = isVMProviderSettingsForced;
             final String fwdNum = data.getStringExtra(FWD_NUMBER_EXTRA);
 
             // TODO(iliat): It would be nice to load the current network setting for this and
@@ -809,19 +817,32 @@
         }
         if (success) {
             if (DBG) log("change VM success!");
-            showVMDialog(MSG_VM_OK);
+            handleVMAndFwdSetSuccess(MSG_VM_OK);
         } else {
             if (fwdFailure) {
                 log("change FW failed: " + exceptionMessage);
-                showVMDialog(MSG_FW_SET_EXCEPTION);
+                handleVMOrFwdSetError(MSG_FW_SET_EXCEPTION);
             } else {
                 log("change VM failed: " + exceptionMessage);
-                showVMDialog(MSG_VM_EXCEPTION);
+                handleVMOrFwdSetError(MSG_VM_EXCEPTION);
             }
         }
         updateVoiceNumberField();
     }
 
+    private void handleVMOrFwdSetError(int msgId) {
+        if (mChangingVMorFwdDueToProviderChange) {
+            switchToPreviousVoicemailProvider();
+        }
+        mChangingVMorFwdDueToProviderChange = false;
+        showVMDialog(msgId);
+    }
+
+    private void handleVMAndFwdSetSuccess(int msgId) {
+        mChangingVMorFwdDueToProviderChange = false;
+        showVMDialog(msgId);
+    }
+
     /*
      * Methods used to sync UI state with that of the network
      */