Merge "Do not allow adding contracts for private numbers."
diff --git a/res/layout/contact_tile_list.xml b/res/layout/contact_tile_list.xml
index 79c6ecf..69ae1cc 100644
--- a/res/layout/contact_tile_list.xml
+++ b/res/layout/contact_tile_list.xml
@@ -14,9 +14,22 @@
      limitations under the License.
 -->
 
-<ListView xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/contact_tile_list"
+<FrameLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:divider="@null"
-/>
+    android:layout_height="match_parent">
+
+    <ListView
+        android:id="@+id/contact_tile_list"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:divider="@null" />
+
+    <TextView
+        android:id="@+id/contact_tile_list_empty"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:gravity="center_horizontal"
+        android:textAppearance="?android:attr/textAppearanceLarge"/>
+
+</FrameLayout>
diff --git a/res/layout/item_group_membership.xml b/res/layout/item_group_membership.xml
index 34ba773..13ddb20 100644
--- a/res/layout/item_group_membership.xml
+++ b/res/layout/item_group_membership.xml
@@ -20,10 +20,11 @@
     android:layout_height="wrap_content"
     android:orientation="vertical">
 
-    <View
+    <ImageView
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        android:background="@drawable/divider_horizontal_light" />
+        android:scaleType="fitXY"
+        android:src="@drawable/divider_horizontal_light" />
 
     <include
         android:id="@+id/kind_title"
diff --git a/res/layout/item_kind_section.xml b/res/layout/item_kind_section.xml
index 6c6f960..2c6dc6f 100644
--- a/res/layout/item_kind_section.xml
+++ b/res/layout/item_kind_section.xml
@@ -23,10 +23,11 @@
     android:paddingBottom="@dimen/editor_field_bottom_padding"
     android:orientation="vertical">
 
-    <View
+    <ImageView
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        android:background="@drawable/divider_horizontal_light" />
+        android:scaleType="fitXY"
+        android:src="@drawable/divider_horizontal_light" />
 
     <LinearLayout
         android:id="@+id/kind_editors"
diff --git a/src/com/android/contacts/activities/DialtactsActivity.java b/src/com/android/contacts/activities/DialtactsActivity.java
index 62b8321..7a84e6d 100644
--- a/src/com/android/contacts/activities/DialtactsActivity.java
+++ b/src/com/android/contacts/activities/DialtactsActivity.java
@@ -20,6 +20,7 @@
 import com.android.contacts.calllog.CallLogFragment;
 import com.android.contacts.dialpad.DialpadFragment;
 import com.android.contacts.interactions.PhoneNumberInteraction;
+import com.android.contacts.list.ContactTileAdapter.DisplayType;
 import com.android.contacts.list.OnPhoneNumberPickerActionListener;
 import com.android.contacts.list.PhoneNumberPickerFragment;
 import com.android.contacts.list.ContactTileListFragment;
@@ -335,6 +336,7 @@
             mStrequentFragment = (ContactTileListFragment) fragment;
             mStrequentFragment.enableQuickContact(false);
             mStrequentFragment.setListener(mStrequentListener);
+            mStrequentFragment.setDisplayType(DisplayType.STREQUENT_PHONE_ONLY);
         } else if (fragment instanceof PhoneNumberPickerFragment) {
             mSearchFragment = (PhoneNumberPickerFragment) fragment;
             mSearchFragment.setOnPhoneNumberPickerActionListener(mPhoneNumberPickerActionListener);
diff --git a/src/com/android/contacts/activities/PeopleActivity.java b/src/com/android/contacts/activities/PeopleActivity.java
index 0b403cb..07fa8f1 100644
--- a/src/com/android/contacts/activities/PeopleActivity.java
+++ b/src/com/android/contacts/activities/PeopleActivity.java
@@ -202,6 +202,13 @@
         return mProviderStatus == ProviderStatus.STATUS_NORMAL;
     }
 
+    private boolean areAccountsAvailable() {
+        final ArrayList<Account> accounts =
+            AccountTypeManager.getInstance(this).getAccounts(true /* writeable */);
+        return !accounts.isEmpty();
+    }
+
+
     /**
      * Initialize fragments that are (or may not be) in the layout.
      *
@@ -575,10 +582,12 @@
             if (mActionBarAdapter.isSearchMode()) {
                 mTabPagerAdapter.setSearchMode(true);
             } else {
+                // No smooth scrolling if quitting from the search mode.
+                final boolean wasSearchMode = mTabPagerAdapter.isSearchMode();
                 mTabPagerAdapter.setSearchMode(false);
                 int tabIndex = tab.ordinal();
                 if (mTabPager.getCurrentItem() != tabIndex) {
-                    mTabPager.setCurrentItem(tab.ordinal(), false /* no smooth scroll */);
+                    mTabPager.setCurrentItem(tabIndex, !wasSearchMode);
                 }
             }
             invalidateOptionsMenu();
@@ -1230,8 +1239,13 @@
                     addGroupMenu.setVisible(false);
                     break;
                 case GROUPS:
+                    // Do not display the "new group" button if no accounts are available
+                    if (areAccountsAvailable()) {
+                        addGroupMenu.setVisible(true);
+                    } else {
+                        addGroupMenu.setVisible(false);
+                    }
                     addContactMenu.setVisible(false);
-                    addGroupMenu.setVisible(true);
                     break;
             }
         }
diff --git a/src/com/android/contacts/list/ContactTileAdapter.java b/src/com/android/contacts/list/ContactTileAdapter.java
index 596cceb..9674960 100644
--- a/src/com/android/contacts/list/ContactTileAdapter.java
+++ b/src/com/android/contacts/list/ContactTileAdapter.java
@@ -202,7 +202,7 @@
     @Override
     public int getCount() {
         if (mContactCursor == null || mContactCursor.getCount() == 0) {
-          return 0;
+            return 0;
         }
 
         switch (mDisplayType) {
@@ -304,7 +304,7 @@
         int itemViewType = getItemViewType(position);
         if (itemViewType == ViewTypes.DIVIDER) {
             // Checking For Divider First so not to cast convertView
-            return convertView == null ? createDivider() : convertView;
+            return convertView == null ? getDivider() : convertView;
         }
 
         ContactTileRow contactTileRowView = (ContactTileRow) convertView;
@@ -322,7 +322,7 @@
      * Divider uses a list_seperator.xml along with text to denote
      * the most frequently contacted contacts.
      */
-    private View createDivider() {
+    private View getDivider() {
         View dividerView = View.inflate(mContext, R.layout.list_separator, null);
         dividerView.setFocusable(false);
         TextView text = (TextView) dividerView.findViewById(R.id.header_text);
diff --git a/src/com/android/contacts/list/ContactTileListFragment.java b/src/com/android/contacts/list/ContactTileListFragment.java
index f4bd1b5..875d5d2 100644
--- a/src/com/android/contacts/list/ContactTileListFragment.java
+++ b/src/com/android/contacts/list/ContactTileListFragment.java
@@ -34,6 +34,7 @@
 import android.view.View;
 import android.view.ViewGroup;
 import android.widget.ListView;
+import android.widget.TextView;
 
 /**
  * Fragment containing a list of starred contacts followed by a list of frequently contacted.
@@ -49,8 +50,9 @@
 
     private Listener mListener;
     private ContactTileAdapter mAdapter;
+    private DisplayType mDisplayType;
+    private TextView mEmptyView;
     private ListView mListView;
-    private DisplayType mDisplayType = DisplayType.STREQUENT_PHONE_ONLY;
 
     @Override
     public void onAttach(Activity activity) {
@@ -67,11 +69,15 @@
     @Override
     public View onCreateView(LayoutInflater inflater, ViewGroup container,
             Bundle savedInstanceState) {
-        View v = inflater.inflate(R.layout.contact_tile_list, container, false);
-        mListView = (ListView) v.findViewById(R.id.contact_tile_list);
+        View listLayout = inflater.inflate(R.layout.contact_tile_list, container, false);
+
+        mEmptyView = (TextView) listLayout.findViewById(R.id.contact_tile_list_empty);
+        mListView = (ListView) listLayout.findViewById(R.id.contact_tile_list);
+
         mListView.setItemsCanFocus(true);
         mListView.setAdapter(mAdapter);
-        return v;
+
+        return listLayout;
     }
 
     @Override
@@ -117,12 +123,32 @@
         @Override
         public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
             mAdapter.setContactCursor(data);
+            mEmptyView.setText(getEmptyStateText());
+            mListView.setEmptyView(mEmptyView);
         }
 
         @Override
         public void onLoaderReset(Loader<Cursor> loader) {}
     };
 
+    private String getEmptyStateText() {
+        String emptyText;
+        switch (mDisplayType) {
+            case STREQUENT:
+            case STREQUENT_PHONE_ONLY:
+            case STARRED_ONLY:
+                emptyText = getString(R.string.listTotalAllContactsZeroStarred);
+                break;
+            case FREQUENT_ONLY:
+            case GROUP_MEMBERS:
+                emptyText = getString(R.string.noContacts);
+                break;
+            default:
+                throw new IllegalArgumentException("Unrecognized DisplayType " + mDisplayType);
+        }
+        return emptyText;
+    }
+
     public void setListener(Listener listener) {
         mListener = listener;
     }