1e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler/*
2e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler * Copyright (C) 2008 The Android Open Source Project
3e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler *
4e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler * Licensed under the Apache License, Version 2.0 (the "License");
5e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler * you may not use this file except in compliance with the License.
6e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler * You may obtain a copy of the License at
7e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler *
8e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler *      http://www.apache.org/licenses/LICENSE-2.0
9e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler *
10e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler * Unless required by applicable law or agreed to in writing, software
11e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler * distributed under the License is distributed on an "AS IS" BASIS,
12e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler * See the License for the specific language governing permissions and
14e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler * limitations under the License.
15e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler */
16e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler
17e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandlerpackage com.android.internal.widget;
18e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler
19e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandlerimport com.android.internal.R;
20e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler
21e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandlerimport android.content.BroadcastReceiver;
22e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandlerimport android.content.Context;
23e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandlerimport android.content.Intent;
24e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandlerimport android.content.IntentFilter;
25e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandlerimport android.database.ContentObserver;
26e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandlerimport android.graphics.Typeface;
27e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandlerimport android.os.Handler;
28e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandlerimport android.provider.Settings;
29e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandlerimport android.text.format.DateFormat;
30e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandlerimport android.util.AttributeSet;
31e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandlerimport android.view.View;
32e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandlerimport android.widget.LinearLayout;
33e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandlerimport android.widget.TextView;
34e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler
358b886fab5496b0b1f5193f21855220176deddc37Jim Millerimport java.lang.ref.WeakReference;
36e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandlerimport java.text.DateFormatSymbols;
37e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandlerimport java.util.Calendar;
38e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler
39e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler/**
40e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler * Displays the time
41e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler */
42e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandlerpublic class DigitalClock extends LinearLayout {
43e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler
44e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler    private final static String M12 = "h:mm";
45e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler    private final static String M24 = "kk:mm";
46e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler
47e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler    private Calendar mCalendar;
48e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler    private String mFormat;
49e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler    private TextView mTimeDisplay;
50e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler    private AmPm mAmPm;
51e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler    private ContentObserver mFormatChangeObserver;
528b886fab5496b0b1f5193f21855220176deddc37Jim Miller    private int mAttached = 0; // for debugging - tells us whether attach/detach is unbalanced
53e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler
54e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler    /* called by system on minute ticks */
55e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler    private final Handler mHandler = new Handler();
568b886fab5496b0b1f5193f21855220176deddc37Jim Miller    private BroadcastReceiver mIntentReceiver;
578b886fab5496b0b1f5193f21855220176deddc37Jim Miller
588b886fab5496b0b1f5193f21855220176deddc37Jim Miller    private static class TimeChangedReceiver extends BroadcastReceiver {
598b886fab5496b0b1f5193f21855220176deddc37Jim Miller        private WeakReference<DigitalClock> mClock;
608b886fab5496b0b1f5193f21855220176deddc37Jim Miller        private Context mContext;
618b886fab5496b0b1f5193f21855220176deddc37Jim Miller
628b886fab5496b0b1f5193f21855220176deddc37Jim Miller        public TimeChangedReceiver(DigitalClock clock) {
638b886fab5496b0b1f5193f21855220176deddc37Jim Miller            mClock = new WeakReference<DigitalClock>(clock);
648b886fab5496b0b1f5193f21855220176deddc37Jim Miller            mContext = clock.getContext();
658b886fab5496b0b1f5193f21855220176deddc37Jim Miller        }
668b886fab5496b0b1f5193f21855220176deddc37Jim Miller
678b886fab5496b0b1f5193f21855220176deddc37Jim Miller        @Override
688b886fab5496b0b1f5193f21855220176deddc37Jim Miller        public void onReceive(Context context, Intent intent) {
698b886fab5496b0b1f5193f21855220176deddc37Jim Miller            // Post a runnable to avoid blocking the broadcast.
708b886fab5496b0b1f5193f21855220176deddc37Jim Miller            final boolean timezoneChanged =
718b886fab5496b0b1f5193f21855220176deddc37Jim Miller                    intent.getAction().equals(Intent.ACTION_TIMEZONE_CHANGED);
728b886fab5496b0b1f5193f21855220176deddc37Jim Miller            final DigitalClock clock = mClock.get();
738b886fab5496b0b1f5193f21855220176deddc37Jim Miller            if (clock != null) {
748b886fab5496b0b1f5193f21855220176deddc37Jim Miller                clock.mHandler.post(new Runnable() {
758b886fab5496b0b1f5193f21855220176deddc37Jim Miller                    public void run() {
768b886fab5496b0b1f5193f21855220176deddc37Jim Miller                        if (timezoneChanged) {
778b886fab5496b0b1f5193f21855220176deddc37Jim Miller                            clock.mCalendar = Calendar.getInstance();
78f60e108fa984d823aabad5b691bc248bffe5d1a5Daniel Sandler                        }
798b886fab5496b0b1f5193f21855220176deddc37Jim Miller                        clock.updateTime();
808b886fab5496b0b1f5193f21855220176deddc37Jim Miller                    }
81f60e108fa984d823aabad5b691bc248bffe5d1a5Daniel Sandler                });
828b886fab5496b0b1f5193f21855220176deddc37Jim Miller            } else {
8342a461570b9c5502959e429c4f16ca5ca860c4f2Jim Miller                try {
8442a461570b9c5502959e429c4f16ca5ca860c4f2Jim Miller                    mContext.unregisterReceiver(this);
8542a461570b9c5502959e429c4f16ca5ca860c4f2Jim Miller                } catch (RuntimeException e) {
8642a461570b9c5502959e429c4f16ca5ca860c4f2Jim Miller                    // Shouldn't happen
8742a461570b9c5502959e429c4f16ca5ca860c4f2Jim Miller                }
88e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler            }
898b886fab5496b0b1f5193f21855220176deddc37Jim Miller        }
908b886fab5496b0b1f5193f21855220176deddc37Jim Miller    };
91e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler
92e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler    static class AmPm {
93e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler        private TextView mAmPm;
94e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler        private String mAmString, mPmString;
95e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler
96e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler        AmPm(View parent, Typeface tf) {
97e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler            mAmPm = (TextView) parent.findViewById(R.id.am_pm);
98e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler            if (tf != null) {
99e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler                mAmPm.setTypeface(tf);
100e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler            }
101e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler
102e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler            String[] ampm = new DateFormatSymbols().getAmPmStrings();
103e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler            mAmString = ampm[0];
104e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler            mPmString = ampm[1];
105e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler        }
106e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler
107e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler        void setShowAmPm(boolean show) {
108e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler            mAmPm.setVisibility(show ? View.VISIBLE : View.GONE);
109e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler        }
110e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler
111e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler        void setIsMorning(boolean isMorning) {
112e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler            mAmPm.setText(isMorning ? mAmString : mPmString);
113e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler        }
114e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler    }
115e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler
1168b886fab5496b0b1f5193f21855220176deddc37Jim Miller    private static class FormatChangeObserver extends ContentObserver {
1178b886fab5496b0b1f5193f21855220176deddc37Jim Miller        private WeakReference<DigitalClock> mClock;
1188b886fab5496b0b1f5193f21855220176deddc37Jim Miller        private Context mContext;
1198b886fab5496b0b1f5193f21855220176deddc37Jim Miller        public FormatChangeObserver(DigitalClock clock) {
120e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler            super(new Handler());
1218b886fab5496b0b1f5193f21855220176deddc37Jim Miller            mClock = new WeakReference<DigitalClock>(clock);
1228b886fab5496b0b1f5193f21855220176deddc37Jim Miller            mContext = clock.getContext();
123e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler        }
124e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler        @Override
125e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler        public void onChange(boolean selfChange) {
1268b886fab5496b0b1f5193f21855220176deddc37Jim Miller            DigitalClock digitalClock = mClock.get();
1278b886fab5496b0b1f5193f21855220176deddc37Jim Miller            if (digitalClock != null) {
1288b886fab5496b0b1f5193f21855220176deddc37Jim Miller                digitalClock.setDateFormat();
1298b886fab5496b0b1f5193f21855220176deddc37Jim Miller                digitalClock.updateTime();
1308b886fab5496b0b1f5193f21855220176deddc37Jim Miller            } else {
13142a461570b9c5502959e429c4f16ca5ca860c4f2Jim Miller                try {
13242a461570b9c5502959e429c4f16ca5ca860c4f2Jim Miller                    mContext.getContentResolver().unregisterContentObserver(this);
13342a461570b9c5502959e429c4f16ca5ca860c4f2Jim Miller                } catch (RuntimeException e) {
13442a461570b9c5502959e429c4f16ca5ca860c4f2Jim Miller                    // Shouldn't happen
13542a461570b9c5502959e429c4f16ca5ca860c4f2Jim Miller                }
1368b886fab5496b0b1f5193f21855220176deddc37Jim Miller            }
137e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler        }
138e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler    }
139e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler
140e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler    public DigitalClock(Context context) {
141e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler        this(context, null);
142e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler    }
143e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler
144e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler    public DigitalClock(Context context, AttributeSet attrs) {
145e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler        super(context, attrs);
146e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler    }
147e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler
148e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler    @Override
149e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler    protected void onFinishInflate() {
150e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler        super.onFinishInflate();
151e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler
152e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler        mTimeDisplay = (TextView) findViewById(R.id.timeDisplay);
153e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler        mTimeDisplay.setTypeface(Typeface.createFromFile("/system/fonts/Clockopia.ttf"));
154e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler        mAmPm = new AmPm(this, Typeface.createFromFile("/system/fonts/DroidSans-Bold.ttf"));
155e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler        mCalendar = Calendar.getInstance();
156e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler
157e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler        setDateFormat();
158e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler    }
159e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler
160e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler    @Override
161e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler    protected void onAttachedToWindow() {
162e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler        super.onAttachedToWindow();
163e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler
1648b886fab5496b0b1f5193f21855220176deddc37Jim Miller        mAttached++;
165e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler
1668b886fab5496b0b1f5193f21855220176deddc37Jim Miller        /* monitor time ticks, time changed, timezone */
1678b886fab5496b0b1f5193f21855220176deddc37Jim Miller        if (mIntentReceiver == null) {
1688b886fab5496b0b1f5193f21855220176deddc37Jim Miller            mIntentReceiver = new TimeChangedReceiver(this);
169e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler            IntentFilter filter = new IntentFilter();
170e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler            filter.addAction(Intent.ACTION_TIME_TICK);
171e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler            filter.addAction(Intent.ACTION_TIME_CHANGED);
172e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler            filter.addAction(Intent.ACTION_TIMEZONE_CHANGED);
173f60e108fa984d823aabad5b691bc248bffe5d1a5Daniel Sandler            mContext.registerReceiver(mIntentReceiver, filter);
174e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler        }
175e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler
176e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler        /* monitor 12/24-hour display preference */
1778b886fab5496b0b1f5193f21855220176deddc37Jim Miller        if (mFormatChangeObserver == null) {
1788b886fab5496b0b1f5193f21855220176deddc37Jim Miller            mFormatChangeObserver = new FormatChangeObserver(this);
1798b886fab5496b0b1f5193f21855220176deddc37Jim Miller            mContext.getContentResolver().registerContentObserver(
1808b886fab5496b0b1f5193f21855220176deddc37Jim Miller                    Settings.System.CONTENT_URI, true, mFormatChangeObserver);
1818b886fab5496b0b1f5193f21855220176deddc37Jim Miller        }
182e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler
183e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler        updateTime();
184e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler    }
185e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler
186e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler    @Override
187e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler    protected void onDetachedFromWindow() {
188e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler        super.onDetachedFromWindow();
189e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler
1908b886fab5496b0b1f5193f21855220176deddc37Jim Miller        mAttached--;
191e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler
1928b886fab5496b0b1f5193f21855220176deddc37Jim Miller        if (mIntentReceiver != null) {
193e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler            mContext.unregisterReceiver(mIntentReceiver);
194e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler        }
1958b886fab5496b0b1f5193f21855220176deddc37Jim Miller        if (mFormatChangeObserver != null) {
1968b886fab5496b0b1f5193f21855220176deddc37Jim Miller            mContext.getContentResolver().unregisterContentObserver(
1978b886fab5496b0b1f5193f21855220176deddc37Jim Miller                    mFormatChangeObserver);
1988b886fab5496b0b1f5193f21855220176deddc37Jim Miller        }
199e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler
2008b886fab5496b0b1f5193f21855220176deddc37Jim Miller        mFormatChangeObserver = null;
2018b886fab5496b0b1f5193f21855220176deddc37Jim Miller        mIntentReceiver = null;
2028b886fab5496b0b1f5193f21855220176deddc37Jim Miller    }
203e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler
204e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler    void updateTime(Calendar c) {
205e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler        mCalendar = c;
206e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler        updateTime();
207e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler    }
208e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler
209e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler    private void updateTime() {
2108b886fab5496b0b1f5193f21855220176deddc37Jim Miller        mCalendar.setTimeInMillis(System.currentTimeMillis());
211e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler
212e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler        CharSequence newTime = DateFormat.format(mFormat, mCalendar);
213e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler        mTimeDisplay.setText(newTime);
214e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler        mAmPm.setIsMorning(mCalendar.get(Calendar.AM_PM) == 0);
215e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler    }
216e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler
217e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler    private void setDateFormat() {
2188b886fab5496b0b1f5193f21855220176deddc37Jim Miller        mFormat = android.text.format.DateFormat.is24HourFormat(getContext())
219e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler            ? M24 : M12;
220e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler        mAmPm.setShowAmPm(mFormat.equals(M12));
221e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler    }
222e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63dDaniel Sandler}
223