Home | History | Annotate | Download | only in enterprise
      1 page.title=Building a Work Policy Controller
      2 page.metaDescription=Learn how to develop a Work Policy Controller to create and administer a managed profile on an employee's device.
      3 @jd:body
      4 
      5 <div id="tb-wrapper">
      6 <div id="tb">
      7 
      8 <h2>This lesson teaches you to</h2>
      9 <ol>
     10  <li><a href="#after_creating_profile">Create a Managed Profile</a></li>
     11  <li><a href="#set_up_policies">Set Up Device Policies</a></li>
     12  <li><a href="#apply_restrictions">Apply App Restrictions</a></li>
     13 </ol>
     14 
     15 <!-- related docs (NOT javadocs) -->
     16 
     17 <h2>
     18   You should also read
     19 </h2>
     20 
     21 <ul>
     22   <li>
     23     <a href="{@docRoot}guide/topics/admin/device-admin.html">Device
     24     Administration</a>
     25   </li>
     26 </ul>
     27 
     28 <h2>Resources</h2>
     29 <ul>
     30 
     31   <li>
     32     <a href=
     33     "{@docRoot}samples/BasicManagedProfile/index.html">BasicManagedProfile</a>
     34   </li>
     35 
     36   <li>
     37     <a href=
     38     "{@docRoot}samples/AppRestrictionEnforcer/index.html">AppRestrictionEnforcer</a>
     39   </li>
     40 </ul>
     41 
     42 </div>
     43 </div>
     44 
     45 
     46 <p>
     47   In an Android for Work deployment, an enterprise needs to maintain control
     48   over certain aspects of the employees' devices. The enterprise needs to
     49   ensure that work-related information is encrypted and is kept separate from
     50   employees' personal data. The enterprise may also need to limit device
     51   capabilities, such as whether the device is allowed to use its camera. And
     52   the enterprise may require that approved apps provide app restrictions, so
     53   the enterprise can turn app capability on or off as needed.
     54 </p>
     55 
     56 <p>
     57   To handle these tasks, an enterprise develops and deploys a Work Policy
     58   Controller app. This app is installed on each employee's device. The
     59   controller app installed on each employee's device and creates a work user
     60   profile, which accesses enterprise apps and data separately from the user's
     61   personal account. The controller app also acts as the
     62   bridge between the enterprise's management software and the device; the
     63   enterprise tells the controller app when it needs to make configuration
     64   changes, and the controller app makes the appropriate settings changes for the
     65   device and for other apps.
     66 </p>
     67 
     68 <p>
     69   This lesson describes how to develop a Work Policy Controller app for devices
     70   in an Android for Work deployment. The lesson describes how to create a work
     71   user profile, how to set device policies, and how to apply
     72   restrictions to other apps running on the managed profile.
     73 </p>
     74 
     75 <p class="note">
     76   <strong>Note:</strong> This lesson does not cover the situation where the
     77   only profile on the device is the managed profile, under the enterprise's
     78   control.
     79 </p>
     80 
     81 <h2 id="overview">Device Administration Overview</h2>
     82 
     83 <p>
     84   In an Android for Work deployment, the enterprise administrator can set
     85   policies to control the behavior of employees' devices and apps. The
     86   enterprise administrator sets these policies with software provided by their
     87   Enterprise Mobility Management (EMM) provider. The EMM software communicates
     88   with a Work Policy Controller on each device. The Work Policy Controller, in
     89   turn, manages the settings and behavior of the work user profile on each
     90   individuals device.
     91 </p>
     92 
     93 <p class="note">
     94   <strong>Note:</strong> A Work Policy Controller is built on the existing
     95   model used for device administration applications, as described in <a href=
     96   "{@docRoot}guide/topics/admin/device-admin.html">Device Administration</a>.
     97   In particular, your app needs to create a subclass of {@link
     98   android.app.admin.DeviceAdminReceiver}, as described in that document.
     99 </p>
    100 
    101 <h3 id="managed_profiles">Managed profiles</h3>
    102 
    103 <p>
    104   Users often want to use their personal devices in an enterprise setting. This
    105   situation can present enterprises with a dilemma. If the user can use their
    106   own device, the enterprise has to worry that confidential information (like
    107   employee emails and contacts) are on a device the enterprise does not
    108   control.
    109 </p>
    110 
    111 <p>
    112   To address this situation, Android 5.0 (API level 21) allows enterprises to
    113   set up a special work user profile using the Managed Profile API. This
    114   user profile is called a <em>managed profile</em>, or a <em>work profile</em>
    115   in the Android for Work program. If a device has a
    116   managed profile for work, the profile's settings are under the control of the
    117   enterprise administrator. The administrator can choose which apps are allowed
    118   for that profile, and can control just what device features are available to
    119   the profile.
    120 </p>
    121 
    122 <h2 id="create_profile">Create a Managed Profile</h2>
    123 
    124 <p>To create a managed profile on a device that already has a personal profile,
    125 first check that the device can support a managed profile, by seeing if the
    126 device supports the {@link
    127 android.content.pm.PackageManager#FEATURE_MANAGED_USERS FEATURE_MANAGED_USERS}
    128 system feature:</p>
    129 
    130 <pre>PackageManager pm = getPackageManager();
    131 if (!pm.hasSystemFeature(PackageManager.FEATURE_MANAGED_USERS)) {
    132 
    133     // This device does not support native managed profiles!
    134 
    135 }</pre>
    136 
    137 <p>If the device supports managed profiles, create one by sending an intent with
    138 an {@link android.app.admin.DevicePolicyManager#ACTION_PROVISION_MANAGED_PROFILE
    139 ACTION_PROVISION_MANAGED_PROFILE} action. Include the device admin package
    140 name as an extra.</p>
    141 
    142 <pre>Activity provisioningActivity = getActivity();
    143 
    144 // You'll need the package name for the WPC app.
    145 String myWPCPackageName = "com.example.myWPCApp";
    146 
    147 // Set up the provisioning intent
    148 Intent provisioningIntent =
    149         new Intent("android.app.action.PROVISION_MANAGED_PROFILE");
    150 intent.putExtra(myWPCPackageName,
    151         provisioningActivity.getApplicationContext().getPackageName());
    152 
    153 if (provisioningIntent.resolveActivity(provisioningActivity.getPackageManager())
    154          == null) {
    155 
    156     // No handler for intent! Can't provision this device.
    157     // Show an error message and cancel.
    158 } else {
    159 
    160     // REQUEST_PROVISION_MANAGED_PROFILE is defined
    161     // to be a suitable request code
    162     startActivityForResult(provisioningIntent,
    163             REQUEST_PROVISION_MANAGED_PROFILE);
    164     provisioningActivity.finish();
    165 }</pre>
    166 
    167 <p>The system responds to this intent by doing the following:</p>
    168 
    169 <ul>
    170   <li>Verifies that the device is encrypted. If it is not, the system prompts
    171   the user to encrypt the device before proceeding.
    172   </li>
    173 
    174   <li>Creates a managed profile.
    175   </li>
    176 
    177   <li>Removes non-required applications from the managed profile.
    178   </li>
    179 
    180   <li>Copies the Work Policy Controller application into the managed profile and
    181     sets it as the profile owner.
    182   </li>
    183 </ul>
    184 
    185 <p>Override {@link android.app.Activity#onActivityResult onActivityResult()} to
    186 see whether the provisioning was successful, as shown in the following 
    187 example code:</p>
    188 
    189 <pre>&#64;Override
    190 public void onActivityResult(int requestCode, int resultCode, Intent data) {
    191 
    192     // Check if this is the result of the provisioning activity
    193     if (requestCode == REQUEST_PROVISION_MANAGED_PROFILE) {
    194 
    195         // If provisioning was successful, the result code is 
    196         // Activity.RESULT_OK
    197         if (resultCode == Activity.RESULT_OK) {
    198             // Hurray! Managed profile created and provisioned!
    199         } else {
    200             // Boo! Provisioning failed!
    201         }
    202         return;
    203 
    204     } else {
    205         // This is the result of some other activity, call the superclass
    206         super.onActivityResult(requestCode, resultCode, data);
    207     }
    208 }</pre>
    209 
    210 <h3 id="after_creating_profile">After Creating the Managed Profile</h3>
    211 
    212 <p>When the profile has been provisioned, the system calls the Work Policy
    213 Controller app's {@link
    214 android.app.admin.DeviceAdminReceiver#onProfileProvisioningComplete
    215 DeviceAdminReceiver.onProfileProvisioningComplete()} method. Override this
    216 callback method to finish enabling the managed profile.</p>
    217 
    218 <p>Typically, your {@link
    219 android.app.admin.DeviceAdminReceiver#onProfileProvisioningComplete
    220 DeviceAdminReceiver.onProfileProvisioningComplete()} callback implementation
    221 would perform these tasks:</p>
    222 
    223 <ul>
    224   <li>Verify that the device is complying with the EMM's device policies, as
    225   described in <a href="#set_up_policies">Set Up Device Policies</a>
    226   </li>
    227 
    228   <li>Enable any system applications that the administrator chooses to make
    229   available within the managed profile, using {@link
    230   android.app.admin.DevicePolicyManager#enableSystemApp
    231   DevicePolicyManager.enableSystemApp()}   </li>
    232 
    233   <li>If the device uses Google Play for Work, add the Google account
    234   to the managed profile with {@link android.accounts.AccountManager#addAccount
    235   AccountManager.addAccount()}, so administrators can install
    236   applications to the device
    237   </li>
    238 </ul>
    239 
    240 <p>Once you have completed these tasks, call the device policy manager's
    241 {@link android.app.admin.DevicePolicyManager#setProfileEnabled
    242 setProfileEnabled()} method to activate the managed profile:</p>
    243 
    244 
    245 <pre>// Get the device policy manager
    246 DevicePolicyManager myDevicePolicyMgr =
    247         (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
    248 
    249 ComponentName componentName = myDeviceAdminReceiver.getComponentName(this);
    250 
    251 // Set the name for the newly created managed profile.
    252 myDevicePolicyMgr.setProfileName(componentName, "My New Managed Profile");
    253 
    254 // ...and enable the profile
    255 manager.setProfileEnabled(componentName);</pre>
    256 
    257 <h2 id="set_up_policies">Set Up Device Policies</h2>
    258 
    259 <p>
    260   The Work Policy Controller app is responsible for applying the enterprise's
    261   device policies. For example, a particular enterprise might require that all
    262   devices become locked after a certain number of failed attempts to enter the
    263   device password. The controller app queries the EMM to find out what
    264   the current policies are, then uses the <a href=
    265   "{@docRoot}guide/topics/admin/device-admin.html">Device Administration</a>
    266   API to apply those policies.
    267 </p>
    268 
    269 <p>For information on how to apply device policies, see the 
    270 <a href="{@docRoot}guide/topics/admin/device-admin.html#policies">Device
    271 Administration</a> guide.</p>
    272 
    273 
    274 <h2 id="apply_restrictions">Apply App Restrictions</h2>
    275 
    276 <p>Enterprise environments may require that approved apps implement apps
    277 implement security or feature restrictions. App developers must implement these
    278 restrictions and declare them for use by enterprise administrators, as described
    279 in <a href="{@docRoot}training/enterprise/app-restrictions.html">Implementing
    280 App Restrictions</a>. The Work Policy Controller receives restriction changes
    281 from the enterprise administrator, and forwards those restriction changes to the
    282 apps.</p>
    283 
    284 <p>For example, a particular news app might have a restriction setting that
    285 controls whether the app is allowed to download videos over a cellular
    286 network. When the EMM wants to disable cellular downloads, it sends a
    287 notification to the controller app. The controller app, in turn,
    288 notifies the news app that the restriction setting has changed.</p>
    289 
    290 <p class="note"><strong>Note:</strong> This document covers how the Work Policy
    291 Controller app changes the restriction settings for the other apps on the
    292 managed profile. Details on how the Work Policy Controller app communicates with
    293 the EMM are out of scope for this document.</p>
    294 
    295 <p>To change an app's restrictions, call the {@link
    296 android.app.admin.DevicePolicyManager#setApplicationRestrictions
    297 DevicePolicyManager.setApplicationRestrictions()} method. This method is passed
    298 three parameters: the controller app's {@link
    299 android.app.admin.DeviceAdminReceiver}, the package name of the app whose
    300 restrictions are being changed, and a {@link android.os.Bundle Bundle} that
    301 contains the restrictions you want to set.</p>
    302 
    303 <p>For example, suppose there's an app on the managed profile with the package
    304 name <code>"com.example.newsfetcher"</code>. This app has a single boolean
    305 restriction that can be configured, with the key
    306 <code>"downloadByCellular"</code>. If this restriction is set to
    307 <code>false</code>, the newsfetcher app is not allowed to download data through
    308 a cellular network; it must use a Wi-Fi network instead.</p>
    309 
    310 <p>
    311   If your Work Policy Controller app needs to turn off cellular downloads, it
    312   would first fetch the device policy service object, as described above. It
    313   then assembles a restrictions bundle and passes this bundle to {@link
    314   android.app.admin.DevicePolicyManager#setApplicationRestrictions
    315   setApplicationRestrictions()}:
    316 </p>
    317 
    318 <pre>// Fetch the DevicePolicyManager
    319 DevicePolicyManager myDevicePolicyMgr =
    320         (DevicePolicyManager) thisActivity
    321                 .getSystemService(Context.DEVICE_POLICY_SERVICE);
    322 
    323 // Set up the restrictions bundle
    324 bundle restrictionsBundle = new Bundle();
    325 restrictionsBundle.putBoolean("downloadByCellular", false);
    326 
    327 // Pass the restrictions to the policy manager. Assume the WPC app
    328 // already has a DeviceAdminReceiver defined (myDeviceAdminReceiver).
    329 myDevicePolicyMgr.setApplicationRestrictions(
    330         myDeviceAdminReceiver, "com.example.newsfetcher", restrictionsBundle);</pre>
    331 
    332 
    333 <p class="note"><strong>Note:</strong> The device policy service conveys the restrictions
    334 change to the app you name. However, it is up to that app to actually implement
    335 the restriction. For example, in this case, the app would be responsible for
    336 disabling its ability to use cellular networks for video downloads. Setting the
    337 restriction does not cause the system to enforce this restriction on the app.
    338 For more information, see <a href="{@docRoot}training/enterprise/app-
    339 restrictions.html">Implementing App Restrictions</a>.</p>
    340