1109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller/*
2109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller * Copyright (C) 2012 The Android Open Source Project
3109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller *
4109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller * Licensed under the Apache License, Version 2.0 (the "License");
5109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller * you may not use this file except in compliance with the License.
6109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller * You may obtain a copy of the License at
7109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller *
8109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller *      http://www.apache.org/licenses/LICENSE-2.0
9109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller *
10109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller * Unless required by applicable law or agreed to in writing, software
11109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller * distributed under the License is distributed on an "AS IS" BASIS,
12109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller * See the License for the specific language governing permissions and
14109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller * limitations under the License.
15109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller */
16109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller
17f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Millerpackage com.android.internal.policy.impl.keyguard;
18f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller
19f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Millerimport android.content.Context;
20f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Millerimport android.text.TextUtils;
21f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Millerimport android.util.AttributeSet;
22f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Millerimport android.widget.TextView;
23f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller
24f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Millerimport com.android.internal.R;
25f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Millerimport com.android.internal.telephony.IccCardConstants;
26f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Millerimport com.android.internal.telephony.IccCardConstants.State;
27f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Millerimport com.android.internal.widget.LockPatternUtils;
28f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller
29f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Millerpublic class CarrierText extends TextView {
30e9be14077161b9c5dcaa521e9ce4d3e017c11ac6Jim Miller    private static CharSequence mSeparator;
31e9be14077161b9c5dcaa521e9ce4d3e017c11ac6Jim Miller
32f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller    private LockPatternUtils mLockPatternUtils;
33f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller
34f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller    private KeyguardUpdateMonitorCallback mCallback = new KeyguardUpdateMonitorCallback() {
35f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller        private CharSequence mPlmn;
36f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller        private CharSequence mSpn;
37f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller        private State mSimState;
38f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller
39f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller        @Override
40f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller        public void onRefreshCarrierInfo(CharSequence plmn, CharSequence spn) {
41f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller            mPlmn = plmn;
42f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller            mSpn = spn;
43f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller            updateCarrierText(mSimState, mPlmn, mSpn);
44f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller        }
45f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller
46f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller        @Override
47f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller        public void onSimStateChanged(IccCardConstants.State simState) {
48f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller            mSimState = simState;
49f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller            updateCarrierText(mSimState, mPlmn, mSpn);
50f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller        }
51f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller    };
52f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller    /**
53f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller     * The status of this lock screen. Primarily used for widgets on LockScreen.
54f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller     */
55109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller    private static enum StatusMode {
56f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller        Normal, // Normal case (sim card present, it's not locked)
57f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller        NetworkLocked, // SIM card is 'network locked'.
58f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller        SimMissing, // SIM card is missing.
59f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller        SimMissingLocked, // SIM card is missing, and device isn't provisioned; don't allow access
60f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller        SimPukLocked, // SIM card is PUK locked because SIM entered wrong too many times
61f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller        SimLocked, // SIM card is currently locked
62109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller        SimPermDisabled, // SIM card is permanently disabled due to PUK unlock failure
63109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller        SimNotReady; // SIM is not ready yet. May never be on devices w/o a SIM.
64f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller    }
65f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller
66f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller    public CarrierText(Context context) {
67f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller        this(context, null);
68f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller    }
69f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller
70f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller    public CarrierText(Context context, AttributeSet attrs) {
71f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller        super(context, attrs);
72f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller        mLockPatternUtils = new LockPatternUtils(mContext);
73f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller    }
74f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller
75f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller    protected void updateCarrierText(State simState, CharSequence plmn, CharSequence spn) {
76109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller        CharSequence text = getCarrierTextForSimState(simState, plmn, spn);
77109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller        if (KeyguardViewManager.USE_UPPER_CASE) {
78109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller            setText(text != null ? text.toString().toUpperCase() : null);
79109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller        } else {
80109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller            setText(text);
81109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller        }
82f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller    }
83f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller
84f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller    @Override
85f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller    protected void onFinishInflate() {
86f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller        super.onFinishInflate();
87e9be14077161b9c5dcaa521e9ce4d3e017c11ac6Jim Miller        mSeparator = getResources().getString(R.string.kg_text_message_separator);
88f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller        setSelected(true); // Allow marquee to work.
89f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller    }
90f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller
910928e019ce1a0e343df948520f32ac638379d8eeJim Miller    @Override
920928e019ce1a0e343df948520f32ac638379d8eeJim Miller    protected void onAttachedToWindow() {
930928e019ce1a0e343df948520f32ac638379d8eeJim Miller        super.onAttachedToWindow();
940928e019ce1a0e343df948520f32ac638379d8eeJim Miller        KeyguardUpdateMonitor.getInstance(mContext).registerCallback(mCallback);
950928e019ce1a0e343df948520f32ac638379d8eeJim Miller    }
960928e019ce1a0e343df948520f32ac638379d8eeJim Miller
970928e019ce1a0e343df948520f32ac638379d8eeJim Miller    @Override
980928e019ce1a0e343df948520f32ac638379d8eeJim Miller    protected void onDetachedFromWindow() {
990928e019ce1a0e343df948520f32ac638379d8eeJim Miller        super.onDetachedFromWindow();
1000928e019ce1a0e343df948520f32ac638379d8eeJim Miller        KeyguardUpdateMonitor.getInstance(mContext).removeCallback(mCallback);
1010928e019ce1a0e343df948520f32ac638379d8eeJim Miller    }
1020928e019ce1a0e343df948520f32ac638379d8eeJim Miller
103f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller    /**
104f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller     * Top-level function for creating carrier text. Makes text based on simState, PLMN
105f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller     * and SPN as well as device capabilities, such as being emergency call capable.
106f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller     *
107f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller     * @param simState
108f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller     * @param plmn
109f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller     * @param spn
110f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller     * @return
111f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller     */
112f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller    private CharSequence getCarrierTextForSimState(IccCardConstants.State simState,
113f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller            CharSequence plmn, CharSequence spn) {
114f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller        CharSequence carrierText = null;
115f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller        StatusMode status = getStatusForIccState(simState);
116f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller        switch (status) {
117f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller            case Normal:
118f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller                carrierText = concatenate(plmn, spn);
119f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller                break;
120f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller
121109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller            case SimNotReady:
122109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller                carrierText = null; // nothing to display yet.
123109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller                break;
124109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller
125f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller            case NetworkLocked:
126f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller                carrierText = makeCarrierStringOnEmergencyCapable(
127f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller                        mContext.getText(R.string.lockscreen_network_locked_message), plmn);
128f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller                break;
129f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller
130f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller            case SimMissing:
131f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller                // Shows "No SIM card | Emergency calls only" on devices that are voice-capable.
132f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller                // This depends on mPlmn containing the text "Emergency calls only" when the radio
133f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller                // has some connectivity. Otherwise, it should be null or empty and just show
134f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller                // "No SIM card"
135f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller                carrierText =  makeCarrierStringOnEmergencyCapable(
136f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller                        getContext().getText(R.string.lockscreen_missing_sim_message_short),
137f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller                        plmn);
138f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller                break;
139f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller
140f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller            case SimPermDisabled:
141f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller                carrierText = getContext().getText(
142f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller                        R.string.lockscreen_permanent_disabled_sim_message_short);
143f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller                break;
144f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller
145f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller            case SimMissingLocked:
146f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller                carrierText =  makeCarrierStringOnEmergencyCapable(
147f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller                        getContext().getText(R.string.lockscreen_missing_sim_message_short),
148f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller                        plmn);
149f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller                break;
150f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller
151f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller            case SimLocked:
152f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller                carrierText = makeCarrierStringOnEmergencyCapable(
153f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller                        getContext().getText(R.string.lockscreen_sim_locked_message),
154f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller                        plmn);
155f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller                break;
156f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller
157f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller            case SimPukLocked:
158f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller                carrierText = makeCarrierStringOnEmergencyCapable(
159f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller                        getContext().getText(R.string.lockscreen_sim_puk_locked_message),
160f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller                        plmn);
161f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller                break;
162f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller        }
163f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller
164f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller        return carrierText;
165f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller    }
166f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller
167f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller    /*
168f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller     * Add emergencyCallMessage to carrier string only if phone supports emergency calls.
169f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller     */
170f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller    private CharSequence makeCarrierStringOnEmergencyCapable(
171f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller            CharSequence simMessage, CharSequence emergencyCallMessage) {
172f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller        if (mLockPatternUtils.isEmergencyCallCapable()) {
173f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller            return concatenate(simMessage, emergencyCallMessage);
174f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller        }
175f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller        return simMessage;
176f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller    }
177f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller
178f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller    /**
179f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller     * Determine the current status of the lock screen given the SIM state and other stuff.
180f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller     */
181f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller    private StatusMode getStatusForIccState(IccCardConstants.State simState) {
182f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller        // Since reading the SIM may take a while, we assume it is present until told otherwise.
183f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller        if (simState == null) {
184f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller            return StatusMode.Normal;
185f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller        }
186f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller
187f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller        final boolean missingAndNotProvisioned =
188f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller                !KeyguardUpdateMonitor.getInstance(mContext).isDeviceProvisioned()
189f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller                && (simState == IccCardConstants.State.ABSENT ||
190f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller                        simState == IccCardConstants.State.PERM_DISABLED);
191f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller
192f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller        // Assume we're NETWORK_LOCKED if not provisioned
193f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller        simState = missingAndNotProvisioned ? IccCardConstants.State.NETWORK_LOCKED : simState;
194f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller        switch (simState) {
195f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller            case ABSENT:
196f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller                return StatusMode.SimMissing;
197f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller            case NETWORK_LOCKED:
198f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller                return StatusMode.SimMissingLocked;
199f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller            case NOT_READY:
200109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller                return StatusMode.SimNotReady;
201f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller            case PIN_REQUIRED:
202f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller                return StatusMode.SimLocked;
203f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller            case PUK_REQUIRED:
204f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller                return StatusMode.SimPukLocked;
205f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller            case READY:
206f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller                return StatusMode.Normal;
207f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller            case PERM_DISABLED:
208f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller                return StatusMode.SimPermDisabled;
209f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller            case UNKNOWN:
210f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller                return StatusMode.SimMissing;
211f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller        }
212f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller        return StatusMode.SimMissing;
213f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller    }
214f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller
215f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller    private static CharSequence concatenate(CharSequence plmn, CharSequence spn) {
216f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller        final boolean plmnValid = !TextUtils.isEmpty(plmn);
217f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller        final boolean spnValid = !TextUtils.isEmpty(spn);
218f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller        if (plmnValid && spnValid) {
219e9be14077161b9c5dcaa521e9ce4d3e017c11ac6Jim Miller            return new StringBuilder().append(plmn).append(mSeparator).append(spn).toString();
220f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller        } else if (plmnValid) {
221f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller            return plmn;
222f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller        } else if (spnValid) {
223f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller            return spn;
224f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller        } else {
225f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller            return "";
226f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller        }
227f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller    }
228f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller
229f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller    private CharSequence getCarrierHelpTextForSimState(IccCardConstants.State simState,
230f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller            String plmn, String spn) {
231f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller        int carrierHelpTextId = 0;
232f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller        StatusMode status = getStatusForIccState(simState);
233f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller        switch (status) {
234f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller            case NetworkLocked:
235f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller                carrierHelpTextId = R.string.lockscreen_instructions_when_pattern_disabled;
236f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller                break;
237f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller
238f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller            case SimMissing:
239f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller                carrierHelpTextId = R.string.lockscreen_missing_sim_instructions_long;
240f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller                break;
241f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller
242f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller            case SimPermDisabled:
243f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller                carrierHelpTextId = R.string.lockscreen_permanent_disabled_sim_instructions;
244f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller                break;
245f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller
246f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller            case SimMissingLocked:
247f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller                carrierHelpTextId = R.string.lockscreen_missing_sim_instructions;
248f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller                break;
249f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller
250f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller            case Normal:
251f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller            case SimLocked:
252f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller            case SimPukLocked:
253f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller                break;
254f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller        }
255f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller
256f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller        return mContext.getText(carrierHelpTextId);
257f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller    }
258f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller}
259