Merge changes I9a8bf666,Icb9f26a9

* changes:
  Forward extras from pre call external receivers to placeCall().
  Bumped a few more tests to N.
diff --git a/java/com/android/dialer/app/voicemail/VoicemailPlaybackPresenter.java b/java/com/android/dialer/app/voicemail/VoicemailPlaybackPresenter.java
index 3a77334..917870e 100644
--- a/java/com/android/dialer/app/voicemail/VoicemailPlaybackPresenter.java
+++ b/java/com/android/dialer/app/voicemail/VoicemailPlaybackPresenter.java
@@ -89,7 +89,7 @@
  * calls into this class from outside must be done from the main UI thread.
  */
 @NotThreadSafe
-@TargetApi(VERSION_CODES.M)
+@TargetApi(VERSION_CODES.N)
 public class VoicemailPlaybackPresenter
     implements MediaPlayer.OnPreparedListener,
         MediaPlayer.OnCompletionListener,
diff --git a/java/com/android/dialer/callintent/CallIntentBuilder.java b/java/com/android/dialer/callintent/CallIntentBuilder.java
index 9d9fcf4..0f9f890 100644
--- a/java/com/android/dialer/callintent/CallIntentBuilder.java
+++ b/java/com/android/dialer/callintent/CallIntentBuilder.java
@@ -46,7 +46,8 @@
   private String callSubject;
   private boolean allowAssistedDial;
 
-  private final Bundle outgoingCallExtras = new Bundle();
+  private final Bundle inCallUiIntentExtras = new Bundle();
+  private final Bundle placeCallExtras = new Bundle();
 
   private static int lightbringerButtonAppearInExpandedCallLogItemCount = 0;
   private static int lightbringerButtonAppearInCollapsedCallLogItemCount = 0;
@@ -110,7 +111,7 @@
     isVideoCall = parcel.readInt() != 0;
     callSubject = parcel.readString();
     allowAssistedDial = parcel.readInt() != 0;
-    outgoingCallExtras.putAll(parcel.readBundle(classLoader));
+    inCallUiIntentExtras.putAll(parcel.readBundle(classLoader));
   }
 
   public static CallIntentBuilder forVoicemail(
@@ -170,8 +171,16 @@
   }
 
   /** Additional data the in call UI can read with {@link Details#getIntentExtras()} */
-  public Bundle getOutgoingCallExtras() {
-    return outgoingCallExtras;
+  public Bundle getInCallUiIntentExtras() {
+    return inCallUiIntentExtras;
+  }
+
+  /**
+   * Other extras that should be used with {@link TelecomManager#placeCall(Uri, Bundle)}. This will
+   * override everything set by the CallIntentBuilder
+   */
+  public Bundle getPlaceCallExtras() {
+    return placeCallExtras;
   }
 
   /**
@@ -186,11 +195,11 @@
         TelecomManager.EXTRA_START_CALL_WITH_VIDEO_STATE,
         isVideoCall ? VideoProfile.STATE_BIDIRECTIONAL : VideoProfile.STATE_AUDIO_ONLY);
 
-    outgoingCallExtras.putLong(
+    inCallUiIntentExtras.putLong(
         Constants.EXTRA_CALL_CREATED_TIME_MILLIS, SystemClock.elapsedRealtime());
-    CallIntentParser.putCallSpecificAppData(outgoingCallExtras, callSpecificAppData);
+    CallIntentParser.putCallSpecificAppData(inCallUiIntentExtras, callSpecificAppData);
 
-    intent.putExtra(TelecomManager.EXTRA_OUTGOING_CALL_EXTRAS, outgoingCallExtras);
+    intent.putExtra(TelecomManager.EXTRA_OUTGOING_CALL_EXTRAS, inCallUiIntentExtras);
 
     if (phoneAccountHandle != null) {
       intent.putExtra(TelecomManager.EXTRA_PHONE_ACCOUNT_HANDLE, phoneAccountHandle);
@@ -200,6 +209,8 @@
       intent.putExtra(TelecomManager.EXTRA_CALL_SUBJECT, callSubject);
     }
 
+    intent.putExtras(placeCallExtras);
+
     return intent;
   }
 
@@ -257,7 +268,7 @@
     dest.writeInt(isVideoCall ? 1 : 0);
     dest.writeString(callSubject);
     dest.writeInt(allowAssistedDial ? 1 : 0);
-    dest.writeBundle(outgoingCallExtras);
+    dest.writeBundle(inCallUiIntentExtras);
   }
 
   public static final Creator<CallIntentBuilder> CREATOR =
diff --git a/java/com/android/dialer/persistentlog/PersistentLogFileHandler.java b/java/com/android/dialer/persistentlog/PersistentLogFileHandler.java
index 8bd8335..a6067d3 100644
--- a/java/com/android/dialer/persistentlog/PersistentLogFileHandler.java
+++ b/java/com/android/dialer/persistentlog/PersistentLogFileHandler.java
@@ -53,7 +53,7 @@
  * worker thread.
  */
 @SuppressWarnings("AndroidApiChecker") // lambdas
-@TargetApi(VERSION_CODES.M)
+@TargetApi(VERSION_CODES.N)
 final class PersistentLogFileHandler {
 
   private static final String LOG_DIRECTORY = "persistent_log";
diff --git a/java/com/android/dialer/precall/externalreceiver/LaunchPreCallActivity.java b/java/com/android/dialer/precall/externalreceiver/LaunchPreCallActivity.java
index 6096d51..bf7995a 100644
--- a/java/com/android/dialer/precall/externalreceiver/LaunchPreCallActivity.java
+++ b/java/com/android/dialer/precall/externalreceiver/LaunchPreCallActivity.java
@@ -23,13 +23,16 @@
 import android.support.annotation.Nullable;
 import android.telecom.PhoneAccountHandle;
 import android.telecom.TelecomManager;
+import android.telecom.VideoProfile;
 import com.android.dialer.callintent.CallInitiationType.Type;
 import com.android.dialer.callintent.CallIntentBuilder;
+import com.android.dialer.common.LogUtil;
 import com.android.dialer.configprovider.ConfigProvider;
 import com.android.dialer.configprovider.ConfigProviderBindings;
 import com.android.dialer.logging.DialerImpression;
 import com.android.dialer.logging.Logger;
 import com.android.dialer.precall.PreCall;
+import com.google.common.collect.ImmutableList;
 
 /**
  * Activity that forwards to {@link PreCall#start(Context, CallIntentBuilder)} so the pre-call flow
@@ -50,6 +53,17 @@
 
   public static final String EXTRA_ALLOW_ASSISTED_DIAL = "allow_assisted_dial";
 
+  private static final ImmutableList<String> HANDLED_INTENT_EXTRAS =
+      ImmutableList.of(
+          TelecomManager.EXTRA_START_CALL_WITH_VIDEO_STATE,
+          TelecomManager.EXTRA_OUTGOING_CALL_EXTRAS,
+          TelecomManager.EXTRA_PHONE_ACCOUNT_HANDLE,
+          TelecomManager.EXTRA_CALL_SUBJECT,
+          EXTRA_PHONE_ACCOUNT_HANDLE,
+          EXTRA_IS_VIDEO_CALL,
+          EXTRA_CALL_SUBJECT,
+          EXTRA_ALLOW_ASSISTED_DIAL);
+
   @Override
   public void onCreate(@Nullable Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
@@ -72,7 +86,62 @@
             intent.getBooleanExtra(
                 EXTRA_ALLOW_ASSISTED_DIAL,
                 configProvider.getBoolean("assisted_dialing_default_precall_state", false)));
+    filterExtras(intent.getExtras(), builder);
     PreCall.start(this, builder);
     finish();
   }
+
+  /**
+   * Move key-value pairs that {@link CallIntentBuilder} can handle from {@code intentExtras} to
+   * {@code builder}
+   */
+  private void filterExtras(@Nullable Bundle intentExtras, CallIntentBuilder builder) {
+    if (intentExtras == null) {
+      return;
+    }
+    Bundle bundle = new Bundle();
+    bundle.putAll(intentExtras);
+
+    if (intentExtras.containsKey(TelecomManager.EXTRA_START_CALL_WITH_VIDEO_STATE)) {
+      int videoState = intentExtras.getInt(TelecomManager.EXTRA_START_CALL_WITH_VIDEO_STATE);
+      switch (videoState) {
+        case VideoProfile.STATE_BIDIRECTIONAL:
+          builder.setIsVideoCall(true);
+          break;
+        case VideoProfile.STATE_AUDIO_ONLY:
+          builder.setIsVideoCall(false);
+          break;
+        case VideoProfile.STATE_RX_ENABLED:
+        case VideoProfile.STATE_TX_ENABLED:
+          LogUtil.w(
+              "LaunchPreCallActivity.filterExtras",
+              "unsupported video state " + videoState + ", overriding to STATE_BIDIRECTIONAL");
+          builder.setIsVideoCall(true);
+          break;
+        default:
+          LogUtil.w("LaunchPreCallActivity.filterExtras", "unknown video state " + videoState);
+          builder.setIsVideoCall(false);
+      }
+    }
+
+    if (intentExtras.containsKey(TelecomManager.EXTRA_OUTGOING_CALL_EXTRAS)) {
+      builder
+          .getInCallUiIntentExtras()
+          .putAll(intentExtras.getBundle(TelecomManager.EXTRA_OUTGOING_CALL_EXTRAS));
+    }
+
+    if (intentExtras.containsKey(TelecomManager.EXTRA_PHONE_ACCOUNT_HANDLE)) {
+      builder.setPhoneAccountHandle(
+          intentExtras.getParcelable(TelecomManager.EXTRA_PHONE_ACCOUNT_HANDLE));
+    }
+
+    if (intentExtras.containsKey(TelecomManager.EXTRA_CALL_SUBJECT)) {
+      builder.setCallSubject(intentExtras.getString(TelecomManager.EXTRA_CALL_SUBJECT));
+    }
+
+    for (String handledKey : HANDLED_INTENT_EXTRAS) {
+      bundle.remove(handledKey);
+    }
+    builder.getPlaceCallExtras().putAll(bundle);
+  }
 }
diff --git a/java/com/android/dialer/precall/impl/AssistedDialAction.java b/java/com/android/dialer/precall/impl/AssistedDialAction.java
index 9ed37ac..e4e5255 100644
--- a/java/com/android/dialer/precall/impl/AssistedDialAction.java
+++ b/java/com/android/dialer/precall/impl/AssistedDialAction.java
@@ -69,10 +69,12 @@
     Optional<TransformationInfo> transformedNumber =
         assistedDialingMediator.attemptAssistedDial(phoneNumber);
     if (transformedNumber.isPresent()) {
-      builder.getOutgoingCallExtras().putBoolean(TelephonyManagerCompat.USE_ASSISTED_DIALING, true);
+      builder
+          .getInCallUiIntentExtras()
+          .putBoolean(TelephonyManagerCompat.USE_ASSISTED_DIALING, true);
       Bundle assistedDialingExtras = transformedNumber.get().toBundle();
       builder
-          .getOutgoingCallExtras()
+          .getInCallUiIntentExtras()
           .putBundle(TelephonyManagerCompat.ASSISTED_DIALING_EXTRAS, assistedDialingExtras);
       builder.setUri(
           CallUtil.getCallUri(Assert.isNotNull(transformedNumber.get().transformedNumber())));
diff --git a/java/com/android/dialer/precall/impl/CallingAccountSelector.java b/java/com/android/dialer/precall/impl/CallingAccountSelector.java
index a5dc6a0..56b392b 100644
--- a/java/com/android/dialer/precall/impl/CallingAccountSelector.java
+++ b/java/com/android/dialer/precall/impl/CallingAccountSelector.java
@@ -160,7 +160,7 @@
                       "CallingAccountSelector.processPreferredAccount", "Auto selected suggestion");
                   builder.setPhoneAccountHandle(result.getSuggestion().get().phoneAccountHandle);
                   builder
-                      .getOutgoingCallExtras()
+                      .getInCallUiIntentExtras()
                       .putString(
                           SuggestionProvider.EXTRA_SIM_SUGGESTION_REASON,
                           result.getSuggestion().get().reason.name());