Fix some things with shortcuts/widgets.

- All mailboxes will be shown when selecting a shortcut for a normal
account.
- Combined unread won't show up in shortcuts for combined accounts
- only inbox is allowed for IMAP/POP widgets
- all mailboxes allowed for EAS widgets

Bug: 4725896
Change-Id: I5c77c2f5443e330ed451179761b1d9c8c0dd7619
This commit is contained in:
Ben Komalo 2011-06-22 17:41:47 -07:00
parent 2de21278f8
commit e10215eaff
6 changed files with 92 additions and 73 deletions

View File

@ -22,7 +22,6 @@ import android.app.Dialog;
import android.app.Fragment;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;

View File

@ -16,18 +16,6 @@
package com.android.email.activity;
import com.android.email.Controller;
import com.android.email.Email;
import com.android.email.R;
import com.android.email.RefreshManager;
import com.android.email.provider.EmailProvider;
import com.android.emailcommon.Logging;
import com.android.emailcommon.provider.Account;
import com.android.emailcommon.provider.Mailbox;
import com.android.emailcommon.utility.EmailAsyncTask;
import com.android.emailcommon.utility.Utility;
import com.google.common.annotations.VisibleForTesting;
import android.app.Activity;
import android.app.ListFragment;
import android.app.LoaderManager;
@ -51,8 +39,19 @@ import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
import com.android.email.Controller;
import com.android.email.Email;
import com.android.email.R;
import com.android.email.RefreshManager;
import com.android.email.provider.EmailProvider;
import com.android.emailcommon.Logging;
import com.android.emailcommon.provider.Account;
import com.android.emailcommon.provider.Mailbox;
import com.android.emailcommon.utility.EmailAsyncTask;
import com.android.emailcommon.utility.Utility;
import com.google.common.annotations.VisibleForTesting;
import java.util.Timer;
import java.util.TimerTask;
/**
* This fragment presents a list of mailboxes for a given account or the combined mailboxes.
@ -148,8 +147,6 @@ import java.util.TimerTask;
* no views.
* - Otherwise, make sure to check if the fragment has views with {@link #isViewCreated()}
* before touching any views.
*
* TODO Remove the nested folder navigation code during drag&drop.
*/
public class MailboxListFragment extends ListFragment implements OnItemClickListener,
OnDragListener {
@ -162,9 +159,6 @@ public class MailboxListFragment extends ListFragment implements OnItemClickList
private static final String BUNDLE_LIST_STATE = "MailboxListFragment.state.listState";
private static final boolean DEBUG_DRAG_DROP = false; // MUST NOT SUBMIT SET TO TRUE
/** While in drag-n-drop, amount of time before it auto expands; in ms */
private static final long AUTO_EXPAND_DELAY = 750L;
/** No drop target is available where the user is currently hovering over */
private static final int NO_DROP_TARGET = -1;
// Total height of the top and bottom scroll zones, in pixels
@ -182,8 +176,6 @@ public class MailboxListFragment extends ListFragment implements OnItemClickList
private final EmailAsyncTask.Tracker mTaskTracker = new EmailAsyncTask.Tracker();
/** Timer to auto-expand folder lists during drag-n-drop */
private static final Timer sDragTimer = new Timer();
/** Rectangle used for hit testing children */
private static final Rect sTouchFrame = new Rect();

View File

@ -16,13 +16,6 @@
package com.android.email.activity;
import com.android.email.R;
import com.android.email.activity.ShortcutPickerFragment.AccountShortcutPickerFragment;
import com.android.email.activity.ShortcutPickerFragment.PickerCallback;
import com.android.emailcommon.Logging;
import com.android.emailcommon.provider.Account;
import com.android.emailcommon.provider.EmailContent.Message;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
@ -31,6 +24,14 @@ import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import com.android.email.R;
import com.android.email.activity.ShortcutPickerFragment.AccountShortcutPickerFragment;
import com.android.email.activity.ShortcutPickerFragment.MailboxShortcutPickerFragment;
import com.android.email.activity.ShortcutPickerFragment.PickerCallback;
import com.android.emailcommon.Logging;
import com.android.emailcommon.provider.Account;
import com.android.emailcommon.provider.EmailContent.Message;
/**
* This class implements a launcher shortcut for directly accessing a single account.
*/
@ -74,6 +75,15 @@ public class ShortcutPicker extends Activity implements OnClickListener, PickerC
}
}
@Override
public Integer buildFilter(Account account) {
if (!Account.isNormalAccount(account.mId)) {
// Shortcuts for combined accounts can only be for inboxes.
return MailboxShortcutPickerFragment.FILTER_INBOX_ONLY;
}
return MailboxShortcutPickerFragment.FILTER_ALLOW_ALL;
}
@Override
public void onSelected(Account account, long mailboxId) {

View File

@ -16,13 +16,6 @@
package com.android.email.activity;
import com.android.email.R;
import com.android.emailcommon.provider.Account;
import com.android.emailcommon.provider.EmailContent.AccountColumns;
import com.android.emailcommon.provider.EmailContent.MailboxColumns;
import com.android.emailcommon.provider.HostAuth;
import com.android.emailcommon.provider.Mailbox;
import android.app.Activity;
import android.app.FragmentTransaction;
import android.app.ListFragment;
@ -34,15 +27,22 @@ import android.content.Loader;
import android.content.res.Resources;
import android.database.Cursor;
import android.database.MatrixCursor;
import android.database.MergeCursor;
import android.database.MatrixCursor.RowBuilder;
import android.database.MergeCursor;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
import android.widget.AdapterView.OnItemClickListener;
import com.android.email.R;
import com.android.emailcommon.provider.Account;
import com.android.emailcommon.provider.EmailContent.AccountColumns;
import com.android.emailcommon.provider.EmailContent.MailboxColumns;
import com.android.emailcommon.provider.HostAuth;
import com.android.emailcommon.provider.Mailbox;
/**
* Fragment containing a list of accounts to show during shortcut creation.
@ -52,18 +52,10 @@ import android.widget.AdapterView.OnItemClickListener;
*/
public abstract class ShortcutPickerFragment extends ListFragment
implements OnItemClickListener, LoaderCallbacks<Cursor> {
/** Allow all mailboxes in the mailbox list */
public static int FILTER_ALLOW_ALL = 0;
/** Only allow an account's INBOX */
public static int FILTER_INBOX_ONLY = 1 << 0;
/** Allow an "unread" mailbox; this is not affected by {@link #FILTER_INBOX_ONLY} */
public static int FILTER_ALLOW_UNREAD = 1 << 1;
/** Fragment argument to set filter values */
public static final String ARG_FILTER = "ShortcutPickerFragment.filter";
/** The filter values; default to allow all mailboxes */
private Integer mFilter;
/** Callback methods. Enclosing activities must implement to receive fragment notifications. */
public static interface PickerCallback {
/** Builds a mailbox filter for the given account. See MailboxShortcutPickerFragment. */
public Integer buildFilter(Account account);
/** Invoked when an account and mailbox have been selected. */
public void onSelected(Account account, long mailboxId);
/** Required data is missing; either the account and/or mailbox */
@ -72,6 +64,7 @@ public abstract class ShortcutPickerFragment extends ListFragment
/** A no-op callback */
private final PickerCallback EMPTY_CALLBACK = new PickerCallback() {
@Override public Integer buildFilter(Account account) { return null; }
@Override public void onSelected(Account account, long mailboxId){ getActivity().finish(); }
@Override public void onMissingData(boolean missingAccount, boolean missingMailbox) { }
};
@ -121,20 +114,6 @@ public abstract class ShortcutPickerFragment extends ListFragment
/** Returns the cursor columns to map into list */
abstract String[] getFromColumns();
/** Returns the mailbox filter */
int getFilter() {
if (mFilter == null) {
Bundle args = getArguments();
if (args != null) {
mFilter = args.getInt(ARG_FILTER, FILTER_ALLOW_ALL);
} else {
// No arguments set on fragment, use a default value
mFilter = FILTER_ALLOW_ALL;
}
}
return mFilter;
}
// TODO if we add meta-accounts to the database, remove this class entirely
private static final class AccountPickerLoader extends CursorLoader {
public AccountPickerLoader(Context context, Uri uri, String[] projection, String selection,
@ -233,11 +212,8 @@ public abstract class ShortcutPickerFragment extends ListFragment
private void selectAccountCursor(Cursor cursor, boolean allowBack) {
Account account = new Account();
account.restore(cursor);
ShortcutPickerFragment fragment = new MailboxShortcutPickerFragment();
final Bundle args = new Bundle();
args.putParcelable(MailboxShortcutPickerFragment.ARG_ACCOUNT, account);
args.putInt(ARG_FILTER, getFilter());
fragment.setArguments(args);
ShortcutPickerFragment fragment = MailboxShortcutPickerFragment.newInstance(
getActivity(), account, mCallback.buildFilter(account));
FragmentTransaction transaction = getFragmentManager().beginTransaction();
transaction.replace(R.id.shortcut_list, fragment);
if (allowBack) {
@ -300,7 +276,16 @@ public abstract class ShortcutPickerFragment extends ListFragment
/** Mailbox picker */
public static class MailboxShortcutPickerFragment extends ShortcutPickerFragment {
/** Allow all mailboxes in the mailbox list */
public static int FILTER_ALLOW_ALL = 0;
/** Only allow an account's INBOX */
public static int FILTER_INBOX_ONLY = 1 << 0;
/** Allow an "unread" mailbox; this is not affected by {@link #FILTER_INBOX_ONLY} */
public static int FILTER_ALLOW_UNREAD = 1 << 1;
/** Fragment argument to set filter values */
static final String ARG_FILTER = "MailboxShortcutPickerFragment.filter";
static final String ARG_ACCOUNT = "MailboxShortcutPickerFragment.account";
private final static String REAL_ID = "realId";
private final static String[] MAILBOX_FROM_COLUMNS = new String[] {
MailboxColumns.DISPLAY_NAME,
@ -329,6 +314,30 @@ public abstract class ShortcutPickerFragment extends ListFragment
" AND " + MailboxColumns.TYPE + " = " + Mailbox.TYPE_INBOX;
/** The currently selected account */
private Account mAccount;
/** The filter values; default to allow all mailboxes */
private Integer mFilter;
/**
* Builds a mailbox shortcut picker for the given account.
*/
public static MailboxShortcutPickerFragment newInstance(
Context context, Account account, Integer filter) {
MailboxShortcutPickerFragment fragment = new MailboxShortcutPickerFragment();
Bundle args = new Bundle();
args.putParcelable(ARG_ACCOUNT, account);
args.putInt(ARG_FILTER, filter);
fragment.setArguments(args);
return fragment;
}
/** Returns the mailbox filter */
int getFilter() {
if (mFilter == null) {
mFilter = getArguments().getInt(ARG_FILTER, FILTER_ALLOW_ALL);
}
return mFilter;
}
@Override
public void onAttach(Activity activity) {

View File

@ -36,7 +36,6 @@ import com.android.emailcommon.provider.Account;
import com.android.emailcommon.provider.EmailContent.Message;
import com.android.emailcommon.provider.Mailbox;
import com.android.emailcommon.utility.EmailAsyncTask;
import com.android.emailcommon.utility.Utility;
import java.util.LinkedList;
import java.util.List;

View File

@ -24,10 +24,11 @@ import android.view.View;
import android.view.View.OnClickListener;
import com.android.email.R;
import com.android.email.activity.ShortcutPickerFragment;
import com.android.email.activity.ShortcutPickerFragment.AccountShortcutPickerFragment;
import com.android.email.activity.ShortcutPickerFragment.MailboxShortcutPickerFragment;
import com.android.email.activity.ShortcutPickerFragment.PickerCallback;
import com.android.emailcommon.provider.Account;
import com.android.emailcommon.provider.HostAuth;
/**
* Activity to configure the Email widget.
@ -62,11 +63,6 @@ public class WidgetConfiguration extends Activity implements OnClickListener, Pi
// Load the account picking fragment if we haven't created a fragment yet
// NOTE: do not add to history as this will be the first fragment in the flow
AccountShortcutPickerFragment fragment = new AccountShortcutPickerFragment();
Bundle args = new Bundle();
args.putInt(ShortcutPickerFragment.ARG_FILTER,
ShortcutPickerFragment.FILTER_INBOX_ONLY
| ShortcutPickerFragment.FILTER_ALLOW_UNREAD);
fragment.setArguments(args);
getFragmentManager().beginTransaction().add(R.id.shortcut_list, fragment).commit();
}
}
@ -80,6 +76,20 @@ public class WidgetConfiguration extends Activity implements OnClickListener, Pi
}
}
@Override
public Integer buildFilter(Account account) {
if (!Account.isNormalAccount(account.mId)) {
return MailboxShortcutPickerFragment.FILTER_INBOX_ONLY
| MailboxShortcutPickerFragment.FILTER_ALLOW_UNREAD;
}
// We can't synced non-Inbox mailboxes for non-EAS accounts, so they don't sync
// right now and it doesn't make sense to put them in a widget.
return HostAuth.SCHEME_EAS.equals(account.getProtocol(this))
? MailboxShortcutPickerFragment.FILTER_ALLOW_ALL
: MailboxShortcutPickerFragment.FILTER_INBOX_ONLY;
}
@Override
public void onSelected(Account account, long mailboxId) {
setupWidget(account, mailboxId);