summaryrefslogtreecommitdiffstats
path: root/src/com/android
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/android')
-rw-r--r--src/com/android/providers/contacts/CallLogProvider.java6
-rw-r--r--src/com/android/providers/contacts/VoicemailContentProvider.java14
-rw-r--r--src/com/android/providers/contacts/VoicemailPermissions.java29
3 files changed, 30 insertions, 19 deletions
diff --git a/src/com/android/providers/contacts/CallLogProvider.java b/src/com/android/providers/contacts/CallLogProvider.java
index 547e4d3..76481bd 100644
--- a/src/com/android/providers/contacts/CallLogProvider.java
+++ b/src/com/android/providers/contacts/CallLogProvider.java
@@ -303,7 +303,7 @@ public class CallLogProvider extends ContentProvider {
// permission and also requires the additional voicemail param set.
if (hasVoicemailValue(values)) {
checkIsAllowVoicemailRequest(uri);
- mVoicemailPermissions.checkCallerHasWriteAccess();
+ mVoicemailPermissions.checkCallerHasWriteAccess(getCallingPackage());
}
if (mCallsInserter == null) {
SQLiteDatabase db = mDbHelper.getWritableDatabase();
@@ -411,9 +411,9 @@ public class CallLogProvider extends ContentProvider {
SelectionBuilder selectionBuilder, boolean isQuery) {
if (isAllowVoicemailRequest(uri)) {
if (isQuery) {
- mVoicemailPermissions.checkCallerHasReadAccess();
+ mVoicemailPermissions.checkCallerHasReadAccess(getCallingPackage());
} else {
- mVoicemailPermissions.checkCallerHasWriteAccess();
+ mVoicemailPermissions.checkCallerHasWriteAccess(getCallingPackage());
}
} else {
selectionBuilder.addClause(EXCLUDE_VOICEMAIL_SELECTION);
diff --git a/src/com/android/providers/contacts/VoicemailContentProvider.java b/src/com/android/providers/contacts/VoicemailContentProvider.java
index dc84129..ba51b8e 100644
--- a/src/com/android/providers/contacts/VoicemailContentProvider.java
+++ b/src/com/android/providers/contacts/VoicemailContentProvider.java
@@ -255,7 +255,7 @@ public class VoicemailContentProvider extends ContentProvider
}
// You must have access to the provider given in values.
- if (!mVoicemailPermissions.callerHasWriteAccess()) {
+ if (!mVoicemailPermissions.callerHasWriteAccess(getCallingPackage())) {
checkPackagesMatch(getCallingPackage_(),
values.getAsString(VoicemailContract.SOURCE_PACKAGE_FIELD),
uriData.getUri());
@@ -296,7 +296,7 @@ public class VoicemailContentProvider extends ContentProvider
return UriData.createUriData(uri);
}
- if (mVoicemailPermissions.callerHasReadAccess()) {
+ if (mVoicemailPermissions.callerHasReadAccess(getCallingPackage())) {
return UriData.createUriData(uri);
}
@@ -353,7 +353,7 @@ public class VoicemailContentProvider extends ContentProvider
* @throws SecurityException if the check fails.
*/
private void checkPackagePermission(UriData uriData) {
- if (!mVoicemailPermissions.callerHasWriteAccess()) {
+ if (!mVoicemailPermissions.callerHasWriteAccess(getCallingPackage())) {
if (!uriData.hasSourcePackage()) {
// You cannot have a match if this is not a provider URI.
throw new SecurityException(String.format(
@@ -414,14 +414,16 @@ public class VoicemailContentProvider extends ContentProvider
}
/**
- * Whether or not the calling package has the appropriate read/write permission
+ * Whether or not the calling package has the appropriate read/write permission. The user
+ * selected default and/or system dialers are always allowed to read and write to the
+ * VoicemailContentProvider.
*
* @param read Whether or not this operation is a read
*
* @return True if the package has the permission required to perform the read/write operation
*/
private boolean hasReadWritePermission(boolean read) {
- return read ? mVoicemailPermissions.callerHasReadAccess() :
- mVoicemailPermissions.callerHasWriteAccess();
+ return read ? mVoicemailPermissions.callerHasReadAccess(getCallingPackage()) :
+ mVoicemailPermissions.callerHasWriteAccess(getCallingPackage());
}
}
diff --git a/src/com/android/providers/contacts/VoicemailPermissions.java b/src/com/android/providers/contacts/VoicemailPermissions.java
index 0aac18a..e1c9b57 100644
--- a/src/com/android/providers/contacts/VoicemailPermissions.java
+++ b/src/com/android/providers/contacts/VoicemailPermissions.java
@@ -18,6 +18,7 @@ package com.android.providers.contacts;
import android.content.Context;
import android.content.pm.PackageManager;
+import android.telecom.DefaultDialerManager;
/**
* Provides method related to check various voicemail permissions under the
@@ -37,13 +38,19 @@ public class VoicemailPermissions {
}
/** Determine if the calling process has full read access to all voicemails. */
- public boolean callerHasReadAccess() {
+ public boolean callerHasReadAccess(String callingPackage) {
+ if (DefaultDialerManager.isDefaultOrSystemDialer(mContext, callingPackage)) {
+ return true;
+ }
return callerHasPermission(android.Manifest.permission.READ_VOICEMAIL);
}
/** Determine if the calling process has the permission required to update and remove all
* voicemails */
- public boolean callerHasWriteAccess() {
+ public boolean callerHasWriteAccess(String callingPackage) {
+ if (DefaultDialerManager.isDefaultOrSystemDialer(mContext, callingPackage)) {
+ return true;
+ }
return callerHasPermission(android.Manifest.permission.WRITE_VOICEMAIL);
}
@@ -64,17 +71,19 @@ public class VoicemailPermissions {
*
* @throws SecurityException if the caller does not have the voicemail source permission.
*/
- public void checkCallerHasReadAccess() {
- if (!callerHasReadAccess()) {
- throw new SecurityException(String.format("The caller must have %s permission: ",
- android.Manifest.permission.READ_VOICEMAIL));
+ public void checkCallerHasReadAccess(String callingPackage) {
+ if (!callerHasReadAccess(callingPackage)) {
+ throw new SecurityException(String.format("The caller must be the default or system "
+ + "dialer, or have the system-only %s permission: ",
+ android.Manifest.permission.READ_VOICEMAIL));
}
}
- public void checkCallerHasWriteAccess() {
- if (!callerHasWriteAccess()) {
- throw new SecurityException(String.format("The caller must have %s permission: ",
- android.Manifest.permission.WRITE_VOICEMAIL));
+ public void checkCallerHasWriteAccess(String callingPackage) {
+ if (!callerHasWriteAccess(callingPackage)) {
+ throw new SecurityException(String.format("The caller must be the default or system "
+ + "dialer, or have the system-only %s permission: ",
+ android.Manifest.permission.WRITE_VOICEMAIL));
}
}