1d1d7c022c6f83e836acb74eed1a5a201e495bd85Amith Yamasani/* 2d1d7c022c6f83e836acb74eed1a5a201e495bd85Amith Yamasani * Copyright (C) 2014 The Android Open Source Project 3d1d7c022c6f83e836acb74eed1a5a201e495bd85Amith Yamasani * 4d1d7c022c6f83e836acb74eed1a5a201e495bd85Amith Yamasani * Licensed under the Apache License, Version 2.0 (the "License"); 5d1d7c022c6f83e836acb74eed1a5a201e495bd85Amith Yamasani * you may not use this file except in compliance with the License. 6d1d7c022c6f83e836acb74eed1a5a201e495bd85Amith Yamasani * You may obtain a copy of the License at 7d1d7c022c6f83e836acb74eed1a5a201e495bd85Amith Yamasani * 8d1d7c022c6f83e836acb74eed1a5a201e495bd85Amith Yamasani * http://www.apache.org/licenses/LICENSE-2.0 9d1d7c022c6f83e836acb74eed1a5a201e495bd85Amith Yamasani * 10d1d7c022c6f83e836acb74eed1a5a201e495bd85Amith Yamasani * Unless required by applicable law or agreed to in writing, software 11d1d7c022c6f83e836acb74eed1a5a201e495bd85Amith Yamasani * distributed under the License is distributed on an "AS IS" BASIS, 12d1d7c022c6f83e836acb74eed1a5a201e495bd85Amith Yamasani * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d1d7c022c6f83e836acb74eed1a5a201e495bd85Amith Yamasani * See the License for the specific language governing permissions and 14d1d7c022c6f83e836acb74eed1a5a201e495bd85Amith Yamasani * limitations under the License. 15d1d7c022c6f83e836acb74eed1a5a201e495bd85Amith Yamasani */ 16d1d7c022c6f83e836acb74eed1a5a201e495bd85Amith Yamasani 17d1d7c022c6f83e836acb74eed1a5a201e495bd85Amith Yamasanipackage android.service.restrictions; 18d1d7c022c6f83e836acb74eed1a5a201e495bd85Amith Yamasani 19d1d7c022c6f83e836acb74eed1a5a201e495bd85Amith Yamasaniimport android.app.admin.DevicePolicyManager; 20d1d7c022c6f83e836acb74eed1a5a201e495bd85Amith Yamasaniimport android.content.BroadcastReceiver; 21d1d7c022c6f83e836acb74eed1a5a201e495bd85Amith Yamasaniimport android.content.Context; 22d1d7c022c6f83e836acb74eed1a5a201e495bd85Amith Yamasaniimport android.content.Intent; 23d1d7c022c6f83e836acb74eed1a5a201e495bd85Amith Yamasaniimport android.content.RestrictionsManager; 24d1d7c022c6f83e836acb74eed1a5a201e495bd85Amith Yamasaniimport android.os.PersistableBundle; 25d1d7c022c6f83e836acb74eed1a5a201e495bd85Amith Yamasani 26d1d7c022c6f83e836acb74eed1a5a201e495bd85Amith Yamasani/** 27d1d7c022c6f83e836acb74eed1a5a201e495bd85Amith Yamasani * Abstract implementation of a Restrictions Provider BroadcastReceiver. To implement a 28d1d7c022c6f83e836acb74eed1a5a201e495bd85Amith Yamasani * Restrictions Provider, extend from this class and implement the abstract methods. 29d1d7c022c6f83e836acb74eed1a5a201e495bd85Amith Yamasani * Export this receiver in the manifest. A profile owner device admin can then register this 30d1d7c022c6f83e836acb74eed1a5a201e495bd85Amith Yamasani * component as a Restrictions Provider using 31d1d7c022c6f83e836acb74eed1a5a201e495bd85Amith Yamasani * {@link DevicePolicyManager#setRestrictionsProvider(ComponentName, ComponentName)}. 32d1d7c022c6f83e836acb74eed1a5a201e495bd85Amith Yamasani * <p> 33d1d7c022c6f83e836acb74eed1a5a201e495bd85Amith Yamasani * The function of a Restrictions Provider is to transport permission requests from apps on this 34d1d7c022c6f83e836acb74eed1a5a201e495bd85Amith Yamasani * device to an administrator (most likely on a remote device or computer) and deliver back 35d1d7c022c6f83e836acb74eed1a5a201e495bd85Amith Yamasani * responses. The response should be sent back to the app via 36d1d7c022c6f83e836acb74eed1a5a201e495bd85Amith Yamasani * {@link RestrictionsManager#notifyPermissionResponse(String, PersistableBundle)}. 37d1d7c022c6f83e836acb74eed1a5a201e495bd85Amith Yamasani * 38d1d7c022c6f83e836acb74eed1a5a201e495bd85Amith Yamasani * @see RestrictionsManager 39d1d7c022c6f83e836acb74eed1a5a201e495bd85Amith Yamasani */ 40d1d7c022c6f83e836acb74eed1a5a201e495bd85Amith Yamasanipublic abstract class RestrictionsReceiver extends BroadcastReceiver { 41d1d7c022c6f83e836acb74eed1a5a201e495bd85Amith Yamasani 42d1d7c022c6f83e836acb74eed1a5a201e495bd85Amith Yamasani private static final String TAG = "RestrictionsReceiver"; 43d1d7c022c6f83e836acb74eed1a5a201e495bd85Amith Yamasani 44d1d7c022c6f83e836acb74eed1a5a201e495bd85Amith Yamasani /** 45d1d7c022c6f83e836acb74eed1a5a201e495bd85Amith Yamasani * An asynchronous permission request made by an application for an operation that requires 46d1d7c022c6f83e836acb74eed1a5a201e495bd85Amith Yamasani * authorization by a local or remote administrator other than the user. The Restrictions 47d1d7c022c6f83e836acb74eed1a5a201e495bd85Amith Yamasani * Provider should transfer the request to the administrator and deliver back a response, when 48d1d7c022c6f83e836acb74eed1a5a201e495bd85Amith Yamasani * available. The calling application is aware that the response could take an indefinite 49d1d7c022c6f83e836acb74eed1a5a201e495bd85Amith Yamasani * amount of time. 50d1d7c022c6f83e836acb74eed1a5a201e495bd85Amith Yamasani * <p> 51d1d7c022c6f83e836acb74eed1a5a201e495bd85Amith Yamasani * If the request bundle contains the key {@link RestrictionsManager#REQUEST_KEY_NEW_REQUEST}, 52d1d7c022c6f83e836acb74eed1a5a201e495bd85Amith Yamasani * then a new request must be sent. Otherwise the provider can look up any previous response 53d1d7c022c6f83e836acb74eed1a5a201e495bd85Amith Yamasani * to the same requestId and return the cached response. 54d1d7c022c6f83e836acb74eed1a5a201e495bd85Amith Yamasani * 55d1d7c022c6f83e836acb74eed1a5a201e495bd85Amith Yamasani * @param packageName the application requesting permission. 56d1d7c022c6f83e836acb74eed1a5a201e495bd85Amith Yamasani * @param requestType the type of request, which determines the content and presentation of 57d1d7c022c6f83e836acb74eed1a5a201e495bd85Amith Yamasani * the request data. 58d1d7c022c6f83e836acb74eed1a5a201e495bd85Amith Yamasani * @param request the request data bundle containing at a minimum a request id. 59d1d7c022c6f83e836acb74eed1a5a201e495bd85Amith Yamasani * 60d1d7c022c6f83e836acb74eed1a5a201e495bd85Amith Yamasani * @see RestrictionsManager#REQUEST_TYPE_APPROVAL 61d1d7c022c6f83e836acb74eed1a5a201e495bd85Amith Yamasani * @see RestrictionsManager#REQUEST_TYPE_LOCAL_APPROVAL 62d1d7c022c6f83e836acb74eed1a5a201e495bd85Amith Yamasani * @see RestrictionsManager#REQUEST_KEY_ID 63d1d7c022c6f83e836acb74eed1a5a201e495bd85Amith Yamasani */ 64d1d7c022c6f83e836acb74eed1a5a201e495bd85Amith Yamasani public abstract void onRequestPermission(Context context, 65d1d7c022c6f83e836acb74eed1a5a201e495bd85Amith Yamasani String packageName, String requestType, String requestId, PersistableBundle request); 66d1d7c022c6f83e836acb74eed1a5a201e495bd85Amith Yamasani 67d1d7c022c6f83e836acb74eed1a5a201e495bd85Amith Yamasani /** 68d1d7c022c6f83e836acb74eed1a5a201e495bd85Amith Yamasani * Intercept standard Restrictions Provider broadcasts. Implementations 69d1d7c022c6f83e836acb74eed1a5a201e495bd85Amith Yamasani * should not override this method; it is better to implement the 70d1d7c022c6f83e836acb74eed1a5a201e495bd85Amith Yamasani * convenience callbacks for each action. 71d1d7c022c6f83e836acb74eed1a5a201e495bd85Amith Yamasani */ 72d1d7c022c6f83e836acb74eed1a5a201e495bd85Amith Yamasani @Override 73d1d7c022c6f83e836acb74eed1a5a201e495bd85Amith Yamasani public void onReceive(Context context, Intent intent) { 74d1d7c022c6f83e836acb74eed1a5a201e495bd85Amith Yamasani String action = intent.getAction(); 75d1d7c022c6f83e836acb74eed1a5a201e495bd85Amith Yamasani 76d1d7c022c6f83e836acb74eed1a5a201e495bd85Amith Yamasani if (RestrictionsManager.ACTION_REQUEST_PERMISSION.equals(action)) { 77d1d7c022c6f83e836acb74eed1a5a201e495bd85Amith Yamasani String packageName = intent.getStringExtra(RestrictionsManager.EXTRA_PACKAGE_NAME); 78d1d7c022c6f83e836acb74eed1a5a201e495bd85Amith Yamasani String requestType = intent.getStringExtra(RestrictionsManager.EXTRA_REQUEST_TYPE); 79d1d7c022c6f83e836acb74eed1a5a201e495bd85Amith Yamasani String requestId = intent.getStringExtra(RestrictionsManager.EXTRA_REQUEST_ID); 80d1d7c022c6f83e836acb74eed1a5a201e495bd85Amith Yamasani PersistableBundle request = (PersistableBundle) 81d1d7c022c6f83e836acb74eed1a5a201e495bd85Amith Yamasani intent.getParcelableExtra(RestrictionsManager.EXTRA_REQUEST_BUNDLE); 82d1d7c022c6f83e836acb74eed1a5a201e495bd85Amith Yamasani onRequestPermission(context, packageName, requestType, requestId, request); 83d1d7c022c6f83e836acb74eed1a5a201e495bd85Amith Yamasani } 84d1d7c022c6f83e836acb74eed1a5a201e495bd85Amith Yamasani } 85d1d7c022c6f83e836acb74eed1a5a201e495bd85Amith Yamasani} 86