Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3d1728c0 authored by Romain Guy's avatar Romain Guy
Browse files

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
parent ac14efce
Loading
Loading
Loading
Loading
+26 −8
Original line number Original line Diff line number Diff line
@@ -491,6 +491,8 @@ package android {
    field public static final int foreground = 16843017; // 0x1010109
    field public static final int foreground = 16843017; // 0x1010109
    field public static final int foregroundGravity = 16843264; // 0x1010200
    field public static final int foregroundGravity = 16843264; // 0x1010200
    field public static final int format = 16843013; // 0x1010105
    field public static final int format = 16843013; // 0x1010105
    field public static final int format12Hour = 16843722; // 0x10103ca
    field public static final int format24Hour = 16843723; // 0x10103cb
    field public static final int fragment = 16843491; // 0x10102e3
    field public static final int fragment = 16843491; // 0x10102e3
    field public static final int fragmentCloseEnterAnimation = 16843495; // 0x10102e7
    field public static final int fragmentCloseEnterAnimation = 16843495; // 0x10102e7
    field public static final int fragmentCloseExitAnimation = 16843496; // 0x10102e8
    field public static final int fragmentCloseExitAnimation = 16843496; // 0x10102e8
@@ -1074,6 +1076,7 @@ package android {
    field public static final int thumbTextPadding = 16843634; // 0x1010372
    field public static final int thumbTextPadding = 16843634; // 0x1010372
    field public static final int thumbnail = 16843429; // 0x10102a5
    field public static final int thumbnail = 16843429; // 0x10102a5
    field public static final int tileMode = 16843265; // 0x1010201
    field public static final int tileMode = 16843265; // 0x1010201
    field public static final int timeZone = 16843724; // 0x10103cc
    field public static final int tint = 16843041; // 0x1010121
    field public static final int tint = 16843041; // 0x1010121
    field public static final int title = 16843233; // 0x10101e1
    field public static final int title = 16843233; // 0x10101e1
    field public static final int titleCondensed = 16843234; // 0x10101e2
    field public static final int titleCondensed = 16843234; // 0x10101e2
@@ -22300,14 +22303,14 @@ package android.text.format {
  public class DateFormat {
  public class DateFormat {
    ctor public DateFormat();
    ctor public DateFormat();
    method public static final java.lang.CharSequence format(java.lang.CharSequence, long);
    method public static java.lang.CharSequence format(java.lang.CharSequence, long);
    method public static final java.lang.CharSequence format(java.lang.CharSequence, java.util.Date);
    method public static java.lang.CharSequence format(java.lang.CharSequence, java.util.Date);
    method public static final java.lang.CharSequence format(java.lang.CharSequence, java.util.Calendar);
    method public static java.lang.CharSequence format(java.lang.CharSequence, java.util.Calendar);
    method public static final java.text.DateFormat getDateFormat(android.content.Context);
    method public static java.text.DateFormat getDateFormat(android.content.Context);
    method public static final char[] getDateFormatOrder(android.content.Context);
    method public static char[] getDateFormatOrder(android.content.Context);
    method public static final java.text.DateFormat getLongDateFormat(android.content.Context);
    method public static java.text.DateFormat getLongDateFormat(android.content.Context);
    method public static final java.text.DateFormat getMediumDateFormat(android.content.Context);
    method public static java.text.DateFormat getMediumDateFormat(android.content.Context);
    method public static final java.text.DateFormat getTimeFormat(android.content.Context);
    method public static java.text.DateFormat getTimeFormat(android.content.Context);
    method public static boolean is24HourFormat(android.content.Context);
    method public static boolean is24HourFormat(android.content.Context);
    field public static final char AM_PM = 97; // 0x0061 'a'
    field public static final char AM_PM = 97; // 0x0061 'a'
    field public static final char CAPITAL_AM_PM = 65; // 0x0041 'A'
    field public static final char CAPITAL_AM_PM = 65; // 0x0041 'A'
@@ -29518,6 +29521,21 @@ package android.widget {
    field public int span;
    field public int span;
  }
  }
  public class TextClock extends android.widget.TextView {
    ctor public TextClock(android.content.Context);
    ctor public TextClock(android.content.Context, android.util.AttributeSet);
    ctor public TextClock(android.content.Context, android.util.AttributeSet, int);
    method public java.lang.CharSequence getFormat12Hour();
    method public java.lang.CharSequence getFormat24Hour();
    method public java.lang.String getTimeZone();
    method public boolean is24HourModeEnabled();
    method public void setFormat12Hour(java.lang.CharSequence);
    method public void setFormat24Hour(java.lang.CharSequence);
    method public void setTimeZone(java.lang.String);
    field public static final java.lang.CharSequence DEFAULT_FORMAT_12_HOUR;
    field public static final java.lang.CharSequence DEFAULT_FORMAT_24_HOUR;
  }
  public class TextSwitcher extends android.widget.ViewSwitcher {
  public class TextSwitcher extends android.widget.ViewSwitcher {
    ctor public TextSwitcher(android.content.Context);
    ctor public TextSwitcher(android.content.Context);
    ctor public TextSwitcher(android.content.Context, android.util.AttributeSet);
    ctor public TextSwitcher(android.content.Context, android.util.AttributeSet);
+26 −8
Original line number Original line Diff line number Diff line
@@ -491,6 +491,8 @@ package android {
    field public static final int foreground = 16843017; // 0x1010109
    field public static final int foreground = 16843017; // 0x1010109
    field public static final int foregroundGravity = 16843264; // 0x1010200
    field public static final int foregroundGravity = 16843264; // 0x1010200
    field public static final int format = 16843013; // 0x1010105
    field public static final int format = 16843013; // 0x1010105
    field public static final int format12Hour = 16843722; // 0x10103ca
    field public static final int format24Hour = 16843723; // 0x10103cb
    field public static final int fragment = 16843491; // 0x10102e3
    field public static final int fragment = 16843491; // 0x10102e3
    field public static final int fragmentCloseEnterAnimation = 16843495; // 0x10102e7
    field public static final int fragmentCloseEnterAnimation = 16843495; // 0x10102e7
    field public static final int fragmentCloseExitAnimation = 16843496; // 0x10102e8
    field public static final int fragmentCloseExitAnimation = 16843496; // 0x10102e8
@@ -1074,6 +1076,7 @@ package android {
    field public static final int thumbTextPadding = 16843634; // 0x1010372
    field public static final int thumbTextPadding = 16843634; // 0x1010372
    field public static final int thumbnail = 16843429; // 0x10102a5
    field public static final int thumbnail = 16843429; // 0x10102a5
    field public static final int tileMode = 16843265; // 0x1010201
    field public static final int tileMode = 16843265; // 0x1010201
    field public static final int timeZone = 16843724; // 0x10103cc
    field public static final int tint = 16843041; // 0x1010121
    field public static final int tint = 16843041; // 0x1010121
    field public static final int title = 16843233; // 0x10101e1
    field public static final int title = 16843233; // 0x10101e1
    field public static final int titleCondensed = 16843234; // 0x10101e2
    field public static final int titleCondensed = 16843234; // 0x10101e2
@@ -22300,14 +22303,14 @@ package android.text.format {
  public class DateFormat {
  public class DateFormat {
    ctor public DateFormat();
    ctor public DateFormat();
    method public static final java.lang.CharSequence format(java.lang.CharSequence, long);
    method public static java.lang.CharSequence format(java.lang.CharSequence, long);
    method public static final java.lang.CharSequence format(java.lang.CharSequence, java.util.Date);
    method public static java.lang.CharSequence format(java.lang.CharSequence, java.util.Date);
    method public static final java.lang.CharSequence format(java.lang.CharSequence, java.util.Calendar);
    method public static java.lang.CharSequence format(java.lang.CharSequence, java.util.Calendar);
    method public static final java.text.DateFormat getDateFormat(android.content.Context);
    method public static java.text.DateFormat getDateFormat(android.content.Context);
    method public static final char[] getDateFormatOrder(android.content.Context);
    method public static char[] getDateFormatOrder(android.content.Context);
    method public static final java.text.DateFormat getLongDateFormat(android.content.Context);
    method public static java.text.DateFormat getLongDateFormat(android.content.Context);
    method public static final java.text.DateFormat getMediumDateFormat(android.content.Context);
    method public static java.text.DateFormat getMediumDateFormat(android.content.Context);
    method public static final java.text.DateFormat getTimeFormat(android.content.Context);
    method public static java.text.DateFormat getTimeFormat(android.content.Context);
    method public static boolean is24HourFormat(android.content.Context);
    method public static boolean is24HourFormat(android.content.Context);
    field public static final char AM_PM = 97; // 0x0061 'a'
    field public static final char AM_PM = 97; // 0x0061 'a'
    field public static final char CAPITAL_AM_PM = 65; // 0x0041 'A'
    field public static final char CAPITAL_AM_PM = 65; // 0x0041 'A'
@@ -29518,6 +29521,21 @@ package android.widget {
    field public int span;
    field public int span;
  }
  }
  public class TextClock extends android.widget.TextView {
    ctor public TextClock(android.content.Context);
    ctor public TextClock(android.content.Context, android.util.AttributeSet);
    ctor public TextClock(android.content.Context, android.util.AttributeSet, int);
    method public java.lang.CharSequence getFormat12Hour();
    method public java.lang.CharSequence getFormat24Hour();
    method public java.lang.String getTimeZone();
    method public boolean is24HourModeEnabled();
    method public void setFormat12Hour(java.lang.CharSequence);
    method public void setFormat24Hour(java.lang.CharSequence);
    method public void setTimeZone(java.lang.String);
    field public static final java.lang.CharSequence DEFAULT_FORMAT_12_HOUR;
    field public static final java.lang.CharSequence DEFAULT_FORMAT_24_HOUR;
  }
  public class TextSwitcher extends android.widget.ViewSwitcher {
  public class TextSwitcher extends android.widget.ViewSwitcher {
    ctor public TextSwitcher(android.content.Context);
    ctor public TextSwitcher(android.content.Context);
    ctor public TextSwitcher(android.content.Context, android.util.AttributeSet);
    ctor public TextSwitcher(android.content.Context, android.util.AttributeSet);
+80 −17
Original line number Original line Diff line number Diff line
@@ -249,12 +249,13 @@ public class DateFormat {


            synchronized (sLocaleLock) {
            synchronized (sLocaleLock) {
                sIs24HourLocale = locale;
                sIs24HourLocale = locale;
                sIs24Hour = !value.equals("12");
                sIs24Hour = value.equals("24");
            }
            }

            return sIs24Hour;
        }
        }


        boolean b24 =  !(value == null || value.equals("12"));
        return value.equals("24");
        return b24;
    }
    }


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


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


@@ -353,7 +354,7 @@ public class DateFormat {
     * @param context the application context
     * @param context the application context
     * @return the {@link java.text.DateFormat} object that formats the date in long form.
     * @return the {@link java.text.DateFormat} object that formats the date in long form.
     */
     */
    public static final java.text.DateFormat getLongDateFormat(Context context) {
    public static java.text.DateFormat getLongDateFormat(Context context) {
        return java.text.DateFormat.getDateInstance(java.text.DateFormat.LONG);
        return java.text.DateFormat.getDateInstance(java.text.DateFormat.LONG);
    }
    }


@@ -363,7 +364,7 @@ public class DateFormat {
     * @param context the application context
     * @param context the application context
     * @return the {@link java.text.DateFormat} object that formats the date in long form.
     * @return the {@link java.text.DateFormat} object that formats the date in long form.
     */
     */
    public static final java.text.DateFormat getMediumDateFormat(Context context) {
    public static java.text.DateFormat getMediumDateFormat(Context context) {
        return java.text.DateFormat.getDateInstance(java.text.DateFormat.MEDIUM);
        return java.text.DateFormat.getDateInstance(java.text.DateFormat.MEDIUM);
    }
    }


@@ -376,7 +377,7 @@ public class DateFormat {
     * not just the day, month, and year, and not necessarily in the same
     * not just the day, month, and year, and not necessarily in the same
     * order returned here.
     * order returned here.
     */    
     */    
    public static final char[] getDateFormatOrder(Context context) {
    public static char[] getDateFormatOrder(Context context) {
        char[] order = new char[] {DATE, MONTH, YEAR};
        char[] order = new char[] {DATE, MONTH, YEAR};
        String value = getDateFormatString(context);
        String value = getDateFormatString(context);
        int index = 0;
        int index = 0;
@@ -420,7 +421,7 @@ public class DateFormat {
     * @param inTimeInMillis in milliseconds since Jan 1, 1970 GMT
     * @param inTimeInMillis in milliseconds since Jan 1, 1970 GMT
     * @return a {@link CharSequence} containing the requested text
     * @return a {@link CharSequence} containing the requested text
     */
     */
    public static final CharSequence format(CharSequence inFormat, long inTimeInMillis) {
    public static CharSequence format(CharSequence inFormat, long inTimeInMillis) {
        return format(inFormat, new Date(inTimeInMillis));
        return format(inFormat, new Date(inTimeInMillis));
    }
    }


@@ -431,7 +432,7 @@ public class DateFormat {
     * @param inDate the date to format
     * @param inDate the date to format
     * @return a {@link CharSequence} containing the requested text
     * @return a {@link CharSequence} containing the requested text
     */
     */
    public static final CharSequence format(CharSequence inFormat, Date inDate) {
    public static CharSequence format(CharSequence inFormat, Date inDate) {
        Calendar    c = new GregorianCalendar();
        Calendar    c = new GregorianCalendar();
        
        
        c.setTime(inDate);
        c.setTime(inDate);
@@ -439,6 +440,68 @@ public class DateFormat {
        return format(inFormat, c);
        return format(inFormat, c);
    }
    }


    /**
     * Indicates whether the specified format string contains seconds.
     * 
     * Always returns false if the input format is null.
     * 
     * @param inFormat the format string, as described in {@link android.text.format.DateFormat}
     *                 
     * @return true if the format string contains {@link #SECONDS}, false otherwise
     * 
     * @hide
     */
    public static boolean hasSeconds(CharSequence inFormat) {
        if (inFormat == null) return false;

        final int length = inFormat.length();

        int c;
        int count;

        for (int i = 0; i < length; i += count) {
            count = 1;
            c = inFormat.charAt(i);

            if (c == QUOTE) {
                count = skipQuotedText(inFormat, i, length);
            } else if (c == SECONDS) {
                return true;
            }
        }

        return false;
    }

    private static int skipQuotedText(CharSequence s, int i, int len) {
        if (i + 1 < len && s.charAt(i + 1) == QUOTE) {
            return 2;
        }

        int count = 1;
        // skip leading quote
        i++;

        while (i < len) {
            char c = s.charAt(i);

            if (c == QUOTE) {
                count++;
                //  QUOTEQUOTE -> QUOTE
                if (i + 1 < len && s.charAt(i + 1) == QUOTE) {
                    i++;
                } else {
                    break;
                }
            } else {
                i++;
                count++;
            }
        }

        return count;
    }

    /**
    /**
     * Given a format string and a {@link java.util.Calendar} object, returns a CharSequence 
     * Given a format string and a {@link java.util.Calendar} object, returns a CharSequence 
     * containing the requested date.
     * containing the requested date.
@@ -446,7 +509,7 @@ public class DateFormat {
     * @param inDate the date to format
     * @param inDate the date to format
     * @return a {@link CharSequence} containing the requested text
     * @return a {@link CharSequence} containing the requested text
     */
     */
    public static final CharSequence format(CharSequence inFormat, Calendar inDate) {
    public static CharSequence format(CharSequence inFormat, Calendar inDate) {
        SpannableStringBuilder      s = new SpannableStringBuilder(inFormat);
        SpannableStringBuilder      s = new SpannableStringBuilder(inFormat);
        int             c;
        int             c;
        int             count;
        int             count;
@@ -545,7 +608,7 @@ public class DateFormat {
            return s.toString();
            return s.toString();
    }
    }
    
    
    private static final String getMonthString(Calendar inDate, int count, int kind) {
    private static String getMonthString(Calendar inDate, int count, int kind) {
        boolean standalone = (kind == STANDALONE_MONTH);
        boolean standalone = (kind == STANDALONE_MONTH);
        int month = inDate.get(Calendar.MONTH);
        int month = inDate.get(Calendar.MONTH);
        
        
@@ -563,7 +626,7 @@ public class DateFormat {
        }
        }
    }
    }
        
        
    private static final String getTimeZoneString(Calendar inDate, int count) {
    private static String getTimeZoneString(Calendar inDate, int count) {
        TimeZone tz = inDate.getTimeZone();
        TimeZone tz = inDate.getTimeZone();
        
        
        if (count < 2) { // FIXME: shouldn't this be <= 2 ?
        if (count < 2) { // FIXME: shouldn't this be <= 2 ?
@@ -576,7 +639,7 @@ public class DateFormat {
        }
        }
    }
    }


    private static final String formatZoneOffset(int offset, int count) {
    private static String formatZoneOffset(int offset, int count) {
        offset /= 1000; // milliseconds to seconds
        offset /= 1000; // milliseconds to seconds
        StringBuilder tb = new StringBuilder();
        StringBuilder tb = new StringBuilder();


@@ -595,13 +658,13 @@ public class DateFormat {
        return tb.toString();
        return tb.toString();
    }
    }
    
    
    private static final String getYearString(Calendar inDate, int count) {
    private static String getYearString(Calendar inDate, int count) {
        int year = inDate.get(Calendar.YEAR);
        int year = inDate.get(Calendar.YEAR);
        return (count <= 2) ? zeroPad(year % 100, 2)
        return (count <= 2) ? zeroPad(year % 100, 2)
                            : String.format(Locale.getDefault(), "%d", year);
                            : String.format(Locale.getDefault(), "%d", year);
    }
    }
   
   
    private static final int appendQuotedText(SpannableStringBuilder s, int i, int len) {
    private static int appendQuotedText(SpannableStringBuilder s, int i, int len) {
        if (i + 1 < len && s.charAt(i + 1) == QUOTE) {
        if (i + 1 < len && s.charAt(i + 1) == QUOTE) {
            s.delete(i, i + 1);
            s.delete(i, i + 1);
            return 1;
            return 1;
@@ -638,7 +701,7 @@ public class DateFormat {
        return count;
        return count;
    }
    }


    private static final String zeroPad(int inValue, int inMinDigits) {
    private static String zeroPad(int inValue, int inMinDigits) {
        return String.format(Locale.getDefault(), "%0" + inMinDigits + "d", inValue);
        return String.format(Locale.getDefault(), "%0" + inMinDigits + "d", inValue);
    }
    }
}
}
+1 −1
Original line number Original line Diff line number Diff line
@@ -17697,7 +17697,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
        boolean mScalingRequired;
        boolean mScalingRequired;
        /**
        /**
         * If set, ViewAncestor doesn't use its lame animation for when the window resizes.
         * If set, ViewRootImpl doesn't use its lame animation for when the window resizes.
         */
         */
        boolean mTurnOffWindowResizeAnim;
        boolean mTurnOffWindowResizeAnim;
+15 −16
Original line number Original line Diff line number Diff line
@@ -17,7 +17,6 @@
package android.widget;
package android.widget;


import android.content.Context;
import android.content.Context;
import android.content.res.Resources;
import android.database.ContentObserver;
import android.database.ContentObserver;
import android.os.Handler;
import android.os.Handler;
import android.os.SystemClock;
import android.os.SystemClock;
@@ -32,14 +31,12 @@ import java.util.Calendar;
/**
/**
 * Like AnalogClock, but digital.  Shows seconds.
 * Like AnalogClock, but digital.  Shows seconds.
 *
 *
 * FIXME: implement separate views for hours/minutes/seconds, so
 * @deprecated It is recommended you use {@link TextClock} instead.
 * proportional fonts don't shake rendering
 * 
 * @deprecated It is recommended you use a {@link TextView} and {@link DateFormat}
 * to implement the same behavior.
 */
 */
@Deprecated
@Deprecated
public class DigitalClock extends TextView {
public class DigitalClock extends TextView {
    // FIXME: implement separate views for hours/minutes/seconds, so
    // proportional fonts don't shake rendering


    Calendar mCalendar;
    Calendar mCalendar;
    private final static String m12 = "h:mm:ss aa";
    private final static String m12 = "h:mm:ss aa";
@@ -134,12 +131,14 @@ public class DigitalClock extends TextView {
    @Override
    @Override
    public void onInitializeAccessibilityEvent(AccessibilityEvent event) {
    public void onInitializeAccessibilityEvent(AccessibilityEvent event) {
        super.onInitializeAccessibilityEvent(event);
        super.onInitializeAccessibilityEvent(event);
        //noinspection deprecation
        event.setClassName(DigitalClock.class.getName());
        event.setClassName(DigitalClock.class.getName());
    }
    }


    @Override
    @Override
    public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
    public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
        super.onInitializeAccessibilityNodeInfo(info);
        super.onInitializeAccessibilityNodeInfo(info);
        //noinspection deprecation
        info.setClassName(DigitalClock.class.getName());
        info.setClassName(DigitalClock.class.getName());
    }
    }
}
}
Loading