1f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasani/* 2f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasani * Copyright (C) 2014 The Android Open Source Project 3f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasani * 4f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasani * Licensed under the Apache License, Version 2.0 (the "License"); 5f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasani * you may not use this file except in compliance with the License. 6f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasani * You may obtain a copy of the License at 7f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasani * 8f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasani * http://www.apache.org/licenses/LICENSE-2.0 9f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasani * 10f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasani * Unless required by applicable law or agreed to in writing, software 11f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasani * distributed under the License is distributed on an "AS IS" BASIS, 12f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasani * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasani * See the License for the specific language governing permissions and 14f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasani * limitations under the License. 15f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasani */ 16f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasani 17f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasanipackage com.android.server.restrictions; 18f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasani 19f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasaniimport android.Manifest; 20f6e2fcc2eaf5e650237d3c6d79a2de49d2d4111eAmith Yamasaniimport android.accounts.IAccountAuthenticator; 21f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasaniimport android.app.AppGlobals; 22f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasaniimport android.app.Notification; 23f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasaniimport android.app.NotificationManager; 24f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasaniimport android.app.PendingIntent; 25f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasaniimport android.app.admin.IDevicePolicyManager; 26f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasaniimport android.content.BroadcastReceiver; 27f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasaniimport android.content.ComponentName; 28f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasaniimport android.content.Context; 29f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasaniimport android.content.Intent; 30f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasaniimport android.content.IntentFilter; 31f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasaniimport android.content.IRestrictionsManager; 32f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasaniimport android.content.RestrictionsManager; 33f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasaniimport android.content.pm.PackageManager; 34f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasaniimport android.content.pm.ResolveInfo; 35f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasaniimport android.content.pm.ServiceInfo; 36f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasaniimport android.content.pm.UserInfo; 37f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasaniimport android.database.ContentObserver; 38f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasaniimport android.net.Uri; 39f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasaniimport android.os.Binder; 40f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasaniimport android.os.Bundle; 41f6e2fcc2eaf5e650237d3c6d79a2de49d2d4111eAmith Yamasaniimport android.os.IBinder; 42f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasaniimport android.os.IUserManager; 439c44933958bc03b93eac2452b26dd75567581b86Amith Yamasaniimport android.os.PersistableBundle; 44f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasaniimport android.os.Process; 45f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasaniimport android.os.RemoteException; 46f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasaniimport android.os.UserHandle; 47f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasaniimport android.os.UserManager; 48f6e2fcc2eaf5e650237d3c6d79a2de49d2d4111eAmith Yamasaniimport android.util.Log; 49f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasani 50f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasaniimport com.android.internal.util.ArrayUtils; 51f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasaniimport com.android.server.SystemService; 52f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasani 53f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasani/** 54f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasani * SystemService wrapper for the RestrictionsManager implementation. Publishes the 55f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasani * Context.RESTRICTIONS_SERVICE. 56f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasani */ 57f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasanipublic final class RestrictionsManagerService extends SystemService { 58f6e2fcc2eaf5e650237d3c6d79a2de49d2d4111eAmith Yamasani 59f6e2fcc2eaf5e650237d3c6d79a2de49d2d4111eAmith Yamasani static final String LOG_TAG = "RestrictionsManagerService"; 60f6e2fcc2eaf5e650237d3c6d79a2de49d2d4111eAmith Yamasani static final boolean DEBUG = false; 61f6e2fcc2eaf5e650237d3c6d79a2de49d2d4111eAmith Yamasani 62f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasani private final RestrictionsManagerImpl mRestrictionsManagerImpl; 63f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasani 64f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasani public RestrictionsManagerService(Context context) { 65f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasani super(context); 66f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasani mRestrictionsManagerImpl = new RestrictionsManagerImpl(context); 67f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasani } 68f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasani 69f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasani @Override 70f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasani public void onStart() { 71f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasani publishBinderService(Context.RESTRICTIONS_SERVICE, mRestrictionsManagerImpl); 72f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasani } 73f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasani 74f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasani class RestrictionsManagerImpl extends IRestrictionsManager.Stub { 75f6e2fcc2eaf5e650237d3c6d79a2de49d2d4111eAmith Yamasani final Context mContext; 76f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasani private final IUserManager mUm; 77f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasani private final IDevicePolicyManager mDpm; 78f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasani 79f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasani public RestrictionsManagerImpl(Context context) { 80f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasani mContext = context; 81f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasani mUm = (IUserManager) getBinderService(Context.USER_SERVICE); 82f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasani mDpm = (IDevicePolicyManager) getBinderService(Context.DEVICE_POLICY_SERVICE); 83f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasani } 84f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasani 85f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasani @Override 86f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasani public Bundle getApplicationRestrictions(String packageName) throws RemoteException { 87f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasani return mUm.getApplicationRestrictions(packageName); 88f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasani } 89f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasani 90f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasani @Override 91f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasani public boolean hasRestrictionsProvider() throws RemoteException { 92f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasani int userHandle = UserHandle.getCallingUserId(); 93f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasani if (mDpm != null) { 94f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasani long ident = Binder.clearCallingIdentity(); 95f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasani try { 96f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasani return mDpm.getRestrictionsProvider(userHandle) != null; 97f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasani } finally { 98f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasani Binder.restoreCallingIdentity(ident); 99f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasani } 100f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasani } else { 101f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasani return false; 102f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasani } 103f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasani } 104f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasani 105f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasani @Override 106f6e2fcc2eaf5e650237d3c6d79a2de49d2d4111eAmith Yamasani public void requestPermission(final String packageName, final String requestType, 1079c44933958bc03b93eac2452b26dd75567581b86Amith Yamasani final String requestId, 1089c44933958bc03b93eac2452b26dd75567581b86Amith Yamasani final PersistableBundle requestData) throws RemoteException { 109f6e2fcc2eaf5e650237d3c6d79a2de49d2d4111eAmith Yamasani if (DEBUG) { 110f6e2fcc2eaf5e650237d3c6d79a2de49d2d4111eAmith Yamasani Log.i(LOG_TAG, "requestPermission"); 111f6e2fcc2eaf5e650237d3c6d79a2de49d2d4111eAmith Yamasani } 112f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasani int callingUid = Binder.getCallingUid(); 113f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasani int userHandle = UserHandle.getUserId(callingUid); 114f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasani if (mDpm != null) { 115f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasani long ident = Binder.clearCallingIdentity(); 116f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasani try { 117f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasani ComponentName restrictionsProvider = 118f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasani mDpm.getRestrictionsProvider(userHandle); 119f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasani // Check if there is a restrictions provider 120f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasani if (restrictionsProvider == null) { 121f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasani throw new IllegalStateException( 122f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasani "Cannot request permission without a restrictions provider registered"); 123f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasani } 124f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasani // Check that the packageName matches the caller. 125f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasani enforceCallerMatchesPackage(callingUid, packageName, "Package name does not" + 126f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasani " match caller "); 127f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasani // Prepare and broadcast the intent to the provider 1285470bc184a17c0848ad68fdd50bd5bd0002bd237Amith Yamasani Intent intent = new Intent(RestrictionsManager.ACTION_REQUEST_PERMISSION); 129f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasani intent.setComponent(restrictionsProvider); 1305470bc184a17c0848ad68fdd50bd5bd0002bd237Amith Yamasani intent.putExtra(RestrictionsManager.EXTRA_PACKAGE_NAME, packageName); 1315470bc184a17c0848ad68fdd50bd5bd0002bd237Amith Yamasani intent.putExtra(RestrictionsManager.EXTRA_REQUEST_TYPE, requestType); 1329c44933958bc03b93eac2452b26dd75567581b86Amith Yamasani intent.putExtra(RestrictionsManager.EXTRA_REQUEST_ID, requestId); 1335470bc184a17c0848ad68fdd50bd5bd0002bd237Amith Yamasani intent.putExtra(RestrictionsManager.EXTRA_REQUEST_BUNDLE, requestData); 1345470bc184a17c0848ad68fdd50bd5bd0002bd237Amith Yamasani mContext.sendBroadcastAsUser(intent, new UserHandle(userHandle)); 135f6e2fcc2eaf5e650237d3c6d79a2de49d2d4111eAmith Yamasani } finally { 136f6e2fcc2eaf5e650237d3c6d79a2de49d2d4111eAmith Yamasani Binder.restoreCallingIdentity(ident); 137f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasani } 138f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasani } 139f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasani } 140f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasani 141f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasani @Override 14251a0e5b54680c659f333f186be1cf86d365e0db5Amith Yamasani public Intent createLocalApprovalIntent() throws RemoteException { 1439c44933958bc03b93eac2452b26dd75567581b86Amith Yamasani if (DEBUG) { 1449c44933958bc03b93eac2452b26dd75567581b86Amith Yamasani Log.i(LOG_TAG, "requestPermission"); 1459c44933958bc03b93eac2452b26dd75567581b86Amith Yamasani } 1469c44933958bc03b93eac2452b26dd75567581b86Amith Yamasani final int userHandle = UserHandle.getCallingUserId(); 1479c44933958bc03b93eac2452b26dd75567581b86Amith Yamasani if (mDpm != null) { 1489c44933958bc03b93eac2452b26dd75567581b86Amith Yamasani long ident = Binder.clearCallingIdentity(); 1499c44933958bc03b93eac2452b26dd75567581b86Amith Yamasani try { 1509c44933958bc03b93eac2452b26dd75567581b86Amith Yamasani ComponentName restrictionsProvider = 1519c44933958bc03b93eac2452b26dd75567581b86Amith Yamasani mDpm.getRestrictionsProvider(userHandle); 1529c44933958bc03b93eac2452b26dd75567581b86Amith Yamasani // Check if there is a restrictions provider 1539c44933958bc03b93eac2452b26dd75567581b86Amith Yamasani if (restrictionsProvider == null) { 1549c44933958bc03b93eac2452b26dd75567581b86Amith Yamasani throw new IllegalStateException( 1559c44933958bc03b93eac2452b26dd75567581b86Amith Yamasani "Cannot request permission without a restrictions provider registered"); 1569c44933958bc03b93eac2452b26dd75567581b86Amith Yamasani } 1579c44933958bc03b93eac2452b26dd75567581b86Amith Yamasani String providerPackageName = restrictionsProvider.getPackageName(); 1589c44933958bc03b93eac2452b26dd75567581b86Amith Yamasani Intent intent = new Intent(RestrictionsManager.ACTION_REQUEST_LOCAL_APPROVAL); 1599c44933958bc03b93eac2452b26dd75567581b86Amith Yamasani intent.setPackage(providerPackageName); 1609c44933958bc03b93eac2452b26dd75567581b86Amith Yamasani ResolveInfo ri = AppGlobals.getPackageManager().resolveIntent(intent, 1619c44933958bc03b93eac2452b26dd75567581b86Amith Yamasani null /* resolvedType */, 0 /* flags */, userHandle); 1629c44933958bc03b93eac2452b26dd75567581b86Amith Yamasani if (ri != null && ri.activityInfo != null && ri.activityInfo.exported) { 1639c44933958bc03b93eac2452b26dd75567581b86Amith Yamasani intent.setComponent(new ComponentName(ri.activityInfo.packageName, 1649c44933958bc03b93eac2452b26dd75567581b86Amith Yamasani ri.activityInfo.name)); 1659c44933958bc03b93eac2452b26dd75567581b86Amith Yamasani return intent; 1669c44933958bc03b93eac2452b26dd75567581b86Amith Yamasani } 1679c44933958bc03b93eac2452b26dd75567581b86Amith Yamasani } finally { 1689c44933958bc03b93eac2452b26dd75567581b86Amith Yamasani Binder.restoreCallingIdentity(ident); 1699c44933958bc03b93eac2452b26dd75567581b86Amith Yamasani } 1709c44933958bc03b93eac2452b26dd75567581b86Amith Yamasani } 1719c44933958bc03b93eac2452b26dd75567581b86Amith Yamasani return null; 1729c44933958bc03b93eac2452b26dd75567581b86Amith Yamasani } 1739c44933958bc03b93eac2452b26dd75567581b86Amith Yamasani 1749c44933958bc03b93eac2452b26dd75567581b86Amith Yamasani @Override 1759c44933958bc03b93eac2452b26dd75567581b86Amith Yamasani public void notifyPermissionResponse(String packageName, PersistableBundle response) 176f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasani throws RemoteException { 177f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasani // Check caller 178f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasani int callingUid = Binder.getCallingUid(); 179f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasani int userHandle = UserHandle.getUserId(callingUid); 180f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasani if (mDpm != null) { 181f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasani long ident = Binder.clearCallingIdentity(); 182f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasani try { 183f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasani ComponentName permProvider = mDpm.getRestrictionsProvider(userHandle); 184f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasani if (permProvider == null) { 185f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasani throw new SecurityException("No restrictions provider registered for user"); 186f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasani } 187f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasani enforceCallerMatchesPackage(callingUid, permProvider.getPackageName(), 188f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasani "Restrictions provider does not match caller "); 189f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasani 190f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasani // Post the response to target package 191f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasani Intent responseIntent = new Intent( 192f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasani RestrictionsManager.ACTION_PERMISSION_RESPONSE_RECEIVED); 193f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasani responseIntent.setPackage(packageName); 194f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasani responseIntent.putExtra(RestrictionsManager.EXTRA_RESPONSE_BUNDLE, response); 195f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasani mContext.sendBroadcastAsUser(responseIntent, new UserHandle(userHandle)); 196f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasani } finally { 197f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasani Binder.restoreCallingIdentity(ident); 198f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasani } 199f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasani } 200f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasani } 201f6e2fcc2eaf5e650237d3c6d79a2de49d2d4111eAmith Yamasani 202f6e2fcc2eaf5e650237d3c6d79a2de49d2d4111eAmith Yamasani private void enforceCallerMatchesPackage(int callingUid, String packageName, 203f6e2fcc2eaf5e650237d3c6d79a2de49d2d4111eAmith Yamasani String message) { 204f6e2fcc2eaf5e650237d3c6d79a2de49d2d4111eAmith Yamasani try { 205f6e2fcc2eaf5e650237d3c6d79a2de49d2d4111eAmith Yamasani String[] pkgs = AppGlobals.getPackageManager().getPackagesForUid(callingUid); 206f6e2fcc2eaf5e650237d3c6d79a2de49d2d4111eAmith Yamasani if (pkgs != null) { 207f6e2fcc2eaf5e650237d3c6d79a2de49d2d4111eAmith Yamasani if (!ArrayUtils.contains(pkgs, packageName)) { 208f6e2fcc2eaf5e650237d3c6d79a2de49d2d4111eAmith Yamasani throw new SecurityException(message + callingUid); 209f6e2fcc2eaf5e650237d3c6d79a2de49d2d4111eAmith Yamasani } 210f6e2fcc2eaf5e650237d3c6d79a2de49d2d4111eAmith Yamasani } 211f6e2fcc2eaf5e650237d3c6d79a2de49d2d4111eAmith Yamasani } catch (RemoteException re) { 212f6e2fcc2eaf5e650237d3c6d79a2de49d2d4111eAmith Yamasani // Shouldn't happen 213f6e2fcc2eaf5e650237d3c6d79a2de49d2d4111eAmith Yamasani } 214f6e2fcc2eaf5e650237d3c6d79a2de49d2d4111eAmith Yamasani } 215f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasani } 216f20d640fa2b155a971ddfe0965fc803a73b5e53cAmith Yamasani} 217