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:
Makoto Onuki 2010-09-01 18:40:10 -07:00
parent 213c52dd64
commit 646b5e062e
6 changed files with 91 additions and 73 deletions

View File

@ -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);
}
}

View File

@ -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

View File

@ -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() {

View File

@ -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.

View File

@ -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

View File

@ -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);
}
}