Disable forward/reply for trashed messages.
* Now the message shown/gone callbacks are called directly by MessageViewFragment, rather than MessageListXLFragmentManager. * The buttons are enabled/disabled per messages, so it even works properly when you move around in All Starred. (if you ever star trashed messages.) * Fixed one-pane as well. Bug 2968810 Change-Id: Ie6de1dc7ea0bd18c40c091a6685629c26ffb7110
This commit is contained in:
parent
213c52dd64
commit
646b5e062e
|
@ -277,12 +277,11 @@ public class MessageList extends Activity implements OnClickListener,
|
|||
if (type == MessageListFragment.Callback.TYPE_DRAFT) {
|
||||
MessageCompose.actionEditDraft(this, messageId);
|
||||
} else {
|
||||
final boolean disableReply = (type == MessageListFragment.Callback.TYPE_TRASH);
|
||||
// WARNING: here we pass "listMailboxId", which can be the negative id of
|
||||
// a compound mailbox, instead of the mailboxId of the particular message that
|
||||
// is opened. This is to support the next/prev buttons on the message view
|
||||
// properly even for combined mailboxes.
|
||||
MessageView.actionView(this, messageId, listMailboxId, disableReply);
|
||||
MessageView.actionView(this, messageId, listMailboxId);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -56,6 +56,10 @@ import java.security.InvalidParameterException;
|
|||
* TODO Refresh account list when adding/removing/changing(e.g. display name) accounts.
|
||||
* -> Need the MessageList.onResume logic. Figure out a clean way to do that.
|
||||
*
|
||||
* TODO Extract the message view buttons (move, reply, etc) into a custom view.
|
||||
* That way it'll be easier to change the button layout on orientation changes.
|
||||
* (We'll probably combine some buttons on portrait.)
|
||||
*
|
||||
* TODO Refine "move to". It also shouldn't work for special messages, like drafts.
|
||||
*/
|
||||
public class MessageListXL extends Activity implements View.OnClickListener,
|
||||
|
@ -74,6 +78,9 @@ public class MessageListXL extends Activity implements View.OnClickListener,
|
|||
private View mMessageViewButtonPanel;
|
||||
private View mMoveToNewerButton;
|
||||
private View mMoveToOlderButton;
|
||||
private View mForwardButton;
|
||||
private View mReplyButton;
|
||||
private View mReplyAllButton;
|
||||
|
||||
private AccountSelectorAdapter mAccountsSelectorAdapter;
|
||||
private final ActionBarNavigationCallback mActionBarNavigationCallback
|
||||
|
@ -139,13 +146,18 @@ public class MessageListXL extends Activity implements View.OnClickListener,
|
|||
mMessageViewButtonPanel = findViewById(R.id.message_view_buttons);
|
||||
mMoveToNewerButton = findViewById(R.id.moveToNewer);
|
||||
mMoveToOlderButton = findViewById(R.id.moveToOlder);
|
||||
mForwardButton = findViewById(R.id.forward);
|
||||
mReplyButton = findViewById(R.id.reply);
|
||||
mReplyAllButton = findViewById(R.id.reply_all);
|
||||
|
||||
mMoveToNewerButton.setOnClickListener(this);
|
||||
mMoveToOlderButton.setOnClickListener(this);
|
||||
mForwardButton.setOnClickListener(this);
|
||||
mReplyButton.setOnClickListener(this);
|
||||
mReplyAllButton.setOnClickListener(this);
|
||||
|
||||
findViewById(R.id.delete).setOnClickListener(this);
|
||||
findViewById(R.id.unread).setOnClickListener(this);
|
||||
findViewById(R.id.reply).setOnClickListener(this);
|
||||
findViewById(R.id.reply_all).setOnClickListener(this);
|
||||
findViewById(R.id.forward).setOnClickListener(this);
|
||||
findViewById(R.id.move).setOnClickListener(this);
|
||||
|
||||
mAccountsSelectorAdapter = new AccountSelectorAdapter(mContext, null);
|
||||
|
@ -253,7 +265,6 @@ public class MessageListXL extends Activity implements View.OnClickListener,
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void onClick(View view) {
|
||||
switch (view.getId()) {
|
||||
|
@ -412,6 +423,20 @@ public class MessageListXL extends Activity implements View.OnClickListener,
|
|||
}
|
||||
|
||||
private class MessageViewFragmentCallback implements MessageViewFragment.Callback {
|
||||
@Override
|
||||
public void onMessageViewShown(int mailboxType) {
|
||||
mMessageViewButtonPanel.setVisibility(View.VISIBLE);
|
||||
updateMessageOrderManager();
|
||||
updateNavigationArrows();
|
||||
enableReplyForwardButtons(mailboxType != Mailbox.TYPE_TRASH);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onMessageViewGone() {
|
||||
mMessageViewButtonPanel.setVisibility(View.GONE);
|
||||
stopMessageOrderManager();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onUrlInMessageClicked(String url) {
|
||||
return ActivityHelper.openUrlInMessage(MessageListXL.this, url,
|
||||
|
@ -460,19 +485,10 @@ public class MessageListXL extends Activity implements View.OnClickListener,
|
|||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onMessageViewFragmentShown(long accountId, long mailboxId, long messageId) {
|
||||
mMessageViewButtonPanel.setVisibility(View.VISIBLE);
|
||||
|
||||
updateMessageOrderManager();
|
||||
updateNavigationArrows();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onMessageViewFragmentHidden() {
|
||||
mMessageViewButtonPanel.setVisibility(View.GONE);
|
||||
|
||||
stopMessageOrderManager();
|
||||
private void enableReplyForwardButtons(boolean enabled) {
|
||||
mForwardButton.setEnabled(enabled);
|
||||
mReplyButton.setEnabled(enabled);
|
||||
mReplyAllButton.setEnabled(enabled);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -98,16 +98,6 @@ class MessageListXLFragmentManager {
|
|||
*/
|
||||
public interface TargetActivity {
|
||||
public FragmentManager getFragmentManager();
|
||||
/**
|
||||
* Called when MessageViewFragment is being shown.
|
||||
* {@link MessageListXL} uses it to show the navigation buttons.
|
||||
*/
|
||||
public void onMessageViewFragmentShown(long accountId, long mailboxId, long messageId);
|
||||
/**
|
||||
* Called when MessageViewFragment is being hidden.
|
||||
* {@link MessageListXL} uses it to hide the navigation buttons.
|
||||
*/
|
||||
public void onMessageViewFragmentHidden();
|
||||
|
||||
/**
|
||||
* Called when the selected account is on security-hold.
|
||||
|
@ -318,7 +308,6 @@ class MessageListXLFragmentManager {
|
|||
if (mMessageViewFragment != null) {
|
||||
ft.remove(mMessageViewFragment);
|
||||
mMessageViewFragment = null;
|
||||
mTargetActivity.onMessageViewFragmentHidden(); // Don't forget to tell the activity.
|
||||
}
|
||||
ft.commit();
|
||||
|
||||
|
@ -396,7 +385,6 @@ class MessageListXLFragmentManager {
|
|||
if (mMessageViewFragment != null) {
|
||||
// Message view will disappear.
|
||||
mMessageViewFragment = null;
|
||||
mTargetActivity.onMessageViewFragmentHidden(); // Don't forget to tell the activity.
|
||||
}
|
||||
} else {
|
||||
if (byExplicitUserAction) {
|
||||
|
@ -471,7 +459,6 @@ class MessageListXLFragmentManager {
|
|||
mMessageViewFragment = fragment;
|
||||
fragment.setCallback(mMessageViewFragmentCallback);
|
||||
fragment.openMessage(mMessageId);
|
||||
mTargetActivity.onMessageViewFragmentShown(getAccountId(), getMailboxId(), getMessageId());
|
||||
}
|
||||
|
||||
private void startInboxLookup() {
|
||||
|
|
|
@ -19,6 +19,7 @@ package com.android.email.activity;
|
|||
import com.android.email.Email;
|
||||
import com.android.email.R;
|
||||
import com.android.email.Utility;
|
||||
import com.android.email.provider.EmailContent.Mailbox;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
|
@ -40,8 +41,6 @@ public class MessageView extends MessageViewBase implements View.OnClickListener
|
|||
MessageOrderManager.Callback, MessageViewFragment.Callback {
|
||||
private static final String EXTRA_MESSAGE_ID = "com.android.email.MessageView_message_id";
|
||||
private static final String EXTRA_MAILBOX_ID = "com.android.email.MessageView_mailbox_id";
|
||||
private static final String EXTRA_DISABLE_REPLY =
|
||||
"com.android.email.MessageView_disable_reply";
|
||||
|
||||
// for saveInstanceState()
|
||||
private static final String STATE_MESSAGE_ID = "messageId";
|
||||
|
@ -56,32 +55,24 @@ public class MessageView extends MessageViewBase implements View.OnClickListener
|
|||
private View mMoveToNewer;
|
||||
private View mMoveToOlder;
|
||||
|
||||
// this is true when reply & forward are disabled, such as messages in the trash
|
||||
private boolean mDisableReplyAndForward;
|
||||
// False when a message can't be forwarded/replied, such as trashed messages
|
||||
private boolean mReplyAndForwardEnabled;
|
||||
|
||||
/**
|
||||
* View a specific message found in the Email provider.
|
||||
* @param messageId the message to view.
|
||||
* @param mailboxId identifies the sequence of messages used for newer/older navigation.
|
||||
* @param disableReplyAndForward set if reply/forward do not make sense for this message
|
||||
* (e.g. messages in Trash).
|
||||
*/
|
||||
public static void actionView(Context context, long messageId, long mailboxId,
|
||||
boolean disableReplyAndForward) {
|
||||
public static void actionView(Context context, long messageId, long mailboxId) {
|
||||
if (messageId < 0) {
|
||||
throw new IllegalArgumentException("MessageView invalid messageId " + messageId);
|
||||
}
|
||||
Intent i = new Intent(context, MessageView.class);
|
||||
i.putExtra(EXTRA_MESSAGE_ID, messageId);
|
||||
i.putExtra(EXTRA_MAILBOX_ID, mailboxId);
|
||||
i.putExtra(EXTRA_DISABLE_REPLY, disableReplyAndForward);
|
||||
context.startActivity(i);
|
||||
}
|
||||
|
||||
public static void actionView(Context context, long messageId, long mailboxId) {
|
||||
actionView(context, messageId, mailboxId, false);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected int getLayoutId() {
|
||||
return R.layout.message_view;
|
||||
|
@ -119,11 +110,7 @@ public class MessageView extends MessageViewBase implements View.OnClickListener
|
|||
return;
|
||||
}
|
||||
|
||||
mDisableReplyAndForward = intent.getBooleanExtra(EXTRA_DISABLE_REPLY, false);
|
||||
if (mDisableReplyAndForward) {
|
||||
findViewById(R.id.reply).setEnabled(false);
|
||||
findViewById(R.id.reply_all).setEnabled(false);
|
||||
}
|
||||
enableForwardReply(false);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -168,6 +155,12 @@ public class MessageView extends MessageViewBase implements View.OnClickListener
|
|||
return getFragment().getAccountId();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onMessageViewShown(int mailboxType) {
|
||||
super.onMessageViewShown(mailboxType);
|
||||
enableForwardReply(mailboxType != Mailbox.TYPE_TRASH);
|
||||
}
|
||||
|
||||
private void onReply() {
|
||||
MessageCompose.actionReply(this, mMessageId, false);
|
||||
finish();
|
||||
|
@ -279,18 +272,27 @@ public class MessageView extends MessageViewBase implements View.OnClickListener
|
|||
finish();
|
||||
}
|
||||
|
||||
private void enableForwardReply(boolean enabled) {
|
||||
mReplyAndForwardEnabled = enabled;
|
||||
findViewById(R.id.reply).setEnabled(enabled);
|
||||
findViewById(R.id.reply_all).setEnabled(enabled);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onCreateOptionsMenu(Menu menu) {
|
||||
super.onCreateOptionsMenu(menu);
|
||||
getMenuInflater().inflate(R.menu.message_view_option, menu);
|
||||
if (mDisableReplyAndForward) {
|
||||
menu.findItem(R.id.forward).setEnabled(false);
|
||||
menu.findItem(R.id.reply).setEnabled(false);
|
||||
menu.findItem(R.id.reply_all).setEnabled(false);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onPrepareOptionsMenu(Menu menu) {
|
||||
menu.findItem(R.id.forward).setEnabled(mReplyAndForwardEnabled);
|
||||
menu.findItem(R.id.reply).setEnabled(mReplyAndForwardEnabled);
|
||||
menu.findItem(R.id.reply_all).setEnabled(mReplyAndForwardEnabled);
|
||||
return super.onPrepareOptionsMenu(menu);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sync the current message.
|
||||
* - Set message id to the fragment and the message order manager.
|
||||
|
|
|
@ -96,6 +96,14 @@ public abstract class MessageViewBase extends Activity implements MessageViewFra
|
|||
*/
|
||||
protected abstract long getAccountId();
|
||||
|
||||
@Override
|
||||
public void onMessageViewShown(int mailboxType) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onMessageViewGone() {
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onUrlInMessageClicked(String url) {
|
||||
// If it's showing an EML file, we pass -1 as the account id, and MessageCompose
|
||||
|
|
|
@ -28,6 +28,7 @@ import com.android.email.mail.internet.MimeUtility;
|
|||
import com.android.email.provider.AttachmentProvider;
|
||||
import com.android.email.provider.EmailContent.Attachment;
|
||||
import com.android.email.provider.EmailContent.Body;
|
||||
import com.android.email.provider.EmailContent.Mailbox;
|
||||
import com.android.email.provider.EmailContent.Message;
|
||||
import com.android.email.service.AttachmentDownloadService;
|
||||
|
||||
|
@ -150,6 +151,12 @@ public abstract class MessageViewFragmentBase extends Fragment implements View.O
|
|||
}
|
||||
|
||||
public interface Callback {
|
||||
/** Called when the fragment is about to show up, or show a different message. */
|
||||
public void onMessageViewShown(int mailboxType);
|
||||
|
||||
/** Called when the fragment is about to be destroyed. */
|
||||
public void onMessageViewGone();
|
||||
|
||||
/**
|
||||
* Called when a link in a message is clicked.
|
||||
*
|
||||
|
@ -173,23 +180,12 @@ public abstract class MessageViewFragmentBase extends Fragment implements View.O
|
|||
|
||||
public static class EmptyCallback implements Callback {
|
||||
public static final Callback INSTANCE = new EmptyCallback();
|
||||
|
||||
@Override
|
||||
public void onLoadMessageError() {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onLoadMessageFinished() {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onLoadMessageStarted() {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onMessageNotExists() {
|
||||
}
|
||||
|
||||
@Override public void onMessageViewShown(int mailboxType) {}
|
||||
@Override public void onMessageViewGone() {}
|
||||
@Override public void onLoadMessageError() {}
|
||||
@Override public void onLoadMessageFinished() {}
|
||||
@Override public void onLoadMessageStarted() {}
|
||||
@Override public void onMessageNotExists() {}
|
||||
@Override
|
||||
public boolean onUrlInMessageClicked(String url) {
|
||||
return false;
|
||||
|
@ -301,6 +297,7 @@ public abstract class MessageViewFragmentBase extends Fragment implements View.O
|
|||
if (Email.DEBUG_LIFECYCLE && Email.DEBUG) {
|
||||
Log.d(Email.LOG_TAG, "MessageViewFragment onDestroy");
|
||||
}
|
||||
mCallback.onMessageViewGone();
|
||||
mController.removeResultCallback(mControllerCallback);
|
||||
cancelAllTasks();
|
||||
mMessageContentView.destroy();
|
||||
|
@ -585,6 +582,7 @@ public abstract class MessageViewFragmentBase extends Fragment implements View.O
|
|||
private class LoadMessageTask extends AsyncTask<Void, Void, Message> {
|
||||
|
||||
private final boolean mOkToFetch;
|
||||
private int mMailboxType;
|
||||
|
||||
/**
|
||||
* Special constructor to cache some local info
|
||||
|
@ -595,7 +593,14 @@ public abstract class MessageViewFragmentBase extends Fragment implements View.O
|
|||
|
||||
@Override
|
||||
protected Message doInBackground(Void... params) {
|
||||
return openMessageSync();
|
||||
Message message = openMessageSync();
|
||||
if (message != null) {
|
||||
mMailboxType = Mailbox.getMailboxType(mContext, message.mMailboxKey);
|
||||
if (mMailboxType == -1) {
|
||||
message = null; // mailbox removed??
|
||||
}
|
||||
}
|
||||
return message;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -621,6 +626,7 @@ public abstract class MessageViewFragmentBase extends Fragment implements View.O
|
|||
|
||||
reloadUiFromMessage(message, mOkToFetch);
|
||||
startPresenceCheck();
|
||||
mCallback.onMessageViewShown(mMailboxType);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue