Snap for 4447680 from 5a81ab05210d83d0734a3a1b63bf2f3d7b8f4840 to pi-release

Change-Id: I4da97344e94094b2489ced3aa1e8d661b3f8b46a
diff --git a/robotests/src/com/android/keychain/internal/GrantsDatabaseTest.java b/robotests/src/com/android/keychain/internal/GrantsDatabaseTest.java
index 9dd5946..ecb0889 100644
--- a/robotests/src/com/android/keychain/internal/GrantsDatabaseTest.java
+++ b/robotests/src/com/android/keychain/internal/GrantsDatabaseTest.java
@@ -16,6 +16,10 @@
 
 package com.android.keychain.internal;
 
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import android.content.pm.PackageManager;
 import com.android.keychain.TestConfig;
 import org.junit.Assert;
 import org.junit.Before;
@@ -96,6 +100,33 @@
     }
 
     @Test
+    public void testPurgeOldGrantsDoesNotDeleteGrantsForExistingPackages() {
+        mGrantsDB.setGrant(DUMMY_UID, DUMMY_ALIAS, true);
+        PackageManager pm = mock(PackageManager.class);
+        when(pm.getPackagesForUid(DUMMY_UID)).thenReturn(new String[]{"p"});
+        mGrantsDB.purgeOldGrants(pm);
+        Assert.assertTrue(mGrantsDB.hasGrant(DUMMY_UID, DUMMY_ALIAS));
+    }
+
+    @Test
+    public void testPurgeOldGrantsPurgesAllNonExistingPackages() {
+        mGrantsDB.setGrant(DUMMY_UID, DUMMY_ALIAS, true);
+        mGrantsDB.setGrant(DUMMY_UID2, DUMMY_ALIAS, true);
+        PackageManager pm = mock(PackageManager.class);
+        when(pm.getPackagesForUid(DUMMY_UID)).thenReturn(null);
+        when(pm.getPackagesForUid(DUMMY_UID2)).thenReturn(null);
+        mGrantsDB.purgeOldGrants(pm);
+        Assert.assertFalse(mGrantsDB.hasGrant(DUMMY_UID, DUMMY_ALIAS));
+        Assert.assertFalse(mGrantsDB.hasGrant(DUMMY_UID2, DUMMY_ALIAS));
+    }
+
+    @Test
+    public void testPurgeOldGrantsWorksOnEmptyDatabase() {
+        // Check that NPE is not thrown.
+        mGrantsDB.purgeOldGrants(null);
+    }
+
+    @Test
     public void testIsUserSelectable() {
         Assert.assertFalse(mGrantsDB.isUserSelectable(DUMMY_ALIAS));
         mGrantsDB.setIsUserSelectable(DUMMY_ALIAS, true);
diff --git a/src/com/android/keychain/internal/GrantsDatabase.java b/src/com/android/keychain/internal/GrantsDatabase.java
index 4783378..28605b5 100644
--- a/src/com/android/keychain/internal/GrantsDatabase.java
+++ b/src/com/android/keychain/internal/GrantsDatabase.java
@@ -154,19 +154,11 @@
 
     public void purgeOldGrants(PackageManager pm) {
         final SQLiteDatabase db = mDatabaseHelper.getWritableDatabase();
-        Cursor cursor = null;
         db.beginTransaction();
-        try {
-            cursor =
-                    db.query(
-                            TABLE_GRANTS,
-                            new String[] {GRANTS_GRANTEE_UID},
-                            null,
-                            null,
-                            GRANTS_GRANTEE_UID,
-                            null,
-                            null);
-            while (cursor.moveToNext()) {
+        try (Cursor cursor = db.query(
+                TABLE_GRANTS,
+                new String[] {GRANTS_GRANTEE_UID}, null, null, GRANTS_GRANTEE_UID, null, null)) {
+            while ((cursor != null) && (cursor.moveToNext())) {
                 final int uid = cursor.getInt(0);
                 final boolean packageExists = pm.getPackagesForUid(uid) != null;
                 if (packageExists) {
@@ -181,12 +173,9 @@
                         new String[] {Integer.toString(uid)});
             }
             db.setTransactionSuccessful();
-        } finally {
-            if (cursor != null) {
-                cursor.close();
-            }
-            db.endTransaction();
         }
+
+        db.endTransaction();
     }
 
     public void setIsUserSelectable(final String alias, final boolean userSelectable) {