• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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.car.statusicon.ui;
18 
19 import android.content.Context;
20 import android.content.res.Resources;
21 import android.graphics.drawable.Drawable;
22 
23 import androidx.annotation.VisibleForTesting;
24 
25 import com.android.car.datasubscription.Flags;
26 import com.android.settingslib.graph.SignalDrawable;
27 import com.android.systemui.R;
28 import com.android.systemui.car.qc.DataSubscriptionController;
29 import com.android.systemui.car.statusicon.StatusIconView;
30 import com.android.systemui.car.statusicon.StatusIconViewController;
31 import com.android.systemui.car.systembar.element.CarSystemBarElementStateController;
32 import com.android.systemui.car.systembar.element.CarSystemBarElementStatusBarDisableController;
33 import com.android.systemui.dagger.qualifiers.Main;
34 import com.android.systemui.statusbar.connectivity.IconState;
35 import com.android.systemui.statusbar.connectivity.MobileDataIndicators;
36 import com.android.systemui.statusbar.connectivity.NetworkController;
37 import com.android.systemui.statusbar.connectivity.SignalCallback;
38 import com.android.systemui.statusbar.connectivity.WifiIndicators;
39 import com.android.systemui.statusbar.policy.HotspotController;
40 
41 import dagger.assisted.Assisted;
42 import dagger.assisted.AssistedFactory;
43 import dagger.assisted.AssistedInject;
44 
45 /**
46  * A controller for status icon about mobile data, Wi-Fi, and hotspot.
47  */
48 public class SignalStatusIconController extends StatusIconViewController implements
49         SignalCallback, HotspotController.Callback {
50 
51     private final Context mContext;
52     private final Resources mResources;
53     private final HotspotController mHotspotController;
54     private final NetworkController mNetworkController;
55     private final DataSubscriptionController mDataSubscriptionController;
56     private SignalDrawable mMobileSignalIconDrawable;
57     private Drawable mWifiSignalIconDrawable;
58     private Drawable mHotSpotIconDrawable;
59     private Drawable mEthernetIconDrawable;
60     private boolean mIsWifiEnabledAndConnected;
61     private boolean mIsHotspotEnabled;
62     private boolean mIsEthernetConnected;
63     private String mMobileSignalContentDescription;
64     private String mWifiConnectedContentDescription;
65     private String mHotspotOnContentDescription;
66     private String mEthernetContentDescription;
67 
68     @AssistedInject
SignalStatusIconController( @ssisted StatusIconView view, CarSystemBarElementStatusBarDisableController disableController, CarSystemBarElementStateController stateController, Context context, @Main Resources resources, NetworkController networkController, HotspotController hotspotController, DataSubscriptionController dataSubscriptionController)69     SignalStatusIconController(
70             @Assisted StatusIconView view,
71             CarSystemBarElementStatusBarDisableController disableController,
72             CarSystemBarElementStateController stateController,
73             Context context,
74             @Main Resources resources,
75             NetworkController networkController,
76             HotspotController hotspotController,
77             DataSubscriptionController dataSubscriptionController) {
78         super(view, disableController, stateController);
79         mContext = context;
80         mResources = resources;
81         mHotspotController = hotspotController;
82         mNetworkController = networkController;
83         mDataSubscriptionController = dataSubscriptionController;
84 
85         mMobileSignalIconDrawable = new SignalDrawable(mContext);
86         mHotSpotIconDrawable = mResources.getDrawable(R.drawable.ic_hotspot, mContext.getTheme());
87 
88         mMobileSignalContentDescription = resources.getString(R.string.status_icon_signal_mobile);
89         mWifiConnectedContentDescription = resources.getString(R.string.status_icon_signal_wifi);
90         mHotspotOnContentDescription = resources.getString(R.string.status_icon_signal_hotspot);
91     }
92 
93     @AssistedFactory
94     public interface Factory extends
95             StatusIconViewController.Factory<SignalStatusIconController> {
96     }
97 
98     @Override
onViewAttached()99     protected void onViewAttached() {
100         super.onViewAttached();
101         mNetworkController.addCallback(this);
102         mHotspotController.addCallback(this);
103         if (Flags.dataSubscriptionPopUp()) {
104             mDataSubscriptionController.setAnchorView(mView);
105         }
106     }
107 
108     @Override
onViewDetached()109     protected void onViewDetached() {
110         super.onViewDetached();
111         mNetworkController.removeCallback(this);
112         mHotspotController.removeCallback(this);
113         if (Flags.dataSubscriptionPopUp()) {
114             mDataSubscriptionController.setAnchorView(null);
115         }
116     }
117 
118     @Override
updateStatus()119     protected void updateStatus() {
120         if (mIsHotspotEnabled) {
121             setIconDrawableToDisplay(mHotSpotIconDrawable);
122             setIconContentDescription(mHotspotOnContentDescription);
123         } else if (mIsEthernetConnected) {
124             setIconDrawableToDisplay(mEthernetIconDrawable);
125             setIconContentDescription(mEthernetContentDescription);
126         } else if (mIsWifiEnabledAndConnected) {
127             setIconDrawableToDisplay(mWifiSignalIconDrawable);
128             setIconContentDescription(mWifiConnectedContentDescription);
129         } else {
130             setIconDrawableToDisplay(mMobileSignalIconDrawable);
131             setIconContentDescription(mMobileSignalContentDescription);
132         }
133         onStatusUpdated();
134     }
135 
136     @Override
setMobileDataIndicators(MobileDataIndicators mobileDataIndicators)137     public void setMobileDataIndicators(MobileDataIndicators mobileDataIndicators) {
138         mMobileSignalIconDrawable.setLevel(mobileDataIndicators.statusIcon.icon);
139         updateStatus();
140     }
141 
142     @Override
setWifiIndicators(WifiIndicators indicators)143     public void setWifiIndicators(WifiIndicators indicators) {
144         mIsWifiEnabledAndConnected = indicators.enabled && indicators.statusIcon.visible;
145         mWifiSignalIconDrawable = mResources.getDrawable(indicators.statusIcon.icon,
146                 mContext.getTheme());
147         updateStatus();
148     }
149 
150     @Override
onHotspotChanged(boolean enabled, int numDevices)151     public void onHotspotChanged(boolean enabled, int numDevices) {
152         mIsHotspotEnabled = enabled;
153         updateStatus();
154     }
155 
156     @Override
setEthernetIndicators(IconState state)157     public void setEthernetIndicators(IconState state) {
158         mIsEthernetConnected = state.visible;
159         if (mIsEthernetConnected) {
160             mEthernetIconDrawable = mResources.getDrawable(state.icon, mContext.getTheme());
161             mEthernetContentDescription = state.contentDescription;
162         }
163         updateStatus();
164     }
165 
166     @VisibleForTesting
getMobileSignalIconDrawable()167     SignalDrawable getMobileSignalIconDrawable() {
168         return mMobileSignalIconDrawable;
169     }
170 
171     @VisibleForTesting
getWifiSignalIconDrawable()172     Drawable getWifiSignalIconDrawable() {
173         return mWifiSignalIconDrawable;
174     }
175 
176     @VisibleForTesting
getHotSpotIconDrawable()177     Drawable getHotSpotIconDrawable() {
178         return mHotSpotIconDrawable;
179     }
180 
181     @VisibleForTesting
getEthernetIconDrawable()182     Drawable getEthernetIconDrawable() {
183         return mEthernetIconDrawable;
184     }
185 }
186