• TrustManagerService.java


       1 /*
       2  * Copyright (C) 2014 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 
      17 package com.android.server.trust;
      18 
      19 import android.Manifest;
      20 import android.annotation.UserIdInt;
      21 import android.app.ActivityManager;
      22 import android.app.admin.DevicePolicyManager;
      23 import android.app.trust.ITrustListener;
      24 import android.app.trust.ITrustManager;
      25 import android.content.BroadcastReceiver;
      26 import android.content.ComponentName;
      27 import android.content.Context;
      28 import android.content.Intent;
      29 import android.content.IntentFilter;
      30 import android.content.pm.ApplicationInfo;
      31 import android.content.pm.PackageManager;
      32 import android.content.pm.ResolveInfo;
      33 import android.content.pm.UserInfo;
      34 import android.content.res.Resources;
      35 import android.content.res.TypedArray;
      36 import android.content.res.XmlResourceParser;
      37 import android.graphics.drawable.Drawable;
      38 import android.os.Binder;
      39 import android.os.Build;
      40 import android.os.DeadObjectException;
      41 import android.os.Handler;
      42 import android.os.IBinder;
      43 import android.os.Message;
      44 import android.os.PersistableBundle;
      45 import android.os.RemoteException;
      46 import android.os.SystemClock;
      47 import android.os.UserHandle;
      48 import android.os.UserManager;
      49 import android.os.storage.StorageManager;
      50 import android.provider.Settings;
      51 import android.service.trust.TrustAgentService;
      52 import android.text.TextUtils;
      53 import android.util.ArraySet;
      54 import android.util.AttributeSet;
      55 import android.util.Log;
      56 import android.util.Slog;
      57 import android.util.SparseBooleanArray;
      58 import android.util.Xml;
      59 import android.view.IWindowManager;
      60 import android.view.WindowManagerGlobal;
      61 import com.android.internal.annotations.GuardedBy;
      62 import com.android.internal.content.PackageMonitor;
      63 import com.android.internal.policy.IKeyguardDismissCallback;
      64 import com.android.internal.util.DumpUtils;
      65 import com.android.internal.widget.LockPatternUtils;
      66 import com.android.server.SystemService;
      67 import java.io.FileDescriptor;
      68 import java.io.IOException;
      69 import java.io.PrintWriter;
      70 import java.util.ArrayList;
      71 import java.util.List;
      72 import org.xmlpull.v1.XmlPullParser;
      73 import org.xmlpull.v1.XmlPullParserException;
      74 
      75 /**
      76  * Manages trust agents and trust listeners.
      77  *
      78  * It is responsible for binding to the enabled {@link android.service.trust.TrustAgentService}s
      79  * of each user and notifies them about events that are relevant to them.
      80  * It start and stops them based on the value of
      81  * {@link com.android.internal.widget.LockPatternUtils#getEnabledTrustAgents(int)}.
      82  *
      83  * It also keeps a set of {@link android.app.trust.ITrustListener}s that are notified whenever the
      84  * trust state changes for any user.
      85  *
      86  * Trust state and the setting of enabled agents is kept per user and each user has its own
      87  * instance of a {@link android.service.trust.TrustAgentService}.
      88  */
      89 public class TrustManagerService extends SystemService {
      90     private static final String TAG = "TrustManagerService";
      91     static final boolean DEBUG = Build.IS_DEBUGGABLE && Log.isLoggable(TAG, Log.VERBOSE);
      92 
      93     private static final Intent TRUST_AGENT_INTENT =
      94             new Intent(TrustAgentService.SERVICE_INTERFACE);
      95     private static final String PERMISSION_PROVIDE_AGENT = Manifest.permission.PROVIDE_TRUST_AGENT;
      96 
      97     private static final int MSG_REGISTER_LISTENER = 1;
      98     private static final int MSG_UNREGISTER_LISTENER = 2;
      99     private static final int MSG_DISPATCH_UNLOCK_ATTEMPT = 3;
     100     private static final int MSG_ENABLED_AGENTS_CHANGED = 4;
     101     private static final int MSG_KEYGUARD_SHOWING_CHANGED = 6;
     102     private static final int MSG_START_USER = 7;
     103     private static final int MSG_CLEANUP_USER = 8;
     104     private static final int MSG_SWITCH_USER = 9;
     105     private static final int MSG_FLUSH_TRUST_USUALLY_MANAGED = 10;
     106     private static final int MSG_UNLOCK_USER = 11;
     107     private static final int MSG_STOP_USER = 12;
     108     private static final int MSG_DISPATCH_UNLOCK_LOCKOUT = 13;
     109     private static final int MSG_REFRESH_DEVICE_LOCKED_FOR_USER = 14;
     110 
     111     private static final int TRUST_USUALLY_MANAGED_FLUSH_DELAY = 2 * 60 * 1000;
     112 
     113     private final ArraySet<AgentInfo> mActiveAgents = new ArraySet<>();
     114     private final ArrayList<ITrustListener> mTrustListeners = new ArrayList<>();
     115     private final Receiver mReceiver = new Receiver();
     116 
     117     /* package */ final TrustArchive mArchive = new TrustArchive();
     118     private final Context mContext;
     119     private final LockPatternUtils mLockPatternUtils;
     120     private final UserManager mUserManager;
     121     private final ActivityManager mActivityManager;
     122 
     123     @GuardedBy("mUserIsTrusted")
     124     private final SparseBooleanArray mUserIsTrusted = new SparseBooleanArray();
     125 
     126     @GuardedBy("mDeviceLockedForUser")
     127     private final SparseBooleanArray mDeviceLockedForUser = new SparseBooleanArray();
     128 
     129     @GuardedBy("mTrustUsuallyManagedForUser")
     130     private final SparseBooleanArray mTrustUsuallyManagedForUser = new SparseBooleanArray();
     131 
     132     // set to true only if user can skip bouncer
     133     @GuardedBy("mUsersUnlockedByFingerprint")
     134     private final SparseBooleanArray mUsersUnlockedByFingerprint = new SparseBooleanArray();
     135 
     136     private final StrongAuthTracker mStrongAuthTracker;
     137 
     138     private boolean mTrustAgentsCanRun = false;
     139     private int mCurrentUser = UserHandle.USER_SYSTEM;
     140 
     141     public TrustManagerService(Context context) {
     142         super(context);
     143         mContext = context;
     144         mUserManager = (UserManager) mContext.getSystemService(Context.USER_SERVICE);
     145         mActivityManager = (ActivityManager) mContext.getSystemService(Context.ACTIVITY_SERVICE);
     146         mLockPatternUtils = new LockPatternUtils(context);
     147         mStrongAuthTracker = new StrongAuthTracker(context);
     148     }
     149 
     150     @Override
     151     public void onStart() {
     152         publishBinderService(Context.TRUST_SERVICE, mService);
     153     }
     154 
     155     @Override
     156     public void onBootPhase(int phase) {
     157         if (isSafeMode()) {
     158             // No trust agents in safe mode.
     159             return;
     160         }
     161         if (phase == SystemService.PHASE_SYSTEM_SERVICES_READY) {
     162             mPackageMonitor.register(mContext, mHandler.getLooper(), UserHandle.ALL, true);
     163             mReceiver.register(mContext);
     164             mLockPatternUtils.registerStrongAuthTracker(mStrongAuthTracker);
     165         } else if (phase == SystemService.PHASE_THIRD_PARTY_APPS_CAN_START) {
     166             mTrustAgentsCanRun = true;
     167             refreshAgentList(UserHandle.USER_ALL);
     168             refreshDeviceLockedForUser(UserHandle.USER_ALL);
     169         } else if (phase == SystemService.PHASE_BOOT_COMPLETED) {
     170             maybeEnableFactoryTrustAgents(mLockPatternUtils, UserHandle.USER_SYSTEM);
     171         }
     172     }
     173 
     174     // Agent management
     175 
     176     private static final class AgentInfo {
     177         CharSequence label;
     178         Drawable icon;
     179         ComponentName component; // service that implements ITrustAgent
     180         SettingsAttrs settings; // setting to launch to modify agent.
     181         TrustAgentWrapper agent;
     182         int userId;
     183 
     184         @Override
     185         public boolean equals(Object other) {
     186             if (!(other instanceof AgentInfo)) {
     187                 return false;
     188             }
     189             AgentInfo o = (AgentInfo) other;
     190             return component.equals(o.component) && userId == o.userId;
     191         }
     192 
     193         @Override
     194         public int hashCode() {
     195             return component.hashCode() * 31 + userId;
     196         }
     197     }
     198 
     199     private void updateTrustAll() {
     200         List<UserInfo> userInfos = mUserManager.getUsers(true /* excludeDying */);
     201         for (UserInfo userInfo : userInfos) {
     202             updateTrust(userInfo.id, 0);
     203         }
     204     }
     205 
     206     public void updateTrust(int userId, int flags) {
     207         boolean managed = aggregateIsTrustManaged(userId);
     208         dispatchOnTrustManagedChanged(managed, userId);
     209         if (mStrongAuthTracker.isTrustAllowedForUser(userId)
     210                 && isTrustUsuallyManagedInternal(userId) != managed) {
     211             updateTrustUsuallyManaged(userId, managed);
     212         }
     213         boolean trusted = aggregateIsTrusted(userId);
     214         boolean changed;
     215         synchronized (mUserIsTrusted) {
     216             changed = mUserIsTrusted.get(userId) != trusted;
     217             mUserIsTrusted.put(userId, trusted);
     218         }
     219         dispatchOnTrustChanged(trusted, userId, flags);
     220         if (changed) {
     221             refreshDeviceLockedForUser(userId);
     222         }
     223     }
     224 
     225     private void updateTrustUsuallyManaged(int userId, boolean managed) {
     226         synchronized (mTrustUsuallyManagedForUser) {
     227             mTrustUsuallyManagedForUser.put(userId, managed);
     228         }
     229         // Wait a few minutes before committing to flash, in case the trust agent is transiently not
     230         // managing trust (crashed, needs to acknowledge DPM restrictions, etc).
     231         mHandler.removeMessages(MSG_FLUSH_TRUST_USUALLY_MANAGED);
     232         mHandler.sendMessageDelayed(
     233                 mHandler.obtainMessage(MSG_FLUSH_TRUST_USUALLY_MANAGED),
     234                 TRUST_USUALLY_MANAGED_FLUSH_DELAY);
     235     }
     236 
     237     public long addEscrowToken(byte[] token, int userId) {
     238         return mLockPatternUtils.addEscrowToken(token, userId);
     239     }
     240 
     241     public boolean removeEscrowToken(long handle, int userId) {
     242         return mLockPatternUtils.removeEscrowToken(handle, userId);
     243     }
     244 
     245     public boolean isEscrowTokenActive(long handle, int userId) {
     246         return mLockPatternUtils.isEscrowTokenActive(handle, userId);
     247     }
     248 
     249     public void unlockUserWithToken(long handle, byte[] token, int userId) {
     250         mLockPatternUtils.unlockUserWithToken(handle, token, userId);
     251     }
     252 
     253     void showKeyguardErrorMessage(CharSequence message) {
     254         dispatchOnTrustError(message);
     255     }
     256 
     257     void refreshAgentList(int userIdOrAll) {
     258         if (DEBUG) Slog.d(TAG, "refreshAgentList(" + userIdOrAll + ")");
     259         if (!mTrustAgentsCanRun) {
     260             return;
     261         }
     262         if (userIdOrAll != UserHandle.USER_ALL && userIdOrAll < UserHandle.USER_SYSTEM) {
     263             Log.e(TAG, "refreshAgentList(userId=" + userIdOrAll + "): Invalid user handle,"
     264                     + " must be USER_ALL or a specific user.", new Throwable("here"));
     265             userIdOrAll = UserHandle.USER_ALL;
     266         }
     267         PackageManager pm = mContext.getPackageManager();
     268 
     269         List<UserInfo> userInfos;
     270         if (userIdOrAll == UserHandle.USER_ALL) {
     271             userInfos = mUserManager.getUsers(true /* excludeDying */);
     272         } else {
     273             userInfos = new ArrayList<>();
     274             userInfos.add(mUserManager.getUserInfo(userIdOrAll));
     275         }
     276         LockPatternUtils lockPatternUtils = mLockPatternUtils;
     277 
     278         ArraySet<AgentInfo> obsoleteAgents = new ArraySet<>();
     279         obsoleteAgents.addAll(mActiveAgents);
     280 
     281         for (UserInfo userInfo : userInfos) {
     282             if (userInfo == null || userInfo.partial || !userInfo.isEnabled()
     283                     || userInfo.guestToRemove) continue;
     284             if (!userInfo.supportsSwitchToByUser()) {
     285                 if (DEBUG) Slog.d(TAG, "refreshAgentList: skipping user " + userInfo.id
     286                         + ": switchToByUser=false");
     287                 continue;
     288             }
     289             if (!mActivityManager.isUserRunning(userInfo.id)) {
     290                 if (DEBUG) Slog.d(TAG, "refreshAgentList: skipping user " + userInfo.id
     291                         + ": user not started");
     292                 continue;
     293             }
     294             if (!lockPatternUtils.isSecure(userInfo.id)) {
     295                 if (DEBUG) Slog.d(TAG, "refreshAgentList: skipping user " + userInfo.id
     296                         + ": no secure credential");
     297                 continue;
     298             }
     299 
     300             DevicePolicyManager dpm = lockPatternUtils.getDevicePolicyManager();
     301             int disabledFeatures = dpm.getKeyguardDisabledFeatures(null, userInfo.id);
     302             final boolean disableTrustAgents =
     303                     (disabledFeatures & DevicePolicyManager.KEYGUARD_DISABLE_TRUST_AGENTS) != 0;
     304 
     305             List<ComponentName> enabledAgents = lockPatternUtils.getEnabledTrustAgents(userInfo.id);
     306             if (enabledAgents == null) {
     307                 if (DEBUG) Slog.d(TAG, "refreshAgentList: skipping user " + userInfo.id
     308                         + ": no agents enabled by user");
     309                 continue;
     310             }
     311             List<ResolveInfo> resolveInfos = resolveAllowedTrustAgents(pm, userInfo.id);
     312             for (ResolveInfo resolveInfo : resolveInfos) {
     313                 ComponentName name = getComponentName(resolveInfo);
     314 
     315                 if (!enabledAgents.contains(name)) {
     316                     if (DEBUG) Slog.d(TAG, "refreshAgentList: skipping "
     317                             + name.flattenToShortString() + " u"+ userInfo.id
     318                             + ": not enabled by user");
     319                     continue;
     320                 }
     321                 if (disableTrustAgents) {
     322                     List<PersistableBundle> config =
     323                             dpm.getTrustAgentConfiguration(null /* admin */, name, userInfo.id);
     324                     // Disable agent if no features are enabled.
     325                     if (config == null || config.isEmpty()) {
     326                         if (DEBUG) Slog.d(TAG, "refreshAgentList: skipping "
     327                                 + name.flattenToShortString() + " u"+ userInfo.id
     328                                 + ": not allowed by DPM");
     329                         continue;
     330                     }
     331                 }
     332                 AgentInfo agentInfo = new AgentInfo();
     333                 agentInfo.component = name;
     334                 agentInfo.userId = userInfo.id;
     335                 if (!mActiveAgents.contains(agentInfo)) {
     336                     agentInfo.label = resolveInfo.loadLabel(pm);
     337                     agentInfo.icon = resolveInfo.loadIcon(pm);
     338                     agentInfo.settings = getSettingsAttrs(pm, resolveInfo);
     339                 } else {
     340                     int index = mActiveAgents.indexOf(agentInfo);
     341                     agentInfo = mActiveAgents.valueAt(index);
     342                 }
     343 
     344                 boolean directUnlock = resolveInfo.serviceInfo.directBootAware
     345                     && agentInfo.settings.canUnlockProfile;
     346 
     347                 if (directUnlock) {
     348                     if (DEBUG) Slog.d(TAG, "refreshAgentList: trustagent " + name
     349                             + "of user " + userInfo.id + "can unlock user profile.");
     350                 }
     351 
     352                 if (!mUserManager.isUserUnlockingOrUnlocked(userInfo.id)
     353                         && !directUnlock) {
     354                     if (DEBUG) Slog.d(TAG, "refreshAgentList: skipping user " + userInfo.id
     355                             + "'s trust agent " + name + ": FBE still locked and "
     356                             + " the agent cannot unlock user profile.");
     357                     continue;
     358                 }
     359 
     360                 if (!mStrongAuthTracker.canAgentsRunForUser(userInfo.id)) {
     361                     int flag = mStrongAuthTracker.getStrongAuthForUser(userInfo.id);
     362                     if (flag != StrongAuthTracker.STRONG_AUTH_REQUIRED_AFTER_LOCKOUT) {
     363                         if (flag != StrongAuthTracker.STRONG_AUTH_REQUIRED_AFTER_BOOT
     364                             || !directUnlock) {
     365                             if (DEBUG)
     366                                 Slog.d(TAG, "refreshAgentList: skipping user " + userInfo.id
     367                                     + ": prevented by StrongAuthTracker = 0x"
     368                                     + Integer.toHexString(mStrongAuthTracker.getStrongAuthForUser(
     369                                     userInfo.id)));
     370                             continue;
     371                         }
     372                     }
     373                 }
     374 
     375                 if (agentInfo.agent == null) {
     376                     agentInfo.agent = new TrustAgentWrapper(mContext, this,
     377                             new Intent().setComponent(name), userInfo.getUserHandle());
     378                 }
     379 
     380                 if (!mActiveAgents.contains(agentInfo)) {
     381                     mActiveAgents.add(agentInfo);
     382                 } else {
     383                     obsoleteAgents.remove(agentInfo);
     384                 }
     385             }
     386         }
     387 
     388         boolean trustMayHaveChanged = false;
     389         for (int i = 0; i < obsoleteAgents.size(); i++) {
     390             AgentInfo info = obsoleteAgents.valueAt(i);
     391             if (userIdOrAll == UserHandle.USER_ALL || userIdOrAll == info.userId) {
     392                 if (info.agent.isManagingTrust()) {
     393                     trustMayHaveChanged = true;
     394                 }
     395                 info.agent.destroy();
     396                 mActiveAgents.remove(info);
     397             }
     398         }
     399 
     400         if (trustMayHaveChanged) {
     401             if (userIdOrAll == UserHandle.USER_ALL) {
     402                 updateTrustAll();
     403             } else {
     404                 updateTrust(userIdOrAll, 0);
     405             }
     406         }
     407     }
     408 
     409     boolean isDeviceLockedInner(int userId) {
     410         synchronized (mDeviceLockedForUser) {
     411             return mDeviceLockedForUser.get(userId, true);
     412         }
     413     }
     414 
     415     private void refreshDeviceLockedForUser(int userId) {
     416         if (userId != UserHandle.USER_ALL && userId < UserHandle.USER_SYSTEM) {
     417             Log.e(TAG, "refreshDeviceLockedForUser(userId=" + userId + "): Invalid user handle,"
     418                     + " must be USER_ALL or a specific user.", new Throwable("here"));
     419             userId = UserHandle.USER_ALL;
     420         }
     421         List<UserInfo> userInfos;
     422         if (userId == UserHandle.USER_ALL) {
     423             userInfos = mUserManager.getUsers(true /* excludeDying */);
     424         } else {
     425             userInfos = new ArrayList<>();
     426             userInfos.add(mUserManager.getUserInfo(userId));
     427         }
     428 
     429         IWindowManager wm = WindowManagerGlobal.getWindowManagerService();
     430 
     431         for (int i = 0; i < userInfos.size(); i++) {
     432             UserInfo info = userInfos.get(i);
     433 
     434             if (info == null || info.partial || !info.isEnabled() || info.guestToRemove
     435                     || !info.supportsSwitchToByUser()) {
     436                 continue;
     437             }
     438 
     439             int id = info.id;
     440             boolean secure = mLockPatternUtils.isSecure(id);
     441             boolean trusted = aggregateIsTrusted(id);
     442             boolean showingKeyguard = true;
     443             boolean fingerprintAuthenticated = false;
     444 
     445             if (mCurrentUser == id) {
     446                 synchronized(mUsersUnlockedByFingerprint) {
     447                     fingerprintAuthenticated = mUsersUnlockedByFingerprint.get(id, false);
     448                 }
     449                 try {
     450                     showingKeyguard = wm.isKeyguardLocked();
     451                 } catch (RemoteException e) {
     452                 }
     453             }
     454             boolean deviceLocked = secure && showingKeyguard && !trusted &&
     455                     !fingerprintAuthenticated;
     456             setDeviceLockedForUser(id, deviceLocked);
     457         }
     458     }
     459 
     460     private void setDeviceLockedForUser(@UserIdInt int userId, boolean locked) {
     461         final boolean changed;
     462         synchronized (mDeviceLockedForUser) {
     463             changed = isDeviceLockedInner(userId) != locked;
     464             mDeviceLockedForUser.put(userId, locked);
     465         }
     466         if (changed) {
     467             dispatchDeviceLocked(userId, locked);
     468         }
     469     }
     470 
     471     private void dispatchDeviceLocked(int userId, boolean isLocked) {
     472         for (int i = 0; i < mActiveAgents.size(); i++) {
     473             AgentInfo agent = mActiveAgents.valueAt(i);
     474             if (agent.userId == userId) {
     475                 if (isLocked) {
     476                     agent.agent.onDeviceLocked();
     477                 } else{
     478                     agent.agent.onDeviceUnlocked();
     479                 }
     480             }
     481         }
     482     }
     483 
     484     void updateDevicePolicyFeatures() {
     485         boolean changed = false;
     486         for (int i = 0; i < mActiveAgents.size(); i++) {
     487             AgentInfo info = mActiveAgents.valueAt(i);
     488             if (info.agent.isConnected()) {
     489                 info.agent.updateDevicePolicyFeatures();
     490                 changed = true;
     491             }
     492         }
     493         if (changed) {
     494             mArchive.logDevicePolicyChanged();
     495         }
     496     }
     497 
     498     private void removeAgentsOfPackage(String packageName) {
     499         boolean trustMayHaveChanged = false;
     500         for (int i = mActiveAgents.size() - 1; i >= 0; i--) {
     501             AgentInfo info = mActiveAgents.valueAt(i);
     502             if (packageName.equals(info.component.getPackageName())) {
     503                 Log.i(TAG, "Resetting agent " + info.component.flattenToShortString());
     504                 if (info.agent.isManagingTrust()) {
     505                     trustMayHaveChanged = true;
     506                 }
     507                 info.agent.destroy();
     508                 mActiveAgents.removeAt(i);
     509             }
     510         }
     511         if (trustMayHaveChanged) {
     512             updateTrustAll();
     513         }
     514     }
     515 
     516     public void resetAgent(ComponentName name, int userId) {
     517         boolean trustMayHaveChanged = false;
     518         for (int i = mActiveAgents.size() - 1; i >= 0; i--) {
     519             AgentInfo info = mActiveAgents.valueAt(i);
     520             if (name.equals(info.component) && userId == info.userId) {
     521                 Log.i(TAG, "Resetting agent " + info.component.flattenToShortString());
     522                 if (info.agent.isManagingTrust()) {
     523                     trustMayHaveChanged = true;
     524                 }
     525                 info.agent.destroy();
     526                 mActiveAgents.removeAt(i);
     527             }
     528         }
     529         if (trustMayHaveChanged) {
     530             updateTrust(userId, 0);
     531         }
     532         refreshAgentList(userId);
     533     }
     534 
     535     private SettingsAttrs getSettingsAttrs(PackageManager pm, ResolveInfo resolveInfo) {
     536         if (resolveInfo == null || resolveInfo.serviceInfo == null
     537                 || resolveInfo.serviceInfo.metaData == null) return null;
     538         String cn = null;
     539         boolean canUnlockProfile = false;
     540 
     541         XmlResourceParser parser = null;
     542         Exception caughtException = null;
     543         try {
     544             parser = resolveInfo.serviceInfo.loadXmlMetaData(pm,
     545                     TrustAgentService.TRUST_AGENT_META_DATA);
     546             if (parser == null) {
     547                 Slog.w(TAG, "Can't find " + TrustAgentService.TRUST_AGENT_META_DATA + " meta-data");
     548                 return null;
     549             }
     550             Resources res = pm.getResourcesForApplication(resolveInfo.serviceInfo.applicationInfo);
     551             AttributeSet attrs = Xml.asAttributeSet(parser);
     552             int type;
     553             while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
     554                     && type != XmlPullParser.START_TAG) {
     555                 // Drain preamble.
     556             }
     557             String nodeName = parser.getName();
     558             if (!"trust-agent".equals(nodeName)) {
     559                 Slog.w(TAG, "Meta-data does not start with trust-agent tag");
     560                 return null;
     561             }
     562             TypedArray sa = res
     563                     .obtainAttributes(attrs, com.android.internal.R.styleable.TrustAgent);
     564             cn = sa.getString(com.android.internal.R.styleable.TrustAgent_settingsActivity);
     565             canUnlockProfile = sa.getBoolean(
     566                     com.android.internal.R.styleable.TrustAgent_unlockProfile, false);
     567             sa.recycle();
     568         } catch (PackageManager.NameNotFoundException e) {
     569             caughtException = e;
     570         } catch (IOException e) {
     571             caughtException = e;
     572         } catch (XmlPullParserException e) {
     573             caughtException = e;
     574         } finally {
     575             if (parser != null) parser.close();
     576         }
     577         if (caughtException != null) {
     578             Slog.w(TAG, "Error parsing : " + resolveInfo.serviceInfo.packageName, caughtException);
     579             return null;
     580         }
     581         if (cn == null) {
     582             return null;
     583         }
     584         if (cn.indexOf('/') < 0) {
     585             cn = resolveInfo.serviceInfo.packageName + "/" + cn;
     586         }
     587         return new SettingsAttrs(ComponentName.unflattenFromString(cn), canUnlockProfile);
     588     }
     589 
     590     private ComponentName getComponentName(ResolveInfo resolveInfo) {
     591         if (resolveInfo == null || resolveInfo.serviceInfo == null) return null;
     592         return new ComponentName(resolveInfo.serviceInfo.packageName, resolveInfo.serviceInfo.name);
     593     }
     594 
     595     private void maybeEnableFactoryTrustAgents(LockPatternUtils utils, int userId) {
     596         if (0 != Settings.Secure.getIntForUser(mContext.getContentResolver(),
     597                 Settings.Secure.TRUST_AGENTS_INITIALIZED, 0, userId)) {
     598             return;
     599         }
     600         PackageManager pm = mContext.getPackageManager();
     601         List<ResolveInfo> resolveInfos = resolveAllowedTrustAgents(pm, userId);
     602         ComponentName defaultAgent = getDefaultFactoryTrustAgent(mContext);
     603         boolean shouldUseDefaultAgent = defaultAgent != null;
     604         ArraySet<ComponentName> discoveredAgents = new ArraySet<>();
     605 
     606         if (shouldUseDefaultAgent) {
     607             discoveredAgents.add(defaultAgent);
     608             Log.i(TAG, "Enabling " + defaultAgent + " because it is a default agent.");
     609         } else { // A default agent is not set; perform regular trust agent discovery
     610             for (ResolveInfo resolveInfo : resolveInfos) {
     611                 ComponentName componentName = getComponentName(resolveInfo);
     612                 int applicationInfoFlags = resolveInfo.serviceInfo.applicationInfo.flags;
     613                 if ((applicationInfoFlags & ApplicationInfo.FLAG_SYSTEM) == 0) {
     614                     Log.i(TAG, "Leaving agent " + componentName + " disabled because package "
     615                             + "is not a system package.");
     616                     continue;
     617                 }
     618                 discoveredAgents.add(componentName);
     619             }
     620         }
     621 
     622         List<ComponentName> previouslyEnabledAgents = utils.getEnabledTrustAgents(userId);
     623         if (previouslyEnabledAgents != null) {
     624             discoveredAgents.addAll(previouslyEnabledAgents);
     625         }
     626         utils.setEnabledTrustAgents(discoveredAgents, userId);
     627         Settings.Secure.putIntForUser(mContext.getContentResolver(),
     628                 Settings.Secure.TRUST_AGENTS_INITIALIZED, 1, userId);
     629     }
     630 
     631     /**
     632      * Returns the {@link ComponentName} for the default trust agent, or {@code null} if there
     633      * is no trust agent set.
     634      */
     635     private static ComponentName getDefaultFactoryTrustAgent(Context context) {
     636         String defaultTrustAgent = context.getResources()
     637             .getString(com.android.internal.R.string.config_defaultTrustAgent);
     638         if (TextUtils.isEmpty(defaultTrustAgent)) {
     639             return null;
     640         }
     641         return ComponentName.unflattenFromString(defaultTrustAgent);
     642     }
     643 
     644     private List<ResolveInfo> resolveAllowedTrustAgents(PackageManager pm, int userId) {
     645         List<ResolveInfo> resolveInfos = pm.queryIntentServicesAsUser(TRUST_AGENT_INTENT,
     646                 PackageManager.GET_META_DATA |
     647                 PackageManager.MATCH_DIRECT_BOOT_AWARE | PackageManager.MATCH_DIRECT_BOOT_UNAWARE,
     648                 userId);
     649         ArrayList<ResolveInfo> allowedAgents = new ArrayList<>(resolveInfos.size());
     650         for (ResolveInfo resolveInfo : resolveInfos) {
     651             if (resolveInfo.serviceInfo == null) continue;
     652             if (resolveInfo.serviceInfo.applicationInfo == null) continue;
     653             String packageName = resolveInfo.serviceInfo.packageName;
     654             if (pm.checkPermission(PERMISSION_PROVIDE_AGENT, packageName)
     655                     != PackageManager.PERMISSION_GRANTED) {
     656                 ComponentName name = getComponentName(resolveInfo);
     657                 Log.w(TAG, "Skipping agent " + name + " because package does not have"
     658                         + " permission " + PERMISSION_PROVIDE_AGENT + ".");
     659                 continue;
     660             }
     661             allowedAgents.add(resolveInfo);
     662         }
     663         return allowedAgents;
     664     }
     665 
     666     // Agent dispatch and aggregation
     667 
     668     private boolean aggregateIsTrusted(int userId) {
     669         if (!mStrongAuthTracker.isTrustAllowedForUser(userId)) {
     670             return false;
     671         }
     672         for (int i = 0; i < mActiveAgents.size(); i++) {
     673             AgentInfo info = mActiveAgents.valueAt(i);
     674             if (info.userId == userId) {
     675                 if (info.agent.isTrusted()) {
     676                     return true;
     677                 }
     678             }
     679         }
     680         return false;
     681     }
     682 
     683     private boolean aggregateIsTrustManaged(int userId) {
     684         if (!mStrongAuthTracker.isTrustAllowedForUser(userId)) {
     685             return false;
     686         }
     687         for (int i = 0; i < mActiveAgents.size(); i++) {
     688             AgentInfo info = mActiveAgents.valueAt(i);
     689             if (info.userId == userId) {
     690                 if (info.agent.isManagingTrust()) {
     691                     return true;
     692                 }
     693             }
     694         }
     695         return false;
     696     }
     697 
     698     private void dispatchUnlockAttempt(boolean successful, int userId) {
     699         if (successful) {
     700             mStrongAuthTracker.allowTrustFromUnlock(userId);
     701         }
     702 
     703         for (int i = 0; i < mActiveAgents.size(); i++) {
     704             AgentInfo info = mActiveAgents.valueAt(i);
     705             if (info.userId == userId) {
     706                 info.agent.onUnlockAttempt(successful);
     707             }
     708         }
     709     }
     710 
     711     private void dispatchUnlockLockout(int timeoutMs, int userId) {
     712         for (int i = 0; i < mActiveAgents.size(); i++) {
     713             AgentInfo info = mActiveAgents.valueAt(i);
     714             if (info.userId == userId) {
     715                 info.agent.onUnlockLockout(timeoutMs);
     716             }
     717         }
     718     }
     719 
     720     // Listeners
     721 
     722     private void addListener(ITrustListener listener) {
     723         for (int i = 0; i < mTrustListeners.size(); i++) {
     724             if (mTrustListeners.get(i).asBinder() == listener.asBinder()) {
     725                 return;
     726             }
     727         }
     728         mTrustListeners.add(listener);
     729         updateTrustAll();
     730     }
     731 
     732     private void removeListener(ITrustListener listener) {
     733         for (int i = 0; i < mTrustListeners.size(); i++) {
     734             if (mTrustListeners.get(i).asBinder() == listener.asBinder()) {
     735                 mTrustListeners.remove(i);
     736                 return;
     737             }
     738         }
     739     }
     740 
     741     private void dispatchOnTrustChanged(boolean enabled, int userId, int flags) {
     742         if (DEBUG) {
     743             Log.i(TAG, "onTrustChanged(" + enabled + ", " + userId + ", 0x"
     744                     + Integer.toHexString(flags) + ")");
     745         }
     746         if (!enabled) flags = 0;
     747         for (int i = 0; i < mTrustListeners.size(); i++) {
     748             try {
     749                 mTrustListeners.get(i).onTrustChanged(enabled, userId, flags);
     750             } catch (DeadObjectException e) {
     751                 Slog.d(TAG, "Removing dead TrustListener.");
     752                 mTrustListeners.remove(i);
     753                 i--;
     754             } catch (RemoteException e) {
     755                 Slog.e(TAG, "Exception while notifying TrustListener.", e);
     756             }
     757         }
     758     }
     759 
     760     private void dispatchOnTrustManagedChanged(boolean managed, int userId) {
     761         if (DEBUG) {
     762             Log.i(TAG, "onTrustManagedChanged(" + managed + ", " + userId + ")");
     763         }
     764         for (int i = 0; i < mTrustListeners.size(); i++) {
     765             try {
     766                 mTrustListeners.get(i).onTrustManagedChanged(managed, userId);
     767             } catch (DeadObjectException e) {
     768                 Slog.d(TAG, "Removing dead TrustListener.");
     769                 mTrustListeners.remove(i);
     770                 i--;
     771             } catch (RemoteException e) {
     772                 Slog.e(TAG, "Exception while notifying TrustListener.", e);
     773             }
     774         }
     775     }
     776 
     777     private void dispatchOnTrustError(CharSequence message) {
     778         if (DEBUG) {
     779             Log.i(TAG, "onTrustError(" + message + ")");
     780         }
     781         for (int i = 0; i < mTrustListeners.size(); i++) {
     782             try {
     783                 mTrustListeners.get(i).onTrustError(message);
     784             } catch (DeadObjectException e) {
     785                 Slog.d(TAG, "Removing dead TrustListener.");
     786                 mTrustListeners.remove(i);
     787                 i--;
     788             } catch (RemoteException e) {
     789                 Slog.e(TAG, "Exception while notifying TrustListener.", e);
     790             }
     791         }
     792     }
     793 
     794     // User lifecycle
     795 
     796     @Override
     797     public void onStartUser(int userId) {
     798         mHandler.obtainMessage(MSG_START_USER, userId, 0, null).sendToTarget();
     799     }
     800 
     801     @Override
     802     public void onCleanupUser(int userId) {
     803         mHandler.obtainMessage(MSG_CLEANUP_USER, userId, 0, null).sendToTarget();
     804     }
     805 
     806     @Override
     807     public void onSwitchUser(int userId) {
     808         mHandler.obtainMessage(MSG_SWITCH_USER, userId, 0, null).sendToTarget();
     809     }
     810 
     811     @Override
     812     public void onUnlockUser(int userId) {
     813         mHandler.obtainMessage(MSG_UNLOCK_USER, userId, 0, null).sendToTarget();
     814     }
     815 
     816     @Override
     817     public void onStopUser(@UserIdInt int userId) {
     818         mHandler.obtainMessage(MSG_STOP_USER, userId, 0, null).sendToTarget();
     819     }
     820 
     821     // Plumbing
     822 
     823     private final IBinder mService = new ITrustManager.Stub() {
     824         @Override
     825         public void reportUnlockAttempt(boolean authenticated, int userId) throws RemoteException {
     826             enforceReportPermission();
     827             mHandler.obtainMessage(MSG_DISPATCH_UNLOCK_ATTEMPT, authenticated ? 1 : 0, userId)
     828                     .sendToTarget();
     829         }
     830 
     831         @Override
     832         public void reportUnlockLockout(int timeoutMs, int userId) throws RemoteException {
     833             enforceReportPermission();
     834             mHandler.obtainMessage(MSG_DISPATCH_UNLOCK_LOCKOUT, timeoutMs, userId)
     835                     .sendToTarget();
     836         }
     837 
     838         @Override
     839         public void reportEnabledTrustAgentsChanged(int userId) throws RemoteException {
     840             enforceReportPermission();
     841             // coalesce refresh messages.
     842             mHandler.removeMessages(MSG_ENABLED_AGENTS_CHANGED);
     843             mHandler.sendEmptyMessage(MSG_ENABLED_AGENTS_CHANGED);
     844         }
     845 
     846         @Override
     847         public void reportKeyguardShowingChanged() throws RemoteException {
     848             enforceReportPermission();
     849             // coalesce refresh messages.
     850             mHandler.removeMessages(MSG_KEYGUARD_SHOWING_CHANGED);
     851             mHandler.sendEmptyMessage(MSG_KEYGUARD_SHOWING_CHANGED);
     852 
     853             // Make sure handler processes the message before returning, such that isDeviceLocked
     854             // after this call will retrieve the correct value.
     855             mHandler.runWithScissors(() -> {}, 0);
     856         }
     857 
     858         @Override
     859         public void registerTrustListener(ITrustListener trustListener) throws RemoteException {
     860             enforceListenerPermission();
     861             mHandler.obtainMessage(MSG_REGISTER_LISTENER, trustListener).sendToTarget();
     862         }
     863 
     864         @Override
     865         public void unregisterTrustListener(ITrustListener trustListener) throws RemoteException {
     866             enforceListenerPermission();
     867             mHandler.obtainMessage(MSG_UNREGISTER_LISTENER, trustListener).sendToTarget();
     868         }
     869 
     870         @Override
     871         public boolean isDeviceLocked(int userId) throws RemoteException {
     872             userId = ActivityManager.handleIncomingUser(getCallingPid(), getCallingUid(), userId,
     873                     false /* allowAll */, true /* requireFull */, "isDeviceLocked", null);
     874 
     875             long token = Binder.clearCallingIdentity();
     876             try {
     877                 if (!mLockPatternUtils.isSeparateProfileChallengeEnabled(userId)) {
     878                     userId = resolveProfileParent(userId);
     879                 }
     880                 return isDeviceLockedInner(userId);
     881             } finally {
     882                 Binder.restoreCallingIdentity(token);
     883             }
     884         }
     885 
     886         @Override
     887         public boolean isDeviceSecure(int userId) throws RemoteException {
     888             userId = ActivityManager.handleIncomingUser(getCallingPid(), getCallingUid(), userId,
     889                     false /* allowAll */, true /* requireFull */, "isDeviceSecure", null);
     890 
     891             long token = Binder.clearCallingIdentity();
     892             try {
     893                 if (!mLockPatternUtils.isSeparateProfileChallengeEnabled(userId)) {
     894                     userId = resolveProfileParent(userId);
     895                 }
     896                 return mLockPatternUtils.isSecure(userId);
     897             } finally {
     898                 Binder.restoreCallingIdentity(token);
     899             }
     900         }
     901 
     902         private void enforceReportPermission() {
     903             mContext.enforceCallingOrSelfPermission(
     904                     Manifest.permission.ACCESS_KEYGUARD_SECURE_STORAGE, "reporting trust events");
     905         }
     906 
     907         private void enforceListenerPermission() {
     908             mContext.enforceCallingPermission(Manifest.permission.TRUST_LISTENER,
     909                     "register trust listener");
     910         }
     911 
     912         @Override
     913         protected void dump(FileDescriptor fd, final PrintWriter fout, String[] args) {
     914             if (!DumpUtils.checkDumpPermission(mContext, TAG, fout)) return;
     915             if (isSafeMode()) {
     916                 fout.println("disabled because the system is in safe mode.");
     917                 return;
     918             }
     919             if (!mTrustAgentsCanRun) {
     920                 fout.println("disabled because the third-party apps can't run yet.");
     921                 return;
     922             }
     923             final List<UserInfo> userInfos = mUserManager.getUsers(true /* excludeDying */);
     924             mHandler.runWithScissors(new Runnable() {
     925                 @Override
     926                 public void run() {
     927                     fout.println("Trust manager state:");
     928                     for (UserInfo user : userInfos) {
     929                         dumpUser(fout, user, user.id == mCurrentUser);
     930                     }
     931                 }
     932             }, 1500);
     933         }
     934 
     935         private void dumpUser(PrintWriter fout, UserInfo user, boolean isCurrent) {
     936             fout.printf(" User "%s" (id=%d, flags=%#x)",
     937                     user.name, user.id, user.flags);
     938             if (!user.supportsSwitchToByUser()) {
     939                 fout.println("(managed profile)");
     940                 fout.println("   disabled because switching to this user is not possible.");
     941                 return;
     942             }
     943             if (isCurrent) {
     944                 fout.print(" (current)");
     945             }
     946             fout.print(": trusted=" + dumpBool(aggregateIsTrusted(user.id)));
     947             fout.print(", trustManaged=" + dumpBool(aggregateIsTrustManaged(user.id)));
     948             fout.print(", deviceLocked=" + dumpBool(isDeviceLockedInner(user.id)));
     949             fout.print(", strongAuthRequired=" + dumpHex(
     950                     mStrongAuthTracker.getStrongAuthForUser(user.id)));
     951             fout.println();
     952             fout.println("   Enabled agents:");
     953             boolean duplicateSimpleNames = false;
     954             ArraySet<String> simpleNames = new ArraySet<String>();
     955             for (AgentInfo info : mActiveAgents) {
     956                 if (info.userId != user.id) { continue; }
     957                 boolean trusted = info.agent.isTrusted();
     958                 fout.print("    "); fout.println(info.component.flattenToShortString());
     959                 fout.print("     bound=" + dumpBool(info.agent.isBound()));
     960                 fout.print(", connected=" + dumpBool(info.agent.isConnected()));
     961                 fout.print(", managingTrust=" + dumpBool(info.agent.isManagingTrust()));
     962                 fout.print(", trusted=" + dumpBool(trusted));
     963                 fout.println();
     964                 if (trusted) {
     965                     fout.println("      message="" + info.agent.getMessage() + """);
     966                 }
     967                 if (!info.agent.isConnected()) {
     968                     String restartTime = TrustArchive.formatDuration(
     969                             info.agent.getScheduledRestartUptimeMillis()
     970                                     - SystemClock.uptimeMillis());
     971                     fout.println("      restartScheduledAt=" + restartTime);
     972                 }
     973                 if (!simpleNames.add(TrustArchive.getSimpleName(info.component))) {
     974                     duplicateSimpleNames = true;
     975                 }
     976             }
     977             fout.println("   Events:");
     978             mArchive.dump(fout, 50, user.id, "    " /* linePrefix */, duplicateSimpleNames);
     979             fout.println();
     980         }
     981 
     982         private String dumpBool(boolean b) {
     983             return b ? "1" : "0";
     984         }
     985 
     986         private String dumpHex(int i) {
     987             return "0x" + Integer.toHexString(i);
     988         }
     989 
     990         @Override
     991         public void setDeviceLockedForUser(int userId, boolean locked) {
     992             enforceReportPermission();
     993             final long identity = Binder.clearCallingIdentity();
     994             try {
     995                 if (mLockPatternUtils.isSeparateProfileChallengeEnabled(userId)) {
     996                     synchronized (mDeviceLockedForUser) {
     997                         mDeviceLockedForUser.put(userId, locked);
     998                     }
     999                     if (locked) {
    1000                         try {
    1001                             ActivityManager.getService().notifyLockedProfile(userId);
    1002                         } catch (RemoteException e) {
    1003                         }
    1004                     }
    1005                     final Intent lockIntent = new Intent(Intent.ACTION_DEVICE_LOCKED_CHANGED);
    1006                     lockIntent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);
    1007                     lockIntent.putExtra(Intent.EXTRA_USER_HANDLE, userId);
    1008                     mContext.sendBroadcastAsUser(lockIntent, UserHandle.SYSTEM,
    1009                             Manifest.permission.TRUST_LISTENER, /* options */ null);
    1010                 }
    1011             } finally {
    1012                 Binder.restoreCallingIdentity(identity);
    1013             }
    1014         }
    1015 
    1016         @Override
    1017         public boolean isTrustUsuallyManaged(int userId) {
    1018             mContext.enforceCallingPermission(Manifest.permission.TRUST_LISTENER,
    1019                     "query trust state");
    1020             return isTrustUsuallyManagedInternal(userId);
    1021         }
    1022 
    1023         @Override
    1024         public void unlockedByFingerprintForUser(int userId) {
    1025             enforceReportPermission();
    1026             synchronized(mUsersUnlockedByFingerprint) {
    1027                 mUsersUnlockedByFingerprint.put(userId, true);
    1028             }
    1029             mHandler.obtainMessage(MSG_REFRESH_DEVICE_LOCKED_FOR_USER, userId,
    1030                     0 /* arg2 */).sendToTarget();
    1031         }
    1032 
    1033         @Override
    1034         public void clearAllFingerprints() {
    1035             enforceReportPermission();
    1036             synchronized(mUsersUnlockedByFingerprint) {
    1037                 mUsersUnlockedByFingerprint.clear();
    1038             }
    1039             mHandler.obtainMessage(MSG_REFRESH_DEVICE_LOCKED_FOR_USER, UserHandle.USER_ALL,
    1040                     0 /* arg2 */).sendToTarget();
    1041         }
    1042     };
    1043 
    1044     private boolean isTrustUsuallyManagedInternal(int userId) {
    1045         synchronized (mTrustUsuallyManagedForUser) {
    1046             int i = mTrustUsuallyManagedForUser.indexOfKey(userId);
    1047             if (i >= 0) {
    1048                 return mTrustUsuallyManagedForUser.valueAt(i);
    1049             }
    1050         }
    1051         // It's not in memory yet, get the value from persisted storage instead
    1052         boolean persistedValue = mLockPatternUtils.isTrustUsuallyManaged(userId);
    1053         synchronized (mTrustUsuallyManagedForUser) {
    1054             int i = mTrustUsuallyManagedForUser.indexOfKey(userId);
    1055             if (i >= 0) {
    1056                 // Someone set the trust usually managed in the mean time. Better use that.
    1057                 return mTrustUsuallyManagedForUser.valueAt(i);
    1058             } else {
    1059                 // .. otherwise it's safe to cache the fetched value now.
    1060                 mTrustUsuallyManagedForUser.put(userId, persistedValue);
    1061                 return persistedValue;
    1062             }
    1063         }
    1064     }
    1065 
    1066     private int resolveProfileParent(int userId) {
    1067         long identity = Binder.clearCallingIdentity();
    1068         try {
    1069             UserInfo parent = mUserManager.getProfileParent(userId);
    1070             if (parent != null) {
    1071                 return parent.getUserHandle().getIdentifier();
    1072             }
    1073             return userId;
    1074         } finally {
    1075             Binder.restoreCallingIdentity(identity);
    1076         }
    1077     }
    1078 
    1079     private final Handler mHandler = new Handler() {
    1080         @Override
    1081         public void handleMessage(Message msg) {
    1082             switch (msg.what) {
    1083                 case MSG_REGISTER_LISTENER:
    1084                     addListener((ITrustListener) msg.obj);
    1085                     break;
    1086                 case MSG_UNREGISTER_LISTENER:
    1087                     removeListener((ITrustListener) msg.obj);
    1088                     break;
    1089                 case MSG_DISPATCH_UNLOCK_ATTEMPT:
    1090                     dispatchUnlockAttempt(msg.arg1 != 0, msg.arg2);
    1091                     break;
    1092                 case MSG_DISPATCH_UNLOCK_LOCKOUT:
    1093                     dispatchUnlockLockout(msg.arg1, msg.arg2);
    1094                     break;
    1095                 case MSG_ENABLED_AGENTS_CHANGED:
    1096                     refreshAgentList(UserHandle.USER_ALL);
    1097                     // This is also called when the security mode of a user changes.
    1098                     refreshDeviceLockedForUser(UserHandle.USER_ALL);
    1099                     break;
    1100                 case MSG_KEYGUARD_SHOWING_CHANGED:
    1101                     refreshDeviceLockedForUser(mCurrentUser);
    1102                     break;
    1103                 case MSG_START_USER:
    1104                 case MSG_CLEANUP_USER:
    1105                 case MSG_UNLOCK_USER:
    1106                     refreshAgentList(msg.arg1);
    1107                     break;
    1108                 case MSG_SWITCH_USER:
    1109                     mCurrentUser = msg.arg1;
    1110                     refreshDeviceLockedForUser(UserHandle.USER_ALL);
    1111                     break;
    1112                 case MSG_STOP_USER:
    1113                     setDeviceLockedForUser(msg.arg1, true);
    1114                     break;
    1115                 case MSG_FLUSH_TRUST_USUALLY_MANAGED:
    1116                     SparseBooleanArray usuallyManaged;
    1117                     synchronized (mTrustUsuallyManagedForUser) {
    1118                         usuallyManaged = mTrustUsuallyManagedForUser.clone();
    1119                     }
    1120 
    1121                     for (int i = 0; i < usuallyManaged.size(); i++) {
    1122                         int userId = usuallyManaged.keyAt(i);
    1123                         boolean value = usuallyManaged.valueAt(i);
    1124                         if (value != mLockPatternUtils.isTrustUsuallyManaged(userId)) {
    1125                             mLockPatternUtils.setTrustUsuallyManaged(value, userId);
    1126                         }
    1127                     }
    1128                     break;
    1129                 case MSG_REFRESH_DEVICE_LOCKED_FOR_USER:
    1130                     refreshDeviceLockedForUser(msg.arg1);
    1131                     break;
    1132             }
    1133         }
    1134     };
    1135 
    1136     private final PackageMonitor mPackageMonitor = new PackageMonitor() {
    1137         @Override
    1138         public void onSomePackagesChanged() {
    1139             refreshAgentList(UserHandle.USER_ALL);
    1140         }
    1141 
    1142         @Override
    1143         public boolean onPackageChanged(String packageName, int uid, String[] components) {
    1144             // We're interested in all changes, even if just some components get enabled / disabled.
    1145             return true;
    1146         }
    1147 
    1148         @Override
    1149         public void onPackageDisappeared(String packageName, int reason) {
    1150             removeAgentsOfPackage(packageName);
    1151         }
    1152     };
    1153 
    1154     private static class SettingsAttrs {
    1155         public ComponentName componentName;
    1156         public boolean canUnlockProfile;
    1157 
    1158         public SettingsAttrs(
    1159                 ComponentName componentName,
    1160                 boolean canUnlockProfile) {
    1161             this.componentName = componentName;
    1162             this.canUnlockProfile = canUnlockProfile;
    1163         }
    1164     };
    1165 
    1166     private class Receiver extends BroadcastReceiver {
    1167 
    1168         @Override
    1169         public void onReceive(Context context, Intent intent) {
    1170             String action = intent.getAction();
    1171             if (DevicePolicyManager.ACTION_DEVICE_POLICY_MANAGER_STATE_CHANGED.equals(action)) {
    1172                 refreshAgentList(getSendingUserId());
    1173                 updateDevicePolicyFeatures();
    1174             } else if (Intent.ACTION_USER_ADDED.equals(action)) {
    1175                 int userId = getUserId(intent);
    1176                 if (userId > 0) {
    1177                     maybeEnableFactoryTrustAgents(mLockPatternUtils, userId);
    1178                 }
    1179             } else if (Intent.ACTION_USER_REMOVED.equals(action)) {
    1180                 int userId = getUserId(intent);
    1181                 if (userId > 0) {
    1182                     synchronized (mUserIsTrusted) {
    1183                         mUserIsTrusted.delete(userId);
    1184                     }
    1185                     synchronized (mDeviceLockedForUser) {
    1186                         mDeviceLockedForUser.delete(userId);
    1187                     }
    1188                     synchronized (mTrustUsuallyManagedForUser) {
    1189                         mTrustUsuallyManagedForUser.delete(userId);
    1190                     }
    1191                     synchronized (mUsersUnlockedByFingerprint) {
    1192                         mUsersUnlockedByFingerprint.delete(userId);
    1193                     }
    1194                     refreshAgentList(userId);
    1195                     refreshDeviceLockedForUser(userId);
    1196                 }
    1197             }
    1198         }
    1199 
    1200         private int getUserId(Intent intent) {
    1201             int userId = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, -100);
    1202             if (userId > 0) {
    1203                 return userId;
    1204             } else {
    1205                 Slog.wtf(TAG, "EXTRA_USER_HANDLE missing or invalid, value=" + userId);
    1206                 return -100;
    1207             }
    1208         }
    1209 
    1210         public void register(Context context) {
    1211             IntentFilter filter = new IntentFilter();
    1212             filter.addAction(DevicePolicyManager.ACTION_DEVICE_POLICY_MANAGER_STATE_CHANGED);
    1213             filter.addAction(Intent.ACTION_USER_ADDED);
    1214             filter.addAction(Intent.ACTION_USER_REMOVED);
    1215             context.registerReceiverAsUser(this,
    1216                     UserHandle.ALL,
    1217                     filter,
    1218                     null /* permission */,
    1219                     null /* scheduler */);
    1220         }
    1221     }
    1222 
    1223     private class StrongAuthTracker extends LockPatternUtils.StrongAuthTracker {
    1224 
    1225         SparseBooleanArray mStartFromSuccessfulUnlock = new SparseBooleanArray();
    1226 
    1227         public StrongAuthTracker(Context context) {
    1228             super(context);
    1229         }
    1230 
    1231         @Override
    1232         public void onStrongAuthRequiredChanged(int userId) {
    1233             mStartFromSuccessfulUnlock.delete(userId);
    1234 
    1235             if (DEBUG) {
    1236                 Log.i(TAG, "onStrongAuthRequiredChanged(" + userId + ") ->"
    1237                         + " trustAllowed=" + isTrustAllowedForUser(userId)
    1238                         + " agentsCanRun=" + canAgentsRunForUser(userId));
    1239             }
    1240 
    1241             refreshAgentList(userId);
    1242 
    1243             // The list of active trust agents may not have changed, if there was a previous call
    1244             // to allowTrustFromUnlock, so we update the trust here too.
    1245             updateTrust(userId, 0 /* flags */);
    1246         }
    1247 
    1248         boolean canAgentsRunForUser(int userId) {
    1249             return mStartFromSuccessfulUnlock.get(userId)
    1250                     || super.isTrustAllowedForUser(userId);
    1251         }
    1252 
    1253         /**
    1254          * Temporarily suppress strong auth requirements for {@param userId} until strong auth
    1255          * changes again. Must only be called when we know about a successful unlock already
    1256          * before the underlying StrongAuthTracker.
    1257          *
    1258          * Note that this only changes whether trust agents can be started, not the actual trusted
    1259          * value.
    1260          */
    1261         void allowTrustFromUnlock(int userId) {
    1262             if (userId < UserHandle.USER_SYSTEM) {
    1263                 throw new IllegalArgumentException("userId must be a valid user: " + userId);
    1264             }
    1265             boolean previous = canAgentsRunForUser(userId);
    1266             mStartFromSuccessfulUnlock.put(userId, true);
    1267 
    1268             if (DEBUG) {
    1269                 Log.i(TAG, "allowTrustFromUnlock(" + userId + ") ->"
    1270                         + " trustAllowed=" + isTrustAllowedForUser(userId)
    1271                         + " agentsCanRun=" + canAgentsRunForUser(userId));
    1272             }
    1273 
    1274             if (canAgentsRunForUser(userId) != previous) {
    1275                 refreshAgentList(userId);
    1276             }
    1277         }
    1278     }
    1279 }
  • 相关阅读:
    5.win上安装ES
    6.入门案例:电商网站商品管理(一)
    BZOJ 1616 [Usaco2008 Mar]Cow Travelling游荡的奶牛:dp【网格型】
    BZOJ 1626 [Usaco2007 Dec]Building Roads 修建道路:kruskal(最小生成树)
    BZOJ 1614 [Usaco2007 Jan]Telephone Lines架设电话线:spfa + 二分【路径中最大边长最小】
    BZOJ 1612 [Usaco2008 Jan]Cow Contest奶牛的比赛:floyd传递闭包
    BZOJ 1609 [Usaco2008 Feb]Eating Together麻烦的聚餐:LIS & LDS (nlogn)
    POJ 2976 Dropping tests:01分数规划【二分】
    BZOJ 1607 [Usaco2008 Dec]Patting Heads 轻拍牛头:统计 + 筛法【调和级数】
    BZOJ 1605 [Usaco2008 Open]Crisis on the Farm 牧场危机:dp【找转移路径】
  • 原文地址:https://www.cnblogs.com/chaosDemo/p/9748108.html
Copyright © 2020-2023  润新知