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;
226b05d58018c2806459c121e507c005639b74aee9Jim Millerimport com.android.internal.widget.LockPatternUtils;
231c18828d20807342d37000746b18a3c1696f3b2eJim Millerimport com.android.internal.widget.TransportControlView;
246b05d58018c2806459c121e507c005639b74aee9Jim Millerimport com.android.internal.policy.impl.KeyguardUpdateMonitor.SimStateCallback;
256b05d58018c2806459c121e507c005639b74aee9Jim Miller
266b05d58018c2806459c121e507c005639b74aee9Jim Millerimport java.util.ArrayList;
276b05d58018c2806459c121e507c005639b74aee9Jim Millerimport java.util.Date;
286b05d58018c2806459c121e507c005639b74aee9Jim Miller
296b05d58018c2806459c121e507c005639b74aee9Jim Millerimport libcore.util.MutableInt;
306b05d58018c2806459c121e507c005639b74aee9Jim Miller
316b05d58018c2806459c121e507c005639b74aee9Jim Millerimport android.content.ContentResolver;
326b05d58018c2806459c121e507c005639b74aee9Jim Millerimport android.content.Context;
336b05d58018c2806459c121e507c005639b74aee9Jim Millerimport android.provider.Settings;
346b05d58018c2806459c121e507c005639b74aee9Jim Millerimport android.text.TextUtils;
356b05d58018c2806459c121e507c005639b74aee9Jim Millerimport android.text.format.DateFormat;
366b05d58018c2806459c121e507c005639b74aee9Jim Millerimport android.util.Log;
376b05d58018c2806459c121e507c005639b74aee9Jim Millerimport android.view.View;
386b05d58018c2806459c121e507c005639b74aee9Jim Millerimport android.view.View.OnClickListener;
396b05d58018c2806459c121e507c005639b74aee9Jim Millerimport android.widget.Button;
406b05d58018c2806459c121e507c005639b74aee9Jim Millerimport android.widget.TextView;
416b05d58018c2806459c121e507c005639b74aee9Jim Miller
426b05d58018c2806459c121e507c005639b74aee9Jim Miller/***
436b05d58018c2806459c121e507c005639b74aee9Jim Miller * Manages a number of views inside of LockScreen layouts. See below for a list of widgets
446b05d58018c2806459c121e507c005639b74aee9Jim Miller *
456b05d58018c2806459c121e507c005639b74aee9Jim Miller */
466b05d58018c2806459c121e507c005639b74aee9Jim Millerclass KeyguardStatusViewManager implements OnClickListener {
4729aae6f36e565b8f2a99f2193597b964bb800ee8Dianne Hackborn    private static final boolean DEBUG = false;
486b05d58018c2806459c121e507c005639b74aee9Jim Miller    private static final String TAG = "KeyguardStatusView";
496b05d58018c2806459c121e507c005639b74aee9Jim Miller
506b05d58018c2806459c121e507c005639b74aee9Jim Miller    public static final int LOCK_ICON = 0; // R.drawable.ic_lock_idle_lock;
516b05d58018c2806459c121e507c005639b74aee9Jim Miller    public static final int ALARM_ICON = R.drawable.ic_lock_idle_alarm;
526b05d58018c2806459c121e507c005639b74aee9Jim Miller    public static final int CHARGING_ICON = 0; //R.drawable.ic_lock_idle_charging;
536b05d58018c2806459c121e507c005639b74aee9Jim Miller    public static final int BATTERY_LOW_ICON = 0; //R.drawable.ic_lock_idle_low_battery;
546b05d58018c2806459c121e507c005639b74aee9Jim Miller    private static final long INSTRUCTION_RESET_DELAY = 2000; // time until instruction text resets
556b05d58018c2806459c121e507c005639b74aee9Jim Miller
566b05d58018c2806459c121e507c005639b74aee9Jim Miller    private static final int INSTRUCTION_TEXT = 10;
576b05d58018c2806459c121e507c005639b74aee9Jim Miller    private static final int CARRIER_TEXT = 11;
586b05d58018c2806459c121e507c005639b74aee9Jim Miller    private static final int CARRIER_HELP_TEXT = 12;
596b05d58018c2806459c121e507c005639b74aee9Jim Miller    private static final int HELP_MESSAGE_TEXT = 13;
606b05d58018c2806459c121e507c005639b74aee9Jim Miller    private static final int OWNER_INFO = 14;
613f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller    private static final int BATTERY_INFO = 15;
626b05d58018c2806459c121e507c005639b74aee9Jim Miller
636b05d58018c2806459c121e507c005639b74aee9Jim Miller    private StatusMode mStatus;
646b05d58018c2806459c121e507c005639b74aee9Jim Miller    private String mDateFormatString;
656b05d58018c2806459c121e507c005639b74aee9Jim Miller    private TransientTextManager mTransientTextManager;
666b05d58018c2806459c121e507c005639b74aee9Jim Miller
676b05d58018c2806459c121e507c005639b74aee9Jim Miller    // Views that this class controls.
686b05d58018c2806459c121e507c005639b74aee9Jim Miller    // NOTE: These may be null in some LockScreen screens and should protect from NPE
696b05d58018c2806459c121e507c005639b74aee9Jim Miller    private TextView mCarrierView;
706b05d58018c2806459c121e507c005639b74aee9Jim Miller    private TextView mDateView;
716b05d58018c2806459c121e507c005639b74aee9Jim Miller    private TextView mStatus1View;
726b05d58018c2806459c121e507c005639b74aee9Jim Miller    private TextView mOwnerInfoView;
736b05d58018c2806459c121e507c005639b74aee9Jim Miller    private TextView mAlarmStatusView;
741c18828d20807342d37000746b18a3c1696f3b2eJim Miller    private TransportControlView mTransportView;
756b05d58018c2806459c121e507c005639b74aee9Jim Miller
766b05d58018c2806459c121e507c005639b74aee9Jim Miller    // Top-level container view for above views
776b05d58018c2806459c121e507c005639b74aee9Jim Miller    private View mContainer;
786b05d58018c2806459c121e507c005639b74aee9Jim Miller
796b05d58018c2806459c121e507c005639b74aee9Jim Miller    // are we showing battery information?
806b05d58018c2806459c121e507c005639b74aee9Jim Miller    private boolean mShowingBatteryInfo = false;
816b05d58018c2806459c121e507c005639b74aee9Jim Miller
826b05d58018c2806459c121e507c005639b74aee9Jim Miller    // last known plugged in state
836b05d58018c2806459c121e507c005639b74aee9Jim Miller    private boolean mPluggedIn = false;
846b05d58018c2806459c121e507c005639b74aee9Jim Miller
856b05d58018c2806459c121e507c005639b74aee9Jim Miller    // last known battery level
866b05d58018c2806459c121e507c005639b74aee9Jim Miller    private int mBatteryLevel = 100;
876b05d58018c2806459c121e507c005639b74aee9Jim Miller
883f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller    // last known SIM state
893f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller    protected State mSimState;
903f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller
916b05d58018c2806459c121e507c005639b74aee9Jim Miller    private LockPatternUtils mLockPatternUtils;
926b05d58018c2806459c121e507c005639b74aee9Jim Miller    private KeyguardUpdateMonitor mUpdateMonitor;
936b05d58018c2806459c121e507c005639b74aee9Jim Miller    private Button mEmergencyCallButton;
941f56edc6cd377eab05d9816e93591a7139cdff96Jim Miller    private boolean mEmergencyButtonEnabledBecauseSimLocked;
956b05d58018c2806459c121e507c005639b74aee9Jim Miller
966b05d58018c2806459c121e507c005639b74aee9Jim Miller    // Shadowed text values
976b05d58018c2806459c121e507c005639b74aee9Jim Miller    private CharSequence mCarrierText;
986b05d58018c2806459c121e507c005639b74aee9Jim Miller    private CharSequence mCarrierHelpText;
996b05d58018c2806459c121e507c005639b74aee9Jim Miller    private String mHelpMessageText;
1006b05d58018c2806459c121e507c005639b74aee9Jim Miller    private String mInstructionText;
1016b05d58018c2806459c121e507c005639b74aee9Jim Miller    private CharSequence mOwnerInfoText;
1026b05d58018c2806459c121e507c005639b74aee9Jim Miller    private boolean mShowingStatus;
1036b05d58018c2806459c121e507c005639b74aee9Jim Miller    private KeyguardScreenCallback mCallback;
1041f56edc6cd377eab05d9816e93591a7139cdff96Jim Miller    private final boolean mEmergencyCallButtonEnabledInScreen;
1053f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller    private CharSequence mPlmn;
1063f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller    private CharSequence mSpn;
1071f56edc6cd377eab05d9816e93591a7139cdff96Jim Miller    protected int mPhoneState;
1086b05d58018c2806459c121e507c005639b74aee9Jim Miller
1096b05d58018c2806459c121e507c005639b74aee9Jim Miller    private class TransientTextManager {
1106b05d58018c2806459c121e507c005639b74aee9Jim Miller        private TextView mTextView;
1116b05d58018c2806459c121e507c005639b74aee9Jim Miller        private class Data {
1126b05d58018c2806459c121e507c005639b74aee9Jim Miller            final int icon;
1136b05d58018c2806459c121e507c005639b74aee9Jim Miller            final CharSequence text;
1146b05d58018c2806459c121e507c005639b74aee9Jim Miller            Data(CharSequence t, int i) {
1156b05d58018c2806459c121e507c005639b74aee9Jim Miller                text = t;
1166b05d58018c2806459c121e507c005639b74aee9Jim Miller                icon = i;
1176b05d58018c2806459c121e507c005639b74aee9Jim Miller            }
1186b05d58018c2806459c121e507c005639b74aee9Jim Miller        };
1196b05d58018c2806459c121e507c005639b74aee9Jim Miller        private ArrayList<Data> mMessages = new ArrayList<Data>(5);
1206b05d58018c2806459c121e507c005639b74aee9Jim Miller
1216b05d58018c2806459c121e507c005639b74aee9Jim Miller        TransientTextManager(TextView textView) {
1226b05d58018c2806459c121e507c005639b74aee9Jim Miller            mTextView = textView;
1236b05d58018c2806459c121e507c005639b74aee9Jim Miller        }
1246b05d58018c2806459c121e507c005639b74aee9Jim Miller
1256b05d58018c2806459c121e507c005639b74aee9Jim Miller        /* Show given message with icon for up to duration ms. Newer messages override older ones.
1266b05d58018c2806459c121e507c005639b74aee9Jim Miller         * The most recent message with the longest duration is shown as messages expire until
1276b05d58018c2806459c121e507c005639b74aee9Jim Miller         * nothing is left, in which case the text/icon is defined by a call to
1286b05d58018c2806459c121e507c005639b74aee9Jim Miller         * getAltTextMessage() */
1296b05d58018c2806459c121e507c005639b74aee9Jim Miller        void post(final CharSequence message, final int icon, long duration) {
1306b05d58018c2806459c121e507c005639b74aee9Jim Miller            if (mTextView == null) {
1316b05d58018c2806459c121e507c005639b74aee9Jim Miller                return;
1326b05d58018c2806459c121e507c005639b74aee9Jim Miller            }
1336b05d58018c2806459c121e507c005639b74aee9Jim Miller            mTextView.setText(message);
1346b05d58018c2806459c121e507c005639b74aee9Jim Miller            mTextView.setCompoundDrawablesWithIntrinsicBounds(icon, 0, 0, 0);
1356b05d58018c2806459c121e507c005639b74aee9Jim Miller            final Data data = new Data(message, icon);
1366b05d58018c2806459c121e507c005639b74aee9Jim Miller            mContainer.postDelayed(new Runnable() {
1376b05d58018c2806459c121e507c005639b74aee9Jim Miller                public void run() {
1386b05d58018c2806459c121e507c005639b74aee9Jim Miller                    mMessages.remove(data);
1396b05d58018c2806459c121e507c005639b74aee9Jim Miller                    int last = mMessages.size() - 1;
1406b05d58018c2806459c121e507c005639b74aee9Jim Miller                    final CharSequence lastText;
1416b05d58018c2806459c121e507c005639b74aee9Jim Miller                    final int lastIcon;
1426b05d58018c2806459c121e507c005639b74aee9Jim Miller                    if (last > 0) {
1436b05d58018c2806459c121e507c005639b74aee9Jim Miller                        final Data oldData = mMessages.get(last);
1446b05d58018c2806459c121e507c005639b74aee9Jim Miller                        lastText = oldData.text;
1456b05d58018c2806459c121e507c005639b74aee9Jim Miller                        lastIcon = oldData.icon;
1466b05d58018c2806459c121e507c005639b74aee9Jim Miller                    } else {
1476b05d58018c2806459c121e507c005639b74aee9Jim Miller                        final MutableInt tmpIcon = new MutableInt(0);
1486b05d58018c2806459c121e507c005639b74aee9Jim Miller                        lastText = getAltTextMessage(tmpIcon);
1496b05d58018c2806459c121e507c005639b74aee9Jim Miller                        lastIcon = tmpIcon.value;
1506b05d58018c2806459c121e507c005639b74aee9Jim Miller                    }
1516b05d58018c2806459c121e507c005639b74aee9Jim Miller                    mTextView.setText(lastText);
1526b05d58018c2806459c121e507c005639b74aee9Jim Miller                    mTextView.setCompoundDrawablesWithIntrinsicBounds(lastIcon, 0, 0, 0);
1536b05d58018c2806459c121e507c005639b74aee9Jim Miller                }
1546b05d58018c2806459c121e507c005639b74aee9Jim Miller            }, duration);
1556b05d58018c2806459c121e507c005639b74aee9Jim Miller        }
1566b05d58018c2806459c121e507c005639b74aee9Jim Miller    };
1576b05d58018c2806459c121e507c005639b74aee9Jim Miller
1581f56edc6cd377eab05d9816e93591a7139cdff96Jim Miller    /**
1591f56edc6cd377eab05d9816e93591a7139cdff96Jim Miller     *
1601f56edc6cd377eab05d9816e93591a7139cdff96Jim Miller     * @param view the containing view of all widgets
1611f56edc6cd377eab05d9816e93591a7139cdff96Jim Miller     * @param updateMonitor the update monitor to use
1621f56edc6cd377eab05d9816e93591a7139cdff96Jim Miller     * @param lockPatternUtils lock pattern util object
1631f56edc6cd377eab05d9816e93591a7139cdff96Jim Miller     * @param callback used to invoke emergency dialer
1641f56edc6cd377eab05d9816e93591a7139cdff96Jim Miller     * @param emergencyButtonEnabledInScreen whether emergency button is enabled by default
1651f56edc6cd377eab05d9816e93591a7139cdff96Jim Miller     */
1666b05d58018c2806459c121e507c005639b74aee9Jim Miller    public KeyguardStatusViewManager(View view, KeyguardUpdateMonitor updateMonitor,
167ebcd6bb1b9ac5f898621ba25c37f2e3ccd2ff33bAdam Cohen                LockPatternUtils lockPatternUtils, KeyguardScreenCallback callback,
1681f56edc6cd377eab05d9816e93591a7139cdff96Jim Miller                boolean emergencyButtonEnabledInScreen) {
1693f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller        if (DEBUG) Log.v(TAG, "KeyguardStatusViewManager()");
1706b05d58018c2806459c121e507c005639b74aee9Jim Miller        mContainer = view;
171e5ae019b8cb3f4235b0d3e5eace27ce56680c60eJim Miller        mDateFormatString = getContext().getString(R.string.abbrev_wday_month_day_no_year);
1726b05d58018c2806459c121e507c005639b74aee9Jim Miller        mLockPatternUtils = lockPatternUtils;
1736b05d58018c2806459c121e507c005639b74aee9Jim Miller        mUpdateMonitor = updateMonitor;
1746b05d58018c2806459c121e507c005639b74aee9Jim Miller        mCallback = callback;
1756b05d58018c2806459c121e507c005639b74aee9Jim Miller
1766b05d58018c2806459c121e507c005639b74aee9Jim Miller        mCarrierView = (TextView) findViewById(R.id.carrier);
1776b05d58018c2806459c121e507c005639b74aee9Jim Miller        mDateView = (TextView) findViewById(R.id.date);
1786b05d58018c2806459c121e507c005639b74aee9Jim Miller        mStatus1View = (TextView) findViewById(R.id.status1);
1796b05d58018c2806459c121e507c005639b74aee9Jim Miller        mAlarmStatusView = (TextView) findViewById(R.id.alarm_status);
1806b05d58018c2806459c121e507c005639b74aee9Jim Miller        mOwnerInfoView = (TextView) findViewById(R.id.propertyOf);
1811c18828d20807342d37000746b18a3c1696f3b2eJim Miller        mTransportView = (TransportControlView) findViewById(R.id.transport);
1826b05d58018c2806459c121e507c005639b74aee9Jim Miller        mEmergencyCallButton = (Button) findViewById(R.id.emergencyCallButton);
1831f56edc6cd377eab05d9816e93591a7139cdff96Jim Miller        mEmergencyCallButtonEnabledInScreen = emergencyButtonEnabledInScreen;
1843f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller
1853f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller        // Hide transport control view until we know we need to show it.
1863f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller        if (mTransportView != null) {
1873f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller            mTransportView.setVisibility(View.GONE);
1883f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller        }
1893f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller
1906b05d58018c2806459c121e507c005639b74aee9Jim Miller        if (mEmergencyCallButton != null) {
1916b05d58018c2806459c121e507c005639b74aee9Jim Miller            mEmergencyCallButton.setText(R.string.lockscreen_emergency_call);
1926b05d58018c2806459c121e507c005639b74aee9Jim Miller            mEmergencyCallButton.setOnClickListener(this);
1936b05d58018c2806459c121e507c005639b74aee9Jim Miller            mEmergencyCallButton.setFocusable(false); // touch only!
1946b05d58018c2806459c121e507c005639b74aee9Jim Miller        }
1956b05d58018c2806459c121e507c005639b74aee9Jim Miller
1966b05d58018c2806459c121e507c005639b74aee9Jim Miller        mTransientTextManager = new TransientTextManager(mCarrierView);
1976b05d58018c2806459c121e507c005639b74aee9Jim Miller
19819eb7014bd6d0751b21c2b00873c0fbf499abe61Jim Miller        mUpdateMonitor.registerInfoCallback(mInfoCallback);
19919eb7014bd6d0751b21c2b00873c0fbf499abe61Jim Miller        mUpdateMonitor.registerSimStateCallback(mSimStateCallback);
20019eb7014bd6d0751b21c2b00873c0fbf499abe61Jim Miller
2016b05d58018c2806459c121e507c005639b74aee9Jim Miller        resetStatusInfo();
2026b05d58018c2806459c121e507c005639b74aee9Jim Miller        refreshDate();
2036b05d58018c2806459c121e507c005639b74aee9Jim Miller        updateOwnerInfo();
2046b05d58018c2806459c121e507c005639b74aee9Jim Miller
2056b05d58018c2806459c121e507c005639b74aee9Jim Miller        // Required to get Marquee to work.
2066b05d58018c2806459c121e507c005639b74aee9Jim Miller        final View scrollableViews[] = { mCarrierView, mDateView, mStatus1View, mOwnerInfoView,
2076b05d58018c2806459c121e507c005639b74aee9Jim Miller                mAlarmStatusView };
2086b05d58018c2806459c121e507c005639b74aee9Jim Miller        for (View v : scrollableViews) {
2096b05d58018c2806459c121e507c005639b74aee9Jim Miller            if (v != null) {
2106b05d58018c2806459c121e507c005639b74aee9Jim Miller                v.setSelected(true);
2116b05d58018c2806459c121e507c005639b74aee9Jim Miller            }
2126b05d58018c2806459c121e507c005639b74aee9Jim Miller        }
2136b05d58018c2806459c121e507c005639b74aee9Jim Miller    }
2146b05d58018c2806459c121e507c005639b74aee9Jim Miller
2156b05d58018c2806459c121e507c005639b74aee9Jim Miller    private boolean inWidgetMode() {
2166b05d58018c2806459c121e507c005639b74aee9Jim Miller        return mTransportView != null && mTransportView.getVisibility() == View.VISIBLE;
2176b05d58018c2806459c121e507c005639b74aee9Jim Miller    }
2186b05d58018c2806459c121e507c005639b74aee9Jim Miller
2196b05d58018c2806459c121e507c005639b74aee9Jim Miller    void setInstructionText(String string) {
2206b05d58018c2806459c121e507c005639b74aee9Jim Miller        mInstructionText = string;
2216b05d58018c2806459c121e507c005639b74aee9Jim Miller        update(INSTRUCTION_TEXT, string);
2226b05d58018c2806459c121e507c005639b74aee9Jim Miller    }
2236b05d58018c2806459c121e507c005639b74aee9Jim Miller
2246b05d58018c2806459c121e507c005639b74aee9Jim Miller    void setCarrierText(CharSequence string) {
2256b05d58018c2806459c121e507c005639b74aee9Jim Miller        mCarrierText = string;
2266b05d58018c2806459c121e507c005639b74aee9Jim Miller        update(CARRIER_TEXT, string);
2276b05d58018c2806459c121e507c005639b74aee9Jim Miller    }
2286b05d58018c2806459c121e507c005639b74aee9Jim Miller
2296b05d58018c2806459c121e507c005639b74aee9Jim Miller    void setOwnerInfo(CharSequence string) {
2306b05d58018c2806459c121e507c005639b74aee9Jim Miller        mOwnerInfoText = string;
2316b05d58018c2806459c121e507c005639b74aee9Jim Miller        update(OWNER_INFO, string);
2326b05d58018c2806459c121e507c005639b74aee9Jim Miller    }
2336b05d58018c2806459c121e507c005639b74aee9Jim Miller
2346b05d58018c2806459c121e507c005639b74aee9Jim Miller    /**
2356b05d58018c2806459c121e507c005639b74aee9Jim Miller     * Sets the carrier help text message, if view is present. Carrier help text messages are
2366b05d58018c2806459c121e507c005639b74aee9Jim Miller     * typically for help dealing with SIMS and connectivity.
2376b05d58018c2806459c121e507c005639b74aee9Jim Miller     *
2386b05d58018c2806459c121e507c005639b74aee9Jim Miller     * @param resId resource id of the message
2396b05d58018c2806459c121e507c005639b74aee9Jim Miller     */
2406b05d58018c2806459c121e507c005639b74aee9Jim Miller    public void setCarrierHelpText(int resId) {
241e0c2d8e5d4551f4d31c7129fb2062011b41e8dddJim Miller        mCarrierHelpText = getText(resId);
2426b05d58018c2806459c121e507c005639b74aee9Jim Miller        update(CARRIER_HELP_TEXT, mCarrierHelpText);
2436b05d58018c2806459c121e507c005639b74aee9Jim Miller    }
2446b05d58018c2806459c121e507c005639b74aee9Jim Miller
245e0c2d8e5d4551f4d31c7129fb2062011b41e8dddJim Miller    private CharSequence getText(int resId) {
246e0c2d8e5d4551f4d31c7129fb2062011b41e8dddJim Miller        return resId == 0 ? null : getContext().getText(resId);
247e0c2d8e5d4551f4d31c7129fb2062011b41e8dddJim Miller    }
248e0c2d8e5d4551f4d31c7129fb2062011b41e8dddJim Miller
2496b05d58018c2806459c121e507c005639b74aee9Jim Miller    /**
2506b05d58018c2806459c121e507c005639b74aee9Jim Miller     * Unlock help message.  This is typically for help with unlock widgets, e.g. "wrong password"
2516b05d58018c2806459c121e507c005639b74aee9Jim Miller     * or "try again."
2526b05d58018c2806459c121e507c005639b74aee9Jim Miller     *
2536b05d58018c2806459c121e507c005639b74aee9Jim Miller     * @param textResId
2546b05d58018c2806459c121e507c005639b74aee9Jim Miller     * @param lockIcon
2556b05d58018c2806459c121e507c005639b74aee9Jim Miller     */
2566b05d58018c2806459c121e507c005639b74aee9Jim Miller    public void setHelpMessage(int textResId, int lockIcon) {
2571c18828d20807342d37000746b18a3c1696f3b2eJim Miller        final CharSequence tmp = getText(textResId);
2581c18828d20807342d37000746b18a3c1696f3b2eJim Miller        mHelpMessageText = tmp == null ? null : tmp.toString();
2596b05d58018c2806459c121e507c005639b74aee9Jim Miller        update(HELP_MESSAGE_TEXT, mHelpMessageText);
2606b05d58018c2806459c121e507c005639b74aee9Jim Miller    }
2616b05d58018c2806459c121e507c005639b74aee9Jim Miller
2626b05d58018c2806459c121e507c005639b74aee9Jim Miller    private void update(int what, CharSequence string) {
2636b05d58018c2806459c121e507c005639b74aee9Jim Miller        if (inWidgetMode()) {
2646b05d58018c2806459c121e507c005639b74aee9Jim Miller            if (DEBUG) Log.v(TAG, "inWidgetMode() is true");
2656b05d58018c2806459c121e507c005639b74aee9Jim Miller            // Use Transient text for messages shown while widget is shown.
2666b05d58018c2806459c121e507c005639b74aee9Jim Miller            switch (what) {
2676b05d58018c2806459c121e507c005639b74aee9Jim Miller                case INSTRUCTION_TEXT:
2686b05d58018c2806459c121e507c005639b74aee9Jim Miller                case CARRIER_HELP_TEXT:
2696b05d58018c2806459c121e507c005639b74aee9Jim Miller                case HELP_MESSAGE_TEXT:
2703f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller                case BATTERY_INFO:
2716b05d58018c2806459c121e507c005639b74aee9Jim Miller                    mTransientTextManager.post(string, 0, INSTRUCTION_RESET_DELAY);
2726b05d58018c2806459c121e507c005639b74aee9Jim Miller                    break;
2736b05d58018c2806459c121e507c005639b74aee9Jim Miller
2746b05d58018c2806459c121e507c005639b74aee9Jim Miller                case OWNER_INFO:
2756b05d58018c2806459c121e507c005639b74aee9Jim Miller                case CARRIER_TEXT:
2766b05d58018c2806459c121e507c005639b74aee9Jim Miller                default:
277f3447351f7571b5ab3c2a59832d9497bde4f6776Jim Miller                    if (DEBUG) Log.w(TAG, "Not showing message id " + what + ", str=" + string);
2786b05d58018c2806459c121e507c005639b74aee9Jim Miller            }
2796b05d58018c2806459c121e507c005639b74aee9Jim Miller        } else {
2806b05d58018c2806459c121e507c005639b74aee9Jim Miller            updateStatusLines(mShowingStatus);
2816b05d58018c2806459c121e507c005639b74aee9Jim Miller        }
2826b05d58018c2806459c121e507c005639b74aee9Jim Miller    }
2836b05d58018c2806459c121e507c005639b74aee9Jim Miller
2846b05d58018c2806459c121e507c005639b74aee9Jim Miller    public void onPause() {
2853f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller        if (DEBUG) Log.v(TAG, "onPause()");
2866b05d58018c2806459c121e507c005639b74aee9Jim Miller        mUpdateMonitor.removeCallback(mInfoCallback);
2876b05d58018c2806459c121e507c005639b74aee9Jim Miller        mUpdateMonitor.removeCallback(mSimStateCallback);
2886b05d58018c2806459c121e507c005639b74aee9Jim Miller    }
2896b05d58018c2806459c121e507c005639b74aee9Jim Miller
2906b05d58018c2806459c121e507c005639b74aee9Jim Miller    /** {@inheritDoc} */
2916b05d58018c2806459c121e507c005639b74aee9Jim Miller    public void onResume() {
2923f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller        if (DEBUG) Log.v(TAG, "onResume()");
2936b05d58018c2806459c121e507c005639b74aee9Jim Miller        mUpdateMonitor.registerInfoCallback(mInfoCallback);
2946b05d58018c2806459c121e507c005639b74aee9Jim Miller        mUpdateMonitor.registerSimStateCallback(mSimStateCallback);
2956b05d58018c2806459c121e507c005639b74aee9Jim Miller        resetStatusInfo();
2966b05d58018c2806459c121e507c005639b74aee9Jim Miller    }
2976b05d58018c2806459c121e507c005639b74aee9Jim Miller
2986b05d58018c2806459c121e507c005639b74aee9Jim Miller    void resetStatusInfo() {
2996b05d58018c2806459c121e507c005639b74aee9Jim Miller        mInstructionText = null;
3006b05d58018c2806459c121e507c005639b74aee9Jim Miller        mShowingBatteryInfo = mUpdateMonitor.shouldShowBatteryInfo();
3016b05d58018c2806459c121e507c005639b74aee9Jim Miller        mPluggedIn = mUpdateMonitor.isDevicePluggedIn();
3026b05d58018c2806459c121e507c005639b74aee9Jim Miller        mBatteryLevel = mUpdateMonitor.getBatteryLevel();
3036b05d58018c2806459c121e507c005639b74aee9Jim Miller        updateStatusLines(true);
3046b05d58018c2806459c121e507c005639b74aee9Jim Miller    }
3056b05d58018c2806459c121e507c005639b74aee9Jim Miller
3066b05d58018c2806459c121e507c005639b74aee9Jim Miller    /**
3076b05d58018c2806459c121e507c005639b74aee9Jim Miller     * Update the status lines based on these rules:
3086b05d58018c2806459c121e507c005639b74aee9Jim Miller     * AlarmStatus: Alarm state always gets it's own line.
3096b05d58018c2806459c121e507c005639b74aee9Jim Miller     * Status1 is shared between help, battery status and generic unlock instructions,
3106b05d58018c2806459c121e507c005639b74aee9Jim Miller     * prioritized in that order.
3116b05d58018c2806459c121e507c005639b74aee9Jim Miller     * @param showStatusLines status lines are shown if true
3126b05d58018c2806459c121e507c005639b74aee9Jim Miller     */
3136b05d58018c2806459c121e507c005639b74aee9Jim Miller    void updateStatusLines(boolean showStatusLines) {
3146b05d58018c2806459c121e507c005639b74aee9Jim Miller        if (DEBUG) Log.v(TAG, "updateStatusLines(" + showStatusLines + ")");
3156b05d58018c2806459c121e507c005639b74aee9Jim Miller        mShowingStatus = showStatusLines;
3166b05d58018c2806459c121e507c005639b74aee9Jim Miller        updateAlarmInfo();
3176b05d58018c2806459c121e507c005639b74aee9Jim Miller        updateOwnerInfo();
3186b05d58018c2806459c121e507c005639b74aee9Jim Miller        updateStatus1();
3196b05d58018c2806459c121e507c005639b74aee9Jim Miller        updateCarrierText();
3206b05d58018c2806459c121e507c005639b74aee9Jim Miller    }
3216b05d58018c2806459c121e507c005639b74aee9Jim Miller
3226b05d58018c2806459c121e507c005639b74aee9Jim Miller    private void updateAlarmInfo() {
3236b05d58018c2806459c121e507c005639b74aee9Jim Miller        if (mAlarmStatusView != null) {
3246b05d58018c2806459c121e507c005639b74aee9Jim Miller            String nextAlarm = mLockPatternUtils.getNextAlarm();
3256b05d58018c2806459c121e507c005639b74aee9Jim Miller            boolean showAlarm = mShowingStatus && !TextUtils.isEmpty(nextAlarm);
3266b05d58018c2806459c121e507c005639b74aee9Jim Miller            mAlarmStatusView.setText(nextAlarm);
3276b05d58018c2806459c121e507c005639b74aee9Jim Miller            mAlarmStatusView.setCompoundDrawablesWithIntrinsicBounds(ALARM_ICON, 0, 0, 0);
3286b05d58018c2806459c121e507c005639b74aee9Jim Miller            mAlarmStatusView.setVisibility(showAlarm ? View.VISIBLE : View.GONE);
3296b05d58018c2806459c121e507c005639b74aee9Jim Miller        }
3306b05d58018c2806459c121e507c005639b74aee9Jim Miller    }
3316b05d58018c2806459c121e507c005639b74aee9Jim Miller
3326b05d58018c2806459c121e507c005639b74aee9Jim Miller    private void updateOwnerInfo() {
3336b05d58018c2806459c121e507c005639b74aee9Jim Miller        final ContentResolver res = getContext().getContentResolver();
3346b05d58018c2806459c121e507c005639b74aee9Jim Miller        final boolean ownerInfoEnabled = Settings.Secure.getInt(res,
3356b05d58018c2806459c121e507c005639b74aee9Jim Miller                Settings.Secure.LOCK_SCREEN_OWNER_INFO_ENABLED, 1) != 0;
3366b05d58018c2806459c121e507c005639b74aee9Jim Miller        mOwnerInfoText = ownerInfoEnabled ?
3376b05d58018c2806459c121e507c005639b74aee9Jim Miller                Settings.Secure.getString(res, Settings.Secure.LOCK_SCREEN_OWNER_INFO) : null;
3386b05d58018c2806459c121e507c005639b74aee9Jim Miller        if (mOwnerInfoView != null) {
3396b05d58018c2806459c121e507c005639b74aee9Jim Miller            mOwnerInfoView.setText(mOwnerInfoText);
3406b05d58018c2806459c121e507c005639b74aee9Jim Miller            mOwnerInfoView.setVisibility(TextUtils.isEmpty(mOwnerInfoText) ? View.GONE:View.VISIBLE);
3416b05d58018c2806459c121e507c005639b74aee9Jim Miller        }
3426b05d58018c2806459c121e507c005639b74aee9Jim Miller    }
3436b05d58018c2806459c121e507c005639b74aee9Jim Miller
3446b05d58018c2806459c121e507c005639b74aee9Jim Miller    private void updateStatus1() {
3456b05d58018c2806459c121e507c005639b74aee9Jim Miller        if (mStatus1View != null) {
3466b05d58018c2806459c121e507c005639b74aee9Jim Miller            MutableInt icon = new MutableInt(0);
3476b05d58018c2806459c121e507c005639b74aee9Jim Miller            CharSequence string = getPriorityTextMessage(icon);
3486b05d58018c2806459c121e507c005639b74aee9Jim Miller            mStatus1View.setText(string);
3496b05d58018c2806459c121e507c005639b74aee9Jim Miller            mStatus1View.setCompoundDrawablesWithIntrinsicBounds(icon.value, 0, 0, 0);
3506b05d58018c2806459c121e507c005639b74aee9Jim Miller            mStatus1View.setVisibility(mShowingStatus ? View.VISIBLE : View.INVISIBLE);
3516b05d58018c2806459c121e507c005639b74aee9Jim Miller        }
3526b05d58018c2806459c121e507c005639b74aee9Jim Miller    }
3536b05d58018c2806459c121e507c005639b74aee9Jim Miller
3546b05d58018c2806459c121e507c005639b74aee9Jim Miller    private void updateCarrierText() {
3556b05d58018c2806459c121e507c005639b74aee9Jim Miller        if (!inWidgetMode() && mCarrierView != null) {
3566b05d58018c2806459c121e507c005639b74aee9Jim Miller            mCarrierView.setText(mCarrierText);
3576b05d58018c2806459c121e507c005639b74aee9Jim Miller        }
3586b05d58018c2806459c121e507c005639b74aee9Jim Miller    }
3596b05d58018c2806459c121e507c005639b74aee9Jim Miller
3606b05d58018c2806459c121e507c005639b74aee9Jim Miller    private CharSequence getAltTextMessage(MutableInt icon) {
3616b05d58018c2806459c121e507c005639b74aee9Jim Miller        // If we have replaced the status area with a single widget, then this code
3626b05d58018c2806459c121e507c005639b74aee9Jim Miller        // prioritizes what to show in that space when all transient messages are gone.
3636b05d58018c2806459c121e507c005639b74aee9Jim Miller        CharSequence string = null;
3646b05d58018c2806459c121e507c005639b74aee9Jim Miller        if (mShowingBatteryInfo) {
3656b05d58018c2806459c121e507c005639b74aee9Jim Miller            // Battery status
3666b05d58018c2806459c121e507c005639b74aee9Jim Miller            if (mPluggedIn) {
3676b05d58018c2806459c121e507c005639b74aee9Jim Miller                // Charging or charged
3686b05d58018c2806459c121e507c005639b74aee9Jim Miller                if (mUpdateMonitor.isDeviceCharged()) {
3696b05d58018c2806459c121e507c005639b74aee9Jim Miller                    string = getContext().getString(R.string.lockscreen_charged);
3706b05d58018c2806459c121e507c005639b74aee9Jim Miller                } else {
3716b05d58018c2806459c121e507c005639b74aee9Jim Miller                    string = getContext().getString(R.string.lockscreen_plugged_in, mBatteryLevel);
3726b05d58018c2806459c121e507c005639b74aee9Jim Miller                }
3736b05d58018c2806459c121e507c005639b74aee9Jim Miller                icon.value = CHARGING_ICON;
3746b05d58018c2806459c121e507c005639b74aee9Jim Miller            } else if (mBatteryLevel < KeyguardUpdateMonitor.LOW_BATTERY_THRESHOLD) {
3756b05d58018c2806459c121e507c005639b74aee9Jim Miller                // Battery is low
3766b05d58018c2806459c121e507c005639b74aee9Jim Miller                string = getContext().getString(R.string.lockscreen_low_battery);
3776b05d58018c2806459c121e507c005639b74aee9Jim Miller                icon.value = BATTERY_LOW_ICON;
3786b05d58018c2806459c121e507c005639b74aee9Jim Miller            }
3796b05d58018c2806459c121e507c005639b74aee9Jim Miller        } else {
3806b05d58018c2806459c121e507c005639b74aee9Jim Miller            string = mCarrierText;
3816b05d58018c2806459c121e507c005639b74aee9Jim Miller        }
3826b05d58018c2806459c121e507c005639b74aee9Jim Miller        return string;
3836b05d58018c2806459c121e507c005639b74aee9Jim Miller    }
3846b05d58018c2806459c121e507c005639b74aee9Jim Miller
3856b05d58018c2806459c121e507c005639b74aee9Jim Miller    private CharSequence getPriorityTextMessage(MutableInt icon) {
3866b05d58018c2806459c121e507c005639b74aee9Jim Miller        CharSequence string = null;
3876b05d58018c2806459c121e507c005639b74aee9Jim Miller        if (!TextUtils.isEmpty(mInstructionText)) {
3886b05d58018c2806459c121e507c005639b74aee9Jim Miller            // Instructions only
3896b05d58018c2806459c121e507c005639b74aee9Jim Miller            string = mInstructionText;
3906b05d58018c2806459c121e507c005639b74aee9Jim Miller            icon.value = LOCK_ICON;
3916b05d58018c2806459c121e507c005639b74aee9Jim Miller        } else if (mShowingBatteryInfo) {
3926b05d58018c2806459c121e507c005639b74aee9Jim Miller            // Battery status
3936b05d58018c2806459c121e507c005639b74aee9Jim Miller            if (mPluggedIn) {
3946b05d58018c2806459c121e507c005639b74aee9Jim Miller                // Charging or charged
3956b05d58018c2806459c121e507c005639b74aee9Jim Miller                if (mUpdateMonitor.isDeviceCharged()) {
3966b05d58018c2806459c121e507c005639b74aee9Jim Miller                    string = getContext().getString(R.string.lockscreen_charged);
3976b05d58018c2806459c121e507c005639b74aee9Jim Miller                } else {
3986b05d58018c2806459c121e507c005639b74aee9Jim Miller                    string = getContext().getString(R.string.lockscreen_plugged_in, mBatteryLevel);
3996b05d58018c2806459c121e507c005639b74aee9Jim Miller                }
4006b05d58018c2806459c121e507c005639b74aee9Jim Miller                icon.value = CHARGING_ICON;
4016b05d58018c2806459c121e507c005639b74aee9Jim Miller            } else if (mBatteryLevel < KeyguardUpdateMonitor.LOW_BATTERY_THRESHOLD) {
4026b05d58018c2806459c121e507c005639b74aee9Jim Miller                // Battery is low
4036b05d58018c2806459c121e507c005639b74aee9Jim Miller                string = getContext().getString(R.string.lockscreen_low_battery);
4046b05d58018c2806459c121e507c005639b74aee9Jim Miller                icon.value = BATTERY_LOW_ICON;
4056b05d58018c2806459c121e507c005639b74aee9Jim Miller            }
4066b05d58018c2806459c121e507c005639b74aee9Jim Miller        } else if (!inWidgetMode() && mOwnerInfoView == null && mOwnerInfoText != null) {
4076b05d58018c2806459c121e507c005639b74aee9Jim Miller            // OwnerInfo shows in status if we don't have a dedicated widget
4086b05d58018c2806459c121e507c005639b74aee9Jim Miller            string = mOwnerInfoText;
4096b05d58018c2806459c121e507c005639b74aee9Jim Miller        }
4106b05d58018c2806459c121e507c005639b74aee9Jim Miller        return string;
4116b05d58018c2806459c121e507c005639b74aee9Jim Miller    }
4126b05d58018c2806459c121e507c005639b74aee9Jim Miller
4136b05d58018c2806459c121e507c005639b74aee9Jim Miller    void refreshDate() {
4146b05d58018c2806459c121e507c005639b74aee9Jim Miller        if (mDateView != null) {
4156b05d58018c2806459c121e507c005639b74aee9Jim Miller            mDateView.setText(DateFormat.format(mDateFormatString, new Date()));
4166b05d58018c2806459c121e507c005639b74aee9Jim Miller        }
4176b05d58018c2806459c121e507c005639b74aee9Jim Miller    }
4186b05d58018c2806459c121e507c005639b74aee9Jim Miller
4196b05d58018c2806459c121e507c005639b74aee9Jim Miller    /**
4206b05d58018c2806459c121e507c005639b74aee9Jim Miller     * Determine the current status of the lock screen given the sim state and other stuff.
4216b05d58018c2806459c121e507c005639b74aee9Jim Miller     */
4226b05d58018c2806459c121e507c005639b74aee9Jim Miller    public StatusMode getStatusForIccState(IccCard.State simState) {
4233f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller        // Since reading the SIM may take a while, we assume it is present until told otherwise.
4243f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller        if (simState == null) {
4253f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller            return StatusMode.Normal;
4263f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller        }
4273f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller
4283f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller        final boolean missingAndNotProvisioned = (!mUpdateMonitor.isDeviceProvisioned()
4296b05d58018c2806459c121e507c005639b74aee9Jim Miller                && (simState == IccCard.State.ABSENT || simState == IccCard.State.PERM_DISABLED));
4306b05d58018c2806459c121e507c005639b74aee9Jim Miller
4316b05d58018c2806459c121e507c005639b74aee9Jim Miller        // Assume we're NETWORK_LOCKED if not provisioned
4326b05d58018c2806459c121e507c005639b74aee9Jim Miller        simState = missingAndNotProvisioned ? State.NETWORK_LOCKED : simState;
4336b05d58018c2806459c121e507c005639b74aee9Jim Miller        switch (simState) {
4346b05d58018c2806459c121e507c005639b74aee9Jim Miller            case ABSENT:
4356b05d58018c2806459c121e507c005639b74aee9Jim Miller                return StatusMode.SimMissing;
4366b05d58018c2806459c121e507c005639b74aee9Jim Miller            case NETWORK_LOCKED:
4376b05d58018c2806459c121e507c005639b74aee9Jim Miller                return StatusMode.SimMissingLocked;
4386b05d58018c2806459c121e507c005639b74aee9Jim Miller            case NOT_READY:
4396b05d58018c2806459c121e507c005639b74aee9Jim Miller                return StatusMode.SimMissing;
4406b05d58018c2806459c121e507c005639b74aee9Jim Miller            case PIN_REQUIRED:
4416b05d58018c2806459c121e507c005639b74aee9Jim Miller                return StatusMode.SimLocked;
4426b05d58018c2806459c121e507c005639b74aee9Jim Miller            case PUK_REQUIRED:
4436b05d58018c2806459c121e507c005639b74aee9Jim Miller                return StatusMode.SimPukLocked;
4446b05d58018c2806459c121e507c005639b74aee9Jim Miller            case READY:
4456b05d58018c2806459c121e507c005639b74aee9Jim Miller                return StatusMode.Normal;
4466b05d58018c2806459c121e507c005639b74aee9Jim Miller            case PERM_DISABLED:
4476b05d58018c2806459c121e507c005639b74aee9Jim Miller                return StatusMode.SimPermDisabled;
4486b05d58018c2806459c121e507c005639b74aee9Jim Miller            case UNKNOWN:
4496b05d58018c2806459c121e507c005639b74aee9Jim Miller                return StatusMode.SimMissing;
4506b05d58018c2806459c121e507c005639b74aee9Jim Miller        }
4516b05d58018c2806459c121e507c005639b74aee9Jim Miller        return StatusMode.SimMissing;
4526b05d58018c2806459c121e507c005639b74aee9Jim Miller    }
4536b05d58018c2806459c121e507c005639b74aee9Jim Miller
4546b05d58018c2806459c121e507c005639b74aee9Jim Miller    private Context getContext() {
4556b05d58018c2806459c121e507c005639b74aee9Jim Miller        return mContainer.getContext();
4566b05d58018c2806459c121e507c005639b74aee9Jim Miller    }
4576b05d58018c2806459c121e507c005639b74aee9Jim Miller
4586b05d58018c2806459c121e507c005639b74aee9Jim Miller    /**
4596b05d58018c2806459c121e507c005639b74aee9Jim Miller     * Update carrier text, carrier help and emergency button to match the current status based
4606b05d58018c2806459c121e507c005639b74aee9Jim Miller     * on SIM state.
4616b05d58018c2806459c121e507c005639b74aee9Jim Miller     *
4626b05d58018c2806459c121e507c005639b74aee9Jim Miller     * @param simState
4636b05d58018c2806459c121e507c005639b74aee9Jim Miller     */
4641f56edc6cd377eab05d9816e93591a7139cdff96Jim Miller    private void updateCarrierStateWithSimStatus(State simState) {
4653f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller        if (DEBUG) Log.d(TAG, "updateCarrierTextWithSimStatus(), simState = " + simState);
4666b05d58018c2806459c121e507c005639b74aee9Jim Miller
4676b05d58018c2806459c121e507c005639b74aee9Jim Miller        CharSequence carrierText = null;
4686b05d58018c2806459c121e507c005639b74aee9Jim Miller        int carrierHelpTextId = 0;
4691f56edc6cd377eab05d9816e93591a7139cdff96Jim Miller        mEmergencyButtonEnabledBecauseSimLocked = false;
4706b05d58018c2806459c121e507c005639b74aee9Jim Miller        mStatus = getStatusForIccState(simState);
4713f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller        mSimState = simState;
4726b05d58018c2806459c121e507c005639b74aee9Jim Miller        switch (mStatus) {
4736b05d58018c2806459c121e507c005639b74aee9Jim Miller            case Normal:
4743f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller                carrierText = makeCarierString(mPlmn, mSpn);
4756b05d58018c2806459c121e507c005639b74aee9Jim Miller                break;
4766b05d58018c2806459c121e507c005639b74aee9Jim Miller
4776b05d58018c2806459c121e507c005639b74aee9Jim Miller            case NetworkLocked:
4783f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller                carrierText = makeCarierString(mPlmn,
4796b05d58018c2806459c121e507c005639b74aee9Jim Miller                        getContext().getText(R.string.lockscreen_network_locked_message));
4806b05d58018c2806459c121e507c005639b74aee9Jim Miller                carrierHelpTextId = R.string.lockscreen_instructions_when_pattern_disabled;
4816b05d58018c2806459c121e507c005639b74aee9Jim Miller                break;
4826b05d58018c2806459c121e507c005639b74aee9Jim Miller
4836b05d58018c2806459c121e507c005639b74aee9Jim Miller            case SimMissing:
4842fcd63b8cf94a947498f0aab24b9d702a6fe909bJim Miller                // Shows "No SIM card | Emergency calls only" on devices that are voice-capable.
4852fcd63b8cf94a947498f0aab24b9d702a6fe909bJim Miller                // This depends on mPlmn containing the text "Emergency calls only" when the radio
4862fcd63b8cf94a947498f0aab24b9d702a6fe909bJim Miller                // has some connectivity. Otherwise, it should be null or empty and just show
4872fcd63b8cf94a947498f0aab24b9d702a6fe909bJim Miller                // "No SIM card"
4886b05d58018c2806459c121e507c005639b74aee9Jim Miller                carrierText = getContext().getText(R.string.lockscreen_missing_sim_message_short);
4892fcd63b8cf94a947498f0aab24b9d702a6fe909bJim Miller                if (mLockPatternUtils.isEmergencyCallCapable()) {
4902fcd63b8cf94a947498f0aab24b9d702a6fe909bJim Miller                    carrierText = makeCarierString(carrierText, mPlmn);
4912fcd63b8cf94a947498f0aab24b9d702a6fe909bJim Miller                }
4926b05d58018c2806459c121e507c005639b74aee9Jim Miller                carrierHelpTextId = R.string.lockscreen_missing_sim_instructions_long;
4936b05d58018c2806459c121e507c005639b74aee9Jim Miller                break;
4946b05d58018c2806459c121e507c005639b74aee9Jim Miller
4956b05d58018c2806459c121e507c005639b74aee9Jim Miller            case SimPermDisabled:
4966b05d58018c2806459c121e507c005639b74aee9Jim Miller                carrierText = getContext().getText(R.string.lockscreen_missing_sim_message_short);
4976b05d58018c2806459c121e507c005639b74aee9Jim Miller                carrierHelpTextId = R.string.lockscreen_permanent_disabled_sim_instructions;
4981f56edc6cd377eab05d9816e93591a7139cdff96Jim Miller                mEmergencyButtonEnabledBecauseSimLocked = true;
4996b05d58018c2806459c121e507c005639b74aee9Jim Miller                break;
5006b05d58018c2806459c121e507c005639b74aee9Jim Miller
5016b05d58018c2806459c121e507c005639b74aee9Jim Miller            case SimMissingLocked:
5023f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller                carrierText = makeCarierString(mPlmn,
5036b05d58018c2806459c121e507c005639b74aee9Jim Miller                        getContext().getText(R.string.lockscreen_missing_sim_message_short));
5046b05d58018c2806459c121e507c005639b74aee9Jim Miller                carrierHelpTextId = R.string.lockscreen_missing_sim_instructions;
5051f56edc6cd377eab05d9816e93591a7139cdff96Jim Miller                mEmergencyButtonEnabledBecauseSimLocked = true;
5066b05d58018c2806459c121e507c005639b74aee9Jim Miller                break;
5076b05d58018c2806459c121e507c005639b74aee9Jim Miller
5086b05d58018c2806459c121e507c005639b74aee9Jim Miller            case SimLocked:
5093f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller                carrierText = makeCarierString(mPlmn,
5106b05d58018c2806459c121e507c005639b74aee9Jim Miller                        getContext().getText(R.string.lockscreen_sim_locked_message));
5111f56edc6cd377eab05d9816e93591a7139cdff96Jim Miller                mEmergencyButtonEnabledBecauseSimLocked = true;
5126b05d58018c2806459c121e507c005639b74aee9Jim Miller                break;
5136b05d58018c2806459c121e507c005639b74aee9Jim Miller
5146b05d58018c2806459c121e507c005639b74aee9Jim Miller            case SimPukLocked:
5153f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller                carrierText = makeCarierString(mPlmn,
5166b05d58018c2806459c121e507c005639b74aee9Jim Miller                        getContext().getText(R.string.lockscreen_sim_puk_locked_message));
5176b05d58018c2806459c121e507c005639b74aee9Jim Miller                if (!mLockPatternUtils.isPukUnlockScreenEnable()) {
5181f56edc6cd377eab05d9816e93591a7139cdff96Jim Miller                    // This means we're showing the PUK unlock screen
5191f56edc6cd377eab05d9816e93591a7139cdff96Jim Miller                    mEmergencyButtonEnabledBecauseSimLocked = true;
5206b05d58018c2806459c121e507c005639b74aee9Jim Miller                }
5216b05d58018c2806459c121e507c005639b74aee9Jim Miller                break;
5226b05d58018c2806459c121e507c005639b74aee9Jim Miller        }
5236b05d58018c2806459c121e507c005639b74aee9Jim Miller
5246b05d58018c2806459c121e507c005639b74aee9Jim Miller        setCarrierText(carrierText);
5256b05d58018c2806459c121e507c005639b74aee9Jim Miller        setCarrierHelpText(carrierHelpTextId);
5261f56edc6cd377eab05d9816e93591a7139cdff96Jim Miller        updateEmergencyCallButtonState(mPhoneState);
5276b05d58018c2806459c121e507c005639b74aee9Jim Miller    }
5286b05d58018c2806459c121e507c005639b74aee9Jim Miller
5296b05d58018c2806459c121e507c005639b74aee9Jim Miller    private View findViewById(int id) {
5306b05d58018c2806459c121e507c005639b74aee9Jim Miller        return mContainer.findViewById(id);
5316b05d58018c2806459c121e507c005639b74aee9Jim Miller    }
5326b05d58018c2806459c121e507c005639b74aee9Jim Miller
5336b05d58018c2806459c121e507c005639b74aee9Jim Miller    /**
5346b05d58018c2806459c121e507c005639b74aee9Jim Miller     * The status of this lock screen. Primarily used for widgets on LockScreen.
5356b05d58018c2806459c121e507c005639b74aee9Jim Miller     */
5366b05d58018c2806459c121e507c005639b74aee9Jim Miller    enum StatusMode {
5376b05d58018c2806459c121e507c005639b74aee9Jim Miller        /**
5386b05d58018c2806459c121e507c005639b74aee9Jim Miller         * Normal case (sim card present, it's not locked)
5396b05d58018c2806459c121e507c005639b74aee9Jim Miller         */
5406b05d58018c2806459c121e507c005639b74aee9Jim Miller        Normal(true),
5416b05d58018c2806459c121e507c005639b74aee9Jim Miller
5426b05d58018c2806459c121e507c005639b74aee9Jim Miller        /**
5436b05d58018c2806459c121e507c005639b74aee9Jim Miller         * The sim card is 'network locked'.
5446b05d58018c2806459c121e507c005639b74aee9Jim Miller         */
5456b05d58018c2806459c121e507c005639b74aee9Jim Miller        NetworkLocked(true),
5466b05d58018c2806459c121e507c005639b74aee9Jim Miller
5476b05d58018c2806459c121e507c005639b74aee9Jim Miller        /**
5486b05d58018c2806459c121e507c005639b74aee9Jim Miller         * The sim card is missing.
5496b05d58018c2806459c121e507c005639b74aee9Jim Miller         */
5506b05d58018c2806459c121e507c005639b74aee9Jim Miller        SimMissing(false),
5516b05d58018c2806459c121e507c005639b74aee9Jim Miller
5526b05d58018c2806459c121e507c005639b74aee9Jim Miller        /**
5536b05d58018c2806459c121e507c005639b74aee9Jim Miller         * The sim card is missing, and this is the device isn't provisioned, so we don't let
5546b05d58018c2806459c121e507c005639b74aee9Jim Miller         * them get past the screen.
5556b05d58018c2806459c121e507c005639b74aee9Jim Miller         */
5566b05d58018c2806459c121e507c005639b74aee9Jim Miller        SimMissingLocked(false),
5576b05d58018c2806459c121e507c005639b74aee9Jim Miller
5586b05d58018c2806459c121e507c005639b74aee9Jim Miller        /**
5596b05d58018c2806459c121e507c005639b74aee9Jim Miller         * The sim card is PUK locked, meaning they've entered the wrong sim unlock code too many
5606b05d58018c2806459c121e507c005639b74aee9Jim Miller         * times.
5616b05d58018c2806459c121e507c005639b74aee9Jim Miller         */
5626b05d58018c2806459c121e507c005639b74aee9Jim Miller        SimPukLocked(false),
5636b05d58018c2806459c121e507c005639b74aee9Jim Miller
5646b05d58018c2806459c121e507c005639b74aee9Jim Miller        /**
5656b05d58018c2806459c121e507c005639b74aee9Jim Miller         * The sim card is locked.
5666b05d58018c2806459c121e507c005639b74aee9Jim Miller         */
5676b05d58018c2806459c121e507c005639b74aee9Jim Miller        SimLocked(true),
5686b05d58018c2806459c121e507c005639b74aee9Jim Miller
5696b05d58018c2806459c121e507c005639b74aee9Jim Miller        /**
5706b05d58018c2806459c121e507c005639b74aee9Jim Miller         * The sim card is permanently disabled due to puk unlock failure
5716b05d58018c2806459c121e507c005639b74aee9Jim Miller         */
5726b05d58018c2806459c121e507c005639b74aee9Jim Miller        SimPermDisabled(false);
5736b05d58018c2806459c121e507c005639b74aee9Jim Miller
5746b05d58018c2806459c121e507c005639b74aee9Jim Miller        private final boolean mShowStatusLines;
5756b05d58018c2806459c121e507c005639b74aee9Jim Miller
5766b05d58018c2806459c121e507c005639b74aee9Jim Miller        StatusMode(boolean mShowStatusLines) {
5776b05d58018c2806459c121e507c005639b74aee9Jim Miller            this.mShowStatusLines = mShowStatusLines;
5786b05d58018c2806459c121e507c005639b74aee9Jim Miller        }
5796b05d58018c2806459c121e507c005639b74aee9Jim Miller
5806b05d58018c2806459c121e507c005639b74aee9Jim Miller        /**
5816b05d58018c2806459c121e507c005639b74aee9Jim Miller         * @return Whether the status lines (battery level and / or next alarm) are shown while
5826b05d58018c2806459c121e507c005639b74aee9Jim Miller         *         in this state.  Mostly dictated by whether this is room for them.
5836b05d58018c2806459c121e507c005639b74aee9Jim Miller         */
5846b05d58018c2806459c121e507c005639b74aee9Jim Miller        public boolean shouldShowStatusLines() {
5856b05d58018c2806459c121e507c005639b74aee9Jim Miller            return mShowStatusLines;
5866b05d58018c2806459c121e507c005639b74aee9Jim Miller        }
5876b05d58018c2806459c121e507c005639b74aee9Jim Miller    }
5886b05d58018c2806459c121e507c005639b74aee9Jim Miller
5893f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller    private void updateEmergencyCallButtonState(int phoneState) {
5906b05d58018c2806459c121e507c005639b74aee9Jim Miller        if (mEmergencyCallButton != null) {
5911f56edc6cd377eab05d9816e93591a7139cdff96Jim Miller            boolean enabledBecauseSimLocked =
5921f56edc6cd377eab05d9816e93591a7139cdff96Jim Miller                    mLockPatternUtils.isEmergencyCallEnabledWhileSimLocked()
5931f56edc6cd377eab05d9816e93591a7139cdff96Jim Miller                    && mEmergencyButtonEnabledBecauseSimLocked;
5941f56edc6cd377eab05d9816e93591a7139cdff96Jim Miller            boolean shown = mEmergencyCallButtonEnabledInScreen || enabledBecauseSimLocked;
5953f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller            mLockPatternUtils.updateEmergencyCallButtonState(mEmergencyCallButton,
5961f56edc6cd377eab05d9816e93591a7139cdff96Jim Miller                    phoneState, shown);
5976b05d58018c2806459c121e507c005639b74aee9Jim Miller        }
5986b05d58018c2806459c121e507c005639b74aee9Jim Miller    }
5996b05d58018c2806459c121e507c005639b74aee9Jim Miller
6006b05d58018c2806459c121e507c005639b74aee9Jim Miller    private KeyguardUpdateMonitor.InfoCallback mInfoCallback
6016b05d58018c2806459c121e507c005639b74aee9Jim Miller            = new KeyguardUpdateMonitor.InfoCallback() {
6026b05d58018c2806459c121e507c005639b74aee9Jim Miller
6036b05d58018c2806459c121e507c005639b74aee9Jim Miller        public void onRefreshBatteryInfo(boolean showBatteryInfo, boolean pluggedIn,
6046b05d58018c2806459c121e507c005639b74aee9Jim Miller                int batteryLevel) {
6056b05d58018c2806459c121e507c005639b74aee9Jim Miller            mShowingBatteryInfo = showBatteryInfo;
6066b05d58018c2806459c121e507c005639b74aee9Jim Miller            mPluggedIn = pluggedIn;
6076b05d58018c2806459c121e507c005639b74aee9Jim Miller            mBatteryLevel = batteryLevel;
6083f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller            final MutableInt tmpIcon = new MutableInt(0);
6093f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller            update(BATTERY_INFO, getAltTextMessage(tmpIcon));
6106b05d58018c2806459c121e507c005639b74aee9Jim Miller        }
6116b05d58018c2806459c121e507c005639b74aee9Jim Miller
6126b05d58018c2806459c121e507c005639b74aee9Jim Miller        public void onTimeChanged() {
6136b05d58018c2806459c121e507c005639b74aee9Jim Miller            refreshDate();
6146b05d58018c2806459c121e507c005639b74aee9Jim Miller        }
6156b05d58018c2806459c121e507c005639b74aee9Jim Miller
6166b05d58018c2806459c121e507c005639b74aee9Jim Miller        public void onRefreshCarrierInfo(CharSequence plmn, CharSequence spn) {
6173f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller            mPlmn = plmn;
6183f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller            mSpn = spn;
6191f56edc6cd377eab05d9816e93591a7139cdff96Jim Miller            updateCarrierStateWithSimStatus(mSimState);
6206b05d58018c2806459c121e507c005639b74aee9Jim Miller        }
6216b05d58018c2806459c121e507c005639b74aee9Jim Miller
6226b05d58018c2806459c121e507c005639b74aee9Jim Miller        public void onRingerModeChanged(int state) {
6236b05d58018c2806459c121e507c005639b74aee9Jim Miller
6246b05d58018c2806459c121e507c005639b74aee9Jim Miller        }
6256b05d58018c2806459c121e507c005639b74aee9Jim Miller
6263f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller        public void onPhoneStateChanged(int phoneState) {
6271f56edc6cd377eab05d9816e93591a7139cdff96Jim Miller            mPhoneState = phoneState;
6283f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller            updateEmergencyCallButtonState(phoneState);
6296b05d58018c2806459c121e507c005639b74aee9Jim Miller        }
630054340d0a3f242efeaf898cca38625bdcb3b4b5aJeff Sharkey
631054340d0a3f242efeaf898cca38625bdcb3b4b5aJeff Sharkey        /** {@inheritDoc} */
632054340d0a3f242efeaf898cca38625bdcb3b4b5aJeff Sharkey        public void onClockVisibilityChanged() {
633054340d0a3f242efeaf898cca38625bdcb3b4b5aJeff Sharkey            // ignored
634054340d0a3f242efeaf898cca38625bdcb3b4b5aJeff Sharkey        }
63524d7b5f22ac98392f8b2d2c94560173e44d1ca6cNick Pelly
63624d7b5f22ac98392f8b2d2c94560173e44d1ca6cNick Pelly        public void onDeviceProvisioned() {
63724d7b5f22ac98392f8b2d2c94560173e44d1ca6cNick Pelly            // ignored
63824d7b5f22ac98392f8b2d2c94560173e44d1ca6cNick Pelly        }
6396b05d58018c2806459c121e507c005639b74aee9Jim Miller    };
6406b05d58018c2806459c121e507c005639b74aee9Jim Miller
6416b05d58018c2806459c121e507c005639b74aee9Jim Miller    private SimStateCallback mSimStateCallback = new SimStateCallback() {
6426b05d58018c2806459c121e507c005639b74aee9Jim Miller
6436b05d58018c2806459c121e507c005639b74aee9Jim Miller        public void onSimStateChanged(State simState) {
6441f56edc6cd377eab05d9816e93591a7139cdff96Jim Miller            updateCarrierStateWithSimStatus(simState);
6456b05d58018c2806459c121e507c005639b74aee9Jim Miller        }
6466b05d58018c2806459c121e507c005639b74aee9Jim Miller    };
6476b05d58018c2806459c121e507c005639b74aee9Jim Miller
6486b05d58018c2806459c121e507c005639b74aee9Jim Miller    public void onClick(View v) {
6496b05d58018c2806459c121e507c005639b74aee9Jim Miller        if (v == mEmergencyCallButton) {
6506b05d58018c2806459c121e507c005639b74aee9Jim Miller            mCallback.takeEmergencyCallAction();
6516b05d58018c2806459c121e507c005639b74aee9Jim Miller        }
6526b05d58018c2806459c121e507c005639b74aee9Jim Miller    }
6533f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller
6543f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller    /**
6553f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller     * Performs concentenation of PLMN/SPN
6563f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller     * @param plmn
6573f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller     * @param spn
6583f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller     * @return
6593f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller     */
6603f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller    private static CharSequence makeCarierString(CharSequence plmn, CharSequence spn) {
661be95d778701d24c6e550bff45fa1e04c1714a721Jim Miller        final boolean plmnValid = !TextUtils.isEmpty(plmn);
662be95d778701d24c6e550bff45fa1e04c1714a721Jim Miller        final boolean spnValid = !TextUtils.isEmpty(spn);
663be95d778701d24c6e550bff45fa1e04c1714a721Jim Miller        if (plmnValid && spnValid) {
6643f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller            return plmn + "|" + spn;
665be95d778701d24c6e550bff45fa1e04c1714a721Jim Miller        } else if (plmnValid) {
666be95d778701d24c6e550bff45fa1e04c1714a721Jim Miller            return plmn;
667be95d778701d24c6e550bff45fa1e04c1714a721Jim Miller        } else if (spnValid) {
6683f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller            return spn;
6693f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller        } else {
6703f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller            return "";
6713f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller        }
6723f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller    }
6736b05d58018c2806459c121e507c005639b74aee9Jim Miller}
674