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 17 package com.android.systemui.statusbar.policy; 18 19 import android.annotation.Nullable; 20 import android.content.BroadcastReceiver; 21 import android.content.Context; 22 import android.content.Intent; 23 import android.content.IntentFilter; 24 import android.net.ConnectivityManager; 25 import android.provider.Settings; 26 import android.telephony.ServiceState; 27 import android.telephony.SubscriptionInfo; 28 import android.text.TextUtils; 29 import android.util.AttributeSet; 30 import android.util.Log; 31 import android.view.ViewGroup; 32 import android.view.ViewParent; 33 import android.widget.TextView; 34 35 import com.android.internal.telephony.IccCardConstants; 36 import com.android.internal.telephony.TelephonyIntents; 37 import com.android.keyguard.KeyguardUpdateMonitor; 38 import com.android.keyguard.KeyguardUpdateMonitorCallback; 39 40 import java.util.List; 41 42 public 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 EmergencyCryptkeeperText(Context context, @Nullable AttributeSet attrs)65 public EmergencyCryptkeeperText(Context context, @Nullable AttributeSet attrs) { 66 super(context, attrs); 67 setVisibility(GONE); 68 } 69 70 @Override onAttachedToWindow()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 onDetachedFromWindow()81 protected void onDetachedFromWindow() { 82 super.onDetachedFromWindow(); 83 if (mKeyguardUpdateMonitor != null) { 84 mKeyguardUpdateMonitor.removeCallback(mCallback); 85 } 86 getContext().unregisterReceiver(mReceiver); 87 } 88 update()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