2 * Copyright (C) 2010 The Android Open Source Project
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
17 package com.android.settings;
19 import org.xmlpull.v1.XmlPullParserException;
21 import android.app.Activity;
22 import android.app.AlertDialog;
23 import android.app.Dialog;
24 import android.app.admin.DeviceAdminInfo;
25 import android.app.admin.DeviceAdminReceiver;
26 import android.app.admin.DevicePolicyManager;
27 import android.content.ComponentName;
28 import android.content.Context;
29 import android.content.DialogInterface;
30 import android.content.pm.ActivityInfo;
31 import android.content.pm.PackageManager;
32 import android.content.pm.ResolveInfo;
33 import android.content.res.Resources;
34 import android.os.Bundle;
35 import android.os.Handler;
36 import android.os.RemoteCallback;
37 import android.util.Log;
38 import android.view.View;
39 import android.view.ViewGroup;
40 import android.widget.AppSecurityPermissions;
41 import android.widget.Button;
42 import android.widget.ImageView;
43 import android.widget.TextView;
45 import java.io.IOException;
46 import java.util.ArrayList;
48 public class DeviceAdminAdd extends Activity {
49 static final String TAG = "DeviceAdminAdd";
51 static final int DIALOG_WARNING = 1;
55 DevicePolicyManager mDPM;
56 DeviceAdminInfo mDeviceAdmin;
57 CharSequence mAddMsgText;
62 TextView mAdminDescription;
64 TextView mAdminWarning;
65 ViewGroup mAdminPolicies;
71 final ArrayList<View> mAddingPolicies = new ArrayList<View>();
72 final ArrayList<View> mActivePolicies = new ArrayList<View>();
77 protected void onCreate(Bundle icicle) {
78 super.onCreate(icicle);
80 mHandler = new Handler(getMainLooper());
82 mDPM = (DevicePolicyManager)getSystemService(Context.DEVICE_POLICY_SERVICE);
84 ComponentName cn = (ComponentName)getIntent().getParcelableExtra(
85 DevicePolicyManager.EXTRA_DEVICE_ADMIN);
87 Log.w(TAG, "No component specified in " + getIntent().getAction());
91 if (DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN.equals(getIntent().getAction())) {
92 // If this was an add request, then just exit immediately if the
93 // given component is already added.
94 if (mDPM.isAdminActive(cn)) {
95 setResult(Activity.RESULT_OK);
103 ai = getPackageManager().getReceiverInfo(cn,
104 PackageManager.GET_META_DATA);
105 } catch (PackageManager.NameNotFoundException e) {
106 Log.w(TAG, "Unable to retrieve device policy " + cn, e);
111 ResolveInfo ri = new ResolveInfo();
112 ri.activityInfo = ai;
114 mDeviceAdmin= new DeviceAdminInfo(this, ri);
115 } catch (XmlPullParserException e) {
116 Log.w(TAG, "Unable to retrieve device policy " + cn, e);
119 } catch (IOException e) {
120 Log.w(TAG, "Unable to retrieve device policy " + cn, e);
125 mAddMsgText = getIntent().getCharSequenceExtra(
126 DevicePolicyManager.EXTRA_ADD_EXPLANATION);
128 setContentView(R.layout.device_admin_add);
130 mTitle = (TextView)findViewById(R.id.title);
131 mAdminIcon = (ImageView)findViewById(R.id.admin_icon);
132 mAdminName = (TextView)findViewById(R.id.admin_name);
133 mAdminDescription = (TextView)findViewById(R.id.admin_description);
134 mAddMsg = (TextView)findViewById(R.id.add_msg);
135 mAdminWarning = (TextView)findViewById(R.id.admin_warning);
136 mAdminPolicies = (ViewGroup)findViewById(R.id.admin_policies);
137 mCancelButton = (Button)findViewById(R.id.cancel_button);
138 mCancelButton.setOnClickListener(new View.OnClickListener() {
139 public void onClick(View v) {
143 mActionButton = (Button)findViewById(R.id.action_button);
144 mActionButton.setOnClickListener(new View.OnClickListener() {
145 public void onClick(View v) {
148 mDPM.setActiveAdmin(mDeviceAdmin.getComponent());
149 setResult(Activity.RESULT_OK);
150 } catch (RuntimeException e) {
151 // Something bad happened... could be that it was
152 // already set, though.
153 Log.w(TAG, "Exception trying to activate admin "
154 + mDeviceAdmin.getComponent(), e);
155 if (mDPM.isAdminActive(mDeviceAdmin.getComponent())) {
156 setResult(Activity.RESULT_OK);
161 mDPM.getRemoveWarning(mDeviceAdmin.getComponent(),
162 new RemoteCallback(mHandler) {
164 protected void onResult(Bundle bundle) {
165 CharSequence msg = bundle != null
166 ? bundle.getCharSequence(
167 DeviceAdminReceiver.EXTRA_DISABLE_WARNING)
170 mDPM.removeActiveAdmin(mDeviceAdmin.getComponent());
173 Bundle args = new Bundle();
174 args.putCharSequence(
175 DeviceAdminReceiver.EXTRA_DISABLE_WARNING, msg);
176 showDialog(DIALOG_WARNING, args);
186 protected void onResume() {
192 protected Dialog onCreateDialog(int id, Bundle args) {
194 case DIALOG_WARNING: {
195 CharSequence msg = args.getCharSequence(DeviceAdminReceiver.EXTRA_DISABLE_WARNING);
196 AlertDialog.Builder builder = new AlertDialog.Builder(
197 DeviceAdminAdd.this);
198 builder.setMessage(msg);
199 builder.setPositiveButton(R.string.dlg_ok,
200 new DialogInterface.OnClickListener() {
201 public void onClick(DialogInterface dialog, int which) {
202 mDPM.removeActiveAdmin(mDeviceAdmin.getComponent());
206 builder.setNegativeButton(R.string.dlg_cancel, null);
207 return builder.create();
210 return super.onCreateDialog(id, args);
215 static void setViewVisibility(ArrayList<View> views, int visibility) {
216 final int N = views.size();
217 for (int i=0; i<N; i++) {
218 views.get(i).setVisibility(visibility);
222 void updateInterface() {
223 mAdminIcon.setImageDrawable(mDeviceAdmin.loadIcon(getPackageManager()));
224 mAdminName.setText(mDeviceAdmin.loadLabel(getPackageManager()));
226 mAdminDescription.setText(
227 mDeviceAdmin.loadDescription(getPackageManager()));
228 mAdminDescription.setVisibility(View.VISIBLE);
229 } catch (Resources.NotFoundException e) {
230 mAdminDescription.setVisibility(View.GONE);
232 if (mAddMsgText != null) {
233 mAddMsg.setText(mAddMsgText);
234 mAddMsg.setVisibility(View.VISIBLE);
236 mAddMsg.setVisibility(View.GONE);
238 if (mDPM.isAdminActive(mDeviceAdmin.getComponent())) {
239 if (mActivePolicies.size() == 0) {
240 ArrayList<DeviceAdminInfo.PolicyInfo> policies = mDeviceAdmin.getUsedPolicies();
241 for (int i=0; i<policies.size(); i++) {
242 DeviceAdminInfo.PolicyInfo pi = policies.get(i);
243 View view = AppSecurityPermissions.getPermissionItemView(
244 this, getText(pi.label), "", true);
245 mActivePolicies.add(view);
246 mAdminPolicies.addView(view);
249 setViewVisibility(mActivePolicies, View.VISIBLE);
250 setViewVisibility(mAddingPolicies, View.GONE);
251 mAdminWarning.setText(getString(R.string.device_admin_status,
252 mDeviceAdmin.getActivityInfo().applicationInfo.loadLabel(getPackageManager())));
253 mTitle.setText(getText(R.string.active_device_admin_msg));
254 mActionButton.setText(getText(R.string.remove_device_admin));
257 if (mAddingPolicies.size() == 0) {
258 ArrayList<DeviceAdminInfo.PolicyInfo> policies = mDeviceAdmin.getUsedPolicies();
259 for (int i=0; i<policies.size(); i++) {
260 DeviceAdminInfo.PolicyInfo pi = policies.get(i);
261 View view = AppSecurityPermissions.getPermissionItemView(
262 this, getText(pi.label), getText(pi.description), true);
263 mAddingPolicies.add(view);
264 mAdminPolicies.addView(view);
267 setViewVisibility(mAddingPolicies, View.VISIBLE);
268 setViewVisibility(mActivePolicies, View.GONE);
269 mAdminWarning.setText(getString(R.string.device_admin_warning,
270 mDeviceAdmin.getActivityInfo().applicationInfo.loadLabel(getPackageManager())));
271 mTitle.setText(getText(R.string.add_device_admin_msg));
272 mActionButton.setText(getText(R.string.add_device_admin));