KeyguardStatusViewManager.java revision f3447351f7571b5ab3c2a59832d9497bde4f6776
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;
236b05d58018c2806459c121e507c005639b74aee9Jim Millerimport com.android.internal.policy.impl.KeyguardUpdateMonitor.SimStateCallback;
246b05d58018c2806459c121e507c005639b74aee9Jim Miller
256b05d58018c2806459c121e507c005639b74aee9Jim Millerimport java.util.ArrayList;
266b05d58018c2806459c121e507c005639b74aee9Jim Millerimport java.util.Date;
276b05d58018c2806459c121e507c005639b74aee9Jim Miller
286b05d58018c2806459c121e507c005639b74aee9Jim Millerimport libcore.util.MutableInt;
296b05d58018c2806459c121e507c005639b74aee9Jim Miller
306b05d58018c2806459c121e507c005639b74aee9Jim Millerimport android.content.ContentResolver;
316b05d58018c2806459c121e507c005639b74aee9Jim Millerimport android.content.Context;
326b05d58018c2806459c121e507c005639b74aee9Jim Millerimport android.provider.Settings;
336b05d58018c2806459c121e507c005639b74aee9Jim Millerimport android.text.TextUtils;
346b05d58018c2806459c121e507c005639b74aee9Jim Millerimport android.text.format.DateFormat;
356b05d58018c2806459c121e507c005639b74aee9Jim Millerimport android.util.Log;
366b05d58018c2806459c121e507c005639b74aee9Jim Millerimport android.view.View;
376b05d58018c2806459c121e507c005639b74aee9Jim Millerimport android.view.View.OnClickListener;
386b05d58018c2806459c121e507c005639b74aee9Jim Millerimport android.widget.Button;
396b05d58018c2806459c121e507c005639b74aee9Jim Millerimport android.widget.TextView;
406b05d58018c2806459c121e507c005639b74aee9Jim Miller
416b05d58018c2806459c121e507c005639b74aee9Jim Miller/***
426b05d58018c2806459c121e507c005639b74aee9Jim Miller * Manages a number of views inside of LockScreen layouts. See below for a list of widgets
436b05d58018c2806459c121e507c005639b74aee9Jim Miller *
446b05d58018c2806459c121e507c005639b74aee9Jim Miller */
456b05d58018c2806459c121e507c005639b74aee9Jim Millerclass KeyguardStatusViewManager implements OnClickListener {
466b05d58018c2806459c121e507c005639b74aee9Jim Miller    private static final boolean DEBUG = true;
476b05d58018c2806459c121e507c005639b74aee9Jim Miller    private static final String TAG = "KeyguardStatusView";
486b05d58018c2806459c121e507c005639b74aee9Jim Miller
496b05d58018c2806459c121e507c005639b74aee9Jim Miller    public static final int LOCK_ICON = 0; // R.drawable.ic_lock_idle_lock;
506b05d58018c2806459c121e507c005639b74aee9Jim Miller    public static final int ALARM_ICON = R.drawable.ic_lock_idle_alarm;
516b05d58018c2806459c121e507c005639b74aee9Jim Miller    public static final int CHARGING_ICON = 0; //R.drawable.ic_lock_idle_charging;
526b05d58018c2806459c121e507c005639b74aee9Jim Miller    public static final int BATTERY_LOW_ICON = 0; //R.drawable.ic_lock_idle_low_battery;
536b05d58018c2806459c121e507c005639b74aee9Jim Miller    private static final long INSTRUCTION_RESET_DELAY = 2000; // time until instruction text resets
546b05d58018c2806459c121e507c005639b74aee9Jim Miller
556b05d58018c2806459c121e507c005639b74aee9Jim Miller    private static final int SHOW_WIDGET = 8;
566b05d58018c2806459c121e507c005639b74aee9Jim Miller    private static final int HIDE_WIDGET = 9;
576b05d58018c2806459c121e507c005639b74aee9Jim Miller    private static final int INSTRUCTION_TEXT = 10;
586b05d58018c2806459c121e507c005639b74aee9Jim Miller    private static final int CARRIER_TEXT = 11;
596b05d58018c2806459c121e507c005639b74aee9Jim Miller    private static final int CARRIER_HELP_TEXT = 12;
606b05d58018c2806459c121e507c005639b74aee9Jim Miller    private static final int HELP_MESSAGE_TEXT = 13;
616b05d58018c2806459c121e507c005639b74aee9Jim Miller    private static final int OWNER_INFO = 14;
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;
746b05d58018c2806459c121e507c005639b74aee9Jim Miller    private View 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
886b05d58018c2806459c121e507c005639b74aee9Jim Miller    private LockPatternUtils mLockPatternUtils;
896b05d58018c2806459c121e507c005639b74aee9Jim Miller    private KeyguardUpdateMonitor mUpdateMonitor;
906b05d58018c2806459c121e507c005639b74aee9Jim Miller    private Button mEmergencyCallButton;
916b05d58018c2806459c121e507c005639b74aee9Jim Miller    private boolean mShouldEnableUnlock;
926b05d58018c2806459c121e507c005639b74aee9Jim Miller
936b05d58018c2806459c121e507c005639b74aee9Jim Miller    // Shadowed text values
946b05d58018c2806459c121e507c005639b74aee9Jim Miller    private CharSequence mCarrierText;
956b05d58018c2806459c121e507c005639b74aee9Jim Miller    private CharSequence mCarrierHelpText;
966b05d58018c2806459c121e507c005639b74aee9Jim Miller    private String mHelpMessageText;
976b05d58018c2806459c121e507c005639b74aee9Jim Miller    private String mInstructionText;
986b05d58018c2806459c121e507c005639b74aee9Jim Miller    private CharSequence mOwnerInfoText;
996b05d58018c2806459c121e507c005639b74aee9Jim Miller    private boolean mShowingStatus;
1006b05d58018c2806459c121e507c005639b74aee9Jim Miller    private KeyguardScreenCallback mCallback;
1016b05d58018c2806459c121e507c005639b74aee9Jim Miller    private boolean mHideEmergencyCallButton = false;
1026b05d58018c2806459c121e507c005639b74aee9Jim Miller
1036b05d58018c2806459c121e507c005639b74aee9Jim Miller    private class TransientTextManager {
1046b05d58018c2806459c121e507c005639b74aee9Jim Miller        private TextView mTextView;
1056b05d58018c2806459c121e507c005639b74aee9Jim Miller        private class Data {
1066b05d58018c2806459c121e507c005639b74aee9Jim Miller            final int icon;
1076b05d58018c2806459c121e507c005639b74aee9Jim Miller            final CharSequence text;
1086b05d58018c2806459c121e507c005639b74aee9Jim Miller            Data(CharSequence t, int i) {
1096b05d58018c2806459c121e507c005639b74aee9Jim Miller                text = t;
1106b05d58018c2806459c121e507c005639b74aee9Jim Miller                icon = i;
1116b05d58018c2806459c121e507c005639b74aee9Jim Miller            }
1126b05d58018c2806459c121e507c005639b74aee9Jim Miller        };
1136b05d58018c2806459c121e507c005639b74aee9Jim Miller        private ArrayList<Data> mMessages = new ArrayList<Data>(5);
1146b05d58018c2806459c121e507c005639b74aee9Jim Miller
1156b05d58018c2806459c121e507c005639b74aee9Jim Miller        TransientTextManager(TextView textView) {
1166b05d58018c2806459c121e507c005639b74aee9Jim Miller            mTextView = textView;
1176b05d58018c2806459c121e507c005639b74aee9Jim Miller        }
1186b05d58018c2806459c121e507c005639b74aee9Jim Miller
1196b05d58018c2806459c121e507c005639b74aee9Jim Miller        /* Show given message with icon for up to duration ms. Newer messages override older ones.
1206b05d58018c2806459c121e507c005639b74aee9Jim Miller         * The most recent message with the longest duration is shown as messages expire until
1216b05d58018c2806459c121e507c005639b74aee9Jim Miller         * nothing is left, in which case the text/icon is defined by a call to
1226b05d58018c2806459c121e507c005639b74aee9Jim Miller         * getAltTextMessage() */
1236b05d58018c2806459c121e507c005639b74aee9Jim Miller        void post(final CharSequence message, final int icon, long duration) {
1246b05d58018c2806459c121e507c005639b74aee9Jim Miller            if (mTextView == null) {
1256b05d58018c2806459c121e507c005639b74aee9Jim Miller                return;
1266b05d58018c2806459c121e507c005639b74aee9Jim Miller            }
1276b05d58018c2806459c121e507c005639b74aee9Jim Miller            mTextView.setText(message);
1286b05d58018c2806459c121e507c005639b74aee9Jim Miller            mTextView.setCompoundDrawablesWithIntrinsicBounds(icon, 0, 0, 0);
1296b05d58018c2806459c121e507c005639b74aee9Jim Miller            final Data data = new Data(message, icon);
1306b05d58018c2806459c121e507c005639b74aee9Jim Miller            mContainer.postDelayed(new Runnable() {
1316b05d58018c2806459c121e507c005639b74aee9Jim Miller                public void run() {
1326b05d58018c2806459c121e507c005639b74aee9Jim Miller                    mMessages.remove(data);
1336b05d58018c2806459c121e507c005639b74aee9Jim Miller                    int last = mMessages.size() - 1;
1346b05d58018c2806459c121e507c005639b74aee9Jim Miller                    final CharSequence lastText;
1356b05d58018c2806459c121e507c005639b74aee9Jim Miller                    final int lastIcon;
1366b05d58018c2806459c121e507c005639b74aee9Jim Miller                    if (last > 0) {
1376b05d58018c2806459c121e507c005639b74aee9Jim Miller                        final Data oldData = mMessages.get(last);
1386b05d58018c2806459c121e507c005639b74aee9Jim Miller                        lastText = oldData.text;
1396b05d58018c2806459c121e507c005639b74aee9Jim Miller                        lastIcon = oldData.icon;
1406b05d58018c2806459c121e507c005639b74aee9Jim Miller                    } else {
1416b05d58018c2806459c121e507c005639b74aee9Jim Miller                        final MutableInt tmpIcon = new MutableInt(0);
1426b05d58018c2806459c121e507c005639b74aee9Jim Miller                        lastText = getAltTextMessage(tmpIcon);
1436b05d58018c2806459c121e507c005639b74aee9Jim Miller                        lastIcon = tmpIcon.value;
1446b05d58018c2806459c121e507c005639b74aee9Jim Miller                    }
1456b05d58018c2806459c121e507c005639b74aee9Jim Miller                    mTextView.setText(lastText);
1466b05d58018c2806459c121e507c005639b74aee9Jim Miller                    mTextView.setCompoundDrawablesWithIntrinsicBounds(lastIcon, 0, 0, 0);
1476b05d58018c2806459c121e507c005639b74aee9Jim Miller                }
1486b05d58018c2806459c121e507c005639b74aee9Jim Miller            }, duration);
1496b05d58018c2806459c121e507c005639b74aee9Jim Miller        }
1506b05d58018c2806459c121e507c005639b74aee9Jim Miller    };
1516b05d58018c2806459c121e507c005639b74aee9Jim Miller
1526b05d58018c2806459c121e507c005639b74aee9Jim Miller    public KeyguardStatusViewManager(View view, KeyguardUpdateMonitor updateMonitor,
1536b05d58018c2806459c121e507c005639b74aee9Jim Miller                LockPatternUtils lockPatternUtils, KeyguardScreenCallback callback) {
1546b05d58018c2806459c121e507c005639b74aee9Jim Miller        mContainer = view;
1556b05d58018c2806459c121e507c005639b74aee9Jim Miller        mDateFormatString = getContext().getString(R.string.full_wday_month_day_no_year);
1566b05d58018c2806459c121e507c005639b74aee9Jim Miller        mLockPatternUtils = lockPatternUtils;
1576b05d58018c2806459c121e507c005639b74aee9Jim Miller        mUpdateMonitor = updateMonitor;
1586b05d58018c2806459c121e507c005639b74aee9Jim Miller        mCallback = callback;
1596b05d58018c2806459c121e507c005639b74aee9Jim Miller
1606b05d58018c2806459c121e507c005639b74aee9Jim Miller        mCarrierView = (TextView) findViewById(R.id.carrier);
1616b05d58018c2806459c121e507c005639b74aee9Jim Miller        mDateView = (TextView) findViewById(R.id.date);
1626b05d58018c2806459c121e507c005639b74aee9Jim Miller        mStatus1View = (TextView) findViewById(R.id.status1);
1636b05d58018c2806459c121e507c005639b74aee9Jim Miller        mAlarmStatusView = (TextView) findViewById(R.id.alarm_status);
1646b05d58018c2806459c121e507c005639b74aee9Jim Miller        mOwnerInfoView = (TextView) findViewById(R.id.propertyOf);
1656b05d58018c2806459c121e507c005639b74aee9Jim Miller        mTransportView = findViewById(R.id.transport);
1666b05d58018c2806459c121e507c005639b74aee9Jim Miller        mEmergencyCallButton = (Button) findViewById(R.id.emergencyCallButton);
1676b05d58018c2806459c121e507c005639b74aee9Jim Miller        if (mEmergencyCallButton != null) {
1686b05d58018c2806459c121e507c005639b74aee9Jim Miller            mEmergencyCallButton.setText(R.string.lockscreen_emergency_call);
1696b05d58018c2806459c121e507c005639b74aee9Jim Miller            mEmergencyCallButton.setOnClickListener(this);
1706b05d58018c2806459c121e507c005639b74aee9Jim Miller            mEmergencyCallButton.setFocusable(false); // touch only!
1716b05d58018c2806459c121e507c005639b74aee9Jim Miller        }
1726b05d58018c2806459c121e507c005639b74aee9Jim Miller
1736b05d58018c2806459c121e507c005639b74aee9Jim Miller        mTransientTextManager = new TransientTextManager(mCarrierView);
1746b05d58018c2806459c121e507c005639b74aee9Jim Miller
1756b05d58018c2806459c121e507c005639b74aee9Jim Miller        updateEmergencyCallButtonState();
1766b05d58018c2806459c121e507c005639b74aee9Jim Miller
1776b05d58018c2806459c121e507c005639b74aee9Jim Miller        resetStatusInfo();
1786b05d58018c2806459c121e507c005639b74aee9Jim Miller        refreshDate();
1796b05d58018c2806459c121e507c005639b74aee9Jim Miller        updateOwnerInfo();
1806b05d58018c2806459c121e507c005639b74aee9Jim Miller
1816b05d58018c2806459c121e507c005639b74aee9Jim Miller        // Required to get Marquee to work.
1826b05d58018c2806459c121e507c005639b74aee9Jim Miller        final View scrollableViews[] = { mCarrierView, mDateView, mStatus1View, mOwnerInfoView,
1836b05d58018c2806459c121e507c005639b74aee9Jim Miller                mAlarmStatusView };
1846b05d58018c2806459c121e507c005639b74aee9Jim Miller        for (View v : scrollableViews) {
1856b05d58018c2806459c121e507c005639b74aee9Jim Miller            if (v != null) {
1866b05d58018c2806459c121e507c005639b74aee9Jim Miller                v.setSelected(true);
1876b05d58018c2806459c121e507c005639b74aee9Jim Miller            }
1886b05d58018c2806459c121e507c005639b74aee9Jim Miller        }
1896b05d58018c2806459c121e507c005639b74aee9Jim Miller
1906b05d58018c2806459c121e507c005639b74aee9Jim Miller        // until we get an update...
1916b05d58018c2806459c121e507c005639b74aee9Jim Miller        setCarrierText(LockPatternUtils.getCarrierString(
1926b05d58018c2806459c121e507c005639b74aee9Jim Miller                mUpdateMonitor.getTelephonyPlmn(), mUpdateMonitor.getTelephonySpn()));
1936b05d58018c2806459c121e507c005639b74aee9Jim Miller    }
1946b05d58018c2806459c121e507c005639b74aee9Jim Miller
1956b05d58018c2806459c121e507c005639b74aee9Jim Miller    public void enterWidgetMode() {
1966b05d58018c2806459c121e507c005639b74aee9Jim Miller        if (mTransportView != null) {
1976b05d58018c2806459c121e507c005639b74aee9Jim Miller            mTransportView.setVisibility(View.VISIBLE);
1986b05d58018c2806459c121e507c005639b74aee9Jim Miller            update(SHOW_WIDGET, null);
1996b05d58018c2806459c121e507c005639b74aee9Jim Miller        }
2006b05d58018c2806459c121e507c005639b74aee9Jim Miller    }
2016b05d58018c2806459c121e507c005639b74aee9Jim Miller
2026b05d58018c2806459c121e507c005639b74aee9Jim Miller    public void leaveWidgetMode() {
2036b05d58018c2806459c121e507c005639b74aee9Jim Miller        if (mTransportView != null) {
2046b05d58018c2806459c121e507c005639b74aee9Jim Miller            mTransportView.setVisibility(View.GONE);
2056b05d58018c2806459c121e507c005639b74aee9Jim Miller            update(HIDE_WIDGET, null);
2066b05d58018c2806459c121e507c005639b74aee9Jim Miller        }
2076b05d58018c2806459c121e507c005639b74aee9Jim Miller    }
2086b05d58018c2806459c121e507c005639b74aee9Jim Miller
2096b05d58018c2806459c121e507c005639b74aee9Jim Miller    private boolean inWidgetMode() {
2106b05d58018c2806459c121e507c005639b74aee9Jim Miller        return mTransportView != null && mTransportView.getVisibility() == View.VISIBLE;
2116b05d58018c2806459c121e507c005639b74aee9Jim Miller    }
2126b05d58018c2806459c121e507c005639b74aee9Jim Miller
2136b05d58018c2806459c121e507c005639b74aee9Jim Miller    void setInstructionText(String string) {
2146b05d58018c2806459c121e507c005639b74aee9Jim Miller        mInstructionText = string;
2156b05d58018c2806459c121e507c005639b74aee9Jim Miller        update(INSTRUCTION_TEXT, string);
2166b05d58018c2806459c121e507c005639b74aee9Jim Miller    }
2176b05d58018c2806459c121e507c005639b74aee9Jim Miller
2186b05d58018c2806459c121e507c005639b74aee9Jim Miller    void setCarrierText(CharSequence string) {
2196b05d58018c2806459c121e507c005639b74aee9Jim Miller        mCarrierText = string;
2206b05d58018c2806459c121e507c005639b74aee9Jim Miller        update(CARRIER_TEXT, string);
2216b05d58018c2806459c121e507c005639b74aee9Jim Miller    }
2226b05d58018c2806459c121e507c005639b74aee9Jim Miller
2236b05d58018c2806459c121e507c005639b74aee9Jim Miller    void setOwnerInfo(CharSequence string) {
2246b05d58018c2806459c121e507c005639b74aee9Jim Miller        mOwnerInfoText = string;
2256b05d58018c2806459c121e507c005639b74aee9Jim Miller        update(OWNER_INFO, string);
2266b05d58018c2806459c121e507c005639b74aee9Jim Miller    }
2276b05d58018c2806459c121e507c005639b74aee9Jim Miller
2286b05d58018c2806459c121e507c005639b74aee9Jim Miller    /**
2296b05d58018c2806459c121e507c005639b74aee9Jim Miller     * Sets the carrier help text message, if view is present. Carrier help text messages are
2306b05d58018c2806459c121e507c005639b74aee9Jim Miller     * typically for help dealing with SIMS and connectivity.
2316b05d58018c2806459c121e507c005639b74aee9Jim Miller     *
2326b05d58018c2806459c121e507c005639b74aee9Jim Miller     * @param resId resource id of the message
2336b05d58018c2806459c121e507c005639b74aee9Jim Miller     */
2346b05d58018c2806459c121e507c005639b74aee9Jim Miller    public void setCarrierHelpText(int resId) {
235e0c2d8e5d4551f4d31c7129fb2062011b41e8dddJim Miller        mCarrierHelpText = getText(resId);
2366b05d58018c2806459c121e507c005639b74aee9Jim Miller        update(CARRIER_HELP_TEXT, mCarrierHelpText);
2376b05d58018c2806459c121e507c005639b74aee9Jim Miller    }
2386b05d58018c2806459c121e507c005639b74aee9Jim Miller
239e0c2d8e5d4551f4d31c7129fb2062011b41e8dddJim Miller    private CharSequence getText(int resId) {
240e0c2d8e5d4551f4d31c7129fb2062011b41e8dddJim Miller        return resId == 0 ? null : getContext().getText(resId);
241e0c2d8e5d4551f4d31c7129fb2062011b41e8dddJim Miller    }
242e0c2d8e5d4551f4d31c7129fb2062011b41e8dddJim Miller
2436b05d58018c2806459c121e507c005639b74aee9Jim Miller    /**
2446b05d58018c2806459c121e507c005639b74aee9Jim Miller     * Unlock help message.  This is typically for help with unlock widgets, e.g. "wrong password"
2456b05d58018c2806459c121e507c005639b74aee9Jim Miller     * or "try again."
2466b05d58018c2806459c121e507c005639b74aee9Jim Miller     *
2476b05d58018c2806459c121e507c005639b74aee9Jim Miller     * @param textResId
2486b05d58018c2806459c121e507c005639b74aee9Jim Miller     * @param lockIcon
2496b05d58018c2806459c121e507c005639b74aee9Jim Miller     */
2506b05d58018c2806459c121e507c005639b74aee9Jim Miller    public void setHelpMessage(int textResId, int lockIcon) {
251e0c2d8e5d4551f4d31c7129fb2062011b41e8dddJim Miller        mHelpMessageText = getText(textResId).toString();
2526b05d58018c2806459c121e507c005639b74aee9Jim Miller        update(HELP_MESSAGE_TEXT, mHelpMessageText);
2536b05d58018c2806459c121e507c005639b74aee9Jim Miller    }
2546b05d58018c2806459c121e507c005639b74aee9Jim Miller
2556b05d58018c2806459c121e507c005639b74aee9Jim Miller    private void update(int what, CharSequence string) {
2566b05d58018c2806459c121e507c005639b74aee9Jim Miller        if (inWidgetMode()) {
2576b05d58018c2806459c121e507c005639b74aee9Jim Miller            if (DEBUG) Log.v(TAG, "inWidgetMode() is true");
2586b05d58018c2806459c121e507c005639b74aee9Jim Miller            // Use Transient text for messages shown while widget is shown.
2596b05d58018c2806459c121e507c005639b74aee9Jim Miller            switch (what) {
2606b05d58018c2806459c121e507c005639b74aee9Jim Miller                case INSTRUCTION_TEXT:
2616b05d58018c2806459c121e507c005639b74aee9Jim Miller                case CARRIER_HELP_TEXT:
2626b05d58018c2806459c121e507c005639b74aee9Jim Miller                case HELP_MESSAGE_TEXT:
2636b05d58018c2806459c121e507c005639b74aee9Jim Miller                    mTransientTextManager.post(string, 0, INSTRUCTION_RESET_DELAY);
2646b05d58018c2806459c121e507c005639b74aee9Jim Miller                    break;
2656b05d58018c2806459c121e507c005639b74aee9Jim Miller
2666b05d58018c2806459c121e507c005639b74aee9Jim Miller                case OWNER_INFO:
2676b05d58018c2806459c121e507c005639b74aee9Jim Miller                case CARRIER_TEXT:
2686b05d58018c2806459c121e507c005639b74aee9Jim Miller                default:
269f3447351f7571b5ab3c2a59832d9497bde4f6776Jim Miller                    if (DEBUG) Log.w(TAG, "Not showing message id " + what + ", str=" + string);
2706b05d58018c2806459c121e507c005639b74aee9Jim Miller            }
2716b05d58018c2806459c121e507c005639b74aee9Jim Miller        } else {
2726b05d58018c2806459c121e507c005639b74aee9Jim Miller            updateStatusLines(mShowingStatus);
2736b05d58018c2806459c121e507c005639b74aee9Jim Miller        }
2746b05d58018c2806459c121e507c005639b74aee9Jim Miller    }
2756b05d58018c2806459c121e507c005639b74aee9Jim Miller
2766b05d58018c2806459c121e507c005639b74aee9Jim Miller    public void onPause() {
2776b05d58018c2806459c121e507c005639b74aee9Jim Miller        mUpdateMonitor.removeCallback(mInfoCallback);
2786b05d58018c2806459c121e507c005639b74aee9Jim Miller        mUpdateMonitor.removeCallback(mSimStateCallback);
2796b05d58018c2806459c121e507c005639b74aee9Jim Miller    }
2806b05d58018c2806459c121e507c005639b74aee9Jim Miller
2816b05d58018c2806459c121e507c005639b74aee9Jim Miller    /** {@inheritDoc} */
2826b05d58018c2806459c121e507c005639b74aee9Jim Miller    public void onResume() {
2836b05d58018c2806459c121e507c005639b74aee9Jim Miller        mUpdateMonitor.registerInfoCallback(mInfoCallback);
2846b05d58018c2806459c121e507c005639b74aee9Jim Miller        mUpdateMonitor.registerSimStateCallback(mSimStateCallback);
2856b05d58018c2806459c121e507c005639b74aee9Jim Miller        updateEmergencyCallButtonState();
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    boolean shouldEnableUnlock() {
4116b05d58018c2806459c121e507c005639b74aee9Jim Miller        return mShouldEnableUnlock;
4126b05d58018c2806459c121e507c005639b74aee9Jim Miller    }
4136b05d58018c2806459c121e507c005639b74aee9Jim Miller
4146b05d58018c2806459c121e507c005639b74aee9Jim Miller    /**
4156b05d58018c2806459c121e507c005639b74aee9Jim Miller     * Determine the current status of the lock screen given the sim state and other stuff.
4166b05d58018c2806459c121e507c005639b74aee9Jim Miller     */
4176b05d58018c2806459c121e507c005639b74aee9Jim Miller    public StatusMode getStatusForIccState(IccCard.State simState) {
4186b05d58018c2806459c121e507c005639b74aee9Jim Miller        boolean missingAndNotProvisioned = (!mUpdateMonitor.isDeviceProvisioned()
4196b05d58018c2806459c121e507c005639b74aee9Jim Miller                && (simState == IccCard.State.ABSENT || simState == IccCard.State.PERM_DISABLED));
4206b05d58018c2806459c121e507c005639b74aee9Jim Miller
4216b05d58018c2806459c121e507c005639b74aee9Jim Miller        // Assume we're NETWORK_LOCKED if not provisioned
4226b05d58018c2806459c121e507c005639b74aee9Jim Miller        simState = missingAndNotProvisioned ? State.NETWORK_LOCKED : simState;
4236b05d58018c2806459c121e507c005639b74aee9Jim Miller        switch (simState) {
4246b05d58018c2806459c121e507c005639b74aee9Jim Miller            case ABSENT:
4256b05d58018c2806459c121e507c005639b74aee9Jim Miller                return StatusMode.SimMissing;
4266b05d58018c2806459c121e507c005639b74aee9Jim Miller            case NETWORK_LOCKED:
4276b05d58018c2806459c121e507c005639b74aee9Jim Miller                return StatusMode.SimMissingLocked;
4286b05d58018c2806459c121e507c005639b74aee9Jim Miller            case NOT_READY:
4296b05d58018c2806459c121e507c005639b74aee9Jim Miller                return StatusMode.SimMissing;
4306b05d58018c2806459c121e507c005639b74aee9Jim Miller            case PIN_REQUIRED:
4316b05d58018c2806459c121e507c005639b74aee9Jim Miller                return StatusMode.SimLocked;
4326b05d58018c2806459c121e507c005639b74aee9Jim Miller            case PUK_REQUIRED:
4336b05d58018c2806459c121e507c005639b74aee9Jim Miller                return StatusMode.SimPukLocked;
4346b05d58018c2806459c121e507c005639b74aee9Jim Miller            case READY:
4356b05d58018c2806459c121e507c005639b74aee9Jim Miller                return StatusMode.Normal;
4366b05d58018c2806459c121e507c005639b74aee9Jim Miller            case PERM_DISABLED:
4376b05d58018c2806459c121e507c005639b74aee9Jim Miller                return StatusMode.SimPermDisabled;
4386b05d58018c2806459c121e507c005639b74aee9Jim Miller            case UNKNOWN:
4396b05d58018c2806459c121e507c005639b74aee9Jim Miller                return StatusMode.SimMissing;
4406b05d58018c2806459c121e507c005639b74aee9Jim Miller        }
4416b05d58018c2806459c121e507c005639b74aee9Jim Miller        return StatusMode.SimMissing;
4426b05d58018c2806459c121e507c005639b74aee9Jim Miller    }
4436b05d58018c2806459c121e507c005639b74aee9Jim Miller
4446b05d58018c2806459c121e507c005639b74aee9Jim Miller    private Context getContext() {
4456b05d58018c2806459c121e507c005639b74aee9Jim Miller        return mContainer.getContext();
4466b05d58018c2806459c121e507c005639b74aee9Jim Miller    }
4476b05d58018c2806459c121e507c005639b74aee9Jim Miller
4486b05d58018c2806459c121e507c005639b74aee9Jim Miller    /**
4496b05d58018c2806459c121e507c005639b74aee9Jim Miller     * Update carrier text, carrier help and emergency button to match the current status based
4506b05d58018c2806459c121e507c005639b74aee9Jim Miller     * on SIM state.
4516b05d58018c2806459c121e507c005639b74aee9Jim Miller     *
4526b05d58018c2806459c121e507c005639b74aee9Jim Miller     * @param simState
4536b05d58018c2806459c121e507c005639b74aee9Jim Miller     */
4546b05d58018c2806459c121e507c005639b74aee9Jim Miller    private void updateWithSimStatus(State simState) {
4556b05d58018c2806459c121e507c005639b74aee9Jim Miller        // The emergency call button no longer appears on this screen.
4566b05d58018c2806459c121e507c005639b74aee9Jim Miller        if (DEBUG) Log.d(TAG, "updateLayout: status=" + mStatus);
4576b05d58018c2806459c121e507c005639b74aee9Jim Miller
4586b05d58018c2806459c121e507c005639b74aee9Jim Miller        CharSequence carrierText = null;
4596b05d58018c2806459c121e507c005639b74aee9Jim Miller        int carrierHelpTextId = 0;
4606b05d58018c2806459c121e507c005639b74aee9Jim Miller        mShouldEnableUnlock = true;
4616b05d58018c2806459c121e507c005639b74aee9Jim Miller        mStatus = getStatusForIccState(simState);
4626b05d58018c2806459c121e507c005639b74aee9Jim Miller
4636b05d58018c2806459c121e507c005639b74aee9Jim Miller        switch (mStatus) {
4646b05d58018c2806459c121e507c005639b74aee9Jim Miller            case Normal:
4656b05d58018c2806459c121e507c005639b74aee9Jim Miller                carrierText = LockPatternUtils.getCarrierString(mUpdateMonitor.getTelephonyPlmn(),
4666b05d58018c2806459c121e507c005639b74aee9Jim Miller                        mUpdateMonitor.getTelephonySpn());
4676b05d58018c2806459c121e507c005639b74aee9Jim Miller                break;
4686b05d58018c2806459c121e507c005639b74aee9Jim Miller
4696b05d58018c2806459c121e507c005639b74aee9Jim Miller            case NetworkLocked:
4706b05d58018c2806459c121e507c005639b74aee9Jim Miller                carrierText = LockPatternUtils.getCarrierString(mUpdateMonitor.getTelephonyPlmn(),
4716b05d58018c2806459c121e507c005639b74aee9Jim Miller                        getContext().getText(R.string.lockscreen_network_locked_message));
4726b05d58018c2806459c121e507c005639b74aee9Jim Miller                carrierHelpTextId = R.string.lockscreen_instructions_when_pattern_disabled;
4736b05d58018c2806459c121e507c005639b74aee9Jim Miller                break;
4746b05d58018c2806459c121e507c005639b74aee9Jim Miller
4756b05d58018c2806459c121e507c005639b74aee9Jim Miller            case SimMissing:
4766b05d58018c2806459c121e507c005639b74aee9Jim Miller                carrierText = getContext().getText(R.string.lockscreen_missing_sim_message_short);
4776b05d58018c2806459c121e507c005639b74aee9Jim Miller                carrierHelpTextId = R.string.lockscreen_missing_sim_instructions_long;
4786b05d58018c2806459c121e507c005639b74aee9Jim Miller                break;
4796b05d58018c2806459c121e507c005639b74aee9Jim Miller
4806b05d58018c2806459c121e507c005639b74aee9Jim Miller            case SimPermDisabled:
4816b05d58018c2806459c121e507c005639b74aee9Jim Miller                carrierText = getContext().getText(R.string.lockscreen_missing_sim_message_short);
4826b05d58018c2806459c121e507c005639b74aee9Jim Miller                carrierHelpTextId = R.string.lockscreen_permanent_disabled_sim_instructions;
4836b05d58018c2806459c121e507c005639b74aee9Jim Miller                break;
4846b05d58018c2806459c121e507c005639b74aee9Jim Miller
4856b05d58018c2806459c121e507c005639b74aee9Jim Miller            case SimMissingLocked:
4866b05d58018c2806459c121e507c005639b74aee9Jim Miller                carrierText = LockPatternUtils.getCarrierString(mUpdateMonitor.getTelephonyPlmn(),
4876b05d58018c2806459c121e507c005639b74aee9Jim Miller                        getContext().getText(R.string.lockscreen_missing_sim_message_short));
4886b05d58018c2806459c121e507c005639b74aee9Jim Miller                carrierHelpTextId = R.string.lockscreen_missing_sim_instructions;
4896b05d58018c2806459c121e507c005639b74aee9Jim Miller                mShouldEnableUnlock = false;
4906b05d58018c2806459c121e507c005639b74aee9Jim Miller                break;
4916b05d58018c2806459c121e507c005639b74aee9Jim Miller
4926b05d58018c2806459c121e507c005639b74aee9Jim Miller            case SimLocked:
4936b05d58018c2806459c121e507c005639b74aee9Jim Miller                carrierText = LockPatternUtils.getCarrierString(mUpdateMonitor.getTelephonyPlmn(),
4946b05d58018c2806459c121e507c005639b74aee9Jim Miller                        getContext().getText(R.string.lockscreen_sim_locked_message));
4956b05d58018c2806459c121e507c005639b74aee9Jim Miller                break;
4966b05d58018c2806459c121e507c005639b74aee9Jim Miller
4976b05d58018c2806459c121e507c005639b74aee9Jim Miller            case SimPukLocked:
4986b05d58018c2806459c121e507c005639b74aee9Jim Miller                carrierText = LockPatternUtils.getCarrierString(mUpdateMonitor.getTelephonyPlmn(),
4996b05d58018c2806459c121e507c005639b74aee9Jim Miller                        getContext().getText(R.string.lockscreen_sim_puk_locked_message));
5006b05d58018c2806459c121e507c005639b74aee9Jim Miller                if (!mLockPatternUtils.isPukUnlockScreenEnable()) {
5016b05d58018c2806459c121e507c005639b74aee9Jim Miller                    mShouldEnableUnlock = false;
5026b05d58018c2806459c121e507c005639b74aee9Jim Miller                }
5036b05d58018c2806459c121e507c005639b74aee9Jim Miller                break;
5046b05d58018c2806459c121e507c005639b74aee9Jim Miller        }
5056b05d58018c2806459c121e507c005639b74aee9Jim Miller
5066b05d58018c2806459c121e507c005639b74aee9Jim Miller        setCarrierText(carrierText);
5076b05d58018c2806459c121e507c005639b74aee9Jim Miller        setCarrierHelpText(carrierHelpTextId);
5086b05d58018c2806459c121e507c005639b74aee9Jim Miller        updateEmergencyCallButtonState();
5096b05d58018c2806459c121e507c005639b74aee9Jim Miller    }
5106b05d58018c2806459c121e507c005639b74aee9Jim Miller
5116b05d58018c2806459c121e507c005639b74aee9Jim Miller    private View findViewById(int id) {
5126b05d58018c2806459c121e507c005639b74aee9Jim Miller        return mContainer.findViewById(id);
5136b05d58018c2806459c121e507c005639b74aee9Jim Miller    }
5146b05d58018c2806459c121e507c005639b74aee9Jim Miller
5156b05d58018c2806459c121e507c005639b74aee9Jim Miller    /**
5166b05d58018c2806459c121e507c005639b74aee9Jim Miller     * The status of this lock screen. Primarily used for widgets on LockScreen.
5176b05d58018c2806459c121e507c005639b74aee9Jim Miller     */
5186b05d58018c2806459c121e507c005639b74aee9Jim Miller    enum StatusMode {
5196b05d58018c2806459c121e507c005639b74aee9Jim Miller        /**
5206b05d58018c2806459c121e507c005639b74aee9Jim Miller         * Normal case (sim card present, it's not locked)
5216b05d58018c2806459c121e507c005639b74aee9Jim Miller         */
5226b05d58018c2806459c121e507c005639b74aee9Jim Miller        Normal(true),
5236b05d58018c2806459c121e507c005639b74aee9Jim Miller
5246b05d58018c2806459c121e507c005639b74aee9Jim Miller        /**
5256b05d58018c2806459c121e507c005639b74aee9Jim Miller         * The sim card is 'network locked'.
5266b05d58018c2806459c121e507c005639b74aee9Jim Miller         */
5276b05d58018c2806459c121e507c005639b74aee9Jim Miller        NetworkLocked(true),
5286b05d58018c2806459c121e507c005639b74aee9Jim Miller
5296b05d58018c2806459c121e507c005639b74aee9Jim Miller        /**
5306b05d58018c2806459c121e507c005639b74aee9Jim Miller         * The sim card is missing.
5316b05d58018c2806459c121e507c005639b74aee9Jim Miller         */
5326b05d58018c2806459c121e507c005639b74aee9Jim Miller        SimMissing(false),
5336b05d58018c2806459c121e507c005639b74aee9Jim Miller
5346b05d58018c2806459c121e507c005639b74aee9Jim Miller        /**
5356b05d58018c2806459c121e507c005639b74aee9Jim Miller         * The sim card is missing, and this is the device isn't provisioned, so we don't let
5366b05d58018c2806459c121e507c005639b74aee9Jim Miller         * them get past the screen.
5376b05d58018c2806459c121e507c005639b74aee9Jim Miller         */
5386b05d58018c2806459c121e507c005639b74aee9Jim Miller        SimMissingLocked(false),
5396b05d58018c2806459c121e507c005639b74aee9Jim Miller
5406b05d58018c2806459c121e507c005639b74aee9Jim Miller        /**
5416b05d58018c2806459c121e507c005639b74aee9Jim Miller         * The sim card is PUK locked, meaning they've entered the wrong sim unlock code too many
5426b05d58018c2806459c121e507c005639b74aee9Jim Miller         * times.
5436b05d58018c2806459c121e507c005639b74aee9Jim Miller         */
5446b05d58018c2806459c121e507c005639b74aee9Jim Miller        SimPukLocked(false),
5456b05d58018c2806459c121e507c005639b74aee9Jim Miller
5466b05d58018c2806459c121e507c005639b74aee9Jim Miller        /**
5476b05d58018c2806459c121e507c005639b74aee9Jim Miller         * The sim card is locked.
5486b05d58018c2806459c121e507c005639b74aee9Jim Miller         */
5496b05d58018c2806459c121e507c005639b74aee9Jim Miller        SimLocked(true),
5506b05d58018c2806459c121e507c005639b74aee9Jim Miller
5516b05d58018c2806459c121e507c005639b74aee9Jim Miller        /**
5526b05d58018c2806459c121e507c005639b74aee9Jim Miller         * The sim card is permanently disabled due to puk unlock failure
5536b05d58018c2806459c121e507c005639b74aee9Jim Miller         */
5546b05d58018c2806459c121e507c005639b74aee9Jim Miller        SimPermDisabled(false);
5556b05d58018c2806459c121e507c005639b74aee9Jim Miller
5566b05d58018c2806459c121e507c005639b74aee9Jim Miller        private final boolean mShowStatusLines;
5576b05d58018c2806459c121e507c005639b74aee9Jim Miller
5586b05d58018c2806459c121e507c005639b74aee9Jim Miller        StatusMode(boolean mShowStatusLines) {
5596b05d58018c2806459c121e507c005639b74aee9Jim Miller            this.mShowStatusLines = mShowStatusLines;
5606b05d58018c2806459c121e507c005639b74aee9Jim Miller        }
5616b05d58018c2806459c121e507c005639b74aee9Jim Miller
5626b05d58018c2806459c121e507c005639b74aee9Jim Miller        /**
5636b05d58018c2806459c121e507c005639b74aee9Jim Miller         * @return Whether the status lines (battery level and / or next alarm) are shown while
5646b05d58018c2806459c121e507c005639b74aee9Jim Miller         *         in this state.  Mostly dictated by whether this is room for them.
5656b05d58018c2806459c121e507c005639b74aee9Jim Miller         */
5666b05d58018c2806459c121e507c005639b74aee9Jim Miller        public boolean shouldShowStatusLines() {
5676b05d58018c2806459c121e507c005639b74aee9Jim Miller            return mShowStatusLines;
5686b05d58018c2806459c121e507c005639b74aee9Jim Miller        }
5696b05d58018c2806459c121e507c005639b74aee9Jim Miller    }
5706b05d58018c2806459c121e507c005639b74aee9Jim Miller
5716b05d58018c2806459c121e507c005639b74aee9Jim Miller    private void updateEmergencyCallButtonState() {
5726b05d58018c2806459c121e507c005639b74aee9Jim Miller        if (mEmergencyCallButton != null) {
5736b05d58018c2806459c121e507c005639b74aee9Jim Miller            mLockPatternUtils.updateEmergencyCallButtonState(mEmergencyCallButton);
5746b05d58018c2806459c121e507c005639b74aee9Jim Miller            if (mHideEmergencyCallButton) {
5756b05d58018c2806459c121e507c005639b74aee9Jim Miller                mEmergencyCallButton.setVisibility(View.GONE);
5766b05d58018c2806459c121e507c005639b74aee9Jim Miller            }
5776b05d58018c2806459c121e507c005639b74aee9Jim Miller        }
5786b05d58018c2806459c121e507c005639b74aee9Jim Miller    }
5796b05d58018c2806459c121e507c005639b74aee9Jim Miller
5806b05d58018c2806459c121e507c005639b74aee9Jim Miller    private KeyguardUpdateMonitor.InfoCallback mInfoCallback
5816b05d58018c2806459c121e507c005639b74aee9Jim Miller            = new KeyguardUpdateMonitor.InfoCallback() {
5826b05d58018c2806459c121e507c005639b74aee9Jim Miller
5836b05d58018c2806459c121e507c005639b74aee9Jim Miller        public void onRefreshBatteryInfo(boolean showBatteryInfo, boolean pluggedIn,
5846b05d58018c2806459c121e507c005639b74aee9Jim Miller                int batteryLevel) {
5856b05d58018c2806459c121e507c005639b74aee9Jim Miller            mShowingBatteryInfo = showBatteryInfo;
5866b05d58018c2806459c121e507c005639b74aee9Jim Miller            mPluggedIn = pluggedIn;
5876b05d58018c2806459c121e507c005639b74aee9Jim Miller            mBatteryLevel = batteryLevel;
5886b05d58018c2806459c121e507c005639b74aee9Jim Miller            updateStatusLines(true);
5896b05d58018c2806459c121e507c005639b74aee9Jim Miller        }
5906b05d58018c2806459c121e507c005639b74aee9Jim Miller
5916b05d58018c2806459c121e507c005639b74aee9Jim Miller        public void onTimeChanged() {
5926b05d58018c2806459c121e507c005639b74aee9Jim Miller            refreshDate();
5936b05d58018c2806459c121e507c005639b74aee9Jim Miller        }
5946b05d58018c2806459c121e507c005639b74aee9Jim Miller
5956b05d58018c2806459c121e507c005639b74aee9Jim Miller        public void onRefreshCarrierInfo(CharSequence plmn, CharSequence spn) {
5966b05d58018c2806459c121e507c005639b74aee9Jim Miller            setCarrierText(LockPatternUtils.getCarrierString(plmn, spn));
5976b05d58018c2806459c121e507c005639b74aee9Jim Miller        }
5986b05d58018c2806459c121e507c005639b74aee9Jim Miller
5996b05d58018c2806459c121e507c005639b74aee9Jim Miller        public void onRingerModeChanged(int state) {
6006b05d58018c2806459c121e507c005639b74aee9Jim Miller
6016b05d58018c2806459c121e507c005639b74aee9Jim Miller        }
6026b05d58018c2806459c121e507c005639b74aee9Jim Miller
6036b05d58018c2806459c121e507c005639b74aee9Jim Miller        public void onPhoneStateChanged(String newState) {
6046b05d58018c2806459c121e507c005639b74aee9Jim Miller            updateEmergencyCallButtonState();
6056b05d58018c2806459c121e507c005639b74aee9Jim Miller        }
6066b05d58018c2806459c121e507c005639b74aee9Jim Miller
6076b05d58018c2806459c121e507c005639b74aee9Jim Miller        public void onTransportControlStateChanged(int state) {
6086b05d58018c2806459c121e507c005639b74aee9Jim Miller            // TODO: define what state means
6096b05d58018c2806459c121e507c005639b74aee9Jim Miller            if (state == 0) {
6106b05d58018c2806459c121e507c005639b74aee9Jim Miller                leaveWidgetMode();
6116b05d58018c2806459c121e507c005639b74aee9Jim Miller            } else {
6126b05d58018c2806459c121e507c005639b74aee9Jim Miller                enterWidgetMode();
6136b05d58018c2806459c121e507c005639b74aee9Jim Miller            }
6146b05d58018c2806459c121e507c005639b74aee9Jim Miller        }
6156b05d58018c2806459c121e507c005639b74aee9Jim Miller    };
6166b05d58018c2806459c121e507c005639b74aee9Jim Miller
6176b05d58018c2806459c121e507c005639b74aee9Jim Miller    private SimStateCallback mSimStateCallback = new SimStateCallback() {
6186b05d58018c2806459c121e507c005639b74aee9Jim Miller
6196b05d58018c2806459c121e507c005639b74aee9Jim Miller        public void onSimStateChanged(State simState) {
6206b05d58018c2806459c121e507c005639b74aee9Jim Miller            updateWithSimStatus(simState);
6216b05d58018c2806459c121e507c005639b74aee9Jim Miller        }
6226b05d58018c2806459c121e507c005639b74aee9Jim Miller    };
6236b05d58018c2806459c121e507c005639b74aee9Jim Miller
6246b05d58018c2806459c121e507c005639b74aee9Jim Miller    public void onClick(View v) {
6256b05d58018c2806459c121e507c005639b74aee9Jim Miller        if (v == mEmergencyCallButton) {
6266b05d58018c2806459c121e507c005639b74aee9Jim Miller            mCallback.takeEmergencyCallAction();
6276b05d58018c2806459c121e507c005639b74aee9Jim Miller        }
6286b05d58018c2806459c121e507c005639b74aee9Jim Miller    }
6296b05d58018c2806459c121e507c005639b74aee9Jim Miller
6306b05d58018c2806459c121e507c005639b74aee9Jim Miller    public void hideEmergencyCallButton() {
6316b05d58018c2806459c121e507c005639b74aee9Jim Miller        mHideEmergencyCallButton = true;
6326b05d58018c2806459c121e507c005639b74aee9Jim Miller    }
6336b05d58018c2806459c121e507c005639b74aee9Jim Miller
6346b05d58018c2806459c121e507c005639b74aee9Jim Miller}
635