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