1*90c8c64dSAndroid Build Coastguard Worker /* 2*90c8c64dSAndroid Build Coastguard Worker * Copyright (C) 2015 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.deviceowner; 18*90c8c64dSAndroid Build Coastguard Worker 19*90c8c64dSAndroid Build Coastguard Worker import android.app.Activity; 20*90c8c64dSAndroid Build Coastguard Worker import android.app.Fragment; 21*90c8c64dSAndroid Build Coastguard Worker import android.app.admin.DevicePolicyManager; 22*90c8c64dSAndroid Build Coastguard Worker import android.content.ComponentName; 23*90c8c64dSAndroid Build Coastguard Worker import android.content.ContentResolver; 24*90c8c64dSAndroid Build Coastguard Worker import android.content.Context; 25*90c8c64dSAndroid Build Coastguard Worker import android.content.Intent; 26*90c8c64dSAndroid Build Coastguard Worker import android.content.IntentFilter; 27*90c8c64dSAndroid Build Coastguard Worker import android.content.SharedPreferences; 28*90c8c64dSAndroid Build Coastguard Worker import android.content.pm.ResolveInfo; 29*90c8c64dSAndroid Build Coastguard Worker import android.os.Bundle; 30*90c8c64dSAndroid Build Coastguard Worker import android.provider.Settings; 31*90c8c64dSAndroid Build Coastguard Worker import android.support.annotation.Nullable; 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.SimpleAdapter; 38*90c8c64dSAndroid Build Coastguard Worker import android.widget.Spinner; 39*90c8c64dSAndroid Build Coastguard Worker import android.widget.Switch; 40*90c8c64dSAndroid Build Coastguard Worker 41*90c8c64dSAndroid Build Coastguard Worker import java.util.ArrayList; 42*90c8c64dSAndroid Build Coastguard Worker import java.util.HashMap; 43*90c8c64dSAndroid Build Coastguard Worker import java.util.List; 44*90c8c64dSAndroid Build Coastguard Worker 45*90c8c64dSAndroid Build Coastguard Worker /** 46*90c8c64dSAndroid Build Coastguard Worker * Demonstrates the usage of the most common device management APIs for the device owner case. 47*90c8c64dSAndroid Build Coastguard Worker * In addition to various features available for profile owners, device owners can perform extra 48*90c8c64dSAndroid Build Coastguard Worker * actions, such as configuring global settings and enforcing a preferred Activity for a specific 49*90c8c64dSAndroid Build Coastguard Worker * IntentFilter. 50*90c8c64dSAndroid Build Coastguard Worker */ 51*90c8c64dSAndroid Build Coastguard Worker public class DeviceOwnerFragment extends Fragment { 52*90c8c64dSAndroid Build Coastguard Worker 53*90c8c64dSAndroid Build Coastguard Worker // Keys for SharedPreferences 54*90c8c64dSAndroid Build Coastguard Worker private static final String PREFS_DEVICE_OWNER = "DeviceOwnerFragment"; 55*90c8c64dSAndroid Build Coastguard Worker private static final String PREF_LAUNCHER = "launcher"; 56*90c8c64dSAndroid Build Coastguard Worker 57*90c8c64dSAndroid Build Coastguard Worker private DevicePolicyManager mDevicePolicyManager; 58*90c8c64dSAndroid Build Coastguard Worker 59*90c8c64dSAndroid Build Coastguard Worker // View references 60*90c8c64dSAndroid Build Coastguard Worker private Switch mSwitchAutoTime; 61*90c8c64dSAndroid Build Coastguard Worker private Switch mSwitchAutoTimeZone; 62*90c8c64dSAndroid Build Coastguard Worker private Spinner mAvailableLaunchers; 63*90c8c64dSAndroid Build Coastguard Worker private Button mButtonLauncher; 64*90c8c64dSAndroid Build Coastguard Worker 65*90c8c64dSAndroid Build Coastguard Worker // Adapter for the spinner to show list of available launchers 66*90c8c64dSAndroid Build Coastguard Worker private LauncherAdapter mAdapter; 67*90c8c64dSAndroid Build Coastguard Worker 68*90c8c64dSAndroid Build Coastguard Worker /** 69*90c8c64dSAndroid Build Coastguard Worker * Handles events on the Switches. 70*90c8c64dSAndroid Build Coastguard Worker */ 71*90c8c64dSAndroid Build Coastguard Worker private Switch.OnCheckedChangeListener mOnCheckedChangeListener 72*90c8c64dSAndroid Build Coastguard Worker = new Switch.OnCheckedChangeListener() { 73*90c8c64dSAndroid Build Coastguard Worker 74*90c8c64dSAndroid Build Coastguard Worker @Override 75*90c8c64dSAndroid Build Coastguard Worker public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 76*90c8c64dSAndroid Build Coastguard Worker switch (buttonView.getId()) { 77*90c8c64dSAndroid Build Coastguard Worker case R.id.switch_auto_time: 78*90c8c64dSAndroid Build Coastguard Worker setBooleanGlobalSetting(Settings.Global.AUTO_TIME, isChecked); 79*90c8c64dSAndroid Build Coastguard Worker retrieveCurrentSettings(getActivity()); 80*90c8c64dSAndroid Build Coastguard Worker break; 81*90c8c64dSAndroid Build Coastguard Worker case R.id.switch_auto_time_zone: 82*90c8c64dSAndroid Build Coastguard Worker setBooleanGlobalSetting(Settings.Global.AUTO_TIME_ZONE, isChecked); 83*90c8c64dSAndroid Build Coastguard Worker retrieveCurrentSettings(getActivity()); 84*90c8c64dSAndroid Build Coastguard Worker break; 85*90c8c64dSAndroid Build Coastguard Worker } 86*90c8c64dSAndroid Build Coastguard Worker } 87*90c8c64dSAndroid Build Coastguard Worker 88*90c8c64dSAndroid Build Coastguard Worker }; 89*90c8c64dSAndroid Build Coastguard Worker 90*90c8c64dSAndroid Build Coastguard Worker /** 91*90c8c64dSAndroid Build Coastguard Worker * Handles click events on the Button. 92*90c8c64dSAndroid Build Coastguard Worker */ 93*90c8c64dSAndroid Build Coastguard Worker private View.OnClickListener mOnClickListener 94*90c8c64dSAndroid Build Coastguard Worker = new View.OnClickListener() { 95*90c8c64dSAndroid Build Coastguard Worker 96*90c8c64dSAndroid Build Coastguard Worker @Override 97*90c8c64dSAndroid Build Coastguard Worker public void onClick(View v) { 98*90c8c64dSAndroid Build Coastguard Worker switch (v.getId()) { 99*90c8c64dSAndroid Build Coastguard Worker case R.id.set_preferred_launcher: 100*90c8c64dSAndroid Build Coastguard Worker if (loadPersistentPreferredLauncher(getActivity()) == null) { 101*90c8c64dSAndroid Build Coastguard Worker setPreferredLauncher(); 102*90c8c64dSAndroid Build Coastguard Worker } else { 103*90c8c64dSAndroid Build Coastguard Worker clearPreferredLauncher(); 104*90c8c64dSAndroid Build Coastguard Worker } 105*90c8c64dSAndroid Build Coastguard Worker retrieveCurrentSettings(getActivity()); 106*90c8c64dSAndroid Build Coastguard Worker break; 107*90c8c64dSAndroid Build Coastguard Worker } 108*90c8c64dSAndroid Build Coastguard Worker } 109*90c8c64dSAndroid Build Coastguard Worker 110*90c8c64dSAndroid Build Coastguard Worker }; 111*90c8c64dSAndroid Build Coastguard Worker 112*90c8c64dSAndroid Build Coastguard Worker /** 113*90c8c64dSAndroid Build Coastguard Worker * @return A newly instantiated {@link DeviceOwnerFragment}. 114*90c8c64dSAndroid Build Coastguard Worker */ newInstance()115*90c8c64dSAndroid Build Coastguard Worker public static DeviceOwnerFragment newInstance() { 116*90c8c64dSAndroid Build Coastguard Worker return new DeviceOwnerFragment(); 117*90c8c64dSAndroid Build Coastguard Worker } 118*90c8c64dSAndroid Build Coastguard Worker 119*90c8c64dSAndroid Build Coastguard Worker @Nullable 120*90c8c64dSAndroid Build Coastguard Worker @Override onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)121*90c8c64dSAndroid Build Coastguard Worker public View onCreateView(LayoutInflater inflater, ViewGroup container, 122*90c8c64dSAndroid Build Coastguard Worker Bundle savedInstanceState) { 123*90c8c64dSAndroid Build Coastguard Worker return inflater.inflate(R.layout.fragment_device_owner, container, false); 124*90c8c64dSAndroid Build Coastguard Worker } 125*90c8c64dSAndroid Build Coastguard Worker 126*90c8c64dSAndroid Build Coastguard Worker @Override onViewCreated(View view, Bundle savedInstanceState)127*90c8c64dSAndroid Build Coastguard Worker public void onViewCreated(View view, Bundle savedInstanceState) { 128*90c8c64dSAndroid Build Coastguard Worker // Retain references 129*90c8c64dSAndroid Build Coastguard Worker mSwitchAutoTime = (Switch) view.findViewById(R.id.switch_auto_time); 130*90c8c64dSAndroid Build Coastguard Worker mSwitchAutoTimeZone = (Switch) view.findViewById(R.id.switch_auto_time_zone); 131*90c8c64dSAndroid Build Coastguard Worker mAvailableLaunchers = (Spinner) view.findViewById(R.id.available_launchers); 132*90c8c64dSAndroid Build Coastguard Worker mButtonLauncher = (Button) view.findViewById(R.id.set_preferred_launcher); 133*90c8c64dSAndroid Build Coastguard Worker // Bind event handlers 134*90c8c64dSAndroid Build Coastguard Worker mSwitchAutoTime.setOnCheckedChangeListener(mOnCheckedChangeListener); 135*90c8c64dSAndroid Build Coastguard Worker mSwitchAutoTimeZone.setOnCheckedChangeListener(mOnCheckedChangeListener); 136*90c8c64dSAndroid Build Coastguard Worker mButtonLauncher.setOnClickListener(mOnClickListener); 137*90c8c64dSAndroid Build Coastguard Worker } 138*90c8c64dSAndroid Build Coastguard Worker 139*90c8c64dSAndroid Build Coastguard Worker @Override onAttach(Activity activity)140*90c8c64dSAndroid Build Coastguard Worker public void onAttach(Activity activity) { 141*90c8c64dSAndroid Build Coastguard Worker super.onAttach(activity); 142*90c8c64dSAndroid Build Coastguard Worker mDevicePolicyManager = 143*90c8c64dSAndroid Build Coastguard Worker (DevicePolicyManager) activity.getSystemService(Activity.DEVICE_POLICY_SERVICE); 144*90c8c64dSAndroid Build Coastguard Worker } 145*90c8c64dSAndroid Build Coastguard Worker 146*90c8c64dSAndroid Build Coastguard Worker @Override onDetach()147*90c8c64dSAndroid Build Coastguard Worker public void onDetach() { 148*90c8c64dSAndroid Build Coastguard Worker mDevicePolicyManager = null; 149*90c8c64dSAndroid Build Coastguard Worker super.onDetach(); 150*90c8c64dSAndroid Build Coastguard Worker } 151*90c8c64dSAndroid Build Coastguard Worker 152*90c8c64dSAndroid Build Coastguard Worker @Override onResume()153*90c8c64dSAndroid Build Coastguard Worker public void onResume() { 154*90c8c64dSAndroid Build Coastguard Worker super.onResume(); 155*90c8c64dSAndroid Build Coastguard Worker Activity activity = getActivity(); 156*90c8c64dSAndroid Build Coastguard Worker if (activity != null) { 157*90c8c64dSAndroid Build Coastguard Worker retrieveCurrentSettings(activity); 158*90c8c64dSAndroid Build Coastguard Worker } 159*90c8c64dSAndroid Build Coastguard Worker } 160*90c8c64dSAndroid Build Coastguard Worker 161*90c8c64dSAndroid Build Coastguard Worker /** 162*90c8c64dSAndroid Build Coastguard Worker * Retrieves the current global settings and changes the UI accordingly. 163*90c8c64dSAndroid Build Coastguard Worker * 164*90c8c64dSAndroid Build Coastguard Worker * @param activity The activity 165*90c8c64dSAndroid Build Coastguard Worker */ retrieveCurrentSettings(Activity activity)166*90c8c64dSAndroid Build Coastguard Worker private void retrieveCurrentSettings(Activity activity) { 167*90c8c64dSAndroid Build Coastguard Worker // Global settings 168*90c8c64dSAndroid Build Coastguard Worker setCheckedSafely(mSwitchAutoTime, 169*90c8c64dSAndroid Build Coastguard Worker getBooleanGlobalSetting(activity.getContentResolver(), Settings.Global.AUTO_TIME)); 170*90c8c64dSAndroid Build Coastguard Worker setCheckedSafely(mSwitchAutoTimeZone, 171*90c8c64dSAndroid Build Coastguard Worker getBooleanGlobalSetting(activity.getContentResolver(), 172*90c8c64dSAndroid Build Coastguard Worker Settings.Global.AUTO_TIME_ZONE)); 173*90c8c64dSAndroid Build Coastguard Worker 174*90c8c64dSAndroid Build Coastguard Worker // Launcher 175*90c8c64dSAndroid Build Coastguard Worker Intent intent = new Intent(Intent.ACTION_MAIN); 176*90c8c64dSAndroid Build Coastguard Worker intent.addCategory(Intent.CATEGORY_HOME); 177*90c8c64dSAndroid Build Coastguard Worker List<ResolveInfo> list = activity.getPackageManager() 178*90c8c64dSAndroid Build Coastguard Worker .queryIntentActivities(intent, /* default flags */ 0); 179*90c8c64dSAndroid Build Coastguard Worker mAdapter = new LauncherAdapter(activity, list); 180*90c8c64dSAndroid Build Coastguard Worker mAvailableLaunchers.setAdapter(mAdapter); 181*90c8c64dSAndroid Build Coastguard Worker String packageName = loadPersistentPreferredLauncher(activity); 182*90c8c64dSAndroid Build Coastguard Worker if (packageName == null) { // No preferred launcher is set 183*90c8c64dSAndroid Build Coastguard Worker mAvailableLaunchers.setEnabled(true); 184*90c8c64dSAndroid Build Coastguard Worker mButtonLauncher.setText(R.string.set_as_preferred); 185*90c8c64dSAndroid Build Coastguard Worker } else { 186*90c8c64dSAndroid Build Coastguard Worker int position = -1; 187*90c8c64dSAndroid Build Coastguard Worker for (int i = 0; i < list.size(); ++i) { 188*90c8c64dSAndroid Build Coastguard Worker if (list.get(i).activityInfo.packageName.equals(packageName)) { 189*90c8c64dSAndroid Build Coastguard Worker position = i; 190*90c8c64dSAndroid Build Coastguard Worker break; 191*90c8c64dSAndroid Build Coastguard Worker } 192*90c8c64dSAndroid Build Coastguard Worker } 193*90c8c64dSAndroid Build Coastguard Worker if (position != -1) { 194*90c8c64dSAndroid Build Coastguard Worker mAvailableLaunchers.setSelection(position); 195*90c8c64dSAndroid Build Coastguard Worker mAvailableLaunchers.setEnabled(false); 196*90c8c64dSAndroid Build Coastguard Worker mButtonLauncher.setText(R.string.clear_preferred); 197*90c8c64dSAndroid Build Coastguard Worker } 198*90c8c64dSAndroid Build Coastguard Worker } 199*90c8c64dSAndroid Build Coastguard Worker } 200*90c8c64dSAndroid Build Coastguard Worker 201*90c8c64dSAndroid Build Coastguard Worker /** 202*90c8c64dSAndroid Build Coastguard Worker * Retrieves the current boolean value of the specified global setting. 203*90c8c64dSAndroid Build Coastguard Worker * 204*90c8c64dSAndroid Build Coastguard Worker * @param resolver The ContentResolver 205*90c8c64dSAndroid Build Coastguard Worker * @param setting The setting to be retrieved 206*90c8c64dSAndroid Build Coastguard Worker * @return The current boolean value 207*90c8c64dSAndroid Build Coastguard Worker */ getBooleanGlobalSetting(ContentResolver resolver, String setting)208*90c8c64dSAndroid Build Coastguard Worker private static boolean getBooleanGlobalSetting(ContentResolver resolver, String setting) { 209*90c8c64dSAndroid Build Coastguard Worker return 0 != Settings.Global.getInt(resolver, setting, 0); 210*90c8c64dSAndroid Build Coastguard Worker } 211*90c8c64dSAndroid Build Coastguard Worker 212*90c8c64dSAndroid Build Coastguard Worker /** 213*90c8c64dSAndroid Build Coastguard Worker * Sets the boolean value of the specified global setting. 214*90c8c64dSAndroid Build Coastguard Worker * 215*90c8c64dSAndroid Build Coastguard Worker * @param setting The setting to be set 216*90c8c64dSAndroid Build Coastguard Worker * @param value The value to be set 217*90c8c64dSAndroid Build Coastguard Worker */ setBooleanGlobalSetting(String setting, boolean value)218*90c8c64dSAndroid Build Coastguard Worker private void setBooleanGlobalSetting(String setting, boolean value) { 219*90c8c64dSAndroid Build Coastguard Worker mDevicePolicyManager.setGlobalSetting( 220*90c8c64dSAndroid Build Coastguard Worker // The ComponentName of the device owner 221*90c8c64dSAndroid Build Coastguard Worker DeviceOwnerReceiver.getComponentName(getActivity()), 222*90c8c64dSAndroid Build Coastguard Worker // The settings to be set 223*90c8c64dSAndroid Build Coastguard Worker setting, 224*90c8c64dSAndroid Build Coastguard Worker // The value we write here is a string representation for SQLite 225*90c8c64dSAndroid Build Coastguard Worker value ? "1" : "0"); 226*90c8c64dSAndroid Build Coastguard Worker } 227*90c8c64dSAndroid Build Coastguard Worker 228*90c8c64dSAndroid Build Coastguard Worker /** 229*90c8c64dSAndroid Build Coastguard Worker * A utility method to set the checked state of the button without invoking its listener. 230*90c8c64dSAndroid Build Coastguard Worker * 231*90c8c64dSAndroid Build Coastguard Worker * @param button The button 232*90c8c64dSAndroid Build Coastguard Worker * @param checked The value to be set 233*90c8c64dSAndroid Build Coastguard Worker */ setCheckedSafely(CompoundButton button, boolean checked)234*90c8c64dSAndroid Build Coastguard Worker private void setCheckedSafely(CompoundButton button, boolean checked) { 235*90c8c64dSAndroid Build Coastguard Worker button.setOnCheckedChangeListener(null); 236*90c8c64dSAndroid Build Coastguard Worker button.setChecked(checked); 237*90c8c64dSAndroid Build Coastguard Worker button.setOnCheckedChangeListener(mOnCheckedChangeListener); 238*90c8c64dSAndroid Build Coastguard Worker } 239*90c8c64dSAndroid Build Coastguard Worker 240*90c8c64dSAndroid Build Coastguard Worker /** 241*90c8c64dSAndroid Build Coastguard Worker * Loads the package name from SharedPreferences. 242*90c8c64dSAndroid Build Coastguard Worker * 243*90c8c64dSAndroid Build Coastguard Worker * @param activity The activity 244*90c8c64dSAndroid Build Coastguard Worker * @return The package name of the launcher currently set as preferred, or null if there is no 245*90c8c64dSAndroid Build Coastguard Worker * preferred launcher. 246*90c8c64dSAndroid Build Coastguard Worker */ loadPersistentPreferredLauncher(Activity activity)247*90c8c64dSAndroid Build Coastguard Worker private static String loadPersistentPreferredLauncher(Activity activity) { 248*90c8c64dSAndroid Build Coastguard Worker return activity.getSharedPreferences(PREFS_DEVICE_OWNER, Context.MODE_PRIVATE) 249*90c8c64dSAndroid Build Coastguard Worker .getString(PREF_LAUNCHER, null); 250*90c8c64dSAndroid Build Coastguard Worker } 251*90c8c64dSAndroid Build Coastguard Worker 252*90c8c64dSAndroid Build Coastguard Worker /** 253*90c8c64dSAndroid Build Coastguard Worker * Saves the package name into SharedPreferences. 254*90c8c64dSAndroid Build Coastguard Worker * 255*90c8c64dSAndroid Build Coastguard Worker * @param activity The activity 256*90c8c64dSAndroid Build Coastguard Worker * @param packageName The package name to be saved. Pass null to remove the preferred launcher. 257*90c8c64dSAndroid Build Coastguard Worker */ savePersistentPreferredLauncher(Activity activity, String packageName)258*90c8c64dSAndroid Build Coastguard Worker private static void savePersistentPreferredLauncher(Activity activity, String packageName) { 259*90c8c64dSAndroid Build Coastguard Worker SharedPreferences.Editor editor = activity.getSharedPreferences(PREFS_DEVICE_OWNER, 260*90c8c64dSAndroid Build Coastguard Worker Context.MODE_PRIVATE).edit(); 261*90c8c64dSAndroid Build Coastguard Worker if (packageName == null) { 262*90c8c64dSAndroid Build Coastguard Worker editor.remove(PREF_LAUNCHER); 263*90c8c64dSAndroid Build Coastguard Worker } else { 264*90c8c64dSAndroid Build Coastguard Worker editor.putString(PREF_LAUNCHER, packageName); 265*90c8c64dSAndroid Build Coastguard Worker } 266*90c8c64dSAndroid Build Coastguard Worker editor.apply(); 267*90c8c64dSAndroid Build Coastguard Worker } 268*90c8c64dSAndroid Build Coastguard Worker 269*90c8c64dSAndroid Build Coastguard Worker /** 270*90c8c64dSAndroid Build Coastguard Worker * Sets the selected launcher as preferred. 271*90c8c64dSAndroid Build Coastguard Worker */ setPreferredLauncher()272*90c8c64dSAndroid Build Coastguard Worker private void setPreferredLauncher() { 273*90c8c64dSAndroid Build Coastguard Worker Activity activity = getActivity(); 274*90c8c64dSAndroid Build Coastguard Worker if (activity == null) { 275*90c8c64dSAndroid Build Coastguard Worker return; 276*90c8c64dSAndroid Build Coastguard Worker } 277*90c8c64dSAndroid Build Coastguard Worker IntentFilter filter = new IntentFilter(Intent.ACTION_MAIN); 278*90c8c64dSAndroid Build Coastguard Worker filter.addCategory(Intent.CATEGORY_HOME); 279*90c8c64dSAndroid Build Coastguard Worker filter.addCategory(Intent.CATEGORY_DEFAULT); 280*90c8c64dSAndroid Build Coastguard Worker ComponentName componentName = mAdapter.getComponentName( 281*90c8c64dSAndroid Build Coastguard Worker mAvailableLaunchers.getSelectedItemPosition()); 282*90c8c64dSAndroid Build Coastguard Worker mDevicePolicyManager.addPersistentPreferredActivity( 283*90c8c64dSAndroid Build Coastguard Worker DeviceOwnerReceiver.getComponentName(activity), filter, componentName); 284*90c8c64dSAndroid Build Coastguard Worker savePersistentPreferredLauncher(activity, componentName.getPackageName()); 285*90c8c64dSAndroid Build Coastguard Worker } 286*90c8c64dSAndroid Build Coastguard Worker 287*90c8c64dSAndroid Build Coastguard Worker /** 288*90c8c64dSAndroid Build Coastguard Worker * Clears the launcher currently set as preferred. 289*90c8c64dSAndroid Build Coastguard Worker */ clearPreferredLauncher()290*90c8c64dSAndroid Build Coastguard Worker private void clearPreferredLauncher() { 291*90c8c64dSAndroid Build Coastguard Worker Activity activity = getActivity(); 292*90c8c64dSAndroid Build Coastguard Worker if (activity == null) { 293*90c8c64dSAndroid Build Coastguard Worker return; 294*90c8c64dSAndroid Build Coastguard Worker } 295*90c8c64dSAndroid Build Coastguard Worker mDevicePolicyManager.clearPackagePersistentPreferredActivities( 296*90c8c64dSAndroid Build Coastguard Worker DeviceOwnerReceiver.getComponentName(activity), 297*90c8c64dSAndroid Build Coastguard Worker loadPersistentPreferredLauncher(activity)); 298*90c8c64dSAndroid Build Coastguard Worker savePersistentPreferredLauncher(activity, null); 299*90c8c64dSAndroid Build Coastguard Worker } 300*90c8c64dSAndroid Build Coastguard Worker 301*90c8c64dSAndroid Build Coastguard Worker /** 302*90c8c64dSAndroid Build Coastguard Worker * Shows list of {@link ResolveInfo} in a {@link Spinner}. 303*90c8c64dSAndroid Build Coastguard Worker */ 304*90c8c64dSAndroid Build Coastguard Worker private static class LauncherAdapter extends SimpleAdapter { 305*90c8c64dSAndroid Build Coastguard Worker 306*90c8c64dSAndroid Build Coastguard Worker private static final String KEY_PACKAGE_NAME = "package_name"; 307*90c8c64dSAndroid Build Coastguard Worker private static final String KEY_ACTIVITY_NAME = "activity_name"; 308*90c8c64dSAndroid Build Coastguard Worker LauncherAdapter(Context context, List<ResolveInfo> list)309*90c8c64dSAndroid Build Coastguard Worker public LauncherAdapter(Context context, List<ResolveInfo> list) { 310*90c8c64dSAndroid Build Coastguard Worker super(context, createData(list), android.R.layout.simple_list_item_1, 311*90c8c64dSAndroid Build Coastguard Worker new String[]{KEY_PACKAGE_NAME}, 312*90c8c64dSAndroid Build Coastguard Worker new int[]{android.R.id.text1}); 313*90c8c64dSAndroid Build Coastguard Worker } 314*90c8c64dSAndroid Build Coastguard Worker createData(List<ResolveInfo> list)315*90c8c64dSAndroid Build Coastguard Worker private static List<HashMap<String, String>> createData(List<ResolveInfo> list) { 316*90c8c64dSAndroid Build Coastguard Worker List<HashMap<String, String>> data = new ArrayList<>(); 317*90c8c64dSAndroid Build Coastguard Worker for (ResolveInfo info : list) { 318*90c8c64dSAndroid Build Coastguard Worker HashMap<String, String> map = new HashMap<>(); 319*90c8c64dSAndroid Build Coastguard Worker map.put(KEY_PACKAGE_NAME, info.activityInfo.packageName); 320*90c8c64dSAndroid Build Coastguard Worker map.put(KEY_ACTIVITY_NAME, info.activityInfo.name); 321*90c8c64dSAndroid Build Coastguard Worker data.add(map); 322*90c8c64dSAndroid Build Coastguard Worker } 323*90c8c64dSAndroid Build Coastguard Worker return data; 324*90c8c64dSAndroid Build Coastguard Worker } 325*90c8c64dSAndroid Build Coastguard Worker getComponentName(int position)326*90c8c64dSAndroid Build Coastguard Worker public ComponentName getComponentName(int position) { 327*90c8c64dSAndroid Build Coastguard Worker @SuppressWarnings("unchecked") 328*90c8c64dSAndroid Build Coastguard Worker HashMap<String, String> map = (HashMap<String, String>) getItem(position); 329*90c8c64dSAndroid Build Coastguard Worker return new ComponentName(map.get(KEY_PACKAGE_NAME), map.get(KEY_ACTIVITY_NAME)); 330*90c8c64dSAndroid Build Coastguard Worker } 331*90c8c64dSAndroid Build Coastguard Worker 332*90c8c64dSAndroid Build Coastguard Worker } 333*90c8c64dSAndroid Build Coastguard Worker 334*90c8c64dSAndroid Build Coastguard Worker } 335