void resetProcessCrashTimeLocked(boolean resetEntireUser, int appId, int userId) {
   final ArrayMap<String, SparseArray<Long>> pmap = mProcessCrashTimes.getMap();
   for (int ip = pmap.size() - 1; ip >= 0; ip--) {
     SparseArray<Long> ba = pmap.valueAt(ip);
     for (int i = ba.size() - 1; i >= 0; i--) {
       boolean remove = false;
       final int entUid = ba.keyAt(i);
       if (!resetEntireUser) {
         if (userId == UserHandle.USER_ALL) {
           if (UserHandle.getAppId(entUid) == appId) {
             remove = true;
           }
         } else {
           if (entUid == UserHandle.getUid(userId, appId)) {
             remove = true;
           }
         }
       } else if (UserHandle.getUserId(entUid) == userId) {
         remove = true;
       }
       if (remove) {
         ba.removeAt(i);
       }
     }
     if (ba.size() == 0) {
       pmap.removeAt(ip);
     }
   }
 }
 void handleShowAppErrorUi(Message msg) {
   AppErrorDialog.Data data = (AppErrorDialog.Data) msg.obj;
   boolean showBackground =
       Settings.Secure.getInt(
               mContext.getContentResolver(), Settings.Secure.ANR_SHOW_BACKGROUND, 0)
           != 0;
   synchronized (mService) {
     ProcessRecord proc = data.proc;
     AppErrorResult res = data.result;
     if (proc != null && proc.crashDialog != null) {
       Slog.e(TAG, "App already has crash dialog: " + proc);
       if (res != null) {
         res.set(AppErrorDialog.ALREADY_SHOWING);
       }
       return;
     }
     boolean isBackground =
         (UserHandle.getAppId(proc.uid) >= Process.FIRST_APPLICATION_UID && proc.pid != MY_PID);
     for (int userId : mService.mUserController.getCurrentProfileIdsLocked()) {
       isBackground &= (proc.userId != userId);
     }
     if (isBackground && !showBackground) {
       Slog.w(TAG, "Skipping crash dialog of " + proc + ": background");
       if (res != null) {
         res.set(AppErrorDialog.BACKGROUND_USER);
       }
       return;
     }
     final boolean crashSilenced =
         mAppsNotReportingCrashes != null
             && mAppsNotReportingCrashes.contains(proc.info.packageName);
     if (mService.canShowErrorDialogs() && !crashSilenced) {
       proc.crashDialog = new AppErrorDialog(mContext, mService, data);
     } else {
       // The device is asleep, so just pretend that the user
       // saw a crash dialog and hit "force quit".
       if (res != null) {
         res.set(AppErrorDialog.CANT_SHOW);
       }
     }
   }
   // If we've created a crash dialog, show it without the lock held
   if (data.proc.crashDialog != null) {
     data.proc.crashDialog.show();
   }
 }
 public boolean shouldDump(int filterUid) {
   return filterUid == -1
       || UserHandle.getAppId(getUid()) == filterUid
       || UserHandle.getAppId(getSourceUid()) == filterUid;
 }