• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2015 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.server.devicepolicy;
18 
19 import static org.mockito.Mockito.mock;
20 import static org.mockito.Mockito.when;
21 
22 import android.annotation.Nullable;
23 import android.app.AppOpsManager;
24 import android.content.BroadcastReceiver;
25 import android.content.ContentResolver;
26 import android.content.Context;
27 import android.content.Intent;
28 import android.content.IntentFilter;
29 import android.content.pm.ApplicationInfo;
30 import android.content.pm.PackageManager;
31 import android.content.res.Resources;
32 import android.os.Bundle;
33 import android.os.Handler;
34 import android.os.UserHandle;
35 import android.test.mock.MockContext;
36 import android.util.ArrayMap;
37 import android.util.DisplayMetrics;
38 import android.util.ExceptionUtils;
39 
40 import androidx.annotation.NonNull;
41 
42 import com.android.internal.util.FunctionalUtils;
43 import com.android.server.pm.UserManagerInternal;
44 
45 import org.junit.Assert;
46 
47 import java.util.ArrayList;
48 import java.util.List;
49 import java.util.Map;
50 import java.util.concurrent.Executor;
51 
52 /**
53  * Context used throughout DPMS tests.
54  */
55 public class DpmMockContext extends MockContext {
56     /**
57      * User-id of a non-system user we use throughout unit tests.
58      */
59     public static final int CALLER_USER_HANDLE = 20;
60 
61     /**
62      * UID corresponding to {@link #CALLER_USER_HANDLE}.
63      */
64     public static final int CALLER_UID = UserHandle.getUid(CALLER_USER_HANDLE, 20123);
65 
66     /**
67      * UID corresponding to {@link #CALLER_USER_HANDLE}.
68      */
69     public static final int CALLER_MANAGED_PROVISIONING_UID = UserHandle.getUid(CALLER_USER_HANDLE,
70             20125);
71 
72     /**
73      * UID used when a caller is on the system user.
74      */
75     public static final int CALLER_SYSTEM_USER_UID = 20321;
76 
77     /**
78      * PID of the caller.
79      */
80     public static final int CALLER_PID = 22222;
81 
82     /**
83      * UID of the system server.
84      */
85     public static final int SYSTEM_UID = android.os.Process.SYSTEM_UID;
86 
87     /**
88      * PID of the system server.
89      */
90     public static final int SYSTEM_PID = 11111;
91 
92     public static final String ANOTHER_PACKAGE_NAME = "com.another.package.name";
93     public static final int ANOTHER_UID = UserHandle.getUid(UserHandle.USER_SYSTEM, 18434);
94 
95     public static final String DELEGATE_PACKAGE_NAME = "com.delegate.package.name";
96     public static final int DELEGATE_CERT_INSTALLER_UID = UserHandle.getUid(UserHandle.USER_SYSTEM,
97             18437);
98 
99     private final MockSystemServices mMockSystemServices;
100 
101     public static class MockBinder {
102         public int callingUid = CALLER_UID;
103         public int callingPid = CALLER_PID;
104         public final Map<Integer, List<String>> callingPermissions = new ArrayMap<>();
105 
clearCallingIdentity()106         public long clearCallingIdentity() {
107             final long token = (((long) callingUid) << 32) | (callingPid);
108             callingUid = SYSTEM_UID;
109             callingPid = SYSTEM_PID;
110             return token;
111         }
112 
restoreCallingIdentity(long token)113         public void restoreCallingIdentity(long token) {
114             callingUid = (int) (token >> 32);
115             callingPid = (int) token;
116         }
117 
withCleanCallingIdentity(@onNull FunctionalUtils.ThrowingRunnable action)118         public void withCleanCallingIdentity(@NonNull FunctionalUtils.ThrowingRunnable action) {
119             final long callingIdentity = clearCallingIdentity();
120             Throwable throwableToPropagate = null;
121             try {
122                 action.runOrThrow();
123             } catch (Throwable throwable) {
124                 throwableToPropagate = throwable;
125             } finally {
126                 restoreCallingIdentity(callingIdentity);
127                 if (throwableToPropagate != null) {
128                     throw ExceptionUtils.propagate(throwableToPropagate);
129                 }
130             }
131         }
132 
getCallingUid()133         public int getCallingUid() {
134             return callingUid;
135         }
136 
getCallingPid()137         public int getCallingPid() {
138             return callingPid;
139         }
140 
getCallingUserHandle()141         public UserHandle getCallingUserHandle() {
142             return new UserHandle(UserHandle.getUserId(getCallingUid()));
143         }
144 
isCallerUidMyUid()145         public boolean isCallerUidMyUid() {
146             return callingUid == SYSTEM_UID;
147         }
148     }
149 
150     private final Context realTestContext;
151 
152     /**
153      * Use this instance to verify unimplemented methods such as {@link #sendBroadcast}.
154      * (Spying on {@code this} instance will confuse mockito somehow and I got weired "wrong number
155      * of arguments" exceptions.)
156      */
157     public final Context spiedContext;
158 
159     public final MockBinder binder;
160     public final Resources resources;
161 
162     /** TODO: Migrate everything to use {@link #permissions} to avoid confusion. */
163     @Deprecated
164     public final List<String> callerPermissions = new ArrayList<>();
165 
166     /** Less confusing alias for {@link #callerPermissions}. */
167     public final List<String> permissions = callerPermissions;
168 
169     public String packageName = null;
170 
171     public ApplicationInfo applicationInfo = null;
172 
DpmMockContext(MockSystemServices mockSystemServices, Context context)173     public DpmMockContext(MockSystemServices mockSystemServices, Context context) {
174         this(mockSystemServices, context, new MockBinder());
175     }
176 
DpmMockContext(MockSystemServices mockSystemServices, Context context, @NonNull MockBinder mockBinder)177     public DpmMockContext(MockSystemServices mockSystemServices, Context context,
178             @NonNull MockBinder mockBinder) {
179         mMockSystemServices = mockSystemServices;
180         realTestContext = context;
181         binder = mockBinder;
182 
183         resources = mock(Resources.class);
184         spiedContext = mock(Context.class);
185 
186         // Set up density for notification building
187         DisplayMetrics displayMetrics = mock(DisplayMetrics.class);
188         displayMetrics.density = 2.25f;
189         when(resources.getDisplayMetrics()).thenReturn(displayMetrics);
190     }
191 
192     @Override
getResources()193     public Resources getResources() {
194         return resources;
195     }
196 
197     @Override
getTheme()198     public Resources.Theme getTheme() {
199         return spiedContext.getTheme();
200     }
201 
202     @Override
getPackageName()203     public String getPackageName() {
204         if (packageName != null) {
205             return packageName;
206         }
207         return super.getPackageName();
208     }
209 
210     @Override
getOpPackageName()211     public String getOpPackageName() {
212         return getPackageName();
213     }
214 
215     @Override
getApplicationInfo()216     public ApplicationInfo getApplicationInfo() {
217         if (applicationInfo != null) {
218             return applicationInfo;
219         }
220         return super.getApplicationInfo();
221     }
222 
223     @Override
getSystemService(String name)224     public Object getSystemService(String name) {
225         switch (name) {
226             case Context.ALARM_SERVICE:
227                 return mMockSystemServices.alarmManager;
228             case Context.USER_SERVICE:
229                 return mMockSystemServices.userManager;
230             case Context.POWER_SERVICE:
231                 return mMockSystemServices.powerManager;
232             case Context.WIFI_SERVICE:
233                 return mMockSystemServices.wifiManager;
234             case Context.ACCOUNT_SERVICE:
235                 return mMockSystemServices.accountManager;
236             case Context.TELEPHONY_SERVICE:
237                 return mMockSystemServices.telephonyManager;
238             case Context.CONNECTIVITY_SERVICE:
239                 return mMockSystemServices.connectivityManager;
240             case Context.APP_OPS_SERVICE:
241                 return mMockSystemServices.appOpsManager;
242             case Context.CROSS_PROFILE_APPS_SERVICE:
243                 return mMockSystemServices.crossProfileApps;
244             case Context.VPN_MANAGEMENT_SERVICE:
245                 return mMockSystemServices.vpnManager;
246             case Context.DEVICE_POLICY_SERVICE:
247                 return mMockSystemServices.devicePolicyManager;
248             case Context.LOCATION_SERVICE:
249                 return mMockSystemServices.locationManager;
250             case Context.ROLE_SERVICE:
251                 return mMockSystemServices.roleManager;
252             case Context.TELEPHONY_SUBSCRIPTION_SERVICE:
253                 return mMockSystemServices.subscriptionManager;
254             case Context.USB_SERVICE:
255                 return mMockSystemServices.usbManager;
256             case Context.EUICC_SERVICE:
257                 return mMockSystemServices.euiccManager;
258         }
259         throw new UnsupportedOperationException();
260     }
261 
262     @Override
getSystemServiceName(Class<?> serviceClass)263     public String getSystemServiceName(Class<?> serviceClass) {
264         return realTestContext.getSystemServiceName(serviceClass);
265     }
266 
267     @Override
getApplicationContext()268     public Context getApplicationContext() {
269         return this;
270     }
271 
272     @Override
getPackageManager()273     public PackageManager getPackageManager() {
274         return mMockSystemServices.packageManager;
275     }
276 
getUserManagerInternal()277     public UserManagerInternal getUserManagerInternal() {
278         return mMockSystemServices.userManagerInternal;
279     }
280 
281     @Override
enforceCallingOrSelfPermission(String permission, String message)282     public void enforceCallingOrSelfPermission(String permission, String message) {
283         if (UserHandle.isSameApp(binder.getCallingUid(), SYSTEM_UID)) {
284             return; // Assume system has all permissions.
285         }
286         List<String> permissions = binder.callingPermissions.get(binder.getCallingUid());
287         if (permissions == null) {
288             // TODO: delete the following line. to do this without breaking any tests, first it's
289             //       necessary to remove all tests that set it directly.
290             permissions = callerPermissions;
291             //            throw new UnsupportedOperationException(
292             //                    "Caller UID " + binder.getCallingUid() + " doesn't exist");
293         }
294         if (!permissions.contains(permission)) {
295             throw new SecurityException("Caller doesn't have " + permission + " : " + message);
296         }
297     }
298 
299     @Override
checkPermission(String permission, int pid, int uid)300     public int checkPermission(String permission, int pid, int uid) {
301         return checkPermission(permission);
302     }
303 
304     @Override
sendBroadcast(Intent intent)305     public void sendBroadcast(Intent intent) {
306         spiedContext.sendBroadcast(intent);
307     }
308 
309     @Override
sendBroadcast(Intent intent, String receiverPermission)310     public void sendBroadcast(Intent intent, String receiverPermission) {
311         spiedContext.sendBroadcast(intent, receiverPermission);
312     }
313 
314     @Override
sendBroadcastMultiplePermissions(Intent intent, String[] receiverPermissions)315     public void sendBroadcastMultiplePermissions(Intent intent, String[] receiverPermissions) {
316         spiedContext.sendBroadcastMultiplePermissions(intent, receiverPermissions);
317     }
318 
319     @Override
sendBroadcastMultiplePermissions(Intent intent, String[] receiverPermissions, Bundle options)320     public void sendBroadcastMultiplePermissions(Intent intent, String[] receiverPermissions,
321             Bundle options) {
322         spiedContext.sendBroadcastMultiplePermissions(intent, receiverPermissions, options);
323     }
324 
325     @Override
sendBroadcastAsUserMultiplePermissions(Intent intent, UserHandle user, String[] receiverPermissions)326     public void sendBroadcastAsUserMultiplePermissions(Intent intent, UserHandle user,
327             String[] receiverPermissions) {
328         spiedContext.sendBroadcastAsUserMultiplePermissions(intent, user, receiverPermissions);
329     }
330 
331     @Override
sendBroadcast(Intent intent, String receiverPermission, Bundle options)332     public void sendBroadcast(Intent intent, String receiverPermission, Bundle options) {
333         spiedContext.sendBroadcast(intent, receiverPermission, options);
334     }
335 
336     @Override
sendBroadcast(Intent intent, String receiverPermission, int appOp)337     public void sendBroadcast(Intent intent, String receiverPermission, int appOp) {
338         spiedContext.sendBroadcast(intent, receiverPermission, appOp);
339     }
340 
341     @Override
sendOrderedBroadcast(Intent intent, String receiverPermission)342     public void sendOrderedBroadcast(Intent intent, String receiverPermission) {
343         spiedContext.sendOrderedBroadcast(intent, receiverPermission);
344     }
345 
346     @Override
sendOrderedBroadcast(Intent intent, String receiverPermission, BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, String initialData, Bundle initialExtras)347     public void sendOrderedBroadcast(Intent intent, String receiverPermission,
348             BroadcastReceiver resultReceiver, Handler scheduler, int initialCode,
349             String initialData, Bundle initialExtras) {
350         spiedContext.sendOrderedBroadcast(intent, receiverPermission, resultReceiver, scheduler,
351                 initialCode, initialData, initialExtras);
352     }
353 
354     @Override
sendOrderedBroadcast(Intent intent, String receiverPermission, Bundle options, BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, String initialData, Bundle initialExtras)355     public void sendOrderedBroadcast(Intent intent, String receiverPermission, Bundle options,
356             BroadcastReceiver resultReceiver, Handler scheduler, int initialCode,
357             String initialData, Bundle initialExtras) {
358         spiedContext.sendOrderedBroadcast(intent, receiverPermission, options, resultReceiver,
359                 scheduler,
360                 initialCode, initialData, initialExtras);
361     }
362 
363     @Override
sendOrderedBroadcast(Intent intent, String receiverPermission, int appOp, BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, String initialData, Bundle initialExtras)364     public void sendOrderedBroadcast(Intent intent, String receiverPermission, int appOp,
365             BroadcastReceiver resultReceiver, Handler scheduler, int initialCode,
366             String initialData, Bundle initialExtras) {
367         spiedContext.sendOrderedBroadcast(intent, receiverPermission, appOp, resultReceiver,
368                 scheduler,
369                 initialCode, initialData, initialExtras);
370     }
371 
372     @Override
sendBroadcastAsUser(Intent intent, UserHandle user)373     public void sendBroadcastAsUser(Intent intent, UserHandle user) {
374         if (binder.callingPid != SYSTEM_PID) {
375             // Unless called as the system process, can only call if the target user is the
376             // calling user.
377             // (The actual check is more complex; we may need to change it later.)
378             Assert.assertEquals(UserHandle.getUserId(binder.getCallingUid()), user.getIdentifier());
379         }
380 
381         spiedContext.sendBroadcastAsUser(intent, user);
382     }
383 
384     @Override
sendBroadcastAsUser(Intent intent, UserHandle user, @Nullable String receiverPermission, @Nullable Bundle options)385     public void sendBroadcastAsUser(Intent intent,
386             UserHandle user, @Nullable String receiverPermission, @Nullable Bundle options) {
387         spiedContext.sendBroadcastAsUser(intent, user, receiverPermission, options);
388     }
389 
390     @Override
sendBroadcastAsUser(Intent intent, UserHandle user, String receiverPermission)391     public void sendBroadcastAsUser(Intent intent, UserHandle user, String receiverPermission) {
392         spiedContext.sendBroadcastAsUser(intent, user, receiverPermission);
393     }
394 
395     @Override
sendBroadcastAsUser(Intent intent, UserHandle user, String receiverPermission, int appOp)396     public void sendBroadcastAsUser(Intent intent, UserHandle user, String receiverPermission,
397             int appOp) {
398         spiedContext.sendBroadcastAsUser(intent, user, receiverPermission, appOp);
399     }
400 
401     @Override
sendOrderedBroadcastAsUser(Intent intent, UserHandle user, String receiverPermission, BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, String initialData, Bundle initialExtras)402     public void sendOrderedBroadcastAsUser(Intent intent, UserHandle user,
403             String receiverPermission, BroadcastReceiver resultReceiver, Handler scheduler,
404             int initialCode, String initialData, Bundle initialExtras) {
405         sendOrderedBroadcastAsUser(
406                 intent, user, receiverPermission, AppOpsManager.OP_NONE, resultReceiver,
407                 scheduler, initialCode, initialData, initialExtras);
408     }
409 
410     @Override
sendOrderedBroadcastAsUser(Intent intent, UserHandle user, String receiverPermission, int appOp, BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, String initialData, Bundle initialExtras)411     public void sendOrderedBroadcastAsUser(Intent intent, UserHandle user,
412             String receiverPermission, int appOp, BroadcastReceiver resultReceiver,
413             Handler scheduler, int initialCode, String initialData, Bundle initialExtras) {
414         sendOrderedBroadcastAsUser(
415                 intent, user, receiverPermission, appOp, null, resultReceiver,
416                 scheduler, initialCode, initialData, initialExtras);
417     }
418 
419     @Override
sendOrderedBroadcastAsUser(Intent intent, UserHandle user, String receiverPermission, int appOp, Bundle options, BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, String initialData, Bundle initialExtras)420     public void sendOrderedBroadcastAsUser(Intent intent, UserHandle user,
421             String receiverPermission, int appOp, Bundle options, BroadcastReceiver resultReceiver,
422             Handler scheduler, int initialCode, String initialData, Bundle initialExtras) {
423         spiedContext.sendOrderedBroadcastAsUser(intent, user, receiverPermission, appOp, options,
424                 resultReceiver, scheduler, initialCode, initialData, initialExtras);
425         resultReceiver.onReceive(spiedContext, intent);
426     }
427 
428     @Override
sendStickyBroadcast(Intent intent)429     public void sendStickyBroadcast(Intent intent) {
430         spiedContext.sendStickyBroadcast(intent);
431     }
432 
433     @Override
sendStickyOrderedBroadcast(Intent intent, BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, String initialData, Bundle initialExtras)434     public void sendStickyOrderedBroadcast(Intent intent, BroadcastReceiver resultReceiver,
435             Handler scheduler, int initialCode, String initialData, Bundle initialExtras) {
436         spiedContext.sendStickyOrderedBroadcast(intent, resultReceiver, scheduler, initialCode,
437                 initialData, initialExtras);
438     }
439 
440     @Override
removeStickyBroadcast(Intent intent)441     public void removeStickyBroadcast(Intent intent) {
442         spiedContext.removeStickyBroadcast(intent);
443     }
444 
445     @Override
sendStickyBroadcastAsUser(Intent intent, UserHandle user)446     public void sendStickyBroadcastAsUser(Intent intent, UserHandle user) {
447         spiedContext.sendStickyBroadcastAsUser(intent, user);
448     }
449 
450     @Override
sendStickyOrderedBroadcastAsUser(Intent intent, UserHandle user, BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, String initialData, Bundle initialExtras)451     public void sendStickyOrderedBroadcastAsUser(Intent intent, UserHandle user,
452             BroadcastReceiver resultReceiver, Handler scheduler, int initialCode,
453             String initialData, Bundle initialExtras) {
454         spiedContext.sendStickyOrderedBroadcastAsUser(intent, user, resultReceiver, scheduler, initialCode,
455                 initialData, initialExtras);
456     }
457 
458     @Override
removeStickyBroadcastAsUser(Intent intent, UserHandle user)459     public void removeStickyBroadcastAsUser(Intent intent, UserHandle user) {
460         spiedContext.removeStickyBroadcastAsUser(intent, user);
461     }
462 
463     @Override
registerReceiver(BroadcastReceiver receiver, IntentFilter filter)464     public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter) {
465         mMockSystemServices.registerReceiver(receiver, filter, null);
466         return spiedContext.registerReceiver(receiver, filter,
467                 Context.RECEIVER_EXPORTED_UNAUDITED);
468     }
469 
470     @Override
registerReceiver(BroadcastReceiver receiver, IntentFilter filter, int flags)471     public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter, int flags) {
472         mMockSystemServices.registerReceiver(receiver, filter, null);
473         return spiedContext.registerReceiver(receiver, filter, flags);
474     }
475 
476     @Override
registerReceiver(BroadcastReceiver receiver, IntentFilter filter, String broadcastPermission, Handler scheduler)477     public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter,
478             String broadcastPermission, Handler scheduler) {
479         mMockSystemServices.registerReceiver(receiver, filter, scheduler);
480         return spiedContext.registerReceiver(receiver, filter, broadcastPermission, scheduler);
481     }
482 
483     @Override
registerReceiverAsUser(BroadcastReceiver receiver, UserHandle user, IntentFilter filter, String broadcastPermission, Handler scheduler)484     public Intent registerReceiverAsUser(BroadcastReceiver receiver, UserHandle user,
485             IntentFilter filter, String broadcastPermission, Handler scheduler) {
486         mMockSystemServices.registerReceiver(receiver, filter, scheduler);
487         return spiedContext.registerReceiverAsUser(receiver, user, filter, broadcastPermission,
488                 scheduler);
489     }
490 
491     @Override
registerReceiverAsUser(BroadcastReceiver receiver, UserHandle user, IntentFilter filter, String broadcastPermission, Handler scheduler, int flags)492     public Intent registerReceiverAsUser(BroadcastReceiver receiver, UserHandle user,
493             IntentFilter filter, String broadcastPermission, Handler scheduler, int flags) {
494         mMockSystemServices.registerReceiver(receiver, filter, scheduler);
495         return spiedContext.registerReceiverAsUser(receiver, user, filter, broadcastPermission,
496                 scheduler, flags);
497     }
498 
499     @Override
unregisterReceiver(BroadcastReceiver receiver)500     public void unregisterReceiver(BroadcastReceiver receiver) {
501         mMockSystemServices.unregisterReceiver(receiver);
502         spiedContext.unregisterReceiver(receiver);
503     }
504 
505     @Override
createPackageContextAsUser(String packageName, int flags, UserHandle user)506     public Context createPackageContextAsUser(String packageName, int flags, UserHandle user)
507             throws PackageManager.NameNotFoundException {
508         return mMockSystemServices.createPackageContextAsUser(packageName, flags, user);
509     }
510 
511     @Override
createContextAsUser(UserHandle user, int flags)512     public Context createContextAsUser(UserHandle user, int flags) {
513         try {
514             return mMockSystemServices.createPackageContextAsUser(packageName, flags, user);
515         } catch (PackageManager.NameNotFoundException e) {
516             throw new IllegalStateException(e);
517         }
518     }
519 
520     @Override
getContentResolver()521     public ContentResolver getContentResolver() {
522         return mMockSystemServices.contentResolver;
523     }
524 
525     @Override
getUserId()526     public int getUserId() {
527         return UserHandle.getUserId(binder.getCallingUid());
528     }
529 
530     @Override
getMainExecutor()531     public Executor getMainExecutor() {
532         return mMockSystemServices.executor;
533     }
534 
535     @Override
checkCallingPermission(String permission)536     public int checkCallingPermission(String permission) {
537         return checkPermission(permission);
538     }
539 
540     @Override
checkCallingOrSelfPermission(String permission)541     public int checkCallingOrSelfPermission(String permission) {
542         return checkPermission(permission);
543     }
544 
545     @Override
startActivityAsUser(Intent intent, UserHandle userHandle)546     public void startActivityAsUser(Intent intent, UserHandle userHandle) {
547         spiedContext.startActivityAsUser(intent, userHandle);
548     }
549 
checkPermission(String permission)550     private int checkPermission(String permission) {
551         if (UserHandle.isSameApp(binder.getCallingUid(), SYSTEM_UID)) {
552             return PackageManager.PERMISSION_GRANTED; // Assume system has all permissions.
553         }
554         List<String> permissions = binder.callingPermissions.get(binder.getCallingUid());
555         if (permissions == null) {
556             permissions = callerPermissions;
557         }
558         if (permissions.contains(permission)) {
559             return PackageManager.PERMISSION_GRANTED;
560         } else {
561             return PackageManager.PERMISSION_DENIED;
562         }
563     }
564 
565 }
566