Add empty view for empty groups
Bug 28982874
Change-Id: I757651e3fd2897d65609ab233722160e0b267b01
diff --git a/res/drawable-hdpi/label_empty.png b/res/drawable-hdpi/label_empty.png
new file mode 100644
index 0000000..e400f04
--- /dev/null
+++ b/res/drawable-hdpi/label_empty.png
Binary files differ
diff --git a/res/drawable-mdpi/label_empty.png b/res/drawable-mdpi/label_empty.png
new file mode 100644
index 0000000..360cbd2
--- /dev/null
+++ b/res/drawable-mdpi/label_empty.png
Binary files differ
diff --git a/res/drawable-xhdpi/label_empty.png b/res/drawable-xhdpi/label_empty.png
new file mode 100644
index 0000000..a38178c
--- /dev/null
+++ b/res/drawable-xhdpi/label_empty.png
Binary files differ
diff --git a/res/drawable-xxhdpi/label_empty.png b/res/drawable-xxhdpi/label_empty.png
new file mode 100644
index 0000000..158fa67
--- /dev/null
+++ b/res/drawable-xxhdpi/label_empty.png
Binary files differ
diff --git a/res/layout/empty_group_view.xml b/res/layout/empty_group_view.xml
new file mode 100644
index 0000000..6f6e3a8
--- /dev/null
+++ b/res/layout/empty_group_view.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/empty_group"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="vertical"
+ android:background="@color/empty_state_background"
+ android:visibility="gone">
+
+ <ImageView
+ android:id="@+id/empty_group_image"
+ android:layout_width="@dimen/empty_group_view_image_width"
+ android:layout_height="wrap_content"
+ android:scaleType="centerInside"
+ android:adjustViewBounds="true"
+ android:src="@drawable/label_empty"/>
+
+ <TextView
+ android:id="@+id/empty_group_view_text"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_horizontal"
+ android:paddingTop="@dimen/empty_group_view_text_padding_top"
+ android:paddingBottom="@dimen/empty_group_view_text_padding_bottom"
+ android:text="@string/emptyGroup"
+ style="@style/EmptyStateTextStyle"/>
+
+ <Button
+ android:id="@+id/add_member_button"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_horizontal"
+ android:text="@string/menu_addContactsToGroup"
+ style="@style/AddContactsButtonStyle"/>
+</LinearLayout>
\ No newline at end of file
diff --git a/res/values-land/dimens.xml b/res/values-land/dimens.xml
index d975093..6404cf2 100644
--- a/res/values-land/dimens.xml
+++ b/res/values-land/dimens.xml
@@ -18,4 +18,10 @@
<dimen name="dialpad_digits_text_size">28sp</dimen>
<dimen name="dialpad_digits_margin_bottom">50dip</dimen>
<dimen name="editor_type_label_width">120dip</dimen>
+
+ <!-- Top padding for the text for empty group view-->
+ <dimen name="empty_group_view_text_padding_top">20dp</dimen>
+
+ <!-- Width for the image for empty group view-->
+ <dimen name="empty_group_view_image_width">176dp</dimen>
</resources>
diff --git a/res/values/colors.xml b/res/values/colors.xml
index 8fa0e0d..d71363d 100644
--- a/res/values/colors.xml
+++ b/res/values/colors.xml
@@ -77,4 +77,8 @@
<!-- Color of background of disabled link contacts button, 15% black. -->
<color name="disabled_button_background">#26000000</color>
+
+ <!-- Color of background of all empty states. -->
+ <color name="empty_state_background">#efefef</color>
+
</resources>
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index cf12fc4..dc263fc 100644
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -278,4 +278,10 @@
<dimen name="nav_activity_horizontal_margin">16dp</dimen>
<dimen name="nav_activity_vertical_margin">16dp</dimen>
+ <!-- Top and Bottom padding for the text for empty group view-->
+ <dimen name="empty_group_view_text_padding_top">32dp</dimen>
+ <dimen name="empty_group_view_text_padding_bottom">16dp</dimen>
+
+ <!-- Width for the image for empty group view-->
+ <dimen name="empty_group_view_image_width">232dp</dimen>
</resources>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 5c9be9f..cde5da0 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -295,7 +295,7 @@
<string name="noAccounts">To create groups you need an account.</string>
<!-- The text displayed when there are no members that have this label while displaying the label detail page [CHAR LIMIT=70] -->
- <string name="emptyGroup">No people with this label.</string>
+ <string name="emptyGroup">No contacts with this label</string>
<!-- Toast displayed when a contact is saved [CHAR LIMIT=NONE] -->
<string name="contactSavedToast">Contact saved</string>
diff --git a/res/values/styles.xml b/res/values/styles.xml
index 4332a6b..04252238 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -398,4 +398,21 @@
<style name="NavigationDrawerMenuItemTextAppearance">
<item name="android:ellipsize">end</item>
</style>
+
+ <!-- Text style for empty states. -->
+ <style name="EmptyStateTextStyle">
+ <item name="android:textSize">18sp</item>
+ <item name="android:textColor">#000000</item>
+ <item name="android:alpha">0.54</item>
+ <item name="android:fontFamily">sans-serif</item>
+ </style>
+
+ <!-- Add contacts button style for empty states. -->
+ <style name="AddContactsButtonStyle" parent="android:Widget.Holo.Button.Borderless">
+ <item name="android:textSize">16sp</item>
+ <item name="android:textColor">#0288d1</item>
+ <item name="android:fontFamily">sans-serif-medium</item>
+ <item name="android:textAllCaps">true</item>
+ <item name="android:minHeight">0dp</item>
+ </style>
</resources>
diff --git a/src/com/android/contacts/activities/GroupMembersActivity.java b/src/com/android/contacts/activities/GroupMembersActivity.java
index b75295d..5bb3793 100644
--- a/src/com/android/contacts/activities/GroupMembersActivity.java
+++ b/src/com/android/contacts/activities/GroupMembersActivity.java
@@ -23,7 +23,6 @@
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
-import android.provider.ContactsContract;
import android.provider.ContactsContract.RawContacts;
import android.support.v4.view.GravityCompat;
import android.support.v7.app.ActionBar;
@@ -354,6 +353,11 @@
}
}
+ public void startGroupAddMemberActivity() {
+ startActivityForResult(GroupUtil.createPickMemberIntent(mGroupMetadata,
+ mMembersFragment.getMemberContactIds()), RESULT_GROUP_ADD_MEMBER);
+ }
+
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
@@ -362,14 +366,7 @@
return true;
}
case R.id.menu_add: {
- final Intent intent = new Intent(Intent.ACTION_PICK);
- intent.setType(ContactsContract.Groups.CONTENT_ITEM_TYPE);
- intent.putExtra(UiIntentActions.GROUP_ACCOUNT_NAME, mGroupMetadata.accountName);
- intent.putExtra(UiIntentActions.GROUP_ACCOUNT_TYPE, mGroupMetadata.accountType);
- intent.putExtra(UiIntentActions.GROUP_ACCOUNT_DATA_SET, mGroupMetadata.dataSet);
- intent.putExtra(UiIntentActions.GROUP_CONTACT_IDS,
- mMembersFragment.getMemberContactIds());
- startActivityForResult(intent, RESULT_GROUP_ADD_MEMBER);
+ startGroupAddMemberActivity();
return true;
}
case R.id.menu_rename_group: {
diff --git a/src/com/android/contacts/group/GroupMembersFragment.java b/src/com/android/contacts/group/GroupMembersFragment.java
index 7b4492a..0d880e5 100644
--- a/src/com/android/contacts/group/GroupMembersFragment.java
+++ b/src/com/android/contacts/group/GroupMembersFragment.java
@@ -17,17 +17,26 @@
import android.app.Activity;
import android.app.LoaderManager.LoaderCallbacks;
+import android.content.Context;
import android.content.CursorLoader;
import android.content.Loader;
+import android.content.res.Configuration;
+import android.content.res.Resources;
import android.database.Cursor;
import android.database.CursorWrapper;
import android.net.Uri;
import android.os.Bundle;
import android.provider.ContactsContract.Contacts;
+import android.util.DisplayMetrics;
import android.util.Log;
+import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
+import android.widget.Button;
+import android.widget.FrameLayout;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
import android.widget.TextView;
import com.android.contacts.GroupMetaDataLoader;
@@ -282,15 +291,19 @@
private void bindMembersCount(int memberCount) {
final View accountFilterContainer = getView().findViewById(
R.id.account_filter_header_container);
- if (memberCount >= 0) {
+ final View emptyGroupView = getView().findViewById(R.id.empty_group);
+ if (memberCount > 0) {
accountFilterContainer.setVisibility(View.VISIBLE);
final TextView accountFilterHeader = (TextView) accountFilterContainer.findViewById(
R.id.account_filter_header);
accountFilterHeader.setText(mGroupMetadata.accountName);
accountFilterHeader.setAllCaps(false);
+
+ emptyGroupView.setVisibility(View.GONE);
} else {
accountFilterContainer.setVisibility(View.GONE);
+ emptyGroupView.setVisibility(View.VISIBLE);
}
}
@@ -345,7 +358,35 @@
@Override
protected View inflateView(LayoutInflater inflater, ViewGroup container) {
- return inflater.inflate(R.layout.contact_list_content, /* root */ null);
+ final View view = inflater.inflate(R.layout.contact_list_content, /* root */ null);
+ final View emptyGroupView = inflater.inflate(R.layout.empty_group_view, null);
+ final ImageView image = (ImageView) emptyGroupView.findViewById(R.id.empty_group_image);
+ final LinearLayout.LayoutParams params =
+ (LinearLayout.LayoutParams) image.getLayoutParams();
+
+ final Resources resources = getContext().getResources();
+ final DisplayMetrics metrics = resources.getDisplayMetrics();
+ final int height = metrics.heightPixels;
+ if (resources.getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
+ params.setMargins(0, height / 8, 0, 0);
+ } else {
+ params.setMargins(0, height / 6, 0, 0);
+ }
+ params.gravity = Gravity.CENTER_HORIZONTAL;
+ image.setLayoutParams(params);
+
+ final FrameLayout contactListLayout = (FrameLayout) view.findViewById(R.id.contact_list);
+ contactListLayout.addView(emptyGroupView);
+
+ final Button addContactsButton =
+ (Button) emptyGroupView.findViewById(R.id.add_member_button);
+ addContactsButton.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ ((GroupMembersActivity) getActivity()).startGroupAddMemberActivity();
+ }
+ });
+ return view;
}
@Override
diff --git a/src/com/android/contacts/group/GroupUtil.java b/src/com/android/contacts/group/GroupUtil.java
index f0f5c09..beba2ea 100644
--- a/src/com/android/contacts/group/GroupUtil.java
+++ b/src/com/android/contacts/group/GroupUtil.java
@@ -34,6 +34,7 @@
import com.android.contacts.common.list.ContactsSectionIndexer;
import com.android.contacts.common.model.account.GoogleAccountType;
import com.android.contacts.common.testing.NeededForTesting;
+import com.android.contacts.list.UiIntentActions;
import com.google.common.base.Objects;
import java.util.ArrayList;
@@ -129,6 +130,18 @@
ContentUris.withAppendedId(Groups.CONTENT_URI, groupId), title);
}
+ /** Returns an Intent to pick contacts to add to a group. */
+ public static Intent createPickMemberIntent(
+ GroupMetadata groupMetadata, ArrayList<String> memberContactIds) {
+ final Intent intent = new Intent(Intent.ACTION_PICK);
+ intent.setType(Groups.CONTENT_ITEM_TYPE);
+ intent.putExtra(UiIntentActions.GROUP_ACCOUNT_NAME, groupMetadata.accountName);
+ intent.putExtra(UiIntentActions.GROUP_ACCOUNT_TYPE, groupMetadata.accountType);
+ intent.putExtra(UiIntentActions.GROUP_ACCOUNT_DATA_SET, groupMetadata.dataSet);
+ intent.putExtra(UiIntentActions.GROUP_CONTACT_IDS, memberContactIds);
+ return intent;
+ }
+
/**
* Converts the given group Uri to the legacy format if the legacy authority was specified
* in the given Uri.