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.