1/*
2 * Copyright (C) 2016 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License
15 */
16
17package com.android.systemui.statusbar.policy;
18
19import android.annotation.Nullable;
20import android.content.BroadcastReceiver;
21import android.content.Context;
22import android.content.Intent;
23import android.content.IntentFilter;
24import android.net.ConnectivityManager;
25import android.provider.Settings;
26import android.telephony.ServiceState;
27import android.telephony.SubscriptionInfo;
28import android.text.TextUtils;
29import android.util.AttributeSet;
30import android.util.Log;
31import android.view.ViewGroup;
32import android.view.ViewParent;
33import android.widget.TextView;
34
35import com.android.internal.telephony.IccCardConstants;
36import com.android.internal.telephony.TelephonyIntents;
37import com.android.keyguard.KeyguardUpdateMonitor;
38import com.android.keyguard.KeyguardUpdateMonitorCallback;
39
40import java.util.List;
41
42public class EmergencyCryptkeeperText extends TextView {
43
44    private KeyguardUpdateMonitor mKeyguardUpdateMonitor;
45    private final KeyguardUpdateMonitorCallback mCallback = new KeyguardUpdateMonitorCallback() {
46        @Override
47        public void onPhoneStateChanged(int phoneState) {
48            update();
49        }
50
51        @Override
52        public void onRefreshCarrierInfo() {
53            update();
54        }
55    };
56    private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
57        @Override
58        public void onReceive(Context context, Intent intent) {
59            if (Intent.ACTION_AIRPLANE_MODE_CHANGED.equals(intent.getAction())) {
60                update();
61            }
62        }
63    };
64
65    public EmergencyCryptkeeperText(Context context, @Nullable AttributeSet attrs) {
66        super(context, attrs);
67        setVisibility(GONE);
68    }
69
70    @Override
71    protected void onAttachedToWindow() {
72        super.onAttachedToWindow();
73        mKeyguardUpdateMonitor = KeyguardUpdateMonitor.getInstance(mContext);
74        mKeyguardUpdateMonitor.registerCallback(mCallback);
75        getContext().registerReceiver(mReceiver,
76                new IntentFilter(Intent.ACTION_AIRPLANE_MODE_CHANGED));
77        update();
78    }
79
80    @Override
81    protected void onDetachedFromWindow() {
82        super.onDetachedFromWindow();
83        if (mKeyguardUpdateMonitor != null) {
84            mKeyguardUpdateMonitor.removeCallback(mCallback);
85        }
86        getContext().unregisterReceiver(mReceiver);
87    }
88
89    public void update() {
90        boolean hasMobile = ConnectivityManager.from(mContext)
91                .isNetworkSupported(ConnectivityManager.TYPE_MOBILE);
92        boolean airplaneMode = (Settings.Global.getInt(mContext.getContentResolver(),
93                Settings.Global.AIRPLANE_MODE_ON, 0) == 1);
94
95        if (!hasMobile || airplaneMode) {
96            setText(null);
97            setVisibility(GONE);
98            return;
99        }
100
101        boolean allSimsMissing = true;
102        CharSequence displayText = null;
103
104        List<SubscriptionInfo> subs = mKeyguardUpdateMonitor.getSubscriptionInfo(false);
105        final int N = subs.size();
106        for (int i = 0; i < N; i++) {
107            int subId = subs.get(i).getSubscriptionId();
108            IccCardConstants.State simState = mKeyguardUpdateMonitor.getSimState(subId);
109            CharSequence carrierName = subs.get(i).getCarrierName();
110            if (simState.iccCardExist() && !TextUtils.isEmpty(carrierName)) {
111                allSimsMissing = false;
112                displayText = carrierName;
113            }
114        }
115        if (allSimsMissing) {
116            if (N != 0) {
117                // Shows "Emergency calls only" on devices that are voice-capable.
118                // This depends on mPlmn containing the text "Emergency calls only" when the radio
119                // has some connectivity. Otherwise it should show "No service"
120                // Grab the first subscription, because they all should contain the emergency text,
121                // described above.
122                displayText = subs.get(0).getCarrierName();
123            } else {
124                // We don't have a SubscriptionInfo to get the emergency calls only from.
125                // Grab it from the old sticky broadcast if possible instead. We can use it
126                // here because no subscriptions are active, so we don't have
127                // to worry about MSIM clashing.
128                displayText = getContext().getText(
129                        com.android.internal.R.string.emergency_calls_only);
130                Intent i = getContext().registerReceiver(null,
131                        new IntentFilter(TelephonyIntents.SPN_STRINGS_UPDATED_ACTION));
132                if (i != null) {
133                    displayText = i.getStringExtra(TelephonyIntents.EXTRA_PLMN);
134                }
135            }
136        }
137
138        setText(displayText);
139        setVisibility(TextUtils.isEmpty(displayText) ? GONE : VISIBLE);
140    }
141}
142