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