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