diff options
| author | Dianne Hackborn <hackbod@google.com> | 2010-09-07 12:13:55 -0700 |
|---|---|---|
| committer | Dianne Hackborn <hackbod@google.com> | 2010-09-07 14:09:36 -0700 |
| commit | b5e3165129a5871cf679a67d9e9323ffad3d4902 (patch) | |
| tree | 23df13ad75bf67fbd34a4ab04d267ed5176bfd45 /core/java/android/util/TimeUtils.java | |
| parent | f703b77c96a6d133fda534158eaf6190ff7c87f7 (diff) | |
Fixes to battery stats debug output.
Change-Id: I32e7cad9633b8c517a74573069e426d9f835a83d
Diffstat (limited to 'core/java/android/util/TimeUtils.java')
| -rw-r--r-- | core/java/android/util/TimeUtils.java | 181 |
1 files changed, 103 insertions, 78 deletions
diff --git a/core/java/android/util/TimeUtils.java b/core/java/android/util/TimeUtils.java index b01a71d0248a..60ca3849d6f9 100644 --- a/core/java/android/util/TimeUtils.java +++ b/core/java/android/util/TimeUtils.java @@ -132,75 +132,76 @@ public class TimeUtils { return ZoneInfoDB.getVersion(); } + /** @hide Field length that can hold 999 days of time */ + public static final int HUNDRED_DAY_FIELD_LEN = 19; + private static final int SECONDS_PER_MINUTE = 60; private static final int SECONDS_PER_HOUR = 60 * 60; private static final int SECONDS_PER_DAY = 24 * 60 * 60; - /** @hide Just for debugging; not internationalized. */ - public static void formatDuration(long duration, StringBuilder builder) { - if (duration == 0) { - builder.append("0"); - return; - } - if (duration > 0) { - builder.append("+"); - } else { - builder.append("-"); - duration = -duration; - } - - int millis = (int)(duration%1000); - int seconds = (int) Math.floor(duration / 1000); - int days = 0, hours = 0, minutes = 0; - - if (seconds > SECONDS_PER_DAY) { - days = seconds / SECONDS_PER_DAY; - seconds -= days * SECONDS_PER_DAY; - } - if (seconds > SECONDS_PER_HOUR) { - hours = seconds / SECONDS_PER_HOUR; - seconds -= hours * SECONDS_PER_HOUR; - } - if (seconds > SECONDS_PER_MINUTE) { - minutes = seconds / SECONDS_PER_MINUTE; - seconds -= minutes * SECONDS_PER_MINUTE; - } - - boolean doall = false; - if (days > 0) { - builder.append(days); - builder.append('d'); - doall = true; + private static final Object sFormatSync = new Object(); + private static char[] sFormatStr = new char[HUNDRED_DAY_FIELD_LEN+5]; + + static private int accumField(int amt, int suffix, boolean always, int zeropad) { + if (amt > 99 || (always && zeropad >= 3)) { + return 3+suffix; } - if (doall || hours > 0) { - builder.append(hours); - builder.append('h'); - doall = true; + if (amt > 9 || (always && zeropad >= 2)) { + return 2+suffix; } - if (doall || minutes > 0) { - builder.append(minutes); - builder.append('m'); - doall = true; + if (always || amt > 0) { + return 1+suffix; } - if (doall || seconds > 0) { - builder.append(seconds); - builder.append('s'); - doall = true; + return 0; + } + + static private int printField(char[] formatStr, int amt, char suffix, int pos, + boolean always, int zeropad) { + if (always || amt > 0) { + if ((always && zeropad >= 3) || amt > 99) { + int dig = amt/100; + formatStr[pos] = (char)(dig + '0'); + pos++; + always = true; + amt -= (dig*100); + } + if ((always && zeropad >= 2) || amt > 9) { + int dig = amt/10; + formatStr[pos] = (char)(dig + '0'); + pos++; + always = true; + amt -= (dig*10); + } + formatStr[pos] = (char)(amt + '0'); + pos++; + formatStr[pos] = suffix; + pos++; } - builder.append(millis); - builder.append("ms"); + return pos; } - - /** @hide Just for debugging; not internationalized. */ - public static void formatDuration(long duration, PrintWriter pw) { + + private static int formatDurationLocked(long duration, int fieldLen) { + if (sFormatStr.length < fieldLen) { + sFormatStr = new char[fieldLen]; + } + + char[] formatStr = sFormatStr; + if (duration == 0) { - pw.print("0"); - return; + int pos = 0; + fieldLen -= 1; + while (pos < fieldLen) { + formatStr[pos] = ' '; + } + formatStr[pos] = '0'; + return pos+1; } + + char prefix; if (duration > 0) { - pw.print("+"); + prefix = '+'; } else { - pw.print("-"); + prefix = '-'; duration = -duration; } @@ -221,38 +222,62 @@ public class TimeUtils { seconds -= minutes * SECONDS_PER_MINUTE; } - boolean doall = false; - if (days > 0) { - pw.print(days); - pw.print('d'); - doall = true; - } - if (doall || hours > 0) { - pw.print(hours); - pw.print('h'); - doall = true; - } - if (doall || minutes > 0) { - pw.print(minutes); - pw.print('m'); - doall = true; + int pos = 0; + + if (fieldLen != 0) { + int myLen = accumField(days, 1, false, 0); + myLen += accumField(hours, 1, myLen > 0, 2); + myLen += accumField(minutes, 1, myLen > 0, 2); + myLen += accumField(seconds, 1, myLen > 0, 2); + myLen += accumField(millis, 2, true, myLen > 0 ? 3 : 0) + 1; + while (myLen < fieldLen) { + formatStr[pos] = ' '; + pos++; + myLen++; + } } - if (doall || seconds > 0) { - pw.print(seconds); - pw.print('s'); - doall = true; + + formatStr[pos] = prefix; + pos++; + + int start = pos; + boolean zeropad = fieldLen != 0; + pos = printField(formatStr, days, 'd', pos, false, 0); + pos = printField(formatStr, hours, 'h', pos, pos != start, zeropad ? 2 : 0); + pos = printField(formatStr, minutes, 'm', pos, pos != start, zeropad ? 2 : 0); + pos = printField(formatStr, seconds, 's', pos, pos != start, zeropad ? 2 : 0); + pos = printField(formatStr, millis, 'm', pos, true, (zeropad && pos != start) ? 3 : 0); + formatStr[pos] = 's'; + return pos + 1; + } + + /** @hide Just for debugging; not internationalized. */ + public static void formatDuration(long duration, StringBuilder builder) { + synchronized (sFormatSync) { + int len = formatDurationLocked(duration, 0); + builder.append(sFormatStr, 0, len); } - pw.print(millis); - pw.print("ms"); } + /** @hide Just for debugging; not internationalized. */ + public static void formatDuration(long duration, PrintWriter pw, int fieldLen) { + synchronized (sFormatSync) { + int len = formatDurationLocked(duration, fieldLen); + pw.print(new String(sFormatStr, 0, len)); + } + } /** @hide Just for debugging; not internationalized. */ + public static void formatDuration(long duration, PrintWriter pw) { + formatDuration(duration, pw, 0); + } + + /** @hide Just for debugging; not internationalized. */ public static void formatDuration(long time, long now, PrintWriter pw) { if (time == 0) { pw.print("--"); return; } - formatDuration(time-now, pw); + formatDuration(time-now, pw, 0); } } |
