summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--res/drawable-hdpi/ic_empty_cv_120dp.pngbin0 -> 5367 bytes
-rw-r--r--res/drawable-mdpi/ic_empty_cv_120dp.pngbin0 -> 4464 bytes
-rw-r--r--res/drawable-v21/ic_empty_cv_120dp.xml26
-rw-r--r--res/drawable-xhdpi/ic_empty_cv_120dp.pngbin0 -> 6861 bytes
-rw-r--r--res/drawable-xxhdpi/ic_empty_cv_120dp.pngbin0 -> 9507 bytes
-rw-r--r--res/layout/conversation_list.xml10
-rw-r--r--res/layout/conversation_list_empty_view.xml3
-rw-r--r--res/layout/two_pane_activity.xml11
-rw-r--r--res/values-sw600dp/dimen.xml1
-rw-r--r--res/values/colors.xml1
-rw-r--r--res/values/dimen.xml2
-rw-r--r--src/com/android/mail/ui/AbstractActivityController.java5
-rw-r--r--src/com/android/mail/ui/ConversationListCallbacks.java9
-rw-r--r--src/com/android/mail/ui/ConversationListEmptyView.java37
-rw-r--r--src/com/android/mail/ui/ConversationListFragment.java17
-rw-r--r--src/com/android/mail/ui/TwoPaneController.java24
-rw-r--r--src/com/android/mail/utils/EmptyStateUtils.java73
17 files changed, 180 insertions, 39 deletions
diff --git a/res/drawable-hdpi/ic_empty_cv_120dp.png b/res/drawable-hdpi/ic_empty_cv_120dp.png
new file mode 100644
index 000000000..7c09e7afa
--- /dev/null
+++ b/res/drawable-hdpi/ic_empty_cv_120dp.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_empty_cv_120dp.png b/res/drawable-mdpi/ic_empty_cv_120dp.png
new file mode 100644
index 000000000..39356c2ff
--- /dev/null
+++ b/res/drawable-mdpi/ic_empty_cv_120dp.png
Binary files differ
diff --git a/res/drawable-v21/ic_empty_cv_120dp.xml b/res/drawable-v21/ic_empty_cv_120dp.xml
new file mode 100644
index 000000000..868df44c6
--- /dev/null
+++ b/res/drawable-v21/ic_empty_cv_120dp.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2014 Google Inc.
+ Licensed to The Android Open Source Project.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="120.0dp"
+ android:height="120.0dp"
+ android:viewportWidth="120.0"
+ android:viewportHeight="120.0">
+ <path
+ android:fillColor="#1e000000"
+ android:pathData="M106.667,0.0l-93.4,0.0c-7.36,0.0 -13.2,5.973 -13.2,13.333L0.0,106.667c0.0,7.36 5.907,13.333 13.267,13.333l93.4,0.0c7.36,0.0 13.333,-5.973 13.333,-13.333L120.0,13.333C120.001,5.973 114.027,0.0 106.667,0.0zM106.667,80.0L80.0,80.0c0.0,11.04 -8.953,20.0 -20.0,20.0c-11.04,0.0 -20.0,-8.96 -20.0,-20.0L13.267,80.0L13.267,13.333l93.4,0.0L106.667,80.0z"/>
+</vector> \ No newline at end of file
diff --git a/res/drawable-xhdpi/ic_empty_cv_120dp.png b/res/drawable-xhdpi/ic_empty_cv_120dp.png
new file mode 100644
index 000000000..a381f3691
--- /dev/null
+++ b/res/drawable-xhdpi/ic_empty_cv_120dp.png
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_empty_cv_120dp.png b/res/drawable-xxhdpi/ic_empty_cv_120dp.png
new file mode 100644
index 000000000..0ddbf5fab
--- /dev/null
+++ b/res/drawable-xxhdpi/ic_empty_cv_120dp.png
Binary files differ
diff --git a/res/layout/conversation_list.xml b/res/layout/conversation_list.xml
index 70f9d1f94..6ef4f222a 100644
--- a/res/layout/conversation_list.xml
+++ b/res/layout/conversation_list.xml
@@ -46,7 +46,15 @@
android:layout_height="match_parent"
style="@style/ConversationListFade" />
- <include layout="@layout/conversation_load_spinner" />
+ <ProgressBar
+ android:id="@+id/conversation_list_loading_view"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:indeterminate="true"
+ android:indeterminateBehavior="repeat"
+ android:layout_gravity="center"
+ android:visibility="gone"
+ style="?android:attr/progressBarStyle" />
</FrameLayout>
diff --git a/res/layout/conversation_list_empty_view.xml b/res/layout/conversation_list_empty_view.xml
index cdb85b3f7..53dcf524b 100644
--- a/res/layout/conversation_list_empty_view.xml
+++ b/res/layout/conversation_list_empty_view.xml
@@ -28,6 +28,7 @@
android:id="@+id/empty_icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
+
<TextView
android:id="@+id/empty_text"
android:maxWidth="@dimen/empty_view_text_width"
@@ -36,7 +37,7 @@
android:layout_marginTop="@dimen/empty_view_space"
android:fontFamily="sans-serif-light"
android:gravity="center"
- android:textColor="#80000000"
+ android:textColor="@color/text_color_grey"
android:textSize="@dimen/empty_view_text_size" />
</com.android.mail.ui.ConversationListEmptyView>
diff --git a/res/layout/two_pane_activity.xml b/res/layout/two_pane_activity.xml
index a8232bb35..b9cd69f6c 100644
--- a/res/layout/two_pane_activity.xml
+++ b/res/layout/two_pane_activity.xml
@@ -34,7 +34,7 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:foregroundGravity="fill_horizontal|top"
- android:background="@color/tablet_background_gray">
+ android:background="@android:color/white">
<FrameLayout
android:id="@+id/drawer"
@@ -72,6 +72,15 @@
android:layout_gravity="left"
android:foreground="@drawable/ic_vertical_shadow_end_2dp" >
+ <!-- Empty icon view for CV landscape -->
+ <ImageView
+ android:id="@+id/conversation_pane_no_message_view"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center"
+ android:src="@drawable/ic_empty_cv_120dp"
+ android:visibility="gone" />
+
<include layout="@layout/conversation_pager"
android:layout_width="match_parent"
android:layout_height="match_parent" />
diff --git a/res/values-sw600dp/dimen.xml b/res/values-sw600dp/dimen.xml
index 77d2aa5ee..ce801d38c 100644
--- a/res/values-sw600dp/dimen.xml
+++ b/res/values-sw600dp/dimen.xml
@@ -50,7 +50,6 @@
<dimen name="search_view_width">400dip</dimen>
<dimen name="empty_view_text_width">380dip</dimen>
- <dimen name="empty_view_text_size">28sp</dimen>
<dimen name="empty_view_space">16dip</dimen>
<dimen name="chip_wrapper_start_padding">64dp</dimen>
diff --git a/res/values/colors.xml b/res/values/colors.xml
index c7a66f59b..2fce61330 100644
--- a/res/values/colors.xml
+++ b/res/values/colors.xml
@@ -28,7 +28,6 @@
<color name="light_gray">#cccccc</color>
<!-- if you want to make something blue, please try to use THIS blue -->
<color name="mail_app_blue">@android:color/holo_blue_light</color>
- <color name="tablet_background_gray">#eeeeee</color>
<color name="divider_color">#e5e5e5</color>
<!-- Conversation List Item Colors -->
diff --git a/res/values/dimen.xml b/res/values/dimen.xml
index 4a720c07c..de49ceecc 100644
--- a/res/values/dimen.xml
+++ b/res/values/dimen.xml
@@ -201,7 +201,7 @@
<dimen name="teaser_arrow_margin_end">12dip</dimen>
<dimen name="empty_view_text_width">228dip</dimen>
- <dimen name="empty_view_text_size">22sp</dimen>
+ <dimen name="empty_view_text_size">20sp</dimen>
<dimen name="empty_view_space">16dip</dimen>
<dimen name="avatar_border_width">.5dp</dimen>
diff --git a/src/com/android/mail/ui/AbstractActivityController.java b/src/com/android/mail/ui/AbstractActivityController.java
index 5b355f363..f273006be 100644
--- a/src/com/android/mail/ui/AbstractActivityController.java
+++ b/src/com/android/mail/ui/AbstractActivityController.java
@@ -4382,6 +4382,11 @@ public abstract class AbstractActivityController implements ActivityController,
}
@Override
+ public boolean setupEmptyIconView(Folder folder, boolean isEmpty) {
+ return false;
+ }
+
+ @Override
public View.OnClickListener getNavigationViewClickListener() {
return mHomeButtonListener;
}
diff --git a/src/com/android/mail/ui/ConversationListCallbacks.java b/src/com/android/mail/ui/ConversationListCallbacks.java
index 12db1a4b9..7def04393 100644
--- a/src/com/android/mail/ui/ConversationListCallbacks.java
+++ b/src/com/android/mail/ui/ConversationListCallbacks.java
@@ -24,6 +24,7 @@ import android.os.Parcelable;
import com.android.mail.browse.ConversationCursor;
import com.android.mail.providers.Conversation;
+import com.android.mail.providers.Folder;
/**
* A controller interface that is to receive user initiated events and handle them.
@@ -129,4 +130,12 @@ public interface ConversationListCallbacks {
* Is the user peeking the current conversation or actually viewing it.
*/
boolean isCurrentConversationJustPeeking();
+
+ /**
+ * Set up the empty icon depending on the current empty folder.
+ * @param isEmpty if false, then instead of showing the default empty icon, shows the no
+ * selected message icon.
+ * @return true if the icon is setup, false otherwise.
+ */
+ boolean setupEmptyIconView(Folder folder, boolean isEmpty);
}
diff --git a/src/com/android/mail/ui/ConversationListEmptyView.java b/src/com/android/mail/ui/ConversationListEmptyView.java
index 9b4d85534..257d6209b 100644
--- a/src/com/android/mail/ui/ConversationListEmptyView.java
+++ b/src/com/android/mail/ui/ConversationListEmptyView.java
@@ -26,6 +26,7 @@ import android.widget.TextView;
import com.android.mail.R;
import com.android.mail.providers.Folder;
+import com.android.mail.utils.EmptyStateUtils;
/**
* Empty view for {@link ConversationListFragment}.
@@ -55,36 +56,16 @@ public class ConversationListEmptyView extends LinearLayout {
* Initializes the empty view to use the proper icon and text
* based on the type of folder that will be visible.
*/
- public void setupEmptyView(final Folder folder, final String searchQuery,
- final BidiFormatter bidiFormatter) {
- if (folder == null) {
- setupIconAndText(R.drawable.empty_folders, R.string.empty_folder);
- return;
- }
-
- if (folder.isInbox()) {
- setupIconAndText(R.drawable.empty_inbox, R.string.empty_inbox);
- } else if (folder.isSearch()) {
- setupIconAndText(R.drawable.empty_search, R.string.empty_search,
- bidiFormatter.unicodeWrap(searchQuery));
- } else if (folder.isSpam()) {
- setupIconAndText(R.drawable.empty_spam, R.string.empty_spam_folder);
- } else if (folder.isTrash()) {
- setupIconAndText(R.drawable.empty_trash, R.string.empty_trash_folder);
+ public void setupEmptyText(final Folder folder, final String searchQuery,
+ final BidiFormatter bidiFormatter, boolean shouldShowIcon) {
+ if (shouldShowIcon) {
+ EmptyStateUtils.bindEmptyFolderIcon(mIcon, folder);
+ mIcon.setVisibility(VISIBLE);
} else {
- setupIconAndText(R.drawable.empty_folders, R.string.empty_folder);
+ mIcon.setVisibility(GONE);
}
- }
-
- private void setupIconAndText(int iconId, int stringId) {
- mIcon.setImageResource(iconId);
- mText.setText(stringId);
- }
-
- private void setupIconAndText(int iconId, int stringId, String extra) {
- mIcon.setImageResource(iconId);
- final String text = getResources().getString(R.string.empty_search, extra);
- mText.setText(text);
+ EmptyStateUtils.bindEmptyFolderText(mText, folder, getResources(), searchQuery,
+ bidiFormatter);
}
}
diff --git a/src/com/android/mail/ui/ConversationListFragment.java b/src/com/android/mail/ui/ConversationListFragment.java
index 0623e9ba0..c72d225f0 100644
--- a/src/com/android/mail/ui/ConversationListFragment.java
+++ b/src/com/android/mail/ui/ConversationListFragment.java
@@ -177,6 +177,7 @@ public final class ConversationListFragment extends Fragment implements
// Let's ensure that we are only showing one out of the three views at once
private void showListView() {
+ setupEmptyIcon(false);
mListView.setVisibility(View.VISIBLE);
mEmptyView.setVisibility(View.INVISIBLE);
mLoadingView.setVisibility(View.INVISIBLE);
@@ -184,6 +185,7 @@ public final class ConversationListFragment extends Fragment implements
}
private void showSecurityHoldView() {
+ setupEmptyIcon(false);
mListView.setVisibility(View.INVISIBLE);
mEmptyView.setVisibility(View.INVISIBLE);
mLoadingView.setVisibility(View.INVISIBLE);
@@ -192,8 +194,10 @@ public final class ConversationListFragment extends Fragment implements
}
private void showEmptyView() {
- mEmptyView.setupEmptyView(
- mFolder, mViewContext.searchQuery, mListAdapter.getBidiFormatter());
+ // If the callbacks didn't set up the empty icon, then we should show it in the empty view.
+ final boolean shouldShowIcon = !setupEmptyIcon(true);
+ mEmptyView.setupEmptyText(mFolder, mViewContext.searchQuery,
+ mListAdapter.getBidiFormatter(), shouldShowIcon);
mListView.setVisibility(View.INVISIBLE);
mEmptyView.setVisibility(View.VISIBLE);
mLoadingView.setVisibility(View.INVISIBLE);
@@ -201,12 +205,17 @@ public final class ConversationListFragment extends Fragment implements
}
private void showLoadingView() {
+ setupEmptyIcon(false);
mListView.setVisibility(View.INVISIBLE);
mEmptyView.setVisibility(View.INVISIBLE);
mLoadingView.setVisibility(View.VISIBLE);
mSecurityHoldView.setVisibility(View.INVISIBLE);
}
+ private boolean setupEmptyIcon(boolean isEmpty) {
+ return mCallbacks != null && mCallbacks.setupEmptyIconView(mFolder, isEmpty);
+ }
+
private void setupSecurityHoldView() {
mSecurityHoldText.setText(getString(R.string.security_hold_required_text,
mAccount.getDisplayName()));
@@ -494,9 +503,7 @@ public final class ConversationListFragment extends Fragment implements
mSecurityHoldText = (TextView) rootView.findViewById(R.id.security_hold_text);
mSecurityHoldButton = rootView.findViewById(R.id.security_hold_button);
mSecurityHoldButton.setOnClickListener(this);
- mLoadingView = rootView.findViewById(R.id.background_view);
- mLoadingView.setVisibility(View.GONE);
- mLoadingView.findViewById(R.id.loading_progress).setVisibility(View.VISIBLE);
+ mLoadingView = rootView.findViewById(R.id.conversation_list_loading_view);
mListView = (SwipeableListView) rootView.findViewById(R.id.conversation_list_view);
mListView.setHeaderDividersEnabled(false);
mListView.setOnItemLongClickListener(this);
diff --git a/src/com/android/mail/ui/TwoPaneController.java b/src/com/android/mail/ui/TwoPaneController.java
index 525324e49..f881c7333 100644
--- a/src/com/android/mail/ui/TwoPaneController.java
+++ b/src/com/android/mail/ui/TwoPaneController.java
@@ -27,6 +27,8 @@ import android.support.annotation.IdRes;
import android.support.annotation.LayoutRes;
import android.support.v7.app.ActionBar;
import android.view.KeyEvent;
+import android.view.View;
+import android.widget.ImageView;
import android.widget.ListView;
import com.android.mail.ConversationListContext;
@@ -35,6 +37,7 @@ import com.android.mail.providers.Account;
import com.android.mail.providers.Conversation;
import com.android.mail.providers.Folder;
import com.android.mail.providers.UIProvider.ConversationListIcon;
+import com.android.mail.utils.EmptyStateUtils;
import com.android.mail.utils.LogUtils;
import com.android.mail.utils.Utils;
import com.google.common.collect.Lists;
@@ -53,6 +56,7 @@ public final class TwoPaneController extends AbstractActivityController implemen
"saved-miscellaneous-view-transaction-id";
private TwoPaneLayout mLayout;
+ private ImageView mEmptyCvView;
private List<TwoPaneLayout.ConversationListLayoutListener> mConversationListLayoutListeners =
Lists.newArrayList();
@Deprecated
@@ -167,6 +171,7 @@ public final class TwoPaneController extends AbstractActivityController implemen
@Override
public boolean onCreate(Bundle savedState) {
mLayout = (TwoPaneLayout) mActivity.findViewById(R.id.two_pane_activity);
+ mEmptyCvView = (ImageView) mActivity.findViewById(R.id.conversation_pane_no_message_view);
if (mLayout == null) {
// We need the layout for everything. Crash/Return early if it is null.
LogUtils.wtf(LOG_TAG, "mLayout is null!");
@@ -190,6 +195,7 @@ public final class TwoPaneController extends AbstractActivityController implemen
// notifications upon animation completion:
// (onConversationVisibilityChanged, onConversationListVisibilityChanged)
mViewMode.addListener(mLayout);
+
return super.onCreate(savedState);
}
@@ -332,6 +338,11 @@ public final class TwoPaneController extends AbstractActivityController implemen
showCurrentConversationInPager();
}
}
+
+ // Change visibility of the empty view
+ if (mIsTabletLandscape) {
+ mEmptyCvView.setVisibility(visible ? View.GONE : View.VISIBLE);
+ }
}
private void showCurrentConversationInPager() {
@@ -697,4 +708,17 @@ public final class TwoPaneController extends AbstractActivityController implemen
public List<TwoPaneLayout.ConversationListLayoutListener> getConversationListLayoutListeners() {
return mConversationListLayoutListeners;
}
+
+ @Override
+ public boolean setupEmptyIconView(Folder folder, boolean isEmpty) {
+ if (mIsTabletLandscape) {
+ if (!isEmpty) {
+ mEmptyCvView.setImageResource(R.drawable.ic_empty_cv_120dp);
+ } else {
+ EmptyStateUtils.bindEmptyFolderIcon(mEmptyCvView, folder);
+ }
+ return true;
+ }
+ return false;
+ }
}
diff --git a/src/com/android/mail/utils/EmptyStateUtils.java b/src/com/android/mail/utils/EmptyStateUtils.java
new file mode 100644
index 000000000..c003a5510
--- /dev/null
+++ b/src/com/android/mail/utils/EmptyStateUtils.java
@@ -0,0 +1,73 @@
+/*
+ * Copyright (C) 2014 Google Inc.
+ * Licensed to The Android Open Source Project.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.mail.utils;
+
+import android.content.res.Resources;
+import android.support.v4.text.BidiFormatter;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import com.android.mail.R;
+import com.android.mail.providers.Folder;
+
+/**
+ * Utility class for handling logic related to empty states throughout the app.
+ */
+public class EmptyStateUtils {
+
+ /**
+ * Given an empty folder, set the corresponding empty state icon for that folder.
+ */
+ public static void bindEmptyFolderIcon(ImageView view, Folder folder) {
+ if (folder == null) {
+ view.setImageResource(R.drawable.empty_folders);
+ } else if (folder.isInbox()) {
+ view.setImageResource(R.drawable.empty_inbox);
+ } else if (folder.isSearch()) {
+ view.setImageResource(R.drawable.empty_search);
+ } else if (folder.isSpam()) {
+ view.setImageResource(R.drawable.empty_spam);
+ } else if (folder.isTrash()) {
+ view.setImageResource(R.drawable.empty_trash);
+ } else {
+ view.setImageResource(R.drawable.empty_folders);
+ }
+ }
+
+ /**
+ * Given an empty folder, set the corresponding text for indicating the empty state.
+ */
+ public static void bindEmptyFolderText(TextView view, Folder folder, Resources res,
+ String searchQuery, BidiFormatter bidiFormatter) {
+ if (folder == null) {
+ view.setText(R.string.empty_folder);
+ } else if (folder.isInbox()) {
+ view.setText(R.string.empty_inbox);
+ } else if (folder.isSearch()) {
+ final String text = res.getString(R.string.empty_search,
+ bidiFormatter.unicodeWrap(searchQuery));
+ view.setText(text);
+ } else if (folder.isSpam()) {
+ view.setText(R.string.empty_spam_folder);
+ } else if (folder.isTrash()) {
+ view.setText(R.string.empty_trash_folder);
+ } else {
+ view.setText(R.string.empty_folder);
+ }
+ }
+}