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