Prevent VVM subscribing when carrier reset subscription status

On VVM3 when the user upgrade to premium VVM through the carrier, the carrier will actively send STATUS SMSes first indicating the status is unknown, then the new premium status.

 STATUS updates sent by the carrier were ignored until recently. Currently seeing the unknown status the provisioning process will be triggered, and the user will be downgraded back to basic VVM.

 In this CL if the STATUS update is initiated by the carrier instead by a STATUS request, provisioning will be ignored.

Bug: 73625577
Test: N/A
PiperOrigin-RevId: 186737242
Change-Id: Ieb10f9a50e0c3001d02cefc31256a9adac1ae5d1
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())) {