KeyguardStatusViewManager.java revision ce4a0c6f160241ea06e1f2000815094263dea70d
16b05d58018c2806459c121e507c005639b74aee9Jim Miller/* 26b05d58018c2806459c121e507c005639b74aee9Jim Miller * Copyright (C) 2011 The Android Open Source Project 36b05d58018c2806459c121e507c005639b74aee9Jim Miller * 46b05d58018c2806459c121e507c005639b74aee9Jim Miller * Licensed under the Apache License, Version 2.0 (the "License"); 56b05d58018c2806459c121e507c005639b74aee9Jim Miller * you may not use this file except in compliance with the License. 66b05d58018c2806459c121e507c005639b74aee9Jim Miller * You may obtain a copy of the License at 76b05d58018c2806459c121e507c005639b74aee9Jim Miller * 86b05d58018c2806459c121e507c005639b74aee9Jim Miller * http://www.apache.org/licenses/LICENSE-2.0 96b05d58018c2806459c121e507c005639b74aee9Jim Miller * 106b05d58018c2806459c121e507c005639b74aee9Jim Miller * Unless required by applicable law or agreed to in writing, software 116b05d58018c2806459c121e507c005639b74aee9Jim Miller * distributed under the License is distributed on an "AS IS" BASIS, 126b05d58018c2806459c121e507c005639b74aee9Jim Miller * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 136b05d58018c2806459c121e507c005639b74aee9Jim Miller * See the License for the specific language governing permissions and 146b05d58018c2806459c121e507c005639b74aee9Jim Miller * limitations under the License. 156b05d58018c2806459c121e507c005639b74aee9Jim Miller */ 166b05d58018c2806459c121e507c005639b74aee9Jim Miller 176b05d58018c2806459c121e507c005639b74aee9Jim Millerpackage com.android.internal.policy.impl; 186b05d58018c2806459c121e507c005639b74aee9Jim Miller 196b05d58018c2806459c121e507c005639b74aee9Jim Millerimport com.android.internal.R; 206b05d58018c2806459c121e507c005639b74aee9Jim Millerimport com.android.internal.telephony.IccCard; 216b05d58018c2806459c121e507c005639b74aee9Jim Millerimport com.android.internal.telephony.IccCard.State; 22ce4a0c6f160241ea06e1f2000815094263dea70dJim Millerimport com.android.internal.widget.DigitalClock; 236b05d58018c2806459c121e507c005639b74aee9Jim Millerimport com.android.internal.widget.LockPatternUtils; 241c18828d20807342d37000746b18a3c1696f3b2eJim Millerimport com.android.internal.widget.TransportControlView; 256b05d58018c2806459c121e507c005639b74aee9Jim Millerimport com.android.internal.policy.impl.KeyguardUpdateMonitor.SimStateCallback; 266b05d58018c2806459c121e507c005639b74aee9Jim Miller 276b05d58018c2806459c121e507c005639b74aee9Jim Millerimport java.util.ArrayList; 286b05d58018c2806459c121e507c005639b74aee9Jim Millerimport java.util.Date; 296b05d58018c2806459c121e507c005639b74aee9Jim Miller 306b05d58018c2806459c121e507c005639b74aee9Jim Millerimport libcore.util.MutableInt; 316b05d58018c2806459c121e507c005639b74aee9Jim Miller 326b05d58018c2806459c121e507c005639b74aee9Jim Millerimport android.content.ContentResolver; 336b05d58018c2806459c121e507c005639b74aee9Jim Millerimport android.content.Context; 346b05d58018c2806459c121e507c005639b74aee9Jim Millerimport android.provider.Settings; 356b05d58018c2806459c121e507c005639b74aee9Jim Millerimport android.text.TextUtils; 366b05d58018c2806459c121e507c005639b74aee9Jim Millerimport android.text.format.DateFormat; 376b05d58018c2806459c121e507c005639b74aee9Jim Millerimport android.util.Log; 386b05d58018c2806459c121e507c005639b74aee9Jim Millerimport android.view.View; 396b05d58018c2806459c121e507c005639b74aee9Jim Millerimport android.view.View.OnClickListener; 406b05d58018c2806459c121e507c005639b74aee9Jim Millerimport android.widget.Button; 416b05d58018c2806459c121e507c005639b74aee9Jim Millerimport android.widget.TextView; 426b05d58018c2806459c121e507c005639b74aee9Jim Miller 436b05d58018c2806459c121e507c005639b74aee9Jim Miller/*** 446b05d58018c2806459c121e507c005639b74aee9Jim Miller * Manages a number of views inside of LockScreen layouts. See below for a list of widgets 456b05d58018c2806459c121e507c005639b74aee9Jim Miller * 466b05d58018c2806459c121e507c005639b74aee9Jim Miller */ 476b05d58018c2806459c121e507c005639b74aee9Jim Millerclass KeyguardStatusViewManager implements OnClickListener { 4829aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn private static final boolean DEBUG = false; 496b05d58018c2806459c121e507c005639b74aee9Jim Miller private static final String TAG = "KeyguardStatusView"; 506b05d58018c2806459c121e507c005639b74aee9Jim Miller 516b05d58018c2806459c121e507c005639b74aee9Jim Miller public static final int LOCK_ICON = 0; // R.drawable.ic_lock_idle_lock; 526b05d58018c2806459c121e507c005639b74aee9Jim Miller public static final int ALARM_ICON = R.drawable.ic_lock_idle_alarm; 536b05d58018c2806459c121e507c005639b74aee9Jim Miller public static final int CHARGING_ICON = 0; //R.drawable.ic_lock_idle_charging; 546b05d58018c2806459c121e507c005639b74aee9Jim Miller public static final int BATTERY_LOW_ICON = 0; //R.drawable.ic_lock_idle_low_battery; 556b05d58018c2806459c121e507c005639b74aee9Jim Miller private static final long INSTRUCTION_RESET_DELAY = 2000; // time until instruction text resets 566b05d58018c2806459c121e507c005639b74aee9Jim Miller 576b05d58018c2806459c121e507c005639b74aee9Jim Miller private static final int INSTRUCTION_TEXT = 10; 586b05d58018c2806459c121e507c005639b74aee9Jim Miller private static final int CARRIER_TEXT = 11; 596b05d58018c2806459c121e507c005639b74aee9Jim Miller private static final int CARRIER_HELP_TEXT = 12; 606b05d58018c2806459c121e507c005639b74aee9Jim Miller private static final int HELP_MESSAGE_TEXT = 13; 616b05d58018c2806459c121e507c005639b74aee9Jim Miller private static final int OWNER_INFO = 14; 623f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller private static final int BATTERY_INFO = 15; 636b05d58018c2806459c121e507c005639b74aee9Jim Miller 646b05d58018c2806459c121e507c005639b74aee9Jim Miller private StatusMode mStatus; 656b05d58018c2806459c121e507c005639b74aee9Jim Miller private String mDateFormatString; 666b05d58018c2806459c121e507c005639b74aee9Jim Miller private TransientTextManager mTransientTextManager; 676b05d58018c2806459c121e507c005639b74aee9Jim Miller 686b05d58018c2806459c121e507c005639b74aee9Jim Miller // Views that this class controls. 696b05d58018c2806459c121e507c005639b74aee9Jim Miller // NOTE: These may be null in some LockScreen screens and should protect from NPE 706b05d58018c2806459c121e507c005639b74aee9Jim Miller private TextView mCarrierView; 716b05d58018c2806459c121e507c005639b74aee9Jim Miller private TextView mDateView; 726b05d58018c2806459c121e507c005639b74aee9Jim Miller private TextView mStatus1View; 736b05d58018c2806459c121e507c005639b74aee9Jim Miller private TextView mOwnerInfoView; 746b05d58018c2806459c121e507c005639b74aee9Jim Miller private TextView mAlarmStatusView; 751c18828d20807342d37000746b18a3c1696f3b2eJim Miller private TransportControlView mTransportView; 766b05d58018c2806459c121e507c005639b74aee9Jim Miller 776b05d58018c2806459c121e507c005639b74aee9Jim Miller // Top-level container view for above views 786b05d58018c2806459c121e507c005639b74aee9Jim Miller private View mContainer; 796b05d58018c2806459c121e507c005639b74aee9Jim Miller 806b05d58018c2806459c121e507c005639b74aee9Jim Miller // are we showing battery information? 816b05d58018c2806459c121e507c005639b74aee9Jim Miller private boolean mShowingBatteryInfo = false; 826b05d58018c2806459c121e507c005639b74aee9Jim Miller 836b05d58018c2806459c121e507c005639b74aee9Jim Miller // last known plugged in state 846b05d58018c2806459c121e507c005639b74aee9Jim Miller private boolean mPluggedIn = false; 856b05d58018c2806459c121e507c005639b74aee9Jim Miller 866b05d58018c2806459c121e507c005639b74aee9Jim Miller // last known battery level 876b05d58018c2806459c121e507c005639b74aee9Jim Miller private int mBatteryLevel = 100; 886b05d58018c2806459c121e507c005639b74aee9Jim Miller 893f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller // last known SIM state 903f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller protected State mSimState; 913f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller 926b05d58018c2806459c121e507c005639b74aee9Jim Miller private LockPatternUtils mLockPatternUtils; 936b05d58018c2806459c121e507c005639b74aee9Jim Miller private KeyguardUpdateMonitor mUpdateMonitor; 946b05d58018c2806459c121e507c005639b74aee9Jim Miller private Button mEmergencyCallButton; 951f56edc6cd377eab05d9816e93591a7139cdff96Jim Miller private boolean mEmergencyButtonEnabledBecauseSimLocked; 966b05d58018c2806459c121e507c005639b74aee9Jim Miller 976b05d58018c2806459c121e507c005639b74aee9Jim Miller // Shadowed text values 986b05d58018c2806459c121e507c005639b74aee9Jim Miller private CharSequence mCarrierText; 996b05d58018c2806459c121e507c005639b74aee9Jim Miller private CharSequence mCarrierHelpText; 1006b05d58018c2806459c121e507c005639b74aee9Jim Miller private String mHelpMessageText; 1016b05d58018c2806459c121e507c005639b74aee9Jim Miller private String mInstructionText; 1026b05d58018c2806459c121e507c005639b74aee9Jim Miller private CharSequence mOwnerInfoText; 1036b05d58018c2806459c121e507c005639b74aee9Jim Miller private boolean mShowingStatus; 1046b05d58018c2806459c121e507c005639b74aee9Jim Miller private KeyguardScreenCallback mCallback; 1051f56edc6cd377eab05d9816e93591a7139cdff96Jim Miller private final boolean mEmergencyCallButtonEnabledInScreen; 1063f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller private CharSequence mPlmn; 1073f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller private CharSequence mSpn; 1081f56edc6cd377eab05d9816e93591a7139cdff96Jim Miller protected int mPhoneState; 109ce4a0c6f160241ea06e1f2000815094263dea70dJim Miller private DigitalClock mDigitalClock; 1106b05d58018c2806459c121e507c005639b74aee9Jim Miller 1116b05d58018c2806459c121e507c005639b74aee9Jim Miller private class TransientTextManager { 1126b05d58018c2806459c121e507c005639b74aee9Jim Miller private TextView mTextView; 1136b05d58018c2806459c121e507c005639b74aee9Jim Miller private class Data { 1146b05d58018c2806459c121e507c005639b74aee9Jim Miller final int icon; 1156b05d58018c2806459c121e507c005639b74aee9Jim Miller final CharSequence text; 1166b05d58018c2806459c121e507c005639b74aee9Jim Miller Data(CharSequence t, int i) { 1176b05d58018c2806459c121e507c005639b74aee9Jim Miller text = t; 1186b05d58018c2806459c121e507c005639b74aee9Jim Miller icon = i; 1196b05d58018c2806459c121e507c005639b74aee9Jim Miller } 1206b05d58018c2806459c121e507c005639b74aee9Jim Miller }; 1216b05d58018c2806459c121e507c005639b74aee9Jim Miller private ArrayList<Data> mMessages = new ArrayList<Data>(5); 1226b05d58018c2806459c121e507c005639b74aee9Jim Miller 1236b05d58018c2806459c121e507c005639b74aee9Jim Miller TransientTextManager(TextView textView) { 1246b05d58018c2806459c121e507c005639b74aee9Jim Miller mTextView = textView; 1256b05d58018c2806459c121e507c005639b74aee9Jim Miller } 1266b05d58018c2806459c121e507c005639b74aee9Jim Miller 1276b05d58018c2806459c121e507c005639b74aee9Jim Miller /* Show given message with icon for up to duration ms. Newer messages override older ones. 1286b05d58018c2806459c121e507c005639b74aee9Jim Miller * The most recent message with the longest duration is shown as messages expire until 1296b05d58018c2806459c121e507c005639b74aee9Jim Miller * nothing is left, in which case the text/icon is defined by a call to 1306b05d58018c2806459c121e507c005639b74aee9Jim Miller * getAltTextMessage() */ 1316b05d58018c2806459c121e507c005639b74aee9Jim Miller void post(final CharSequence message, final int icon, long duration) { 1326b05d58018c2806459c121e507c005639b74aee9Jim Miller if (mTextView == null) { 1336b05d58018c2806459c121e507c005639b74aee9Jim Miller return; 1346b05d58018c2806459c121e507c005639b74aee9Jim Miller } 1356b05d58018c2806459c121e507c005639b74aee9Jim Miller mTextView.setText(message); 1366b05d58018c2806459c121e507c005639b74aee9Jim Miller mTextView.setCompoundDrawablesWithIntrinsicBounds(icon, 0, 0, 0); 1376b05d58018c2806459c121e507c005639b74aee9Jim Miller final Data data = new Data(message, icon); 1386b05d58018c2806459c121e507c005639b74aee9Jim Miller mContainer.postDelayed(new Runnable() { 1396b05d58018c2806459c121e507c005639b74aee9Jim Miller public void run() { 1406b05d58018c2806459c121e507c005639b74aee9Jim Miller mMessages.remove(data); 1416b05d58018c2806459c121e507c005639b74aee9Jim Miller int last = mMessages.size() - 1; 1426b05d58018c2806459c121e507c005639b74aee9Jim Miller final CharSequence lastText; 1436b05d58018c2806459c121e507c005639b74aee9Jim Miller final int lastIcon; 1446b05d58018c2806459c121e507c005639b74aee9Jim Miller if (last > 0) { 1456b05d58018c2806459c121e507c005639b74aee9Jim Miller final Data oldData = mMessages.get(last); 1466b05d58018c2806459c121e507c005639b74aee9Jim Miller lastText = oldData.text; 1476b05d58018c2806459c121e507c005639b74aee9Jim Miller lastIcon = oldData.icon; 1486b05d58018c2806459c121e507c005639b74aee9Jim Miller } else { 1496b05d58018c2806459c121e507c005639b74aee9Jim Miller final MutableInt tmpIcon = new MutableInt(0); 1506b05d58018c2806459c121e507c005639b74aee9Jim Miller lastText = getAltTextMessage(tmpIcon); 1516b05d58018c2806459c121e507c005639b74aee9Jim Miller lastIcon = tmpIcon.value; 1526b05d58018c2806459c121e507c005639b74aee9Jim Miller } 1536b05d58018c2806459c121e507c005639b74aee9Jim Miller mTextView.setText(lastText); 1546b05d58018c2806459c121e507c005639b74aee9Jim Miller mTextView.setCompoundDrawablesWithIntrinsicBounds(lastIcon, 0, 0, 0); 1556b05d58018c2806459c121e507c005639b74aee9Jim Miller } 1566b05d58018c2806459c121e507c005639b74aee9Jim Miller }, duration); 1576b05d58018c2806459c121e507c005639b74aee9Jim Miller } 1586b05d58018c2806459c121e507c005639b74aee9Jim Miller }; 1596b05d58018c2806459c121e507c005639b74aee9Jim Miller 1601f56edc6cd377eab05d9816e93591a7139cdff96Jim Miller /** 1611f56edc6cd377eab05d9816e93591a7139cdff96Jim Miller * 1621f56edc6cd377eab05d9816e93591a7139cdff96Jim Miller * @param view the containing view of all widgets 1631f56edc6cd377eab05d9816e93591a7139cdff96Jim Miller * @param updateMonitor the update monitor to use 1641f56edc6cd377eab05d9816e93591a7139cdff96Jim Miller * @param lockPatternUtils lock pattern util object 1651f56edc6cd377eab05d9816e93591a7139cdff96Jim Miller * @param callback used to invoke emergency dialer 1661f56edc6cd377eab05d9816e93591a7139cdff96Jim Miller * @param emergencyButtonEnabledInScreen whether emergency button is enabled by default 1671f56edc6cd377eab05d9816e93591a7139cdff96Jim Miller */ 1686b05d58018c2806459c121e507c005639b74aee9Jim Miller public KeyguardStatusViewManager(View view, KeyguardUpdateMonitor updateMonitor, 169ebcd6bb1b9ac5f898621ba25c37f2e3ccd2ff33bAdam Cohen LockPatternUtils lockPatternUtils, KeyguardScreenCallback callback, 1701f56edc6cd377eab05d9816e93591a7139cdff96Jim Miller boolean emergencyButtonEnabledInScreen) { 1713f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller if (DEBUG) Log.v(TAG, "KeyguardStatusViewManager()"); 1726b05d58018c2806459c121e507c005639b74aee9Jim Miller mContainer = view; 173e5ae019b8cb3f4235b0d3e5eace27ce56680c60eJim Miller mDateFormatString = getContext().getString(R.string.abbrev_wday_month_day_no_year); 1746b05d58018c2806459c121e507c005639b74aee9Jim Miller mLockPatternUtils = lockPatternUtils; 1756b05d58018c2806459c121e507c005639b74aee9Jim Miller mUpdateMonitor = updateMonitor; 1766b05d58018c2806459c121e507c005639b74aee9Jim Miller mCallback = callback; 1776b05d58018c2806459c121e507c005639b74aee9Jim Miller 1786b05d58018c2806459c121e507c005639b74aee9Jim Miller mCarrierView = (TextView) findViewById(R.id.carrier); 1796b05d58018c2806459c121e507c005639b74aee9Jim Miller mDateView = (TextView) findViewById(R.id.date); 1806b05d58018c2806459c121e507c005639b74aee9Jim Miller mStatus1View = (TextView) findViewById(R.id.status1); 1816b05d58018c2806459c121e507c005639b74aee9Jim Miller mAlarmStatusView = (TextView) findViewById(R.id.alarm_status); 1826b05d58018c2806459c121e507c005639b74aee9Jim Miller mOwnerInfoView = (TextView) findViewById(R.id.propertyOf); 1831c18828d20807342d37000746b18a3c1696f3b2eJim Miller mTransportView = (TransportControlView) findViewById(R.id.transport); 1846b05d58018c2806459c121e507c005639b74aee9Jim Miller mEmergencyCallButton = (Button) findViewById(R.id.emergencyCallButton); 1851f56edc6cd377eab05d9816e93591a7139cdff96Jim Miller mEmergencyCallButtonEnabledInScreen = emergencyButtonEnabledInScreen; 186ce4a0c6f160241ea06e1f2000815094263dea70dJim Miller mDigitalClock = (DigitalClock) findViewById(R.id.time); 1873f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller 1883f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller // Hide transport control view until we know we need to show it. 1893f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller if (mTransportView != null) { 1903f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller mTransportView.setVisibility(View.GONE); 1913f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller } 1923f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller 1936b05d58018c2806459c121e507c005639b74aee9Jim Miller if (mEmergencyCallButton != null) { 1946b05d58018c2806459c121e507c005639b74aee9Jim Miller mEmergencyCallButton.setText(R.string.lockscreen_emergency_call); 1956b05d58018c2806459c121e507c005639b74aee9Jim Miller mEmergencyCallButton.setOnClickListener(this); 1966b05d58018c2806459c121e507c005639b74aee9Jim Miller mEmergencyCallButton.setFocusable(false); // touch only! 1976b05d58018c2806459c121e507c005639b74aee9Jim Miller } 1986b05d58018c2806459c121e507c005639b74aee9Jim Miller 1996b05d58018c2806459c121e507c005639b74aee9Jim Miller mTransientTextManager = new TransientTextManager(mCarrierView); 2006b05d58018c2806459c121e507c005639b74aee9Jim Miller 20119eb7014bd6d0751b21c2b00873c0fbf499abe61Jim Miller mUpdateMonitor.registerInfoCallback(mInfoCallback); 20219eb7014bd6d0751b21c2b00873c0fbf499abe61Jim Miller mUpdateMonitor.registerSimStateCallback(mSimStateCallback); 20319eb7014bd6d0751b21c2b00873c0fbf499abe61Jim Miller 2046b05d58018c2806459c121e507c005639b74aee9Jim Miller resetStatusInfo(); 2056b05d58018c2806459c121e507c005639b74aee9Jim Miller refreshDate(); 2066b05d58018c2806459c121e507c005639b74aee9Jim Miller updateOwnerInfo(); 2076b05d58018c2806459c121e507c005639b74aee9Jim Miller 2086b05d58018c2806459c121e507c005639b74aee9Jim Miller // Required to get Marquee to work. 2096b05d58018c2806459c121e507c005639b74aee9Jim Miller final View scrollableViews[] = { mCarrierView, mDateView, mStatus1View, mOwnerInfoView, 2106b05d58018c2806459c121e507c005639b74aee9Jim Miller mAlarmStatusView }; 2116b05d58018c2806459c121e507c005639b74aee9Jim Miller for (View v : scrollableViews) { 2126b05d58018c2806459c121e507c005639b74aee9Jim Miller if (v != null) { 2136b05d58018c2806459c121e507c005639b74aee9Jim Miller v.setSelected(true); 2146b05d58018c2806459c121e507c005639b74aee9Jim Miller } 2156b05d58018c2806459c121e507c005639b74aee9Jim Miller } 2166b05d58018c2806459c121e507c005639b74aee9Jim Miller } 2176b05d58018c2806459c121e507c005639b74aee9Jim Miller 2186b05d58018c2806459c121e507c005639b74aee9Jim Miller private boolean inWidgetMode() { 2196b05d58018c2806459c121e507c005639b74aee9Jim Miller return mTransportView != null && mTransportView.getVisibility() == View.VISIBLE; 2206b05d58018c2806459c121e507c005639b74aee9Jim Miller } 2216b05d58018c2806459c121e507c005639b74aee9Jim Miller 2226b05d58018c2806459c121e507c005639b74aee9Jim Miller void setInstructionText(String string) { 2236b05d58018c2806459c121e507c005639b74aee9Jim Miller mInstructionText = string; 2246b05d58018c2806459c121e507c005639b74aee9Jim Miller update(INSTRUCTION_TEXT, string); 2256b05d58018c2806459c121e507c005639b74aee9Jim Miller } 2266b05d58018c2806459c121e507c005639b74aee9Jim Miller 2276b05d58018c2806459c121e507c005639b74aee9Jim Miller void setCarrierText(CharSequence string) { 2286b05d58018c2806459c121e507c005639b74aee9Jim Miller mCarrierText = string; 2296b05d58018c2806459c121e507c005639b74aee9Jim Miller update(CARRIER_TEXT, string); 2306b05d58018c2806459c121e507c005639b74aee9Jim Miller } 2316b05d58018c2806459c121e507c005639b74aee9Jim Miller 2326b05d58018c2806459c121e507c005639b74aee9Jim Miller void setOwnerInfo(CharSequence string) { 2336b05d58018c2806459c121e507c005639b74aee9Jim Miller mOwnerInfoText = string; 2346b05d58018c2806459c121e507c005639b74aee9Jim Miller update(OWNER_INFO, string); 2356b05d58018c2806459c121e507c005639b74aee9Jim Miller } 2366b05d58018c2806459c121e507c005639b74aee9Jim Miller 2376b05d58018c2806459c121e507c005639b74aee9Jim Miller /** 2386b05d58018c2806459c121e507c005639b74aee9Jim Miller * Sets the carrier help text message, if view is present. Carrier help text messages are 2396b05d58018c2806459c121e507c005639b74aee9Jim Miller * typically for help dealing with SIMS and connectivity. 2406b05d58018c2806459c121e507c005639b74aee9Jim Miller * 2416b05d58018c2806459c121e507c005639b74aee9Jim Miller * @param resId resource id of the message 2426b05d58018c2806459c121e507c005639b74aee9Jim Miller */ 2436b05d58018c2806459c121e507c005639b74aee9Jim Miller public void setCarrierHelpText(int resId) { 244e0c2d8e5d4551f4d31c7129fb2062011b41e8dddJim Miller mCarrierHelpText = getText(resId); 2456b05d58018c2806459c121e507c005639b74aee9Jim Miller update(CARRIER_HELP_TEXT, mCarrierHelpText); 2466b05d58018c2806459c121e507c005639b74aee9Jim Miller } 2476b05d58018c2806459c121e507c005639b74aee9Jim Miller 248e0c2d8e5d4551f4d31c7129fb2062011b41e8dddJim Miller private CharSequence getText(int resId) { 249e0c2d8e5d4551f4d31c7129fb2062011b41e8dddJim Miller return resId == 0 ? null : getContext().getText(resId); 250e0c2d8e5d4551f4d31c7129fb2062011b41e8dddJim Miller } 251e0c2d8e5d4551f4d31c7129fb2062011b41e8dddJim Miller 2526b05d58018c2806459c121e507c005639b74aee9Jim Miller /** 2536b05d58018c2806459c121e507c005639b74aee9Jim Miller * Unlock help message. This is typically for help with unlock widgets, e.g. "wrong password" 2546b05d58018c2806459c121e507c005639b74aee9Jim Miller * or "try again." 2556b05d58018c2806459c121e507c005639b74aee9Jim Miller * 2566b05d58018c2806459c121e507c005639b74aee9Jim Miller * @param textResId 2576b05d58018c2806459c121e507c005639b74aee9Jim Miller * @param lockIcon 2586b05d58018c2806459c121e507c005639b74aee9Jim Miller */ 2596b05d58018c2806459c121e507c005639b74aee9Jim Miller public void setHelpMessage(int textResId, int lockIcon) { 2601c18828d20807342d37000746b18a3c1696f3b2eJim Miller final CharSequence tmp = getText(textResId); 2611c18828d20807342d37000746b18a3c1696f3b2eJim Miller mHelpMessageText = tmp == null ? null : tmp.toString(); 2626b05d58018c2806459c121e507c005639b74aee9Jim Miller update(HELP_MESSAGE_TEXT, mHelpMessageText); 2636b05d58018c2806459c121e507c005639b74aee9Jim Miller } 2646b05d58018c2806459c121e507c005639b74aee9Jim Miller 2656b05d58018c2806459c121e507c005639b74aee9Jim Miller private void update(int what, CharSequence string) { 2666b05d58018c2806459c121e507c005639b74aee9Jim Miller if (inWidgetMode()) { 2676b05d58018c2806459c121e507c005639b74aee9Jim Miller if (DEBUG) Log.v(TAG, "inWidgetMode() is true"); 2686b05d58018c2806459c121e507c005639b74aee9Jim Miller // Use Transient text for messages shown while widget is shown. 2696b05d58018c2806459c121e507c005639b74aee9Jim Miller switch (what) { 2706b05d58018c2806459c121e507c005639b74aee9Jim Miller case INSTRUCTION_TEXT: 2716b05d58018c2806459c121e507c005639b74aee9Jim Miller case CARRIER_HELP_TEXT: 2726b05d58018c2806459c121e507c005639b74aee9Jim Miller case HELP_MESSAGE_TEXT: 2733f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller case BATTERY_INFO: 2746b05d58018c2806459c121e507c005639b74aee9Jim Miller mTransientTextManager.post(string, 0, INSTRUCTION_RESET_DELAY); 2756b05d58018c2806459c121e507c005639b74aee9Jim Miller break; 2766b05d58018c2806459c121e507c005639b74aee9Jim Miller 2776b05d58018c2806459c121e507c005639b74aee9Jim Miller case OWNER_INFO: 2786b05d58018c2806459c121e507c005639b74aee9Jim Miller case CARRIER_TEXT: 2796b05d58018c2806459c121e507c005639b74aee9Jim Miller default: 280f3447351f7571b5ab3c2a59832d9497bde4f6776Jim Miller if (DEBUG) Log.w(TAG, "Not showing message id " + what + ", str=" + string); 2816b05d58018c2806459c121e507c005639b74aee9Jim Miller } 2826b05d58018c2806459c121e507c005639b74aee9Jim Miller } else { 2836b05d58018c2806459c121e507c005639b74aee9Jim Miller updateStatusLines(mShowingStatus); 2846b05d58018c2806459c121e507c005639b74aee9Jim Miller } 2856b05d58018c2806459c121e507c005639b74aee9Jim Miller } 2866b05d58018c2806459c121e507c005639b74aee9Jim Miller 2876b05d58018c2806459c121e507c005639b74aee9Jim Miller public void onPause() { 2883f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller if (DEBUG) Log.v(TAG, "onPause()"); 2896b05d58018c2806459c121e507c005639b74aee9Jim Miller mUpdateMonitor.removeCallback(mInfoCallback); 2906b05d58018c2806459c121e507c005639b74aee9Jim Miller mUpdateMonitor.removeCallback(mSimStateCallback); 2916b05d58018c2806459c121e507c005639b74aee9Jim Miller } 2926b05d58018c2806459c121e507c005639b74aee9Jim Miller 2936b05d58018c2806459c121e507c005639b74aee9Jim Miller /** {@inheritDoc} */ 2946b05d58018c2806459c121e507c005639b74aee9Jim Miller public void onResume() { 2953f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller if (DEBUG) Log.v(TAG, "onResume()"); 296ce4a0c6f160241ea06e1f2000815094263dea70dJim Miller 297ce4a0c6f160241ea06e1f2000815094263dea70dJim Miller // First update the clock 298ce4a0c6f160241ea06e1f2000815094263dea70dJim Miller mDigitalClock.updateTime(); 299ce4a0c6f160241ea06e1f2000815094263dea70dJim Miller 3006b05d58018c2806459c121e507c005639b74aee9Jim Miller mUpdateMonitor.registerInfoCallback(mInfoCallback); 3016b05d58018c2806459c121e507c005639b74aee9Jim Miller mUpdateMonitor.registerSimStateCallback(mSimStateCallback); 3026b05d58018c2806459c121e507c005639b74aee9Jim Miller resetStatusInfo(); 303b9430d2a1c8dbf7b9998d349544c9ae133dab18fSteven Ross //Issue the faceunlock failure message in a centralized place 304b9430d2a1c8dbf7b9998d349544c9ae133dab18fSteven Ross if (mUpdateMonitor.getMaxFaceUnlockAttemptsReached()) { 305b9430d2a1c8dbf7b9998d349544c9ae133dab18fSteven Ross setInstructionText(getContext().getString(R.string.faceunlock_multiple_failures)); 306b9430d2a1c8dbf7b9998d349544c9ae133dab18fSteven Ross } 3076b05d58018c2806459c121e507c005639b74aee9Jim Miller } 3086b05d58018c2806459c121e507c005639b74aee9Jim Miller 3096b05d58018c2806459c121e507c005639b74aee9Jim Miller void resetStatusInfo() { 3106b05d58018c2806459c121e507c005639b74aee9Jim Miller mInstructionText = null; 3116b05d58018c2806459c121e507c005639b74aee9Jim Miller mShowingBatteryInfo = mUpdateMonitor.shouldShowBatteryInfo(); 3126b05d58018c2806459c121e507c005639b74aee9Jim Miller mPluggedIn = mUpdateMonitor.isDevicePluggedIn(); 3136b05d58018c2806459c121e507c005639b74aee9Jim Miller mBatteryLevel = mUpdateMonitor.getBatteryLevel(); 3146b05d58018c2806459c121e507c005639b74aee9Jim Miller updateStatusLines(true); 3156b05d58018c2806459c121e507c005639b74aee9Jim Miller } 3166b05d58018c2806459c121e507c005639b74aee9Jim Miller 3176b05d58018c2806459c121e507c005639b74aee9Jim Miller /** 3186b05d58018c2806459c121e507c005639b74aee9Jim Miller * Update the status lines based on these rules: 3196b05d58018c2806459c121e507c005639b74aee9Jim Miller * AlarmStatus: Alarm state always gets it's own line. 3206b05d58018c2806459c121e507c005639b74aee9Jim Miller * Status1 is shared between help, battery status and generic unlock instructions, 3216b05d58018c2806459c121e507c005639b74aee9Jim Miller * prioritized in that order. 3226b05d58018c2806459c121e507c005639b74aee9Jim Miller * @param showStatusLines status lines are shown if true 3236b05d58018c2806459c121e507c005639b74aee9Jim Miller */ 3246b05d58018c2806459c121e507c005639b74aee9Jim Miller void updateStatusLines(boolean showStatusLines) { 3256b05d58018c2806459c121e507c005639b74aee9Jim Miller if (DEBUG) Log.v(TAG, "updateStatusLines(" + showStatusLines + ")"); 3266b05d58018c2806459c121e507c005639b74aee9Jim Miller mShowingStatus = showStatusLines; 3276b05d58018c2806459c121e507c005639b74aee9Jim Miller updateAlarmInfo(); 3286b05d58018c2806459c121e507c005639b74aee9Jim Miller updateOwnerInfo(); 3296b05d58018c2806459c121e507c005639b74aee9Jim Miller updateStatus1(); 3306b05d58018c2806459c121e507c005639b74aee9Jim Miller updateCarrierText(); 3316b05d58018c2806459c121e507c005639b74aee9Jim Miller } 3326b05d58018c2806459c121e507c005639b74aee9Jim Miller 3336b05d58018c2806459c121e507c005639b74aee9Jim Miller private void updateAlarmInfo() { 3346b05d58018c2806459c121e507c005639b74aee9Jim Miller if (mAlarmStatusView != null) { 3356b05d58018c2806459c121e507c005639b74aee9Jim Miller String nextAlarm = mLockPatternUtils.getNextAlarm(); 3366b05d58018c2806459c121e507c005639b74aee9Jim Miller boolean showAlarm = mShowingStatus && !TextUtils.isEmpty(nextAlarm); 3376b05d58018c2806459c121e507c005639b74aee9Jim Miller mAlarmStatusView.setText(nextAlarm); 3386b05d58018c2806459c121e507c005639b74aee9Jim Miller mAlarmStatusView.setCompoundDrawablesWithIntrinsicBounds(ALARM_ICON, 0, 0, 0); 3396b05d58018c2806459c121e507c005639b74aee9Jim Miller mAlarmStatusView.setVisibility(showAlarm ? View.VISIBLE : View.GONE); 3406b05d58018c2806459c121e507c005639b74aee9Jim Miller } 3416b05d58018c2806459c121e507c005639b74aee9Jim Miller } 3426b05d58018c2806459c121e507c005639b74aee9Jim Miller 3436b05d58018c2806459c121e507c005639b74aee9Jim Miller private void updateOwnerInfo() { 3446b05d58018c2806459c121e507c005639b74aee9Jim Miller final ContentResolver res = getContext().getContentResolver(); 3456b05d58018c2806459c121e507c005639b74aee9Jim Miller final boolean ownerInfoEnabled = Settings.Secure.getInt(res, 3466b05d58018c2806459c121e507c005639b74aee9Jim Miller Settings.Secure.LOCK_SCREEN_OWNER_INFO_ENABLED, 1) != 0; 3476b05d58018c2806459c121e507c005639b74aee9Jim Miller mOwnerInfoText = ownerInfoEnabled ? 3486b05d58018c2806459c121e507c005639b74aee9Jim Miller Settings.Secure.getString(res, Settings.Secure.LOCK_SCREEN_OWNER_INFO) : null; 3496b05d58018c2806459c121e507c005639b74aee9Jim Miller if (mOwnerInfoView != null) { 3506b05d58018c2806459c121e507c005639b74aee9Jim Miller mOwnerInfoView.setText(mOwnerInfoText); 3516b05d58018c2806459c121e507c005639b74aee9Jim Miller mOwnerInfoView.setVisibility(TextUtils.isEmpty(mOwnerInfoText) ? View.GONE:View.VISIBLE); 3526b05d58018c2806459c121e507c005639b74aee9Jim Miller } 3536b05d58018c2806459c121e507c005639b74aee9Jim Miller } 3546b05d58018c2806459c121e507c005639b74aee9Jim Miller 3556b05d58018c2806459c121e507c005639b74aee9Jim Miller private void updateStatus1() { 3566b05d58018c2806459c121e507c005639b74aee9Jim Miller if (mStatus1View != null) { 3576b05d58018c2806459c121e507c005639b74aee9Jim Miller MutableInt icon = new MutableInt(0); 3586b05d58018c2806459c121e507c005639b74aee9Jim Miller CharSequence string = getPriorityTextMessage(icon); 3596b05d58018c2806459c121e507c005639b74aee9Jim Miller mStatus1View.setText(string); 3606b05d58018c2806459c121e507c005639b74aee9Jim Miller mStatus1View.setCompoundDrawablesWithIntrinsicBounds(icon.value, 0, 0, 0); 3616b05d58018c2806459c121e507c005639b74aee9Jim Miller mStatus1View.setVisibility(mShowingStatus ? View.VISIBLE : View.INVISIBLE); 3626b05d58018c2806459c121e507c005639b74aee9Jim Miller } 3636b05d58018c2806459c121e507c005639b74aee9Jim Miller } 3646b05d58018c2806459c121e507c005639b74aee9Jim Miller 3656b05d58018c2806459c121e507c005639b74aee9Jim Miller private void updateCarrierText() { 3666b05d58018c2806459c121e507c005639b74aee9Jim Miller if (!inWidgetMode() && mCarrierView != null) { 3676b05d58018c2806459c121e507c005639b74aee9Jim Miller mCarrierView.setText(mCarrierText); 3686b05d58018c2806459c121e507c005639b74aee9Jim Miller } 3696b05d58018c2806459c121e507c005639b74aee9Jim Miller } 3706b05d58018c2806459c121e507c005639b74aee9Jim Miller 3716b05d58018c2806459c121e507c005639b74aee9Jim Miller private CharSequence getAltTextMessage(MutableInt icon) { 3726b05d58018c2806459c121e507c005639b74aee9Jim Miller // If we have replaced the status area with a single widget, then this code 3736b05d58018c2806459c121e507c005639b74aee9Jim Miller // prioritizes what to show in that space when all transient messages are gone. 3746b05d58018c2806459c121e507c005639b74aee9Jim Miller CharSequence string = null; 3756b05d58018c2806459c121e507c005639b74aee9Jim Miller if (mShowingBatteryInfo) { 3766b05d58018c2806459c121e507c005639b74aee9Jim Miller // Battery status 3776b05d58018c2806459c121e507c005639b74aee9Jim Miller if (mPluggedIn) { 3786b05d58018c2806459c121e507c005639b74aee9Jim Miller // Charging or charged 3796b05d58018c2806459c121e507c005639b74aee9Jim Miller if (mUpdateMonitor.isDeviceCharged()) { 3806b05d58018c2806459c121e507c005639b74aee9Jim Miller string = getContext().getString(R.string.lockscreen_charged); 3816b05d58018c2806459c121e507c005639b74aee9Jim Miller } else { 3826b05d58018c2806459c121e507c005639b74aee9Jim Miller string = getContext().getString(R.string.lockscreen_plugged_in, mBatteryLevel); 3836b05d58018c2806459c121e507c005639b74aee9Jim Miller } 3846b05d58018c2806459c121e507c005639b74aee9Jim Miller icon.value = CHARGING_ICON; 3856b05d58018c2806459c121e507c005639b74aee9Jim Miller } else if (mBatteryLevel < KeyguardUpdateMonitor.LOW_BATTERY_THRESHOLD) { 3866b05d58018c2806459c121e507c005639b74aee9Jim Miller // Battery is low 3876b05d58018c2806459c121e507c005639b74aee9Jim Miller string = getContext().getString(R.string.lockscreen_low_battery); 3886b05d58018c2806459c121e507c005639b74aee9Jim Miller icon.value = BATTERY_LOW_ICON; 3896b05d58018c2806459c121e507c005639b74aee9Jim Miller } 3906b05d58018c2806459c121e507c005639b74aee9Jim Miller } else { 3916b05d58018c2806459c121e507c005639b74aee9Jim Miller string = mCarrierText; 3926b05d58018c2806459c121e507c005639b74aee9Jim Miller } 3936b05d58018c2806459c121e507c005639b74aee9Jim Miller return string; 3946b05d58018c2806459c121e507c005639b74aee9Jim Miller } 3956b05d58018c2806459c121e507c005639b74aee9Jim Miller 3966b05d58018c2806459c121e507c005639b74aee9Jim Miller private CharSequence getPriorityTextMessage(MutableInt icon) { 3976b05d58018c2806459c121e507c005639b74aee9Jim Miller CharSequence string = null; 3986b05d58018c2806459c121e507c005639b74aee9Jim Miller if (!TextUtils.isEmpty(mInstructionText)) { 3996b05d58018c2806459c121e507c005639b74aee9Jim Miller // Instructions only 4006b05d58018c2806459c121e507c005639b74aee9Jim Miller string = mInstructionText; 4016b05d58018c2806459c121e507c005639b74aee9Jim Miller icon.value = LOCK_ICON; 4026b05d58018c2806459c121e507c005639b74aee9Jim Miller } else if (mShowingBatteryInfo) { 4036b05d58018c2806459c121e507c005639b74aee9Jim Miller // Battery status 4046b05d58018c2806459c121e507c005639b74aee9Jim Miller if (mPluggedIn) { 4056b05d58018c2806459c121e507c005639b74aee9Jim Miller // Charging or charged 4066b05d58018c2806459c121e507c005639b74aee9Jim Miller if (mUpdateMonitor.isDeviceCharged()) { 4076b05d58018c2806459c121e507c005639b74aee9Jim Miller string = getContext().getString(R.string.lockscreen_charged); 4086b05d58018c2806459c121e507c005639b74aee9Jim Miller } else { 4096b05d58018c2806459c121e507c005639b74aee9Jim Miller string = getContext().getString(R.string.lockscreen_plugged_in, mBatteryLevel); 4106b05d58018c2806459c121e507c005639b74aee9Jim Miller } 4116b05d58018c2806459c121e507c005639b74aee9Jim Miller icon.value = CHARGING_ICON; 4126b05d58018c2806459c121e507c005639b74aee9Jim Miller } else if (mBatteryLevel < KeyguardUpdateMonitor.LOW_BATTERY_THRESHOLD) { 4136b05d58018c2806459c121e507c005639b74aee9Jim Miller // Battery is low 4146b05d58018c2806459c121e507c005639b74aee9Jim Miller string = getContext().getString(R.string.lockscreen_low_battery); 4156b05d58018c2806459c121e507c005639b74aee9Jim Miller icon.value = BATTERY_LOW_ICON; 4166b05d58018c2806459c121e507c005639b74aee9Jim Miller } 4176b05d58018c2806459c121e507c005639b74aee9Jim Miller } else if (!inWidgetMode() && mOwnerInfoView == null && mOwnerInfoText != null) { 4186b05d58018c2806459c121e507c005639b74aee9Jim Miller // OwnerInfo shows in status if we don't have a dedicated widget 4196b05d58018c2806459c121e507c005639b74aee9Jim Miller string = mOwnerInfoText; 4206b05d58018c2806459c121e507c005639b74aee9Jim Miller } 4216b05d58018c2806459c121e507c005639b74aee9Jim Miller return string; 4226b05d58018c2806459c121e507c005639b74aee9Jim Miller } 4236b05d58018c2806459c121e507c005639b74aee9Jim Miller 4246b05d58018c2806459c121e507c005639b74aee9Jim Miller void refreshDate() { 4256b05d58018c2806459c121e507c005639b74aee9Jim Miller if (mDateView != null) { 4266b05d58018c2806459c121e507c005639b74aee9Jim Miller mDateView.setText(DateFormat.format(mDateFormatString, new Date())); 4276b05d58018c2806459c121e507c005639b74aee9Jim Miller } 4286b05d58018c2806459c121e507c005639b74aee9Jim Miller } 4296b05d58018c2806459c121e507c005639b74aee9Jim Miller 4306b05d58018c2806459c121e507c005639b74aee9Jim Miller /** 4316b05d58018c2806459c121e507c005639b74aee9Jim Miller * Determine the current status of the lock screen given the sim state and other stuff. 4326b05d58018c2806459c121e507c005639b74aee9Jim Miller */ 4336b05d58018c2806459c121e507c005639b74aee9Jim Miller public StatusMode getStatusForIccState(IccCard.State simState) { 4343f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller // Since reading the SIM may take a while, we assume it is present until told otherwise. 4353f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller if (simState == null) { 4363f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller return StatusMode.Normal; 4373f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller } 4383f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller 4393f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller final boolean missingAndNotProvisioned = (!mUpdateMonitor.isDeviceProvisioned() 4406b05d58018c2806459c121e507c005639b74aee9Jim Miller && (simState == IccCard.State.ABSENT || simState == IccCard.State.PERM_DISABLED)); 4416b05d58018c2806459c121e507c005639b74aee9Jim Miller 4426b05d58018c2806459c121e507c005639b74aee9Jim Miller // Assume we're NETWORK_LOCKED if not provisioned 4436b05d58018c2806459c121e507c005639b74aee9Jim Miller simState = missingAndNotProvisioned ? State.NETWORK_LOCKED : simState; 4446b05d58018c2806459c121e507c005639b74aee9Jim Miller switch (simState) { 4456b05d58018c2806459c121e507c005639b74aee9Jim Miller case ABSENT: 4466b05d58018c2806459c121e507c005639b74aee9Jim Miller return StatusMode.SimMissing; 4476b05d58018c2806459c121e507c005639b74aee9Jim Miller case NETWORK_LOCKED: 4486b05d58018c2806459c121e507c005639b74aee9Jim Miller return StatusMode.SimMissingLocked; 4496b05d58018c2806459c121e507c005639b74aee9Jim Miller case NOT_READY: 4506b05d58018c2806459c121e507c005639b74aee9Jim Miller return StatusMode.SimMissing; 4516b05d58018c2806459c121e507c005639b74aee9Jim Miller case PIN_REQUIRED: 4526b05d58018c2806459c121e507c005639b74aee9Jim Miller return StatusMode.SimLocked; 4536b05d58018c2806459c121e507c005639b74aee9Jim Miller case PUK_REQUIRED: 4546b05d58018c2806459c121e507c005639b74aee9Jim Miller return StatusMode.SimPukLocked; 4556b05d58018c2806459c121e507c005639b74aee9Jim Miller case READY: 4566b05d58018c2806459c121e507c005639b74aee9Jim Miller return StatusMode.Normal; 4576b05d58018c2806459c121e507c005639b74aee9Jim Miller case PERM_DISABLED: 4586b05d58018c2806459c121e507c005639b74aee9Jim Miller return StatusMode.SimPermDisabled; 4596b05d58018c2806459c121e507c005639b74aee9Jim Miller case UNKNOWN: 4606b05d58018c2806459c121e507c005639b74aee9Jim Miller return StatusMode.SimMissing; 4616b05d58018c2806459c121e507c005639b74aee9Jim Miller } 4626b05d58018c2806459c121e507c005639b74aee9Jim Miller return StatusMode.SimMissing; 4636b05d58018c2806459c121e507c005639b74aee9Jim Miller } 4646b05d58018c2806459c121e507c005639b74aee9Jim Miller 4656b05d58018c2806459c121e507c005639b74aee9Jim Miller private Context getContext() { 4666b05d58018c2806459c121e507c005639b74aee9Jim Miller return mContainer.getContext(); 4676b05d58018c2806459c121e507c005639b74aee9Jim Miller } 4686b05d58018c2806459c121e507c005639b74aee9Jim Miller 4696b05d58018c2806459c121e507c005639b74aee9Jim Miller /** 4706b05d58018c2806459c121e507c005639b74aee9Jim Miller * Update carrier text, carrier help and emergency button to match the current status based 4716b05d58018c2806459c121e507c005639b74aee9Jim Miller * on SIM state. 4726b05d58018c2806459c121e507c005639b74aee9Jim Miller * 4736b05d58018c2806459c121e507c005639b74aee9Jim Miller * @param simState 4746b05d58018c2806459c121e507c005639b74aee9Jim Miller */ 4751f56edc6cd377eab05d9816e93591a7139cdff96Jim Miller private void updateCarrierStateWithSimStatus(State simState) { 4763f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller if (DEBUG) Log.d(TAG, "updateCarrierTextWithSimStatus(), simState = " + simState); 4776b05d58018c2806459c121e507c005639b74aee9Jim Miller 4786b05d58018c2806459c121e507c005639b74aee9Jim Miller CharSequence carrierText = null; 4796b05d58018c2806459c121e507c005639b74aee9Jim Miller int carrierHelpTextId = 0; 4801f56edc6cd377eab05d9816e93591a7139cdff96Jim Miller mEmergencyButtonEnabledBecauseSimLocked = false; 4816b05d58018c2806459c121e507c005639b74aee9Jim Miller mStatus = getStatusForIccState(simState); 4823f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller mSimState = simState; 4836b05d58018c2806459c121e507c005639b74aee9Jim Miller switch (mStatus) { 4846b05d58018c2806459c121e507c005639b74aee9Jim Miller case Normal: 4853f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller carrierText = makeCarierString(mPlmn, mSpn); 4866b05d58018c2806459c121e507c005639b74aee9Jim Miller break; 4876b05d58018c2806459c121e507c005639b74aee9Jim Miller 4886b05d58018c2806459c121e507c005639b74aee9Jim Miller case NetworkLocked: 489088f1628991cc63401d12ce2e979f0520696693bJohn Wang carrierText = makeCarrierStringOnEmergencyCapable( 490088f1628991cc63401d12ce2e979f0520696693bJohn Wang getContext().getText(R.string.lockscreen_network_locked_message), 491088f1628991cc63401d12ce2e979f0520696693bJohn Wang mPlmn); 4926b05d58018c2806459c121e507c005639b74aee9Jim Miller carrierHelpTextId = R.string.lockscreen_instructions_when_pattern_disabled; 4936b05d58018c2806459c121e507c005639b74aee9Jim Miller break; 4946b05d58018c2806459c121e507c005639b74aee9Jim Miller 4956b05d58018c2806459c121e507c005639b74aee9Jim Miller case SimMissing: 4962fcd63b8cf94a947498f0aab24b9d702a6fe909bJim Miller // Shows "No SIM card | Emergency calls only" on devices that are voice-capable. 4972fcd63b8cf94a947498f0aab24b9d702a6fe909bJim Miller // This depends on mPlmn containing the text "Emergency calls only" when the radio 4982fcd63b8cf94a947498f0aab24b9d702a6fe909bJim Miller // has some connectivity. Otherwise, it should be null or empty and just show 4992fcd63b8cf94a947498f0aab24b9d702a6fe909bJim Miller // "No SIM card" 500088f1628991cc63401d12ce2e979f0520696693bJohn Wang carrierText = makeCarrierStringOnEmergencyCapable( 501088f1628991cc63401d12ce2e979f0520696693bJohn Wang getContext().getText(R.string.lockscreen_missing_sim_message_short), 502088f1628991cc63401d12ce2e979f0520696693bJohn Wang mPlmn); 5036b05d58018c2806459c121e507c005639b74aee9Jim Miller carrierHelpTextId = R.string.lockscreen_missing_sim_instructions_long; 5046b05d58018c2806459c121e507c005639b74aee9Jim Miller break; 5056b05d58018c2806459c121e507c005639b74aee9Jim Miller 5066b05d58018c2806459c121e507c005639b74aee9Jim Miller case SimPermDisabled: 5076b05d58018c2806459c121e507c005639b74aee9Jim Miller carrierText = getContext().getText(R.string.lockscreen_missing_sim_message_short); 5086b05d58018c2806459c121e507c005639b74aee9Jim Miller carrierHelpTextId = R.string.lockscreen_permanent_disabled_sim_instructions; 5091f56edc6cd377eab05d9816e93591a7139cdff96Jim Miller mEmergencyButtonEnabledBecauseSimLocked = true; 5106b05d58018c2806459c121e507c005639b74aee9Jim Miller break; 5116b05d58018c2806459c121e507c005639b74aee9Jim Miller 5126b05d58018c2806459c121e507c005639b74aee9Jim Miller case SimMissingLocked: 513088f1628991cc63401d12ce2e979f0520696693bJohn Wang carrierText = makeCarrierStringOnEmergencyCapable( 514088f1628991cc63401d12ce2e979f0520696693bJohn Wang getContext().getText(R.string.lockscreen_missing_sim_message_short), 515088f1628991cc63401d12ce2e979f0520696693bJohn Wang mPlmn); 5166b05d58018c2806459c121e507c005639b74aee9Jim Miller carrierHelpTextId = R.string.lockscreen_missing_sim_instructions; 5171f56edc6cd377eab05d9816e93591a7139cdff96Jim Miller mEmergencyButtonEnabledBecauseSimLocked = true; 5186b05d58018c2806459c121e507c005639b74aee9Jim Miller break; 5196b05d58018c2806459c121e507c005639b74aee9Jim Miller 5206b05d58018c2806459c121e507c005639b74aee9Jim Miller case SimLocked: 521088f1628991cc63401d12ce2e979f0520696693bJohn Wang carrierText = makeCarrierStringOnEmergencyCapable( 522088f1628991cc63401d12ce2e979f0520696693bJohn Wang getContext().getText(R.string.lockscreen_sim_locked_message), 523088f1628991cc63401d12ce2e979f0520696693bJohn Wang mPlmn); 5241f56edc6cd377eab05d9816e93591a7139cdff96Jim Miller mEmergencyButtonEnabledBecauseSimLocked = true; 5256b05d58018c2806459c121e507c005639b74aee9Jim Miller break; 5266b05d58018c2806459c121e507c005639b74aee9Jim Miller 5276b05d58018c2806459c121e507c005639b74aee9Jim Miller case SimPukLocked: 528088f1628991cc63401d12ce2e979f0520696693bJohn Wang carrierText = makeCarrierStringOnEmergencyCapable( 529088f1628991cc63401d12ce2e979f0520696693bJohn Wang getContext().getText(R.string.lockscreen_sim_puk_locked_message), 530088f1628991cc63401d12ce2e979f0520696693bJohn Wang mPlmn); 5316b05d58018c2806459c121e507c005639b74aee9Jim Miller if (!mLockPatternUtils.isPukUnlockScreenEnable()) { 5321f56edc6cd377eab05d9816e93591a7139cdff96Jim Miller // This means we're showing the PUK unlock screen 5331f56edc6cd377eab05d9816e93591a7139cdff96Jim Miller mEmergencyButtonEnabledBecauseSimLocked = true; 5346b05d58018c2806459c121e507c005639b74aee9Jim Miller } 5356b05d58018c2806459c121e507c005639b74aee9Jim Miller break; 5366b05d58018c2806459c121e507c005639b74aee9Jim Miller } 5376b05d58018c2806459c121e507c005639b74aee9Jim Miller 5386b05d58018c2806459c121e507c005639b74aee9Jim Miller setCarrierText(carrierText); 5396b05d58018c2806459c121e507c005639b74aee9Jim Miller setCarrierHelpText(carrierHelpTextId); 5401f56edc6cd377eab05d9816e93591a7139cdff96Jim Miller updateEmergencyCallButtonState(mPhoneState); 5416b05d58018c2806459c121e507c005639b74aee9Jim Miller } 5426b05d58018c2806459c121e507c005639b74aee9Jim Miller 543088f1628991cc63401d12ce2e979f0520696693bJohn Wang 544088f1628991cc63401d12ce2e979f0520696693bJohn Wang /* 545088f1628991cc63401d12ce2e979f0520696693bJohn Wang * Add emergencyCallMessage to carrier string only if phone supports emergency calls. 546088f1628991cc63401d12ce2e979f0520696693bJohn Wang */ 547088f1628991cc63401d12ce2e979f0520696693bJohn Wang private CharSequence makeCarrierStringOnEmergencyCapable( 548088f1628991cc63401d12ce2e979f0520696693bJohn Wang CharSequence simMessage, CharSequence emergencyCallMessage) { 549088f1628991cc63401d12ce2e979f0520696693bJohn Wang if (mLockPatternUtils.isEmergencyCallCapable()) { 550088f1628991cc63401d12ce2e979f0520696693bJohn Wang return makeCarierString(simMessage, emergencyCallMessage); 551088f1628991cc63401d12ce2e979f0520696693bJohn Wang } 552088f1628991cc63401d12ce2e979f0520696693bJohn Wang return simMessage; 553088f1628991cc63401d12ce2e979f0520696693bJohn Wang } 554088f1628991cc63401d12ce2e979f0520696693bJohn Wang 5556b05d58018c2806459c121e507c005639b74aee9Jim Miller private View findViewById(int id) { 5566b05d58018c2806459c121e507c005639b74aee9Jim Miller return mContainer.findViewById(id); 5576b05d58018c2806459c121e507c005639b74aee9Jim Miller } 5586b05d58018c2806459c121e507c005639b74aee9Jim Miller 5596b05d58018c2806459c121e507c005639b74aee9Jim Miller /** 5606b05d58018c2806459c121e507c005639b74aee9Jim Miller * The status of this lock screen. Primarily used for widgets on LockScreen. 5616b05d58018c2806459c121e507c005639b74aee9Jim Miller */ 5626b05d58018c2806459c121e507c005639b74aee9Jim Miller enum StatusMode { 5636b05d58018c2806459c121e507c005639b74aee9Jim Miller /** 5646b05d58018c2806459c121e507c005639b74aee9Jim Miller * Normal case (sim card present, it's not locked) 5656b05d58018c2806459c121e507c005639b74aee9Jim Miller */ 5666b05d58018c2806459c121e507c005639b74aee9Jim Miller Normal(true), 5676b05d58018c2806459c121e507c005639b74aee9Jim Miller 5686b05d58018c2806459c121e507c005639b74aee9Jim Miller /** 5696b05d58018c2806459c121e507c005639b74aee9Jim Miller * The sim card is 'network locked'. 5706b05d58018c2806459c121e507c005639b74aee9Jim Miller */ 5716b05d58018c2806459c121e507c005639b74aee9Jim Miller NetworkLocked(true), 5726b05d58018c2806459c121e507c005639b74aee9Jim Miller 5736b05d58018c2806459c121e507c005639b74aee9Jim Miller /** 5746b05d58018c2806459c121e507c005639b74aee9Jim Miller * The sim card is missing. 5756b05d58018c2806459c121e507c005639b74aee9Jim Miller */ 5766b05d58018c2806459c121e507c005639b74aee9Jim Miller SimMissing(false), 5776b05d58018c2806459c121e507c005639b74aee9Jim Miller 5786b05d58018c2806459c121e507c005639b74aee9Jim Miller /** 5796b05d58018c2806459c121e507c005639b74aee9Jim Miller * The sim card is missing, and this is the device isn't provisioned, so we don't let 5806b05d58018c2806459c121e507c005639b74aee9Jim Miller * them get past the screen. 5816b05d58018c2806459c121e507c005639b74aee9Jim Miller */ 5826b05d58018c2806459c121e507c005639b74aee9Jim Miller SimMissingLocked(false), 5836b05d58018c2806459c121e507c005639b74aee9Jim Miller 5846b05d58018c2806459c121e507c005639b74aee9Jim Miller /** 5856b05d58018c2806459c121e507c005639b74aee9Jim Miller * The sim card is PUK locked, meaning they've entered the wrong sim unlock code too many 5866b05d58018c2806459c121e507c005639b74aee9Jim Miller * times. 5876b05d58018c2806459c121e507c005639b74aee9Jim Miller */ 5886b05d58018c2806459c121e507c005639b74aee9Jim Miller SimPukLocked(false), 5896b05d58018c2806459c121e507c005639b74aee9Jim Miller 5906b05d58018c2806459c121e507c005639b74aee9Jim Miller /** 5916b05d58018c2806459c121e507c005639b74aee9Jim Miller * The sim card is locked. 5926b05d58018c2806459c121e507c005639b74aee9Jim Miller */ 5936b05d58018c2806459c121e507c005639b74aee9Jim Miller SimLocked(true), 5946b05d58018c2806459c121e507c005639b74aee9Jim Miller 5956b05d58018c2806459c121e507c005639b74aee9Jim Miller /** 5966b05d58018c2806459c121e507c005639b74aee9Jim Miller * The sim card is permanently disabled due to puk unlock failure 5976b05d58018c2806459c121e507c005639b74aee9Jim Miller */ 5986b05d58018c2806459c121e507c005639b74aee9Jim Miller SimPermDisabled(false); 5996b05d58018c2806459c121e507c005639b74aee9Jim Miller 6006b05d58018c2806459c121e507c005639b74aee9Jim Miller private final boolean mShowStatusLines; 6016b05d58018c2806459c121e507c005639b74aee9Jim Miller 6026b05d58018c2806459c121e507c005639b74aee9Jim Miller StatusMode(boolean mShowStatusLines) { 6036b05d58018c2806459c121e507c005639b74aee9Jim Miller this.mShowStatusLines = mShowStatusLines; 6046b05d58018c2806459c121e507c005639b74aee9Jim Miller } 6056b05d58018c2806459c121e507c005639b74aee9Jim Miller 6066b05d58018c2806459c121e507c005639b74aee9Jim Miller /** 6076b05d58018c2806459c121e507c005639b74aee9Jim Miller * @return Whether the status lines (battery level and / or next alarm) are shown while 6086b05d58018c2806459c121e507c005639b74aee9Jim Miller * in this state. Mostly dictated by whether this is room for them. 6096b05d58018c2806459c121e507c005639b74aee9Jim Miller */ 6106b05d58018c2806459c121e507c005639b74aee9Jim Miller public boolean shouldShowStatusLines() { 6116b05d58018c2806459c121e507c005639b74aee9Jim Miller return mShowStatusLines; 6126b05d58018c2806459c121e507c005639b74aee9Jim Miller } 6136b05d58018c2806459c121e507c005639b74aee9Jim Miller } 6146b05d58018c2806459c121e507c005639b74aee9Jim Miller 6153f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller private void updateEmergencyCallButtonState(int phoneState) { 6166b05d58018c2806459c121e507c005639b74aee9Jim Miller if (mEmergencyCallButton != null) { 6171f56edc6cd377eab05d9816e93591a7139cdff96Jim Miller boolean enabledBecauseSimLocked = 6181f56edc6cd377eab05d9816e93591a7139cdff96Jim Miller mLockPatternUtils.isEmergencyCallEnabledWhileSimLocked() 6191f56edc6cd377eab05d9816e93591a7139cdff96Jim Miller && mEmergencyButtonEnabledBecauseSimLocked; 6201f56edc6cd377eab05d9816e93591a7139cdff96Jim Miller boolean shown = mEmergencyCallButtonEnabledInScreen || enabledBecauseSimLocked; 6213f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller mLockPatternUtils.updateEmergencyCallButtonState(mEmergencyCallButton, 6221f56edc6cd377eab05d9816e93591a7139cdff96Jim Miller phoneState, shown); 6236b05d58018c2806459c121e507c005639b74aee9Jim Miller } 6246b05d58018c2806459c121e507c005639b74aee9Jim Miller } 6256b05d58018c2806459c121e507c005639b74aee9Jim Miller 6266b05d58018c2806459c121e507c005639b74aee9Jim Miller private KeyguardUpdateMonitor.InfoCallback mInfoCallback 6276b05d58018c2806459c121e507c005639b74aee9Jim Miller = new KeyguardUpdateMonitor.InfoCallback() { 6286b05d58018c2806459c121e507c005639b74aee9Jim Miller 6296b05d58018c2806459c121e507c005639b74aee9Jim Miller public void onRefreshBatteryInfo(boolean showBatteryInfo, boolean pluggedIn, 6306b05d58018c2806459c121e507c005639b74aee9Jim Miller int batteryLevel) { 6316b05d58018c2806459c121e507c005639b74aee9Jim Miller mShowingBatteryInfo = showBatteryInfo; 6326b05d58018c2806459c121e507c005639b74aee9Jim Miller mPluggedIn = pluggedIn; 6336b05d58018c2806459c121e507c005639b74aee9Jim Miller mBatteryLevel = batteryLevel; 6343f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller final MutableInt tmpIcon = new MutableInt(0); 6353f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller update(BATTERY_INFO, getAltTextMessage(tmpIcon)); 6366b05d58018c2806459c121e507c005639b74aee9Jim Miller } 6376b05d58018c2806459c121e507c005639b74aee9Jim Miller 6386b05d58018c2806459c121e507c005639b74aee9Jim Miller public void onTimeChanged() { 6396b05d58018c2806459c121e507c005639b74aee9Jim Miller refreshDate(); 6406b05d58018c2806459c121e507c005639b74aee9Jim Miller } 6416b05d58018c2806459c121e507c005639b74aee9Jim Miller 6426b05d58018c2806459c121e507c005639b74aee9Jim Miller public void onRefreshCarrierInfo(CharSequence plmn, CharSequence spn) { 6433f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller mPlmn = plmn; 6443f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller mSpn = spn; 6451f56edc6cd377eab05d9816e93591a7139cdff96Jim Miller updateCarrierStateWithSimStatus(mSimState); 6466b05d58018c2806459c121e507c005639b74aee9Jim Miller } 6476b05d58018c2806459c121e507c005639b74aee9Jim Miller 6486b05d58018c2806459c121e507c005639b74aee9Jim Miller public void onRingerModeChanged(int state) { 6496b05d58018c2806459c121e507c005639b74aee9Jim Miller 6506b05d58018c2806459c121e507c005639b74aee9Jim Miller } 6516b05d58018c2806459c121e507c005639b74aee9Jim Miller 6523f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller public void onPhoneStateChanged(int phoneState) { 6531f56edc6cd377eab05d9816e93591a7139cdff96Jim Miller mPhoneState = phoneState; 6543f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller updateEmergencyCallButtonState(phoneState); 6556b05d58018c2806459c121e507c005639b74aee9Jim Miller } 656054340d0a3f242efeaf898cca38625bdcb3b4b5aJeff Sharkey 657054340d0a3f242efeaf898cca38625bdcb3b4b5aJeff Sharkey /** {@inheritDoc} */ 658054340d0a3f242efeaf898cca38625bdcb3b4b5aJeff Sharkey public void onClockVisibilityChanged() { 659054340d0a3f242efeaf898cca38625bdcb3b4b5aJeff Sharkey // ignored 660054340d0a3f242efeaf898cca38625bdcb3b4b5aJeff Sharkey } 66124d7b5f22ac98392f8b2d2c94560173e44d1ca6cNick Pelly 66224d7b5f22ac98392f8b2d2c94560173e44d1ca6cNick Pelly public void onDeviceProvisioned() { 66324d7b5f22ac98392f8b2d2c94560173e44d1ca6cNick Pelly // ignored 66424d7b5f22ac98392f8b2d2c94560173e44d1ca6cNick Pelly } 6656b05d58018c2806459c121e507c005639b74aee9Jim Miller }; 6666b05d58018c2806459c121e507c005639b74aee9Jim Miller 6676b05d58018c2806459c121e507c005639b74aee9Jim Miller private SimStateCallback mSimStateCallback = new SimStateCallback() { 6686b05d58018c2806459c121e507c005639b74aee9Jim Miller 6696b05d58018c2806459c121e507c005639b74aee9Jim Miller public void onSimStateChanged(State simState) { 6701f56edc6cd377eab05d9816e93591a7139cdff96Jim Miller updateCarrierStateWithSimStatus(simState); 6716b05d58018c2806459c121e507c005639b74aee9Jim Miller } 6726b05d58018c2806459c121e507c005639b74aee9Jim Miller }; 6736b05d58018c2806459c121e507c005639b74aee9Jim Miller 6746b05d58018c2806459c121e507c005639b74aee9Jim Miller public void onClick(View v) { 6756b05d58018c2806459c121e507c005639b74aee9Jim Miller if (v == mEmergencyCallButton) { 6766b05d58018c2806459c121e507c005639b74aee9Jim Miller mCallback.takeEmergencyCallAction(); 6776b05d58018c2806459c121e507c005639b74aee9Jim Miller } 6786b05d58018c2806459c121e507c005639b74aee9Jim Miller } 6793f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller 6803f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller /** 6813f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller * Performs concentenation of PLMN/SPN 6823f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller * @param plmn 6833f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller * @param spn 6843f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller * @return 6853f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller */ 6863f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller private static CharSequence makeCarierString(CharSequence plmn, CharSequence spn) { 687be95d778701d24c6e550bff45fa1e04c1714a721Jim Miller final boolean plmnValid = !TextUtils.isEmpty(plmn); 688be95d778701d24c6e550bff45fa1e04c1714a721Jim Miller final boolean spnValid = !TextUtils.isEmpty(spn); 689be95d778701d24c6e550bff45fa1e04c1714a721Jim Miller if (plmnValid && spnValid) { 6903f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller return plmn + "|" + spn; 691be95d778701d24c6e550bff45fa1e04c1714a721Jim Miller } else if (plmnValid) { 692be95d778701d24c6e550bff45fa1e04c1714a721Jim Miller return plmn; 693be95d778701d24c6e550bff45fa1e04c1714a721Jim Miller } else if (spnValid) { 6943f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller return spn; 6953f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller } else { 6963f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller return ""; 6973f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller } 6983f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller } 6996b05d58018c2806459c121e507c005639b74aee9Jim Miller} 700