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