KeyguardStatusView.java revision 5ecd81154fa039961f65bb4e36d18ac555b0d1d6
1/* 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 17package com.android.keyguard; 18 19import android.content.Context; 20import android.content.res.Resources; 21import android.graphics.Typeface; 22import android.text.TextUtils; 23import android.util.AttributeSet; 24import android.util.Slog; 25import android.view.View; 26import android.widget.GridLayout; 27import android.widget.TextView; 28 29import com.android.internal.widget.LockPatternUtils; 30 31import java.text.SimpleDateFormat; 32import java.util.Date; 33import java.util.Locale; 34 35import libcore.icu.ICU; 36 37public class KeyguardStatusView extends GridLayout { 38 private static final boolean DEBUG = KeyguardViewMediator.DEBUG; 39 private static final String TAG = "KeyguardStatusView"; 40 41 public static final int LOCK_ICON = 0; // R.drawable.ic_lock_idle_lock; 42 public static final int ALARM_ICON = R.drawable.ic_lock_idle_alarm; 43 public static final int CHARGING_ICON = 0; //R.drawable.ic_lock_idle_charging; 44 public static final int BATTERY_LOW_ICON = 0; //R.drawable.ic_lock_idle_low_battery; 45 46 private SimpleDateFormat mDateFormat; 47 private LockPatternUtils mLockPatternUtils; 48 49 private TextView mDateView; 50 private TextView mAlarmStatusView; 51 private ClockView mClockView; 52 53 private KeyguardUpdateMonitorCallback mInfoCallback = new KeyguardUpdateMonitorCallback() { 54 55 @Override 56 public void onTimeChanged() { 57 refresh(); 58 } 59 60 @Override 61 void onKeyguardVisibilityChanged(boolean showing) { 62 if (showing) { 63 if (DEBUG) Slog.v(TAG, "refresh statusview showing:" + showing); 64 refresh(); 65 } 66 }; 67 }; 68 69 public KeyguardStatusView(Context context) { 70 this(context, null, 0); 71 } 72 73 public KeyguardStatusView(Context context, AttributeSet attrs) { 74 this(context, attrs, 0); 75 } 76 77 public KeyguardStatusView(Context context, AttributeSet attrs, int defStyle) { 78 super(context, attrs, defStyle); 79 } 80 81 @Override 82 protected void onFinishInflate() { 83 super.onFinishInflate(); 84 Resources res = getContext().getResources(); 85 final Locale locale = Locale.getDefault(); 86 final String datePattern = res.getString(R.string.system_ui_date_pattern); 87 final String bestFormat = ICU.getBestDateTimePattern(datePattern, locale.toString()); 88 mDateFormat = new SimpleDateFormat(bestFormat, locale); 89 mDateView = (TextView) findViewById(R.id.date); 90 mAlarmStatusView = (TextView) findViewById(R.id.alarm_status); 91 mClockView = (ClockView) findViewById(R.id.clock_view); 92 mLockPatternUtils = new LockPatternUtils(getContext()); 93 94 // Use custom font in mDateView 95 mDateView.setTypeface(Typeface.SANS_SERIF, Typeface.BOLD); 96 97 // Required to get Marquee to work. 98 final View marqueeViews[] = { mDateView, mAlarmStatusView }; 99 for (int i = 0; i < marqueeViews.length; i++) { 100 View v = marqueeViews[i]; 101 if (v == null) { 102 throw new RuntimeException("Can't find widget at index " + i); 103 } 104 v.setSelected(true); 105 } 106 refresh(); 107 } 108 109 protected void refresh() { 110 mClockView.updateTime(); 111 refreshDate(); 112 refreshAlarmStatus(); // might as well 113 } 114 115 void refreshAlarmStatus() { 116 // Update Alarm status 117 String nextAlarm = mLockPatternUtils.getNextAlarm(); 118 if (!TextUtils.isEmpty(nextAlarm)) { 119 maybeSetUpperCaseText(mAlarmStatusView, nextAlarm); 120 mAlarmStatusView.setCompoundDrawablesWithIntrinsicBounds(ALARM_ICON, 0, 0, 0); 121 mAlarmStatusView.setVisibility(View.VISIBLE); 122 } else { 123 mAlarmStatusView.setVisibility(View.GONE); 124 } 125 } 126 127 void refreshDate() { 128 maybeSetUpperCaseText(mDateView, mDateFormat.format(new Date())); 129 } 130 131 @Override 132 protected void onAttachedToWindow() { 133 super.onAttachedToWindow(); 134 KeyguardUpdateMonitor.getInstance(mContext).registerCallback(mInfoCallback); 135 } 136 137 @Override 138 protected void onDetachedFromWindow() { 139 super.onDetachedFromWindow(); 140 KeyguardUpdateMonitor.getInstance(mContext).removeCallback(mInfoCallback); 141 } 142 143 public int getAppWidgetId() { 144 return LockPatternUtils.ID_DEFAULT_STATUS_WIDGET; 145 } 146 147 private void maybeSetUpperCaseText(TextView textView, CharSequence text) { 148 if (KeyguardViewManager.USE_UPPER_CASE) { 149 textView.setText(text != null ? text.toString().toUpperCase() : null); 150 } else { 151 textView.setText(text); 152 } 153 } 154} 155