DeviceAdminAdd.java revision 4df6edb1acefcd927932b7c1cb71575298d53b86
1/* 2 * Copyright (C) 2010 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17package com.android.settings; 18 19import org.xmlpull.v1.XmlPullParserException; 20 21import android.app.Activity; 22import android.app.AlertDialog; 23import android.app.DeviceAdmin; 24import android.app.DeviceAdminInfo; 25import android.app.DevicePolicyManager; 26import android.app.Dialog; 27import android.content.ComponentName; 28import android.content.Context; 29import android.content.DialogInterface; 30import android.content.pm.ActivityInfo; 31import android.content.pm.PackageManager; 32import android.content.pm.ResolveInfo; 33import android.content.res.Resources; 34import android.os.Bundle; 35import android.os.Handler; 36import android.os.RemoteCallback; 37import android.util.Log; 38import android.view.View; 39import android.view.ViewGroup; 40import android.widget.AppSecurityPermissions; 41import android.widget.Button; 42import android.widget.ImageView; 43import android.widget.TextView; 44 45import java.io.IOException; 46import java.util.ArrayList; 47 48public class DeviceAdminAdd extends Activity { 49 static final String TAG = "DeviceAdminAdd"; 50 51 static final int DIALOG_WARNING = 1; 52 53 Handler mHandler; 54 55 DevicePolicyManager mDPM; 56 DeviceAdminInfo mDeviceAdmin; 57 CharSequence mAddMsgText; 58 59 TextView mTitle; 60 ImageView mAdminIcon; 61 TextView mAdminName; 62 TextView mAdminDescription; 63 TextView mAddMsg; 64 TextView mAdminWarning; 65 ViewGroup mAdminPolicies; 66 Button mActionButton; 67 68 View mSelectLayout; 69 70 final ArrayList<View> mAddingPolicies = new ArrayList<View>(); 71 final ArrayList<View> mActivePolicies = new ArrayList<View>(); 72 73 boolean mAdding; 74 75 @Override 76 protected void onCreate(Bundle icicle) { 77 super.onCreate(icicle); 78 79 mHandler = new Handler(getMainLooper()); 80 81 mDPM = (DevicePolicyManager)getSystemService(Context.DEVICE_POLICY_SERVICE); 82 83 ComponentName cn = (ComponentName)getIntent().getParcelableExtra( 84 DevicePolicyManager.EXTRA_DEVICE_ADMIN); 85 if (cn == null) { 86 Log.w(TAG, "No component specified in " + getIntent().getAction()); 87 finish(); 88 return; 89 } 90 if (DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN.equals(getIntent().getAction())) { 91 // If this was an add request, then just exit immediately if the 92 // given component is already added. 93 if (mDPM.isAdminActive(cn)) { 94 setResult(Activity.RESULT_OK); 95 finish(); 96 return; 97 } 98 } 99 100 ActivityInfo ai; 101 try { 102 ai = getPackageManager().getReceiverInfo(cn, 103 PackageManager.GET_META_DATA); 104 } catch (PackageManager.NameNotFoundException e) { 105 Log.w(TAG, "Unable to retrieve device policy " + cn, e); 106 finish(); 107 return; 108 } 109 110 ResolveInfo ri = new ResolveInfo(); 111 ri.activityInfo = ai; 112 try { 113 mDeviceAdmin= new DeviceAdminInfo(this, ri); 114 } catch (XmlPullParserException e) { 115 Log.w(TAG, "Unable to retrieve device policy " + cn, e); 116 finish(); 117 return; 118 } catch (IOException e) { 119 Log.w(TAG, "Unable to retrieve device policy " + cn, e); 120 finish(); 121 return; 122 } 123 124 mAddMsgText = getIntent().getCharSequenceExtra( 125 DevicePolicyManager.EXTRA_ADD_EXPLANATION); 126 127 setContentView(R.layout.device_admin_add); 128 129 mTitle = (TextView)findViewById(R.id.title); 130 mAdminIcon = (ImageView)findViewById(R.id.admin_icon); 131 mAdminName = (TextView)findViewById(R.id.admin_name); 132 mAdminDescription = (TextView)findViewById(R.id.admin_description); 133 mAddMsg = (TextView)findViewById(R.id.add_msg); 134 mAdminWarning = (TextView)findViewById(R.id.admin_warning); 135 mAdminPolicies = (ViewGroup)findViewById(R.id.admin_policies); 136 mActionButton = (Button)findViewById(R.id.action_button); 137 mActionButton.setOnClickListener(new View.OnClickListener() { 138 public void onClick(View v) { 139 if (mAdding) { 140 mDPM.setActiveAdmin(mDeviceAdmin.getComponent()); 141 setResult(Activity.RESULT_OK); 142 finish(); 143 } else { 144 mDPM.getRemoveWarning(mDeviceAdmin.getComponent(), 145 new RemoteCallback(mHandler) { 146 @Override 147 protected void onResult(Bundle bundle) { 148 CharSequence msg = bundle != null 149 ? bundle.getCharSequence(DeviceAdmin.EXTRA_DISABLE_WARNING) 150 : null; 151 if (msg == null) { 152 mDPM.removeActiveAdmin(mDeviceAdmin.getComponent()); 153 finish(); 154 } else { 155 Bundle args = new Bundle(); 156 args.putCharSequence(DeviceAdmin.EXTRA_DISABLE_WARNING, msg); 157 showDialog(DIALOG_WARNING, args); 158 } 159 } 160 }); 161 } 162 } 163 }); 164 } 165 166 @Override 167 protected void onResume() { 168 super.onResume(); 169 updateInterface(); 170 } 171 172 @Override 173 protected Dialog onCreateDialog(int id, Bundle args) { 174 switch (id) { 175 case DIALOG_WARNING: { 176 CharSequence msg = args.getCharSequence(DeviceAdmin.EXTRA_DISABLE_WARNING); 177 AlertDialog.Builder builder = new AlertDialog.Builder( 178 DeviceAdminAdd.this); 179 builder.setMessage(msg); 180 builder.setPositiveButton(R.string.dlg_ok, 181 new DialogInterface.OnClickListener() { 182 public void onClick(DialogInterface dialog, int which) { 183 mDPM.removeActiveAdmin(mDeviceAdmin.getComponent()); 184 finish(); 185 } 186 }); 187 builder.setNegativeButton(R.string.dlg_cancel, null); 188 return builder.create(); 189 } 190 default: 191 return super.onCreateDialog(id, args); 192 193 } 194 } 195 196 static void setViewVisibility(ArrayList<View> views, int visibility) { 197 final int N = views.size(); 198 for (int i=0; i<N; i++) { 199 views.get(i).setVisibility(visibility); 200 } 201 } 202 203 void updateInterface() { 204 mAdminIcon.setImageDrawable(mDeviceAdmin.loadIcon(getPackageManager())); 205 mAdminName.setText(mDeviceAdmin.loadLabel(getPackageManager())); 206 try { 207 mAdminDescription.setText( 208 mDeviceAdmin.loadDescription(getPackageManager())); 209 mAdminDescription.setVisibility(View.VISIBLE); 210 } catch (Resources.NotFoundException e) { 211 mAdminDescription.setVisibility(View.GONE); 212 } 213 if (mAddMsgText != null) { 214 mAddMsg.setText(mAddMsgText); 215 mAddMsg.setVisibility(View.VISIBLE); 216 } else { 217 mAddMsg.setVisibility(View.GONE); 218 } 219 if (mDPM.isAdminActive(mDeviceAdmin.getComponent())) { 220 if (mActivePolicies.size() == 0) { 221 ArrayList<DeviceAdminInfo.PolicyInfo> policies = mDeviceAdmin.getUsedPolicies(); 222 for (int i=0; i<policies.size(); i++) { 223 DeviceAdminInfo.PolicyInfo pi = policies.get(i); 224 View view = AppSecurityPermissions.getPermissionItemView( 225 this, getText(pi.label), "", true); 226 mActivePolicies.add(view); 227 mAdminPolicies.addView(view); 228 } 229 } 230 setViewVisibility(mActivePolicies, View.VISIBLE); 231 setViewVisibility(mAddingPolicies, View.GONE); 232 mAdminWarning.setText(getString(R.string.device_admin_status, 233 mDeviceAdmin.getActivityInfo().applicationInfo.loadLabel(getPackageManager()))); 234 mTitle.setText(getText(R.string.active_device_admin_msg)); 235 mActionButton.setText(getText(R.string.remove_device_admin)); 236 mAdding = false; 237 } else { 238 if (mAddingPolicies.size() == 0) { 239 ArrayList<DeviceAdminInfo.PolicyInfo> policies = mDeviceAdmin.getUsedPolicies(); 240 for (int i=0; i<policies.size(); i++) { 241 DeviceAdminInfo.PolicyInfo pi = policies.get(i); 242 View view = AppSecurityPermissions.getPermissionItemView( 243 this, getText(pi.label), getText(pi.description), true); 244 mAddingPolicies.add(view); 245 mAdminPolicies.addView(view); 246 } 247 } 248 setViewVisibility(mAddingPolicies, View.VISIBLE); 249 setViewVisibility(mActivePolicies, View.GONE); 250 mAdminWarning.setText(getString(R.string.device_admin_warning, 251 mDeviceAdmin.getActivityInfo().applicationInfo.loadLabel(getPackageManager()))); 252 mTitle.setText(getText(R.string.add_device_admin_msg)); 253 mActionButton.setText(getText(R.string.add_device_admin)); 254 mAdding = true; 255 } 256 } 257 258} 259