KeyguardStatusViewManager.java revision 19eb7014bd6d0751b21c2b00873c0fbf499abe61
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;
94ebcd6bb1b9ac5f898621ba25c37f2e3ccd2ff33bAdam Cohen    private boolean mUnlockDisabledDueToSimState;
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;
104ebcd6bb1b9ac5f898621ba25c37f2e3ccd2ff33bAdam Cohen    private final boolean mShowEmergencyButtonByDefault;
1053f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller    private CharSequence mPlmn;
1063f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller    private CharSequence mSpn;
1076b05d58018c2806459c121e507c005639b74aee9Jim Miller
1086b05d58018c2806459c121e507c005639b74aee9Jim Miller    private class TransientTextManager {
1096b05d58018c2806459c121e507c005639b74aee9Jim Miller        private TextView mTextView;
1106b05d58018c2806459c121e507c005639b74aee9Jim Miller        private class Data {
1116b05d58018c2806459c121e507c005639b74aee9Jim Miller            final int icon;
1126b05d58018c2806459c121e507c005639b74aee9Jim Miller            final CharSequence text;
1136b05d58018c2806459c121e507c005639b74aee9Jim Miller            Data(CharSequence t, int i) {
1146b05d58018c2806459c121e507c005639b74aee9Jim Miller                text = t;
1156b05d58018c2806459c121e507c005639b74aee9Jim Miller                icon = i;
1166b05d58018c2806459c121e507c005639b74aee9Jim Miller            }
1176b05d58018c2806459c121e507c005639b74aee9Jim Miller        };
1186b05d58018c2806459c121e507c005639b74aee9Jim Miller        private ArrayList<Data> mMessages = new ArrayList<Data>(5);
1196b05d58018c2806459c121e507c005639b74aee9Jim Miller
1206b05d58018c2806459c121e507c005639b74aee9Jim Miller        TransientTextManager(TextView textView) {
1216b05d58018c2806459c121e507c005639b74aee9Jim Miller            mTextView = textView;
1226b05d58018c2806459c121e507c005639b74aee9Jim Miller        }
1236b05d58018c2806459c121e507c005639b74aee9Jim Miller
1246b05d58018c2806459c121e507c005639b74aee9Jim Miller        /* Show given message with icon for up to duration ms. Newer messages override older ones.
1256b05d58018c2806459c121e507c005639b74aee9Jim Miller         * The most recent message with the longest duration is shown as messages expire until
1266b05d58018c2806459c121e507c005639b74aee9Jim Miller         * nothing is left, in which case the text/icon is defined by a call to
1276b05d58018c2806459c121e507c005639b74aee9Jim Miller         * getAltTextMessage() */
1286b05d58018c2806459c121e507c005639b74aee9Jim Miller        void post(final CharSequence message, final int icon, long duration) {
1296b05d58018c2806459c121e507c005639b74aee9Jim Miller            if (mTextView == null) {
1306b05d58018c2806459c121e507c005639b74aee9Jim Miller                return;
1316b05d58018c2806459c121e507c005639b74aee9Jim Miller            }
1326b05d58018c2806459c121e507c005639b74aee9Jim Miller            mTextView.setText(message);
1336b05d58018c2806459c121e507c005639b74aee9Jim Miller            mTextView.setCompoundDrawablesWithIntrinsicBounds(icon, 0, 0, 0);
1346b05d58018c2806459c121e507c005639b74aee9Jim Miller            final Data data = new Data(message, icon);
1356b05d58018c2806459c121e507c005639b74aee9Jim Miller            mContainer.postDelayed(new Runnable() {
1366b05d58018c2806459c121e507c005639b74aee9Jim Miller                public void run() {
1376b05d58018c2806459c121e507c005639b74aee9Jim Miller                    mMessages.remove(data);
1386b05d58018c2806459c121e507c005639b74aee9Jim Miller                    int last = mMessages.size() - 1;
1396b05d58018c2806459c121e507c005639b74aee9Jim Miller                    final CharSequence lastText;
1406b05d58018c2806459c121e507c005639b74aee9Jim Miller                    final int lastIcon;
1416b05d58018c2806459c121e507c005639b74aee9Jim Miller                    if (last > 0) {
1426b05d58018c2806459c121e507c005639b74aee9Jim Miller                        final Data oldData = mMessages.get(last);
1436b05d58018c2806459c121e507c005639b74aee9Jim Miller                        lastText = oldData.text;
1446b05d58018c2806459c121e507c005639b74aee9Jim Miller                        lastIcon = oldData.icon;
1456b05d58018c2806459c121e507c005639b74aee9Jim Miller                    } else {
1466b05d58018c2806459c121e507c005639b74aee9Jim Miller                        final MutableInt tmpIcon = new MutableInt(0);
1476b05d58018c2806459c121e507c005639b74aee9Jim Miller                        lastText = getAltTextMessage(tmpIcon);
1486b05d58018c2806459c121e507c005639b74aee9Jim Miller                        lastIcon = tmpIcon.value;
1496b05d58018c2806459c121e507c005639b74aee9Jim Miller                    }
1506b05d58018c2806459c121e507c005639b74aee9Jim Miller                    mTextView.setText(lastText);
1516b05d58018c2806459c121e507c005639b74aee9Jim Miller                    mTextView.setCompoundDrawablesWithIntrinsicBounds(lastIcon, 0, 0, 0);
1526b05d58018c2806459c121e507c005639b74aee9Jim Miller                }
1536b05d58018c2806459c121e507c005639b74aee9Jim Miller            }, duration);
1546b05d58018c2806459c121e507c005639b74aee9Jim Miller        }
1556b05d58018c2806459c121e507c005639b74aee9Jim Miller    };
1566b05d58018c2806459c121e507c005639b74aee9Jim Miller
1576b05d58018c2806459c121e507c005639b74aee9Jim Miller    public KeyguardStatusViewManager(View view, KeyguardUpdateMonitor updateMonitor,
158ebcd6bb1b9ac5f898621ba25c37f2e3ccd2ff33bAdam Cohen                LockPatternUtils lockPatternUtils, KeyguardScreenCallback callback,
159ebcd6bb1b9ac5f898621ba25c37f2e3ccd2ff33bAdam Cohen                boolean showEmergencyButtonByDefault) {
1603f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller        if (DEBUG) Log.v(TAG, "KeyguardStatusViewManager()");
1616b05d58018c2806459c121e507c005639b74aee9Jim Miller        mContainer = view;
1626b05d58018c2806459c121e507c005639b74aee9Jim Miller        mDateFormatString = getContext().getString(R.string.full_wday_month_day_no_year);
1636b05d58018c2806459c121e507c005639b74aee9Jim Miller        mLockPatternUtils = lockPatternUtils;
1646b05d58018c2806459c121e507c005639b74aee9Jim Miller        mUpdateMonitor = updateMonitor;
1656b05d58018c2806459c121e507c005639b74aee9Jim Miller        mCallback = callback;
1666b05d58018c2806459c121e507c005639b74aee9Jim Miller
1676b05d58018c2806459c121e507c005639b74aee9Jim Miller        mCarrierView = (TextView) findViewById(R.id.carrier);
1686b05d58018c2806459c121e507c005639b74aee9Jim Miller        mDateView = (TextView) findViewById(R.id.date);
1696b05d58018c2806459c121e507c005639b74aee9Jim Miller        mStatus1View = (TextView) findViewById(R.id.status1);
1706b05d58018c2806459c121e507c005639b74aee9Jim Miller        mAlarmStatusView = (TextView) findViewById(R.id.alarm_status);
1716b05d58018c2806459c121e507c005639b74aee9Jim Miller        mOwnerInfoView = (TextView) findViewById(R.id.propertyOf);
1721c18828d20807342d37000746b18a3c1696f3b2eJim Miller        mTransportView = (TransportControlView) findViewById(R.id.transport);
1736b05d58018c2806459c121e507c005639b74aee9Jim Miller        mEmergencyCallButton = (Button) findViewById(R.id.emergencyCallButton);
174ebcd6bb1b9ac5f898621ba25c37f2e3ccd2ff33bAdam Cohen        mShowEmergencyButtonByDefault = showEmergencyButtonByDefault;
1753f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller
1763f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller        // Hide transport control view until we know we need to show it.
1773f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller        if (mTransportView != null) {
1783f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller            mTransportView.setVisibility(View.GONE);
1793f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller        }
1803f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller
1816b05d58018c2806459c121e507c005639b74aee9Jim Miller        if (mEmergencyCallButton != null) {
1826b05d58018c2806459c121e507c005639b74aee9Jim Miller            mEmergencyCallButton.setText(R.string.lockscreen_emergency_call);
1836b05d58018c2806459c121e507c005639b74aee9Jim Miller            mEmergencyCallButton.setOnClickListener(this);
1846b05d58018c2806459c121e507c005639b74aee9Jim Miller            mEmergencyCallButton.setFocusable(false); // touch only!
1856b05d58018c2806459c121e507c005639b74aee9Jim Miller        }
1866b05d58018c2806459c121e507c005639b74aee9Jim Miller
1876b05d58018c2806459c121e507c005639b74aee9Jim Miller        mTransientTextManager = new TransientTextManager(mCarrierView);
1886b05d58018c2806459c121e507c005639b74aee9Jim Miller
18919eb7014bd6d0751b21c2b00873c0fbf499abe61Jim Miller        mUpdateMonitor.registerInfoCallback(mInfoCallback);
19019eb7014bd6d0751b21c2b00873c0fbf499abe61Jim Miller        mUpdateMonitor.registerSimStateCallback(mSimStateCallback);
19119eb7014bd6d0751b21c2b00873c0fbf499abe61Jim Miller
1926b05d58018c2806459c121e507c005639b74aee9Jim Miller        resetStatusInfo();
1936b05d58018c2806459c121e507c005639b74aee9Jim Miller        refreshDate();
1946b05d58018c2806459c121e507c005639b74aee9Jim Miller        updateOwnerInfo();
1956b05d58018c2806459c121e507c005639b74aee9Jim Miller
1966b05d58018c2806459c121e507c005639b74aee9Jim Miller        // Required to get Marquee to work.
1976b05d58018c2806459c121e507c005639b74aee9Jim Miller        final View scrollableViews[] = { mCarrierView, mDateView, mStatus1View, mOwnerInfoView,
1986b05d58018c2806459c121e507c005639b74aee9Jim Miller                mAlarmStatusView };
1996b05d58018c2806459c121e507c005639b74aee9Jim Miller        for (View v : scrollableViews) {
2006b05d58018c2806459c121e507c005639b74aee9Jim Miller            if (v != null) {
2016b05d58018c2806459c121e507c005639b74aee9Jim Miller                v.setSelected(true);
2026b05d58018c2806459c121e507c005639b74aee9Jim Miller            }
2036b05d58018c2806459c121e507c005639b74aee9Jim Miller        }
2046b05d58018c2806459c121e507c005639b74aee9Jim Miller    }
2056b05d58018c2806459c121e507c005639b74aee9Jim Miller
2066b05d58018c2806459c121e507c005639b74aee9Jim Miller    private boolean inWidgetMode() {
2076b05d58018c2806459c121e507c005639b74aee9Jim Miller        return mTransportView != null && mTransportView.getVisibility() == View.VISIBLE;
2086b05d58018c2806459c121e507c005639b74aee9Jim Miller    }
2096b05d58018c2806459c121e507c005639b74aee9Jim Miller
2106b05d58018c2806459c121e507c005639b74aee9Jim Miller    void setInstructionText(String string) {
2116b05d58018c2806459c121e507c005639b74aee9Jim Miller        mInstructionText = string;
2126b05d58018c2806459c121e507c005639b74aee9Jim Miller        update(INSTRUCTION_TEXT, string);
2136b05d58018c2806459c121e507c005639b74aee9Jim Miller    }
2146b05d58018c2806459c121e507c005639b74aee9Jim Miller
2156b05d58018c2806459c121e507c005639b74aee9Jim Miller    void setCarrierText(CharSequence string) {
2166b05d58018c2806459c121e507c005639b74aee9Jim Miller        mCarrierText = string;
2176b05d58018c2806459c121e507c005639b74aee9Jim Miller        update(CARRIER_TEXT, string);
2186b05d58018c2806459c121e507c005639b74aee9Jim Miller    }
2196b05d58018c2806459c121e507c005639b74aee9Jim Miller
2206b05d58018c2806459c121e507c005639b74aee9Jim Miller    void setOwnerInfo(CharSequence string) {
2216b05d58018c2806459c121e507c005639b74aee9Jim Miller        mOwnerInfoText = string;
2226b05d58018c2806459c121e507c005639b74aee9Jim Miller        update(OWNER_INFO, string);
2236b05d58018c2806459c121e507c005639b74aee9Jim Miller    }
2246b05d58018c2806459c121e507c005639b74aee9Jim Miller
2256b05d58018c2806459c121e507c005639b74aee9Jim Miller    /**
2266b05d58018c2806459c121e507c005639b74aee9Jim Miller     * Sets the carrier help text message, if view is present. Carrier help text messages are
2276b05d58018c2806459c121e507c005639b74aee9Jim Miller     * typically for help dealing with SIMS and connectivity.
2286b05d58018c2806459c121e507c005639b74aee9Jim Miller     *
2296b05d58018c2806459c121e507c005639b74aee9Jim Miller     * @param resId resource id of the message
2306b05d58018c2806459c121e507c005639b74aee9Jim Miller     */
2316b05d58018c2806459c121e507c005639b74aee9Jim Miller    public void setCarrierHelpText(int resId) {
232e0c2d8e5d4551f4d31c7129fb2062011b41e8dddJim Miller        mCarrierHelpText = getText(resId);
2336b05d58018c2806459c121e507c005639b74aee9Jim Miller        update(CARRIER_HELP_TEXT, mCarrierHelpText);
2346b05d58018c2806459c121e507c005639b74aee9Jim Miller    }
2356b05d58018c2806459c121e507c005639b74aee9Jim Miller
236e0c2d8e5d4551f4d31c7129fb2062011b41e8dddJim Miller    private CharSequence getText(int resId) {
237e0c2d8e5d4551f4d31c7129fb2062011b41e8dddJim Miller        return resId == 0 ? null : getContext().getText(resId);
238e0c2d8e5d4551f4d31c7129fb2062011b41e8dddJim Miller    }
239e0c2d8e5d4551f4d31c7129fb2062011b41e8dddJim Miller
2406b05d58018c2806459c121e507c005639b74aee9Jim Miller    /**
2416b05d58018c2806459c121e507c005639b74aee9Jim Miller     * Unlock help message.  This is typically for help with unlock widgets, e.g. "wrong password"
2426b05d58018c2806459c121e507c005639b74aee9Jim Miller     * or "try again."
2436b05d58018c2806459c121e507c005639b74aee9Jim Miller     *
2446b05d58018c2806459c121e507c005639b74aee9Jim Miller     * @param textResId
2456b05d58018c2806459c121e507c005639b74aee9Jim Miller     * @param lockIcon
2466b05d58018c2806459c121e507c005639b74aee9Jim Miller     */
2476b05d58018c2806459c121e507c005639b74aee9Jim Miller    public void setHelpMessage(int textResId, int lockIcon) {
2481c18828d20807342d37000746b18a3c1696f3b2eJim Miller        final CharSequence tmp = getText(textResId);
2491c18828d20807342d37000746b18a3c1696f3b2eJim Miller        mHelpMessageText = tmp == null ? null : tmp.toString();
2506b05d58018c2806459c121e507c005639b74aee9Jim Miller        update(HELP_MESSAGE_TEXT, mHelpMessageText);
2516b05d58018c2806459c121e507c005639b74aee9Jim Miller    }
2526b05d58018c2806459c121e507c005639b74aee9Jim Miller
2536b05d58018c2806459c121e507c005639b74aee9Jim Miller    private void update(int what, CharSequence string) {
2546b05d58018c2806459c121e507c005639b74aee9Jim Miller        if (inWidgetMode()) {
2556b05d58018c2806459c121e507c005639b74aee9Jim Miller            if (DEBUG) Log.v(TAG, "inWidgetMode() is true");
2566b05d58018c2806459c121e507c005639b74aee9Jim Miller            // Use Transient text for messages shown while widget is shown.
2576b05d58018c2806459c121e507c005639b74aee9Jim Miller            switch (what) {
2586b05d58018c2806459c121e507c005639b74aee9Jim Miller                case INSTRUCTION_TEXT:
2596b05d58018c2806459c121e507c005639b74aee9Jim Miller                case CARRIER_HELP_TEXT:
2606b05d58018c2806459c121e507c005639b74aee9Jim Miller                case HELP_MESSAGE_TEXT:
2613f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller                case BATTERY_INFO:
2626b05d58018c2806459c121e507c005639b74aee9Jim Miller                    mTransientTextManager.post(string, 0, INSTRUCTION_RESET_DELAY);
2636b05d58018c2806459c121e507c005639b74aee9Jim Miller                    break;
2646b05d58018c2806459c121e507c005639b74aee9Jim Miller
2656b05d58018c2806459c121e507c005639b74aee9Jim Miller                case OWNER_INFO:
2666b05d58018c2806459c121e507c005639b74aee9Jim Miller                case CARRIER_TEXT:
2676b05d58018c2806459c121e507c005639b74aee9Jim Miller                default:
268f3447351f7571b5ab3c2a59832d9497bde4f6776Jim Miller                    if (DEBUG) Log.w(TAG, "Not showing message id " + what + ", str=" + string);
2696b05d58018c2806459c121e507c005639b74aee9Jim Miller            }
2706b05d58018c2806459c121e507c005639b74aee9Jim Miller        } else {
2716b05d58018c2806459c121e507c005639b74aee9Jim Miller            updateStatusLines(mShowingStatus);
2726b05d58018c2806459c121e507c005639b74aee9Jim Miller        }
2736b05d58018c2806459c121e507c005639b74aee9Jim Miller    }
2746b05d58018c2806459c121e507c005639b74aee9Jim Miller
2756b05d58018c2806459c121e507c005639b74aee9Jim Miller    public void onPause() {
2763f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller        if (DEBUG) Log.v(TAG, "onPause()");
2776b05d58018c2806459c121e507c005639b74aee9Jim Miller        mUpdateMonitor.removeCallback(mInfoCallback);
2786b05d58018c2806459c121e507c005639b74aee9Jim Miller        mUpdateMonitor.removeCallback(mSimStateCallback);
2796b05d58018c2806459c121e507c005639b74aee9Jim Miller    }
2806b05d58018c2806459c121e507c005639b74aee9Jim Miller
2816b05d58018c2806459c121e507c005639b74aee9Jim Miller    /** {@inheritDoc} */
2826b05d58018c2806459c121e507c005639b74aee9Jim Miller    public void onResume() {
2833f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller        if (DEBUG) Log.v(TAG, "onResume()");
2846b05d58018c2806459c121e507c005639b74aee9Jim Miller        mUpdateMonitor.registerInfoCallback(mInfoCallback);
2856b05d58018c2806459c121e507c005639b74aee9Jim Miller        mUpdateMonitor.registerSimStateCallback(mSimStateCallback);
2866b05d58018c2806459c121e507c005639b74aee9Jim Miller        resetStatusInfo();
2876b05d58018c2806459c121e507c005639b74aee9Jim Miller    }
2886b05d58018c2806459c121e507c005639b74aee9Jim Miller
2896b05d58018c2806459c121e507c005639b74aee9Jim Miller    void resetStatusInfo() {
2906b05d58018c2806459c121e507c005639b74aee9Jim Miller        mInstructionText = null;
2916b05d58018c2806459c121e507c005639b74aee9Jim Miller        mShowingBatteryInfo = mUpdateMonitor.shouldShowBatteryInfo();
2926b05d58018c2806459c121e507c005639b74aee9Jim Miller        mPluggedIn = mUpdateMonitor.isDevicePluggedIn();
2936b05d58018c2806459c121e507c005639b74aee9Jim Miller        mBatteryLevel = mUpdateMonitor.getBatteryLevel();
2946b05d58018c2806459c121e507c005639b74aee9Jim Miller        updateStatusLines(true);
2956b05d58018c2806459c121e507c005639b74aee9Jim Miller    }
2966b05d58018c2806459c121e507c005639b74aee9Jim Miller
2976b05d58018c2806459c121e507c005639b74aee9Jim Miller    /**
2986b05d58018c2806459c121e507c005639b74aee9Jim Miller     * Update the status lines based on these rules:
2996b05d58018c2806459c121e507c005639b74aee9Jim Miller     * AlarmStatus: Alarm state always gets it's own line.
3006b05d58018c2806459c121e507c005639b74aee9Jim Miller     * Status1 is shared between help, battery status and generic unlock instructions,
3016b05d58018c2806459c121e507c005639b74aee9Jim Miller     * prioritized in that order.
3026b05d58018c2806459c121e507c005639b74aee9Jim Miller     * @param showStatusLines status lines are shown if true
3036b05d58018c2806459c121e507c005639b74aee9Jim Miller     */
3046b05d58018c2806459c121e507c005639b74aee9Jim Miller    void updateStatusLines(boolean showStatusLines) {
3056b05d58018c2806459c121e507c005639b74aee9Jim Miller        if (DEBUG) Log.v(TAG, "updateStatusLines(" + showStatusLines + ")");
3066b05d58018c2806459c121e507c005639b74aee9Jim Miller        mShowingStatus = showStatusLines;
3076b05d58018c2806459c121e507c005639b74aee9Jim Miller        updateAlarmInfo();
3086b05d58018c2806459c121e507c005639b74aee9Jim Miller        updateOwnerInfo();
3096b05d58018c2806459c121e507c005639b74aee9Jim Miller        updateStatus1();
3106b05d58018c2806459c121e507c005639b74aee9Jim Miller        updateCarrierText();
3116b05d58018c2806459c121e507c005639b74aee9Jim Miller    }
3126b05d58018c2806459c121e507c005639b74aee9Jim Miller
3136b05d58018c2806459c121e507c005639b74aee9Jim Miller    private void updateAlarmInfo() {
3146b05d58018c2806459c121e507c005639b74aee9Jim Miller        if (mAlarmStatusView != null) {
3156b05d58018c2806459c121e507c005639b74aee9Jim Miller            String nextAlarm = mLockPatternUtils.getNextAlarm();
3166b05d58018c2806459c121e507c005639b74aee9Jim Miller            boolean showAlarm = mShowingStatus && !TextUtils.isEmpty(nextAlarm);
3176b05d58018c2806459c121e507c005639b74aee9Jim Miller            mAlarmStatusView.setText(nextAlarm);
3186b05d58018c2806459c121e507c005639b74aee9Jim Miller            mAlarmStatusView.setCompoundDrawablesWithIntrinsicBounds(ALARM_ICON, 0, 0, 0);
3196b05d58018c2806459c121e507c005639b74aee9Jim Miller            mAlarmStatusView.setVisibility(showAlarm ? View.VISIBLE : View.GONE);
3206b05d58018c2806459c121e507c005639b74aee9Jim Miller        }
3216b05d58018c2806459c121e507c005639b74aee9Jim Miller    }
3226b05d58018c2806459c121e507c005639b74aee9Jim Miller
3236b05d58018c2806459c121e507c005639b74aee9Jim Miller    private void updateOwnerInfo() {
3246b05d58018c2806459c121e507c005639b74aee9Jim Miller        final ContentResolver res = getContext().getContentResolver();
3256b05d58018c2806459c121e507c005639b74aee9Jim Miller        final boolean ownerInfoEnabled = Settings.Secure.getInt(res,
3266b05d58018c2806459c121e507c005639b74aee9Jim Miller                Settings.Secure.LOCK_SCREEN_OWNER_INFO_ENABLED, 1) != 0;
3276b05d58018c2806459c121e507c005639b74aee9Jim Miller        mOwnerInfoText = ownerInfoEnabled ?
3286b05d58018c2806459c121e507c005639b74aee9Jim Miller                Settings.Secure.getString(res, Settings.Secure.LOCK_SCREEN_OWNER_INFO) : null;
3296b05d58018c2806459c121e507c005639b74aee9Jim Miller        if (mOwnerInfoView != null) {
3306b05d58018c2806459c121e507c005639b74aee9Jim Miller            mOwnerInfoView.setText(mOwnerInfoText);
3316b05d58018c2806459c121e507c005639b74aee9Jim Miller            mOwnerInfoView.setVisibility(TextUtils.isEmpty(mOwnerInfoText) ? View.GONE:View.VISIBLE);
3326b05d58018c2806459c121e507c005639b74aee9Jim Miller        }
3336b05d58018c2806459c121e507c005639b74aee9Jim Miller    }
3346b05d58018c2806459c121e507c005639b74aee9Jim Miller
3356b05d58018c2806459c121e507c005639b74aee9Jim Miller    private void updateStatus1() {
3366b05d58018c2806459c121e507c005639b74aee9Jim Miller        if (mStatus1View != null) {
3376b05d58018c2806459c121e507c005639b74aee9Jim Miller            MutableInt icon = new MutableInt(0);
3386b05d58018c2806459c121e507c005639b74aee9Jim Miller            CharSequence string = getPriorityTextMessage(icon);
3396b05d58018c2806459c121e507c005639b74aee9Jim Miller            mStatus1View.setText(string);
3406b05d58018c2806459c121e507c005639b74aee9Jim Miller            mStatus1View.setCompoundDrawablesWithIntrinsicBounds(icon.value, 0, 0, 0);
3416b05d58018c2806459c121e507c005639b74aee9Jim Miller            mStatus1View.setVisibility(mShowingStatus ? View.VISIBLE : View.INVISIBLE);
3426b05d58018c2806459c121e507c005639b74aee9Jim Miller        }
3436b05d58018c2806459c121e507c005639b74aee9Jim Miller    }
3446b05d58018c2806459c121e507c005639b74aee9Jim Miller
3456b05d58018c2806459c121e507c005639b74aee9Jim Miller    private void updateCarrierText() {
3466b05d58018c2806459c121e507c005639b74aee9Jim Miller        if (!inWidgetMode() && mCarrierView != null) {
3476b05d58018c2806459c121e507c005639b74aee9Jim Miller            mCarrierView.setText(mCarrierText);
3486b05d58018c2806459c121e507c005639b74aee9Jim Miller        }
3496b05d58018c2806459c121e507c005639b74aee9Jim Miller    }
3506b05d58018c2806459c121e507c005639b74aee9Jim Miller
3516b05d58018c2806459c121e507c005639b74aee9Jim Miller    private CharSequence getAltTextMessage(MutableInt icon) {
3526b05d58018c2806459c121e507c005639b74aee9Jim Miller        // If we have replaced the status area with a single widget, then this code
3536b05d58018c2806459c121e507c005639b74aee9Jim Miller        // prioritizes what to show in that space when all transient messages are gone.
3546b05d58018c2806459c121e507c005639b74aee9Jim Miller        CharSequence string = null;
3556b05d58018c2806459c121e507c005639b74aee9Jim Miller        if (mShowingBatteryInfo) {
3566b05d58018c2806459c121e507c005639b74aee9Jim Miller            // Battery status
3576b05d58018c2806459c121e507c005639b74aee9Jim Miller            if (mPluggedIn) {
3586b05d58018c2806459c121e507c005639b74aee9Jim Miller                // Charging or charged
3596b05d58018c2806459c121e507c005639b74aee9Jim Miller                if (mUpdateMonitor.isDeviceCharged()) {
3606b05d58018c2806459c121e507c005639b74aee9Jim Miller                    string = getContext().getString(R.string.lockscreen_charged);
3616b05d58018c2806459c121e507c005639b74aee9Jim Miller                } else {
3626b05d58018c2806459c121e507c005639b74aee9Jim Miller                    string = getContext().getString(R.string.lockscreen_plugged_in, mBatteryLevel);
3636b05d58018c2806459c121e507c005639b74aee9Jim Miller                }
3646b05d58018c2806459c121e507c005639b74aee9Jim Miller                icon.value = CHARGING_ICON;
3656b05d58018c2806459c121e507c005639b74aee9Jim Miller            } else if (mBatteryLevel < KeyguardUpdateMonitor.LOW_BATTERY_THRESHOLD) {
3666b05d58018c2806459c121e507c005639b74aee9Jim Miller                // Battery is low
3676b05d58018c2806459c121e507c005639b74aee9Jim Miller                string = getContext().getString(R.string.lockscreen_low_battery);
3686b05d58018c2806459c121e507c005639b74aee9Jim Miller                icon.value = BATTERY_LOW_ICON;
3696b05d58018c2806459c121e507c005639b74aee9Jim Miller            }
3706b05d58018c2806459c121e507c005639b74aee9Jim Miller        } else {
3716b05d58018c2806459c121e507c005639b74aee9Jim Miller            string = mCarrierText;
3726b05d58018c2806459c121e507c005639b74aee9Jim Miller        }
3736b05d58018c2806459c121e507c005639b74aee9Jim Miller        return string;
3746b05d58018c2806459c121e507c005639b74aee9Jim Miller    }
3756b05d58018c2806459c121e507c005639b74aee9Jim Miller
3766b05d58018c2806459c121e507c005639b74aee9Jim Miller    private CharSequence getPriorityTextMessage(MutableInt icon) {
3776b05d58018c2806459c121e507c005639b74aee9Jim Miller        CharSequence string = null;
3786b05d58018c2806459c121e507c005639b74aee9Jim Miller        if (!TextUtils.isEmpty(mInstructionText)) {
3796b05d58018c2806459c121e507c005639b74aee9Jim Miller            // Instructions only
3806b05d58018c2806459c121e507c005639b74aee9Jim Miller            string = mInstructionText;
3816b05d58018c2806459c121e507c005639b74aee9Jim Miller            icon.value = LOCK_ICON;
3826b05d58018c2806459c121e507c005639b74aee9Jim Miller        } else if (mShowingBatteryInfo) {
3836b05d58018c2806459c121e507c005639b74aee9Jim Miller            // Battery status
3846b05d58018c2806459c121e507c005639b74aee9Jim Miller            if (mPluggedIn) {
3856b05d58018c2806459c121e507c005639b74aee9Jim Miller                // Charging or charged
3866b05d58018c2806459c121e507c005639b74aee9Jim Miller                if (mUpdateMonitor.isDeviceCharged()) {
3876b05d58018c2806459c121e507c005639b74aee9Jim Miller                    string = getContext().getString(R.string.lockscreen_charged);
3886b05d58018c2806459c121e507c005639b74aee9Jim Miller                } else {
3896b05d58018c2806459c121e507c005639b74aee9Jim Miller                    string = getContext().getString(R.string.lockscreen_plugged_in, mBatteryLevel);
3906b05d58018c2806459c121e507c005639b74aee9Jim Miller                }
3916b05d58018c2806459c121e507c005639b74aee9Jim Miller                icon.value = CHARGING_ICON;
3926b05d58018c2806459c121e507c005639b74aee9Jim Miller            } else if (mBatteryLevel < KeyguardUpdateMonitor.LOW_BATTERY_THRESHOLD) {
3936b05d58018c2806459c121e507c005639b74aee9Jim Miller                // Battery is low
3946b05d58018c2806459c121e507c005639b74aee9Jim Miller                string = getContext().getString(R.string.lockscreen_low_battery);
3956b05d58018c2806459c121e507c005639b74aee9Jim Miller                icon.value = BATTERY_LOW_ICON;
3966b05d58018c2806459c121e507c005639b74aee9Jim Miller            }
3976b05d58018c2806459c121e507c005639b74aee9Jim Miller        } else if (!inWidgetMode() && mOwnerInfoView == null && mOwnerInfoText != null) {
3986b05d58018c2806459c121e507c005639b74aee9Jim Miller            // OwnerInfo shows in status if we don't have a dedicated widget
3996b05d58018c2806459c121e507c005639b74aee9Jim Miller            string = mOwnerInfoText;
4006b05d58018c2806459c121e507c005639b74aee9Jim Miller        }
4016b05d58018c2806459c121e507c005639b74aee9Jim Miller        return string;
4026b05d58018c2806459c121e507c005639b74aee9Jim Miller    }
4036b05d58018c2806459c121e507c005639b74aee9Jim Miller
4046b05d58018c2806459c121e507c005639b74aee9Jim Miller    void refreshDate() {
4056b05d58018c2806459c121e507c005639b74aee9Jim Miller        if (mDateView != null) {
4066b05d58018c2806459c121e507c005639b74aee9Jim Miller            mDateView.setText(DateFormat.format(mDateFormatString, new Date()));
4076b05d58018c2806459c121e507c005639b74aee9Jim Miller        }
4086b05d58018c2806459c121e507c005639b74aee9Jim Miller    }
4096b05d58018c2806459c121e507c005639b74aee9Jim Miller
4106b05d58018c2806459c121e507c005639b74aee9Jim Miller    /**
4116b05d58018c2806459c121e507c005639b74aee9Jim Miller     * Determine the current status of the lock screen given the sim state and other stuff.
4126b05d58018c2806459c121e507c005639b74aee9Jim Miller     */
4136b05d58018c2806459c121e507c005639b74aee9Jim Miller    public StatusMode getStatusForIccState(IccCard.State simState) {
4143f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller        // Since reading the SIM may take a while, we assume it is present until told otherwise.
4153f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller        if (simState == null) {
4163f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller            return StatusMode.Normal;
4173f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller        }
4183f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller
4193f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller        final boolean missingAndNotProvisioned = (!mUpdateMonitor.isDeviceProvisioned()
4206b05d58018c2806459c121e507c005639b74aee9Jim Miller                && (simState == IccCard.State.ABSENT || simState == IccCard.State.PERM_DISABLED));
4216b05d58018c2806459c121e507c005639b74aee9Jim Miller
4226b05d58018c2806459c121e507c005639b74aee9Jim Miller        // Assume we're NETWORK_LOCKED if not provisioned
4236b05d58018c2806459c121e507c005639b74aee9Jim Miller        simState = missingAndNotProvisioned ? State.NETWORK_LOCKED : simState;
4246b05d58018c2806459c121e507c005639b74aee9Jim Miller        switch (simState) {
4256b05d58018c2806459c121e507c005639b74aee9Jim Miller            case ABSENT:
4266b05d58018c2806459c121e507c005639b74aee9Jim Miller                return StatusMode.SimMissing;
4276b05d58018c2806459c121e507c005639b74aee9Jim Miller            case NETWORK_LOCKED:
4286b05d58018c2806459c121e507c005639b74aee9Jim Miller                return StatusMode.SimMissingLocked;
4296b05d58018c2806459c121e507c005639b74aee9Jim Miller            case NOT_READY:
4306b05d58018c2806459c121e507c005639b74aee9Jim Miller                return StatusMode.SimMissing;
4316b05d58018c2806459c121e507c005639b74aee9Jim Miller            case PIN_REQUIRED:
4326b05d58018c2806459c121e507c005639b74aee9Jim Miller                return StatusMode.SimLocked;
4336b05d58018c2806459c121e507c005639b74aee9Jim Miller            case PUK_REQUIRED:
4346b05d58018c2806459c121e507c005639b74aee9Jim Miller                return StatusMode.SimPukLocked;
4356b05d58018c2806459c121e507c005639b74aee9Jim Miller            case READY:
4366b05d58018c2806459c121e507c005639b74aee9Jim Miller                return StatusMode.Normal;
4376b05d58018c2806459c121e507c005639b74aee9Jim Miller            case PERM_DISABLED:
4386b05d58018c2806459c121e507c005639b74aee9Jim Miller                return StatusMode.SimPermDisabled;
4396b05d58018c2806459c121e507c005639b74aee9Jim Miller            case UNKNOWN:
4406b05d58018c2806459c121e507c005639b74aee9Jim Miller                return StatusMode.SimMissing;
4416b05d58018c2806459c121e507c005639b74aee9Jim Miller        }
4426b05d58018c2806459c121e507c005639b74aee9Jim Miller        return StatusMode.SimMissing;
4436b05d58018c2806459c121e507c005639b74aee9Jim Miller    }
4446b05d58018c2806459c121e507c005639b74aee9Jim Miller
4456b05d58018c2806459c121e507c005639b74aee9Jim Miller    private Context getContext() {
4466b05d58018c2806459c121e507c005639b74aee9Jim Miller        return mContainer.getContext();
4476b05d58018c2806459c121e507c005639b74aee9Jim Miller    }
4486b05d58018c2806459c121e507c005639b74aee9Jim Miller
4496b05d58018c2806459c121e507c005639b74aee9Jim Miller    /**
4506b05d58018c2806459c121e507c005639b74aee9Jim Miller     * Update carrier text, carrier help and emergency button to match the current status based
4516b05d58018c2806459c121e507c005639b74aee9Jim Miller     * on SIM state.
4526b05d58018c2806459c121e507c005639b74aee9Jim Miller     *
4536b05d58018c2806459c121e507c005639b74aee9Jim Miller     * @param simState
4546b05d58018c2806459c121e507c005639b74aee9Jim Miller     */
4553f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller    private void updateCarrierTextWithSimStatus(State simState) {
4563f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller        if (DEBUG) Log.d(TAG, "updateCarrierTextWithSimStatus(), simState = " + simState);
4576b05d58018c2806459c121e507c005639b74aee9Jim Miller
4586b05d58018c2806459c121e507c005639b74aee9Jim Miller        CharSequence carrierText = null;
4596b05d58018c2806459c121e507c005639b74aee9Jim Miller        int carrierHelpTextId = 0;
460ebcd6bb1b9ac5f898621ba25c37f2e3ccd2ff33bAdam Cohen        mUnlockDisabledDueToSimState = false;
4616b05d58018c2806459c121e507c005639b74aee9Jim Miller        mStatus = getStatusForIccState(simState);
4623f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller        mSimState = simState;
4636b05d58018c2806459c121e507c005639b74aee9Jim Miller        switch (mStatus) {
4646b05d58018c2806459c121e507c005639b74aee9Jim Miller            case Normal:
4653f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller                carrierText = makeCarierString(mPlmn, mSpn);
4666b05d58018c2806459c121e507c005639b74aee9Jim Miller                break;
4676b05d58018c2806459c121e507c005639b74aee9Jim Miller
4686b05d58018c2806459c121e507c005639b74aee9Jim Miller            case NetworkLocked:
4693f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller                carrierText = makeCarierString(mPlmn,
4706b05d58018c2806459c121e507c005639b74aee9Jim Miller                        getContext().getText(R.string.lockscreen_network_locked_message));
4716b05d58018c2806459c121e507c005639b74aee9Jim Miller                carrierHelpTextId = R.string.lockscreen_instructions_when_pattern_disabled;
4726b05d58018c2806459c121e507c005639b74aee9Jim Miller                break;
4736b05d58018c2806459c121e507c005639b74aee9Jim Miller
4746b05d58018c2806459c121e507c005639b74aee9Jim Miller            case SimMissing:
4756b05d58018c2806459c121e507c005639b74aee9Jim Miller                carrierText = getContext().getText(R.string.lockscreen_missing_sim_message_short);
4766b05d58018c2806459c121e507c005639b74aee9Jim Miller                carrierHelpTextId = R.string.lockscreen_missing_sim_instructions_long;
4776b05d58018c2806459c121e507c005639b74aee9Jim Miller                break;
4786b05d58018c2806459c121e507c005639b74aee9Jim Miller
4796b05d58018c2806459c121e507c005639b74aee9Jim Miller            case SimPermDisabled:
4806b05d58018c2806459c121e507c005639b74aee9Jim Miller                carrierText = getContext().getText(R.string.lockscreen_missing_sim_message_short);
4816b05d58018c2806459c121e507c005639b74aee9Jim Miller                carrierHelpTextId = R.string.lockscreen_permanent_disabled_sim_instructions;
482ebcd6bb1b9ac5f898621ba25c37f2e3ccd2ff33bAdam Cohen                mUnlockDisabledDueToSimState = true;
4836b05d58018c2806459c121e507c005639b74aee9Jim Miller                break;
4846b05d58018c2806459c121e507c005639b74aee9Jim Miller
4856b05d58018c2806459c121e507c005639b74aee9Jim Miller            case SimMissingLocked:
4863f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller                carrierText = makeCarierString(mPlmn,
4876b05d58018c2806459c121e507c005639b74aee9Jim Miller                        getContext().getText(R.string.lockscreen_missing_sim_message_short));
4886b05d58018c2806459c121e507c005639b74aee9Jim Miller                carrierHelpTextId = R.string.lockscreen_missing_sim_instructions;
489ebcd6bb1b9ac5f898621ba25c37f2e3ccd2ff33bAdam Cohen                mUnlockDisabledDueToSimState = true;
4906b05d58018c2806459c121e507c005639b74aee9Jim Miller                break;
4916b05d58018c2806459c121e507c005639b74aee9Jim Miller
4926b05d58018c2806459c121e507c005639b74aee9Jim Miller            case SimLocked:
4933f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller                carrierText = makeCarierString(mPlmn,
4946b05d58018c2806459c121e507c005639b74aee9Jim Miller                        getContext().getText(R.string.lockscreen_sim_locked_message));
4956b05d58018c2806459c121e507c005639b74aee9Jim Miller                break;
4966b05d58018c2806459c121e507c005639b74aee9Jim Miller
4976b05d58018c2806459c121e507c005639b74aee9Jim Miller            case SimPukLocked:
4983f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller                carrierText = makeCarierString(mPlmn,
4996b05d58018c2806459c121e507c005639b74aee9Jim Miller                        getContext().getText(R.string.lockscreen_sim_puk_locked_message));
5006b05d58018c2806459c121e507c005639b74aee9Jim Miller                if (!mLockPatternUtils.isPukUnlockScreenEnable()) {
501ebcd6bb1b9ac5f898621ba25c37f2e3ccd2ff33bAdam Cohen                    mUnlockDisabledDueToSimState = true;
5026b05d58018c2806459c121e507c005639b74aee9Jim Miller                }
5036b05d58018c2806459c121e507c005639b74aee9Jim Miller                break;
5046b05d58018c2806459c121e507c005639b74aee9Jim Miller        }
5056b05d58018c2806459c121e507c005639b74aee9Jim Miller
5066b05d58018c2806459c121e507c005639b74aee9Jim Miller        setCarrierText(carrierText);
5076b05d58018c2806459c121e507c005639b74aee9Jim Miller        setCarrierHelpText(carrierHelpTextId);
5086b05d58018c2806459c121e507c005639b74aee9Jim Miller    }
5096b05d58018c2806459c121e507c005639b74aee9Jim Miller
5106b05d58018c2806459c121e507c005639b74aee9Jim Miller    private View findViewById(int id) {
5116b05d58018c2806459c121e507c005639b74aee9Jim Miller        return mContainer.findViewById(id);
5126b05d58018c2806459c121e507c005639b74aee9Jim Miller    }
5136b05d58018c2806459c121e507c005639b74aee9Jim Miller
5146b05d58018c2806459c121e507c005639b74aee9Jim Miller    /**
5156b05d58018c2806459c121e507c005639b74aee9Jim Miller     * The status of this lock screen. Primarily used for widgets on LockScreen.
5166b05d58018c2806459c121e507c005639b74aee9Jim Miller     */
5176b05d58018c2806459c121e507c005639b74aee9Jim Miller    enum StatusMode {
5186b05d58018c2806459c121e507c005639b74aee9Jim Miller        /**
5196b05d58018c2806459c121e507c005639b74aee9Jim Miller         * Normal case (sim card present, it's not locked)
5206b05d58018c2806459c121e507c005639b74aee9Jim Miller         */
5216b05d58018c2806459c121e507c005639b74aee9Jim Miller        Normal(true),
5226b05d58018c2806459c121e507c005639b74aee9Jim Miller
5236b05d58018c2806459c121e507c005639b74aee9Jim Miller        /**
5246b05d58018c2806459c121e507c005639b74aee9Jim Miller         * The sim card is 'network locked'.
5256b05d58018c2806459c121e507c005639b74aee9Jim Miller         */
5266b05d58018c2806459c121e507c005639b74aee9Jim Miller        NetworkLocked(true),
5276b05d58018c2806459c121e507c005639b74aee9Jim Miller
5286b05d58018c2806459c121e507c005639b74aee9Jim Miller        /**
5296b05d58018c2806459c121e507c005639b74aee9Jim Miller         * The sim card is missing.
5306b05d58018c2806459c121e507c005639b74aee9Jim Miller         */
5316b05d58018c2806459c121e507c005639b74aee9Jim Miller        SimMissing(false),
5326b05d58018c2806459c121e507c005639b74aee9Jim Miller
5336b05d58018c2806459c121e507c005639b74aee9Jim Miller        /**
5346b05d58018c2806459c121e507c005639b74aee9Jim Miller         * The sim card is missing, and this is the device isn't provisioned, so we don't let
5356b05d58018c2806459c121e507c005639b74aee9Jim Miller         * them get past the screen.
5366b05d58018c2806459c121e507c005639b74aee9Jim Miller         */
5376b05d58018c2806459c121e507c005639b74aee9Jim Miller        SimMissingLocked(false),
5386b05d58018c2806459c121e507c005639b74aee9Jim Miller
5396b05d58018c2806459c121e507c005639b74aee9Jim Miller        /**
5406b05d58018c2806459c121e507c005639b74aee9Jim Miller         * The sim card is PUK locked, meaning they've entered the wrong sim unlock code too many
5416b05d58018c2806459c121e507c005639b74aee9Jim Miller         * times.
5426b05d58018c2806459c121e507c005639b74aee9Jim Miller         */
5436b05d58018c2806459c121e507c005639b74aee9Jim Miller        SimPukLocked(false),
5446b05d58018c2806459c121e507c005639b74aee9Jim Miller
5456b05d58018c2806459c121e507c005639b74aee9Jim Miller        /**
5466b05d58018c2806459c121e507c005639b74aee9Jim Miller         * The sim card is locked.
5476b05d58018c2806459c121e507c005639b74aee9Jim Miller         */
5486b05d58018c2806459c121e507c005639b74aee9Jim Miller        SimLocked(true),
5496b05d58018c2806459c121e507c005639b74aee9Jim Miller
5506b05d58018c2806459c121e507c005639b74aee9Jim Miller        /**
5516b05d58018c2806459c121e507c005639b74aee9Jim Miller         * The sim card is permanently disabled due to puk unlock failure
5526b05d58018c2806459c121e507c005639b74aee9Jim Miller         */
5536b05d58018c2806459c121e507c005639b74aee9Jim Miller        SimPermDisabled(false);
5546b05d58018c2806459c121e507c005639b74aee9Jim Miller
5556b05d58018c2806459c121e507c005639b74aee9Jim Miller        private final boolean mShowStatusLines;
5566b05d58018c2806459c121e507c005639b74aee9Jim Miller
5576b05d58018c2806459c121e507c005639b74aee9Jim Miller        StatusMode(boolean mShowStatusLines) {
5586b05d58018c2806459c121e507c005639b74aee9Jim Miller            this.mShowStatusLines = mShowStatusLines;
5596b05d58018c2806459c121e507c005639b74aee9Jim Miller        }
5606b05d58018c2806459c121e507c005639b74aee9Jim Miller
5616b05d58018c2806459c121e507c005639b74aee9Jim Miller        /**
5626b05d58018c2806459c121e507c005639b74aee9Jim Miller         * @return Whether the status lines (battery level and / or next alarm) are shown while
5636b05d58018c2806459c121e507c005639b74aee9Jim Miller         *         in this state.  Mostly dictated by whether this is room for them.
5646b05d58018c2806459c121e507c005639b74aee9Jim Miller         */
5656b05d58018c2806459c121e507c005639b74aee9Jim Miller        public boolean shouldShowStatusLines() {
5666b05d58018c2806459c121e507c005639b74aee9Jim Miller            return mShowStatusLines;
5676b05d58018c2806459c121e507c005639b74aee9Jim Miller        }
5686b05d58018c2806459c121e507c005639b74aee9Jim Miller    }
5696b05d58018c2806459c121e507c005639b74aee9Jim Miller
5703f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller    private void updateEmergencyCallButtonState(int phoneState) {
5716b05d58018c2806459c121e507c005639b74aee9Jim Miller        if (mEmergencyCallButton != null) {
572ebcd6bb1b9ac5f898621ba25c37f2e3ccd2ff33bAdam Cohen            boolean showIfCapable = mShowEmergencyButtonByDefault || mUnlockDisabledDueToSimState;
5733f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller            mLockPatternUtils.updateEmergencyCallButtonState(mEmergencyCallButton,
5743f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller                    phoneState, showIfCapable);
5756b05d58018c2806459c121e507c005639b74aee9Jim Miller        }
5766b05d58018c2806459c121e507c005639b74aee9Jim Miller    }
5776b05d58018c2806459c121e507c005639b74aee9Jim Miller
5786b05d58018c2806459c121e507c005639b74aee9Jim Miller    private KeyguardUpdateMonitor.InfoCallback mInfoCallback
5796b05d58018c2806459c121e507c005639b74aee9Jim Miller            = new KeyguardUpdateMonitor.InfoCallback() {
5806b05d58018c2806459c121e507c005639b74aee9Jim Miller
5816b05d58018c2806459c121e507c005639b74aee9Jim Miller        public void onRefreshBatteryInfo(boolean showBatteryInfo, boolean pluggedIn,
5826b05d58018c2806459c121e507c005639b74aee9Jim Miller                int batteryLevel) {
5836b05d58018c2806459c121e507c005639b74aee9Jim Miller            mShowingBatteryInfo = showBatteryInfo;
5846b05d58018c2806459c121e507c005639b74aee9Jim Miller            mPluggedIn = pluggedIn;
5856b05d58018c2806459c121e507c005639b74aee9Jim Miller            mBatteryLevel = batteryLevel;
5863f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller            final MutableInt tmpIcon = new MutableInt(0);
5873f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller            update(BATTERY_INFO, getAltTextMessage(tmpIcon));
5886b05d58018c2806459c121e507c005639b74aee9Jim Miller        }
5896b05d58018c2806459c121e507c005639b74aee9Jim Miller
5906b05d58018c2806459c121e507c005639b74aee9Jim Miller        public void onTimeChanged() {
5916b05d58018c2806459c121e507c005639b74aee9Jim Miller            refreshDate();
5926b05d58018c2806459c121e507c005639b74aee9Jim Miller        }
5936b05d58018c2806459c121e507c005639b74aee9Jim Miller
5946b05d58018c2806459c121e507c005639b74aee9Jim Miller        public void onRefreshCarrierInfo(CharSequence plmn, CharSequence spn) {
5953f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller            mPlmn = plmn;
5963f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller            mSpn = spn;
5973f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller            updateCarrierTextWithSimStatus(mSimState);
5986b05d58018c2806459c121e507c005639b74aee9Jim Miller        }
5996b05d58018c2806459c121e507c005639b74aee9Jim Miller
6006b05d58018c2806459c121e507c005639b74aee9Jim Miller        public void onRingerModeChanged(int state) {
6016b05d58018c2806459c121e507c005639b74aee9Jim Miller
6026b05d58018c2806459c121e507c005639b74aee9Jim Miller        }
6036b05d58018c2806459c121e507c005639b74aee9Jim Miller
6043f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller        public void onPhoneStateChanged(int phoneState) {
6053f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller            updateEmergencyCallButtonState(phoneState);
6066b05d58018c2806459c121e507c005639b74aee9Jim Miller        }
607054340d0a3f242efeaf898cca38625bdcb3b4b5aJeff Sharkey
608054340d0a3f242efeaf898cca38625bdcb3b4b5aJeff Sharkey        /** {@inheritDoc} */
609054340d0a3f242efeaf898cca38625bdcb3b4b5aJeff Sharkey        public void onClockVisibilityChanged() {
610054340d0a3f242efeaf898cca38625bdcb3b4b5aJeff Sharkey            // ignored
611054340d0a3f242efeaf898cca38625bdcb3b4b5aJeff Sharkey        }
6126b05d58018c2806459c121e507c005639b74aee9Jim Miller    };
6136b05d58018c2806459c121e507c005639b74aee9Jim Miller
6146b05d58018c2806459c121e507c005639b74aee9Jim Miller    private SimStateCallback mSimStateCallback = new SimStateCallback() {
6156b05d58018c2806459c121e507c005639b74aee9Jim Miller
6166b05d58018c2806459c121e507c005639b74aee9Jim Miller        public void onSimStateChanged(State simState) {
6173f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller            updateCarrierTextWithSimStatus(simState);
6186b05d58018c2806459c121e507c005639b74aee9Jim Miller        }
6196b05d58018c2806459c121e507c005639b74aee9Jim Miller    };
6206b05d58018c2806459c121e507c005639b74aee9Jim Miller
6216b05d58018c2806459c121e507c005639b74aee9Jim Miller    public void onClick(View v) {
6226b05d58018c2806459c121e507c005639b74aee9Jim Miller        if (v == mEmergencyCallButton) {
6236b05d58018c2806459c121e507c005639b74aee9Jim Miller            mCallback.takeEmergencyCallAction();
6246b05d58018c2806459c121e507c005639b74aee9Jim Miller        }
6256b05d58018c2806459c121e507c005639b74aee9Jim Miller    }
6263f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller
6273f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller    /**
6283f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller     * Performs concentenation of PLMN/SPN
6293f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller     * @param plmn
6303f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller     * @param spn
6313f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller     * @return
6323f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller     */
6333f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller    private static CharSequence makeCarierString(CharSequence plmn, CharSequence spn) {
6343f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller        if (plmn != null && spn == null) {
6353f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller            return plmn;
6363f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller        } else if (plmn != null && spn != null) {
6373f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller            return plmn + "|" + spn;
6383f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller        } else if (plmn == null && spn != null) {
6393f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller            return spn;
6403f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller        } else {
6413f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller            return "";
6423f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller        }
6433f5f83b54fad4c797f5dbd75f050e4980e839122Jim Miller    }
6446b05d58018c2806459c121e507c005639b74aee9Jim Miller}
645