diff options
-rw-r--r-- | res/drawable-hdpi/ic_empty_cv_120dp.png | bin | 0 -> 5367 bytes | |||
-rw-r--r-- | res/drawable-mdpi/ic_empty_cv_120dp.png | bin | 0 -> 4464 bytes | |||
-rw-r--r-- | res/drawable-v21/ic_empty_cv_120dp.xml | 26 | ||||
-rw-r--r-- | res/drawable-xhdpi/ic_empty_cv_120dp.png | bin | 0 -> 6861 bytes | |||
-rw-r--r-- | res/drawable-xxhdpi/ic_empty_cv_120dp.png | bin | 0 -> 9507 bytes | |||
-rw-r--r-- | res/layout/conversation_list.xml | 10 | ||||
-rw-r--r-- | res/layout/conversation_list_empty_view.xml | 3 | ||||
-rw-r--r-- | res/layout/two_pane_activity.xml | 11 | ||||
-rw-r--r-- | res/values-sw600dp/dimen.xml | 1 | ||||
-rw-r--r-- | res/values/colors.xml | 1 | ||||
-rw-r--r-- | res/values/dimen.xml | 2 | ||||
-rw-r--r-- | src/com/android/mail/ui/AbstractActivityController.java | 5 | ||||
-rw-r--r-- | src/com/android/mail/ui/ConversationListCallbacks.java | 9 | ||||
-rw-r--r-- | src/com/android/mail/ui/ConversationListEmptyView.java | 37 | ||||
-rw-r--r-- | src/com/android/mail/ui/ConversationListFragment.java | 17 | ||||
-rw-r--r-- | src/com/android/mail/ui/TwoPaneController.java | 24 | ||||
-rw-r--r-- | src/com/android/mail/utils/EmptyStateUtils.java | 73 |
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 Binary files differnew file mode 100644 index 000000000..7c09e7afa --- /dev/null +++ b/res/drawable-hdpi/ic_empty_cv_120dp.png diff --git a/res/drawable-mdpi/ic_empty_cv_120dp.png b/res/drawable-mdpi/ic_empty_cv_120dp.png Binary files differnew file mode 100644 index 000000000..39356c2ff --- /dev/null +++ b/res/drawable-mdpi/ic_empty_cv_120dp.png 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 Binary files differnew file mode 100644 index 000000000..a381f3691 --- /dev/null +++ b/res/drawable-xhdpi/ic_empty_cv_120dp.png diff --git a/res/drawable-xxhdpi/ic_empty_cv_120dp.png b/res/drawable-xxhdpi/ic_empty_cv_120dp.png Binary files differnew file mode 100644 index 000000000..0ddbf5fab --- /dev/null +++ b/res/drawable-xxhdpi/ic_empty_cv_120dp.png 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); + } + } +} |