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/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);
+            }
         }
     }
 }