Bug 1381001 - Bump the folder's last modified timestamp when deleting it. r?Grisha
MozReview-Commit-ID: DeBZatIrDVg
--- a/mobile/android/base/java/org/mozilla/gecko/db/BrowserProvider.java
+++ b/mobile/android/base/java/org/mozilla/gecko/db/BrowserProvider.java
@@ -2240,16 +2240,19 @@ public class BrowserProvider extends Sha
values.putNull(Bookmarks.PARENT);
values.putNull(Bookmarks.URL);
values.putNull(Bookmarks.TITLE);
values.putNull(Bookmarks.DESCRIPTION);
values.putNull(Bookmarks.KEYWORD);
values.putNull(Bookmarks.TAGS);
values.putNull(Bookmarks.FAVICON_ID);
+ // Bump the lastModified timestamp for sync to know to update bookmark records.
+ values.put(Bookmarks.DATE_MODIFIED, System.currentTimeMillis());
+
// Leave space for variables in values.
final int maxVariableNumber = DBUtils.SQLITE_MAX_VARIABLE_NUMBER - values.size();
for (int chunk = 0; chunk <= bookmarkGUIDs.size() / maxVariableNumber; chunk++) {
final int chunkStart = chunk * maxVariableNumber;
int chunkEnd = (chunk + 1) * maxVariableNumber;
if (chunkEnd > bookmarkGUIDs.size()) {
chunkEnd = bookmarkGUIDs.size();
--- a/mobile/android/tests/background/junit4/src/org/mozilla/gecko/db/BrowserProviderBookmarksTest.java
+++ b/mobile/android/tests/background/junit4/src/org/mozilla/gecko/db/BrowserProviderBookmarksTest.java
@@ -31,16 +31,17 @@ import static org.junit.Assert.assertTru
/**
* Testing direct interactions with bookmarks through BrowserProvider
*/
@RunWith(TestRunner.class)
public class BrowserProviderBookmarksTest {
private static final long INVALID_ID = -1;
+ private static final long INVALID_TIMESTAMP = -1;
private ContentProviderClient bookmarksClient;
private Uri bookmarksTestUri;
private BrowserProvider provider;
@Before
public void setUp() throws Exception {
provider = new BrowserProvider();
@@ -137,16 +138,60 @@ public class BrowserProviderBookmarksTes
BrowserContract.Bookmarks.GUID + " = ?",
new String[] { "parent" });
// 4 = parent, its two children, mobile root.
assertEquals(4, changed);
}
@Test
+ public void testBookmarkFolderLastModifiedOnDeletion() throws RemoteException {
+ final long rootId = getBookmarkIdFromGuid(BrowserContract.Bookmarks.MOBILE_FOLDER_GUID);
+
+ // root
+ // -> sibling
+ // -> parent -- timestamp must change
+ // ---> child-1
+ // ---> child-2 -- delete this one
+
+ final Uri parentUri = insertBookmark("parent", null, "parent", rootId,
+ BrowserContract.Bookmarks.TYPE_FOLDER);
+ final Uri siblingUri = insertBookmark("sibling", null, "sibling", rootId,
+ BrowserContract.Bookmarks.TYPE_FOLDER);
+
+ final long parentId = Long.parseLong(parentUri.getLastPathSegment());
+ final Uri child1Uri = insertBookmark("child-1", null, "child-1", parentId,
+ BrowserContract.Bookmarks.TYPE_FOLDER);
+ final Uri child2Uri = insertBookmark("child-2", null, "child-2", parentId,
+ BrowserContract.Bookmarks.TYPE_FOLDER);
+
+ final long parentLastModifiedBeforeDeletion = getLastModified(parentUri);
+ final long siblingLastModifiedBeforeDeletion = getLastModified(siblingUri);
+
+ final long child1LastModifiedBeforeDeletion = getLastModified(child1Uri);
+ final long child2LastModifiedBeforeDeletion = getLastModified(child2Uri);
+
+ bookmarksClient.delete(child2Uri, null, null);
+
+ final long parentLastModifiedAfterDeletion = getLastModified(parentUri);
+ final long siblingLastModifiedAfterDeletion = getLastModified(siblingUri);
+
+ final long child1LastModifiedAfterDeletion = getLastModified(child1Uri);
+ final long child2LastModifiedAfterDeletion = getLastModified(withDeleted(child2Uri));
+
+ // Check last modified timestamp of parent and child-2 is increased.
+ assertTrue(parentLastModifiedAfterDeletion > parentLastModifiedBeforeDeletion);
+ assertTrue(child2LastModifiedAfterDeletion > child2LastModifiedBeforeDeletion);
+
+ // Check last modified timestamp of sibling and child-1 is not changed.
+ assertTrue(siblingLastModifiedBeforeDeletion == siblingLastModifiedAfterDeletion);
+ assertTrue(child1LastModifiedBeforeDeletion == child1LastModifiedAfterDeletion);
+ }
+
+ @Test
public void testDeleteBookmarkFolder() throws RemoteException {
final long rootId = getBookmarkIdFromGuid(BrowserContract.Bookmarks.MOBILE_FOLDER_GUID);
// Create a folder.
final Uri parentUri = insertBookmark("parent", null, "parent", rootId,
BrowserContract.Bookmarks.TYPE_FOLDER);
final long parentId = Long.parseLong(parentUri.getLastPathSegment());
@@ -235,16 +280,36 @@ public class BrowserProviderBookmarksTes
private Uri testUri(Uri baseUri) {
return baseUri.buildUpon().appendQueryParameter(BrowserContract.PARAM_IS_TEST, "1").build();
}
private Uri withDeleted(Uri baseUri) {
return baseUri.buildUpon().appendQueryParameter(BrowserContract.PARAM_SHOW_DELETED, "true").build();
}
+ private long getLastModified(final Uri uri) throws RemoteException {
+ final Cursor cursor = bookmarksClient.query(uri,
+ new String[] { BrowserContract.Bookmarks.DATE_MODIFIED },
+ null,
+ null,
+ null);
+ assertNotNull(cursor);
+
+ long lastModified = INVALID_TIMESTAMP;
+ try {
+ assertTrue(cursor.moveToFirst());
+ assertEquals(1, cursor.getCount());
+ lastModified = cursor.getLong(cursor.getColumnIndexOrThrow(BrowserContract.Bookmarks.DATE_MODIFIED));
+ } finally {
+ cursor.close();
+ }
+ assertNotEquals(lastModified, INVALID_TIMESTAMP);
+ return lastModified;
+ }
+
private long getBookmarkIdFromGuid(String guid) throws RemoteException {
Cursor cursor = bookmarksClient.query(BrowserContract.Bookmarks.CONTENT_URI,
new String[] { BrowserContract.Bookmarks._ID },
BrowserContract.Bookmarks.GUID + " = ?",
new String[] { guid },
null);
assertNotNull(cursor);