auto import from //depot/cupcake/@132589
This commit is contained in:
@@ -128,6 +128,11 @@ public interface InputType {
|
||||
*/
|
||||
public static final int TYPE_TEXT_FLAG_IME_MULTI_LINE = 0x00040000;
|
||||
|
||||
/**
|
||||
* Flag for {@link #TYPE_CLASS_TEXT}: flags any text being used as a search string
|
||||
*/
|
||||
public static final int TYPE_TEXT_FLAG_SEARCH = 0x00080000;
|
||||
|
||||
// ----------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
|
||||
@@ -16,26 +16,25 @@
|
||||
|
||||
package android.text;
|
||||
|
||||
import android.graphics.Canvas;
|
||||
import android.graphics.Paint;
|
||||
import android.text.style.CharacterStyle;
|
||||
import android.text.style.MetricAffectingSpan;
|
||||
import android.text.style.ReplacementSpan;
|
||||
import android.graphics.Canvas;
|
||||
import android.graphics.Path;
|
||||
import android.graphics.RectF;
|
||||
import android.graphics.Typeface;
|
||||
import android.graphics.MaskFilter;
|
||||
import android.graphics.Rasterizer;
|
||||
import android.graphics.LayerRasterizer;
|
||||
import android.text.style.*;
|
||||
|
||||
/**
|
||||
* This class provides static methods for drawing and measuring styled texts, like
|
||||
* {@link android.text.Spanned} object with {@link android.text.style.ReplacementSpan}.
|
||||
* @hide
|
||||
*/
|
||||
public class Styled
|
||||
/* package */ class Styled
|
||||
{
|
||||
private static float each(Canvas canvas,
|
||||
Spanned text, int start, int end,
|
||||
int dir, boolean reverse,
|
||||
float x, int top, int y, int bottom,
|
||||
Paint.FontMetricsInt fmi,
|
||||
Paint.FontMetricsInt fm,
|
||||
TextPaint realPaint,
|
||||
TextPaint paint,
|
||||
TextPaint workPaint,
|
||||
boolean needwid) {
|
||||
|
||||
boolean havewid = false;
|
||||
@@ -44,9 +43,9 @@ public class Styled
|
||||
|
||||
ReplacementSpan replacement = null;
|
||||
|
||||
paint.bgColor = 0;
|
||||
paint.baselineShift = 0;
|
||||
workPaint.set(paint);
|
||||
realPaint.bgColor = 0;
|
||||
realPaint.baselineShift = 0;
|
||||
paint.set(realPaint);
|
||||
|
||||
if (spans.length > 0) {
|
||||
for (int i = 0; i < spans.length; i++) {
|
||||
@@ -56,7 +55,7 @@ public class Styled
|
||||
replacement = (ReplacementSpan)span;
|
||||
}
|
||||
else {
|
||||
span.updateDrawState(workPaint);
|
||||
span.updateDrawState(paint);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -75,66 +74,66 @@ public class Styled
|
||||
tmpend = end;
|
||||
}
|
||||
|
||||
if (fmi != null) {
|
||||
workPaint.getFontMetricsInt(fmi);
|
||||
if (fm != null) {
|
||||
paint.getFontMetricsInt(fm);
|
||||
}
|
||||
|
||||
if (canvas != null) {
|
||||
if (workPaint.bgColor != 0) {
|
||||
int c = workPaint.getColor();
|
||||
Paint.Style s = workPaint.getStyle();
|
||||
workPaint.setColor(workPaint.bgColor);
|
||||
workPaint.setStyle(Paint.Style.FILL);
|
||||
if (paint.bgColor != 0) {
|
||||
int c = paint.getColor();
|
||||
Paint.Style s = paint.getStyle();
|
||||
paint.setColor(paint.bgColor);
|
||||
paint.setStyle(Paint.Style.FILL);
|
||||
|
||||
if (!havewid) {
|
||||
ret = workPaint.measureText(tmp, tmpstart, tmpend);
|
||||
ret = paint.measureText(tmp, tmpstart, tmpend);
|
||||
havewid = true;
|
||||
}
|
||||
|
||||
if (dir == Layout.DIR_RIGHT_TO_LEFT)
|
||||
canvas.drawRect(x - ret, top, x, bottom, workPaint);
|
||||
canvas.drawRect(x - ret, top, x, bottom, paint);
|
||||
else
|
||||
canvas.drawRect(x, top, x + ret, bottom, workPaint);
|
||||
canvas.drawRect(x, top, x + ret, bottom, paint);
|
||||
|
||||
workPaint.setStyle(s);
|
||||
workPaint.setColor(c);
|
||||
paint.setStyle(s);
|
||||
paint.setColor(c);
|
||||
}
|
||||
|
||||
if (dir == Layout.DIR_RIGHT_TO_LEFT) {
|
||||
if (!havewid) {
|
||||
ret = workPaint.measureText(tmp, tmpstart, tmpend);
|
||||
ret = paint.measureText(tmp, tmpstart, tmpend);
|
||||
havewid = true;
|
||||
}
|
||||
|
||||
canvas.drawText(tmp, tmpstart, tmpend,
|
||||
x - ret, y + workPaint.baselineShift, workPaint);
|
||||
x - ret, y + paint.baselineShift, paint);
|
||||
} else {
|
||||
if (needwid) {
|
||||
if (!havewid) {
|
||||
ret = workPaint.measureText(tmp, tmpstart, tmpend);
|
||||
ret = paint.measureText(tmp, tmpstart, tmpend);
|
||||
havewid = true;
|
||||
}
|
||||
}
|
||||
|
||||
canvas.drawText(tmp, tmpstart, tmpend,
|
||||
x, y + workPaint.baselineShift, workPaint);
|
||||
x, y + paint.baselineShift, paint);
|
||||
}
|
||||
} else {
|
||||
if (needwid && !havewid) {
|
||||
ret = workPaint.measureText(tmp, tmpstart, tmpend);
|
||||
ret = paint.measureText(tmp, tmpstart, tmpend);
|
||||
havewid = true;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
ret = replacement.getSize(workPaint, text, start, end, fmi);
|
||||
ret = replacement.getSize(paint, text, start, end, fm);
|
||||
|
||||
if (canvas != null) {
|
||||
if (dir == Layout.DIR_RIGHT_TO_LEFT)
|
||||
replacement.draw(canvas, text, start, end,
|
||||
x - ret, top, y, bottom, workPaint);
|
||||
x - ret, top, y, bottom, paint);
|
||||
else
|
||||
replacement.draw(canvas, text, start, end,
|
||||
x, top, y, bottom, workPaint);
|
||||
x, top, y, bottom, paint);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -144,29 +143,15 @@ public class Styled
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the advance widths for the characters in the string.
|
||||
* See also {@link android.graphics.Paint#getTextWidths(CharSequence, int, int, float[])}.
|
||||
*
|
||||
* @param paint The main {@link TextPaint} object.
|
||||
* @param workPaint The {@link TextPaint} object used for temporal workspace.
|
||||
* @param text The text to measure
|
||||
* @param start The index of the first char to to measure
|
||||
* @param end The end of the text slice to measure
|
||||
* @param widths Array to receive the advance widths of the characters.
|
||||
* Must be at least a large as (end - start).
|
||||
* @param fmi FontMetrics information. Can be null.
|
||||
* @return The actual number of widths returned.
|
||||
*/
|
||||
public static int getTextWidths(TextPaint paint,
|
||||
TextPaint workPaint,
|
||||
Spanned text, int start, int end,
|
||||
float[] widths, Paint.FontMetricsInt fmi) {
|
||||
// Keep workPaint as is so that developers reuse the workspace.
|
||||
public static int getTextWidths(TextPaint realPaint,
|
||||
TextPaint paint,
|
||||
Spanned text, int start, int end,
|
||||
float[] widths, Paint.FontMetricsInt fm) {
|
||||
|
||||
MetricAffectingSpan[] spans = text.getSpans(start, end, MetricAffectingSpan.class);
|
||||
|
||||
ReplacementSpan replacement = null;
|
||||
workPaint.set(paint);
|
||||
paint.set(realPaint);
|
||||
|
||||
for (int i = 0; i < spans.length; i++) {
|
||||
MetricAffectingSpan span = spans[i];
|
||||
@@ -174,15 +159,15 @@ public class Styled
|
||||
replacement = (ReplacementSpan)span;
|
||||
}
|
||||
else {
|
||||
span.updateMeasureState(workPaint);
|
||||
span.updateMeasureState(paint);
|
||||
}
|
||||
}
|
||||
|
||||
if (replacement == null) {
|
||||
workPaint.getFontMetricsInt(fmi);
|
||||
workPaint.getTextWidths(text, start, end, widths);
|
||||
paint.getFontMetricsInt(fm);
|
||||
paint.getTextWidths(text, start, end, widths);
|
||||
} else {
|
||||
int wid = replacement.getSize(workPaint, text, start, end, fmi);
|
||||
int wid = replacement.getSize(paint, text, start, end, fm);
|
||||
|
||||
if (end > start) {
|
||||
widths[0] = wid;
|
||||
@@ -198,10 +183,10 @@ public class Styled
|
||||
CharSequence text, int start, int end,
|
||||
int dir, boolean reverse,
|
||||
float x, int top, int y, int bottom,
|
||||
Paint.FontMetricsInt fmi,
|
||||
Paint.FontMetricsInt fm,
|
||||
TextPaint paint,
|
||||
TextPaint workPaint,
|
||||
boolean needWidth) {
|
||||
boolean needwid) {
|
||||
if (! (text instanceof Spanned)) {
|
||||
float ret = 0;
|
||||
|
||||
@@ -209,22 +194,22 @@ public class Styled
|
||||
CharSequence tmp = TextUtils.getReverse(text, start, end);
|
||||
int tmpend = end - start;
|
||||
|
||||
if (canvas != null || needWidth)
|
||||
if (canvas != null || needwid)
|
||||
ret = paint.measureText(tmp, 0, tmpend);
|
||||
|
||||
if (canvas != null)
|
||||
canvas.drawText(tmp, 0, tmpend,
|
||||
x - ret, y, paint);
|
||||
} else {
|
||||
if (needWidth)
|
||||
if (needwid)
|
||||
ret = paint.measureText(text, start, end);
|
||||
|
||||
if (canvas != null)
|
||||
canvas.drawText(text, start, end, x, y, paint);
|
||||
}
|
||||
|
||||
if (fmi != null) {
|
||||
paint.getFontMetricsInt(fmi);
|
||||
if (fm != null) {
|
||||
paint.getFontMetricsInt(fm);
|
||||
}
|
||||
|
||||
return ret * dir; //Layout.DIR_RIGHT_TO_LEFT == -1
|
||||
@@ -247,129 +232,67 @@ public class Styled
|
||||
next = sp.nextSpanTransition(i, end, division);
|
||||
|
||||
x += each(canvas, sp, i, next, dir, reverse,
|
||||
x, top, y, bottom, fmi, paint, workPaint,
|
||||
needWidth || next != end);
|
||||
x, top, y, bottom, fm, paint, workPaint,
|
||||
needwid || next != end);
|
||||
|
||||
if (fmi != null) {
|
||||
if (fmi.ascent < asc)
|
||||
asc = fmi.ascent;
|
||||
if (fmi.descent > desc)
|
||||
desc = fmi.descent;
|
||||
if (fm != null) {
|
||||
if (fm.ascent < asc)
|
||||
asc = fm.ascent;
|
||||
if (fm.descent > desc)
|
||||
desc = fm.descent;
|
||||
|
||||
if (fmi.top < ftop)
|
||||
ftop = fmi.top;
|
||||
if (fmi.bottom > fbot)
|
||||
fbot = fmi.bottom;
|
||||
if (fm.top < ftop)
|
||||
ftop = fm.top;
|
||||
if (fm.bottom > fbot)
|
||||
fbot = fm.bottom;
|
||||
}
|
||||
}
|
||||
|
||||
if (fmi != null) {
|
||||
if (fm != null) {
|
||||
if (start == end) {
|
||||
paint.getFontMetricsInt(fmi);
|
||||
paint.getFontMetricsInt(fm);
|
||||
} else {
|
||||
fmi.ascent = asc;
|
||||
fmi.descent = desc;
|
||||
fmi.top = ftop;
|
||||
fmi.bottom = fbot;
|
||||
fm.ascent = asc;
|
||||
fm.descent = desc;
|
||||
fm.top = ftop;
|
||||
fm.bottom = fbot;
|
||||
}
|
||||
}
|
||||
|
||||
return x - ox;
|
||||
}
|
||||
|
||||
|
||||
/* package */ static float drawText(Canvas canvas,
|
||||
CharSequence text, int start, int end,
|
||||
int direction, boolean reverse,
|
||||
float x, int top, int y, int bottom,
|
||||
TextPaint paint,
|
||||
TextPaint workPaint,
|
||||
boolean needWidth) {
|
||||
if ((direction == Layout.DIR_RIGHT_TO_LEFT && !reverse) ||
|
||||
(reverse && direction == Layout.DIR_LEFT_TO_RIGHT)) {
|
||||
public static float drawText(Canvas canvas,
|
||||
CharSequence text, int start, int end,
|
||||
int dir, boolean reverse,
|
||||
float x, int top, int y, int bottom,
|
||||
TextPaint paint,
|
||||
TextPaint workPaint,
|
||||
boolean needwid) {
|
||||
if ((dir == Layout.DIR_RIGHT_TO_LEFT && !reverse)||(reverse && dir == Layout.DIR_LEFT_TO_RIGHT)) {
|
||||
float ch = foreach(null, text, start, end, Layout.DIR_LEFT_TO_RIGHT,
|
||||
false, 0, 0, 0, 0, null, paint, workPaint,
|
||||
true);
|
||||
|
||||
ch *= direction; // DIR_RIGHT_TO_LEFT == -1
|
||||
foreach(canvas, text, start, end, -direction,
|
||||
ch *= dir; // DIR_RIGHT_TO_LEFT == -1
|
||||
foreach(canvas, text, start, end, -dir,
|
||||
reverse, x + ch, top, y, bottom, null, paint,
|
||||
workPaint, true);
|
||||
|
||||
return ch;
|
||||
}
|
||||
|
||||
return foreach(canvas, text, start, end, direction, reverse,
|
||||
return foreach(canvas, text, start, end, dir, reverse,
|
||||
x, top, y, bottom, null, paint, workPaint,
|
||||
needWidth);
|
||||
needwid);
|
||||
}
|
||||
|
||||
/**
|
||||
* Draw the specified range of text, specified by start/end, with its origin at (x,y),
|
||||
* in the specified Paint. The origin is interpreted based on the Align setting in the
|
||||
* Paint.
|
||||
*
|
||||
* This method considers style information in the text
|
||||
* (e.g. Even when text is an instance of {@link android.text.Spanned}, this method
|
||||
* correctly draws the text).
|
||||
* See also
|
||||
* {@link android.graphics.Canvas#drawText(CharSequence, int, int, float, float, Paint)}
|
||||
* and
|
||||
* {@link android.graphics.Canvas#drawRect(float, float, float, float, Paint)}.
|
||||
*
|
||||
* @param canvas The target canvas.
|
||||
* @param text The text to be drawn
|
||||
* @param start The index of the first character in text to draw
|
||||
* @param end (end - 1) is the index of the last character in text to draw
|
||||
* @param direction The direction of the text. This must be
|
||||
* {@link android.text.Layout#DIR_LEFT_TO_RIGHT} or
|
||||
* {@link android.text.Layout#DIR_RIGHT_TO_LEFT}.
|
||||
* @param x The x-coordinate of origin for where to draw the text
|
||||
* @param top The top side of the rectangle to be drawn
|
||||
* @param y The y-coordinate of origin for where to draw the text
|
||||
* @param bottom The bottom side of the rectangle to be drawn
|
||||
* @param paint The main {@link TextPaint} object.
|
||||
* @param workPaint The {@link TextPaint} object used for temporal workspace.
|
||||
* @param needWidth If true, this method returns the width of drawn text.
|
||||
* @return Width of the drawn text if needWidth is true.
|
||||
*/
|
||||
public static float drawText(Canvas canvas,
|
||||
CharSequence text, int start, int end,
|
||||
int direction,
|
||||
float x, int top, int y, int bottom,
|
||||
TextPaint paint,
|
||||
TextPaint workPaint,
|
||||
boolean needWidth) {
|
||||
// For safety.
|
||||
direction = direction >= 0 ? Layout.DIR_LEFT_TO_RIGHT : Layout.DIR_RIGHT_TO_LEFT;
|
||||
/*
|
||||
* Hided "reverse" parameter since it is meaningless for external developers.
|
||||
* Kept workPaint as is so that developers reuse the workspace.
|
||||
*/
|
||||
return drawText(canvas, text, start, end, direction, false,
|
||||
x, top, y, bottom, paint, workPaint, needWidth);
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the width of the text, considering style information in the text
|
||||
* (e.g. Even when text is an instance of {@link android.text.Spanned}, this method
|
||||
* correctly mesures the width of the text).
|
||||
*
|
||||
* @param paint The main {@link TextPaint} object.
|
||||
* @param workPaint The {@link TextPaint} object used for temporal workspace.
|
||||
* @param text The text to measure
|
||||
* @param start The index of the first character to start measuring
|
||||
* @param end 1 beyond the index of the last character to measure
|
||||
* @param fmi FontMetrics information. Can be null
|
||||
* @return The width of the text
|
||||
*/
|
||||
|
||||
public static float measureText(TextPaint paint,
|
||||
TextPaint workPaint,
|
||||
CharSequence text, int start, int end,
|
||||
Paint.FontMetricsInt fmi) {
|
||||
// Keep workPaint as is so that developers reuse the workspace.
|
||||
Paint.FontMetricsInt fm) {
|
||||
return foreach(null, text, start, end,
|
||||
Layout.DIR_LEFT_TO_RIGHT, false,
|
||||
0, 0, 0, 0, fmi, paint, workPaint, true);
|
||||
0, 0, 0, 0, fm, paint, workPaint, true);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -595,17 +595,6 @@ public class DateUtils
|
||||
* @param elapsedSeconds the elapsed time in seconds.
|
||||
*/
|
||||
public static String formatElapsedTime(long elapsedSeconds) {
|
||||
return formatElapsedTime(null, elapsedSeconds);
|
||||
}
|
||||
|
||||
/**
|
||||
* Formats an elapsed time in the form "MM:SS" or "H:MM:SS"
|
||||
* for display on the call-in-progress screen.
|
||||
*
|
||||
* @param recycle {@link StringBuilder} to recycle, if possible
|
||||
* @param elapsedSeconds the elapsed time in seconds.
|
||||
*/
|
||||
public static String formatElapsedTime(StringBuilder recycle, long elapsedSeconds) {
|
||||
initFormatStrings();
|
||||
|
||||
long hours = 0;
|
||||
@@ -624,24 +613,18 @@ public class DateUtils
|
||||
|
||||
String result;
|
||||
if (hours > 0) {
|
||||
return formatElapsedTime(recycle, sElapsedFormatHMMSS, hours, minutes, seconds);
|
||||
return formatElapsedTime(sElapsedFormatHMMSS, hours, minutes, seconds);
|
||||
} else {
|
||||
return formatElapsedTime(recycle, sElapsedFormatMMSS, minutes, seconds);
|
||||
return formatElapsedTime(sElapsedFormatMMSS, minutes, seconds);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Fast formatting of h:mm:ss
|
||||
*/
|
||||
private static String formatElapsedTime(StringBuilder recycle, String format, long hours,
|
||||
long minutes, long seconds) {
|
||||
private static String formatElapsedTime(String format, long hours, long minutes, long seconds) {
|
||||
if (FAST_FORMAT_HMMSS.equals(format)) {
|
||||
StringBuilder sb = recycle;
|
||||
if (sb == null) {
|
||||
sb = new StringBuilder(8);
|
||||
} else {
|
||||
sb.setLength(0);
|
||||
}
|
||||
StringBuffer sb = new StringBuffer(16);
|
||||
sb.append(hours);
|
||||
sb.append(TIME_SEPARATOR);
|
||||
if (minutes < 10) {
|
||||
@@ -666,15 +649,9 @@ public class DateUtils
|
||||
/**
|
||||
* Fast formatting of m:ss
|
||||
*/
|
||||
private static String formatElapsedTime(StringBuilder recycle, String format, long minutes,
|
||||
long seconds) {
|
||||
private static String formatElapsedTime(String format, long minutes, long seconds) {
|
||||
if (FAST_FORMAT_MMSS.equals(format)) {
|
||||
StringBuilder sb = recycle;
|
||||
if (sb == null) {
|
||||
sb = new StringBuilder(8);
|
||||
} else {
|
||||
sb.setLength(0);
|
||||
}
|
||||
StringBuffer sb = new StringBuffer(16);
|
||||
if (minutes < 10) {
|
||||
sb.append(TIME_PADDING);
|
||||
} else {
|
||||
@@ -1051,9 +1028,8 @@ public class DateUtils
|
||||
* If FORMAT_NO_YEAR is set, then the year is not shown.
|
||||
* If neither FORMAT_SHOW_YEAR nor FORMAT_NO_YEAR are set, then the year
|
||||
* is shown only if it is different from the current year, or if the start
|
||||
* and end dates fall on different years. If both are set,
|
||||
* FORMAT_SHOW_YEAR takes precedence.
|
||||
*
|
||||
* and end dates fall on different years.
|
||||
*
|
||||
* <p>
|
||||
* Normally the date is shown unless the start and end day are the same.
|
||||
* If FORMAT_SHOW_DATE is set, then the date is always shown, even for
|
||||
@@ -1144,28 +1120,24 @@ public class DateUtils
|
||||
boolean abbrevMonth = (flags & (FORMAT_ABBREV_MONTH | FORMAT_ABBREV_ALL)) != 0;
|
||||
boolean noMonthDay = (flags & FORMAT_NO_MONTH_DAY) != 0;
|
||||
boolean numericDate = (flags & FORMAT_NUMERIC_DATE) != 0;
|
||||
|
||||
// If we're getting called with a single instant in time (from
|
||||
// e.g. formatDateTime(), below), then we can skip a lot of
|
||||
// computation below that'd otherwise be thrown out.
|
||||
boolean isInstant = (startMillis == endMillis);
|
||||
|
||||
Time startDate = useUTC ? new Time(Time.TIMEZONE_UTC) : new Time();
|
||||
startDate.set(startMillis);
|
||||
|
||||
|
||||
Time startDate;
|
||||
Time endDate;
|
||||
int dayDistance;
|
||||
if (isInstant) {
|
||||
endDate = startDate;
|
||||
dayDistance = 0;
|
||||
|
||||
if (useUTC) {
|
||||
startDate = new Time(Time.TIMEZONE_UTC);
|
||||
endDate = new Time(Time.TIMEZONE_UTC);
|
||||
} else {
|
||||
endDate = useUTC ? new Time(Time.TIMEZONE_UTC) : new Time();
|
||||
endDate.set(endMillis);
|
||||
int startJulianDay = Time.getJulianDay(startMillis, startDate.gmtoff);
|
||||
int endJulianDay = Time.getJulianDay(endMillis, endDate.gmtoff);
|
||||
dayDistance = endJulianDay - startJulianDay;
|
||||
startDate = new Time();
|
||||
endDate = new Time();
|
||||
}
|
||||
|
||||
|
||||
startDate.set(startMillis);
|
||||
endDate.set(endMillis);
|
||||
int startJulianDay = Time.getJulianDay(startMillis, startDate.gmtoff);
|
||||
int endJulianDay = Time.getJulianDay(endMillis, endDate.gmtoff);
|
||||
int dayDistance = endJulianDay - startJulianDay;
|
||||
|
||||
// If the end date ends at 12am at the beginning of a day,
|
||||
// then modify it to make it look like it ends at midnight on
|
||||
// the previous day. This will allow us to display "8pm - midnight",
|
||||
@@ -1180,21 +1152,20 @@ public class DateUtils
|
||||
// and an end date of Nov 12 at 00:00.
|
||||
// If the start and end time are the same, then skip this and don't
|
||||
// adjust the date.
|
||||
if (!isInstant
|
||||
&& (endDate.hour | endDate.minute | endDate.second) == 0
|
||||
&& (!showTime || dayDistance <= 1)) {
|
||||
if ((endDate.hour | endDate.minute | endDate.second) == 0
|
||||
&& (!showTime || dayDistance <= 1) && (startMillis != endMillis)) {
|
||||
endDate.monthDay -= 1;
|
||||
endDate.normalize(true /* ignore isDst */);
|
||||
}
|
||||
|
||||
|
||||
int startDay = startDate.monthDay;
|
||||
int startMonthNum = startDate.month;
|
||||
int startYear = startDate.year;
|
||||
|
||||
|
||||
int endDay = endDate.monthDay;
|
||||
int endMonthNum = endDate.month;
|
||||
int endYear = endDate.year;
|
||||
|
||||
|
||||
String startWeekDayString = "";
|
||||
String endWeekDayString = "";
|
||||
if (showWeekDay) {
|
||||
@@ -1205,9 +1176,9 @@ public class DateUtils
|
||||
weekDayFormat = WEEKDAY_FORMAT;
|
||||
}
|
||||
startWeekDayString = startDate.format(weekDayFormat);
|
||||
endWeekDayString = isInstant ? startWeekDayString : endDate.format(weekDayFormat);
|
||||
endWeekDayString = endDate.format(weekDayFormat);
|
||||
}
|
||||
|
||||
|
||||
String startTimeString = "";
|
||||
String endTimeString = "";
|
||||
if (showTime) {
|
||||
@@ -1233,7 +1204,7 @@ public class DateUtils
|
||||
boolean capNoon = (flags & FORMAT_CAP_NOON) != 0;
|
||||
boolean noMidnight = (flags & FORMAT_NO_MIDNIGHT) != 0;
|
||||
boolean capMidnight = (flags & FORMAT_CAP_MIDNIGHT) != 0;
|
||||
|
||||
|
||||
boolean startOnTheHour = startDate.minute == 0 && startDate.second == 0;
|
||||
boolean endOnTheHour = endDate.minute == 0 && endDate.second == 0;
|
||||
if (abbrevTime && startOnTheHour) {
|
||||
@@ -1249,41 +1220,20 @@ public class DateUtils
|
||||
startTimeFormat = res.getString(com.android.internal.R.string.hour_minute_ampm);
|
||||
}
|
||||
}
|
||||
|
||||
// Don't waste time on setting endTimeFormat when
|
||||
// we're dealing with an instant, where we'll never
|
||||
// need the end point. (It's the same as the start
|
||||
// point)
|
||||
if (!isInstant) {
|
||||
if (abbrevTime && endOnTheHour) {
|
||||
if (capAMPM) {
|
||||
endTimeFormat = res.getString(com.android.internal.R.string.hour_cap_ampm);
|
||||
} else {
|
||||
endTimeFormat = res.getString(com.android.internal.R.string.hour_ampm);
|
||||
}
|
||||
if (abbrevTime && endOnTheHour) {
|
||||
if (capAMPM) {
|
||||
endTimeFormat = res.getString(com.android.internal.R.string.hour_cap_ampm);
|
||||
} else {
|
||||
if (capAMPM) {
|
||||
endTimeFormat = res.getString(com.android.internal.R.string.hour_minute_cap_ampm);
|
||||
} else {
|
||||
endTimeFormat = res.getString(com.android.internal.R.string.hour_minute_ampm);
|
||||
}
|
||||
endTimeFormat = res.getString(com.android.internal.R.string.hour_ampm);
|
||||
}
|
||||
|
||||
if (endDate.hour == 12 && endOnTheHour && !noNoon) {
|
||||
if (capNoon) {
|
||||
endTimeFormat = res.getString(com.android.internal.R.string.Noon);
|
||||
} else {
|
||||
endTimeFormat = res.getString(com.android.internal.R.string.noon);
|
||||
}
|
||||
} else if (endDate.hour == 0 && endOnTheHour && !noMidnight) {
|
||||
if (capMidnight) {
|
||||
endTimeFormat = res.getString(com.android.internal.R.string.Midnight);
|
||||
} else {
|
||||
endTimeFormat = res.getString(com.android.internal.R.string.midnight);
|
||||
}
|
||||
} else {
|
||||
if (capAMPM) {
|
||||
endTimeFormat = res.getString(com.android.internal.R.string.hour_minute_cap_ampm);
|
||||
} else {
|
||||
endTimeFormat = res.getString(com.android.internal.R.string.hour_minute_ampm);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (startDate.hour == 12 && startOnTheHour && !noNoon) {
|
||||
if (capNoon) {
|
||||
startTimeFormat = res.getString(com.android.internal.R.string.Noon);
|
||||
@@ -1293,32 +1243,37 @@ public class DateUtils
|
||||
// Don't show the start time starting at midnight. Show
|
||||
// 12am instead.
|
||||
}
|
||||
|
||||
if (endDate.hour == 12 && endOnTheHour && !noNoon) {
|
||||
if (capNoon) {
|
||||
endTimeFormat = res.getString(com.android.internal.R.string.Noon);
|
||||
} else {
|
||||
endTimeFormat = res.getString(com.android.internal.R.string.noon);
|
||||
}
|
||||
} else if (endDate.hour == 0 && endOnTheHour && !noMidnight) {
|
||||
if (capMidnight) {
|
||||
endTimeFormat = res.getString(com.android.internal.R.string.Midnight);
|
||||
} else {
|
||||
endTimeFormat = res.getString(com.android.internal.R.string.midnight);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
startTimeString = startDate.format(startTimeFormat);
|
||||
endTimeString = isInstant ? startTimeString : endDate.format(endTimeFormat);
|
||||
endTimeString = endDate.format(endTimeFormat);
|
||||
}
|
||||
|
||||
|
||||
// Get the current year
|
||||
long millis = System.currentTimeMillis();
|
||||
Time time = new Time();
|
||||
time.set(millis);
|
||||
int currentYear = time.year;
|
||||
|
||||
// Show the year if the user specified FORMAT_SHOW_YEAR or if
|
||||
// the starting and end years are different from each other
|
||||
// or from the current year. But don't show the year if the
|
||||
// user specified FORMAT_NO_YEAR.
|
||||
if (showYear) {
|
||||
// No code... just a comment for clarity. Keep showYear
|
||||
// on, as they enabled it with FORMAT_SHOW_YEAR. This
|
||||
// takes precedence over them setting FORMAT_NO_YEAR.
|
||||
} else if (noYear) {
|
||||
// They explicitly didn't want a year.
|
||||
showYear = false;
|
||||
} else if (startYear != endYear) {
|
||||
showYear = true;
|
||||
} else {
|
||||
// Show the year if it's not equal to the current year.
|
||||
Time currentTime = new Time();
|
||||
currentTime.setToNow();
|
||||
showYear = startYear != currentTime.year;
|
||||
}
|
||||
|
||||
// user specified FORMAT_NO_YEAR;
|
||||
showYear = showYear || (!noYear && (startYear != endYear || startYear != currentYear));
|
||||
|
||||
String defaultDateFormat, fullFormat, dateRange;
|
||||
if (numericDate) {
|
||||
defaultDateFormat = res.getString(com.android.internal.R.string.numeric_date);
|
||||
@@ -1351,7 +1306,7 @@ public class DateUtils
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (showWeekDay) {
|
||||
if (showTime) {
|
||||
fullFormat = res.getString(com.android.internal.R.string.wday1_date1_time1_wday2_date2_time2);
|
||||
@@ -1365,20 +1320,20 @@ public class DateUtils
|
||||
fullFormat = res.getString(com.android.internal.R.string.date1_date2);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (noMonthDay && startMonthNum == endMonthNum) {
|
||||
// Example: "January, 2008"
|
||||
String startDateString = startDate.format(defaultDateFormat);
|
||||
return startDateString;
|
||||
}
|
||||
|
||||
|
||||
if (startYear != endYear || noMonthDay) {
|
||||
// Different year or we are not showing the month day number.
|
||||
// Example: "December 31, 2007 - January 1, 2008"
|
||||
// Or: "January - February, 2008"
|
||||
String startDateString = startDate.format(defaultDateFormat);
|
||||
String endDateString = endDate.format(defaultDateFormat);
|
||||
|
||||
|
||||
// The values that are used in a fullFormat string are specified
|
||||
// by position.
|
||||
dateRange = String.format(fullFormat,
|
||||
@@ -1386,7 +1341,7 @@ public class DateUtils
|
||||
endWeekDayString, endDateString, endTimeString);
|
||||
return dateRange;
|
||||
}
|
||||
|
||||
|
||||
// Get the month, day, and year strings for the start and end dates
|
||||
String monthFormat;
|
||||
if (numericDate) {
|
||||
@@ -1399,17 +1354,16 @@ public class DateUtils
|
||||
String startMonthString = startDate.format(monthFormat);
|
||||
String startMonthDayString = startDate.format(MONTH_DAY_FORMAT);
|
||||
String startYearString = startDate.format(YEAR_FORMAT);
|
||||
|
||||
String endMonthString = isInstant ? null : endDate.format(monthFormat);
|
||||
String endMonthDayString = isInstant ? null : endDate.format(MONTH_DAY_FORMAT);
|
||||
String endYearString = isInstant ? null : endDate.format(YEAR_FORMAT);
|
||||
|
||||
String endMonthString = endDate.format(monthFormat);
|
||||
String endMonthDayString = endDate.format(MONTH_DAY_FORMAT);
|
||||
String endYearString = endDate.format(YEAR_FORMAT);
|
||||
|
||||
if (startMonthNum != endMonthNum) {
|
||||
// Same year, different month.
|
||||
// Example: "October 28 - November 3"
|
||||
// or: "Wed, Oct 31 - Sat, Nov 3, 2007"
|
||||
// or: "Oct 31, 8am - Sat, Nov 3, 2007, 5pm"
|
||||
|
||||
|
||||
int index = 0;
|
||||
if (showWeekDay) index = 1;
|
||||
if (showYear) index += 2;
|
||||
@@ -1417,7 +1371,7 @@ public class DateUtils
|
||||
if (numericDate) index += 8;
|
||||
int resId = sameYearTable[index];
|
||||
fullFormat = res.getString(resId);
|
||||
|
||||
|
||||
// The values that are used in a fullFormat string are specified
|
||||
// by position.
|
||||
dateRange = String.format(fullFormat,
|
||||
@@ -1427,7 +1381,7 @@ public class DateUtils
|
||||
endYearString, endTimeString);
|
||||
return dateRange;
|
||||
}
|
||||
|
||||
|
||||
if (startDay != endDay) {
|
||||
// Same month, different day.
|
||||
int index = 0;
|
||||
@@ -1437,7 +1391,7 @@ public class DateUtils
|
||||
if (numericDate) index += 8;
|
||||
int resId = sameMonthTable[index];
|
||||
fullFormat = res.getString(resId);
|
||||
|
||||
|
||||
// The values that are used in a fullFormat string are specified
|
||||
// by position.
|
||||
dateRange = String.format(fullFormat,
|
||||
@@ -1447,19 +1401,19 @@ public class DateUtils
|
||||
endYearString, endTimeString);
|
||||
return dateRange;
|
||||
}
|
||||
|
||||
|
||||
// Same start and end day
|
||||
boolean showDate = (flags & FORMAT_SHOW_DATE) != 0;
|
||||
|
||||
|
||||
// If nothing was specified, then show the date.
|
||||
if (!showTime && !showDate && !showWeekDay) showDate = true;
|
||||
|
||||
|
||||
// Compute the time string (example: "10:00 - 11:00 am")
|
||||
String timeString = "";
|
||||
if (showTime) {
|
||||
// If the start and end time are the same, then just show the
|
||||
// start time.
|
||||
if (isInstant) {
|
||||
if (startMillis == endMillis) {
|
||||
// Same start and end time.
|
||||
// Example: "10:15 AM"
|
||||
timeString = startTimeString;
|
||||
@@ -1469,7 +1423,7 @@ public class DateUtils
|
||||
timeString = String.format(timeFormat, startTimeString, endTimeString);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Figure out which full format to use.
|
||||
fullFormat = "";
|
||||
String dateString = "";
|
||||
@@ -1503,7 +1457,7 @@ public class DateUtils
|
||||
} else if (showTime) {
|
||||
return timeString;
|
||||
}
|
||||
|
||||
|
||||
// The values that are used in a fullFormat string are specified
|
||||
// by position.
|
||||
dateRange = String.format(fullFormat, timeString, startWeekDayString, dateString);
|
||||
|
||||
@@ -101,11 +101,6 @@ public abstract class NumberKeyListener extends BaseKeyListener
|
||||
selEnd = Math.max(a, b);
|
||||
}
|
||||
|
||||
if (selStart < 0 || selEnd < 0) {
|
||||
selStart = selEnd = 0;
|
||||
Selection.setSelection(content, 0);
|
||||
}
|
||||
|
||||
int i = event != null ? lookup(event, content) : 0;
|
||||
int repeatCount = event != null ? event.getRepeatCount() : 0;
|
||||
if (repeatCount == 0) {
|
||||
|
||||
Reference in New Issue
Block a user