Support the Carrier WiFi for Provider Model

When the device is connected to the Carrier WiFi, the Cellular icons
will be shown in the SysUI instead of the WiFi icons.

Bug: 175317582
Test: Unit tests, Manual tests
Change-Id: I4e090f3058724937ba9bbe131d91379ad2383083
This commit is contained in:
yinxu
2020-12-17 09:22:11 -08:00
parent 677c97ddf8
commit e59b66fbdb
7 changed files with 163 additions and 28 deletions

View File

@@ -0,0 +1,30 @@
<!--
Copyright (C) 2020 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="38dp"
android:height="24dp"
android:viewportWidth="38.0"
android:viewportHeight="24.0">
<path
android:fillColor="#FF000000"
android:pathData="M9.45,14.48h1.8c-0.05,0.98 -0.24,1.82 -0.6,2.53c-0.35,0.7 -0.85,1.24 -1.51,1.62c-0.66,0.38 -1.48,0.57 -2.47,0.57c-0.71,0 -1.35,-0.14 -1.92,-0.42c-0.57,-0.28 -1.06,-0.68 -1.47,-1.2c-0.4,-0.53 -0.71,-1.16 -0.93,-1.89c-0.21,-0.74 -0.32,-1.56 -0.32,-2.48v-2.63c0,-0.91 0.11,-1.74 0.32,-2.47c0.22,-0.74 0.54,-1.36 0.95,-1.88C3.71,5.69 4.21,5.29 4.8,5.01c0.6,-0.28 1.28,-0.42 2.03,-0.42c0.92,0 1.71,0.19 2.34,0.56c0.64,0.36 1.14,0.9 1.48,1.61c0.35,0.7 0.55,1.57 0.59,2.59h-1.8C9.41,8.59 9.29,7.98 9.1,7.52C8.91,7.04 8.63,6.69 8.26,6.47C7.9,6.24 7.42,6.13 6.84,6.13c-0.52,0 -0.97,0.1 -1.36,0.31C5.1,6.65 4.79,6.95 4.54,7.34C4.3,7.72 4.12,8.19 3.99,8.74c-0.12,0.54 -0.18,1.15 -0.18,1.82v2.65c0,0.62 0.05,1.21 0.15,1.75c0.1,0.54 0.27,1.02 0.49,1.43c0.23,0.4 0.52,0.72 0.89,0.95c0.36,0.23 0.81,0.34 1.33,0.34c0.66,0 1.18,-0.11 1.56,-0.32c0.38,-0.21 0.67,-0.56 0.85,-1.03C9.27,15.85 9.39,15.23 9.45,14.48z"/>
<path
android:fillColor="#FF000000"
android:pathData="M24.87,4.78l-1.74,9.72l-0.2,1.64l-0.29,-1.44l-2.21,-9.92l-0.2,0l-1.06,0l-0.22,0l-2.28,9.92l-0.28,1.4l-0.18,-1.59l-1.78,-9.73l-1.79,0l2.83,14.22l0.34,0l0.92,0l0.35,0l2.48,-10.36l0.14,-0.84l0.15,0.84l2.36,10.36l0.36,0l0.92,0l0.34,0l2.82,-14.22z"/>
<path
android:fillColor="#FF000000"
android:pathData="M35.72,6.32l0,-1.54l-5.61,0l-0.34,0l-1.45,0l0,14.22l1.79,0l0,-6.28l4.8,0l0,-1.54l-4.8,0l0,-4.86z"/>
</vector>

View File

@@ -1447,6 +1447,9 @@
<!-- Content description of the data connection type 5G+. [CHAR LIMIT=NONE] -->
<string name="data_connection_5g_plus" translatable="false">5G+</string>
<!-- Content description of the data connection type Carrier WiFi. [CHAR LIMIT=NONE] -->
<string name="data_connection_carrier_wifi">CWF</string>
<!-- Content description of the cell data being disabled. [CHAR LIMIT=NONE] -->
<string name="cell_data_off_content_description">Mobile data off</string>

View File

@@ -43,6 +43,7 @@ public class TelephonyIcons {
public static final int ICON_1X = R.drawable.ic_1x_mobiledata;
public static final int ICON_5G = R.drawable.ic_5g_mobiledata;
public static final int ICON_5G_PLUS = R.drawable.ic_5g_plus_mobiledata;
public static final int ICON_CWF = R.drawable.ic_carrier_wifi;
public static final MobileIconGroup CARRIER_NETWORK_CHANGE = new MobileIconGroup(
"CARRIER_NETWORK_CHANGE",
@@ -276,6 +277,20 @@ public class TelephonyIcons {
0,
false);
public static final MobileIconGroup CARRIER_MERGED_WIFI = new MobileIconGroup(
"CWF",
/* sbIcons= */ null,
/* qsIcons= */ null,
AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH,
/* sbNullState= */ 0,
/* qsNullState= */ 0,
/* sbDiscState= */ 0,
/* qsDiscState= */ 0,
AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH[0],
R.string.data_connection_carrier_wifi,
TelephonyIcons.ICON_CWF,
/* isWide= */ true);
// When adding a new MobileIconGround, check if the dataContentDescription has to be filtered
// in QSCarrier#hasValidTypeContentDescription

View File

@@ -33,6 +33,7 @@ import android.net.wifi.WifiNetworkScoreCache;
import android.os.Handler;
import android.os.Looper;
import android.provider.Settings;
import android.util.FeatureFlagUtils;
import com.android.settingslib.R;
@@ -103,11 +104,14 @@ public class WifiStatusTracker {
private Network mDefaultNetwork = null;
private NetworkCapabilities mDefaultNetworkCapabilities = null;
private final Runnable mCallback;
private final boolean mProviderModel;
private WifiInfo mWifiInfo;
public boolean enabled;
public boolean isCaptivePortal;
public boolean isDefaultNetwork;
public boolean isCarrierMerged;
public int subId;
public int state;
public boolean connected;
public String ssid;
@@ -124,6 +128,8 @@ public class WifiStatusTracker {
mNetworkScoreManager = networkScoreManager;
mConnectivityManager = connectivityManager;
mCallback = callback;
mProviderModel = FeatureFlagUtils.isEnabled(
mContext, FeatureFlagUtils.SETTINGS_PROVIDER_MODEL);
}
public void setListening(boolean listening) {
@@ -193,6 +199,10 @@ public class WifiStatusTracker {
} else {
ssid = getValidSsid(mWifiInfo);
}
if (mProviderModel) {
isCarrierMerged = mWifiInfo.isCarrierMerged();
subId = mWifiInfo.getSubscriptionId();
}
updateRssi(mWifiInfo.getRssi());
maybeRequestNetworkScore();
}

View File

@@ -359,7 +359,7 @@ public class NetworkControllerImpl extends BroadcastReceiver
// broadcasts
IntentFilter filter = new IntentFilter();
filter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
filter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
filter.addAction(Intent.ACTION_SIM_STATE_CHANGED);
filter.addAction(TelephonyManager.ACTION_DEFAULT_DATA_SUBSCRIPTION_CHANGED);
filter.addAction(TelephonyManager.ACTION_DEFAULT_VOICE_SUBSCRIPTION_CHANGED);

View File

@@ -16,6 +16,8 @@
package com.android.systemui.statusbar.policy;
import com.android.settingslib.AccessibilityContentDescriptions;
import com.android.settingslib.SignalIcon.IconGroup;
import com.android.systemui.R;
public class WifiIcons {
@@ -40,6 +42,7 @@ public class WifiIcons {
WIFI_NO_INTERNET_ICONS,
WIFI_FULL_ICONS
};
static final int[][] WIFI_SIGNAL_STRENGTH = QS_WIFI_SIGNAL_STRENGTH;
public static final int QS_WIFI_DISABLED = com.android.internal.R.drawable.ic_wifi_signal_0;
@@ -47,4 +50,16 @@ public class WifiIcons {
static final int WIFI_NO_NETWORK = QS_WIFI_NO_NETWORK;
static final int WIFI_LEVEL_COUNT = WIFI_SIGNAL_STRENGTH[0].length;
public static final IconGroup UNMERGED_WIFI = new IconGroup(
"Wi-Fi Icons",
WifiIcons.WIFI_SIGNAL_STRENGTH,
WifiIcons.QS_WIFI_SIGNAL_STRENGTH,
AccessibilityContentDescriptions.WIFI_CONNECTION_STRENGTH,
WifiIcons.WIFI_NO_NETWORK,
WifiIcons.QS_WIFI_NO_NETWORK,
WifiIcons.WIFI_NO_NETWORK,
WifiIcons.QS_WIFI_NO_NETWORK,
AccessibilityContentDescriptions.WIFI_NO_CONNECTION
);
}

View File

@@ -25,12 +25,15 @@ import android.net.ConnectivityManager;
import android.net.NetworkCapabilities;
import android.net.NetworkScoreManager;
import android.net.wifi.WifiManager;
import android.text.Html;
import android.text.TextUtils;
import com.android.internal.annotations.VisibleForTesting;
import com.android.settingslib.AccessibilityContentDescriptions;
import com.android.settingslib.SignalIcon.IconGroup;
import com.android.settingslib.SignalIcon.MobileIconGroup;
import com.android.settingslib.SignalIcon.State;
import com.android.settingslib.graph.SignalDrawable;
import com.android.settingslib.mobile.TelephonyIcons;
import com.android.settingslib.wifi.WifiStatusTracker;
import com.android.systemui.R;
import com.android.systemui.statusbar.policy.NetworkController.IconState;
@@ -42,6 +45,9 @@ public class WifiSignalController extends
SignalController<WifiSignalController.WifiState, IconGroup> {
private final boolean mHasMobileDataFeature;
private final WifiStatusTracker mWifiTracker;
private final IconGroup mUnmergedWifiIconGroup = WifiIcons.UNMERGED_WIFI;
private final MobileIconGroup mCarrierMergedWifiIconGroup = TelephonyIcons.CARRIER_MERGED_WIFI;
private final WifiManager mWifiManager;
public WifiSignalController(Context context, boolean hasMobileDataFeature,
CallbackHandler callbackHandler, NetworkControllerImpl networkController,
@@ -49,6 +55,7 @@ public class WifiSignalController extends
NetworkScoreManager networkScoreManager) {
super("WifiSignalController", context, NetworkCapabilities.TRANSPORT_WIFI,
callbackHandler, networkController);
mWifiManager = wifiManager;
mWifiTracker = new WifiStatusTracker(mContext, wifiManager, networkScoreManager,
connectivityManager, this::handleStatusUpdated);
mWifiTracker.setListening(true);
@@ -57,18 +64,7 @@ public class WifiSignalController extends
wifiManager.registerTrafficStateCallback(context.getMainExecutor(),
new WifiTrafficStateCallback());
}
// WiFi only has one state.
mCurrentState.iconGroup = mLastState.iconGroup = new IconGroup(
"Wi-Fi Icons",
WifiIcons.WIFI_SIGNAL_STRENGTH,
WifiIcons.QS_WIFI_SIGNAL_STRENGTH,
AccessibilityContentDescriptions.WIFI_CONNECTION_STRENGTH,
WifiIcons.WIFI_NO_NETWORK,
WifiIcons.QS_WIFI_NO_NETWORK,
WifiIcons.WIFI_NO_NETWORK,
WifiIcons.QS_WIFI_NO_NETWORK,
AccessibilityContentDescriptions.WIFI_NO_CONNECTION
);
mCurrentState.iconGroup = mLastState.iconGroup = mUnmergedWifiIconGroup;
}
@Override
@@ -82,6 +78,14 @@ public class WifiSignalController extends
@Override
public void notifyListeners(SignalCallback callback) {
if (mCurrentState.isCarrierMerged) {
notifyListenersForCarrierWifi(callback);
} else {
notifyListenersForNonCarrierWifi(callback);
}
}
private void notifyListenersForNonCarrierWifi(SignalCallback callback) {
// only show wifi in the cluster if connected or if wifi-only
boolean visibleWhenEnabled = mContext.getResources().getBoolean(
R.bool.config_showWifiIndicatorWhenEnabled);
@@ -104,14 +108,49 @@ public class WifiSignalController extends
wifiDesc, mCurrentState.isTransient, mCurrentState.statusLabel);
}
private void copyWifiStates() {
mCurrentState.enabled = mWifiTracker.enabled;
mCurrentState.isDefault = mWifiTracker.isDefaultNetwork;
mCurrentState.connected = mWifiTracker.connected;
mCurrentState.ssid = mWifiTracker.ssid;
mCurrentState.rssi = mWifiTracker.rssi;
mCurrentState.level = mWifiTracker.level;
mCurrentState.statusLabel = mWifiTracker.statusLabel;
private void notifyListenersForCarrierWifi(SignalCallback callback) {
MobileIconGroup icons = mCarrierMergedWifiIconGroup;
String contentDescription = getTextIfExists(getContentDescription()).toString();
CharSequence dataContentDescriptionHtml = getTextIfExists(icons.dataContentDescription);
CharSequence dataContentDescription = Html.fromHtml(
dataContentDescriptionHtml.toString(), 0).toString();
if (mCurrentState.inetCondition == 0) {
dataContentDescription = mContext.getString(R.string.data_connection_no_internet);
}
boolean qsVisible = mCurrentState.enabled
&& (mCurrentState.connected && mCurrentState.inetCondition == 1);
IconState statusIcon =
new IconState(qsVisible, getCurrentIconIdForCarrierWifi(), contentDescription);
int qsTypeIcon = mCurrentState.connected ? icons.qsDataType : 0;
int typeIcon = mCurrentState.connected ? icons.dataType : 0;
IconState qsIcon = new IconState(
mCurrentState.connected, getQsCurrentIconIdForCarrierWifi(), contentDescription);
CharSequence description = mNetworkController.getMobileDataNetworkName();
callback.setMobileDataIndicators(statusIcon, qsIcon, typeIcon, qsTypeIcon,
mCurrentState.activityIn, mCurrentState.activityOut, dataContentDescription,
dataContentDescriptionHtml, description, icons.isWide,
mCurrentState.subId, /* roaming= */ false);
}
private int getCurrentIconIdForCarrierWifi() {
int level = mCurrentState.level;
// The WiFi signal level returned by WifiManager#calculateSignalLevel start from 0, so
// WifiManager#getMaxSignalLevel + 1 represents the total level buckets count.
int totalLevel = mWifiManager.getMaxSignalLevel() + 1;
boolean noInternet = mCurrentState.inetCondition == 0;
if (mCurrentState.connected) {
return SignalDrawable.getState(level, totalLevel, noInternet);
} else if (mCurrentState.enabled) {
return SignalDrawable.getEmptyState(totalLevel);
} else {
return 0;
}
}
private int getQsCurrentIconIdForCarrierWifi() {
return getCurrentIconIdForCarrierWifi();
}
/**
@@ -137,6 +176,21 @@ public class WifiSignalController extends
notifyListenersIfNecessary();
}
private void copyWifiStates() {
mCurrentState.enabled = mWifiTracker.enabled;
mCurrentState.isDefault = mWifiTracker.isDefaultNetwork;
mCurrentState.connected = mWifiTracker.connected;
mCurrentState.ssid = mWifiTracker.ssid;
mCurrentState.rssi = mWifiTracker.rssi;
mCurrentState.level = mWifiTracker.level;
mCurrentState.statusLabel = mWifiTracker.statusLabel;
mCurrentState.isCarrierMerged = mWifiTracker.isCarrierMerged;
mCurrentState.subId = mWifiTracker.subId;
mCurrentState.iconGroup =
mCurrentState.isCarrierMerged ? mCarrierMergedWifiIconGroup
: mUnmergedWifiIconGroup;
}
@VisibleForTesting
void setActivity(int wifiActivity) {
mCurrentState.activityIn = wifiActivity == DATA_ACTIVITY_INOUT
@@ -157,10 +211,12 @@ public class WifiSignalController extends
}
static class WifiState extends State {
String ssid;
boolean isTransient;
boolean isDefault;
String statusLabel;
public String ssid;
public boolean isTransient;
public boolean isDefault;
public String statusLabel;
public boolean isCarrierMerged;
public int subId;
@Override
public void copyFrom(State s) {
@@ -170,6 +226,8 @@ public class WifiSignalController extends
isTransient = state.isTransient;
isDefault = state.isDefault;
statusLabel = state.statusLabel;
isCarrierMerged = state.isCarrierMerged;
subId = state.subId;
}
@Override
@@ -178,7 +236,9 @@ public class WifiSignalController extends
builder.append(",ssid=").append(ssid)
.append(",isTransient=").append(isTransient)
.append(",isDefault=").append(isDefault)
.append(",statusLabel=").append(statusLabel);
.append(",statusLabel=").append(statusLabel)
.append(",isCarrierMerged=").append(isCarrierMerged)
.append(",subId=").append(subId);
}
@Override
@@ -190,7 +250,9 @@ public class WifiSignalController extends
return Objects.equals(other.ssid, ssid)
&& other.isTransient == isTransient
&& other.isDefault == isDefault
&& TextUtils.equals(other.statusLabel, statusLabel);
&& TextUtils.equals(other.statusLabel, statusLabel)
&& other.isCarrierMerged == isCarrierMerged
&& other.subId == subId;
}
}
}