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