1 /* 2 * Copyright (C) 2021 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; 18 19 import android.annotation.NonNull; 20 import android.os.Bundle; 21 import android.telephony.ServiceState; 22 import android.telephony.SubscriptionInfo; 23 import android.telephony.SubscriptionManager; 24 import android.telephony.TelephonyManager; 25 import android.view.View; 26 27 import com.android.keyguard.KeyguardUpdateMonitor; 28 import com.android.keyguard.KeyguardUpdateMonitorCallback; 29 import com.android.systemui.demomode.DemoModeCommandReceiver; 30 import com.android.systemui.plugins.DarkIconDispatcher; 31 import com.android.systemui.statusbar.connectivity.IconState; 32 import com.android.systemui.statusbar.connectivity.NetworkController; 33 import com.android.systemui.statusbar.connectivity.SignalCallback; 34 import com.android.systemui.statusbar.phone.fragment.CollapsedStatusBarFragment; 35 import com.android.systemui.tuner.TunerService; 36 import com.android.systemui.util.CarrierConfigTracker; 37 import com.android.systemui.util.ViewController; 38 39 import javax.inject.Inject; 40 41 /** Controller for {@link OperatorNameView}. */ 42 public class OperatorNameViewController extends ViewController<OperatorNameView> { 43 private static final String KEY_SHOW_OPERATOR_NAME = "show_operator_name"; 44 45 private final DarkIconDispatcher mDarkIconDispatcher; 46 private final NetworkController mNetworkController; 47 private final TunerService mTunerService; 48 private final TelephonyManager mTelephonyManager; 49 private final KeyguardUpdateMonitor mKeyguardUpdateMonitor; 50 private final CarrierConfigTracker mCarrierConfigTracker; 51 OperatorNameViewController(OperatorNameView view, DarkIconDispatcher darkIconDispatcher, NetworkController networkController, TunerService tunerService, TelephonyManager telephonyManager, KeyguardUpdateMonitor keyguardUpdateMonitor, CarrierConfigTracker carrierConfigTracker)52 private OperatorNameViewController(OperatorNameView view, 53 DarkIconDispatcher darkIconDispatcher, 54 NetworkController networkController, 55 TunerService tunerService, 56 TelephonyManager telephonyManager, 57 KeyguardUpdateMonitor keyguardUpdateMonitor, 58 CarrierConfigTracker carrierConfigTracker) { 59 super(view); 60 mDarkIconDispatcher = darkIconDispatcher; 61 mNetworkController = networkController; 62 mTunerService = tunerService; 63 mTelephonyManager = telephonyManager; 64 mKeyguardUpdateMonitor = keyguardUpdateMonitor; 65 mCarrierConfigTracker = carrierConfigTracker; 66 } 67 68 @Override onViewAttached()69 protected void onViewAttached() { 70 mDarkIconDispatcher.addDarkReceiver(mDarkReceiver); 71 mNetworkController.addCallback(mSignalCallback); 72 mTunerService.addTunable(mTunable, KEY_SHOW_OPERATOR_NAME); 73 mKeyguardUpdateMonitor.registerCallback(mKeyguardUpdateMonitorCallback); 74 } 75 76 @Override onViewDetached()77 protected void onViewDetached() { 78 mDarkIconDispatcher.removeDarkReceiver(mDarkReceiver); 79 mNetworkController.removeCallback(mSignalCallback); 80 mTunerService.removeTunable(mTunable); 81 mKeyguardUpdateMonitor.removeCallback(mKeyguardUpdateMonitorCallback); 82 } 83 update()84 private void update() { 85 SubInfo defaultSubInfo = getDefaultSubInfo(); 86 boolean showOperatorName = 87 mCarrierConfigTracker 88 .getShowOperatorNameInStatusBarConfig(defaultSubInfo.getSubId()) 89 && (mTunerService.getValue(KEY_SHOW_OPERATOR_NAME, 1) != 0); 90 mView.update(showOperatorName, mTelephonyManager.isDataCapable(), getDefaultSubInfo()); 91 } 92 getDefaultSubInfo()93 private SubInfo getDefaultSubInfo() { 94 int defaultSubId = SubscriptionManager.getDefaultDataSubscriptionId(); 95 SubscriptionInfo sI = mKeyguardUpdateMonitor.getSubscriptionInfoForSubId(defaultSubId); 96 return new SubInfo( 97 sI.getSubscriptionId(), 98 sI.getCarrierName(), 99 mKeyguardUpdateMonitor.getSimState(defaultSubId), 100 mKeyguardUpdateMonitor.getServiceState(defaultSubId)); 101 } 102 103 /** Factory for constructing an {@link OperatorNameViewController}. */ 104 public static class Factory { 105 private final DarkIconDispatcher mDarkIconDispatcher; 106 private final NetworkController mNetworkController; 107 private final TunerService mTunerService; 108 private final TelephonyManager mTelephonyManager; 109 private final KeyguardUpdateMonitor mKeyguardUpdateMonitor; 110 private final CarrierConfigTracker mCarrierConfigTracker; 111 112 @Inject Factory(DarkIconDispatcher darkIconDispatcher, NetworkController networkController, TunerService tunerService, TelephonyManager telephonyManager, KeyguardUpdateMonitor keyguardUpdateMonitor, CarrierConfigTracker carrierConfigTracker)113 public Factory(DarkIconDispatcher darkIconDispatcher, 114 NetworkController networkController, 115 TunerService tunerService, 116 TelephonyManager telephonyManager, 117 KeyguardUpdateMonitor keyguardUpdateMonitor, 118 CarrierConfigTracker carrierConfigTracker) { 119 mDarkIconDispatcher = darkIconDispatcher; 120 mNetworkController = networkController; 121 mTunerService = tunerService; 122 mTelephonyManager = telephonyManager; 123 mKeyguardUpdateMonitor = keyguardUpdateMonitor; 124 mCarrierConfigTracker = carrierConfigTracker; 125 } 126 127 /** Create an {@link OperatorNameViewController}. */ create(OperatorNameView view)128 public OperatorNameViewController create(OperatorNameView view) { 129 return new OperatorNameViewController(view, 130 mDarkIconDispatcher, 131 mNetworkController, 132 mTunerService, 133 mTelephonyManager, 134 mKeyguardUpdateMonitor, 135 mCarrierConfigTracker); 136 } 137 } 138 139 /** 140 * Needed because of how {@link CollapsedStatusBarFragment} works. 141 * 142 * Ideally this can be done internally. 143 **/ getView()144 public View getView() { 145 return mView; 146 } 147 148 private final DarkIconDispatcher.DarkReceiver mDarkReceiver = 149 (area, darkIntensity, tint) -> 150 mView.setTextColor(DarkIconDispatcher.getTint(area, mView, tint)); 151 152 private final SignalCallback mSignalCallback = new SignalCallback() { 153 @Override 154 public void setIsAirplaneMode(@NonNull IconState icon) { 155 update(); 156 } 157 }; 158 159 private final TunerService.Tunable mTunable = (key, newValue) -> update(); 160 161 162 private final KeyguardUpdateMonitorCallback mKeyguardUpdateMonitorCallback = 163 new KeyguardUpdateMonitorCallback() { 164 @Override 165 public void onRefreshCarrierInfo() { 166 mView.updateText(getDefaultSubInfo()); 167 } 168 }; 169 170 // TODO: do we even register this anywhere? 171 private final DemoModeCommandReceiver mDemoModeCommandReceiver = new DemoModeCommandReceiver() { 172 @Override 173 public void onDemoModeStarted() { 174 mView.setDemoMode(true); 175 } 176 177 @Override 178 public void onDemoModeFinished() { 179 mView.setDemoMode(false); 180 update(); 181 } 182 183 @Override 184 public void dispatchDemoCommand(String command, Bundle args) { 185 mView.setText(args.getString("name")); 186 } 187 }; 188 189 static class SubInfo { 190 private final int mSubId; 191 private final CharSequence mCarrierName; 192 private final int mSimState; 193 private final ServiceState mServiceState; 194 SubInfo( int subId, CharSequence carrierName, int simState, ServiceState serviceState)195 private SubInfo( 196 int subId, 197 CharSequence carrierName, 198 int simState, 199 ServiceState serviceState) { 200 mSubId = subId; 201 mCarrierName = carrierName; 202 mSimState = simState; 203 mServiceState = serviceState; 204 } 205 getSubId()206 int getSubId() { 207 return mSubId; 208 } 209 simReady()210 boolean simReady() { 211 return mSimState == TelephonyManager.SIM_STATE_READY; 212 } 213 getCarrierName()214 CharSequence getCarrierName() { 215 return mCarrierName; 216 } 217 stateInService()218 boolean stateInService() { 219 return mServiceState != null 220 && mServiceState.getState() == ServiceState.STATE_IN_SERVICE; 221 } 222 } 223 } 224