1*90c8c64dSAndroid Build Coastguard Worker /*
2*90c8c64dSAndroid Build Coastguard Worker  * Copyright (C) 2014 The Android Open Source Project
3*90c8c64dSAndroid Build Coastguard Worker  *
4*90c8c64dSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*90c8c64dSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*90c8c64dSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*90c8c64dSAndroid Build Coastguard Worker  *
8*90c8c64dSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*90c8c64dSAndroid Build Coastguard Worker  *
10*90c8c64dSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*90c8c64dSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*90c8c64dSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*90c8c64dSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*90c8c64dSAndroid Build Coastguard Worker  * limitations under the License.
15*90c8c64dSAndroid Build Coastguard Worker  */
16*90c8c64dSAndroid Build Coastguard Worker 
17*90c8c64dSAndroid Build Coastguard Worker package com.example.android.basicmanagedprofile;
18*90c8c64dSAndroid Build Coastguard Worker 
19*90c8c64dSAndroid Build Coastguard Worker import android.app.Activity;
20*90c8c64dSAndroid Build Coastguard Worker import android.app.AlertDialog;
21*90c8c64dSAndroid Build Coastguard Worker import android.app.Fragment;
22*90c8c64dSAndroid Build Coastguard Worker import android.app.admin.DevicePolicyManager;
23*90c8c64dSAndroid Build Coastguard Worker import android.content.ActivityNotFoundException;
24*90c8c64dSAndroid Build Coastguard Worker import android.content.Context;
25*90c8c64dSAndroid Build Coastguard Worker import android.content.DialogInterface;
26*90c8c64dSAndroid Build Coastguard Worker import android.content.Intent;
27*90c8c64dSAndroid Build Coastguard Worker import android.content.IntentFilter;
28*90c8c64dSAndroid Build Coastguard Worker import android.content.pm.ApplicationInfo;
29*90c8c64dSAndroid Build Coastguard Worker import android.content.pm.PackageManager;
30*90c8c64dSAndroid Build Coastguard Worker import android.os.Bundle;
31*90c8c64dSAndroid Build Coastguard Worker import android.util.Log;
32*90c8c64dSAndroid Build Coastguard Worker import android.view.LayoutInflater;
33*90c8c64dSAndroid Build Coastguard Worker import android.view.View;
34*90c8c64dSAndroid Build Coastguard Worker import android.view.ViewGroup;
35*90c8c64dSAndroid Build Coastguard Worker import android.widget.Button;
36*90c8c64dSAndroid Build Coastguard Worker import android.widget.CompoundButton;
37*90c8c64dSAndroid Build Coastguard Worker import android.widget.ScrollView;
38*90c8c64dSAndroid Build Coastguard Worker import android.widget.Switch;
39*90c8c64dSAndroid Build Coastguard Worker import android.widget.TextView;
40*90c8c64dSAndroid Build Coastguard Worker import android.widget.Toast;
41*90c8c64dSAndroid Build Coastguard Worker 
42*90c8c64dSAndroid Build Coastguard Worker import static android.app.admin.DevicePolicyManager.FLAG_MANAGED_CAN_ACCESS_PARENT;
43*90c8c64dSAndroid Build Coastguard Worker import static android.app.admin.DevicePolicyManager.FLAG_PARENT_CAN_ACCESS_MANAGED;
44*90c8c64dSAndroid Build Coastguard Worker 
45*90c8c64dSAndroid Build Coastguard Worker /**
46*90c8c64dSAndroid Build Coastguard Worker  * Provides several functions that are available in a managed profile. This includes
47*90c8c64dSAndroid Build Coastguard Worker  * enabling/disabling other apps, setting app restrictions, enabling/disabling intent forwarding,
48*90c8c64dSAndroid Build Coastguard Worker  * and wiping out all the data in the profile.
49*90c8c64dSAndroid Build Coastguard Worker  */
50*90c8c64dSAndroid Build Coastguard Worker public class BasicManagedProfileFragment extends Fragment
51*90c8c64dSAndroid Build Coastguard Worker         implements View.OnClickListener,
52*90c8c64dSAndroid Build Coastguard Worker         CompoundButton.OnCheckedChangeListener {
53*90c8c64dSAndroid Build Coastguard Worker 
54*90c8c64dSAndroid Build Coastguard Worker     /**
55*90c8c64dSAndroid Build Coastguard Worker      * Tag for logging.
56*90c8c64dSAndroid Build Coastguard Worker      */
57*90c8c64dSAndroid Build Coastguard Worker     private static final String TAG = "BasicManagedProfileFragment";
58*90c8c64dSAndroid Build Coastguard Worker 
59*90c8c64dSAndroid Build Coastguard Worker     /**
60*90c8c64dSAndroid Build Coastguard Worker      * Package name of calculator
61*90c8c64dSAndroid Build Coastguard Worker      */
62*90c8c64dSAndroid Build Coastguard Worker     private static final String PACKAGE_NAME_CALCULATOR = "com.android.calculator2";
63*90c8c64dSAndroid Build Coastguard Worker 
64*90c8c64dSAndroid Build Coastguard Worker     /**
65*90c8c64dSAndroid Build Coastguard Worker      * Package name of Chrome
66*90c8c64dSAndroid Build Coastguard Worker      */
67*90c8c64dSAndroid Build Coastguard Worker     private static final String PACKAGE_NAME_CHROME = "com.android.chrome";
68*90c8c64dSAndroid Build Coastguard Worker 
69*90c8c64dSAndroid Build Coastguard Worker     /**
70*90c8c64dSAndroid Build Coastguard Worker      * {@link Button} to remove this managed profile.
71*90c8c64dSAndroid Build Coastguard Worker      */
72*90c8c64dSAndroid Build Coastguard Worker     private Button mButtonRemoveProfile;
73*90c8c64dSAndroid Build Coastguard Worker 
74*90c8c64dSAndroid Build Coastguard Worker     /**
75*90c8c64dSAndroid Build Coastguard Worker      * Whether the calculator app is enabled in this profile
76*90c8c64dSAndroid Build Coastguard Worker      */
77*90c8c64dSAndroid Build Coastguard Worker     private boolean mCalculatorEnabled;
78*90c8c64dSAndroid Build Coastguard Worker 
79*90c8c64dSAndroid Build Coastguard Worker     /**
80*90c8c64dSAndroid Build Coastguard Worker      * Whether Chrome is enabled in this profile
81*90c8c64dSAndroid Build Coastguard Worker      */
82*90c8c64dSAndroid Build Coastguard Worker     private boolean mChromeEnabled;
83*90c8c64dSAndroid Build Coastguard Worker 
BasicManagedProfileFragment()84*90c8c64dSAndroid Build Coastguard Worker     public BasicManagedProfileFragment() {
85*90c8c64dSAndroid Build Coastguard Worker     }
86*90c8c64dSAndroid Build Coastguard Worker 
newInstance()87*90c8c64dSAndroid Build Coastguard Worker     public static BasicManagedProfileFragment newInstance() {
88*90c8c64dSAndroid Build Coastguard Worker         return new BasicManagedProfileFragment();
89*90c8c64dSAndroid Build Coastguard Worker     }
90*90c8c64dSAndroid Build Coastguard Worker 
91*90c8c64dSAndroid Build Coastguard Worker     @Override
onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)92*90c8c64dSAndroid Build Coastguard Worker     public View onCreateView(LayoutInflater inflater, ViewGroup container,
93*90c8c64dSAndroid Build Coastguard Worker                              Bundle savedInstanceState) {
94*90c8c64dSAndroid Build Coastguard Worker         return inflater.inflate(R.layout.fragment_main, container, false);
95*90c8c64dSAndroid Build Coastguard Worker     }
96*90c8c64dSAndroid Build Coastguard Worker 
97*90c8c64dSAndroid Build Coastguard Worker     @Override
onAttach(Activity activity)98*90c8c64dSAndroid Build Coastguard Worker     public void onAttach(Activity activity) {
99*90c8c64dSAndroid Build Coastguard Worker         super.onAttach(activity);
100*90c8c64dSAndroid Build Coastguard Worker         // Retrieves whether the calculator app is enabled in this profile
101*90c8c64dSAndroid Build Coastguard Worker         mCalculatorEnabled = isApplicationEnabled(PACKAGE_NAME_CALCULATOR);
102*90c8c64dSAndroid Build Coastguard Worker         // Retrieves whether Chrome is enabled in this profile
103*90c8c64dSAndroid Build Coastguard Worker         mChromeEnabled = isApplicationEnabled(PACKAGE_NAME_CHROME);
104*90c8c64dSAndroid Build Coastguard Worker     }
105*90c8c64dSAndroid Build Coastguard Worker 
106*90c8c64dSAndroid Build Coastguard Worker     /**
107*90c8c64dSAndroid Build Coastguard Worker      * Checks if the application is available in this profile.
108*90c8c64dSAndroid Build Coastguard Worker      *
109*90c8c64dSAndroid Build Coastguard Worker      * @param packageName The package name
110*90c8c64dSAndroid Build Coastguard Worker      * @return True if the application is available in this profile.
111*90c8c64dSAndroid Build Coastguard Worker      */
isApplicationEnabled(String packageName)112*90c8c64dSAndroid Build Coastguard Worker     private boolean isApplicationEnabled(String packageName) {
113*90c8c64dSAndroid Build Coastguard Worker         Activity activity = getActivity();
114*90c8c64dSAndroid Build Coastguard Worker         PackageManager packageManager = activity.getPackageManager();
115*90c8c64dSAndroid Build Coastguard Worker         try {
116*90c8c64dSAndroid Build Coastguard Worker             ApplicationInfo applicationInfo = packageManager.getApplicationInfo(
117*90c8c64dSAndroid Build Coastguard Worker                     packageName, PackageManager.GET_UNINSTALLED_PACKAGES);
118*90c8c64dSAndroid Build Coastguard Worker             // Return false if the app is not installed in this profile
119*90c8c64dSAndroid Build Coastguard Worker             if (0 == (applicationInfo.flags & ApplicationInfo.FLAG_INSTALLED)) {
120*90c8c64dSAndroid Build Coastguard Worker                 return false;
121*90c8c64dSAndroid Build Coastguard Worker             }
122*90c8c64dSAndroid Build Coastguard Worker             // Check if the app is not hidden in this profile
123*90c8c64dSAndroid Build Coastguard Worker             DevicePolicyManager devicePolicyManager =
124*90c8c64dSAndroid Build Coastguard Worker                     (DevicePolicyManager) activity.getSystemService(Activity.DEVICE_POLICY_SERVICE);
125*90c8c64dSAndroid Build Coastguard Worker             return !devicePolicyManager.isApplicationHidden(
126*90c8c64dSAndroid Build Coastguard Worker                     BasicDeviceAdminReceiver.getComponentName(activity), packageName);
127*90c8c64dSAndroid Build Coastguard Worker         } catch (PackageManager.NameNotFoundException e) {
128*90c8c64dSAndroid Build Coastguard Worker             return false;
129*90c8c64dSAndroid Build Coastguard Worker         }
130*90c8c64dSAndroid Build Coastguard Worker     }
131*90c8c64dSAndroid Build Coastguard Worker 
132*90c8c64dSAndroid Build Coastguard Worker     @Override
onViewCreated(View view, Bundle savedInstanceState)133*90c8c64dSAndroid Build Coastguard Worker     public void onViewCreated(View view, Bundle savedInstanceState) {
134*90c8c64dSAndroid Build Coastguard Worker         // Bind event listeners and initial states
135*90c8c64dSAndroid Build Coastguard Worker         view.findViewById(R.id.set_chrome_restrictions).setOnClickListener(this);
136*90c8c64dSAndroid Build Coastguard Worker         view.findViewById(R.id.clear_chrome_restrictions).setOnClickListener(this);
137*90c8c64dSAndroid Build Coastguard Worker         view.findViewById(R.id.enable_forwarding).setOnClickListener(this);
138*90c8c64dSAndroid Build Coastguard Worker         view.findViewById(R.id.disable_forwarding).setOnClickListener(this);
139*90c8c64dSAndroid Build Coastguard Worker         view.findViewById(R.id.send_intent).setOnClickListener(this);
140*90c8c64dSAndroid Build Coastguard Worker         mButtonRemoveProfile = (Button) view.findViewById(R.id.remove_profile);
141*90c8c64dSAndroid Build Coastguard Worker         mButtonRemoveProfile.setOnClickListener(this);
142*90c8c64dSAndroid Build Coastguard Worker         Switch toggleCalculator = (Switch) view.findViewById(R.id.toggle_calculator);
143*90c8c64dSAndroid Build Coastguard Worker         toggleCalculator.setChecked(mCalculatorEnabled);
144*90c8c64dSAndroid Build Coastguard Worker         toggleCalculator.setOnCheckedChangeListener(this);
145*90c8c64dSAndroid Build Coastguard Worker         Switch toggleChrome = (Switch) view.findViewById(R.id.toggle_chrome);
146*90c8c64dSAndroid Build Coastguard Worker         toggleChrome.setChecked(mChromeEnabled);
147*90c8c64dSAndroid Build Coastguard Worker         toggleChrome.setOnCheckedChangeListener(this);
148*90c8c64dSAndroid Build Coastguard Worker     }
149*90c8c64dSAndroid Build Coastguard Worker 
150*90c8c64dSAndroid Build Coastguard Worker     @Override
onClick(View view)151*90c8c64dSAndroid Build Coastguard Worker     public void onClick(View view) {
152*90c8c64dSAndroid Build Coastguard Worker         switch (view.getId()) {
153*90c8c64dSAndroid Build Coastguard Worker             case R.id.set_chrome_restrictions: {
154*90c8c64dSAndroid Build Coastguard Worker                 setChromeRestrictions();
155*90c8c64dSAndroid Build Coastguard Worker                 break;
156*90c8c64dSAndroid Build Coastguard Worker             }
157*90c8c64dSAndroid Build Coastguard Worker             case R.id.clear_chrome_restrictions: {
158*90c8c64dSAndroid Build Coastguard Worker                 clearChromeRestrictions();
159*90c8c64dSAndroid Build Coastguard Worker                 break;
160*90c8c64dSAndroid Build Coastguard Worker             }
161*90c8c64dSAndroid Build Coastguard Worker             case R.id.enable_forwarding: {
162*90c8c64dSAndroid Build Coastguard Worker                 enableForwarding();
163*90c8c64dSAndroid Build Coastguard Worker                 break;
164*90c8c64dSAndroid Build Coastguard Worker             }
165*90c8c64dSAndroid Build Coastguard Worker             case R.id.disable_forwarding: {
166*90c8c64dSAndroid Build Coastguard Worker                 disableForwarding();
167*90c8c64dSAndroid Build Coastguard Worker                 break;
168*90c8c64dSAndroid Build Coastguard Worker             }
169*90c8c64dSAndroid Build Coastguard Worker             case R.id.send_intent: {
170*90c8c64dSAndroid Build Coastguard Worker                 sendIntent();
171*90c8c64dSAndroid Build Coastguard Worker                 break;
172*90c8c64dSAndroid Build Coastguard Worker             }
173*90c8c64dSAndroid Build Coastguard Worker             case R.id.remove_profile: {
174*90c8c64dSAndroid Build Coastguard Worker                 mButtonRemoveProfile.setEnabled(false);
175*90c8c64dSAndroid Build Coastguard Worker                 removeProfile();
176*90c8c64dSAndroid Build Coastguard Worker                 break;
177*90c8c64dSAndroid Build Coastguard Worker             }
178*90c8c64dSAndroid Build Coastguard Worker         }
179*90c8c64dSAndroid Build Coastguard Worker     }
180*90c8c64dSAndroid Build Coastguard Worker 
181*90c8c64dSAndroid Build Coastguard Worker     @Override
onCheckedChanged(CompoundButton compoundButton, boolean checked)182*90c8c64dSAndroid Build Coastguard Worker     public void onCheckedChanged(CompoundButton compoundButton, boolean checked) {
183*90c8c64dSAndroid Build Coastguard Worker         switch (compoundButton.getId()) {
184*90c8c64dSAndroid Build Coastguard Worker             case R.id.toggle_calculator: {
185*90c8c64dSAndroid Build Coastguard Worker                 setAppEnabled(PACKAGE_NAME_CALCULATOR, checked);
186*90c8c64dSAndroid Build Coastguard Worker                 mCalculatorEnabled = checked;
187*90c8c64dSAndroid Build Coastguard Worker                 break;
188*90c8c64dSAndroid Build Coastguard Worker             }
189*90c8c64dSAndroid Build Coastguard Worker             case R.id.toggle_chrome: {
190*90c8c64dSAndroid Build Coastguard Worker                 setAppEnabled(PACKAGE_NAME_CHROME, checked);
191*90c8c64dSAndroid Build Coastguard Worker                 mChromeEnabled = checked;
192*90c8c64dSAndroid Build Coastguard Worker                 break;
193*90c8c64dSAndroid Build Coastguard Worker             }
194*90c8c64dSAndroid Build Coastguard Worker         }
195*90c8c64dSAndroid Build Coastguard Worker     }
196*90c8c64dSAndroid Build Coastguard Worker 
197*90c8c64dSAndroid Build Coastguard Worker     /**
198*90c8c64dSAndroid Build Coastguard Worker      * Enables or disables the specified app in this profile.
199*90c8c64dSAndroid Build Coastguard Worker      *
200*90c8c64dSAndroid Build Coastguard Worker      * @param packageName The package name of the target app.
201*90c8c64dSAndroid Build Coastguard Worker      * @param enabled     Pass true to enable the app.
202*90c8c64dSAndroid Build Coastguard Worker      */
setAppEnabled(String packageName, boolean enabled)203*90c8c64dSAndroid Build Coastguard Worker     private void setAppEnabled(String packageName, boolean enabled) {
204*90c8c64dSAndroid Build Coastguard Worker         Activity activity = getActivity();
205*90c8c64dSAndroid Build Coastguard Worker         if (null == activity) {
206*90c8c64dSAndroid Build Coastguard Worker             return;
207*90c8c64dSAndroid Build Coastguard Worker         }
208*90c8c64dSAndroid Build Coastguard Worker         PackageManager packageManager = activity.getPackageManager();
209*90c8c64dSAndroid Build Coastguard Worker         DevicePolicyManager devicePolicyManager =
210*90c8c64dSAndroid Build Coastguard Worker                 (DevicePolicyManager) activity.getSystemService(Context.DEVICE_POLICY_SERVICE);
211*90c8c64dSAndroid Build Coastguard Worker         try {
212*90c8c64dSAndroid Build Coastguard Worker             ApplicationInfo applicationInfo = packageManager.getApplicationInfo(packageName,
213*90c8c64dSAndroid Build Coastguard Worker                     PackageManager.GET_UNINSTALLED_PACKAGES);
214*90c8c64dSAndroid Build Coastguard Worker             // Here, we check the ApplicationInfo of the target app, and see if the flags have
215*90c8c64dSAndroid Build Coastguard Worker             // ApplicationInfo.FLAG_INSTALLED turned on using bitwise operation.
216*90c8c64dSAndroid Build Coastguard Worker             if (0 == (applicationInfo.flags & ApplicationInfo.FLAG_INSTALLED)) {
217*90c8c64dSAndroid Build Coastguard Worker                 // If the app is not installed in this profile, we can enable it by
218*90c8c64dSAndroid Build Coastguard Worker                 // DPM.enableSystemApp
219*90c8c64dSAndroid Build Coastguard Worker                 if (enabled) {
220*90c8c64dSAndroid Build Coastguard Worker                     devicePolicyManager.enableSystemApp(
221*90c8c64dSAndroid Build Coastguard Worker                             BasicDeviceAdminReceiver.getComponentName(activity), packageName);
222*90c8c64dSAndroid Build Coastguard Worker                 } else {
223*90c8c64dSAndroid Build Coastguard Worker                     // But we cannot disable the app since it is already disabled
224*90c8c64dSAndroid Build Coastguard Worker                     Log.e(TAG, "Cannot disable this app: " + packageName);
225*90c8c64dSAndroid Build Coastguard Worker                     return;
226*90c8c64dSAndroid Build Coastguard Worker                 }
227*90c8c64dSAndroid Build Coastguard Worker             } else {
228*90c8c64dSAndroid Build Coastguard Worker                 // If the app is already installed, we can enable or disable it by
229*90c8c64dSAndroid Build Coastguard Worker                 // DPM.setApplicationHidden
230*90c8c64dSAndroid Build Coastguard Worker                 devicePolicyManager.setApplicationHidden(
231*90c8c64dSAndroid Build Coastguard Worker                         BasicDeviceAdminReceiver.getComponentName(activity), packageName, !enabled);
232*90c8c64dSAndroid Build Coastguard Worker             }
233*90c8c64dSAndroid Build Coastguard Worker             Toast.makeText(activity, enabled ? R.string.enabled : R.string.disabled,
234*90c8c64dSAndroid Build Coastguard Worker                     Toast.LENGTH_SHORT).show();
235*90c8c64dSAndroid Build Coastguard Worker         } catch (PackageManager.NameNotFoundException e) {
236*90c8c64dSAndroid Build Coastguard Worker             Log.e(TAG, "The app cannot be found: " + packageName, e);
237*90c8c64dSAndroid Build Coastguard Worker         }
238*90c8c64dSAndroid Build Coastguard Worker     }
239*90c8c64dSAndroid Build Coastguard Worker 
240*90c8c64dSAndroid Build Coastguard Worker     /**
241*90c8c64dSAndroid Build Coastguard Worker      * Sets restrictions to Chrome
242*90c8c64dSAndroid Build Coastguard Worker      */
setChromeRestrictions()243*90c8c64dSAndroid Build Coastguard Worker     private void setChromeRestrictions() {
244*90c8c64dSAndroid Build Coastguard Worker         final Activity activity = getActivity();
245*90c8c64dSAndroid Build Coastguard Worker         if (null == activity) {
246*90c8c64dSAndroid Build Coastguard Worker             return;
247*90c8c64dSAndroid Build Coastguard Worker         }
248*90c8c64dSAndroid Build Coastguard Worker         final DevicePolicyManager manager =
249*90c8c64dSAndroid Build Coastguard Worker             (DevicePolicyManager) activity.getSystemService(Context.DEVICE_POLICY_SERVICE);
250*90c8c64dSAndroid Build Coastguard Worker         final Bundle settings = new Bundle();
251*90c8c64dSAndroid Build Coastguard Worker         settings.putString("EditBookmarksEnabled", "false");
252*90c8c64dSAndroid Build Coastguard Worker         settings.putString("IncognitoModeAvailability", "1");
253*90c8c64dSAndroid Build Coastguard Worker         settings.putString("ManagedBookmarks",
254*90c8c64dSAndroid Build Coastguard Worker                            "[{\"name\": \"Chromium\", \"url\": \"http://chromium.org\"}, " +
255*90c8c64dSAndroid Build Coastguard Worker                            "{\"name\": \"Google\", \"url\": \"https://www.google.com\"}]");
256*90c8c64dSAndroid Build Coastguard Worker         settings.putString("DefaultSearchProviderEnabled", "true");
257*90c8c64dSAndroid Build Coastguard Worker         settings.putString("DefaultSearchProviderName", "\"LMGTFY\"");
258*90c8c64dSAndroid Build Coastguard Worker         settings.putString("DefaultSearchProviderSearchURL",
259*90c8c64dSAndroid Build Coastguard Worker                 "\"http://lmgtfy.com/?q={searchTerms}\"");
260*90c8c64dSAndroid Build Coastguard Worker         settings.putString("URLBlacklist", "[\"example.com\", \"example.org\"]");
261*90c8c64dSAndroid Build Coastguard Worker         StringBuilder message = new StringBuilder("Setting Chrome restrictions:");
262*90c8c64dSAndroid Build Coastguard Worker         for (String key : settings.keySet()) {
263*90c8c64dSAndroid Build Coastguard Worker             message.append("\n");
264*90c8c64dSAndroid Build Coastguard Worker             message.append(key);
265*90c8c64dSAndroid Build Coastguard Worker             message.append(": ");
266*90c8c64dSAndroid Build Coastguard Worker             message.append(settings.getString(key));
267*90c8c64dSAndroid Build Coastguard Worker         }
268*90c8c64dSAndroid Build Coastguard Worker         ScrollView view = new ScrollView(activity);
269*90c8c64dSAndroid Build Coastguard Worker         TextView text = new TextView(activity);
270*90c8c64dSAndroid Build Coastguard Worker         text.setText(message);
271*90c8c64dSAndroid Build Coastguard Worker         int size = (int) activity.getResources().getDimension(R.dimen.activity_horizontal_margin);
272*90c8c64dSAndroid Build Coastguard Worker         view.setPadding(size, size, size, size);
273*90c8c64dSAndroid Build Coastguard Worker         view.addView(text);
274*90c8c64dSAndroid Build Coastguard Worker         new AlertDialog.Builder(activity)
275*90c8c64dSAndroid Build Coastguard Worker                 .setView(view)
276*90c8c64dSAndroid Build Coastguard Worker                 .setNegativeButton(android.R.string.cancel, null)
277*90c8c64dSAndroid Build Coastguard Worker                 .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
278*90c8c64dSAndroid Build Coastguard Worker                     @Override
279*90c8c64dSAndroid Build Coastguard Worker                     public void onClick(DialogInterface dialogInterface, int i) {
280*90c8c64dSAndroid Build Coastguard Worker                         // This is how you can set restrictions to an app.
281*90c8c64dSAndroid Build Coastguard Worker                         // The format for settings in Bundle differs from app to app.
282*90c8c64dSAndroid Build Coastguard Worker                         manager.setApplicationRestrictions
283*90c8c64dSAndroid Build Coastguard Worker                                 (BasicDeviceAdminReceiver.getComponentName(activity),
284*90c8c64dSAndroid Build Coastguard Worker                                         PACKAGE_NAME_CHROME, settings);
285*90c8c64dSAndroid Build Coastguard Worker                         Toast.makeText(activity, R.string.restrictions_set,
286*90c8c64dSAndroid Build Coastguard Worker                                 Toast.LENGTH_SHORT).show();
287*90c8c64dSAndroid Build Coastguard Worker                     }
288*90c8c64dSAndroid Build Coastguard Worker                 })
289*90c8c64dSAndroid Build Coastguard Worker                 .show();
290*90c8c64dSAndroid Build Coastguard Worker     }
291*90c8c64dSAndroid Build Coastguard Worker 
292*90c8c64dSAndroid Build Coastguard Worker     /**
293*90c8c64dSAndroid Build Coastguard Worker      * Clears restrictions to Chrome
294*90c8c64dSAndroid Build Coastguard Worker      */
clearChromeRestrictions()295*90c8c64dSAndroid Build Coastguard Worker     private void clearChromeRestrictions() {
296*90c8c64dSAndroid Build Coastguard Worker         final Activity activity = getActivity();
297*90c8c64dSAndroid Build Coastguard Worker         if (null == activity) {
298*90c8c64dSAndroid Build Coastguard Worker             return;
299*90c8c64dSAndroid Build Coastguard Worker         }
300*90c8c64dSAndroid Build Coastguard Worker         final DevicePolicyManager manager =
301*90c8c64dSAndroid Build Coastguard Worker                 (DevicePolicyManager) activity.getSystemService(Context.DEVICE_POLICY_SERVICE);
302*90c8c64dSAndroid Build Coastguard Worker         // In order to clear restrictions, pass null as the restriction Bundle for
303*90c8c64dSAndroid Build Coastguard Worker         // setApplicationRestrictions
304*90c8c64dSAndroid Build Coastguard Worker         manager.setApplicationRestrictions
305*90c8c64dSAndroid Build Coastguard Worker                 (BasicDeviceAdminReceiver.getComponentName(activity),
306*90c8c64dSAndroid Build Coastguard Worker                         PACKAGE_NAME_CHROME, null);
307*90c8c64dSAndroid Build Coastguard Worker         Toast.makeText(activity, R.string.cleared, Toast.LENGTH_SHORT).show();
308*90c8c64dSAndroid Build Coastguard Worker     }
309*90c8c64dSAndroid Build Coastguard Worker 
310*90c8c64dSAndroid Build Coastguard Worker     /**
311*90c8c64dSAndroid Build Coastguard Worker      * Enables forwarding of share intent between private account and managed profile.
312*90c8c64dSAndroid Build Coastguard Worker      */
enableForwarding()313*90c8c64dSAndroid Build Coastguard Worker     private void enableForwarding() {
314*90c8c64dSAndroid Build Coastguard Worker         Activity activity = getActivity();
315*90c8c64dSAndroid Build Coastguard Worker         if (null == activity || activity.isFinishing()) {
316*90c8c64dSAndroid Build Coastguard Worker             return;
317*90c8c64dSAndroid Build Coastguard Worker         }
318*90c8c64dSAndroid Build Coastguard Worker         DevicePolicyManager manager =
319*90c8c64dSAndroid Build Coastguard Worker                 (DevicePolicyManager) activity.getSystemService(Context.DEVICE_POLICY_SERVICE);
320*90c8c64dSAndroid Build Coastguard Worker         try {
321*90c8c64dSAndroid Build Coastguard Worker             IntentFilter filter = new IntentFilter(Intent.ACTION_SEND);
322*90c8c64dSAndroid Build Coastguard Worker             filter.addDataType("text/plain");
323*90c8c64dSAndroid Build Coastguard Worker             filter.addDataType("image/jpeg");
324*90c8c64dSAndroid Build Coastguard Worker             // This is how you can register an IntentFilter as allowed pattern of Intent forwarding
325*90c8c64dSAndroid Build Coastguard Worker             manager.addCrossProfileIntentFilter(BasicDeviceAdminReceiver.getComponentName(activity),
326*90c8c64dSAndroid Build Coastguard Worker                     filter, FLAG_MANAGED_CAN_ACCESS_PARENT | FLAG_PARENT_CAN_ACCESS_MANAGED);
327*90c8c64dSAndroid Build Coastguard Worker         } catch (IntentFilter.MalformedMimeTypeException e) {
328*90c8c64dSAndroid Build Coastguard Worker             e.printStackTrace();
329*90c8c64dSAndroid Build Coastguard Worker         }
330*90c8c64dSAndroid Build Coastguard Worker     }
331*90c8c64dSAndroid Build Coastguard Worker 
332*90c8c64dSAndroid Build Coastguard Worker     /**
333*90c8c64dSAndroid Build Coastguard Worker      * Disables forwarding of all intents.
334*90c8c64dSAndroid Build Coastguard Worker      */
disableForwarding()335*90c8c64dSAndroid Build Coastguard Worker     private void disableForwarding() {
336*90c8c64dSAndroid Build Coastguard Worker         Activity activity = getActivity();
337*90c8c64dSAndroid Build Coastguard Worker         if (null == activity || activity.isFinishing()) {
338*90c8c64dSAndroid Build Coastguard Worker             return;
339*90c8c64dSAndroid Build Coastguard Worker         }
340*90c8c64dSAndroid Build Coastguard Worker         DevicePolicyManager manager =
341*90c8c64dSAndroid Build Coastguard Worker                 (DevicePolicyManager) activity.getSystemService(Context.DEVICE_POLICY_SERVICE);
342*90c8c64dSAndroid Build Coastguard Worker         manager.clearCrossProfileIntentFilters(BasicDeviceAdminReceiver.getComponentName(activity));
343*90c8c64dSAndroid Build Coastguard Worker     }
344*90c8c64dSAndroid Build Coastguard Worker 
345*90c8c64dSAndroid Build Coastguard Worker     /**
346*90c8c64dSAndroid Build Coastguard Worker      * Sends a sample intent of a plain text message.  This is just a utility function to see how
347*90c8c64dSAndroid Build Coastguard Worker      * the intent forwarding works.
348*90c8c64dSAndroid Build Coastguard Worker      */
sendIntent()349*90c8c64dSAndroid Build Coastguard Worker     private void sendIntent() {
350*90c8c64dSAndroid Build Coastguard Worker         Activity activity = getActivity();
351*90c8c64dSAndroid Build Coastguard Worker         if (null == activity || activity.isFinishing()) {
352*90c8c64dSAndroid Build Coastguard Worker             return;
353*90c8c64dSAndroid Build Coastguard Worker         }
354*90c8c64dSAndroid Build Coastguard Worker         DevicePolicyManager manager =
355*90c8c64dSAndroid Build Coastguard Worker                 (DevicePolicyManager) activity.getSystemService(Context.DEVICE_POLICY_SERVICE);
356*90c8c64dSAndroid Build Coastguard Worker         Intent intent = new Intent(Intent.ACTION_SEND);
357*90c8c64dSAndroid Build Coastguard Worker         intent.setType("text/plain");
358*90c8c64dSAndroid Build Coastguard Worker         intent.putExtra(Intent.EXTRA_TEXT,
359*90c8c64dSAndroid Build Coastguard Worker                 manager.isProfileOwnerApp(activity.getApplicationContext().getPackageName())
360*90c8c64dSAndroid Build Coastguard Worker                         ? "From the managed account" : "From the primary account");
361*90c8c64dSAndroid Build Coastguard Worker         try {
362*90c8c64dSAndroid Build Coastguard Worker             startActivity(intent);
363*90c8c64dSAndroid Build Coastguard Worker             Log.d(TAG, "A sample intent was sent.");
364*90c8c64dSAndroid Build Coastguard Worker         } catch (ActivityNotFoundException e) {
365*90c8c64dSAndroid Build Coastguard Worker             Toast.makeText(activity, R.string.activity_not_found, Toast.LENGTH_SHORT).show();
366*90c8c64dSAndroid Build Coastguard Worker         }
367*90c8c64dSAndroid Build Coastguard Worker     }
368*90c8c64dSAndroid Build Coastguard Worker 
369*90c8c64dSAndroid Build Coastguard Worker     /**
370*90c8c64dSAndroid Build Coastguard Worker      * Wipes out all the data related to this managed profile.
371*90c8c64dSAndroid Build Coastguard Worker      */
removeProfile()372*90c8c64dSAndroid Build Coastguard Worker     private void removeProfile() {
373*90c8c64dSAndroid Build Coastguard Worker         Activity activity = getActivity();
374*90c8c64dSAndroid Build Coastguard Worker         if (null == activity || activity.isFinishing()) {
375*90c8c64dSAndroid Build Coastguard Worker             return;
376*90c8c64dSAndroid Build Coastguard Worker         }
377*90c8c64dSAndroid Build Coastguard Worker         DevicePolicyManager manager =
378*90c8c64dSAndroid Build Coastguard Worker                 (DevicePolicyManager) activity.getSystemService(Context.DEVICE_POLICY_SERVICE);
379*90c8c64dSAndroid Build Coastguard Worker         manager.wipeData(0);
380*90c8c64dSAndroid Build Coastguard Worker         // The screen turns off here
381*90c8c64dSAndroid Build Coastguard Worker     }
382*90c8c64dSAndroid Build Coastguard Worker 
383*90c8c64dSAndroid Build Coastguard Worker }
384