diff options
author | android-build-team Robot <android-build-team-robot@google.com> | 2021-06-07 22:28:21 +0000 |
---|---|---|
committer | android-build-team Robot <android-build-team-robot@google.com> | 2021-06-07 22:28:21 +0000 |
commit | 9ddac338bf65926e9ff9bc720acb5dcf76a15fdc (patch) | |
tree | a1eeea9ba2c559d974ed8d1bcc67caa5f458aea9 | |
parent | 6f48e9e1def328bcb19a1a4c913834ff67d8845c (diff) | |
parent | ca2ab19dc76516a311b03d708094662518899c85 (diff) | |
download | ContactsProvider-9ddac338bf65926e9ff9bc720acb5dcf76a15fdc.tar.gz |
Snap for 7434874 from ca2ab19dc76516a311b03d708094662518899c85 to sc-mainline-release
Change-Id: If5286b310aefd9255b53e919e0205ee76ecae2b7
3 files changed, 45 insertions, 47 deletions
diff --git a/src/com/android/providers/contacts/CallLogProvider.java b/src/com/android/providers/contacts/CallLogProvider.java index b1337975..c832e9b4 100644 --- a/src/com/android/providers/contacts/CallLogProvider.java +++ b/src/com/android/providers/contacts/CallLogProvider.java @@ -193,7 +193,7 @@ public class CallLogProvider extends ContentProvider { CALL_COMPOSER_PICTURE); } - private static final ArrayMap<String, String> sCallsProjectionMap; + public static final ArrayMap<String, String> sCallsProjectionMap; static { // Calls projection map @@ -806,19 +806,8 @@ public class CallLogProvider extends ContentProvider { SelectionBuilder selectionBuilder = new SelectionBuilder(selection); checkVoicemailPermissionAndAddRestriction(uri, selectionBuilder, false /*isQuery*/); - - final SQLiteQueryBuilder qb = new SQLiteQueryBuilder(); - qb.setTables(Tables.CALLS); - qb.setProjectionMap(sCallsProjectionMap); - qb.setStrict(true); - // If the caller doesn't have READ_VOICEMAIL, make sure they can't - // do any SQL shenanigans to get access to the voicemails. If the caller does have the - // READ_VOICEMAIL permission, then they have sufficient permissions to access any data in - // the database, so the strict check is unnecessary. - if (!mVoicemailPermissions.callerHasReadAccess(getCallingPackage())) { - qb.setStrictGrammar(true); - } - + boolean hasReadVoicemailPermission = mVoicemailPermissions.callerHasReadAccess( + getCallingPackage()); final SQLiteDatabase db = mDbHelper.getWritableDatabase(); final int matchedUriId = sURIMatcher.match(uri); switch (matchedUriId) { @@ -833,11 +822,8 @@ public class CallLogProvider extends ContentProvider { throw new UnsupportedOperationException("Cannot update URL: " + uri); } - int rowsUpdated = qb.update(db, values, selectionBuilder.build(), selectionArgs); - if (rowsUpdated > 0) { - DbModifierWithNotification.notifyCallLogChange(getContext()); - } - return rowsUpdated; + return createDatabaseModifier(db, hasReadVoicemailPermission).update(uri, Tables.CALLS, + values, selectionBuilder.build(), selectionArgs); } private int deleteInternal(Uri uri, String selection, String[] selectionArgs) { @@ -852,29 +838,14 @@ public class CallLogProvider extends ContentProvider { SelectionBuilder selectionBuilder = new SelectionBuilder(selection); checkVoicemailPermissionAndAddRestriction(uri, selectionBuilder, false /*isQuery*/); - final SQLiteQueryBuilder qb = new SQLiteQueryBuilder(); - qb.setTables(Tables.CALLS); - qb.setProjectionMap(sCallsProjectionMap); - qb.setStrict(true); - // If the caller doesn't have READ_VOICEMAIL, make sure they can't - // do any SQL shenanigans to get access to the voicemails. If the caller does have the - // READ_VOICEMAIL permission, then they have sufficient permissions to access any data in - // the database, so the strict check is unnecessary. - if (!mVoicemailPermissions.callerHasReadAccess(getCallingPackage())) { - qb.setStrictGrammar(true); - } - + boolean hasReadVoicemailPermission = + mVoicemailPermissions.callerHasReadAccess(getCallingPackage()); final SQLiteDatabase db = mDbHelper.getWritableDatabase(); final int matchedUriId = sURIMatcher.match(uri); switch (matchedUriId) { case CALLS: - // TODO: Special case - We may want to forward the delete request on user 0 to the - // shadow provider too. - int deletedCount = qb.delete(db, selectionBuilder.build(), selectionArgs); - if (deletedCount > 0) { - DbModifierWithNotification.notifyCallLogChange(getContext()); - } - return deletedCount; + return createDatabaseModifier(db, hasReadVoicemailPermission).delete(Tables.CALLS, + selectionBuilder.build(), selectionArgs); case CALL_COMPOSER_PICTURE: // TODO(hallliu): implement deletion of file when the corresponding calllog entry // gets deleted as well. @@ -892,8 +863,9 @@ public class CallLogProvider extends ContentProvider { * Returns a {@link DatabaseModifier} that takes care of sending necessary notifications * after the operation is performed. */ - private DatabaseModifier createDatabaseModifier(SQLiteDatabase db) { - return new DbModifierWithNotification(Tables.CALLS, db, getContext()); + private DatabaseModifier createDatabaseModifier(SQLiteDatabase db, boolean hasReadVoicemail) { + return new DbModifierWithNotification(Tables.CALLS, db, null, hasReadVoicemail, + getContext()); } /** diff --git a/src/com/android/providers/contacts/ContactsProvider2.java b/src/com/android/providers/contacts/ContactsProvider2.java index ca6aaad2..4b2b37ae 100644 --- a/src/com/android/providers/contacts/ContactsProvider2.java +++ b/src/com/android/providers/contacts/ContactsProvider2.java @@ -2319,12 +2319,12 @@ public class ContactsProvider2 extends AbstractContactsProvider try { mDbHelper.get().createSimAccountIdInTransaction( AccountWithDataSet.get(accountName, accountType, null), simSlot, efType); - getContext().sendBroadcast(new Intent(SimContacts.ACTION_SIM_ACCOUNTS_CHANGED)); db.setTransactionSuccessful(); - return response; } finally { db.endTransaction(); } + getContext().sendBroadcast(new Intent(SimContacts.ACTION_SIM_ACCOUNTS_CHANGED)); + return response; } else if (SimContacts.REMOVE_SIM_ACCOUNT_METHOD.equals(method)) { ContactsPermissions.enforceCallingOrSelfPermission(getContext(), MANAGE_SIM_ACCOUNTS_PERMISSION); @@ -2338,13 +2338,13 @@ public class ContactsProvider2 extends AbstractContactsProvider db.beginTransaction(); try { mDbHelper.get().removeSimAccounts(simSlot); - getContext().sendBroadcast(new Intent(SimContacts.ACTION_SIM_ACCOUNTS_CHANGED)); scheduleBackgroundTask(BACKGROUND_TASK_UPDATE_ACCOUNTS); db.setTransactionSuccessful(); - return response; } finally { db.endTransaction(); } + getContext().sendBroadcast(new Intent(SimContacts.ACTION_SIM_ACCOUNTS_CHANGED)); + return response; } else if (SimContacts.QUERY_SIM_ACCOUNTS_METHOD.equals(method)) { ContactsPermissions.enforceCallingOrSelfPermission(getContext(), READ_PERMISSION); final Bundle response = new Bundle(); diff --git a/src/com/android/providers/contacts/DbModifierWithNotification.java b/src/com/android/providers/contacts/DbModifierWithNotification.java index 03ebd1f1..dc74c0ab 100644 --- a/src/com/android/providers/contacts/DbModifierWithNotification.java +++ b/src/com/android/providers/contacts/DbModifierWithNotification.java @@ -27,6 +27,7 @@ import android.content.Intent; import android.database.Cursor; import android.database.DatabaseUtils.InsertHelper; import android.database.sqlite.SQLiteDatabase; +import android.database.sqlite.SQLiteQueryBuilder; import android.net.Uri; import android.os.Binder; import android.provider.CallLog.Calls; @@ -65,6 +66,7 @@ public class DbModifierWithNotification implements DatabaseModifier { Voicemails.DELETED + " == 0"; private final String mTableName; private final SQLiteDatabase mDb; + private final boolean mHasReadVoicemailPermission; private final InsertHelper mInsertHelper; private final Context mContext; private final Uri mBaseUri; @@ -86,8 +88,14 @@ public class DbModifierWithNotification implements DatabaseModifier { private DbModifierWithNotification(String tableName, SQLiteDatabase db, InsertHelper insertHelper, Context context) { + this(tableName, db, insertHelper, true /* hasReadVoicemail */, context); + } + + public DbModifierWithNotification(String tableName, SQLiteDatabase db, + InsertHelper insertHelper, boolean hasReadVoicemailPermission, Context context) { mTableName = tableName; mDb = db; + mHasReadVoicemailPermission = hasReadVoicemailPermission; mInsertHelper = insertHelper; mContext = context; mBaseUri = mTableName.equals(Tables.VOICEMAIL_STATUS) ? @@ -196,7 +204,16 @@ public class DbModifierWithNotification implements DatabaseModifier { if (values.isEmpty()) { return 0; } - int count = mDb.update(table, values, whereClause, whereArgs); + + final SQLiteQueryBuilder qb = new SQLiteQueryBuilder(); + qb.setTables(mTableName); + qb.setProjectionMap(CallLogProvider.sCallsProjectionMap); + qb.setStrict(true); + if (!mHasReadVoicemailPermission) { + qb.setStrictGrammar(true); + } + int count = qb.update(mDb, values, whereClause, whereArgs); + if (count > 0 && isVoicemailContent || Tables.VOICEMAIL_STATUS.equals(table)) { notifyVoicemailChange(mBaseUri, packagesModified); } @@ -269,14 +286,23 @@ public class DbModifierWithNotification implements DatabaseModifier { // If the deletion is being made by the package that inserted the voicemail or by // CP2 (cleanup after uninstall), then we don't need to wait for sync, so just delete it. final int count; + + final SQLiteQueryBuilder qb = new SQLiteQueryBuilder(); + qb.setTables(mTableName); + qb.setProjectionMap(CallLogProvider.sCallsProjectionMap); + qb.setStrict(true); + if (!mHasReadVoicemailPermission) { + qb.setStrictGrammar(true); + } + if (mIsCallsTable && isVoicemail && !isSelfModifyingOrInternal(packagesModified)) { ContentValues values = new ContentValues(); values.put(VoicemailContract.Voicemails.DIRTY, 1); values.put(VoicemailContract.Voicemails.DELETED, 1); values.put(VoicemailContract.Voicemails.LAST_MODIFIED, getTimeMillis()); - count = mDb.update(table, values, whereClause, whereArgs); + count = qb.update(mDb, values, whereClause, whereArgs); } else { - count = mDb.delete(table, whereClause, whereArgs); + count = qb.delete(mDb, whereClause, whereArgs); } if (count > 0 && isVoicemail) { |