OSDN Git Service

Add delete cascade for Accounts.
authorGeorge Mount <mount@google.com>
Tue, 12 Mar 2013 20:13:21 +0000 (13:13 -0700)
committerGeorge Mount <mount@google.com>
Tue, 12 Mar 2013 20:51:01 +0000 (13:51 -0700)
Change-Id: I962c7cb657643c3eddbbeb6a691b26de5553d4df

src/com/android/photos/data/PhotoProvider.java
tests/src/com/android/photos/data/PhotoDatabaseUtils.java
tests/src/com/android/photos/data/PhotoProviderTest.java

index c4cc903..084401d 100644 (file)
@@ -502,15 +502,17 @@ public class PhotoProvider extends SQLiteContentProvider {
             String[] selectionArgs, Uri uri) {
         switch (match) {
             case MATCH_PHOTO:
-            case MATCH_PHOTO_ID: {
+            case MATCH_PHOTO_ID:
                 deleteCascadeMetadata(db, selection, selectionArgs);
                 break;
-            }
             case MATCH_ALBUM:
-            case MATCH_ALBUM_ID: {
+            case MATCH_ALBUM_ID:
                 deleteCascadePhotos(db, selection, selectionArgs);
                 break;
-            }
+            case MATCH_ACCOUNT:
+            case MATCH_ACCOUNT_ID:
+                deleteCascadeAccounts(db, selection, selectionArgs);
+                break;
         }
         String table = getTableFromMatch(match, uri);
         int deleted = db.delete(table, selection, selectionArgs);
@@ -520,6 +522,17 @@ public class PhotoProvider extends SQLiteContentProvider {
         return deleted;
     }
 
+    private void deleteCascadeAccounts(SQLiteDatabase db, String accountSelect, String[] args) {
+        // Delete all photos associated with the account
+        String photoWhere = nestWhere(Photos.ACCOUNT_ID, Accounts.TABLE, accountSelect);
+        deleteCascadeMetadata(db, photoWhere, args);
+        db.delete(Photos.TABLE, photoWhere, args);
+
+        // Delete all albums that are associated with this account
+        String albumWhere = nestWhere(Albums.ACCOUNT_ID, Accounts.TABLE, accountSelect);
+        db.delete(Albums.TABLE, albumWhere, args);
+    }
+
     private void deleteCascadePhotos(SQLiteDatabase db, String albumSelect,
             String[] selectArgs) {
         String photoWhere = nestWhere(Photos.ALBUM_ID, Albums.TABLE, albumSelect);
index 97db8bf..f7a46d4 100644 (file)
@@ -65,6 +65,7 @@ public class PhotoDatabaseUtils {
 
     private static String SELECTION_ALBUM_PARENT_ID = Albums.PARENT_ID + " = ?";
     private static String SELECTION_PHOTO_ALBUM_ID = Photos.ALBUM_ID + " = ?";
+    private static String SELECTION_ACCOUNT_ID = Accounts.ACCOUNT_NAME + " = ?";
 
     public static long queryAlbumIdFromParentId(SQLiteDatabase db, long parentId) {
         return queryId(db, Albums.TABLE, PROJECTION_ALBUMS, SELECTION_ALBUM_PARENT_ID, parentId);
@@ -74,6 +75,10 @@ public class PhotoDatabaseUtils {
         return queryId(db, Photos.TABLE, PROJECTION_PHOTOS, SELECTION_PHOTO_ALBUM_ID, albumId);
     }
 
+    public static long queryAccountIdFromName(SQLiteDatabase db, String accountName) {
+        return queryId(db, Accounts.TABLE, PROJECTION_ACCOUNTS, SELECTION_ACCOUNT_ID, accountName);
+    }
+
     public static long queryId(SQLiteDatabase db, String table, String[] projection,
             String selection, Object parameter) {
         String paramString = parameter == null ? null : parameter.toString();
index 39abff4..685946e 100644 (file)
@@ -28,6 +28,7 @@ import android.os.RemoteException;
 import android.provider.BaseColumns;
 import android.test.ProviderTestCase2;
 
+import com.android.photos.data.PhotoProvider.Accounts;
 import com.android.photos.data.PhotoProvider.Albums;
 import com.android.photos.data.PhotoProvider.Metadata;
 import com.android.photos.data.PhotoProvider.Photos;
@@ -43,6 +44,7 @@ public class PhotoProviderTest extends ProviderTestCase2<PhotoProvider> {
     private static final long ALBUM_PARENT_ID = 100;
     private static final String META_KEY = "mykey";
     private static final String META_VALUE = "myvalue";
+    private static final String ACCOUNT_NAME = "foo@bar.com";
 
     private static final Uri NO_TABLE_URI = PhotoProvider.BASE_CONTENT_URI;
     private static final Uri BAD_TABLE_URI = Uri.withAppendedPath(PhotoProvider.BASE_CONTENT_URI,
@@ -55,6 +57,7 @@ public class PhotoProviderTest extends ProviderTestCase2<PhotoProvider> {
     private long mAlbumId;
     private long mPhotoId;
     private long mMetadataId;
+    private long mAccountId;
 
     private SQLiteOpenHelper mDBHelper;
     private ContentResolver mResolver;
@@ -74,11 +77,13 @@ public class PhotoProviderTest extends ProviderTestCase2<PhotoProvider> {
         SQLiteDatabase db = mDBHelper.getWritableDatabase();
         db.beginTransaction();
         try {
+            PhotoDatabaseUtils.insertAccount(db, ACCOUNT_NAME);
+            mAccountId = PhotoDatabaseUtils.queryAccountIdFromName(db, ACCOUNT_NAME);
             PhotoDatabaseUtils.insertAlbum(db, ALBUM_PARENT_ID, ALBUM_TITLE,
-                    Albums.VISIBILITY_PRIVATE, 100L);
+                    Albums.VISIBILITY_PRIVATE, mAccountId);
             mAlbumId = PhotoDatabaseUtils.queryAlbumIdFromParentId(db, ALBUM_PARENT_ID);
             PhotoDatabaseUtils.insertPhoto(db, 100, 100, System.currentTimeMillis(), mAlbumId,
-                    MIME_TYPE, 100L);
+                    MIME_TYPE, mAccountId);
             mPhotoId = PhotoDatabaseUtils.queryPhotoIdFromAlbumId(db, mAlbumId);
             PhotoDatabaseUtils.insertMetadata(db, mPhotoId, META_KEY, META_VALUE);
             String[] projection = {
@@ -180,6 +185,33 @@ public class PhotoProviderTest extends ProviderTestCase2<PhotoProvider> {
         cursor.close();
     }
 
+    public void testDeleteAccountCascade() {
+        Uri accountUri = ContentUris.withAppendedId(Accounts.CONTENT_URI, mAccountId);
+        SQLiteDatabase db = mDBHelper.getWritableDatabase();
+        db.beginTransaction();
+        PhotoDatabaseUtils.insertPhoto(db, 100, 100, System.currentTimeMillis(), null,
+                "image/jpeg", mAccountId);
+        PhotoDatabaseUtils.insertPhoto(db, 100, 100, System.currentTimeMillis(), null,
+                "image/jpeg", 0L);
+        PhotoDatabaseUtils.insertAlbum(db, null, "title", Albums.VISIBILITY_PRIVATE, 10630L);
+        db.setTransactionSuccessful();
+        db.endTransaction();
+        // ensure all pictures are there:
+        Cursor cursor = mResolver.query(Photos.CONTENT_URI, null, null, null, null);
+        assertEquals(3, cursor.getCount());
+        cursor.close();
+        // delete the account
+        assertEquals(1, mResolver.delete(accountUri, null, null));
+        // now ensure that all associated photos were deleted
+        cursor = mResolver.query(Photos.CONTENT_URI, null, null, null, null);
+        assertEquals(1, cursor.getCount());
+        cursor.close();
+        // now ensure all associated albums were deleted.
+        cursor = mResolver.query(Albums.CONTENT_URI, null, null, null, null);
+        assertEquals(1, cursor.getCount());
+        cursor.close();
+    }
+
     public void testGetType() {
         // We don't return types for albums
         assertNull(mResolver.getType(Albums.CONTENT_URI));