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

Commit ac2f0dbe authored by Stevie Kideckel's avatar Stevie Kideckel Committed by Android (Google) Code Review
Browse files

Merge "Add support for time zones to AnalogClock" into sc-dev

parents d98aa4ea b9184b44
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -53106,10 +53106,12 @@ package android.widget {
    ctor @Deprecated public AnalogClock(android.content.Context, android.util.AttributeSet);
    ctor @Deprecated public AnalogClock(android.content.Context, android.util.AttributeSet, int);
    ctor @Deprecated public AnalogClock(android.content.Context, android.util.AttributeSet, int, int);
    method @Deprecated @Nullable public String getTimeZone();
    method @Deprecated public void setDial(@NonNull android.graphics.drawable.Icon);
    method @Deprecated public void setHourHand(@NonNull android.graphics.drawable.Icon);
    method @Deprecated public void setMinuteHand(@NonNull android.graphics.drawable.Icon);
    method @Deprecated public void setSecondHand(@Nullable android.graphics.drawable.Icon);
    method @Deprecated public void setTimeZone(@Nullable String);
  }
  public class ArrayAdapter<T> extends android.widget.BaseAdapter implements android.widget.Filterable android.widget.ThemedSpinnerAdapter {
+90 −6
Original line number Diff line number Diff line
@@ -30,14 +30,19 @@ import android.graphics.drawable.Drawable;
import android.graphics.drawable.Icon;
import android.text.format.DateUtils;
import android.util.AttributeSet;
import android.util.Log;
import android.view.RemotableViewMethod;
import android.view.View;
import android.view.inspector.InspectableProperty;
import android.widget.RemoteViews.RemoteView;

import java.time.Clock;
import java.time.DateTimeException;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.Formatter;
import java.util.Locale;

/**
 * This widget display an analogic clock with two hands for hours and
@@ -47,15 +52,19 @@ import java.time.ZoneId;
 * @attr ref android.R.styleable#AnalogClock_hand_hour
 * @attr ref android.R.styleable#AnalogClock_hand_minute
 * @attr ref android.R.styleable#AnalogClock_hand_second
 * @attr ref android.R.styleable#AnalogClock_timeZone
 * @deprecated This widget is no longer supported.
 */
@RemoteView
@Deprecated
public class AnalogClock extends View {
    private static final String LOG_TAG = "AnalogClock";
    /** How often the clock should refresh to make the seconds hand advance at ~15 FPS. */
    private static final long SECONDS_TICK_FREQUENCY_MS = 1000 / 15;

    private Clock mClock;
    @Nullable
    private ZoneId mTimeZone;

    @UnsupportedAppUsage
    private Drawable mHourHand;
@@ -114,7 +123,8 @@ public class AnalogClock extends View {

        mSecondHand = a.getDrawable(com.android.internal.R.styleable.AnalogClock_hand_second);

        mClock = Clock.systemDefaultZone();
        mTimeZone = toZoneId(a.getString(com.android.internal.R.styleable.AnalogClock_timeZone));
        createClock();

        mDialWidth = mDial.getIntrinsicWidth();
        mDialHeight = mDial.getIntrinsicHeight();
@@ -162,6 +172,46 @@ public class AnalogClock extends View {
        invalidate();
    }

    /**
     * Indicates which time zone is currently used by this view.
     *
     * @return The ID of the current time zone or null if the default time zone,
     *         as set by the user, must be used
     *
     * @see java.util.TimeZone
     * @see java.util.TimeZone#getAvailableIDs()
     * @see #setTimeZone(String)
     */
    @InspectableProperty
    @Nullable
    public String getTimeZone() {
        ZoneId zoneId = mTimeZone;
        return zoneId == null ? null : zoneId.getId();
    }

    /**
     * Sets the specified time zone to use in this clock. When the time zone
     * is set through this method, system time zone changes (when the user
     * sets the time zone in settings for instance) will be ignored.
     *
     * @param timeZone The desired time zone's ID as specified in {@link java.util.TimeZone}
     *                 or null to user the time zone specified by the user
     *                 (system time zone)
     *
     * @see #getTimeZone()
     * @see java.util.TimeZone#getAvailableIDs()
     * @see java.util.TimeZone#getTimeZone(String)
     *
     * @attr ref android.R.styleable#AnalogClock_timeZone
     */
    @RemotableViewMethod
    public void setTimeZone(@Nullable String timeZone) {
        mTimeZone = toZoneId(timeZone);

        createClock();
        onTimeChanged();
    }

    @Override
    public void onVisibilityAggregated(boolean isVisible) {
        super.onVisibilityAggregated(isVisible);
@@ -198,8 +248,8 @@ public class AnalogClock extends View {
        // NOTE: It's safe to do these after registering the receiver since the receiver always runs
        // in the main thread, therefore the receiver can't run before this method returns.

        // The time zone may have changed while the receiver wasn't registered, so update the Time
        mClock = Clock.systemDefaultZone();
        // The time zone may have changed while the receiver wasn't registered, so update the clock.
        createClock();

        // Make sure we update to the current time
        onTimeChanged();
@@ -340,8 +390,7 @@ public class AnalogClock extends View {
        @Override
        public void onReceive(Context context, Intent intent) {
            if (intent.getAction().equals(Intent.ACTION_TIMEZONE_CHANGED)) {
                String tz = intent.getStringExtra(Intent.EXTRA_TIMEZONE);
                mClock = Clock.system(ZoneId.of(tz));
                createClock();
            }

            onTimeChanged();
@@ -365,9 +414,26 @@ public class AnalogClock extends View {
        }
    };

    private void createClock() {
        ZoneId zoneId = mTimeZone;
        if (zoneId == null) {
            mClock = Clock.systemDefaultZone();
        } else {
            mClock = Clock.system(zoneId);
        }
    }

    private void updateContentDescription(long timeMillis) {
        final int flags = DateUtils.FORMAT_SHOW_TIME | DateUtils.FORMAT_24HOUR;
        String contentDescription = DateUtils.formatDateTime(mContext, timeMillis, flags);
        String contentDescription =
                DateUtils.formatDateRange(
                        mContext,
                        new Formatter(new StringBuilder(50), Locale.getDefault()),
                        timeMillis /* startMillis */,
                        timeMillis /* endMillis */,
                        flags,
                        getTimeZone())
                        .toString();
        setContentDescription(contentDescription);
    }

@@ -378,4 +444,22 @@ public class AnalogClock extends View {
        Instant instant = Instant.ofEpochMilli(timeMillis);
        return LocalDateTime.ofInstant(instant, zoneId);
    }

    /**
     * Tries to parse a {@link ZoneId} from {@code timeZone}, returning null if it is null or there
     * is an error parsing.
     */
    @Nullable
    private static ZoneId toZoneId(@Nullable String timeZone) {
        if (timeZone == null) {
            return null;
        }

        try {
            return ZoneId.of(timeZone);
        } catch (DateTimeException e) {
            Log.w(LOG_TAG, "Failed to parse time zone from " + timeZone, e);
            return null;
        }
    }
}
+6 −0
Original line number Diff line number Diff line
@@ -4062,6 +4062,12 @@
        <attr name="hand_hour" format="reference"/>
        <attr name="hand_minute" format="reference"/>
        <attr name="hand_second" format="reference"/>
        <!-- Specifies the time zone to use. When this attribute is specified, the
             TextClock will ignore the time zone of the system. To use the user's
             time zone, do not specify this attribute. The default value is the
             user's time zone. Please refer to {@link java.util.TimeZone} for more
             information about time zone ids. -->
        <attr name="timeZone" format="string"/>
    </declare-styleable>
    <declare-styleable name="Button">
    </declare-styleable>