Close cursor properly.
Also, don't issue separate query()s for each recent mailbox. Bug 4977956 Change-Id: I3ccd437a7efd5c3599c4a1952ba091a7b3b815bf
This commit is contained in:
parent
5fbc5025f0
commit
8de5bda815
@ -1124,4 +1124,27 @@ public class Utility {
|
|||||||
f.dump("", new FileDescriptor(), w, new String[0]);
|
f.dump("", new FileDescriptor(), w, new String[0]);
|
||||||
return sw.toString();
|
return sw.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Builds an "in" expression for SQLite.
|
||||||
|
*
|
||||||
|
* e.g. "ID" + 1,2,3 -> "ID in (1,2,3)". If {@code values} is empty or null, it returns an
|
||||||
|
* empty string.
|
||||||
|
*/
|
||||||
|
public static String buildInSelection(String columnName, Collection<? extends Number> values) {
|
||||||
|
if ((values == null) || (values.size() == 0)) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
sb.append(columnName);
|
||||||
|
sb.append(" in (");
|
||||||
|
String sep = "";
|
||||||
|
for (Number n : values) {
|
||||||
|
sb.append(sep);
|
||||||
|
sb.append(n.toString());
|
||||||
|
sep = ",";
|
||||||
|
}
|
||||||
|
sb.append(')');
|
||||||
|
return sb.toString();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -31,6 +31,7 @@ import com.android.emailcommon.provider.Mailbox;
|
|||||||
import com.android.emailcommon.utility.Utility;
|
import com.android.emailcommon.utility.Utility;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collection;
|
||||||
|
|
||||||
import android.content.ContentResolver;
|
import android.content.ContentResolver;
|
||||||
import android.content.ContentUris;
|
import android.content.ContentUris;
|
||||||
@ -385,7 +386,7 @@ public class AccountSelectorAdapter extends CursorAdapter {
|
|||||||
// Do not display recent mailboxes in the account spinner for the two pane view
|
// Do not display recent mailboxes in the account spinner for the two pane view
|
||||||
recentMailboxes = mailboxManager.getMostRecent(mAccountId, mUseTwoPane);
|
recentMailboxes = mailboxManager.getMostRecent(mAccountId, mUseTwoPane);
|
||||||
}
|
}
|
||||||
int recentCount = (recentMailboxes == null) ? 0 : recentMailboxes.size();
|
final int recentCount = (recentMailboxes == null) ? 0 : recentMailboxes.size();
|
||||||
matrixCursor.mRecentCount = recentCount;
|
matrixCursor.mRecentCount = recentCount;
|
||||||
|
|
||||||
if (!mUseTwoPane) {
|
if (!mUseTwoPane) {
|
||||||
@ -395,9 +396,7 @@ public class AccountSelectorAdapter extends CursorAdapter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (recentCount > 0) {
|
if (recentCount > 0) {
|
||||||
for (long mailboxId : recentMailboxes) {
|
addMailboxRows(matrixCursor, accountPosition, recentMailboxes);
|
||||||
addMailboxRow(matrixCursor, accountPosition, mailboxId);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!mUseTwoPane) {
|
if (!mUseTwoPane) {
|
||||||
@ -418,16 +417,23 @@ public class AccountSelectorAdapter extends CursorAdapter {
|
|||||||
MailboxColumns.UNREAD_COUNT, MailboxColumns.MESSAGE_COUNT
|
MailboxColumns.UNREAD_COUNT, MailboxColumns.MESSAGE_COUNT
|
||||||
};
|
};
|
||||||
|
|
||||||
private void addMailboxRow(MatrixCursor matrixCursor, int accountPosition, long mailboxId) {
|
private void addMailboxRows(MatrixCursor matrixCursor, int accountPosition,
|
||||||
|
Collection<Long> mailboxIds) {
|
||||||
Cursor c = mContext.getContentResolver().query(
|
Cursor c = mContext.getContentResolver().query(
|
||||||
ContentUris.withAppendedId(Mailbox.CONTENT_URI, mailboxId),
|
Mailbox.CONTENT_URI, RECENT_MAILBOX_INFO_PROJECTION,
|
||||||
RECENT_MAILBOX_INFO_PROJECTION, null, null, null);
|
Utility.buildInSelection(MailboxColumns.ID, mailboxIds), null,
|
||||||
if (!c.moveToFirst()) {
|
RecentMailboxManager.RECENT_MAILBOXES_SORT_ORDER);
|
||||||
return;
|
try {
|
||||||
|
c.moveToPosition(-1);
|
||||||
|
while (c.moveToNext()) {
|
||||||
|
addRow(matrixCursor, ROW_TYPE_MAILBOX,
|
||||||
|
c.getLong(c.getColumnIndex(MailboxColumns.ID)),
|
||||||
|
mFolderProperties.getDisplayName(c), null,
|
||||||
|
mFolderProperties.getMessageCount(c), accountPosition, mAccountId);
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
c.close();
|
||||||
}
|
}
|
||||||
addRow(matrixCursor, ROW_TYPE_MAILBOX, mailboxId,
|
|
||||||
mFolderProperties.getDisplayName(c), null,
|
|
||||||
mFolderProperties.getMessageCount(c), accountPosition, mAccountId);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void addHeaderRow(MatrixCursor cursor, String name) {
|
private void addHeaderRow(MatrixCursor cursor, String name) {
|
||||||
|
@ -39,6 +39,8 @@ public class RecentMailboxManager {
|
|||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
static RecentMailboxManager sInstance;
|
static RecentMailboxManager sInstance;
|
||||||
|
|
||||||
|
public static String RECENT_MAILBOXES_SORT_ORDER = MailboxColumns.DISPLAY_NAME;
|
||||||
|
|
||||||
/** The maximum number of results to retrieve */
|
/** The maximum number of results to retrieve */
|
||||||
private static final int LIMIT_RESULTS = 5;
|
private static final int LIMIT_RESULTS = 5;
|
||||||
/** Query to find the top most recent mailboxes */
|
/** Query to find the top most recent mailboxes */
|
||||||
@ -101,7 +103,7 @@ public class RecentMailboxManager {
|
|||||||
EmailContent.ID_PROJECTION,
|
EmailContent.ID_PROJECTION,
|
||||||
selection,
|
selection,
|
||||||
new String[] { Long.toString(accountId), Integer.toString(LIMIT_RESULTS) },
|
new String[] { Long.toString(accountId), Integer.toString(LIMIT_RESULTS) },
|
||||||
MailboxColumns.DISPLAY_NAME);
|
RECENT_MAILBOXES_SORT_ORDER);
|
||||||
try {
|
try {
|
||||||
while (cursor.moveToNext()) {
|
while (cursor.moveToNext()) {
|
||||||
returnList.add(cursor.getLong(EmailContent.ID_PROJECTION_COLUMN));
|
returnList.add(cursor.getLong(EmailContent.ID_PROJECTION_COLUMN));
|
||||||
|
@ -525,4 +525,20 @@ public class UtilityUnitTests extends AndroidTestCase {
|
|||||||
assertFalse(Utility.isServerNameValid("$"));
|
assertFalse(Utility.isServerNameValid("$"));
|
||||||
assertFalse(Utility.isServerNameValid(" "));
|
assertFalse(Utility.isServerNameValid(" "));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static Collection<Long> toColleciton(long... values) {
|
||||||
|
ArrayList<Long> ret = new ArrayList<Long>();
|
||||||
|
for (long v : values) {
|
||||||
|
ret.add(v);
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testBuildInSelection() {
|
||||||
|
assertEquals("", Utility.buildInSelection("c", null));
|
||||||
|
assertEquals("", Utility.buildInSelection("c", toColleciton()));
|
||||||
|
assertEquals("c in (1)", Utility.buildInSelection("c", toColleciton(1)));
|
||||||
|
assertEquals("c in (1,2)", Utility.buildInSelection("c", toColleciton(1, 2)));
|
||||||
|
assertEquals("c in (1,2,-500)", Utility.buildInSelection("c", toColleciton(1, 2, -500)));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user