Merge "New layout for business call context." into ub-contactsdialer-a-dev
diff --git a/InCallUI/res/layout/business_contact_context_list_header.xml b/InCallUI/res/layout/business_contact_context_list_header.xml
new file mode 100644
index 0000000..9052118
--- /dev/null
+++ b/InCallUI/res/layout/business_contact_context_list_header.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 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.
+-->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+     android:layout_width="match_parent"
+     android:layout_height="wrap_content"
+     android:orientation="horizontal"
+     android:paddingEnd="@dimen/business_contact_context_end_padding">
+     <ImageView android:id="@+id/icon"
+         android:layout_width="@dimen/contact_context_title_image_size"
+         android:layout_height="@dimen/contact_context_title_image_size"
+         android:layout_marginLeft="@dimen/contact_context_title_image_side_padding"
+         android:layout_marginRight="@dimen/contact_context_title_image_side_padding"
+         android:layout_gravity="center"
+         android:scaleType="center"
+         android:src="@drawable/ic_business_white_24dp"
+         android:tint="@color/business_contact_context_text_color"
+         android:alpha="0.8"
+         android:importantForAccessibility="no"/>
+     <TextView android:id="@+id/title"
+         android:layout_width="match_parent"
+         android:layout_height="wrap_content"
+         android:layout_gravity="center_vertical"
+         android:text="@string/business_contact_context_title"
+         android:textSize="@dimen/business_contact_context_detail_font_size"
+         android:textColor="@color/business_contact_context_text_color"
+         android:fontFamily="sans-serif-medium"/>
+ </LinearLayout>
\ No newline at end of file
diff --git a/InCallUI/res/layout/business_context_info_list_item.xml b/InCallUI/res/layout/business_context_info_list_item.xml
index eba98ac..616d219 100644
--- a/InCallUI/res/layout/business_context_info_list_item.xml
+++ b/InCallUI/res/layout/business_context_info_list_item.xml
@@ -13,32 +13,36 @@
      See the License for the specific language governing permissions and
      limitations under the License.
 -->
-<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
+     android:orientation="horizontal"
      android:paddingEnd="@dimen/business_contact_context_end_padding">
      <ImageView android:id="@+id/icon"
          android:layout_width="@dimen/business_contact_context_image_size"
          android:layout_height="@dimen/business_contact_context_image_size"
+         android:layout_marginLeft="@dimen/business_contact_context_image_padding"
+         android:layout_marginRight="@dimen/business_contact_context_image_padding"
+         android:layout_gravity="center"
          android:scaleType="centerCrop"
          android:tint="@color/business_contact_context_text_color"
-         android:alpha="0.8"
-         android:layout_centerVertical="true"
-         android:layout_marginLeft="@dimen/business_contact_context_image_padding"
-         android:layout_marginRight="@dimen/business_contact_context_image_padding"/>
-     <TextView android:id="@+id/heading"
+         android:alpha="0.8"/>
+     <LinearLayout
          android:layout_width="match_parent"
          android:layout_height="wrap_content"
-         android:layout_toEndOf="@id/icon"
-         android:textSize="@dimen/business_contact_context_heading_font_size"
-         android:textColor="@color/business_contact_context_text_color"
-         android:fontFamily="sans-serif-medium"/>
-     <TextView android:id="@+id/detail"
-         android:layout_width="match_parent"
-         android:layout_height="wrap_content"
-         android:layout_toEndOf="@id/icon"
-         android:layout_below="@id/heading"
-         android:textSize="@dimen/business_contact_context_detail_font_size"
-         android:textColor="@color/business_contact_context_text_color"
-         android:fontFamily="sans-serif-medium"/>
- </RelativeLayout>
\ No newline at end of file
+         android:layout_gravity="center"
+         android:orientation="vertical">
+         <TextView android:id="@+id/heading"
+             android:layout_width="match_parent"
+             android:layout_height="wrap_content"
+             android:textSize="@dimen/business_contact_context_heading_font_size"
+             android:textColor="@color/business_contact_context_text_color"
+             android:fontFamily="sans-serif-medium"/>
+         <TextView android:id="@+id/detail"
+             android:layout_width="match_parent"
+             android:layout_height="wrap_content"
+             android:textSize="@dimen/business_contact_context_detail_font_size"
+             android:textColor="@color/business_contact_context_text_color"
+             android:fontFamily="sans-serif-medium"/>
+     </LinearLayout>
+ </LinearLayout>
\ No newline at end of file
diff --git a/InCallUI/res/layout/call_card_fragment.xml b/InCallUI/res/layout/call_card_fragment.xml
index a8f3d27..8f8ed93 100644
--- a/InCallUI/res/layout/call_card_fragment.xml
+++ b/InCallUI/res/layout/call_card_fragment.xml
@@ -64,7 +64,7 @@
             android:id="@+id/call_card_content">
 
             <!-- Contact photo for primary call info -->
-            <ImageView android:id="@+id/photo"
+            <ImageView android:id="@+id/photoLarge"
                 android:layout_width="match_parent"
                 android:layout_height="match_parent"
                 android:scaleType="centerCrop"
diff --git a/InCallUI/res/layout/primary_call_info.xml b/InCallUI/res/layout/primary_call_info.xml
index a157121..ea6605b 100644
--- a/InCallUI/res/layout/primary_call_info.xml
+++ b/InCallUI/res/layout/primary_call_info.xml
@@ -21,19 +21,26 @@
     other status info.  This info is shown as a "banner" overlaid across the top of contact photo.
     -->
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/primary_call_banner"
     android:layout_width="match_parent"
     android:layout_height="0dp"
     android:layout_weight="1"
-    android:orientation="vertical"
+    android:orientation="horizontal"
     android:minHeight="@dimen/call_banner_height"
     android:paddingStart="@dimen/call_banner_side_padding"
     android:paddingEnd="@dimen/call_banner_side_padding"
-    android:clipChildren="false"
-    android:clipToPadding="false"
     android:animateLayoutChanges="true"
     android:gravity="center">
 
+    <LinearLayout
+        android:id="@+id/primary_call_banner"
+        android:layout_width="0dp"
+        android:layout_height="match_parent"
+        android:layout_weight="1"
+        android:orientation="vertical"
+        android:clipChildren="false"
+        android:clipToPadding="false"
+        android:gravity="center">
+
     <LinearLayout android:id="@+id/callSubjectLayout"
                   android:layout_width="match_parent"
                   android:layout_height="wrap_content"
@@ -196,4 +203,14 @@
         android:ellipsize="end"
         android:visibility="gone" />
 
+    </LinearLayout>
+
+    <!-- Contact photo for primary call info -->
+    <ImageView android:id="@+id/photoSmall"
+        android:layout_width="@dimen/contact_context_small_photo_size"
+        android:layout_height="@dimen/contact_context_small_photo_size"
+        android:layout_marginLeft="@dimen/call_banner_side_padding"
+        android:scaleType="centerCrop"
+        android:importantForAccessibility="no"
+        android:src="@drawable/img_no_image_automirrored" />
 </LinearLayout>  <!-- End of call_banner -->
diff --git a/InCallUI/res/values/dimens.xml b/InCallUI/res/values/dimens.xml
index e407846..8bafa9a 100644
--- a/InCallUI/res/values/dimens.xml
+++ b/InCallUI/res/values/dimens.xml
@@ -121,6 +121,8 @@
     <dimen name="conference_call_manager_button_dimension">46dp</dimen>
 
     <dimen name="contact_context_title_text_size">14sp</dimen>
+    <dimen name="contact_context_title_image_size">19dp</dimen>
+    <dimen name="contact_context_title_image_side_padding">23dp</dimen>
     <dimen name="contact_context_title_margin_bottom">13dp</dimen>
     <dimen name="contact_context_list_item_padding">13dp</dimen>
 
@@ -136,6 +138,8 @@
     <dimen name="business_contact_context_end_padding">10dp</dimen>
     <dimen name="business_contact_context_image_size">25dp</dimen>
     <dimen name="business_contact_context_image_padding">20dp</dimen>
-    <dimen name="business_contact_context_heading_font_size">18sp</dimen>
-    <dimen name="business_contact_context_detail_font_size">13sp</dimen>
+    <dimen name="business_contact_context_heading_font_size">16sp</dimen>
+    <dimen name="business_contact_context_detail_font_size">12sp</dimen>
+
+    <dimen name="contact_context_small_photo_size">80dp</dimen>
 </resources>
diff --git a/InCallUI/src/com/android/incallui/CallCardFragment.java b/InCallUI/src/com/android/incallui/CallCardFragment.java
index b276a95..fa4e8b4 100644
--- a/InCallUI/src/com/android/incallui/CallCardFragment.java
+++ b/InCallUI/src/com/android/incallui/CallCardFragment.java
@@ -21,13 +21,18 @@
 import android.animation.AnimatorSet;
 import android.animation.ObjectAnimator;
 import android.content.Context;
+import android.graphics.Bitmap;
+import android.graphics.Canvas;
 import android.graphics.drawable.AnimationDrawable;
+import android.graphics.drawable.BitmapDrawable;
 import android.graphics.drawable.Drawable;
 import android.graphics.drawable.GradientDrawable;
 import android.os.Bundle;
 import android.os.Trace;
 import android.os.Handler;
 import android.os.Looper;
+import android.support.v4.graphics.drawable.RoundedBitmapDrawable;
+import android.support.v4.graphics.drawable.RoundedBitmapDrawableFactory;
 import android.telecom.DisconnectCause;
 import android.telecom.VideoProfile;
 import android.telephony.PhoneNumberUtils;
@@ -46,6 +51,7 @@
 import android.view.animation.AnimationUtils;
 import android.widget.ImageButton;
 import android.widget.ImageView;
+import android.widget.LinearLayout;
 import android.widget.ListAdapter;
 import android.widget.ListView;
 import android.widget.TextView;
@@ -133,6 +139,7 @@
     // Container view that houses the primary call information
     private ViewGroup mPrimaryCallInfo;
     private View mCallButtonsContainer;
+    private ImageView mPhotoSmall;
 
     // Secondary caller info
     private View mSecondaryCallInfo;
@@ -145,10 +152,11 @@
 
     // Call card content
     private View mCallCardContent;
-    private ImageView mPhoto;
+    private ImageView mPhotoLarge;
     private View mContactContext;
     private TextView mContactContextTitle;
     private ListView mContactContextListView;
+    private LinearLayout mContactContextListHeaders;
 
     private View mManageConferenceCallButton;
 
@@ -246,16 +254,21 @@
         mSecondaryCallInfo = view.findViewById(R.id.secondary_call_info);
         mSecondaryCallProviderInfo = view.findViewById(R.id.secondary_call_provider_info);
         mCallCardContent = view.findViewById(R.id.call_card_content);
-        mPhoto = (ImageView) view.findViewById(R.id.photo);
-        mPhoto.setOnClickListener(new View.OnClickListener() {
+        mPhotoLarge = (ImageView) view.findViewById(R.id.photoLarge);
+        mPhotoLarge.setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View v) {
                 getPresenter().onContactPhotoClick();
             }
         });
+
         mContactContext = view.findViewById(R.id.contact_context);
         mContactContextTitle = (TextView) view.findViewById(R.id.contactContextTitle);
         mContactContextListView = (ListView) view.findViewById(R.id.contactContextInfo);
+        // This layout stores all the list header layouts so they can be easily removed.
+        mContactContextListHeaders = new LinearLayout(getView().getContext());
+        mContactContextListView.addHeaderView(mContactContextListHeaders);
+
         mCallStateIcon = (ImageView) view.findViewById(R.id.callStateIcon);
         mCallStateVideoCallIcon = (ImageView) view.findViewById(R.id.videoCallIcon);
         mCallStateLabel = (TextView) view.findViewById(R.id.callStateLabel);
@@ -267,6 +280,8 @@
         mPrimaryCallCardContainer = view.findViewById(R.id.primary_call_info_container);
         mPrimaryCallInfo = (ViewGroup) view.findViewById(R.id.primary_call_banner);
         mCallButtonsContainer = view.findViewById(R.id.callButtonFragment);
+        mPhotoSmall = (ImageView) view.findViewById(R.id.photoSmall);
+        mPhotoSmall.setVisibility(View.GONE);
         mInCallMessageLabel = (TextView) view.findViewById(R.id.connectionServiceMessage);
         mProgressSpinner = view.findViewById(R.id.progressSpinner);
 
@@ -334,17 +349,23 @@
     }
 
     @Override
-    public void setContactContext(String title, ListAdapter listAdapter) {
-        mContactContextTitle.setText(title);
+    public void setContactContextTitle(View headerView) {
+        mContactContextListHeaders.removeAllViews();
+        mContactContextListHeaders.addView(headerView);
+    }
+
+    @Override
+    public void setContactContextContent(ListAdapter listAdapter) {
         mContactContextListView.setAdapter(listAdapter);
     }
 
     @Override
     public void showContactContext(boolean show) {
-            mPhoto.setVisibility(show ? View.GONE : View.VISIBLE);
-            mPrimaryCallCardContainer.setElevation(
-                    show ? 0 : getResources().getDimension(R.dimen.primary_call_elevation));
-            mContactContext.setVisibility(show ? View.VISIBLE : View.GONE);
+        showImageView(mPhotoLarge, !show);
+        showImageView(mPhotoSmall, show);
+        mPrimaryCallCardContainer.setElevation(
+                show ? 0 : getResources().getDimension(R.dimen.primary_call_elevation));
+        mContactContext.setVisibility(show ? View.VISIBLE : View.GONE);
     }
 
     /**
@@ -498,7 +519,8 @@
     @Override
     public void setPrimaryImage(Drawable image, boolean isVisible) {
         if (image != null) {
-            setDrawableToImageView(mPhoto, image, isVisible);
+            setDrawableToImageViews(image);
+            showImageView(mPhotoLarge, isVisible);
         }
     }
 
@@ -560,7 +582,8 @@
 
         showInternetCallLabel(isSipCall);
 
-        setDrawableToImageView(mPhoto, photo, isContactPhotoShown);
+        setDrawableToImageViews(photo);
+        showImageView(mPhotoLarge, isContactPhotoShown);
     }
 
     @Override
@@ -620,7 +643,7 @@
         // photo is hidden when the incoming video surface is shown.
         // The contact photo visibility can also change in setPrimary().
         boolean showContactPhoto = !VideoCallPresenter.showIncomingVideo(videoState, state);
-        mPhoto.setVisibility(showContactPhoto ? View.VISIBLE : View.GONE);
+        mPhotoLarge.setVisibility(showContactPhoto ? View.VISIBLE : View.GONE);
 
         // Check if the call subject is showing -- if it is, we want to bypass showing the call
         // state.
@@ -807,33 +830,87 @@
         }
     }
 
-    private void setDrawableToImageView(ImageView view, Drawable photo, boolean isVisible) {
+    /**
+     * Set all the ImageViews to the same photo. Currently there are 2 photo views: the large one
+     * (which fills about the bottom half of the screen) and the small one, which displays as a
+     * circle next to the primary contact info. This method does not handle whether the ImageView
+     * is shown or not.
+     *
+     * @param photo The photo to set for the image views.
+     */
+    private void setDrawableToImageViews(Drawable photo) {
         if (photo == null) {
-            photo = ContactInfoCache.getInstance(
-                    view.getContext()).getDefaultContactPhotoDrawable();
+            photo = ContactInfoCache.getInstance(getView().getContext())
+                            .getDefaultContactPhotoDrawable();
         }
 
-        if (mPrimaryPhotoDrawable == photo) {
+        if (mPrimaryPhotoDrawable == photo){
             return;
         }
         mPrimaryPhotoDrawable = photo;
 
-        final Drawable current = view.getDrawable();
-        if (current == null) {
-            view.setImageDrawable(photo);
+        mPhotoLarge.setImageDrawable(photo);
+
+        // Modify the drawable to be round for the smaller ImageView.
+        Bitmap bitmap = drawableToBitmap(photo);
+        if (bitmap != null) {
+            final RoundedBitmapDrawable drawable =
+                    RoundedBitmapDrawableFactory.create(getResources(), bitmap);
+            drawable.setAntiAlias(true);
+            drawable.setCornerRadius(bitmap.getHeight() / 2);
+            photo = drawable;
+        }
+        mPhotoSmall.setImageDrawable(photo);
+    }
+
+    /**
+     * Helper method for image view to handle animations.
+     *
+     * @param view The image view to show or hide.
+     * @param isVisible {@code true} if we want to show the image, {@code false} to hide it.
+     */
+    private void showImageView(ImageView view, boolean isVisible) {
+        if (view.getDrawable() == null) {
             if (isVisible) {
                 AnimUtils.fadeIn(mElapsedTime, AnimUtils.DEFAULT_DURATION);
             }
         } else {
-            // Cross fading is buggy and not noticable due to the multiple calls to this method
-            // that switch drawables in the middle of the cross-fade animations. Just set the
+            // Cross fading is buggy and not noticeable due to the multiple calls to this method
+            // that switch drawables in the middle of the cross-fade animations. Just show the
             // photo directly instead.
-            view.setImageDrawable(photo);
             view.setVisibility(isVisible ? View.VISIBLE : View.GONE);
         }
     }
 
     /**
+     * Converts a drawable into a bitmap.
+     *
+     * @param drawable the drawable to be converted.
+     */
+    public static Bitmap drawableToBitmap(Drawable drawable) {
+        Bitmap bitmap;
+        if (drawable instanceof BitmapDrawable) {
+            bitmap = ((BitmapDrawable) drawable).getBitmap();
+        } else {
+            if (drawable.getIntrinsicWidth() <= 0 || drawable.getIntrinsicHeight() <= 0) {
+                // Needed for drawables that are just a colour.
+                bitmap = Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888);
+            } else {
+                bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(),
+                        drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
+            }
+
+            Log.i(TAG, "Created bitmap with width " + bitmap.getWidth() + ", height "
+                    + bitmap.getHeight());
+
+            Canvas canvas = new Canvas(bitmap);
+            drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
+            drawable.draw(canvas);
+        }
+        return bitmap;
+    }
+
+    /**
      * Gets the call state label based on the state of the call or cause of disconnect.
      *
      * Additional labels are applied as follows:
diff --git a/InCallUI/src/com/android/incallui/CallCardPresenter.java b/InCallUI/src/com/android/incallui/CallCardPresenter.java
index 9c47a93..aa022f4 100644
--- a/InCallUI/src/com/android/incallui/CallCardPresenter.java
+++ b/InCallUI/src/com/android/incallui/CallCardPresenter.java
@@ -24,6 +24,7 @@
 import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageManager;
 import android.graphics.drawable.Drawable;
+import android.location.Address;
 import android.net.Uri;
 import android.os.Bundle;
 import android.telecom.Call.Details;
@@ -35,6 +36,7 @@
 import android.telecom.VideoProfile;
 import android.telephony.PhoneNumberUtils;
 import android.text.TextUtils;
+import android.view.View;
 import android.view.accessibility.AccessibilityManager;
 import android.widget.ListAdapter;
 
@@ -227,7 +229,8 @@
             secondary = getCallToDisplay(callList, primary, true);
         }
 
-        if (mInCallContactInteractions != null) {
+        if (mInCallContactInteractions != null &&
+                (oldState == InCallState.INCOMING || newState == InCallState.INCOMING)) {
             ui.showContactContext(newState != InCallState.INCOMING);
         }
 
@@ -593,14 +596,18 @@
     private void updateContactInteractions() {
         if (mPrimary != null && mPrimaryContactInfo != null
                 && mPrimaryContactInfo.locationAddress != null) {
-            setInCallContactInteractionsType(true);
+
+            // TODO: This is hardcoded to "isBusiness" because functionality to differentiate
+            // between business and personal has not yet been added.
+            if (setInCallContactInteractionsType(true /* isBusiness */)) {
+                getUi().setContactContextTitle(
+                        mInCallContactInteractions.getBusinessListHeaderView());
+            }
 
             mInCallContactInteractions.setBusinessInfo(
                     mPrimaryContactInfo.locationAddress,
                     mDistanceHelper.calculateDistance(mPrimaryContactInfo.locationAddress));
-            getUi().setContactContext(
-                    null,
-                    mInCallContactInteractions.getListAdapter());
+            getUi().setContactContextContent(mInCallContactInteractions.getListAdapter());
             getUi().showContactContext(mPrimary.getState() != State.INCOMING);
         }
     }
@@ -610,14 +617,18 @@
      *
      * @param isBusiness {@code true} if the interaction is a business interaction, {@code false} if
      * it is a personal contact.
+     *
+     * @return {@code true} if this is a new type of contact interaction (business or personal).
+     * {@code false} if it hasn't changed.
      */
-    private void setInCallContactInteractionsType(boolean isBusiness) {
+    private boolean setInCallContactInteractionsType(boolean isBusiness) {
         if (mInCallContactInteractions == null) {
             mInCallContactInteractions =
                     new InCallContactInteractions(mContext, isBusiness);
-        } else {
-            mInCallContactInteractions.setIsBusiness(isBusiness);
+            return true;
         }
+
+        return mInCallContactInteractions.switchContactType(isBusiness);
     }
 
     private void updateContactEntry(ContactCacheEntry entry, boolean isPrimary) {
@@ -741,6 +752,8 @@
                     mPrimaryContactInfo.photo,
                     mPrimaryContactInfo.isSipCall,
                     showContactPhoto);
+
+            updateContactInteractions();
         } else {
             // Clear the primary display info.
             ui.setPrimary(null, null, false, null, null, false, false);
@@ -1031,7 +1044,8 @@
 
     public interface CallCardUi extends Ui {
         void setVisible(boolean on);
-        void setContactContext(String title, ListAdapter listAdapter);
+        void setContactContextTitle(View listHeaderView);
+        void setContactContextContent(ListAdapter listAdapter);
         void showContactContext(boolean show);
         void setCallCardVisible(boolean visible);
         void setPrimary(String number, String name, boolean nameIsNumber, String label,
diff --git a/InCallUI/src/com/android/incallui/InCallContactInteractions.java b/InCallUI/src/com/android/incallui/InCallContactInteractions.java
index 6f30720..04caecc 100644
--- a/InCallUI/src/com/android/incallui/InCallContactInteractions.java
+++ b/InCallUI/src/com/android/incallui/InCallContactInteractions.java
@@ -44,10 +44,14 @@
     private Context mContext;
     private InCallContactInteractionsListAdapter mListAdapter;
     private boolean mIsBusiness;
+    private View mBusinessHeaderView;
+    private LayoutInflater mInflater;
 
     public InCallContactInteractions(Context context, boolean isBusiness) {
         mContext = context;
-        setIsBusiness(isBusiness);
+        mInflater = (LayoutInflater)
+                context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+        switchContactType(isBusiness);
     }
 
     public InCallContactInteractionsListAdapter getListAdapter() {
@@ -55,17 +59,22 @@
     }
 
     /**
-     * Resets the "isBusiness" value, also recreates the list adapter with the resource
-     * corresponding to the new isBusiness value.
+     * Switches the "isBusiness" value, if applicable. Recreates the list adapter with the resource
+     * corresponding to the new isBusiness value if the "isBusiness" value is switched.
+     *
      * @param isBusiness Whether or not the contact is a business.
+     *
+     * @return {@code true} if a new list adapter was created, {@code} otherwise.
      */
-    public void setIsBusiness(boolean isBusiness) {
+    public boolean switchContactType(boolean isBusiness) {
         if (mIsBusiness != isBusiness || mListAdapter == null) {
             mIsBusiness = isBusiness;
             mListAdapter = new InCallContactInteractionsListAdapter(mContext,
                     mIsBusiness ? R.layout.business_context_info_list_item
                             : R.layout.person_context_info_list_item);
+            return true;
         }
+        return false;
     }
 
     public void setBusinessInfo(Address address, float distance) {
@@ -73,14 +82,17 @@
         mListAdapter.addAll(constructBusinessContextInfo(address, distance));
     }
 
+    public View getBusinessListHeaderView() {
+        if (mBusinessHeaderView == null) {
+            mBusinessHeaderView = mInflater.inflate(
+                    R.layout.business_contact_context_list_header, null);
+        }
+        return mBusinessHeaderView;
+    }
+
     private List<ContactContextInfo> constructBusinessContextInfo(Address address, float distance) {
         List<ContactContextInfo> info = new ArrayList<ContactContextInfo>();
 
-        BusinessContextInfo headerInfo = new BusinessContextInfo();
-        headerInfo.iconId = R.drawable.ic_business_white_24dp;
-        headerInfo.heading = getContactContextTitle();
-        info.add(headerInfo);
-
         //TODO: hours of operation information
 
         // Location information
@@ -192,10 +204,7 @@
 
         @Override
         public View getView(int position, View convertView, ViewGroup parent) {
-            LayoutInflater inflater = (LayoutInflater)
-                    getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
-
-            View listItem = inflater.inflate(mResId, null);
+            View listItem = mInflater.inflate(mResId, null);
             ContactContextInfo item = getItem(position);
 
             if (item == null) {