Merge changes I607c6af4,I452b3f2b

* changes:
  Explicitly disable strict mode during the assisted dialing action.
  Set avatar as background instead of src.
diff --git a/java/com/android/dialer/assisteddialing/ConcreteCreator.java b/java/com/android/dialer/assisteddialing/ConcreteCreator.java
index c1ffbd3..2561e28 100644
--- a/java/com/android/dialer/assisteddialing/ConcreteCreator.java
+++ b/java/com/android/dialer/assisteddialing/ConcreteCreator.java
@@ -29,6 +29,7 @@
 import com.android.dialer.common.LogUtil;
 import com.android.dialer.configprovider.ConfigProvider;
 import com.android.dialer.configprovider.ConfigProviderBindings;
+import com.android.dialer.strictmode.StrictModeUtils;
 
 /**
  * A Creator for AssistedDialingMediators.
@@ -90,8 +91,11 @@
     return new AssistedDialingMediatorImpl(
         new LocationDetector(
             telephonyManager,
-            PreferenceManager.getDefaultSharedPreferences(context)
-                .getString(context.getString(R.string.assisted_dialing_setting_cc_key), null)),
+            StrictModeUtils.bypass(
+                () ->
+                    PreferenceManager.getDefaultSharedPreferences(context)
+                        .getString(
+                            context.getString(R.string.assisted_dialing_setting_cc_key), null))),
         new NumberTransformer(constraints));
   }
 
diff --git a/java/com/android/dialer/assisteddialing/Constraints.java b/java/com/android/dialer/assisteddialing/Constraints.java
index f95312a..788b875 100644
--- a/java/com/android/dialer/assisteddialing/Constraints.java
+++ b/java/com/android/dialer/assisteddialing/Constraints.java
@@ -25,6 +25,7 @@
 import com.android.dialer.common.LogUtil;
 import com.android.dialer.logging.DialerImpression;
 import com.android.dialer.logging.Logger;
+import com.android.dialer.strictmode.StrictModeUtils;
 import com.google.i18n.phonenumbers.NumberParseException;
 import com.google.i18n.phonenumbers.PhoneNumberUtil;
 import com.google.i18n.phonenumbers.Phonenumber.PhoneNumber;
@@ -36,7 +37,7 @@
 @TargetApi(VERSION_CODES.N)
 @SuppressWarnings("AndroidApiChecker") // Use of optional
 final class Constraints {
-  private final PhoneNumberUtil phoneNumberUtil = PhoneNumberUtil.getInstance();
+  private final PhoneNumberUtil phoneNumberUtil;
   private final Context context;
   private final CountryCodeProvider countryCodeProvider;
 
@@ -56,10 +57,8 @@
       throw new NullPointerException("Provided configProviderCountryCodes cannot be null");
     }
 
-    // We allow dynamic country support only in Dialer; this should be removed in the framework
-    // implementation.
-    // TODO(erfanian): Remove in the framework implementation.
     this.countryCodeProvider = countryCodeProvider;
+    this.phoneNumberUtil = StrictModeUtils.bypass(() -> PhoneNumberUtil.getInstance());
   }
 
   /**
@@ -148,16 +147,18 @@
    */
   private Optional<PhoneNumber> parsePhoneNumber(
       @NonNull String numberToParse, @NonNull String userHomeCountryCode) {
-    try {
-      // TODO(erfanian): confirm behavior of blocking the foreground thread when moving to the
-      // framework
-      return Optional.of(phoneNumberUtil.parseAndKeepRawInput(numberToParse, userHomeCountryCode));
-    } catch (NumberParseException e) {
-      Logger.get(context)
-          .logImpression(DialerImpression.Type.ASSISTED_DIALING_CONSTRAINT_PARSING_FAILURE);
-      LogUtil.i("Constraints.parsePhoneNumber", "could not parse the number");
-      return Optional.empty();
-    }
+    return StrictModeUtils.bypass(
+        () -> {
+          try {
+            return Optional.of(
+                phoneNumberUtil.parseAndKeepRawInput(numberToParse, userHomeCountryCode));
+          } catch (NumberParseException e) {
+            Logger.get(context)
+                .logImpression(DialerImpression.Type.ASSISTED_DIALING_CONSTRAINT_PARSING_FAILURE);
+            LogUtil.i("Constraints.parsePhoneNumber", "could not parse the number");
+            return Optional.empty();
+          }
+        });
   }
 
   /** Returns a boolean indicating if the provided number is already internationally formatted. */
@@ -195,7 +196,8 @@
 
   /** Returns a boolean indicating if the provided number is considered to be a valid number. */
   private boolean isValidNumber(@NonNull Optional<PhoneNumber> parsedPhoneNumber) {
-    boolean result = PhoneNumberUtil.getInstance().isValidNumber(parsedPhoneNumber.get());
+    boolean result =
+        StrictModeUtils.bypass(() -> phoneNumberUtil.isValidNumber(parsedPhoneNumber.get()));
     LogUtil.i("Constraints.isValidNumber", String.valueOf(result));
 
     return result;
diff --git a/java/com/android/dialer/assisteddialing/NumberTransformer.java b/java/com/android/dialer/assisteddialing/NumberTransformer.java
index 0156f2e..8bbad32 100644
--- a/java/com/android/dialer/assisteddialing/NumberTransformer.java
+++ b/java/com/android/dialer/assisteddialing/NumberTransformer.java
@@ -21,6 +21,7 @@
 import android.support.annotation.NonNull;
 import android.text.TextUtils;
 import com.android.dialer.common.LogUtil;
+import com.android.dialer.strictmode.StrictModeUtils;
 import com.google.i18n.phonenumbers.NumberParseException;
 import com.google.i18n.phonenumbers.PhoneNumberUtil;
 import com.google.i18n.phonenumbers.Phonenumber.PhoneNumber;
@@ -29,11 +30,12 @@
 /** Responsible for transforming numbers to make them dialable and valid when roaming. */
 final class NumberTransformer {
 
-  private final PhoneNumberUtil phoneNumberUtil = PhoneNumberUtil.getInstance();
+  private final PhoneNumberUtil phoneNumberUtil;
   private final Constraints constraints;
 
   public NumberTransformer(Constraints constraints) {
     this.constraints = constraints;
+    this.phoneNumberUtil = StrictModeUtils.bypass(() -> PhoneNumberUtil.getInstance());
   }
 
   /**
@@ -68,16 +70,27 @@
       return Optional.empty();
     }
 
-    PhoneNumber phoneNumber;
-    try {
-      phoneNumber = phoneNumberUtil.parse(numbertoTransform, userHomeCountryCode);
-    } catch (NumberParseException e) {
-      LogUtil.i("NumberTransformer.doAssistedDialingTransformation", "number failed to parse");
+    PhoneNumber phoneNumber =
+        StrictModeUtils.bypass(
+            () -> {
+              try {
+                return phoneNumberUtil.parse(numbertoTransform, userHomeCountryCode);
+              } catch (NumberParseException e) {
+                LogUtil.i(
+                    "NumberTransformer.doAssistedDialingTransformation", "number failed to parse");
+                return null;
+              }
+            });
+
+    if (phoneNumber == null) {
       return Optional.empty();
     }
 
     String transformedNumber =
-        phoneNumberUtil.formatNumberForMobileDialing(phoneNumber, userRoamingCountryCode, true);
+        StrictModeUtils.bypass(
+            () ->
+                phoneNumberUtil.formatNumberForMobileDialing(
+                    phoneNumber, userRoamingCountryCode, true));
 
     // formatNumberForMobileDialing may return an empty String.
     if (TextUtils.isEmpty(transformedNumber)) {
diff --git a/java/com/android/newbubble/NewBubble.java b/java/com/android/newbubble/NewBubble.java
index 2e98ad1..54e56ba 100644
--- a/java/com/android/newbubble/NewBubble.java
+++ b/java/com/android/newbubble/NewBubble.java
@@ -25,7 +25,6 @@
 import android.app.PendingIntent.CanceledException;
 import android.content.Context;
 import android.content.Intent;
-import android.graphics.Outline;
 import android.graphics.PixelFormat;
 import android.graphics.Rect;
 import android.graphics.drawable.Animatable;
@@ -47,7 +46,6 @@
 import android.view.View;
 import android.view.View.AccessibilityDelegate;
 import android.view.ViewGroup;
-import android.view.ViewOutlineProvider;
 import android.view.ViewTreeObserver.OnPreDrawListener;
 import android.view.WindowManager;
 import android.view.WindowManager.LayoutParams;
@@ -525,7 +523,7 @@
   public void updateAvatar(@NonNull Drawable avatar) {
     if (!avatar.equals(currentInfo.getAvatar())) {
       currentInfo = NewBubbleInfo.from(currentInfo).setAvatar(avatar).build();
-      viewHolder.getPrimaryAvatar().setImageDrawable(currentInfo.getAvatar());
+      viewHolder.getPrimaryAvatar().setBackground(currentInfo.getAvatar());
     }
   }
 
@@ -560,7 +558,7 @@
     savedYPosition = -1;
 
     viewHolder
-        .getPrimaryButton()
+        .getPrimaryAvatar()
         .animate()
         .translationZ(
             context
@@ -569,7 +567,7 @@
   }
 
   void onMoveFinish() {
-    viewHolder.getPrimaryButton().animate().translationZ(0);
+    viewHolder.getPrimaryAvatar().animate().translationZ(0);
   }
 
   void primaryButtonClick() {
@@ -669,17 +667,9 @@
     primaryIconMoveDistance =
         context.getResources().getDimensionPixelSize(R.dimen.bubble_size)
             - context.getResources().getDimensionPixelSize(R.dimen.bubble_small_icon_size);
-    // Set boundary for primary button to show elevation (background is transparent)
-    viewHolder
-        .getPrimaryButton()
-        .setOutlineProvider(
-            new ViewOutlineProvider() {
-              @Override
-              public void getOutline(View view, Outline outline) {
-                ViewOutlineProvider.BACKGROUND.getOutline(view, outline);
-                outline.setAlpha(1);
-              }
-            });
+
+    // Avatar
+    viewHolder.getPrimaryAvatar().setBackground(currentInfo.getAvatar());
 
     // Small icon
     Drawable smallIconBackgroundCircle =
@@ -689,7 +679,6 @@
     smallIconBackgroundCircle.setTint(context.getColor(R.color.bubble_button_color_blue));
     viewHolder.getPrimaryIcon().setBackground(smallIconBackgroundCircle);
     viewHolder.getPrimaryIcon().setImageIcon(currentInfo.getPrimaryIcon());
-    viewHolder.getPrimaryAvatar().setImageDrawable(currentInfo.getAvatar());
 
     updatePrimaryIconAnimation();
     updateButtonStates();
@@ -873,6 +862,9 @@
     xValueAnimator.setInterpolator(new LinearOutSlowInInterpolator());
     xValueAnimator.addUpdateListener(
         (valueAnimator) -> {
+          if (windowParams == null) {
+            return;
+          }
           // Update windowParams and the root layout.
           // We can't do ViewPropertyAnimation since it clips children.
           float newX = (float) valueAnimator.getAnimatedValue();
diff --git a/java/com/android/newbubble/res/layout/new_bubble_base.xml b/java/com/android/newbubble/res/layout/new_bubble_base.xml
index c86d3bb..9b8250d 100644
--- a/java/com/android/newbubble/res/layout/new_bubble_base.xml
+++ b/java/com/android/newbubble/res/layout/new_bubble_base.xml
@@ -40,14 +40,13 @@
         android:layout_marginTop="@dimen/bubble_shadow_padding_size_vertical"
         android:layout_marginBottom="@dimen/bubble_shadow_padding_size_vertical"
         android:contentDescription="@string/a11y_bubble_description"
-        android:background="@drawable/bubble_shape_circle"
-        android:measureAllChildren="false"
-        android:elevation="@dimen/bubble_elevation">
+        android:measureAllChildren="false">
       <ImageView
           android:id="@+id/bubble_icon_avatar"
           android:layout_width="@dimen/bubble_size"
           android:layout_height="@dimen/bubble_size"
-          tools:src="@android:drawable/ic_btn_speak_now"/>
+          android:background="@android:drawable/ic_btn_speak_now"
+          android:elevation="@dimen/bubble_elevation"/>
       <ImageView
           android:id="@+id/bubble_icon_primary"
           android:layout_width="@dimen/bubble_small_icon_size"
@@ -59,7 +58,8 @@
           android:background="@drawable/bubble_shape_circle_small"
           android:measureAllChildren="false"
           tools:backgroundTint="#FF0000AA"
-          tools:src="@android:drawable/ic_btn_speak_now"/>
+          tools:src="@android:drawable/ic_btn_speak_now"
+          android:elevation="@dimen/bubble_dragging_elevation"/>
     </FrameLayout>
   </RelativeLayout>
   <!-- The RelativeLayout below serves as boundary for @id/bubble_expanded_layout during animation -->
diff --git a/java/com/android/newbubble/res/values/values.xml b/java/com/android/newbubble/res/values/values.xml
index 2e72c5e..f449c9b 100644
--- a/java/com/android/newbubble/res/values/values.xml
+++ b/java/com/android/newbubble/res/values/values.xml
@@ -19,6 +19,7 @@
   <dimen name="bubble_size">56dp</dimen>
   <dimen name="bubble_icon_padding">16dp</dimen>
   <dimen name="bubble_dragging_elevation_change">6dp</dimen>
+  <dimen name="bubble_dragging_elevation">12dp</dimen>
 
   <dimen name="bubble_button_height">36dp</dimen>
   <dimen name="bubble_button_icon_padding">16dp</dimen>