diff options
author | yingying <yingying@codeaurora.org> | 2013-12-26 14:31:03 +0800 |
---|---|---|
committer | Adnan <adnan@cyngn.com> | 2014-09-03 15:41:21 -0700 |
commit | fcbedd736f2daa785a95c2247294d8eb658f1cd6 (patch) | |
tree | b23d4dce1330f4d78ce61d443c1bcbc5f409a76f | |
parent | 5b10691f0f56ff85da7f9a14e82f603baecec91f (diff) | |
download | android_packages_apps_UnifiedEmail-fcbedd736f2daa785a95c2247294d8eb658f1cd6.tar.gz android_packages_apps_UnifiedEmail-fcbedd736f2daa785a95c2247294d8eb658f1cd6.tar.bz2 android_packages_apps_UnifiedEmail-fcbedd736f2daa785a95c2247294d8eb658f1cd6.zip |
UnifiedEmail: Support Email load more content function.
- If the mail's content didn't download complete, provider one action button
to make the user could load more content.
- If the mail's loaded status is fetching, it will display one progress bar.
Change-Id: I21dd994e9bbfb380d7590cec2a32732098f45efa
16 files changed, 165 insertions, 7 deletions
diff --git a/res/drawable-hdpi/ic_load_more_holo_light.png b/res/drawable-hdpi/ic_load_more_holo_light.png Binary files differnew file mode 100644 index 000000000..51eacc008 --- /dev/null +++ b/res/drawable-hdpi/ic_load_more_holo_light.png diff --git a/res/drawable-mdpi/ic_load_more_holo_light.png b/res/drawable-mdpi/ic_load_more_holo_light.png Binary files differnew file mode 100644 index 000000000..593292818 --- /dev/null +++ b/res/drawable-mdpi/ic_load_more_holo_light.png diff --git a/res/drawable-xhdpi/ic_load_more_holo_light.png b/res/drawable-xhdpi/ic_load_more_holo_light.png Binary files differnew file mode 100644 index 000000000..02a7fd5aa --- /dev/null +++ b/res/drawable-xhdpi/ic_load_more_holo_light.png diff --git a/res/layout-land/conversation_message_upper_header_actions.xml b/res/layout-land/conversation_message_upper_header_actions.xml index 2e3c5f9f2..4c8ffe071 100644 --- a/res/layout-land/conversation_message_upper_header_actions.xml +++ b/res/layout-land/conversation_message_upper_header_actions.xml @@ -38,6 +38,11 @@ android:src="@drawable/ic_reply_all_holo_light" android:contentDescription="@string/reply_all" /> <ImageView + android:id="@+id/load_more" + style="@style/MessageHeaderActionButtonStyle" + android:src="@drawable/ic_load_more_holo_light" + android:contentDescription="@string/load_more" /> + <ImageView android:id="@+id/forward" style="@style/MessageHeaderActionButtonStyle" android:src="@drawable/ic_forward_holo_light" diff --git a/res/layout-sw600dp/conversation_message_upper_header_actions.xml b/res/layout-sw600dp/conversation_message_upper_header_actions.xml index 2e3c5f9f2..4c8ffe071 100644 --- a/res/layout-sw600dp/conversation_message_upper_header_actions.xml +++ b/res/layout-sw600dp/conversation_message_upper_header_actions.xml @@ -38,6 +38,11 @@ android:src="@drawable/ic_reply_all_holo_light" android:contentDescription="@string/reply_all" /> <ImageView + android:id="@+id/load_more" + style="@style/MessageHeaderActionButtonStyle" + android:src="@drawable/ic_load_more_holo_light" + android:contentDescription="@string/load_more" /> + <ImageView android:id="@+id/forward" style="@style/MessageHeaderActionButtonStyle" android:src="@drawable/ic_forward_holo_light" diff --git a/res/layout/conversation_message_upper_header_actions.xml b/res/layout/conversation_message_upper_header_actions.xml index fc83b836c..f6479d6cb 100644 --- a/res/layout/conversation_message_upper_header_actions.xml +++ b/res/layout/conversation_message_upper_header_actions.xml @@ -39,6 +39,11 @@ android:src="@drawable/ic_reply_all_holo_light" android:contentDescription="@string/reply_all" /> <ImageView + android:id="@+id/load_more" + style="@style/MessageHeaderActionButtonStyle" + android:src="@drawable/ic_load_more_holo_light" + android:contentDescription="@string/load_more" /> + <ImageView android:id="@+id/overflow" android:layout_height="@dimen/message_header_action_button_height" android:layout_width="@dimen/message_header_action_button_width" diff --git a/res/layout/secure_conversation_view.xml b/res/layout/secure_conversation_view.xml index f115a99c3..79097e6a2 100644 --- a/res/layout/secure_conversation_view.xml +++ b/res/layout/secure_conversation_view.xml @@ -15,14 +15,26 @@ See the License for the specific language governing permissions and limitations under the License. --> -<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:butterbar="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" + android:orientation="vertical" android:background="@color/conversation_view_border_color" > + <com.android.mail.ui.ButteryProgressBar + android:id="@+id/fetching_progress" + android:layout_width="match_parent" + android:layout_height="3dip" + android:layout_gravity="top" + butterbar:barColor="@android:color/holo_blue_dark" + butterbar:barHeight="2.5dp" + android:visibility="gone" /> + <com.android.mail.browse.MessageScrollView android:id="@+id/scroll_view" android:layout_width="match_parent" - android:layout_height="match_parent" > + android:layout_height="0dip" + android:layout_weight="1" > <LinearLayout android:id="@+id/conversation_container" @@ -106,4 +118,4 @@ <include layout="@layout/conversation_load_spinner"/> -</FrameLayout> +</LinearLayout> diff --git a/res/menu/message_header_overflow_menu.xml b/res/menu/message_header_overflow_menu.xml index 46f5e9790..58ea8d55e 100644 --- a/res/menu/message_header_overflow_menu.xml +++ b/res/menu/message_header_overflow_menu.xml @@ -23,6 +23,8 @@ android:title="@string/reply_all" /> <item android:id="@+id/forward" android:title="@string/forward" /> + <item android:id="@+id/load_more" + android:title="@string/load_more"/> <item android:id="@+id/report_rendering_problem" android:title="@string/report_rendering_problem" /> <item android:id="@+id/report_rendering_improvement" diff --git a/src/com/android/emailcommon/mail/FetchProfile.java b/src/com/android/emailcommon/mail/FetchProfile.java index bfa48d30f..2da586562 100644 --- a/src/com/android/emailcommon/mail/FetchProfile.java +++ b/src/com/android/emailcommon/mail/FetchProfile.java @@ -82,4 +82,25 @@ public class FetchProfile extends ArrayList<Fetchable> { }
return null;
}
+
+ /**
+ * To save the allow sync size for this fetch action. And the default value is Entire mail
+ * as the {@link Integer#MAX_VALUE} which is defined in Utility;
+ */
+ private int mAllowSyncSize = Integer.MAX_VALUE;
+
+ public void setAllowSyncSize(int size) {
+ mAllowSyncSize = size;
+ }
+
+ public int getAllowSyncSize() {
+ return mAllowSyncSize;
+ }
+
+ @Override
+ public void clear() {
+ super.clear();
+ // Reset the mAllowSyncSize as default value.
+ mAllowSyncSize = Integer.MAX_VALUE;
+ }
}
diff --git a/src/com/android/mail/browse/ConversationMessage.java b/src/com/android/mail/browse/ConversationMessage.java index e9aa875a1..5a9bb938e 100644 --- a/src/com/android/mail/browse/ConversationMessage.java +++ b/src/com/android/mail/browse/ConversationMessage.java @@ -96,6 +96,13 @@ public final class ConversationMessage extends Message { } } + public void loadMore() { + final ConversationUpdater listController = mController.getListController(); + if (listController != null) { + listController.loadMore(this); + } + } + /** * Public object that knows how to construct Messages given Cursors. */ diff --git a/src/com/android/mail/browse/MessageHeaderView.java b/src/com/android/mail/browse/MessageHeaderView.java index ed47bf51d..f5b02f51b 100644 --- a/src/com/android/mail/browse/MessageHeaderView.java +++ b/src/com/android/mail/browse/MessageHeaderView.java @@ -60,6 +60,7 @@ import com.android.mail.providers.Conversation; import com.android.mail.providers.Folder; import com.android.mail.providers.Message; import com.android.mail.providers.UIProvider; +import com.android.mail.providers.UIProvider.MessageFlagLoaded; import com.android.mail.ui.ImageCanvas; import com.android.mail.utils.LogTag; import com.android.mail.utils.LogUtils; @@ -127,6 +128,7 @@ public class MessageHeaderView extends LinearLayout implements OnClickListener, private TextView mUpperDateView; private View mReplyButton; private View mReplyAllButton; + private View mLoadMoreButton; private View mAttachmentIcon; private final EmailCopyContextMenu mEmailCopyMenu; @@ -276,6 +278,7 @@ public class MessageHeaderView extends LinearLayout implements OnClickListener, mPhotoView = (QuickContactBadge) findViewById(R.id.photo); mReplyButton = findViewById(R.id.reply); mReplyAllButton = findViewById(R.id.reply_all); + mLoadMoreButton = findViewById(R.id.load_more); mForwardButton = findViewById(R.id.forward); mStarView = (ImageView) findViewById(R.id.star); mTitleContainerView = (ViewGroup) findViewById(R.id.title_container); @@ -611,8 +614,8 @@ public class MessageHeaderView extends LinearLayout implements OnClickListener, setMessageDetailsVisibility(VISIBLE); setChildVisibility(GONE, mSnapHeaderBottomBorder); - setChildVisibility(GONE, mReplyButton, mReplyAllButton, mForwardButton, - mOverflowButton, mDraftIcon, mEditDraftButton, mStarView, + setChildVisibility(GONE, mReplyButton, mReplyAllButton, mLoadMoreButton, + mForwardButton, mOverflowButton, mDraftIcon, mEditDraftButton, mStarView, mAttachmentIcon, mUpperDateView, mSnippetView); setChildVisibility(VISIBLE, mPhotoView, mSenderEmailView, mDateView); @@ -632,6 +635,8 @@ public class MessageHeaderView extends LinearLayout implements OnClickListener, } setReplyOrReplyAllVisible(); + setLoadMoreVisible(); + setChildVisibility(normalVis, mPhotoView, mForwardButton, mOverflowButton); setChildVisibility(draftVis, mDraftIcon, mEditDraftButton); setChildVisibility(VISIBLE, mSenderEmailView, mDateView); @@ -647,7 +652,8 @@ public class MessageHeaderView extends LinearLayout implements OnClickListener, setChildVisibility(VISIBLE, mSnippetView, mUpperDateView); setChildVisibility(GONE, mEditDraftButton, mReplyButton, mReplyAllButton, - mForwardButton, mOverflowButton, mSenderEmailView, mDateView); + mLoadMoreButton, mForwardButton, mOverflowButton, + mSenderEmailView, mDateView); setChildVisibility(mMessage.hasAttachments ? VISIBLE : GONE, mAttachmentIcon); @@ -693,6 +699,17 @@ public class MessageHeaderView extends LinearLayout implements OnClickListener, setChildVisibility(defaultReplyAll ? VISIBLE : GONE, mReplyAllButton); } + private void setLoadMoreVisible() { + if (mMessage.messageFlagLoaded == MessageFlagLoaded.FLAG_LOADED_PARTIAL_COMPLETE + && mOverflowButton == null) { + setChildVisibility(VISIBLE, mLoadMoreButton); + return; + } else { + setChildVisibility(GONE, mLoadMoreButton); + return; + } + } + private static void setChildMarginEnd(View childView, int marginEnd) { MarginLayoutParams mlp = (MarginLayoutParams) childView.getLayoutParams(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { @@ -893,6 +910,8 @@ public class MessageHeaderView extends LinearLayout implements OnClickListener, mMessage.star(newValue); } else if (id == R.id.edit_draft) { ComposeActivity.editDraft(getContext(), getAccount(), mMessage); + } else if (id == R.id.load_more) { + mMessage.loadMore(); } else if (id == R.id.overflow) { if (mPopup == null) { mPopup = new PopupMenu(getContext(), v); @@ -906,6 +925,13 @@ public class MessageHeaderView extends LinearLayout implements OnClickListener, m.findItem(R.id.reply).setVisible(defaultReplyAll); m.findItem(R.id.reply_all).setVisible(!defaultReplyAll); + // Update the load more menu visible value. + MenuItem fetch = m.findItem(R.id.load_more); + if (fetch != null) { + fetch.setVisible(mMessage.messageFlagLoaded + == MessageFlagLoaded.FLAG_LOADED_PARTIAL_COMPLETE); + } + final boolean reportRendering = ENABLE_REPORT_RENDERING_PROBLEM && mCallbacks.supportsMessageTransforms(); m.findItem(R.id.report_rendering_improvement).setVisible(reportRendering); diff --git a/src/com/android/mail/providers/Message.java b/src/com/android/mail/providers/Message.java index 4b70d34fa..dfc6bdfae 100644 --- a/src/com/android/mail/providers/Message.java +++ b/src/com/android/mail/providers/Message.java @@ -196,6 +196,14 @@ public class Message implements Parcelable, HtmlMessage { * @see UIProvider.MessageColumns#IS_SENDING */ public boolean isSending; + /** + * @see UIProvider.MessageColumns#MESSAGE_FLAG_LOADED + */ + public int messageFlagLoaded; + /** + * @see UIProvider.MessageColumns#MESSAGE_LOAD_MORE_URI + */ + public Uri loadMoreUri; private transient String[] mFromAddresses = null; private transient String[] mToAddresses = null; @@ -254,6 +262,8 @@ public class Message implements Parcelable, HtmlMessage { dest.writeInt(spamLinkType); dest.writeString(viaDomain); dest.writeInt(isSending ? 1 : 0); + dest.writeInt(messageFlagLoaded); + dest.writeParcelable(loadMoreUri, 0); } private Message(Parcel in) { @@ -288,6 +298,8 @@ public class Message implements Parcelable, HtmlMessage { spamLinkType = in.readInt(); viaDomain = in.readString(); isSending = in.readInt() != 0; + messageFlagLoaded = in.readInt(); + loadMoreUri = in.readParcelable(null); } public Message() { @@ -362,6 +374,9 @@ public class Message implements Parcelable, HtmlMessage { spamLinkType = cursor.getInt(UIProvider.MESSAGE_SPAM_WARNING_LINK_TYPE_COLUMN); viaDomain = cursor.getString(UIProvider.MESSAGE_VIA_DOMAIN_COLUMN); isSending = cursor.getInt(UIProvider.MESSAGE_IS_SENDING_COLUMN) != 0; + messageFlagLoaded = cursor.getInt(UIProvider.MESSAGE_FLAG_LOADED_COLUMN); + loadMoreUri = Utils.getValidUri( + cursor.getString(UIProvider.MESSAGE_LOAD_MORE_URI_COLUMN)); } } diff --git a/src/com/android/mail/providers/UIProvider.java b/src/com/android/mail/providers/UIProvider.java index e4bc961e5..49c7cc627 100644 --- a/src/com/android/mail/providers/UIProvider.java +++ b/src/com/android/mail/providers/UIProvider.java @@ -1538,7 +1538,9 @@ public class UIProvider { MessageColumns.SPAM_WARNING_LEVEL, MessageColumns.SPAM_WARNING_LINK_TYPE, MessageColumns.VIA_DOMAIN, - MessageColumns.IS_SENDING + MessageColumns.IS_SENDING, + MessageColumns.MESSAGE_FLAG_LOADED, + MessageColumns.MESSAGE_LOAD_MORE_URI }; /** Separates attachment info parts in strings in a message. */ @@ -1584,6 +1586,8 @@ public class UIProvider { public static final int MESSAGE_SPAM_WARNING_LINK_TYPE_COLUMN = 32; public static final int MESSAGE_VIA_DOMAIN_COLUMN = 33; public static final int MESSAGE_IS_SENDING_COLUMN = 34; + public static final int MESSAGE_FLAG_LOADED_COLUMN = 35; + public static final int MESSAGE_LOAD_MORE_URI_COLUMN = 36; public static final class CursorStatus { // The cursor is actively loading more data @@ -1640,6 +1644,19 @@ public class UIProvider { public static final int CALENDAR_INVITE = 1 << 4; } + /** + * These values are also defined in the EmailContent. + */ + public static final class MessageFlagLoaded { + public static final int FLAG_LOADED_UNLOADED = 0; + public static final int FLAG_LOADED_COMPLETE = 1; + public static final int FLAG_LOADED_PARTIAL = 2; + public static final int FLAG_LOADED_PARTIAL_COMPLETE = 3; + public static final int FLAG_LOADED_PARTIAL_FETCHING = 4; + public static final int FLAG_LOADED_DELETED = 5; + public static final int FLAG_LOADED_UNKNOWN = 6; + } + public static final class MessageColumns { /** * This string column contains a content provider URI that points to this single message. @@ -1797,6 +1814,17 @@ public class UIProvider { */ public static final String IS_SENDING = "isSending"; + /** + * This integer column indicates the state of the message loaded + * and it defined in {@link MessageFlagLoaded} + */ + public static final String MESSAGE_FLAG_LOADED = "messageFlagLoaded"; + + /** + * String with the content provider Uri used to request fetch entire content. + */ + public static final String MESSAGE_LOAD_MORE_URI = "messageLoadMoreUri"; + private MessageColumns() {} } diff --git a/src/com/android/mail/ui/AbstractActivityController.java b/src/com/android/mail/ui/AbstractActivityController.java index 424737ac9..45bc56b23 100644 --- a/src/com/android/mail/ui/AbstractActivityController.java +++ b/src/com/android/mail/ui/AbstractActivityController.java @@ -422,6 +422,7 @@ public abstract class AbstractActivityController implements ActivityController, /** The pending destructive action to be carried out before swapping the conversation cursor.*/ private DestructiveAction mPendingDestruction; protected AsyncRefreshTask mFolderSyncTask; + protected AsyncRefreshTask mLoadMoreTask; private Folder mFolderListFolder; private boolean mIsDragHappening; private final int mShowUndoBarDelay; @@ -1893,6 +1894,21 @@ public abstract class AbstractActivityController implements ActivityController, } @Override + public void loadMore(ConversationMessage msg) { + if (msg != null && msg.loadMoreUri != null) { + startLoadMoreTask(msg.loadMoreUri); + } + } + + private void startLoadMoreTask(Uri uri) { + if (mLoadMoreTask != null) { + mLoadMoreTask.cancel(true); + } + mLoadMoreTask = new AsyncRefreshTask(mActivity.getActivityContext(), uri); + mLoadMoreTask.execute(); + } + + @Override public void requestFolderRefresh() { if (mFolder == null) { return; diff --git a/src/com/android/mail/ui/ConversationUpdater.java b/src/com/android/mail/ui/ConversationUpdater.java index c3b71af14..52aa66666 100644 --- a/src/com/android/mail/ui/ConversationUpdater.java +++ b/src/com/android/mail/ui/ConversationUpdater.java @@ -117,6 +117,12 @@ public interface ConversationUpdater extends ConversationListCallbacks { void starMessage(ConversationMessage msg, boolean starred); /** + * Try to fetch the entire content of this message. This method requires a + * {@link ConversationMessage} to propagate the change to the owning {@link Conversation}. + */ + void loadMore(ConversationMessage msg); + + /** * Get a destructive action for selected conversations. The action corresponds to Menu item * identifiers, for example R.id.unread, or R.id.delete. * @param action diff --git a/src/com/android/mail/ui/SecureConversationViewController.java b/src/com/android/mail/ui/SecureConversationViewController.java index e6fc7b115..7c40a722c 100644 --- a/src/com/android/mail/ui/SecureConversationViewController.java +++ b/src/com/android/mail/ui/SecureConversationViewController.java @@ -38,6 +38,7 @@ import com.android.mail.browse.MessageHeaderView; import com.android.mail.browse.MessageScrollView; import com.android.mail.browse.MessageWebView; import com.android.mail.providers.Message; +import com.android.mail.providers.UIProvider.MessageFlagLoaded; import com.android.mail.utils.ConversationViewUtils; /** @@ -59,6 +60,7 @@ public class SecureConversationViewController implements private MessageFooterView mMessageFooterView; private ConversationMessage mMessage; private MessageScrollView mScrollView; + private ButteryProgressBar mFetchingProgressBar; private ConversationViewProgressController mProgressController; private FormattedDateBuilder mDateBuilder; @@ -72,6 +74,7 @@ public class SecureConversationViewController implements public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.secure_conversation_view, container, false); + mFetchingProgressBar = (ButteryProgressBar) rootView.findViewById(R.id.fetching_progress); mScrollView = (MessageScrollView) rootView.findViewById(R.id.scroll_view); mConversationHeaderView = (ConversationViewHeader) rootView.findViewById(R.id.conv_header); mMessageHeaderView = (MessageHeaderView) rootView.findViewById(R.id.message_header); @@ -167,6 +170,13 @@ public class SecureConversationViewController implements mMessageFooterView.setVisibility(View.VISIBLE); mMessageFooterView.bind(item, mCallbacks.getAccountUri(), false); } + if (mMessage.messageFlagLoaded == MessageFlagLoaded.FLAG_LOADED_PARTIAL + || mMessage.messageFlagLoaded == MessageFlagLoaded.FLAG_LOADED_PARTIAL_FETCHING) { + mFetchingProgressBar.setVisibility(View.VISIBLE); + mFetchingProgressBar.setAlpha(1f); + } else { + mFetchingProgressBar.setVisibility(View.GONE); + } } public ConversationMessage getMessage() { |