Merge changes Ibdaec230,I06d5e569,I5e2eb489,I116b5f63,I6fa7adaa into sc-v2-dev

* changes:
  Create QsInfo and SbInfo boxes for MobileSignalController
  Move some logic to MobileState
  Remove qsDataType since it was the same as dataType
  Remove isWide from MobileIconGroup
  Move callback anonymous classes out of constructor
This commit is contained in:
Evan Laird
2021-09-24 23:18:50 +00:00
committed by Android (Google) Code Review
10 changed files with 500 additions and 254 deletions

View File

@@ -15,6 +15,8 @@
*/
package com.android.settingslib;
import com.android.settingslib.mobile.TelephonyIcons;
import java.text.SimpleDateFormat;
import java.util.Objects;
@@ -40,9 +42,17 @@ public class SignalIcon {
// For logging.
public final String name;
public IconGroup(String name, int[][] sbIcons, int[][] qsIcons, int[] contentDesc,
int sbNullState, int qsNullState, int sbDiscState, int qsDiscState,
int discContentDesc) {
public IconGroup(
String name,
int[][] sbIcons,
int[][] qsIcons,
int[] contentDesc,
int sbNullState,
int qsNullState,
int sbDiscState,
int qsDiscState,
int discContentDesc
) {
this.name = name;
this.sbIcons = sbIcons;
this.qsIcons = qsIcons;
@@ -131,6 +141,19 @@ public class SignalIcon {
&& other.activityOut == activityOut
&& other.rssi == rssi;
}
@Override
public int hashCode() {
return Objects.hash(
connected,
enabled,
level,
inetCondition,
iconGroup,
activityIn,
activityOut,
rssi);
}
}
/**
@@ -139,18 +162,31 @@ public class SignalIcon {
public static class MobileIconGroup extends IconGroup {
public final int dataContentDescription; // mContentDescriptionDataType
public final int dataType;
public final boolean isWide;
public final int qsDataType;
public MobileIconGroup(String name, int[][] sbIcons, int[][] qsIcons, int[] contentDesc,
int sbNullState, int qsNullState, int sbDiscState, int qsDiscState,
int discContentDesc, int dataContentDesc, int dataType, boolean isWide) {
super(name, sbIcons, qsIcons, contentDesc, sbNullState, qsNullState, sbDiscState,
qsDiscState, discContentDesc);
public MobileIconGroup(
String name,
int[][] sbIcons,
int[][] qsIcons,
int[] contentDesc,
int sbNullState,
int qsNullState,
int sbDiscState,
int qsDiscState,
int discContentDesc,
int dataContentDesc,
int dataType
) {
super(name,
sbIcons,
qsIcons,
contentDesc,
sbNullState,
qsNullState,
sbDiscState,
qsDiscState,
discContentDesc);
this.dataContentDescription = dataContentDesc;
this.dataType = dataType;
this.isWide = isWide;
this.qsDataType = dataType; // TODO: remove this field
}
}
@@ -187,6 +223,27 @@ public class SignalIcon {
defaultDataOff = state.defaultDataOff;
}
/** @return true if this state is disabled or not default data */
public boolean isDataDisabledOrNotDefault() {
return (iconGroup == TelephonyIcons.DATA_DISABLED
|| (iconGroup == TelephonyIcons.NOT_DEFAULT_DATA)) && userSetup;
}
/** @return if this state is considered to have inbound activity */
public boolean hasActivityIn() {
return dataConnected && !carrierNetworkChangeMode && activityIn;
}
/** @return if this state is considered to have outbound activity */
public boolean hasActivityOut() {
return dataConnected && !carrierNetworkChangeMode && activityOut;
}
/** @return true if this state should show a RAT icon in quick settings */
public boolean showQuickSettingsRatIcon() {
return dataConnected || isDataDisabledOrNotDefault();
}
@Override
protected void toString(StringBuilder builder) {
super.toString(builder);
@@ -202,23 +259,40 @@ public class SignalIcon {
builder.append("carrierNetworkChangeMode=").append(carrierNetworkChangeMode)
.append(',');
builder.append("userSetup=").append(userSetup).append(',');
builder.append("defaultDataOff=").append(defaultDataOff);
builder.append("defaultDataOff=").append(defaultDataOff).append(',');
builder.append("showQuickSettingsRatIcon=").append(showQuickSettingsRatIcon());
}
@Override
public boolean equals(Object o) {
return super.equals(o)
&& Objects.equals(((MobileState) o).networkName, networkName)
&& Objects.equals(((MobileState) o).networkNameData, networkNameData)
&& ((MobileState) o).dataSim == dataSim
&& ((MobileState) o).dataConnected == dataConnected
&& ((MobileState) o).isEmergency == isEmergency
&& ((MobileState) o).airplaneMode == airplaneMode
&& ((MobileState) o).carrierNetworkChangeMode == carrierNetworkChangeMode
&& ((MobileState) o).userSetup == userSetup
&& ((MobileState) o).isDefault == isDefault
&& ((MobileState) o).roaming == roaming
&& ((MobileState) o).defaultDataOff == defaultDataOff;
&& Objects.equals(((MobileState) o).networkName, networkName)
&& Objects.equals(((MobileState) o).networkNameData, networkNameData)
&& ((MobileState) o).dataSim == dataSim
&& ((MobileState) o).dataConnected == dataConnected
&& ((MobileState) o).isEmergency == isEmergency
&& ((MobileState) o).airplaneMode == airplaneMode
&& ((MobileState) o).carrierNetworkChangeMode == carrierNetworkChangeMode
&& ((MobileState) o).userSetup == userSetup
&& ((MobileState) o).isDefault == isDefault
&& ((MobileState) o).roaming == roaming
&& ((MobileState) o).defaultDataOff == defaultDataOff;
}
@Override
public int hashCode() {
return Objects.hash(super.hashCode(),
networkName,
networkNameData,
dataSim,
dataConnected,
isEmergency,
airplaneMode,
carrierNetworkChangeMode,
userSetup,
isDefault,
roaming,
defaultDataOff);
}
}
}

View File

@@ -50,178 +50,194 @@ public class TelephonyIcons {
null,
null,
AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH,
0, 0,
0,
0,
0,
0,
AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH[0],
R.string.carrier_network_change_mode,
0,
false);
0
);
public static final MobileIconGroup THREE_G = new MobileIconGroup(
"3G",
null,
null,
AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH,
0, 0,
0,
0,
0,
0,
AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH[0],
R.string.data_connection_3g,
TelephonyIcons.ICON_3G,
true);
TelephonyIcons.ICON_3G
);
public static final MobileIconGroup WFC = new MobileIconGroup(
"WFC",
null,
null,
AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH,
0, 0,
0,
0,
0,
0,
AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH[0],
0, 0, false);
0,
0);
public static final MobileIconGroup UNKNOWN = new MobileIconGroup(
"Unknown",
null,
null,
AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH,
0, 0,
0,
0,
0,
0,
AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH[0],
0, 0, false);
0,
0);
public static final MobileIconGroup E = new MobileIconGroup(
"E",
null,
null,
AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH,
0, 0,
0,
0,
0,
0,
AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH[0],
R.string.data_connection_edge,
TelephonyIcons.ICON_E,
false);
TelephonyIcons.ICON_E
);
public static final MobileIconGroup ONE_X = new MobileIconGroup(
"1X",
null,
null,
AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH,
0, 0,
0,
0,
0,
0,
AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH[0],
R.string.data_connection_cdma,
TelephonyIcons.ICON_1X,
true);
TelephonyIcons.ICON_1X
);
public static final MobileIconGroup G = new MobileIconGroup(
"G",
null,
null,
AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH,
0, 0,
0,
0,
0,
0,
AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH[0],
R.string.data_connection_gprs,
TelephonyIcons.ICON_G,
false);
TelephonyIcons.ICON_G
);
public static final MobileIconGroup H = new MobileIconGroup(
"H",
null,
null,
AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH,
0, 0,
0,
0,
0,
0,
AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH[0],
R.string.data_connection_3_5g,
TelephonyIcons.ICON_H,
false);
TelephonyIcons.ICON_H
);
public static final MobileIconGroup H_PLUS = new MobileIconGroup(
"H+",
null,
null,
AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH,
0, 0,
0,
0,
0,
0,
AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH[0],
R.string.data_connection_3_5g_plus,
TelephonyIcons.ICON_H_PLUS,
false);
TelephonyIcons.ICON_H_PLUS
);
public static final MobileIconGroup FOUR_G = new MobileIconGroup(
"4G",
null,
null,
AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH,
0, 0,
0,
0,
0,
0,
AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH[0],
R.string.data_connection_4g,
TelephonyIcons.ICON_4G,
true);
TelephonyIcons.ICON_4G
);
public static final MobileIconGroup FOUR_G_PLUS = new MobileIconGroup(
"4G+",
null,
null,
AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH,
0, 0,
0,
0,
0,
0,
AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH[0],
R.string.data_connection_4g_plus,
TelephonyIcons.ICON_4G_PLUS,
true);
TelephonyIcons.ICON_4G_PLUS
);
public static final MobileIconGroup LTE = new MobileIconGroup(
"LTE",
null,
null,
AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH,
0, 0,
0,
0,
0,
0,
AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH[0],
R.string.data_connection_lte,
TelephonyIcons.ICON_LTE,
true);
TelephonyIcons.ICON_LTE
);
public static final MobileIconGroup LTE_PLUS = new MobileIconGroup(
"LTE+",
null,
null,
AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH,
0, 0,
0,
0,
0,
0,
AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH[0],
R.string.data_connection_lte_plus,
TelephonyIcons.ICON_LTE_PLUS,
true);
TelephonyIcons.ICON_LTE_PLUS
);
public static final MobileIconGroup LTE_CA_5G_E = new MobileIconGroup(
"5Ge",
null,
null,
AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH,
0, 0,
0,
0,
0,
0,
AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH[0],
R.string.data_connection_5ge_html,
TelephonyIcons.ICON_5G_E,
true);
TelephonyIcons.ICON_5G_E
);
public static final MobileIconGroup NR_5G = new MobileIconGroup(
"5G",
@@ -234,8 +250,8 @@ public class TelephonyIcons {
0,
AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH[0],
R.string.data_connection_5g,
TelephonyIcons.ICON_5G,
true);
TelephonyIcons.ICON_5G
);
public static final MobileIconGroup NR_5G_PLUS = new MobileIconGroup(
"5G_PLUS",
@@ -248,34 +264,36 @@ public class TelephonyIcons {
0,
AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH[0],
R.string.data_connection_5g_plus,
TelephonyIcons.ICON_5G_PLUS,
true);
TelephonyIcons.ICON_5G_PLUS
);
public static final MobileIconGroup DATA_DISABLED = new MobileIconGroup(
"DataDisabled",
null,
null,
AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH,
0, 0,
0,
0,
0,
0,
AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH[0],
R.string.cell_data_off_content_description,
0,
false);
0
);
public static final MobileIconGroup NOT_DEFAULT_DATA = new MobileIconGroup(
"NotDefaultData",
null,
null,
AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH,
0, 0,
0,
0,
0,
0,
AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH[0],
R.string.not_default_data_content_description,
0,
false);
0
);
public static final MobileIconGroup CARRIER_MERGED_WIFI = new MobileIconGroup(
"CWF",
@@ -288,8 +306,8 @@ public class TelephonyIcons {
/* qsDiscState= */ 0,
AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH[0],
R.string.data_connection_carrier_wifi,
TelephonyIcons.ICON_CWF,
/* isWide= */ true);
TelephonyIcons.ICON_CWF
);
// When adding a new MobileIconGround, check if the dataContentDescription has to be filtered
// in QSCarrier#hasValidTypeContentDescription

View File

@@ -0,0 +1,133 @@
/*
* Copyright (C) 2021 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.
*/
package com.android.settingslib;
import static junit.framework.Assert.assertFalse;
import static junit.framework.Assert.assertTrue;
import com.android.settingslib.mobile.TelephonyIcons;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner;
@RunWith(RobolectricTestRunner.class)
public class MobileStateTest {
private SignalIcon.MobileState mState = new SignalIcon.MobileState();
@Before
public void setUp() {
}
@Test
public void testIsDataDisabledOrNotDefault_dataDisabled() {
mState.iconGroup = TelephonyIcons.DATA_DISABLED;
mState.userSetup = true;
assertTrue(mState.isDataDisabledOrNotDefault());
}
@Test
public void testIsDataDisabledOrNotDefault_notDefaultData() {
mState.iconGroup = TelephonyIcons.NOT_DEFAULT_DATA;
mState.userSetup = true;
assertTrue(mState.isDataDisabledOrNotDefault());
}
@Test
public void testIsDataDisabledOrNotDefault_notDisabled() {
mState.iconGroup = TelephonyIcons.G;
mState.userSetup = true;
assertFalse(mState.isDataDisabledOrNotDefault());
}
@Test
public void testHasActivityIn_noData_noActivity() {
mState.dataConnected = false;
mState.carrierNetworkChangeMode = false;
mState.activityIn = false;
assertFalse(mState.hasActivityIn());
}
@Test
public void testHasActivityIn_noData_activityIn() {
mState.dataConnected = false;
mState.carrierNetworkChangeMode = false;
mState.activityIn = true;
assertFalse(mState.hasActivityIn());
}
@Test
public void testHasActivityIn_dataConnected_activityIn() {
mState.dataConnected = true;
mState.carrierNetworkChangeMode = false;
mState.activityIn = true;
assertTrue(mState.hasActivityIn());
}
@Test
public void testHasActivityIn_carrierNetworkChange() {
mState.dataConnected = true;
mState.carrierNetworkChangeMode = true;
mState.activityIn = true;
assertFalse(mState.hasActivityIn());
}
@Test
public void testHasActivityOut_noData_noActivity() {
mState.dataConnected = false;
mState.carrierNetworkChangeMode = false;
mState.activityOut = false;
assertFalse(mState.hasActivityOut());
}
@Test
public void testHasActivityOut_noData_activityOut() {
mState.dataConnected = false;
mState.carrierNetworkChangeMode = false;
mState.activityOut = true;
assertFalse(mState.hasActivityOut());
}
@Test
public void testHasActivityOut_dataConnected_activityOut() {
mState.dataConnected = true;
mState.carrierNetworkChangeMode = false;
mState.activityOut = true;
assertTrue(mState.hasActivityOut());
}
@Test
public void testHasActivityOut_carrierNetworkChange() {
mState.dataConnected = true;
mState.carrierNetworkChangeMode = true;
mState.activityOut = true;
assertFalse(mState.hasActivityOut());
}
}

View File

@@ -275,7 +275,7 @@ public class CellularTile extends QSTileImpl<SignalState> {
return;
}
mInfo.dataSubscriptionName = mController.getMobileDataNetworkName();
mInfo.dataContentDescription = indicators.description != null
mInfo.dataContentDescription = indicators.qsDescription != null
? indicators.typeContentDescriptionHtml : null;
mInfo.activityIn = indicators.activityIn;
mInfo.activityOut = indicators.activityOut;

View File

@@ -279,9 +279,9 @@ public class InternetTile extends QSTileImpl<SignalState> {
// Not data sim, don't display.
return;
}
mCellularInfo.mDataSubscriptionName = indicators.description == null
? mController.getMobileDataNetworkName() : indicators.description;
mCellularInfo.mDataContentDescription = indicators.description != null
mCellularInfo.mDataSubscriptionName = indicators.qsDescription == null
? mController.getMobileDataNetworkName() : indicators.qsDescription;
mCellularInfo.mDataContentDescription = indicators.qsDescription != null
? indicators.typeContentDescriptionHtml : null;
mCellularInfo.mMobileSignalIconId = indicators.qsIcon.icon;
mCellularInfo.mQsTypeIcon = indicators.qsType;

View File

@@ -91,8 +91,7 @@ public class MobileSignalController extends SignalController<MobileState, Mobile
private int mImsType = IMS_TYPE_WWAN;
// Save entire info for logging, we only use the id.
final SubscriptionInfo mSubscriptionInfo;
// @VisibleForDemoMode
Map<String, MobileIconGroup> mNetworkToIconLookup;
private Map<String, MobileIconGroup> mNetworkToIconLookup;
// Since some pieces of the phone state are interdependent we store it locally,
// this could potentially become part of MobileState for simplification/complication
@@ -108,8 +107,6 @@ public class MobileSignalController extends SignalController<MobileState, Mobile
private Config mConfig;
@VisibleForTesting
boolean mInflateSignalStrengths = false;
private MobileStatusTracker.Callback mCallback;
private RegistrationCallback mRegistrationCallback;
private int mLastWwanLevel;
private int mLastWlanLevel;
private int mLastWlanCrossSimLevel;
@@ -121,6 +118,82 @@ public class MobileSignalController extends SignalController<MobileState, Mobile
// Where to copy the next state into.
private int mMobileStatusHistoryIndex;
private final MobileStatusTracker.Callback mMobileCallback =
new MobileStatusTracker.Callback() {
private String mLastStatus;
@Override
public void onMobileStatusChanged(boolean updateTelephony,
MobileStatus mobileStatus) {
if (Log.isLoggable(mTag, Log.DEBUG)) {
Log.d(mTag, "onMobileStatusChanged="
+ " updateTelephony=" + updateTelephony
+ " mobileStatus=" + mobileStatus.toString());
}
String currentStatus = mobileStatus.toString();
if (!currentStatus.equals(mLastStatus)) {
mLastStatus = currentStatus;
String status = new StringBuilder()
.append(SSDF.format(System.currentTimeMillis())).append(",")
.append(currentStatus)
.toString();
recordLastMobileStatus(status);
}
updateMobileStatus(mobileStatus);
if (updateTelephony) {
updateTelephony();
} else {
notifyListenersIfNecessary();
}
}
};
private final RegistrationCallback mRegistrationCallback = new RegistrationCallback() {
@Override
public void onRegistered(ImsRegistrationAttributes attributes) {
Log.d(mTag, "onRegistered: " + "attributes=" + attributes);
int imsTransportType = attributes.getTransportType();
int registrationAttributes = attributes.getAttributeFlags();
if (imsTransportType == AccessNetworkConstants.TRANSPORT_TYPE_WWAN) {
mImsType = IMS_TYPE_WWAN;
IconState statusIcon = new IconState(
true,
getCallStrengthIcon(mLastWwanLevel, /* isWifi= */false),
getCallStrengthDescription(mLastWwanLevel, /* isWifi= */false));
notifyCallStateChange(statusIcon, mSubscriptionInfo.getSubscriptionId());
} else if (imsTransportType == AccessNetworkConstants.TRANSPORT_TYPE_WLAN) {
if (registrationAttributes == 0) {
mImsType = IMS_TYPE_WLAN;
IconState statusIcon = new IconState(
true,
getCallStrengthIcon(mLastWlanLevel, /* isWifi= */true),
getCallStrengthDescription(mLastWlanLevel, /* isWifi= */true));
notifyCallStateChange(statusIcon, mSubscriptionInfo.getSubscriptionId());
} else if (registrationAttributes
== ImsRegistrationAttributes.ATTR_EPDG_OVER_CELL_INTERNET) {
mImsType = IMS_TYPE_WLAN_CROSS_SIM;
IconState statusIcon = new IconState(
true,
getCallStrengthIcon(mLastWlanCrossSimLevel, /* isWifi= */false),
getCallStrengthDescription(
mLastWlanCrossSimLevel, /* isWifi= */false));
notifyCallStateChange(statusIcon, mSubscriptionInfo.getSubscriptionId());
}
}
}
@Override
public void onUnregistered(ImsReasonInfo info) {
Log.d(mTag, "onDeregistered: " + "info=" + info);
mImsType = IMS_TYPE_WWAN;
IconState statusIcon = new IconState(
true,
getCallStrengthIcon(mLastWwanLevel, /* isWifi= */false),
getCallStrengthDescription(mLastWwanLevel, /* isWifi= */false));
notifyCallStateChange(statusIcon, mSubscriptionInfo.getSubscriptionId());
}
};
// TODO: Reduce number of vars passed in, if we have the NetworkController, probably don't
// need listener lists anymore.
public MobileSignalController(
@@ -144,8 +217,8 @@ public class MobileSignalController extends SignalController<MobileState, Mobile
mPhone = phone;
mDefaults = defaults;
mSubscriptionInfo = info;
mNetworkNameSeparator = getTextIfExists(R.string.status_bar_network_name_separator)
.toString();
mNetworkNameSeparator = getTextIfExists(
R.string.status_bar_network_name_separator).toString();
mNetworkNameDefault = getTextIfExists(
com.android.internal.R.string.lockscreen_carrier_default).toString();
mReceiverHandler = new Handler(receiverLooper);
@@ -165,83 +238,9 @@ public class MobileSignalController extends SignalController<MobileState, Mobile
updateTelephony();
}
};
mCallback = new MobileStatusTracker.Callback() {
private String mLastStatus;
@Override
public void onMobileStatusChanged(boolean updateTelephony,
MobileStatus mobileStatus) {
if (Log.isLoggable(mTag, Log.DEBUG)) {
Log.d(mTag, "onMobileStatusChanged="
+ " updateTelephony=" + updateTelephony
+ " mobileStatus=" + mobileStatus.toString());
}
String currentStatus = mobileStatus.toString();
if (!currentStatus.equals(mLastStatus)) {
mLastStatus = currentStatus;
String status = new StringBuilder()
.append(SSDF.format(System.currentTimeMillis())).append(",")
.append(currentStatus)
.toString();
recordLastMobileStatus(status);
}
updateMobileStatus(mobileStatus);
if (updateTelephony) {
updateTelephony();
} else {
notifyListenersIfNecessary();
}
}
};
mRegistrationCallback = new RegistrationCallback() {
@Override
public void onRegistered(ImsRegistrationAttributes attributes) {
Log.d(mTag, "onRegistered: " + "attributes=" + attributes);
int imsTransportType = attributes.getTransportType();
int registrationAttributes = attributes.getAttributeFlags();
if (imsTransportType == AccessNetworkConstants.TRANSPORT_TYPE_WWAN) {
mImsType = IMS_TYPE_WWAN;
IconState statusIcon = new IconState(
true,
getCallStrengthIcon(mLastWwanLevel, /* isWifi= */false),
getCallStrengthDescription(mLastWwanLevel, /* isWifi= */false));
notifyCallStateChange(statusIcon, mSubscriptionInfo.getSubscriptionId());
} else if (imsTransportType == AccessNetworkConstants.TRANSPORT_TYPE_WLAN) {
if (registrationAttributes == 0) {
mImsType = IMS_TYPE_WLAN;
IconState statusIcon = new IconState(
true,
getCallStrengthIcon(mLastWlanLevel, /* isWifi= */true),
getCallStrengthDescription(mLastWlanLevel, /* isWifi= */true));
notifyCallStateChange(statusIcon, mSubscriptionInfo.getSubscriptionId());
} else if (registrationAttributes
== ImsRegistrationAttributes.ATTR_EPDG_OVER_CELL_INTERNET) {
mImsType = IMS_TYPE_WLAN_CROSS_SIM;
IconState statusIcon = new IconState(
true,
getCallStrengthIcon(mLastWlanCrossSimLevel, /* isWifi= */false),
getCallStrengthDescription(
mLastWlanCrossSimLevel, /* isWifi= */false));
notifyCallStateChange(statusIcon, mSubscriptionInfo.getSubscriptionId());
}
}
}
@Override
public void onUnregistered(ImsReasonInfo info) {
Log.d(mTag, "onDeregistered: " + "info=" + info);
mImsType = IMS_TYPE_WWAN;
IconState statusIcon = new IconState(
true,
getCallStrengthIcon(mLastWwanLevel, /* isWifi= */false),
getCallStrengthDescription(mLastWwanLevel, /* isWifi= */false));
notifyCallStateChange(statusIcon, mSubscriptionInfo.getSubscriptionId());
}
};
mImsMmTelManager = ImsMmTelManager.createForSubscriptionId(info.getSubscriptionId());
mMobileStatusTracker = new MobileStatusTracker(mPhone, receiverLooper,
info, mDefaults, mCallback);
info, mDefaults, mMobileCallback);
mProviderModelBehavior = featureFlags.isCombinedStatusBarSignalIconsEnabled();
mProviderModelSetting = featureFlags.isProviderModelSettingEnabled();
}
@@ -385,89 +384,83 @@ public class MobileSignalController extends SignalController<MobileState, Mobile
if (mCurrentState.inetCondition == 0) {
dataContentDescription = mContext.getString(R.string.data_connection_no_internet);
}
final boolean dataDisabled = (mCurrentState.iconGroup == TelephonyIcons.DATA_DISABLED
|| (mCurrentState.iconGroup == TelephonyIcons.NOT_DEFAULT_DATA))
&& mCurrentState.userSetup;
final QsInfo qsInfo = getQsInfo(contentDescription, icons.dataType);
final SbInfo sbInfo = getSbInfo(contentDescription, icons.dataType);
MobileDataIndicators mobileDataIndicators = new MobileDataIndicators(
sbInfo.icon,
qsInfo.icon,
sbInfo.ratTypeIcon,
qsInfo.ratTypeIcon,
mCurrentState.hasActivityIn(),
mCurrentState.hasActivityOut(),
dataContentDescription,
dataContentDescriptionHtml,
qsInfo.description,
mSubscriptionInfo.getSubscriptionId(),
mCurrentState.roaming,
sbInfo.showTriangle);
callback.setMobileDataIndicators(mobileDataIndicators);
}
private QsInfo getQsInfo(String contentDescription, int dataTypeIcon) {
int qsTypeIcon = 0;
IconState qsIcon = null;
CharSequence qsDescription = null;
boolean pm = mProviderModelSetting || mProviderModelBehavior;
if (mCurrentState.dataSim) {
// If using provider model behavior, only show QS icons if the state is also default
if (pm && !mCurrentState.isDefault) {
return new QsInfo(qsTypeIcon, qsIcon, qsDescription);
}
if (mCurrentState.showQuickSettingsRatIcon() || mConfig.alwaysShowDataRatIcon) {
qsTypeIcon = dataTypeIcon;
}
boolean qsIconVisible = mCurrentState.enabled && !mCurrentState.isEmergency;
qsIcon = new IconState(qsIconVisible, getQsCurrentIconId(), contentDescription);
if (!mCurrentState.isEmergency) {
qsDescription = mCurrentState.networkName;
}
}
return new QsInfo(qsTypeIcon, qsIcon, qsDescription);
}
private SbInfo getSbInfo(String contentDescription, int dataTypeIcon) {
final boolean dataDisabled = mCurrentState.isDataDisabledOrNotDefault();
boolean showTriangle = false;
int typeIcon = 0;
IconState statusIcon = null;
if (mProviderModelBehavior) {
// Show icon in QS when we are connected or data is disabled.
boolean showDataIcon = mCurrentState.dataConnected || dataDisabled;
int qsTypeIcon = 0;
IconState qsIcon = null;
CharSequence description = null;
// Only send data sim callbacks to QS.
if (mCurrentState.dataSim && mCurrentState.isDefault) {
qsTypeIcon =
(showDataIcon || mConfig.alwaysShowDataRatIcon) ? icons.qsDataType : 0;
qsIcon = new IconState(mCurrentState.enabled
&& !mCurrentState.isEmergency, getQsCurrentIconId(), contentDescription);
description = mCurrentState.isEmergency ? null : mCurrentState.networkName;
}
boolean activityIn = mCurrentState.dataConnected
&& !mCurrentState.carrierNetworkChangeMode
&& mCurrentState.activityIn;
boolean activityOut = mCurrentState.dataConnected
&& !mCurrentState.carrierNetworkChangeMode
&& mCurrentState.activityOut;
showDataIcon &= mCurrentState.dataSim && mCurrentState.isDefault;
boolean showTriangle = showDataIcon && !mCurrentState.airplaneMode;
int typeIcon = (showDataIcon || mConfig.alwaysShowDataRatIcon) ? icons.dataType : 0;
showDataIcon |= mCurrentState.roaming;
IconState statusIcon = new IconState(showDataIcon && !mCurrentState.airplaneMode,
boolean showDataIconStatusBar = (mCurrentState.dataConnected || dataDisabled)
&& (mCurrentState.dataSim && mCurrentState.isDefault);
typeIcon =
(showDataIconStatusBar || mConfig.alwaysShowDataRatIcon) ? dataTypeIcon : 0;
showDataIconStatusBar |= mCurrentState.roaming;
statusIcon = new IconState(
showDataIconStatusBar && !mCurrentState.airplaneMode,
getCurrentIconId(), contentDescription);
MobileDataIndicators mobileDataIndicators = new MobileDataIndicators(
statusIcon, qsIcon, typeIcon, qsTypeIcon,
activityIn, activityOut, dataContentDescription, dataContentDescriptionHtml,
description, icons.isWide, mSubscriptionInfo.getSubscriptionId(),
mCurrentState.roaming, showTriangle);
callback.setMobileDataIndicators(mobileDataIndicators);
showTriangle = showDataIconStatusBar && !mCurrentState.airplaneMode;
} else {
boolean showDataIcon = mCurrentState.dataConnected || dataDisabled;
IconState statusIcon = new IconState(
statusIcon = new IconState(
mCurrentState.enabled && !mCurrentState.airplaneMode,
getCurrentIconId(), contentDescription);
int qsTypeIcon = 0;
IconState qsIcon = null;
CharSequence description = null;
// Only send data sim callbacks to QS.
if (mProviderModelSetting) {
if (mCurrentState.dataSim && mCurrentState.isDefault) {
qsTypeIcon =
(showDataIcon || mConfig.alwaysShowDataRatIcon) ? icons.qsDataType : 0;
qsIcon = new IconState(
mCurrentState.enabled && !mCurrentState.isEmergency,
getQsCurrentIconId(), contentDescription);
description = mCurrentState.isEmergency ? null : mCurrentState.networkName;
}
} else {
if (mCurrentState.dataSim) {
qsTypeIcon =
(showDataIcon || mConfig.alwaysShowDataRatIcon) ? icons.qsDataType : 0;
qsIcon = new IconState(
mCurrentState.enabled && !mCurrentState.isEmergency,
getQsCurrentIconId(), contentDescription);
description = mCurrentState.isEmergency ? null : mCurrentState.networkName;
}
}
boolean activityIn = mCurrentState.dataConnected
&& !mCurrentState.carrierNetworkChangeMode
&& mCurrentState.activityIn;
boolean activityOut = mCurrentState.dataConnected
&& !mCurrentState.carrierNetworkChangeMode
&& mCurrentState.activityOut;
showDataIcon &= mCurrentState.isDefault || dataDisabled;
int typeIcon = (showDataIcon || mConfig.alwaysShowDataRatIcon) ? icons.dataType : 0;
boolean showTriangle = mCurrentState.enabled && !mCurrentState.airplaneMode;
MobileDataIndicators mobileDataIndicators = new MobileDataIndicators(
statusIcon, qsIcon, typeIcon, qsTypeIcon,
activityIn, activityOut, dataContentDescription, dataContentDescriptionHtml,
description, icons.isWide, mSubscriptionInfo.getSubscriptionId(),
mCurrentState.roaming, showTriangle);
callback.setMobileDataIndicators(mobileDataIndicators);
boolean showDataIconInStatusBar =
(mCurrentState.dataConnected && mCurrentState.isDefault) || dataDisabled;
typeIcon =
(showDataIconInStatusBar || mConfig.alwaysShowDataRatIcon) ? dataTypeIcon : 0;
showTriangle = mCurrentState.enabled && !mCurrentState.airplaneMode;
}
return new SbInfo(showTriangle, typeIcon, statusIcon);
}
@Override
@@ -841,12 +834,15 @@ public class MobileSignalController extends SignalController<MobileState, Mobile
public void dump(PrintWriter pw) {
super.dump(pw);
pw.println(" mSubscription=" + mSubscriptionInfo + ",");
pw.println(" mProviderModelSetting=" + mProviderModelSetting + ",");
pw.println(" mProviderModelBehavior=" + mProviderModelBehavior + ",");
pw.println(" mServiceState=" + mServiceState + ",");
pw.println(" mSignalStrength=" + mSignalStrength + ",");
pw.println(" mTelephonyDisplayInfo=" + mTelephonyDisplayInfo + ",");
pw.println(" mDataState=" + mDataState + ",");
pw.println(" mInflateSignalStrengths=" + mInflateSignalStrengths + ",");
pw.println(" isDataDisabled=" + isDataDisabled() + ",");
pw.println(" mNetworkToIconLookup=" + mNetworkToIconLookup + ",");
pw.println(" MobileStatusHistory");
int size = 0;
for (int i = 0; i < STATUS_HISTORY_SIZE; i++) {
@@ -862,4 +858,31 @@ public class MobileSignalController extends SignalController<MobileState, Mobile
+ mMobileStatusHistory[i & (STATUS_HISTORY_SIZE - 1)]);
}
}
/** Box for QS icon info */
private static final class QsInfo {
final int ratTypeIcon;
final IconState icon;
final CharSequence description;
QsInfo(int typeIcon, IconState iconState, CharSequence desc) {
ratTypeIcon = typeIcon;
icon = iconState;
description = desc;
}
}
/** Box for StatusBar icon info */
private static final class SbInfo {
final boolean showTriangle;
final int ratTypeIcon;
final IconState icon;
SbInfo(boolean show, int typeIcon, IconState iconState) {
showTriangle = show;
ratTypeIcon = typeIcon;
icon = iconState;
}
}
}

View File

@@ -81,7 +81,7 @@ public interface NetworkController extends CallbackController<SignalCallback>, D
.append(",qsIcon=").append(qsIcon == null ? "" : qsIcon.toString())
.append(",activityIn=").append(activityIn)
.append(",activityOut=").append(activityOut)
.append(",description=").append(description)
.append(",qsDescription=").append(description)
.append(",isTransient=").append(isTransient)
.append(",statusLabel=").append(statusLabel)
.append(']').toString();
@@ -100,8 +100,7 @@ public interface NetworkController extends CallbackController<SignalCallback>, D
public boolean activityOut;
public CharSequence typeContentDescription;
public CharSequence typeContentDescriptionHtml;
public CharSequence description;
public boolean isWide;
public CharSequence qsDescription;
public int subId;
public boolean roaming;
public boolean showTriangle;
@@ -109,7 +108,7 @@ public interface NetworkController extends CallbackController<SignalCallback>, D
public MobileDataIndicators(IconState statusIcon, IconState qsIcon, int statusType,
int qsType, boolean activityIn, boolean activityOut,
CharSequence typeContentDescription, CharSequence typeContentDescriptionHtml,
CharSequence description, boolean isWide, int subId, boolean roaming,
CharSequence qsDescription, int subId, boolean roaming,
boolean showTriangle) {
this.statusIcon = statusIcon;
this.qsIcon = qsIcon;
@@ -119,8 +118,7 @@ public interface NetworkController extends CallbackController<SignalCallback>, D
this.activityOut = activityOut;
this.typeContentDescription = typeContentDescription;
this.typeContentDescriptionHtml = typeContentDescriptionHtml;
this.description = description;
this.isWide = isWide;
this.qsDescription = qsDescription;
this.subId = subId;
this.roaming = roaming;
this.showTriangle = showTriangle;
@@ -137,8 +135,7 @@ public interface NetworkController extends CallbackController<SignalCallback>, D
.append(",activityOut=").append(activityOut)
.append(",typeContentDescription=").append(typeContentDescription)
.append(",typeContentDescriptionHtml=").append(typeContentDescriptionHtml)
.append(",description=").append(description)
.append(",isWide=").append(isWide)
.append(",description=").append(qsDescription)
.append(",subId=").append(subId)
.append(",roaming=").append(roaming)
.append(",showTriangle=").append(showTriangle)
@@ -186,11 +183,13 @@ public interface NetworkController extends CallbackController<SignalCallback>, D
default void setCallIndicator(IconState statusIcon, int subId) {}
}
public interface EmergencyListener {
/** */
interface EmergencyListener {
void setEmergencyCallsOnly(boolean emergencyOnly);
}
public static class IconState {
/** */
class IconState {
public final boolean visible;
public final int icon;
public final String contentDescription;
@@ -220,7 +219,7 @@ public interface NetworkController extends CallbackController<SignalCallback>, D
* Tracks changes in access points. Allows listening for changes, scanning for new APs,
* and connecting to new ones.
*/
public interface AccessPointController {
interface AccessPointController {
void addAccessPointCallback(AccessPointCallback callback);
void removeAccessPointCallback(AccessPointCallback callback);
void scanForAccessPoints();
@@ -230,7 +229,7 @@ public interface NetworkController extends CallbackController<SignalCallback>, D
boolean canConfigWifi();
boolean canConfigMobileData();
public interface AccessPointCallback {
interface AccessPointCallback {
void onAccessPointsChanged(List<WifiEntry> accessPoints);
void onSettingsActivityTriggered(Intent settingsIntent);
}

View File

@@ -163,7 +163,7 @@ public class WifiSignalController extends
int qsTypeIcon = 0;
IconState qsIcon = null;
if (sbVisible) {
qsTypeIcon = icons.qsDataType;
qsTypeIcon = icons.dataType;
qsIcon = new IconState(mCurrentState.connected, getQsCurrentIconIdForCarrierWifi(),
contentDescription);
}
@@ -172,7 +172,7 @@ public class WifiSignalController extends
MobileDataIndicators mobileDataIndicators = new MobileDataIndicators(
statusIcon, qsIcon, typeIcon, qsTypeIcon,
mCurrentState.activityIn, mCurrentState.activityOut, dataContentDescription,
dataContentDescriptionHtml, description, icons.isWide,
dataContentDescriptionHtml, description,
mCurrentState.subId, /* roaming= */ false, /* showTriangle= */ true
);
callback.setMobileDataIndicators(mobileDataIndicators);

View File

@@ -232,7 +232,7 @@ public class QSCarrierGroupControllerTest extends LeakCheckedTest {
MobileDataIndicators indicators = new MobileDataIndicators(
mock(NetworkController.IconState.class),
mock(NetworkController.IconState.class),
0, 0, true, true, "", "", "", true, 0, true, true);
0, 0, true, true, "", "", "", 0, true, true);
mSignalCallback.setMobileDataIndicators(indicators);
}

View File

@@ -124,7 +124,7 @@ public class CallbackHandlerTest extends SysuiTestCase {
boolean roaming = true;
MobileDataIndicators indicators = new MobileDataIndicators(
status, qs, type, qsType, in, out, typeDescription,
typeDescriptionHtml, description, wide, subId, roaming, true);
typeDescriptionHtml, description, subId, roaming, true);
mHandler.setMobileDataIndicators(indicators);
waitForCallbacks();
@@ -141,8 +141,7 @@ public class CallbackHandlerTest extends SysuiTestCase {
assertEquals(out, expected.activityOut);
assertEquals(typeDescription, expected.typeContentDescription);
assertEquals(typeDescriptionHtml, expected.typeContentDescriptionHtml);
assertEquals(description, expected.description);
assertEquals(wide, expected.isWide);
assertEquals(description, expected.qsDescription);
assertEquals(subId, expected.subId);
assertTrue(expected.roaming);
assertTrue(expected.showTriangle);