Merge "Prevent VVM subscribing when carrier reset subscription status"
am: 54c21601d9

Change-Id: I79dacf28a70919b6f0c9c44f5427a22d07269a51
diff --git a/java/com/android/voicemail/impl/ActivationTask.java b/java/com/android/voicemail/impl/ActivationTask.java
index 3cdbee4..d8ec4e2 100644
--- a/java/com/android/voicemail/impl/ActivationTask.java
+++ b/java/com/android/voicemail/impl/ActivationTask.java
@@ -196,7 +196,8 @@
     VisualVoicemailProtocol protocol = helper.getProtocol();
 
     Bundle data;
-    if (messageData != null) {
+    boolean isCarrierInitiated = messageData != null;
+    if (isCarrierInitiated) {
       // The content of STATUS SMS is provided to launch this task, no need to request it
       // again.
       data = messageData;
@@ -237,7 +238,8 @@
     } else {
       if (helper.supportsProvisioning()) {
         VvmLog.i(TAG, "Subscriber not ready, start provisioning");
-        helper.startProvisioning(this, phoneAccountHandle, status, message, data);
+        helper.startProvisioning(
+            this, phoneAccountHandle, status, message, data, isCarrierInitiated);
 
       } else if (message.getProvisioningStatus().equals(OmtpConstants.SUBSCRIBER_NEW)) {
         VvmLog.i(TAG, "Subscriber new but provisioning is not supported");
diff --git a/java/com/android/voicemail/impl/OmtpVvmCarrierConfigHelper.java b/java/com/android/voicemail/impl/OmtpVvmCarrierConfigHelper.java
index f8a9e4b..8896bc7 100644
--- a/java/com/android/voicemail/impl/OmtpVvmCarrierConfigHelper.java
+++ b/java/com/android/voicemail/impl/OmtpVvmCarrierConfigHelper.java
@@ -399,9 +399,10 @@
       PhoneAccountHandle phone,
       VoicemailStatus.Editor status,
       StatusMessage message,
-      Bundle data) {
+      Bundle data,
+      boolean isCarrierInitiated) {
     Assert.checkArgument(isValid());
-    protocol.startProvisioning(task, phone, this, status, message, data);
+    protocol.startProvisioning(task, phone, this, status, message, data, isCarrierInitiated);
   }
 
   public void requestStatus(@Nullable PendingIntent sentIntent) {
diff --git a/java/com/android/voicemail/impl/protocol/VisualVoicemailProtocol.java b/java/com/android/voicemail/impl/protocol/VisualVoicemailProtocol.java
index 6cf82f1..a2e94ed 100644
--- a/java/com/android/voicemail/impl/protocol/VisualVoicemailProtocol.java
+++ b/java/com/android/voicemail/impl/protocol/VisualVoicemailProtocol.java
@@ -57,7 +57,8 @@
       OmtpVvmCarrierConfigHelper config,
       VoicemailStatus.Editor editor,
       StatusMessage message,
-      Bundle data) {
+      Bundle data,
+      boolean isCarrierInitiated) {
     // Do nothing
   }
 
@@ -78,8 +79,8 @@
    * Translate an OMTP IMAP command to the protocol specific one. For example, changing the TUI
    * password on OMTP is XCHANGE_TUI_PWD, but on CVVM and VVM3 it is CHANGE_TUI_PWD.
    *
-   * @param command A String command in {@link OmtpConstants}, the exact
-   *     instance should be used instead of its' value.
+   * @param command A String command in {@link OmtpConstants}, the exact instance should be used
+   *     instead of its' value.
    * @returns Translated command, or {@code null} if not available in this protocol
    */
   public String getCommand(String command) {
diff --git a/java/com/android/voicemail/impl/protocol/Vvm3Protocol.java b/java/com/android/voicemail/impl/protocol/Vvm3Protocol.java
index 782386d..5e7b592 100644
--- a/java/com/android/voicemail/impl/protocol/Vvm3Protocol.java
+++ b/java/com/android/voicemail/impl/protocol/Vvm3Protocol.java
@@ -115,8 +115,17 @@
       OmtpVvmCarrierConfigHelper config,
       VoicemailStatus.Editor status,
       StatusMessage message,
-      Bundle data) {
+      Bundle data,
+      boolean isCarrierInitiated) {
     VvmLog.i(TAG, "start vvm3 provisioning");
+
+    if (isCarrierInitiated) {
+      // Carrier can send the "Status UNKNOWN, Can subscribe" status when upgrading to premium VVM.
+      // Ignore so we won't downgrade it back to basic.
+      VvmLog.w(TAG, "carrier initiated, ignoring");
+      return;
+    }
+
     LoggerUtils.logImpressionOnMainThread(
         config.getContext(), DialerImpression.Type.VVM_PROVISIONING_STARTED);
     if (OmtpConstants.SUBSCRIBER_UNKNOWN.equals(message.getProvisioningStatus())) {