19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.widget;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19518ff0de95e64116ecb07706fc564d4c19197ca7Alan Viveretteimport android.annotation.Nullable;
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.annotation.Widget;
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context;
22f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganovimport android.content.res.Configuration;
234243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganovimport android.content.res.TypedArray;
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcelable;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.AttributeSet;
268a2a89588c3889b999a8fffa2d7c7a5c3ce25eb8Svetoslav Ganovimport android.view.accessibility.AccessibilityEvent;
278a78fd4d9572dff95432fcc4ba0e87563415b728Svetoslav Ganovimport android.view.accessibility.AccessibilityNodeInfo;
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29a53efe9923bedab4fe5d578f32eaff308e5b9e76Svetoslav Ganovimport com.android.internal.R;
30a53efe9923bedab4fe5d578f32eaff308e5b9e76Svetoslav Ganov
31f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganovimport java.util.Locale;
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
344243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov * A view for selecting the time of day, in either 24 hour or AM/PM mode. The
354243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov * hour, each minute digit, and AM/PM (if applicable) can be conrolled by
364243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov * vertical spinners. The hour can be entered by keyboard input. Entering in two
374243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov * digit hours can be accomplished by hitting two digits within a timeout of
384243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov * about a second (e.g. '1' then '2' to select 12). The minutes can be entered
394243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov * by entering single digits. Under AM/PM mode, the user can hit 'a', 'A", 'p'
404243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov * or 'P' to pick. For a dialog using this view, see
414243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov * {@link android.app.TimePickerDialog}.
425134478151d8aa3d776f8d4f368dbcdbc501a92aAlan Viverette * <p>
434c359b76f9a030f92a302ba74a528faa170bad4eScott Main * See the <a href="{@docRoot}guide/topics/ui/controls/pickers.html">Pickers</a>
444c359b76f9a030f92a302ba74a528faa170bad4eScott Main * guide.
454243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov * </p>
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project@Widget
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class TimePicker extends FrameLayout {
493053b2fdcf7486f2e2f572f9b05ce65dacdd2b4cChet Haase    private static final int MODE_SPINNER = 1;
503053b2fdcf7486f2e2f572f9b05ce65dacdd2b4cChet Haase    private static final int MODE_CLOCK = 2;
513053b2fdcf7486f2e2f572f9b05ce65dacdd2b4cChet Haase
525134478151d8aa3d776f8d4f368dbcdbc501a92aAlan Viverette    private final TimePickerDelegate mDelegate;
53eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio
549e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio    /**
559e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio     * The callback interface used to indicate the time has been adjusted.
569e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio     */
579e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio    public interface OnTimeChangedListener {
589e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio
599e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio        /**
609e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio         * @param view The view associated with this listener.
619e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio         * @param hourOfDay The current hour.
629e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio         * @param minute The current minute.
639e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio         */
649e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio        void onTimeChanged(TimePicker view, int hourOfDay, int minute);
659e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio    }
669e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio
679e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio    public TimePicker(Context context) {
689e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio        this(context, null);
699e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio    }
709e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio
719e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio    public TimePicker(Context context, AttributeSet attrs) {
729e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio        this(context, attrs, R.attr.timePickerStyle);
739e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio    }
749e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio
75617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette    public TimePicker(Context context, AttributeSet attrs, int defStyleAttr) {
76617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette        this(context, attrs, defStyleAttr, 0);
77617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette    }
78617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette
79617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette    public TimePicker(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
80617feb99a06e7ffb3894e86a286bf30e085f321aAlan Viverette        super(context, attrs, defStyleAttr, defStyleRes);
81eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio
825134478151d8aa3d776f8d4f368dbcdbc501a92aAlan Viverette        final TypedArray a = context.obtainStyledAttributes(
835134478151d8aa3d776f8d4f368dbcdbc501a92aAlan Viverette                attrs, R.styleable.TimePicker, defStyleAttr, defStyleRes);
84518ff0de95e64116ecb07706fc564d4c19197ca7Alan Viverette        final int mode = a.getInt(R.styleable.TimePicker_timePickerMode, MODE_SPINNER);
85dfaa6c7439d1506b2450005a6c1e0be6771eb9e5Fabrice Di Meglio        a.recycle();
86dfaa6c7439d1506b2450005a6c1e0be6771eb9e5Fabrice Di Meglio
873053b2fdcf7486f2e2f572f9b05ce65dacdd2b4cChet Haase        switch (mode) {
883053b2fdcf7486f2e2f572f9b05ce65dacdd2b4cChet Haase            case MODE_CLOCK:
89daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette                mDelegate = new TimePickerClockDelegate(
903053b2fdcf7486f2e2f572f9b05ce65dacdd2b4cChet Haase                        this, context, attrs, defStyleAttr, defStyleRes);
913053b2fdcf7486f2e2f572f9b05ce65dacdd2b4cChet Haase                break;
923053b2fdcf7486f2e2f572f9b05ce65dacdd2b4cChet Haase            case MODE_SPINNER:
933053b2fdcf7486f2e2f572f9b05ce65dacdd2b4cChet Haase            default:
94daf33ed85353ab7d7a7668dd0e3f9a66f0d5583fAlan Viverette                mDelegate = new TimePickerSpinnerDelegate(
953053b2fdcf7486f2e2f572f9b05ce65dacdd2b4cChet Haase                        this, context, attrs, defStyleAttr, defStyleRes);
963053b2fdcf7486f2e2f572f9b05ce65dacdd2b4cChet Haase                break;
97dfaa6c7439d1506b2450005a6c1e0be6771eb9e5Fabrice Di Meglio        }
989e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio    }
999e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio
1009e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio    /**
1019e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio     * Set the current hour.
1029e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio     */
1039e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio    public void setCurrentHour(Integer currentHour) {
1049e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio        mDelegate.setCurrentHour(currentHour);
1059e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio    }
1069e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio
1079e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio    /**
1089e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio     * @return The current hour in the range (0-23).
1099e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio     */
1109e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio    public Integer getCurrentHour() {
1119e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio        return mDelegate.getCurrentHour();
1129e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio    }
1139e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio
1149e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio    /**
1159e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio     * Set the current minute (0-59).
1169e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio     */
1179e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio    public void setCurrentMinute(Integer currentMinute) {
1189e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio        mDelegate.setCurrentMinute(currentMinute);
1199e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio    }
1209e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio
1219e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio    /**
1229e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio     * @return The current minute.
1239e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio     */
1249e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio    public Integer getCurrentMinute() {
1259e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio        return mDelegate.getCurrentMinute();
1269e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio    }
1279e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio
1289e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio    /**
1299e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio     * Set whether in 24 hour or AM/PM mode.
1309e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio     *
1319e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio     * @param is24HourView True = 24 hour mode. False = AM/PM.
1329e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio     */
1339e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio    public void setIs24HourView(Boolean is24HourView) {
1349e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio        mDelegate.setIs24HourView(is24HourView);
1359e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio    }
1369e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio
1379e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio    /**
1389e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio     * @return true if this is in 24 hour view else false.
1399e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio     */
1409e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio    public boolean is24HourView() {
1419e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio        return mDelegate.is24HourView();
1429e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio    }
1434243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1459e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio     * Set the callback that indicates the time has been adjusted by the user.
1469e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio     *
1479e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio     * @param onTimeChangedListener the callback, should not be null.
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1499e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio    public void setOnTimeChangedListener(OnTimeChangedListener onTimeChangedListener) {
1509e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio        mDelegate.setOnTimeChangedListener(onTimeChangedListener);
1519e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio    }
1529e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio
153518ff0de95e64116ecb07706fc564d4c19197ca7Alan Viverette    /**
154518ff0de95e64116ecb07706fc564d4c19197ca7Alan Viverette     * Sets the callback that indicates the current time is valid.
155518ff0de95e64116ecb07706fc564d4c19197ca7Alan Viverette     *
156518ff0de95e64116ecb07706fc564d4c19197ca7Alan Viverette     * @param callback the callback, may be null
157518ff0de95e64116ecb07706fc564d4c19197ca7Alan Viverette     * @hide
158518ff0de95e64116ecb07706fc564d4c19197ca7Alan Viverette     */
159518ff0de95e64116ecb07706fc564d4c19197ca7Alan Viverette    public void setValidationCallback(@Nullable ValidationCallback callback) {
160518ff0de95e64116ecb07706fc564d4c19197ca7Alan Viverette        mDelegate.setValidationCallback(callback);
161518ff0de95e64116ecb07706fc564d4c19197ca7Alan Viverette    }
162518ff0de95e64116ecb07706fc564d4c19197ca7Alan Viverette
1639e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio    @Override
1649e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio    public void setEnabled(boolean enabled) {
1659e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio        super.setEnabled(enabled);
1669e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio        mDelegate.setEnabled(enabled);
1679e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio    }
1684243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov
1699e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio    @Override
1709e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio    public boolean isEnabled() {
1719e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio        return mDelegate.isEnabled();
1729e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio    }
1734243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov
1749e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio    @Override
1759e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio    public int getBaseline() {
1769e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio        return mDelegate.getBaseline();
1779e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio    }
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1799e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio    @Override
1809e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio    protected void onConfigurationChanged(Configuration newConfig) {
1819e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio        super.onConfigurationChanged(newConfig);
1829e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio        mDelegate.onConfigurationChanged(newConfig);
1839e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio    }
1844243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov
1859e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio    @Override
1869e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio    protected Parcelable onSaveInstanceState() {
1879e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio        Parcelable superState = super.onSaveInstanceState();
1889e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio        return mDelegate.onSaveInstanceState(superState);
1899e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio    }
1904243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov
1919e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio    @Override
1929e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio    protected void onRestoreInstanceState(Parcelable state) {
193eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio        BaseSavedState ss = (BaseSavedState) state;
1949e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio        super.onRestoreInstanceState(ss.getSuperState());
1959e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio        mDelegate.onRestoreInstanceState(ss);
1969e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio    }
1974243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov
1989e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio    @Override
1999e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio    public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) {
2009e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio        return mDelegate.dispatchPopulateAccessibilityEvent(event);
2019e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio    }
2026304b0d58e74509a9f21b67b5227b2fee2f1b60fSvetoslav Ganov
2039e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio    @Override
2049e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio    public void onPopulateAccessibilityEvent(AccessibilityEvent event) {
2059e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio        super.onPopulateAccessibilityEvent(event);
2069e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio        mDelegate.onPopulateAccessibilityEvent(event);
2079e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio    }
2086304b0d58e74509a9f21b67b5227b2fee2f1b60fSvetoslav Ganov
2099e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio    @Override
2109e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio    public void onInitializeAccessibilityEvent(AccessibilityEvent event) {
2119e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio        super.onInitializeAccessibilityEvent(event);
2129e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio        mDelegate.onInitializeAccessibilityEvent(event);
2139e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio    }
2146304b0d58e74509a9f21b67b5227b2fee2f1b60fSvetoslav Ganov
2159e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio    @Override
2169e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio    public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
2179e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio        super.onInitializeAccessibilityNodeInfo(info);
2189e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio        mDelegate.onInitializeAccessibilityNodeInfo(info);
2199e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio    }
2209e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio
2219e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio    /**
2229e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio     * A delegate interface that defined the public API of the TimePicker. Allows different
2239e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio     * TimePicker implementations. This would need to be implemented by the TimePicker delegates
2249e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio     * for the real behavior.
2259e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio     */
226eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio    interface TimePickerDelegate {
2279e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio        void setCurrentHour(Integer currentHour);
2289e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio        Integer getCurrentHour();
229206316a61f904ea0a6b106137dd7715a2c246d4cSvetoslav Ganov
2309e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio        void setCurrentMinute(Integer currentMinute);
2319e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio        Integer getCurrentMinute();
2324243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov
2339e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio        void setIs24HourView(Boolean is24HourView);
2349e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio        boolean is24HourView();
235206316a61f904ea0a6b106137dd7715a2c246d4cSvetoslav Ganov
2369e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio        void setOnTimeChangedListener(OnTimeChangedListener onTimeChangedListener);
237518ff0de95e64116ecb07706fc564d4c19197ca7Alan Viverette        void setValidationCallback(ValidationCallback callback);
23851c52edad7d40697d7fb2a091f850506fa897643Svetoslav Ganov
2399e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio        void setEnabled(boolean enabled);
2409e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio        boolean isEnabled();
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2429e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio        int getBaseline();
2438a2a89588c3889b999a8fffa2d7c7a5c3ce25eb8Svetoslav Ganov
2449e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio        void onConfigurationChanged(Configuration newConfig);
245f5926962cc665d4a2e6464f9ba9e3e9788496a6fSvetoslav Ganov
2469e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio        Parcelable onSaveInstanceState(Parcelable superState);
2479e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio        void onRestoreInstanceState(Parcelable state);
2489e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio
2499e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio        boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event);
2509e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio        void onPopulateAccessibilityEvent(AccessibilityEvent event);
2519e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio        void onInitializeAccessibilityEvent(AccessibilityEvent event);
2529e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio        void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info);
2539e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio    }
25464902bd89ea0630a59eb61345061002e9895af84Fabrice Di Meglio
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
256518ff0de95e64116ecb07706fc564d4c19197ca7Alan Viverette     * A callback interface for updating input validity when the TimePicker
257518ff0de95e64116ecb07706fc564d4c19197ca7Alan Viverette     * when included into a Dialog.
258eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio     *
259eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio     * @hide
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
261518ff0de95e64116ecb07706fc564d4c19197ca7Alan Viverette    public static interface ValidationCallback {
262518ff0de95e64116ecb07706fc564d4c19197ca7Alan Viverette        void onValidationChanged(boolean valid);
263eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio    }
2649e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio
265eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio    /**
266eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio     * An abstract class which can be used as a start for TimePicker implementations
267eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio     */
268eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio    abstract static class AbstractTimePickerDelegate implements TimePickerDelegate {
269eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio        // The delegator
270eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio        protected TimePicker mDelegator;
2719e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio
272eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio        // The context
273eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio        protected Context mContext;
2749e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio
275eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio        // The current locale
276eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio        protected Locale mCurrentLocale;
2779e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio
278eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio        // Callbacks
279518ff0de95e64116ecb07706fc564d4c19197ca7Alan Viverette        protected OnTimeChangedListener mOnTimeChangedListener;
280518ff0de95e64116ecb07706fc564d4c19197ca7Alan Viverette        protected ValidationCallback mValidationCallback;
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
282eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio        public AbstractTimePickerDelegate(TimePicker delegator, Context context) {
2839e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio            mDelegator = delegator;
284eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio            mContext = context;
2854243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov
2869e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio            // initialization based on locale
2879e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio            setCurrentLocale(Locale.getDefault());
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2894243dc394d89a93cb207efa36e9755c2424d688bSvetoslav Ganov
290eeff63a5c347f282b5c8c3ae6a0924bf03fbce8fFabrice Di Meglio        public void setCurrentLocale(Locale locale) {
2919e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio            if (locale.equals(mCurrentLocale)) {
2929e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio                return;
2939e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio            }
2949e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio            mCurrentLocale = locale;
2959e4009ea150a7020fb8cf315281679979e67e762Fabrice Di Meglio        }
296518ff0de95e64116ecb07706fc564d4c19197ca7Alan Viverette
297518ff0de95e64116ecb07706fc564d4c19197ca7Alan Viverette        @Override
298518ff0de95e64116ecb07706fc564d4c19197ca7Alan Viverette        public void setValidationCallback(ValidationCallback callback) {
299518ff0de95e64116ecb07706fc564d4c19197ca7Alan Viverette            mValidationCallback = callback;
300518ff0de95e64116ecb07706fc564d4c19197ca7Alan Viverette        }
301518ff0de95e64116ecb07706fc564d4c19197ca7Alan Viverette
302518ff0de95e64116ecb07706fc564d4c19197ca7Alan Viverette        protected void onValidationChanged(boolean valid) {
303518ff0de95e64116ecb07706fc564d4c19197ca7Alan Viverette            if (mValidationCallback != null) {
304518ff0de95e64116ecb07706fc564d4c19197ca7Alan Viverette                mValidationCallback.onValidationChanged(valid);
305518ff0de95e64116ecb07706fc564d4c19197ca7Alan Viverette            }
306518ff0de95e64116ecb07706fc564d4c19197ca7Alan Viverette        }
3073fec3fe0e3a83c5e0d1264f34bcc55b158537bc6Svetoslav Ganov    }
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
309