@Override
  protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
    if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.DUMP)
        != PackageManager.PERMISSION_GRANTED) {
      pw.println(
          "Permission Denial: can't dump UserManager from from pid="
              + Binder.getCallingPid()
              + ", uid="
              + Binder.getCallingUid()
              + " without permission "
              + android.Manifest.permission.DUMP);
      return;
    }

    long now = System.currentTimeMillis();
    StringBuilder sb = new StringBuilder();
    synchronized (mPackagesLock) {
      pw.println("Users:");
      for (int i = 0; i < mUsers.size(); i++) {
        UserInfo user = mUsers.valueAt(i);
        if (user == null) continue;
        pw.print("  ");
        pw.print(user);
        pw.print(" serialNo=");
        pw.print(user.serialNumber);
        if (mRemovingUserIds.get(mUsers.keyAt(i))) pw.print(" <removing> ");
        if (user.partial) pw.print(" <partial>");
        pw.println();
        pw.print("    Created: ");
        if (user.creationTime == 0) {
          pw.println("<unknown>");
        } else {
          sb.setLength(0);
          TimeUtils.formatDuration(now - user.creationTime, sb);
          sb.append(" ago");
          pw.println(sb);
        }
        pw.print("    Last logged in: ");
        if (user.lastLoggedInTime == 0) {
          pw.println("<unknown>");
        } else {
          sb.setLength(0);
          TimeUtils.formatDuration(now - user.lastLoggedInTime, sb);
          sb.append(" ago");
          pw.println(sb);
        }
      }
    }
  }
  /**
   * Return true if time zone needs fixing.
   *
   * @param phoneBase
   * @param operatorNumeric
   * @param prevOperatorNumeric
   * @param needToFixTimeZone
   * @return true if time zone needs to be fixed
   */
  protected boolean shouldFixTimeZoneNow(
      PhoneBase phoneBase,
      String operatorNumeric,
      String prevOperatorNumeric,
      boolean needToFixTimeZone) {
    // Return false if the mcc isn't valid as we don't know where we are.
    // Return true if we have an IccCard and the mcc changed or we
    // need to fix it because when the NITZ time came in we didn't
    // know the country code.

    // If mcc is invalid then we'll return false
    int mcc;
    try {
      mcc = Integer.parseInt(operatorNumeric.substring(0, 3));
    } catch (Exception e) {
      if (DBG) {
        log("shouldFixTimeZoneNow: no mcc, operatorNumeric=" + operatorNumeric + " retVal=false");
      }
      return false;
    }

    // If prevMcc is invalid will make it different from mcc
    // so we'll return true if the card exists.
    int prevMcc;
    try {
      prevMcc = Integer.parseInt(prevOperatorNumeric.substring(0, 3));
    } catch (Exception e) {
      prevMcc = mcc + 1;
    }

    // Determine if the Icc card exists
    boolean iccCardExist = false;
    if (mUiccApplcation != null) {
      iccCardExist = mUiccApplcation.getState() != AppState.APPSTATE_UNKNOWN;
    }

    // Determine retVal
    boolean retVal = ((iccCardExist && (mcc != prevMcc)) || needToFixTimeZone);
    if (DBG) {
      long ctm = System.currentTimeMillis();
      log(
          "shouldFixTimeZoneNow: retVal="
              + retVal
              + " iccCardExist="
              + iccCardExist
              + " operatorNumeric="
              + operatorNumeric
              + " mcc="
              + mcc
              + " prevOperatorNumeric="
              + prevOperatorNumeric
              + " prevMcc="
              + prevMcc
              + " needToFixTimeZone="
              + needToFixTimeZone
              + " ltod="
              + TimeUtils.logTimeOfDay(ctm));
    }
    return retVal;
  }
 public String toString() {
   StringBuilder s = new StringBuilder();
   s.append("Request[").append(qualityToString(this.mQuality));
   if (this.mProvider != null) {
     s.append(' ').append(this.mProvider);
   }
   if (this.mQuality != POWER_NONE) {
     s.append(" requested=");
     TimeUtils.formatDuration(this.mInterval, s);
   }
   s.append(" fastest=");
   TimeUtils.formatDuration(this.mFastestInterval, s);
   if (this.mExpireAt != TtmlUtils.INVALID_TIMESTAMP) {
     long expireIn = this.mExpireAt - SystemClock.elapsedRealtime();
     s.append(" expireIn=");
     TimeUtils.formatDuration(expireIn, s);
   }
   if (this.mNumUpdates != RILConstants.MAX_INT) {
     s.append(" num=").append(this.mNumUpdates);
   }
   s.append(']');
   return s.toString();
 }
  @Override
  protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
    if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.DUMP)
        != PackageManager.PERMISSION_GRANTED) {

      pw.println(
          "Permission Denial: can't dump "
              + SERVICE
              + " from from pid="
              + Binder.getCallingPid()
              + ", uid="
              + Binder.getCallingUid());
      return;
    }

    pw.println("Current DeviceStorageMonitor state:");
    pw.print("  mFreeMem=");
    pw.print(Formatter.formatFileSize(mContext, mFreeMem));
    pw.print(" mTotalMemory=");
    pw.println(Formatter.formatFileSize(mContext, mTotalMemory));
    pw.print("  mFreeMemAfterLastCacheClear=");
    pw.println(Formatter.formatFileSize(mContext, mFreeMemAfterLastCacheClear));
    pw.print("  mLastReportedFreeMem=");
    pw.print(Formatter.formatFileSize(mContext, mLastReportedFreeMem));
    pw.print(" mLastReportedFreeMemTime=");
    TimeUtils.formatDuration(mLastReportedFreeMemTime, SystemClock.elapsedRealtime(), pw);
    pw.println();
    pw.print("  mLowMemFlag=");
    pw.print(mLowMemFlag);
    pw.print(" mMemFullFlag=");
    pw.println(mMemFullFlag);
    pw.print("  mClearSucceeded=");
    pw.print(mClearSucceeded);
    pw.print(" mClearingCache=");
    pw.println(mClearingCache);
    pw.print("  mMemLowThreshold=");
    pw.print(Formatter.formatFileSize(mContext, mMemLowThreshold));
    pw.print(" mMemFullThreshold=");
    pw.println(Formatter.formatFileSize(mContext, mMemFullThreshold));
    pw.print("  mMemCacheStartTrimThreshold=");
    pw.print(Formatter.formatFileSize(mContext, mMemCacheStartTrimThreshold));
    pw.print(" mMemCacheTrimToThreshold=");
    pw.println(Formatter.formatFileSize(mContext, mMemCacheTrimToThreshold));
  }
  boolean dumpLocked(FileDescriptor fd, PrintWriter pw, boolean needSep, String dumpPackage) {
    if (!mProcessCrashTimes.getMap().isEmpty()) {
      boolean printed = false;
      final long now = SystemClock.uptimeMillis();
      final ArrayMap<String, SparseArray<Long>> pmap = mProcessCrashTimes.getMap();
      final int processCount = pmap.size();
      for (int ip = 0; ip < processCount; ip++) {
        final String pname = pmap.keyAt(ip);
        final SparseArray<Long> uids = pmap.valueAt(ip);
        final int uidCount = uids.size();
        for (int i = 0; i < uidCount; i++) {
          final int puid = uids.keyAt(i);
          final ProcessRecord r = mService.mProcessNames.get(pname, puid);
          if (dumpPackage != null && (r == null || !r.pkgList.containsKey(dumpPackage))) {
            continue;
          }
          if (!printed) {
            if (needSep) pw.println();
            needSep = true;
            pw.println("  Time since processes crashed:");
            printed = true;
          }
          pw.print("    Process ");
          pw.print(pname);
          pw.print(" uid ");
          pw.print(puid);
          pw.print(": last crashed ");
          TimeUtils.formatDuration(now - uids.valueAt(i), pw);
          pw.println(" ago");
        }
      }
    }

    if (!mBadProcesses.getMap().isEmpty()) {
      boolean printed = false;
      final ArrayMap<String, SparseArray<BadProcessInfo>> pmap = mBadProcesses.getMap();
      final int processCount = pmap.size();
      for (int ip = 0; ip < processCount; ip++) {
        final String pname = pmap.keyAt(ip);
        final SparseArray<BadProcessInfo> uids = pmap.valueAt(ip);
        final int uidCount = uids.size();
        for (int i = 0; i < uidCount; i++) {
          final int puid = uids.keyAt(i);
          final ProcessRecord r = mService.mProcessNames.get(pname, puid);
          if (dumpPackage != null && (r == null || !r.pkgList.containsKey(dumpPackage))) {
            continue;
          }
          if (!printed) {
            if (needSep) pw.println();
            needSep = true;
            pw.println("  Bad processes:");
            printed = true;
          }
          final BadProcessInfo info = uids.valueAt(i);
          pw.print("    Bad process ");
          pw.print(pname);
          pw.print(" uid ");
          pw.print(puid);
          pw.print(": crashed at time ");
          pw.println(info.time);
          if (info.shortMsg != null) {
            pw.print("      Short msg: ");
            pw.println(info.shortMsg);
          }
          if (info.longMsg != null) {
            pw.print("      Long msg: ");
            pw.println(info.longMsg);
          }
          if (info.stack != null) {
            pw.println("      Stack:");
            int lastPos = 0;
            for (int pos = 0; pos < info.stack.length(); pos++) {
              if (info.stack.charAt(pos) == '\n') {
                pw.print("        ");
                pw.write(info.stack, lastPos, pos - lastPos);
                pw.println();
                lastPos = pos + 1;
              }
            }
            if (lastPos < info.stack.length()) {
              pw.print("        ");
              pw.write(info.stack, lastPos, info.stack.length() - lastPos);
              pw.println();
            }
          }
        }
      }
    }
    return needSep;
  }
 // Dumpsys infrastructure
 public void dump(PrintWriter pw, String prefix, boolean full) {
   pw.print(prefix);
   UserHandle.formatUid(pw, callingUid);
   pw.print(" tag=");
   pw.println(tag);
   pw.print(prefix);
   pw.print("Source: uid=");
   UserHandle.formatUid(pw, getSourceUid());
   pw.print(" user="******" pkg=");
   pw.println(getSourcePackageName());
   if (full) {
     pw.print(prefix);
     pw.println("JobInfo:");
     pw.print(prefix);
     pw.print("  Service: ");
     pw.println(job.getService().flattenToShortString());
     if (job.isPeriodic()) {
       pw.print(prefix);
       pw.print("  PERIODIC: interval=");
       TimeUtils.formatDuration(job.getIntervalMillis(), pw);
       pw.print(" flex=");
       TimeUtils.formatDuration(job.getFlexMillis(), pw);
       pw.println();
     }
     if (job.isPersisted()) {
       pw.print(prefix);
       pw.println("  PERSISTED");
     }
     if (job.getPriority() != 0) {
       pw.print(prefix);
       pw.print("  Priority: ");
       pw.println(job.getPriority());
     }
     if (job.getFlags() != 0) {
       pw.print(prefix);
       pw.print("  Flags: ");
       pw.println(Integer.toHexString(job.getFlags()));
     }
     pw.print(prefix);
     pw.print("  Requires: charging=");
     pw.print(job.isRequireCharging());
     pw.print(" deviceIdle=");
     pw.println(job.isRequireDeviceIdle());
     if (job.getTriggerContentUris() != null) {
       pw.print(prefix);
       pw.println("  Trigger content URIs:");
       for (int i = 0; i < job.getTriggerContentUris().length; i++) {
         JobInfo.TriggerContentUri trig = job.getTriggerContentUris()[i];
         pw.print(prefix);
         pw.print("    ");
         pw.print(Integer.toHexString(trig.getFlags()));
         pw.print(' ');
         pw.println(trig.getUri());
       }
       if (job.getTriggerContentUpdateDelay() >= 0) {
         pw.print(prefix);
         pw.print("  Trigger update delay: ");
         TimeUtils.formatDuration(job.getTriggerContentUpdateDelay(), pw);
         pw.println();
       }
       if (job.getTriggerContentMaxDelay() >= 0) {
         pw.print(prefix);
         pw.print("  Trigger max delay: ");
         TimeUtils.formatDuration(job.getTriggerContentMaxDelay(), pw);
         pw.println();
       }
     }
     if (job.getNetworkType() != JobInfo.NETWORK_TYPE_NONE) {
       pw.print(prefix);
       pw.print("  Network type: ");
       pw.println(job.getNetworkType());
     }
     if (job.getMinLatencyMillis() != 0) {
       pw.print(prefix);
       pw.print("  Minimum latency: ");
       TimeUtils.formatDuration(job.getMinLatencyMillis(), pw);
       pw.println();
     }
     if (job.getMaxExecutionDelayMillis() != 0) {
       pw.print(prefix);
       pw.print("  Max execution delay: ");
       TimeUtils.formatDuration(job.getMaxExecutionDelayMillis(), pw);
       pw.println();
     }
     pw.print(prefix);
     pw.print("  Backoff: policy=");
     pw.print(job.getBackoffPolicy());
     pw.print(" initial=");
     TimeUtils.formatDuration(job.getInitialBackoffMillis(), pw);
     pw.println();
     if (job.hasEarlyConstraint()) {
       pw.print(prefix);
       pw.println("  Has early constraint");
     }
     if (job.hasLateConstraint()) {
       pw.print(prefix);
       pw.println("  Has late constraint");
     }
   }
   pw.print(prefix);
   pw.print("Required constraints:");
   dumpConstraints(pw, requiredConstraints);
   pw.println();
   if (full) {
     pw.print(prefix);
     pw.print("Satisfied constraints:");
     dumpConstraints(pw, satisfiedConstraints);
     pw.println();
     pw.print(prefix);
     pw.print("Unsatisfied constraints:");
     dumpConstraints(pw, (requiredConstraints & ~satisfiedConstraints));
     pw.println();
     if (dozeWhitelisted) {
       pw.print(prefix);
       pw.println("Doze whitelisted: true");
     }
   }
   if (changedAuthorities != null) {
     pw.print(prefix);
     pw.println("Changed authorities:");
     for (int i = 0; i < changedAuthorities.size(); i++) {
       pw.print(prefix);
       pw.print("  ");
       pw.println(changedAuthorities.valueAt(i));
     }
     if (changedUris != null) {
       pw.print(prefix);
       pw.println("Changed URIs:");
       for (int i = 0; i < changedUris.size(); i++) {
         pw.print(prefix);
         pw.print("  ");
         pw.println(changedUris.valueAt(i));
       }
     }
   }
   pw.print(prefix);
   pw.print("Earliest run time: ");
   pw.println(formatRunTime(earliestRunTimeElapsedMillis, NO_EARLIEST_RUNTIME));
   pw.print(prefix);
   pw.print("Latest run time: ");
   pw.println(formatRunTime(latestRunTimeElapsedMillis, NO_LATEST_RUNTIME));
   if (numFailures != 0) {
     pw.print(prefix);
     pw.print("Num failures: ");
     pw.println(numFailures);
   }
 }