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