summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoryingying <yingying@codeaurora.org>2013-12-26 14:31:03 +0800
committerAdnan <adnan@cyngn.com>2014-09-03 15:41:21 -0700
commitfcbedd736f2daa785a95c2247294d8eb658f1cd6 (patch)
treeb23d4dce1330f4d78ce61d443c1bcbc5f409a76f
parent5b10691f0f56ff85da7f9a14e82f603baecec91f (diff)
downloadandroid_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
-rw-r--r--res/drawable-hdpi/ic_load_more_holo_light.pngbin0 -> 3277 bytes
-rw-r--r--res/drawable-mdpi/ic_load_more_holo_light.pngbin0 -> 3021 bytes
-rw-r--r--res/drawable-xhdpi/ic_load_more_holo_light.pngbin0 -> 3235 bytes
-rw-r--r--res/layout-land/conversation_message_upper_header_actions.xml5
-rw-r--r--res/layout-sw600dp/conversation_message_upper_header_actions.xml5
-rw-r--r--res/layout/conversation_message_upper_header_actions.xml5
-rw-r--r--res/layout/secure_conversation_view.xml18
-rw-r--r--res/menu/message_header_overflow_menu.xml2
-rw-r--r--src/com/android/emailcommon/mail/FetchProfile.java21
-rw-r--r--src/com/android/mail/browse/ConversationMessage.java7
-rw-r--r--src/com/android/mail/browse/MessageHeaderView.java32
-rw-r--r--src/com/android/mail/providers/Message.java15
-rw-r--r--src/com/android/mail/providers/UIProvider.java30
-rw-r--r--src/com/android/mail/ui/AbstractActivityController.java16
-rw-r--r--src/com/android/mail/ui/ConversationUpdater.java6
-rw-r--r--src/com/android/mail/ui/SecureConversationViewController.java10
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
new file mode 100644
index 000000000..51eacc008
--- /dev/null
+++ b/res/drawable-hdpi/ic_load_more_holo_light.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_load_more_holo_light.png b/res/drawable-mdpi/ic_load_more_holo_light.png
new file mode 100644
index 000000000..593292818
--- /dev/null
+++ b/res/drawable-mdpi/ic_load_more_holo_light.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_load_more_holo_light.png b/res/drawable-xhdpi/ic_load_more_holo_light.png
new file mode 100644
index 000000000..02a7fd5aa
--- /dev/null
+++ b/res/drawable-xhdpi/ic_load_more_holo_light.png
Binary files differ
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() {