Merge changes I620aacf3,Ie5fe2fc1,I41f98fe2 am: 30842b2099
am: 997c31b954

Change-Id: Ibe10f70972749da3dcfae330048b8fd2af98c927
diff --git a/java/com/android/dialer/app/res/layout/call_log_list_item.xml b/java/com/android/dialer/app/res/layout/call_log_list_item.xml
index 39dcbac..4382008 100644
--- a/java/com/android/dialer/app/res/layout/call_log_list_item.xml
+++ b/java/com/android/dialer/app/res/layout/call_log_list_item.xml
@@ -170,8 +170,7 @@
               android:layout_height="wrap_content"
               android:textColor="@color/call_log_voicemail_transcript_branding_color"
               android:textSize="@dimen/call_log_voicemail_transcription_text_size"
-              android:paddingTop="2dp"
-              android:maxLines="1"/>
+              android:paddingTop="2dp"/>
 
           </LinearLayout>
 
diff --git a/java/com/android/dialer/common/concurrent/DialerExecutors.java b/java/com/android/dialer/common/concurrent/DialerExecutors.java
index 81b3c5c..850c28c 100644
--- a/java/com/android/dialer/common/concurrent/DialerExecutors.java
+++ b/java/com/android/dialer/common/concurrent/DialerExecutors.java
@@ -21,7 +21,7 @@
 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.ExecutorService;
 import java.util.concurrent.Executors;
 import java.util.concurrent.ThreadFactory;
 
@@ -136,7 +136,7 @@
     return new DefaultDialerExecutorFactory().createNonUiTaskBuilder(Assert.isNotNull(worker));
   }
 
-  private static final Executor lowPriorityThreadPool =
+  private static final ExecutorService lowPriorityThreadPool =
       Executors.newFixedThreadPool(
           5,
           new ThreadFactory() {
@@ -155,7 +155,7 @@
    * <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() {
+  public static ExecutorService getLowPriorityThreadPool() {
     return lowPriorityThreadPool;
   }
 }
diff --git a/java/com/android/dialer/phonenumberproto/DialerPhoneNumberUtil.java b/java/com/android/dialer/phonenumberproto/DialerPhoneNumberUtil.java
index cc509f4..a00ee75 100644
--- a/java/com/android/dialer/phonenumberproto/DialerPhoneNumberUtil.java
+++ b/java/com/android/dialer/phonenumberproto/DialerPhoneNumberUtil.java
@@ -16,6 +16,7 @@
 
 package com.android.dialer.phonenumberproto;
 
+import android.support.annotation.AnyThread;
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
 import android.support.annotation.WorkerThread;
@@ -24,6 +25,8 @@
 import com.android.dialer.DialerPhoneNumber.RawInput;
 import com.android.dialer.common.Assert;
 import com.android.dialer.common.LogUtil;
+import com.google.common.util.concurrent.ListenableFuture;
+import com.google.common.util.concurrent.ListeningExecutorService;
 import com.google.i18n.phonenumbers.NumberParseException;
 import com.google.i18n.phonenumbers.PhoneNumberUtil;
 import com.google.i18n.phonenumbers.PhoneNumberUtil.MatchType;
@@ -46,7 +49,7 @@
   /**
    * Parses the provided raw phone number into a {@link DialerPhoneNumber}.
    *
-   * @see PhoneNumberUtil#parse(String, String)
+   * @see PhoneNumberUtil#parse(CharSequence, String)
    */
   @WorkerThread
   public DialerPhoneNumber parse(@Nullable String numberToParse, @Nullable String defaultRegion) {
@@ -73,6 +76,21 @@
   }
 
   /**
+   * Parses the provided raw phone number into a Future result of {@link DialerPhoneNumber}.
+   *
+   * <p>Work is run on the provided {@link ListeningExecutorService}.
+   *
+   * @see PhoneNumberUtil#parse(CharSequence, String)
+   */
+  @AnyThread
+  public ListenableFuture<DialerPhoneNumber> parse(
+      @Nullable String numberToParse,
+      @Nullable String defaultRegion,
+      @NonNull ListeningExecutorService service) {
+    return service.submit(() -> parse(numberToParse, defaultRegion));
+  }
+
+  /**
    * Returns true if the two numbers were parseable by libphonenumber and are an {@link
    * MatchType#EXACT_MATCH} or if they have the same raw input.
    */
diff --git a/java/com/android/dialer/theme/res/values/colors.xml b/java/com/android/dialer/theme/res/values/colors.xml
index 0e6f54f..3c8cabb 100644
--- a/java/com/android/dialer/theme/res/values/colors.xml
+++ b/java/com/android/dialer/theme/res/values/colors.xml
@@ -42,6 +42,8 @@
 
   <!-- Secondary text color in the Phone app -->
   <color name="dialer_secondary_text_color">#636363</color>
+  <!-- 38% opacity -->
+  <color name="dialer_secondary_text_color_hiden">#61000000</color>
 
   <!-- Color of the theme of the Dialer app -->
   <color name="dialtacts_theme_color">@color/dialer_theme_color</color>
diff --git a/java/com/android/dialer/theme/res/values/dimens.xml b/java/com/android/dialer/theme/res/values/dimens.xml
index ee52c97..972cb53 100644
--- a/java/com/android/dialer/theme/res/values/dimens.xml
+++ b/java/com/android/dialer/theme/res/values/dimens.xml
@@ -38,4 +38,7 @@
   <dimen name="actionbar_contentInsetStart">72dp</dimen>
 
   <dimen name="call_log_icon_margin">2dp</dimen>
+
+  <item name="alpha_enabled" format="float" type="dimen">1.0</item>
+  <item name="alpha_hiden" format="float" type="dimen">0.54</item>
 </resources>
diff --git a/java/com/android/incallui/ConferenceParticipantListAdapter.java b/java/com/android/incallui/ConferenceParticipantListAdapter.java
index 70cdf24..d0f4885 100644
--- a/java/com/android/incallui/ConferenceParticipantListAdapter.java
+++ b/java/com/android/incallui/ConferenceParticipantListAdapter.java
@@ -24,6 +24,7 @@
 import android.text.TextDirectionHeuristics;
 import android.text.TextUtils;
 import android.util.ArraySet;
+import android.util.TypedValue;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
@@ -245,7 +246,8 @@
         contactCache.lookupKey,
         contactCache.displayPhotoUri,
         thisRowCanSeparate,
-        thisRowCanDisconnect);
+        thisRowCanDisconnect,
+        call.getNonConferenceState());
 
     // Tag the row in the conference participant list with the call id to make it easier to
     // find calls when contact cache information is loaded.
@@ -290,9 +292,11 @@
       String lookupKey,
       Uri photoUri,
       boolean thisRowCanSeparate,
-      boolean thisRowCanDisconnect) {
+      boolean thisRowCanDisconnect,
+      int callState) {
 
     final ImageView photoView = (ImageView) view.findViewById(R.id.callerPhoto);
+    final TextView statusTextView = (TextView) view.findViewById(R.id.conferenceCallerStatus);
     final TextView nameTextView = (TextView) view.findViewById(R.id.conferenceCallerName);
     final TextView numberTextView = (TextView) view.findViewById(R.id.conferenceCallerNumber);
     final TextView numberTypeTextView =
@@ -300,6 +304,13 @@
     final View endButton = view.findViewById(R.id.conferenceCallerDisconnect);
     final View separateButton = view.findViewById(R.id.conferenceCallerSeparate);
 
+    if (callState == DialerCall.State.ONHOLD) {
+      setViewsOnHold(photoView, statusTextView, nameTextView, numberTextView, numberTypeTextView);
+    } else {
+      setViewsNotOnHold(
+          photoView, statusTextView, nameTextView, numberTextView, numberTypeTextView);
+    }
+
     endButton.setVisibility(thisRowCanDisconnect ? View.VISIBLE : View.GONE);
     if (thisRowCanDisconnect) {
       endButton.setOnClickListener(mDisconnectListener);
@@ -338,6 +349,47 @@
     }
   }
 
+  private void setViewsOnHold(
+      ImageView photoView,
+      TextView statusTextView,
+      TextView nameTextView,
+      TextView numberTextView,
+      TextView numberTypeTextView) {
+    CharSequence onHoldText =
+        TextUtils.concat(getContext().getText(R.string.notification_on_hold).toString(), " • ");
+    statusTextView.setText(onHoldText);
+    statusTextView.setVisibility(View.VISIBLE);
+
+    int onHoldColor = getContext().getColor(R.color.dialer_secondary_text_color_hiden);
+    nameTextView.setTextColor(onHoldColor);
+    numberTextView.setTextColor(onHoldColor);
+    numberTypeTextView.setTextColor(onHoldColor);
+
+    TypedValue alpha = new TypedValue();
+    getContext().getResources().getValue(R.dimen.alpha_hiden, alpha, true);
+    photoView.setAlpha(alpha.getFloat());
+  }
+
+  private void setViewsNotOnHold(
+      ImageView photoView,
+      TextView statusTextView,
+      TextView nameTextView,
+      TextView numberTextView,
+      TextView numberTypeTextView) {
+    statusTextView.setVisibility(View.GONE);
+
+    nameTextView.setTextColor(
+        getContext().getColor(R.color.conference_call_manager_caller_name_text_color));
+    numberTextView.setTextColor(
+        getContext().getColor(R.color.conference_call_manager_secondary_text_color));
+    numberTypeTextView.setTextColor(
+        getContext().getColor(R.color.conference_call_manager_secondary_text_color));
+
+    TypedValue alpha = new TypedValue();
+    getContext().getResources().getValue(R.dimen.alpha_enabled, alpha, true);
+    photoView.setAlpha(alpha.getFloat());
+  }
+
   /**
    * Updates the participant info list which is bound to the ListView. Stores the call and contact
    * info for all entries. The list is sorted alphabetically by participant name.
diff --git a/java/com/android/incallui/call/DialerCall.java b/java/com/android/incallui/call/DialerCall.java
index 82a29ee..d393b42 100644
--- a/java/com/android/incallui/call/DialerCall.java
+++ b/java/com/android/incallui/call/DialerCall.java
@@ -706,6 +706,10 @@
     }
   }
 
+  public int getNonConferenceState() {
+    return mState;
+  }
+
   public void setState(int state) {
     if (state == State.INCOMING) {
       mLogState.isIncoming = true;
diff --git a/java/com/android/incallui/res/layout/caller_in_conference.xml b/java/com/android/incallui/res/layout/caller_in_conference.xml
index 4f4b2f0..3791818 100644
--- a/java/com/android/incallui/res/layout/caller_in_conference.xml
+++ b/java/com/android/incallui/res/layout/caller_in_conference.xml
@@ -62,6 +62,15 @@
         android:gravity="bottom"
         android:orientation="horizontal">
 
+        <!-- Status (only support on hold now) -->
+        <TextView
+            android:id="@+id/conferenceCallerStatus"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            style="@style/SecondaryText"
+            android:textColor="@color/dialer_secondary_text_color_hiden"
+            android:visibility="gone"/>
+
         <!-- Number -->
         <TextView
           android:id="@+id/conferenceCallerNumber"