Merge "Do not allow adding contracts for private numbers."
diff --git a/res/layout/contact_tile_list.xml b/res/layout/contact_tile_list.xml
index 79c6ecf..69ae1cc 100644
--- a/res/layout/contact_tile_list.xml
+++ b/res/layout/contact_tile_list.xml
@@ -14,9 +14,22 @@
limitations under the License.
-->
-<ListView xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/contact_tile_list"
+<FrameLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:divider="@null"
-/>
+ android:layout_height="match_parent">
+
+ <ListView
+ android:id="@+id/contact_tile_list"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:divider="@null" />
+
+ <TextView
+ android:id="@+id/contact_tile_list_empty"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:gravity="center_horizontal"
+ android:textAppearance="?android:attr/textAppearanceLarge"/>
+
+</FrameLayout>
diff --git a/res/layout/item_group_membership.xml b/res/layout/item_group_membership.xml
index 34ba773..13ddb20 100644
--- a/res/layout/item_group_membership.xml
+++ b/res/layout/item_group_membership.xml
@@ -20,10 +20,11 @@
android:layout_height="wrap_content"
android:orientation="vertical">
- <View
+ <ImageView
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:background="@drawable/divider_horizontal_light" />
+ android:scaleType="fitXY"
+ android:src="@drawable/divider_horizontal_light" />
<include
android:id="@+id/kind_title"
diff --git a/res/layout/item_kind_section.xml b/res/layout/item_kind_section.xml
index 6c6f960..2c6dc6f 100644
--- a/res/layout/item_kind_section.xml
+++ b/res/layout/item_kind_section.xml
@@ -23,10 +23,11 @@
android:paddingBottom="@dimen/editor_field_bottom_padding"
android:orientation="vertical">
- <View
+ <ImageView
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:background="@drawable/divider_horizontal_light" />
+ android:scaleType="fitXY"
+ android:src="@drawable/divider_horizontal_light" />
<LinearLayout
android:id="@+id/kind_editors"
diff --git a/src/com/android/contacts/activities/DialtactsActivity.java b/src/com/android/contacts/activities/DialtactsActivity.java
index 62b8321..7a84e6d 100644
--- a/src/com/android/contacts/activities/DialtactsActivity.java
+++ b/src/com/android/contacts/activities/DialtactsActivity.java
@@ -20,6 +20,7 @@
import com.android.contacts.calllog.CallLogFragment;
import com.android.contacts.dialpad.DialpadFragment;
import com.android.contacts.interactions.PhoneNumberInteraction;
+import com.android.contacts.list.ContactTileAdapter.DisplayType;
import com.android.contacts.list.OnPhoneNumberPickerActionListener;
import com.android.contacts.list.PhoneNumberPickerFragment;
import com.android.contacts.list.ContactTileListFragment;
@@ -335,6 +336,7 @@
mStrequentFragment = (ContactTileListFragment) fragment;
mStrequentFragment.enableQuickContact(false);
mStrequentFragment.setListener(mStrequentListener);
+ mStrequentFragment.setDisplayType(DisplayType.STREQUENT_PHONE_ONLY);
} else if (fragment instanceof PhoneNumberPickerFragment) {
mSearchFragment = (PhoneNumberPickerFragment) fragment;
mSearchFragment.setOnPhoneNumberPickerActionListener(mPhoneNumberPickerActionListener);
diff --git a/src/com/android/contacts/activities/PeopleActivity.java b/src/com/android/contacts/activities/PeopleActivity.java
index 0b403cb..07fa8f1 100644
--- a/src/com/android/contacts/activities/PeopleActivity.java
+++ b/src/com/android/contacts/activities/PeopleActivity.java
@@ -202,6 +202,13 @@
return mProviderStatus == ProviderStatus.STATUS_NORMAL;
}
+ private boolean areAccountsAvailable() {
+ final ArrayList<Account> accounts =
+ AccountTypeManager.getInstance(this).getAccounts(true /* writeable */);
+ return !accounts.isEmpty();
+ }
+
+
/**
* Initialize fragments that are (or may not be) in the layout.
*
@@ -575,10 +582,12 @@
if (mActionBarAdapter.isSearchMode()) {
mTabPagerAdapter.setSearchMode(true);
} else {
+ // No smooth scrolling if quitting from the search mode.
+ final boolean wasSearchMode = mTabPagerAdapter.isSearchMode();
mTabPagerAdapter.setSearchMode(false);
int tabIndex = tab.ordinal();
if (mTabPager.getCurrentItem() != tabIndex) {
- mTabPager.setCurrentItem(tab.ordinal(), false /* no smooth scroll */);
+ mTabPager.setCurrentItem(tabIndex, !wasSearchMode);
}
}
invalidateOptionsMenu();
@@ -1230,8 +1239,13 @@
addGroupMenu.setVisible(false);
break;
case GROUPS:
+ // Do not display the "new group" button if no accounts are available
+ if (areAccountsAvailable()) {
+ addGroupMenu.setVisible(true);
+ } else {
+ addGroupMenu.setVisible(false);
+ }
addContactMenu.setVisible(false);
- addGroupMenu.setVisible(true);
break;
}
}
diff --git a/src/com/android/contacts/list/ContactTileAdapter.java b/src/com/android/contacts/list/ContactTileAdapter.java
index 596cceb..9674960 100644
--- a/src/com/android/contacts/list/ContactTileAdapter.java
+++ b/src/com/android/contacts/list/ContactTileAdapter.java
@@ -202,7 +202,7 @@
@Override
public int getCount() {
if (mContactCursor == null || mContactCursor.getCount() == 0) {
- return 0;
+ return 0;
}
switch (mDisplayType) {
@@ -304,7 +304,7 @@
int itemViewType = getItemViewType(position);
if (itemViewType == ViewTypes.DIVIDER) {
// Checking For Divider First so not to cast convertView
- return convertView == null ? createDivider() : convertView;
+ return convertView == null ? getDivider() : convertView;
}
ContactTileRow contactTileRowView = (ContactTileRow) convertView;
@@ -322,7 +322,7 @@
* Divider uses a list_seperator.xml along with text to denote
* the most frequently contacted contacts.
*/
- private View createDivider() {
+ private View getDivider() {
View dividerView = View.inflate(mContext, R.layout.list_separator, null);
dividerView.setFocusable(false);
TextView text = (TextView) dividerView.findViewById(R.id.header_text);
diff --git a/src/com/android/contacts/list/ContactTileListFragment.java b/src/com/android/contacts/list/ContactTileListFragment.java
index f4bd1b5..875d5d2 100644
--- a/src/com/android/contacts/list/ContactTileListFragment.java
+++ b/src/com/android/contacts/list/ContactTileListFragment.java
@@ -34,6 +34,7 @@
import android.view.View;
import android.view.ViewGroup;
import android.widget.ListView;
+import android.widget.TextView;
/**
* Fragment containing a list of starred contacts followed by a list of frequently contacted.
@@ -49,8 +50,9 @@
private Listener mListener;
private ContactTileAdapter mAdapter;
+ private DisplayType mDisplayType;
+ private TextView mEmptyView;
private ListView mListView;
- private DisplayType mDisplayType = DisplayType.STREQUENT_PHONE_ONLY;
@Override
public void onAttach(Activity activity) {
@@ -67,11 +69,15 @@
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
- View v = inflater.inflate(R.layout.contact_tile_list, container, false);
- mListView = (ListView) v.findViewById(R.id.contact_tile_list);
+ View listLayout = inflater.inflate(R.layout.contact_tile_list, container, false);
+
+ mEmptyView = (TextView) listLayout.findViewById(R.id.contact_tile_list_empty);
+ mListView = (ListView) listLayout.findViewById(R.id.contact_tile_list);
+
mListView.setItemsCanFocus(true);
mListView.setAdapter(mAdapter);
- return v;
+
+ return listLayout;
}
@Override
@@ -117,12 +123,32 @@
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
mAdapter.setContactCursor(data);
+ mEmptyView.setText(getEmptyStateText());
+ mListView.setEmptyView(mEmptyView);
}
@Override
public void onLoaderReset(Loader<Cursor> loader) {}
};
+ private String getEmptyStateText() {
+ String emptyText;
+ switch (mDisplayType) {
+ case STREQUENT:
+ case STREQUENT_PHONE_ONLY:
+ case STARRED_ONLY:
+ emptyText = getString(R.string.listTotalAllContactsZeroStarred);
+ break;
+ case FREQUENT_ONLY:
+ case GROUP_MEMBERS:
+ emptyText = getString(R.string.noContacts);
+ break;
+ default:
+ throw new IllegalArgumentException("Unrecognized DisplayType " + mDisplayType);
+ }
+ return emptyText;
+ }
+
public void setListener(Listener listener) {
mListener = listener;
}