diff options
author | Android (Google) Code Review <android-gerrit@google.com> | 2009-11-12 10:34:32 -0800 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2009-11-12 10:34:32 -0800 |
commit | 609bbf182e4b4f39b6be7ed01331887ca70ea4c1 (patch) | |
tree | c3868bc77a7c8ff43abd82eb0d2db08f7139a2e8 /core/java | |
parent | ea48cd6dd4e64bcb5c840a12fe052f704510e01c (diff) | |
parent | e3ea6e3d4c8a8c2dc71f608a74ed9f6137afe63d (diff) | |
download | frameworks_base-609bbf182e4b4f39b6be7ed01331887ca70ea4c1.zip frameworks_base-609bbf182e4b4f39b6be7ed01331887ca70ea4c1.tar.gz frameworks_base-609bbf182e4b4f39b6be7ed01331887ca70ea4c1.tar.bz2 |
Merge change I54089080 into eclair
* changes:
Update keyguard and pattern-lock layouts for new UX designs.
Diffstat (limited to 'core/java')
-rw-r--r-- | core/java/com/android/internal/widget/DigitalClock.java | 186 |
1 files changed, 186 insertions, 0 deletions
diff --git a/core/java/com/android/internal/widget/DigitalClock.java b/core/java/com/android/internal/widget/DigitalClock.java new file mode 100644 index 0000000..ca71722 --- /dev/null +++ b/core/java/com/android/internal/widget/DigitalClock.java @@ -0,0 +1,186 @@ +/* + * Copyright (C) 2008 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.internal.widget; + +import com.android.internal.R; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.content.res.Resources; +import android.database.ContentObserver; +import android.graphics.Typeface; +import android.os.Handler; +import android.provider.Settings; +import android.text.format.DateFormat; +import android.util.AttributeSet; +import android.view.View; +import android.widget.LinearLayout; +import android.widget.TextView; + +import java.text.DateFormatSymbols; +import java.util.Calendar; + +/** + * Displays the time + */ +public class DigitalClock extends LinearLayout { + + private final static String M12 = "h:mm"; + private final static String M24 = "kk:mm"; + + private Calendar mCalendar; + private String mFormat; + private TextView mTimeDisplay; + private AmPm mAmPm; + private ContentObserver mFormatChangeObserver; + private boolean mLive = true; + private boolean mAttached; + + /* called by system on minute ticks */ + private final Handler mHandler = new Handler(); + private final BroadcastReceiver mIntentReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + if (mLive && intent.getAction().equals( + Intent.ACTION_TIMEZONE_CHANGED)) { + mCalendar = Calendar.getInstance(); + } + updateTime(); + } + }; + + static class AmPm { + private TextView mAmPm; + private String mAmString, mPmString; + + AmPm(View parent, Typeface tf) { + mAmPm = (TextView) parent.findViewById(R.id.am_pm); + if (tf != null) { + mAmPm.setTypeface(tf); + } + + String[] ampm = new DateFormatSymbols().getAmPmStrings(); + mAmString = ampm[0]; + mPmString = ampm[1]; + } + + void setShowAmPm(boolean show) { + mAmPm.setVisibility(show ? View.VISIBLE : View.GONE); + } + + void setIsMorning(boolean isMorning) { + mAmPm.setText(isMorning ? mAmString : mPmString); + } + } + + private class FormatChangeObserver extends ContentObserver { + public FormatChangeObserver() { + super(new Handler()); + } + @Override + public void onChange(boolean selfChange) { + setDateFormat(); + updateTime(); + } + } + + public DigitalClock(Context context) { + this(context, null); + } + + public DigitalClock(Context context, AttributeSet attrs) { + super(context, attrs); + } + + @Override + protected void onFinishInflate() { + super.onFinishInflate(); + + mTimeDisplay = (TextView) findViewById(R.id.timeDisplay); + mTimeDisplay.setTypeface(Typeface.createFromFile("/system/fonts/Clockopia.ttf")); + mAmPm = new AmPm(this, Typeface.createFromFile("/system/fonts/DroidSans-Bold.ttf")); + mCalendar = Calendar.getInstance(); + + setDateFormat(); + } + + @Override + protected void onAttachedToWindow() { + super.onAttachedToWindow(); + + if (mAttached) return; + mAttached = true; + + if (mLive) { + /* monitor time ticks, time changed, timezone */ + IntentFilter filter = new IntentFilter(); + filter.addAction(Intent.ACTION_TIME_TICK); + filter.addAction(Intent.ACTION_TIME_CHANGED); + filter.addAction(Intent.ACTION_TIMEZONE_CHANGED); + mContext.registerReceiver(mIntentReceiver, filter, null, mHandler); + } + + /* monitor 12/24-hour display preference */ + mFormatChangeObserver = new FormatChangeObserver(); + mContext.getContentResolver().registerContentObserver( + Settings.System.CONTENT_URI, true, mFormatChangeObserver); + + updateTime(); + } + + @Override + protected void onDetachedFromWindow() { + super.onDetachedFromWindow(); + + if (!mAttached) return; + mAttached = false; + + if (mLive) { + mContext.unregisterReceiver(mIntentReceiver); + } + mContext.getContentResolver().unregisterContentObserver( + mFormatChangeObserver); + } + + + void updateTime(Calendar c) { + mCalendar = c; + updateTime(); + } + + private void updateTime() { + if (mLive) { + mCalendar.setTimeInMillis(System.currentTimeMillis()); + } + + CharSequence newTime = DateFormat.format(mFormat, mCalendar); + mTimeDisplay.setText(newTime); + mAmPm.setIsMorning(mCalendar.get(Calendar.AM_PM) == 0); + } + + private void setDateFormat() { + mFormat = android.text.format.DateFormat.is24HourFormat(getContext()) + ? M24 : M12; + mAmPm.setShowAmPm(mFormat.equals(M12)); + } + + void setLive(boolean live) { + mLive = live; + } +} |