KeyguardStatusViewManager.java revision a639b311e93ad14d9ee5c2b2c215ed2d86c32d2a
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;
20a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Savilleimport com.android.internal.telephony.IccCardConstants;
21ce4a0c6f160241ea06e1f2000815094263dea70dJim Millerimport com.android.internal.widget.DigitalClock;
226b05d58018c2806459c121e507c005639b74aee9Jim Millerimport com.android.internal.widget.LockPatternUtils;
231c18828d20807342d37000746b18a3c1696f3b2eJim Millerimport com.android.internal.widget.TransportControlView;
24b030476d193a423f6c1baf3053f66fc768c925e0Jim Millerimport com.android.internal.policy.impl.KeyguardUpdateMonitor.InfoCallbackImpl;
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
90a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville    protected IccCardConstants.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
297118bb2bd86194454452655345846c85ec59ba547Jim Miller        // First update the clock, if present.
298118bb2bd86194454452655345846c85ec59ba547Jim Miller        if (mDigitalClock != null) {
299118bb2bd86194454452655345846c85ec59ba547Jim Miller            mDigitalClock.updateTime();
300118bb2bd86194454452655345846c85ec59ba547Jim Miller        }
301ce4a0c6f160241ea06e1f2000815094263dea70dJim Miller
3026b05d58018c2806459c121e507c005639b74aee9Jim Miller        mUpdateMonitor.registerInfoCallback(mInfoCallback);
3036b05d58018c2806459c121e507c005639b74aee9Jim Miller        mUpdateMonitor.registerSimStateCallback(mSimStateCallback);
3046b05d58018c2806459c121e507c005639b74aee9Jim Miller        resetStatusInfo();
305ea8441e22a4316cb6e78dd8bf461d3e658545b64Brian Colonna        // Issue the biometric unlock failure message in a centralized place
306ea8441e22a4316cb6e78dd8bf461d3e658545b64Brian Colonna        // TODO: we either need to make the Face Unlock multiple failures string a more general
307ea8441e22a4316cb6e78dd8bf461d3e658545b64Brian Colonna        // 'biometric unlock' or have each biometric unlock handle this on their own.
308ea8441e22a4316cb6e78dd8bf461d3e658545b64Brian Colonna        if (mUpdateMonitor.getMaxBiometricUnlockAttemptsReached()) {
309b9430d2a1c8dbf7b9998d349544c9ae133dab18fSteven Ross            setInstructionText(getContext().getString(R.string.faceunlock_multiple_failures));
310b9430d2a1c8dbf7b9998d349544c9ae133dab18fSteven Ross        }
3116b05d58018c2806459c121e507c005639b74aee9Jim Miller    }
3126b05d58018c2806459c121e507c005639b74aee9Jim Miller
3136b05d58018c2806459c121e507c005639b74aee9Jim Miller    void resetStatusInfo() {
3146b05d58018c2806459c121e507c005639b74aee9Jim Miller        mInstructionText = null;
3156b05d58018c2806459c121e507c005639b74aee9Jim Miller        mShowingBatteryInfo = mUpdateMonitor.shouldShowBatteryInfo();
3166b05d58018c2806459c121e507c005639b74aee9Jim Miller        mPluggedIn = mUpdateMonitor.isDevicePluggedIn();
3176b05d58018c2806459c121e507c005639b74aee9Jim Miller        mBatteryLevel = mUpdateMonitor.getBatteryLevel();
3186b05d58018c2806459c121e507c005639b74aee9Jim Miller        updateStatusLines(true);
3196b05d58018c2806459c121e507c005639b74aee9Jim Miller    }
3206b05d58018c2806459c121e507c005639b74aee9Jim Miller
3216b05d58018c2806459c121e507c005639b74aee9Jim Miller    /**
3226b05d58018c2806459c121e507c005639b74aee9Jim Miller     * Update the status lines based on these rules:
3236b05d58018c2806459c121e507c005639b74aee9Jim Miller     * AlarmStatus: Alarm state always gets it's own line.
3246b05d58018c2806459c121e507c005639b74aee9Jim Miller     * Status1 is shared between help, battery status and generic unlock instructions,
3256b05d58018c2806459c121e507c005639b74aee9Jim Miller     * prioritized in that order.
3266b05d58018c2806459c121e507c005639b74aee9Jim Miller     * @param showStatusLines status lines are shown if true
3276b05d58018c2806459c121e507c005639b74aee9Jim Miller     */
3286b05d58018c2806459c121e507c005639b74aee9Jim Miller    void updateStatusLines(boolean showStatusLines) {
3296b05d58018c2806459c121e507c005639b74aee9Jim Miller        if (DEBUG) Log.v(TAG, "updateStatusLines(" + showStatusLines + ")");
3306b05d58018c2806459c121e507c005639b74aee9Jim Miller        mShowingStatus = showStatusLines;
3316b05d58018c2806459c121e507c005639b74aee9Jim Miller        updateAlarmInfo();
3326b05d58018c2806459c121e507c005639b74aee9Jim Miller        updateOwnerInfo();
3336b05d58018c2806459c121e507c005639b74aee9Jim Miller        updateStatus1();
3346b05d58018c2806459c121e507c005639b74aee9Jim Miller        updateCarrierText();
3356b05d58018c2806459c121e507c005639b74aee9Jim Miller    }
3366b05d58018c2806459c121e507c005639b74aee9Jim Miller
3376b05d58018c2806459c121e507c005639b74aee9Jim Miller    private void updateAlarmInfo() {
3386b05d58018c2806459c121e507c005639b74aee9Jim Miller        if (mAlarmStatusView != null) {
3396b05d58018c2806459c121e507c005639b74aee9Jim Miller            String nextAlarm = mLockPatternUtils.getNextAlarm();
3406b05d58018c2806459c121e507c005639b74aee9Jim Miller            boolean showAlarm = mShowingStatus && !TextUtils.isEmpty(nextAlarm);
3416b05d58018c2806459c121e507c005639b74aee9Jim Miller            mAlarmStatusView.setText(nextAlarm);
3426b05d58018c2806459c121e507c005639b74aee9Jim Miller            mAlarmStatusView.setCompoundDrawablesWithIntrinsicBounds(ALARM_ICON, 0, 0, 0);
3436b05d58018c2806459c121e507c005639b74aee9Jim Miller            mAlarmStatusView.setVisibility(showAlarm ? View.VISIBLE : View.GONE);
3446b05d58018c2806459c121e507c005639b74aee9Jim Miller        }
3456b05d58018c2806459c121e507c005639b74aee9Jim Miller    }
3466b05d58018c2806459c121e507c005639b74aee9Jim Miller
3476b05d58018c2806459c121e507c005639b74aee9Jim Miller    private void updateOwnerInfo() {
3486b05d58018c2806459c121e507c005639b74aee9Jim Miller        final ContentResolver res = getContext().getContentResolver();
3496b05d58018c2806459c121e507c005639b74aee9Jim Miller        final boolean ownerInfoEnabled = Settings.Secure.getInt(res,
3506b05d58018c2806459c121e507c005639b74aee9Jim Miller                Settings.Secure.LOCK_SCREEN_OWNER_INFO_ENABLED, 1) != 0;
3516b05d58018c2806459c121e507c005639b74aee9Jim Miller        mOwnerInfoText = ownerInfoEnabled ?
3526b05d58018c2806459c121e507c005639b74aee9Jim Miller                Settings.Secure.getString(res, Settings.Secure.LOCK_SCREEN_OWNER_INFO) : null;
3536b05d58018c2806459c121e507c005639b74aee9Jim Miller        if (mOwnerInfoView != null) {
3546b05d58018c2806459c121e507c005639b74aee9Jim Miller            mOwnerInfoView.setText(mOwnerInfoText);
3556b05d58018c2806459c121e507c005639b74aee9Jim Miller            mOwnerInfoView.setVisibility(TextUtils.isEmpty(mOwnerInfoText) ? View.GONE:View.VISIBLE);
3566b05d58018c2806459c121e507c005639b74aee9Jim Miller        }
3576b05d58018c2806459c121e507c005639b74aee9Jim Miller    }
3586b05d58018c2806459c121e507c005639b74aee9Jim Miller
3596b05d58018c2806459c121e507c005639b74aee9Jim Miller    private void updateStatus1() {
3606b05d58018c2806459c121e507c005639b74aee9Jim Miller        if (mStatus1View != null) {
3616b05d58018c2806459c121e507c005639b74aee9Jim Miller            MutableInt icon = new MutableInt(0);
3626b05d58018c2806459c121e507c005639b74aee9Jim Miller            CharSequence string = getPriorityTextMessage(icon);
3636b05d58018c2806459c121e507c005639b74aee9Jim Miller            mStatus1View.setText(string);
3646b05d58018c2806459c121e507c005639b74aee9Jim Miller            mStatus1View.setCompoundDrawablesWithIntrinsicBounds(icon.value, 0, 0, 0);
3656b05d58018c2806459c121e507c005639b74aee9Jim Miller            mStatus1View.setVisibility(mShowingStatus ? View.VISIBLE : View.INVISIBLE);
3666b05d58018c2806459c121e507c005639b74aee9Jim Miller        }
3676b05d58018c2806459c121e507c005639b74aee9Jim Miller    }
3686b05d58018c2806459c121e507c005639b74aee9Jim Miller
3696b05d58018c2806459c121e507c005639b74aee9Jim Miller    private void updateCarrierText() {
3706b05d58018c2806459c121e507c005639b74aee9Jim Miller        if (!inWidgetMode() && mCarrierView != null) {
3716b05d58018c2806459c121e507c005639b74aee9Jim Miller            mCarrierView.setText(mCarrierText);
3726b05d58018c2806459c121e507c005639b74aee9Jim Miller        }
3736b05d58018c2806459c121e507c005639b74aee9Jim Miller    }
3746b05d58018c2806459c121e507c005639b74aee9Jim Miller
3756b05d58018c2806459c121e507c005639b74aee9Jim Miller    private CharSequence getAltTextMessage(MutableInt icon) {
3766b05d58018c2806459c121e507c005639b74aee9Jim Miller        // If we have replaced the status area with a single widget, then this code
3776b05d58018c2806459c121e507c005639b74aee9Jim Miller        // prioritizes what to show in that space when all transient messages are gone.
3786b05d58018c2806459c121e507c005639b74aee9Jim Miller        CharSequence string = null;
3796b05d58018c2806459c121e507c005639b74aee9Jim Miller        if (mShowingBatteryInfo) {
3806b05d58018c2806459c121e507c005639b74aee9Jim Miller            // Battery status
3816b05d58018c2806459c121e507c005639b74aee9Jim Miller            if (mPluggedIn) {
3826b05d58018c2806459c121e507c005639b74aee9Jim Miller                // Charging or charged
3836b05d58018c2806459c121e507c005639b74aee9Jim Miller                if (mUpdateMonitor.isDeviceCharged()) {
3846b05d58018c2806459c121e507c005639b74aee9Jim Miller                    string = getContext().getString(R.string.lockscreen_charged);
3856b05d58018c2806459c121e507c005639b74aee9Jim Miller                } else {
3866b05d58018c2806459c121e507c005639b74aee9Jim Miller                    string = getContext().getString(R.string.lockscreen_plugged_in, mBatteryLevel);
3876b05d58018c2806459c121e507c005639b74aee9Jim Miller                }
3886b05d58018c2806459c121e507c005639b74aee9Jim Miller                icon.value = CHARGING_ICON;
3896b05d58018c2806459c121e507c005639b74aee9Jim Miller            } else if (mBatteryLevel < KeyguardUpdateMonitor.LOW_BATTERY_THRESHOLD) {
3906b05d58018c2806459c121e507c005639b74aee9Jim Miller                // Battery is low
3916b05d58018c2806459c121e507c005639b74aee9Jim Miller                string = getContext().getString(R.string.lockscreen_low_battery);
3926b05d58018c2806459c121e507c005639b74aee9Jim Miller                icon.value = BATTERY_LOW_ICON;
3936b05d58018c2806459c121e507c005639b74aee9Jim Miller            }
3946b05d58018c2806459c121e507c005639b74aee9Jim Miller        } else {
3956b05d58018c2806459c121e507c005639b74aee9Jim Miller            string = mCarrierText;
3966b05d58018c2806459c121e507c005639b74aee9Jim Miller        }
3976b05d58018c2806459c121e507c005639b74aee9Jim Miller        return string;
3986b05d58018c2806459c121e507c005639b74aee9Jim Miller    }
3996b05d58018c2806459c121e507c005639b74aee9Jim Miller
4006b05d58018c2806459c121e507c005639b74aee9Jim Miller    private CharSequence getPriorityTextMessage(MutableInt icon) {
4016b05d58018c2806459c121e507c005639b74aee9Jim Miller        CharSequence string = null;
4026b05d58018c2806459c121e507c005639b74aee9Jim Miller        if (!TextUtils.isEmpty(mInstructionText)) {
4036b05d58018c2806459c121e507c005639b74aee9Jim Miller            // Instructions only
4046b05d58018c2806459c121e507c005639b74aee9Jim Miller            string = mInstructionText;
4056b05d58018c2806459c121e507c005639b74aee9Jim Miller            icon.value = LOCK_ICON;
4066b05d58018c2806459c121e507c005639b74aee9Jim Miller        } else if (mShowingBatteryInfo) {
4076b05d58018c2806459c121e507c005639b74aee9Jim Miller            // Battery status
4086b05d58018c2806459c121e507c005639b74aee9Jim Miller            if (mPluggedIn) {
4096b05d58018c2806459c121e507c005639b74aee9Jim Miller                // Charging or charged
4106b05d58018c2806459c121e507c005639b74aee9Jim Miller                if (mUpdateMonitor.isDeviceCharged()) {
4116b05d58018c2806459c121e507c005639b74aee9Jim Miller                    string = getContext().getString(R.string.lockscreen_charged);
4126b05d58018c2806459c121e507c005639b74aee9Jim Miller                } else {
4136b05d58018c2806459c121e507c005639b74aee9Jim Miller                    string = getContext().getString(R.string.lockscreen_plugged_in, mBatteryLevel);
4146b05d58018c2806459c121e507c005639b74aee9Jim Miller                }
4156b05d58018c2806459c121e507c005639b74aee9Jim Miller                icon.value = CHARGING_ICON;
4166b05d58018c2806459c121e507c005639b74aee9Jim Miller            } else if (mBatteryLevel < KeyguardUpdateMonitor.LOW_BATTERY_THRESHOLD) {
4176b05d58018c2806459c121e507c005639b74aee9Jim Miller                // Battery is low
4186b05d58018c2806459c121e507c005639b74aee9Jim Miller                string = getContext().getString(R.string.lockscreen_low_battery);
4196b05d58018c2806459c121e507c005639b74aee9Jim Miller                icon.value = BATTERY_LOW_ICON;
4206b05d58018c2806459c121e507c005639b74aee9Jim Miller            }
4216b05d58018c2806459c121e507c005639b74aee9Jim Miller        } else if (!inWidgetMode() && mOwnerInfoView == null && mOwnerInfoText != null) {
4226b05d58018c2806459c121e507c005639b74aee9Jim Miller            // OwnerInfo shows in status if we don't have a dedicated widget
4236b05d58018c2806459c121e507c005639b74aee9Jim Miller            string = mOwnerInfoText;
4246b05d58018c2806459c121e507c005639b74aee9Jim Miller        }
4256b05d58018c2806459c121e507c005639b74aee9Jim Miller        return string;
4266b05d58018c2806459c121e507c005639b74aee9Jim Miller    }
4276b05d58018c2806459c121e507c005639b74aee9Jim Miller
4286b05d58018c2806459c121e507c005639b74aee9Jim Miller    void refreshDate() {
4296b05d58018c2806459c121e507c005639b74aee9Jim Miller        if (mDateView != null) {
4306b05d58018c2806459c121e507c005639b74aee9Jim Miller            mDateView.setText(DateFormat.format(mDateFormatString, new Date()));
4316b05d58018c2806459c121e507c005639b74aee9Jim Miller        }
4326b05d58018c2806459c121e507c005639b74aee9Jim Miller    }
4336b05d58018c2806459c121e507c005639b74aee9Jim Miller
4346b05d58018c2806459c121e507c005639b74aee9Jim Miller    /**
4356b05d58018c2806459c121e507c005639b74aee9Jim Miller     * Determine the current status of the lock screen given the sim state and other stuff.
4366b05d58018c2806459c121e507c005639b74aee9Jim Miller     */
437a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville    public StatusMode getStatusForIccState(IccCardConstants.State simState) {
4383f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller        // Since reading the SIM may take a while, we assume it is present until told otherwise.
4393f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller        if (simState == null) {
4403f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller            return StatusMode.Normal;
4413f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller        }
4423f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller
4433f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller        final boolean missingAndNotProvisioned = (!mUpdateMonitor.isDeviceProvisioned()
444a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville                && (simState == IccCardConstants.State.ABSENT ||
445a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville                        simState == IccCardConstants.State.PERM_DISABLED));
4466b05d58018c2806459c121e507c005639b74aee9Jim Miller
4476b05d58018c2806459c121e507c005639b74aee9Jim Miller        // Assume we're NETWORK_LOCKED if not provisioned
448a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville        simState = missingAndNotProvisioned ? IccCardConstants.State.NETWORK_LOCKED : simState;
4496b05d58018c2806459c121e507c005639b74aee9Jim Miller        switch (simState) {
4506b05d58018c2806459c121e507c005639b74aee9Jim Miller            case ABSENT:
4516b05d58018c2806459c121e507c005639b74aee9Jim Miller                return StatusMode.SimMissing;
4526b05d58018c2806459c121e507c005639b74aee9Jim Miller            case NETWORK_LOCKED:
4536b05d58018c2806459c121e507c005639b74aee9Jim Miller                return StatusMode.SimMissingLocked;
4546b05d58018c2806459c121e507c005639b74aee9Jim Miller            case NOT_READY:
4556b05d58018c2806459c121e507c005639b74aee9Jim Miller                return StatusMode.SimMissing;
4566b05d58018c2806459c121e507c005639b74aee9Jim Miller            case PIN_REQUIRED:
4576b05d58018c2806459c121e507c005639b74aee9Jim Miller                return StatusMode.SimLocked;
4586b05d58018c2806459c121e507c005639b74aee9Jim Miller            case PUK_REQUIRED:
4596b05d58018c2806459c121e507c005639b74aee9Jim Miller                return StatusMode.SimPukLocked;
4606b05d58018c2806459c121e507c005639b74aee9Jim Miller            case READY:
4616b05d58018c2806459c121e507c005639b74aee9Jim Miller                return StatusMode.Normal;
4626b05d58018c2806459c121e507c005639b74aee9Jim Miller            case PERM_DISABLED:
4636b05d58018c2806459c121e507c005639b74aee9Jim Miller                return StatusMode.SimPermDisabled;
4646b05d58018c2806459c121e507c005639b74aee9Jim Miller            case UNKNOWN:
4656b05d58018c2806459c121e507c005639b74aee9Jim Miller                return StatusMode.SimMissing;
4666b05d58018c2806459c121e507c005639b74aee9Jim Miller        }
4676b05d58018c2806459c121e507c005639b74aee9Jim Miller        return StatusMode.SimMissing;
4686b05d58018c2806459c121e507c005639b74aee9Jim Miller    }
4696b05d58018c2806459c121e507c005639b74aee9Jim Miller
4706b05d58018c2806459c121e507c005639b74aee9Jim Miller    private Context getContext() {
4716b05d58018c2806459c121e507c005639b74aee9Jim Miller        return mContainer.getContext();
4726b05d58018c2806459c121e507c005639b74aee9Jim Miller    }
4736b05d58018c2806459c121e507c005639b74aee9Jim Miller
4746b05d58018c2806459c121e507c005639b74aee9Jim Miller    /**
4756b05d58018c2806459c121e507c005639b74aee9Jim Miller     * Update carrier text, carrier help and emergency button to match the current status based
4766b05d58018c2806459c121e507c005639b74aee9Jim Miller     * on SIM state.
4776b05d58018c2806459c121e507c005639b74aee9Jim Miller     *
4786b05d58018c2806459c121e507c005639b74aee9Jim Miller     * @param simState
4796b05d58018c2806459c121e507c005639b74aee9Jim Miller     */
480a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville    private void updateCarrierStateWithSimStatus(IccCardConstants.State simState) {
4813f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller        if (DEBUG) Log.d(TAG, "updateCarrierTextWithSimStatus(), simState = " + simState);
4826b05d58018c2806459c121e507c005639b74aee9Jim Miller
4836b05d58018c2806459c121e507c005639b74aee9Jim Miller        CharSequence carrierText = null;
4846b05d58018c2806459c121e507c005639b74aee9Jim Miller        int carrierHelpTextId = 0;
4851f56edc6cd377eab05d9816e93591a7139cdff96Jim Miller        mEmergencyButtonEnabledBecauseSimLocked = false;
4866b05d58018c2806459c121e507c005639b74aee9Jim Miller        mStatus = getStatusForIccState(simState);
4873f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller        mSimState = simState;
4886b05d58018c2806459c121e507c005639b74aee9Jim Miller        switch (mStatus) {
4896b05d58018c2806459c121e507c005639b74aee9Jim Miller            case Normal:
4903f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller                carrierText = makeCarierString(mPlmn, mSpn);
4916b05d58018c2806459c121e507c005639b74aee9Jim Miller                break;
4926b05d58018c2806459c121e507c005639b74aee9Jim Miller
4936b05d58018c2806459c121e507c005639b74aee9Jim Miller            case NetworkLocked:
494088f1628991cc63401d12ce2e979f0520696693bJohn Wang                carrierText = makeCarrierStringOnEmergencyCapable(
495088f1628991cc63401d12ce2e979f0520696693bJohn Wang                        getContext().getText(R.string.lockscreen_network_locked_message),
496088f1628991cc63401d12ce2e979f0520696693bJohn Wang                        mPlmn);
4976b05d58018c2806459c121e507c005639b74aee9Jim Miller                carrierHelpTextId = R.string.lockscreen_instructions_when_pattern_disabled;
4986b05d58018c2806459c121e507c005639b74aee9Jim Miller                break;
4996b05d58018c2806459c121e507c005639b74aee9Jim Miller
5006b05d58018c2806459c121e507c005639b74aee9Jim Miller            case SimMissing:
5012fcd63b8cf94a947498f0aab24b9d702a6fe909bJim Miller                // Shows "No SIM card | Emergency calls only" on devices that are voice-capable.
5022fcd63b8cf94a947498f0aab24b9d702a6fe909bJim Miller                // This depends on mPlmn containing the text "Emergency calls only" when the radio
5032fcd63b8cf94a947498f0aab24b9d702a6fe909bJim Miller                // has some connectivity. Otherwise, it should be null or empty and just show
5042fcd63b8cf94a947498f0aab24b9d702a6fe909bJim Miller                // "No SIM card"
505088f1628991cc63401d12ce2e979f0520696693bJohn Wang                carrierText =  makeCarrierStringOnEmergencyCapable(
506088f1628991cc63401d12ce2e979f0520696693bJohn Wang                        getContext().getText(R.string.lockscreen_missing_sim_message_short),
507088f1628991cc63401d12ce2e979f0520696693bJohn Wang                        mPlmn);
5086b05d58018c2806459c121e507c005639b74aee9Jim Miller                carrierHelpTextId = R.string.lockscreen_missing_sim_instructions_long;
5096b05d58018c2806459c121e507c005639b74aee9Jim Miller                break;
5106b05d58018c2806459c121e507c005639b74aee9Jim Miller
5116b05d58018c2806459c121e507c005639b74aee9Jim Miller            case SimPermDisabled:
51282b2cd0fe9b8c6e353a9b3b0600aafc7b97eecc1John Wang                carrierText = getContext().getText(
51382b2cd0fe9b8c6e353a9b3b0600aafc7b97eecc1John Wang                        R.string.lockscreen_permanent_disabled_sim_message_short);
5146b05d58018c2806459c121e507c005639b74aee9Jim Miller                carrierHelpTextId = R.string.lockscreen_permanent_disabled_sim_instructions;
5151f56edc6cd377eab05d9816e93591a7139cdff96Jim Miller                mEmergencyButtonEnabledBecauseSimLocked = true;
5166b05d58018c2806459c121e507c005639b74aee9Jim Miller                break;
5176b05d58018c2806459c121e507c005639b74aee9Jim Miller
5186b05d58018c2806459c121e507c005639b74aee9Jim Miller            case SimMissingLocked:
519088f1628991cc63401d12ce2e979f0520696693bJohn Wang                carrierText =  makeCarrierStringOnEmergencyCapable(
520088f1628991cc63401d12ce2e979f0520696693bJohn Wang                        getContext().getText(R.string.lockscreen_missing_sim_message_short),
521088f1628991cc63401d12ce2e979f0520696693bJohn Wang                        mPlmn);
5226b05d58018c2806459c121e507c005639b74aee9Jim Miller                carrierHelpTextId = R.string.lockscreen_missing_sim_instructions;
5231f56edc6cd377eab05d9816e93591a7139cdff96Jim Miller                mEmergencyButtonEnabledBecauseSimLocked = true;
5246b05d58018c2806459c121e507c005639b74aee9Jim Miller                break;
5256b05d58018c2806459c121e507c005639b74aee9Jim Miller
5266b05d58018c2806459c121e507c005639b74aee9Jim Miller            case SimLocked:
527088f1628991cc63401d12ce2e979f0520696693bJohn Wang                carrierText = makeCarrierStringOnEmergencyCapable(
528088f1628991cc63401d12ce2e979f0520696693bJohn Wang                        getContext().getText(R.string.lockscreen_sim_locked_message),
529088f1628991cc63401d12ce2e979f0520696693bJohn Wang                        mPlmn);
5301f56edc6cd377eab05d9816e93591a7139cdff96Jim Miller                mEmergencyButtonEnabledBecauseSimLocked = true;
5316b05d58018c2806459c121e507c005639b74aee9Jim Miller                break;
5326b05d58018c2806459c121e507c005639b74aee9Jim Miller
5336b05d58018c2806459c121e507c005639b74aee9Jim Miller            case SimPukLocked:
534088f1628991cc63401d12ce2e979f0520696693bJohn Wang                carrierText = makeCarrierStringOnEmergencyCapable(
535088f1628991cc63401d12ce2e979f0520696693bJohn Wang                        getContext().getText(R.string.lockscreen_sim_puk_locked_message),
536088f1628991cc63401d12ce2e979f0520696693bJohn Wang                        mPlmn);
5376b05d58018c2806459c121e507c005639b74aee9Jim Miller                if (!mLockPatternUtils.isPukUnlockScreenEnable()) {
5381f56edc6cd377eab05d9816e93591a7139cdff96Jim Miller                    // This means we're showing the PUK unlock screen
5391f56edc6cd377eab05d9816e93591a7139cdff96Jim Miller                    mEmergencyButtonEnabledBecauseSimLocked = true;
5406b05d58018c2806459c121e507c005639b74aee9Jim Miller                }
5416b05d58018c2806459c121e507c005639b74aee9Jim Miller                break;
5426b05d58018c2806459c121e507c005639b74aee9Jim Miller        }
5436b05d58018c2806459c121e507c005639b74aee9Jim Miller
5446b05d58018c2806459c121e507c005639b74aee9Jim Miller        setCarrierText(carrierText);
5456b05d58018c2806459c121e507c005639b74aee9Jim Miller        setCarrierHelpText(carrierHelpTextId);
5461f56edc6cd377eab05d9816e93591a7139cdff96Jim Miller        updateEmergencyCallButtonState(mPhoneState);
5476b05d58018c2806459c121e507c005639b74aee9Jim Miller    }
5486b05d58018c2806459c121e507c005639b74aee9Jim Miller
549088f1628991cc63401d12ce2e979f0520696693bJohn Wang
550088f1628991cc63401d12ce2e979f0520696693bJohn Wang    /*
551088f1628991cc63401d12ce2e979f0520696693bJohn Wang     * Add emergencyCallMessage to carrier string only if phone supports emergency calls.
552088f1628991cc63401d12ce2e979f0520696693bJohn Wang     */
553088f1628991cc63401d12ce2e979f0520696693bJohn Wang    private CharSequence makeCarrierStringOnEmergencyCapable(
554088f1628991cc63401d12ce2e979f0520696693bJohn Wang            CharSequence simMessage, CharSequence emergencyCallMessage) {
555088f1628991cc63401d12ce2e979f0520696693bJohn Wang        if (mLockPatternUtils.isEmergencyCallCapable()) {
556088f1628991cc63401d12ce2e979f0520696693bJohn Wang            return makeCarierString(simMessage, emergencyCallMessage);
557088f1628991cc63401d12ce2e979f0520696693bJohn Wang        }
558088f1628991cc63401d12ce2e979f0520696693bJohn Wang        return simMessage;
559088f1628991cc63401d12ce2e979f0520696693bJohn Wang    }
560088f1628991cc63401d12ce2e979f0520696693bJohn Wang
5616b05d58018c2806459c121e507c005639b74aee9Jim Miller    private View findViewById(int id) {
5626b05d58018c2806459c121e507c005639b74aee9Jim Miller        return mContainer.findViewById(id);
5636b05d58018c2806459c121e507c005639b74aee9Jim Miller    }
5646b05d58018c2806459c121e507c005639b74aee9Jim Miller
5656b05d58018c2806459c121e507c005639b74aee9Jim Miller    /**
5666b05d58018c2806459c121e507c005639b74aee9Jim Miller     * The status of this lock screen. Primarily used for widgets on LockScreen.
5676b05d58018c2806459c121e507c005639b74aee9Jim Miller     */
5686b05d58018c2806459c121e507c005639b74aee9Jim Miller    enum StatusMode {
5696b05d58018c2806459c121e507c005639b74aee9Jim Miller        /**
5706b05d58018c2806459c121e507c005639b74aee9Jim Miller         * Normal case (sim card present, it's not locked)
5716b05d58018c2806459c121e507c005639b74aee9Jim Miller         */
5726b05d58018c2806459c121e507c005639b74aee9Jim Miller        Normal(true),
5736b05d58018c2806459c121e507c005639b74aee9Jim Miller
5746b05d58018c2806459c121e507c005639b74aee9Jim Miller        /**
5756b05d58018c2806459c121e507c005639b74aee9Jim Miller         * The sim card is 'network locked'.
5766b05d58018c2806459c121e507c005639b74aee9Jim Miller         */
5776b05d58018c2806459c121e507c005639b74aee9Jim Miller        NetworkLocked(true),
5786b05d58018c2806459c121e507c005639b74aee9Jim Miller
5796b05d58018c2806459c121e507c005639b74aee9Jim Miller        /**
5806b05d58018c2806459c121e507c005639b74aee9Jim Miller         * The sim card is missing.
5816b05d58018c2806459c121e507c005639b74aee9Jim Miller         */
5826b05d58018c2806459c121e507c005639b74aee9Jim Miller        SimMissing(false),
5836b05d58018c2806459c121e507c005639b74aee9Jim Miller
5846b05d58018c2806459c121e507c005639b74aee9Jim Miller        /**
5856b05d58018c2806459c121e507c005639b74aee9Jim Miller         * The sim card is missing, and this is the device isn't provisioned, so we don't let
5866b05d58018c2806459c121e507c005639b74aee9Jim Miller         * them get past the screen.
5876b05d58018c2806459c121e507c005639b74aee9Jim Miller         */
5886b05d58018c2806459c121e507c005639b74aee9Jim Miller        SimMissingLocked(false),
5896b05d58018c2806459c121e507c005639b74aee9Jim Miller
5906b05d58018c2806459c121e507c005639b74aee9Jim Miller        /**
5916b05d58018c2806459c121e507c005639b74aee9Jim Miller         * The sim card is PUK locked, meaning they've entered the wrong sim unlock code too many
5926b05d58018c2806459c121e507c005639b74aee9Jim Miller         * times.
5936b05d58018c2806459c121e507c005639b74aee9Jim Miller         */
5946b05d58018c2806459c121e507c005639b74aee9Jim Miller        SimPukLocked(false),
5956b05d58018c2806459c121e507c005639b74aee9Jim Miller
5966b05d58018c2806459c121e507c005639b74aee9Jim Miller        /**
5976b05d58018c2806459c121e507c005639b74aee9Jim Miller         * The sim card is locked.
5986b05d58018c2806459c121e507c005639b74aee9Jim Miller         */
5996b05d58018c2806459c121e507c005639b74aee9Jim Miller        SimLocked(true),
6006b05d58018c2806459c121e507c005639b74aee9Jim Miller
6016b05d58018c2806459c121e507c005639b74aee9Jim Miller        /**
6026b05d58018c2806459c121e507c005639b74aee9Jim Miller         * The sim card is permanently disabled due to puk unlock failure
6036b05d58018c2806459c121e507c005639b74aee9Jim Miller         */
6046b05d58018c2806459c121e507c005639b74aee9Jim Miller        SimPermDisabled(false);
6056b05d58018c2806459c121e507c005639b74aee9Jim Miller
6066b05d58018c2806459c121e507c005639b74aee9Jim Miller        private final boolean mShowStatusLines;
6076b05d58018c2806459c121e507c005639b74aee9Jim Miller
6086b05d58018c2806459c121e507c005639b74aee9Jim Miller        StatusMode(boolean mShowStatusLines) {
6096b05d58018c2806459c121e507c005639b74aee9Jim Miller            this.mShowStatusLines = mShowStatusLines;
6106b05d58018c2806459c121e507c005639b74aee9Jim Miller        }
6116b05d58018c2806459c121e507c005639b74aee9Jim Miller
6126b05d58018c2806459c121e507c005639b74aee9Jim Miller        /**
6136b05d58018c2806459c121e507c005639b74aee9Jim Miller         * @return Whether the status lines (battery level and / or next alarm) are shown while
6146b05d58018c2806459c121e507c005639b74aee9Jim Miller         *         in this state.  Mostly dictated by whether this is room for them.
6156b05d58018c2806459c121e507c005639b74aee9Jim Miller         */
6166b05d58018c2806459c121e507c005639b74aee9Jim Miller        public boolean shouldShowStatusLines() {
6176b05d58018c2806459c121e507c005639b74aee9Jim Miller            return mShowStatusLines;
6186b05d58018c2806459c121e507c005639b74aee9Jim Miller        }
6196b05d58018c2806459c121e507c005639b74aee9Jim Miller    }
6206b05d58018c2806459c121e507c005639b74aee9Jim Miller
6213f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller    private void updateEmergencyCallButtonState(int phoneState) {
6226b05d58018c2806459c121e507c005639b74aee9Jim Miller        if (mEmergencyCallButton != null) {
6231f56edc6cd377eab05d9816e93591a7139cdff96Jim Miller            boolean enabledBecauseSimLocked =
6241f56edc6cd377eab05d9816e93591a7139cdff96Jim Miller                    mLockPatternUtils.isEmergencyCallEnabledWhileSimLocked()
6251f56edc6cd377eab05d9816e93591a7139cdff96Jim Miller                    && mEmergencyButtonEnabledBecauseSimLocked;
6261f56edc6cd377eab05d9816e93591a7139cdff96Jim Miller            boolean shown = mEmergencyCallButtonEnabledInScreen || enabledBecauseSimLocked;
6273f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller            mLockPatternUtils.updateEmergencyCallButtonState(mEmergencyCallButton,
6281f56edc6cd377eab05d9816e93591a7139cdff96Jim Miller                    phoneState, shown);
6296b05d58018c2806459c121e507c005639b74aee9Jim Miller        }
6306b05d58018c2806459c121e507c005639b74aee9Jim Miller    }
6316b05d58018c2806459c121e507c005639b74aee9Jim Miller
632b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller    private InfoCallbackImpl mInfoCallback = new InfoCallbackImpl() {
6336b05d58018c2806459c121e507c005639b74aee9Jim Miller
634b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller        @Override
6356b05d58018c2806459c121e507c005639b74aee9Jim Miller        public void onRefreshBatteryInfo(boolean showBatteryInfo, boolean pluggedIn,
6366b05d58018c2806459c121e507c005639b74aee9Jim Miller                int batteryLevel) {
6376b05d58018c2806459c121e507c005639b74aee9Jim Miller            mShowingBatteryInfo = showBatteryInfo;
6386b05d58018c2806459c121e507c005639b74aee9Jim Miller            mPluggedIn = pluggedIn;
6396b05d58018c2806459c121e507c005639b74aee9Jim Miller            mBatteryLevel = batteryLevel;
6403f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller            final MutableInt tmpIcon = new MutableInt(0);
6413f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller            update(BATTERY_INFO, getAltTextMessage(tmpIcon));
6426b05d58018c2806459c121e507c005639b74aee9Jim Miller        }
6436b05d58018c2806459c121e507c005639b74aee9Jim Miller
644b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller        @Override
6456b05d58018c2806459c121e507c005639b74aee9Jim Miller        public void onTimeChanged() {
6466b05d58018c2806459c121e507c005639b74aee9Jim Miller            refreshDate();
6476b05d58018c2806459c121e507c005639b74aee9Jim Miller        }
6486b05d58018c2806459c121e507c005639b74aee9Jim Miller
649b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller        @Override
6506b05d58018c2806459c121e507c005639b74aee9Jim Miller        public void onRefreshCarrierInfo(CharSequence plmn, CharSequence spn) {
6513f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller            mPlmn = plmn;
6523f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller            mSpn = spn;
6531f56edc6cd377eab05d9816e93591a7139cdff96Jim Miller            updateCarrierStateWithSimStatus(mSimState);
6546b05d58018c2806459c121e507c005639b74aee9Jim Miller        }
6556b05d58018c2806459c121e507c005639b74aee9Jim Miller
656b030476d193a423f6c1baf3053f66fc768c925e0Jim Miller        @Override
6573f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller        public void onPhoneStateChanged(int phoneState) {
6581f56edc6cd377eab05d9816e93591a7139cdff96Jim Miller            mPhoneState = phoneState;
6593f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller            updateEmergencyCallButtonState(phoneState);
6606b05d58018c2806459c121e507c005639b74aee9Jim Miller        }
661054340d0a3f242efeaf898cca38625bdcb3b4b5aJeff Sharkey
6626b05d58018c2806459c121e507c005639b74aee9Jim Miller    };
6636b05d58018c2806459c121e507c005639b74aee9Jim Miller
6646b05d58018c2806459c121e507c005639b74aee9Jim Miller    private SimStateCallback mSimStateCallback = new SimStateCallback() {
6656b05d58018c2806459c121e507c005639b74aee9Jim Miller
666a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville        public void onSimStateChanged(IccCardConstants.State simState) {
6671f56edc6cd377eab05d9816e93591a7139cdff96Jim Miller            updateCarrierStateWithSimStatus(simState);
6686b05d58018c2806459c121e507c005639b74aee9Jim Miller        }
6696b05d58018c2806459c121e507c005639b74aee9Jim Miller    };
6706b05d58018c2806459c121e507c005639b74aee9Jim Miller
6716b05d58018c2806459c121e507c005639b74aee9Jim Miller    public void onClick(View v) {
6726b05d58018c2806459c121e507c005639b74aee9Jim Miller        if (v == mEmergencyCallButton) {
6736b05d58018c2806459c121e507c005639b74aee9Jim Miller            mCallback.takeEmergencyCallAction();
6746b05d58018c2806459c121e507c005639b74aee9Jim Miller        }
6756b05d58018c2806459c121e507c005639b74aee9Jim Miller    }
6763f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller
6773f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller    /**
6783f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller     * Performs concentenation of PLMN/SPN
6793f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller     * @param plmn
6803f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller     * @param spn
6813f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller     * @return
6823f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller     */
6833f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller    private static CharSequence makeCarierString(CharSequence plmn, CharSequence spn) {
684be95d778701d24c6e550bff45fa1e04c1714a721Jim Miller        final boolean plmnValid = !TextUtils.isEmpty(plmn);
685be95d778701d24c6e550bff45fa1e04c1714a721Jim Miller        final boolean spnValid = !TextUtils.isEmpty(spn);
686be95d778701d24c6e550bff45fa1e04c1714a721Jim Miller        if (plmnValid && spnValid) {
6873f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller            return plmn + "|" + spn;
688be95d778701d24c6e550bff45fa1e04c1714a721Jim Miller        } else if (plmnValid) {
689be95d778701d24c6e550bff45fa1e04c1714a721Jim Miller            return plmn;
690be95d778701d24c6e550bff45fa1e04c1714a721Jim Miller        } else if (spnValid) {
6913f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller            return spn;
6923f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller        } else {
6933f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller            return "";
6943f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller        }
6953f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller    }
6966b05d58018c2806459c121e507c005639b74aee9Jim Miller}
697