Loading k9mail/build.gradle +1 −1 Original line number Diff line number Diff line Loading @@ -35,7 +35,7 @@ dependencies { compile 'com.github.amlcurran.showcaseview:library:5.4.1' compile 'com.squareup.moshi:moshi:1.2.0' androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2.1' androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2.2' testCompile "org.robolectric:robolectric:${robolectricVersion}" testCompile "junit:junit:${junitVersion}" Loading k9mail/src/androidTest/java/com/fsck/k9/provider/MessageProviderTest.java 0 → 100644 +138 −0 Original line number Diff line number Diff line package com.fsck.k9.provider; import android.database.Cursor; import android.net.Uri; import android.support.test.runner.AndroidJUnit4; import android.test.ProviderTestCase2; import android.test.mock.MockContentResolver; import com.fsck.k9.Account; import com.fsck.k9.K9; import com.fsck.k9.Preferences; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import java.util.List; @RunWith(AndroidJUnit4.class) public class MessageProviderTest extends ProviderTestCase2 { private MockContentResolver mMockResolver; private Cursor cursor; public MessageProviderTest() { super(MessageProvider.class, MessageProvider.AUTHORITY); } @Before @Override public void setUp() throws Exception { super.setUp(); mMockResolver = getMockContentResolver(); mContext = K9.app; Preferences preferences = Preferences.getPreferences(getMockContext()); List<Account> accountList = preferences.getAccounts(); for (Account account: accountList) { preferences.deleteAccount(account); } } @After @Override public void tearDown() throws Exception { if (cursor != null) { cursor.close(); } super.tearDown(); } private void createAccount() { Preferences preferences = Preferences.getPreferences(getMockContext()); Account account = preferences.newAccount(); account.setDescription("TestAccount"); account.setChipColor(10); account.setStoreUri("imap://user@domain.com/"); account.save(preferences); } @Test public void query_forAccounts_withNoAccounts_returnsEmptyCursor() { cursor = mMockResolver.query( Uri.parse("content://" + MessageProvider.AUTHORITY + "/accounts/"), null, null, null, null); boolean isNotEmpty = cursor.moveToFirst(); assertFalse(isNotEmpty); } @Test public void query_forAccounts_withAccount_returnsCursorWithData() { createAccount(); cursor = mMockResolver.query( Uri.parse("content://" + MessageProvider.AUTHORITY + "/accounts/"), null, null, null, null); boolean isNotEmpty = cursor.moveToFirst(); assertTrue(isNotEmpty); } @Test public void query_forAccounts_withAccount_withNoProjection_returnsNumberAndName() { createAccount(); cursor = mMockResolver.query( Uri.parse("content://" + MessageProvider.AUTHORITY + "/accounts/"), null, null, null, null); cursor.moveToFirst(); assertEquals(2, cursor.getColumnCount()); assertEquals(0, cursor.getColumnIndex(MessageProvider.AccountColumns.ACCOUNT_NUMBER)); assertEquals(1, cursor.getColumnIndex(MessageProvider.AccountColumns.ACCOUNT_NAME)); assertEquals(0, cursor.getInt(0)); assertEquals("TestAccount", cursor.getString(1)); } @Test public void query_forInboxMessages_whenEmpty_returnsEmptyCursor() { cursor = mMockResolver.query( Uri.parse("content://" + MessageProvider.AUTHORITY + "/inbox_messages/"), null, null, null, null); boolean isNotEmpty = cursor.moveToFirst(); assertFalse(isNotEmpty); } @Test public void query_forAccountUnreadMessages_whenNoAccount_returnsEmptyCursor() { cursor = mMockResolver.query( Uri.parse("content://" + MessageProvider.AUTHORITY + "/account_unread/0"), null, null, null, null); boolean isNotEmpty = cursor.moveToFirst(); assertFalse(isNotEmpty); } @Test public void query_forAccountUnreadMessages_whenNoMessages_returns0Unread() { createAccount(); cursor = mMockResolver.query( Uri.parse("content://" + MessageProvider.AUTHORITY + "/account_unread/0"), null, null, null, null); cursor.moveToFirst(); assertEquals(2, cursor.getColumnCount()); assertEquals(1, cursor.getColumnIndex(MessageProvider.UnreadColumns.ACCOUNT_NAME)); assertEquals(0, cursor.getColumnIndex(MessageProvider.UnreadColumns.UNREAD)); assertEquals(0, cursor.getInt(0)); assertEquals("TestAccount", cursor.getString(1)); } } k9mail/src/main/java/com/fsck/k9/Account.java +1 −1 Original line number Diff line number Diff line Loading @@ -1840,7 +1840,7 @@ public class Account implements BaseAccount, StoreConfig { } private void excludeSpecialFolder(LocalSearch search, String folderName) { if (!K9.FOLDER_NONE.equals(folderName)) { if (folderName != null && !K9.FOLDER_NONE.equals(folderName)) { search.and(SearchField.FOLDER, folderName, Attribute.NOT_EQUALS); } } Loading k9mail/src/main/java/com/fsck/k9/provider/MessageProvider.java +41 −13 Original line number Diff line number Diff line Loading @@ -70,6 +70,14 @@ public class MessageProvider extends ContentProvider { MessageColumns.DELETE_URI, MessageColumns.SENDER_ADDRESS }; private static final String[] DEFAULT_ACCOUNT_PROJECTION = new String[] { AccountColumns.ACCOUNT_NUMBER, AccountColumns.ACCOUNT_NAME, }; private static final String[] UNREAD_PROJECTION = new String[] { UnreadColumns.ACCOUNT_NAME, UnreadColumns.UNREAD }; private UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH); Loading Loading @@ -316,6 +324,32 @@ public class MessageProvider extends ContentProvider { String INCREMENT = "id"; } public interface AccountColumns { /** * <P>Type: INTEGER</P> */ String ACCOUNT_NUMBER = "accountNumber"; /** * <P>Type: String</P> */ String ACCOUNT_NAME = "accountName"; String ACCOUNT_UUID = "accountUuid"; String ACCOUNT_COLOR = "accountColor"; } public interface UnreadColumns { /** * <P>Type: String</P> */ String ACCOUNT_NAME = "accountName"; /** * <P>Type: INTEGER</P> */ String UNREAD = "unread"; } protected interface QueryHandler { /** * The path this instance is able to respond to. Loading Loading @@ -581,10 +615,6 @@ public class MessageProvider extends ContentProvider { * Retrieve the account list. */ protected class AccountsQueryHandler implements QueryHandler { private static final String FIELD_ACCOUNT_NUMBER = "accountNumber"; private static final String FIELD_ACCOUNT_NAME = "accountName"; private static final String FIELD_ACCOUNT_UUID = "accountUuid"; private static final String FIELD_ACCOUNT_COLOR = "accountColor"; @Override Loading @@ -600,7 +630,7 @@ public class MessageProvider extends ContentProvider { public Cursor getAllAccounts(String[] projection) { if (projection == null) { projection = new String[] { FIELD_ACCOUNT_NUMBER, FIELD_ACCOUNT_NAME }; projection = DEFAULT_ACCOUNT_PROJECTION; } MatrixCursor cursor = new MatrixCursor(projection); Loading @@ -610,13 +640,13 @@ public class MessageProvider extends ContentProvider { int fieldIndex = 0; for (String field : projection) { if (FIELD_ACCOUNT_NUMBER.equals(field)) { if (AccountColumns.ACCOUNT_NUMBER.equals(field)) { values[fieldIndex] = account.getAccountNumber(); } else if (FIELD_ACCOUNT_NAME.equals(field)) { } else if (AccountColumns.ACCOUNT_NAME.equals(field)) { values[fieldIndex] = account.getDescription(); } else if (FIELD_ACCOUNT_UUID.equals(field)) { } else if (AccountColumns.ACCOUNT_UUID.equals(field)) { values[fieldIndex] = account.getUuid(); } else if (FIELD_ACCOUNT_COLOR.equals(field)) { } else if (AccountColumns.ACCOUNT_COLOR.equals(field)) { values[fieldIndex] = account.getChipColor(); } else { values[fieldIndex] = null; Loading Loading @@ -662,9 +692,8 @@ public class MessageProvider extends ContentProvider { } private Cursor getAccountUnread(int accountNumber) { String[] projection = new String[] { "accountName", "unread" }; MatrixCursor cursor = new MatrixCursor(projection); MatrixCursor cursor = new MatrixCursor(UNREAD_PROJECTION); Account myAccount; AccountStats myAccountStats; Loading @@ -682,13 +711,12 @@ public class MessageProvider extends ContentProvider { } else { values[1] = myAccountStats.unreadMessageCount; } cursor.addRow(values); } catch (MessagingException e) { Log.e(K9.LOG_TAG, e.getMessage()); values[0] = "Unknown"; values[1] = 0; } cursor.addRow(values); } } Loading Loading
k9mail/build.gradle +1 −1 Original line number Diff line number Diff line Loading @@ -35,7 +35,7 @@ dependencies { compile 'com.github.amlcurran.showcaseview:library:5.4.1' compile 'com.squareup.moshi:moshi:1.2.0' androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2.1' androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2.2' testCompile "org.robolectric:robolectric:${robolectricVersion}" testCompile "junit:junit:${junitVersion}" Loading
k9mail/src/androidTest/java/com/fsck/k9/provider/MessageProviderTest.java 0 → 100644 +138 −0 Original line number Diff line number Diff line package com.fsck.k9.provider; import android.database.Cursor; import android.net.Uri; import android.support.test.runner.AndroidJUnit4; import android.test.ProviderTestCase2; import android.test.mock.MockContentResolver; import com.fsck.k9.Account; import com.fsck.k9.K9; import com.fsck.k9.Preferences; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import java.util.List; @RunWith(AndroidJUnit4.class) public class MessageProviderTest extends ProviderTestCase2 { private MockContentResolver mMockResolver; private Cursor cursor; public MessageProviderTest() { super(MessageProvider.class, MessageProvider.AUTHORITY); } @Before @Override public void setUp() throws Exception { super.setUp(); mMockResolver = getMockContentResolver(); mContext = K9.app; Preferences preferences = Preferences.getPreferences(getMockContext()); List<Account> accountList = preferences.getAccounts(); for (Account account: accountList) { preferences.deleteAccount(account); } } @After @Override public void tearDown() throws Exception { if (cursor != null) { cursor.close(); } super.tearDown(); } private void createAccount() { Preferences preferences = Preferences.getPreferences(getMockContext()); Account account = preferences.newAccount(); account.setDescription("TestAccount"); account.setChipColor(10); account.setStoreUri("imap://user@domain.com/"); account.save(preferences); } @Test public void query_forAccounts_withNoAccounts_returnsEmptyCursor() { cursor = mMockResolver.query( Uri.parse("content://" + MessageProvider.AUTHORITY + "/accounts/"), null, null, null, null); boolean isNotEmpty = cursor.moveToFirst(); assertFalse(isNotEmpty); } @Test public void query_forAccounts_withAccount_returnsCursorWithData() { createAccount(); cursor = mMockResolver.query( Uri.parse("content://" + MessageProvider.AUTHORITY + "/accounts/"), null, null, null, null); boolean isNotEmpty = cursor.moveToFirst(); assertTrue(isNotEmpty); } @Test public void query_forAccounts_withAccount_withNoProjection_returnsNumberAndName() { createAccount(); cursor = mMockResolver.query( Uri.parse("content://" + MessageProvider.AUTHORITY + "/accounts/"), null, null, null, null); cursor.moveToFirst(); assertEquals(2, cursor.getColumnCount()); assertEquals(0, cursor.getColumnIndex(MessageProvider.AccountColumns.ACCOUNT_NUMBER)); assertEquals(1, cursor.getColumnIndex(MessageProvider.AccountColumns.ACCOUNT_NAME)); assertEquals(0, cursor.getInt(0)); assertEquals("TestAccount", cursor.getString(1)); } @Test public void query_forInboxMessages_whenEmpty_returnsEmptyCursor() { cursor = mMockResolver.query( Uri.parse("content://" + MessageProvider.AUTHORITY + "/inbox_messages/"), null, null, null, null); boolean isNotEmpty = cursor.moveToFirst(); assertFalse(isNotEmpty); } @Test public void query_forAccountUnreadMessages_whenNoAccount_returnsEmptyCursor() { cursor = mMockResolver.query( Uri.parse("content://" + MessageProvider.AUTHORITY + "/account_unread/0"), null, null, null, null); boolean isNotEmpty = cursor.moveToFirst(); assertFalse(isNotEmpty); } @Test public void query_forAccountUnreadMessages_whenNoMessages_returns0Unread() { createAccount(); cursor = mMockResolver.query( Uri.parse("content://" + MessageProvider.AUTHORITY + "/account_unread/0"), null, null, null, null); cursor.moveToFirst(); assertEquals(2, cursor.getColumnCount()); assertEquals(1, cursor.getColumnIndex(MessageProvider.UnreadColumns.ACCOUNT_NAME)); assertEquals(0, cursor.getColumnIndex(MessageProvider.UnreadColumns.UNREAD)); assertEquals(0, cursor.getInt(0)); assertEquals("TestAccount", cursor.getString(1)); } }
k9mail/src/main/java/com/fsck/k9/Account.java +1 −1 Original line number Diff line number Diff line Loading @@ -1840,7 +1840,7 @@ public class Account implements BaseAccount, StoreConfig { } private void excludeSpecialFolder(LocalSearch search, String folderName) { if (!K9.FOLDER_NONE.equals(folderName)) { if (folderName != null && !K9.FOLDER_NONE.equals(folderName)) { search.and(SearchField.FOLDER, folderName, Attribute.NOT_EQUALS); } } Loading
k9mail/src/main/java/com/fsck/k9/provider/MessageProvider.java +41 −13 Original line number Diff line number Diff line Loading @@ -70,6 +70,14 @@ public class MessageProvider extends ContentProvider { MessageColumns.DELETE_URI, MessageColumns.SENDER_ADDRESS }; private static final String[] DEFAULT_ACCOUNT_PROJECTION = new String[] { AccountColumns.ACCOUNT_NUMBER, AccountColumns.ACCOUNT_NAME, }; private static final String[] UNREAD_PROJECTION = new String[] { UnreadColumns.ACCOUNT_NAME, UnreadColumns.UNREAD }; private UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH); Loading Loading @@ -316,6 +324,32 @@ public class MessageProvider extends ContentProvider { String INCREMENT = "id"; } public interface AccountColumns { /** * <P>Type: INTEGER</P> */ String ACCOUNT_NUMBER = "accountNumber"; /** * <P>Type: String</P> */ String ACCOUNT_NAME = "accountName"; String ACCOUNT_UUID = "accountUuid"; String ACCOUNT_COLOR = "accountColor"; } public interface UnreadColumns { /** * <P>Type: String</P> */ String ACCOUNT_NAME = "accountName"; /** * <P>Type: INTEGER</P> */ String UNREAD = "unread"; } protected interface QueryHandler { /** * The path this instance is able to respond to. Loading Loading @@ -581,10 +615,6 @@ public class MessageProvider extends ContentProvider { * Retrieve the account list. */ protected class AccountsQueryHandler implements QueryHandler { private static final String FIELD_ACCOUNT_NUMBER = "accountNumber"; private static final String FIELD_ACCOUNT_NAME = "accountName"; private static final String FIELD_ACCOUNT_UUID = "accountUuid"; private static final String FIELD_ACCOUNT_COLOR = "accountColor"; @Override Loading @@ -600,7 +630,7 @@ public class MessageProvider extends ContentProvider { public Cursor getAllAccounts(String[] projection) { if (projection == null) { projection = new String[] { FIELD_ACCOUNT_NUMBER, FIELD_ACCOUNT_NAME }; projection = DEFAULT_ACCOUNT_PROJECTION; } MatrixCursor cursor = new MatrixCursor(projection); Loading @@ -610,13 +640,13 @@ public class MessageProvider extends ContentProvider { int fieldIndex = 0; for (String field : projection) { if (FIELD_ACCOUNT_NUMBER.equals(field)) { if (AccountColumns.ACCOUNT_NUMBER.equals(field)) { values[fieldIndex] = account.getAccountNumber(); } else if (FIELD_ACCOUNT_NAME.equals(field)) { } else if (AccountColumns.ACCOUNT_NAME.equals(field)) { values[fieldIndex] = account.getDescription(); } else if (FIELD_ACCOUNT_UUID.equals(field)) { } else if (AccountColumns.ACCOUNT_UUID.equals(field)) { values[fieldIndex] = account.getUuid(); } else if (FIELD_ACCOUNT_COLOR.equals(field)) { } else if (AccountColumns.ACCOUNT_COLOR.equals(field)) { values[fieldIndex] = account.getChipColor(); } else { values[fieldIndex] = null; Loading Loading @@ -662,9 +692,8 @@ public class MessageProvider extends ContentProvider { } private Cursor getAccountUnread(int accountNumber) { String[] projection = new String[] { "accountName", "unread" }; MatrixCursor cursor = new MatrixCursor(projection); MatrixCursor cursor = new MatrixCursor(UNREAD_PROJECTION); Account myAccount; AccountStats myAccountStats; Loading @@ -682,13 +711,12 @@ public class MessageProvider extends ContentProvider { } else { values[1] = myAccountStats.unreadMessageCount; } cursor.addRow(values); } catch (MessagingException e) { Log.e(K9.LOG_TAG, e.getMessage()); values[0] = "Unknown"; values[1] = 0; } cursor.addRow(values); } } Loading