Fixed data icon disappeared issue
When carriers have more than one APN that supports internet APN type, the data icon might sometimes disappeared, for example, after sending an MMS. This is caused by the PreciseDataConnectionState refactoring in Android 12. Added the workaround in TelephonyRegistry to aggregate the data connection state for internet, since it would be very difficult to make this right in DataConnection class. In Android 13, a more robust and comprehensive logic will be added in the new data network controller to fix this. Fix: 204328662 Fix: 187967526 Test: Manual test & TelephonyRegistryTest Change-Id: Icba446e879e4d892829b41fdea50ebc1a10bf832
This commit is contained in:
@@ -47,6 +47,7 @@ import android.os.RemoteException;
|
||||
import android.os.UserHandle;
|
||||
import android.provider.DeviceConfig;
|
||||
import android.telecom.TelecomManager;
|
||||
import android.telephony.AccessNetworkConstants;
|
||||
import android.telephony.Annotation;
|
||||
import android.telephony.Annotation.RadioPowerState;
|
||||
import android.telephony.Annotation.SrvccState;
|
||||
@@ -1999,42 +2000,8 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub {
|
||||
|
||||
ApnSetting apnSetting = preciseState.getApnSetting();
|
||||
|
||||
int apnTypes = apnSetting.getApnTypeBitmask();
|
||||
int state = preciseState.getState();
|
||||
int networkType = preciseState.getNetworkType();
|
||||
|
||||
synchronized (mRecords) {
|
||||
if (validatePhoneId(phoneId)) {
|
||||
// We only call the callback when the change is for default APN type.
|
||||
if ((ApnSetting.TYPE_DEFAULT & apnTypes) != 0
|
||||
&& (mDataConnectionState[phoneId] != state
|
||||
|| mDataConnectionNetworkType[phoneId] != networkType)) {
|
||||
String str = "onDataConnectionStateChanged("
|
||||
+ TelephonyUtils.dataStateToString(state)
|
||||
+ ", " + getNetworkTypeName(networkType)
|
||||
+ ") subId=" + subId + ", phoneId=" + phoneId;
|
||||
log(str);
|
||||
mLocalLog.log(str);
|
||||
for (Record r : mRecords) {
|
||||
if (r.matchTelephonyCallbackEvent(
|
||||
TelephonyCallback.EVENT_DATA_CONNECTION_STATE_CHANGED)
|
||||
&& idMatch(r, subId, phoneId)) {
|
||||
try {
|
||||
if (DBG) {
|
||||
log("Notify data connection state changed on sub: " + subId);
|
||||
}
|
||||
r.callback.onDataConnectionStateChanged(state, networkType);
|
||||
} catch (RemoteException ex) {
|
||||
mRemoveList.add(r.binder);
|
||||
}
|
||||
}
|
||||
}
|
||||
handleRemoveListLocked();
|
||||
|
||||
mDataConnectionState[phoneId] = state;
|
||||
mDataConnectionNetworkType[phoneId] = networkType;
|
||||
}
|
||||
|
||||
Pair<Integer, ApnSetting> key = Pair.create(preciseState.getTransportType(),
|
||||
preciseState.getApnSetting());
|
||||
PreciseDataConnectionState oldState = mPreciseDataConnectionStates.get(phoneId)
|
||||
@@ -2066,6 +2033,73 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub {
|
||||
if (preciseState.getState() != TelephonyManager.DATA_DISCONNECTED) {
|
||||
mPreciseDataConnectionStates.get(phoneId).put(key, preciseState);
|
||||
}
|
||||
|
||||
// Note that below is just the workaround for reporting the correct data connection
|
||||
// state. The actual fix should be put in the new data stack in T.
|
||||
// TODO: Remove the code below in T.
|
||||
|
||||
// Collect all possible candidate data connection state for internet. Key is the
|
||||
// data connection state, value is the precise data connection state.
|
||||
Map<Integer, PreciseDataConnectionState> internetConnections = new ArrayMap<>();
|
||||
if (preciseState.getState() == TelephonyManager.DATA_DISCONNECTED
|
||||
&& preciseState.getApnSetting().getApnTypes()
|
||||
.contains(ApnSetting.TYPE_DEFAULT)) {
|
||||
internetConnections.put(TelephonyManager.DATA_DISCONNECTED, preciseState);
|
||||
}
|
||||
for (Map.Entry<Pair<Integer, ApnSetting>, PreciseDataConnectionState> entry :
|
||||
mPreciseDataConnectionStates.get(phoneId).entrySet()) {
|
||||
if (entry.getKey().first == AccessNetworkConstants.TRANSPORT_TYPE_WWAN
|
||||
&& entry.getKey().second.getApnTypes()
|
||||
.contains(ApnSetting.TYPE_DEFAULT)) {
|
||||
internetConnections.put(entry.getValue().getState(), entry.getValue());
|
||||
}
|
||||
}
|
||||
|
||||
// If any internet data is in connected state, then report connected, then check
|
||||
// suspended, connecting, disconnecting, and disconnected. The order is very
|
||||
// important.
|
||||
int[] statesInPriority = new int[]{TelephonyManager.DATA_CONNECTED,
|
||||
TelephonyManager.DATA_SUSPENDED, TelephonyManager.DATA_CONNECTING,
|
||||
TelephonyManager.DATA_DISCONNECTING,
|
||||
TelephonyManager.DATA_DISCONNECTED};
|
||||
int state = TelephonyManager.DATA_DISCONNECTED;
|
||||
int networkType = TelephonyManager.NETWORK_TYPE_UNKNOWN;
|
||||
for (int s : statesInPriority) {
|
||||
if (internetConnections.containsKey(s)) {
|
||||
state = s;
|
||||
networkType = internetConnections.get(s).getNetworkType();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (mDataConnectionState[phoneId] != state
|
||||
|| mDataConnectionNetworkType[phoneId] != networkType) {
|
||||
String str = "onDataConnectionStateChanged("
|
||||
+ TelephonyUtils.dataStateToString(state)
|
||||
+ ", " + TelephonyManager.getNetworkTypeName(networkType)
|
||||
+ ") subId=" + subId + ", phoneId=" + phoneId;
|
||||
log(str);
|
||||
mLocalLog.log(str);
|
||||
for (Record r : mRecords) {
|
||||
if (r.matchTelephonyCallbackEvent(
|
||||
TelephonyCallback.EVENT_DATA_CONNECTION_STATE_CHANGED)
|
||||
&& idMatch(r, subId, phoneId)) {
|
||||
try {
|
||||
if (DBG) {
|
||||
log("Notify data connection state changed on sub: " + subId);
|
||||
}
|
||||
r.callback.onDataConnectionStateChanged(state, networkType);
|
||||
} catch (RemoteException ex) {
|
||||
mRemoveList.add(r.binder);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
mDataConnectionState[phoneId] = state;
|
||||
mDataConnectionNetworkType[phoneId] = networkType;
|
||||
|
||||
handleRemoveListLocked();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user