diff --git a/src/com/android/email/mail/store/LocalStore.java b/src/com/android/email/mail/store/LocalStore.java index 437e864d9..1891cf230 100644 --- a/src/com/android/email/mail/store/LocalStore.java +++ b/src/com/android/email/mail/store/LocalStore.java @@ -411,10 +411,6 @@ public class LocalStore extends Store { /** * Set the visible limit for all folders in a given store. * - * NOTE: Does Not update cached values for any held Folder objects. This is - * intended only for use at startup time. To reset the value for any given folder, use - * {@link LocalFolder#setVisibleLimit(int)}. - * * @param visibleLimit the value to write to all folders. -1 may also be used as a marker. */ public void resetVisibleLimits(int visibleLimit) { @@ -604,11 +600,26 @@ public class LocalStore extends Store { @Override public int getUnreadMessageCount() throws MessagingException { - open(OpenMode.READ_WRITE); + if (!isOpen()) { + // opening it will read all columns including mUnreadMessageCount + open(OpenMode.READ_WRITE); + } else { + // already open. refresh from db in case another instance wrote to it + Cursor cursor = null; + try { + cursor = mDb.rawQuery("SELECT unread_count FROM folders WHERE folders.name = ?", + new String[] { mName }); + cursor.moveToFirst(); + mUnreadMessageCount = cursor.getInt(0); + } finally { + if (cursor != null) { + cursor.close(); + } + } + } return mUnreadMessageCount; } - public void setUnreadMessageCount(int unreadMessageCount) throws MessagingException { open(OpenMode.READ_WRITE); mUnreadMessageCount = Math.max(0, unreadMessageCount); @@ -617,11 +628,27 @@ public class LocalStore extends Store { } public int getVisibleLimit() throws MessagingException { - open(OpenMode.READ_WRITE); + if (!isOpen()) { + // opening it will read all columns including mVisibleLimit + open(OpenMode.READ_WRITE); + } else { + // already open. refresh from db in case another instance wrote to it + Cursor cursor = null; + try { + cursor = mDb.rawQuery( + "SELECT visible_limit FROM folders WHERE folders.name = ?", + new String[] { mName }); + cursor.moveToFirst(); + mVisibleLimit = cursor.getInt(0); + } finally { + if (cursor != null) { + cursor.close(); + } + } + } return mVisibleLimit; } - public void setVisibleLimit(int visibleLimit) throws MessagingException { open(OpenMode.READ_WRITE); mVisibleLimit = visibleLimit; diff --git a/tests/src/com/android/email/mail/store/LocalStoreUnitTests.java b/tests/src/com/android/email/mail/store/LocalStoreUnitTests.java index 95aa57a62..c01ee40e4 100644 --- a/tests/src/com/android/email/mail/store/LocalStoreUnitTests.java +++ b/tests/src/com/android/email/mail/store/LocalStoreUnitTests.java @@ -65,6 +65,8 @@ public class LocalStoreUnitTests extends AndroidTestCase { private static final int DATABASE_VERSION = 23; + private static final String FOLDER_NAME = "TEST"; + /* These values are provided by setUp() */ private String mLocalStoreUri = null; private LocalStore mStore = null; @@ -83,7 +85,7 @@ public class LocalStoreUnitTests extends AndroidTestCase { mLocalStoreUri = "local://localhost/" + getContext().getDatabasePath(dbName); mStore = (LocalStore) LocalStore.newInstance(mLocalStoreUri, getContext(), null); - mFolder = (LocalStore.LocalFolder) mStore.getFolder("TEST"); + mFolder = (LocalStore.LocalFolder) mStore.getFolder(FOLDER_NAME); // This is needed for parsing mime messages mCacheDir = getContext().getCacheDir(); @@ -632,6 +634,47 @@ public class LocalStoreUnitTests extends AndroidTestCase { assertEquals(failMessage, expectedUids, actualUids); } + /** + * Test unread messages count + */ + public void testUnreadMessages() throws MessagingException { + mFolder.open(OpenMode.READ_WRITE, null); + + // set up a 2nd folder to confirm independent storage + LocalStore.LocalFolder folder2 = (LocalStore.LocalFolder) mStore.getFolder("FOLDER-2"); + assertFalse(folder2.exists()); + folder2.create(FolderType.HOLDS_MESSAGES); + folder2.open(OpenMode.READ_WRITE, null); + + // read and write, look for independent storage + mFolder.setUnreadMessageCount(400); + folder2.setUnreadMessageCount(425); + + mFolder.close(false); + folder2.close(false); + mFolder.open(OpenMode.READ_WRITE, null); + folder2.open(OpenMode.READ_WRITE, null); + + assertEquals(400, mFolder.getUnreadMessageCount()); + assertEquals(425, folder2.getUnreadMessageCount()); + } + + /** + * Test unread messages count - concurrent access via two folder objects + */ + public void testUnreadMessagesConcurrent() throws MessagingException { + mFolder.open(OpenMode.READ_WRITE, null); + + // set up a 2nd folder to confirm concurrent access + LocalStore.LocalFolder folder2 = (LocalStore.LocalFolder) mStore.getFolder(FOLDER_NAME); + assertTrue(folder2.exists()); + folder2.open(OpenMode.READ_WRITE, null); + + // read and write, look for concurrent storage + mFolder.setUnreadMessageCount(450); + assertEquals(450, folder2.getUnreadMessageCount()); + } + /** * Test visible limits support */ @@ -657,6 +700,22 @@ public class LocalStoreUnitTests extends AndroidTestCase { assertEquals(200, folder2.getVisibleLimit()); } + /** + * Test visible limits support - concurrent access via two folder objects + */ + public void testVisibleLimitsConcurrent() throws MessagingException { + mFolder.open(OpenMode.READ_WRITE, null); + + // set up a 2nd folder to confirm concurrent access + LocalStore.LocalFolder folder2 = (LocalStore.LocalFolder) mStore.getFolder(FOLDER_NAME); + assertTrue(folder2.exists()); + folder2.open(OpenMode.READ_WRITE, null); + + // read and write, look for concurrent storage + mFolder.setVisibleLimit(300); + assertEquals(300, folder2.getVisibleLimit()); + } + /** * Test reset limits support */ @@ -679,18 +738,11 @@ public class LocalStoreUnitTests extends AndroidTestCase { folder2.open(OpenMode.READ_WRITE, null); mStore.resetVisibleLimits(Email.VISIBLE_LIMIT_DEFAULT); - // NOTE: The open folders do not change, because resetVisibleLimits() resets the - // database only. - assertEquals(100, mFolder.getVisibleLimit()); - assertEquals(200, folder2.getVisibleLimit()); + assertEquals(Email.VISIBLE_LIMIT_DEFAULT, mFolder.getVisibleLimit()); + assertEquals(Email.VISIBLE_LIMIT_DEFAULT, folder2.getVisibleLimit()); mFolder.close(false); folder2.close(false); - mFolder.open(OpenMode.READ_WRITE, null); - folder2.open(OpenMode.READ_WRITE, null); - - assertEquals(Email.VISIBLE_LIMIT_DEFAULT, mFolder.getVisibleLimit()); - assertEquals(Email.VISIBLE_LIMIT_DEFAULT, folder2.getVisibleLimit()); } /**