1aafbe295d67686870c64c74a59e589d1dfb506faDebashish Chatterjee/* 2aafbe295d67686870c64c74a59e589d1dfb506faDebashish Chatterjee * Copyright (C) 2011 The Android Open Source Project 3aafbe295d67686870c64c74a59e589d1dfb506faDebashish Chatterjee * 4aafbe295d67686870c64c74a59e589d1dfb506faDebashish Chatterjee * Licensed under the Apache License, Version 2.0 (the "License"); 5aafbe295d67686870c64c74a59e589d1dfb506faDebashish Chatterjee * you may not use this file except in compliance with the License. 6aafbe295d67686870c64c74a59e589d1dfb506faDebashish Chatterjee * You may obtain a copy of the License at 7aafbe295d67686870c64c74a59e589d1dfb506faDebashish Chatterjee * 8aafbe295d67686870c64c74a59e589d1dfb506faDebashish Chatterjee * http://www.apache.org/licenses/LICENSE-2.0 9aafbe295d67686870c64c74a59e589d1dfb506faDebashish Chatterjee * 10aafbe295d67686870c64c74a59e589d1dfb506faDebashish Chatterjee * Unless required by applicable law or agreed to in writing, software 11aafbe295d67686870c64c74a59e589d1dfb506faDebashish Chatterjee * distributed under the License is distributed on an "AS IS" BASIS, 12aafbe295d67686870c64c74a59e589d1dfb506faDebashish Chatterjee * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13aafbe295d67686870c64c74a59e589d1dfb506faDebashish Chatterjee * See the License for the specific language governing permissions and 14aafbe295d67686870c64c74a59e589d1dfb506faDebashish Chatterjee * limitations under the License 15aafbe295d67686870c64c74a59e589d1dfb506faDebashish Chatterjee */ 16aafbe295d67686870c64c74a59e589d1dfb506faDebashish Chatterjee 17aafbe295d67686870c64c74a59e589d1dfb506faDebashish Chatterjeepackage com.android.providers.contacts; 18aafbe295d67686870c64c74a59e589d1dfb506faDebashish Chatterjee 19aafbe295d67686870c64c74a59e589d1dfb506faDebashish Chatterjeeimport android.content.Context; 20aafbe295d67686870c64c74a59e589d1dfb506faDebashish Chatterjeeimport android.content.pm.PackageManager; 21aafbe295d67686870c64c74a59e589d1dfb506faDebashish Chatterjee 22aafbe295d67686870c64c74a59e589d1dfb506faDebashish Chatterjee/** 23aafbe295d67686870c64c74a59e589d1dfb506faDebashish Chatterjee * Provides method related to check various voicemail permissions under the 24aafbe295d67686870c64c74a59e589d1dfb506faDebashish Chatterjee * specified context. 25aafbe295d67686870c64c74a59e589d1dfb506faDebashish Chatterjee * <p> This is an immutable object. 26aafbe295d67686870c64c74a59e589d1dfb506faDebashish Chatterjee */ 27aafbe295d67686870c64c74a59e589d1dfb506faDebashish Chatterjeepublic class VoicemailPermissions { 28aafbe295d67686870c64c74a59e589d1dfb506faDebashish Chatterjee private final Context mContext; 29aafbe295d67686870c64c74a59e589d1dfb506faDebashish Chatterjee 30aafbe295d67686870c64c74a59e589d1dfb506faDebashish Chatterjee public VoicemailPermissions(Context context) { 31aafbe295d67686870c64c74a59e589d1dfb506faDebashish Chatterjee mContext = context; 32aafbe295d67686870c64c74a59e589d1dfb506faDebashish Chatterjee } 33aafbe295d67686870c64c74a59e589d1dfb506faDebashish Chatterjee 34aafbe295d67686870c64c74a59e589d1dfb506faDebashish Chatterjee /** Determines if the calling process has access to its own voicemails. */ 35aafbe295d67686870c64c74a59e589d1dfb506faDebashish Chatterjee public boolean callerHasOwnVoicemailAccess() { 3698a77ec8057c5fe0ff487ca7d0910312693e5689Debashish Chatterjee return callerHasPermission(android.Manifest.permission.ADD_VOICEMAIL); 37aafbe295d67686870c64c74a59e589d1dfb506faDebashish Chatterjee } 38aafbe295d67686870c64c74a59e589d1dfb506faDebashish Chatterjee 393ccaf5590a7ed2fca780f9b7fc46328d0f78a2eefafaisland /** Determine if the calling process has full read access to all voicemails. */ 402ad39edbd856f3ea1177788aff7e653e593781ebYorke Lee public boolean callerHasReadAccess() { 412ad39edbd856f3ea1177788aff7e653e593781ebYorke Lee return callerHasPermission(android.Manifest.permission.READ_VOICEMAIL); 423ccaf5590a7ed2fca780f9b7fc46328d0f78a2eefafaisland } 433ccaf5590a7ed2fca780f9b7fc46328d0f78a2eefafaisland 44ab2ec1d4316770e2ce8dc47dd1ae71430cd70e36Yorke Lee /** Determine if the calling process has the permission required to update and remove all 45ab2ec1d4316770e2ce8dc47dd1ae71430cd70e36Yorke Lee * voicemails */ 462ad39edbd856f3ea1177788aff7e653e593781ebYorke Lee public boolean callerHasWriteAccess() { 472ad39edbd856f3ea1177788aff7e653e593781ebYorke Lee return callerHasPermission(android.Manifest.permission.WRITE_VOICEMAIL); 48aafbe295d67686870c64c74a59e589d1dfb506faDebashish Chatterjee } 49aafbe295d67686870c64c74a59e589d1dfb506faDebashish Chatterjee 50aafbe295d67686870c64c74a59e589d1dfb506faDebashish Chatterjee /** 51aafbe295d67686870c64c74a59e589d1dfb506faDebashish Chatterjee * Checks that the caller has permissions to access its own voicemails. 52aafbe295d67686870c64c74a59e589d1dfb506faDebashish Chatterjee * 53aafbe295d67686870c64c74a59e589d1dfb506faDebashish Chatterjee * @throws SecurityException if the caller does not have the voicemail source permission. 54aafbe295d67686870c64c74a59e589d1dfb506faDebashish Chatterjee */ 55aafbe295d67686870c64c74a59e589d1dfb506faDebashish Chatterjee public void checkCallerHasOwnVoicemailAccess() { 56aafbe295d67686870c64c74a59e589d1dfb506faDebashish Chatterjee if (!callerHasOwnVoicemailAccess()) { 57aafbe295d67686870c64c74a59e589d1dfb506faDebashish Chatterjee throw new SecurityException("The caller must have permission: " + 5898a77ec8057c5fe0ff487ca7d0910312693e5689Debashish Chatterjee android.Manifest.permission.ADD_VOICEMAIL); 59aafbe295d67686870c64c74a59e589d1dfb506faDebashish Chatterjee } 60aafbe295d67686870c64c74a59e589d1dfb506faDebashish Chatterjee } 61aafbe295d67686870c64c74a59e589d1dfb506faDebashish Chatterjee 62aafbe295d67686870c64c74a59e589d1dfb506faDebashish Chatterjee /** 633ccaf5590a7ed2fca780f9b7fc46328d0f78a2eefafaisland * Checks that the caller has permissions to read ALL voicemails. 643ccaf5590a7ed2fca780f9b7fc46328d0f78a2eefafaisland * 653ccaf5590a7ed2fca780f9b7fc46328d0f78a2eefafaisland * @throws SecurityException if the caller does not have the voicemail source permission. 663ccaf5590a7ed2fca780f9b7fc46328d0f78a2eefafaisland */ 672ad39edbd856f3ea1177788aff7e653e593781ebYorke Lee public void checkCallerHasReadAccess() { 682ad39edbd856f3ea1177788aff7e653e593781ebYorke Lee if (!callerHasReadAccess()) { 693ccaf5590a7ed2fca780f9b7fc46328d0f78a2eefafaisland throw new SecurityException(String.format("The caller must have %s permission: ", 702ad39edbd856f3ea1177788aff7e653e593781ebYorke Lee android.Manifest.permission.READ_VOICEMAIL)); 713ccaf5590a7ed2fca780f9b7fc46328d0f78a2eefafaisland } 723ccaf5590a7ed2fca780f9b7fc46328d0f78a2eefafaisland } 733ccaf5590a7ed2fca780f9b7fc46328d0f78a2eefafaisland 742ad39edbd856f3ea1177788aff7e653e593781ebYorke Lee public void checkCallerHasWriteAccess() { 752ad39edbd856f3ea1177788aff7e653e593781ebYorke Lee if (!callerHasWriteAccess()) { 76ab2ec1d4316770e2ce8dc47dd1ae71430cd70e36Yorke Lee throw new SecurityException(String.format("The caller must have %s permission: ", 772ad39edbd856f3ea1177788aff7e653e593781ebYorke Lee android.Manifest.permission.WRITE_VOICEMAIL)); 78aafbe295d67686870c64c74a59e589d1dfb506faDebashish Chatterjee } 79aafbe295d67686870c64c74a59e589d1dfb506faDebashish Chatterjee } 80aafbe295d67686870c64c74a59e589d1dfb506faDebashish Chatterjee 81aafbe295d67686870c64c74a59e589d1dfb506faDebashish Chatterjee /** Determines if the given package has access to its own voicemails. */ 82aafbe295d67686870c64c74a59e589d1dfb506faDebashish Chatterjee public boolean packageHasOwnVoicemailAccess(String packageName) { 83791a25b9f228bed8d8bb2febadbd883452555d89Debashish Chatterjee return packageHasPermission(packageName, 8498a77ec8057c5fe0ff487ca7d0910312693e5689Debashish Chatterjee android.Manifest.permission.ADD_VOICEMAIL); 85aafbe295d67686870c64c74a59e589d1dfb506faDebashish Chatterjee } 86aafbe295d67686870c64c74a59e589d1dfb506faDebashish Chatterjee 872ad39edbd856f3ea1177788aff7e653e593781ebYorke Lee /** Determines if the given package has read access. */ 882ad39edbd856f3ea1177788aff7e653e593781ebYorke Lee public boolean packageHasReadAccess(String packageName) { 892ad39edbd856f3ea1177788aff7e653e593781ebYorke Lee return packageHasPermission(packageName, android.Manifest.permission.READ_VOICEMAIL); 903ccaf5590a7ed2fca780f9b7fc46328d0f78a2eefafaisland } 913ccaf5590a7ed2fca780f9b7fc46328d0f78a2eefafaisland 922ad39edbd856f3ea1177788aff7e653e593781ebYorke Lee /** Determines if the given package has write access. */ 932ad39edbd856f3ea1177788aff7e653e593781ebYorke Lee public boolean packageHasWriteAccess(String packageName) { 942ad39edbd856f3ea1177788aff7e653e593781ebYorke Lee return packageHasPermission(packageName, android.Manifest.permission.WRITE_VOICEMAIL); 95aafbe295d67686870c64c74a59e589d1dfb506faDebashish Chatterjee } 96aafbe295d67686870c64c74a59e589d1dfb506faDebashish Chatterjee 97aafbe295d67686870c64c74a59e589d1dfb506faDebashish Chatterjee /** Determines if the given package has the given permission. */ 98aafbe295d67686870c64c74a59e589d1dfb506faDebashish Chatterjee private boolean packageHasPermission(String packageName, String permission) { 99aafbe295d67686870c64c74a59e589d1dfb506faDebashish Chatterjee return mContext.getPackageManager().checkPermission(permission, packageName) 100ab2ec1d4316770e2ce8dc47dd1ae71430cd70e36Yorke Lee == PackageManager.PERMISSION_GRANTED; 101aafbe295d67686870c64c74a59e589d1dfb506faDebashish Chatterjee } 102aafbe295d67686870c64c74a59e589d1dfb506faDebashish Chatterjee 103aafbe295d67686870c64c74a59e589d1dfb506faDebashish Chatterjee /** Determines if the calling process has the given permission. */ 104aafbe295d67686870c64c74a59e589d1dfb506faDebashish Chatterjee private boolean callerHasPermission(String permission) { 1052ce22af86c7d6ea3c7d2944666609cbdbf9adc53Yorke Lee return mContext.checkCallingOrSelfPermission(permission) 1062ce22af86c7d6ea3c7d2944666609cbdbf9adc53Yorke Lee == PackageManager.PERMISSION_GRANTED; 107aafbe295d67686870c64c74a59e589d1dfb506faDebashish Chatterjee } 108aafbe295d67686870c64c74a59e589d1dfb506faDebashish Chatterjee} 109