Merge "Hello, HoloClock."
This commit is contained in:
committed by
Android (Google) Code Review
commit
0c400f0a68
BIN
packages/SystemUI/assets/fonts/AndroidClock.ttf
Normal file
BIN
packages/SystemUI/assets/fonts/AndroidClock.ttf
Normal file
Binary file not shown.
BIN
packages/SystemUI/assets/fonts/AndroidClock2.ttf
Normal file
BIN
packages/SystemUI/assets/fonts/AndroidClock2.ttf
Normal file
Binary file not shown.
@@ -57,20 +57,25 @@
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="match_parent"
|
||||
>
|
||||
<!-- paddingLeft: 24 dips = 32dp (total space to icon) - 8dp in the icon.
|
||||
TODO: Make sure the font has a small enough leading that we don't need this
|
||||
negative margin business. -->
|
||||
<com.android.systemui.statusbar.policy.Clock
|
||||
style="@*android:style/TextAppearance.StatusBar.Icon"
|
||||
<com.android.systemui.statusbar.tablet.HoloClock
|
||||
android:id="@+id/clock"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="65dp"
|
||||
android:layout_marginTop="-17dp"
|
||||
android:singleLine="true"
|
||||
android:textSize="60sp"
|
||||
android:paddingLeft="24dip"
|
||||
android:textColor="#2e2e2e"
|
||||
/>
|
||||
android:layout_height="match_parent"
|
||||
>
|
||||
<TextView android:id="@+id/time_bg"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="match_parent"
|
||||
android:singleLine="true"
|
||||
android:textSize="72dip"
|
||||
android:textColor="#1f1f1f" />
|
||||
<TextView android:id="@+id/time_fg"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="match_parent"
|
||||
android:singleLine="true"
|
||||
android:textSize="72dip"
|
||||
android:textColor="#2e2e2e" />
|
||||
</com.android.systemui.statusbar.tablet.HoloClock>
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="48dip"
|
||||
android:layout_height="match_parent"
|
||||
|
||||
@@ -40,15 +40,29 @@
|
||||
android:layout_alignParentRight="true"
|
||||
>
|
||||
|
||||
<com.android.systemui.statusbar.policy.Clock
|
||||
<com.android.systemui.statusbar.tablet.HoloClock
|
||||
android:id="@+id/clock"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_alignParentTop="true"
|
||||
android:layout_marginRight="48dp"
|
||||
android:textSize="70sp"
|
||||
android:gravity="right"
|
||||
/>
|
||||
android:layout_marginRight="40dip"
|
||||
android:layout_marginBottom="4dip"
|
||||
>
|
||||
<TextView android:id="@+id/time_bg"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:gravity="right"
|
||||
android:singleLine="true"
|
||||
android:textSize="90dip"
|
||||
android:textColor="#999999" />
|
||||
<TextView android:id="@+id/time_fg"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:gravity="right"
|
||||
android:singleLine="true"
|
||||
android:textSize="90dip"
|
||||
android:textColor="#666666" />
|
||||
</com.android.systemui.statusbar.tablet.HoloClock>
|
||||
|
||||
<com.android.systemui.statusbar.policy.DateView
|
||||
android:id="@+id/date"
|
||||
|
||||
@@ -0,0 +1,169 @@
|
||||
/*
|
||||
* Copyright (C) 2006 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.systemui.statusbar.tablet;
|
||||
|
||||
import android.content.BroadcastReceiver;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.IntentFilter;
|
||||
import android.content.res.AssetManager;
|
||||
import android.content.res.Resources;
|
||||
import android.content.res.TypedArray;
|
||||
import android.graphics.Canvas;
|
||||
import android.graphics.Typeface;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.text.Spannable;
|
||||
import android.text.SpannableStringBuilder;
|
||||
import android.text.format.DateFormat;
|
||||
import android.text.style.CharacterStyle;
|
||||
import android.text.style.ForegroundColorSpan;
|
||||
import android.text.style.RelativeSizeSpan;
|
||||
import android.text.style.RelativeSizeSpan;
|
||||
import android.text.style.StyleSpan;
|
||||
import android.util.AttributeSet;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.FrameLayout;
|
||||
import android.widget.TextView;
|
||||
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.Calendar;
|
||||
import java.util.TimeZone;
|
||||
|
||||
import com.android.systemui.R;
|
||||
|
||||
public class HoloClock extends FrameLayout {
|
||||
private boolean mAttached;
|
||||
private Calendar mCalendar;
|
||||
private String mClockFormatString;
|
||||
private SimpleDateFormat mClockFormat;
|
||||
|
||||
private static Typeface sBackgroundType, sForegroundType;
|
||||
private TextView mBgText, mFgText;
|
||||
|
||||
public HoloClock(Context context) {
|
||||
this(context, null);
|
||||
}
|
||||
|
||||
public HoloClock(Context context, AttributeSet attrs) {
|
||||
this(context, attrs, 0);
|
||||
}
|
||||
|
||||
public HoloClock(Context context, AttributeSet attrs, int defStyle) {
|
||||
super(context, attrs, defStyle);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onFinishInflate() {
|
||||
super.onFinishInflate();
|
||||
|
||||
if (sBackgroundType == null) {
|
||||
AssetManager assets = getContext().getAssets();
|
||||
|
||||
sBackgroundType = Typeface.createFromAsset(assets,
|
||||
"fonts/AndroidClock.ttf");
|
||||
sForegroundType = Typeface.createFromAsset(assets,
|
||||
"fonts/AndroidClock2.ttf");
|
||||
}
|
||||
mBgText = (TextView) findViewById(R.id.time_bg);
|
||||
if (mBgText != null) {
|
||||
mBgText.setTypeface(sBackgroundType);
|
||||
}
|
||||
mFgText = (TextView) findViewById(R.id.time_fg);
|
||||
if (mFgText != null) {
|
||||
mFgText.setTypeface(sForegroundType);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onAttachedToWindow() {
|
||||
super.onAttachedToWindow();
|
||||
|
||||
if (!mAttached) {
|
||||
mAttached = true;
|
||||
IntentFilter filter = new IntentFilter();
|
||||
|
||||
filter.addAction(Intent.ACTION_TIME_TICK);
|
||||
filter.addAction(Intent.ACTION_TIME_CHANGED);
|
||||
filter.addAction(Intent.ACTION_TIMEZONE_CHANGED);
|
||||
filter.addAction(Intent.ACTION_CONFIGURATION_CHANGED);
|
||||
|
||||
getContext().registerReceiver(mIntentReceiver, filter, null, getHandler());
|
||||
}
|
||||
|
||||
// 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
|
||||
mCalendar = Calendar.getInstance(TimeZone.getDefault());
|
||||
|
||||
// Make sure we update to the current time
|
||||
updateClock();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onDetachedFromWindow() {
|
||||
super.onDetachedFromWindow();
|
||||
if (mAttached) {
|
||||
getContext().unregisterReceiver(mIntentReceiver);
|
||||
mAttached = false;
|
||||
}
|
||||
}
|
||||
|
||||
private final BroadcastReceiver mIntentReceiver = new BroadcastReceiver() {
|
||||
@Override
|
||||
public void onReceive(Context context, Intent intent) {
|
||||
String action = intent.getAction();
|
||||
if (action.equals(Intent.ACTION_TIMEZONE_CHANGED)) {
|
||||
String tz = intent.getStringExtra("time-zone");
|
||||
mCalendar = Calendar.getInstance(TimeZone.getTimeZone(tz));
|
||||
if (mClockFormat != null) {
|
||||
mClockFormat.setTimeZone(mCalendar.getTimeZone());
|
||||
}
|
||||
}
|
||||
updateClock();
|
||||
}
|
||||
};
|
||||
|
||||
final void updateClock() {
|
||||
mCalendar.setTimeInMillis(System.currentTimeMillis());
|
||||
CharSequence txt = getTimeText();
|
||||
mBgText.setText(txt);
|
||||
mFgText.setText(txt);
|
||||
}
|
||||
|
||||
private final CharSequence getTimeText() {
|
||||
Context context = getContext();
|
||||
int res = DateFormat.is24HourFormat(context)
|
||||
? com.android.internal.R.string.twenty_four_hour_time_format
|
||||
: com.android.internal.R.string.twelve_hour_time_format;
|
||||
|
||||
SimpleDateFormat sdf;
|
||||
String format = context.getString(res);
|
||||
if (!format.equals(mClockFormatString)) {
|
||||
// we don't want AM/PM showing up in our statusbar, even in 12h mode
|
||||
format = format.replaceAll("a", "").trim();
|
||||
mClockFormat = sdf = new SimpleDateFormat(format);
|
||||
mClockFormatString = format;
|
||||
} else {
|
||||
sdf = mClockFormat;
|
||||
}
|
||||
String result = sdf.format(mCalendar.getTime());
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user