168 lines
7.0 KiB
Java
168 lines
7.0 KiB
Java
/*
|
|
* Copyright (C) 2011 The Android Open Source Project
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
package com.android.email.activity;
|
|
|
|
import com.android.email.Email;
|
|
import com.android.email.FolderProperties;
|
|
import com.android.email.data.ThrottlingCursorLoader;
|
|
import com.android.email.mail.Store;
|
|
import com.android.emailcommon.Logging;
|
|
import com.android.emailcommon.provider.Account;
|
|
import com.android.emailcommon.provider.EmailContent.MailboxColumns;
|
|
import com.android.emailcommon.provider.Mailbox;
|
|
import com.android.emailcommon.utility.Utility;
|
|
|
|
import android.content.Context;
|
|
import android.content.Loader;
|
|
import android.database.Cursor;
|
|
import android.util.Log;
|
|
import android.view.LayoutInflater;
|
|
import android.view.View;
|
|
import android.view.ViewGroup;
|
|
import android.widget.CursorAdapter;
|
|
import android.widget.TextView;
|
|
|
|
/**
|
|
* Cursor adapter for the "move to mailbox" dialog.
|
|
* TODO We've detached this class from {@link MailboxFragmentAdapter} and {@link MailboxFragmentAdapter}.
|
|
* Depending upon the UX for the dialog and nested folders, we may want to bring these three
|
|
* adapter classes back into alignment.
|
|
*/
|
|
class MailboxMoveToAdapter extends CursorAdapter {
|
|
/** Selection for all mailboxes in an account */
|
|
private static final String ALL_MAILBOX_SELECTION = MailboxColumns.ACCOUNT_KEY + "=?"
|
|
+ " AND " + Mailbox.USER_VISIBLE_MAILBOX_SELECTION;
|
|
/** Selection for valid target mailboxes */
|
|
private static final String TARGET_MAILBOX_SELECTION =
|
|
MailboxColumns.TYPE + " NOT IN (" + Mailbox.TYPE_DRAFTS + ","
|
|
+ Mailbox.TYPE_OUTBOX + "," + Mailbox.TYPE_SENT + "," + Mailbox.TYPE_TRASH + ") AND ("
|
|
+ MailboxColumns.FLAGS + " & " + Mailbox.FLAG_ACCEPTS_MOVED_MAIL + " != 0)";
|
|
/** Selection to exclude a mailbox ID */
|
|
private static final String EXCLUDE_MAILBOX_SELECTION =
|
|
MailboxColumns.ID + "!=?";
|
|
/** The main selection to populate the "move to" dialog */
|
|
private static final String MOVE_TO_SELECTION =
|
|
ALL_MAILBOX_SELECTION
|
|
+ " AND " + TARGET_MAILBOX_SELECTION
|
|
+ " AND " + EXCLUDE_MAILBOX_SELECTION;
|
|
/** Projection that uses the server id column as the mailbox name */
|
|
private static final String[] MOVE_TO_PROJECTION_SERVER_ID = new String[] {
|
|
MailboxColumns.ID,
|
|
MailboxColumns.ID + " AS org_mailbox_id",
|
|
MailboxColumns.SERVER_ID,
|
|
MailboxColumns.TYPE,
|
|
};
|
|
/** Projection that uses the display name column as the mailbox name */
|
|
private static final String[] MOVE_TO_PROJECTION_DISPLAY_NAME = new String[] {
|
|
MailboxColumns.ID,
|
|
MailboxColumns.ID + " AS org_mailbox_id",
|
|
MailboxColumns.DISPLAY_NAME,
|
|
MailboxColumns.TYPE,
|
|
};
|
|
/** Sort order for special mailboxes */
|
|
private static final String MOVE_TO_ORDER_BY_STATIC =
|
|
"CASE " + MailboxColumns.TYPE
|
|
+ " WHEN " + Mailbox.TYPE_INBOX + " THEN 0"
|
|
+ " WHEN " + Mailbox.TYPE_JUNK + " THEN 1"
|
|
+ " ELSE 10 END";
|
|
/** Server id sort order */
|
|
private static final String MOVE_TO_ORDER_BY_SERVER_ID =
|
|
MOVE_TO_ORDER_BY_STATIC
|
|
// All other mailboxes are shown in alphabetical order.
|
|
+ ", " + MailboxColumns.SERVER_ID;
|
|
/** Display name sort order */
|
|
private static final String MOVE_TO_ORDER_BY_DISPLAY_NAME =
|
|
MOVE_TO_ORDER_BY_STATIC
|
|
// All other mailboxes are shown in alphabetical order.
|
|
+ ", " + MailboxColumns.DISPLAY_NAME;
|
|
|
|
// Column 0 is only for ListView; we don't use it in our code.
|
|
private static final int COLUMN_ID = 1;
|
|
private static final int COLUMN_MAILBOX_NAME = 2;
|
|
private static final int COLUMN_TYPE = 3;
|
|
|
|
/** Cached layout inflater */
|
|
private final LayoutInflater mInflater;
|
|
|
|
public MailboxMoveToAdapter(Context context) {
|
|
super(context, null, 0 /* flags; no content observer */);
|
|
mInflater = LayoutInflater.from(context);
|
|
}
|
|
|
|
@Override
|
|
public void bindView(View view, Context context, Cursor cursor) {
|
|
TextView t = (TextView) view;
|
|
t.setText(getDisplayText(context, cursor));
|
|
}
|
|
|
|
@Override
|
|
public View newView(Context context, Cursor cursor, ViewGroup parent) {
|
|
return mInflater.inflate(android.R.layout.simple_list_item_1, parent, false);
|
|
}
|
|
|
|
static Loader<Cursor> createLoader(Context context, long accountId, long mailboxId) {
|
|
if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
|
|
Log.d(Logging.LOG_TAG, "MailboxDialogAdapter#createLoader accountId=" + accountId
|
|
+ ", mailboxId=" + mailboxId);
|
|
}
|
|
return new MailboxMoveToLoader(context, accountId, mailboxId);
|
|
}
|
|
|
|
/**
|
|
* Returns the mailbox name to display in the dialog list. If the mailbox is of
|
|
* certain, well known, types, use a predefined name. Otherwise, use the server
|
|
* provided name.
|
|
*/
|
|
private static String getDisplayText(Context context, Cursor cursor) {
|
|
final int type = cursor.getInt(COLUMN_TYPE);
|
|
final long mailboxId = cursor.getLong(COLUMN_ID);
|
|
String name = FolderProperties.getInstance(context).getDisplayName(type, mailboxId);
|
|
if (name == null) {
|
|
name = cursor.getString(COLUMN_MAILBOX_NAME);
|
|
}
|
|
return name;
|
|
}
|
|
|
|
/** Loader for the "move to mailbox" dialog. */
|
|
private static class MailboxMoveToLoader extends ThrottlingCursorLoader {
|
|
private final long mAccountId;
|
|
public MailboxMoveToLoader(Context context, long accountId, long mailboxId) {
|
|
super(context, Mailbox.CONTENT_URI,
|
|
null, MOVE_TO_SELECTION,
|
|
new String[] { Long.toString(accountId), Long.toString(mailboxId) }, null);
|
|
mAccountId = accountId;
|
|
}
|
|
|
|
@Override
|
|
public Cursor loadInBackground() {
|
|
// TODO Create a common way to store the fully qualified path name for all account types
|
|
final String protocol = Account.getProtocol(getContext(), mAccountId);
|
|
if (Store.STORE_SCHEME_EAS.equals(protocol)) {
|
|
// For EAS accounts; use the display name
|
|
setProjection(MOVE_TO_PROJECTION_DISPLAY_NAME);
|
|
setSortOrder(MOVE_TO_ORDER_BY_DISPLAY_NAME);
|
|
} else {
|
|
// For all other accounts; use the server id
|
|
setProjection(MOVE_TO_PROJECTION_SERVER_ID);
|
|
setSortOrder(MOVE_TO_ORDER_BY_SERVER_ID);
|
|
}
|
|
final Cursor mailboxesCursor = super.loadInBackground();
|
|
return Utility.CloseTraceCursorWrapper.get(mailboxesCursor);
|
|
}
|
|
}
|
|
}
|