Merge "Setup SMS filter even if VVM is already activated"
diff --git a/java/com/android/dialer/enrichedcall/videoshare/VideoShareListener.java b/java/com/android/dialer/enrichedcall/videoshare/VideoShareListener.java
index 0e5f79f..a7d656a 100644
--- a/java/com/android/dialer/enrichedcall/videoshare/VideoShareListener.java
+++ b/java/com/android/dialer/enrichedcall/videoshare/VideoShareListener.java
@@ -16,7 +16,9 @@
 
 package com.android.dialer.enrichedcall.videoshare;
 
+import android.content.Context;
 import android.support.annotation.MainThread;
+import android.support.annotation.NonNull;
 
 /** Receives updates when video share status has changed. */
 public interface VideoShareListener {
@@ -26,5 +28,5 @@
    * invite received or canceled, or when a session changes).
    */
   @MainThread
-  void onVideoShareChanged();
+  void onVideoShareChanged(@NonNull Context context);
 }
diff --git a/java/com/android/dialer/lightbringer/Lightbringer.java b/java/com/android/dialer/lightbringer/Lightbringer.java
index 9120b24..fa57b01 100644
--- a/java/com/android/dialer/lightbringer/Lightbringer.java
+++ b/java/com/android/dialer/lightbringer/Lightbringer.java
@@ -40,7 +40,7 @@
   Intent getIntent(@NonNull Context context, @NonNull String number);
 
   @MainThread
-  void requestUpgrade(Call call);
+  void requestUpgrade(@NonNull Context context, Call call);
 
   @MainThread
   void registerListener(@NonNull LightbringerListener listener);
diff --git a/java/com/android/dialer/lightbringer/stub/LightbringerStub.java b/java/com/android/dialer/lightbringer/stub/LightbringerStub.java
index c98ae09..a030922 100644
--- a/java/com/android/dialer/lightbringer/stub/LightbringerStub.java
+++ b/java/com/android/dialer/lightbringer/stub/LightbringerStub.java
@@ -67,7 +67,7 @@
 
   @MainThread
   @Override
-  public void requestUpgrade(Call call) {
+  public void requestUpgrade(@NonNull Context context, Call call) {
     Assert.isMainThread();
     Assert.isNotNull(call);
   }
diff --git a/java/com/android/incallui/AnswerScreenPresenter.java b/java/com/android/incallui/AnswerScreenPresenter.java
index d530401..58231d5 100644
--- a/java/com/android/incallui/AnswerScreenPresenter.java
+++ b/java/com/android/incallui/AnswerScreenPresenter.java
@@ -104,7 +104,7 @@
                 DialerImpression.Type.VIDEO_CALL_REQUEST_ACCEPTED,
                 call.getUniqueCallId(),
                 call.getTimeAddedMs());
-        call.getVideoTech().acceptVideoRequest();
+        call.getVideoTech().acceptVideoRequest(context);
       }
     } else {
       if (answerVideoAsAudio) {
diff --git a/java/com/android/incallui/CallButtonPresenter.java b/java/com/android/incallui/CallButtonPresenter.java
index 658ae64..bd5bb78 100644
--- a/java/com/android/incallui/CallButtonPresenter.java
+++ b/java/com/android/incallui/CallButtonPresenter.java
@@ -294,7 +294,7 @@
             DialerImpression.Type.VIDEO_CALL_UPGRADE_REQUESTED,
             mCall.getUniqueCallId(),
             mCall.getTimeAddedMs());
-    mCall.getVideoTech().upgradeToVideo();
+    mCall.getVideoTech().upgradeToVideo(mContext);
   }
 
   @Override
@@ -360,7 +360,7 @@
     } else {
       updateCamera(
           InCallPresenter.getInstance().getInCallCameraManager().isUsingFrontFacingCamera());
-      mCall.getVideoTech().resumeTransmission();
+      mCall.getVideoTech().resumeTransmission(mContext);
     }
 
     mInCallButtonUi.setVideoPaused(pause);
diff --git a/java/com/android/incallui/NotificationBroadcastReceiver.java b/java/com/android/incallui/NotificationBroadcastReceiver.java
index 5e757cf..0daa017 100644
--- a/java/com/android/incallui/NotificationBroadcastReceiver.java
+++ b/java/com/android/incallui/NotificationBroadcastReceiver.java
@@ -95,7 +95,7 @@
     } else {
       DialerCall call = callList.getVideoUpgradeRequestCall();
       if (call != null) {
-        call.getVideoTech().acceptVideoRequest();
+        call.getVideoTech().acceptVideoRequest(context);
       }
     }
   }
diff --git a/java/com/android/incallui/videotech/VideoTech.java b/java/com/android/incallui/videotech/VideoTech.java
index 79a8c60..e3753bc 100644
--- a/java/com/android/incallui/videotech/VideoTech.java
+++ b/java/com/android/incallui/videotech/VideoTech.java
@@ -17,6 +17,7 @@
 package com.android.incallui.videotech;
 
 import android.content.Context;
+import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
 import com.android.dialer.logging.DialerImpression;
 import com.android.incallui.video.protocol.VideoCallScreen;
@@ -48,9 +49,9 @@
   @SessionModificationState
   int getSessionModificationState();
 
-  void upgradeToVideo();
+  void upgradeToVideo(@NonNull Context context);
 
-  void acceptVideoRequest();
+  void acceptVideoRequest(@NonNull Context context);
 
   void acceptVideoRequestAsAudio();
 
@@ -60,7 +61,7 @@
 
   void stopTransmission();
 
-  void resumeTransmission();
+  void resumeTransmission(@NonNull Context context);
 
   void pause();
 
diff --git a/java/com/android/incallui/videotech/empty/EmptyVideoTech.java b/java/com/android/incallui/videotech/empty/EmptyVideoTech.java
index 34dd1bf..76766df 100644
--- a/java/com/android/incallui/videotech/empty/EmptyVideoTech.java
+++ b/java/com/android/incallui/videotech/empty/EmptyVideoTech.java
@@ -17,6 +17,7 @@
 package com.android.incallui.videotech.empty;
 
 import android.content.Context;
+import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
 import com.android.dialer.common.Assert;
 import com.android.incallui.video.protocol.VideoCallScreen;
@@ -65,10 +66,10 @@
   }
 
   @Override
-  public void upgradeToVideo() {}
+  public void upgradeToVideo(@NonNull Context context) {}
 
   @Override
-  public void acceptVideoRequest() {}
+  public void acceptVideoRequest(@NonNull Context context) {}
 
   @Override
   public void acceptVideoRequestAsAudio() {}
@@ -85,7 +86,7 @@
   public void stopTransmission() {}
 
   @Override
-  public void resumeTransmission() {}
+  public void resumeTransmission(@NonNull Context context) {}
 
   @Override
   public void pause() {}
diff --git a/java/com/android/incallui/videotech/ims/ImsVideoCallCallback.java b/java/com/android/incallui/videotech/ims/ImsVideoCallCallback.java
index 49170b8..954dfcd 100644
--- a/java/com/android/incallui/videotech/ims/ImsVideoCallCallback.java
+++ b/java/com/android/incallui/videotech/ims/ImsVideoCallCallback.java
@@ -16,6 +16,7 @@
 
 package com.android.incallui.videotech.ims;
 
+import android.content.Context;
 import android.os.Handler;
 import android.telecom.Call;
 import android.telecom.Connection;
@@ -37,17 +38,20 @@
   private final Call call;
   private final ImsVideoTech videoTech;
   private final VideoTechListener listener;
+  private final Context context;
   private int requestedVideoState = VideoProfile.STATE_AUDIO_ONLY;
 
   ImsVideoCallCallback(
       final LoggingBindings logger,
       final Call call,
       ImsVideoTech videoTech,
-      VideoTechListener listener) {
+      VideoTechListener listener,
+      Context context) {
     this.logger = logger;
     this.call = call;
     this.videoTech = videoTech;
     this.listener = listener;
+    this.context = context;
   }
 
   @Override
@@ -74,7 +78,7 @@
       } else {
         LogUtil.i(
             "ImsVideoTech.onSessionModifyRequestReceived", "call updated to %d", newVideoState);
-        videoTech.acceptVideoRequest();
+        videoTech.acceptVideoRequest(context);
       }
     }
   }
diff --git a/java/com/android/incallui/videotech/ims/ImsVideoTech.java b/java/com/android/incallui/videotech/ims/ImsVideoTech.java
index fec05dc..c12474d 100644
--- a/java/com/android/incallui/videotech/ims/ImsVideoTech.java
+++ b/java/com/android/incallui/videotech/ims/ImsVideoTech.java
@@ -18,6 +18,7 @@
 
 import android.content.Context;
 import android.os.Build;
+import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
 import android.telecom.Call;
 import android.telecom.Call.Details;
@@ -120,7 +121,7 @@
     }
 
     if (callback == null) {
-      callback = new ImsVideoCallCallback(logger, call, this, listener);
+      callback = new ImsVideoCallCallback(logger, call, this, listener, context);
       call.getVideoCall().registerCallback(callback);
     }
 
@@ -165,7 +166,7 @@
   }
 
   @Override
-  public void upgradeToVideo() {
+  public void upgradeToVideo(@NonNull Context context) {
     LogUtil.enterBlock("ImsVideoTech.upgradeToVideo");
 
     int unpausedVideoState = getUnpausedVideoState(call.getDetails().getVideoState());
@@ -177,7 +178,7 @@
   }
 
   @Override
-  public void acceptVideoRequest() {
+  public void acceptVideoRequest(@NonNull Context context) {
     int requestedVideoState = callback.getRequestedVideoState();
     Assert.checkArgument(requestedVideoState != VideoProfile.STATE_AUDIO_ONLY);
     LogUtil.i("ImsVideoTech.acceptUpgradeRequest", "videoState: " + requestedVideoState);
@@ -223,7 +224,7 @@
   }
 
   @Override
-  public void resumeTransmission() {
+  public void resumeTransmission(@NonNull Context context) {
     LogUtil.enterBlock("ImsVideoTech.resumeTransmission");
 
     transmissionStopped = false;
diff --git a/java/com/android/incallui/videotech/lightbringer/LightbringerTech.java b/java/com/android/incallui/videotech/lightbringer/LightbringerTech.java
index 4882ba8..a807759 100644
--- a/java/com/android/incallui/videotech/lightbringer/LightbringerTech.java
+++ b/java/com/android/incallui/videotech/lightbringer/LightbringerTech.java
@@ -21,7 +21,6 @@
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
 import android.telecom.Call;
-import com.android.contacts.common.compat.telecom.TelecomManagerCompat;
 import com.android.dialer.common.Assert;
 import com.android.dialer.common.LogUtil;
 import com.android.dialer.configprovider.ConfigProviderBindings;
@@ -55,7 +54,7 @@
 
   @Override
   public boolean isAvailable(Context context) {
-    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
+    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {
       LogUtil.v("LightbringerTech.isAvailable", "upgrade unavailable, only supported on O+");
       return false;
     }
@@ -71,11 +70,6 @@
       return false;
     }
 
-    if (!TelecomManagerCompat.supportsHandover()) {
-      LogUtil.v("LightbringerTech.isAvailable", "upgrade unavailable, telephony support missing");
-      return false;
-    }
-
     if (!lightbringer.supportsUpgrade(context, callingNumber)) {
       LogUtil.v("LightbringerTech.isAvailable", "upgrade unavailable, number does not support it");
       return false;
@@ -125,13 +119,13 @@
   }
 
   @Override
-  public void upgradeToVideo() {
+  public void upgradeToVideo(@NonNull Context context) {
     listener.onImpressionLoggingNeeded(DialerImpression.Type.LIGHTBRINGER_UPGRADE_REQUESTED);
-    lightbringer.requestUpgrade(call);
+    lightbringer.requestUpgrade(context, call);
   }
 
   @Override
-  public void acceptVideoRequest() {
+  public void acceptVideoRequest(@NonNull Context context) {
     throw Assert.createUnsupportedOperationFailException();
   }
 
@@ -156,7 +150,7 @@
   }
 
   @Override
-  public void resumeTransmission() {
+  public void resumeTransmission(@NonNull Context context) {
     throw Assert.createUnsupportedOperationFailException();
   }
 
diff --git a/java/com/android/voicemail/impl/ActivationTask.java b/java/com/android/voicemail/impl/ActivationTask.java
index d7a122c..29c91e0 100644
--- a/java/com/android/voicemail/impl/ActivationTask.java
+++ b/java/com/android/voicemail/impl/ActivationTask.java
@@ -170,7 +170,9 @@
 
     if (VvmAccountManager.isAccountActivated(getContext(), phoneAccountHandle)) {
       VvmLog.i(TAG, "Account is already activated");
-      onSuccess(getContext(), phoneAccountHandle);
+      // The activated state might come from restored data, the filter still needs to be set up.
+      helper.activateSmsFilter();
+      onSuccess(getContext(), phoneAccountHandle, helper);
       return;
     }
     helper.handleEvent(
@@ -230,7 +232,7 @@
             + message.getReturnCode());
     if (message.getProvisioningStatus().equals(OmtpConstants.SUBSCRIBER_READY)) {
       VvmLog.d(TAG, "subscriber ready, no activation required");
-      updateSource(getContext(), phoneAccountHandle, message);
+      updateSource(getContext(), phoneAccountHandle, message, helper);
     } else {
       if (helper.supportsProvisioning()) {
         VvmLog.i(TAG, "Subscriber not ready, start provisioning");
@@ -240,7 +242,7 @@
         VvmLog.i(TAG, "Subscriber new but provisioning is not supported");
         // Ignore the non-ready state and attempt to use the provided info as is.
         // This is probably caused by not completing the new user tutorial.
-        updateSource(getContext(), phoneAccountHandle, message);
+        updateSource(getContext(), phoneAccountHandle, message, helper);
       } else {
         VvmLog.i(TAG, "Subscriber not ready but provisioning is not supported");
         helper.handleEvent(status, OmtpEvents.CONFIG_SERVICE_NOT_AVAILABLE);
@@ -251,20 +253,23 @@
   }
 
   private static void updateSource(
-      Context context, PhoneAccountHandle phone, StatusMessage message) {
+      Context context,
+      PhoneAccountHandle phone,
+      StatusMessage message,
+      OmtpVvmCarrierConfigHelper config) {
 
     if (OmtpConstants.SUCCESS.equals(message.getReturnCode())) {
       // Save the IMAP credentials in preferences so they are persistent and can be retrieved.
       VvmAccountManager.addAccount(context, phone, message);
-      onSuccess(context, phone);
+      onSuccess(context, phone, config);
     } else {
       VvmLog.e(TAG, "Visual voicemail not available for subscriber.");
     }
   }
 
-  private static void onSuccess(Context context, PhoneAccountHandle phoneAccountHandle) {
-    OmtpVvmCarrierConfigHelper helper = new OmtpVvmCarrierConfigHelper(context, phoneAccountHandle);
-    helper.handleEvent(
+  private static void onSuccess(
+      Context context, PhoneAccountHandle phoneAccountHandle, OmtpVvmCarrierConfigHelper config) {
+    config.handleEvent(
         VoicemailStatus.edit(context, phoneAccountHandle),
         OmtpEvents.CONFIG_REQUEST_STATUS_SUCCESS);
     clearLegacyVoicemailNotification(context, phoneAccountHandle);
diff --git a/java/com/android/voicemail/impl/settings/VisualVoicemailSettingsUtil.java b/java/com/android/voicemail/impl/settings/VisualVoicemailSettingsUtil.java
index 9ce32a9..ae526d1 100644
--- a/java/com/android/voicemail/impl/settings/VisualVoicemailSettingsUtil.java
+++ b/java/com/android/voicemail/impl/settings/VisualVoicemailSettingsUtil.java
@@ -16,6 +16,7 @@
 package com.android.voicemail.impl.settings;
 
 import android.content.Context;
+import android.support.annotation.VisibleForTesting;
 import android.telecom.PhoneAccountHandle;
 import com.android.dialer.common.Assert;
 import com.android.voicemail.VoicemailComponent;
@@ -28,7 +29,7 @@
 /** Save whether or not a particular account is enabled in shared to be retrieved later. */
 public class VisualVoicemailSettingsUtil {
 
-  private static final String IS_ENABLED_KEY = "is_enabled";
+  @VisibleForTesting public static final String IS_ENABLED_KEY = "is_enabled";
 
   public static void setEnabled(
       Context context, PhoneAccountHandle phoneAccount, boolean isEnabled) {