CarrierText.java revision 25807936e8e4ca2c811bb4121725e1dd87e18efd
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
175ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Millerpackage com.android.keyguard;
18f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller
19f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Millerimport android.content.Context;
2025807936e8e4ca2c811bb4121725e1dd87e18efdJorim Jaggiimport android.content.res.TypedArray;
211d80e977da89a660aff006e93470749b359c2393Victoria Leaseimport android.text.method.SingleLineTransformationMethod;
22f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Millerimport android.text.TextUtils;
23f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Millerimport android.util.AttributeSet;
241d80e977da89a660aff006e93470749b359c2393Victoria Leaseimport android.view.View;
25f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Millerimport android.widget.TextView;
26f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller
27f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Millerimport com.android.internal.telephony.IccCardConstants;
28f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Millerimport com.android.internal.telephony.IccCardConstants.State;
29f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Millerimport com.android.internal.widget.LockPatternUtils;
30f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller
311d80e977da89a660aff006e93470749b359c2393Victoria Leaseimport java.util.Locale;
321d80e977da89a660aff006e93470749b359c2393Victoria Lease
33f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Millerpublic class CarrierText extends TextView {
34e9be14077161b9c5dcaa521e9ce4d3e017c11ac6Jim Miller    private static CharSequence mSeparator;
35e9be14077161b9c5dcaa521e9ce4d3e017c11ac6Jim Miller
36f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller    private LockPatternUtils mLockPatternUtils;
37f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller
38f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller    private KeyguardUpdateMonitorCallback mCallback = new KeyguardUpdateMonitorCallback() {
39f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller        private CharSequence mPlmn;
40f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller        private CharSequence mSpn;
41f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller        private State mSimState;
42f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller
43f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller        @Override
44f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller        public void onRefreshCarrierInfo(CharSequence plmn, CharSequence spn) {
45f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller            mPlmn = plmn;
46f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller            mSpn = spn;
47f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller            updateCarrierText(mSimState, mPlmn, mSpn);
48f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller        }
49f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller
50f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller        @Override
51f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller        public void onSimStateChanged(IccCardConstants.State simState) {
52f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller            mSimState = simState;
53f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller            updateCarrierText(mSimState, mPlmn, mSpn);
54f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller        }
5520daffd91e4a53054f8c4d7a66c2a68100abee03Jim Miller
5620daffd91e4a53054f8c4d7a66c2a68100abee03Jim Miller        public void onScreenTurnedOff(int why) {
5720daffd91e4a53054f8c4d7a66c2a68100abee03Jim Miller            setSelected(false);
5820daffd91e4a53054f8c4d7a66c2a68100abee03Jim Miller        };
5920daffd91e4a53054f8c4d7a66c2a68100abee03Jim Miller
6020daffd91e4a53054f8c4d7a66c2a68100abee03Jim Miller        public void onScreenTurnedOn() {
6120daffd91e4a53054f8c4d7a66c2a68100abee03Jim Miller            setSelected(true);
6220daffd91e4a53054f8c4d7a66c2a68100abee03Jim Miller        };
63f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller    };
64f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller    /**
65f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller     * The status of this lock screen. Primarily used for widgets on LockScreen.
66f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller     */
67109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller    private static enum StatusMode {
68f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller        Normal, // Normal case (sim card present, it's not locked)
69f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller        NetworkLocked, // SIM card is 'network locked'.
70f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller        SimMissing, // SIM card is missing.
71f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller        SimMissingLocked, // SIM card is missing, and device isn't provisioned; don't allow access
72f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller        SimPukLocked, // SIM card is PUK locked because SIM entered wrong too many times
73f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller        SimLocked, // SIM card is currently locked
74109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller        SimPermDisabled, // SIM card is permanently disabled due to PUK unlock failure
75109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller        SimNotReady; // SIM is not ready yet. May never be on devices w/o a SIM.
76f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller    }
77f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller
78f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller    public CarrierText(Context context) {
79f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller        this(context, null);
80f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller    }
81f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller
82f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller    public CarrierText(Context context, AttributeSet attrs) {
83f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller        super(context, attrs);
84f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller        mLockPatternUtils = new LockPatternUtils(mContext);
8525807936e8e4ca2c811bb4121725e1dd87e18efdJorim Jaggi        boolean useAllCaps;
8625807936e8e4ca2c811bb4121725e1dd87e18efdJorim Jaggi        TypedArray a = context.getTheme().obtainStyledAttributes(
8725807936e8e4ca2c811bb4121725e1dd87e18efdJorim Jaggi                attrs, R.styleable.CarrierText, 0, 0);
8825807936e8e4ca2c811bb4121725e1dd87e18efdJorim Jaggi        try {
8925807936e8e4ca2c811bb4121725e1dd87e18efdJorim Jaggi            useAllCaps = a.getBoolean(R.styleable.CarrierText_allCaps, false);
9025807936e8e4ca2c811bb4121725e1dd87e18efdJorim Jaggi        } finally {
9125807936e8e4ca2c811bb4121725e1dd87e18efdJorim Jaggi            a.recycle();
9225807936e8e4ca2c811bb4121725e1dd87e18efdJorim Jaggi        }
931d80e977da89a660aff006e93470749b359c2393Victoria Lease        setTransformationMethod(new CarrierTextTransformationMethod(mContext, useAllCaps));
94f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller    }
95f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller
96f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller    protected void updateCarrierText(State simState, CharSequence plmn, CharSequence spn) {
97e38c8e28ba50d5fe7f4f2bc5fe68a9f10bafe0f0Jim Miller        setText(getCarrierTextForSimState(simState, plmn, spn));
98f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller    }
99f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller
100f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller    @Override
101f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller    protected void onFinishInflate() {
102f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller        super.onFinishInflate();
103e9be14077161b9c5dcaa521e9ce4d3e017c11ac6Jim Miller        mSeparator = getResources().getString(R.string.kg_text_message_separator);
10420daffd91e4a53054f8c4d7a66c2a68100abee03Jim Miller        final boolean screenOn = KeyguardUpdateMonitor.getInstance(mContext).isScreenOn();
10520daffd91e4a53054f8c4d7a66c2a68100abee03Jim Miller        setSelected(screenOn); // Allow marquee to work.
106f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller    }
107f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller
1080928e019ce1a0e343df948520f32ac638379d8eeJim Miller    @Override
1090928e019ce1a0e343df948520f32ac638379d8eeJim Miller    protected void onAttachedToWindow() {
1100928e019ce1a0e343df948520f32ac638379d8eeJim Miller        super.onAttachedToWindow();
1110928e019ce1a0e343df948520f32ac638379d8eeJim Miller        KeyguardUpdateMonitor.getInstance(mContext).registerCallback(mCallback);
1120928e019ce1a0e343df948520f32ac638379d8eeJim Miller    }
1130928e019ce1a0e343df948520f32ac638379d8eeJim Miller
1140928e019ce1a0e343df948520f32ac638379d8eeJim Miller    @Override
1150928e019ce1a0e343df948520f32ac638379d8eeJim Miller    protected void onDetachedFromWindow() {
1160928e019ce1a0e343df948520f32ac638379d8eeJim Miller        super.onDetachedFromWindow();
1170928e019ce1a0e343df948520f32ac638379d8eeJim Miller        KeyguardUpdateMonitor.getInstance(mContext).removeCallback(mCallback);
1180928e019ce1a0e343df948520f32ac638379d8eeJim Miller    }
1190928e019ce1a0e343df948520f32ac638379d8eeJim Miller
120f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller    /**
121f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller     * Top-level function for creating carrier text. Makes text based on simState, PLMN
122f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller     * and SPN as well as device capabilities, such as being emergency call capable.
123f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller     *
124f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller     * @param simState
125f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller     * @param plmn
126f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller     * @param spn
127f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller     * @return
128f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller     */
129f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller    private CharSequence getCarrierTextForSimState(IccCardConstants.State simState,
130f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller            CharSequence plmn, CharSequence spn) {
131f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller        CharSequence carrierText = null;
132f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller        StatusMode status = getStatusForIccState(simState);
133f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller        switch (status) {
134f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller            case Normal:
135f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller                carrierText = concatenate(plmn, spn);
136f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller                break;
137f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller
138109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller            case SimNotReady:
139109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller                carrierText = null; // nothing to display yet.
140109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller                break;
141109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller
142f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller            case NetworkLocked:
143f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller                carrierText = makeCarrierStringOnEmergencyCapable(
1445ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller                        mContext.getText(R.string.keyguard_network_locked_message), plmn);
145f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller                break;
146f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller
147f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller            case SimMissing:
148f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller                // Shows "No SIM card | Emergency calls only" on devices that are voice-capable.
149f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller                // This depends on mPlmn containing the text "Emergency calls only" when the radio
150f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller                // has some connectivity. Otherwise, it should be null or empty and just show
151f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller                // "No SIM card"
152f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller                carrierText =  makeCarrierStringOnEmergencyCapable(
1535ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller                        getContext().getText(R.string.keyguard_missing_sim_message_short),
154f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller                        plmn);
155f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller                break;
156f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller
157f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller            case SimPermDisabled:
158f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller                carrierText = getContext().getText(
1595ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller                        R.string.keyguard_permanent_disabled_sim_message_short);
160f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller                break;
161f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller
162f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller            case SimMissingLocked:
163f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller                carrierText =  makeCarrierStringOnEmergencyCapable(
1645ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller                        getContext().getText(R.string.keyguard_missing_sim_message_short),
165f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller                        plmn);
166f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller                break;
167f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller
168f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller            case SimLocked:
169f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller                carrierText = makeCarrierStringOnEmergencyCapable(
1705ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller                        getContext().getText(R.string.keyguard_sim_locked_message),
171f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller                        plmn);
172f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller                break;
173f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller
174f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller            case SimPukLocked:
175f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller                carrierText = makeCarrierStringOnEmergencyCapable(
1765ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller                        getContext().getText(R.string.keyguard_sim_puk_locked_message),
177f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller                        plmn);
178f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller                break;
179f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller        }
180f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller
181f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller        return carrierText;
182f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller    }
183f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller
184f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller    /*
185f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller     * Add emergencyCallMessage to carrier string only if phone supports emergency calls.
186f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller     */
187f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller    private CharSequence makeCarrierStringOnEmergencyCapable(
188f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller            CharSequence simMessage, CharSequence emergencyCallMessage) {
189f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller        if (mLockPatternUtils.isEmergencyCallCapable()) {
190f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller            return concatenate(simMessage, emergencyCallMessage);
191f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller        }
192f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller        return simMessage;
193f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller    }
194f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller
195f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller    /**
196f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller     * Determine the current status of the lock screen given the SIM state and other stuff.
197f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller     */
198f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller    private StatusMode getStatusForIccState(IccCardConstants.State simState) {
199f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller        // Since reading the SIM may take a while, we assume it is present until told otherwise.
200f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller        if (simState == null) {
201f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller            return StatusMode.Normal;
202f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller        }
203f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller
204f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller        final boolean missingAndNotProvisioned =
205f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller                !KeyguardUpdateMonitor.getInstance(mContext).isDeviceProvisioned()
206f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller                && (simState == IccCardConstants.State.ABSENT ||
207f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller                        simState == IccCardConstants.State.PERM_DISABLED);
208f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller
209f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller        // Assume we're NETWORK_LOCKED if not provisioned
210f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller        simState = missingAndNotProvisioned ? IccCardConstants.State.NETWORK_LOCKED : simState;
211f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller        switch (simState) {
212f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller            case ABSENT:
213f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller                return StatusMode.SimMissing;
214f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller            case NETWORK_LOCKED:
215f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller                return StatusMode.SimMissingLocked;
216f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller            case NOT_READY:
217109f1fd80c90409c0d7f21d49989641dfdf2ad1bJim Miller                return StatusMode.SimNotReady;
218f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller            case PIN_REQUIRED:
219f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller                return StatusMode.SimLocked;
220f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller            case PUK_REQUIRED:
221f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller                return StatusMode.SimPukLocked;
222f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller            case READY:
223f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller                return StatusMode.Normal;
224f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller            case PERM_DISABLED:
225f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller                return StatusMode.SimPermDisabled;
226f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller            case UNKNOWN:
227f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller                return StatusMode.SimMissing;
228f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller        }
229f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller        return StatusMode.SimMissing;
230f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller    }
231f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller
232f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller    private static CharSequence concatenate(CharSequence plmn, CharSequence spn) {
233f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller        final boolean plmnValid = !TextUtils.isEmpty(plmn);
234f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller        final boolean spnValid = !TextUtils.isEmpty(spn);
235f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller        if (plmnValid && spnValid) {
236e9be14077161b9c5dcaa521e9ce4d3e017c11ac6Jim Miller            return new StringBuilder().append(plmn).append(mSeparator).append(spn).toString();
237f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller        } else if (plmnValid) {
238f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller            return plmn;
239f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller        } else if (spnValid) {
240f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller            return spn;
241f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller        } else {
242f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller            return "";
243f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller        }
244f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller    }
245f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller
246f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller    private CharSequence getCarrierHelpTextForSimState(IccCardConstants.State simState,
247f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller            String plmn, String spn) {
248f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller        int carrierHelpTextId = 0;
249f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller        StatusMode status = getStatusForIccState(simState);
250f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller        switch (status) {
251f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller            case NetworkLocked:
2525ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller                carrierHelpTextId = R.string.keyguard_instructions_when_pattern_disabled;
253f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller                break;
254f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller
255f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller            case SimMissing:
2565ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller                carrierHelpTextId = R.string.keyguard_missing_sim_instructions_long;
257f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller                break;
258f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller
259f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller            case SimPermDisabled:
2605ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller                carrierHelpTextId = R.string.keyguard_permanent_disabled_sim_instructions;
261f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller                break;
262f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller
263f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller            case SimMissingLocked:
2645ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Miller                carrierHelpTextId = R.string.keyguard_missing_sim_instructions;
265f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller                break;
266f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller
267f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller            case Normal:
268f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller            case SimLocked:
269f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller            case SimPukLocked:
270f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller                break;
271f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller        }
272f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller
273f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller        return mContext.getText(carrierHelpTextId);
274f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller    }
2751d80e977da89a660aff006e93470749b359c2393Victoria Lease
2761d80e977da89a660aff006e93470749b359c2393Victoria Lease    private class CarrierTextTransformationMethod extends SingleLineTransformationMethod {
2771d80e977da89a660aff006e93470749b359c2393Victoria Lease        private final Locale mLocale;
2781d80e977da89a660aff006e93470749b359c2393Victoria Lease        private final boolean mAllCaps;
2791d80e977da89a660aff006e93470749b359c2393Victoria Lease
2801d80e977da89a660aff006e93470749b359c2393Victoria Lease        public CarrierTextTransformationMethod(Context context, boolean allCaps) {
2811d80e977da89a660aff006e93470749b359c2393Victoria Lease            mLocale = context.getResources().getConfiguration().locale;
2821d80e977da89a660aff006e93470749b359c2393Victoria Lease            mAllCaps = allCaps;
2831d80e977da89a660aff006e93470749b359c2393Victoria Lease        }
2841d80e977da89a660aff006e93470749b359c2393Victoria Lease
2851d80e977da89a660aff006e93470749b359c2393Victoria Lease        @Override
2861d80e977da89a660aff006e93470749b359c2393Victoria Lease        public CharSequence getTransformation(CharSequence source, View view) {
2871d80e977da89a660aff006e93470749b359c2393Victoria Lease            source = super.getTransformation(source, view);
2881d80e977da89a660aff006e93470749b359c2393Victoria Lease
2891d80e977da89a660aff006e93470749b359c2393Victoria Lease            if (mAllCaps && source != null) {
2901d80e977da89a660aff006e93470749b359c2393Victoria Lease                source = source.toString().toUpperCase(mLocale);
2911d80e977da89a660aff006e93470749b359c2393Victoria Lease            }
2921d80e977da89a660aff006e93470749b359c2393Victoria Lease
2931d80e977da89a660aff006e93470749b359c2393Victoria Lease            return source;
2941d80e977da89a660aff006e93470749b359c2393Victoria Lease        }
2951d80e977da89a660aff006e93470749b359c2393Victoria Lease    }
296f9cb7ba158c7016d55f121e200f96046ddbc5b70Jim Miller}
297