128429033375c3876af56528bfc9ea6b541052fcbDianne Hackborn/*
228429033375c3876af56528bfc9ea6b541052fcbDianne Hackborn * Copyright (C) 2010 The Android Open Source Project
328429033375c3876af56528bfc9ea6b541052fcbDianne Hackborn *
428429033375c3876af56528bfc9ea6b541052fcbDianne Hackborn * Licensed under the Apache License, Version 2.0 (the "License");
528429033375c3876af56528bfc9ea6b541052fcbDianne Hackborn * you may not use this file except in compliance with the License.
628429033375c3876af56528bfc9ea6b541052fcbDianne Hackborn * You may obtain a copy of the License at
728429033375c3876af56528bfc9ea6b541052fcbDianne Hackborn *
828429033375c3876af56528bfc9ea6b541052fcbDianne Hackborn *      http://www.apache.org/licenses/LICENSE-2.0
928429033375c3876af56528bfc9ea6b541052fcbDianne Hackborn *
1028429033375c3876af56528bfc9ea6b541052fcbDianne Hackborn * Unless required by applicable law or agreed to in writing, software
1128429033375c3876af56528bfc9ea6b541052fcbDianne Hackborn * distributed under the License is distributed on an "AS IS" BASIS,
1228429033375c3876af56528bfc9ea6b541052fcbDianne Hackborn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1328429033375c3876af56528bfc9ea6b541052fcbDianne Hackborn * See the License for the specific language governing permissions and
1428429033375c3876af56528bfc9ea6b541052fcbDianne Hackborn * limitations under the License.
1528429033375c3876af56528bfc9ea6b541052fcbDianne Hackborn */
1628429033375c3876af56528bfc9ea6b541052fcbDianne Hackborn
1728429033375c3876af56528bfc9ea6b541052fcbDianne Hackbornpackage com.android.settings;
1828429033375c3876af56528bfc9ea6b541052fcbDianne Hackborn
19b763e34210e3947b46ef7c9bf396579f17ab0dafDianne Hackbornimport android.app.AppOpsManager;
20b8e0f608cf28f20b95b65a4f7c0b345298d98e41Amith Yamasani
2128429033375c3876af56528bfc9ea6b541052fcbDianne Hackbornimport org.xmlpull.v1.XmlPullParserException;
2228429033375c3876af56528bfc9ea6b541052fcbDianne Hackborn
2328429033375c3876af56528bfc9ea6b541052fcbDianne Hackbornimport android.app.Activity;
244f25e1d5e3f94b761345a3286bf9c91a4df20f75Dianne Hackbornimport android.app.ActivityManagerNative;
2561daf83ca8bcf1353e0e81316a2b3809ec7397c5Dianne Hackbornimport android.app.AlertDialog;
2661daf83ca8bcf1353e0e81316a2b3809ec7397c5Dianne Hackbornimport android.app.Dialog;
274037c7f27c849a1ada0980ad881636fc940a0b85Dianne Hackbornimport android.app.admin.DeviceAdminInfo;
284037c7f27c849a1ada0980ad881636fc940a0b85Dianne Hackbornimport android.app.admin.DeviceAdminReceiver;
294037c7f27c849a1ada0980ad881636fc940a0b85Dianne Hackbornimport android.app.admin.DevicePolicyManager;
3028429033375c3876af56528bfc9ea6b541052fcbDianne Hackbornimport android.content.ComponentName;
3128429033375c3876af56528bfc9ea6b541052fcbDianne Hackbornimport android.content.Context;
3261daf83ca8bcf1353e0e81316a2b3809ec7397c5Dianne Hackbornimport android.content.DialogInterface;
3339e64e76c14f6ad0a844cea6c9ea9865f0b9261eDianne Hackbornimport android.content.Intent;
3428429033375c3876af56528bfc9ea6b541052fcbDianne Hackbornimport android.content.pm.ActivityInfo;
35080f8db85c62672344375ca70c53086b891bce52Amith Yamasaniimport android.content.pm.ApplicationInfo;
36080f8db85c62672344375ca70c53086b891bce52Amith Yamasaniimport android.content.pm.PackageInfo;
3728429033375c3876af56528bfc9ea6b541052fcbDianne Hackbornimport android.content.pm.PackageManager;
38080f8db85c62672344375ca70c53086b891bce52Amith Yamasaniimport android.content.pm.PackageManager.NameNotFoundException;
3928429033375c3876af56528bfc9ea6b541052fcbDianne Hackbornimport android.content.pm.ResolveInfo;
4028429033375c3876af56528bfc9ea6b541052fcbDianne Hackbornimport android.content.res.Resources;
4128429033375c3876af56528bfc9ea6b541052fcbDianne Hackbornimport android.os.Bundle;
4261daf83ca8bcf1353e0e81316a2b3809ec7397c5Dianne Hackbornimport android.os.Handler;
4361daf83ca8bcf1353e0e81316a2b3809ec7397c5Dianne Hackbornimport android.os.RemoteCallback;
444f25e1d5e3f94b761345a3286bf9c91a4df20f75Dianne Hackbornimport android.os.RemoteException;
45b8e0f608cf28f20b95b65a4f7c0b345298d98e41Amith Yamasaniimport android.os.UserHandle;
4651794a05ad044ad87efd8291b8decb71a9b5455eChris Palmerimport android.text.TextUtils.TruncateAt;
4764e676a5863dc928546d047fe2e504cd54d3f835William Luhimport android.util.EventLog;
4828429033375c3876af56528bfc9ea6b541052fcbDianne Hackbornimport android.util.Log;
4951794a05ad044ad87efd8291b8decb71a9b5455eChris Palmerimport android.view.Display;
5028429033375c3876af56528bfc9ea6b541052fcbDianne Hackbornimport android.view.View;
5128429033375c3876af56528bfc9ea6b541052fcbDianne Hackbornimport android.view.ViewGroup;
5251794a05ad044ad87efd8291b8decb71a9b5455eChris Palmerimport android.view.WindowManager;
5328429033375c3876af56528bfc9ea6b541052fcbDianne Hackbornimport android.widget.AppSecurityPermissions;
5461daf83ca8bcf1353e0e81316a2b3809ec7397c5Dianne Hackbornimport android.widget.Button;
5528429033375c3876af56528bfc9ea6b541052fcbDianne Hackbornimport android.widget.ImageView;
5628429033375c3876af56528bfc9ea6b541052fcbDianne Hackbornimport android.widget.TextView;
5728429033375c3876af56528bfc9ea6b541052fcbDianne Hackborn
5828429033375c3876af56528bfc9ea6b541052fcbDianne Hackbornimport java.io.IOException;
5928429033375c3876af56528bfc9ea6b541052fcbDianne Hackbornimport java.util.ArrayList;
608274b6770219a469ab8a5254206d0d81bd5c96d3Dianne Hackbornimport java.util.List;
6128429033375c3876af56528bfc9ea6b541052fcbDianne Hackborn
6228429033375c3876af56528bfc9ea6b541052fcbDianne Hackbornpublic class DeviceAdminAdd extends Activity {
6328429033375c3876af56528bfc9ea6b541052fcbDianne Hackborn    static final String TAG = "DeviceAdminAdd";
6464e676a5863dc928546d047fe2e504cd54d3f835William Luh
6561daf83ca8bcf1353e0e81316a2b3809ec7397c5Dianne Hackborn    static final int DIALOG_WARNING = 1;
6651794a05ad044ad87efd8291b8decb71a9b5455eChris Palmer
6751794a05ad044ad87efd8291b8decb71a9b5455eChris Palmer    private static final int MAX_ADD_MSG_LINES_PORTRAIT = 5;
6851794a05ad044ad87efd8291b8decb71a9b5455eChris Palmer    private static final int MAX_ADD_MSG_LINES_LANDSCAPE = 2;
6951794a05ad044ad87efd8291b8decb71a9b5455eChris Palmer    private static final int MAX_ADD_MSG_LINES = 15;
7064e676a5863dc928546d047fe2e504cd54d3f835William Luh
7161daf83ca8bcf1353e0e81316a2b3809ec7397c5Dianne Hackborn    Handler mHandler;
7264e676a5863dc928546d047fe2e504cd54d3f835William Luh
7328429033375c3876af56528bfc9ea6b541052fcbDianne Hackborn    DevicePolicyManager mDPM;
74b763e34210e3947b46ef7c9bf396579f17ab0dafDianne Hackborn    AppOpsManager mAppOps;
7528429033375c3876af56528bfc9ea6b541052fcbDianne Hackborn    DeviceAdminInfo mDeviceAdmin;
76b885afe4e7376a21d354ca11d4873930d9cce9eaDianne Hackborn    CharSequence mAddMsgText;
77b8e0f608cf28f20b95b65a4f7c0b345298d98e41Amith Yamasani    String mProfileOwnerName;
7864e676a5863dc928546d047fe2e504cd54d3f835William Luh
7961daf83ca8bcf1353e0e81316a2b3809ec7397c5Dianne Hackborn    ImageView mAdminIcon;
8061daf83ca8bcf1353e0e81316a2b3809ec7397c5Dianne Hackborn    TextView mAdminName;
8161daf83ca8bcf1353e0e81316a2b3809ec7397c5Dianne Hackborn    TextView mAdminDescription;
82b885afe4e7376a21d354ca11d4873930d9cce9eaDianne Hackborn    TextView mAddMsg;
83b8e0f608cf28f20b95b65a4f7c0b345298d98e41Amith Yamasani    TextView mProfileOwnerWarning;
84a1d01841664131eca201acfaf747f1f187de10f6Amith Yamasani    ImageView mAddMsgExpander;
8551794a05ad044ad87efd8291b8decb71a9b5455eChris Palmer    boolean mAddMsgEllipsized = true;
8661daf83ca8bcf1353e0e81316a2b3809ec7397c5Dianne Hackborn    TextView mAdminWarning;
8728429033375c3876af56528bfc9ea6b541052fcbDianne Hackborn    ViewGroup mAdminPolicies;
8861daf83ca8bcf1353e0e81316a2b3809ec7397c5Dianne Hackborn    Button mActionButton;
8997de6bccfe81655a16feb988da1d208f95a8d6e3Dianne Hackborn    Button mCancelButton;
9064e676a5863dc928546d047fe2e504cd54d3f835William Luh
918cecf89cec3ea14003482c046eec7d2aba8bb0adDianne Hackborn    final ArrayList<View> mAddingPolicies = new ArrayList<View>();
928cecf89cec3ea14003482c046eec7d2aba8bb0adDianne Hackborn    final ArrayList<View> mActivePolicies = new ArrayList<View>();
9364e676a5863dc928546d047fe2e504cd54d3f835William Luh
9461daf83ca8bcf1353e0e81316a2b3809ec7397c5Dianne Hackborn    boolean mAdding;
955cc0e4152b3c75b41c0116c167e2bb5d8d1053cfAndy Stadler    boolean mRefreshing;
96b763e34210e3947b46ef7c9bf396579f17ab0dafDianne Hackborn    boolean mWaitingForRemoveMsg;
97b8e0f608cf28f20b95b65a4f7c0b345298d98e41Amith Yamasani    boolean mAddingProfileOwner;
98b763e34210e3947b46ef7c9bf396579f17ab0dafDianne Hackborn    int mCurSysAppOpMode;
99b763e34210e3947b46ef7c9bf396579f17ab0dafDianne Hackborn    int mCurToastAppOpMode;
10064e676a5863dc928546d047fe2e504cd54d3f835William Luh
10128429033375c3876af56528bfc9ea6b541052fcbDianne Hackborn    @Override
10228429033375c3876af56528bfc9ea6b541052fcbDianne Hackborn    protected void onCreate(Bundle icicle) {
10328429033375c3876af56528bfc9ea6b541052fcbDianne Hackborn        super.onCreate(icicle);
10428429033375c3876af56528bfc9ea6b541052fcbDianne Hackborn
10561daf83ca8bcf1353e0e81316a2b3809ec7397c5Dianne Hackborn        mHandler = new Handler(getMainLooper());
10664e676a5863dc928546d047fe2e504cd54d3f835William Luh
10728429033375c3876af56528bfc9ea6b541052fcbDianne Hackborn        mDPM = (DevicePolicyManager)getSystemService(Context.DEVICE_POLICY_SERVICE);
108b763e34210e3947b46ef7c9bf396579f17ab0dafDianne Hackborn        mAppOps = (AppOpsManager)getSystemService(Context.APP_OPS_SERVICE);
109080f8db85c62672344375ca70c53086b891bce52Amith Yamasani        PackageManager packageManager = getPackageManager();
11028429033375c3876af56528bfc9ea6b541052fcbDianne Hackborn
11139e64e76c14f6ad0a844cea6c9ea9865f0b9261eDianne Hackborn        if ((getIntent().getFlags()&Intent.FLAG_ACTIVITY_NEW_TASK) != 0) {
1125cc0e4152b3c75b41c0116c167e2bb5d8d1053cfAndy Stadler            Log.w(TAG, "Cannot start ADD_DEVICE_ADMIN as a new task");
11339e64e76c14f6ad0a844cea6c9ea9865f0b9261eDianne Hackborn            finish();
11439e64e76c14f6ad0a844cea6c9ea9865f0b9261eDianne Hackborn            return;
11539e64e76c14f6ad0a844cea6c9ea9865f0b9261eDianne Hackborn        }
11664e676a5863dc928546d047fe2e504cd54d3f835William Luh
117b8e0f608cf28f20b95b65a4f7c0b345298d98e41Amith Yamasani        String action = getIntent().getAction();
118b8e0f608cf28f20b95b65a4f7c0b345298d98e41Amith Yamasani        ComponentName who = (ComponentName)getIntent().getParcelableExtra(
11928429033375c3876af56528bfc9ea6b541052fcbDianne Hackborn                DevicePolicyManager.EXTRA_DEVICE_ADMIN);
120b8e0f608cf28f20b95b65a4f7c0b345298d98e41Amith Yamasani        if (who == null) {
121b8e0f608cf28f20b95b65a4f7c0b345298d98e41Amith Yamasani            Log.w(TAG, "No component specified in " + action);
12228429033375c3876af56528bfc9ea6b541052fcbDianne Hackborn            finish();
12328429033375c3876af56528bfc9ea6b541052fcbDianne Hackborn            return;
12428429033375c3876af56528bfc9ea6b541052fcbDianne Hackborn        }
1258274b6770219a469ab8a5254206d0d81bd5c96d3Dianne Hackborn
126b8e0f608cf28f20b95b65a4f7c0b345298d98e41Amith Yamasani        if (action != null && action.equals(DevicePolicyManager.ACTION_SET_PROFILE_OWNER)) {
127080f8db85c62672344375ca70c53086b891bce52Amith Yamasani            setResult(RESULT_CANCELED);
128080f8db85c62672344375ca70c53086b891bce52Amith Yamasani            setFinishOnTouchOutside(true);
129b8e0f608cf28f20b95b65a4f7c0b345298d98e41Amith Yamasani            mAddingProfileOwner = true;
130b8e0f608cf28f20b95b65a4f7c0b345298d98e41Amith Yamasani            mProfileOwnerName =
131b8e0f608cf28f20b95b65a4f7c0b345298d98e41Amith Yamasani                    getIntent().getStringExtra(DevicePolicyManager.EXTRA_PROFILE_OWNER_NAME);
132b8e0f608cf28f20b95b65a4f7c0b345298d98e41Amith Yamasani            String callingPackage = getCallingPackage();
133b8e0f608cf28f20b95b65a4f7c0b345298d98e41Amith Yamasani            if (callingPackage == null || !callingPackage.equals(who.getPackageName())) {
134b8e0f608cf28f20b95b65a4f7c0b345298d98e41Amith Yamasani                Log.e(TAG, "Unknown or incorrect caller");
135b8e0f608cf28f20b95b65a4f7c0b345298d98e41Amith Yamasani                finish();
136b8e0f608cf28f20b95b65a4f7c0b345298d98e41Amith Yamasani                return;
137b8e0f608cf28f20b95b65a4f7c0b345298d98e41Amith Yamasani            }
138080f8db85c62672344375ca70c53086b891bce52Amith Yamasani            try {
139080f8db85c62672344375ca70c53086b891bce52Amith Yamasani                PackageInfo packageInfo = packageManager.getPackageInfo(callingPackage, 0);
140080f8db85c62672344375ca70c53086b891bce52Amith Yamasani                if ((packageInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 0) {
141080f8db85c62672344375ca70c53086b891bce52Amith Yamasani                    Log.e(TAG, "Cannot set a non-system app as a profile owner");
142080f8db85c62672344375ca70c53086b891bce52Amith Yamasani                    finish();
143080f8db85c62672344375ca70c53086b891bce52Amith Yamasani                    return;
144080f8db85c62672344375ca70c53086b891bce52Amith Yamasani                }
145080f8db85c62672344375ca70c53086b891bce52Amith Yamasani            } catch (NameNotFoundException nnfe) {
146080f8db85c62672344375ca70c53086b891bce52Amith Yamasani                Log.e(TAG, "Cannot find the package " + callingPackage);
147080f8db85c62672344375ca70c53086b891bce52Amith Yamasani                finish();
148080f8db85c62672344375ca70c53086b891bce52Amith Yamasani                return;
149080f8db85c62672344375ca70c53086b891bce52Amith Yamasani            }
150b8e0f608cf28f20b95b65a4f7c0b345298d98e41Amith Yamasani        }
151b8e0f608cf28f20b95b65a4f7c0b345298d98e41Amith Yamasani
15228429033375c3876af56528bfc9ea6b541052fcbDianne Hackborn        ActivityInfo ai;
15328429033375c3876af56528bfc9ea6b541052fcbDianne Hackborn        try {
154080f8db85c62672344375ca70c53086b891bce52Amith Yamasani            ai = packageManager.getReceiverInfo(who, PackageManager.GET_META_DATA);
15528429033375c3876af56528bfc9ea6b541052fcbDianne Hackborn        } catch (PackageManager.NameNotFoundException e) {
156b8e0f608cf28f20b95b65a4f7c0b345298d98e41Amith Yamasani            Log.w(TAG, "Unable to retrieve device policy " + who, e);
15728429033375c3876af56528bfc9ea6b541052fcbDianne Hackborn            finish();
15828429033375c3876af56528bfc9ea6b541052fcbDianne Hackborn            return;
15928429033375c3876af56528bfc9ea6b541052fcbDianne Hackborn        }
1608274b6770219a469ab8a5254206d0d81bd5c96d3Dianne Hackborn
16129de9d5153075b33717ba18a0c13c84ea4ba34f3Alex Klyubin        // When activating, make sure the given component name is actually a valid device admin.
16229de9d5153075b33717ba18a0c13c84ea4ba34f3Alex Klyubin        // No need to check this when deactivating, because it is safe to deactivate an active
16329de9d5153075b33717ba18a0c13c84ea4ba34f3Alex Klyubin        // invalid device admin.
164b8e0f608cf28f20b95b65a4f7c0b345298d98e41Amith Yamasani        if (!mDPM.isAdminActive(who)) {
165080f8db85c62672344375ca70c53086b891bce52Amith Yamasani            List<ResolveInfo> avail = packageManager.queryBroadcastReceivers(
16629de9d5153075b33717ba18a0c13c84ea4ba34f3Alex Klyubin                    new Intent(DeviceAdminReceiver.ACTION_DEVICE_ADMIN_ENABLED),
167681b21f3e4ef0a63d982eca0e9d1896422bc30ffAlex Klyubin                    PackageManager.GET_DISABLED_UNTIL_USED_COMPONENTS);
16829de9d5153075b33717ba18a0c13c84ea4ba34f3Alex Klyubin            int count = avail == null ? 0 : avail.size();
16929de9d5153075b33717ba18a0c13c84ea4ba34f3Alex Klyubin            boolean found = false;
17029de9d5153075b33717ba18a0c13c84ea4ba34f3Alex Klyubin            for (int i=0; i<count; i++) {
17129de9d5153075b33717ba18a0c13c84ea4ba34f3Alex Klyubin                ResolveInfo ri = avail.get(i);
17229de9d5153075b33717ba18a0c13c84ea4ba34f3Alex Klyubin                if (ai.packageName.equals(ri.activityInfo.packageName)
17329de9d5153075b33717ba18a0c13c84ea4ba34f3Alex Klyubin                        && ai.name.equals(ri.activityInfo.name)) {
17429de9d5153075b33717ba18a0c13c84ea4ba34f3Alex Klyubin                    try {
17529de9d5153075b33717ba18a0c13c84ea4ba34f3Alex Klyubin                        // We didn't retrieve the meta data for all possible matches, so
17629de9d5153075b33717ba18a0c13c84ea4ba34f3Alex Klyubin                        // need to use the activity info of this specific one that was retrieved.
17729de9d5153075b33717ba18a0c13c84ea4ba34f3Alex Klyubin                        ri.activityInfo = ai;
17829de9d5153075b33717ba18a0c13c84ea4ba34f3Alex Klyubin                        DeviceAdminInfo dpi = new DeviceAdminInfo(this, ri);
17929de9d5153075b33717ba18a0c13c84ea4ba34f3Alex Klyubin                        found = true;
18029de9d5153075b33717ba18a0c13c84ea4ba34f3Alex Klyubin                    } catch (XmlPullParserException e) {
18129de9d5153075b33717ba18a0c13c84ea4ba34f3Alex Klyubin                        Log.w(TAG, "Bad " + ri.activityInfo, e);
18229de9d5153075b33717ba18a0c13c84ea4ba34f3Alex Klyubin                    } catch (IOException e) {
18329de9d5153075b33717ba18a0c13c84ea4ba34f3Alex Klyubin                        Log.w(TAG, "Bad " + ri.activityInfo, e);
18429de9d5153075b33717ba18a0c13c84ea4ba34f3Alex Klyubin                    }
18529de9d5153075b33717ba18a0c13c84ea4ba34f3Alex Klyubin                    break;
1868274b6770219a469ab8a5254206d0d81bd5c96d3Dianne Hackborn                }
1878274b6770219a469ab8a5254206d0d81bd5c96d3Dianne Hackborn            }
18829de9d5153075b33717ba18a0c13c84ea4ba34f3Alex Klyubin            if (!found) {
189b8e0f608cf28f20b95b65a4f7c0b345298d98e41Amith Yamasani                Log.w(TAG, "Request to add invalid device admin: " + who);
19029de9d5153075b33717ba18a0c13c84ea4ba34f3Alex Klyubin                finish();
19129de9d5153075b33717ba18a0c13c84ea4ba34f3Alex Klyubin                return;
19229de9d5153075b33717ba18a0c13c84ea4ba34f3Alex Klyubin            }
1938274b6770219a469ab8a5254206d0d81bd5c96d3Dianne Hackborn        }
1948274b6770219a469ab8a5254206d0d81bd5c96d3Dianne Hackborn
19528429033375c3876af56528bfc9ea6b541052fcbDianne Hackborn        ResolveInfo ri = new ResolveInfo();
19628429033375c3876af56528bfc9ea6b541052fcbDianne Hackborn        ri.activityInfo = ai;
19728429033375c3876af56528bfc9ea6b541052fcbDianne Hackborn        try {
1985cc0e4152b3c75b41c0116c167e2bb5d8d1053cfAndy Stadler            mDeviceAdmin = new DeviceAdminInfo(this, ri);
19928429033375c3876af56528bfc9ea6b541052fcbDianne Hackborn        } catch (XmlPullParserException e) {
200b8e0f608cf28f20b95b65a4f7c0b345298d98e41Amith Yamasani            Log.w(TAG, "Unable to retrieve device policy " + who, e);
20128429033375c3876af56528bfc9ea6b541052fcbDianne Hackborn            finish();
20228429033375c3876af56528bfc9ea6b541052fcbDianne Hackborn            return;
20328429033375c3876af56528bfc9ea6b541052fcbDianne Hackborn        } catch (IOException e) {
204b8e0f608cf28f20b95b65a4f7c0b345298d98e41Amith Yamasani            Log.w(TAG, "Unable to retrieve device policy " + who, e);
20528429033375c3876af56528bfc9ea6b541052fcbDianne Hackborn            finish();
20628429033375c3876af56528bfc9ea6b541052fcbDianne Hackborn            return;
20728429033375c3876af56528bfc9ea6b541052fcbDianne Hackborn        }
20864e676a5863dc928546d047fe2e504cd54d3f835William Luh
2095cc0e4152b3c75b41c0116c167e2bb5d8d1053cfAndy Stadler        // This admin already exists, an we have two options at this point.  If new policy
2105cc0e4152b3c75b41c0116c167e2bb5d8d1053cfAndy Stadler        // bits are set, show the user the new list.  If nothing has changed, simply return
2115cc0e4152b3c75b41c0116c167e2bb5d8d1053cfAndy Stadler        // "OK" immediately.
2125cc0e4152b3c75b41c0116c167e2bb5d8d1053cfAndy Stadler        if (DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN.equals(getIntent().getAction())) {
2135cc0e4152b3c75b41c0116c167e2bb5d8d1053cfAndy Stadler            mRefreshing = false;
214b8e0f608cf28f20b95b65a4f7c0b345298d98e41Amith Yamasani            if (mDPM.isAdminActive(who)) {
2155cc0e4152b3c75b41c0116c167e2bb5d8d1053cfAndy Stadler                ArrayList<DeviceAdminInfo.PolicyInfo> newPolicies = mDeviceAdmin.getUsedPolicies();
2165cc0e4152b3c75b41c0116c167e2bb5d8d1053cfAndy Stadler                for (int i = 0; i < newPolicies.size(); i++) {
2175cc0e4152b3c75b41c0116c167e2bb5d8d1053cfAndy Stadler                    DeviceAdminInfo.PolicyInfo pi = newPolicies.get(i);
218b8e0f608cf28f20b95b65a4f7c0b345298d98e41Amith Yamasani                    if (!mDPM.hasGrantedPolicy(who, pi.ident)) {
2195cc0e4152b3c75b41c0116c167e2bb5d8d1053cfAndy Stadler                        mRefreshing = true;
2205cc0e4152b3c75b41c0116c167e2bb5d8d1053cfAndy Stadler                        break;
2215cc0e4152b3c75b41c0116c167e2bb5d8d1053cfAndy Stadler                    }
2225cc0e4152b3c75b41c0116c167e2bb5d8d1053cfAndy Stadler                }
2235cc0e4152b3c75b41c0116c167e2bb5d8d1053cfAndy Stadler                if (!mRefreshing) {
2245cc0e4152b3c75b41c0116c167e2bb5d8d1053cfAndy Stadler                    // Nothing changed (or policies were removed) - return immediately
2255cc0e4152b3c75b41c0116c167e2bb5d8d1053cfAndy Stadler                    setResult(Activity.RESULT_OK);
2265cc0e4152b3c75b41c0116c167e2bb5d8d1053cfAndy Stadler                    finish();
2275cc0e4152b3c75b41c0116c167e2bb5d8d1053cfAndy Stadler                    return;
2285cc0e4152b3c75b41c0116c167e2bb5d8d1053cfAndy Stadler                }
2295cc0e4152b3c75b41c0116c167e2bb5d8d1053cfAndy Stadler            }
2305cc0e4152b3c75b41c0116c167e2bb5d8d1053cfAndy Stadler        }
231b8e0f608cf28f20b95b65a4f7c0b345298d98e41Amith Yamasani
232b8e0f608cf28f20b95b65a4f7c0b345298d98e41Amith Yamasani        // If we're trying to add a profile owner and user setup hasn't completed yet, no
233b8e0f608cf28f20b95b65a4f7c0b345298d98e41Amith Yamasani        // need to prompt for permission. Just add and finish.
234b8e0f608cf28f20b95b65a4f7c0b345298d98e41Amith Yamasani        if (mAddingProfileOwner && !mDPM.hasUserSetupCompleted()) {
235b8e0f608cf28f20b95b65a4f7c0b345298d98e41Amith Yamasani            addAndFinish();
236b8e0f608cf28f20b95b65a4f7c0b345298d98e41Amith Yamasani            return;
237b8e0f608cf28f20b95b65a4f7c0b345298d98e41Amith Yamasani        }
238b8e0f608cf28f20b95b65a4f7c0b345298d98e41Amith Yamasani
2395cc0e4152b3c75b41c0116c167e2bb5d8d1053cfAndy Stadler        mAddMsgText = getIntent().getCharSequenceExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION);
240a1d01841664131eca201acfaf747f1f187de10f6Amith Yamasani
24128429033375c3876af56528bfc9ea6b541052fcbDianne Hackborn        setContentView(R.layout.device_admin_add);
24264e676a5863dc928546d047fe2e504cd54d3f835William Luh
24361daf83ca8bcf1353e0e81316a2b3809ec7397c5Dianne Hackborn        mAdminIcon = (ImageView)findViewById(R.id.admin_icon);
24461daf83ca8bcf1353e0e81316a2b3809ec7397c5Dianne Hackborn        mAdminName = (TextView)findViewById(R.id.admin_name);
24561daf83ca8bcf1353e0e81316a2b3809ec7397c5Dianne Hackborn        mAdminDescription = (TextView)findViewById(R.id.admin_description);
246b8e0f608cf28f20b95b65a4f7c0b345298d98e41Amith Yamasani        mProfileOwnerWarning = (TextView) findViewById(R.id.profile_owner_warning);
24751794a05ad044ad87efd8291b8decb71a9b5455eChris Palmer
248b885afe4e7376a21d354ca11d4873930d9cce9eaDianne Hackborn        mAddMsg = (TextView)findViewById(R.id.add_msg);
249a1d01841664131eca201acfaf747f1f187de10f6Amith Yamasani        mAddMsgExpander = (ImageView) findViewById(R.id.add_msg_expander);
25051794a05ad044ad87efd8291b8decb71a9b5455eChris Palmer        mAddMsg.setOnClickListener(new View.OnClickListener() {
25151794a05ad044ad87efd8291b8decb71a9b5455eChris Palmer            public void onClick(View v) {
25251794a05ad044ad87efd8291b8decb71a9b5455eChris Palmer                toggleMessageEllipsis(v);
25351794a05ad044ad87efd8291b8decb71a9b5455eChris Palmer            }
25451794a05ad044ad87efd8291b8decb71a9b5455eChris Palmer        });
25551794a05ad044ad87efd8291b8decb71a9b5455eChris Palmer
25651794a05ad044ad87efd8291b8decb71a9b5455eChris Palmer        // toggleMessageEllipsis also handles initial layout:
25751794a05ad044ad87efd8291b8decb71a9b5455eChris Palmer        toggleMessageEllipsis(mAddMsg);
25851794a05ad044ad87efd8291b8decb71a9b5455eChris Palmer
259a1d01841664131eca201acfaf747f1f187de10f6Amith Yamasani        mAdminWarning = (TextView) findViewById(R.id.admin_warning);
260a1d01841664131eca201acfaf747f1f187de10f6Amith Yamasani        mAdminPolicies = (ViewGroup) findViewById(R.id.admin_policies);
261a1d01841664131eca201acfaf747f1f187de10f6Amith Yamasani        mCancelButton = (Button) findViewById(R.id.cancel_button);
26297de6bccfe81655a16feb988da1d208f95a8d6e3Dianne Hackborn        mCancelButton.setOnClickListener(new View.OnClickListener() {
26397de6bccfe81655a16feb988da1d208f95a8d6e3Dianne Hackborn            public void onClick(View v) {
26464e676a5863dc928546d047fe2e504cd54d3f835William Luh                EventLog.writeEvent(EventLogTags.EXP_DET_DEVICE_ADMIN_DECLINED_BY_USER,
26564e676a5863dc928546d047fe2e504cd54d3f835William Luh                    mDeviceAdmin.getActivityInfo().applicationInfo.uid);
26697de6bccfe81655a16feb988da1d208f95a8d6e3Dianne Hackborn                finish();
26797de6bccfe81655a16feb988da1d208f95a8d6e3Dianne Hackborn            }
26897de6bccfe81655a16feb988da1d208f95a8d6e3Dianne Hackborn        });
269a1d01841664131eca201acfaf747f1f187de10f6Amith Yamasani        mActionButton = (Button) findViewById(R.id.action_button);
27061daf83ca8bcf1353e0e81316a2b3809ec7397c5Dianne Hackborn        mActionButton.setOnClickListener(new View.OnClickListener() {
27128429033375c3876af56528bfc9ea6b541052fcbDianne Hackborn            public void onClick(View v) {
27261daf83ca8bcf1353e0e81316a2b3809ec7397c5Dianne Hackborn                if (mAdding) {
273b8e0f608cf28f20b95b65a4f7c0b345298d98e41Amith Yamasani                    addAndFinish();
274b763e34210e3947b46ef7c9bf396579f17ab0dafDianne Hackborn                } else if (!mWaitingForRemoveMsg) {
2754f25e1d5e3f94b761345a3286bf9c91a4df20f75Dianne Hackborn                    try {
2764f25e1d5e3f94b761345a3286bf9c91a4df20f75Dianne Hackborn                        // Don't allow the admin to put a dialog up in front
2774f25e1d5e3f94b761345a3286bf9c91a4df20f75Dianne Hackborn                        // of us while we interact with the user.
2784f25e1d5e3f94b761345a3286bf9c91a4df20f75Dianne Hackborn                        ActivityManagerNative.getDefault().stopAppSwitches();
2794f25e1d5e3f94b761345a3286bf9c91a4df20f75Dianne Hackborn                    } catch (RemoteException e) {
2804f25e1d5e3f94b761345a3286bf9c91a4df20f75Dianne Hackborn                    }
281b763e34210e3947b46ef7c9bf396579f17ab0dafDianne Hackborn                    mWaitingForRemoveMsg = true;
2824df6edb1acefcd927932b7c1cb71575298d53b86Andrew Stadler                    mDPM.getRemoveWarning(mDeviceAdmin.getComponent(),
2834df6edb1acefcd927932b7c1cb71575298d53b86Andrew Stadler                            new RemoteCallback(mHandler) {
2844df6edb1acefcd927932b7c1cb71575298d53b86Andrew Stadler                        @Override
2854df6edb1acefcd927932b7c1cb71575298d53b86Andrew Stadler                        protected void onResult(Bundle bundle) {
2864df6edb1acefcd927932b7c1cb71575298d53b86Andrew Stadler                            CharSequence msg = bundle != null
2875435511ee9151dbca8ad13656b3dc20ec79f940bDianne Hackborn                                    ? bundle.getCharSequence(
2885435511ee9151dbca8ad13656b3dc20ec79f940bDianne Hackborn                                            DeviceAdminReceiver.EXTRA_DISABLE_WARNING)
2894df6edb1acefcd927932b7c1cb71575298d53b86Andrew Stadler                                    : null;
290b763e34210e3947b46ef7c9bf396579f17ab0dafDianne Hackborn                            continueRemoveAction(msg);
29161daf83ca8bcf1353e0e81316a2b3809ec7397c5Dianne Hackborn                        }
2924df6edb1acefcd927932b7c1cb71575298d53b86Andrew Stadler                    });
293b763e34210e3947b46ef7c9bf396579f17ab0dafDianne Hackborn                    // Don't want to wait too long.
294b763e34210e3947b46ef7c9bf396579f17ab0dafDianne Hackborn                    getWindow().getDecorView().getHandler().postDelayed(new Runnable() {
295b763e34210e3947b46ef7c9bf396579f17ab0dafDianne Hackborn                        @Override public void run() {
296b763e34210e3947b46ef7c9bf396579f17ab0dafDianne Hackborn                            continueRemoveAction(null);
297b763e34210e3947b46ef7c9bf396579f17ab0dafDianne Hackborn                        }
298b763e34210e3947b46ef7c9bf396579f17ab0dafDianne Hackborn                    }, 2*1000);
2994df6edb1acefcd927932b7c1cb71575298d53b86Andrew Stadler                }
30028429033375c3876af56528bfc9ea6b541052fcbDianne Hackborn            }
30128429033375c3876af56528bfc9ea6b541052fcbDianne Hackborn        });
30228429033375c3876af56528bfc9ea6b541052fcbDianne Hackborn    }
30364e676a5863dc928546d047fe2e504cd54d3f835William Luh
304b8e0f608cf28f20b95b65a4f7c0b345298d98e41Amith Yamasani    void addAndFinish() {
305b8e0f608cf28f20b95b65a4f7c0b345298d98e41Amith Yamasani        try {
306b8e0f608cf28f20b95b65a4f7c0b345298d98e41Amith Yamasani            mDPM.setActiveAdmin(mDeviceAdmin.getComponent(), mRefreshing);
307b8e0f608cf28f20b95b65a4f7c0b345298d98e41Amith Yamasani            EventLog.writeEvent(EventLogTags.EXP_DET_DEVICE_ADMIN_ACTIVATED_BY_USER,
308b8e0f608cf28f20b95b65a4f7c0b345298d98e41Amith Yamasani                mDeviceAdmin.getActivityInfo().applicationInfo.uid);
309b8e0f608cf28f20b95b65a4f7c0b345298d98e41Amith Yamasani            setResult(Activity.RESULT_OK);
310b8e0f608cf28f20b95b65a4f7c0b345298d98e41Amith Yamasani        } catch (RuntimeException e) {
311b8e0f608cf28f20b95b65a4f7c0b345298d98e41Amith Yamasani            // Something bad happened...  could be that it was
312b8e0f608cf28f20b95b65a4f7c0b345298d98e41Amith Yamasani            // already set, though.
313b8e0f608cf28f20b95b65a4f7c0b345298d98e41Amith Yamasani            Log.w(TAG, "Exception trying to activate admin "
314b8e0f608cf28f20b95b65a4f7c0b345298d98e41Amith Yamasani                    + mDeviceAdmin.getComponent(), e);
315b8e0f608cf28f20b95b65a4f7c0b345298d98e41Amith Yamasani            if (mDPM.isAdminActive(mDeviceAdmin.getComponent())) {
316b8e0f608cf28f20b95b65a4f7c0b345298d98e41Amith Yamasani                setResult(Activity.RESULT_OK);
317b8e0f608cf28f20b95b65a4f7c0b345298d98e41Amith Yamasani            }
318b8e0f608cf28f20b95b65a4f7c0b345298d98e41Amith Yamasani        }
319b8e0f608cf28f20b95b65a4f7c0b345298d98e41Amith Yamasani        if (mAddingProfileOwner) {
320b8e0f608cf28f20b95b65a4f7c0b345298d98e41Amith Yamasani            try {
321b8e0f608cf28f20b95b65a4f7c0b345298d98e41Amith Yamasani                mDPM.setProfileOwner(mDeviceAdmin.getComponent(),
322b8e0f608cf28f20b95b65a4f7c0b345298d98e41Amith Yamasani                        mProfileOwnerName, UserHandle.myUserId());
323b8e0f608cf28f20b95b65a4f7c0b345298d98e41Amith Yamasani            } catch (RuntimeException re) {
324b8e0f608cf28f20b95b65a4f7c0b345298d98e41Amith Yamasani                setResult(Activity.RESULT_CANCELED);
325b8e0f608cf28f20b95b65a4f7c0b345298d98e41Amith Yamasani            }
326b8e0f608cf28f20b95b65a4f7c0b345298d98e41Amith Yamasani        }
327b8e0f608cf28f20b95b65a4f7c0b345298d98e41Amith Yamasani        finish();
328b8e0f608cf28f20b95b65a4f7c0b345298d98e41Amith Yamasani    }
329b8e0f608cf28f20b95b65a4f7c0b345298d98e41Amith Yamasani
330b763e34210e3947b46ef7c9bf396579f17ab0dafDianne Hackborn    void continueRemoveAction(CharSequence msg) {
331b763e34210e3947b46ef7c9bf396579f17ab0dafDianne Hackborn        if (!mWaitingForRemoveMsg) {
332b763e34210e3947b46ef7c9bf396579f17ab0dafDianne Hackborn            return;
333b763e34210e3947b46ef7c9bf396579f17ab0dafDianne Hackborn        }
334b763e34210e3947b46ef7c9bf396579f17ab0dafDianne Hackborn        mWaitingForRemoveMsg = false;
335b763e34210e3947b46ef7c9bf396579f17ab0dafDianne Hackborn        if (msg == null) {
336b763e34210e3947b46ef7c9bf396579f17ab0dafDianne Hackborn            try {
337b763e34210e3947b46ef7c9bf396579f17ab0dafDianne Hackborn                ActivityManagerNative.getDefault().resumeAppSwitches();
338b763e34210e3947b46ef7c9bf396579f17ab0dafDianne Hackborn            } catch (RemoteException e) {
339b763e34210e3947b46ef7c9bf396579f17ab0dafDianne Hackborn            }
340b763e34210e3947b46ef7c9bf396579f17ab0dafDianne Hackborn            mDPM.removeActiveAdmin(mDeviceAdmin.getComponent());
341b763e34210e3947b46ef7c9bf396579f17ab0dafDianne Hackborn            finish();
342b763e34210e3947b46ef7c9bf396579f17ab0dafDianne Hackborn        } else {
343b763e34210e3947b46ef7c9bf396579f17ab0dafDianne Hackborn            try {
344b763e34210e3947b46ef7c9bf396579f17ab0dafDianne Hackborn                // Continue preventing anything from coming in front.
345b763e34210e3947b46ef7c9bf396579f17ab0dafDianne Hackborn                ActivityManagerNative.getDefault().stopAppSwitches();
346b763e34210e3947b46ef7c9bf396579f17ab0dafDianne Hackborn            } catch (RemoteException e) {
347b763e34210e3947b46ef7c9bf396579f17ab0dafDianne Hackborn            }
348b763e34210e3947b46ef7c9bf396579f17ab0dafDianne Hackborn            Bundle args = new Bundle();
349b763e34210e3947b46ef7c9bf396579f17ab0dafDianne Hackborn            args.putCharSequence(
350b763e34210e3947b46ef7c9bf396579f17ab0dafDianne Hackborn                    DeviceAdminReceiver.EXTRA_DISABLE_WARNING, msg);
351b763e34210e3947b46ef7c9bf396579f17ab0dafDianne Hackborn            showDialog(DIALOG_WARNING, args);
352b763e34210e3947b46ef7c9bf396579f17ab0dafDianne Hackborn        }
353b763e34210e3947b46ef7c9bf396579f17ab0dafDianne Hackborn    }
354b763e34210e3947b46ef7c9bf396579f17ab0dafDianne Hackborn
35528429033375c3876af56528bfc9ea6b541052fcbDianne Hackborn    @Override
35628429033375c3876af56528bfc9ea6b541052fcbDianne Hackborn    protected void onResume() {
35728429033375c3876af56528bfc9ea6b541052fcbDianne Hackborn        super.onResume();
35828429033375c3876af56528bfc9ea6b541052fcbDianne Hackborn        updateInterface();
359b763e34210e3947b46ef7c9bf396579f17ab0dafDianne Hackborn        // As long as we are running, don't let this admin overlay stuff on top of the screen.
360b763e34210e3947b46ef7c9bf396579f17ab0dafDianne Hackborn        final int uid = mDeviceAdmin.getActivityInfo().applicationInfo.uid;
361b763e34210e3947b46ef7c9bf396579f17ab0dafDianne Hackborn        final String pkg = mDeviceAdmin.getActivityInfo().applicationInfo.packageName;
362b763e34210e3947b46ef7c9bf396579f17ab0dafDianne Hackborn        mCurSysAppOpMode = mAppOps.checkOp(AppOpsManager.OP_SYSTEM_ALERT_WINDOW, uid, pkg);
363b763e34210e3947b46ef7c9bf396579f17ab0dafDianne Hackborn        mCurToastAppOpMode = mAppOps.checkOp(AppOpsManager.OP_TOAST_WINDOW, uid, pkg);
364b763e34210e3947b46ef7c9bf396579f17ab0dafDianne Hackborn        mAppOps.setMode(AppOpsManager.OP_SYSTEM_ALERT_WINDOW, uid, pkg, AppOpsManager.MODE_IGNORED);
365b763e34210e3947b46ef7c9bf396579f17ab0dafDianne Hackborn        mAppOps.setMode(AppOpsManager.OP_TOAST_WINDOW, uid, pkg, AppOpsManager.MODE_IGNORED);
366b763e34210e3947b46ef7c9bf396579f17ab0dafDianne Hackborn    }
367b763e34210e3947b46ef7c9bf396579f17ab0dafDianne Hackborn
368b763e34210e3947b46ef7c9bf396579f17ab0dafDianne Hackborn    @Override
369b763e34210e3947b46ef7c9bf396579f17ab0dafDianne Hackborn    protected void onPause() {
370b763e34210e3947b46ef7c9bf396579f17ab0dafDianne Hackborn        super.onPause();
371b763e34210e3947b46ef7c9bf396579f17ab0dafDianne Hackborn        // As long as we are running, don't let this admin overlay stuff on top of the screen.
372b763e34210e3947b46ef7c9bf396579f17ab0dafDianne Hackborn        final int uid = mDeviceAdmin.getActivityInfo().applicationInfo.uid;
373b763e34210e3947b46ef7c9bf396579f17ab0dafDianne Hackborn        final String pkg = mDeviceAdmin.getActivityInfo().applicationInfo.packageName;
374b763e34210e3947b46ef7c9bf396579f17ab0dafDianne Hackborn        mAppOps.setMode(AppOpsManager.OP_SYSTEM_ALERT_WINDOW, uid, pkg, mCurSysAppOpMode);
375b763e34210e3947b46ef7c9bf396579f17ab0dafDianne Hackborn        mAppOps.setMode(AppOpsManager.OP_TOAST_WINDOW, uid, pkg, mCurToastAppOpMode);
376b763e34210e3947b46ef7c9bf396579f17ab0dafDianne Hackborn        try {
377b763e34210e3947b46ef7c9bf396579f17ab0dafDianne Hackborn            ActivityManagerNative.getDefault().resumeAppSwitches();
378b763e34210e3947b46ef7c9bf396579f17ab0dafDianne Hackborn        } catch (RemoteException e) {
379b763e34210e3947b46ef7c9bf396579f17ab0dafDianne Hackborn        }
38028429033375c3876af56528bfc9ea6b541052fcbDianne Hackborn    }
38164e676a5863dc928546d047fe2e504cd54d3f835William Luh
38261daf83ca8bcf1353e0e81316a2b3809ec7397c5Dianne Hackborn    @Override
38361daf83ca8bcf1353e0e81316a2b3809ec7397c5Dianne Hackborn    protected Dialog onCreateDialog(int id, Bundle args) {
38461daf83ca8bcf1353e0e81316a2b3809ec7397c5Dianne Hackborn        switch (id) {
38561daf83ca8bcf1353e0e81316a2b3809ec7397c5Dianne Hackborn            case DIALOG_WARNING: {
3865435511ee9151dbca8ad13656b3dc20ec79f940bDianne Hackborn                CharSequence msg = args.getCharSequence(DeviceAdminReceiver.EXTRA_DISABLE_WARNING);
38761daf83ca8bcf1353e0e81316a2b3809ec7397c5Dianne Hackborn                AlertDialog.Builder builder = new AlertDialog.Builder(
38861daf83ca8bcf1353e0e81316a2b3809ec7397c5Dianne Hackborn                        DeviceAdminAdd.this);
38961daf83ca8bcf1353e0e81316a2b3809ec7397c5Dianne Hackborn                builder.setMessage(msg);
39061daf83ca8bcf1353e0e81316a2b3809ec7397c5Dianne Hackborn                builder.setPositiveButton(R.string.dlg_ok,
39161daf83ca8bcf1353e0e81316a2b3809ec7397c5Dianne Hackborn                        new DialogInterface.OnClickListener() {
39261daf83ca8bcf1353e0e81316a2b3809ec7397c5Dianne Hackborn                    public void onClick(DialogInterface dialog, int which) {
393b763e34210e3947b46ef7c9bf396579f17ab0dafDianne Hackborn                        try {
394b763e34210e3947b46ef7c9bf396579f17ab0dafDianne Hackborn                            ActivityManagerNative.getDefault().resumeAppSwitches();
395b763e34210e3947b46ef7c9bf396579f17ab0dafDianne Hackborn                        } catch (RemoteException e) {
396b763e34210e3947b46ef7c9bf396579f17ab0dafDianne Hackborn                        }
39761daf83ca8bcf1353e0e81316a2b3809ec7397c5Dianne Hackborn                        mDPM.removeActiveAdmin(mDeviceAdmin.getComponent());
39861daf83ca8bcf1353e0e81316a2b3809ec7397c5Dianne Hackborn                        finish();
39961daf83ca8bcf1353e0e81316a2b3809ec7397c5Dianne Hackborn                    }
40061daf83ca8bcf1353e0e81316a2b3809ec7397c5Dianne Hackborn                });
40161daf83ca8bcf1353e0e81316a2b3809ec7397c5Dianne Hackborn                builder.setNegativeButton(R.string.dlg_cancel, null);
40261daf83ca8bcf1353e0e81316a2b3809ec7397c5Dianne Hackborn                return builder.create();
40361daf83ca8bcf1353e0e81316a2b3809ec7397c5Dianne Hackborn            }
40461daf83ca8bcf1353e0e81316a2b3809ec7397c5Dianne Hackborn            default:
40561daf83ca8bcf1353e0e81316a2b3809ec7397c5Dianne Hackborn                return super.onCreateDialog(id, args);
40664e676a5863dc928546d047fe2e504cd54d3f835William Luh
40761daf83ca8bcf1353e0e81316a2b3809ec7397c5Dianne Hackborn        }
40861daf83ca8bcf1353e0e81316a2b3809ec7397c5Dianne Hackborn    }
40964e676a5863dc928546d047fe2e504cd54d3f835William Luh
4108cecf89cec3ea14003482c046eec7d2aba8bb0adDianne Hackborn    static void setViewVisibility(ArrayList<View> views, int visibility) {
4118cecf89cec3ea14003482c046eec7d2aba8bb0adDianne Hackborn        final int N = views.size();
4128cecf89cec3ea14003482c046eec7d2aba8bb0adDianne Hackborn        for (int i=0; i<N; i++) {
4138cecf89cec3ea14003482c046eec7d2aba8bb0adDianne Hackborn            views.get(i).setVisibility(visibility);
4148cecf89cec3ea14003482c046eec7d2aba8bb0adDianne Hackborn        }
4158cecf89cec3ea14003482c046eec7d2aba8bb0adDianne Hackborn    }
41664e676a5863dc928546d047fe2e504cd54d3f835William Luh
41728429033375c3876af56528bfc9ea6b541052fcbDianne Hackborn    void updateInterface() {
41861daf83ca8bcf1353e0e81316a2b3809ec7397c5Dianne Hackborn        mAdminIcon.setImageDrawable(mDeviceAdmin.loadIcon(getPackageManager()));
41961daf83ca8bcf1353e0e81316a2b3809ec7397c5Dianne Hackborn        mAdminName.setText(mDeviceAdmin.loadLabel(getPackageManager()));
42028429033375c3876af56528bfc9ea6b541052fcbDianne Hackborn        try {
42161daf83ca8bcf1353e0e81316a2b3809ec7397c5Dianne Hackborn            mAdminDescription.setText(
42228429033375c3876af56528bfc9ea6b541052fcbDianne Hackborn                    mDeviceAdmin.loadDescription(getPackageManager()));
42361daf83ca8bcf1353e0e81316a2b3809ec7397c5Dianne Hackborn            mAdminDescription.setVisibility(View.VISIBLE);
42428429033375c3876af56528bfc9ea6b541052fcbDianne Hackborn        } catch (Resources.NotFoundException e) {
42561daf83ca8bcf1353e0e81316a2b3809ec7397c5Dianne Hackborn            mAdminDescription.setVisibility(View.GONE);
426b885afe4e7376a21d354ca11d4873930d9cce9eaDianne Hackborn        }
427b8e0f608cf28f20b95b65a4f7c0b345298d98e41Amith Yamasani        if (mAddingProfileOwner) {
428b8e0f608cf28f20b95b65a4f7c0b345298d98e41Amith Yamasani            mProfileOwnerWarning.setVisibility(View.VISIBLE);
429b8e0f608cf28f20b95b65a4f7c0b345298d98e41Amith Yamasani        }
430b885afe4e7376a21d354ca11d4873930d9cce9eaDianne Hackborn        if (mAddMsgText != null) {
431b885afe4e7376a21d354ca11d4873930d9cce9eaDianne Hackborn            mAddMsg.setText(mAddMsgText);
432b885afe4e7376a21d354ca11d4873930d9cce9eaDianne Hackborn            mAddMsg.setVisibility(View.VISIBLE);
433b885afe4e7376a21d354ca11d4873930d9cce9eaDianne Hackborn        } else {
434b885afe4e7376a21d354ca11d4873930d9cce9eaDianne Hackborn            mAddMsg.setVisibility(View.GONE);
435a1d01841664131eca201acfaf747f1f187de10f6Amith Yamasani            mAddMsgExpander.setVisibility(View.GONE);
43628429033375c3876af56528bfc9ea6b541052fcbDianne Hackborn        }
437b8e0f608cf28f20b95b65a4f7c0b345298d98e41Amith Yamasani        if (!mRefreshing && !mAddingProfileOwner
438b8e0f608cf28f20b95b65a4f7c0b345298d98e41Amith Yamasani                && mDPM.isAdminActive(mDeviceAdmin.getComponent())) {
4398cecf89cec3ea14003482c046eec7d2aba8bb0adDianne Hackborn            if (mActivePolicies.size() == 0) {
4408cecf89cec3ea14003482c046eec7d2aba8bb0adDianne Hackborn                ArrayList<DeviceAdminInfo.PolicyInfo> policies = mDeviceAdmin.getUsedPolicies();
4418cecf89cec3ea14003482c046eec7d2aba8bb0adDianne Hackborn                for (int i=0; i<policies.size(); i++) {
4428cecf89cec3ea14003482c046eec7d2aba8bb0adDianne Hackborn                    DeviceAdminInfo.PolicyInfo pi = policies.get(i);
4438cecf89cec3ea14003482c046eec7d2aba8bb0adDianne Hackborn                    View view = AppSecurityPermissions.getPermissionItemView(
4448cecf89cec3ea14003482c046eec7d2aba8bb0adDianne Hackborn                            this, getText(pi.label), "", true);
4458cecf89cec3ea14003482c046eec7d2aba8bb0adDianne Hackborn                    mActivePolicies.add(view);
4468cecf89cec3ea14003482c046eec7d2aba8bb0adDianne Hackborn                    mAdminPolicies.addView(view);
4478cecf89cec3ea14003482c046eec7d2aba8bb0adDianne Hackborn                }
4488cecf89cec3ea14003482c046eec7d2aba8bb0adDianne Hackborn            }
4498cecf89cec3ea14003482c046eec7d2aba8bb0adDianne Hackborn            setViewVisibility(mActivePolicies, View.VISIBLE);
4508cecf89cec3ea14003482c046eec7d2aba8bb0adDianne Hackborn            setViewVisibility(mAddingPolicies, View.GONE);
45161daf83ca8bcf1353e0e81316a2b3809ec7397c5Dianne Hackborn            mAdminWarning.setText(getString(R.string.device_admin_status,
45261daf83ca8bcf1353e0e81316a2b3809ec7397c5Dianne Hackborn                    mDeviceAdmin.getActivityInfo().applicationInfo.loadLabel(getPackageManager())));
453a1d01841664131eca201acfaf747f1f187de10f6Amith Yamasani            setTitle(getText(R.string.active_device_admin_msg));
45461daf83ca8bcf1353e0e81316a2b3809ec7397c5Dianne Hackborn            mActionButton.setText(getText(R.string.remove_device_admin));
45561daf83ca8bcf1353e0e81316a2b3809ec7397c5Dianne Hackborn            mAdding = false;
45661daf83ca8bcf1353e0e81316a2b3809ec7397c5Dianne Hackborn        } else {
4578cecf89cec3ea14003482c046eec7d2aba8bb0adDianne Hackborn            if (mAddingPolicies.size() == 0) {
4588cecf89cec3ea14003482c046eec7d2aba8bb0adDianne Hackborn                ArrayList<DeviceAdminInfo.PolicyInfo> policies = mDeviceAdmin.getUsedPolicies();
4598cecf89cec3ea14003482c046eec7d2aba8bb0adDianne Hackborn                for (int i=0; i<policies.size(); i++) {
4608cecf89cec3ea14003482c046eec7d2aba8bb0adDianne Hackborn                    DeviceAdminInfo.PolicyInfo pi = policies.get(i);
4618cecf89cec3ea14003482c046eec7d2aba8bb0adDianne Hackborn                    View view = AppSecurityPermissions.getPermissionItemView(
4628cecf89cec3ea14003482c046eec7d2aba8bb0adDianne Hackborn                            this, getText(pi.label), getText(pi.description), true);
4638cecf89cec3ea14003482c046eec7d2aba8bb0adDianne Hackborn                    mAddingPolicies.add(view);
4648cecf89cec3ea14003482c046eec7d2aba8bb0adDianne Hackborn                    mAdminPolicies.addView(view);
4658cecf89cec3ea14003482c046eec7d2aba8bb0adDianne Hackborn                }
4668cecf89cec3ea14003482c046eec7d2aba8bb0adDianne Hackborn            }
4678cecf89cec3ea14003482c046eec7d2aba8bb0adDianne Hackborn            setViewVisibility(mAddingPolicies, View.VISIBLE);
4688cecf89cec3ea14003482c046eec7d2aba8bb0adDianne Hackborn            setViewVisibility(mActivePolicies, View.GONE);
46961daf83ca8bcf1353e0e81316a2b3809ec7397c5Dianne Hackborn            mAdminWarning.setText(getString(R.string.device_admin_warning,
47061daf83ca8bcf1353e0e81316a2b3809ec7397c5Dianne Hackborn                    mDeviceAdmin.getActivityInfo().applicationInfo.loadLabel(getPackageManager())));
471b8e0f608cf28f20b95b65a4f7c0b345298d98e41Amith Yamasani            if (mAddingProfileOwner) {
472b8e0f608cf28f20b95b65a4f7c0b345298d98e41Amith Yamasani                setTitle(getText(R.string.profile_owner_add_title));
473b8e0f608cf28f20b95b65a4f7c0b345298d98e41Amith Yamasani            } else {
474b8e0f608cf28f20b95b65a4f7c0b345298d98e41Amith Yamasani                setTitle(getText(R.string.add_device_admin_msg));
475b8e0f608cf28f20b95b65a4f7c0b345298d98e41Amith Yamasani            }
47661daf83ca8bcf1353e0e81316a2b3809ec7397c5Dianne Hackborn            mActionButton.setText(getText(R.string.add_device_admin));
47761daf83ca8bcf1353e0e81316a2b3809ec7397c5Dianne Hackborn            mAdding = true;
47861daf83ca8bcf1353e0e81316a2b3809ec7397c5Dianne Hackborn        }
47928429033375c3876af56528bfc9ea6b541052fcbDianne Hackborn    }
48051794a05ad044ad87efd8291b8decb71a9b5455eChris Palmer
48151794a05ad044ad87efd8291b8decb71a9b5455eChris Palmer
48251794a05ad044ad87efd8291b8decb71a9b5455eChris Palmer    void toggleMessageEllipsis(View v) {
48351794a05ad044ad87efd8291b8decb71a9b5455eChris Palmer        TextView tv = (TextView) v;
48451794a05ad044ad87efd8291b8decb71a9b5455eChris Palmer
48551794a05ad044ad87efd8291b8decb71a9b5455eChris Palmer        mAddMsgEllipsized = ! mAddMsgEllipsized;
48651794a05ad044ad87efd8291b8decb71a9b5455eChris Palmer        tv.setEllipsize(mAddMsgEllipsized ? TruncateAt.END : null);
48751794a05ad044ad87efd8291b8decb71a9b5455eChris Palmer        tv.setMaxLines(mAddMsgEllipsized ? getEllipsizedLines() : MAX_ADD_MSG_LINES);
48851794a05ad044ad87efd8291b8decb71a9b5455eChris Palmer
489a1d01841664131eca201acfaf747f1f187de10f6Amith Yamasani        mAddMsgExpander.setImageResource(mAddMsgEllipsized ?
49051794a05ad044ad87efd8291b8decb71a9b5455eChris Palmer            com.android.internal.R.drawable.expander_ic_minimized :
49151794a05ad044ad87efd8291b8decb71a9b5455eChris Palmer            com.android.internal.R.drawable.expander_ic_maximized);
49251794a05ad044ad87efd8291b8decb71a9b5455eChris Palmer    }
49351794a05ad044ad87efd8291b8decb71a9b5455eChris Palmer
49451794a05ad044ad87efd8291b8decb71a9b5455eChris Palmer    int getEllipsizedLines() {
49551794a05ad044ad87efd8291b8decb71a9b5455eChris Palmer        Display d = ((WindowManager) getSystemService(Context.WINDOW_SERVICE))
49651794a05ad044ad87efd8291b8decb71a9b5455eChris Palmer                    .getDefaultDisplay();
49751794a05ad044ad87efd8291b8decb71a9b5455eChris Palmer
49851794a05ad044ad87efd8291b8decb71a9b5455eChris Palmer        return d.getHeight() > d.getWidth() ?
49951794a05ad044ad87efd8291b8decb71a9b5455eChris Palmer            MAX_ADD_MSG_LINES_PORTRAIT : MAX_ADD_MSG_LINES_LANDSCAPE;
50051794a05ad044ad87efd8291b8decb71a9b5455eChris Palmer    }
50151794a05ad044ad87efd8291b8decb71a9b5455eChris Palmer
50228429033375c3876af56528bfc9ea6b541052fcbDianne Hackborn}
503