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