Merge changes I9b4919e9,I15419178,Ib0f46aed,If592be8c

* changes:
  Fix Lightbringer call upgrading when Dialer was not in memory before the call
  Handle null host for secret code
  Dont start a service to cancel missed call notifications, use DialerExecutor instead
  Fix NPE when user click on call log.
diff --git a/Android.mk b/Android.mk
index b779a6a..cf4adc7 100644
--- a/Android.mk
+++ b/Android.mk
@@ -85,6 +85,7 @@
 	$(BASE_DIR)/dialer/dialpadview/res \
 	$(BASE_DIR)/dialer/enrichedcall/simulator/res \
 	$(BASE_DIR)/dialer/interactions/res \
+	$(BASE_DIR)/dialer/lettertile/res \
 	$(BASE_DIR)/dialer/main/impl/res \
 	$(BASE_DIR)/dialer/notification/res \
 	$(BASE_DIR)/dialer/oem/res \
@@ -146,6 +147,7 @@
 	$(BASE_DIR)/dialer/enrichedcall/simulator/AndroidManifest.xml \
 	$(BASE_DIR)/dialer/interactions/AndroidManifest.xml \
 	$(BASE_DIR)/dialer/main/impl/AndroidManifest.xml \
+	$(BASE_DIR)/dialer/lettertile/AndroidManifest.xml \
 	$(BASE_DIR)/dialer/notification/AndroidManifest.xml \
 	$(BASE_DIR)/dialer/oem/AndroidManifest.xml \
 	$(BASE_DIR)/dialer/phonenumberutil/AndroidManifest.xml \
@@ -222,6 +224,7 @@
 	--extra-packages com.android.dialer.enrichedcall.simulator \
 	--extra-packages com.android.dialer.interactions \
 	--extra-packages com.android.dialer.main.impl \
+	--extra-packages com.android.dialer.lettertile \
 	--extra-packages com.android.dialer.notification \
 	--extra-packages com.android.dialer.oem \
 	--extra-packages com.android.dialer.phonenumberutil \
diff --git a/java/com/android/contacts/common/ContactPhotoManager.java b/java/com/android/contacts/common/ContactPhotoManager.java
index fbf51cc..e860501 100644
--- a/java/com/android/contacts/common/ContactPhotoManager.java
+++ b/java/com/android/contacts/common/ContactPhotoManager.java
@@ -28,9 +28,9 @@
 import android.view.View;
 import android.widget.ImageView;
 import android.widget.QuickContactBadge;
-import com.android.contacts.common.lettertiles.LetterTileDrawable;
 import com.android.contacts.common.util.UriUtils;
 import com.android.dialer.common.LogUtil;
+import com.android.dialer.lettertile.LetterTileDrawable;
 import com.android.dialer.util.PermissionsUtil;
 
 /** Asynchronously loads contact photos and maintains a cache of photos. */
diff --git a/java/com/android/contacts/common/ContactPhotoManagerImpl.java b/java/com/android/contacts/common/ContactPhotoManagerImpl.java
index 28ecf34..ea31795 100644
--- a/java/com/android/contacts/common/ContactPhotoManagerImpl.java
+++ b/java/com/android/contacts/common/ContactPhotoManagerImpl.java
@@ -1220,20 +1220,23 @@
           InputStream is = null;
           if (scheme.equals("http") || scheme.equals("https")) {
             TrafficStats.setThreadStatsTag(TrafficStatsTags.CONTACT_PHOTO_DOWNLOAD_TAG);
-            final HttpURLConnection connection =
-                (HttpURLConnection) new URL(uri.toString()).openConnection();
-
-            // Include the user agent if it is specified.
-            if (!TextUtils.isEmpty(mUserAgent)) {
-              connection.setRequestProperty("User-Agent", mUserAgent);
-            }
             try {
-              is = connection.getInputStream();
-            } catch (IOException e) {
-              connection.disconnect();
-              is = null;
+              final HttpURLConnection connection =
+                  (HttpURLConnection) new URL(uri.toString()).openConnection();
+
+              // Include the user agent if it is specified.
+              if (!TextUtils.isEmpty(mUserAgent)) {
+                connection.setRequestProperty("User-Agent", mUserAgent);
+              }
+              try {
+                is = connection.getInputStream();
+              } catch (IOException e) {
+                connection.disconnect();
+                is = null;
+              }
+            } finally {
+              TrafficStats.clearThreadStatsTag();
             }
-            TrafficStats.clearThreadStatsTag();
           } else {
             is = mResolver.openInputStream(uri);
           }
diff --git a/java/com/android/contacts/common/dialog/CallSubjectDialog.java b/java/com/android/contacts/common/dialog/CallSubjectDialog.java
index 88fac02..81012e2 100644
--- a/java/com/android/contacts/common/dialog/CallSubjectDialog.java
+++ b/java/com/android/contacts/common/dialog/CallSubjectDialog.java
@@ -45,11 +45,11 @@
 import android.widget.TextView;
 import com.android.contacts.common.ContactPhotoManager;
 import com.android.contacts.common.R;
-import com.android.contacts.common.lettertiles.LetterTileDrawable;
 import com.android.dialer.animation.AnimUtils;
 import com.android.dialer.callintent.CallInitiationType;
 import com.android.dialer.callintent.CallIntentBuilder;
 import com.android.dialer.common.LogUtil;
+import com.android.dialer.lettertile.LetterTileDrawable;
 import com.android.dialer.util.ViewUtil;
 import java.nio.charset.Charset;
 import java.util.ArrayList;
diff --git a/java/com/android/contacts/common/list/PhoneNumberListAdapter.java b/java/com/android/contacts/common/list/PhoneNumberListAdapter.java
index d1118c3..87fc496 100644
--- a/java/com/android/contacts/common/list/PhoneNumberListAdapter.java
+++ b/java/com/android/contacts/common/list/PhoneNumberListAdapter.java
@@ -37,7 +37,6 @@
 import com.android.contacts.common.compat.DirectoryCompat;
 import com.android.contacts.common.compat.PhoneCompat;
 import com.android.contacts.common.extensions.PhoneDirectoryExtenderAccessor;
-import com.android.contacts.common.lettertiles.LetterTileDrawable;
 import com.android.contacts.common.list.ContactListItemView.CallToAction;
 import com.android.contacts.common.preference.ContactsPreferences;
 import com.android.contacts.common.util.Constants;
@@ -47,6 +46,7 @@
 import com.android.dialer.enrichedcall.EnrichedCallCapabilities;
 import com.android.dialer.enrichedcall.EnrichedCallComponent;
 import com.android.dialer.enrichedcall.EnrichedCallManager;
+import com.android.dialer.lettertile.LetterTileDrawable;
 import com.android.dialer.lightbringer.LightbringerComponent;
 import com.android.dialer.location.GeoUtil;
 import com.android.dialer.util.CallUtil;
@@ -404,7 +404,7 @@
     if (action == ContactListItemView.NONE) {
       EnrichedCallManager manager = EnrichedCallComponent.get(mContext).getEnrichedCallManager();
       EnrichedCallCapabilities capabilities = manager.getCapabilities(number);
-      if (capabilities != null && capabilities.supportsCallComposer()) {
+      if (capabilities != null && capabilities.isCallComposerCapable()) {
         action = ContactListItemView.CALL_AND_SHARE;
       } else if (capabilities == null
           && getQueryString() != null
diff --git a/java/com/android/contacts/common/list/PhoneNumberPickerFragment.java b/java/com/android/contacts/common/list/PhoneNumberPickerFragment.java
index 558f3b2..2ab1217 100644
--- a/java/com/android/contacts/common/list/PhoneNumberPickerFragment.java
+++ b/java/com/android/contacts/common/list/PhoneNumberPickerFragment.java
@@ -353,7 +353,7 @@
         if (view.getCallToAction() != ContactListItemView.NONE
             || view.getPhoneNumber() == null
             || manager.getCapabilities(view.getPhoneNumber()) == null
-            || !manager.getCapabilities(view.getPhoneNumber()).supportsCallComposer()) {
+            || !manager.getCapabilities(view.getPhoneNumber()).isCallComposerCapable()) {
           continue;
         }
         view.setCallToAction(ContactListItemView.CALL_AND_SHARE, listener, view.getPosition());
diff --git a/java/com/android/contacts/common/res/values/colors.xml b/java/com/android/contacts/common/res/values/colors.xml
index 20b28c9..ca87341 100644
--- a/java/com/android/contacts/common/res/values/colors.xml
+++ b/java/com/android/contacts/common/res/values/colors.xml
@@ -20,8 +20,6 @@
 
   <color name="focus_color">#44ff0000</color>
 
-  <color name="spam_contact_background">#A52714</color>
-
   <!-- Color of ripples used for views with dark backgrounds -->
   <color name="dialer_ripple_material_dark">#a0ffffff</color>
 
@@ -59,25 +57,6 @@
   <color name="textColorIconOverlay">#fff</color>
   <color name="textColorIconOverlayShadow">#000</color>
 
-
-
-  <array name="letter_tile_colors">
-    <item>#DB4437</item>
-    <item>#E91E63</item>
-    <item>#9C27B0</item>
-    <item>#673AB7</item>
-    <item>#3F51B5</item>
-    <item>#4285F4</item>
-    <item>#039BE5</item>
-    <item>#0097A7</item>
-    <item>#009688</item>
-    <item>#0F9D58</item>
-    <item>#689F38</item>
-    <item>#EF6C00</item>
-    <item>#FF5722</item>
-    <item>#757575</item>
-  </array>
-
   <!-- Darker versions of letter_tile_colors, two shades darker. These colors are used
       for settings secondary activity colors. -->
   <array name="letter_tile_colors_dark">
@@ -104,11 +83,6 @@
           this is Blue Grey 700 -->
   <color name="quickcontact_default_photo_tint_color_dark">#455A64</color>
 
-
-  <color name="letter_tile_default_color">#cccccc</color>
-
-  <color name="letter_tile_font_color">#ffffff</color>
-
   <color name="contactscommon_actionbar_background_color">@color/dialer_theme_color</color>
   <!-- Color for icons in the actionbar -->
   <color name="actionbar_icon_color">#ffffff</color>
diff --git a/java/com/android/contacts/common/res/values/dimens.xml b/java/com/android/contacts/common/res/values/dimens.xml
index 26f095f..74e1547 100644
--- a/java/com/android/contacts/common/res/values/dimens.xml
+++ b/java/com/android/contacts/common/res/values/dimens.xml
@@ -83,12 +83,6 @@
   <dimen name="contact_phone_list_empty_description_size">20sp</dimen>
   <dimen name="contact_phone_list_empty_description_padding">10dip</dimen>
 
-  <!-- Dimensions for contact letter tiles -->
-  <dimen name="tile_letter_font_size">40dp</dimen>
-  <dimen name="tile_letter_font_size_small">20dp</dimen>
-  <dimen name="tile_divider_width">1dp</dimen>
-  <item name="letter_to_tile_ratio" type="dimen">67%</item>
-
   <!-- Height of the floating action button -->
   <dimen name="floating_action_button_height">56dp</dimen>
   <!-- Width of the floating action button -->
diff --git a/java/com/android/dialer/app/calllog/CallLogAdapter.java b/java/com/android/dialer/app/calllog/CallLogAdapter.java
index 86590ac..0e8112c 100644
--- a/java/com/android/dialer/app/calllog/CallLogAdapter.java
+++ b/java/com/android/dialer/app/calllog/CallLogAdapter.java
@@ -347,7 +347,7 @@
           EnrichedCallCapabilities capabilities =
               getEnrichedCallManager().getCapabilities(viewHolder.number);
           viewHolder.isCallComposerCapable =
-              capabilities != null && capabilities.supportsCallComposer();
+              capabilities != null && capabilities.isCallComposerCapable();
           generateAndMapNewCallDetailsEntriesHistoryResults(
               viewHolder.number,
               viewHolder.getDetailedPhoneDetails(),
@@ -879,7 +879,7 @@
       getEnrichedCallManager().requestCapabilities(number);
       return false;
     }
-    return capabilities.supportsCallComposer();
+    return capabilities.isCallComposerCapable();
   }
 
   @NonNull
diff --git a/java/com/android/dialer/app/calllog/CallLogListItemViewHolder.java b/java/com/android/dialer/app/calllog/CallLogListItemViewHolder.java
index 6b97bd6..9eccdd3 100644
--- a/java/com/android/dialer/app/calllog/CallLogListItemViewHolder.java
+++ b/java/com/android/dialer/app/calllog/CallLogListItemViewHolder.java
@@ -53,8 +53,6 @@
 import com.android.contacts.common.ContactPhotoManager;
 import com.android.contacts.common.compat.PhoneNumberUtilsCompat;
 import com.android.contacts.common.dialog.CallSubjectDialog;
-import com.android.contacts.common.lettertiles.LetterTileDrawable;
-import com.android.contacts.common.lettertiles.LetterTileDrawable.ContactType;
 import com.android.contacts.common.util.UriUtils;
 import com.android.dialer.app.DialtactsActivity;
 import com.android.dialer.app.R;
@@ -75,6 +73,8 @@
 import com.android.dialer.configprovider.ConfigProviderBindings;
 import com.android.dialer.dialercontact.DialerContact;
 import com.android.dialer.dialercontact.SimDetails;
+import com.android.dialer.lettertile.LetterTileDrawable;
+import com.android.dialer.lettertile.LetterTileDrawable.ContactType;
 import com.android.dialer.lightbringer.Lightbringer;
 import com.android.dialer.lightbringer.LightbringerComponent;
 import com.android.dialer.logging.ContactSource;
diff --git a/java/com/android/dialer/app/contactinfo/ContactPhotoLoader.java b/java/com/android/dialer/app/contactinfo/ContactPhotoLoader.java
index 4c8e32a..537acd0 100644
--- a/java/com/android/dialer/app/contactinfo/ContactPhotoLoader.java
+++ b/java/com/android/dialer/app/contactinfo/ContactPhotoLoader.java
@@ -25,10 +25,10 @@
 import android.support.annotation.VisibleForTesting;
 import android.support.v4.graphics.drawable.RoundedBitmapDrawable;
 import android.support.v4.graphics.drawable.RoundedBitmapDrawableFactory;
-import com.android.contacts.common.lettertiles.LetterTileDrawable;
 import com.android.dialer.app.R;
 import com.android.dialer.common.Assert;
 import com.android.dialer.common.LogUtil;
+import com.android.dialer.lettertile.LetterTileDrawable;
 import com.android.dialer.location.GeoUtil;
 import com.android.dialer.phonenumbercache.ContactInfo;
 import com.android.dialer.phonenumbercache.ContactInfoHelper;
diff --git a/java/com/android/dialer/app/filterednumber/BlockedNumbersFragment.java b/java/com/android/dialer/app/filterednumber/BlockedNumbersFragment.java
index f53a458..db119ab 100644
--- a/java/com/android/dialer/app/filterednumber/BlockedNumbersFragment.java
+++ b/java/com/android/dialer/app/filterednumber/BlockedNumbersFragment.java
@@ -31,7 +31,6 @@
 import android.view.ViewGroup;
 import android.widget.ImageView;
 import android.widget.TextView;
-import com.android.contacts.common.lettertiles.LetterTileDrawable;
 import com.android.dialer.app.R;
 import com.android.dialer.blocking.BlockedNumbersMigrator;
 import com.android.dialer.blocking.BlockedNumbersMigrator.Listener;
@@ -40,6 +39,7 @@
 import com.android.dialer.blocking.FilteredNumbersUtil.CheckForSendToVoicemailContactListener;
 import com.android.dialer.blocking.FilteredNumbersUtil.ImportSendToVoicemailContactsListener;
 import com.android.dialer.database.FilteredNumberContract;
+import com.android.dialer.lettertile.LetterTileDrawable;
 import com.android.dialer.voicemailstatus.VisualVoicemailEnabledChecker;
 
 public class BlockedNumbersFragment extends ListFragment
diff --git a/java/com/android/dialer/app/filterednumber/NumbersAdapter.java b/java/com/android/dialer/app/filterednumber/NumbersAdapter.java
index d98395e..b8bf86d 100644
--- a/java/com/android/dialer/app/filterednumber/NumbersAdapter.java
+++ b/java/com/android/dialer/app/filterednumber/NumbersAdapter.java
@@ -28,10 +28,10 @@
 import android.widget.TextView;
 import com.android.contacts.common.ContactPhotoManager;
 import com.android.contacts.common.ContactPhotoManager.DefaultImageRequest;
-import com.android.contacts.common.lettertiles.LetterTileDrawable;
 import com.android.contacts.common.util.UriUtils;
 import com.android.dialer.app.R;
 import com.android.dialer.compat.CompatUtils;
+import com.android.dialer.lettertile.LetterTileDrawable;
 import com.android.dialer.phonenumbercache.ContactInfo;
 import com.android.dialer.phonenumbercache.ContactInfoHelper;
 import com.android.dialer.phonenumberutil.PhoneNumberHelper;
diff --git a/java/com/android/dialer/app/list/PhoneFavoriteTileView.java b/java/com/android/dialer/app/list/PhoneFavoriteTileView.java
index 30870eb..ef88479 100644
--- a/java/com/android/dialer/app/list/PhoneFavoriteTileView.java
+++ b/java/com/android/dialer/app/list/PhoneFavoriteTileView.java
@@ -25,13 +25,13 @@
 import android.widget.ImageView;
 import com.android.contacts.common.ContactPhotoManager.DefaultImageRequest;
 import com.android.contacts.common.MoreContactUtils;
-import com.android.contacts.common.lettertiles.LetterTileDrawable;
 import com.android.contacts.common.list.ContactEntry;
 import com.android.contacts.common.list.ContactTileView;
 import com.android.dialer.app.R;
 import com.android.dialer.callintent.CallInitiationType;
 import com.android.dialer.callintent.CallSpecificAppData;
 import com.android.dialer.callintent.SpeedDialContactType;
+import com.android.dialer.lettertile.LetterTileDrawable;
 import com.android.dialer.logging.InteractionEvent;
 import com.android.dialer.logging.Logger;
 
diff --git a/java/com/android/dialer/calllogutils/CallEntryFormatter.java b/java/com/android/dialer/calllogutils/CallEntryFormatter.java
index 6aa93af..8288ea9 100644
--- a/java/com/android/dialer/calllogutils/CallEntryFormatter.java
+++ b/java/com/android/dialer/calllogutils/CallEntryFormatter.java
@@ -95,9 +95,20 @@
       // example output: "1s"
       formatPattern =
           context.getString(R.string.call_duration_short_format_pattern, "s", secondsString);
+
+      // Temporary work around for a broken Hebrew(iw) translation.
+      if (formatPattern.endsWith("\'\'")) {
+        formatPattern = formatPattern.substring(0, formatPattern.length() - 1);
+      }
     }
-    SimpleDateFormat format = new SimpleDateFormat(formatPattern);
-    return format.format(new Date(TimeUnit.SECONDS.toMillis(elapsedSeconds)));
+
+    // If new translation issues arise, we should catch them here to prevent crashes.
+    try {
+      return new SimpleDateFormat(formatPattern)
+          .format(new Date(TimeUnit.SECONDS.toMillis(elapsedSeconds)));
+    } catch (Exception e) {
+      return "";
+    }
   }
 
   private static CharSequence formatDurationA11y(Context context, long elapsedSeconds) {
diff --git a/java/com/android/dialer/common/AndroidManifest.xml b/java/com/android/dialer/common/AndroidManifest.xml
index ae43d66..8892b58 100644
--- a/java/com/android/dialer/common/AndroidManifest.xml
+++ b/java/com/android/dialer/common/AndroidManifest.xml
@@ -1,3 +1,18 @@
+<!--
+  ~ Copyright (C) 2017 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License
+  -->
 <manifest
   package="com.android.dialer.common">
 </manifest>
diff --git a/java/com/android/dialer/common/concurrent/DefaultDialerExecutorFactory.java b/java/com/android/dialer/common/concurrent/DefaultDialerExecutorFactory.java
index 82e517d..a87bbce 100644
--- a/java/com/android/dialer/common/concurrent/DefaultDialerExecutorFactory.java
+++ b/java/com/android/dialer/common/concurrent/DefaultDialerExecutorFactory.java
@@ -166,17 +166,7 @@
             });
 
     private static final Executor defaultParallelExecutor =
-        Executors.newFixedThreadPool(
-            5,
-            new ThreadFactory() {
-              @Override
-              public Thread newThread(Runnable runnable) {
-                LogUtil.i("NonUiTaskBuilder.newThread", "creating parallel thread");
-                Thread thread = new Thread(runnable, "NonUiTaskBuilder-Parallel");
-                thread.setPriority(4); // Corresponds to Process.THREAD_PRIORITY_BACKGROUND
-                return thread;
-              }
-            });
+        DialerExecutors.getLowPriorityThreadPool();
 
     NonUiTaskBuilder(Worker<InputT, OutputT> worker) {
       this(worker, defaultSerialExecutorService, defaultParallelExecutor);
diff --git a/java/com/android/dialer/common/concurrent/DialerExecutors.java b/java/com/android/dialer/common/concurrent/DialerExecutors.java
index 148d866..81b3c5c 100644
--- a/java/com/android/dialer/common/concurrent/DialerExecutors.java
+++ b/java/com/android/dialer/common/concurrent/DialerExecutors.java
@@ -19,7 +19,11 @@
 import android.app.FragmentManager;
 import android.support.annotation.NonNull;
 import com.android.dialer.common.Assert;
+import com.android.dialer.common.LogUtil;
 import com.android.dialer.common.concurrent.DialerExecutor.Worker;
+import java.util.concurrent.Executor;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ThreadFactory;
 
 /**
  * Factory methods for creating {@link DialerExecutor} objects for doing background work.
@@ -131,4 +135,27 @@
       @NonNull Worker<InputT, OutputT> worker) {
     return new DefaultDialerExecutorFactory().createNonUiTaskBuilder(Assert.isNotNull(worker));
   }
+
+  private static final Executor lowPriorityThreadPool =
+      Executors.newFixedThreadPool(
+          5,
+          new ThreadFactory() {
+            @Override
+            public Thread newThread(Runnable runnable) {
+              LogUtil.i("DialerExecutors.newThread", "creating low priority thread");
+              Thread thread = new Thread(runnable, "DialerExecutors-LowPriority");
+              thread.setPriority(4); // Corresponds to Process.THREAD_PRIORITY_BACKGROUND
+              return thread;
+            }
+          });
+
+  /**
+   * An application-wide thread pool used for low priority (non-UI) tasks.
+   *
+   * <p>This exists to prevent each individual dialer component from having to create its own
+   * threads/pools, which would result in the application having more threads than really necessary.
+   */
+  public static Executor getLowPriorityThreadPool() {
+    return lowPriorityThreadPool;
+  }
 }
diff --git a/java/com/android/dialer/common/res/values/strings.xml b/java/com/android/dialer/common/res/values/strings.xml
index 8e96161..770f42f 100644
--- a/java/com/android/dialer/common/res/values/strings.xml
+++ b/java/com/android/dialer/common/res/values/strings.xml
@@ -1,4 +1,19 @@
 <?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright (C) 2017 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License
+  -->
 <resources>
   <string name="network_name_wifi">Wifi</string>
   <string name="network_name_mobile">Mobile</string>
diff --git a/java/com/android/dialer/constants/TrafficStatsTags.java b/java/com/android/dialer/constants/TrafficStatsTags.java
index b473402..1eca784 100644
--- a/java/com/android/dialer/constants/TrafficStatsTags.java
+++ b/java/com/android/dialer/constants/TrafficStatsTags.java
@@ -18,17 +18,16 @@
 
 /** Registry of tags for {@link android.net.TrafficStats#setThreadStatsTag(int)} */
 public class TrafficStatsTags {
-  public static final int CONTACT_PHOTO_DOWNLOAD_TAG = 0x0001;
-  public static final int NEARBY_PLACES_TAG = 0xaaaa;
-  public static final int REVERSE_LOOKUP_CONTACT_TAG = 0xbaaa;
-  public static final int REVERSE_LOOKUP_IMAGE_TAG = 0xbaab;
-  public static final int DOWNLOAD_LOCATION_MAP_TAG = 0xd000;
-  public static final int REVERSE_GEOCODE_TAG = 0xd001;
-  public static final int VISUAL_VOICEMAIL_TAG = 0xd002;
-  public static final int DIALER_VOIP_TAG = 0xd003;
+  public static final int CONTACT_PHOTO_DOWNLOAD_TAG = 0x00000001;
+  public static final int NEARBY_PLACES_TAG = 0x00000002;
+  public static final int REVERSE_LOOKUP_CONTACT_TAG = 0x00000003;
+  public static final int REVERSE_LOOKUP_IMAGE_TAG = 0x00000004;
+  public static final int DOWNLOAD_LOCATION_MAP_TAG = 0x00000005;
+  public static final int REVERSE_GEOCODE_TAG = 0x00000006;
+  public static final int VISUAL_VOICEMAIL_TAG = 0x00000007;
 
-  // 0xFFFFFE00 to 0xFFFFFF00 reserved for proprietary extensions to the dialer app.
+  // 0xfffffe00 to 0xffffff00 reserved for proprietary extensions to the dialer app.
 
-  // 0xFFFFFF00 to 0xFFFFFFFF reserved by the system (see TrafficStats#getAndSetThreadStatsTag)
+  // 0xffffff00 to 0xffffffff reserved by the system (see TrafficStats#getAndSetThreadStatsTag)
 
 }
diff --git a/java/com/android/dialer/contactsfragment/ContactsAdapter.java b/java/com/android/dialer/contactsfragment/ContactsAdapter.java
index d8ee3d1..ae2728e 100644
--- a/java/com/android/dialer/contactsfragment/ContactsAdapter.java
+++ b/java/com/android/dialer/contactsfragment/ContactsAdapter.java
@@ -27,8 +27,8 @@
 import android.view.View;
 import android.view.ViewGroup;
 import com.android.contacts.common.ContactPhotoManager;
-import com.android.contacts.common.lettertiles.LetterTileDrawable;
 import com.android.dialer.common.Assert;
+import com.android.dialer.lettertile.LetterTileDrawable;
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 
diff --git a/java/com/android/dialer/enrichedcall/EnrichedCallCapabilities.java b/java/com/android/dialer/enrichedcall/EnrichedCallCapabilities.java
index c3c78c9..32054e8 100644
--- a/java/com/android/dialer/enrichedcall/EnrichedCallCapabilities.java
+++ b/java/com/android/dialer/enrichedcall/EnrichedCallCapabilities.java
@@ -22,18 +22,53 @@
 @AutoValue
 public abstract class EnrichedCallCapabilities {
 
-  public static final EnrichedCallCapabilities NO_CAPABILITIES =
-      EnrichedCallCapabilities.create(false, false, false);
+  public static final EnrichedCallCapabilities NO_CAPABILITIES = builder().build();
 
-  public static EnrichedCallCapabilities create(
-      boolean supportsCallComposer, boolean supportsPostCall, boolean supportsVideoCall) {
-    return new AutoValue_EnrichedCallCapabilities(
-        supportsCallComposer, supportsPostCall, supportsVideoCall);
+  public static final EnrichedCallCapabilities ALL_CAPABILITIES =
+      builder()
+          .setCallComposerCapable(true)
+          .setPostCallCapable(true)
+          .setVideoShareCapable(true)
+          .build();
+
+  public abstract boolean isCallComposerCapable();
+
+  public abstract boolean isPostCallCapable();
+
+  public abstract boolean isVideoShareCapable();
+
+  public abstract Builder toBuilder();
+
+  /**
+   * Returns {@code true} if these capabilities represent those of a user that is temporarily
+   * unavailable. This is an indication that capabilities should be refreshed.
+   */
+  public abstract boolean isTemporarilyUnavailable();
+
+  /**
+   * Creates an instance of {@link Builder}.
+   *
+   * <p>Unless otherwise set, all fields will default to false.
+   */
+  public static Builder builder() {
+    return new AutoValue_EnrichedCallCapabilities.Builder()
+        .setCallComposerCapable(false)
+        .setPostCallCapable(false)
+        .setVideoShareCapable(false)
+        .setTemporarilyUnavailable(false);
   }
 
-  public abstract boolean supportsCallComposer();
+  /** Creates instances of {@link EnrichedCallCapabilities}. */
+  @AutoValue.Builder
+  public abstract static class Builder {
+    public abstract Builder setCallComposerCapable(boolean isCapable);
 
-  public abstract boolean supportsPostCall();
+    public abstract Builder setPostCallCapable(boolean isCapable);
 
-  public abstract boolean supportsVideoShare();
+    public abstract Builder setVideoShareCapable(boolean isCapable);
+
+    public abstract Builder setTemporarilyUnavailable(boolean temporarilyUnavailable);
+
+    public abstract EnrichedCallCapabilities build();
+  }
 }
diff --git a/java/com/android/dialer/lettertile/AndroidManifest.xml b/java/com/android/dialer/lettertile/AndroidManifest.xml
new file mode 100644
index 0000000..dce6806
--- /dev/null
+++ b/java/com/android/dialer/lettertile/AndroidManifest.xml
@@ -0,0 +1,18 @@
+<!--
+  ~ Copyright (C) 2017 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License
+  -->
+<manifest
+  package="com.android.dialer.lettertile">
+</manifest>
diff --git a/java/com/android/contacts/common/lettertiles/LetterTileDrawable.java b/java/com/android/dialer/lettertile/LetterTileDrawable.java
similarity index 98%
rename from java/com/android/contacts/common/lettertiles/LetterTileDrawable.java
rename to java/com/android/dialer/lettertile/LetterTileDrawable.java
index 73809c4..c8b75c5 100644
--- a/java/com/android/contacts/common/lettertiles/LetterTileDrawable.java
+++ b/java/com/android/dialer/lettertile/LetterTileDrawable.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.android.contacts.common.lettertiles;
+package com.android.dialer.lettertile;
 
 import android.content.res.Resources;
 import android.content.res.TypedArray;
@@ -33,7 +33,6 @@
 import android.support.annotation.Nullable;
 import android.telecom.TelecomManager;
 import android.text.TextUtils;
-import com.android.contacts.common.R;
 import com.android.dialer.common.Assert;
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
@@ -55,6 +54,7 @@
 
   /** Contact type constants */
   public static final int TYPE_PERSON = 1;
+
   public static final int TYPE_BUSINESS = 2;
   public static final int TYPE_VOICEMAIL = 3;
   /**
@@ -62,6 +62,7 @@
    * situations where a contact is anonymous.
    */
   public static final int TYPE_GENERIC_AVATAR = 4;
+
   public static final int TYPE_SPAM = 5;
   public static final int TYPE_CONFERENCE = 6;
   @ContactType public static final int TYPE_DEFAULT = TYPE_PERSON;
@@ -128,8 +129,7 @@
     mDefaultSpamAvatar = res.getDrawable(R.drawable.quantum_ic_report_vd_theme_24, null);
     mDefaultConferenceAvatar = res.getDrawable(R.drawable.quantum_ic_group_vd_theme_24, null);
 
-    mPaint.setTypeface(
-        Typeface.create(res.getString(R.string.letter_tile_letter_font_family), Typeface.NORMAL));
+    mPaint.setTypeface(Typeface.create("sans-serif-medium", Typeface.NORMAL));
     mPaint.setTextAlign(Align.CENTER);
     mPaint.setAntiAlias(true);
     mPaint.setFilterBitmap(true);
diff --git a/java/com/android/dialer/lettertile/res/values/colors.xml b/java/com/android/dialer/lettertile/res/values/colors.xml
new file mode 100644
index 0000000..406b490
--- /dev/null
+++ b/java/com/android/dialer/lettertile/res/values/colors.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright (C) 2017 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License
+  -->
+<resources>
+  <array name="letter_tile_colors">
+    <item>#DB4437</item>
+    <item>#E91E63</item>
+    <item>#9C27B0</item>
+    <item>#673AB7</item>
+    <item>#3F51B5</item>
+    <item>#4285F4</item>
+    <item>#039BE5</item>
+    <item>#0097A7</item>
+    <item>#009688</item>
+    <item>#0F9D58</item>
+    <item>#689F38</item>
+    <item>#EF6C00</item>
+    <item>#FF5722</item>
+    <item>#757575</item>
+  </array>
+
+  <color name="spam_contact_background">#A52714</color>
+
+  <color name="letter_tile_default_color">#cccccc</color>
+
+  <color name="letter_tile_font_color">#ffffff</color>
+</resources>
\ No newline at end of file
diff --git a/java/com/android/dialer/lettertile/res/values/dimens.xml b/java/com/android/dialer/lettertile/res/values/dimens.xml
new file mode 100644
index 0000000..c804431
--- /dev/null
+++ b/java/com/android/dialer/lettertile/res/values/dimens.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright (C) 2017 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License
+  -->
+<resources>
+  <!-- Dimensions for contact letter tiles -->
+  <item name="letter_to_tile_ratio" type="dimen">67%</item>
+</resources>
\ No newline at end of file
diff --git a/java/com/android/dialer/postcall/PostCall.java b/java/com/android/dialer/postcall/PostCall.java
index 6d9ad01..c4922cd 100644
--- a/java/com/android/dialer/postcall/PostCall.java
+++ b/java/com/android/dialer/postcall/PostCall.java
@@ -79,7 +79,7 @@
         LogUtil.sanitizePhoneNumber(getPhoneNumber(activity)),
         capabilities);
 
-    boolean isRcsPostCall = capabilities != null && capabilities.supportsPostCall();
+    boolean isRcsPostCall = capabilities != null && capabilities.isPostCallCapable();
     String actionText =
         isRcsPostCall
             ? activity.getString(R.string.post_call_add_message)
diff --git a/java/com/android/dialer/searchfragment/cp2/SearchContactViewHolder.java b/java/com/android/dialer/searchfragment/cp2/SearchContactViewHolder.java
index d3df02f..36c206e 100644
--- a/java/com/android/dialer/searchfragment/cp2/SearchContactViewHolder.java
+++ b/java/com/android/dialer/searchfragment/cp2/SearchContactViewHolder.java
@@ -31,10 +31,10 @@
 import android.widget.QuickContactBadge;
 import android.widget.TextView;
 import com.android.contacts.common.ContactPhotoManager;
-import com.android.contacts.common.lettertiles.LetterTileDrawable;
 import com.android.dialer.callintent.CallInitiationType.Type;
 import com.android.dialer.callintent.CallIntentBuilder;
 import com.android.dialer.common.Assert;
+import com.android.dialer.lettertile.LetterTileDrawable;
 import com.android.dialer.searchfragment.common.Projections;
 import com.android.dialer.searchfragment.common.QueryBoldingUtil;
 import com.android.dialer.searchfragment.common.R;
diff --git a/java/com/android/dialer/searchfragment/nearbyplaces/NearbyPlaceViewHolder.java b/java/com/android/dialer/searchfragment/nearbyplaces/NearbyPlaceViewHolder.java
index b6e5a90..0fc227d 100644
--- a/java/com/android/dialer/searchfragment/nearbyplaces/NearbyPlaceViewHolder.java
+++ b/java/com/android/dialer/searchfragment/nearbyplaces/NearbyPlaceViewHolder.java
@@ -25,9 +25,9 @@
 import android.widget.QuickContactBadge;
 import android.widget.TextView;
 import com.android.contacts.common.ContactPhotoManager;
-import com.android.contacts.common.lettertiles.LetterTileDrawable;
 import com.android.dialer.callintent.CallInitiationType;
 import com.android.dialer.callintent.CallIntentBuilder;
+import com.android.dialer.lettertile.LetterTileDrawable;
 import com.android.dialer.searchfragment.common.Projections;
 import com.android.dialer.searchfragment.common.QueryBoldingUtil;
 import com.android.dialer.searchfragment.common.R;
diff --git a/java/com/android/dialer/shortcuts/IconFactory.java b/java/com/android/dialer/shortcuts/IconFactory.java
index 4ec964c..7aad112 100644
--- a/java/com/android/dialer/shortcuts/IconFactory.java
+++ b/java/com/android/dialer/shortcuts/IconFactory.java
@@ -33,8 +33,8 @@
 import android.support.annotation.WorkerThread;
 import android.support.v4.graphics.drawable.RoundedBitmapDrawable;
 import android.support.v4.graphics.drawable.RoundedBitmapDrawableFactory;
-import com.android.contacts.common.lettertiles.LetterTileDrawable;
 import com.android.dialer.common.Assert;
+import com.android.dialer.lettertile.LetterTileDrawable;
 import com.android.dialer.util.DrawableConverter;
 import java.io.InputStream;
 
diff --git a/java/com/android/incallui/ReturnToCallController.java b/java/com/android/incallui/ReturnToCallController.java
index 33154c5..57d50ad 100644
--- a/java/com/android/incallui/ReturnToCallController.java
+++ b/java/com/android/incallui/ReturnToCallController.java
@@ -134,13 +134,11 @@
 
   @Override
   public void onDisconnect(DialerCall call) {
-    if (bubble != null && bubble.isVisible()) {
+    if (bubble != null && bubble.isVisible() && !TelecomUtil.isInCall(context)) {
       bubble.showText(context.getText(R.string.incall_call_ended));
     }
 
-    if (!TelecomUtil.isInCall(context)) {
-      hide();
-    }
+    hide();
   }
 
   @Override
diff --git a/java/com/android/incallui/StatusBarNotifier.java b/java/com/android/incallui/StatusBarNotifier.java
index 53017a1..cf564c6 100644
--- a/java/com/android/incallui/StatusBarNotifier.java
+++ b/java/com/android/incallui/StatusBarNotifier.java
@@ -60,8 +60,6 @@
 import android.text.style.ForegroundColorSpan;
 import com.android.contacts.common.ContactsUtils;
 import com.android.contacts.common.ContactsUtils.UserType;
-import com.android.contacts.common.lettertiles.LetterTileDrawable;
-import com.android.contacts.common.lettertiles.LetterTileDrawable.ContactType;
 import com.android.contacts.common.preference.ContactsPreferences;
 import com.android.contacts.common.util.BitmapUtil;
 import com.android.contacts.common.util.ContactDisplayUtils;
@@ -69,6 +67,8 @@
 import com.android.dialer.configprovider.ConfigProviderBindings;
 import com.android.dialer.enrichedcall.EnrichedCallManager;
 import com.android.dialer.enrichedcall.Session;
+import com.android.dialer.lettertile.LetterTileDrawable;
+import com.android.dialer.lettertile.LetterTileDrawable.ContactType;
 import com.android.dialer.multimedia.MultimediaData;
 import com.android.dialer.notification.NotificationChannelId;
 import com.android.dialer.oem.MotorolaUtils;
diff --git a/java/com/android/incallui/commontheme/res/values/styles.xml b/java/com/android/incallui/commontheme/res/values/styles.xml
index c0a745d..a979cc3 100644
--- a/java/com/android/incallui/commontheme/res/values/styles.xml
+++ b/java/com/android/incallui/commontheme/res/values/styles.xml
@@ -17,6 +17,11 @@
 
 <resources>
 
+  <style name="Dialer.Incall.TextAppearance" parent="android:TextAppearance.Material">
+    <item name="android:textColor">?android:textColorSecondary</item>
+    <item name="android:textSize">18sp</item>
+  </style>
+
   <style name="Dialer.Incall.TextAppearance.Large">
     <item name="android:textColor">?android:textColorPrimary</item>
     <item name="android:textSize">36sp</item>
@@ -28,11 +33,6 @@
     <item name="android:textSize">12sp</item>
   </style>
 
-  <style name="Dialer.Incall.TextAppearance" parent="android:TextAppearance.Material">
-    <item name="android:textColor">?android:textColorSecondary</item>
-    <item name="android:textSize">18sp</item>
-  </style>
-
   <style name="BottomRowIcon">
     <item name="android:layout_height">24dp</item>
     <item name="android:layout_width">24dp</item>
diff --git a/java/com/android/incallui/contactgrid/ContactGridManager.java b/java/com/android/incallui/contactgrid/ContactGridManager.java
index 502cc52..a6d7d95 100644
--- a/java/com/android/incallui/contactgrid/ContactGridManager.java
+++ b/java/com/android/incallui/contactgrid/ContactGridManager.java
@@ -30,8 +30,8 @@
 import android.widget.TextView;
 import android.widget.ViewAnimator;
 import com.android.contacts.common.compat.PhoneNumberUtilsCompat;
-import com.android.contacts.common.lettertiles.LetterTileDrawable;
 import com.android.dialer.common.Assert;
+import com.android.dialer.lettertile.LetterTileDrawable;
 import com.android.dialer.util.DrawableConverter;
 import com.android.incallui.incall.protocol.ContactPhotoType;
 import com.android.incallui.incall.protocol.PrimaryCallState;
diff --git a/java/com/android/voicemail/impl/mail/MailTransport.java b/java/com/android/voicemail/impl/mail/MailTransport.java
index 00339f0..c35e414 100644
--- a/java/com/android/voicemail/impl/mail/MailTransport.java
+++ b/java/com/android/voicemail/impl/mail/MailTransport.java
@@ -195,6 +195,8 @@
     } catch (IOException ioe) {
       LogUtils.d(TAG, ioe.toString());
       throw new MessagingException(MessagingException.IOERROR, ioe.toString());
+    } finally {
+      TrafficStats.clearThreadStatsTag();
     }
   }