DevicePolicyManagerService.java revision e4da41e6be7b6cc5d2f26d1c24910785d04c751c
1/*
2 * Copyright (C) 2010 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.server.devicepolicy;
18
19import static android.Manifest.permission.MANAGE_CA_CERTIFICATES;
20import static android.app.admin.DevicePolicyManager.PASSWORD_QUALITY_COMPLEX;
21import static android.app.admin.DevicePolicyManager.WIPE_EXTERNAL_STORAGE;
22import static android.app.admin.DevicePolicyManager.WIPE_RESET_PROTECTION_DATA;
23import static android.content.pm.PackageManager.GET_UNINSTALLED_PACKAGES;
24
25import static com.android.internal.widget.LockPatternUtils.StrongAuthTracker.STRONG_AUTH_REQUIRED_AFTER_DPM_LOCK_NOW;
26import static org.xmlpull.v1.XmlPullParser.END_DOCUMENT;
27import static org.xmlpull.v1.XmlPullParser.END_TAG;
28import static org.xmlpull.v1.XmlPullParser.TEXT;
29
30import android.Manifest.permission;
31import android.accessibilityservice.AccessibilityServiceInfo;
32import android.accounts.AccountManager;
33import android.annotation.IntDef;
34import android.annotation.NonNull;
35import android.annotation.Nullable;
36import android.annotation.UserIdInt;
37import android.app.Activity;
38import android.app.ActivityManager;
39import android.app.ActivityManagerNative;
40import android.app.AlarmManager;
41import android.app.AppGlobals;
42import android.app.IActivityManager;
43import android.app.Notification;
44import android.app.NotificationManager;
45import android.app.PendingIntent;
46import android.app.StatusBarManager;
47import android.app.admin.DeviceAdminInfo;
48import android.app.admin.DeviceAdminReceiver;
49import android.app.admin.DevicePolicyManager;
50import android.app.admin.DevicePolicyManagerInternal;
51import android.app.admin.IDevicePolicyManager;
52import android.app.admin.SecurityLog;
53import android.app.admin.SecurityLog.SecurityEvent;
54import android.app.admin.SystemUpdatePolicy;
55import android.app.backup.IBackupManager;
56import android.content.BroadcastReceiver;
57import android.content.ComponentName;
58import android.content.Context;
59import android.content.Intent;
60import android.content.IntentFilter;
61import android.content.pm.ActivityInfo;
62import android.content.pm.ApplicationInfo;
63import android.content.pm.IPackageManager;
64import android.content.pm.PackageInfo;
65import android.content.pm.PackageManager;
66import android.content.pm.PackageManager.NameNotFoundException;
67import android.content.pm.PackageManagerInternal;
68import android.content.pm.ParceledListSlice;
69import android.content.pm.ResolveInfo;
70import android.content.pm.ServiceInfo;
71import android.content.pm.UserInfo;
72import android.database.ContentObserver;
73import android.graphics.Bitmap;
74import android.graphics.Color;
75import android.media.AudioManager;
76import android.media.IAudioService;
77import android.net.ConnectivityManager;
78import android.net.ProxyInfo;
79import android.net.Uri;
80import android.net.wifi.WifiInfo;
81import android.net.wifi.WifiManager;
82import android.os.AsyncTask;
83import android.os.Binder;
84import android.os.Build;
85import android.os.Bundle;
86import android.os.Environment;
87import android.os.FileUtils;
88import android.os.Handler;
89import android.os.IBinder;
90import android.os.Looper;
91import android.os.ParcelFileDescriptor;
92import android.os.PersistableBundle;
93import android.os.PowerManager;
94import android.os.PowerManagerInternal;
95import android.os.Process;
96import android.os.RecoverySystem;
97import android.os.RemoteCallback;
98import android.os.RemoteException;
99import android.os.ServiceManager;
100import android.os.SystemClock;
101import android.os.SystemProperties;
102import android.os.UserHandle;
103import android.os.UserManager;
104import android.os.UserManagerInternal;
105import android.os.storage.StorageManager;
106import android.provider.ContactsContract.QuickContact;
107import android.provider.ContactsInternal;
108import android.provider.Settings;
109import android.security.Credentials;
110import android.security.IKeyChainAliasCallback;
111import android.security.IKeyChainService;
112import android.security.KeyChain;
113import android.security.KeyChain.KeyChainConnection;
114import android.service.persistentdata.PersistentDataBlockManager;
115import android.telephony.TelephonyManager;
116import android.text.TextUtils;
117import android.util.ArrayMap;
118import android.util.ArraySet;
119import android.util.Log;
120import android.util.Pair;
121import android.util.Slog;
122import android.util.SparseArray;
123import android.util.Xml;
124import android.view.IWindowManager;
125import android.view.accessibility.AccessibilityManager;
126import android.view.accessibility.IAccessibilityManager;
127import android.view.inputmethod.InputMethodInfo;
128import android.view.inputmethod.InputMethodManager;
129
130import com.android.internal.R;
131import com.android.internal.annotations.VisibleForTesting;
132import com.android.internal.statusbar.IStatusBarService;
133import com.android.internal.util.FastXmlSerializer;
134import com.android.internal.util.JournaledFile;
135import com.android.internal.util.ParcelableString;
136import com.android.internal.util.Preconditions;
137import com.android.internal.util.XmlUtils;
138import com.android.internal.widget.LockPatternUtils;
139import com.android.server.LocalServices;
140import com.android.server.SystemService;
141import com.android.server.devicepolicy.DevicePolicyManagerService.ActiveAdmin.TrustAgentInfo;
142import com.android.server.pm.UserRestrictionsUtils;
143import com.google.android.collect.Sets;
144
145import org.xmlpull.v1.XmlPullParser;
146import org.xmlpull.v1.XmlPullParserException;
147import org.xmlpull.v1.XmlSerializer;
148
149import java.io.ByteArrayInputStream;
150import java.io.File;
151import java.io.FileDescriptor;
152import java.io.FileInputStream;
153import java.io.FileNotFoundException;
154import java.io.FileOutputStream;
155import java.io.IOException;
156import java.io.PrintWriter;
157import java.lang.annotation.Retention;
158import java.lang.annotation.RetentionPolicy;
159import java.nio.charset.StandardCharsets;
160import java.security.cert.CertificateException;
161import java.security.cert.CertificateFactory;
162import java.security.cert.X509Certificate;
163import java.text.DateFormat;
164import java.util.ArrayList;
165import java.util.Arrays;
166import java.util.Collections;
167import java.util.Date;
168import java.util.List;
169import java.util.Map.Entry;
170import java.util.Set;
171import java.util.concurrent.atomic.AtomicBoolean;
172
173/**
174 * Implementation of the device policy APIs.
175 */
176public class DevicePolicyManagerService extends IDevicePolicyManager.Stub {
177
178    private static final String LOG_TAG = "DevicePolicyManagerService";
179
180    private static final boolean VERBOSE_LOG = false; // DO NOT SUBMIT WITH TRUE
181
182    private static final String DEVICE_POLICIES_XML = "device_policies.xml";
183
184    private static final String TAG_ACCEPTED_CA_CERTIFICATES = "accepted-ca-certificate";
185
186    private static final String TAG_LOCK_TASK_COMPONENTS = "lock-task-component";
187
188    private static final String TAG_STATUS_BAR = "statusbar";
189
190    private static final String ATTR_DISABLED = "disabled";
191
192    private static final String ATTR_NAME = "name";
193
194    private static final String DO_NOT_ASK_CREDENTIALS_ON_BOOT_XML =
195            "do-not-ask-credentials-on-boot";
196
197    private static final String TAG_AFFILIATION_ID = "affiliation-id";
198
199    private static final String TAG_ADMIN_BROADCAST_PENDING = "admin-broadcast-pending";
200
201    private static final String ATTR_VALUE = "value";
202
203    private static final String TAG_INITIALIZATION_BUNDLE = "initialization-bundle";
204
205    private static final int REQUEST_EXPIRE_PASSWORD = 5571;
206
207    private static final long MS_PER_DAY = 86400 * 1000;
208
209    private static final long EXPIRATION_GRACE_PERIOD_MS = 5 * MS_PER_DAY; // 5 days, in ms
210
211    private static final String ACTION_EXPIRED_PASSWORD_NOTIFICATION
212            = "com.android.server.ACTION_EXPIRED_PASSWORD_NOTIFICATION";
213
214    private static final int MONITORING_CERT_NOTIFICATION_ID = R.plurals.ssl_ca_cert_warning;
215    private static final int PROFILE_WIPED_NOTIFICATION_ID = 1001;
216
217    private static final String ATTR_PERMISSION_PROVIDER = "permission-provider";
218    private static final String ATTR_SETUP_COMPLETE = "setup-complete";
219    private static final String ATTR_PROVISIONING_STATE = "provisioning-state";
220    private static final String ATTR_PERMISSION_POLICY = "permission-policy";
221    private static final String ATTR_DEVICE_PROVISIONING_CONFIG_APPLIED =
222            "device-provisioning-config-applied";
223
224    private static final String ATTR_DELEGATED_CERT_INSTALLER = "delegated-cert-installer";
225    private static final String ATTR_APPLICATION_RESTRICTIONS_MANAGER
226            = "application-restrictions-manager";
227
228    /**
229     *  System property whose value is either "true" or "false", indicating whether
230     */
231    private static final String PROPERTY_DEVICE_OWNER_PRESENT = "ro.device_owner";
232
233    private static final int STATUS_BAR_DISABLE_MASK =
234            StatusBarManager.DISABLE_EXPAND |
235            StatusBarManager.DISABLE_NOTIFICATION_ICONS |
236            StatusBarManager.DISABLE_NOTIFICATION_ALERTS |
237            StatusBarManager.DISABLE_SEARCH;
238
239    private static final int STATUS_BAR_DISABLE2_MASK =
240            StatusBarManager.DISABLE2_QUICK_SETTINGS;
241
242    private static final Set<String> SECURE_SETTINGS_WHITELIST;
243    private static final Set<String> SECURE_SETTINGS_DEVICEOWNER_WHITELIST;
244    private static final Set<String> GLOBAL_SETTINGS_WHITELIST;
245    private static final Set<String> GLOBAL_SETTINGS_DEPRECATED;
246    static {
247        SECURE_SETTINGS_WHITELIST = new ArraySet<>();
248        SECURE_SETTINGS_WHITELIST.add(Settings.Secure.DEFAULT_INPUT_METHOD);
249        SECURE_SETTINGS_WHITELIST.add(Settings.Secure.SKIP_FIRST_USE_HINTS);
250        SECURE_SETTINGS_WHITELIST.add(Settings.Secure.INSTALL_NON_MARKET_APPS);
251
252        SECURE_SETTINGS_DEVICEOWNER_WHITELIST = new ArraySet<>();
253        SECURE_SETTINGS_DEVICEOWNER_WHITELIST.addAll(SECURE_SETTINGS_WHITELIST);
254        SECURE_SETTINGS_DEVICEOWNER_WHITELIST.add(Settings.Secure.LOCATION_MODE);
255
256        GLOBAL_SETTINGS_WHITELIST = new ArraySet<>();
257        GLOBAL_SETTINGS_WHITELIST.add(Settings.Global.ADB_ENABLED);
258        GLOBAL_SETTINGS_WHITELIST.add(Settings.Global.AUTO_TIME);
259        GLOBAL_SETTINGS_WHITELIST.add(Settings.Global.AUTO_TIME_ZONE);
260        GLOBAL_SETTINGS_WHITELIST.add(Settings.Global.DATA_ROAMING);
261        GLOBAL_SETTINGS_WHITELIST.add(Settings.Global.USB_MASS_STORAGE_ENABLED);
262        GLOBAL_SETTINGS_WHITELIST.add(Settings.Global.WIFI_SLEEP_POLICY);
263        GLOBAL_SETTINGS_WHITELIST.add(Settings.Global.STAY_ON_WHILE_PLUGGED_IN);
264        GLOBAL_SETTINGS_WHITELIST.add(Settings.Global.WIFI_DEVICE_OWNER_CONFIGS_LOCKDOWN);
265
266        GLOBAL_SETTINGS_DEPRECATED = new ArraySet<>();
267        GLOBAL_SETTINGS_DEPRECATED.add(Settings.Global.BLUETOOTH_ON);
268        GLOBAL_SETTINGS_DEPRECATED.add(Settings.Global.DEVELOPMENT_SETTINGS_ENABLED);
269        GLOBAL_SETTINGS_DEPRECATED.add(Settings.Global.MODE_RINGER);
270        GLOBAL_SETTINGS_DEPRECATED.add(Settings.Global.NETWORK_PREFERENCE);
271        GLOBAL_SETTINGS_DEPRECATED.add(Settings.Global.WIFI_ON);
272    }
273
274    /**
275     * Keyguard features that when set on a managed profile that doesn't have its own challenge will
276     * affect the profile's parent user. These can also be set on the managed profile's parent DPM
277     * instance.
278     */
279    private static final int PROFILE_KEYGUARD_FEATURES_AFFECT_OWNER =
280            DevicePolicyManager.KEYGUARD_DISABLE_TRUST_AGENTS
281            | DevicePolicyManager.KEYGUARD_DISABLE_FINGERPRINT;
282
283    /**
284     * Keyguard features that when set on a profile affect the profile content or challenge only.
285     * These cannot be set on the managed profile's parent DPM instance
286     */
287    private static final int PROFILE_KEYGUARD_FEATURES_PROFILE_ONLY =
288            DevicePolicyManager.KEYGUARD_DISABLE_UNREDACTED_NOTIFICATIONS;
289
290    /** Keyguard features that are allowed to be set on a managed profile */
291    private static final int PROFILE_KEYGUARD_FEATURES =
292            PROFILE_KEYGUARD_FEATURES_AFFECT_OWNER | PROFILE_KEYGUARD_FEATURES_PROFILE_ONLY;
293
294    private static final int CODE_OK = 0;
295    private static final int CODE_HAS_DEVICE_OWNER = 1;
296    private static final int CODE_USER_HAS_PROFILE_OWNER = 2;
297    private static final int CODE_USER_NOT_RUNNING = 3;
298    private static final int CODE_USER_SETUP_COMPLETED = 4;
299    private static final int CODE_NONSYSTEM_USER_EXISTS = 5;
300    private static final int CODE_ACCOUNTS_NOT_EMPTY = 6;
301    private static final int CODE_NOT_SYSTEM_USER = 7;
302
303    @Retention(RetentionPolicy.SOURCE)
304    @IntDef({ CODE_OK, CODE_HAS_DEVICE_OWNER, CODE_USER_HAS_PROFILE_OWNER, CODE_USER_NOT_RUNNING,
305            CODE_USER_SETUP_COMPLETED, CODE_NOT_SYSTEM_USER })
306    private @interface DeviceOwnerPreConditionCode {}
307
308    private static final int DEVICE_ADMIN_DEACTIVATE_TIMEOUT = 10000;
309
310    final Context mContext;
311    final Injector mInjector;
312    final IPackageManager mIPackageManager;
313    final UserManager mUserManager;
314    final UserManagerInternal mUserManagerInternal;
315    final TelephonyManager mTelephonyManager;
316    private final LockPatternUtils mLockPatternUtils;
317
318    /**
319     * Contains (package-user) pairs to remove. An entry (p, u) implies that removal of package p
320     * is requested for user u.
321     */
322    private final Set<Pair<String, Integer>> mPackagesToRemove =
323            new ArraySet<Pair<String, Integer>>();
324
325    final LocalService mLocalService;
326
327    // Stores and loads state on device and profile owners.
328    @VisibleForTesting
329    final Owners mOwners;
330
331    private final Binder mToken = new Binder();
332
333    /**
334     * Whether or not device admin feature is supported. If it isn't return defaults for all
335     * public methods.
336     */
337    boolean mHasFeature;
338
339    private final SecurityLogMonitor mSecurityLogMonitor;
340
341    private final AtomicBoolean mRemoteBugreportServiceIsActive = new AtomicBoolean();
342    private final AtomicBoolean mRemoteBugreportSharingAccepted = new AtomicBoolean();
343
344    private final Runnable mRemoteBugreportTimeoutRunnable = new Runnable() {
345        @Override
346        public void run() {
347            if(mRemoteBugreportServiceIsActive.get()) {
348                onBugreportFailed();
349            }
350        }
351    };
352
353    private final BroadcastReceiver mRemoteBugreportFinishedReceiver = new BroadcastReceiver() {
354
355        @Override
356        public void onReceive(Context context, Intent intent) {
357            if (DevicePolicyManager.ACTION_REMOTE_BUGREPORT_DISPATCH.equals(intent.getAction())
358                    && mRemoteBugreportServiceIsActive.get()) {
359                onBugreportFinished(intent);
360            }
361        }
362    };
363
364    private final BroadcastReceiver mRemoteBugreportConsentReceiver = new BroadcastReceiver() {
365
366        @Override
367        public void onReceive(Context context, Intent intent) {
368            String action = intent.getAction();
369            mInjector.getNotificationManager().cancel(LOG_TAG,
370                    RemoteBugreportUtils.NOTIFICATION_ID);
371            if (DevicePolicyManager.ACTION_BUGREPORT_SHARING_ACCEPTED.equals(action)) {
372                onBugreportSharingAccepted();
373            } else if (DevicePolicyManager.ACTION_BUGREPORT_SHARING_DECLINED.equals(action)) {
374                onBugreportSharingDeclined();
375            }
376            mContext.unregisterReceiver(mRemoteBugreportConsentReceiver);
377        }
378    };
379
380    public static final class Lifecycle extends SystemService {
381        private DevicePolicyManagerService mService;
382
383        public Lifecycle(Context context) {
384            super(context);
385            mService = new DevicePolicyManagerService(context);
386        }
387
388        @Override
389        public void onStart() {
390            publishBinderService(Context.DEVICE_POLICY_SERVICE, mService);
391        }
392
393        @Override
394        public void onBootPhase(int phase) {
395            mService.systemReady(phase);
396        }
397
398        @Override
399        public void onStartUser(int userHandle) {
400            mService.onStartUser(userHandle);
401        }
402    }
403
404    public static class DevicePolicyData {
405        int mActivePasswordQuality = DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED;
406        int mActivePasswordLength = 0;
407        int mActivePasswordUpperCase = 0;
408        int mActivePasswordLowerCase = 0;
409        int mActivePasswordLetters = 0;
410        int mActivePasswordNumeric = 0;
411        int mActivePasswordSymbols = 0;
412        int mActivePasswordNonLetter = 0;
413        int mFailedPasswordAttempts = 0;
414
415        int mUserHandle;
416        int mPasswordOwner = -1;
417        long mLastMaximumTimeToLock = -1;
418        boolean mUserSetupComplete = false;
419        int mUserProvisioningState;
420        int mPermissionPolicy;
421
422        boolean mDeviceProvisioningConfigApplied = false;
423
424        final ArrayMap<ComponentName, ActiveAdmin> mAdminMap = new ArrayMap<>();
425        final ArrayList<ActiveAdmin> mAdminList = new ArrayList<>();
426        final ArrayList<ComponentName> mRemovingAdmins = new ArrayList<>();
427
428        final ArraySet<String> mAcceptedCaCertificates = new ArraySet<>();
429
430        // This is the list of component allowed to start lock task mode.
431        List<String> mLockTaskPackages = new ArrayList<>();
432
433        boolean mStatusBarDisabled = false;
434
435        ComponentName mRestrictionsProvider;
436
437        String mDelegatedCertInstallerPackage;
438
439        boolean doNotAskCredentialsOnBoot = false;
440
441        String mApplicationRestrictionsManagingPackage;
442
443        Set<String> mAffiliationIds = new ArraySet<>();
444
445        // Used for initialization of users created by createAndManageUsers.
446        boolean mAdminBroadcastPending = false;
447        PersistableBundle mInitBundle = null;
448
449        public DevicePolicyData(int userHandle) {
450            mUserHandle = userHandle;
451        }
452    }
453
454    final SparseArray<DevicePolicyData> mUserData = new SparseArray<>();
455
456    final Handler mHandler;
457
458    BroadcastReceiver mReceiver = new BroadcastReceiver() {
459        @Override
460        public void onReceive(Context context, Intent intent) {
461            final String action = intent.getAction();
462            final int userHandle = intent.getIntExtra(Intent.EXTRA_USER_HANDLE,
463                    getSendingUserId());
464
465            if (Intent.ACTION_BOOT_COMPLETED.equals(action)
466                    && userHandle == mOwners.getDeviceOwnerUserId()
467                    && getDeviceOwnerRemoteBugreportUri() != null) {
468                IntentFilter filterConsent = new IntentFilter();
469                filterConsent.addAction(DevicePolicyManager.ACTION_BUGREPORT_SHARING_DECLINED);
470                filterConsent.addAction(DevicePolicyManager.ACTION_BUGREPORT_SHARING_ACCEPTED);
471                mContext.registerReceiver(mRemoteBugreportConsentReceiver, filterConsent);
472                mInjector.getNotificationManager().notifyAsUser(LOG_TAG,
473                        RemoteBugreportUtils.NOTIFICATION_ID,
474                        RemoteBugreportUtils.buildNotification(mContext,
475                                DevicePolicyManager.NOTIFICATION_BUGREPORT_FINISHED_NOT_ACCEPTED),
476                                UserHandle.ALL);
477            }
478            if (Intent.ACTION_BOOT_COMPLETED.equals(action)
479                    || ACTION_EXPIRED_PASSWORD_NOTIFICATION.equals(action)) {
480                if (VERBOSE_LOG) {
481                    Slog.v(LOG_TAG, "Sending password expiration notifications for action "
482                            + action + " for user " + userHandle);
483                }
484                mHandler.post(new Runnable() {
485                    @Override
486                    public void run() {
487                        handlePasswordExpirationNotification(userHandle);
488                    }
489                });
490            }
491            if (Intent.ACTION_USER_UNLOCKED.equals(action)
492                    || Intent.ACTION_USER_STARTED.equals(action)
493                    || KeyChain.ACTION_TRUST_STORE_CHANGED.equals(action)) {
494                int userId = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, UserHandle.USER_ALL);
495                new MonitoringCertNotificationTask().execute(userId);
496            }
497            if (Intent.ACTION_USER_ADDED.equals(action)) {
498                disableSecurityLoggingIfNotCompliant();
499            } else if (Intent.ACTION_USER_REMOVED.equals(action)) {
500                disableSecurityLoggingIfNotCompliant();
501                removeUserData(userHandle);
502            } else if (Intent.ACTION_USER_STARTED.equals(action)) {
503                synchronized (DevicePolicyManagerService.this) {
504                    // Reset the policy data
505                    mUserData.remove(userHandle);
506                    sendAdminEnabledBroadcastLocked(userHandle);
507                }
508                handlePackagesChanged(null /* check all admins */, userHandle);
509            } else if (Intent.ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE.equals(action)) {
510                handlePackagesChanged(null /* check all admins */, userHandle);
511            } else if (Intent.ACTION_PACKAGE_CHANGED.equals(action)
512                    || (Intent.ACTION_PACKAGE_ADDED.equals(action)
513                            && intent.getBooleanExtra(Intent.EXTRA_REPLACING, false))) {
514                handlePackagesChanged(intent.getData().getSchemeSpecificPart(), userHandle);
515            } else if (Intent.ACTION_PACKAGE_REMOVED.equals(action)
516                    && !intent.getBooleanExtra(Intent.EXTRA_REPLACING, false)) {
517                handlePackagesChanged(intent.getData().getSchemeSpecificPart(), userHandle);
518            } else if (Intent.ACTION_MANAGED_PROFILE_ADDED.equals(action)) {
519                clearWipeProfileNotification();
520            }
521        }
522    };
523
524    static class ActiveAdmin {
525        private static final String TAG_DISABLE_KEYGUARD_FEATURES = "disable-keyguard-features";
526        private static final String TAG_DISABLE_CAMERA = "disable-camera";
527        private static final String TAG_DISABLE_CALLER_ID = "disable-caller-id";
528        private static final String TAG_DISABLE_CONTACTS_SEARCH = "disable-contacts-search";
529        private static final String TAG_DISABLE_BLUETOOTH_CONTACT_SHARING
530                = "disable-bt-contacts-sharing";
531        private static final String TAG_DISABLE_SCREEN_CAPTURE = "disable-screen-capture";
532        private static final String TAG_DISABLE_ACCOUNT_MANAGEMENT = "disable-account-management";
533        private static final String TAG_REQUIRE_AUTO_TIME = "require_auto_time";
534        private static final String TAG_FORCE_EPHEMERAL_USERS = "force_ephemeral_users";
535        private static final String TAG_ACCOUNT_TYPE = "account-type";
536        private static final String TAG_PERMITTED_ACCESSIBILITY_SERVICES
537                = "permitted-accessiblity-services";
538        private static final String TAG_ENCRYPTION_REQUESTED = "encryption-requested";
539        private static final String TAG_MANAGE_TRUST_AGENT_FEATURES = "manage-trust-agent-features";
540        private static final String TAG_TRUST_AGENT_COMPONENT_OPTIONS = "trust-agent-component-options";
541        private static final String TAG_TRUST_AGENT_COMPONENT = "component";
542        private static final String TAG_PASSWORD_EXPIRATION_DATE = "password-expiration-date";
543        private static final String TAG_PASSWORD_EXPIRATION_TIMEOUT = "password-expiration-timeout";
544        private static final String TAG_GLOBAL_PROXY_EXCLUSION_LIST = "global-proxy-exclusion-list";
545        private static final String TAG_GLOBAL_PROXY_SPEC = "global-proxy-spec";
546        private static final String TAG_SPECIFIES_GLOBAL_PROXY = "specifies-global-proxy";
547        private static final String TAG_PERMITTED_IMES = "permitted-imes";
548        private static final String TAG_MAX_FAILED_PASSWORD_WIPE = "max-failed-password-wipe";
549        private static final String TAG_MAX_TIME_TO_UNLOCK = "max-time-to-unlock";
550        private static final String TAG_MIN_PASSWORD_NONLETTER = "min-password-nonletter";
551        private static final String TAG_MIN_PASSWORD_SYMBOLS = "min-password-symbols";
552        private static final String TAG_MIN_PASSWORD_NUMERIC = "min-password-numeric";
553        private static final String TAG_MIN_PASSWORD_LETTERS = "min-password-letters";
554        private static final String TAG_MIN_PASSWORD_LOWERCASE = "min-password-lowercase";
555        private static final String TAG_MIN_PASSWORD_UPPERCASE = "min-password-uppercase";
556        private static final String TAG_PASSWORD_HISTORY_LENGTH = "password-history-length";
557        private static final String TAG_MIN_PASSWORD_LENGTH = "min-password-length";
558        private static final String ATTR_VALUE = "value";
559        private static final String TAG_PASSWORD_QUALITY = "password-quality";
560        private static final String TAG_POLICIES = "policies";
561        private static final String TAG_CROSS_PROFILE_WIDGET_PROVIDERS =
562                "cross-profile-widget-providers";
563        private static final String TAG_PROVIDER = "provider";
564        private static final String TAG_PACKAGE_LIST_ITEM  = "item";
565        private static final String TAG_KEEP_UNINSTALLED_PACKAGES  = "keep-uninstalled-packages";
566        private static final String TAG_USER_RESTRICTIONS = "user-restrictions";
567        private static final String TAG_SHORT_SUPPORT_MESSAGE = "short-support-message";
568        private static final String TAG_LONG_SUPPORT_MESSAGE = "long-support-message";
569        private static final String TAG_PARENT_ADMIN = "parent-admin";
570        private static final String TAG_ORGANIZATION_COLOR = "organization-color";
571        private static final String TAG_ORGANIZATION_NAME = "organization-name";
572
573        final DeviceAdminInfo info;
574
575        int passwordQuality = DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED;
576
577        static final int DEF_MINIMUM_PASSWORD_LENGTH = 0;
578        int minimumPasswordLength = DEF_MINIMUM_PASSWORD_LENGTH;
579
580        static final int DEF_PASSWORD_HISTORY_LENGTH = 0;
581        int passwordHistoryLength = DEF_PASSWORD_HISTORY_LENGTH;
582
583        static final int DEF_MINIMUM_PASSWORD_UPPER_CASE = 0;
584        int minimumPasswordUpperCase = DEF_MINIMUM_PASSWORD_UPPER_CASE;
585
586        static final int DEF_MINIMUM_PASSWORD_LOWER_CASE = 0;
587        int minimumPasswordLowerCase = DEF_MINIMUM_PASSWORD_LOWER_CASE;
588
589        static final int DEF_MINIMUM_PASSWORD_LETTERS = 1;
590        int minimumPasswordLetters = DEF_MINIMUM_PASSWORD_LETTERS;
591
592        static final int DEF_MINIMUM_PASSWORD_NUMERIC = 1;
593        int minimumPasswordNumeric = DEF_MINIMUM_PASSWORD_NUMERIC;
594
595        static final int DEF_MINIMUM_PASSWORD_SYMBOLS = 1;
596        int minimumPasswordSymbols = DEF_MINIMUM_PASSWORD_SYMBOLS;
597
598        static final int DEF_MINIMUM_PASSWORD_NON_LETTER = 0;
599        int minimumPasswordNonLetter = DEF_MINIMUM_PASSWORD_NON_LETTER;
600
601        static final long DEF_MAXIMUM_TIME_TO_UNLOCK = 0;
602        long maximumTimeToUnlock = DEF_MAXIMUM_TIME_TO_UNLOCK;
603
604        static final int DEF_MAXIMUM_FAILED_PASSWORDS_FOR_WIPE = 0;
605        int maximumFailedPasswordsForWipe = DEF_MAXIMUM_FAILED_PASSWORDS_FOR_WIPE;
606
607        static final long DEF_PASSWORD_EXPIRATION_TIMEOUT = 0;
608        long passwordExpirationTimeout = DEF_PASSWORD_EXPIRATION_TIMEOUT;
609
610        static final long DEF_PASSWORD_EXPIRATION_DATE = 0;
611        long passwordExpirationDate = DEF_PASSWORD_EXPIRATION_DATE;
612
613        static final int DEF_KEYGUARD_FEATURES_DISABLED = 0; // none
614
615        int disabledKeyguardFeatures = DEF_KEYGUARD_FEATURES_DISABLED;
616
617        boolean encryptionRequested = false;
618        boolean disableCamera = false;
619        boolean disableCallerId = false;
620        boolean disableContactsSearch = false;
621        boolean disableBluetoothContactSharing = true;
622        boolean disableScreenCapture = false; // Can only be set by a device/profile owner.
623        boolean requireAutoTime = false; // Can only be set by a device owner.
624        boolean forceEphemeralUsers = false; // Can only be set by a device owner.
625
626        ActiveAdmin parentAdmin;
627        final boolean isParent;
628
629        static class TrustAgentInfo {
630            public PersistableBundle options;
631            TrustAgentInfo(PersistableBundle bundle) {
632                options = bundle;
633            }
634        }
635
636        Set<String> accountTypesWithManagementDisabled = new ArraySet<>();
637
638        // The list of permitted accessibility services package namesas set by a profile
639        // or device owner. Null means all accessibility services are allowed, empty means
640        // none except system services are allowed.
641        List<String> permittedAccessiblityServices;
642
643        // The list of permitted input methods package names as set by a profile or device owner.
644        // Null means all input methods are allowed, empty means none except system imes are
645        // allowed.
646        List<String> permittedInputMethods;
647
648        // List of package names to keep cached.
649        List<String> keepUninstalledPackages;
650
651        // TODO: review implementation decisions with frameworks team
652        boolean specifiesGlobalProxy = false;
653        String globalProxySpec = null;
654        String globalProxyExclusionList = null;
655
656        ArrayMap<String, TrustAgentInfo> trustAgentInfos = new ArrayMap<>();
657
658        List<String> crossProfileWidgetProviders;
659
660        Bundle userRestrictions;
661
662        // Support text provided by the admin to display to the user.
663        CharSequence shortSupportMessage = null;
664        CharSequence longSupportMessage = null;
665
666        // Background color of confirm credentials screen. Default: teal.
667        static final int DEF_ORGANIZATION_COLOR = Color.parseColor("#00796B");
668        int organizationColor = DEF_ORGANIZATION_COLOR;
669
670        // Default title of confirm credentials screen
671        String organizationName = null;
672
673        ActiveAdmin(DeviceAdminInfo _info, boolean parent) {
674            info = _info;
675            isParent = parent;
676        }
677
678        ActiveAdmin getParentActiveAdmin() {
679            Preconditions.checkState(!isParent);
680
681            if (parentAdmin == null) {
682                parentAdmin = new ActiveAdmin(info, /* parent */ true);
683            }
684            return parentAdmin;
685        }
686
687        boolean hasParentActiveAdmin() {
688            return parentAdmin != null;
689        }
690
691        int getUid() { return info.getActivityInfo().applicationInfo.uid; }
692
693        public UserHandle getUserHandle() {
694            return UserHandle.of(UserHandle.getUserId(info.getActivityInfo().applicationInfo.uid));
695        }
696
697        void writeToXml(XmlSerializer out)
698                throws IllegalArgumentException, IllegalStateException, IOException {
699            out.startTag(null, TAG_POLICIES);
700            info.writePoliciesToXml(out);
701            out.endTag(null, TAG_POLICIES);
702            if (passwordQuality != DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED) {
703                out.startTag(null, TAG_PASSWORD_QUALITY);
704                out.attribute(null, ATTR_VALUE, Integer.toString(passwordQuality));
705                out.endTag(null, TAG_PASSWORD_QUALITY);
706                if (minimumPasswordLength != DEF_MINIMUM_PASSWORD_LENGTH) {
707                    out.startTag(null, TAG_MIN_PASSWORD_LENGTH);
708                    out.attribute(null, ATTR_VALUE, Integer.toString(minimumPasswordLength));
709                    out.endTag(null, TAG_MIN_PASSWORD_LENGTH);
710                }
711                if(passwordHistoryLength != DEF_PASSWORD_HISTORY_LENGTH) {
712                    out.startTag(null, TAG_PASSWORD_HISTORY_LENGTH);
713                    out.attribute(null, ATTR_VALUE, Integer.toString(passwordHistoryLength));
714                    out.endTag(null, TAG_PASSWORD_HISTORY_LENGTH);
715                }
716                if (minimumPasswordUpperCase != DEF_MINIMUM_PASSWORD_UPPER_CASE) {
717                    out.startTag(null, TAG_MIN_PASSWORD_UPPERCASE);
718                    out.attribute(null, ATTR_VALUE, Integer.toString(minimumPasswordUpperCase));
719                    out.endTag(null, TAG_MIN_PASSWORD_UPPERCASE);
720                }
721                if (minimumPasswordLowerCase != DEF_MINIMUM_PASSWORD_LOWER_CASE) {
722                    out.startTag(null, TAG_MIN_PASSWORD_LOWERCASE);
723                    out.attribute(null, ATTR_VALUE, Integer.toString(minimumPasswordLowerCase));
724                    out.endTag(null, TAG_MIN_PASSWORD_LOWERCASE);
725                }
726                if (minimumPasswordLetters != DEF_MINIMUM_PASSWORD_LETTERS) {
727                    out.startTag(null, TAG_MIN_PASSWORD_LETTERS);
728                    out.attribute(null, ATTR_VALUE, Integer.toString(minimumPasswordLetters));
729                    out.endTag(null, TAG_MIN_PASSWORD_LETTERS);
730                }
731                if (minimumPasswordNumeric != DEF_MINIMUM_PASSWORD_NUMERIC) {
732                    out.startTag(null, TAG_MIN_PASSWORD_NUMERIC);
733                    out.attribute(null, ATTR_VALUE, Integer.toString(minimumPasswordNumeric));
734                    out.endTag(null, TAG_MIN_PASSWORD_NUMERIC);
735                }
736                if (minimumPasswordSymbols != DEF_MINIMUM_PASSWORD_SYMBOLS) {
737                    out.startTag(null, TAG_MIN_PASSWORD_SYMBOLS);
738                    out.attribute(null, ATTR_VALUE, Integer.toString(minimumPasswordSymbols));
739                    out.endTag(null, TAG_MIN_PASSWORD_SYMBOLS);
740                }
741                if (minimumPasswordNonLetter > DEF_MINIMUM_PASSWORD_NON_LETTER) {
742                    out.startTag(null, TAG_MIN_PASSWORD_NONLETTER);
743                    out.attribute(null, ATTR_VALUE, Integer.toString(minimumPasswordNonLetter));
744                    out.endTag(null, TAG_MIN_PASSWORD_NONLETTER);
745                }
746            }
747            if (maximumTimeToUnlock != DEF_MAXIMUM_TIME_TO_UNLOCK) {
748                out.startTag(null, TAG_MAX_TIME_TO_UNLOCK);
749                out.attribute(null, ATTR_VALUE, Long.toString(maximumTimeToUnlock));
750                out.endTag(null, TAG_MAX_TIME_TO_UNLOCK);
751            }
752            if (maximumFailedPasswordsForWipe != DEF_MAXIMUM_FAILED_PASSWORDS_FOR_WIPE) {
753                out.startTag(null, TAG_MAX_FAILED_PASSWORD_WIPE);
754                out.attribute(null, ATTR_VALUE, Integer.toString(maximumFailedPasswordsForWipe));
755                out.endTag(null, TAG_MAX_FAILED_PASSWORD_WIPE);
756            }
757            if (specifiesGlobalProxy) {
758                out.startTag(null, TAG_SPECIFIES_GLOBAL_PROXY);
759                out.attribute(null, ATTR_VALUE, Boolean.toString(specifiesGlobalProxy));
760                out.endTag(null, TAG_SPECIFIES_GLOBAL_PROXY);
761                if (globalProxySpec != null) {
762                    out.startTag(null, TAG_GLOBAL_PROXY_SPEC);
763                    out.attribute(null, ATTR_VALUE, globalProxySpec);
764                    out.endTag(null, TAG_GLOBAL_PROXY_SPEC);
765                }
766                if (globalProxyExclusionList != null) {
767                    out.startTag(null, TAG_GLOBAL_PROXY_EXCLUSION_LIST);
768                    out.attribute(null, ATTR_VALUE, globalProxyExclusionList);
769                    out.endTag(null, TAG_GLOBAL_PROXY_EXCLUSION_LIST);
770                }
771            }
772            if (passwordExpirationTimeout != DEF_PASSWORD_EXPIRATION_TIMEOUT) {
773                out.startTag(null, TAG_PASSWORD_EXPIRATION_TIMEOUT);
774                out.attribute(null, ATTR_VALUE, Long.toString(passwordExpirationTimeout));
775                out.endTag(null, TAG_PASSWORD_EXPIRATION_TIMEOUT);
776            }
777            if (passwordExpirationDate != DEF_PASSWORD_EXPIRATION_DATE) {
778                out.startTag(null, TAG_PASSWORD_EXPIRATION_DATE);
779                out.attribute(null, ATTR_VALUE, Long.toString(passwordExpirationDate));
780                out.endTag(null, TAG_PASSWORD_EXPIRATION_DATE);
781            }
782            if (encryptionRequested) {
783                out.startTag(null, TAG_ENCRYPTION_REQUESTED);
784                out.attribute(null, ATTR_VALUE, Boolean.toString(encryptionRequested));
785                out.endTag(null, TAG_ENCRYPTION_REQUESTED);
786            }
787            if (disableCamera) {
788                out.startTag(null, TAG_DISABLE_CAMERA);
789                out.attribute(null, ATTR_VALUE, Boolean.toString(disableCamera));
790                out.endTag(null, TAG_DISABLE_CAMERA);
791            }
792            if (disableCallerId) {
793                out.startTag(null, TAG_DISABLE_CALLER_ID);
794                out.attribute(null, ATTR_VALUE, Boolean.toString(disableCallerId));
795                out.endTag(null, TAG_DISABLE_CALLER_ID);
796            }
797            if (disableContactsSearch) {
798                out.startTag(null, TAG_DISABLE_CONTACTS_SEARCH);
799                out.attribute(null, ATTR_VALUE, Boolean.toString(disableContactsSearch));
800                out.endTag(null, TAG_DISABLE_CONTACTS_SEARCH);
801            }
802            if (!disableBluetoothContactSharing) {
803                out.startTag(null, TAG_DISABLE_BLUETOOTH_CONTACT_SHARING);
804                out.attribute(null, ATTR_VALUE,
805                        Boolean.toString(disableBluetoothContactSharing));
806                out.endTag(null, TAG_DISABLE_BLUETOOTH_CONTACT_SHARING);
807            }
808            if (disableScreenCapture) {
809                out.startTag(null, TAG_DISABLE_SCREEN_CAPTURE);
810                out.attribute(null, ATTR_VALUE, Boolean.toString(disableScreenCapture));
811                out.endTag(null, TAG_DISABLE_SCREEN_CAPTURE);
812            }
813            if (requireAutoTime) {
814                out.startTag(null, TAG_REQUIRE_AUTO_TIME);
815                out.attribute(null, ATTR_VALUE, Boolean.toString(requireAutoTime));
816                out.endTag(null, TAG_REQUIRE_AUTO_TIME);
817            }
818            if (forceEphemeralUsers) {
819                out.startTag(null, TAG_FORCE_EPHEMERAL_USERS);
820                out.attribute(null, ATTR_VALUE, Boolean.toString(forceEphemeralUsers));
821                out.endTag(null, TAG_FORCE_EPHEMERAL_USERS);
822            }
823            if (disabledKeyguardFeatures != DEF_KEYGUARD_FEATURES_DISABLED) {
824                out.startTag(null, TAG_DISABLE_KEYGUARD_FEATURES);
825                out.attribute(null, ATTR_VALUE, Integer.toString(disabledKeyguardFeatures));
826                out.endTag(null, TAG_DISABLE_KEYGUARD_FEATURES);
827            }
828            if (!accountTypesWithManagementDisabled.isEmpty()) {
829                out.startTag(null, TAG_DISABLE_ACCOUNT_MANAGEMENT);
830                for (String ac : accountTypesWithManagementDisabled) {
831                    out.startTag(null, TAG_ACCOUNT_TYPE);
832                    out.attribute(null, ATTR_VALUE, ac);
833                    out.endTag(null, TAG_ACCOUNT_TYPE);
834                }
835                out.endTag(null,  TAG_DISABLE_ACCOUNT_MANAGEMENT);
836            }
837            if (!trustAgentInfos.isEmpty()) {
838                Set<Entry<String, TrustAgentInfo>> set = trustAgentInfos.entrySet();
839                out.startTag(null, TAG_MANAGE_TRUST_AGENT_FEATURES);
840                for (Entry<String, TrustAgentInfo> entry : set) {
841                    TrustAgentInfo trustAgentInfo = entry.getValue();
842                    out.startTag(null, TAG_TRUST_AGENT_COMPONENT);
843                    out.attribute(null, ATTR_VALUE, entry.getKey());
844                    if (trustAgentInfo.options != null) {
845                        out.startTag(null, TAG_TRUST_AGENT_COMPONENT_OPTIONS);
846                        try {
847                            trustAgentInfo.options.saveToXml(out);
848                        } catch (XmlPullParserException e) {
849                            Log.e(LOG_TAG, "Failed to save TrustAgent options", e);
850                        }
851                        out.endTag(null, TAG_TRUST_AGENT_COMPONENT_OPTIONS);
852                    }
853                    out.endTag(null, TAG_TRUST_AGENT_COMPONENT);
854                }
855                out.endTag(null, TAG_MANAGE_TRUST_AGENT_FEATURES);
856            }
857            if (crossProfileWidgetProviders != null && !crossProfileWidgetProviders.isEmpty()) {
858                out.startTag(null, TAG_CROSS_PROFILE_WIDGET_PROVIDERS);
859                final int providerCount = crossProfileWidgetProviders.size();
860                for (int i = 0; i < providerCount; i++) {
861                    String provider = crossProfileWidgetProviders.get(i);
862                    out.startTag(null, TAG_PROVIDER);
863                    out.attribute(null, ATTR_VALUE, provider);
864                    out.endTag(null, TAG_PROVIDER);
865                }
866                out.endTag(null, TAG_CROSS_PROFILE_WIDGET_PROVIDERS);
867            }
868            writePackageListToXml(out, TAG_PERMITTED_ACCESSIBILITY_SERVICES,
869                    permittedAccessiblityServices);
870            writePackageListToXml(out, TAG_PERMITTED_IMES, permittedInputMethods);
871            writePackageListToXml(out, TAG_KEEP_UNINSTALLED_PACKAGES, keepUninstalledPackages);
872            if (hasUserRestrictions()) {
873                UserRestrictionsUtils.writeRestrictions(
874                        out, userRestrictions, TAG_USER_RESTRICTIONS);
875            }
876            if (!TextUtils.isEmpty(shortSupportMessage)) {
877                out.startTag(null, TAG_SHORT_SUPPORT_MESSAGE);
878                out.text(shortSupportMessage.toString());
879                out.endTag(null, TAG_SHORT_SUPPORT_MESSAGE);
880            }
881            if (!TextUtils.isEmpty(longSupportMessage)) {
882                out.startTag(null, TAG_LONG_SUPPORT_MESSAGE);
883                out.text(longSupportMessage.toString());
884                out.endTag(null, TAG_LONG_SUPPORT_MESSAGE);
885            }
886            if (parentAdmin != null) {
887                out.startTag(null, TAG_PARENT_ADMIN);
888                parentAdmin.writeToXml(out);
889                out.endTag(null, TAG_PARENT_ADMIN);
890            }
891            if (organizationColor != DEF_ORGANIZATION_COLOR) {
892                out.startTag(null, TAG_ORGANIZATION_COLOR);
893                out.attribute(null, ATTR_VALUE, Integer.toString(organizationColor));
894                out.endTag(null, TAG_ORGANIZATION_COLOR);
895            }
896            if (organizationName != null) {
897                out.startTag(null, TAG_ORGANIZATION_NAME);
898                out.text(organizationName);
899                out.endTag(null, TAG_ORGANIZATION_NAME);
900            }
901        }
902
903        void writePackageListToXml(XmlSerializer out, String outerTag,
904                List<String> packageList)
905                throws IllegalArgumentException, IllegalStateException, IOException {
906            if (packageList == null) {
907                return;
908            }
909
910            out.startTag(null, outerTag);
911            for (String packageName : packageList) {
912                out.startTag(null, TAG_PACKAGE_LIST_ITEM);
913                out.attribute(null, ATTR_VALUE, packageName);
914                out.endTag(null, TAG_PACKAGE_LIST_ITEM);
915            }
916            out.endTag(null, outerTag);
917        }
918
919        void readFromXml(XmlPullParser parser)
920                throws XmlPullParserException, IOException {
921            int outerDepth = parser.getDepth();
922            int type;
923            while ((type=parser.next()) != END_DOCUMENT
924                   && (type != END_TAG || parser.getDepth() > outerDepth)) {
925                if (type == END_TAG || type == TEXT) {
926                    continue;
927                }
928                String tag = parser.getName();
929                if (TAG_POLICIES.equals(tag)) {
930                    info.readPoliciesFromXml(parser);
931                } else if (TAG_PASSWORD_QUALITY.equals(tag)) {
932                    passwordQuality = Integer.parseInt(
933                            parser.getAttributeValue(null, ATTR_VALUE));
934                } else if (TAG_MIN_PASSWORD_LENGTH.equals(tag)) {
935                    minimumPasswordLength = Integer.parseInt(
936                            parser.getAttributeValue(null, ATTR_VALUE));
937                } else if (TAG_PASSWORD_HISTORY_LENGTH.equals(tag)) {
938                    passwordHistoryLength = Integer.parseInt(
939                            parser.getAttributeValue(null, ATTR_VALUE));
940                } else if (TAG_MIN_PASSWORD_UPPERCASE.equals(tag)) {
941                    minimumPasswordUpperCase = Integer.parseInt(
942                            parser.getAttributeValue(null, ATTR_VALUE));
943                } else if (TAG_MIN_PASSWORD_LOWERCASE.equals(tag)) {
944                    minimumPasswordLowerCase = Integer.parseInt(
945                            parser.getAttributeValue(null, ATTR_VALUE));
946                } else if (TAG_MIN_PASSWORD_LETTERS.equals(tag)) {
947                    minimumPasswordLetters = Integer.parseInt(
948                            parser.getAttributeValue(null, ATTR_VALUE));
949                } else if (TAG_MIN_PASSWORD_NUMERIC.equals(tag)) {
950                    minimumPasswordNumeric = Integer.parseInt(
951                            parser.getAttributeValue(null, ATTR_VALUE));
952                } else if (TAG_MIN_PASSWORD_SYMBOLS.equals(tag)) {
953                    minimumPasswordSymbols = Integer.parseInt(
954                            parser.getAttributeValue(null, ATTR_VALUE));
955                } else if (TAG_MIN_PASSWORD_NONLETTER.equals(tag)) {
956                    minimumPasswordNonLetter = Integer.parseInt(
957                            parser.getAttributeValue(null, ATTR_VALUE));
958                } else if (TAG_MAX_TIME_TO_UNLOCK.equals(tag)) {
959                    maximumTimeToUnlock = Long.parseLong(
960                            parser.getAttributeValue(null, ATTR_VALUE));
961                } else if (TAG_MAX_FAILED_PASSWORD_WIPE.equals(tag)) {
962                    maximumFailedPasswordsForWipe = Integer.parseInt(
963                            parser.getAttributeValue(null, ATTR_VALUE));
964                } else if (TAG_SPECIFIES_GLOBAL_PROXY.equals(tag)) {
965                    specifiesGlobalProxy = Boolean.parseBoolean(
966                            parser.getAttributeValue(null, ATTR_VALUE));
967                } else if (TAG_GLOBAL_PROXY_SPEC.equals(tag)) {
968                    globalProxySpec =
969                        parser.getAttributeValue(null, ATTR_VALUE);
970                } else if (TAG_GLOBAL_PROXY_EXCLUSION_LIST.equals(tag)) {
971                    globalProxyExclusionList =
972                        parser.getAttributeValue(null, ATTR_VALUE);
973                } else if (TAG_PASSWORD_EXPIRATION_TIMEOUT.equals(tag)) {
974                    passwordExpirationTimeout = Long.parseLong(
975                            parser.getAttributeValue(null, ATTR_VALUE));
976                } else if (TAG_PASSWORD_EXPIRATION_DATE.equals(tag)) {
977                    passwordExpirationDate = Long.parseLong(
978                            parser.getAttributeValue(null, ATTR_VALUE));
979                } else if (TAG_ENCRYPTION_REQUESTED.equals(tag)) {
980                    encryptionRequested = Boolean.parseBoolean(
981                            parser.getAttributeValue(null, ATTR_VALUE));
982                } else if (TAG_DISABLE_CAMERA.equals(tag)) {
983                    disableCamera = Boolean.parseBoolean(
984                            parser.getAttributeValue(null, ATTR_VALUE));
985                } else if (TAG_DISABLE_CALLER_ID.equals(tag)) {
986                    disableCallerId = Boolean.parseBoolean(
987                            parser.getAttributeValue(null, ATTR_VALUE));
988                } else if (TAG_DISABLE_CONTACTS_SEARCH.equals(tag)) {
989                    disableContactsSearch = Boolean.parseBoolean(
990                            parser.getAttributeValue(null, ATTR_VALUE));
991                } else if (TAG_DISABLE_BLUETOOTH_CONTACT_SHARING.equals(tag)) {
992                    disableBluetoothContactSharing = Boolean.parseBoolean(parser
993                            .getAttributeValue(null, ATTR_VALUE));
994                } else if (TAG_DISABLE_SCREEN_CAPTURE.equals(tag)) {
995                    disableScreenCapture = Boolean.parseBoolean(
996                            parser.getAttributeValue(null, ATTR_VALUE));
997                } else if (TAG_REQUIRE_AUTO_TIME.equals(tag)) {
998                    requireAutoTime = Boolean.parseBoolean(
999                            parser.getAttributeValue(null, ATTR_VALUE));
1000                } else if (TAG_FORCE_EPHEMERAL_USERS.equals(tag)) {
1001                    forceEphemeralUsers = Boolean.parseBoolean(
1002                            parser.getAttributeValue(null, ATTR_VALUE));
1003                } else if (TAG_DISABLE_KEYGUARD_FEATURES.equals(tag)) {
1004                    disabledKeyguardFeatures = Integer.parseInt(
1005                            parser.getAttributeValue(null, ATTR_VALUE));
1006                } else if (TAG_DISABLE_ACCOUNT_MANAGEMENT.equals(tag)) {
1007                    accountTypesWithManagementDisabled = readDisableAccountInfo(parser, tag);
1008                } else if (TAG_MANAGE_TRUST_AGENT_FEATURES.equals(tag)) {
1009                    trustAgentInfos = getAllTrustAgentInfos(parser, tag);
1010                } else if (TAG_CROSS_PROFILE_WIDGET_PROVIDERS.equals(tag)) {
1011                    crossProfileWidgetProviders = getCrossProfileWidgetProviders(parser, tag);
1012                } else if (TAG_PERMITTED_ACCESSIBILITY_SERVICES.equals(tag)) {
1013                    permittedAccessiblityServices = readPackageList(parser, tag);
1014                } else if (TAG_PERMITTED_IMES.equals(tag)) {
1015                    permittedInputMethods = readPackageList(parser, tag);
1016                } else if (TAG_KEEP_UNINSTALLED_PACKAGES.equals(tag)) {
1017                    keepUninstalledPackages = readPackageList(parser, tag);
1018                } else if (TAG_USER_RESTRICTIONS.equals(tag)) {
1019                    UserRestrictionsUtils.readRestrictions(parser, ensureUserRestrictions());
1020                } else if (TAG_SHORT_SUPPORT_MESSAGE.equals(tag)) {
1021                    type = parser.next();
1022                    if (type == XmlPullParser.TEXT) {
1023                        shortSupportMessage = parser.getText();
1024                    } else {
1025                        Log.w(LOG_TAG, "Missing text when loading short support message");
1026                    }
1027                } else if (TAG_LONG_SUPPORT_MESSAGE.equals(tag)) {
1028                    type = parser.next();
1029                    if (type == XmlPullParser.TEXT) {
1030                        longSupportMessage = parser.getText();
1031                    } else {
1032                        Log.w(LOG_TAG, "Missing text when loading long support message");
1033                    }
1034                } else if (TAG_PARENT_ADMIN.equals(tag)) {
1035                    Preconditions.checkState(!isParent);
1036
1037                    parentAdmin = new ActiveAdmin(info, /* parent */ true);
1038                    parentAdmin.readFromXml(parser);
1039                } else if (TAG_ORGANIZATION_COLOR.equals(tag)) {
1040                    organizationColor = Integer.parseInt(
1041                            parser.getAttributeValue(null, ATTR_VALUE));
1042                } else if (TAG_ORGANIZATION_NAME.equals(tag)) {
1043                    type = parser.next();
1044                    if (type == XmlPullParser.TEXT) {
1045                        organizationName = parser.getText();
1046                    } else {
1047                        Log.w(LOG_TAG, "Missing text when loading organization name");
1048                    }
1049                } else {
1050                    Slog.w(LOG_TAG, "Unknown admin tag: " + tag);
1051                    XmlUtils.skipCurrentTag(parser);
1052                }
1053            }
1054        }
1055
1056        private List<String> readPackageList(XmlPullParser parser,
1057                String tag) throws XmlPullParserException, IOException {
1058            List<String> result = new ArrayList<String>();
1059            int outerDepth = parser.getDepth();
1060            int outerType;
1061            while ((outerType=parser.next()) != XmlPullParser.END_DOCUMENT
1062                    && (outerType != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
1063                if (outerType == XmlPullParser.END_TAG || outerType == XmlPullParser.TEXT) {
1064                    continue;
1065                }
1066                String outerTag = parser.getName();
1067                if (TAG_PACKAGE_LIST_ITEM.equals(outerTag)) {
1068                    String packageName = parser.getAttributeValue(null, ATTR_VALUE);
1069                    if (packageName != null) {
1070                        result.add(packageName);
1071                    } else {
1072                        Slog.w(LOG_TAG, "Package name missing under " + outerTag);
1073                    }
1074                } else {
1075                    Slog.w(LOG_TAG, "Unknown tag under " + tag +  ": " + outerTag);
1076                }
1077            }
1078            return result;
1079        }
1080
1081        private Set<String> readDisableAccountInfo(XmlPullParser parser, String tag)
1082                throws XmlPullParserException, IOException {
1083            int outerDepthDAM = parser.getDepth();
1084            int typeDAM;
1085            Set<String> result = new ArraySet<>();
1086            while ((typeDAM=parser.next()) != END_DOCUMENT
1087                    && (typeDAM != END_TAG || parser.getDepth() > outerDepthDAM)) {
1088                if (typeDAM == END_TAG || typeDAM == TEXT) {
1089                    continue;
1090                }
1091                String tagDAM = parser.getName();
1092                if (TAG_ACCOUNT_TYPE.equals(tagDAM)) {
1093                    result.add(parser.getAttributeValue(null, ATTR_VALUE));
1094                } else {
1095                    Slog.w(LOG_TAG, "Unknown tag under " + tag +  ": " + tagDAM);
1096                }
1097            }
1098            return result;
1099        }
1100
1101        private ArrayMap<String, TrustAgentInfo> getAllTrustAgentInfos(
1102                XmlPullParser parser, String tag) throws XmlPullParserException, IOException {
1103            int outerDepthDAM = parser.getDepth();
1104            int typeDAM;
1105            final ArrayMap<String, TrustAgentInfo> result = new ArrayMap<>();
1106            while ((typeDAM=parser.next()) != END_DOCUMENT
1107                    && (typeDAM != END_TAG || parser.getDepth() > outerDepthDAM)) {
1108                if (typeDAM == END_TAG || typeDAM == TEXT) {
1109                    continue;
1110                }
1111                String tagDAM = parser.getName();
1112                if (TAG_TRUST_AGENT_COMPONENT.equals(tagDAM)) {
1113                    final String component = parser.getAttributeValue(null, ATTR_VALUE);
1114                    final TrustAgentInfo trustAgentInfo = getTrustAgentInfo(parser, tag);
1115                    result.put(component, trustAgentInfo);
1116                } else {
1117                    Slog.w(LOG_TAG, "Unknown tag under " + tag +  ": " + tagDAM);
1118                }
1119            }
1120            return result;
1121        }
1122
1123        private TrustAgentInfo getTrustAgentInfo(XmlPullParser parser, String tag)
1124                throws XmlPullParserException, IOException  {
1125            int outerDepthDAM = parser.getDepth();
1126            int typeDAM;
1127            TrustAgentInfo result = new TrustAgentInfo(null);
1128            while ((typeDAM=parser.next()) != END_DOCUMENT
1129                    && (typeDAM != END_TAG || parser.getDepth() > outerDepthDAM)) {
1130                if (typeDAM == END_TAG || typeDAM == TEXT) {
1131                    continue;
1132                }
1133                String tagDAM = parser.getName();
1134                if (TAG_TRUST_AGENT_COMPONENT_OPTIONS.equals(tagDAM)) {
1135                    result.options = PersistableBundle.restoreFromXml(parser);
1136                } else {
1137                    Slog.w(LOG_TAG, "Unknown tag under " + tag +  ": " + tagDAM);
1138                }
1139            }
1140            return result;
1141        }
1142
1143        private List<String> getCrossProfileWidgetProviders(XmlPullParser parser, String tag)
1144                throws XmlPullParserException, IOException  {
1145            int outerDepthDAM = parser.getDepth();
1146            int typeDAM;
1147            ArrayList<String> result = null;
1148            while ((typeDAM=parser.next()) != END_DOCUMENT
1149                    && (typeDAM != END_TAG || parser.getDepth() > outerDepthDAM)) {
1150                if (typeDAM == END_TAG || typeDAM == TEXT) {
1151                    continue;
1152                }
1153                String tagDAM = parser.getName();
1154                if (TAG_PROVIDER.equals(tagDAM)) {
1155                    final String provider = parser.getAttributeValue(null, ATTR_VALUE);
1156                    if (result == null) {
1157                        result = new ArrayList<>();
1158                    }
1159                    result.add(provider);
1160                } else {
1161                    Slog.w(LOG_TAG, "Unknown tag under " + tag +  ": " + tagDAM);
1162                }
1163            }
1164            return result;
1165        }
1166
1167        boolean hasUserRestrictions() {
1168            return userRestrictions != null && userRestrictions.size() > 0;
1169        }
1170
1171        Bundle ensureUserRestrictions() {
1172            if (userRestrictions == null) {
1173                userRestrictions = new Bundle();
1174            }
1175            return userRestrictions;
1176        }
1177
1178        void dump(String prefix, PrintWriter pw) {
1179            pw.print(prefix); pw.print("uid="); pw.println(getUid());
1180            pw.print(prefix); pw.println("policies:");
1181            ArrayList<DeviceAdminInfo.PolicyInfo> pols = info.getUsedPolicies();
1182            if (pols != null) {
1183                for (int i=0; i<pols.size(); i++) {
1184                    pw.print(prefix); pw.print("  "); pw.println(pols.get(i).tag);
1185                }
1186            }
1187            pw.print(prefix); pw.print("passwordQuality=0x");
1188                    pw.println(Integer.toHexString(passwordQuality));
1189            pw.print(prefix); pw.print("minimumPasswordLength=");
1190                    pw.println(minimumPasswordLength);
1191            pw.print(prefix); pw.print("passwordHistoryLength=");
1192                    pw.println(passwordHistoryLength);
1193            pw.print(prefix); pw.print("minimumPasswordUpperCase=");
1194                    pw.println(minimumPasswordUpperCase);
1195            pw.print(prefix); pw.print("minimumPasswordLowerCase=");
1196                    pw.println(minimumPasswordLowerCase);
1197            pw.print(prefix); pw.print("minimumPasswordLetters=");
1198                    pw.println(minimumPasswordLetters);
1199            pw.print(prefix); pw.print("minimumPasswordNumeric=");
1200                    pw.println(minimumPasswordNumeric);
1201            pw.print(prefix); pw.print("minimumPasswordSymbols=");
1202                    pw.println(minimumPasswordSymbols);
1203            pw.print(prefix); pw.print("minimumPasswordNonLetter=");
1204                    pw.println(minimumPasswordNonLetter);
1205            pw.print(prefix); pw.print("maximumTimeToUnlock=");
1206                    pw.println(maximumTimeToUnlock);
1207            pw.print(prefix); pw.print("maximumFailedPasswordsForWipe=");
1208                    pw.println(maximumFailedPasswordsForWipe);
1209            pw.print(prefix); pw.print("specifiesGlobalProxy=");
1210                    pw.println(specifiesGlobalProxy);
1211            pw.print(prefix); pw.print("passwordExpirationTimeout=");
1212                    pw.println(passwordExpirationTimeout);
1213            pw.print(prefix); pw.print("passwordExpirationDate=");
1214                    pw.println(passwordExpirationDate);
1215            if (globalProxySpec != null) {
1216                pw.print(prefix); pw.print("globalProxySpec=");
1217                        pw.println(globalProxySpec);
1218            }
1219            if (globalProxyExclusionList != null) {
1220                pw.print(prefix); pw.print("globalProxyEclusionList=");
1221                        pw.println(globalProxyExclusionList);
1222            }
1223            pw.print(prefix); pw.print("encryptionRequested=");
1224                    pw.println(encryptionRequested);
1225            pw.print(prefix); pw.print("disableCamera=");
1226                    pw.println(disableCamera);
1227            pw.print(prefix); pw.print("disableCallerId=");
1228                    pw.println(disableCallerId);
1229            pw.print(prefix); pw.print("disableContactsSearch=");
1230                    pw.println(disableContactsSearch);
1231            pw.print(prefix); pw.print("disableBluetoothContactSharing=");
1232                    pw.println(disableBluetoothContactSharing);
1233            pw.print(prefix); pw.print("disableScreenCapture=");
1234                    pw.println(disableScreenCapture);
1235            pw.print(prefix); pw.print("requireAutoTime=");
1236                    pw.println(requireAutoTime);
1237            pw.print(prefix); pw.print("forceEphemeralUsers=");
1238                    pw.println(forceEphemeralUsers);
1239            pw.print(prefix); pw.print("disabledKeyguardFeatures=");
1240                    pw.println(disabledKeyguardFeatures);
1241            pw.print(prefix); pw.print("crossProfileWidgetProviders=");
1242                    pw.println(crossProfileWidgetProviders);
1243            if (permittedAccessiblityServices != null) {
1244                pw.print(prefix); pw.print("permittedAccessibilityServices=");
1245                    pw.println(permittedAccessiblityServices);
1246            }
1247            if (permittedInputMethods != null) {
1248                pw.print(prefix); pw.print("permittedInputMethods=");
1249                    pw.println(permittedInputMethods);
1250            }
1251            if (keepUninstalledPackages != null) {
1252                pw.print(prefix); pw.print("keepUninstalledPackages=");
1253                    pw.println(keepUninstalledPackages);
1254            }
1255            pw.print(prefix); pw.print("organizationColor=");
1256                    pw.println(organizationColor);
1257            if (organizationName != null) {
1258                pw.print(prefix); pw.print("organizationName=");
1259                    pw.println(organizationName);
1260            }
1261            pw.print(prefix); pw.println("userRestrictions:");
1262            UserRestrictionsUtils.dumpRestrictions(pw, prefix + "  ", userRestrictions);
1263            pw.print(prefix); pw.print("isParent=");
1264                    pw.println(isParent);
1265            if (parentAdmin != null) {
1266                pw.print(prefix);  pw.println("parentAdmin:");
1267                parentAdmin.dump(prefix + "  ", pw);
1268            }
1269        }
1270    }
1271
1272    private void handlePackagesChanged(String packageName, int userHandle) {
1273        boolean removed = false;
1274        if (VERBOSE_LOG) Slog.d(LOG_TAG, "Handling package changes for user " + userHandle);
1275        DevicePolicyData policy = getUserData(userHandle);
1276        synchronized (this) {
1277            for (int i = policy.mAdminList.size() - 1; i >= 0; i--) {
1278                ActiveAdmin aa = policy.mAdminList.get(i);
1279                try {
1280                    // If we're checking all packages or if the specific one we're checking matches,
1281                    // then check if the package and receiver still exist.
1282                    final String adminPackage = aa.info.getPackageName();
1283                    if (packageName == null || packageName.equals(adminPackage)) {
1284                        if (mIPackageManager.getPackageInfo(adminPackage, 0, userHandle) == null
1285                                || mIPackageManager.getReceiverInfo(aa.info.getComponent(),
1286                                        PackageManager.MATCH_DIRECT_BOOT_AWARE
1287                                                | PackageManager.MATCH_DIRECT_BOOT_UNAWARE,
1288                                        userHandle) == null) {
1289                            removed = true;
1290                            policy.mAdminList.remove(i);
1291                            policy.mAdminMap.remove(aa.info.getComponent());
1292                        }
1293                    }
1294                } catch (RemoteException re) {
1295                    // Shouldn't happen
1296                }
1297            }
1298            if (removed) {
1299                validatePasswordOwnerLocked(policy);
1300                saveSettingsLocked(policy.mUserHandle);
1301            }
1302
1303            // Check if delegated cert installer or app restrictions managing packages are removed.
1304            if (isRemovedPackage(packageName, policy.mDelegatedCertInstallerPackage, userHandle)) {
1305                policy.mDelegatedCertInstallerPackage = null;
1306                saveSettingsLocked(policy.mUserHandle);
1307            }
1308            if (isRemovedPackage(
1309                    packageName, policy.mApplicationRestrictionsManagingPackage, userHandle)) {
1310                policy.mApplicationRestrictionsManagingPackage = null;
1311                saveSettingsLocked(policy.mUserHandle);
1312            }
1313        }
1314        if (removed) {
1315            // The removed admin might have disabled camera, so update user restrictions.
1316            pushUserRestrictions(userHandle);
1317        }
1318    }
1319
1320    private boolean isRemovedPackage(String changedPackage, String targetPackage, int userHandle) {
1321        try {
1322            return targetPackage != null
1323                    && (changedPackage == null || changedPackage.equals(targetPackage))
1324                    && mIPackageManager.getPackageInfo(targetPackage, 0, userHandle) == null;
1325        } catch (RemoteException e) {
1326            // Shouldn't happen
1327        }
1328
1329        return false;
1330    }
1331
1332    /**
1333     * Unit test will subclass it to inject mocks.
1334     */
1335    @VisibleForTesting
1336    static class Injector {
1337
1338        private final Context mContext;
1339
1340        Injector(Context context) {
1341            mContext = context;
1342        }
1343
1344        Owners newOwners() {
1345            return new Owners(getUserManager(), getUserManagerInternal(),
1346                    getPackageManagerInternal());
1347        }
1348
1349        UserManager getUserManager() {
1350            return UserManager.get(mContext);
1351        }
1352
1353        UserManagerInternal getUserManagerInternal() {
1354            return LocalServices.getService(UserManagerInternal.class);
1355        }
1356
1357        PackageManagerInternal getPackageManagerInternal() {
1358            return LocalServices.getService(PackageManagerInternal.class);
1359        }
1360
1361        NotificationManager getNotificationManager() {
1362            return mContext.getSystemService(NotificationManager.class);
1363        }
1364
1365        PowerManagerInternal getPowerManagerInternal() {
1366            return LocalServices.getService(PowerManagerInternal.class);
1367        }
1368
1369        TelephonyManager getTelephonyManager() {
1370            return TelephonyManager.from(mContext);
1371        }
1372
1373        IWindowManager getIWindowManager() {
1374            return IWindowManager.Stub
1375                    .asInterface(ServiceManager.getService(Context.WINDOW_SERVICE));
1376        }
1377
1378        IActivityManager getIActivityManager() {
1379            return ActivityManagerNative.getDefault();
1380        }
1381
1382        IPackageManager getIPackageManager() {
1383            return AppGlobals.getPackageManager();
1384        }
1385
1386        IBackupManager getIBackupManager() {
1387            return IBackupManager.Stub.asInterface(
1388                    ServiceManager.getService(Context.BACKUP_SERVICE));
1389        }
1390
1391        IAudioService getIAudioService() {
1392            return IAudioService.Stub.asInterface(ServiceManager.getService(Context.AUDIO_SERVICE));
1393        }
1394
1395        LockPatternUtils newLockPatternUtils() {
1396            return new LockPatternUtils(mContext);
1397        }
1398
1399        boolean storageManagerIsFileBasedEncryptionEnabled() {
1400            return StorageManager.isFileEncryptedNativeOnly();
1401        }
1402
1403        boolean storageManagerIsNonDefaultBlockEncrypted() {
1404            long identity = Binder.clearCallingIdentity();
1405            try {
1406                return StorageManager.isNonDefaultBlockEncrypted();
1407            } finally {
1408                Binder.restoreCallingIdentity(identity);
1409            }
1410        }
1411
1412        boolean storageManagerIsEncrypted() {
1413            return StorageManager.isEncrypted();
1414        }
1415
1416        boolean storageManagerIsEncryptable() {
1417            return StorageManager.isEncryptable();
1418        }
1419
1420        Looper getMyLooper() {
1421            return Looper.myLooper();
1422        }
1423
1424        WifiManager getWifiManager() {
1425            return mContext.getSystemService(WifiManager.class);
1426        }
1427
1428        long binderClearCallingIdentity() {
1429            return Binder.clearCallingIdentity();
1430        }
1431
1432        void binderRestoreCallingIdentity(long token) {
1433            Binder.restoreCallingIdentity(token);
1434        }
1435
1436        int binderGetCallingUid() {
1437            return Binder.getCallingUid();
1438        }
1439
1440        int binderGetCallingPid() {
1441            return Binder.getCallingPid();
1442        }
1443
1444        UserHandle binderGetCallingUserHandle() {
1445            return Binder.getCallingUserHandle();
1446        }
1447
1448        boolean binderIsCallingUidMyUid() {
1449            return getCallingUid() == Process.myUid();
1450        }
1451
1452        final int userHandleGetCallingUserId() {
1453            return UserHandle.getUserId(binderGetCallingUid());
1454        }
1455
1456        File environmentGetUserSystemDirectory(int userId) {
1457            return Environment.getUserSystemDirectory(userId);
1458        }
1459
1460        void powerManagerGoToSleep(long time, int reason, int flags) {
1461            mContext.getSystemService(PowerManager.class).goToSleep(time, reason, flags);
1462        }
1463
1464        void powerManagerReboot(String reason) {
1465            mContext.getSystemService(PowerManager.class).reboot(reason);
1466        }
1467
1468        boolean systemPropertiesGetBoolean(String key, boolean def) {
1469            return SystemProperties.getBoolean(key, def);
1470        }
1471
1472        long systemPropertiesGetLong(String key, long def) {
1473            return SystemProperties.getLong(key, def);
1474        }
1475
1476        String systemPropertiesGet(String key, String def) {
1477            return SystemProperties.get(key, def);
1478        }
1479
1480        String systemPropertiesGet(String key) {
1481            return SystemProperties.get(key);
1482        }
1483
1484        void systemPropertiesSet(String key, String value) {
1485            SystemProperties.set(key, value);
1486        }
1487
1488        boolean userManagerIsSplitSystemUser() {
1489            return UserManager.isSplitSystemUser();
1490        }
1491
1492        String getDevicePolicyFilePathForSystemUser() {
1493            return "/data/system/";
1494        }
1495
1496        void registerContentObserver(Uri uri, boolean notifyForDescendents,
1497                ContentObserver observer, int userHandle) {
1498            mContext.getContentResolver().registerContentObserver(uri, notifyForDescendents,
1499                    observer, userHandle);
1500        }
1501
1502        int settingsSecureGetIntForUser(String name, int def, int userHandle) {
1503            return Settings.Secure.getIntForUser(mContext.getContentResolver(),
1504                    name, def, userHandle);
1505        }
1506
1507        void settingsSecurePutIntForUser(String name, int value, int userHandle) {
1508            Settings.Secure.putIntForUser(mContext.getContentResolver(),
1509                    name, value, userHandle);
1510        }
1511
1512        void settingsSecurePutStringForUser(String name, String value, int userHandle) {
1513            Settings.Secure.putStringForUser(mContext.getContentResolver(),
1514                    name, value, userHandle);
1515        }
1516
1517        void settingsGlobalPutStringForUser(String name, String value, int userHandle) {
1518            Settings.Global.putStringForUser(mContext.getContentResolver(),
1519                    name, value, userHandle);
1520        }
1521
1522        void settingsSecurePutInt(String name, int value) {
1523            Settings.Secure.putInt(mContext.getContentResolver(), name, value);
1524        }
1525
1526        int settingsGlobalGetInt(String name, int def) {
1527            return Settings.Global.getInt(mContext.getContentResolver(), name, def);
1528        }
1529
1530        void settingsGlobalPutInt(String name, int value) {
1531            Settings.Global.putInt(mContext.getContentResolver(), name, value);
1532        }
1533
1534        void settingsSecurePutString(String name, String value) {
1535            Settings.Secure.putString(mContext.getContentResolver(), name, value);
1536        }
1537
1538        void settingsGlobalPutString(String name, String value) {
1539            Settings.Global.putString(mContext.getContentResolver(), name, value);
1540        }
1541
1542        void securityLogSetLoggingEnabledProperty(boolean enabled) {
1543            SecurityLog.setLoggingEnabledProperty(enabled);
1544        }
1545
1546        boolean securityLogGetLoggingEnabledProperty() {
1547            return SecurityLog.getLoggingEnabledProperty();
1548        }
1549
1550        boolean securityLogIsLoggingEnabled() {
1551            return SecurityLog.isLoggingEnabled();
1552        }
1553    }
1554
1555    /**
1556     * Instantiates the service.
1557     */
1558    public DevicePolicyManagerService(Context context) {
1559        this(new Injector(context));
1560    }
1561
1562    @VisibleForTesting
1563    DevicePolicyManagerService(Injector injector) {
1564        mInjector = injector;
1565        mContext = Preconditions.checkNotNull(injector.mContext);
1566        mHandler = new Handler(Preconditions.checkNotNull(injector.getMyLooper()));
1567        mOwners = Preconditions.checkNotNull(injector.newOwners());
1568
1569        mUserManager = Preconditions.checkNotNull(injector.getUserManager());
1570        mUserManagerInternal = Preconditions.checkNotNull(injector.getUserManagerInternal());
1571        mIPackageManager = Preconditions.checkNotNull(injector.getIPackageManager());
1572        mTelephonyManager = Preconditions.checkNotNull(injector.getTelephonyManager());
1573
1574        mLocalService = new LocalService();
1575        mLockPatternUtils = injector.newLockPatternUtils();
1576
1577        mSecurityLogMonitor = new SecurityLogMonitor(this);
1578
1579        mHasFeature = mContext.getPackageManager()
1580                .hasSystemFeature(PackageManager.FEATURE_DEVICE_ADMIN);
1581        if (!mHasFeature) {
1582            // Skip the rest of the initialization
1583            return;
1584        }
1585        IntentFilter filter = new IntentFilter();
1586        filter.addAction(Intent.ACTION_BOOT_COMPLETED);
1587        filter.addAction(ACTION_EXPIRED_PASSWORD_NOTIFICATION);
1588        filter.addAction(Intent.ACTION_USER_ADDED);
1589        filter.addAction(Intent.ACTION_USER_REMOVED);
1590        filter.addAction(Intent.ACTION_USER_STARTED);
1591        filter.addAction(Intent.ACTION_USER_UNLOCKED);
1592        filter.addAction(KeyChain.ACTION_TRUST_STORE_CHANGED);
1593        filter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY);
1594        mContext.registerReceiverAsUser(mReceiver, UserHandle.ALL, filter, null, mHandler);
1595        filter = new IntentFilter();
1596        filter.addAction(Intent.ACTION_PACKAGE_CHANGED);
1597        filter.addAction(Intent.ACTION_PACKAGE_REMOVED);
1598        filter.addAction(Intent.ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE);
1599        filter.addAction(Intent.ACTION_PACKAGE_ADDED);
1600        filter.addDataScheme("package");
1601        mContext.registerReceiverAsUser(mReceiver, UserHandle.ALL, filter, null, mHandler);
1602        filter = new IntentFilter();
1603        filter.addAction(Intent.ACTION_MANAGED_PROFILE_ADDED);
1604        mContext.registerReceiverAsUser(mReceiver, UserHandle.ALL, filter, null, mHandler);
1605
1606        LocalServices.addService(DevicePolicyManagerInternal.class, mLocalService);
1607    }
1608
1609    /**
1610     * Creates and loads the policy data from xml.
1611     * @param userHandle the user for whom to load the policy data
1612     * @return
1613     */
1614    @NonNull
1615    DevicePolicyData getUserData(int userHandle) {
1616        synchronized (this) {
1617            DevicePolicyData policy = mUserData.get(userHandle);
1618            if (policy == null) {
1619                policy = new DevicePolicyData(userHandle);
1620                mUserData.append(userHandle, policy);
1621                loadSettingsLocked(policy, userHandle);
1622            }
1623            return policy;
1624        }
1625    }
1626
1627    /**
1628     * Creates and loads the policy data from xml for data that is shared between
1629     * various profiles of a user. In contrast to {@link #getUserData(int)}
1630     * it allows access to data of users other than the calling user.
1631     *
1632     * This function should only be used for shared data, e.g. everything regarding
1633     * passwords and should be removed once multiple screen locks are present.
1634     * @param userHandle the user for whom to load the policy data
1635     * @return
1636     */
1637    DevicePolicyData getUserDataUnchecked(int userHandle) {
1638        long ident = mInjector.binderClearCallingIdentity();
1639        try {
1640            return getUserData(userHandle);
1641        } finally {
1642            mInjector.binderRestoreCallingIdentity(ident);
1643        }
1644    }
1645
1646    void removeUserData(int userHandle) {
1647        synchronized (this) {
1648            if (userHandle == UserHandle.USER_SYSTEM) {
1649                Slog.w(LOG_TAG, "Tried to remove device policy file for user 0! Ignoring.");
1650                return;
1651            }
1652            mOwners.removeProfileOwner(userHandle);
1653            mOwners.writeProfileOwner(userHandle);
1654
1655            DevicePolicyData policy = mUserData.get(userHandle);
1656            if (policy != null) {
1657                mUserData.remove(userHandle);
1658            }
1659            File policyFile = new File(mInjector.environmentGetUserSystemDirectory(userHandle),
1660                    DEVICE_POLICIES_XML);
1661            policyFile.delete();
1662            Slog.i(LOG_TAG, "Removed device policy file " + policyFile.getAbsolutePath());
1663        }
1664        updateScreenCaptureDisabledInWindowManager(userHandle, false /* default value */);
1665    }
1666
1667    void loadOwners() {
1668        synchronized (this) {
1669            mOwners.load();
1670            setDeviceOwnerSystemPropertyLocked();
1671            findOwnerComponentIfNecessaryLocked();
1672            migrateUserRestrictionsIfNecessaryLocked();
1673
1674            // TODO PO may not have a class name either due to b/17652534.  Address that too.
1675
1676            updateDeviceOwnerLocked();
1677        }
1678    }
1679
1680    private void setDeviceOwnerSystemPropertyLocked() {
1681        // Device owner may still be provisioned, do not set the read-only system property yet.
1682        if (mInjector.settingsGlobalGetInt(Settings.Global.DEVICE_PROVISIONED, 0) == 0) {
1683            return;
1684        }
1685        // Still at the first stage of CryptKeeper double bounce, mOwners.hasDeviceOwner is
1686        // always false at this point.
1687        if (StorageManager.inCryptKeeperBounce()) {
1688            return;
1689        }
1690
1691        if (!TextUtils.isEmpty(mInjector.systemPropertiesGet(PROPERTY_DEVICE_OWNER_PRESENT))) {
1692            Slog.w(LOG_TAG, "Trying to set ro.device_owner, but it has already been set?");
1693        } else {
1694            if (mOwners.hasDeviceOwner()) {
1695                mInjector.systemPropertiesSet(PROPERTY_DEVICE_OWNER_PRESENT, "true");
1696                Slog.i(LOG_TAG, "Set ro.device_owner property to true");
1697                disableSecurityLoggingIfNotCompliant();
1698                if (mInjector.securityLogGetLoggingEnabledProperty()) {
1699                    mSecurityLogMonitor.start();
1700                }
1701            } else {
1702                mInjector.systemPropertiesSet(PROPERTY_DEVICE_OWNER_PRESENT, "false");
1703                Slog.i(LOG_TAG, "Set ro.device_owner property to false");
1704            }
1705        }
1706    }
1707
1708    private void findOwnerComponentIfNecessaryLocked() {
1709        if (!mOwners.hasDeviceOwner()) {
1710            return;
1711        }
1712        final ComponentName doComponentName = mOwners.getDeviceOwnerComponent();
1713
1714        if (!TextUtils.isEmpty(doComponentName.getClassName())) {
1715            return; // Already a full component name.
1716        }
1717
1718        final ComponentName doComponent = findAdminComponentWithPackageLocked(
1719                doComponentName.getPackageName(),
1720                mOwners.getDeviceOwnerUserId());
1721        if (doComponent == null) {
1722            Slog.e(LOG_TAG, "Device-owner isn't registered as device-admin");
1723        } else {
1724            mOwners.setDeviceOwnerWithRestrictionsMigrated(
1725                    doComponent,
1726                    mOwners.getDeviceOwnerName(),
1727                    mOwners.getDeviceOwnerUserId(),
1728                    !mOwners.getDeviceOwnerUserRestrictionsNeedsMigration());
1729            mOwners.writeDeviceOwner();
1730            if (VERBOSE_LOG) {
1731                Log.v(LOG_TAG, "Device owner component filled in");
1732            }
1733        }
1734    }
1735
1736    /**
1737     * We didn't use to persist user restrictions for each owners but only persisted in user
1738     * manager.
1739     */
1740    private void migrateUserRestrictionsIfNecessaryLocked() {
1741        boolean migrated = false;
1742        // Migrate for the DO.  Basically all restrictions should be considered to be set by DO,
1743        // except for the "system controlled" ones.
1744        if (mOwners.getDeviceOwnerUserRestrictionsNeedsMigration()) {
1745            if (VERBOSE_LOG) {
1746                Log.v(LOG_TAG, "Migrating DO user restrictions");
1747            }
1748            migrated = true;
1749
1750            // Migrate user 0 restrictions to DO.
1751            final ActiveAdmin deviceOwnerAdmin = getDeviceOwnerAdminLocked();
1752
1753            migrateUserRestrictionsForUser(UserHandle.SYSTEM, deviceOwnerAdmin,
1754                    /* exceptionList =*/ null, /* isDeviceOwner =*/ true);
1755
1756            // Push DO user restrictions to user manager.
1757            pushUserRestrictions(UserHandle.USER_SYSTEM);
1758
1759            mOwners.setDeviceOwnerUserRestrictionsMigrated();
1760        }
1761
1762        // Migrate for POs.
1763
1764        // The following restrictions can be set on secondary users by the device owner, so we
1765        // assume they're not from the PO.
1766        final Set<String> secondaryUserExceptionList = Sets.newArraySet(
1767                UserManager.DISALLOW_OUTGOING_CALLS,
1768                UserManager.DISALLOW_SMS);
1769
1770        for (UserInfo ui : mUserManager.getUsers()) {
1771            final int userId = ui.id;
1772            if (mOwners.getProfileOwnerUserRestrictionsNeedsMigration(userId)) {
1773                if (VERBOSE_LOG) {
1774                    Log.v(LOG_TAG, "Migrating PO user restrictions for user " + userId);
1775                }
1776                migrated = true;
1777
1778                final ActiveAdmin profileOwnerAdmin = getProfileOwnerAdminLocked(userId);
1779
1780                final Set<String> exceptionList =
1781                        (userId == UserHandle.USER_SYSTEM) ? null : secondaryUserExceptionList;
1782
1783                migrateUserRestrictionsForUser(ui.getUserHandle(), profileOwnerAdmin,
1784                        exceptionList, /* isDeviceOwner =*/ false);
1785
1786                // Note if a secondary user has no PO but has a DA that disables camera, we
1787                // don't get here and won't push the camera user restriction to UserManager
1788                // here.  That's okay because we'll push user restrictions anyway when a user
1789                // starts.  But we still do it because we want to let user manager persist
1790                // upon migration.
1791                pushUserRestrictions(userId);
1792
1793                mOwners.setProfileOwnerUserRestrictionsMigrated(userId);
1794            }
1795        }
1796        if (VERBOSE_LOG && migrated) {
1797            Log.v(LOG_TAG, "User restrictions migrated.");
1798        }
1799    }
1800
1801    private void migrateUserRestrictionsForUser(UserHandle user, ActiveAdmin admin,
1802            Set<String> exceptionList, boolean isDeviceOwner) {
1803        final Bundle origRestrictions = mUserManagerInternal.getBaseUserRestrictions(
1804                user.getIdentifier());
1805
1806        final Bundle newBaseRestrictions = new Bundle();
1807        final Bundle newOwnerRestrictions = new Bundle();
1808
1809        for (String key : origRestrictions.keySet()) {
1810            if (!origRestrictions.getBoolean(key)) {
1811                continue;
1812            }
1813            final boolean canOwnerChange = isDeviceOwner
1814                    ? UserRestrictionsUtils.canDeviceOwnerChange(key)
1815                    : UserRestrictionsUtils.canProfileOwnerChange(key, user.getIdentifier());
1816
1817            if (!canOwnerChange || (exceptionList!= null && exceptionList.contains(key))) {
1818                newBaseRestrictions.putBoolean(key, true);
1819            } else {
1820                newOwnerRestrictions.putBoolean(key, true);
1821            }
1822        }
1823
1824        if (VERBOSE_LOG) {
1825            Log.v(LOG_TAG, "origRestrictions=" + origRestrictions);
1826            Log.v(LOG_TAG, "newBaseRestrictions=" + newBaseRestrictions);
1827            Log.v(LOG_TAG, "newOwnerRestrictions=" + newOwnerRestrictions);
1828        }
1829        mUserManagerInternal.setBaseUserRestrictionsByDpmsForMigration(user.getIdentifier(),
1830                newBaseRestrictions);
1831
1832        if (admin != null) {
1833            admin.ensureUserRestrictions().clear();
1834            admin.ensureUserRestrictions().putAll(newOwnerRestrictions);
1835        } else {
1836            Slog.w(LOG_TAG, "ActiveAdmin for DO/PO not found. user=" + user.getIdentifier());
1837        }
1838        saveSettingsLocked(user.getIdentifier());
1839    }
1840
1841    private ComponentName findAdminComponentWithPackageLocked(String packageName, int userId) {
1842        final DevicePolicyData policy = getUserData(userId);
1843        final int n = policy.mAdminList.size();
1844        ComponentName found = null;
1845        int nFound = 0;
1846        for (int i = 0; i < n; i++) {
1847            final ActiveAdmin admin = policy.mAdminList.get(i);
1848            if (packageName.equals(admin.info.getPackageName())) {
1849                // Found!
1850                if (nFound == 0) {
1851                    found = admin.info.getComponent();
1852                }
1853                nFound++;
1854            }
1855        }
1856        if (nFound > 1) {
1857            Slog.w(LOG_TAG, "Multiple DA found; assume the first one is DO.");
1858        }
1859        return found;
1860    }
1861
1862    /**
1863     * Set an alarm for an upcoming event - expiration warning, expiration, or post-expiration
1864     * reminders.  Clears alarm if no expirations are configured.
1865     */
1866    private void setExpirationAlarmCheckLocked(Context context, int userHandle, boolean parent) {
1867        final long expiration = getPasswordExpirationLocked(null, userHandle, parent);
1868        final long now = System.currentTimeMillis();
1869        final long timeToExpire = expiration - now;
1870        final long alarmTime;
1871        if (expiration == 0) {
1872            // No expirations are currently configured:  Cancel alarm.
1873            alarmTime = 0;
1874        } else if (timeToExpire <= 0) {
1875            // The password has already expired:  Repeat every 24 hours.
1876            alarmTime = now + MS_PER_DAY;
1877        } else {
1878            // Selecting the next alarm time:  Roll forward to the next 24 hour multiple before
1879            // the expiration time.
1880            long alarmInterval = timeToExpire % MS_PER_DAY;
1881            if (alarmInterval == 0) {
1882                alarmInterval = MS_PER_DAY;
1883            }
1884            alarmTime = now + alarmInterval;
1885        }
1886
1887        long token = mInjector.binderClearCallingIdentity();
1888        try {
1889            int affectedUserHandle = parent ? getProfileParentId(userHandle) : userHandle;
1890            AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
1891            PendingIntent pi = PendingIntent.getBroadcastAsUser(context, REQUEST_EXPIRE_PASSWORD,
1892                    new Intent(ACTION_EXPIRED_PASSWORD_NOTIFICATION),
1893                    PendingIntent.FLAG_ONE_SHOT | PendingIntent.FLAG_UPDATE_CURRENT,
1894                    UserHandle.of(affectedUserHandle));
1895            am.cancel(pi);
1896            if (alarmTime != 0) {
1897                am.set(AlarmManager.RTC, alarmTime, pi);
1898            }
1899        } finally {
1900            mInjector.binderRestoreCallingIdentity(token);
1901        }
1902    }
1903
1904    ActiveAdmin getActiveAdminUncheckedLocked(ComponentName who, int userHandle) {
1905        ActiveAdmin admin = getUserData(userHandle).mAdminMap.get(who);
1906        if (admin != null
1907                && who.getPackageName().equals(admin.info.getActivityInfo().packageName)
1908                && who.getClassName().equals(admin.info.getActivityInfo().name)) {
1909            return admin;
1910        }
1911        return null;
1912    }
1913
1914    ActiveAdmin getActiveAdminUncheckedLocked(ComponentName who, int userHandle, boolean parent) {
1915        if (parent) {
1916            enforceManagedProfile(userHandle, "call APIs on the parent profile");
1917        }
1918        ActiveAdmin admin = getActiveAdminUncheckedLocked(who, userHandle);
1919        if (admin != null && parent) {
1920            admin = admin.getParentActiveAdmin();
1921        }
1922        return admin;
1923    }
1924
1925    ActiveAdmin getActiveAdminForCallerLocked(ComponentName who, int reqPolicy)
1926            throws SecurityException {
1927        final int callingUid = mInjector.binderGetCallingUid();
1928
1929        ActiveAdmin result = getActiveAdminWithPolicyForUidLocked(who, reqPolicy, callingUid);
1930        if (result != null) {
1931            return result;
1932        }
1933
1934        if (who != null) {
1935            final int userId = UserHandle.getUserId(callingUid);
1936            final DevicePolicyData policy = getUserData(userId);
1937            ActiveAdmin admin = policy.mAdminMap.get(who);
1938            if (reqPolicy == DeviceAdminInfo.USES_POLICY_DEVICE_OWNER) {
1939                throw new SecurityException("Admin " + admin.info.getComponent()
1940                         + " does not own the device");
1941            }
1942            if (reqPolicy == DeviceAdminInfo.USES_POLICY_PROFILE_OWNER) {
1943                throw new SecurityException("Admin " + admin.info.getComponent()
1944                        + " does not own the profile");
1945            }
1946            throw new SecurityException("Admin " + admin.info.getComponent()
1947                    + " did not specify uses-policy for: "
1948                    + admin.info.getTagForPolicy(reqPolicy));
1949        } else {
1950            throw new SecurityException("No active admin owned by uid "
1951                    + mInjector.binderGetCallingUid() + " for policy #" + reqPolicy);
1952        }
1953    }
1954
1955    ActiveAdmin getActiveAdminForCallerLocked(ComponentName who, int reqPolicy, boolean parent)
1956            throws SecurityException {
1957        if (parent) {
1958            enforceManagedProfile(mInjector.userHandleGetCallingUserId(),
1959                    "call APIs on the parent profile");
1960        }
1961        ActiveAdmin admin = getActiveAdminForCallerLocked(who, reqPolicy);
1962        return parent ? admin.getParentActiveAdmin() : admin;
1963    }
1964    /**
1965     * Find the admin for the component and userId bit of the uid, then check
1966     * the admin's uid matches the uid.
1967     */
1968    private ActiveAdmin getActiveAdminForUidLocked(ComponentName who, int uid) {
1969        final int userId = UserHandle.getUserId(uid);
1970        final DevicePolicyData policy = getUserData(userId);
1971        ActiveAdmin admin = policy.mAdminMap.get(who);
1972        if (admin == null) {
1973            throw new SecurityException("No active admin " + who);
1974        }
1975        if (admin.getUid() != uid) {
1976            throw new SecurityException("Admin " + who + " is not owned by uid " + uid);
1977        }
1978        return admin;
1979    }
1980
1981    private ActiveAdmin getActiveAdminWithPolicyForUidLocked(ComponentName who, int reqPolicy,
1982            int uid) {
1983        // Try to find an admin which can use reqPolicy
1984        final int userId = UserHandle.getUserId(uid);
1985        final DevicePolicyData policy = getUserData(userId);
1986        if (who != null) {
1987            ActiveAdmin admin = policy.mAdminMap.get(who);
1988            if (admin == null) {
1989                throw new SecurityException("No active admin " + who);
1990            }
1991            if (admin.getUid() != uid) {
1992                throw new SecurityException("Admin " + who + " is not owned by uid " + uid);
1993            }
1994            if (isActiveAdminWithPolicyForUserLocked(admin, reqPolicy, userId)) {
1995                return admin;
1996            }
1997        } else {
1998            for (ActiveAdmin admin : policy.mAdminList) {
1999                if (admin.getUid() == uid && isActiveAdminWithPolicyForUserLocked(admin, reqPolicy,
2000                        userId)) {
2001                    return admin;
2002                }
2003            }
2004        }
2005
2006        return null;
2007    }
2008
2009    @VisibleForTesting
2010    boolean isActiveAdminWithPolicyForUserLocked(ActiveAdmin admin, int reqPolicy,
2011            int userId) {
2012        final boolean ownsDevice = isDeviceOwner(admin.info.getComponent(), userId);
2013        final boolean ownsProfile = isProfileOwner(admin.info.getComponent(), userId);
2014
2015        if (reqPolicy == DeviceAdminInfo.USES_POLICY_DEVICE_OWNER) {
2016            return ownsDevice;
2017        } else if (reqPolicy == DeviceAdminInfo.USES_POLICY_PROFILE_OWNER) {
2018            // DO always has the PO power.
2019            return ownsDevice || ownsProfile;
2020        } else {
2021            return admin.info.usesPolicy(reqPolicy);
2022        }
2023    }
2024
2025    void sendAdminCommandLocked(ActiveAdmin admin, String action) {
2026        sendAdminCommandLocked(admin, action, null);
2027    }
2028
2029    void sendAdminCommandLocked(ActiveAdmin admin, String action, BroadcastReceiver result) {
2030        sendAdminCommandLocked(admin, action, null, result);
2031    }
2032
2033    /**
2034     * Send an update to one specific admin, get notified when that admin returns a result.
2035     */
2036    void sendAdminCommandLocked(ActiveAdmin admin, String action, Bundle adminExtras,
2037            BroadcastReceiver result) {
2038        Intent intent = new Intent(action);
2039        intent.setComponent(admin.info.getComponent());
2040        if (action.equals(DeviceAdminReceiver.ACTION_PASSWORD_EXPIRING)) {
2041            intent.putExtra("expiration", admin.passwordExpirationDate);
2042        }
2043        if (adminExtras != null) {
2044            intent.putExtras(adminExtras);
2045        }
2046        if (result != null) {
2047            mContext.sendOrderedBroadcastAsUser(intent, admin.getUserHandle(),
2048                    null, result, mHandler, Activity.RESULT_OK, null, null);
2049        } else {
2050            mContext.sendBroadcastAsUser(intent, admin.getUserHandle());
2051        }
2052    }
2053
2054    /**
2055     * Send an update to all admins of a user that enforce a specified policy.
2056     */
2057    void sendAdminCommandLocked(String action, int reqPolicy, int userHandle) {
2058        final DevicePolicyData policy = getUserData(userHandle);
2059        final int count = policy.mAdminList.size();
2060        if (count > 0) {
2061            for (int i = 0; i < count; i++) {
2062                final ActiveAdmin admin = policy.mAdminList.get(i);
2063                if (admin.info.usesPolicy(reqPolicy)) {
2064                    sendAdminCommandLocked(admin, action);
2065                }
2066            }
2067        }
2068    }
2069
2070    /**
2071     * Send an update intent to all admins of a user and its profiles. Only send to admins that
2072     * enforce a specified policy.
2073     */
2074    private void sendAdminCommandToSelfAndProfilesLocked(String action, int reqPolicy,
2075            int userHandle) {
2076        int[] profileIds = mUserManager.getProfileIdsWithDisabled(userHandle);
2077        for (int profileId : profileIds) {
2078            sendAdminCommandLocked(action, reqPolicy, profileId);
2079        }
2080    }
2081
2082    /**
2083     * Sends a broadcast to each profile that share the password unlock with the given user id.
2084     */
2085    private void sendAdminCommandForLockscreenPoliciesLocked(
2086            String action, int reqPolicy, int userHandle) {
2087        if (isSeparateProfileChallengeEnabled(userHandle)) {
2088            sendAdminCommandLocked(action, reqPolicy, userHandle);
2089        } else {
2090            sendAdminCommandToSelfAndProfilesLocked(action, reqPolicy, userHandle);
2091        }
2092    }
2093
2094    void removeActiveAdminLocked(final ComponentName adminReceiver, final int userHandle) {
2095        final ActiveAdmin admin = getActiveAdminUncheckedLocked(adminReceiver, userHandle);
2096        if (admin != null) {
2097            getUserData(userHandle).mRemovingAdmins.add(adminReceiver);
2098            sendAdminCommandLocked(admin,
2099                    DeviceAdminReceiver.ACTION_DEVICE_ADMIN_DISABLED,
2100                    new BroadcastReceiver() {
2101                        @Override
2102                        public void onReceive(Context context, Intent intent) {
2103                            removeAdminArtifacts(adminReceiver, userHandle);
2104                            removePackageIfRequired(adminReceiver.getPackageName(), userHandle);
2105                        }
2106                    });
2107        }
2108    }
2109
2110
2111    public DeviceAdminInfo findAdmin(ComponentName adminName, int userHandle,
2112            boolean throwForMissiongPermission) {
2113        if (!mHasFeature) {
2114            return null;
2115        }
2116        enforceFullCrossUsersPermission(userHandle);
2117        ActivityInfo ai = null;
2118        try {
2119            ai = mIPackageManager.getReceiverInfo(adminName,
2120                    PackageManager.GET_META_DATA |
2121                    PackageManager.MATCH_DISABLED_UNTIL_USED_COMPONENTS |
2122                    PackageManager.MATCH_DIRECT_BOOT_AWARE |
2123                    PackageManager.MATCH_DIRECT_BOOT_UNAWARE, userHandle);
2124        } catch (RemoteException e) {
2125            // shouldn't happen.
2126        }
2127        if (ai == null) {
2128            throw new IllegalArgumentException("Unknown admin: " + adminName);
2129        }
2130
2131        if (!permission.BIND_DEVICE_ADMIN.equals(ai.permission)) {
2132            final String message = "DeviceAdminReceiver " + adminName + " must be protected with "
2133                    + permission.BIND_DEVICE_ADMIN;
2134            Slog.w(LOG_TAG, message);
2135            if (throwForMissiongPermission &&
2136                    ai.applicationInfo.targetSdkVersion > Build.VERSION_CODES.M) {
2137                throw new IllegalArgumentException(message);
2138            }
2139        }
2140
2141        try {
2142            return new DeviceAdminInfo(mContext, ai);
2143        } catch (XmlPullParserException | IOException e) {
2144            Slog.w(LOG_TAG, "Bad device admin requested for user=" + userHandle + ": " + adminName,
2145                    e);
2146            return null;
2147        }
2148    }
2149
2150    private JournaledFile makeJournaledFile(int userHandle) {
2151        final String base = userHandle == UserHandle.USER_SYSTEM
2152                ? mInjector.getDevicePolicyFilePathForSystemUser() + DEVICE_POLICIES_XML
2153                : new File(mInjector.environmentGetUserSystemDirectory(userHandle),
2154                        DEVICE_POLICIES_XML).getAbsolutePath();
2155        if (VERBOSE_LOG) {
2156            Log.v(LOG_TAG, "Opening " + base);
2157        }
2158        return new JournaledFile(new File(base), new File(base + ".tmp"));
2159    }
2160
2161    private void saveSettingsLocked(int userHandle) {
2162        DevicePolicyData policy = getUserData(userHandle);
2163        JournaledFile journal = makeJournaledFile(userHandle);
2164        FileOutputStream stream = null;
2165        try {
2166            stream = new FileOutputStream(journal.chooseForWrite(), false);
2167            XmlSerializer out = new FastXmlSerializer();
2168            out.setOutput(stream, StandardCharsets.UTF_8.name());
2169            out.startDocument(null, true);
2170
2171            out.startTag(null, "policies");
2172            if (policy.mRestrictionsProvider != null) {
2173                out.attribute(null, ATTR_PERMISSION_PROVIDER,
2174                        policy.mRestrictionsProvider.flattenToString());
2175            }
2176            if (policy.mUserSetupComplete) {
2177                out.attribute(null, ATTR_SETUP_COMPLETE,
2178                        Boolean.toString(true));
2179            }
2180            if (policy.mDeviceProvisioningConfigApplied) {
2181                out.attribute(null, ATTR_DEVICE_PROVISIONING_CONFIG_APPLIED,
2182                        Boolean.toString(true));
2183            }
2184            if (policy.mUserProvisioningState != DevicePolicyManager.STATE_USER_UNMANAGED) {
2185                out.attribute(null, ATTR_PROVISIONING_STATE,
2186                        Integer.toString(policy.mUserProvisioningState));
2187            }
2188            if (policy.mPermissionPolicy != DevicePolicyManager.PERMISSION_POLICY_PROMPT) {
2189                out.attribute(null, ATTR_PERMISSION_POLICY,
2190                        Integer.toString(policy.mPermissionPolicy));
2191            }
2192            if (policy.mDelegatedCertInstallerPackage != null) {
2193                out.attribute(null, ATTR_DELEGATED_CERT_INSTALLER,
2194                        policy.mDelegatedCertInstallerPackage);
2195            }
2196            if (policy.mApplicationRestrictionsManagingPackage != null) {
2197                out.attribute(null, ATTR_APPLICATION_RESTRICTIONS_MANAGER,
2198                        policy.mApplicationRestrictionsManagingPackage);
2199            }
2200
2201            final int N = policy.mAdminList.size();
2202            for (int i=0; i<N; i++) {
2203                ActiveAdmin ap = policy.mAdminList.get(i);
2204                if (ap != null) {
2205                    out.startTag(null, "admin");
2206                    out.attribute(null, "name", ap.info.getComponent().flattenToString());
2207                    ap.writeToXml(out);
2208                    out.endTag(null, "admin");
2209                }
2210            }
2211
2212            if (policy.mPasswordOwner >= 0) {
2213                out.startTag(null, "password-owner");
2214                out.attribute(null, "value", Integer.toString(policy.mPasswordOwner));
2215                out.endTag(null, "password-owner");
2216            }
2217
2218            if (policy.mFailedPasswordAttempts != 0) {
2219                out.startTag(null, "failed-password-attempts");
2220                out.attribute(null, "value", Integer.toString(policy.mFailedPasswordAttempts));
2221                out.endTag(null, "failed-password-attempts");
2222            }
2223
2224            if (policy.mActivePasswordQuality != 0 || policy.mActivePasswordLength != 0
2225                    || policy.mActivePasswordUpperCase != 0 || policy.mActivePasswordLowerCase != 0
2226                    || policy.mActivePasswordLetters != 0 || policy.mActivePasswordNumeric != 0
2227                    || policy.mActivePasswordSymbols != 0 || policy.mActivePasswordNonLetter != 0) {
2228                out.startTag(null, "active-password");
2229                out.attribute(null, "quality", Integer.toString(policy.mActivePasswordQuality));
2230                out.attribute(null, "length", Integer.toString(policy.mActivePasswordLength));
2231                out.attribute(null, "uppercase", Integer.toString(policy.mActivePasswordUpperCase));
2232                out.attribute(null, "lowercase", Integer.toString(policy.mActivePasswordLowerCase));
2233                out.attribute(null, "letters", Integer.toString(policy.mActivePasswordLetters));
2234                out.attribute(null, "numeric", Integer
2235                        .toString(policy.mActivePasswordNumeric));
2236                out.attribute(null, "symbols", Integer.toString(policy.mActivePasswordSymbols));
2237                out.attribute(null, "nonletter", Integer.toString(policy.mActivePasswordNonLetter));
2238                out.endTag(null, "active-password");
2239            }
2240
2241            for (int i = 0; i < policy.mAcceptedCaCertificates.size(); i++) {
2242                out.startTag(null, TAG_ACCEPTED_CA_CERTIFICATES);
2243                out.attribute(null, ATTR_NAME, policy.mAcceptedCaCertificates.valueAt(i));
2244                out.endTag(null, TAG_ACCEPTED_CA_CERTIFICATES);
2245            }
2246
2247            for (int i=0; i<policy.mLockTaskPackages.size(); i++) {
2248                String component = policy.mLockTaskPackages.get(i);
2249                out.startTag(null, TAG_LOCK_TASK_COMPONENTS);
2250                out.attribute(null, "name", component);
2251                out.endTag(null, TAG_LOCK_TASK_COMPONENTS);
2252            }
2253
2254            if (policy.mStatusBarDisabled) {
2255                out.startTag(null, TAG_STATUS_BAR);
2256                out.attribute(null, ATTR_DISABLED, Boolean.toString(policy.mStatusBarDisabled));
2257                out.endTag(null, TAG_STATUS_BAR);
2258            }
2259
2260            if (policy.doNotAskCredentialsOnBoot) {
2261                out.startTag(null, DO_NOT_ASK_CREDENTIALS_ON_BOOT_XML);
2262                out.endTag(null, DO_NOT_ASK_CREDENTIALS_ON_BOOT_XML);
2263            }
2264
2265            for (String id : policy.mAffiliationIds) {
2266                out.startTag(null, TAG_AFFILIATION_ID);
2267                out.attribute(null, "id", id);
2268                out.endTag(null, TAG_AFFILIATION_ID);
2269            }
2270
2271            if (policy.mAdminBroadcastPending) {
2272                out.startTag(null, TAG_ADMIN_BROADCAST_PENDING);
2273                out.attribute(null, ATTR_VALUE,
2274                        Boolean.toString(policy.mAdminBroadcastPending));
2275                out.endTag(null, TAG_ADMIN_BROADCAST_PENDING);
2276            }
2277
2278            if (policy.mInitBundle != null) {
2279                out.startTag(null, TAG_INITIALIZATION_BUNDLE);
2280                policy.mInitBundle.saveToXml(out);
2281                out.endTag(null, TAG_INITIALIZATION_BUNDLE);
2282            }
2283
2284            out.endTag(null, "policies");
2285
2286            out.endDocument();
2287            stream.flush();
2288            FileUtils.sync(stream);
2289            stream.close();
2290            journal.commit();
2291            sendChangedNotification(userHandle);
2292        } catch (XmlPullParserException | IOException e) {
2293            Slog.w(LOG_TAG, "failed writing file", e);
2294            try {
2295                if (stream != null) {
2296                    stream.close();
2297                }
2298            } catch (IOException ex) {
2299                // Ignore
2300            }
2301            journal.rollback();
2302        }
2303    }
2304
2305    private void sendChangedNotification(int userHandle) {
2306        Intent intent = new Intent(DevicePolicyManager.ACTION_DEVICE_POLICY_MANAGER_STATE_CHANGED);
2307        intent.setFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);
2308        long ident = mInjector.binderClearCallingIdentity();
2309        try {
2310            mContext.sendBroadcastAsUser(intent, new UserHandle(userHandle));
2311        } finally {
2312            mInjector.binderRestoreCallingIdentity(ident);
2313        }
2314    }
2315
2316    private void loadSettingsLocked(DevicePolicyData policy, int userHandle) {
2317        JournaledFile journal = makeJournaledFile(userHandle);
2318        FileInputStream stream = null;
2319        File file = journal.chooseForRead();
2320        try {
2321            stream = new FileInputStream(file);
2322            XmlPullParser parser = Xml.newPullParser();
2323            parser.setInput(stream, StandardCharsets.UTF_8.name());
2324
2325            int type;
2326            while ((type=parser.next()) != XmlPullParser.END_DOCUMENT
2327                    && type != XmlPullParser.START_TAG) {
2328            }
2329            String tag = parser.getName();
2330            if (!"policies".equals(tag)) {
2331                throw new XmlPullParserException(
2332                        "Settings do not start with policies tag: found " + tag);
2333            }
2334
2335            // Extract the permission provider component name if available
2336            String permissionProvider = parser.getAttributeValue(null, ATTR_PERMISSION_PROVIDER);
2337            if (permissionProvider != null) {
2338                policy.mRestrictionsProvider = ComponentName.unflattenFromString(permissionProvider);
2339            }
2340            String userSetupComplete = parser.getAttributeValue(null, ATTR_SETUP_COMPLETE);
2341            if (userSetupComplete != null && Boolean.toString(true).equals(userSetupComplete)) {
2342                policy.mUserSetupComplete = true;
2343            }
2344            String deviceProvisioningConfigApplied = parser.getAttributeValue(null,
2345                    ATTR_DEVICE_PROVISIONING_CONFIG_APPLIED);
2346            if (deviceProvisioningConfigApplied != null
2347                    && Boolean.toString(true).equals(deviceProvisioningConfigApplied)) {
2348                policy.mDeviceProvisioningConfigApplied = true;
2349            }
2350            String provisioningState = parser.getAttributeValue(null, ATTR_PROVISIONING_STATE);
2351            if (!TextUtils.isEmpty(provisioningState)) {
2352                policy.mUserProvisioningState = Integer.parseInt(provisioningState);
2353            }
2354            String permissionPolicy = parser.getAttributeValue(null, ATTR_PERMISSION_POLICY);
2355            if (!TextUtils.isEmpty(permissionPolicy)) {
2356                policy.mPermissionPolicy = Integer.parseInt(permissionPolicy);
2357            }
2358            policy.mDelegatedCertInstallerPackage = parser.getAttributeValue(null,
2359                    ATTR_DELEGATED_CERT_INSTALLER);
2360            policy.mApplicationRestrictionsManagingPackage = parser.getAttributeValue(null,
2361                    ATTR_APPLICATION_RESTRICTIONS_MANAGER);
2362
2363            type = parser.next();
2364            int outerDepth = parser.getDepth();
2365            policy.mLockTaskPackages.clear();
2366            policy.mAdminList.clear();
2367            policy.mAdminMap.clear();
2368            policy.mAffiliationIds.clear();
2369            while ((type=parser.next()) != XmlPullParser.END_DOCUMENT
2370                   && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
2371                if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
2372                    continue;
2373                }
2374                tag = parser.getName();
2375                if ("admin".equals(tag)) {
2376                    String name = parser.getAttributeValue(null, "name");
2377                    try {
2378                        DeviceAdminInfo dai = findAdmin(
2379                                ComponentName.unflattenFromString(name), userHandle,
2380                                /* throwForMissionPermission= */ false);
2381                        if (VERBOSE_LOG
2382                                && (UserHandle.getUserId(dai.getActivityInfo().applicationInfo.uid)
2383                                != userHandle)) {
2384                            Slog.w(LOG_TAG, "findAdmin returned an incorrect uid "
2385                                    + dai.getActivityInfo().applicationInfo.uid + " for user "
2386                                    + userHandle);
2387                        }
2388                        if (dai != null) {
2389                            ActiveAdmin ap = new ActiveAdmin(dai, /* parent */ false);
2390                            ap.readFromXml(parser);
2391                            policy.mAdminMap.put(ap.info.getComponent(), ap);
2392                        }
2393                    } catch (RuntimeException e) {
2394                        Slog.w(LOG_TAG, "Failed loading admin " + name, e);
2395                    }
2396                } else if ("failed-password-attempts".equals(tag)) {
2397                    policy.mFailedPasswordAttempts = Integer.parseInt(
2398                            parser.getAttributeValue(null, "value"));
2399                } else if ("password-owner".equals(tag)) {
2400                    policy.mPasswordOwner = Integer.parseInt(
2401                            parser.getAttributeValue(null, "value"));
2402                } else if ("active-password".equals(tag)) {
2403                    policy.mActivePasswordQuality = Integer.parseInt(
2404                            parser.getAttributeValue(null, "quality"));
2405                    policy.mActivePasswordLength = Integer.parseInt(
2406                            parser.getAttributeValue(null, "length"));
2407                    policy.mActivePasswordUpperCase = Integer.parseInt(
2408                            parser.getAttributeValue(null, "uppercase"));
2409                    policy.mActivePasswordLowerCase = Integer.parseInt(
2410                            parser.getAttributeValue(null, "lowercase"));
2411                    policy.mActivePasswordLetters = Integer.parseInt(
2412                            parser.getAttributeValue(null, "letters"));
2413                    policy.mActivePasswordNumeric = Integer.parseInt(
2414                            parser.getAttributeValue(null, "numeric"));
2415                    policy.mActivePasswordSymbols = Integer.parseInt(
2416                            parser.getAttributeValue(null, "symbols"));
2417                    policy.mActivePasswordNonLetter = Integer.parseInt(
2418                            parser.getAttributeValue(null, "nonletter"));
2419                } else if (TAG_ACCEPTED_CA_CERTIFICATES.equals(tag)) {
2420                    policy.mAcceptedCaCertificates.add(parser.getAttributeValue(null, ATTR_NAME));
2421                } else if (TAG_LOCK_TASK_COMPONENTS.equals(tag)) {
2422                    policy.mLockTaskPackages.add(parser.getAttributeValue(null, "name"));
2423                } else if (TAG_STATUS_BAR.equals(tag)) {
2424                    policy.mStatusBarDisabled = Boolean.parseBoolean(
2425                            parser.getAttributeValue(null, ATTR_DISABLED));
2426                } else if (DO_NOT_ASK_CREDENTIALS_ON_BOOT_XML.equals(tag)) {
2427                    policy.doNotAskCredentialsOnBoot = true;
2428                } else if (TAG_AFFILIATION_ID.equals(tag)) {
2429                    policy.mAffiliationIds.add(parser.getAttributeValue(null, "id"));
2430                } else if (TAG_ADMIN_BROADCAST_PENDING.equals(tag)) {
2431                    String pending = parser.getAttributeValue(null, ATTR_VALUE);
2432                    policy.mAdminBroadcastPending = Boolean.toString(true).equals(pending);
2433                } else if (TAG_INITIALIZATION_BUNDLE.equals(tag)) {
2434                    policy.mInitBundle = PersistableBundle.restoreFromXml(parser);
2435                } else {
2436                    Slog.w(LOG_TAG, "Unknown tag: " + tag);
2437                    XmlUtils.skipCurrentTag(parser);
2438                }
2439            }
2440        } catch (FileNotFoundException e) {
2441            // Don't be noisy, this is normal if we haven't defined any policies.
2442        } catch (NullPointerException | NumberFormatException | XmlPullParserException | IOException
2443                | IndexOutOfBoundsException e) {
2444            Slog.w(LOG_TAG, "failed parsing " + file, e);
2445        }
2446        try {
2447            if (stream != null) {
2448                stream.close();
2449            }
2450        } catch (IOException e) {
2451            // Ignore
2452        }
2453
2454        // Generate a list of admins from the admin map
2455        policy.mAdminList.addAll(policy.mAdminMap.values());
2456
2457        // Validate that what we stored for the password quality matches
2458        // sufficiently what is currently set.  Note that this is only
2459        // a sanity check in case the two get out of sync; this should
2460        // never normally happen.
2461        final long identity = mInjector.binderClearCallingIdentity();
2462        try {
2463            int actualPasswordQuality = mLockPatternUtils.getActivePasswordQuality(userHandle);
2464            if (actualPasswordQuality < policy.mActivePasswordQuality) {
2465                Slog.w(LOG_TAG, "Active password quality 0x"
2466                        + Integer.toHexString(policy.mActivePasswordQuality)
2467                        + " does not match actual quality 0x"
2468                        + Integer.toHexString(actualPasswordQuality));
2469                policy.mActivePasswordQuality = DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED;
2470                policy.mActivePasswordLength = 0;
2471                policy.mActivePasswordUpperCase = 0;
2472                policy.mActivePasswordLowerCase = 0;
2473                policy.mActivePasswordLetters = 0;
2474                policy.mActivePasswordNumeric = 0;
2475                policy.mActivePasswordSymbols = 0;
2476                policy.mActivePasswordNonLetter = 0;
2477            }
2478        } finally {
2479            mInjector.binderRestoreCallingIdentity(identity);
2480        }
2481
2482        validatePasswordOwnerLocked(policy);
2483        updateMaximumTimeToLockLocked(userHandle);
2484        updateLockTaskPackagesLocked(policy.mLockTaskPackages, userHandle);
2485        if (policy.mStatusBarDisabled) {
2486            setStatusBarDisabledInternal(policy.mStatusBarDisabled, userHandle);
2487        }
2488    }
2489
2490    private void updateLockTaskPackagesLocked(List<String> packages, int userId) {
2491        long ident = mInjector.binderClearCallingIdentity();
2492        try {
2493            mInjector.getIActivityManager()
2494                    .updateLockTaskPackages(userId, packages.toArray(new String[packages.size()]));
2495        } catch (RemoteException e) {
2496            // Not gonna happen.
2497        } finally {
2498            mInjector.binderRestoreCallingIdentity(ident);
2499        }
2500    }
2501
2502    private void updateDeviceOwnerLocked() {
2503        long ident = mInjector.binderClearCallingIdentity();
2504        try {
2505            // TODO This is to prevent DO from getting "clear data"ed, but it should also check the
2506            // user id and also protect all other DAs too.
2507            final ComponentName deviceOwnerComponent = mOwners.getDeviceOwnerComponent();
2508            if (deviceOwnerComponent != null) {
2509                mInjector.getIActivityManager()
2510                        .updateDeviceOwner(deviceOwnerComponent.getPackageName());
2511            }
2512        } catch (RemoteException e) {
2513            // Not gonna happen.
2514        } finally {
2515            mInjector.binderRestoreCallingIdentity(ident);
2516        }
2517    }
2518
2519    static void validateQualityConstant(int quality) {
2520        switch (quality) {
2521            case DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED:
2522            case DevicePolicyManager.PASSWORD_QUALITY_BIOMETRIC_WEAK:
2523            case DevicePolicyManager.PASSWORD_QUALITY_SOMETHING:
2524            case DevicePolicyManager.PASSWORD_QUALITY_NUMERIC:
2525            case DevicePolicyManager.PASSWORD_QUALITY_NUMERIC_COMPLEX:
2526            case DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC:
2527            case DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC:
2528            case DevicePolicyManager.PASSWORD_QUALITY_COMPLEX:
2529            case DevicePolicyManager.PASSWORD_QUALITY_MANAGED:
2530                return;
2531        }
2532        throw new IllegalArgumentException("Invalid quality constant: 0x"
2533                + Integer.toHexString(quality));
2534    }
2535
2536    void validatePasswordOwnerLocked(DevicePolicyData policy) {
2537        if (policy.mPasswordOwner >= 0) {
2538            boolean haveOwner = false;
2539            for (int i = policy.mAdminList.size() - 1; i >= 0; i--) {
2540                if (policy.mAdminList.get(i).getUid() == policy.mPasswordOwner) {
2541                    haveOwner = true;
2542                    break;
2543                }
2544            }
2545            if (!haveOwner) {
2546                Slog.w(LOG_TAG, "Previous password owner " + policy.mPasswordOwner
2547                        + " no longer active; disabling");
2548                policy.mPasswordOwner = -1;
2549            }
2550        }
2551    }
2552
2553    @VisibleForTesting
2554    void systemReady(int phase) {
2555        if (!mHasFeature) {
2556            return;
2557        }
2558        switch (phase) {
2559            case SystemService.PHASE_LOCK_SETTINGS_READY:
2560                onLockSettingsReady();
2561                break;
2562            case SystemService.PHASE_BOOT_COMPLETED:
2563                ensureDeviceOwnerUserStarted(); // TODO Consider better place to do this.
2564                break;
2565        }
2566    }
2567
2568    private void onLockSettingsReady() {
2569        getUserData(UserHandle.USER_SYSTEM);
2570        loadOwners();
2571        cleanUpOldUsers();
2572
2573        onStartUser(UserHandle.USER_SYSTEM);
2574
2575        // Register an observer for watching for user setup complete.
2576        new SetupContentObserver(mHandler).register();
2577        // Initialize the user setup state, to handle the upgrade case.
2578        updateUserSetupComplete();
2579
2580        List<String> packageList;
2581        synchronized (this) {
2582            packageList = getKeepUninstalledPackagesLocked();
2583        }
2584        if (packageList != null) {
2585            mInjector.getPackageManagerInternal().setKeepUninstalledPackages(packageList);
2586        }
2587
2588        synchronized (this) {
2589            // push the force-ephemeral-users policy to the user manager.
2590            ActiveAdmin deviceOwner = getDeviceOwnerAdminLocked();
2591            if (deviceOwner != null) {
2592                mUserManagerInternal.setForceEphemeralUsers(deviceOwner.forceEphemeralUsers);
2593            }
2594        }
2595    }
2596
2597    private void ensureDeviceOwnerUserStarted() {
2598        final int userId;
2599        synchronized (this) {
2600            if (!mOwners.hasDeviceOwner()) {
2601                return;
2602            }
2603            userId = mOwners.getDeviceOwnerUserId();
2604        }
2605        if (VERBOSE_LOG) {
2606            Log.v(LOG_TAG, "Starting non-system DO user: " + userId);
2607        }
2608        if (userId != UserHandle.USER_SYSTEM) {
2609            try {
2610                mInjector.getIActivityManager().startUserInBackground(userId);
2611
2612                // STOPSHIP Prevent the DO user from being killed.
2613
2614            } catch (RemoteException e) {
2615                Slog.w(LOG_TAG, "Exception starting user", e);
2616            }
2617        }
2618    }
2619
2620    private void onStartUser(int userId) {
2621        updateScreenCaptureDisabledInWindowManager(userId,
2622                getScreenCaptureDisabled(null, userId));
2623        pushUserRestrictions(userId);
2624    }
2625
2626    private void cleanUpOldUsers() {
2627        // This is needed in case the broadcast {@link Intent.ACTION_USER_REMOVED} was not handled
2628        // before reboot
2629        Set<Integer> usersWithProfileOwners;
2630        Set<Integer> usersWithData;
2631        synchronized(this) {
2632            usersWithProfileOwners = mOwners.getProfileOwnerKeys();
2633            usersWithData = new ArraySet<>();
2634            for (int i = 0; i < mUserData.size(); i++) {
2635                usersWithData.add(mUserData.keyAt(i));
2636            }
2637        }
2638        List<UserInfo> allUsers = mUserManager.getUsers();
2639
2640        Set<Integer> deletedUsers = new ArraySet<>();
2641        deletedUsers.addAll(usersWithProfileOwners);
2642        deletedUsers.addAll(usersWithData);
2643        for (UserInfo userInfo : allUsers) {
2644            deletedUsers.remove(userInfo.id);
2645        }
2646        for (Integer userId : deletedUsers) {
2647            removeUserData(userId);
2648        }
2649    }
2650
2651    private void handlePasswordExpirationNotification(int userHandle) {
2652        synchronized (this) {
2653            final long now = System.currentTimeMillis();
2654
2655            List<ActiveAdmin> admins = getActiveAdminsForLockscreenPoliciesLocked(
2656                    userHandle, /* parent */ false);
2657            final int N = admins.size();
2658            for (int i = 0; i < N; i++) {
2659                ActiveAdmin admin = admins.get(i);
2660                if (admin.info.usesPolicy(DeviceAdminInfo.USES_POLICY_EXPIRE_PASSWORD)
2661                        && admin.passwordExpirationTimeout > 0L
2662                        && now >= admin.passwordExpirationDate - EXPIRATION_GRACE_PERIOD_MS
2663                        && admin.passwordExpirationDate > 0L) {
2664                    sendAdminCommandLocked(admin,
2665                            DeviceAdminReceiver.ACTION_PASSWORD_EXPIRING);
2666                }
2667            }
2668            setExpirationAlarmCheckLocked(mContext, userHandle, /* parent */ false);
2669        }
2670    }
2671
2672    private class MonitoringCertNotificationTask extends AsyncTask<Integer, Void, Void> {
2673        @Override
2674        protected Void doInBackground(Integer... params) {
2675            int userHandle = params[0];
2676
2677            if (userHandle == UserHandle.USER_ALL) {
2678                for (UserInfo userInfo : mUserManager.getUsers(true)) {
2679                    manageNotification(userInfo.getUserHandle());
2680                }
2681            } else {
2682                manageNotification(UserHandle.of(userHandle));
2683            }
2684            return null;
2685        }
2686
2687        private void manageNotification(UserHandle userHandle) {
2688            if (!mUserManager.isUserUnlocked(userHandle)) {
2689                return;
2690            }
2691
2692            // Call out to KeyChain to check for CAs which are waiting for approval.
2693            final List<String> pendingCertificates;
2694            try {
2695                pendingCertificates = getInstalledCaCertificates(userHandle);
2696            } catch (RemoteException | RuntimeException e) {
2697                Log.e(LOG_TAG, "Could not retrieve certificates from KeyChain service", e);
2698                return;
2699            }
2700
2701            synchronized (DevicePolicyManagerService.this) {
2702                final DevicePolicyData policy = getUserData(userHandle.getIdentifier());
2703
2704                // Remove deleted certificates. Flush xml if necessary.
2705                if (policy.mAcceptedCaCertificates.retainAll(pendingCertificates)) {
2706                    saveSettingsLocked(userHandle.getIdentifier());
2707                }
2708                // Trim to approved certificates.
2709                pendingCertificates.removeAll(policy.mAcceptedCaCertificates);
2710            }
2711
2712            if (pendingCertificates.isEmpty()) {
2713                mInjector.getNotificationManager().cancelAsUser(
2714                        null, MONITORING_CERT_NOTIFICATION_ID, userHandle);
2715                return;
2716            }
2717
2718            // Build and show a warning notification
2719            int smallIconId;
2720            String contentText;
2721            int parentUserId = userHandle.getIdentifier();
2722            if (getProfileOwner(userHandle.getIdentifier()) != null) {
2723                contentText = mContext.getString(R.string.ssl_ca_cert_noti_managed,
2724                        getProfileOwnerName(userHandle.getIdentifier()));
2725                smallIconId = R.drawable.stat_sys_certificate_info;
2726                parentUserId = getProfileParentId(userHandle.getIdentifier());
2727            } else if (getDeviceOwnerUserId() == userHandle.getIdentifier()) {
2728                contentText = mContext.getString(R.string.ssl_ca_cert_noti_managed,
2729                        getDeviceOwnerName());
2730                smallIconId = R.drawable.stat_sys_certificate_info;
2731            } else {
2732                contentText = mContext.getString(R.string.ssl_ca_cert_noti_by_unknown);
2733                smallIconId = android.R.drawable.stat_sys_warning;
2734            }
2735
2736            final int numberOfCertificates = pendingCertificates.size();
2737            Intent dialogIntent = new Intent(Settings.ACTION_MONITORING_CERT_INFO);
2738            dialogIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
2739            dialogIntent.setPackage("com.android.settings");
2740            dialogIntent.putExtra(Settings.EXTRA_NUMBER_OF_CERTIFICATES, numberOfCertificates);
2741            dialogIntent.putExtra(Intent.EXTRA_USER_ID, userHandle.getIdentifier());
2742            PendingIntent notifyIntent = PendingIntent.getActivityAsUser(mContext, 0,
2743                    dialogIntent, PendingIntent.FLAG_UPDATE_CURRENT, null,
2744                    new UserHandle(parentUserId));
2745
2746            final Context userContext;
2747            try {
2748                final String packageName = mContext.getPackageName();
2749                userContext = mContext.createPackageContextAsUser(packageName, 0, userHandle);
2750            } catch (PackageManager.NameNotFoundException e) {
2751                Log.e(LOG_TAG, "Create context as " + userHandle + " failed", e);
2752                return;
2753            }
2754            final Notification noti = new Notification.Builder(userContext)
2755                .setSmallIcon(smallIconId)
2756                .setContentTitle(mContext.getResources().getQuantityText(
2757                        R.plurals.ssl_ca_cert_warning, numberOfCertificates))
2758                .setContentText(contentText)
2759                .setContentIntent(notifyIntent)
2760                .setPriority(Notification.PRIORITY_HIGH)
2761                .setShowWhen(false)
2762                .setColor(mContext.getColor(
2763                        com.android.internal.R.color.system_notification_accent_color))
2764                .build();
2765
2766            mInjector.getNotificationManager().notifyAsUser(
2767                    null, MONITORING_CERT_NOTIFICATION_ID, noti, userHandle);
2768        }
2769
2770        private List<String> getInstalledCaCertificates(UserHandle userHandle)
2771                throws RemoteException, RuntimeException {
2772            KeyChainConnection conn = null;
2773            try {
2774                conn = KeyChain.bindAsUser(mContext, userHandle);
2775                List<ParcelableString> aliases = conn.getService().getUserCaAliases().getList();
2776                List<String> result = new ArrayList<>(aliases.size());
2777                for (int i = 0; i < aliases.size(); i++) {
2778                    result.add(aliases.get(i).string);
2779                }
2780                return result;
2781            } catch (InterruptedException e) {
2782                Thread.currentThread().interrupt();
2783                return null;
2784            } catch (AssertionError e) {
2785                throw new RuntimeException(e);
2786            } finally {
2787                if (conn != null) {
2788                    conn.close();
2789                }
2790            }
2791        }
2792    }
2793
2794    /**
2795     * @param adminReceiver The admin to add
2796     * @param refreshing true = update an active admin, no error
2797     */
2798    @Override
2799    public void setActiveAdmin(ComponentName adminReceiver, boolean refreshing, int userHandle) {
2800        if (!mHasFeature) {
2801            return;
2802        }
2803        setActiveAdmin(adminReceiver, refreshing, userHandle, null);
2804    }
2805
2806    private void setActiveAdmin(ComponentName adminReceiver, boolean refreshing, int userHandle,
2807            Bundle onEnableData) {
2808        mContext.enforceCallingOrSelfPermission(
2809                android.Manifest.permission.MANAGE_DEVICE_ADMINS, null);
2810        enforceFullCrossUsersPermission(userHandle);
2811
2812        DevicePolicyData policy = getUserData(userHandle);
2813        DeviceAdminInfo info = findAdmin(adminReceiver, userHandle,
2814                /* throwForMissionPermission= */ true);
2815        if (info == null) {
2816            throw new IllegalArgumentException("Bad admin: " + adminReceiver);
2817        }
2818        if (!info.getActivityInfo().applicationInfo.isInternal()) {
2819            throw new IllegalArgumentException("Only apps in internal storage can be active admin: "
2820                    + adminReceiver);
2821        }
2822        synchronized (this) {
2823            long ident = mInjector.binderClearCallingIdentity();
2824            try {
2825                if (!refreshing
2826                        && getActiveAdminUncheckedLocked(adminReceiver, userHandle) != null) {
2827                    throw new IllegalArgumentException("Admin is already added");
2828                }
2829                if (policy.mRemovingAdmins.contains(adminReceiver)) {
2830                    throw new IllegalArgumentException(
2831                            "Trying to set an admin which is being removed");
2832                }
2833                ActiveAdmin newAdmin = new ActiveAdmin(info, /* parent */ false);
2834                policy.mAdminMap.put(adminReceiver, newAdmin);
2835                int replaceIndex = -1;
2836                final int N = policy.mAdminList.size();
2837                for (int i=0; i < N; i++) {
2838                    ActiveAdmin oldAdmin = policy.mAdminList.get(i);
2839                    if (oldAdmin.info.getComponent().equals(adminReceiver)) {
2840                        replaceIndex = i;
2841                        break;
2842                    }
2843                }
2844                if (replaceIndex == -1) {
2845                    policy.mAdminList.add(newAdmin);
2846                    enableIfNecessary(info.getPackageName(), userHandle);
2847                } else {
2848                    policy.mAdminList.set(replaceIndex, newAdmin);
2849                }
2850                saveSettingsLocked(userHandle);
2851                sendAdminCommandLocked(newAdmin, DeviceAdminReceiver.ACTION_DEVICE_ADMIN_ENABLED,
2852                        onEnableData, null);
2853            } finally {
2854                mInjector.binderRestoreCallingIdentity(ident);
2855            }
2856        }
2857    }
2858
2859    @Override
2860    public boolean isAdminActive(ComponentName adminReceiver, int userHandle) {
2861        if (!mHasFeature) {
2862            return false;
2863        }
2864        enforceFullCrossUsersPermission(userHandle);
2865        synchronized (this) {
2866            return getActiveAdminUncheckedLocked(adminReceiver, userHandle) != null;
2867        }
2868    }
2869
2870    @Override
2871    public boolean isRemovingAdmin(ComponentName adminReceiver, int userHandle) {
2872        if (!mHasFeature) {
2873            return false;
2874        }
2875        enforceFullCrossUsersPermission(userHandle);
2876        synchronized (this) {
2877            DevicePolicyData policyData = getUserData(userHandle);
2878            return policyData.mRemovingAdmins.contains(adminReceiver);
2879        }
2880    }
2881
2882    @Override
2883    public boolean hasGrantedPolicy(ComponentName adminReceiver, int policyId, int userHandle) {
2884        if (!mHasFeature) {
2885            return false;
2886        }
2887        enforceFullCrossUsersPermission(userHandle);
2888        synchronized (this) {
2889            ActiveAdmin administrator = getActiveAdminUncheckedLocked(adminReceiver, userHandle);
2890            if (administrator == null) {
2891                throw new SecurityException("No active admin " + adminReceiver);
2892            }
2893            return administrator.info.usesPolicy(policyId);
2894        }
2895    }
2896
2897    @Override
2898    @SuppressWarnings("unchecked")
2899    public List<ComponentName> getActiveAdmins(int userHandle) {
2900        if (!mHasFeature) {
2901            return Collections.EMPTY_LIST;
2902        }
2903
2904        enforceFullCrossUsersPermission(userHandle);
2905        synchronized (this) {
2906            DevicePolicyData policy = getUserData(userHandle);
2907            final int N = policy.mAdminList.size();
2908            if (N <= 0) {
2909                return null;
2910            }
2911            ArrayList<ComponentName> res = new ArrayList<ComponentName>(N);
2912            for (int i=0; i<N; i++) {
2913                res.add(policy.mAdminList.get(i).info.getComponent());
2914            }
2915            return res;
2916        }
2917    }
2918
2919    @Override
2920    public boolean packageHasActiveAdmins(String packageName, int userHandle) {
2921        if (!mHasFeature) {
2922            return false;
2923        }
2924        enforceFullCrossUsersPermission(userHandle);
2925        synchronized (this) {
2926            DevicePolicyData policy = getUserData(userHandle);
2927            final int N = policy.mAdminList.size();
2928            for (int i=0; i<N; i++) {
2929                if (policy.mAdminList.get(i).info.getPackageName().equals(packageName)) {
2930                    return true;
2931                }
2932            }
2933            return false;
2934        }
2935    }
2936
2937    public void forceRemoveActiveAdmin(ComponentName adminReceiver, int userHandle) {
2938        if (!mHasFeature) {
2939            return;
2940        }
2941        Preconditions.checkNotNull(adminReceiver, "ComponentName is null");
2942        enforceShell("forceRemoveActiveAdmin");
2943        long ident = mInjector.binderClearCallingIdentity();
2944        try {
2945            final ApplicationInfo ai;
2946            try {
2947                ai = mIPackageManager.getApplicationInfo(adminReceiver.getPackageName(),
2948                        0, userHandle);
2949            } catch (RemoteException e) {
2950                throw new IllegalStateException(e);
2951            }
2952            if (ai == null) {
2953                throw new IllegalStateException("Couldn't find package to remove admin "
2954                        + adminReceiver.getPackageName() + " " + userHandle);
2955            }
2956            if ((ai.flags & ApplicationInfo.FLAG_TEST_ONLY) == 0) {
2957                throw new SecurityException("Attempt to remove non-test admin " + adminReceiver
2958                        + adminReceiver + " " + userHandle);
2959            }
2960            // If admin is a device or profile owner tidy that up first.
2961            synchronized (this)  {
2962                if (isDeviceOwner(adminReceiver, userHandle)) {
2963                    clearDeviceOwnerLocked(getDeviceOwnerAdminLocked(), userHandle);
2964                }
2965                if (isProfileOwner(adminReceiver, userHandle)) {
2966                    final ActiveAdmin admin = getActiveAdminUncheckedLocked(adminReceiver,
2967                            userHandle, /* parent */ false);
2968                    clearProfileOwnerLocked(admin, userHandle);
2969                }
2970            }
2971            // Remove the admin skipping sending the broadcast.
2972            removeAdminArtifacts(adminReceiver, userHandle);
2973        } finally {
2974            mInjector.binderRestoreCallingIdentity(ident);
2975        }
2976    }
2977
2978    private void enforceShell(String method) {
2979        final int callingUid = Binder.getCallingUid();
2980        if (callingUid != Process.SHELL_UID && callingUid != Process.ROOT_UID) {
2981            throw new SecurityException("Non-shell user attempted to call " + method);
2982        }
2983    }
2984
2985    @Override
2986    public void removeActiveAdmin(ComponentName adminReceiver, int userHandle) {
2987        if (!mHasFeature) {
2988            return;
2989        }
2990        enforceFullCrossUsersPermission(userHandle);
2991        enforceUserUnlocked(userHandle);
2992        synchronized (this) {
2993            ActiveAdmin admin = getActiveAdminUncheckedLocked(adminReceiver, userHandle);
2994            if (admin == null) {
2995                return;
2996            }
2997            // Active device/profile owners must remain active admins.
2998            if (isDeviceOwner(adminReceiver, userHandle)
2999                    || isProfileOwner(adminReceiver, userHandle)) {
3000                Slog.e(LOG_TAG, "Device/profile owner cannot be removed: component=" +
3001                        adminReceiver);
3002                return;
3003            }
3004            if (admin.getUid() != mInjector.binderGetCallingUid()) {
3005                mContext.enforceCallingOrSelfPermission(
3006                        android.Manifest.permission.MANAGE_DEVICE_ADMINS, null);
3007            }
3008            long ident = mInjector.binderClearCallingIdentity();
3009            try {
3010                removeActiveAdminLocked(adminReceiver, userHandle);
3011            } finally {
3012                mInjector.binderRestoreCallingIdentity(ident);
3013            }
3014        }
3015    }
3016
3017    @Override
3018    public boolean isSeparateProfileChallengeAllowed(int userHandle) {
3019        ComponentName profileOwner = getProfileOwner(userHandle);
3020        // Profile challenge is supported on N or newer release.
3021        return profileOwner != null &&
3022                getTargetSdk(profileOwner.getPackageName(), userHandle) > Build.VERSION_CODES.M;
3023    }
3024
3025    @Override
3026    public void setPasswordQuality(ComponentName who, int quality, boolean parent) {
3027        if (!mHasFeature) {
3028            return;
3029        }
3030        Preconditions.checkNotNull(who, "ComponentName is null");
3031        validateQualityConstant(quality);
3032
3033        synchronized (this) {
3034            ActiveAdmin ap = getActiveAdminForCallerLocked(
3035                    who, DeviceAdminInfo.USES_POLICY_LIMIT_PASSWORD, parent);
3036            if (ap.passwordQuality != quality) {
3037                ap.passwordQuality = quality;
3038                saveSettingsLocked(mInjector.userHandleGetCallingUserId());
3039            }
3040        }
3041    }
3042
3043    @Override
3044    public int getPasswordQuality(ComponentName who, int userHandle, boolean parent) {
3045        if (!mHasFeature) {
3046            return DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED;
3047        }
3048        enforceFullCrossUsersPermission(userHandle);
3049        synchronized (this) {
3050            int mode = DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED;
3051
3052            if (who != null) {
3053                ActiveAdmin admin = getActiveAdminUncheckedLocked(who, userHandle, parent);
3054                return admin != null ? admin.passwordQuality : mode;
3055            }
3056
3057            // Return the strictest policy across all participating admins.
3058            List<ActiveAdmin> admins =
3059                    getActiveAdminsForLockscreenPoliciesLocked(userHandle, parent);
3060            final int N = admins.size();
3061            for (int i = 0; i < N; i++) {
3062                ActiveAdmin admin = admins.get(i);
3063                if (mode < admin.passwordQuality) {
3064                    mode = admin.passwordQuality;
3065                }
3066            }
3067            return mode;
3068        }
3069    }
3070
3071    private List<ActiveAdmin> getActiveAdminsForLockscreenPoliciesLocked(
3072            int userHandle, boolean parent) {
3073        if (!parent && isSeparateProfileChallengeEnabled(userHandle)) {
3074            // If this user has a separate challenge, only return its restrictions.
3075            return getUserDataUnchecked(userHandle).mAdminList;
3076        } else {
3077            // Return all admins for this user and the profiles that are visible from this
3078            // user that do not use a separate work challenge.
3079            ArrayList<ActiveAdmin> admins = new ArrayList<ActiveAdmin>();
3080            for (UserInfo userInfo : mUserManager.getProfiles(userHandle)) {
3081                DevicePolicyData policy = getUserData(userInfo.id);
3082                if (!userInfo.isManagedProfile()) {
3083                    admins.addAll(policy.mAdminList);
3084                } else {
3085                    // For managed profiles, we always include the policies set on the parent
3086                    // profile. Additionally, we include the ones set on the managed profile
3087                    // if no separate challenge is in place.
3088                    boolean hasSeparateChallenge = isSeparateProfileChallengeEnabled(userInfo.id);
3089                    final int N = policy.mAdminList.size();
3090                    for (int i = 0; i < N; i++) {
3091                        ActiveAdmin admin = policy.mAdminList.get(i);
3092                        if (admin.hasParentActiveAdmin()) {
3093                            admins.add(admin.getParentActiveAdmin());
3094                        }
3095                        if (!hasSeparateChallenge) {
3096                            admins.add(admin);
3097                        }
3098                    }
3099                }
3100            }
3101            return admins;
3102        }
3103    }
3104
3105    private boolean isSeparateProfileChallengeEnabled(int userHandle) {
3106        long ident = mInjector.binderClearCallingIdentity();
3107        try {
3108            return mLockPatternUtils.isSeparateProfileChallengeEnabled(userHandle);
3109        } finally {
3110            mInjector.binderRestoreCallingIdentity(ident);
3111        }
3112    }
3113
3114    @Override
3115    public void setPasswordMinimumLength(ComponentName who, int length, boolean parent) {
3116        if (!mHasFeature) {
3117            return;
3118        }
3119        Preconditions.checkNotNull(who, "ComponentName is null");
3120        synchronized (this) {
3121            ActiveAdmin ap = getActiveAdminForCallerLocked(
3122                    who, DeviceAdminInfo.USES_POLICY_LIMIT_PASSWORD, parent);
3123            if (ap.minimumPasswordLength != length) {
3124                ap.minimumPasswordLength = length;
3125                saveSettingsLocked(mInjector.userHandleGetCallingUserId());
3126            }
3127        }
3128    }
3129
3130    @Override
3131    public int getPasswordMinimumLength(ComponentName who, int userHandle, boolean parent) {
3132        if (!mHasFeature) {
3133            return 0;
3134        }
3135        enforceFullCrossUsersPermission(userHandle);
3136        synchronized (this) {
3137            int length = 0;
3138
3139            if (who != null) {
3140                ActiveAdmin admin = getActiveAdminUncheckedLocked(who, userHandle, parent);
3141                return admin != null ? admin.minimumPasswordLength : length;
3142            }
3143
3144            // Return the strictest policy across all participating admins.
3145            List<ActiveAdmin> admins =
3146                    getActiveAdminsForLockscreenPoliciesLocked(userHandle, parent);
3147            final int N = admins.size();
3148            for (int i = 0; i < N; i++) {
3149                ActiveAdmin admin = admins.get(i);
3150                if (length < admin.minimumPasswordLength) {
3151                    length = admin.minimumPasswordLength;
3152                }
3153            }
3154            return length;
3155        }
3156    }
3157
3158    @Override
3159    public void setPasswordHistoryLength(ComponentName who, int length, boolean parent) {
3160        if (!mHasFeature) {
3161            return;
3162        }
3163        Preconditions.checkNotNull(who, "ComponentName is null");
3164        synchronized (this) {
3165            ActiveAdmin ap = getActiveAdminForCallerLocked(
3166                    who, DeviceAdminInfo.USES_POLICY_LIMIT_PASSWORD, parent);
3167            if (ap.passwordHistoryLength != length) {
3168                ap.passwordHistoryLength = length;
3169                saveSettingsLocked(mInjector.userHandleGetCallingUserId());
3170            }
3171        }
3172    }
3173
3174    @Override
3175    public int getPasswordHistoryLength(ComponentName who, int userHandle, boolean parent) {
3176        if (!mHasFeature) {
3177            return 0;
3178        }
3179        enforceFullCrossUsersPermission(userHandle);
3180        synchronized (this) {
3181            int length = 0;
3182
3183            if (who != null) {
3184                ActiveAdmin admin = getActiveAdminUncheckedLocked(who, userHandle, parent);
3185                return admin != null ? admin.passwordHistoryLength : length;
3186            }
3187
3188            // Return the strictest policy across all participating admins.
3189            List<ActiveAdmin> admins =
3190                    getActiveAdminsForLockscreenPoliciesLocked(userHandle, parent);
3191            final int N = admins.size();
3192            for (int i = 0; i < N; i++) {
3193                ActiveAdmin admin = admins.get(i);
3194                if (length < admin.passwordHistoryLength) {
3195                    length = admin.passwordHistoryLength;
3196                }
3197            }
3198
3199            return length;
3200        }
3201    }
3202
3203    @Override
3204    public void setPasswordExpirationTimeout(ComponentName who, long timeout, boolean parent) {
3205        if (!mHasFeature) {
3206            return;
3207        }
3208        Preconditions.checkNotNull(who, "ComponentName is null");
3209        Preconditions.checkArgumentNonnegative(timeout, "Timeout must be >= 0 ms");
3210        final int userHandle = mInjector.userHandleGetCallingUserId();
3211        synchronized (this) {
3212            ActiveAdmin ap = getActiveAdminForCallerLocked(
3213                    who, DeviceAdminInfo.USES_POLICY_EXPIRE_PASSWORD, parent);
3214            // Calling this API automatically bumps the expiration date
3215            final long expiration = timeout > 0L ? (timeout + System.currentTimeMillis()) : 0L;
3216            ap.passwordExpirationDate = expiration;
3217            ap.passwordExpirationTimeout = timeout;
3218            if (timeout > 0L) {
3219                Slog.w(LOG_TAG, "setPasswordExpiration(): password will expire on "
3220                        + DateFormat.getDateTimeInstance(DateFormat.DEFAULT, DateFormat.DEFAULT)
3221                        .format(new Date(expiration)));
3222            }
3223            saveSettingsLocked(userHandle);
3224
3225            // in case this is the first one, set the alarm on the appropriate user.
3226            setExpirationAlarmCheckLocked(mContext, userHandle, parent);
3227        }
3228    }
3229
3230    /**
3231     * Return a single admin's expiration cycle time, or the min of all cycle times.
3232     * Returns 0 if not configured.
3233     */
3234    @Override
3235    public long getPasswordExpirationTimeout(ComponentName who, int userHandle, boolean parent) {
3236        if (!mHasFeature) {
3237            return 0L;
3238        }
3239        enforceFullCrossUsersPermission(userHandle);
3240        synchronized (this) {
3241            long timeout = 0L;
3242
3243            if (who != null) {
3244                ActiveAdmin admin = getActiveAdminUncheckedLocked(who, userHandle, parent);
3245                return admin != null ? admin.passwordExpirationTimeout : timeout;
3246            }
3247
3248            // Return the strictest policy across all participating admins.
3249            List<ActiveAdmin> admins =
3250                    getActiveAdminsForLockscreenPoliciesLocked(userHandle, parent);
3251            final int N = admins.size();
3252            for (int i = 0; i < N; i++) {
3253                ActiveAdmin admin = admins.get(i);
3254                if (timeout == 0L || (admin.passwordExpirationTimeout != 0L
3255                        && timeout > admin.passwordExpirationTimeout)) {
3256                    timeout = admin.passwordExpirationTimeout;
3257                }
3258            }
3259            return timeout;
3260        }
3261    }
3262
3263    @Override
3264    public boolean addCrossProfileWidgetProvider(ComponentName admin, String packageName) {
3265        final int userId = UserHandle.getCallingUserId();
3266        List<String> changedProviders = null;
3267
3268        synchronized (this) {
3269            ActiveAdmin activeAdmin = getActiveAdminForCallerLocked(admin,
3270                    DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
3271            if (activeAdmin.crossProfileWidgetProviders == null) {
3272                activeAdmin.crossProfileWidgetProviders = new ArrayList<>();
3273            }
3274            List<String> providers = activeAdmin.crossProfileWidgetProviders;
3275            if (!providers.contains(packageName)) {
3276                providers.add(packageName);
3277                changedProviders = new ArrayList<>(providers);
3278                saveSettingsLocked(userId);
3279            }
3280        }
3281
3282        if (changedProviders != null) {
3283            mLocalService.notifyCrossProfileProvidersChanged(userId, changedProviders);
3284            return true;
3285        }
3286
3287        return false;
3288    }
3289
3290    @Override
3291    public boolean removeCrossProfileWidgetProvider(ComponentName admin, String packageName) {
3292        final int userId = UserHandle.getCallingUserId();
3293        List<String> changedProviders = null;
3294
3295        synchronized (this) {
3296            ActiveAdmin activeAdmin = getActiveAdminForCallerLocked(admin,
3297                    DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
3298            if (activeAdmin.crossProfileWidgetProviders == null) {
3299                return false;
3300            }
3301            List<String> providers = activeAdmin.crossProfileWidgetProviders;
3302            if (providers.remove(packageName)) {
3303                changedProviders = new ArrayList<>(providers);
3304                saveSettingsLocked(userId);
3305            }
3306        }
3307
3308        if (changedProviders != null) {
3309            mLocalService.notifyCrossProfileProvidersChanged(userId, changedProviders);
3310            return true;
3311        }
3312
3313        return false;
3314    }
3315
3316    @Override
3317    public List<String> getCrossProfileWidgetProviders(ComponentName admin) {
3318        synchronized (this) {
3319            ActiveAdmin activeAdmin = getActiveAdminForCallerLocked(admin,
3320                    DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
3321            if (activeAdmin.crossProfileWidgetProviders == null
3322                    || activeAdmin.crossProfileWidgetProviders.isEmpty()) {
3323                return null;
3324            }
3325            if (mInjector.binderIsCallingUidMyUid()) {
3326                return new ArrayList<>(activeAdmin.crossProfileWidgetProviders);
3327            } else {
3328                return activeAdmin.crossProfileWidgetProviders;
3329            }
3330        }
3331    }
3332
3333    /**
3334     * Return a single admin's expiration date/time, or the min (soonest) for all admins.
3335     * Returns 0 if not configured.
3336     */
3337    private long getPasswordExpirationLocked(ComponentName who, int userHandle, boolean parent) {
3338        long timeout = 0L;
3339
3340        if (who != null) {
3341            ActiveAdmin admin = getActiveAdminUncheckedLocked(who, userHandle, parent);
3342            return admin != null ? admin.passwordExpirationDate : timeout;
3343        }
3344
3345        // Return the strictest policy across all participating admins.
3346        List<ActiveAdmin> admins = getActiveAdminsForLockscreenPoliciesLocked(userHandle, parent);
3347        final int N = admins.size();
3348        for (int i = 0; i < N; i++) {
3349            ActiveAdmin admin = admins.get(i);
3350            if (timeout == 0L || (admin.passwordExpirationDate != 0
3351                    && timeout > admin.passwordExpirationDate)) {
3352                timeout = admin.passwordExpirationDate;
3353            }
3354        }
3355        return timeout;
3356    }
3357
3358    @Override
3359    public long getPasswordExpiration(ComponentName who, int userHandle, boolean parent) {
3360        if (!mHasFeature) {
3361            return 0L;
3362        }
3363        enforceFullCrossUsersPermission(userHandle);
3364        synchronized (this) {
3365            return getPasswordExpirationLocked(who, userHandle, parent);
3366        }
3367    }
3368
3369    @Override
3370    public void setPasswordMinimumUpperCase(ComponentName who, int length, boolean parent) {
3371        if (!mHasFeature) {
3372            return;
3373        }
3374        Preconditions.checkNotNull(who, "ComponentName is null");
3375        synchronized (this) {
3376            ActiveAdmin ap = getActiveAdminForCallerLocked(
3377                    who, DeviceAdminInfo.USES_POLICY_LIMIT_PASSWORD, parent);
3378            if (ap.minimumPasswordUpperCase != length) {
3379                ap.minimumPasswordUpperCase = length;
3380                saveSettingsLocked(mInjector.userHandleGetCallingUserId());
3381            }
3382        }
3383    }
3384
3385    @Override
3386    public int getPasswordMinimumUpperCase(ComponentName who, int userHandle, boolean parent) {
3387        if (!mHasFeature) {
3388            return 0;
3389        }
3390        enforceFullCrossUsersPermission(userHandle);
3391        synchronized (this) {
3392            int length = 0;
3393
3394            if (who != null) {
3395                ActiveAdmin admin = getActiveAdminUncheckedLocked(who, userHandle, parent);
3396                return admin != null ? admin.minimumPasswordUpperCase : length;
3397            }
3398
3399            // Return the strictest policy across all participating admins.
3400            List<ActiveAdmin> admins =
3401                    getActiveAdminsForLockscreenPoliciesLocked(userHandle, parent);
3402            final int N = admins.size();
3403            for (int i = 0; i < N; i++) {
3404                ActiveAdmin admin = admins.get(i);
3405                if (length < admin.minimumPasswordUpperCase) {
3406                    length = admin.minimumPasswordUpperCase;
3407                }
3408            }
3409            return length;
3410        }
3411    }
3412
3413    @Override
3414    public void setPasswordMinimumLowerCase(ComponentName who, int length, boolean parent) {
3415        Preconditions.checkNotNull(who, "ComponentName is null");
3416        synchronized (this) {
3417            ActiveAdmin ap = getActiveAdminForCallerLocked(
3418                    who, DeviceAdminInfo.USES_POLICY_LIMIT_PASSWORD, parent);
3419            if (ap.minimumPasswordLowerCase != length) {
3420                ap.minimumPasswordLowerCase = length;
3421                saveSettingsLocked(mInjector.userHandleGetCallingUserId());
3422            }
3423        }
3424    }
3425
3426    @Override
3427    public int getPasswordMinimumLowerCase(ComponentName who, int userHandle, boolean parent) {
3428        if (!mHasFeature) {
3429            return 0;
3430        }
3431        enforceFullCrossUsersPermission(userHandle);
3432        synchronized (this) {
3433            int length = 0;
3434
3435            if (who != null) {
3436                ActiveAdmin admin = getActiveAdminUncheckedLocked(who, userHandle, parent);
3437                return admin != null ? admin.minimumPasswordLowerCase : length;
3438            }
3439
3440            // Return the strictest policy across all participating admins.
3441            List<ActiveAdmin> admins =
3442                    getActiveAdminsForLockscreenPoliciesLocked(userHandle, parent);
3443            final int N = admins.size();
3444            for (int i = 0; i < N; i++) {
3445                ActiveAdmin admin = admins.get(i);
3446                if (length < admin.minimumPasswordLowerCase) {
3447                    length = admin.minimumPasswordLowerCase;
3448                }
3449            }
3450            return length;
3451        }
3452    }
3453
3454    @Override
3455    public void setPasswordMinimumLetters(ComponentName who, int length, boolean parent) {
3456        if (!mHasFeature) {
3457            return;
3458        }
3459        Preconditions.checkNotNull(who, "ComponentName is null");
3460        synchronized (this) {
3461            ActiveAdmin ap = getActiveAdminForCallerLocked(
3462                    who, DeviceAdminInfo.USES_POLICY_LIMIT_PASSWORD, parent);
3463            if (ap.minimumPasswordLetters != length) {
3464                ap.minimumPasswordLetters = length;
3465                saveSettingsLocked(mInjector.userHandleGetCallingUserId());
3466            }
3467        }
3468    }
3469
3470    @Override
3471    public int getPasswordMinimumLetters(ComponentName who, int userHandle, boolean parent) {
3472        if (!mHasFeature) {
3473            return 0;
3474        }
3475        enforceFullCrossUsersPermission(userHandle);
3476        synchronized (this) {
3477            int length = 0;
3478
3479            if (who != null) {
3480                ActiveAdmin admin = getActiveAdminUncheckedLocked(who, userHandle, parent);
3481                return admin != null ? admin.minimumPasswordLetters : length;
3482            }
3483
3484            // Return the strictest policy across all participating admins.
3485            List<ActiveAdmin> admins =
3486                    getActiveAdminsForLockscreenPoliciesLocked(userHandle, parent);
3487            final int N = admins.size();
3488            for (int i = 0; i < N; i++) {
3489                ActiveAdmin admin = admins.get(i);
3490                if (!isLimitPasswordAllowed(admin, PASSWORD_QUALITY_COMPLEX)) {
3491                    continue;
3492                }
3493                if (length < admin.minimumPasswordLetters) {
3494                    length = admin.minimumPasswordLetters;
3495                }
3496            }
3497            return length;
3498        }
3499    }
3500
3501    @Override
3502    public void setPasswordMinimumNumeric(ComponentName who, int length, boolean parent) {
3503        if (!mHasFeature) {
3504            return;
3505        }
3506        Preconditions.checkNotNull(who, "ComponentName is null");
3507        synchronized (this) {
3508            ActiveAdmin ap = getActiveAdminForCallerLocked(
3509                    who, DeviceAdminInfo.USES_POLICY_LIMIT_PASSWORD, parent);
3510            if (ap.minimumPasswordNumeric != length) {
3511                ap.minimumPasswordNumeric = length;
3512                saveSettingsLocked(mInjector.userHandleGetCallingUserId());
3513            }
3514        }
3515    }
3516
3517    @Override
3518    public int getPasswordMinimumNumeric(ComponentName who, int userHandle, boolean parent) {
3519        if (!mHasFeature) {
3520            return 0;
3521        }
3522        enforceFullCrossUsersPermission(userHandle);
3523        synchronized (this) {
3524            int length = 0;
3525
3526            if (who != null) {
3527                ActiveAdmin admin = getActiveAdminUncheckedLocked(who, userHandle, parent);
3528                return admin != null ? admin.minimumPasswordNumeric : length;
3529            }
3530
3531            // Return the strictest policy across all participating admins.
3532            List<ActiveAdmin> admins =
3533                    getActiveAdminsForLockscreenPoliciesLocked(userHandle, parent);
3534            final int N = admins.size();
3535            for (int i = 0; i < N; i++) {
3536                ActiveAdmin admin = admins.get(i);
3537                if (!isLimitPasswordAllowed(admin, PASSWORD_QUALITY_COMPLEX)) {
3538                    continue;
3539                }
3540                if (length < admin.minimumPasswordNumeric) {
3541                    length = admin.minimumPasswordNumeric;
3542                }
3543            }
3544            return length;
3545        }
3546    }
3547
3548    @Override
3549    public void setPasswordMinimumSymbols(ComponentName who, int length, boolean parent) {
3550        if (!mHasFeature) {
3551            return;
3552        }
3553        Preconditions.checkNotNull(who, "ComponentName is null");
3554        synchronized (this) {
3555            ActiveAdmin ap = getActiveAdminForCallerLocked(
3556                    who, DeviceAdminInfo.USES_POLICY_LIMIT_PASSWORD, parent);
3557            if (ap.minimumPasswordSymbols != length) {
3558                ap.minimumPasswordSymbols = length;
3559                saveSettingsLocked(mInjector.userHandleGetCallingUserId());
3560            }
3561        }
3562    }
3563
3564    @Override
3565    public int getPasswordMinimumSymbols(ComponentName who, int userHandle, boolean parent) {
3566        if (!mHasFeature) {
3567            return 0;
3568        }
3569        enforceFullCrossUsersPermission(userHandle);
3570        synchronized (this) {
3571            int length = 0;
3572
3573            if (who != null) {
3574                ActiveAdmin admin = getActiveAdminUncheckedLocked(who, userHandle, parent);
3575                return admin != null ? admin.minimumPasswordSymbols : length;
3576            }
3577
3578            // Return the strictest policy across all participating admins.
3579            List<ActiveAdmin> admins =
3580                    getActiveAdminsForLockscreenPoliciesLocked(userHandle, parent);
3581            final int N = admins.size();
3582            for (int i = 0; i < N; i++) {
3583                ActiveAdmin admin = admins.get(i);
3584                if (!isLimitPasswordAllowed(admin, PASSWORD_QUALITY_COMPLEX)) {
3585                    continue;
3586                }
3587                if (length < admin.minimumPasswordSymbols) {
3588                    length = admin.minimumPasswordSymbols;
3589                }
3590            }
3591            return length;
3592        }
3593    }
3594
3595    @Override
3596    public void setPasswordMinimumNonLetter(ComponentName who, int length, boolean parent) {
3597        if (!mHasFeature) {
3598            return;
3599        }
3600        Preconditions.checkNotNull(who, "ComponentName is null");
3601        synchronized (this) {
3602            ActiveAdmin ap = getActiveAdminForCallerLocked(
3603                    who, DeviceAdminInfo.USES_POLICY_LIMIT_PASSWORD, parent);
3604            if (ap.minimumPasswordNonLetter != length) {
3605                ap.minimumPasswordNonLetter = length;
3606                saveSettingsLocked(mInjector.userHandleGetCallingUserId());
3607            }
3608        }
3609    }
3610
3611    @Override
3612    public int getPasswordMinimumNonLetter(ComponentName who, int userHandle, boolean parent) {
3613        if (!mHasFeature) {
3614            return 0;
3615        }
3616        enforceFullCrossUsersPermission(userHandle);
3617        synchronized (this) {
3618            int length = 0;
3619
3620            if (who != null) {
3621                ActiveAdmin admin = getActiveAdminUncheckedLocked(who, userHandle, parent);
3622                return admin != null ? admin.minimumPasswordNonLetter : length;
3623            }
3624
3625            // Return the strictest policy across all participating admins.
3626            List<ActiveAdmin> admins =
3627                    getActiveAdminsForLockscreenPoliciesLocked(userHandle, parent);
3628            final int N = admins.size();
3629            for (int i = 0; i < N; i++) {
3630                ActiveAdmin admin = admins.get(i);
3631                if (!isLimitPasswordAllowed(admin, PASSWORD_QUALITY_COMPLEX)) {
3632                    continue;
3633                }
3634                if (length < admin.minimumPasswordNonLetter) {
3635                    length = admin.minimumPasswordNonLetter;
3636                }
3637            }
3638            return length;
3639        }
3640    }
3641
3642    @Override
3643    public boolean isActivePasswordSufficient(int userHandle, boolean parent) {
3644        if (!mHasFeature) {
3645            return true;
3646        }
3647        enforceFullCrossUsersPermission(userHandle);
3648
3649        synchronized (this) {
3650            // This API can only be called by an active device admin,
3651            // so try to retrieve it to check that the caller is one.
3652            getActiveAdminForCallerLocked(null, DeviceAdminInfo.USES_POLICY_LIMIT_PASSWORD, parent);
3653            DevicePolicyData policy = getUserDataUnchecked(getCredentialOwner(userHandle, parent));
3654            return isActivePasswordSufficientForUserLocked(policy, userHandle, parent);
3655        }
3656    }
3657
3658    @Override
3659    public boolean isProfileActivePasswordSufficientForParent(int userHandle) {
3660        if (!mHasFeature) {
3661            return true;
3662        }
3663        enforceFullCrossUsersPermission(userHandle);
3664        enforceManagedProfile(userHandle, "call APIs refering to the parent profile");
3665
3666        synchronized (this) {
3667            int targetUser = getProfileParentId(userHandle);
3668            DevicePolicyData policy = getUserDataUnchecked(getCredentialOwner(userHandle, false));
3669            return isActivePasswordSufficientForUserLocked(policy, targetUser, false);
3670        }
3671    }
3672
3673    private boolean isActivePasswordSufficientForUserLocked(
3674            DevicePolicyData policy, int userHandle, boolean parent) {
3675        if (policy.mActivePasswordQuality < getPasswordQuality(null, userHandle, parent)
3676                || policy.mActivePasswordLength < getPasswordMinimumLength(
3677                        null, userHandle, parent)) {
3678            return false;
3679        }
3680        if (policy.mActivePasswordQuality != DevicePolicyManager.PASSWORD_QUALITY_COMPLEX) {
3681            return true;
3682        }
3683        return policy.mActivePasswordUpperCase >= getPasswordMinimumUpperCase(
3684                    null, userHandle, parent)
3685                && policy.mActivePasswordLowerCase >= getPasswordMinimumLowerCase(
3686                        null, userHandle, parent)
3687                && policy.mActivePasswordLetters >= getPasswordMinimumLetters(
3688                        null, userHandle, parent)
3689                && policy.mActivePasswordNumeric >= getPasswordMinimumNumeric(
3690                        null, userHandle, parent)
3691                && policy.mActivePasswordSymbols >= getPasswordMinimumSymbols(
3692                        null, userHandle, parent)
3693                && policy.mActivePasswordNonLetter >= getPasswordMinimumNonLetter(
3694                        null, userHandle, parent);
3695    }
3696
3697    @Override
3698    public int getCurrentFailedPasswordAttempts(int userHandle, boolean parent) {
3699        enforceFullCrossUsersPermission(userHandle);
3700        synchronized (this) {
3701            if (!isCallerWithSystemUid()) {
3702                // This API can only be called by an active device admin,
3703                // so try to retrieve it to check that the caller is one.
3704                getActiveAdminForCallerLocked(
3705                        null, DeviceAdminInfo.USES_POLICY_WATCH_LOGIN, parent);
3706            }
3707
3708            DevicePolicyData policy = getUserDataUnchecked(getCredentialOwner(userHandle, parent));
3709
3710            return policy.mFailedPasswordAttempts;
3711        }
3712    }
3713
3714    @Override
3715    public void setMaximumFailedPasswordsForWipe(ComponentName who, int num, boolean parent) {
3716        if (!mHasFeature) {
3717            return;
3718        }
3719        Preconditions.checkNotNull(who, "ComponentName is null");
3720        synchronized (this) {
3721            // This API can only be called by an active device admin,
3722            // so try to retrieve it to check that the caller is one.
3723            getActiveAdminForCallerLocked(
3724                    who, DeviceAdminInfo.USES_POLICY_WIPE_DATA, parent);
3725            ActiveAdmin ap = getActiveAdminForCallerLocked(
3726                    who, DeviceAdminInfo.USES_POLICY_WATCH_LOGIN, parent);
3727            if (ap.maximumFailedPasswordsForWipe != num) {
3728                ap.maximumFailedPasswordsForWipe = num;
3729                saveSettingsLocked(mInjector.userHandleGetCallingUserId());
3730            }
3731        }
3732    }
3733
3734    @Override
3735    public int getMaximumFailedPasswordsForWipe(ComponentName who, int userHandle, boolean parent) {
3736        if (!mHasFeature) {
3737            return 0;
3738        }
3739        enforceFullCrossUsersPermission(userHandle);
3740        synchronized (this) {
3741            ActiveAdmin admin = (who != null)
3742                    ? getActiveAdminUncheckedLocked(who, userHandle, parent)
3743                    : getAdminWithMinimumFailedPasswordsForWipeLocked(userHandle, parent);
3744            return admin != null ? admin.maximumFailedPasswordsForWipe : 0;
3745        }
3746    }
3747
3748    @Override
3749    public int getProfileWithMinimumFailedPasswordsForWipe(int userHandle, boolean parent) {
3750        if (!mHasFeature) {
3751            return UserHandle.USER_NULL;
3752        }
3753        enforceFullCrossUsersPermission(userHandle);
3754        synchronized (this) {
3755            ActiveAdmin admin = getAdminWithMinimumFailedPasswordsForWipeLocked(
3756                    userHandle, parent);
3757            return admin != null ? admin.getUserHandle().getIdentifier() : UserHandle.USER_NULL;
3758        }
3759    }
3760
3761    /**
3762     * Returns the admin with the strictest policy on maximum failed passwords for:
3763     * <ul>
3764     *   <li>this user if it has a separate profile challenge, or
3765     *   <li>this user and all profiles that don't have their own challenge otherwise.
3766     * </ul>
3767     * <p>If the policy for the primary and any other profile are equal, it returns the admin for
3768     * the primary profile.
3769     * Returns {@code null} if no participating admin has that policy set.
3770     */
3771    private ActiveAdmin getAdminWithMinimumFailedPasswordsForWipeLocked(
3772            int userHandle, boolean parent) {
3773        int count = 0;
3774        ActiveAdmin strictestAdmin = null;
3775
3776        // Return the strictest policy across all participating admins.
3777        List<ActiveAdmin> admins = getActiveAdminsForLockscreenPoliciesLocked(userHandle, parent);
3778        final int N = admins.size();
3779        for (int i = 0; i < N; i++) {
3780            ActiveAdmin admin = admins.get(i);
3781            if (admin.maximumFailedPasswordsForWipe ==
3782                    ActiveAdmin.DEF_MAXIMUM_FAILED_PASSWORDS_FOR_WIPE) {
3783                continue;  // No max number of failed passwords policy set for this profile.
3784            }
3785
3786            // We always favor the primary profile if several profiles have the same value set.
3787            int userId = admin.getUserHandle().getIdentifier();
3788            if (count == 0 ||
3789                    count > admin.maximumFailedPasswordsForWipe ||
3790                    (count == admin.maximumFailedPasswordsForWipe &&
3791                            getUserInfo(userId).isPrimary())) {
3792                count = admin.maximumFailedPasswordsForWipe;
3793                strictestAdmin = admin;
3794            }
3795        }
3796        return strictestAdmin;
3797    }
3798
3799    private UserInfo getUserInfo(@UserIdInt int userId) {
3800        final long token = mInjector.binderClearCallingIdentity();
3801        try {
3802            return mUserManager.getUserInfo(userId);
3803        } finally {
3804            mInjector.binderRestoreCallingIdentity(token);
3805        }
3806    }
3807
3808    @Override
3809    public boolean resetPassword(String passwordOrNull, int flags) throws RemoteException {
3810        if (!mHasFeature) {
3811            return false;
3812        }
3813        final int callingUid = mInjector.binderGetCallingUid();
3814        final int userHandle = mInjector.userHandleGetCallingUserId();
3815
3816        String password = passwordOrNull != null ? passwordOrNull : "";
3817
3818        // Password resetting to empty/null is not allowed for managed profiles.
3819        if (TextUtils.isEmpty(password)) {
3820            enforceNotManagedProfile(userHandle, "clear the active password");
3821        }
3822
3823        int quality;
3824        synchronized (this) {
3825            // If caller has PO (or DO) it can change the password, so see if that's the case first.
3826            ActiveAdmin admin = getActiveAdminWithPolicyForUidLocked(
3827                    null, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER, callingUid);
3828            final boolean preN;
3829            if (admin != null) {
3830                preN = getTargetSdk(admin.info.getPackageName(),
3831                        userHandle) <= android.os.Build.VERSION_CODES.M;
3832            } else {
3833                // Otherwise, make sure the caller has any active admin with the right policy.
3834                admin = getActiveAdminForCallerLocked(null,
3835                        DeviceAdminInfo.USES_POLICY_RESET_PASSWORD);
3836                preN = getTargetSdk(admin.info.getPackageName(),
3837                        userHandle) <= android.os.Build.VERSION_CODES.M;
3838
3839                // As of N, password resetting to empty/null is not allowed anymore.
3840                // TODO Should we allow DO/PO to set an empty password?
3841                if (TextUtils.isEmpty(password)) {
3842                    if (!preN) {
3843                        throw new SecurityException("Cannot call with null password");
3844                    } else {
3845                        Slog.e(LOG_TAG, "Cannot call with null password");
3846                        return false;
3847                    }
3848                }
3849                // As of N, password cannot be changed by the admin if it is already set.
3850                if (isLockScreenSecureUnchecked(userHandle)) {
3851                    if (!preN) {
3852                        throw new SecurityException("Admin cannot change current password");
3853                    } else {
3854                        Slog.e(LOG_TAG, "Admin cannot change current password");
3855                        return false;
3856                    }
3857                }
3858            }
3859            // Do not allow to reset password when current user has a managed profile
3860            if (!isManagedProfile(userHandle)) {
3861                for (UserInfo userInfo : mUserManager.getProfiles(userHandle)) {
3862                    if (userInfo.isManagedProfile()) {
3863                        if (!preN) {
3864                            throw new IllegalStateException(
3865                                    "Cannot reset password on user has managed profile");
3866                        } else {
3867                            Slog.e(LOG_TAG, "Cannot reset password on user has managed profile");
3868                            return false;
3869                        }
3870                    }
3871                }
3872            }
3873            // Do not allow to reset password when user is locked
3874            if (!mUserManager.isUserUnlocked(userHandle)) {
3875                if (!preN) {
3876                    throw new IllegalStateException("Cannot reset password when user is locked");
3877                } else {
3878                    Slog.e(LOG_TAG, "Cannot reset password when user is locked");
3879                    return false;
3880                }
3881            }
3882
3883            quality = getPasswordQuality(null, userHandle, /* parent */ false);
3884            if (quality == DevicePolicyManager.PASSWORD_QUALITY_MANAGED) {
3885                quality = DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED;
3886            }
3887            if (quality != DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED) {
3888                int realQuality = LockPatternUtils.computePasswordQuality(password);
3889                if (realQuality < quality
3890                        && quality != DevicePolicyManager.PASSWORD_QUALITY_COMPLEX) {
3891                    Slog.w(LOG_TAG, "resetPassword: password quality 0x"
3892                            + Integer.toHexString(realQuality)
3893                            + " does not meet required quality 0x"
3894                            + Integer.toHexString(quality));
3895                    return false;
3896                }
3897                quality = Math.max(realQuality, quality);
3898            }
3899            int length = getPasswordMinimumLength(null, userHandle, /* parent */ false);
3900            if (password.length() < length) {
3901                Slog.w(LOG_TAG, "resetPassword: password length " + password.length()
3902                        + " does not meet required length " + length);
3903                return false;
3904            }
3905            if (quality == DevicePolicyManager.PASSWORD_QUALITY_COMPLEX) {
3906                int letters = 0;
3907                int uppercase = 0;
3908                int lowercase = 0;
3909                int numbers = 0;
3910                int symbols = 0;
3911                int nonletter = 0;
3912                for (int i = 0; i < password.length(); i++) {
3913                    char c = password.charAt(i);
3914                    if (c >= 'A' && c <= 'Z') {
3915                        letters++;
3916                        uppercase++;
3917                    } else if (c >= 'a' && c <= 'z') {
3918                        letters++;
3919                        lowercase++;
3920                    } else if (c >= '0' && c <= '9') {
3921                        numbers++;
3922                        nonletter++;
3923                    } else {
3924                        symbols++;
3925                        nonletter++;
3926                    }
3927                }
3928                int neededLetters = getPasswordMinimumLetters(null, userHandle, /* parent */ false);
3929                if(letters < neededLetters) {
3930                    Slog.w(LOG_TAG, "resetPassword: number of letters " + letters
3931                            + " does not meet required number of letters " + neededLetters);
3932                    return false;
3933                }
3934                int neededNumbers = getPasswordMinimumNumeric(null, userHandle, /* parent */ false);
3935                if (numbers < neededNumbers) {
3936                    Slog.w(LOG_TAG, "resetPassword: number of numerical digits " + numbers
3937                            + " does not meet required number of numerical digits "
3938                            + neededNumbers);
3939                    return false;
3940                }
3941                int neededLowerCase = getPasswordMinimumLowerCase(
3942                        null, userHandle, /* parent */ false);
3943                if (lowercase < neededLowerCase) {
3944                    Slog.w(LOG_TAG, "resetPassword: number of lowercase letters " + lowercase
3945                            + " does not meet required number of lowercase letters "
3946                            + neededLowerCase);
3947                    return false;
3948                }
3949                int neededUpperCase = getPasswordMinimumUpperCase(
3950                        null, userHandle, /* parent */ false);
3951                if (uppercase < neededUpperCase) {
3952                    Slog.w(LOG_TAG, "resetPassword: number of uppercase letters " + uppercase
3953                            + " does not meet required number of uppercase letters "
3954                            + neededUpperCase);
3955                    return false;
3956                }
3957                int neededSymbols = getPasswordMinimumSymbols(null, userHandle, /* parent */ false);
3958                if (symbols < neededSymbols) {
3959                    Slog.w(LOG_TAG, "resetPassword: number of special symbols " + symbols
3960                            + " does not meet required number of special symbols " + neededSymbols);
3961                    return false;
3962                }
3963                int neededNonLetter = getPasswordMinimumNonLetter(
3964                        null, userHandle, /* parent */ false);
3965                if (nonletter < neededNonLetter) {
3966                    Slog.w(LOG_TAG, "resetPassword: number of non-letter characters " + nonletter
3967                            + " does not meet required number of non-letter characters "
3968                            + neededNonLetter);
3969                    return false;
3970                }
3971            }
3972        }
3973
3974        DevicePolicyData policy = getUserData(userHandle);
3975        if (policy.mPasswordOwner >= 0 && policy.mPasswordOwner != callingUid) {
3976            Slog.w(LOG_TAG, "resetPassword: already set by another uid and not entered by user");
3977            return false;
3978        }
3979
3980        boolean callerIsDeviceOwnerAdmin = isCallerDeviceOwner(callingUid);
3981        boolean doNotAskCredentialsOnBoot =
3982                (flags & DevicePolicyManager.RESET_PASSWORD_DO_NOT_ASK_CREDENTIALS_ON_BOOT) != 0;
3983        if (callerIsDeviceOwnerAdmin && doNotAskCredentialsOnBoot) {
3984            setDoNotAskCredentialsOnBoot();
3985        }
3986
3987        // Don't do this with the lock held, because it is going to call
3988        // back in to the service.
3989        final long ident = mInjector.binderClearCallingIdentity();
3990        try {
3991            if (!TextUtils.isEmpty(password)) {
3992                mLockPatternUtils.saveLockPassword(password, null, quality, userHandle);
3993            } else {
3994                mLockPatternUtils.clearLock(userHandle);
3995            }
3996            boolean requireEntry = (flags & DevicePolicyManager.RESET_PASSWORD_REQUIRE_ENTRY) != 0;
3997            if (requireEntry) {
3998                mLockPatternUtils.requireStrongAuth(STRONG_AUTH_REQUIRED_AFTER_DPM_LOCK_NOW,
3999                        UserHandle.USER_ALL);
4000            }
4001            synchronized (this) {
4002                int newOwner = requireEntry ? callingUid : -1;
4003                if (policy.mPasswordOwner != newOwner) {
4004                    policy.mPasswordOwner = newOwner;
4005                    saveSettingsLocked(userHandle);
4006                }
4007            }
4008        } finally {
4009            mInjector.binderRestoreCallingIdentity(ident);
4010        }
4011
4012        return true;
4013    }
4014
4015    private boolean isLockScreenSecureUnchecked(int userId) {
4016        long ident = mInjector.binderClearCallingIdentity();
4017        try {
4018            return mLockPatternUtils.isSecure(userId);
4019        } finally {
4020            mInjector.binderRestoreCallingIdentity(ident);
4021        }
4022    }
4023
4024    private void setDoNotAskCredentialsOnBoot() {
4025        synchronized (this) {
4026            DevicePolicyData policyData = getUserData(UserHandle.USER_SYSTEM);
4027            if (!policyData.doNotAskCredentialsOnBoot) {
4028                policyData.doNotAskCredentialsOnBoot = true;
4029                saveSettingsLocked(UserHandle.USER_SYSTEM);
4030            }
4031        }
4032    }
4033
4034    @Override
4035    public boolean getDoNotAskCredentialsOnBoot() {
4036        mContext.enforceCallingOrSelfPermission(
4037                android.Manifest.permission.QUERY_DO_NOT_ASK_CREDENTIALS_ON_BOOT, null);
4038        synchronized (this) {
4039            DevicePolicyData policyData = getUserData(UserHandle.USER_SYSTEM);
4040            return policyData.doNotAskCredentialsOnBoot;
4041        }
4042    }
4043
4044    @Override
4045    public void setMaximumTimeToLock(ComponentName who, long timeMs, boolean parent) {
4046        if (!mHasFeature) {
4047            return;
4048        }
4049        Preconditions.checkNotNull(who, "ComponentName is null");
4050        final int userHandle = mInjector.userHandleGetCallingUserId();
4051        synchronized (this) {
4052            ActiveAdmin ap = getActiveAdminForCallerLocked(
4053                    who, DeviceAdminInfo.USES_POLICY_FORCE_LOCK, parent);
4054            if (ap.maximumTimeToUnlock != timeMs) {
4055                ap.maximumTimeToUnlock = timeMs;
4056                saveSettingsLocked(userHandle);
4057                updateMaximumTimeToLockLocked(userHandle);
4058            }
4059        }
4060    }
4061
4062    void updateMaximumTimeToLockLocked(int userHandle) {
4063        // Calculate the min timeout for all profiles - including the ones with a separate
4064        // challenge. Ideally if the timeout only affected the profile challenge we'd lock that
4065        // challenge only and keep the screen on. However there is no easy way of doing that at the
4066        // moment so we set the screen off timeout regardless of whether it affects the parent user
4067        // or the profile challenge only.
4068        long timeMs = Long.MAX_VALUE;
4069        int[] profileIds = mUserManager.getProfileIdsWithDisabled(userHandle);
4070        for (int profileId : profileIds) {
4071            DevicePolicyData policy = getUserDataUnchecked(profileId);
4072            final int N = policy.mAdminList.size();
4073            for (int i = 0; i < N; i++) {
4074                ActiveAdmin admin = policy.mAdminList.get(i);
4075                if (admin.maximumTimeToUnlock > 0
4076                        && timeMs > admin.maximumTimeToUnlock) {
4077                    timeMs = admin.maximumTimeToUnlock;
4078                }
4079                // If userInfo.id is a managed profile, we also need to look at
4080                // the policies set on the parent.
4081                if (admin.hasParentActiveAdmin()) {
4082                    final ActiveAdmin parentAdmin = admin.getParentActiveAdmin();
4083                    if (parentAdmin.maximumTimeToUnlock > 0
4084                            && timeMs > parentAdmin.maximumTimeToUnlock) {
4085                        timeMs = parentAdmin.maximumTimeToUnlock;
4086                    }
4087                }
4088            }
4089        }
4090
4091        // We only store the last maximum time to lock on the parent profile. So if calling from a
4092        // managed profile, retrieve the policy for the parent.
4093        DevicePolicyData policy = getUserDataUnchecked(getProfileParentId(userHandle));
4094        if (policy.mLastMaximumTimeToLock == timeMs) {
4095            return;
4096        }
4097        policy.mLastMaximumTimeToLock = timeMs;
4098
4099        final long ident = mInjector.binderClearCallingIdentity();
4100        try {
4101            if (policy.mLastMaximumTimeToLock != Long.MAX_VALUE) {
4102                // Make sure KEEP_SCREEN_ON is disabled, since that
4103                // would allow bypassing of the maximum time to lock.
4104                mInjector.settingsGlobalPutInt(Settings.Global.STAY_ON_WHILE_PLUGGED_IN, 0);
4105            }
4106
4107            mInjector.getPowerManagerInternal().setMaximumScreenOffTimeoutFromDeviceAdmin(
4108                    (int) Math.min(policy.mLastMaximumTimeToLock, Integer.MAX_VALUE));
4109        } finally {
4110            mInjector.binderRestoreCallingIdentity(ident);
4111        }
4112    }
4113
4114    @Override
4115    public long getMaximumTimeToLock(ComponentName who, int userHandle, boolean parent) {
4116        if (!mHasFeature) {
4117            return 0;
4118        }
4119        enforceFullCrossUsersPermission(userHandle);
4120        synchronized (this) {
4121            if (who != null) {
4122                ActiveAdmin admin = getActiveAdminUncheckedLocked(who, userHandle, parent);
4123                return admin != null ? admin.maximumTimeToUnlock : 0;
4124            }
4125            // Return the strictest policy across all participating admins.
4126            List<ActiveAdmin> admins = getActiveAdminsForLockscreenPoliciesLocked(
4127                    userHandle, parent);
4128            return getMaximumTimeToLockPolicyFromAdmins(admins);
4129        }
4130    }
4131
4132    @Override
4133    public long getMaximumTimeToLockForUserAndProfiles(int userHandle) {
4134        if (!mHasFeature) {
4135            return 0;
4136        }
4137        enforceFullCrossUsersPermission(userHandle);
4138        synchronized (this) {
4139            // All admins for this user.
4140            ArrayList<ActiveAdmin> admins = new ArrayList<ActiveAdmin>();
4141            for (UserInfo userInfo : mUserManager.getProfiles(userHandle)) {
4142                DevicePolicyData policy = getUserData(userInfo.id);
4143                admins.addAll(policy.mAdminList);
4144                // If it is a managed profile, it may have parent active admins
4145                if (userInfo.isManagedProfile()) {
4146                    for (ActiveAdmin admin : policy.mAdminList) {
4147                        if (admin.hasParentActiveAdmin()) {
4148                            admins.add(admin.getParentActiveAdmin());
4149                        }
4150                    }
4151                }
4152            }
4153            return getMaximumTimeToLockPolicyFromAdmins(admins);
4154        }
4155    }
4156
4157    private long getMaximumTimeToLockPolicyFromAdmins(List<ActiveAdmin> admins) {
4158        long time = 0;
4159        final int N = admins.size();
4160        for (int i = 0; i < N; i++) {
4161            ActiveAdmin admin = admins.get(i);
4162            if (time == 0) {
4163                time = admin.maximumTimeToUnlock;
4164            } else if (admin.maximumTimeToUnlock != 0
4165                    && time > admin.maximumTimeToUnlock) {
4166                time = admin.maximumTimeToUnlock;
4167            }
4168        }
4169        return time;
4170    }
4171
4172    @Override
4173    public void lockNow(boolean parent) {
4174        if (!mHasFeature) {
4175            return;
4176        }
4177        synchronized (this) {
4178            // This API can only be called by an active device admin,
4179            // so try to retrieve it to check that the caller is one.
4180            getActiveAdminForCallerLocked(
4181                    null, DeviceAdminInfo.USES_POLICY_FORCE_LOCK, parent);
4182
4183            int userToLock = mInjector.userHandleGetCallingUserId();
4184
4185            // Unless this is a managed profile with work challenge enabled, lock all users.
4186            if (parent || !isSeparateProfileChallengeEnabled(userToLock)) {
4187                userToLock = UserHandle.USER_ALL;
4188            }
4189            final long ident = mInjector.binderClearCallingIdentity();
4190            try {
4191                mLockPatternUtils.requireStrongAuth(
4192                        STRONG_AUTH_REQUIRED_AFTER_DPM_LOCK_NOW, userToLock);
4193                if (userToLock == UserHandle.USER_ALL) {
4194                    // Power off the display
4195                    mInjector.powerManagerGoToSleep(SystemClock.uptimeMillis(),
4196                            PowerManager.GO_TO_SLEEP_REASON_DEVICE_ADMIN, 0);
4197                    mInjector.getIWindowManager().lockNow(null);
4198                }
4199            } catch (RemoteException e) {
4200            } finally {
4201                mInjector.binderRestoreCallingIdentity(ident);
4202            }
4203        }
4204    }
4205
4206    @Override
4207    public void enforceCanManageCaCerts(ComponentName who) {
4208        if (who == null) {
4209            if (!isCallerDelegatedCertInstaller()) {
4210                mContext.enforceCallingOrSelfPermission(MANAGE_CA_CERTIFICATES, null);
4211            }
4212        } else {
4213            synchronized (this) {
4214                getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
4215            }
4216        }
4217    }
4218
4219    private void enforceCanManageInstalledKeys(ComponentName who) {
4220        if (who == null) {
4221            if (!isCallerDelegatedCertInstaller()) {
4222                throw new SecurityException("who == null, but caller is not cert installer");
4223            }
4224        } else {
4225            synchronized (this) {
4226                getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
4227            }
4228        }
4229    }
4230
4231    private boolean isCallerDelegatedCertInstaller() {
4232        final int callingUid = mInjector.binderGetCallingUid();
4233        final int userHandle = UserHandle.getUserId(callingUid);
4234        synchronized (this) {
4235            final DevicePolicyData policy = getUserData(userHandle);
4236            if (policy.mDelegatedCertInstallerPackage == null) {
4237                return false;
4238            }
4239
4240            try {
4241                int uid = mContext.getPackageManager().getPackageUidAsUser(
4242                        policy.mDelegatedCertInstallerPackage, userHandle);
4243                return uid == callingUid;
4244            } catch (NameNotFoundException e) {
4245                return false;
4246            }
4247        }
4248    }
4249
4250    @Override
4251    public boolean approveCaCert(String alias, int userId, boolean approval) {
4252        enforceManageUsers();
4253        synchronized (this) {
4254            Set<String> certs = getUserData(userId).mAcceptedCaCertificates;
4255            boolean changed = (approval ? certs.add(alias) : certs.remove(alias));
4256            if (!changed) {
4257                return false;
4258            }
4259            saveSettingsLocked(userId);
4260        }
4261        new MonitoringCertNotificationTask().execute(userId);
4262        return true;
4263    }
4264
4265    @Override
4266    public boolean isCaCertApproved(String alias, int userId) {
4267        enforceManageUsers();
4268        synchronized (this) {
4269            return getUserData(userId).mAcceptedCaCertificates.contains(alias);
4270        }
4271    }
4272
4273    private void removeCaApprovalsIfNeeded(int userId) {
4274        for (UserInfo userInfo : mUserManager.getProfiles(userId)) {
4275            boolean isSecure = mLockPatternUtils.isSecure(userInfo.id);
4276            if (userInfo.isManagedProfile()){
4277                isSecure |= mLockPatternUtils.isSecure(getProfileParentId(userInfo.id));
4278            }
4279            if (!isSecure) {
4280                synchronized (this) {
4281                    getUserData(userInfo.id).mAcceptedCaCertificates.clear();
4282                    saveSettingsLocked(userInfo.id);
4283                }
4284
4285                new MonitoringCertNotificationTask().execute(userInfo.id);
4286            }
4287        }
4288    }
4289
4290    @Override
4291    public boolean installCaCert(ComponentName admin, byte[] certBuffer) throws RemoteException {
4292        enforceCanManageCaCerts(admin);
4293
4294        byte[] pemCert;
4295        try {
4296            X509Certificate cert = parseCert(certBuffer);
4297            pemCert = Credentials.convertToPem(cert);
4298        } catch (CertificateException ce) {
4299            Log.e(LOG_TAG, "Problem converting cert", ce);
4300            return false;
4301        } catch (IOException ioe) {
4302            Log.e(LOG_TAG, "Problem reading cert", ioe);
4303            return false;
4304        }
4305
4306        final UserHandle userHandle = new UserHandle(UserHandle.getCallingUserId());
4307        final long id = mInjector.binderClearCallingIdentity();
4308        try {
4309            final KeyChainConnection keyChainConnection = KeyChain.bindAsUser(mContext, userHandle);
4310            try {
4311                keyChainConnection.getService().installCaCertificate(pemCert);
4312                return true;
4313            } catch (RemoteException e) {
4314                Log.e(LOG_TAG, "installCaCertsToKeyChain(): ", e);
4315            } finally {
4316                keyChainConnection.close();
4317            }
4318        } catch (InterruptedException e1) {
4319            Log.w(LOG_TAG, "installCaCertsToKeyChain(): ", e1);
4320            Thread.currentThread().interrupt();
4321        } finally {
4322            mInjector.binderRestoreCallingIdentity(id);
4323        }
4324        return false;
4325    }
4326
4327    private static X509Certificate parseCert(byte[] certBuffer) throws CertificateException {
4328        CertificateFactory certFactory = CertificateFactory.getInstance("X.509");
4329        return (X509Certificate) certFactory.generateCertificate(new ByteArrayInputStream(
4330                certBuffer));
4331    }
4332
4333    @Override
4334    public void uninstallCaCerts(ComponentName admin, String[] aliases) {
4335        enforceCanManageCaCerts(admin);
4336
4337        final UserHandle userHandle = new UserHandle(UserHandle.getCallingUserId());
4338        final long id = mInjector.binderClearCallingIdentity();
4339        try {
4340            final KeyChainConnection keyChainConnection = KeyChain.bindAsUser(mContext, userHandle);
4341            try {
4342                for (int i = 0 ; i < aliases.length; i++) {
4343                    keyChainConnection.getService().deleteCaCertificate(aliases[i]);
4344                }
4345            } catch (RemoteException e) {
4346                Log.e(LOG_TAG, "from CaCertUninstaller: ", e);
4347            } finally {
4348                keyChainConnection.close();
4349            }
4350        } catch (InterruptedException ie) {
4351            Log.w(LOG_TAG, "CaCertUninstaller: ", ie);
4352            Thread.currentThread().interrupt();
4353        } finally {
4354            mInjector.binderRestoreCallingIdentity(id);
4355        }
4356    }
4357
4358    @Override
4359    public boolean installKeyPair(ComponentName who, byte[] privKey, byte[] cert, byte[] chain,
4360            String alias, boolean requestAccess) {
4361        enforceCanManageInstalledKeys(who);
4362
4363        final int callingUid = mInjector.binderGetCallingUid();
4364        final long id = mInjector.binderClearCallingIdentity();
4365        try {
4366            final KeyChainConnection keyChainConnection =
4367                    KeyChain.bindAsUser(mContext, UserHandle.getUserHandleForUid(callingUid));
4368            try {
4369                IKeyChainService keyChain = keyChainConnection.getService();
4370                if (!keyChain.installKeyPair(privKey, cert, chain, alias)) {
4371                    return false;
4372                }
4373                if (requestAccess) {
4374                    keyChain.setGrant(callingUid, alias, true);
4375                }
4376                return true;
4377            } catch (RemoteException e) {
4378                Log.e(LOG_TAG, "Installing certificate", e);
4379            } finally {
4380                keyChainConnection.close();
4381            }
4382        } catch (InterruptedException e) {
4383            Log.w(LOG_TAG, "Interrupted while installing certificate", e);
4384            Thread.currentThread().interrupt();
4385        } finally {
4386            mInjector.binderRestoreCallingIdentity(id);
4387        }
4388        return false;
4389    }
4390
4391    @Override
4392    public boolean removeKeyPair(ComponentName who, String alias) {
4393        enforceCanManageInstalledKeys(who);
4394
4395        final UserHandle userHandle = new UserHandle(UserHandle.getCallingUserId());
4396        final long id = Binder.clearCallingIdentity();
4397        try {
4398            final KeyChainConnection keyChainConnection = KeyChain.bindAsUser(mContext, userHandle);
4399            try {
4400                IKeyChainService keyChain = keyChainConnection.getService();
4401                return keyChain.removeKeyPair(alias);
4402            } catch (RemoteException e) {
4403                Log.e(LOG_TAG, "Removing keypair", e);
4404            } finally {
4405                keyChainConnection.close();
4406            }
4407        } catch (InterruptedException e) {
4408            Log.w(LOG_TAG, "Interrupted while removing keypair", e);
4409            Thread.currentThread().interrupt();
4410        } finally {
4411            Binder.restoreCallingIdentity(id);
4412        }
4413        return false;
4414    }
4415
4416    @Override
4417    public void choosePrivateKeyAlias(final int uid, final Uri uri, final String alias,
4418            final IBinder response) {
4419        // Caller UID needs to be trusted, so we restrict this method to SYSTEM_UID callers.
4420        if (!isCallerWithSystemUid()) {
4421            return;
4422        }
4423
4424        final UserHandle caller = mInjector.binderGetCallingUserHandle();
4425        // If there is a profile owner, redirect to that; otherwise query the device owner.
4426        ComponentName aliasChooser = getProfileOwner(caller.getIdentifier());
4427        if (aliasChooser == null && caller.isSystem()) {
4428            ActiveAdmin deviceOwnerAdmin = getDeviceOwnerAdminLocked();
4429            if (deviceOwnerAdmin != null) {
4430                aliasChooser = deviceOwnerAdmin.info.getComponent();
4431            }
4432        }
4433        if (aliasChooser == null) {
4434            sendPrivateKeyAliasResponse(null, response);
4435            return;
4436        }
4437
4438        Intent intent = new Intent(DeviceAdminReceiver.ACTION_CHOOSE_PRIVATE_KEY_ALIAS);
4439        intent.setComponent(aliasChooser);
4440        intent.putExtra(DeviceAdminReceiver.EXTRA_CHOOSE_PRIVATE_KEY_SENDER_UID, uid);
4441        intent.putExtra(DeviceAdminReceiver.EXTRA_CHOOSE_PRIVATE_KEY_URI, uri);
4442        intent.putExtra(DeviceAdminReceiver.EXTRA_CHOOSE_PRIVATE_KEY_ALIAS, alias);
4443        intent.putExtra(DeviceAdminReceiver.EXTRA_CHOOSE_PRIVATE_KEY_RESPONSE, response);
4444        intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
4445
4446        final long id = mInjector.binderClearCallingIdentity();
4447        try {
4448            mContext.sendOrderedBroadcastAsUser(intent, caller, null, new BroadcastReceiver() {
4449                @Override
4450                public void onReceive(Context context, Intent intent) {
4451                    final String chosenAlias = getResultData();
4452                    sendPrivateKeyAliasResponse(chosenAlias, response);
4453                }
4454            }, null, Activity.RESULT_OK, null, null);
4455        } finally {
4456            mInjector.binderRestoreCallingIdentity(id);
4457        }
4458    }
4459
4460    private void sendPrivateKeyAliasResponse(final String alias, final IBinder responseBinder) {
4461        final IKeyChainAliasCallback keyChainAliasResponse =
4462                IKeyChainAliasCallback.Stub.asInterface(responseBinder);
4463        new AsyncTask<Void, Void, Void>() {
4464            @Override
4465            protected Void doInBackground(Void... unused) {
4466                try {
4467                    keyChainAliasResponse.alias(alias);
4468                } catch (Exception e) {
4469                    // Catch everything (not just RemoteException): caller could throw a
4470                    // RuntimeException back across processes.
4471                    Log.e(LOG_TAG, "error while responding to callback", e);
4472                }
4473                return null;
4474            }
4475        }.execute();
4476    }
4477
4478    @Override
4479    public void setCertInstallerPackage(ComponentName who, String installerPackage)
4480            throws SecurityException {
4481        int userHandle = UserHandle.getCallingUserId();
4482        synchronized (this) {
4483            getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
4484            if (getTargetSdk(who.getPackageName(), userHandle) >= Build.VERSION_CODES.N) {
4485                if (installerPackage != null &&
4486                        !isPackageInstalledForUser(installerPackage, userHandle)) {
4487                    throw new IllegalArgumentException("Package " + installerPackage
4488                            + " is not installed on the current user");
4489                }
4490            }
4491            DevicePolicyData policy = getUserData(userHandle);
4492            policy.mDelegatedCertInstallerPackage = installerPackage;
4493            saveSettingsLocked(userHandle);
4494        }
4495    }
4496
4497    @Override
4498    public String getCertInstallerPackage(ComponentName who) throws SecurityException {
4499        int userHandle = UserHandle.getCallingUserId();
4500        synchronized (this) {
4501            getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
4502            DevicePolicyData policy = getUserData(userHandle);
4503            return policy.mDelegatedCertInstallerPackage;
4504        }
4505    }
4506
4507    /**
4508     * @return {@code true} if the package is installed and set as always-on, {@code false} if it is
4509     * not installed and therefore not available.
4510     *
4511     * @throws SecurityException if the caller is not a profile or device owner.
4512     * @throws UnsupportedException if the package does not support being set as always-on.
4513     */
4514    @Override
4515    public boolean setAlwaysOnVpnPackage(ComponentName admin, String vpnPackage, boolean lockdown)
4516            throws SecurityException {
4517        synchronized (this) {
4518            getActiveAdminForCallerLocked(admin, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
4519        }
4520
4521        final int userId = mInjector.userHandleGetCallingUserId();
4522        final long token = mInjector.binderClearCallingIdentity();
4523        try {
4524            if (vpnPackage != null && !isPackageInstalledForUser(vpnPackage, userId)) {
4525                return false;
4526            }
4527            ConnectivityManager connectivityManager = (ConnectivityManager)
4528                    mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
4529            if (!connectivityManager.setAlwaysOnVpnPackageForUser(userId, vpnPackage, lockdown)) {
4530                throw new UnsupportedOperationException();
4531            }
4532        } finally {
4533            mInjector.binderRestoreCallingIdentity(token);
4534        }
4535        return true;
4536    }
4537
4538    @Override
4539    public String getAlwaysOnVpnPackage(ComponentName admin)
4540            throws SecurityException {
4541        synchronized (this) {
4542            getActiveAdminForCallerLocked(admin, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
4543        }
4544
4545        final int userId = mInjector.userHandleGetCallingUserId();
4546        final long token = mInjector.binderClearCallingIdentity();
4547        try{
4548            ConnectivityManager connectivityManager = (ConnectivityManager)
4549                    mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
4550            return connectivityManager.getAlwaysOnVpnPackageForUser(userId);
4551        } finally {
4552            mInjector.binderRestoreCallingIdentity(token);
4553        }
4554    }
4555
4556    private void wipeDataLocked(boolean wipeExtRequested, String reason) {
4557        if (wipeExtRequested) {
4558            StorageManager sm = (StorageManager) mContext.getSystemService(
4559                    Context.STORAGE_SERVICE);
4560            sm.wipeAdoptableDisks();
4561        }
4562        try {
4563            RecoverySystem.rebootWipeUserData(mContext, reason);
4564        } catch (IOException | SecurityException e) {
4565            Slog.w(LOG_TAG, "Failed requesting data wipe", e);
4566        }
4567    }
4568
4569    @Override
4570    public void wipeData(int flags) {
4571        if (!mHasFeature) {
4572            return;
4573        }
4574        final int userHandle = mInjector.userHandleGetCallingUserId();
4575        enforceFullCrossUsersPermission(userHandle);
4576        synchronized (this) {
4577            // This API can only be called by an active device admin,
4578            // so try to retrieve it to check that the caller is one.
4579            final ActiveAdmin admin = getActiveAdminForCallerLocked(null,
4580                    DeviceAdminInfo.USES_POLICY_WIPE_DATA);
4581
4582            final String source = admin.info.getComponent().flattenToShortString();
4583
4584            long ident = mInjector.binderClearCallingIdentity();
4585            try {
4586                if ((flags & WIPE_RESET_PROTECTION_DATA) != 0) {
4587                    if (!isDeviceOwner(admin.info.getComponent(), userHandle)) {
4588                        throw new SecurityException(
4589                               "Only device owner admins can set WIPE_RESET_PROTECTION_DATA");
4590                    }
4591                    PersistentDataBlockManager manager = (PersistentDataBlockManager)
4592                            mContext.getSystemService(Context.PERSISTENT_DATA_BLOCK_SERVICE);
4593                    if (manager != null) {
4594                        manager.wipe();
4595                    }
4596                }
4597                boolean wipeExtRequested = (flags & WIPE_EXTERNAL_STORAGE) != 0;
4598                wipeDeviceOrUserLocked(wipeExtRequested, userHandle,
4599                        "DevicePolicyManager.wipeData() from " + source);
4600            } finally {
4601                mInjector.binderRestoreCallingIdentity(ident);
4602            }
4603        }
4604    }
4605
4606    private void wipeDeviceOrUserLocked(boolean wipeExtRequested, final int userHandle, String reason) {
4607        if (userHandle == UserHandle.USER_SYSTEM) {
4608            wipeDataLocked(wipeExtRequested, reason);
4609        } else {
4610            mHandler.post(new Runnable() {
4611                @Override
4612                public void run() {
4613                    try {
4614                        IActivityManager am = mInjector.getIActivityManager();
4615                        if (am.getCurrentUser().id == userHandle) {
4616                            am.switchUser(UserHandle.USER_SYSTEM);
4617                        }
4618
4619                        boolean isManagedProfile = isManagedProfile(userHandle);
4620                        if (!mUserManager.removeUser(userHandle)) {
4621                            Slog.w(LOG_TAG, "Couldn't remove user " + userHandle);
4622                        } else if (isManagedProfile) {
4623                            sendWipeProfileNotification();
4624                        }
4625                    } catch (RemoteException re) {
4626                        // Shouldn't happen
4627                    }
4628                }
4629            });
4630        }
4631    }
4632
4633    private void sendWipeProfileNotification() {
4634        String contentText = mContext.getString(R.string.work_profile_deleted_description_dpm_wipe);
4635        Notification notification = new Notification.Builder(mContext)
4636                .setSmallIcon(android.R.drawable.stat_sys_warning)
4637                .setContentTitle(mContext.getString(R.string.work_profile_deleted))
4638                .setContentText(contentText)
4639                .setColor(mContext.getColor(R.color.system_notification_accent_color))
4640                .setStyle(new Notification.BigTextStyle().bigText(contentText))
4641                .build();
4642        mInjector.getNotificationManager().notify(PROFILE_WIPED_NOTIFICATION_ID, notification);
4643    }
4644
4645    private void clearWipeProfileNotification() {
4646        mInjector.getNotificationManager().cancel(PROFILE_WIPED_NOTIFICATION_ID);
4647    }
4648
4649    @Override
4650    public void getRemoveWarning(ComponentName comp, final RemoteCallback result, int userHandle) {
4651        if (!mHasFeature) {
4652            return;
4653        }
4654        enforceFullCrossUsersPermission(userHandle);
4655        mContext.enforceCallingOrSelfPermission(
4656                android.Manifest.permission.BIND_DEVICE_ADMIN, null);
4657
4658        synchronized (this) {
4659            ActiveAdmin admin = getActiveAdminUncheckedLocked(comp, userHandle);
4660            if (admin == null) {
4661                result.sendResult(null);
4662                return;
4663            }
4664            Intent intent = new Intent(DeviceAdminReceiver.ACTION_DEVICE_ADMIN_DISABLE_REQUESTED);
4665            intent.setFlags(Intent.FLAG_RECEIVER_FOREGROUND);
4666            intent.setComponent(admin.info.getComponent());
4667            mContext.sendOrderedBroadcastAsUser(intent, new UserHandle(userHandle),
4668                    null, new BroadcastReceiver() {
4669                @Override
4670                public void onReceive(Context context, Intent intent) {
4671                    result.sendResult(getResultExtras(false));
4672                }
4673            }, null, Activity.RESULT_OK, null, null);
4674        }
4675    }
4676
4677    @Override
4678    public void setActivePasswordState(int quality, int length, int letters, int uppercase,
4679            int lowercase, int numbers, int symbols, int nonletter, int userHandle) {
4680        if (!mHasFeature) {
4681            return;
4682        }
4683        enforceFullCrossUsersPermission(userHandle);
4684
4685        // Managed Profile password can only be changed when it has a separate challenge.
4686        if (!isSeparateProfileChallengeEnabled(userHandle)) {
4687            enforceNotManagedProfile(userHandle, "set the active password");
4688        }
4689
4690        mContext.enforceCallingOrSelfPermission(
4691                android.Manifest.permission.BIND_DEVICE_ADMIN, null);
4692        validateQualityConstant(quality);
4693
4694        DevicePolicyData policy = getUserData(userHandle);
4695
4696        long ident = mInjector.binderClearCallingIdentity();
4697        try {
4698            synchronized (this) {
4699                policy.mActivePasswordQuality = quality;
4700                policy.mActivePasswordLength = length;
4701                policy.mActivePasswordLetters = letters;
4702                policy.mActivePasswordLowerCase = lowercase;
4703                policy.mActivePasswordUpperCase = uppercase;
4704                policy.mActivePasswordNumeric = numbers;
4705                policy.mActivePasswordSymbols = symbols;
4706                policy.mActivePasswordNonLetter = nonletter;
4707                policy.mFailedPasswordAttempts = 0;
4708                saveSettingsLocked(userHandle);
4709                updatePasswordExpirationsLocked(userHandle);
4710                setExpirationAlarmCheckLocked(mContext, userHandle, /* parent */ false);
4711
4712                // Send a broadcast to each profile using this password as its primary unlock.
4713                sendAdminCommandForLockscreenPoliciesLocked(
4714                        DeviceAdminReceiver.ACTION_PASSWORD_CHANGED,
4715                        DeviceAdminInfo.USES_POLICY_LIMIT_PASSWORD, userHandle);
4716            }
4717            removeCaApprovalsIfNeeded(userHandle);
4718        } finally {
4719            mInjector.binderRestoreCallingIdentity(ident);
4720        }
4721    }
4722
4723    /**
4724     * Called any time the device password is updated. Resets all password expiration clocks.
4725     */
4726    private void updatePasswordExpirationsLocked(int userHandle) {
4727        ArraySet<Integer> affectedUserIds = new ArraySet<Integer>();
4728        List<ActiveAdmin> admins = getActiveAdminsForLockscreenPoliciesLocked(
4729                userHandle, /* parent */ false);
4730        final int N = admins.size();
4731        for (int i = 0; i < N; i++) {
4732            ActiveAdmin admin = admins.get(i);
4733            if (admin.info.usesPolicy(DeviceAdminInfo.USES_POLICY_EXPIRE_PASSWORD)) {
4734                affectedUserIds.add(admin.getUserHandle().getIdentifier());
4735                long timeout = admin.passwordExpirationTimeout;
4736                long expiration = timeout > 0L ? (timeout + System.currentTimeMillis()) : 0L;
4737                admin.passwordExpirationDate = expiration;
4738            }
4739        }
4740        for (int affectedUserId : affectedUserIds) {
4741            saveSettingsLocked(affectedUserId);
4742        }
4743    }
4744
4745    @Override
4746    public void reportFailedPasswordAttempt(int userHandle) {
4747        enforceFullCrossUsersPermission(userHandle);
4748        if (!isSeparateProfileChallengeEnabled(userHandle)) {
4749            enforceNotManagedProfile(userHandle,
4750                    "report failed password attempt if separate profile challenge is not in place");
4751        }
4752        mContext.enforceCallingOrSelfPermission(
4753                android.Manifest.permission.BIND_DEVICE_ADMIN, null);
4754
4755        final long ident = mInjector.binderClearCallingIdentity();
4756        try {
4757            boolean wipeData = false;
4758            int identifier = 0;
4759            synchronized (this) {
4760                DevicePolicyData policy = getUserData(userHandle);
4761                policy.mFailedPasswordAttempts++;
4762                saveSettingsLocked(userHandle);
4763                if (mHasFeature) {
4764                    ActiveAdmin strictestAdmin = getAdminWithMinimumFailedPasswordsForWipeLocked(
4765                            userHandle, /* parent */ false);
4766                    int max = strictestAdmin != null
4767                            ? strictestAdmin.maximumFailedPasswordsForWipe : 0;
4768                    if (max > 0 && policy.mFailedPasswordAttempts >= max) {
4769                        // Wipe the user/profile associated with the policy that was violated. This
4770                        // is not necessarily calling user: if the policy that fired was from a
4771                        // managed profile rather than the main user profile, we wipe former only.
4772                        wipeData = true;
4773                        identifier = strictestAdmin.getUserHandle().getIdentifier();
4774                    }
4775
4776                    sendAdminCommandForLockscreenPoliciesLocked(
4777                            DeviceAdminReceiver.ACTION_PASSWORD_FAILED,
4778                            DeviceAdminInfo.USES_POLICY_WATCH_LOGIN, userHandle);
4779                }
4780            }
4781            if (wipeData) {
4782                // Call without holding lock.
4783                wipeDeviceOrUserLocked(false, identifier,
4784                        "reportFailedPasswordAttempt()");
4785            }
4786        } finally {
4787            mInjector.binderRestoreCallingIdentity(ident);
4788        }
4789
4790        if (mInjector.securityLogIsLoggingEnabled()) {
4791            SecurityLog.writeEvent(SecurityLog.TAG_KEYGUARD_DISMISS_AUTH_ATTEMPT, /*result*/ 0,
4792                    /*method strength*/ 1);
4793        }
4794    }
4795
4796    @Override
4797    public void reportSuccessfulPasswordAttempt(int userHandle) {
4798        enforceFullCrossUsersPermission(userHandle);
4799        mContext.enforceCallingOrSelfPermission(
4800                android.Manifest.permission.BIND_DEVICE_ADMIN, null);
4801
4802        synchronized (this) {
4803            DevicePolicyData policy = getUserData(userHandle);
4804            if (policy.mFailedPasswordAttempts != 0 || policy.mPasswordOwner >= 0) {
4805                long ident = mInjector.binderClearCallingIdentity();
4806                try {
4807                    policy.mFailedPasswordAttempts = 0;
4808                    policy.mPasswordOwner = -1;
4809                    saveSettingsLocked(userHandle);
4810                    if (mHasFeature) {
4811                        sendAdminCommandForLockscreenPoliciesLocked(
4812                                DeviceAdminReceiver.ACTION_PASSWORD_SUCCEEDED,
4813                                DeviceAdminInfo.USES_POLICY_WATCH_LOGIN, userHandle);
4814                    }
4815                } finally {
4816                    mInjector.binderRestoreCallingIdentity(ident);
4817                }
4818            }
4819        }
4820
4821        if (mInjector.securityLogIsLoggingEnabled()) {
4822            SecurityLog.writeEvent(SecurityLog.TAG_KEYGUARD_DISMISS_AUTH_ATTEMPT, /*result*/ 1,
4823                    /*method strength*/ 1);
4824        }
4825    }
4826
4827    @Override
4828    public void reportFailedFingerprintAttempt(int userHandle) {
4829        enforceFullCrossUsersPermission(userHandle);
4830        mContext.enforceCallingOrSelfPermission(
4831                android.Manifest.permission.BIND_DEVICE_ADMIN, null);
4832        if (mInjector.securityLogIsLoggingEnabled()) {
4833            SecurityLog.writeEvent(SecurityLog.TAG_KEYGUARD_DISMISS_AUTH_ATTEMPT, /*result*/ 0,
4834                    /*method strength*/ 0);
4835        }
4836    }
4837
4838    @Override
4839    public void reportSuccessfulFingerprintAttempt(int userHandle) {
4840        enforceFullCrossUsersPermission(userHandle);
4841        mContext.enforceCallingOrSelfPermission(
4842                android.Manifest.permission.BIND_DEVICE_ADMIN, null);
4843        if (mInjector.securityLogIsLoggingEnabled()) {
4844            SecurityLog.writeEvent(SecurityLog.TAG_KEYGUARD_DISMISS_AUTH_ATTEMPT, /*result*/ 1,
4845                    /*method strength*/ 0);
4846        }
4847    }
4848
4849    @Override
4850    public void reportKeyguardDismissed(int userHandle) {
4851        enforceFullCrossUsersPermission(userHandle);
4852        mContext.enforceCallingOrSelfPermission(
4853                android.Manifest.permission.BIND_DEVICE_ADMIN, null);
4854
4855        if (mInjector.securityLogIsLoggingEnabled()) {
4856            SecurityLog.writeEvent(SecurityLog.TAG_KEYGUARD_DISMISSED);
4857        }
4858    }
4859
4860    @Override
4861    public void reportKeyguardSecured(int userHandle) {
4862        enforceFullCrossUsersPermission(userHandle);
4863        mContext.enforceCallingOrSelfPermission(
4864                android.Manifest.permission.BIND_DEVICE_ADMIN, null);
4865
4866        if (mInjector.securityLogIsLoggingEnabled()) {
4867            SecurityLog.writeEvent(SecurityLog.TAG_KEYGUARD_SECURED);
4868        }
4869    }
4870
4871    @Override
4872    public ComponentName setGlobalProxy(ComponentName who, String proxySpec,
4873            String exclusionList) {
4874        if (!mHasFeature) {
4875            return null;
4876        }
4877        synchronized(this) {
4878            Preconditions.checkNotNull(who, "ComponentName is null");
4879
4880            // Only check if system user has set global proxy. We don't allow other users to set it.
4881            DevicePolicyData policy = getUserData(UserHandle.USER_SYSTEM);
4882            ActiveAdmin admin = getActiveAdminForCallerLocked(who,
4883                    DeviceAdminInfo.USES_POLICY_SETS_GLOBAL_PROXY);
4884
4885            // Scan through active admins and find if anyone has already
4886            // set the global proxy.
4887            Set<ComponentName> compSet = policy.mAdminMap.keySet();
4888            for (ComponentName component : compSet) {
4889                ActiveAdmin ap = policy.mAdminMap.get(component);
4890                if ((ap.specifiesGlobalProxy) && (!component.equals(who))) {
4891                    // Another admin already sets the global proxy
4892                    // Return it to the caller.
4893                    return component;
4894                }
4895            }
4896
4897            // If the user is not system, don't set the global proxy. Fail silently.
4898            if (UserHandle.getCallingUserId() != UserHandle.USER_SYSTEM) {
4899                Slog.w(LOG_TAG, "Only the owner is allowed to set the global proxy. User "
4900                        + UserHandle.getCallingUserId() + " is not permitted.");
4901                return null;
4902            }
4903            if (proxySpec == null) {
4904                admin.specifiesGlobalProxy = false;
4905                admin.globalProxySpec = null;
4906                admin.globalProxyExclusionList = null;
4907            } else {
4908
4909                admin.specifiesGlobalProxy = true;
4910                admin.globalProxySpec = proxySpec;
4911                admin.globalProxyExclusionList = exclusionList;
4912            }
4913
4914            // Reset the global proxy accordingly
4915            // Do this using system permissions, as apps cannot write to secure settings
4916            long origId = mInjector.binderClearCallingIdentity();
4917            try {
4918                resetGlobalProxyLocked(policy);
4919            } finally {
4920                mInjector.binderRestoreCallingIdentity(origId);
4921            }
4922            return null;
4923        }
4924    }
4925
4926    @Override
4927    public ComponentName getGlobalProxyAdmin(int userHandle) {
4928        if (!mHasFeature) {
4929            return null;
4930        }
4931        enforceFullCrossUsersPermission(userHandle);
4932        synchronized(this) {
4933            DevicePolicyData policy = getUserData(UserHandle.USER_SYSTEM);
4934            // Scan through active admins and find if anyone has already
4935            // set the global proxy.
4936            final int N = policy.mAdminList.size();
4937            for (int i = 0; i < N; i++) {
4938                ActiveAdmin ap = policy.mAdminList.get(i);
4939                if (ap.specifiesGlobalProxy) {
4940                    // Device admin sets the global proxy
4941                    // Return it to the caller.
4942                    return ap.info.getComponent();
4943                }
4944            }
4945        }
4946        // No device admin sets the global proxy.
4947        return null;
4948    }
4949
4950    @Override
4951    public void setRecommendedGlobalProxy(ComponentName who, ProxyInfo proxyInfo) {
4952        synchronized (this) {
4953            getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_DEVICE_OWNER);
4954        }
4955        long token = mInjector.binderClearCallingIdentity();
4956        try {
4957            ConnectivityManager connectivityManager = (ConnectivityManager)
4958                    mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
4959            connectivityManager.setGlobalProxy(proxyInfo);
4960        } finally {
4961            mInjector.binderRestoreCallingIdentity(token);
4962        }
4963    }
4964
4965    private void resetGlobalProxyLocked(DevicePolicyData policy) {
4966        final int N = policy.mAdminList.size();
4967        for (int i = 0; i < N; i++) {
4968            ActiveAdmin ap = policy.mAdminList.get(i);
4969            if (ap.specifiesGlobalProxy) {
4970                saveGlobalProxyLocked(ap.globalProxySpec, ap.globalProxyExclusionList);
4971                return;
4972            }
4973        }
4974        // No device admins defining global proxies - reset global proxy settings to none
4975        saveGlobalProxyLocked(null, null);
4976    }
4977
4978    private void saveGlobalProxyLocked(String proxySpec, String exclusionList) {
4979        if (exclusionList == null) {
4980            exclusionList = "";
4981        }
4982        if (proxySpec == null) {
4983            proxySpec = "";
4984        }
4985        // Remove white spaces
4986        proxySpec = proxySpec.trim();
4987        String data[] = proxySpec.split(":");
4988        int proxyPort = 8080;
4989        if (data.length > 1) {
4990            try {
4991                proxyPort = Integer.parseInt(data[1]);
4992            } catch (NumberFormatException e) {}
4993        }
4994        exclusionList = exclusionList.trim();
4995
4996        ProxyInfo proxyProperties = new ProxyInfo(data[0], proxyPort, exclusionList);
4997        if (!proxyProperties.isValid()) {
4998            Slog.e(LOG_TAG, "Invalid proxy properties, ignoring: " + proxyProperties.toString());
4999            return;
5000        }
5001        mInjector.settingsGlobalPutString(Settings.Global.GLOBAL_HTTP_PROXY_HOST, data[0]);
5002        mInjector.settingsGlobalPutInt(Settings.Global.GLOBAL_HTTP_PROXY_PORT, proxyPort);
5003        mInjector.settingsGlobalPutString(Settings.Global.GLOBAL_HTTP_PROXY_EXCLUSION_LIST,
5004                exclusionList);
5005    }
5006
5007    /**
5008     * Set the storage encryption request for a single admin.  Returns the new total request
5009     * status (for all admins).
5010     */
5011    @Override
5012    public int setStorageEncryption(ComponentName who, boolean encrypt) {
5013        if (!mHasFeature) {
5014            return DevicePolicyManager.ENCRYPTION_STATUS_UNSUPPORTED;
5015        }
5016        Preconditions.checkNotNull(who, "ComponentName is null");
5017        final int userHandle = UserHandle.getCallingUserId();
5018        synchronized (this) {
5019            // Check for permissions
5020            // Only system user can set storage encryption
5021            if (userHandle != UserHandle.USER_SYSTEM) {
5022                Slog.w(LOG_TAG, "Only owner/system user is allowed to set storage encryption. User "
5023                        + UserHandle.getCallingUserId() + " is not permitted.");
5024                return 0;
5025            }
5026
5027            ActiveAdmin ap = getActiveAdminForCallerLocked(who,
5028                    DeviceAdminInfo.USES_ENCRYPTED_STORAGE);
5029
5030            // Quick exit:  If the filesystem does not support encryption, we can exit early.
5031            if (!isEncryptionSupported()) {
5032                return DevicePolicyManager.ENCRYPTION_STATUS_UNSUPPORTED;
5033            }
5034
5035            // (1) Record the value for the admin so it's sticky
5036            if (ap.encryptionRequested != encrypt) {
5037                ap.encryptionRequested = encrypt;
5038                saveSettingsLocked(userHandle);
5039            }
5040
5041            DevicePolicyData policy = getUserData(UserHandle.USER_SYSTEM);
5042            // (2) Compute "max" for all admins
5043            boolean newRequested = false;
5044            final int N = policy.mAdminList.size();
5045            for (int i = 0; i < N; i++) {
5046                newRequested |= policy.mAdminList.get(i).encryptionRequested;
5047            }
5048
5049            // Notify OS of new request
5050            setEncryptionRequested(newRequested);
5051
5052            // Return the new global request status
5053            return newRequested
5054                    ? DevicePolicyManager.ENCRYPTION_STATUS_ACTIVE
5055                    : DevicePolicyManager.ENCRYPTION_STATUS_INACTIVE;
5056        }
5057    }
5058
5059    /**
5060     * Get the current storage encryption request status for a given admin, or aggregate of all
5061     * active admins.
5062     */
5063    @Override
5064    public boolean getStorageEncryption(ComponentName who, int userHandle) {
5065        if (!mHasFeature) {
5066            return false;
5067        }
5068        enforceFullCrossUsersPermission(userHandle);
5069        synchronized (this) {
5070            // Check for permissions if a particular caller is specified
5071            if (who != null) {
5072                // When checking for a single caller, status is based on caller's request
5073                ActiveAdmin ap = getActiveAdminUncheckedLocked(who, userHandle);
5074                return ap != null ? ap.encryptionRequested : false;
5075            }
5076
5077            // If no particular caller is specified, return the aggregate set of requests.
5078            // This is short circuited by returning true on the first hit.
5079            DevicePolicyData policy = getUserData(userHandle);
5080            final int N = policy.mAdminList.size();
5081            for (int i = 0; i < N; i++) {
5082                if (policy.mAdminList.get(i).encryptionRequested) {
5083                    return true;
5084                }
5085            }
5086            return false;
5087        }
5088    }
5089
5090    /**
5091     * Get the current encryption status of the device.
5092     */
5093    @Override
5094    public int getStorageEncryptionStatus(@Nullable String callerPackage, int userHandle) {
5095        if (!mHasFeature) {
5096            // Ok to return current status.
5097        }
5098        enforceFullCrossUsersPermission(userHandle);
5099
5100        // It's not critical here, but let's make sure the package name is correct, in case
5101        // we start using it for different purposes.
5102        ensureCallerPackage(callerPackage);
5103
5104        final ApplicationInfo ai;
5105        try {
5106            ai = mIPackageManager.getApplicationInfo(callerPackage, 0, userHandle);
5107        } catch (RemoteException e) {
5108            throw new SecurityException(e);
5109        }
5110
5111        boolean legacyApp = false;
5112        if (ai.targetSdkVersion <= Build.VERSION_CODES.M) {
5113            legacyApp = true;
5114        } else if ("com.google.android.apps.enterprise.dmagent".equals(ai.packageName)
5115                && ai.versionCode == 697) {
5116            // TODO: STOPSHIP remove this (revert ag/895987) once a new prebuilt is dropped
5117            legacyApp = true;
5118        }
5119
5120        final int rawStatus = getEncryptionStatus();
5121        if ((rawStatus == DevicePolicyManager.ENCRYPTION_STATUS_ACTIVE_PER_USER) && legacyApp) {
5122            return DevicePolicyManager.ENCRYPTION_STATUS_ACTIVE;
5123        }
5124        return rawStatus;
5125    }
5126
5127    /**
5128     * Hook to low-levels:  This should report if the filesystem supports encrypted storage.
5129     */
5130    private boolean isEncryptionSupported() {
5131        // Note, this can be implemented as
5132        //   return getEncryptionStatus() != DevicePolicyManager.ENCRYPTION_STATUS_UNSUPPORTED;
5133        // But is provided as a separate internal method if there's a faster way to do a
5134        // simple check for supported-or-not.
5135        return getEncryptionStatus() != DevicePolicyManager.ENCRYPTION_STATUS_UNSUPPORTED;
5136    }
5137
5138    /**
5139     * Hook to low-levels:  Reporting the current status of encryption.
5140     * @return A value such as {@link DevicePolicyManager#ENCRYPTION_STATUS_UNSUPPORTED},
5141     * {@link DevicePolicyManager#ENCRYPTION_STATUS_INACTIVE},
5142     * {@link DevicePolicyManager#ENCRYPTION_STATUS_ACTIVE_DEFAULT_KEY},
5143     * {@link DevicePolicyManager#ENCRYPTION_STATUS_ACTIVE_PER_USER}, or
5144     * {@link DevicePolicyManager#ENCRYPTION_STATUS_ACTIVE}.
5145     */
5146    private int getEncryptionStatus() {
5147        if (mInjector.storageManagerIsFileBasedEncryptionEnabled()) {
5148            return DevicePolicyManager.ENCRYPTION_STATUS_ACTIVE_PER_USER;
5149        } else if (mInjector.storageManagerIsNonDefaultBlockEncrypted()) {
5150            return DevicePolicyManager.ENCRYPTION_STATUS_ACTIVE;
5151        } else if (mInjector.storageManagerIsEncrypted()) {
5152            return DevicePolicyManager.ENCRYPTION_STATUS_ACTIVE_DEFAULT_KEY;
5153        } else if (mInjector.storageManagerIsEncryptable()) {
5154            return DevicePolicyManager.ENCRYPTION_STATUS_INACTIVE;
5155        } else {
5156            return DevicePolicyManager.ENCRYPTION_STATUS_UNSUPPORTED;
5157        }
5158    }
5159
5160    /**
5161     * Hook to low-levels:  If needed, record the new admin setting for encryption.
5162     */
5163    private void setEncryptionRequested(boolean encrypt) {
5164    }
5165
5166    /**
5167     * Set whether the screen capture is disabled for the user managed by the specified admin.
5168     */
5169    @Override
5170    public void setScreenCaptureDisabled(ComponentName who, boolean disabled) {
5171        if (!mHasFeature) {
5172            return;
5173        }
5174        Preconditions.checkNotNull(who, "ComponentName is null");
5175        final int userHandle = UserHandle.getCallingUserId();
5176        synchronized (this) {
5177            ActiveAdmin ap = getActiveAdminForCallerLocked(who,
5178                    DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
5179            if (ap.disableScreenCapture != disabled) {
5180                ap.disableScreenCapture = disabled;
5181                saveSettingsLocked(userHandle);
5182                updateScreenCaptureDisabledInWindowManager(userHandle, disabled);
5183            }
5184        }
5185    }
5186
5187    /**
5188     * Returns whether or not screen capture is disabled for a given admin, or disabled for any
5189     * active admin (if given admin is null).
5190     */
5191    @Override
5192    public boolean getScreenCaptureDisabled(ComponentName who, int userHandle) {
5193        if (!mHasFeature) {
5194            return false;
5195        }
5196        synchronized (this) {
5197            if (who != null) {
5198                ActiveAdmin admin = getActiveAdminUncheckedLocked(who, userHandle);
5199                return (admin != null) ? admin.disableScreenCapture : false;
5200            }
5201
5202            DevicePolicyData policy = getUserData(userHandle);
5203            final int N = policy.mAdminList.size();
5204            for (int i = 0; i < N; i++) {
5205                ActiveAdmin admin = policy.mAdminList.get(i);
5206                if (admin.disableScreenCapture) {
5207                    return true;
5208                }
5209            }
5210            return false;
5211        }
5212    }
5213
5214    private void updateScreenCaptureDisabledInWindowManager(final int userHandle,
5215            final boolean disabled) {
5216        mHandler.post(new Runnable() {
5217            @Override
5218            public void run() {
5219                try {
5220                    mInjector.getIWindowManager().setScreenCaptureDisabled(userHandle, disabled);
5221                } catch (RemoteException e) {
5222                    Log.w(LOG_TAG, "Unable to notify WindowManager.", e);
5223                }
5224            }
5225        });
5226    }
5227
5228    /**
5229     * Set whether auto time is required by the specified admin (must be device owner).
5230     */
5231    @Override
5232    public void setAutoTimeRequired(ComponentName who, boolean required) {
5233        if (!mHasFeature) {
5234            return;
5235        }
5236        Preconditions.checkNotNull(who, "ComponentName is null");
5237        final int userHandle = UserHandle.getCallingUserId();
5238        synchronized (this) {
5239            ActiveAdmin admin = getActiveAdminForCallerLocked(who,
5240                    DeviceAdminInfo.USES_POLICY_DEVICE_OWNER);
5241            if (admin.requireAutoTime != required) {
5242                admin.requireAutoTime = required;
5243                saveSettingsLocked(userHandle);
5244            }
5245        }
5246
5247        // Turn AUTO_TIME on in settings if it is required
5248        if (required) {
5249            long ident = mInjector.binderClearCallingIdentity();
5250            try {
5251                mInjector.settingsGlobalPutInt(Settings.Global.AUTO_TIME, 1 /* AUTO_TIME on */);
5252            } finally {
5253                mInjector.binderRestoreCallingIdentity(ident);
5254            }
5255        }
5256    }
5257
5258    /**
5259     * Returns whether or not auto time is required by the device owner.
5260     */
5261    @Override
5262    public boolean getAutoTimeRequired() {
5263        if (!mHasFeature) {
5264            return false;
5265        }
5266        synchronized (this) {
5267            ActiveAdmin deviceOwner = getDeviceOwnerAdminLocked();
5268            return (deviceOwner != null) ? deviceOwner.requireAutoTime : false;
5269        }
5270    }
5271
5272    @Override
5273    public void setForceEphemeralUsers(ComponentName who, boolean forceEphemeralUsers) {
5274        if (!mHasFeature) {
5275            return;
5276        }
5277        Preconditions.checkNotNull(who, "ComponentName is null");
5278        // Allow setting this policy to true only if there is a split system user.
5279        if (forceEphemeralUsers && !mInjector.userManagerIsSplitSystemUser()) {
5280            throw new UnsupportedOperationException(
5281                    "Cannot force ephemeral users on systems without split system user.");
5282        }
5283        boolean removeAllUsers = false;
5284        synchronized (this) {
5285            final ActiveAdmin deviceOwner =
5286                    getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_DEVICE_OWNER);
5287            if (deviceOwner.forceEphemeralUsers != forceEphemeralUsers) {
5288                deviceOwner.forceEphemeralUsers = forceEphemeralUsers;
5289                saveSettingsLocked(mInjector.userHandleGetCallingUserId());
5290                mUserManagerInternal.setForceEphemeralUsers(forceEphemeralUsers);
5291                removeAllUsers = forceEphemeralUsers;
5292            }
5293        }
5294        if (removeAllUsers) {
5295            long identitity = mInjector.binderClearCallingIdentity();
5296            try {
5297                mUserManagerInternal.removeAllUsers();
5298            } finally {
5299                mInjector.binderRestoreCallingIdentity(identitity);
5300            }
5301        }
5302    }
5303
5304    @Override
5305    public boolean getForceEphemeralUsers(ComponentName who) {
5306        if (!mHasFeature) {
5307            return false;
5308        }
5309        Preconditions.checkNotNull(who, "ComponentName is null");
5310        synchronized (this) {
5311            final ActiveAdmin deviceOwner =
5312                    getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_DEVICE_OWNER);
5313            return deviceOwner.forceEphemeralUsers;
5314        }
5315    }
5316
5317    private boolean isDeviceOwnerManagedSingleUserDevice() {
5318        synchronized (this) {
5319            if (!mOwners.hasDeviceOwner()) {
5320                return false;
5321            }
5322        }
5323        final long callingIdentity = mInjector.binderClearCallingIdentity();
5324        try {
5325            if (mInjector.userManagerIsSplitSystemUser()) {
5326                // In split system user mode, only allow the case where the device owner is managing
5327                // the only non-system user of the device
5328                return (mUserManager.getUserCount() == 2
5329                        && mOwners.getDeviceOwnerUserId() != UserHandle.USER_SYSTEM);
5330            } else  {
5331                return mUserManager.getUserCount() == 1;
5332            }
5333        } finally {
5334            mInjector.binderRestoreCallingIdentity(callingIdentity);
5335        }
5336    }
5337
5338    private void ensureDeviceOwnerManagingSingleUser(ComponentName who) throws SecurityException {
5339        synchronized (this) {
5340            getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_DEVICE_OWNER);
5341        }
5342        if (!isDeviceOwnerManagedSingleUserDevice()) {
5343            throw new SecurityException(
5344                    "There should only be one user, managed by Device Owner");
5345        }
5346    }
5347
5348    @Override
5349    public boolean requestBugreport(ComponentName who) {
5350        if (!mHasFeature) {
5351            return false;
5352        }
5353        Preconditions.checkNotNull(who, "ComponentName is null");
5354        ensureDeviceOwnerManagingSingleUser(who);
5355
5356        if (mRemoteBugreportServiceIsActive.get()
5357                || (getDeviceOwnerRemoteBugreportUri() != null)) {
5358            Slog.d(LOG_TAG, "Remote bugreport wasn't started because there's already one running.");
5359            return false;
5360        }
5361
5362        final long callingIdentity = mInjector.binderClearCallingIdentity();
5363        try {
5364            ActivityManagerNative.getDefault().requestBugReport(
5365                    ActivityManager.BUGREPORT_OPTION_REMOTE);
5366
5367            mRemoteBugreportServiceIsActive.set(true);
5368            mRemoteBugreportSharingAccepted.set(false);
5369            registerRemoteBugreportReceivers();
5370            mInjector.getNotificationManager().notifyAsUser(LOG_TAG, RemoteBugreportUtils.NOTIFICATION_ID,
5371                    RemoteBugreportUtils.buildNotification(mContext,
5372                            DevicePolicyManager.NOTIFICATION_BUGREPORT_STARTED), UserHandle.ALL);
5373            mHandler.postDelayed(mRemoteBugreportTimeoutRunnable,
5374                    RemoteBugreportUtils.REMOTE_BUGREPORT_TIMEOUT_MILLIS);
5375            return true;
5376        } catch (RemoteException re) {
5377            // should never happen
5378            Slog.e(LOG_TAG, "Failed to make remote calls to start bugreportremote service", re);
5379            return false;
5380        } finally {
5381            mInjector.binderRestoreCallingIdentity(callingIdentity);
5382        }
5383    }
5384
5385    synchronized void sendDeviceOwnerCommand(String action, Bundle extras) {
5386        Intent intent = new Intent(action);
5387        intent.setComponent(mOwners.getDeviceOwnerComponent());
5388        if (extras != null) {
5389            intent.putExtras(extras);
5390        }
5391        mContext.sendBroadcastAsUser(intent, UserHandle.of(mOwners.getDeviceOwnerUserId()));
5392    }
5393
5394    private synchronized String getDeviceOwnerRemoteBugreportUri() {
5395        return mOwners.getDeviceOwnerRemoteBugreportUri();
5396    }
5397
5398    private synchronized void setDeviceOwnerRemoteBugreportUriAndHash(String bugreportUri,
5399            String bugreportHash) {
5400        mOwners.setDeviceOwnerRemoteBugreportUriAndHash(bugreportUri, bugreportHash);
5401    }
5402
5403    private void registerRemoteBugreportReceivers() {
5404        try {
5405            IntentFilter filterFinished = new IntentFilter(
5406                    DevicePolicyManager.ACTION_REMOTE_BUGREPORT_DISPATCH,
5407                    RemoteBugreportUtils.BUGREPORT_MIMETYPE);
5408            mContext.registerReceiver(mRemoteBugreportFinishedReceiver, filterFinished);
5409        } catch (IntentFilter.MalformedMimeTypeException e) {
5410            // should never happen, as setting a constant
5411            Slog.w(LOG_TAG, "Failed to set type " + RemoteBugreportUtils.BUGREPORT_MIMETYPE, e);
5412        }
5413        IntentFilter filterConsent = new IntentFilter();
5414        filterConsent.addAction(DevicePolicyManager.ACTION_BUGREPORT_SHARING_DECLINED);
5415        filterConsent.addAction(DevicePolicyManager.ACTION_BUGREPORT_SHARING_ACCEPTED);
5416        mContext.registerReceiver(mRemoteBugreportConsentReceiver, filterConsent);
5417    }
5418
5419    private void onBugreportFinished(Intent intent) {
5420        mHandler.removeCallbacks(mRemoteBugreportTimeoutRunnable);
5421        mRemoteBugreportServiceIsActive.set(false);
5422        Uri bugreportUri = intent.getData();
5423        String bugreportUriString = null;
5424        if (bugreportUri != null) {
5425            bugreportUriString = bugreportUri.toString();
5426        }
5427        String bugreportHash = intent.getStringExtra(
5428                DevicePolicyManager.EXTRA_REMOTE_BUGREPORT_HASH);
5429        if (mRemoteBugreportSharingAccepted.get()) {
5430            shareBugreportWithDeviceOwnerIfExists(bugreportUriString, bugreportHash);
5431            mInjector.getNotificationManager().cancel(LOG_TAG,
5432                    RemoteBugreportUtils.NOTIFICATION_ID);
5433        } else {
5434            setDeviceOwnerRemoteBugreportUriAndHash(bugreportUriString, bugreportHash);
5435            mInjector.getNotificationManager().notifyAsUser(LOG_TAG, RemoteBugreportUtils.NOTIFICATION_ID,
5436                    RemoteBugreportUtils.buildNotification(mContext,
5437                            DevicePolicyManager.NOTIFICATION_BUGREPORT_FINISHED_NOT_ACCEPTED),
5438                            UserHandle.ALL);
5439        }
5440        mContext.unregisterReceiver(mRemoteBugreportFinishedReceiver);
5441    }
5442
5443    private void onBugreportFailed() {
5444        mRemoteBugreportServiceIsActive.set(false);
5445        mInjector.systemPropertiesSet(RemoteBugreportUtils.CTL_STOP,
5446                RemoteBugreportUtils.REMOTE_BUGREPORT_SERVICE);
5447        mRemoteBugreportSharingAccepted.set(false);
5448        setDeviceOwnerRemoteBugreportUriAndHash(null, null);
5449        mInjector.getNotificationManager().cancel(LOG_TAG, RemoteBugreportUtils.NOTIFICATION_ID);
5450        Bundle extras = new Bundle();
5451        extras.putInt(DeviceAdminReceiver.EXTRA_BUGREPORT_FAILURE_REASON,
5452                DeviceAdminReceiver.BUGREPORT_FAILURE_FAILED_COMPLETING);
5453        sendDeviceOwnerCommand(DeviceAdminReceiver.ACTION_BUGREPORT_FAILED, extras);
5454        mContext.unregisterReceiver(mRemoteBugreportConsentReceiver);
5455        mContext.unregisterReceiver(mRemoteBugreportFinishedReceiver);
5456    }
5457
5458    private void onBugreportSharingAccepted() {
5459        mRemoteBugreportSharingAccepted.set(true);
5460        String bugreportUriString = null;
5461        String bugreportHash = null;
5462        synchronized (this) {
5463            bugreportUriString = getDeviceOwnerRemoteBugreportUri();
5464            bugreportHash = mOwners.getDeviceOwnerRemoteBugreportHash();
5465        }
5466        if (bugreportUriString != null) {
5467            shareBugreportWithDeviceOwnerIfExists(bugreportUriString, bugreportHash);
5468        } else if (mRemoteBugreportServiceIsActive.get()) {
5469            mInjector.getNotificationManager().notifyAsUser(LOG_TAG, RemoteBugreportUtils.NOTIFICATION_ID,
5470                    RemoteBugreportUtils.buildNotification(mContext,
5471                            DevicePolicyManager.NOTIFICATION_BUGREPORT_ACCEPTED_NOT_FINISHED),
5472                            UserHandle.ALL);
5473        }
5474    }
5475
5476    private void onBugreportSharingDeclined() {
5477        if (mRemoteBugreportServiceIsActive.get()) {
5478            mInjector.systemPropertiesSet(RemoteBugreportUtils.CTL_STOP,
5479                    RemoteBugreportUtils.REMOTE_BUGREPORT_SERVICE);
5480            mRemoteBugreportServiceIsActive.set(false);
5481            mHandler.removeCallbacks(mRemoteBugreportTimeoutRunnable);
5482            mContext.unregisterReceiver(mRemoteBugreportFinishedReceiver);
5483        }
5484        mRemoteBugreportSharingAccepted.set(false);
5485        setDeviceOwnerRemoteBugreportUriAndHash(null, null);
5486        sendDeviceOwnerCommand(DeviceAdminReceiver.ACTION_BUGREPORT_SHARING_DECLINED, null);
5487    }
5488
5489    private void shareBugreportWithDeviceOwnerIfExists(String bugreportUriString,
5490            String bugreportHash) {
5491        ParcelFileDescriptor pfd = null;
5492        try {
5493            if (bugreportUriString == null) {
5494                throw new FileNotFoundException();
5495            }
5496            Uri bugreportUri = Uri.parse(bugreportUriString);
5497            pfd = mContext.getContentResolver().openFileDescriptor(bugreportUri, "r");
5498
5499            synchronized (this) {
5500                Intent intent = new Intent(DeviceAdminReceiver.ACTION_BUGREPORT_SHARE);
5501                intent.setComponent(mOwners.getDeviceOwnerComponent());
5502                intent.setDataAndType(bugreportUri, RemoteBugreportUtils.BUGREPORT_MIMETYPE);
5503                intent.putExtra(DeviceAdminReceiver.EXTRA_BUGREPORT_HASH, bugreportHash);
5504                mContext.grantUriPermission(mOwners.getDeviceOwnerComponent().getPackageName(),
5505                        bugreportUri, Intent.FLAG_GRANT_READ_URI_PERMISSION);
5506                mContext.sendBroadcastAsUser(intent, UserHandle.of(mOwners.getDeviceOwnerUserId()));
5507            }
5508        } catch (FileNotFoundException e) {
5509            Bundle extras = new Bundle();
5510            extras.putInt(DeviceAdminReceiver.EXTRA_BUGREPORT_FAILURE_REASON,
5511                    DeviceAdminReceiver.BUGREPORT_FAILURE_FILE_NO_LONGER_AVAILABLE);
5512            sendDeviceOwnerCommand(DeviceAdminReceiver.ACTION_BUGREPORT_FAILED, extras);
5513        } finally {
5514            try {
5515                if (pfd != null) {
5516                    pfd.close();
5517                }
5518            } catch (IOException ex) {
5519                // Ignore
5520            }
5521            mRemoteBugreportSharingAccepted.set(false);
5522            setDeviceOwnerRemoteBugreportUriAndHash(null, null);
5523        }
5524    }
5525
5526    /**
5527     * Disables all device cameras according to the specified admin.
5528     */
5529    @Override
5530    public void setCameraDisabled(ComponentName who, boolean disabled) {
5531        if (!mHasFeature) {
5532            return;
5533        }
5534        Preconditions.checkNotNull(who, "ComponentName is null");
5535        final int userHandle = mInjector.userHandleGetCallingUserId();
5536        synchronized (this) {
5537            ActiveAdmin ap = getActiveAdminForCallerLocked(who,
5538                    DeviceAdminInfo.USES_POLICY_DISABLE_CAMERA);
5539            if (ap.disableCamera != disabled) {
5540                ap.disableCamera = disabled;
5541                saveSettingsLocked(userHandle);
5542            }
5543        }
5544        // Tell the user manager that the restrictions have changed.
5545        pushUserRestrictions(userHandle);
5546    }
5547
5548    /**
5549     * Gets whether or not all device cameras are disabled for a given admin, or disabled for any
5550     * active admins.
5551     */
5552    @Override
5553    public boolean getCameraDisabled(ComponentName who, int userHandle) {
5554        return getCameraDisabled(who, userHandle, /* mergeDeviceOwnerRestriction= */ true);
5555    }
5556
5557    private boolean getCameraDisabled(ComponentName who, int userHandle,
5558            boolean mergeDeviceOwnerRestriction) {
5559        if (!mHasFeature) {
5560            return false;
5561        }
5562        synchronized (this) {
5563            if (who != null) {
5564                ActiveAdmin admin = getActiveAdminUncheckedLocked(who, userHandle);
5565                return (admin != null) ? admin.disableCamera : false;
5566            }
5567            // First, see if DO has set it.  If so, it's device-wide.
5568            if (mergeDeviceOwnerRestriction) {
5569                final ActiveAdmin deviceOwner = getDeviceOwnerAdminLocked();
5570                if (deviceOwner != null && deviceOwner.disableCamera) {
5571                    return true;
5572                }
5573            }
5574
5575            // Then check each device admin on the user.
5576            DevicePolicyData policy = getUserData(userHandle);
5577            // Determine whether or not the device camera is disabled for any active admins.
5578            final int N = policy.mAdminList.size();
5579            for (int i = 0; i < N; i++) {
5580                ActiveAdmin admin = policy.mAdminList.get(i);
5581                if (admin.disableCamera) {
5582                    return true;
5583                }
5584            }
5585            return false;
5586        }
5587    }
5588
5589    @Override
5590    public void setKeyguardDisabledFeatures(ComponentName who, int which, boolean parent) {
5591        if (!mHasFeature) {
5592            return;
5593        }
5594        Preconditions.checkNotNull(who, "ComponentName is null");
5595        final int userHandle = mInjector.userHandleGetCallingUserId();
5596        if (isManagedProfile(userHandle)) {
5597            if (parent) {
5598                which = which & PROFILE_KEYGUARD_FEATURES_AFFECT_OWNER;
5599            } else {
5600                which = which & PROFILE_KEYGUARD_FEATURES;
5601            }
5602        }
5603        synchronized (this) {
5604            ActiveAdmin ap = getActiveAdminForCallerLocked(
5605                    who, DeviceAdminInfo.USES_POLICY_DISABLE_KEYGUARD_FEATURES, parent);
5606            if (ap.disabledKeyguardFeatures != which) {
5607                ap.disabledKeyguardFeatures = which;
5608                saveSettingsLocked(userHandle);
5609            }
5610        }
5611    }
5612
5613    /**
5614     * Gets the disabled state for features in keyguard for the given admin,
5615     * or the aggregate of all active admins if who is null.
5616     */
5617    @Override
5618    public int getKeyguardDisabledFeatures(ComponentName who, int userHandle, boolean parent) {
5619        if (!mHasFeature) {
5620            return 0;
5621        }
5622        enforceFullCrossUsersPermission(userHandle);
5623        final long ident = mInjector.binderClearCallingIdentity();
5624        try {
5625            synchronized (this) {
5626                if (who != null) {
5627                    ActiveAdmin admin = getActiveAdminUncheckedLocked(who, userHandle, parent);
5628                    return (admin != null) ? admin.disabledKeyguardFeatures : 0;
5629                }
5630
5631                final List<ActiveAdmin> admins;
5632                if (!parent && isManagedProfile(userHandle)) {
5633                    // If we are being asked about a managed profile, just return keyguard features
5634                    // disabled by admins in the profile.
5635                    admins = getUserDataUnchecked(userHandle).mAdminList;
5636                } else {
5637                    // Otherwise return those set by admins in the user and its profiles.
5638                    admins = getActiveAdminsForLockscreenPoliciesLocked(userHandle, parent);
5639                }
5640
5641                int which = DevicePolicyManager.KEYGUARD_DISABLE_FEATURES_NONE;
5642                final int N = admins.size();
5643                for (int i = 0; i < N; i++) {
5644                    ActiveAdmin admin = admins.get(i);
5645                    int userId = admin.getUserHandle().getIdentifier();
5646                    boolean isRequestedUser = !parent && (userId == userHandle);
5647                    if (isRequestedUser || !isManagedProfile(userId)) {
5648                        // If we are being asked explicitly about this user
5649                        // return all disabled features even if its a managed profile.
5650                        which |= admin.disabledKeyguardFeatures;
5651                    } else {
5652                        // Otherwise a managed profile is only allowed to disable
5653                        // some features on the parent user.
5654                        which |= (admin.disabledKeyguardFeatures
5655                                & PROFILE_KEYGUARD_FEATURES_AFFECT_OWNER);
5656                    }
5657                }
5658                return which;
5659            }
5660        } finally {
5661            mInjector.binderRestoreCallingIdentity(ident);
5662        }
5663    }
5664
5665    @Override
5666    public void setKeepUninstalledPackages(ComponentName who, List<String> packageList) {
5667        if (!mHasFeature) {
5668            return;
5669        }
5670        Preconditions.checkNotNull(who, "ComponentName is null");
5671        Preconditions.checkNotNull(packageList, "packageList is null");
5672        final int userHandle = UserHandle.getCallingUserId();
5673        synchronized (this) {
5674            ActiveAdmin admin = getActiveAdminForCallerLocked(who,
5675                    DeviceAdminInfo.USES_POLICY_DEVICE_OWNER);
5676            admin.keepUninstalledPackages = packageList;
5677            saveSettingsLocked(userHandle);
5678            mInjector.getPackageManagerInternal().setKeepUninstalledPackages(packageList);
5679        }
5680    }
5681
5682    @Override
5683    public List<String> getKeepUninstalledPackages(ComponentName who) {
5684        Preconditions.checkNotNull(who, "ComponentName is null");
5685        if (!mHasFeature) {
5686            return null;
5687        }
5688        // TODO In split system user mode, allow apps on user 0 to query the list
5689        synchronized (this) {
5690            // Check if this is the device owner who is calling
5691            getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_DEVICE_OWNER);
5692            return getKeepUninstalledPackagesLocked();
5693        }
5694    }
5695
5696    private List<String> getKeepUninstalledPackagesLocked() {
5697        ActiveAdmin deviceOwner = getDeviceOwnerAdminLocked();
5698        return (deviceOwner != null) ? deviceOwner.keepUninstalledPackages : null;
5699    }
5700
5701    @Override
5702    public boolean setDeviceOwner(ComponentName admin, String ownerName, int userId) {
5703        if (!mHasFeature) {
5704            return false;
5705        }
5706        if (admin == null
5707                || !isPackageInstalledForUser(admin.getPackageName(), userId)) {
5708            throw new IllegalArgumentException("Invalid component " + admin
5709                    + " for device owner");
5710        }
5711        synchronized (this) {
5712            enforceCanSetDeviceOwnerLocked(userId);
5713            if (getActiveAdminUncheckedLocked(admin, userId) == null) {
5714                throw new IllegalArgumentException("Not active admin: " + admin);
5715            }
5716
5717            // Shutting down backup manager service permanently.
5718            long ident = mInjector.binderClearCallingIdentity();
5719            try {
5720                if (mInjector.getIBackupManager() != null) {
5721                    mInjector.getIBackupManager()
5722                            .setBackupServiceActive(UserHandle.USER_SYSTEM, false);
5723                }
5724            } catch (RemoteException e) {
5725                throw new IllegalStateException("Failed deactivating backup service.", e);
5726            } finally {
5727                mInjector.binderRestoreCallingIdentity(ident);
5728            }
5729
5730            mOwners.setDeviceOwner(admin, ownerName, userId);
5731            mOwners.writeDeviceOwner();
5732            updateDeviceOwnerLocked();
5733            setDeviceOwnerSystemPropertyLocked();
5734            Intent intent = new Intent(DevicePolicyManager.ACTION_DEVICE_OWNER_CHANGED);
5735
5736            ident = mInjector.binderClearCallingIdentity();
5737            try {
5738                // TODO Send to system too?
5739                mContext.sendBroadcastAsUser(intent, new UserHandle(userId));
5740            } finally {
5741                mInjector.binderRestoreCallingIdentity(ident);
5742            }
5743            return true;
5744        }
5745    }
5746
5747    public boolean isDeviceOwner(ComponentName who, int userId) {
5748        synchronized (this) {
5749            return mOwners.hasDeviceOwner()
5750                    && mOwners.getDeviceOwnerUserId() == userId
5751                    && mOwners.getDeviceOwnerComponent().equals(who);
5752        }
5753    }
5754
5755    public boolean isProfileOwner(ComponentName who, int userId) {
5756        final ComponentName profileOwner = getProfileOwner(userId);
5757        return who != null && who.equals(profileOwner);
5758    }
5759
5760    @Override
5761    public ComponentName getDeviceOwnerComponent(boolean callingUserOnly) {
5762        if (!mHasFeature) {
5763            return null;
5764        }
5765        if (!callingUserOnly) {
5766            enforceManageUsers();
5767        }
5768        synchronized (this) {
5769            if (!mOwners.hasDeviceOwner()) {
5770                return null;
5771            }
5772            if (callingUserOnly && mInjector.userHandleGetCallingUserId() !=
5773                    mOwners.getDeviceOwnerUserId()) {
5774                return null;
5775            }
5776            return mOwners.getDeviceOwnerComponent();
5777        }
5778    }
5779
5780    @Override
5781    public int getDeviceOwnerUserId() {
5782        if (!mHasFeature) {
5783            return UserHandle.USER_NULL;
5784        }
5785        enforceManageUsers();
5786        synchronized (this) {
5787            return mOwners.hasDeviceOwner() ? mOwners.getDeviceOwnerUserId() : UserHandle.USER_NULL;
5788        }
5789    }
5790
5791    /**
5792     * Returns the "name" of the device owner.  It'll work for non-DO users too, but requires
5793     * MANAGE_USERS.
5794     */
5795    @Override
5796    public String getDeviceOwnerName() {
5797        if (!mHasFeature) {
5798            return null;
5799        }
5800        enforceManageUsers();
5801        synchronized (this) {
5802            if (!mOwners.hasDeviceOwner()) {
5803                return null;
5804            }
5805            // TODO This totally ignores the name passed to setDeviceOwner (change for b/20679292)
5806            // Should setDeviceOwner/ProfileOwner still take a name?
5807            String deviceOwnerPackage = mOwners.getDeviceOwnerPackageName();
5808            return getApplicationLabel(deviceOwnerPackage, UserHandle.USER_SYSTEM);
5809        }
5810    }
5811
5812    // Returns the active device owner or null if there is no device owner.
5813    @VisibleForTesting
5814    ActiveAdmin getDeviceOwnerAdminLocked() {
5815        ComponentName component = mOwners.getDeviceOwnerComponent();
5816        if (component == null) {
5817            return null;
5818        }
5819
5820        DevicePolicyData policy = getUserData(mOwners.getDeviceOwnerUserId());
5821        final int n = policy.mAdminList.size();
5822        for (int i = 0; i < n; i++) {
5823            ActiveAdmin admin = policy.mAdminList.get(i);
5824            if (component.equals(admin.info.getComponent())) {
5825                return admin;
5826            }
5827        }
5828        Slog.wtf(LOG_TAG, "Active admin for device owner not found. component=" + component);
5829        return null;
5830    }
5831
5832    @Override
5833    public void clearDeviceOwner(String packageName) {
5834        Preconditions.checkNotNull(packageName, "packageName is null");
5835        final int callingUid = mInjector.binderGetCallingUid();
5836        try {
5837            int uid = mContext.getPackageManager().getPackageUidAsUser(packageName,
5838                    UserHandle.getUserId(callingUid));
5839            if (uid != callingUid) {
5840                throw new SecurityException("Invalid packageName");
5841            }
5842        } catch (NameNotFoundException e) {
5843            throw new SecurityException(e);
5844        }
5845        synchronized (this) {
5846            final ComponentName deviceOwnerComponent = mOwners.getDeviceOwnerComponent();
5847            final int deviceOwnerUserId = mOwners.getDeviceOwnerUserId();
5848            if (!mOwners.hasDeviceOwner()
5849                    || !deviceOwnerComponent.getPackageName().equals(packageName)
5850                    || (deviceOwnerUserId != UserHandle.getUserId(callingUid))) {
5851                throw new SecurityException(
5852                        "clearDeviceOwner can only be called by the device owner");
5853            }
5854            enforceUserUnlocked(deviceOwnerUserId);
5855
5856            final ActiveAdmin admin = getDeviceOwnerAdminLocked();
5857            long ident = mInjector.binderClearCallingIdentity();
5858            try {
5859                clearDeviceOwnerLocked(admin, deviceOwnerUserId);
5860                removeActiveAdminLocked(deviceOwnerComponent, deviceOwnerUserId);
5861            } finally {
5862                mInjector.binderRestoreCallingIdentity(ident);
5863            }
5864        }
5865    }
5866
5867    private void clearDeviceOwnerLocked(ActiveAdmin admin, int userId) {
5868        if (admin != null) {
5869            admin.disableCamera = false;
5870            admin.userRestrictions = null;
5871            admin.forceEphemeralUsers = false;
5872            mUserManagerInternal.setForceEphemeralUsers(admin.forceEphemeralUsers);
5873        }
5874        clearUserPoliciesLocked(userId);
5875
5876        mOwners.clearDeviceOwner();
5877        mOwners.writeDeviceOwner();
5878        updateDeviceOwnerLocked();
5879        disableSecurityLoggingIfNotCompliant();
5880        try {
5881            // Reactivate backup service.
5882            mInjector.getIBackupManager().setBackupServiceActive(UserHandle.USER_SYSTEM, true);
5883        } catch (RemoteException e) {
5884            throw new IllegalStateException("Failed reactivating backup service.", e);
5885        }
5886    }
5887
5888    @Override
5889    public boolean setProfileOwner(ComponentName who, String ownerName, int userHandle) {
5890        if (!mHasFeature) {
5891            return false;
5892        }
5893        if (who == null
5894                || !isPackageInstalledForUser(who.getPackageName(), userHandle)) {
5895            throw new IllegalArgumentException("Component " + who
5896                    + " not installed for userId:" + userHandle);
5897        }
5898        synchronized (this) {
5899            enforceCanSetProfileOwnerLocked(userHandle);
5900
5901            if (getActiveAdminUncheckedLocked(who, userHandle) == null) {
5902                throw new IllegalArgumentException("Not active admin: " + who);
5903            }
5904
5905            mOwners.setProfileOwner(who, ownerName, userHandle);
5906            mOwners.writeProfileOwner(userHandle);
5907            return true;
5908        }
5909    }
5910
5911    @Override
5912    public void clearProfileOwner(ComponentName who) {
5913        if (!mHasFeature) {
5914            return;
5915        }
5916        final UserHandle callingUser = mInjector.binderGetCallingUserHandle();
5917        final int userId = callingUser.getIdentifier();
5918        enforceNotManagedProfile(userId, "clear profile owner");
5919        enforceUserUnlocked(userId);
5920        // Check if this is the profile owner who is calling
5921        final ActiveAdmin admin =
5922                getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
5923        synchronized (this) {
5924            final long ident = mInjector.binderClearCallingIdentity();
5925            try {
5926                clearProfileOwnerLocked(admin, userId);
5927                removeActiveAdminLocked(who, userId);
5928            } finally {
5929                mInjector.binderRestoreCallingIdentity(ident);
5930            }
5931        }
5932    }
5933
5934    public void clearProfileOwnerLocked(ActiveAdmin admin, int userId) {
5935        if (admin != null) {
5936            admin.disableCamera = false;
5937            admin.userRestrictions = null;
5938        }
5939        clearUserPoliciesLocked(userId);
5940        mOwners.removeProfileOwner(userId);
5941        mOwners.writeProfileOwner(userId);
5942    }
5943
5944    @Override
5945    public void setDeviceOwnerLockScreenInfo(ComponentName who, CharSequence info) {
5946        Preconditions.checkNotNull(who, "ComponentName is null");
5947        if (!mHasFeature) {
5948            return;
5949        }
5950
5951        synchronized (this) {
5952            getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_DEVICE_OWNER);
5953            long token = mInjector.binderClearCallingIdentity();
5954            try {
5955                mLockPatternUtils.setDeviceOwnerInfo(info != null ? info.toString() : null);
5956            } finally {
5957                mInjector.binderRestoreCallingIdentity(token);
5958            }
5959        }
5960    }
5961
5962    @Override
5963    public CharSequence getDeviceOwnerLockScreenInfo() {
5964        return mLockPatternUtils.getDeviceOwnerInfo();
5965    }
5966
5967    private void clearUserPoliciesLocked(int userId) {
5968        // Reset some of the user-specific policies
5969        DevicePolicyData policy = getUserData(userId);
5970        policy.mPermissionPolicy = DevicePolicyManager.PERMISSION_POLICY_PROMPT;
5971        policy.mDelegatedCertInstallerPackage = null;
5972        policy.mApplicationRestrictionsManagingPackage = null;
5973        policy.mStatusBarDisabled = false;
5974        policy.mUserProvisioningState = DevicePolicyManager.STATE_USER_UNMANAGED;
5975        saveSettingsLocked(userId);
5976
5977        try {
5978            mIPackageManager.updatePermissionFlagsForAllApps(
5979                    PackageManager.FLAG_PERMISSION_POLICY_FIXED,
5980                    0  /* flagValues */, userId);
5981            pushUserRestrictions(userId);
5982        } catch (RemoteException re) {
5983            // Shouldn't happen.
5984        }
5985    }
5986
5987    @Override
5988    public boolean hasUserSetupCompleted() {
5989        return hasUserSetupCompleted(UserHandle.getCallingUserId());
5990    }
5991
5992    private boolean hasUserSetupCompleted(int userHandle) {
5993        if (!mHasFeature) {
5994            return true;
5995        }
5996        return getUserData(userHandle).mUserSetupComplete;
5997    }
5998
5999    @Override
6000    public int getUserProvisioningState() {
6001        if (!mHasFeature) {
6002            return DevicePolicyManager.STATE_USER_UNMANAGED;
6003        }
6004        int userHandle = mInjector.userHandleGetCallingUserId();
6005        return getUserProvisioningState(userHandle);
6006    }
6007
6008    private int getUserProvisioningState(int userHandle) {
6009        return getUserData(userHandle).mUserProvisioningState;
6010    }
6011
6012    @Override
6013    public void setUserProvisioningState(int newState, int userHandle) {
6014        if (!mHasFeature) {
6015            return;
6016        }
6017
6018        if (userHandle != mOwners.getDeviceOwnerUserId() && !mOwners.hasProfileOwner(userHandle)
6019                && getManagedUserId(userHandle) == -1) {
6020            // No managed device, user or profile, so setting provisioning state makes no sense.
6021            throw new IllegalStateException("Not allowed to change provisioning state unless a "
6022                      + "device or profile owner is set.");
6023        }
6024
6025        synchronized (this) {
6026            boolean transitionCheckNeeded = true;
6027
6028            // Calling identity/permission checks.
6029            final int callingUid = mInjector.binderGetCallingUid();
6030            if (callingUid == Process.SHELL_UID || callingUid == Process.ROOT_UID) {
6031                // ADB shell can only move directly from un-managed to finalized as part of directly
6032                // setting profile-owner or device-owner.
6033                if (getUserProvisioningState(userHandle) !=
6034                        DevicePolicyManager.STATE_USER_UNMANAGED
6035                        || newState != DevicePolicyManager.STATE_USER_SETUP_FINALIZED) {
6036                    throw new IllegalStateException("Not allowed to change provisioning state "
6037                            + "unless current provisioning state is unmanaged, and new state is "
6038                            + "finalized.");
6039                }
6040                transitionCheckNeeded = false;
6041            } else {
6042                // For all other cases, caller must have MANAGE_PROFILE_AND_DEVICE_OWNERS.
6043                enforceCanManageProfileAndDeviceOwners();
6044            }
6045
6046            final DevicePolicyData policyData = getUserData(userHandle);
6047            if (transitionCheckNeeded) {
6048                // Optional state transition check for non-ADB case.
6049                checkUserProvisioningStateTransition(policyData.mUserProvisioningState, newState);
6050            }
6051            policyData.mUserProvisioningState = newState;
6052            saveSettingsLocked(userHandle);
6053        }
6054    }
6055
6056    private void checkUserProvisioningStateTransition(int currentState, int newState) {
6057        // Valid transitions for normal use-cases.
6058        switch (currentState) {
6059            case DevicePolicyManager.STATE_USER_UNMANAGED:
6060                // Can move to any state from unmanaged (except itself as an edge case)..
6061                if (newState != DevicePolicyManager.STATE_USER_UNMANAGED) {
6062                    return;
6063                }
6064                break;
6065            case DevicePolicyManager.STATE_USER_SETUP_INCOMPLETE:
6066            case DevicePolicyManager.STATE_USER_SETUP_COMPLETE:
6067                // Can only move to finalized from these states.
6068                if (newState == DevicePolicyManager.STATE_USER_SETUP_FINALIZED) {
6069                    return;
6070                }
6071                break;
6072            case DevicePolicyManager.STATE_USER_PROFILE_COMPLETE:
6073                // Current user has a managed-profile, but current user is not managed, so
6074                // rather than moving to finalized state, go back to unmanaged once
6075                // profile provisioning is complete.
6076                if (newState == DevicePolicyManager.STATE_USER_UNMANAGED) {
6077                    return;
6078                }
6079                break;
6080            case DevicePolicyManager.STATE_USER_SETUP_FINALIZED:
6081                // Cannot transition out of finalized.
6082                break;
6083        }
6084
6085        // Didn't meet any of the accepted state transition checks above, throw appropriate error.
6086        throw new IllegalStateException("Cannot move to user provisioning state [" + newState + "] "
6087                + "from state [" + currentState + "]");
6088    }
6089
6090    @Override
6091    public void setProfileEnabled(ComponentName who) {
6092        if (!mHasFeature) {
6093            return;
6094        }
6095        Preconditions.checkNotNull(who, "ComponentName is null");
6096        synchronized (this) {
6097            // Check if this is the profile owner who is calling
6098            getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
6099            final int userId = UserHandle.getCallingUserId();
6100            enforceManagedProfile(userId, "enable the profile");
6101            // Check if the profile is already enabled.
6102            UserInfo managedProfile = getUserInfo(userId);
6103            if (managedProfile.isEnabled()) {
6104                Slog.e(LOG_TAG,
6105                        "setProfileEnabled is called when the profile is already enabled");
6106                return;
6107            }
6108            long id = mInjector.binderClearCallingIdentity();
6109            try {
6110                mUserManager.setUserEnabled(userId);
6111                UserInfo parent = mUserManager.getProfileParent(userId);
6112                Intent intent = new Intent(Intent.ACTION_MANAGED_PROFILE_ADDED);
6113                intent.putExtra(Intent.EXTRA_USER, new UserHandle(userId));
6114                intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY |
6115                        Intent.FLAG_RECEIVER_FOREGROUND);
6116                mContext.sendBroadcastAsUser(intent, new UserHandle(parent.id));
6117            } finally {
6118                mInjector.binderRestoreCallingIdentity(id);
6119            }
6120        }
6121    }
6122
6123    @Override
6124    public void setProfileName(ComponentName who, String profileName) {
6125        Preconditions.checkNotNull(who, "ComponentName is null");
6126        int userId = UserHandle.getCallingUserId();
6127        // Check if this is the profile owner (includes device owner).
6128        getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
6129
6130        long id = mInjector.binderClearCallingIdentity();
6131        try {
6132            mUserManager.setUserName(userId, profileName);
6133        } finally {
6134            mInjector.binderRestoreCallingIdentity(id);
6135        }
6136    }
6137
6138    @Override
6139    public ComponentName getProfileOwner(int userHandle) {
6140        if (!mHasFeature) {
6141            return null;
6142        }
6143
6144        synchronized (this) {
6145            return mOwners.getProfileOwnerComponent(userHandle);
6146        }
6147    }
6148
6149    // Returns the active profile owner for this user or null if the current user has no
6150    // profile owner.
6151    @VisibleForTesting
6152    ActiveAdmin getProfileOwnerAdminLocked(int userHandle) {
6153        ComponentName profileOwner = mOwners.getProfileOwnerComponent(userHandle);
6154        if (profileOwner == null) {
6155            return null;
6156        }
6157        DevicePolicyData policy = getUserData(userHandle);
6158        final int n = policy.mAdminList.size();
6159        for (int i = 0; i < n; i++) {
6160            ActiveAdmin admin = policy.mAdminList.get(i);
6161            if (profileOwner.equals(admin.info.getComponent())) {
6162                return admin;
6163            }
6164        }
6165        return null;
6166    }
6167
6168    @Override
6169    public String getProfileOwnerName(int userHandle) {
6170        if (!mHasFeature) {
6171            return null;
6172        }
6173        enforceManageUsers();
6174        ComponentName profileOwner = getProfileOwner(userHandle);
6175        if (profileOwner == null) {
6176            return null;
6177        }
6178        return getApplicationLabel(profileOwner.getPackageName(), userHandle);
6179    }
6180
6181    /**
6182     * Canonical name for a given package.
6183     */
6184    private String getApplicationLabel(String packageName, int userHandle) {
6185        long token = mInjector.binderClearCallingIdentity();
6186        try {
6187            final Context userContext;
6188            try {
6189                UserHandle handle = new UserHandle(userHandle);
6190                userContext = mContext.createPackageContextAsUser(packageName, 0, handle);
6191            } catch (PackageManager.NameNotFoundException nnfe) {
6192                Log.w(LOG_TAG, packageName + " is not installed for user " + userHandle, nnfe);
6193                return null;
6194            }
6195            ApplicationInfo appInfo = userContext.getApplicationInfo();
6196            CharSequence result = null;
6197            if (appInfo != null) {
6198                PackageManager pm = userContext.getPackageManager();
6199                result = pm.getApplicationLabel(appInfo);
6200            }
6201            return result != null ? result.toString() : null;
6202        } finally {
6203            mInjector.binderRestoreCallingIdentity(token);
6204        }
6205    }
6206
6207    /**
6208     * The profile owner can only be set by adb or an app with the MANAGE_PROFILE_AND_DEVICE_OWNERS
6209     * permission.
6210     * The profile owner can only be set before the user setup phase has completed,
6211     * except for:
6212     * - SYSTEM_UID
6213     * - adb if there are not accounts.
6214     */
6215    private void enforceCanSetProfileOwnerLocked(int userHandle) {
6216        UserInfo info = getUserInfo(userHandle);
6217        if (info == null) {
6218            // User doesn't exist.
6219            throw new IllegalArgumentException(
6220                    "Attempted to set profile owner for invalid userId: " + userHandle);
6221        }
6222        if (info.isGuest()) {
6223            throw new IllegalStateException("Cannot set a profile owner on a guest");
6224        }
6225        if (mOwners.hasProfileOwner(userHandle)) {
6226            throw new IllegalStateException("Trying to set the profile owner, but profile owner "
6227                    + "is already set.");
6228        }
6229        if (mOwners.hasDeviceOwner() && mOwners.getDeviceOwnerUserId() == userHandle) {
6230            throw new IllegalStateException("Trying to set the profile owner, but the user "
6231                    + "already has a device owner.");
6232        }
6233        int callingUid = mInjector.binderGetCallingUid();
6234        if (callingUid == Process.SHELL_UID || callingUid == Process.ROOT_UID) {
6235            if (hasUserSetupCompleted(userHandle) &&
6236                    AccountManager.get(mContext).getAccountsAsUser(userHandle).length > 0) {
6237                throw new IllegalStateException("Not allowed to set the profile owner because "
6238                        + "there are already some accounts on the profile");
6239            }
6240            return;
6241        }
6242        enforceCanManageProfileAndDeviceOwners();
6243        if (hasUserSetupCompleted(userHandle) && !isCallerWithSystemUid()) {
6244            throw new IllegalStateException("Cannot set the profile owner on a user which is "
6245                    + "already set-up");
6246        }
6247    }
6248
6249    /**
6250     * The Device owner can only be set by adb or an app with the MANAGE_PROFILE_AND_DEVICE_OWNERS
6251     * permission.
6252     */
6253    private void enforceCanSetDeviceOwnerLocked(int userId) {
6254        int callingUid = mInjector.binderGetCallingUid();
6255        boolean isAdb = callingUid == Process.SHELL_UID || callingUid == Process.ROOT_UID;
6256        if (!isAdb) {
6257            enforceCanManageProfileAndDeviceOwners();
6258        }
6259
6260        final int code = checkSetDeviceOwnerPreCondition(userId, isAdb);
6261        switch (code) {
6262            case CODE_OK:
6263                return;
6264            case CODE_HAS_DEVICE_OWNER:
6265                throw new IllegalStateException(
6266                        "Trying to set the device owner, but device owner is already set.");
6267            case CODE_USER_HAS_PROFILE_OWNER:
6268                throw new IllegalStateException("Trying to set the device owner, but the user "
6269                        + "already has a profile owner.");
6270            case CODE_USER_NOT_RUNNING:
6271                throw new IllegalStateException("User not running: " + userId);
6272            case CODE_NOT_SYSTEM_USER:
6273                throw new IllegalStateException("User is not system user");
6274            case CODE_USER_SETUP_COMPLETED:
6275                throw new IllegalStateException(
6276                        "Cannot set the device owner if the device is already set-up");
6277            case CODE_NONSYSTEM_USER_EXISTS:
6278                throw new IllegalStateException("Not allowed to set the device owner because there "
6279                        + "are already several users on the device");
6280            case CODE_ACCOUNTS_NOT_EMPTY:
6281                throw new IllegalStateException("Not allowed to set the device owner because there "
6282                        + "are already some accounts on the device");
6283            default:
6284                throw new IllegalStateException("Unknown @DeviceOwnerPreConditionCode " + code);
6285        }
6286    }
6287
6288    private void enforceUserUnlocked(int userId) {
6289        // Since we're doing this operation on behalf of an app, we only
6290        // want to use the actual "unlocked" state.
6291        Preconditions.checkState(mUserManager.isUserUnlocked(userId),
6292                "User must be running and unlocked");
6293    }
6294
6295    private void enforceManageUsers() {
6296        final int callingUid = mInjector.binderGetCallingUid();
6297        if (!(isCallerWithSystemUid() || callingUid == Process.ROOT_UID)) {
6298            mContext.enforceCallingOrSelfPermission(android.Manifest.permission.MANAGE_USERS, null);
6299        }
6300    }
6301
6302    private void enforceFullCrossUsersPermission(int userHandle) {
6303        enforceSystemUserOrPermission(userHandle,
6304                android.Manifest.permission.INTERACT_ACROSS_USERS_FULL);
6305    }
6306
6307    private void enforceCrossUsersPermission(int userHandle) {
6308        enforceSystemUserOrPermission(userHandle,
6309                android.Manifest.permission.INTERACT_ACROSS_USERS);
6310    }
6311
6312    private void enforceSystemUserOrPermission(int userHandle, String permission) {
6313        if (userHandle < 0) {
6314            throw new IllegalArgumentException("Invalid userId " + userHandle);
6315        }
6316        final int callingUid = mInjector.binderGetCallingUid();
6317        if (userHandle == UserHandle.getUserId(callingUid)) {
6318            return;
6319        }
6320        if (!(isCallerWithSystemUid() || callingUid == Process.ROOT_UID)) {
6321            mContext.enforceCallingOrSelfPermission(permission,
6322                    "Must be system or have " + permission + " permission");
6323        }
6324    }
6325
6326    private void enforceManagedProfile(int userHandle, String message) {
6327        if(!isManagedProfile(userHandle)) {
6328            throw new SecurityException("You can not " + message + " outside a managed profile.");
6329        }
6330    }
6331
6332    private void enforceNotManagedProfile(int userHandle, String message) {
6333        if(isManagedProfile(userHandle)) {
6334            throw new SecurityException("You can not " + message + " for a managed profile.");
6335        }
6336    }
6337
6338    private void ensureCallerPackage(@Nullable String packageName) {
6339        if (packageName == null) {
6340            Preconditions.checkState(isCallerWithSystemUid(),
6341                    "Only caller can omit package name");
6342        } else {
6343            final int callingUid = mInjector.binderGetCallingUid();
6344            final int userId = mInjector.userHandleGetCallingUserId();
6345            try {
6346                final ApplicationInfo ai = mIPackageManager.getApplicationInfo(
6347                        packageName, 0, userId);
6348                Preconditions.checkState(ai.uid == callingUid, "Unmatching package name");
6349            } catch (RemoteException e) {
6350                // Shouldn't happen
6351            }
6352        }
6353    }
6354
6355    private boolean isCallerWithSystemUid() {
6356        return UserHandle.isSameApp(mInjector.binderGetCallingUid(), Process.SYSTEM_UID);
6357    }
6358
6359    private int getProfileParentId(int userHandle) {
6360        final long ident = mInjector.binderClearCallingIdentity();
6361        try {
6362            UserInfo parentUser = mUserManager.getProfileParent(userHandle);
6363            return parentUser != null ? parentUser.id : userHandle;
6364        } finally {
6365            mInjector.binderRestoreCallingIdentity(ident);
6366        }
6367    }
6368
6369    private int getCredentialOwner(int userHandle, boolean parent) {
6370        final long ident = mInjector.binderClearCallingIdentity();
6371        try {
6372            if (parent) {
6373                UserInfo parentProfile = mUserManager.getProfileParent(userHandle);
6374                if (parentProfile != null) {
6375                    userHandle = parentProfile.id;
6376                }
6377            }
6378            return mUserManager.getCredentialOwnerProfile(userHandle);
6379        } finally {
6380            mInjector.binderRestoreCallingIdentity(ident);
6381        }
6382    }
6383
6384    private boolean isManagedProfile(int userHandle) {
6385        return getUserInfo(userHandle).isManagedProfile();
6386    }
6387
6388    private void enableIfNecessary(String packageName, int userId) {
6389        try {
6390            ApplicationInfo ai = mIPackageManager.getApplicationInfo(packageName,
6391                    PackageManager.GET_DISABLED_UNTIL_USED_COMPONENTS,
6392                    userId);
6393            if (ai.enabledSetting
6394                    == PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED) {
6395                mIPackageManager.setApplicationEnabledSetting(packageName,
6396                        PackageManager.COMPONENT_ENABLED_STATE_DEFAULT,
6397                        PackageManager.DONT_KILL_APP, userId, "DevicePolicyManager");
6398            }
6399        } catch (RemoteException e) {
6400        }
6401    }
6402
6403    @Override
6404    protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
6405        if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.DUMP)
6406                != PackageManager.PERMISSION_GRANTED) {
6407
6408            pw.println("Permission Denial: can't dump DevicePolicyManagerService from from pid="
6409                    + mInjector.binderGetCallingPid()
6410                    + ", uid=" + mInjector.binderGetCallingUid());
6411            return;
6412        }
6413
6414        synchronized (this) {
6415            pw.println("Current Device Policy Manager state:");
6416            mOwners.dump("  ", pw);
6417            int userCount = mUserData.size();
6418            for (int u = 0; u < userCount; u++) {
6419                DevicePolicyData policy = getUserData(mUserData.keyAt(u));
6420                pw.println();
6421                pw.println("  Enabled Device Admins (User " + policy.mUserHandle
6422                        + ", provisioningState: " + policy.mUserProvisioningState + "):");
6423                final int N = policy.mAdminList.size();
6424                for (int i=0; i<N; i++) {
6425                    ActiveAdmin ap = policy.mAdminList.get(i);
6426                    if (ap != null) {
6427                        pw.print("    "); pw.print(ap.info.getComponent().flattenToShortString());
6428                                pw.println(":");
6429                        ap.dump("      ", pw);
6430                    }
6431                }
6432                if (!policy.mRemovingAdmins.isEmpty()) {
6433                    pw.println("    Removing Device Admins (User " + policy.mUserHandle + "): "
6434                            + policy.mRemovingAdmins);
6435                }
6436
6437                pw.println(" ");
6438                pw.print("    mPasswordOwner="); pw.println(policy.mPasswordOwner);
6439            }
6440            pw.println();
6441            pw.println("Encryption Status: " + getEncryptionStatusName(getEncryptionStatus()));
6442        }
6443    }
6444
6445    private String getEncryptionStatusName(int encryptionStatus) {
6446        switch (encryptionStatus) {
6447            case DevicePolicyManager.ENCRYPTION_STATUS_INACTIVE:
6448                return "inactive";
6449            case DevicePolicyManager.ENCRYPTION_STATUS_ACTIVE_DEFAULT_KEY:
6450                return "block default key";
6451            case DevicePolicyManager.ENCRYPTION_STATUS_ACTIVE:
6452                return "block";
6453            case DevicePolicyManager.ENCRYPTION_STATUS_ACTIVE_PER_USER:
6454                return "per-user";
6455            case DevicePolicyManager.ENCRYPTION_STATUS_UNSUPPORTED:
6456                return "unsupported";
6457            case DevicePolicyManager.ENCRYPTION_STATUS_ACTIVATING:
6458                return "activating";
6459            default:
6460                return "unknown";
6461        }
6462    }
6463
6464    @Override
6465    public void addPersistentPreferredActivity(ComponentName who, IntentFilter filter,
6466            ComponentName activity) {
6467        Preconditions.checkNotNull(who, "ComponentName is null");
6468        final int userHandle = UserHandle.getCallingUserId();
6469        synchronized (this) {
6470            getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
6471
6472            long id = mInjector.binderClearCallingIdentity();
6473            try {
6474                mIPackageManager.addPersistentPreferredActivity(filter, activity, userHandle);
6475            } catch (RemoteException re) {
6476                // Shouldn't happen
6477            } finally {
6478                mInjector.binderRestoreCallingIdentity(id);
6479            }
6480        }
6481    }
6482
6483    @Override
6484    public void clearPackagePersistentPreferredActivities(ComponentName who, String packageName) {
6485        Preconditions.checkNotNull(who, "ComponentName is null");
6486        final int userHandle = UserHandle.getCallingUserId();
6487        synchronized (this) {
6488            getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
6489
6490            long id = mInjector.binderClearCallingIdentity();
6491            try {
6492                mIPackageManager.clearPackagePersistentPreferredActivities(packageName, userHandle);
6493            } catch (RemoteException re) {
6494                // Shouldn't happen
6495            } finally {
6496                mInjector.binderRestoreCallingIdentity(id);
6497            }
6498        }
6499    }
6500
6501    @Override
6502    public boolean setApplicationRestrictionsManagingPackage(ComponentName admin,
6503            String packageName) {
6504        Preconditions.checkNotNull(admin, "ComponentName is null");
6505
6506        final int userHandle = mInjector.userHandleGetCallingUserId();
6507        synchronized (this) {
6508            getActiveAdminForCallerLocked(admin, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
6509            if (packageName != null && !isPackageInstalledForUser(packageName, userHandle)) {
6510                return false;
6511            }
6512            DevicePolicyData policy = getUserData(userHandle);
6513            policy.mApplicationRestrictionsManagingPackage = packageName;
6514            saveSettingsLocked(userHandle);
6515            return true;
6516        }
6517    }
6518
6519    @Override
6520    public String getApplicationRestrictionsManagingPackage(ComponentName admin) {
6521        Preconditions.checkNotNull(admin, "ComponentName is null");
6522
6523        final int userHandle = mInjector.userHandleGetCallingUserId();
6524        synchronized (this) {
6525            getActiveAdminForCallerLocked(admin, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
6526            DevicePolicyData policy = getUserData(userHandle);
6527            return policy.mApplicationRestrictionsManagingPackage;
6528        }
6529    }
6530
6531    @Override
6532    public boolean isCallerApplicationRestrictionsManagingPackage() {
6533        final int callingUid = mInjector.binderGetCallingUid();
6534        final int userHandle = UserHandle.getUserId(callingUid);
6535        synchronized (this) {
6536            final DevicePolicyData policy = getUserData(userHandle);
6537            if (policy.mApplicationRestrictionsManagingPackage == null) {
6538                return false;
6539            }
6540
6541            try {
6542                int uid = mContext.getPackageManager().getPackageUidAsUser(
6543                        policy.mApplicationRestrictionsManagingPackage, userHandle);
6544                return uid == callingUid;
6545            } catch (NameNotFoundException e) {
6546                return false;
6547            }
6548        }
6549    }
6550
6551    private void enforceCanManageApplicationRestrictions(ComponentName who) {
6552        if (who != null) {
6553            synchronized (this) {
6554                getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
6555            }
6556        } else if (!isCallerApplicationRestrictionsManagingPackage()) {
6557            throw new SecurityException(
6558                    "No admin component given, and caller cannot manage application restrictions "
6559                    + "for other apps.");
6560        }
6561    }
6562
6563    @Override
6564    public void setApplicationRestrictions(ComponentName who, String packageName, Bundle settings) {
6565        enforceCanManageApplicationRestrictions(who);
6566
6567        final UserHandle userHandle = mInjector.binderGetCallingUserHandle();
6568        final long id = mInjector.binderClearCallingIdentity();
6569        try {
6570            mUserManager.setApplicationRestrictions(packageName, settings, userHandle);
6571        } finally {
6572            mInjector.binderRestoreCallingIdentity(id);
6573        }
6574    }
6575
6576    @Override
6577    public void setTrustAgentConfiguration(ComponentName admin, ComponentName agent,
6578            PersistableBundle args, boolean parent) {
6579        if (!mHasFeature) {
6580            return;
6581        }
6582        Preconditions.checkNotNull(admin, "admin is null");
6583        Preconditions.checkNotNull(agent, "agent is null");
6584        final int userHandle = UserHandle.getCallingUserId();
6585        synchronized (this) {
6586            ActiveAdmin ap = getActiveAdminForCallerLocked(admin,
6587                    DeviceAdminInfo.USES_POLICY_DISABLE_KEYGUARD_FEATURES, parent);
6588            ap.trustAgentInfos.put(agent.flattenToString(), new TrustAgentInfo(args));
6589            saveSettingsLocked(userHandle);
6590        }
6591    }
6592
6593    @Override
6594    public List<PersistableBundle> getTrustAgentConfiguration(ComponentName admin,
6595            ComponentName agent, int userHandle, boolean parent) {
6596        if (!mHasFeature) {
6597            return null;
6598        }
6599        Preconditions.checkNotNull(agent, "agent null");
6600        enforceFullCrossUsersPermission(userHandle);
6601
6602        synchronized (this) {
6603            final String componentName = agent.flattenToString();
6604            if (admin != null) {
6605                final ActiveAdmin ap = getActiveAdminUncheckedLocked(admin, userHandle, parent);
6606                if (ap == null) return null;
6607                TrustAgentInfo trustAgentInfo = ap.trustAgentInfos.get(componentName);
6608                if (trustAgentInfo == null || trustAgentInfo.options == null) return null;
6609                List<PersistableBundle> result = new ArrayList<>();
6610                result.add(trustAgentInfo.options);
6611                return result;
6612            }
6613
6614            // Return strictest policy for this user and profiles that are visible from this user.
6615            List<PersistableBundle> result = null;
6616            // Search through all admins that use KEYGUARD_DISABLE_TRUST_AGENTS and keep track
6617            // of the options. If any admin doesn't have options, discard options for the rest
6618            // and return null.
6619            List<ActiveAdmin> admins =
6620                    getActiveAdminsForLockscreenPoliciesLocked(userHandle, parent);
6621            boolean allAdminsHaveOptions = true;
6622            final int N = admins.size();
6623            for (int i = 0; i < N; i++) {
6624                final ActiveAdmin active = admins.get(i);
6625
6626                final boolean disablesTrust = (active.disabledKeyguardFeatures
6627                        & DevicePolicyManager.KEYGUARD_DISABLE_TRUST_AGENTS) != 0;
6628                final TrustAgentInfo info = active.trustAgentInfos.get(componentName);
6629                if (info != null && info.options != null && !info.options.isEmpty()) {
6630                    if (disablesTrust) {
6631                        if (result == null) {
6632                            result = new ArrayList<>();
6633                        }
6634                        result.add(info.options);
6635                    } else {
6636                        Log.w(LOG_TAG, "Ignoring admin " + active.info
6637                                + " because it has trust options but doesn't declare "
6638                                + "KEYGUARD_DISABLE_TRUST_AGENTS");
6639                    }
6640                } else if (disablesTrust) {
6641                    allAdminsHaveOptions = false;
6642                    break;
6643                }
6644            }
6645            return allAdminsHaveOptions ? result : null;
6646        }
6647    }
6648
6649    @Override
6650    public void setRestrictionsProvider(ComponentName who, ComponentName permissionProvider) {
6651        Preconditions.checkNotNull(who, "ComponentName is null");
6652        synchronized (this) {
6653            getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
6654
6655            int userHandle = UserHandle.getCallingUserId();
6656            DevicePolicyData userData = getUserData(userHandle);
6657            userData.mRestrictionsProvider = permissionProvider;
6658            saveSettingsLocked(userHandle);
6659        }
6660    }
6661
6662    @Override
6663    public ComponentName getRestrictionsProvider(int userHandle) {
6664        synchronized (this) {
6665            if (!isCallerWithSystemUid()) {
6666                throw new SecurityException("Only the system can query the permission provider");
6667            }
6668            DevicePolicyData userData = getUserData(userHandle);
6669            return userData != null ? userData.mRestrictionsProvider : null;
6670        }
6671    }
6672
6673    @Override
6674    public void addCrossProfileIntentFilter(ComponentName who, IntentFilter filter, int flags) {
6675        Preconditions.checkNotNull(who, "ComponentName is null");
6676        int callingUserId = UserHandle.getCallingUserId();
6677        synchronized (this) {
6678            getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
6679
6680            long id = mInjector.binderClearCallingIdentity();
6681            try {
6682                UserInfo parent = mUserManager.getProfileParent(callingUserId);
6683                if (parent == null) {
6684                    Slog.e(LOG_TAG, "Cannot call addCrossProfileIntentFilter if there is no "
6685                            + "parent");
6686                    return;
6687                }
6688                if ((flags & DevicePolicyManager.FLAG_PARENT_CAN_ACCESS_MANAGED) != 0) {
6689                    mIPackageManager.addCrossProfileIntentFilter(
6690                            filter, who.getPackageName(), callingUserId, parent.id, 0);
6691                }
6692                if ((flags & DevicePolicyManager.FLAG_MANAGED_CAN_ACCESS_PARENT) != 0) {
6693                    mIPackageManager.addCrossProfileIntentFilter(filter, who.getPackageName(),
6694                            parent.id, callingUserId, 0);
6695                }
6696            } catch (RemoteException re) {
6697                // Shouldn't happen
6698            } finally {
6699                mInjector.binderRestoreCallingIdentity(id);
6700            }
6701        }
6702    }
6703
6704    @Override
6705    public void clearCrossProfileIntentFilters(ComponentName who) {
6706        Preconditions.checkNotNull(who, "ComponentName is null");
6707        int callingUserId = UserHandle.getCallingUserId();
6708        synchronized (this) {
6709            getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
6710            long id = mInjector.binderClearCallingIdentity();
6711            try {
6712                UserInfo parent = mUserManager.getProfileParent(callingUserId);
6713                if (parent == null) {
6714                    Slog.e(LOG_TAG, "Cannot call clearCrossProfileIntentFilter if there is no "
6715                            + "parent");
6716                    return;
6717                }
6718                // Removing those that go from the managed profile to the parent.
6719                mIPackageManager.clearCrossProfileIntentFilters(
6720                        callingUserId, who.getPackageName());
6721                // And those that go from the parent to the managed profile.
6722                // If we want to support multiple managed profiles, we will have to only remove
6723                // those that have callingUserId as their target.
6724                mIPackageManager.clearCrossProfileIntentFilters(parent.id, who.getPackageName());
6725            } catch (RemoteException re) {
6726                // Shouldn't happen
6727            } finally {
6728                mInjector.binderRestoreCallingIdentity(id);
6729            }
6730        }
6731    }
6732
6733    /**
6734     * @return true if all packages in enabledPackages are either in the list
6735     * permittedList or are a system app.
6736     */
6737    private boolean checkPackagesInPermittedListOrSystem(List<String> enabledPackages,
6738            List<String> permittedList, int userIdToCheck) {
6739        long id = mInjector.binderClearCallingIdentity();
6740        try {
6741            // If we have an enabled packages list for a managed profile the packages
6742            // we should check are installed for the parent user.
6743            UserInfo user = getUserInfo(userIdToCheck);
6744            if (user.isManagedProfile()) {
6745                userIdToCheck = user.profileGroupId;
6746            }
6747
6748            for (String enabledPackage : enabledPackages) {
6749                boolean systemService = false;
6750                try {
6751                    ApplicationInfo applicationInfo = mIPackageManager.getApplicationInfo(
6752                            enabledPackage, PackageManager.GET_UNINSTALLED_PACKAGES, userIdToCheck);
6753                    systemService = (applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0;
6754                } catch (RemoteException e) {
6755                    Log.i(LOG_TAG, "Can't talk to package managed", e);
6756                }
6757                if (!systemService && !permittedList.contains(enabledPackage)) {
6758                    return false;
6759                }
6760            }
6761        } finally {
6762            mInjector.binderRestoreCallingIdentity(id);
6763        }
6764        return true;
6765    }
6766
6767    private AccessibilityManager getAccessibilityManagerForUser(int userId) {
6768        // Not using AccessibilityManager.getInstance because that guesses
6769        // at the user you require based on callingUid and caches for a given
6770        // process.
6771        IBinder iBinder = ServiceManager.getService(Context.ACCESSIBILITY_SERVICE);
6772        IAccessibilityManager service = iBinder == null
6773                ? null : IAccessibilityManager.Stub.asInterface(iBinder);
6774        return new AccessibilityManager(mContext, service, userId);
6775    }
6776
6777    @Override
6778    public boolean setPermittedAccessibilityServices(ComponentName who, List packageList) {
6779        if (!mHasFeature) {
6780            return false;
6781        }
6782        Preconditions.checkNotNull(who, "ComponentName is null");
6783
6784        if (packageList != null) {
6785            int userId = UserHandle.getCallingUserId();
6786            List<AccessibilityServiceInfo> enabledServices = null;
6787            long id = mInjector.binderClearCallingIdentity();
6788            try {
6789                UserInfo user = getUserInfo(userId);
6790                if (user.isManagedProfile()) {
6791                    userId = user.profileGroupId;
6792                }
6793                AccessibilityManager accessibilityManager = getAccessibilityManagerForUser(userId);
6794                enabledServices = accessibilityManager.getEnabledAccessibilityServiceList(
6795                        AccessibilityServiceInfo.FEEDBACK_ALL_MASK);
6796            } finally {
6797                mInjector.binderRestoreCallingIdentity(id);
6798            }
6799
6800            if (enabledServices != null) {
6801                List<String> enabledPackages = new ArrayList<String>();
6802                for (AccessibilityServiceInfo service : enabledServices) {
6803                    enabledPackages.add(service.getResolveInfo().serviceInfo.packageName);
6804                }
6805                if (!checkPackagesInPermittedListOrSystem(enabledPackages, packageList,
6806                        userId)) {
6807                    Slog.e(LOG_TAG, "Cannot set permitted accessibility services, "
6808                            + "because it contains already enabled accesibility services.");
6809                    return false;
6810                }
6811            }
6812        }
6813
6814        synchronized (this) {
6815            ActiveAdmin admin = getActiveAdminForCallerLocked(who,
6816                    DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
6817            admin.permittedAccessiblityServices = packageList;
6818            saveSettingsLocked(UserHandle.getCallingUserId());
6819        }
6820        return true;
6821    }
6822
6823    @Override
6824    public List getPermittedAccessibilityServices(ComponentName who) {
6825        if (!mHasFeature) {
6826            return null;
6827        }
6828        Preconditions.checkNotNull(who, "ComponentName is null");
6829
6830        synchronized (this) {
6831            ActiveAdmin admin = getActiveAdminForCallerLocked(who,
6832                    DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
6833            return admin.permittedAccessiblityServices;
6834        }
6835    }
6836
6837    @Override
6838    public List getPermittedAccessibilityServicesForUser(int userId) {
6839        if (!mHasFeature) {
6840            return null;
6841        }
6842        synchronized (this) {
6843            List<String> result = null;
6844            // If we have multiple profiles we return the intersection of the
6845            // permitted lists. This can happen in cases where we have a device
6846            // and profile owner.
6847            int[] profileIds = mUserManager.getProfileIdsWithDisabled(userId);
6848            for (int profileId : profileIds) {
6849                // Just loop though all admins, only device or profiles
6850                // owners can have permitted lists set.
6851                DevicePolicyData policy = getUserDataUnchecked(profileId);
6852                final int N = policy.mAdminList.size();
6853                for (int j = 0; j < N; j++) {
6854                    ActiveAdmin admin = policy.mAdminList.get(j);
6855                    List<String> fromAdmin = admin.permittedAccessiblityServices;
6856                    if (fromAdmin != null) {
6857                        if (result == null) {
6858                            result = new ArrayList<>(fromAdmin);
6859                        } else {
6860                            result.retainAll(fromAdmin);
6861                        }
6862                    }
6863                }
6864            }
6865
6866            // If we have a permitted list add all system accessibility services.
6867            if (result != null) {
6868                long id = mInjector.binderClearCallingIdentity();
6869                try {
6870                    UserInfo user = getUserInfo(userId);
6871                    if (user.isManagedProfile()) {
6872                        userId = user.profileGroupId;
6873                    }
6874                    AccessibilityManager accessibilityManager =
6875                            getAccessibilityManagerForUser(userId);
6876                    List<AccessibilityServiceInfo> installedServices =
6877                            accessibilityManager.getInstalledAccessibilityServiceList();
6878
6879                    if (installedServices != null) {
6880                        for (AccessibilityServiceInfo service : installedServices) {
6881                            ServiceInfo serviceInfo = service.getResolveInfo().serviceInfo;
6882                            ApplicationInfo applicationInfo = serviceInfo.applicationInfo;
6883                            if ((applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0) {
6884                                result.add(serviceInfo.packageName);
6885                            }
6886                        }
6887                    }
6888                } finally {
6889                    mInjector.binderRestoreCallingIdentity(id);
6890                }
6891            }
6892
6893            return result;
6894        }
6895    }
6896
6897    @Override
6898    public boolean isAccessibilityServicePermittedByAdmin(ComponentName who, String packageName,
6899            int userHandle) {
6900        if (!mHasFeature) {
6901            return true;
6902        }
6903        Preconditions.checkNotNull(who, "ComponentName is null");
6904        Preconditions.checkStringNotEmpty(packageName, "packageName is null");
6905        if (!isCallerWithSystemUid()){
6906            throw new SecurityException(
6907                    "Only the system can query if an accessibility service is disabled by admin");
6908        }
6909        synchronized (this) {
6910            ActiveAdmin admin = getActiveAdminUncheckedLocked(who, userHandle);
6911            if (admin == null) {
6912                return false;
6913            }
6914            if (admin.permittedAccessiblityServices == null) {
6915                return true;
6916            }
6917            return checkPackagesInPermittedListOrSystem(Arrays.asList(packageName),
6918                    admin.permittedAccessiblityServices, userHandle);
6919        }
6920    }
6921
6922    private boolean checkCallerIsCurrentUserOrProfile() {
6923        int callingUserId = UserHandle.getCallingUserId();
6924        long token = mInjector.binderClearCallingIdentity();
6925        try {
6926            UserInfo currentUser;
6927            UserInfo callingUser = getUserInfo(callingUserId);
6928            try {
6929                currentUser = mInjector.getIActivityManager().getCurrentUser();
6930            } catch (RemoteException e) {
6931                Slog.e(LOG_TAG, "Failed to talk to activity managed.", e);
6932                return false;
6933            }
6934
6935            if (callingUser.isManagedProfile() && callingUser.profileGroupId != currentUser.id) {
6936                Slog.e(LOG_TAG, "Cannot set permitted input methods for managed profile "
6937                        + "of a user that isn't the foreground user.");
6938                return false;
6939            }
6940            if (!callingUser.isManagedProfile() && callingUserId != currentUser.id ) {
6941                Slog.e(LOG_TAG, "Cannot set permitted input methods "
6942                        + "of a user that isn't the foreground user.");
6943                return false;
6944            }
6945        } finally {
6946            mInjector.binderRestoreCallingIdentity(token);
6947        }
6948        return true;
6949    }
6950
6951    @Override
6952    public boolean setPermittedInputMethods(ComponentName who, List packageList) {
6953        if (!mHasFeature) {
6954            return false;
6955        }
6956        Preconditions.checkNotNull(who, "ComponentName is null");
6957
6958        // TODO When InputMethodManager supports per user calls remove
6959        //      this restriction.
6960        if (!checkCallerIsCurrentUserOrProfile()) {
6961            return false;
6962        }
6963
6964        if (packageList != null) {
6965            // InputMethodManager fetches input methods for current user.
6966            // So this can only be set when calling user is the current user
6967            // or parent is current user in case of managed profiles.
6968            InputMethodManager inputMethodManager =
6969                    mContext.getSystemService(InputMethodManager.class);
6970            List<InputMethodInfo> enabledImes = inputMethodManager.getEnabledInputMethodList();
6971
6972            if (enabledImes != null) {
6973                List<String> enabledPackages = new ArrayList<String>();
6974                for (InputMethodInfo ime : enabledImes) {
6975                    enabledPackages.add(ime.getPackageName());
6976                }
6977                if (!checkPackagesInPermittedListOrSystem(enabledPackages, packageList,
6978                        mInjector.binderGetCallingUserHandle().getIdentifier())) {
6979                    Slog.e(LOG_TAG, "Cannot set permitted input methods, "
6980                            + "because it contains already enabled input method.");
6981                    return false;
6982                }
6983            }
6984        }
6985
6986        synchronized (this) {
6987            ActiveAdmin admin = getActiveAdminForCallerLocked(who,
6988                    DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
6989            admin.permittedInputMethods = packageList;
6990            saveSettingsLocked(UserHandle.getCallingUserId());
6991        }
6992        return true;
6993    }
6994
6995    @Override
6996    public List getPermittedInputMethods(ComponentName who) {
6997        if (!mHasFeature) {
6998            return null;
6999        }
7000        Preconditions.checkNotNull(who, "ComponentName is null");
7001
7002        synchronized (this) {
7003            ActiveAdmin admin = getActiveAdminForCallerLocked(who,
7004                    DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
7005            return admin.permittedInputMethods;
7006        }
7007    }
7008
7009    @Override
7010    public List getPermittedInputMethodsForCurrentUser() {
7011        UserInfo currentUser;
7012        try {
7013            currentUser = mInjector.getIActivityManager().getCurrentUser();
7014        } catch (RemoteException e) {
7015            Slog.e(LOG_TAG, "Failed to make remote calls to get current user", e);
7016            // Activity managed is dead, just allow all IMEs
7017            return null;
7018        }
7019
7020        int userId = currentUser.id;
7021        synchronized (this) {
7022            List<String> result = null;
7023            // If we have multiple profiles we return the intersection of the
7024            // permitted lists. This can happen in cases where we have a device
7025            // and profile owner.
7026            int[] profileIds = mUserManager.getProfileIdsWithDisabled(userId);
7027            for (int profileId : profileIds) {
7028                // Just loop though all admins, only device or profiles
7029                // owners can have permitted lists set.
7030                DevicePolicyData policy = getUserDataUnchecked(profileId);
7031                final int N = policy.mAdminList.size();
7032                for (int j = 0; j < N; j++) {
7033                    ActiveAdmin admin = policy.mAdminList.get(j);
7034                    List<String> fromAdmin = admin.permittedInputMethods;
7035                    if (fromAdmin != null) {
7036                        if (result == null) {
7037                            result = new ArrayList<String>(fromAdmin);
7038                        } else {
7039                            result.retainAll(fromAdmin);
7040                        }
7041                    }
7042                }
7043            }
7044
7045            // If we have a permitted list add all system input methods.
7046            if (result != null) {
7047                InputMethodManager inputMethodManager =
7048                        mContext.getSystemService(InputMethodManager.class);
7049                List<InputMethodInfo> imes = inputMethodManager.getInputMethodList();
7050                long id = mInjector.binderClearCallingIdentity();
7051                try {
7052                    if (imes != null) {
7053                        for (InputMethodInfo ime : imes) {
7054                            ServiceInfo serviceInfo = ime.getServiceInfo();
7055                            ApplicationInfo applicationInfo = serviceInfo.applicationInfo;
7056                            if ((applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0) {
7057                                result.add(serviceInfo.packageName);
7058                            }
7059                        }
7060                    }
7061                } finally {
7062                    mInjector.binderRestoreCallingIdentity(id);
7063                }
7064            }
7065            return result;
7066        }
7067    }
7068
7069    @Override
7070    public boolean isInputMethodPermittedByAdmin(ComponentName who, String packageName,
7071            int userHandle) {
7072        if (!mHasFeature) {
7073            return true;
7074        }
7075        Preconditions.checkNotNull(who, "ComponentName is null");
7076        Preconditions.checkStringNotEmpty(packageName, "packageName is null");
7077        if (!isCallerWithSystemUid()) {
7078            throw new SecurityException(
7079                    "Only the system can query if an input method is disabled by admin");
7080        }
7081        synchronized (this) {
7082            ActiveAdmin admin = getActiveAdminUncheckedLocked(who, userHandle);
7083            if (admin == null) {
7084                return false;
7085            }
7086            if (admin.permittedInputMethods == null) {
7087                return true;
7088            }
7089            return checkPackagesInPermittedListOrSystem(Arrays.asList(packageName),
7090                    admin.permittedInputMethods, userHandle);
7091        }
7092    }
7093
7094    private void sendAdminEnabledBroadcastLocked(int userHandle) {
7095        DevicePolicyData policyData = getUserData(userHandle);
7096        if (policyData.mAdminBroadcastPending) {
7097            // Send the initialization data to profile owner and delete the data
7098            ActiveAdmin admin = getProfileOwnerAdminLocked(userHandle);
7099            if (admin != null) {
7100                PersistableBundle initBundle = policyData.mInitBundle;
7101                sendAdminCommandLocked(admin, DeviceAdminReceiver.ACTION_DEVICE_ADMIN_ENABLED,
7102                        initBundle == null ? null : new Bundle(initBundle), null);
7103            }
7104            policyData.mInitBundle = null;
7105            policyData.mAdminBroadcastPending = false;
7106            saveSettingsLocked(userHandle);
7107        }
7108    }
7109
7110    @Override
7111    public UserHandle createAndManageUser(ComponentName admin, String name,
7112            ComponentName profileOwner, PersistableBundle adminExtras, int flags) {
7113        Preconditions.checkNotNull(admin, "admin is null");
7114        Preconditions.checkNotNull(profileOwner, "profileOwner is null");
7115        if (!admin.getPackageName().equals(profileOwner.getPackageName())) {
7116            throw new IllegalArgumentException("profileOwner " + profileOwner + " and admin "
7117                    + admin + " are not in the same package");
7118        }
7119        // Only allow the system user to use this method
7120        if (!mInjector.binderGetCallingUserHandle().isSystem()) {
7121            throw new SecurityException("createAndManageUser was called from non-system user");
7122        }
7123        if (!mInjector.userManagerIsSplitSystemUser()
7124                && (flags & DevicePolicyManager.MAKE_USER_EPHEMERAL) != 0) {
7125            throw new IllegalArgumentException(
7126                    "Ephemeral users are only supported on systems with a split system user.");
7127        }
7128        // Create user.
7129        UserHandle user = null;
7130        synchronized (this) {
7131            getActiveAdminForCallerLocked(admin, DeviceAdminInfo.USES_POLICY_DEVICE_OWNER);
7132
7133            final long id = mInjector.binderClearCallingIdentity();
7134            try {
7135                int userInfoFlags = 0;
7136                if ((flags & DevicePolicyManager.MAKE_USER_EPHEMERAL) != 0) {
7137                    userInfoFlags |= UserInfo.FLAG_EPHEMERAL;
7138                }
7139                UserInfo userInfo = mUserManagerInternal.createUserEvenWhenDisallowed(name,
7140                        userInfoFlags);
7141                if (userInfo != null) {
7142                    user = userInfo.getUserHandle();
7143                }
7144            } finally {
7145                mInjector.binderRestoreCallingIdentity(id);
7146            }
7147        }
7148        if (user == null) {
7149            return null;
7150        }
7151        // Set admin.
7152        final long id = mInjector.binderClearCallingIdentity();
7153        try {
7154            final String adminPkg = admin.getPackageName();
7155
7156            final int userHandle = user.getIdentifier();
7157            try {
7158                // Install the profile owner if not present.
7159                if (!mIPackageManager.isPackageAvailable(adminPkg, userHandle)) {
7160                    mIPackageManager.installExistingPackageAsUser(adminPkg, userHandle);
7161                }
7162            } catch (RemoteException e) {
7163                Slog.e(LOG_TAG, "Failed to make remote calls for createAndManageUser, "
7164                        + "removing created user", e);
7165                mUserManager.removeUser(user.getIdentifier());
7166                return null;
7167            }
7168
7169            setActiveAdmin(profileOwner, true, userHandle);
7170            // User is not started yet, the broadcast by setActiveAdmin will not be received.
7171            // So we store adminExtras for broadcasting when the user starts for first time.
7172            synchronized(this) {
7173                DevicePolicyData policyData = getUserData(userHandle);
7174                policyData.mInitBundle = adminExtras;
7175                policyData.mAdminBroadcastPending = true;
7176                saveSettingsLocked(userHandle);
7177            }
7178            final String ownerName = getProfileOwnerName(Process.myUserHandle().getIdentifier());
7179            setProfileOwner(profileOwner, ownerName, userHandle);
7180
7181            if ((flags & DevicePolicyManager.SKIP_SETUP_WIZARD) != 0) {
7182                Settings.Secure.putIntForUser(mContext.getContentResolver(),
7183                        Settings.Secure.USER_SETUP_COMPLETE, 1, userHandle);
7184            }
7185
7186            return user;
7187        } finally {
7188            mInjector.binderRestoreCallingIdentity(id);
7189        }
7190    }
7191
7192    @Override
7193    public boolean removeUser(ComponentName who, UserHandle userHandle) {
7194        Preconditions.checkNotNull(who, "ComponentName is null");
7195        synchronized (this) {
7196            getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_DEVICE_OWNER);
7197
7198            long id = mInjector.binderClearCallingIdentity();
7199            try {
7200                return mUserManager.removeUser(userHandle.getIdentifier());
7201            } finally {
7202                mInjector.binderRestoreCallingIdentity(id);
7203            }
7204        }
7205    }
7206
7207    @Override
7208    public boolean switchUser(ComponentName who, UserHandle userHandle) {
7209        Preconditions.checkNotNull(who, "ComponentName is null");
7210        synchronized (this) {
7211            getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_DEVICE_OWNER);
7212
7213            long id = mInjector.binderClearCallingIdentity();
7214            try {
7215                int userId = UserHandle.USER_SYSTEM;
7216                if (userHandle != null) {
7217                    userId = userHandle.getIdentifier();
7218                }
7219                return mInjector.getIActivityManager().switchUser(userId);
7220            } catch (RemoteException e) {
7221                Log.e(LOG_TAG, "Couldn't switch user", e);
7222                return false;
7223            } finally {
7224                mInjector.binderRestoreCallingIdentity(id);
7225            }
7226        }
7227    }
7228
7229    @Override
7230    public Bundle getApplicationRestrictions(ComponentName who, String packageName) {
7231        enforceCanManageApplicationRestrictions(who);
7232
7233        final UserHandle userHandle = mInjector.binderGetCallingUserHandle();
7234        final long id = mInjector.binderClearCallingIdentity();
7235        try {
7236           Bundle bundle = mUserManager.getApplicationRestrictions(packageName, userHandle);
7237           // if no restrictions were saved, mUserManager.getApplicationRestrictions
7238           // returns null, but DPM method should return an empty Bundle as per JavaDoc
7239           return bundle != null ? bundle : Bundle.EMPTY;
7240        } finally {
7241            mInjector.binderRestoreCallingIdentity(id);
7242        }
7243    }
7244
7245    @Override
7246    public String[] setPackagesSuspended(ComponentName who, String[] packageNames,
7247            boolean suspended) {
7248        Preconditions.checkNotNull(who, "ComponentName is null");
7249        int callingUserId = UserHandle.getCallingUserId();
7250        synchronized (this) {
7251            getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
7252
7253            long id = mInjector.binderClearCallingIdentity();
7254            try {
7255                return mIPackageManager.setPackagesSuspendedAsUser(
7256                        packageNames, suspended, callingUserId);
7257            } catch (RemoteException re) {
7258                // Shouldn't happen.
7259                Slog.e(LOG_TAG, "Failed talking to the package manager", re);
7260            } finally {
7261                mInjector.binderRestoreCallingIdentity(id);
7262            }
7263            return packageNames;
7264        }
7265    }
7266
7267    @Override
7268    public boolean isPackageSuspended(ComponentName who, String packageName) {
7269        Preconditions.checkNotNull(who, "ComponentName is null");
7270        int callingUserId = UserHandle.getCallingUserId();
7271        synchronized (this) {
7272            getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
7273
7274            long id = mInjector.binderClearCallingIdentity();
7275            try {
7276                return mIPackageManager.isPackageSuspendedForUser(packageName, callingUserId);
7277            } catch (RemoteException re) {
7278                // Shouldn't happen.
7279                Slog.e(LOG_TAG, "Failed talking to the package manager", re);
7280            } finally {
7281                mInjector.binderRestoreCallingIdentity(id);
7282            }
7283            return false;
7284        }
7285    }
7286
7287    @Override
7288    public void setUserRestriction(ComponentName who, String key, boolean enabledFromThisOwner) {
7289        Preconditions.checkNotNull(who, "ComponentName is null");
7290        if (!UserRestrictionsUtils.isValidRestriction(key)) {
7291            return;
7292        }
7293
7294        final int userHandle = mInjector.userHandleGetCallingUserId();
7295        synchronized (this) {
7296            ActiveAdmin activeAdmin =
7297                    getActiveAdminForCallerLocked(who,
7298                            DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
7299            final boolean isDeviceOwner = isDeviceOwner(who, userHandle);
7300            if (isDeviceOwner) {
7301                if (!UserRestrictionsUtils.canDeviceOwnerChange(key)) {
7302                    throw new SecurityException("Device owner cannot set user restriction " + key);
7303                }
7304            } else { // profile owner
7305                if (!UserRestrictionsUtils.canProfileOwnerChange(key, userHandle)) {
7306                    throw new SecurityException("Profile owner cannot set user restriction " + key);
7307                }
7308            }
7309
7310            // Save the restriction to ActiveAdmin.
7311            activeAdmin.ensureUserRestrictions().putBoolean(key, enabledFromThisOwner);
7312            saveSettingsLocked(userHandle);
7313
7314            pushUserRestrictions(userHandle);
7315
7316            sendChangedNotification(userHandle);
7317        }
7318    }
7319
7320    private void pushUserRestrictions(int userId) {
7321        synchronized (this) {
7322            final Bundle global;
7323            final Bundle local = new Bundle();
7324            if (mOwners.isDeviceOwnerUserId(userId)) {
7325                global = new Bundle();
7326
7327                final ActiveAdmin deviceOwner = getDeviceOwnerAdminLocked();
7328                if (deviceOwner == null) {
7329                    return; // Shouldn't happen.
7330                }
7331
7332                UserRestrictionsUtils.sortToGlobalAndLocal(deviceOwner.userRestrictions,
7333                        global, local);
7334                // DO can disable camera globally.
7335                if (deviceOwner.disableCamera) {
7336                    global.putBoolean(UserManager.DISALLOW_CAMERA, true);
7337                }
7338            } else {
7339                global = null;
7340
7341                ActiveAdmin profileOwner = getProfileOwnerAdminLocked(userId);
7342                if (profileOwner != null) {
7343                    UserRestrictionsUtils.merge(local, profileOwner.userRestrictions);
7344                }
7345            }
7346            // Also merge in *local* camera restriction.
7347            if (getCameraDisabled(/* who= */ null,
7348                    userId, /* mergeDeviceOwnerRestriction= */ false)) {
7349                local.putBoolean(UserManager.DISALLOW_CAMERA, true);
7350            }
7351            mUserManagerInternal.setDevicePolicyUserRestrictions(userId, local, global);
7352        }
7353    }
7354
7355    @Override
7356    public Bundle getUserRestrictions(ComponentName who) {
7357        if (!mHasFeature) {
7358            return null;
7359        }
7360        Preconditions.checkNotNull(who, "ComponentName is null");
7361        synchronized (this) {
7362            final ActiveAdmin activeAdmin = getActiveAdminForCallerLocked(who,
7363                    DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
7364            return activeAdmin.userRestrictions;
7365        }
7366    }
7367
7368    @Override
7369    public boolean setApplicationHidden(ComponentName who, String packageName,
7370            boolean hidden) {
7371        Preconditions.checkNotNull(who, "ComponentName is null");
7372        int callingUserId = UserHandle.getCallingUserId();
7373        synchronized (this) {
7374            getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
7375
7376            long id = mInjector.binderClearCallingIdentity();
7377            try {
7378                return mIPackageManager.setApplicationHiddenSettingAsUser(
7379                        packageName, hidden, callingUserId);
7380            } catch (RemoteException re) {
7381                // shouldn't happen
7382                Slog.e(LOG_TAG, "Failed to setApplicationHiddenSetting", re);
7383            } finally {
7384                mInjector.binderRestoreCallingIdentity(id);
7385            }
7386            return false;
7387        }
7388    }
7389
7390    @Override
7391    public boolean isApplicationHidden(ComponentName who, String packageName) {
7392        Preconditions.checkNotNull(who, "ComponentName is null");
7393        int callingUserId = UserHandle.getCallingUserId();
7394        synchronized (this) {
7395            getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
7396
7397            long id = mInjector.binderClearCallingIdentity();
7398            try {
7399                return mIPackageManager.getApplicationHiddenSettingAsUser(
7400                        packageName, callingUserId);
7401            } catch (RemoteException re) {
7402                // shouldn't happen
7403                Slog.e(LOG_TAG, "Failed to getApplicationHiddenSettingAsUser", re);
7404            } finally {
7405                mInjector.binderRestoreCallingIdentity(id);
7406            }
7407            return false;
7408        }
7409    }
7410
7411    @Override
7412    public void enableSystemApp(ComponentName who, String packageName) {
7413        Preconditions.checkNotNull(who, "ComponentName is null");
7414        synchronized (this) {
7415            // This API can only be called by an active device admin,
7416            // so try to retrieve it to check that the caller is one.
7417            getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
7418
7419            int userId = UserHandle.getCallingUserId();
7420            long id = mInjector.binderClearCallingIdentity();
7421
7422            try {
7423                if (VERBOSE_LOG) {
7424                    Slog.v(LOG_TAG, "installing " + packageName + " for "
7425                            + userId);
7426                }
7427
7428                int parentUserId = getProfileParentId(userId);
7429                if (!isSystemApp(mIPackageManager, packageName, parentUserId)) {
7430                    throw new IllegalArgumentException("Only system apps can be enabled this way.");
7431                }
7432
7433                // Install the app.
7434                mIPackageManager.installExistingPackageAsUser(packageName, userId);
7435
7436            } catch (RemoteException re) {
7437                // shouldn't happen
7438                Slog.wtf(LOG_TAG, "Failed to install " + packageName, re);
7439            } finally {
7440                mInjector.binderRestoreCallingIdentity(id);
7441            }
7442        }
7443    }
7444
7445    @Override
7446    public int enableSystemAppWithIntent(ComponentName who, Intent intent) {
7447        Preconditions.checkNotNull(who, "ComponentName is null");
7448        synchronized (this) {
7449            // This API can only be called by an active device admin,
7450            // so try to retrieve it to check that the caller is one.
7451            getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
7452
7453            int userId = UserHandle.getCallingUserId();
7454            long id = mInjector.binderClearCallingIdentity();
7455
7456            try {
7457                int parentUserId = getProfileParentId(userId);
7458                List<ResolveInfo> activitiesToEnable = mIPackageManager
7459                        .queryIntentActivities(intent,
7460                                intent.resolveTypeIfNeeded(mContext.getContentResolver()),
7461                                PackageManager.MATCH_DIRECT_BOOT_AWARE
7462                                        | PackageManager.MATCH_DIRECT_BOOT_UNAWARE,
7463                                parentUserId)
7464                        .getList();
7465
7466                if (VERBOSE_LOG) {
7467                    Slog.d(LOG_TAG, "Enabling system activities: " + activitiesToEnable);
7468                }
7469                int numberOfAppsInstalled = 0;
7470                if (activitiesToEnable != null) {
7471                    for (ResolveInfo info : activitiesToEnable) {
7472                        if (info.activityInfo != null) {
7473                            String packageName = info.activityInfo.packageName;
7474                            if (isSystemApp(mIPackageManager, packageName, parentUserId)) {
7475                                numberOfAppsInstalled++;
7476                                mIPackageManager.installExistingPackageAsUser(packageName, userId);
7477                            } else {
7478                                Slog.d(LOG_TAG, "Not enabling " + packageName + " since is not a"
7479                                        + " system app");
7480                            }
7481                        }
7482                    }
7483                }
7484                return numberOfAppsInstalled;
7485            } catch (RemoteException e) {
7486                // shouldn't happen
7487                Slog.wtf(LOG_TAG, "Failed to resolve intent for: " + intent);
7488                return 0;
7489            } finally {
7490                mInjector.binderRestoreCallingIdentity(id);
7491            }
7492        }
7493    }
7494
7495    private boolean isSystemApp(IPackageManager pm, String packageName, int userId)
7496            throws RemoteException {
7497        ApplicationInfo appInfo = pm.getApplicationInfo(packageName, GET_UNINSTALLED_PACKAGES,
7498                userId);
7499        if (appInfo == null) {
7500            throw new IllegalArgumentException("The application " + packageName +
7501                    " is not present on this device");
7502        }
7503        return (appInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0;
7504    }
7505
7506    @Override
7507    public void setAccountManagementDisabled(ComponentName who, String accountType,
7508            boolean disabled) {
7509        if (!mHasFeature) {
7510            return;
7511        }
7512        Preconditions.checkNotNull(who, "ComponentName is null");
7513        synchronized (this) {
7514            ActiveAdmin ap = getActiveAdminForCallerLocked(who,
7515                    DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
7516            if (disabled) {
7517                ap.accountTypesWithManagementDisabled.add(accountType);
7518            } else {
7519                ap.accountTypesWithManagementDisabled.remove(accountType);
7520            }
7521            saveSettingsLocked(UserHandle.getCallingUserId());
7522        }
7523    }
7524
7525    @Override
7526    public String[] getAccountTypesWithManagementDisabled() {
7527        return getAccountTypesWithManagementDisabledAsUser(UserHandle.getCallingUserId());
7528    }
7529
7530    @Override
7531    public String[] getAccountTypesWithManagementDisabledAsUser(int userId) {
7532        enforceFullCrossUsersPermission(userId);
7533        if (!mHasFeature) {
7534            return null;
7535        }
7536        synchronized (this) {
7537            DevicePolicyData policy = getUserData(userId);
7538            final int N = policy.mAdminList.size();
7539            ArraySet<String> resultSet = new ArraySet<>();
7540            for (int i = 0; i < N; i++) {
7541                ActiveAdmin admin = policy.mAdminList.get(i);
7542                resultSet.addAll(admin.accountTypesWithManagementDisabled);
7543            }
7544            return resultSet.toArray(new String[resultSet.size()]);
7545        }
7546    }
7547
7548    @Override
7549    public void setUninstallBlocked(ComponentName who, String packageName,
7550            boolean uninstallBlocked) {
7551        Preconditions.checkNotNull(who, "ComponentName is null");
7552        final int userId = UserHandle.getCallingUserId();
7553        synchronized (this) {
7554            getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
7555
7556            long id = mInjector.binderClearCallingIdentity();
7557            try {
7558                mIPackageManager.setBlockUninstallForUser(packageName, uninstallBlocked, userId);
7559            } catch (RemoteException re) {
7560                // Shouldn't happen.
7561                Slog.e(LOG_TAG, "Failed to setBlockUninstallForUser", re);
7562            } finally {
7563                mInjector.binderRestoreCallingIdentity(id);
7564            }
7565        }
7566    }
7567
7568    @Override
7569    public boolean isUninstallBlocked(ComponentName who, String packageName) {
7570        // This function should return true if and only if the package is blocked by
7571        // setUninstallBlocked(). It should still return false for other cases of blocks, such as
7572        // when the package is a system app, or when it is an active device admin.
7573        final int userId = UserHandle.getCallingUserId();
7574
7575        synchronized (this) {
7576            if (who != null) {
7577                getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
7578            }
7579
7580            long id = mInjector.binderClearCallingIdentity();
7581            try {
7582                return mIPackageManager.getBlockUninstallForUser(packageName, userId);
7583            } catch (RemoteException re) {
7584                // Shouldn't happen.
7585                Slog.e(LOG_TAG, "Failed to getBlockUninstallForUser", re);
7586            } finally {
7587                mInjector.binderRestoreCallingIdentity(id);
7588            }
7589        }
7590        return false;
7591    }
7592
7593    @Override
7594    public void setCrossProfileCallerIdDisabled(ComponentName who, boolean disabled) {
7595        if (!mHasFeature) {
7596            return;
7597        }
7598        Preconditions.checkNotNull(who, "ComponentName is null");
7599        synchronized (this) {
7600            ActiveAdmin admin = getActiveAdminForCallerLocked(who,
7601                    DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
7602            if (admin.disableCallerId != disabled) {
7603                admin.disableCallerId = disabled;
7604                saveSettingsLocked(mInjector.userHandleGetCallingUserId());
7605            }
7606        }
7607    }
7608
7609    @Override
7610    public boolean getCrossProfileCallerIdDisabled(ComponentName who) {
7611        if (!mHasFeature) {
7612            return false;
7613        }
7614        Preconditions.checkNotNull(who, "ComponentName is null");
7615        synchronized (this) {
7616            ActiveAdmin admin = getActiveAdminForCallerLocked(who,
7617                    DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
7618            return admin.disableCallerId;
7619        }
7620    }
7621
7622    @Override
7623    public boolean getCrossProfileCallerIdDisabledForUser(int userId) {
7624        enforceCrossUsersPermission(userId);
7625        synchronized (this) {
7626            ActiveAdmin admin = getProfileOwnerAdminLocked(userId);
7627            return (admin != null) ? admin.disableCallerId : false;
7628        }
7629    }
7630
7631    @Override
7632    public void setCrossProfileContactsSearchDisabled(ComponentName who, boolean disabled) {
7633        if (!mHasFeature) {
7634            return;
7635        }
7636        Preconditions.checkNotNull(who, "ComponentName is null");
7637        synchronized (this) {
7638            ActiveAdmin admin = getActiveAdminForCallerLocked(who,
7639                    DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
7640            if (admin.disableContactsSearch != disabled) {
7641                admin.disableContactsSearch = disabled;
7642                saveSettingsLocked(mInjector.userHandleGetCallingUserId());
7643            }
7644        }
7645    }
7646
7647    @Override
7648    public boolean getCrossProfileContactsSearchDisabled(ComponentName who) {
7649        if (!mHasFeature) {
7650            return false;
7651        }
7652        Preconditions.checkNotNull(who, "ComponentName is null");
7653        synchronized (this) {
7654            ActiveAdmin admin = getActiveAdminForCallerLocked(who,
7655                    DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
7656            return admin.disableContactsSearch;
7657        }
7658    }
7659
7660    @Override
7661    public boolean getCrossProfileContactsSearchDisabledForUser(int userId) {
7662        enforceCrossUsersPermission(userId);
7663        synchronized (this) {
7664            ActiveAdmin admin = getProfileOwnerAdminLocked(userId);
7665            return (admin != null) ? admin.disableContactsSearch : false;
7666        }
7667    }
7668
7669    @Override
7670    public void startManagedQuickContact(String actualLookupKey, long actualContactId,
7671            boolean isContactIdIgnored, long actualDirectoryId, Intent originalIntent) {
7672        final Intent intent = QuickContact.rebuildManagedQuickContactsIntent(actualLookupKey,
7673                actualContactId, isContactIdIgnored, actualDirectoryId, originalIntent);
7674        final int callingUserId = UserHandle.getCallingUserId();
7675
7676        final long ident = mInjector.binderClearCallingIdentity();
7677        try {
7678            synchronized (this) {
7679                final int managedUserId = getManagedUserId(callingUserId);
7680                if (managedUserId < 0) {
7681                    return;
7682                }
7683                if (isCrossProfileQuickContactDisabled(managedUserId)) {
7684                    if (VERBOSE_LOG) {
7685                        Log.v(LOG_TAG,
7686                                "Cross-profile contacts access disabled for user " + managedUserId);
7687                    }
7688                    return;
7689                }
7690                ContactsInternal.startQuickContactWithErrorToastForUser(
7691                        mContext, intent, new UserHandle(managedUserId));
7692            }
7693        } finally {
7694            mInjector.binderRestoreCallingIdentity(ident);
7695        }
7696    }
7697
7698    /**
7699     * @return true if cross-profile QuickContact is disabled
7700     */
7701    private boolean isCrossProfileQuickContactDisabled(int userId) {
7702        return getCrossProfileCallerIdDisabledForUser(userId)
7703                && getCrossProfileContactsSearchDisabledForUser(userId);
7704    }
7705
7706    /**
7707     * @return the user ID of the managed user that is linked to the current user, if any.
7708     * Otherwise -1.
7709     */
7710    public int getManagedUserId(int callingUserId) {
7711        if (VERBOSE_LOG) {
7712            Log.v(LOG_TAG, "getManagedUserId: callingUserId=" + callingUserId);
7713        }
7714
7715        for (UserInfo ui : mUserManager.getProfiles(callingUserId)) {
7716            if (ui.id == callingUserId || !ui.isManagedProfile()) {
7717                continue; // Caller user self, or not a managed profile.  Skip.
7718            }
7719            if (VERBOSE_LOG) {
7720                Log.v(LOG_TAG, "Managed user=" + ui.id);
7721            }
7722            return ui.id;
7723        }
7724        if (VERBOSE_LOG) {
7725            Log.v(LOG_TAG, "Managed user not found.");
7726        }
7727        return -1;
7728    }
7729
7730    @Override
7731    public void setBluetoothContactSharingDisabled(ComponentName who, boolean disabled) {
7732        if (!mHasFeature) {
7733            return;
7734        }
7735        Preconditions.checkNotNull(who, "ComponentName is null");
7736        synchronized (this) {
7737            ActiveAdmin admin = getActiveAdminForCallerLocked(who,
7738                    DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
7739            if (admin.disableBluetoothContactSharing != disabled) {
7740                admin.disableBluetoothContactSharing = disabled;
7741                saveSettingsLocked(UserHandle.getCallingUserId());
7742            }
7743        }
7744    }
7745
7746    @Override
7747    public boolean getBluetoothContactSharingDisabled(ComponentName who) {
7748        if (!mHasFeature) {
7749            return false;
7750        }
7751        Preconditions.checkNotNull(who, "ComponentName is null");
7752        synchronized (this) {
7753            ActiveAdmin admin = getActiveAdminForCallerLocked(who,
7754                    DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
7755            return admin.disableBluetoothContactSharing;
7756        }
7757    }
7758
7759    @Override
7760    public boolean getBluetoothContactSharingDisabledForUser(int userId) {
7761        // TODO: Should there be a check to make sure this relationship is
7762        // within a profile group?
7763        // enforceSystemProcess("getCrossProfileCallerIdDisabled can only be called by system");
7764        synchronized (this) {
7765            ActiveAdmin admin = getProfileOwnerAdminLocked(userId);
7766            return (admin != null) ? admin.disableBluetoothContactSharing : false;
7767        }
7768    }
7769
7770    /**
7771     * Sets which packages may enter lock task mode.
7772     *
7773     * <p>This function can only be called by the device owner or alternatively by the profile owner
7774     * in case the user is affiliated.
7775     *
7776     * @param packages The list of packages allowed to enter lock task mode.
7777     */
7778    @Override
7779    public void setLockTaskPackages(ComponentName who, String[] packages)
7780            throws SecurityException {
7781        Preconditions.checkNotNull(who, "ComponentName is null");
7782        synchronized (this) {
7783            ActiveAdmin deviceOwner = getActiveAdminWithPolicyForUidLocked(
7784                who, DeviceAdminInfo.USES_POLICY_DEVICE_OWNER, mInjector.binderGetCallingUid());
7785            ActiveAdmin profileOwner = getActiveAdminWithPolicyForUidLocked(
7786                who, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER, mInjector.binderGetCallingUid());
7787            if (deviceOwner != null || (profileOwner != null && isAffiliatedUser())) {
7788                int userHandle = mInjector.userHandleGetCallingUserId();
7789                setLockTaskPackagesLocked(userHandle, new ArrayList<>(Arrays.asList(packages)));
7790            } else {
7791                throw new SecurityException("Admin " + who +
7792                    " is neither the device owner or affiliated user's profile owner.");
7793            }
7794        }
7795    }
7796
7797    private void setLockTaskPackagesLocked(int userHandle, List<String> packages) {
7798        DevicePolicyData policy = getUserData(userHandle);
7799        policy.mLockTaskPackages = packages;
7800
7801        // Store the settings persistently.
7802        saveSettingsLocked(userHandle);
7803        updateLockTaskPackagesLocked(packages, userHandle);
7804    }
7805
7806    /**
7807     * This function returns the list of components allowed to start the task lock mode.
7808     */
7809    @Override
7810    public String[] getLockTaskPackages(ComponentName who) {
7811        Preconditions.checkNotNull(who, "ComponentName is null");
7812        synchronized (this) {
7813            getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_DEVICE_OWNER);
7814            int userHandle = mInjector.binderGetCallingUserHandle().getIdentifier();
7815            final List<String> packages = getLockTaskPackagesLocked(userHandle);
7816            return packages.toArray(new String[packages.size()]);
7817        }
7818    }
7819
7820    private List<String> getLockTaskPackagesLocked(int userHandle) {
7821        final DevicePolicyData policy = getUserData(userHandle);
7822        return policy.mLockTaskPackages;
7823    }
7824
7825    /**
7826     * This function lets the caller know whether the given package is allowed to start the
7827     * lock task mode.
7828     * @param pkg The package to check
7829     */
7830    @Override
7831    public boolean isLockTaskPermitted(String pkg) {
7832        // Get current user's devicepolicy
7833        int uid = mInjector.binderGetCallingUid();
7834        int userHandle = UserHandle.getUserId(uid);
7835        DevicePolicyData policy = getUserData(userHandle);
7836        synchronized (this) {
7837            for (int i = 0; i < policy.mLockTaskPackages.size(); i++) {
7838                String lockTaskPackage = policy.mLockTaskPackages.get(i);
7839
7840                // If the given package equals one of the packages stored our list,
7841                // we allow this package to start lock task mode.
7842                if (lockTaskPackage.equals(pkg)) {
7843                    return true;
7844                }
7845            }
7846        }
7847        return false;
7848    }
7849
7850    @Override
7851    public void notifyLockTaskModeChanged(boolean isEnabled, String pkg, int userHandle) {
7852        if (!isCallerWithSystemUid()) {
7853            throw new SecurityException("notifyLockTaskModeChanged can only be called by system");
7854        }
7855        synchronized (this) {
7856            final DevicePolicyData policy = getUserData(userHandle);
7857            Bundle adminExtras = new Bundle();
7858            adminExtras.putString(DeviceAdminReceiver.EXTRA_LOCK_TASK_PACKAGE, pkg);
7859            for (ActiveAdmin admin : policy.mAdminList) {
7860                final boolean ownsDevice = isDeviceOwner(admin.info.getComponent(), userHandle);
7861                final boolean ownsProfile = isProfileOwner(admin.info.getComponent(), userHandle);
7862                if (ownsDevice || ownsProfile) {
7863                    if (isEnabled) {
7864                        sendAdminCommandLocked(admin, DeviceAdminReceiver.ACTION_LOCK_TASK_ENTERING,
7865                                adminExtras, null);
7866                    } else {
7867                        sendAdminCommandLocked(admin, DeviceAdminReceiver.ACTION_LOCK_TASK_EXITING);
7868                    }
7869                }
7870            }
7871        }
7872    }
7873
7874    @Override
7875    public void setGlobalSetting(ComponentName who, String setting, String value) {
7876        Preconditions.checkNotNull(who, "ComponentName is null");
7877
7878        synchronized (this) {
7879            getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_DEVICE_OWNER);
7880
7881            // Some settings are no supported any more. However we do not want to throw a
7882            // SecurityException to avoid breaking apps.
7883            if (GLOBAL_SETTINGS_DEPRECATED.contains(setting)) {
7884                Log.i(LOG_TAG, "Global setting no longer supported: " + setting);
7885                return;
7886            }
7887
7888            if (!GLOBAL_SETTINGS_WHITELIST.contains(setting)) {
7889                throw new SecurityException(String.format(
7890                        "Permission denial: device owners cannot update %1$s", setting));
7891            }
7892
7893            if (Settings.Global.STAY_ON_WHILE_PLUGGED_IN.equals(setting)) {
7894                // ignore if it contradicts an existing policy
7895                long timeMs = getMaximumTimeToLock(
7896                        who, mInjector.userHandleGetCallingUserId(), /* parent */ false);
7897                if (timeMs > 0 && timeMs < Integer.MAX_VALUE) {
7898                    return;
7899                }
7900            }
7901
7902            long id = mInjector.binderClearCallingIdentity();
7903            try {
7904                mInjector.settingsGlobalPutString(setting, value);
7905            } finally {
7906                mInjector.binderRestoreCallingIdentity(id);
7907            }
7908        }
7909    }
7910
7911    @Override
7912    public void setSecureSetting(ComponentName who, String setting, String value) {
7913        Preconditions.checkNotNull(who, "ComponentName is null");
7914        int callingUserId = mInjector.userHandleGetCallingUserId();
7915
7916        synchronized (this) {
7917            getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
7918
7919            if (isDeviceOwner(who, callingUserId)) {
7920                if (!SECURE_SETTINGS_DEVICEOWNER_WHITELIST.contains(setting)) {
7921                    throw new SecurityException(String.format(
7922                            "Permission denial: Device owners cannot update %1$s", setting));
7923                }
7924            } else if (!SECURE_SETTINGS_WHITELIST.contains(setting)) {
7925                throw new SecurityException(String.format(
7926                        "Permission denial: Profile owners cannot update %1$s", setting));
7927            }
7928
7929            long id = mInjector.binderClearCallingIdentity();
7930            try {
7931                mInjector.settingsSecurePutStringForUser(setting, value, callingUserId);
7932            } finally {
7933                mInjector.binderRestoreCallingIdentity(id);
7934            }
7935        }
7936    }
7937
7938    @Override
7939    public void setMasterVolumeMuted(ComponentName who, boolean on) {
7940        Preconditions.checkNotNull(who, "ComponentName is null");
7941        synchronized (this) {
7942            getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
7943            int userId = UserHandle.getCallingUserId();
7944            long identity = mInjector.binderClearCallingIdentity();
7945            try {
7946                IAudioService iAudioService = IAudioService.Stub.asInterface(
7947                        ServiceManager.getService(Context.AUDIO_SERVICE));
7948                iAudioService.setMasterMute(on, 0, mContext.getPackageName(), userId);
7949            } catch (RemoteException re) {
7950                Slog.e(LOG_TAG, "Failed to setMasterMute", re);
7951            } finally {
7952                mInjector.binderRestoreCallingIdentity(identity);
7953            }
7954        }
7955    }
7956
7957    @Override
7958    public boolean isMasterVolumeMuted(ComponentName who) {
7959        Preconditions.checkNotNull(who, "ComponentName is null");
7960        synchronized (this) {
7961            getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
7962
7963            AudioManager audioManager =
7964                    (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
7965            return audioManager.isMasterMute();
7966        }
7967    }
7968
7969    @Override
7970    public void setUserIcon(ComponentName who, Bitmap icon) {
7971        synchronized (this) {
7972            Preconditions.checkNotNull(who, "ComponentName is null");
7973            getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
7974
7975            int userId = UserHandle.getCallingUserId();
7976            long id = mInjector.binderClearCallingIdentity();
7977            try {
7978                mUserManagerInternal.setUserIcon(userId, icon);
7979            } finally {
7980                mInjector.binderRestoreCallingIdentity(id);
7981            }
7982        }
7983    }
7984
7985    @Override
7986    public boolean setKeyguardDisabled(ComponentName who, boolean disabled) {
7987        Preconditions.checkNotNull(who, "ComponentName is null");
7988        synchronized (this) {
7989            getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_DEVICE_OWNER);
7990        }
7991        final int userId = UserHandle.getCallingUserId();
7992
7993        long ident = mInjector.binderClearCallingIdentity();
7994        try {
7995            // disallow disabling the keyguard if a password is currently set
7996            if (disabled && mLockPatternUtils.isSecure(userId)) {
7997                return false;
7998            }
7999            mLockPatternUtils.setLockScreenDisabled(disabled, userId);
8000        } finally {
8001            mInjector.binderRestoreCallingIdentity(ident);
8002        }
8003        return true;
8004    }
8005
8006    @Override
8007    public boolean setStatusBarDisabled(ComponentName who, boolean disabled) {
8008        int userId = UserHandle.getCallingUserId();
8009        synchronized (this) {
8010            getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_DEVICE_OWNER);
8011            DevicePolicyData policy = getUserData(userId);
8012            if (policy.mStatusBarDisabled != disabled) {
8013                if (!setStatusBarDisabledInternal(disabled, userId)) {
8014                    return false;
8015                }
8016                policy.mStatusBarDisabled = disabled;
8017                saveSettingsLocked(userId);
8018            }
8019        }
8020        return true;
8021    }
8022
8023    private boolean setStatusBarDisabledInternal(boolean disabled, int userId) {
8024        long ident = mInjector.binderClearCallingIdentity();
8025        try {
8026            IStatusBarService statusBarService = IStatusBarService.Stub.asInterface(
8027                    ServiceManager.checkService(Context.STATUS_BAR_SERVICE));
8028            if (statusBarService != null) {
8029                int flags1 = disabled ? STATUS_BAR_DISABLE_MASK : StatusBarManager.DISABLE_NONE;
8030                int flags2 = disabled ? STATUS_BAR_DISABLE2_MASK : StatusBarManager.DISABLE2_NONE;
8031                statusBarService.disableForUser(flags1, mToken, mContext.getPackageName(), userId);
8032                statusBarService.disable2ForUser(flags2, mToken, mContext.getPackageName(), userId);
8033                return true;
8034            }
8035        } catch (RemoteException e) {
8036            Slog.e(LOG_TAG, "Failed to disable the status bar", e);
8037        } finally {
8038            mInjector.binderRestoreCallingIdentity(ident);
8039        }
8040        return false;
8041    }
8042
8043    /**
8044     * We need to update the internal state of whether a user has completed setup once. After
8045     * that, we ignore any changes that reset the Settings.Secure.USER_SETUP_COMPLETE changes
8046     * as we don't trust any apps that might try to reset it.
8047     * <p>
8048     * Unfortunately, we don't know which user's setup state was changed, so we write all of
8049     * them.
8050     */
8051    void updateUserSetupComplete() {
8052        List<UserInfo> users = mUserManager.getUsers(true);
8053        final int N = users.size();
8054        for (int i = 0; i < N; i++) {
8055            int userHandle = users.get(i).id;
8056            if (mInjector.settingsSecureGetIntForUser(Settings.Secure.USER_SETUP_COMPLETE, 0,
8057                    userHandle) != 0) {
8058                DevicePolicyData policy = getUserData(userHandle);
8059                if (!policy.mUserSetupComplete) {
8060                    policy.mUserSetupComplete = true;
8061                    synchronized (this) {
8062                        saveSettingsLocked(userHandle);
8063                    }
8064                }
8065            }
8066        }
8067    }
8068
8069    private class SetupContentObserver extends ContentObserver {
8070
8071        private final Uri mUserSetupComplete = Settings.Secure.getUriFor(
8072                Settings.Secure.USER_SETUP_COMPLETE);
8073        private final Uri mDeviceProvisioned = Settings.Global.getUriFor(
8074                Settings.Global.DEVICE_PROVISIONED);
8075
8076        public SetupContentObserver(Handler handler) {
8077            super(handler);
8078        }
8079
8080        void register() {
8081            mInjector.registerContentObserver(mUserSetupComplete, false, this, UserHandle.USER_ALL);
8082            mInjector.registerContentObserver(mDeviceProvisioned, false, this, UserHandle.USER_ALL);
8083        }
8084
8085        @Override
8086        public void onChange(boolean selfChange, Uri uri) {
8087            if (mUserSetupComplete.equals(uri)) {
8088                updateUserSetupComplete();
8089            } else if (mDeviceProvisioned.equals(uri)) {
8090                synchronized (DevicePolicyManagerService.this) {
8091                    // Set PROPERTY_DEVICE_OWNER_PRESENT, for the SUW case where setting the property
8092                    // is delayed until device is marked as provisioned.
8093                    setDeviceOwnerSystemPropertyLocked();
8094                }
8095            }
8096        }
8097    }
8098
8099    @VisibleForTesting
8100    final class LocalService extends DevicePolicyManagerInternal {
8101        private List<OnCrossProfileWidgetProvidersChangeListener> mWidgetProviderListeners;
8102
8103        @Override
8104        public List<String> getCrossProfileWidgetProviders(int profileId) {
8105            synchronized (DevicePolicyManagerService.this) {
8106                if (mOwners == null) {
8107                    return Collections.emptyList();
8108                }
8109                ComponentName ownerComponent = mOwners.getProfileOwnerComponent(profileId);
8110                if (ownerComponent == null) {
8111                    return Collections.emptyList();
8112                }
8113
8114                DevicePolicyData policy = getUserDataUnchecked(profileId);
8115                ActiveAdmin admin = policy.mAdminMap.get(ownerComponent);
8116
8117                if (admin == null || admin.crossProfileWidgetProviders == null
8118                        || admin.crossProfileWidgetProviders.isEmpty()) {
8119                    return Collections.emptyList();
8120                }
8121
8122                return admin.crossProfileWidgetProviders;
8123            }
8124        }
8125
8126        @Override
8127        public void addOnCrossProfileWidgetProvidersChangeListener(
8128                OnCrossProfileWidgetProvidersChangeListener listener) {
8129            synchronized (DevicePolicyManagerService.this) {
8130                if (mWidgetProviderListeners == null) {
8131                    mWidgetProviderListeners = new ArrayList<>();
8132                }
8133                if (!mWidgetProviderListeners.contains(listener)) {
8134                    mWidgetProviderListeners.add(listener);
8135                }
8136            }
8137        }
8138
8139        @Override
8140        public boolean isActiveAdminWithPolicy(int uid, int reqPolicy) {
8141            synchronized(DevicePolicyManagerService.this) {
8142                return getActiveAdminWithPolicyForUidLocked(null, reqPolicy, uid) != null;
8143            }
8144        }
8145
8146        private void notifyCrossProfileProvidersChanged(int userId, List<String> packages) {
8147            final List<OnCrossProfileWidgetProvidersChangeListener> listeners;
8148            synchronized (DevicePolicyManagerService.this) {
8149                listeners = new ArrayList<>(mWidgetProviderListeners);
8150            }
8151            final int listenerCount = listeners.size();
8152            for (int i = 0; i < listenerCount; i++) {
8153                OnCrossProfileWidgetProvidersChangeListener listener = listeners.get(i);
8154                listener.onCrossProfileWidgetProvidersChanged(userId, packages);
8155            }
8156        }
8157
8158        @Override
8159        public Intent createShowAdminSupportIntent(int userId, boolean useDefaultIfNoAdmin) {
8160            // This method is called from AM with its lock held, so don't take the DPMS lock.
8161            // b/29242568
8162
8163            ComponentName profileOwner = mOwners.getProfileOwnerComponent(userId);
8164            if (profileOwner != null) {
8165                return createShowAdminSupportIntent(profileOwner, userId);
8166            }
8167
8168            final Pair<Integer, ComponentName> deviceOwner =
8169                    mOwners.getDeviceOwnerUserIdAndComponent();
8170            if (deviceOwner != null && deviceOwner.first == userId) {
8171                return createShowAdminSupportIntent(deviceOwner.second, userId);
8172            }
8173
8174            // We're not specifying the device admin because there isn't one.
8175            if (useDefaultIfNoAdmin) {
8176                return createShowAdminSupportIntent(null, userId);
8177            }
8178            return null;
8179        }
8180
8181        @Override
8182        public Intent createUserRestrictionSupportIntent(int userId, String userRestriction) {
8183            int source;
8184            long ident = mInjector.binderClearCallingIdentity();
8185            try {
8186                source = mUserManager.getUserRestrictionSource(userRestriction,
8187                        UserHandle.of(userId));
8188            } finally {
8189                mInjector.binderRestoreCallingIdentity(ident);
8190            }
8191            if ((source & UserManager.RESTRICTION_SOURCE_SYSTEM) != 0) {
8192                /*
8193                 * In this case, the user restriction is enforced by the system.
8194                 * So we won't show an admin support intent, even if it is also
8195                 * enforced by a profile/device owner.
8196                 */
8197                return null;
8198            }
8199            boolean enforcedByDo = (source & UserManager.RESTRICTION_SOURCE_DEVICE_OWNER) != 0;
8200            boolean enforcedByPo = (source & UserManager.RESTRICTION_SOURCE_PROFILE_OWNER) != 0;
8201            if (enforcedByDo && enforcedByPo) {
8202                // In this case, we'll show an admin support dialog that does not
8203                // specify the admin.
8204                return createShowAdminSupportIntent(null, userId);
8205            } else if (enforcedByPo) {
8206                final ComponentName profileOwner = mOwners.getProfileOwnerComponent(userId);
8207                if (profileOwner != null) {
8208                    return createShowAdminSupportIntent(profileOwner, userId);
8209                }
8210                // This could happen if another thread has changed the profile owner since we called
8211                // getUserRestrictionSource
8212                return null;
8213            } else if (enforcedByDo) {
8214                final Pair<Integer, ComponentName> deviceOwner
8215                        = mOwners.getDeviceOwnerUserIdAndComponent();
8216                if (deviceOwner != null) {
8217                    return createShowAdminSupportIntent(deviceOwner.second, deviceOwner.first);
8218                }
8219                // This could happen if another thread has changed the device owner since we called
8220                // getUserRestrictionSource
8221                return null;
8222            }
8223            return null;
8224        }
8225
8226        private Intent createShowAdminSupportIntent(ComponentName admin, int userId) {
8227            // This method is called with AMS lock held, so don't take DPMS lock
8228            final Intent intent = new Intent(Settings.ACTION_SHOW_ADMIN_SUPPORT_DETAILS);
8229            intent.putExtra(Intent.EXTRA_USER_ID, userId);
8230            intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, admin);
8231            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
8232            return intent;
8233        }
8234    }
8235
8236    /**
8237     * Returns true if specified admin is allowed to limit passwords and has a
8238     * {@code passwordQuality} of at least {@code minPasswordQuality}
8239     */
8240    private static boolean isLimitPasswordAllowed(ActiveAdmin admin, int minPasswordQuality) {
8241        if (admin.passwordQuality < minPasswordQuality) {
8242            return false;
8243        }
8244        return admin.info.usesPolicy(DeviceAdminInfo.USES_POLICY_LIMIT_PASSWORD);
8245    }
8246
8247    @Override
8248    public void setSystemUpdatePolicy(ComponentName who, SystemUpdatePolicy policy) {
8249        if (policy != null && !policy.isValid()) {
8250            throw new IllegalArgumentException("Invalid system update policy.");
8251        }
8252        synchronized (this) {
8253            getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_DEVICE_OWNER);
8254            if (policy == null) {
8255                mOwners.clearSystemUpdatePolicy();
8256            } else {
8257                mOwners.setSystemUpdatePolicy(policy);
8258            }
8259            mOwners.writeDeviceOwner();
8260        }
8261        mContext.sendBroadcastAsUser(
8262                new Intent(DevicePolicyManager.ACTION_SYSTEM_UPDATE_POLICY_CHANGED),
8263                UserHandle.SYSTEM);
8264    }
8265
8266    @Override
8267    public SystemUpdatePolicy getSystemUpdatePolicy() {
8268        if (UserManager.isDeviceInDemoMode(mContext)) {
8269            // Pretending to have an automatic update policy when the device is in retail demo
8270            // mode. This will allow the device to download and install an ota without
8271            // any user interaction.
8272            return SystemUpdatePolicy.createAutomaticInstallPolicy();
8273        }
8274        synchronized (this) {
8275            SystemUpdatePolicy policy =  mOwners.getSystemUpdatePolicy();
8276            if (policy != null && !policy.isValid()) {
8277                Slog.w(LOG_TAG, "Stored system update policy is invalid, return null instead.");
8278                return null;
8279            }
8280            return policy;
8281        }
8282    }
8283
8284    /**
8285     * Checks if the caller of the method is the device owner app.
8286     *
8287     * @param callerUid UID of the caller.
8288     * @return true if the caller is the device owner app
8289     */
8290    @VisibleForTesting
8291    boolean isCallerDeviceOwner(int callerUid) {
8292        synchronized (this) {
8293            if (!mOwners.hasDeviceOwner()) {
8294                return false;
8295            }
8296            if (UserHandle.getUserId(callerUid) != mOwners.getDeviceOwnerUserId()) {
8297                return false;
8298            }
8299            final String deviceOwnerPackageName = mOwners.getDeviceOwnerComponent()
8300                    .getPackageName();
8301            final String[] pkgs = mContext.getPackageManager().getPackagesForUid(callerUid);
8302
8303            for (String pkg : pkgs) {
8304                if (deviceOwnerPackageName.equals(pkg)) {
8305                    return true;
8306                }
8307            }
8308        }
8309
8310        return false;
8311    }
8312
8313    @Override
8314    public void notifyPendingSystemUpdate(long updateReceivedTime) {
8315        mContext.enforceCallingOrSelfPermission(permission.NOTIFY_PENDING_SYSTEM_UPDATE,
8316                "Only the system update service can broadcast update information");
8317
8318        if (UserHandle.getCallingUserId() != UserHandle.USER_SYSTEM) {
8319            Slog.w(LOG_TAG, "Only the system update service in the system user " +
8320                    "can broadcast update information.");
8321            return;
8322        }
8323        Intent intent = new Intent(DeviceAdminReceiver.ACTION_NOTIFY_PENDING_SYSTEM_UPDATE);
8324        intent.putExtra(DeviceAdminReceiver.EXTRA_SYSTEM_UPDATE_RECEIVED_TIME,
8325                updateReceivedTime);
8326
8327        synchronized (this) {
8328            final String deviceOwnerPackage =
8329                    mOwners.hasDeviceOwner() ? mOwners.getDeviceOwnerComponent().getPackageName()
8330                            : null;
8331            if (deviceOwnerPackage == null) {
8332                return;
8333            }
8334            final UserHandle deviceOwnerUser = new UserHandle(mOwners.getDeviceOwnerUserId());
8335
8336            ActivityInfo[] receivers = null;
8337            try {
8338                receivers  = mContext.getPackageManager().getPackageInfo(
8339                        deviceOwnerPackage, PackageManager.GET_RECEIVERS).receivers;
8340            } catch (NameNotFoundException e) {
8341                Log.e(LOG_TAG, "Cannot find device owner package", e);
8342            }
8343            if (receivers != null) {
8344                long ident = mInjector.binderClearCallingIdentity();
8345                try {
8346                    for (int i = 0; i < receivers.length; i++) {
8347                        if (permission.BIND_DEVICE_ADMIN.equals(receivers[i].permission)) {
8348                            intent.setComponent(new ComponentName(deviceOwnerPackage,
8349                                    receivers[i].name));
8350                            mContext.sendBroadcastAsUser(intent, deviceOwnerUser);
8351                        }
8352                    }
8353                } finally {
8354                    mInjector.binderRestoreCallingIdentity(ident);
8355                }
8356            }
8357        }
8358    }
8359
8360    @Override
8361    public void setPermissionPolicy(ComponentName admin, int policy) throws RemoteException {
8362        int userId = UserHandle.getCallingUserId();
8363        synchronized (this) {
8364            getActiveAdminForCallerLocked(admin, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
8365            DevicePolicyData userPolicy = getUserData(userId);
8366            if (userPolicy.mPermissionPolicy != policy) {
8367                userPolicy.mPermissionPolicy = policy;
8368                saveSettingsLocked(userId);
8369            }
8370        }
8371    }
8372
8373    @Override
8374    public int getPermissionPolicy(ComponentName admin) throws RemoteException {
8375        int userId = UserHandle.getCallingUserId();
8376        synchronized (this) {
8377            DevicePolicyData userPolicy = getUserData(userId);
8378            return userPolicy.mPermissionPolicy;
8379        }
8380    }
8381
8382    @Override
8383    public boolean setPermissionGrantState(ComponentName admin, String packageName,
8384            String permission, int grantState) throws RemoteException {
8385        UserHandle user = mInjector.binderGetCallingUserHandle();
8386        synchronized (this) {
8387            getActiveAdminForCallerLocked(admin, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
8388            long ident = mInjector.binderClearCallingIdentity();
8389            try {
8390                if (getTargetSdk(packageName, user.getIdentifier())
8391                        < android.os.Build.VERSION_CODES.M) {
8392                    return false;
8393                }
8394                final PackageManager packageManager = mContext.getPackageManager();
8395                switch (grantState) {
8396                    case DevicePolicyManager.PERMISSION_GRANT_STATE_GRANTED: {
8397                        packageManager.grantRuntimePermission(packageName, permission, user);
8398                        packageManager.updatePermissionFlags(permission, packageName,
8399                                PackageManager.FLAG_PERMISSION_POLICY_FIXED,
8400                                PackageManager.FLAG_PERMISSION_POLICY_FIXED, user);
8401                    } break;
8402
8403                    case DevicePolicyManager.PERMISSION_GRANT_STATE_DENIED: {
8404                        packageManager.revokeRuntimePermission(packageName,
8405                                permission, user);
8406                        packageManager.updatePermissionFlags(permission, packageName,
8407                                PackageManager.FLAG_PERMISSION_POLICY_FIXED,
8408                                PackageManager.FLAG_PERMISSION_POLICY_FIXED, user);
8409                    } break;
8410
8411                    case DevicePolicyManager.PERMISSION_GRANT_STATE_DEFAULT: {
8412                        packageManager.updatePermissionFlags(permission, packageName,
8413                                PackageManager.FLAG_PERMISSION_POLICY_FIXED, 0, user);
8414                    } break;
8415                }
8416                return true;
8417            } catch (SecurityException se) {
8418                return false;
8419            } finally {
8420                mInjector.binderRestoreCallingIdentity(ident);
8421            }
8422        }
8423    }
8424
8425    @Override
8426    public int getPermissionGrantState(ComponentName admin, String packageName,
8427            String permission) throws RemoteException {
8428        PackageManager packageManager = mContext.getPackageManager();
8429
8430        UserHandle user = mInjector.binderGetCallingUserHandle();
8431        synchronized (this) {
8432            getActiveAdminForCallerLocked(admin, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
8433            long ident = mInjector.binderClearCallingIdentity();
8434            try {
8435                int granted = mIPackageManager.checkPermission(permission,
8436                        packageName, user.getIdentifier());
8437                int permFlags = packageManager.getPermissionFlags(permission, packageName, user);
8438                if ((permFlags & PackageManager.FLAG_PERMISSION_POLICY_FIXED)
8439                        != PackageManager.FLAG_PERMISSION_POLICY_FIXED) {
8440                    // Not controlled by policy
8441                    return DevicePolicyManager.PERMISSION_GRANT_STATE_DEFAULT;
8442                } else {
8443                    // Policy controlled so return result based on permission grant state
8444                    return granted == PackageManager.PERMISSION_GRANTED
8445                            ? DevicePolicyManager.PERMISSION_GRANT_STATE_GRANTED
8446                            : DevicePolicyManager.PERMISSION_GRANT_STATE_DENIED;
8447                }
8448            } finally {
8449                mInjector.binderRestoreCallingIdentity(ident);
8450            }
8451        }
8452    }
8453
8454    boolean isPackageInstalledForUser(String packageName, int userHandle) {
8455        try {
8456            PackageInfo pi = mInjector.getIPackageManager().getPackageInfo(packageName, 0,
8457                    userHandle);
8458            return (pi != null) && (pi.applicationInfo.flags != 0);
8459        } catch (RemoteException re) {
8460            throw new RuntimeException("Package manager has died", re);
8461        }
8462    }
8463
8464    @Override
8465    public boolean isProvisioningAllowed(String action) {
8466        if (!mHasFeature) {
8467            return false;
8468        }
8469
8470        final int callingUserId = mInjector.userHandleGetCallingUserId();
8471        if (DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE.equals(action)) {
8472            if (!hasFeatureManagedUsers()) {
8473                return false;
8474            }
8475            synchronized (this) {
8476                if (mOwners.hasDeviceOwner()) {
8477                    if (!mInjector.userManagerIsSplitSystemUser()) {
8478                        // Only split-system-user systems support managed-profiles in combination with
8479                        // device-owner.
8480                        return false;
8481                    }
8482                    if (mOwners.getDeviceOwnerUserId() != UserHandle.USER_SYSTEM) {
8483                        // Only system device-owner supports managed-profiles. Non-system device-owner
8484                        // doesn't.
8485                        return false;
8486                    }
8487                    if (callingUserId == UserHandle.USER_SYSTEM) {
8488                        // Managed-profiles cannot be setup on the system user, only regular users.
8489                        return false;
8490                    }
8491                }
8492            }
8493            if (getProfileOwner(callingUserId) != null) {
8494                // Managed user cannot have a managed profile.
8495                return false;
8496            }
8497            final long ident = mInjector.binderClearCallingIdentity();
8498            try {
8499                if (!mUserManager.canAddMoreManagedProfiles(callingUserId, true)) {
8500                    return false;
8501                }
8502            } finally {
8503                mInjector.binderRestoreCallingIdentity(ident);
8504            }
8505            return true;
8506        } else if (DevicePolicyManager.ACTION_PROVISION_MANAGED_DEVICE.equals(action)) {
8507            return isDeviceOwnerProvisioningAllowed(callingUserId);
8508        } else if (DevicePolicyManager.ACTION_PROVISION_MANAGED_USER.equals(action)) {
8509            if (!hasFeatureManagedUsers()) {
8510                return false;
8511            }
8512            if (!mInjector.userManagerIsSplitSystemUser()) {
8513                // ACTION_PROVISION_MANAGED_USER only supported on split-user systems.
8514                return false;
8515            }
8516            if (callingUserId == UserHandle.USER_SYSTEM) {
8517                // System user cannot be a managed user.
8518                return false;
8519            }
8520            if (hasUserSetupCompleted(callingUserId)) {
8521                return false;
8522            }
8523            return true;
8524        } else if (DevicePolicyManager.ACTION_PROVISION_MANAGED_SHAREABLE_DEVICE.equals(action)) {
8525            if (!mInjector.userManagerIsSplitSystemUser()) {
8526                // ACTION_PROVISION_MANAGED_SHAREABLE_DEVICE only supported on split-user systems.
8527                return false;
8528            }
8529            return isDeviceOwnerProvisioningAllowed(callingUserId);
8530        }
8531        throw new IllegalArgumentException("Unknown provisioning action " + action);
8532    }
8533
8534    /*
8535     * The device owner can only be set before the setup phase of the primary user has completed,
8536     * except for adb command if no accounts or additional users are present on the device.
8537     */
8538    private synchronized @DeviceOwnerPreConditionCode int checkSetDeviceOwnerPreCondition(
8539            int deviceOwnerUserId, boolean isAdb) {
8540        if (mOwners.hasDeviceOwner()) {
8541            return CODE_HAS_DEVICE_OWNER;
8542        }
8543        if (mOwners.hasProfileOwner(deviceOwnerUserId)) {
8544            return CODE_USER_HAS_PROFILE_OWNER;
8545        }
8546        if (!mUserManager.isUserRunning(new UserHandle(deviceOwnerUserId))) {
8547            return CODE_USER_NOT_RUNNING;
8548        }
8549        if (isAdb) {
8550            // if shell command runs after user setup completed check device status. Otherwise, OK.
8551            if (hasUserSetupCompleted(UserHandle.USER_SYSTEM)) {
8552                if (!mInjector.userManagerIsSplitSystemUser()) {
8553                    if (mUserManager.getUserCount() > 1) {
8554                        return CODE_NONSYSTEM_USER_EXISTS;
8555                    }
8556                    if (AccountManager.get(mContext).getAccounts().length > 0) {
8557                        return CODE_ACCOUNTS_NOT_EMPTY;
8558                    }
8559                } else {
8560                    // STOPSHIP Do proper check in split user mode
8561                }
8562            }
8563            return CODE_OK;
8564        } else {
8565            if (!mInjector.userManagerIsSplitSystemUser()) {
8566                // In non-split user mode, DO has to be user 0
8567                if (deviceOwnerUserId != UserHandle.USER_SYSTEM) {
8568                    return CODE_NOT_SYSTEM_USER;
8569                }
8570                // In non-split user mode, only provision DO before setup wizard completes
8571                if (hasUserSetupCompleted(UserHandle.USER_SYSTEM)) {
8572                    return CODE_USER_SETUP_COMPLETED;
8573                }
8574            } else {
8575                // STOPSHIP Do proper check in split user mode
8576            }
8577            return CODE_OK;
8578        }
8579    }
8580
8581    private boolean isDeviceOwnerProvisioningAllowed(int deviceOwnerUserId) {
8582        return CODE_OK == checkSetDeviceOwnerPreCondition(deviceOwnerUserId, /* isAdb */ false);
8583    }
8584
8585    private boolean hasFeatureManagedUsers() {
8586        try {
8587            return mIPackageManager.hasSystemFeature(PackageManager.FEATURE_MANAGED_USERS, 0);
8588        } catch (RemoteException e) {
8589            return false;
8590        }
8591    }
8592
8593    @Override
8594    public String getWifiMacAddress(ComponentName admin) {
8595        // Make sure caller has DO.
8596        synchronized (this) {
8597            getActiveAdminForCallerLocked(admin, DeviceAdminInfo.USES_POLICY_DEVICE_OWNER);
8598        }
8599
8600        final long ident = mInjector.binderClearCallingIdentity();
8601        try {
8602            final WifiInfo wifiInfo = mInjector.getWifiManager().getConnectionInfo();
8603            if (wifiInfo == null) {
8604                return null;
8605            }
8606            return wifiInfo.hasRealMacAddress() ? wifiInfo.getMacAddress() : null;
8607        } finally {
8608            mInjector.binderRestoreCallingIdentity(ident);
8609        }
8610    }
8611
8612    /**
8613     * Returns the target sdk version number that the given packageName was built for
8614     * in the given user.
8615     */
8616    private int getTargetSdk(String packageName, int userId) {
8617        final ApplicationInfo ai;
8618        try {
8619            ai = mIPackageManager.getApplicationInfo(packageName, 0, userId);
8620            final int targetSdkVersion = ai == null ? 0 : ai.targetSdkVersion;
8621            return targetSdkVersion;
8622        } catch (RemoteException e) {
8623            // Shouldn't happen
8624            return 0;
8625        }
8626    }
8627
8628    @Override
8629    public boolean isManagedProfile(ComponentName admin) {
8630        synchronized (this) {
8631            getActiveAdminForCallerLocked(admin, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
8632        }
8633        final int callingUserId = mInjector.userHandleGetCallingUserId();
8634        final UserInfo user = getUserInfo(callingUserId);
8635        return user != null && user.isManagedProfile();
8636    }
8637
8638    @Override
8639    public boolean isSystemOnlyUser(ComponentName admin) {
8640        synchronized (this) {
8641            getActiveAdminForCallerLocked(admin, DeviceAdminInfo.USES_POLICY_DEVICE_OWNER);
8642        }
8643        final int callingUserId = mInjector.userHandleGetCallingUserId();
8644        return UserManager.isSplitSystemUser() && callingUserId == UserHandle.USER_SYSTEM;
8645    }
8646
8647    @Override
8648    public void reboot(ComponentName admin) {
8649        Preconditions.checkNotNull(admin);
8650        // Make sure caller has DO.
8651        synchronized (this) {
8652            getActiveAdminForCallerLocked(admin, DeviceAdminInfo.USES_POLICY_DEVICE_OWNER);
8653        }
8654        long ident = mInjector.binderClearCallingIdentity();
8655        try {
8656            // Make sure there are no ongoing calls on the device.
8657            if (mTelephonyManager.getCallState() != TelephonyManager.CALL_STATE_IDLE) {
8658                throw new IllegalStateException("Cannot be called with ongoing call on the device");
8659            }
8660            mInjector.powerManagerReboot(PowerManager.REBOOT_REQUESTED_BY_DEVICE_OWNER);
8661        } finally {
8662            mInjector.binderRestoreCallingIdentity(ident);
8663        }
8664    }
8665
8666    @Override
8667    public void setShortSupportMessage(@NonNull ComponentName who, CharSequence message) {
8668        if (!mHasFeature) {
8669            return;
8670        }
8671        Preconditions.checkNotNull(who, "ComponentName is null");
8672        final int userHandle = mInjector.userHandleGetCallingUserId();
8673        synchronized (this) {
8674            ActiveAdmin admin = getActiveAdminForUidLocked(who,
8675                    mInjector.binderGetCallingUid());
8676            if (!TextUtils.equals(admin.shortSupportMessage, message)) {
8677                admin.shortSupportMessage = message;
8678                saveSettingsLocked(userHandle);
8679            }
8680        }
8681    }
8682
8683    @Override
8684    public CharSequence getShortSupportMessage(@NonNull ComponentName who) {
8685        if (!mHasFeature) {
8686            return null;
8687        }
8688        Preconditions.checkNotNull(who, "ComponentName is null");
8689        synchronized (this) {
8690            ActiveAdmin admin = getActiveAdminForUidLocked(who,
8691                    mInjector.binderGetCallingUid());
8692            return admin.shortSupportMessage;
8693        }
8694    }
8695
8696    @Override
8697    public void setLongSupportMessage(@NonNull ComponentName who, CharSequence message) {
8698        if (!mHasFeature) {
8699            return;
8700        }
8701        Preconditions.checkNotNull(who, "ComponentName is null");
8702        final int userHandle = mInjector.userHandleGetCallingUserId();
8703        synchronized (this) {
8704            ActiveAdmin admin = getActiveAdminForUidLocked(who,
8705                    mInjector.binderGetCallingUid());
8706            if (!TextUtils.equals(admin.longSupportMessage, message)) {
8707                admin.longSupportMessage = message;
8708                saveSettingsLocked(userHandle);
8709            }
8710        }
8711    }
8712
8713    @Override
8714    public CharSequence getLongSupportMessage(@NonNull ComponentName who) {
8715        if (!mHasFeature) {
8716            return null;
8717        }
8718        Preconditions.checkNotNull(who, "ComponentName is null");
8719        synchronized (this) {
8720            ActiveAdmin admin = getActiveAdminForUidLocked(who,
8721                    mInjector.binderGetCallingUid());
8722            return admin.longSupportMessage;
8723        }
8724    }
8725
8726    @Override
8727    public CharSequence getShortSupportMessageForUser(@NonNull ComponentName who, int userHandle) {
8728        if (!mHasFeature) {
8729            return null;
8730        }
8731        Preconditions.checkNotNull(who, "ComponentName is null");
8732        if (!isCallerWithSystemUid()) {
8733            throw new SecurityException("Only the system can query support message for user");
8734        }
8735        synchronized (this) {
8736            ActiveAdmin admin = getActiveAdminUncheckedLocked(who, userHandle);
8737            if (admin != null) {
8738                return admin.shortSupportMessage;
8739            }
8740        }
8741        return null;
8742    }
8743
8744    @Override
8745    public CharSequence getLongSupportMessageForUser(@NonNull ComponentName who, int userHandle) {
8746        if (!mHasFeature) {
8747            return null;
8748        }
8749        Preconditions.checkNotNull(who, "ComponentName is null");
8750        if (!isCallerWithSystemUid()) {
8751            throw new SecurityException("Only the system can query support message for user");
8752        }
8753        synchronized (this) {
8754            ActiveAdmin admin = getActiveAdminUncheckedLocked(who, userHandle);
8755            if (admin != null) {
8756                return admin.longSupportMessage;
8757            }
8758        }
8759        return null;
8760    }
8761
8762    @Override
8763    public void setOrganizationColor(@NonNull ComponentName who, int color) {
8764        if (!mHasFeature) {
8765            return;
8766        }
8767        Preconditions.checkNotNull(who, "ComponentName is null");
8768        final int userHandle = mInjector.userHandleGetCallingUserId();
8769        enforceManagedProfile(userHandle, "set organization color");
8770        synchronized (this) {
8771            ActiveAdmin admin = getActiveAdminForCallerLocked(who,
8772                    DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
8773            admin.organizationColor = color;
8774            saveSettingsLocked(userHandle);
8775        }
8776    }
8777
8778    @Override
8779    public void setOrganizationColorForUser(int color, int userId) {
8780        if (!mHasFeature) {
8781            return;
8782        }
8783        enforceFullCrossUsersPermission(userId);
8784        enforceManageUsers();
8785        enforceManagedProfile(userId, "set organization color");
8786        synchronized (this) {
8787            ActiveAdmin admin = getProfileOwnerAdminLocked(userId);
8788            admin.organizationColor = color;
8789            saveSettingsLocked(userId);
8790        }
8791    }
8792
8793    @Override
8794    public int getOrganizationColor(@NonNull ComponentName who) {
8795        if (!mHasFeature) {
8796            return ActiveAdmin.DEF_ORGANIZATION_COLOR;
8797        }
8798        Preconditions.checkNotNull(who, "ComponentName is null");
8799        enforceManagedProfile(mInjector.userHandleGetCallingUserId(), "get organization color");
8800        synchronized (this) {
8801            ActiveAdmin admin = getActiveAdminForCallerLocked(who,
8802                    DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
8803            return admin.organizationColor;
8804        }
8805    }
8806
8807    @Override
8808    public int getOrganizationColorForUser(int userHandle) {
8809        if (!mHasFeature) {
8810            return ActiveAdmin.DEF_ORGANIZATION_COLOR;
8811        }
8812        enforceFullCrossUsersPermission(userHandle);
8813        enforceManagedProfile(userHandle, "get organization color");
8814        synchronized (this) {
8815            ActiveAdmin profileOwner = getProfileOwnerAdminLocked(userHandle);
8816            return (profileOwner != null)
8817                    ? profileOwner.organizationColor
8818                    : ActiveAdmin.DEF_ORGANIZATION_COLOR;
8819        }
8820    }
8821
8822    @Override
8823    public void setOrganizationName(@NonNull ComponentName who, CharSequence text) {
8824        if (!mHasFeature) {
8825            return;
8826        }
8827        Preconditions.checkNotNull(who, "ComponentName is null");
8828        final int userHandle = mInjector.userHandleGetCallingUserId();
8829        enforceManagedProfile(userHandle, "set organization name");
8830        synchronized (this) {
8831            ActiveAdmin admin = getActiveAdminForCallerLocked(who,
8832                    DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
8833            if (!TextUtils.equals(admin.organizationName, text)) {
8834                admin.organizationName = (text == null || text.length() == 0)
8835                        ? null : text.toString();
8836                saveSettingsLocked(userHandle);
8837            }
8838        }
8839    }
8840
8841    @Override
8842    public CharSequence getOrganizationName(@NonNull ComponentName who) {
8843        if (!mHasFeature) {
8844            return null;
8845        }
8846        Preconditions.checkNotNull(who, "ComponentName is null");
8847        enforceManagedProfile(mInjector.userHandleGetCallingUserId(), "get organization name");
8848        synchronized(this) {
8849            ActiveAdmin admin = getActiveAdminForCallerLocked(who,
8850                    DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
8851            return admin.organizationName;
8852        }
8853    }
8854
8855    @Override
8856    public CharSequence getOrganizationNameForUser(int userHandle) {
8857        if (!mHasFeature) {
8858            return null;
8859        }
8860        enforceFullCrossUsersPermission(userHandle);
8861        enforceManagedProfile(userHandle, "get organization name");
8862        synchronized (this) {
8863            ActiveAdmin profileOwner = getProfileOwnerAdminLocked(userHandle);
8864            return (profileOwner != null)
8865                    ? profileOwner.organizationName
8866                    : null;
8867        }
8868    }
8869
8870    @Override
8871    public void setAffiliationIds(ComponentName admin, List<String> ids) {
8872        final Set<String> affiliationIds = new ArraySet<String>(ids);
8873        final int callingUserId = mInjector.userHandleGetCallingUserId();
8874
8875        synchronized (this) {
8876            getActiveAdminForCallerLocked(admin, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
8877            getUserData(callingUserId).mAffiliationIds = affiliationIds;
8878            saveSettingsLocked(callingUserId);
8879            if (callingUserId != UserHandle.USER_SYSTEM && isDeviceOwner(admin, callingUserId)) {
8880                // Affiliation ids specified by the device owner are additionally stored in
8881                // UserHandle.USER_SYSTEM's DevicePolicyData.
8882                getUserData(UserHandle.USER_SYSTEM).mAffiliationIds = affiliationIds;
8883                saveSettingsLocked(UserHandle.USER_SYSTEM);
8884            }
8885        }
8886    }
8887
8888    @Override
8889    public boolean isAffiliatedUser() {
8890        final int callingUserId = mInjector.userHandleGetCallingUserId();
8891
8892        synchronized (this) {
8893            if (mOwners.getDeviceOwnerUserId() == callingUserId) {
8894                // The user that the DO is installed on is always affiliated.
8895                return true;
8896            }
8897            final ComponentName profileOwner = getProfileOwner(callingUserId);
8898            if (profileOwner == null
8899                    || !profileOwner.getPackageName().equals(mOwners.getDeviceOwnerPackageName())) {
8900                return false;
8901            }
8902            final Set<String> userAffiliationIds = getUserData(callingUserId).mAffiliationIds;
8903            final Set<String> deviceAffiliationIds =
8904                    getUserData(UserHandle.USER_SYSTEM).mAffiliationIds;
8905            for (String id : userAffiliationIds) {
8906                if (deviceAffiliationIds.contains(id)) {
8907                    return true;
8908                }
8909            }
8910        }
8911        return false;
8912    }
8913
8914    private synchronized void disableSecurityLoggingIfNotCompliant() {
8915        if (!isDeviceOwnerManagedSingleUserDevice()) {
8916            mInjector.securityLogSetLoggingEnabledProperty(false);
8917            Slog.w(LOG_TAG, "Security logging turned off as it's no longer a single user device.");
8918        }
8919    }
8920
8921    @Override
8922    public void setSecurityLoggingEnabled(ComponentName admin, boolean enabled) {
8923        Preconditions.checkNotNull(admin);
8924        ensureDeviceOwnerManagingSingleUser(admin);
8925
8926        synchronized (this) {
8927            if (enabled == mInjector.securityLogGetLoggingEnabledProperty()) {
8928                return;
8929            }
8930            mInjector.securityLogSetLoggingEnabledProperty(enabled);
8931            if (enabled) {
8932                mSecurityLogMonitor.start();
8933            } else {
8934                mSecurityLogMonitor.stop();
8935            }
8936        }
8937    }
8938
8939    @Override
8940    public boolean isSecurityLoggingEnabled(ComponentName admin) {
8941        Preconditions.checkNotNull(admin);
8942        synchronized (this) {
8943            getActiveAdminForCallerLocked(admin, DeviceAdminInfo.USES_POLICY_DEVICE_OWNER);
8944            return mInjector.securityLogGetLoggingEnabledProperty();
8945        }
8946    }
8947
8948    @Override
8949    public ParceledListSlice<SecurityEvent> retrievePreRebootSecurityLogs(ComponentName admin) {
8950        Preconditions.checkNotNull(admin);
8951        ensureDeviceOwnerManagingSingleUser(admin);
8952
8953        if (!mContext.getResources().getBoolean(R.bool.config_supportPreRebootSecurityLogs)) {
8954            return null;
8955        }
8956
8957        ArrayList<SecurityEvent> output = new ArrayList<SecurityEvent>();
8958        try {
8959            SecurityLog.readPreviousEvents(output);
8960            return new ParceledListSlice<SecurityEvent>(output);
8961        } catch (IOException e) {
8962            Slog.w(LOG_TAG, "Fail to read previous events" , e);
8963            return new ParceledListSlice<SecurityEvent>(Collections.<SecurityEvent>emptyList());
8964        }
8965    }
8966
8967    @Override
8968    public ParceledListSlice<SecurityEvent> retrieveSecurityLogs(ComponentName admin) {
8969        Preconditions.checkNotNull(admin);
8970        ensureDeviceOwnerManagingSingleUser(admin);
8971
8972        List<SecurityEvent> logs = mSecurityLogMonitor.retrieveLogs();
8973        return logs != null ? new ParceledListSlice<SecurityEvent>(logs) : null;
8974    }
8975
8976    private void enforceCanManageDeviceAdmin() {
8977        mContext.enforceCallingOrSelfPermission(android.Manifest.permission.MANAGE_DEVICE_ADMINS,
8978                null);
8979    }
8980
8981    private void enforceCanManageProfileAndDeviceOwners() {
8982        mContext.enforceCallingOrSelfPermission(
8983                android.Manifest.permission.MANAGE_PROFILE_AND_DEVICE_OWNERS, null);
8984    }
8985
8986    @Override
8987    public boolean isUninstallInQueue(final String packageName) {
8988        enforceCanManageDeviceAdmin();
8989        final int userId = mInjector.userHandleGetCallingUserId();
8990        Pair<String, Integer> packageUserPair = new Pair<>(packageName, userId);
8991        synchronized (this) {
8992            return mPackagesToRemove.contains(packageUserPair);
8993        }
8994    }
8995
8996    @Override
8997    public void uninstallPackageWithActiveAdmins(final String packageName) {
8998        enforceCanManageDeviceAdmin();
8999        Preconditions.checkArgument(!TextUtils.isEmpty(packageName));
9000
9001        final int userId = mInjector.userHandleGetCallingUserId();
9002
9003        enforceUserUnlocked(userId);
9004
9005        final ComponentName profileOwner = getProfileOwner(userId);
9006        if (profileOwner != null && packageName.equals(profileOwner.getPackageName())) {
9007            throw new IllegalArgumentException("Cannot uninstall a package with a profile owner");
9008        }
9009
9010        final ComponentName deviceOwner = getDeviceOwnerComponent(/* callingUserOnly= */ false);
9011        if (getDeviceOwnerUserId() == userId && deviceOwner != null
9012                && packageName.equals(deviceOwner.getPackageName())) {
9013            throw new IllegalArgumentException("Cannot uninstall a package with a device owner");
9014        }
9015
9016        final Pair<String, Integer> packageUserPair = new Pair<>(packageName, userId);
9017        synchronized (this) {
9018            mPackagesToRemove.add(packageUserPair);
9019        }
9020
9021        // All active admins on the user.
9022        final List<ComponentName> allActiveAdmins = getActiveAdmins(userId);
9023
9024        // Active admins in the target package.
9025        final List<ComponentName> packageActiveAdmins = new ArrayList<>();
9026        if (allActiveAdmins != null) {
9027            for (ComponentName activeAdmin : allActiveAdmins) {
9028                if (packageName.equals(activeAdmin.getPackageName())) {
9029                    packageActiveAdmins.add(activeAdmin);
9030                    removeActiveAdmin(activeAdmin, userId);
9031                }
9032            }
9033        }
9034        if (packageActiveAdmins.size() == 0) {
9035            startUninstallIntent(packageName, userId);
9036        } else {
9037            mHandler.postDelayed(new Runnable() {
9038                @Override
9039                public void run() {
9040                    for (ComponentName activeAdmin : packageActiveAdmins) {
9041                        removeAdminArtifacts(activeAdmin, userId);
9042                    }
9043                    startUninstallIntent(packageName, userId);
9044                }
9045            }, DEVICE_ADMIN_DEACTIVATE_TIMEOUT); // Start uninstall after timeout anyway.
9046        }
9047    }
9048
9049    @Override
9050    public boolean isDeviceProvisioned() {
9051        return !TextUtils.isEmpty(mInjector.systemPropertiesGet(PROPERTY_DEVICE_OWNER_PRESENT));
9052    }
9053
9054    private void removePackageIfRequired(final String packageName, final int userId) {
9055        if (!packageHasActiveAdmins(packageName, userId)) {
9056            // Will not do anything if uninstall was not requested or was already started.
9057            startUninstallIntent(packageName, userId);
9058        }
9059    }
9060
9061    private void startUninstallIntent(final String packageName, final int userId) {
9062        final Pair<String, Integer> packageUserPair = new Pair<>(packageName, userId);
9063        synchronized (this) {
9064            if (!mPackagesToRemove.contains(packageUserPair)) {
9065                // Do nothing if uninstall was not requested or was already started.
9066                return;
9067            }
9068            mPackagesToRemove.remove(packageUserPair);
9069        }
9070        try {
9071            if (mInjector.getIPackageManager().getPackageInfo(packageName, 0, userId) == null) {
9072                // Package does not exist. Nothing to do.
9073                return;
9074            }
9075        } catch (RemoteException re) {
9076            Log.e(LOG_TAG, "Failure talking to PackageManager while getting package info");
9077        }
9078
9079        try { // force stop the package before uninstalling
9080            mInjector.getIActivityManager().forceStopPackage(packageName, userId);
9081        } catch (RemoteException re) {
9082            Log.e(LOG_TAG, "Failure talking to ActivityManager while force stopping package");
9083        }
9084        final Uri packageURI = Uri.parse("package:" + packageName);
9085        final Intent uninstallIntent = new Intent(Intent.ACTION_UNINSTALL_PACKAGE, packageURI);
9086        uninstallIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
9087        mContext.startActivityAsUser(uninstallIntent, UserHandle.of(userId));
9088    }
9089
9090    /**
9091     * Removes the admin from the policy. Ideally called after the admin's
9092     * {@link DeviceAdminReceiver#onDisabled(Context, Intent)} has been successfully completed.
9093     *
9094     * @param adminReceiver The admin to remove
9095     * @param userHandle The user for which this admin has to be removed.
9096     */
9097    private void removeAdminArtifacts(final ComponentName adminReceiver, final int userHandle) {
9098        synchronized (this) {
9099            final ActiveAdmin admin = getActiveAdminUncheckedLocked(adminReceiver, userHandle);
9100            if (admin == null) {
9101                return;
9102            }
9103            final DevicePolicyData policy = getUserData(userHandle);
9104            final boolean doProxyCleanup = admin.info.usesPolicy(
9105                    DeviceAdminInfo.USES_POLICY_SETS_GLOBAL_PROXY);
9106            policy.mAdminList.remove(admin);
9107            policy.mAdminMap.remove(adminReceiver);
9108            validatePasswordOwnerLocked(policy);
9109            if (doProxyCleanup) {
9110                resetGlobalProxyLocked(policy);
9111            }
9112            saveSettingsLocked(userHandle);
9113            updateMaximumTimeToLockLocked(userHandle);
9114            policy.mRemovingAdmins.remove(adminReceiver);
9115        }
9116        // The removed admin might have disabled camera, so update user
9117        // restrictions.
9118        pushUserRestrictions(userHandle);
9119    }
9120
9121    @Override
9122    public void setDeviceProvisioningConfigApplied() {
9123        enforceManageUsers();
9124        synchronized (this) {
9125            DevicePolicyData policy = getUserData(UserHandle.USER_SYSTEM);
9126            policy.mDeviceProvisioningConfigApplied = true;
9127            saveSettingsLocked(UserHandle.USER_SYSTEM);
9128        }
9129    }
9130
9131    @Override
9132    public boolean isDeviceProvisioningConfigApplied() {
9133        enforceManageUsers();
9134        synchronized (this) {
9135            final DevicePolicyData policy = getUserData(UserHandle.USER_SYSTEM);
9136            return policy.mDeviceProvisioningConfigApplied;
9137        }
9138    }
9139}
9140