Make widget open appropriate screen

Widget should open MessageListXL on tablet.

Bug 3253813

Change-Id: I5cfa63b571e443a0217bc9332bb4a76a039143ac
This commit is contained in:
Makoto Onuki 2010-12-03 16:28:25 -08:00
parent 69cd842c07
commit 6a858c1be2
4 changed files with 99 additions and 28 deletions

View File

@ -44,8 +44,6 @@ import android.view.Window;
import android.view.animation.Animation;
import android.view.animation.Animation.AnimationListener;
import android.view.animation.AnimationUtils;
import android.view.animation.DecelerateInterpolator;
import android.view.animation.TranslateAnimation;
import android.widget.TextView;
import java.security.InvalidParameterException;
@ -60,6 +58,7 @@ public class MessageListXL extends Activity implements
View.OnClickListener {
private static final String EXTRA_ACCOUNT_ID = "ACCOUNT_ID";
private static final String EXTRA_MAILBOX_ID = "MAILBOX_ID";
private static final String EXTRA_MESSAGE_ID = "MESSAGE_ID";
private static final int LOADER_ID_ACCOUNT_LIST = 0;
/* package */ static final int MAILBOX_REFRESH_MIN_INTERVAL = 30 * 1000; // in milliseconds
/* package */ static final int INBOX_AUTO_REFRESH_MIN_INTERVAL = 10 * 1000; // in milliseconds
@ -122,6 +121,27 @@ public class MessageListXL extends Activity implements
fromActivity.startActivity(i);
}
/**
* Launch and open a message.
*
* @param accountId must not be -1.
* @param mailboxId must not be -1. Magic mailboxes IDs (such as
* {@link Mailbox#QUERY_ALL_INBOXES}) don't work.
* @param messageId must not be -1.
*/
public static void actionOpenMessage(Activity fromActivity, long accountId, long mailboxId,
long messageId) {
Intent i = new Intent(fromActivity, MessageListXL.class);
if (accountId == -1 || mailboxId == -1 || messageId == -1) {
throw new InvalidParameterException();
}
i.putExtra(EXTRA_ACCOUNT_ID, accountId);
i.putExtra(EXTRA_MAILBOX_ID, mailboxId);
i.putExtra(EXTRA_MESSAGE_ID, messageId);
i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
fromActivity.startActivity(i);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
if (Email.DEBUG_LIFECYCLE && Email.DEBUG) Log.d(Email.LOG_TAG, "MessageListXL onCreate");
@ -169,12 +189,13 @@ public class MessageListXL extends Activity implements
final Intent i = getIntent();
final long accountId = i.getLongExtra(EXTRA_ACCOUNT_ID, -1);
final long mailboxId = i.getLongExtra(EXTRA_MAILBOX_ID, -1);
final long messageId = i.getLongExtra(EXTRA_MESSAGE_ID, -1);
if (Email.DEBUG) {
Log.d(Email.LOG_TAG, String.format("initFromIntent: %d %d", accountId, mailboxId));
}
if (accountId != -1) {
mFragmentManager.selectAccount(accountId, mailboxId, true);
mFragmentManager.selectAccount(accountId, mailboxId, messageId, true);
}
}
@ -413,12 +434,12 @@ public class MessageListXL extends Activity implements
private class MailboxListFragmentCallback implements MailboxListFragment.Callback {
@Override
public void onMailboxSelected(long accountId, long mailboxId) {
mFragmentManager.selectMailbox(mailboxId, true);
mFragmentManager.selectMailbox(mailboxId, -1, true);
}
@Override
public void onAccountSelected(long accountId) {
mFragmentManager.selectAccount(accountId, -1, true);
mFragmentManager.selectAccount(accountId, -1, -1, true);
loadAccounts(); // This will update the account spinner, and select the account.
}
@ -642,7 +663,7 @@ public class MessageListXL extends Activity implements
@Override
public boolean onNavigationItemSelected(int itemPosition, long accountId) {
if (Email.DEBUG) Log.d(Email.LOG_TAG, "Account selected: accountId=" + accountId);
mFragmentManager.selectAccount(accountId, -1, true);
mFragmentManager.selectAccount(accountId, -1, -1, true);
return true;
}
}

View File

@ -261,12 +261,8 @@ class MessageListXLFragmentManager {
if (accountId == -1) {
return;
}
// selectAccount() calls selectMailbox() if necessary
selectAccount(accountId, mailboxId, false);
if (messageId == -1) {
return;
}
selectMessage(messageId);
// selectAccount() calls selectMailbox/Message() if necessary.
selectAccount(accountId, mailboxId, messageId, false);
}
private void saveMessageListFragmentState() {
@ -308,10 +304,12 @@ class MessageListXLFragmentManager {
*
* @param accountId account ID. Must not be -1.
* @param mailboxId mailbox ID. Pass -1 to open account's inbox.
* @param messageId message ID. Pass -1 to not open a message.
* @param byExplicitUserAction set true if the user is explicitly opening the mailbox,
* in which case we perform "auto-refresh".
*/
public void selectAccount(long accountId, long mailboxId, boolean byExplicitUserAction) {
public void selectAccount(long accountId, long mailboxId, long messageId,
boolean byExplicitUserAction) {
if (Email.DEBUG_LIFECYCLE && Email.DEBUG) {
Log.d(Email.LOG_TAG, "selectAccount mAccountId=" + accountId);
}
@ -337,11 +335,11 @@ class MessageListXLFragmentManager {
if ((accountId == Account.ACCOUNT_ID_COMBINED_VIEW) && (mailboxId == -1)) {
// When opening the Combined view, the right pane will be "combined inbox".
selectMailbox(Mailbox.QUERY_ALL_INBOXES, false);
selectMailbox(Mailbox.QUERY_ALL_INBOXES, -1, false);
} else if (mailboxId == -1) {
startInboxLookup();
} else {
selectMailbox(mailboxId, byExplicitUserAction);
selectMailbox(mailboxId, messageId, byExplicitUserAction);
}
}
@ -371,10 +369,11 @@ class MessageListXLFragmentManager {
* {@link #selectAccount}.
*
* @param mailboxId ID of mailbox
* @param messageId message ID. Pass -1 to not open a message.
* @param byExplicitUserAction set true if the user is explicitly opening the mailbox,
* in which case we perform "auto-refresh".
*/
public void selectMailbox(long mailboxId, boolean byExplicitUserAction) {
public void selectMailbox(long mailboxId, long messageId, boolean byExplicitUserAction) {
if (Email.DEBUG_LIFECYCLE && Email.DEBUG) {
Log.d(Email.LOG_TAG, "selectMailbox mMailboxId=" + mailboxId);
}
@ -399,7 +398,11 @@ class MessageListXLFragmentManager {
mMailboxListFragment.setSelectedMailbox(mMailboxId);
mTargetActivity.onMailboxChanged(mAccountId, mMailboxId);
mThreePane.showLeftPane(); // Show mailbox list
if (messageId == -1) {
mThreePane.showLeftPane(); // Show mailbox list
} else {
selectMessage(messageId);
}
}
/**
@ -481,7 +484,7 @@ class MessageListXLFragmentManager {
if (Email.DEBUG_LIFECYCLE && Email.DEBUG) {
Log.d(Email.LOG_TAG, " Found inbox");
}
selectMailbox(mailboxId, true);
selectMailbox(mailboxId, -1, true);
}
@Override

View File

@ -62,14 +62,18 @@ public class Welcome extends Activity {
-n com.google.android.email/com.android.email.activity.Welcome \
-e DEBUG_PANE_MODE 2 --el ACCOUNT_ID 2
* Open Combined Inbox (ID=-2) in 2 pane
* Open a message (account id=1, mailbox id=2, message id=3)
adb shell am start -a android.intent.action.MAIN \
-n com.google.android.email/com.android.email.activity.Welcome \
-e DEBUG_PANE_MODE 2 --el MAILBOX_ID -2
-e DEBUG_PANE_MODE 2 \
--el ACCOUNT_ID 1 \
--el MAILBOX_ID 2 \
--el MESSAGE_ID 3
*/
private static final String EXTRA_ACCOUNT_ID = "ACCOUNT_ID";
private static final String EXTRA_MAILBOX_ID = "MAILBOX_ID";
private static final String EXTRA_MESSAGE_ID = "MESSAGE_ID";
/**
* Extra for debugging. Set 1 to force one-pane. Set 2 to force two-pane.
@ -110,6 +114,21 @@ public class Welcome extends Activity {
return i;
}
/**
* Create an Intent to open a message.
*/
public static Intent createOpenMessageIntent(Context context, long accountId,
long mailboxId, long messageId) {
Intent i = new Intent(context, Welcome.class);
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
if (accountId != -1) {
i.putExtra(EXTRA_ACCOUNT_ID, accountId);
i.putExtra(EXTRA_MAILBOX_ID, mailboxId);
i.putExtra(EXTRA_MESSAGE_ID, messageId);
}
return i;
}
/**
* Open account's inbox.
*/
@ -172,8 +191,9 @@ public class Welcome extends Activity {
final long accountId = getIntent().getLongExtra(EXTRA_ACCOUNT_ID, -1);
final long mailboxId = getIntent().getLongExtra(EXTRA_MAILBOX_ID, -1);
final long messageId = getIntent().getLongExtra(EXTRA_MESSAGE_ID, -1);
final int debugPaneMode = getDebugPaneMode(getIntent());
new MainActivityLauncher(this, accountId, mailboxId, debugPaneMode).execute();
new MainActivityLauncher(this, accountId, mailboxId, messageId, debugPaneMode).execute();
}
@Override
@ -208,12 +228,14 @@ public class Welcome extends Activity {
private final int mDebugPaneMode;
private final long mAccountId;
private final long mMailboxId;
private final long mMessageId;
public MainActivityLauncher(Activity fromActivity, long accountId, long mailboxId,
int debugPaneMode) {
long messageId, int debugPaneMode) {
mFromActivity = fromActivity;
mAccountId = accountId;
mMailboxId = mailboxId;
mMessageId = messageId;
mDebugPaneMode = debugPaneMode;
}
@ -221,6 +243,10 @@ public class Welcome extends Activity {
return mMailboxId != -1;
}
private boolean isMessageSelected() {
return mMessageId != -1;
}
@Override
protected Void doInBackground(Void... params) {
final int numAccount =
@ -237,13 +263,18 @@ public class Welcome extends Activity {
|| (useTwoPane(mFromActivity) && mDebugPaneMode == 0);
if (useTwoPane) {
if (isMailboxSelected()) {
if (isMessageSelected()) {
MessageListXL.actionOpenMessage(mFromActivity, accountId, mMailboxId,
mMessageId);
} else if (isMailboxSelected()) {
MessageListXL.actionOpenMailbox(mFromActivity, accountId, mMailboxId);
} else {
MessageListXL.actionOpenAccount(mFromActivity, accountId);
}
} else {
if (isMailboxSelected()) {
if (isMessageSelected()) {
MessageView.actionView(mFromActivity, mMessageId, mMailboxId);
} else if (isMailboxSelected()) {
MessageList.actionHandleMailbox(mFromActivity, mMailboxId);
} else {
MessageList.actionHandleAccount(

View File

@ -18,9 +18,11 @@ package com.android.email.provider;
import com.android.email.Email;
import com.android.email.R;
import com.android.email.Utility;
import com.android.email.activity.MessageCompose;
import com.android.email.activity.MessageView;
import com.android.email.activity.Welcome;
import com.android.email.data.ThrottlingCursorLoader;
import com.android.email.provider.EmailContent.Mailbox;
import com.android.email.provider.EmailContent.Message;
import com.android.email.provider.EmailContent.MessageColumns;
@ -553,9 +555,14 @@ public class WidgetProvider extends AppWidgetProvider {
long arg1 = Long.parseLong(pathSegments.get(1));
if (COMMAND_NAME_VIEW_MESSAGE.equals(command)) {
// "view", <message id>, <mailbox id>
Intent i = MessageView.getActionViewIntent(this, arg1,
Long.parseLong(pathSegments.get(2)));
startActivity(i);
final long mailboxId = Long.parseLong(pathSegments.get(2));
final long messageId = arg1;
Utility.runAsync(new Runnable() {
@Override
public void run() {
openMessage(mailboxId, messageId);
}
});
} else if (COMMAND_NAME_SWITCH_LIST_VIEW.equals(command)) {
// "next_view", <widget id>
EmailWidget widget = sWidgetMap.get((int)arg1);
@ -569,5 +576,14 @@ public class WidgetProvider extends AppWidgetProvider {
return Service.START_NOT_STICKY;
}
private void openMessage(long mailboxId, long messageId) {
// TODO Use narrower projection.
Mailbox mailbox = Mailbox.restoreMailboxWithId(this, mailboxId);
if (mailbox == null) {
return;
}
startActivity(Welcome.createOpenMessageIntent(this, mailbox.mAccountKey, mailboxId,
messageId));
}
}
}