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