Skip to content

Commit 3d1728c

Browse files
author
Romain Guy
committed
A new clock widget to create lock screen appwidgets
This new widget replaces DigitalClock. It listens to all the correct system events and offer the ability to customize the formatting patterns in 12-hour and 24-hour modes. It also supports fixed time zones to create world clocks. One more step towards becoming ClockOS! Change-Id: I677e5dfca8cd8c8d1f8c49e54d7507f4d1885bf4
1 parent ac14efc commit 3d1728c

File tree

8 files changed

+651
-50
lines changed

8 files changed

+651
-50
lines changed

api/17.txt

Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -491,6 +491,8 @@ package android {
491491
field public static final int foreground = 16843017; // 0x1010109
492492
field public static final int foregroundGravity = 16843264; // 0x1010200
493493
field public static final int format = 16843013; // 0x1010105
494+
field public static final int format12Hour = 16843722; // 0x10103ca
495+
field public static final int format24Hour = 16843723; // 0x10103cb
494496
field public static final int fragment = 16843491; // 0x10102e3
495497
field public static final int fragmentCloseEnterAnimation = 16843495; // 0x10102e7
496498
field public static final int fragmentCloseExitAnimation = 16843496; // 0x10102e8
@@ -1074,6 +1076,7 @@ package android {
10741076
field public static final int thumbTextPadding = 16843634; // 0x1010372
10751077
field public static final int thumbnail = 16843429; // 0x10102a5
10761078
field public static final int tileMode = 16843265; // 0x1010201
1079+
field public static final int timeZone = 16843724; // 0x10103cc
10771080
field public static final int tint = 16843041; // 0x1010121
10781081
field public static final int title = 16843233; // 0x10101e1
10791082
field public static final int titleCondensed = 16843234; // 0x10101e2
@@ -22300,14 +22303,14 @@ package android.text.format {
2230022303

2230122304
public class DateFormat {
2230222305
ctor public DateFormat();
22303-
method public static final java.lang.CharSequence format(java.lang.CharSequence, long);
22304-
method public static final java.lang.CharSequence format(java.lang.CharSequence, java.util.Date);
22305-
method public static final java.lang.CharSequence format(java.lang.CharSequence, java.util.Calendar);
22306-
method public static final java.text.DateFormat getDateFormat(android.content.Context);
22307-
method public static final char[] getDateFormatOrder(android.content.Context);
22308-
method public static final java.text.DateFormat getLongDateFormat(android.content.Context);
22309-
method public static final java.text.DateFormat getMediumDateFormat(android.content.Context);
22310-
method public static final java.text.DateFormat getTimeFormat(android.content.Context);
22306+
method public static java.lang.CharSequence format(java.lang.CharSequence, long);
22307+
method public static java.lang.CharSequence format(java.lang.CharSequence, java.util.Date);
22308+
method public static java.lang.CharSequence format(java.lang.CharSequence, java.util.Calendar);
22309+
method public static java.text.DateFormat getDateFormat(android.content.Context);
22310+
method public static char[] getDateFormatOrder(android.content.Context);
22311+
method public static java.text.DateFormat getLongDateFormat(android.content.Context);
22312+
method public static java.text.DateFormat getMediumDateFormat(android.content.Context);
22313+
method public static java.text.DateFormat getTimeFormat(android.content.Context);
2231122314
method public static boolean is24HourFormat(android.content.Context);
2231222315
field public static final char AM_PM = 97; // 0x0061 'a'
2231322316
field public static final char CAPITAL_AM_PM = 65; // 0x0041 'A'
@@ -29518,6 +29521,21 @@ package android.widget {
2951829521
field public int span;
2951929522
}
2952029523

29524+
public class TextClock extends android.widget.TextView {
29525+
ctor public TextClock(android.content.Context);
29526+
ctor public TextClock(android.content.Context, android.util.AttributeSet);
29527+
ctor public TextClock(android.content.Context, android.util.AttributeSet, int);
29528+
method public java.lang.CharSequence getFormat12Hour();
29529+
method public java.lang.CharSequence getFormat24Hour();
29530+
method public java.lang.String getTimeZone();
29531+
method public boolean is24HourModeEnabled();
29532+
method public void setFormat12Hour(java.lang.CharSequence);
29533+
method public void setFormat24Hour(java.lang.CharSequence);
29534+
method public void setTimeZone(java.lang.String);
29535+
field public static final java.lang.CharSequence DEFAULT_FORMAT_12_HOUR;
29536+
field public static final java.lang.CharSequence DEFAULT_FORMAT_24_HOUR;
29537+
}
29538+
2952129539
public class TextSwitcher extends android.widget.ViewSwitcher {
2952229540
ctor public TextSwitcher(android.content.Context);
2952329541
ctor public TextSwitcher(android.content.Context, android.util.AttributeSet);

api/current.txt

Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -491,6 +491,8 @@ package android {
491491
field public static final int foreground = 16843017; // 0x1010109
492492
field public static final int foregroundGravity = 16843264; // 0x1010200
493493
field public static final int format = 16843013; // 0x1010105
494+
field public static final int format12Hour = 16843722; // 0x10103ca
495+
field public static final int format24Hour = 16843723; // 0x10103cb
494496
field public static final int fragment = 16843491; // 0x10102e3
495497
field public static final int fragmentCloseEnterAnimation = 16843495; // 0x10102e7
496498
field public static final int fragmentCloseExitAnimation = 16843496; // 0x10102e8
@@ -1074,6 +1076,7 @@ package android {
10741076
field public static final int thumbTextPadding = 16843634; // 0x1010372
10751077
field public static final int thumbnail = 16843429; // 0x10102a5
10761078
field public static final int tileMode = 16843265; // 0x1010201
1079+
field public static final int timeZone = 16843724; // 0x10103cc
10771080
field public static final int tint = 16843041; // 0x1010121
10781081
field public static final int title = 16843233; // 0x10101e1
10791082
field public static final int titleCondensed = 16843234; // 0x10101e2
@@ -22300,14 +22303,14 @@ package android.text.format {
2230022303

2230122304
public class DateFormat {
2230222305
ctor public DateFormat();
22303-
method public static final java.lang.CharSequence format(java.lang.CharSequence, long);
22304-
method public static final java.lang.CharSequence format(java.lang.CharSequence, java.util.Date);
22305-
method public static final java.lang.CharSequence format(java.lang.CharSequence, java.util.Calendar);
22306-
method public static final java.text.DateFormat getDateFormat(android.content.Context);
22307-
method public static final char[] getDateFormatOrder(android.content.Context);
22308-
method public static final java.text.DateFormat getLongDateFormat(android.content.Context);
22309-
method public static final java.text.DateFormat getMediumDateFormat(android.content.Context);
22310-
method public static final java.text.DateFormat getTimeFormat(android.content.Context);
22306+
method public static java.lang.CharSequence format(java.lang.CharSequence, long);
22307+
method public static java.lang.CharSequence format(java.lang.CharSequence, java.util.Date);
22308+
method public static java.lang.CharSequence format(java.lang.CharSequence, java.util.Calendar);
22309+
method public static java.text.DateFormat getDateFormat(android.content.Context);
22310+
method public static char[] getDateFormatOrder(android.content.Context);
22311+
method public static java.text.DateFormat getLongDateFormat(android.content.Context);
22312+
method public static java.text.DateFormat getMediumDateFormat(android.content.Context);
22313+
method public static java.text.DateFormat getTimeFormat(android.content.Context);
2231122314
method public static boolean is24HourFormat(android.content.Context);
2231222315
field public static final char AM_PM = 97; // 0x0061 'a'
2231322316
field public static final char CAPITAL_AM_PM = 65; // 0x0041 'A'
@@ -29518,6 +29521,21 @@ package android.widget {
2951829521
field public int span;
2951929522
}
2952029523

29524+
public class TextClock extends android.widget.TextView {
29525+
ctor public TextClock(android.content.Context);
29526+
ctor public TextClock(android.content.Context, android.util.AttributeSet);
29527+
ctor public TextClock(android.content.Context, android.util.AttributeSet, int);
29528+
method public java.lang.CharSequence getFormat12Hour();
29529+
method public java.lang.CharSequence getFormat24Hour();
29530+
method public java.lang.String getTimeZone();
29531+
method public boolean is24HourModeEnabled();
29532+
method public void setFormat12Hour(java.lang.CharSequence);
29533+
method public void setFormat24Hour(java.lang.CharSequence);
29534+
method public void setTimeZone(java.lang.String);
29535+
field public static final java.lang.CharSequence DEFAULT_FORMAT_12_HOUR;
29536+
field public static final java.lang.CharSequence DEFAULT_FORMAT_24_HOUR;
29537+
}
29538+
2952129539
public class TextSwitcher extends android.widget.ViewSwitcher {
2952229540
ctor public TextSwitcher(android.content.Context);
2952329541
ctor public TextSwitcher(android.content.Context, android.util.AttributeSet);

core/java/android/text/format/DateFormat.java

Lines changed: 80 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -249,12 +249,13 @@ public static boolean is24HourFormat(Context context) {
249249

250250
synchronized (sLocaleLock) {
251251
sIs24HourLocale = locale;
252-
sIs24Hour = !value.equals("12");
252+
sIs24Hour = value.equals("24");
253253
}
254+
255+
return sIs24Hour;
254256
}
255257

256-
boolean b24 = !(value == null || value.equals("12"));
257-
return b24;
258+
return value.equals("24");
258259
}
259260

260261
/**
@@ -263,7 +264,7 @@ public static boolean is24HourFormat(Context context) {
263264
* @param context the application context
264265
* @return the {@link java.text.DateFormat} object that properly formats the time.
265266
*/
266-
public static final java.text.DateFormat getTimeFormat(Context context) {
267+
public static java.text.DateFormat getTimeFormat(Context context) {
267268
boolean b24 = is24HourFormat(context);
268269
int res;
269270

@@ -283,7 +284,7 @@ public static final java.text.DateFormat getTimeFormat(Context context) {
283284
* @param context the application context
284285
* @return the {@link java.text.DateFormat} object that properly formats the date.
285286
*/
286-
public static final java.text.DateFormat getDateFormat(Context context) {
287+
public static java.text.DateFormat getDateFormat(Context context) {
287288
String value = Settings.System.getString(context.getContentResolver(),
288289
Settings.System.DATE_FORMAT);
289290

@@ -353,7 +354,7 @@ private static String getDateFormatStringForSetting(Context context, String valu
353354
* @param context the application context
354355
* @return the {@link java.text.DateFormat} object that formats the date in long form.
355356
*/
356-
public static final java.text.DateFormat getLongDateFormat(Context context) {
357+
public static java.text.DateFormat getLongDateFormat(Context context) {
357358
return java.text.DateFormat.getDateInstance(java.text.DateFormat.LONG);
358359
}
359360

@@ -363,7 +364,7 @@ public static final java.text.DateFormat getLongDateFormat(Context context) {
363364
* @param context the application context
364365
* @return the {@link java.text.DateFormat} object that formats the date in long form.
365366
*/
366-
public static final java.text.DateFormat getMediumDateFormat(Context context) {
367+
public static java.text.DateFormat getMediumDateFormat(Context context) {
367368
return java.text.DateFormat.getDateInstance(java.text.DateFormat.MEDIUM);
368369
}
369370

@@ -376,7 +377,7 @@ public static final java.text.DateFormat getMediumDateFormat(Context context) {
376377
* not just the day, month, and year, and not necessarily in the same
377378
* order returned here.
378379
*/
379-
public static final char[] getDateFormatOrder(Context context) {
380+
public static char[] getDateFormatOrder(Context context) {
380381
char[] order = new char[] {DATE, MONTH, YEAR};
381382
String value = getDateFormatString(context);
382383
int index = 0;
@@ -420,7 +421,7 @@ private static String getDateFormatString(Context context) {
420421
* @param inTimeInMillis in milliseconds since Jan 1, 1970 GMT
421422
* @return a {@link CharSequence} containing the requested text
422423
*/
423-
public static final CharSequence format(CharSequence inFormat, long inTimeInMillis) {
424+
public static CharSequence format(CharSequence inFormat, long inTimeInMillis) {
424425
return format(inFormat, new Date(inTimeInMillis));
425426
}
426427

@@ -431,22 +432,84 @@ public static final CharSequence format(CharSequence inFormat, long inTimeInMill
431432
* @param inDate the date to format
432433
* @return a {@link CharSequence} containing the requested text
433434
*/
434-
public static final CharSequence format(CharSequence inFormat, Date inDate) {
435+
public static CharSequence format(CharSequence inFormat, Date inDate) {
435436
Calendar c = new GregorianCalendar();
436437

437438
c.setTime(inDate);
438439

439440
return format(inFormat, c);
440441
}
441442

443+
/**
444+
* Indicates whether the specified format string contains seconds.
445+
*
446+
* Always returns false if the input format is null.
447+
*
448+
* @param inFormat the format string, as described in {@link android.text.format.DateFormat}
449+
*
450+
* @return true if the format string contains {@link #SECONDS}, false otherwise
451+
*
452+
* @hide
453+
*/
454+
public static boolean hasSeconds(CharSequence inFormat) {
455+
if (inFormat == null) return false;
456+
457+
final int length = inFormat.length();
458+
459+
int c;
460+
int count;
461+
462+
for (int i = 0; i < length; i += count) {
463+
count = 1;
464+
c = inFormat.charAt(i);
465+
466+
if (c == QUOTE) {
467+
count = skipQuotedText(inFormat, i, length);
468+
} else if (c == SECONDS) {
469+
return true;
470+
}
471+
}
472+
473+
return false;
474+
}
475+
476+
private static int skipQuotedText(CharSequence s, int i, int len) {
477+
if (i + 1 < len && s.charAt(i + 1) == QUOTE) {
478+
return 2;
479+
}
480+
481+
int count = 1;
482+
// skip leading quote
483+
i++;
484+
485+
while (i < len) {
486+
char c = s.charAt(i);
487+
488+
if (c == QUOTE) {
489+
count++;
490+
// QUOTEQUOTE -> QUOTE
491+
if (i + 1 < len && s.charAt(i + 1) == QUOTE) {
492+
i++;
493+
} else {
494+
break;
495+
}
496+
} else {
497+
i++;
498+
count++;
499+
}
500+
}
501+
502+
return count;
503+
}
504+
442505
/**
443506
* Given a format string and a {@link java.util.Calendar} object, returns a CharSequence
444507
* containing the requested date.
445508
* @param inFormat the format string, as described in {@link android.text.format.DateFormat}
446509
* @param inDate the date to format
447510
* @return a {@link CharSequence} containing the requested text
448511
*/
449-
public static final CharSequence format(CharSequence inFormat, Calendar inDate) {
512+
public static CharSequence format(CharSequence inFormat, Calendar inDate) {
450513
SpannableStringBuilder s = new SpannableStringBuilder(inFormat);
451514
int c;
452515
int count;
@@ -545,7 +608,7 @@ public static final CharSequence format(CharSequence inFormat, Calendar inDate)
545608
return s.toString();
546609
}
547610

548-
private static final String getMonthString(Calendar inDate, int count, int kind) {
611+
private static String getMonthString(Calendar inDate, int count, int kind) {
549612
boolean standalone = (kind == STANDALONE_MONTH);
550613
int month = inDate.get(Calendar.MONTH);
551614

@@ -563,7 +626,7 @@ private static final String getMonthString(Calendar inDate, int count, int kind)
563626
}
564627
}
565628

566-
private static final String getTimeZoneString(Calendar inDate, int count) {
629+
private static String getTimeZoneString(Calendar inDate, int count) {
567630
TimeZone tz = inDate.getTimeZone();
568631

569632
if (count < 2) { // FIXME: shouldn't this be <= 2 ?
@@ -576,7 +639,7 @@ private static final String getTimeZoneString(Calendar inDate, int count) {
576639
}
577640
}
578641

579-
private static final String formatZoneOffset(int offset, int count) {
642+
private static String formatZoneOffset(int offset, int count) {
580643
offset /= 1000; // milliseconds to seconds
581644
StringBuilder tb = new StringBuilder();
582645

@@ -595,13 +658,13 @@ private static final String formatZoneOffset(int offset, int count) {
595658
return tb.toString();
596659
}
597660

598-
private static final String getYearString(Calendar inDate, int count) {
661+
private static String getYearString(Calendar inDate, int count) {
599662
int year = inDate.get(Calendar.YEAR);
600663
return (count <= 2) ? zeroPad(year % 100, 2)
601664
: String.format(Locale.getDefault(), "%d", year);
602665
}
603666

604-
private static final int appendQuotedText(SpannableStringBuilder s, int i, int len) {
667+
private static int appendQuotedText(SpannableStringBuilder s, int i, int len) {
605668
if (i + 1 < len && s.charAt(i + 1) == QUOTE) {
606669
s.delete(i, i + 1);
607670
return 1;
@@ -638,7 +701,7 @@ private static final int appendQuotedText(SpannableStringBuilder s, int i, int l
638701
return count;
639702
}
640703

641-
private static final String zeroPad(int inValue, int inMinDigits) {
704+
private static String zeroPad(int inValue, int inMinDigits) {
642705
return String.format(Locale.getDefault(), "%0" + inMinDigits + "d", inValue);
643706
}
644707
}

core/java/android/view/View.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17697,7 +17697,7 @@ public void setPooled(boolean isPooled) {
1769717697
boolean mScalingRequired;
1769817698

1769917699
/**
17700-
* If set, ViewAncestor doesn't use its lame animation for when the window resizes.
17700+
* If set, ViewRootImpl doesn't use its lame animation for when the window resizes.
1770117701
*/
1770217702
boolean mTurnOffWindowResizeAnim;
1770317703

0 commit comments

Comments
 (0)