blob: ae55c4a15cd2f0cc447bce920353c3cd5ec85360 [file] [log] [blame]
Jim Millerdcb3d842012-08-23 19:18:12 -07001/*
2 * Copyright (C) 2012 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Jim Miller5ecd8112013-01-09 18:50:26 -080017package com.android.keyguard;
Jim Millerdcb3d842012-08-23 19:18:12 -070018
19import android.content.Context;
Jim Miller0c486892013-10-11 16:21:45 -070020import android.content.res.Resources;
Jim Milleredc74ab2012-11-06 21:46:11 -080021import android.text.TextUtils;
Jim Miller38ab2772013-10-08 15:32:09 -070022import android.text.format.DateFormat;
Jim Millerdcb3d842012-08-23 19:18:12 -070023import android.util.AttributeSet;
Jim Miller20daffd2013-10-07 14:59:53 -070024import android.util.Log;
Jim Milleredc74ab2012-11-06 21:46:11 -080025import android.util.Slog;
26import android.view.View;
Jim Millerdcb3d842012-08-23 19:18:12 -070027import android.widget.GridLayout;
Jim Miller38ab2772013-10-08 15:32:09 -070028import android.widget.TextClock;
Jim Milleredc74ab2012-11-06 21:46:11 -080029import android.widget.TextView;
Jim Millerdcb3d842012-08-23 19:18:12 -070030
Michael Jurka1254f2f2012-10-25 11:44:31 -070031import com.android.internal.widget.LockPatternUtils;
32
Chris Wren56018e52013-01-15 10:59:43 -050033import java.util.Locale;
34
Jim Millerdcb3d842012-08-23 19:18:12 -070035public class KeyguardStatusView extends GridLayout {
Jorim Jaggi5cf17872014-03-26 18:31:48 +010036 private static final boolean DEBUG = KeyguardConstants.DEBUG;
Jim Milleredc74ab2012-11-06 21:46:11 -080037 private static final String TAG = "KeyguardStatusView";
38
Jim Milleredc74ab2012-11-06 21:46:11 -080039 private LockPatternUtils mLockPatternUtils;
40
Jim Milleredc74ab2012-11-06 21:46:11 -080041 private TextView mAlarmStatusView;
Jim Miller38ab2772013-10-08 15:32:09 -070042 private TextClock mDateView;
Jim Miller0c486892013-10-11 16:21:45 -070043 private TextClock mClockView;
Jim Milleredc74ab2012-11-06 21:46:11 -080044
45 private KeyguardUpdateMonitorCallback mInfoCallback = new KeyguardUpdateMonitorCallback() {
46
47 @Override
48 public void onTimeChanged() {
49 refresh();
50 }
51
52 @Override
Jorim Jaggi5cf17872014-03-26 18:31:48 +010053 public void onKeyguardVisibilityChanged(boolean showing) {
Jim Milleredc74ab2012-11-06 21:46:11 -080054 if (showing) {
55 if (DEBUG) Slog.v(TAG, "refresh statusview showing:" + showing);
56 refresh();
57 }
Jorim Jaggi5cf17872014-03-26 18:31:48 +010058 }
Jim Miller20daffd2013-10-07 14:59:53 -070059
Jim Miller38ab2772013-10-08 15:32:09 -070060 @Override
Jim Miller20daffd2013-10-07 14:59:53 -070061 public void onScreenTurnedOn() {
62 setEnableMarquee(true);
Jorim Jaggi5cf17872014-03-26 18:31:48 +010063 }
Jim Miller20daffd2013-10-07 14:59:53 -070064
Jim Miller38ab2772013-10-08 15:32:09 -070065 @Override
Jim Miller20daffd2013-10-07 14:59:53 -070066 public void onScreenTurnedOff(int why) {
67 setEnableMarquee(false);
Jorim Jaggi5cf17872014-03-26 18:31:48 +010068 }
Jim Milleredc74ab2012-11-06 21:46:11 -080069 };
Jim Miller6212cc02012-09-05 17:35:31 -070070
Jim Millerdcb3d842012-08-23 19:18:12 -070071 public KeyguardStatusView(Context context) {
72 this(context, null, 0);
73 }
74
75 public KeyguardStatusView(Context context, AttributeSet attrs) {
76 this(context, attrs, 0);
77 }
78
79 public KeyguardStatusView(Context context, AttributeSet attrs, int defStyle) {
80 super(context, attrs, defStyle);
81 }
82
Jim Miller20daffd2013-10-07 14:59:53 -070083 private void setEnableMarquee(boolean enabled) {
84 if (DEBUG) Log.v(TAG, (enabled ? "Enable" : "Disable") + " transport text marquee");
Adam Powell31049d72013-10-07 12:58:42 -070085 if (mAlarmStatusView != null) mAlarmStatusView.setSelected(enabled);
Jim Miller20daffd2013-10-07 14:59:53 -070086 }
87
Jim Milleredc74ab2012-11-06 21:46:11 -080088 @Override
89 protected void onFinishInflate() {
90 super.onFinishInflate();
Jim Milleredc74ab2012-11-06 21:46:11 -080091 mAlarmStatusView = (TextView) findViewById(R.id.alarm_status);
Jim Miller38ab2772013-10-08 15:32:09 -070092 mDateView = (TextClock) findViewById(R.id.date_view);
Jim Miller0c486892013-10-11 16:21:45 -070093 mClockView = (TextClock) findViewById(R.id.clock_view);
Jim Milleredc74ab2012-11-06 21:46:11 -080094 mLockPatternUtils = new LockPatternUtils(getContext());
Jim Miller20daffd2013-10-07 14:59:53 -070095 final boolean screenOn = KeyguardUpdateMonitor.getInstance(mContext).isScreenOn();
96 setEnableMarquee(screenOn);
Jim Milleredc74ab2012-11-06 21:46:11 -080097 refresh();
98 }
99
100 protected void refresh() {
John Spurlock385a63d2013-10-30 19:40:48 -0400101 Patterns.update(mContext);
Jim Miller0c486892013-10-11 16:21:45 -0700102
John Spurlock385a63d2013-10-30 19:40:48 -0400103 mDateView.setFormat24Hour(Patterns.dateView);
104 mDateView.setFormat12Hour(Patterns.dateView);
Jim Miller0c486892013-10-11 16:21:45 -0700105
John Spurlock385a63d2013-10-30 19:40:48 -0400106 mClockView.setFormat12Hour(Patterns.clockView12);
107 mClockView.setFormat24Hour(Patterns.clockView24);
Jim Miller0c486892013-10-11 16:21:45 -0700108
Jim Miller38ab2772013-10-08 15:32:09 -0700109 refreshAlarmStatus();
Jim Milleredc74ab2012-11-06 21:46:11 -0800110 }
111
112 void refreshAlarmStatus() {
113 // Update Alarm status
114 String nextAlarm = mLockPatternUtils.getNextAlarm();
115 if (!TextUtils.isEmpty(nextAlarm)) {
Jim Millere38c8e22013-09-24 15:54:04 -0700116 mAlarmStatusView.setText(nextAlarm);
Jim Milleredc74ab2012-11-06 21:46:11 -0800117 mAlarmStatusView.setVisibility(View.VISIBLE);
118 } else {
119 mAlarmStatusView.setVisibility(View.GONE);
120 }
121 }
122
Jim Milleredc74ab2012-11-06 21:46:11 -0800123 @Override
124 protected void onAttachedToWindow() {
125 super.onAttachedToWindow();
126 KeyguardUpdateMonitor.getInstance(mContext).registerCallback(mInfoCallback);
127 }
128
129 @Override
130 protected void onDetachedFromWindow() {
131 super.onDetachedFromWindow();
132 KeyguardUpdateMonitor.getInstance(mContext).removeCallback(mInfoCallback);
133 }
134
Michael Jurka1254f2f2012-10-25 11:44:31 -0700135 public int getAppWidgetId() {
136 return LockPatternUtils.ID_DEFAULT_STATUS_WIDGET;
137 }
138
John Spurlock385a63d2013-10-30 19:40:48 -0400139 // DateFormat.getBestDateTimePattern is extremely expensive, and refresh is called often.
140 // This is an optimization to ensure we only recompute the patterns when the inputs change.
141 private static final class Patterns {
142 static String dateView;
143 static String clockView12;
144 static String clockView24;
145 static String cacheKey;
146
147 static void update(Context context) {
148 final Locale locale = Locale.getDefault();
149 final Resources res = context.getResources();
150 final String dateViewSkel = res.getString(R.string.abbrev_wday_month_day_no_year);
151 final String clockView12Skel = res.getString(R.string.clock_12hr_format);
152 final String clockView24Skel = res.getString(R.string.clock_24hr_format);
153 final String key = locale.toString() + dateViewSkel + clockView12Skel + clockView24Skel;
154 if (key.equals(cacheKey)) return;
155
156 dateView = DateFormat.getBestDateTimePattern(locale, dateViewSkel);
157
158 clockView12 = DateFormat.getBestDateTimePattern(locale, clockView12Skel);
159 // CLDR insists on adding an AM/PM indicator even though it wasn't in the skeleton
160 // format. The following code removes the AM/PM indicator if we didn't want it.
161 if (!clockView12Skel.contains("a")) {
162 clockView12 = clockView12.replaceAll("a", "").trim();
163 }
164
165 clockView24 = DateFormat.getBestDateTimePattern(locale, clockView24Skel);
166
167 cacheKey = key;
168 }
169 }
Jim Millerdcb3d842012-08-23 19:18:12 -0700170}