Fix empty state layouts

Bug: 5074806 Fix empty state layouts
Bug: 5109507 During loading group, we show "no groups"
     instead of "loading groups"

- Changed the layout of contacts_unavailable_fragment to Marco's specs.
- Added a secondary message for empty state.
- Aligned layouts of empty state of each specific fragment to match the
  full empty state.
- Removed "No Groups" message when group list fragment is loading the
  group list

Change-Id: I5cea254e5892955906127599374dc706d2aca91b
diff --git a/res/layout/contact_tile_list.xml b/res/layout/contact_tile_list.xml
index 2047b13..1df1377 100644
--- a/res/layout/contact_tile_list.xml
+++ b/res/layout/contact_tile_list.xml
@@ -32,6 +32,7 @@
         android:layout_height="match_parent"
         android:gravity="center_horizontal"
         android:layout_marginTop="@dimen/empty_message_top_margin"
-        android:textAppearance="?android:attr/textAppearanceMedium"/>
+        android:textColor="?android:attr/textColorSecondary"
+        android:textAppearance="?android:attr/textAppearanceLarge"/>
 
 </FrameLayout>
diff --git a/res/layout/contacts_unavailable_fragment.xml b/res/layout/contacts_unavailable_fragment.xml
index 5566589..1abc020 100644
--- a/res/layout/contacts_unavailable_fragment.xml
+++ b/res/layout/contacts_unavailable_fragment.xml
@@ -14,70 +14,81 @@
      limitations under the License.
 -->
 
-<com.android.contacts.widget.InterpolatingLayout
+<ScrollView
     xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:ex="http://schemas.android.com/apk/res/com.android.contacts"
     android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:background="@drawable/panel_message">
-
+    android:fillViewport="true">
     <LinearLayout
-        android:layout_width="0dip"
-        android:layout_height="wrap_content"
-        android:layout_gravity="center"
         android:orientation="vertical"
-        ex:layout_narrowParentWidth="600dip"
-        ex:layout_narrowWidth="400dip"
-        ex:layout_wideParentWidth="880dip"
-        ex:layout_wideWidth="600dip">
-
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:gravity="center_horizontal"
+        android:background="@drawable/panel_message">
         <TextView
             android:id="@+id/message"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:textAppearance="?android:attr/textAppearanceMedium"
-            android:layout_marginBottom="20dip" />
-
-        <Button
-            android:id="@+id/create_contact_button"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:layout_marginBottom="15dip"
-            android:text="@string/contacts_unavailable_create_contact" />
-
-        <Button
-            android:id="@+id/add_account_button"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:layout_marginBottom="15dip"
-            android:text="@string/contacts_unavailable_add_account" />
-
-        <Button
-            android:id="@+id/import_contacts_button"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:layout_marginBottom="15dip"
-            android:text="@string/contacts_unavailable_import_contacts" />
-
-        <Button
-            android:id="@+id/import_failure_uninstall_button"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:layout_marginBottom="15dip"
-            android:text="@string/upgrade_out_of_memory_uninstall" />
-
-        <Button
-            android:id="@+id/import_failure_retry_button"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:layout_marginBottom="15dip"
-            android:text="@string/upgrade_out_of_memory_retry" />
-
-        <ProgressBar
-            android:id="@+id/progress"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
+            android:layout_marginTop="48dip"
+            android:textAppearance="?android:attr/textAppearanceLarge"
+            android:textColor="?android:attr/textColorSecondary" />
+
+        <TextView
+            android:id="@+id/secondary_message"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:textAppearance="?android:attr/textAppearanceSmall"
+            android:textColor="?android:attr/textColorSecondary"
             android:layout_gravity="center_horizontal"
-            android:layout_marginBottom="15dip" />
+            android:layout_marginBottom="@dimen/no_accounts_message_margin" />
+
+        <LinearLayout
+            android:orientation="vertical"
+            android:layout_marginLeft="48dip"
+            android:layout_marginRight="48dip"
+            android:layout_width="wrap_content"
+            android:layout_height="match_parent">
+            <Button
+                android:id="@+id/create_contact_button"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginBottom="15dip"
+                android:text="@string/contacts_unavailable_create_contact" />
+
+            <Button
+                android:id="@+id/add_account_button"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginBottom="15dip"
+                android:text="@string/contacts_unavailable_add_account" />
+
+            <Button
+                android:id="@+id/import_contacts_button"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginBottom="15dip"
+                android:text="@string/contacts_unavailable_import_contacts" />
+
+            <Button
+                android:id="@+id/import_failure_uninstall_button"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginBottom="15dip"
+                android:text="@string/upgrade_out_of_memory_uninstall" />
+
+            <Button
+                android:id="@+id/import_failure_retry_button"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginBottom="15dip"
+                android:text="@string/upgrade_out_of_memory_retry" />
+
+            <ProgressBar
+                android:id="@+id/progress"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_gravity="center_horizontal"
+                android:layout_marginBottom="15dip" />
+        </LinearLayout>
     </LinearLayout>
-</com.android.contacts.widget.InterpolatingLayout>
+</ScrollView>
\ No newline at end of file
diff --git a/res/layout/group_browse_list_fragment.xml b/res/layout/group_browse_list_fragment.xml
index 6e82e8f..e3d98f0 100644
--- a/res/layout/group_browse_list_fragment.xml
+++ b/res/layout/group_browse_list_fragment.xml
@@ -38,32 +38,31 @@
         android:layout_marginTop="@dimen/empty_message_top_margin"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        android:paddingTop="8dip"
         android:gravity="center_horizontal"
-        android:textAppearance="?android:attr/textAppearanceMedium"
+        android:textAppearance="?android:attr/textAppearanceLarge"
+        android:textColor="?android:attr/textColorSecondary"
         android:text="@string/noGroups" />
 
     <LinearLayout
       android:id="@+id/add_accounts"
-      android:layout_width="match_parent"
+      android:layout_width="wrap_content"
       android:layout_height="wrap_content"
+      android:layout_gravity="center_horizontal"
       android:orientation="vertical">
 
       <TextView
-        android:layout_width="match_parent"
+        android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:gravity="center_horizontal"
-        android:layout_marginTop="@dimen/no_accounts_message_margin"
         android:layout_marginBottom="@dimen/no_accounts_message_margin"
         android:textAppearance="?android:attr/textAppearanceSmall"
+        android:textColor="?android:attr/textColorSecondary"
         android:text="@string/noAccounts" />
 
       <Button
         android:id="@+id/add_account_button"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        android:layout_marginLeft="@dimen/add_account_button_left_margin"
-        android:layout_marginRight="@dimen/add_account_button_right_margin"
         android:gravity="center"
         android:layout_gravity="center_horizontal"
         android:textAppearance="?android:attr/textAppearanceMedium"
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index a67aa6b..f5fd3bf 100644
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -240,10 +240,8 @@
     <dimen name="call_detail_action_bar_height">60dip</dimen>
 
     <!-- Empty message margins -->
-    <dimen name="empty_message_top_margin">43dip</dimen>
-    <dimen name="no_accounts_message_margin">15dip</dimen>
-    <dimen name="add_account_button_left_margin">50dip</dimen>
-    <dimen name="add_account_button_right_margin">50dip</dimen>
+    <dimen name="empty_message_top_margin">48dip</dimen>
+    <dimen name="no_accounts_message_margin">20dip</dimen>
 
     <!-- For contact filter setting screens -->
     <dimen name="contact_filter_left_margin">16dip</dimen>
diff --git a/src/com/android/contacts/ContactsUtils.java b/src/com/android/contacts/ContactsUtils.java
index 45ce4fe..2f13481 100644
--- a/src/com/android/contacts/ContactsUtils.java
+++ b/src/com/android/contacts/ContactsUtils.java
@@ -16,6 +16,8 @@
 
 package com.android.contacts;
 
+import com.android.contacts.model.AccountTypeManager;
+import com.android.contacts.model.AccountWithDataSet;
 import com.android.i18n.phonenumbers.NumberParseException;
 import com.android.i18n.phonenumbers.PhoneNumberUtil;
 import com.android.i18n.phonenumbers.PhoneNumberUtil.MatchType;
@@ -29,6 +31,8 @@
 import android.telephony.PhoneNumberUtils;
 import android.text.TextUtils;
 
+import java.util.List;
+
 public class ContactsUtils {
     private static final String TAG = "ContactsUtils";
     private static final String WAIT_SYMBOL_AS_STRING = String.valueOf(PhoneNumberUtils.WAIT);
@@ -166,4 +170,12 @@
                 (CountryDetector) context.getSystemService(Context.COUNTRY_DETECTOR);
         return detector.detectCountry().getCountryIso();
     }
+
+    public static boolean areAccountsAvailable(Context context) {
+        final List<AccountWithDataSet> accounts =
+                AccountTypeManager.getInstance(context).getAccounts(true /* writeable */);
+        return !accounts.isEmpty();
+    }
+
+
 }
diff --git a/src/com/android/contacts/activities/PeopleActivity.java b/src/com/android/contacts/activities/PeopleActivity.java
index 1da1c97..b226ad1 100644
--- a/src/com/android/contacts/activities/PeopleActivity.java
+++ b/src/com/android/contacts/activities/PeopleActivity.java
@@ -19,6 +19,7 @@
 import com.android.contacts.ContactLoader;
 import com.android.contacts.ContactSaveService;
 import com.android.contacts.ContactsActivity;
+import com.android.contacts.ContactsUtils;
 import com.android.contacts.R;
 import com.android.contacts.activities.ActionBarAdapter.TabState;
 import com.android.contacts.detail.ContactDetailFragment;
@@ -198,9 +199,7 @@
     }
 
     private boolean areAccountsAvailable() {
-        final List<AccountWithDataSet> accounts =
-                AccountTypeManager.getInstance(this).getAccounts(true /* writeable */);
-        return !accounts.isEmpty();
+        return ContactsUtils.areAccountsAvailable(this);
     }
 
 
@@ -677,13 +676,14 @@
             switch (tab) {
                 case FAVORITES:
                     mContactsUnavailableFragment.setMessageText(
-                            R.string.listTotalAllContactsZeroStarred);
+                            R.string.listTotalAllContactsZeroStarred, -1);
                     break;
                 case GROUPS:
-                    mContactsUnavailableFragment.setMessageText(R.string.noGroups);
+                    mContactsUnavailableFragment.setMessageText(R.string.noGroups,
+                            areAccountsAvailable() ? -1 : R.string.noAccounts);
                     break;
                 case ALL:
-                    mContactsUnavailableFragment.setMessageText(R.string.noContacts);
+                    mContactsUnavailableFragment.setMessageText(R.string.noContacts, -1);
                     break;
             }
         }
diff --git a/src/com/android/contacts/group/GroupBrowseListFragment.java b/src/com/android/contacts/group/GroupBrowseListFragment.java
index aca638e..49835ef 100644
--- a/src/com/android/contacts/group/GroupBrowseListFragment.java
+++ b/src/com/android/contacts/group/GroupBrowseListFragment.java
@@ -16,6 +16,7 @@
 
 package com.android.contacts.group;
 
+import com.android.contacts.ContactsUtils;
 import com.android.contacts.GroupListLoader;
 import com.android.contacts.R;
 import com.android.contacts.group.GroupBrowseListAdapter.GroupListItemViewCache;
@@ -47,6 +48,7 @@
 import android.widget.AdapterView;
 import android.widget.AdapterView.OnItemClickListener;
 import android.widget.ListView;
+import android.widget.TextView;
 
 /**
  * Fragment to display the list of groups.
@@ -81,7 +83,7 @@
 
     private View mRootView;
     private AutoScrollListView mListView;
-    private View mEmptyView;
+    private TextView mEmptyView;
     private View mAddAccountsView;
     private View mAddAccountButton;
 
@@ -100,7 +102,7 @@
     public View onCreateView(LayoutInflater inflater, ViewGroup container,
             Bundle savedInstanceState) {
         mRootView = inflater.inflate(R.layout.group_browse_list_fragment, null);
-        mEmptyView = mRootView.findViewById(R.id.empty);
+        mEmptyView = (TextView)mRootView.findViewById(R.id.empty);
 
         mAdapter = new GroupBrowseListAdapter(mContext);
         mAdapter.setSelectionVisible(mSelectionVisible);
@@ -120,7 +122,7 @@
             }
         });
 
-        mEmptyView = mRootView.findViewById(R.id.empty);
+        mListView.setEmptyView(mEmptyView);
         mAddAccountsView = mRootView.findViewById(R.id.add_accounts);
         mAddAccountButton = mRootView.findViewById(R.id.add_account_button);
         mAddAccountButton.setOnClickListener(new OnClickListener() {
@@ -133,7 +135,7 @@
                 startActivity(intent);
             }
         });
-        setAddAccountsVisibility(false);
+        setAddAccountsVisibility(!ContactsUtils.areAccountsAvailable(mContext));
 
         if (savedInstanceState != null) {
             String groupUriString = savedInstanceState.getString(EXTRA_KEY_GROUP_URI);
@@ -193,6 +195,7 @@
 
         @Override
         public CursorLoader onCreateLoader(int id, Bundle args) {
+            mEmptyView.setText(null);
             return new GroupListLoader(mContext);
         }
 
@@ -207,6 +210,8 @@
     };
 
     private void bindGroupList() {
+        mEmptyView.setText(R.string.noGroups);
+        setAddAccountsVisibility(!ContactsUtils.areAccountsAvailable(mContext));
         if (mGroupListCursor == null) {
             return;
         }
@@ -219,7 +224,6 @@
             // Restore the scroll position.
             mListView.onRestoreInstanceState(listState);
         }
-        mListView.setEmptyView(mEmptyView);
 
         mSelectedGroupUri = mAdapter.getSelectedGroup();
         if (mSelectionVisible && mSelectedGroupUri != null) {
diff --git a/src/com/android/contacts/list/ContactsUnavailableFragment.java b/src/com/android/contacts/list/ContactsUnavailableFragment.java
index 3bab3fd..74a578f 100644
--- a/src/com/android/contacts/list/ContactsUnavailableFragment.java
+++ b/src/com/android/contacts/list/ContactsUnavailableFragment.java
@@ -39,6 +39,7 @@
 
     private View mView;
     private TextView mMessageView;
+    private TextView mSecondaryMessageView;
     private Button mCreateContactButton;
     private Button mAddAccountButton;
     private Button mImportContactsButton;
@@ -46,6 +47,7 @@
     private Button mRetryUpgradeButton;
     private ProgressBar mProgress;
     private int mNoContactsMsgResId = -1;
+    private int mNSecNoContactsMsgResId = -1;
 
     private OnContactsUnavailableActionListener mListener;
 
@@ -54,6 +56,7 @@
             LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
         mView = inflater.inflate(R.layout.contacts_unavailable_fragment, null);
         mMessageView = (TextView) mView.findViewById(R.id.message);
+        mSecondaryMessageView = (TextView) mView.findViewById(R.id.secondary_message);
         mCreateContactButton = (Button) mView.findViewById(R.id.create_contact_button);
         mCreateContactButton.setOnClickListener(this);
         mAddAccountButton = (Button) mView.findViewById(R.id.add_account_button);
@@ -82,14 +85,7 @@
         int providerStatus = mProviderStatusLoader.getProviderStatus();
         switch (providerStatus) {
             case ProviderStatus.STATUS_NO_ACCOUNTS_NO_CONTACTS:
-                if (mNoContactsMsgResId != -1) {
-                    mMessageView.setText(mNoContactsMsgResId);
-                    mMessageView.setGravity(Gravity.CENTER_HORIZONTAL);
-                    mMessageView.setVisibility(View.VISIBLE);
-                } else {
-                    mMessageView.setGravity(Gravity.LEFT);
-                    mMessageView.setVisibility(View.GONE);
-                }
+                setMessageText(mNoContactsMsgResId, mNSecNoContactsMsgResId);
                 mCreateContactButton.setVisibility(View.VISIBLE);
                 mAddAccountButton.setVisibility(View.VISIBLE);
                 mImportContactsButton.setVisibility(View.VISIBLE);
@@ -162,18 +158,31 @@
         }
     }
     /**
-     * Set the message to be shown if data is available for the selected tab
+     * Set the message to be shown if no data is available for the selected tab
      *
-     * @param resId - String resource ID of the message
+     * @param resId - String resource ID of the message , -1 means view will not be visible
      */
-    public void setMessageText(int resId) {
+    public void setMessageText(int resId, int secResId) {
         mNoContactsMsgResId = resId;
+        mNSecNoContactsMsgResId = secResId;
         if (mMessageView != null &&
                 mProviderStatusLoader.getProviderStatus() ==
                     ProviderStatus.STATUS_NO_ACCOUNTS_NO_CONTACTS) {
-            mMessageView.setText(mNoContactsMsgResId);
-            mMessageView.setGravity(Gravity.CENTER_HORIZONTAL);
-            mMessageView.setVisibility(View.VISIBLE);
+            if (resId != -1) {
+                mMessageView.setText(mNoContactsMsgResId);
+                mMessageView.setGravity(Gravity.CENTER_HORIZONTAL);
+                mMessageView.setVisibility(View.VISIBLE);
+                if (secResId != -1) {
+                    mSecondaryMessageView.setText(mNSecNoContactsMsgResId);
+                    mSecondaryMessageView.setGravity(Gravity.CENTER_HORIZONTAL);
+                    mSecondaryMessageView.setVisibility(View.VISIBLE);
+                } else {
+                    mSecondaryMessageView.setVisibility(View.INVISIBLE);
+                }
+            } else {
+                mSecondaryMessageView.setVisibility(View.GONE);
+                mMessageView.setVisibility(View.GONE);
+            }
         }
     }
 }