Refacotr mobile data observer for repository

In current design, the mobile data observer might be removed due to
SIM absence after registered so that mobile data network info can't
be updated to clients.

To fix it, migrate it to use API TelephonyCallback.onUserMobileDataStateChanged
Bug: 327696232

Change-Id: I26c8f946823abb7505f0227c8dd8ab0700d0c5f2
This commit is contained in:
Mengjun Leng
2024-04-25 12:53:47 +05:30
committed by SongFerng Wang
parent eda8e23f78
commit 120adb2349
2 changed files with 21 additions and 30 deletions

View File

@@ -91,7 +91,6 @@ public class MobileNetworkRepository extends SubscriptionManager.OnSubscriptions
private AirplaneModeObserver mAirplaneModeObserver; private AirplaneModeObserver mAirplaneModeObserver;
private DataRoamingObserver mDataRoamingObserver; private DataRoamingObserver mDataRoamingObserver;
private MetricsFeatureProvider mMetricsFeatureProvider; private MetricsFeatureProvider mMetricsFeatureProvider;
private Map<Integer, MobileDataContentObserver> mDataContentObserverMap = new HashMap<>();
private int mPhysicalSlotIndex = SubscriptionManager.INVALID_SIM_SLOT_INDEX; private int mPhysicalSlotIndex = SubscriptionManager.INVALID_SIM_SLOT_INDEX;
private int mLogicalSlotIndex = SubscriptionManager.INVALID_SIM_SLOT_INDEX; private int mLogicalSlotIndex = SubscriptionManager.INVALID_SIM_SLOT_INDEX;
private int mCardState = UiccSlotInfo.CARD_STATE_INFO_ABSENT; private int mCardState = UiccSlotInfo.CARD_STATE_INFO_ABSENT;
@@ -210,6 +209,9 @@ public class MobileNetworkRepository extends SubscriptionManager.OnSubscriptions
*/ */
public void addRegister(LifecycleOwner lifecycleOwner, public void addRegister(LifecycleOwner lifecycleOwner,
MobileNetworkCallback mobileNetworkCallback, int subId) { MobileNetworkCallback mobileNetworkCallback, int subId) {
if (DEBUG) {
Log.d(TAG, "addRegister by SUB ID " + subId);
}
if (sCallbacks.isEmpty()) { if (sCallbacks.isEmpty()) {
mSubscriptionManager.addOnSubscriptionsChangedListener(mContext.getMainExecutor(), mSubscriptionManager.addOnSubscriptionsChangedListener(mContext.getMainExecutor(),
this); this);
@@ -221,7 +223,6 @@ public class MobileNetworkRepository extends SubscriptionManager.OnSubscriptions
observeAllUiccInfo(lifecycleOwner); observeAllUiccInfo(lifecycleOwner);
observeAllMobileNetworkInfo(lifecycleOwner); observeAllMobileNetworkInfo(lifecycleOwner);
if (subId != SubscriptionManager.INVALID_SUBSCRIPTION_ID) { if (subId != SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
addRegisterBySubId(subId);
createTelephonyManagerBySubId(subId); createTelephonyManagerBySubId(subId);
mDataRoamingObserver.register(mContext, subId); mDataRoamingObserver.register(mContext, subId);
} }
@@ -230,21 +231,6 @@ public class MobileNetworkRepository extends SubscriptionManager.OnSubscriptions
sendAvailableSubInfoCache(mobileNetworkCallback); sendAvailableSubInfoCache(mobileNetworkCallback);
} }
public void addRegisterBySubId(int subId) {
Log.d(TAG, "MobileDataContentObserver addRegisterBySubId: " + subId);
MobileDataContentObserver dataContentObserver = new MobileDataContentObserver(
new Handler(Looper.getMainLooper()));
dataContentObserver.setOnMobileDataChangedListener(() -> {
sExecutor.execute(() -> {
Log.d(TAG, "MobileDataContentObserver changed");
insertMobileNetworkInfo(mContext, subId,
getTelephonyManagerBySubId(mContext, subId));
});
});
dataContentObserver.register(mContext, subId);
mDataContentObserverMap.put(subId, dataContentObserver);
}
private void createTelephonyManagerBySubId(int subId) { private void createTelephonyManagerBySubId(int subId) {
if (subId == SubscriptionManager.INVALID_SUBSCRIPTION_ID if (subId == SubscriptionManager.INVALID_SUBSCRIPTION_ID
|| mTelephonyCallbackMap.containsKey(subId)) { || mTelephonyCallbackMap.containsKey(subId)) {
@@ -254,7 +240,7 @@ public class MobileNetworkRepository extends SubscriptionManager.OnSubscriptions
return; return;
} }
PhoneCallStateTelephonyCallback PhoneCallStateTelephonyCallback
telephonyCallback = new PhoneCallStateTelephonyCallback(); telephonyCallback = new PhoneCallStateTelephonyCallback(subId);
TelephonyManager telephonyManager = mContext.getSystemService( TelephonyManager telephonyManager = mContext.getSystemService(
TelephonyManager.class).createForSubscriptionId(subId); TelephonyManager.class).createForSubscriptionId(subId);
telephonyManager.registerTelephonyCallback(mContext.getMainExecutor(), telephonyManager.registerTelephonyCallback(mContext.getMainExecutor(),
@@ -293,10 +279,6 @@ public class MobileNetworkRepository extends SubscriptionManager.OnSubscriptions
} }
} }
} }
if (mDataContentObserverMap.containsKey(subId)) {
mDataContentObserverMap.get(subId).unRegister(mContext);
mDataContentObserverMap.remove(subId);
}
} }
public void removeRegister(MobileNetworkCallback mobileNetworkCallback) { public void removeRegister(MobileNetworkCallback mobileNetworkCallback) {
@@ -307,10 +289,6 @@ public class MobileNetworkRepository extends SubscriptionManager.OnSubscriptions
mSubscriptionManager.removeOnSubscriptionsChangedListener(this); mSubscriptionManager.removeOnSubscriptionsChangedListener(this);
mAirplaneModeObserver.unRegister(mContext); mAirplaneModeObserver.unRegister(mContext);
mDataRoamingObserver.unRegister(mContext); mDataRoamingObserver.unRegister(mContext);
mDataContentObserverMap.forEach((id, observer) -> {
observer.unRegister(mContext);
});
mDataContentObserverMap.clear();
mTelephonyManagerMap.forEach((id, manager) -> { mTelephonyManagerMap.forEach((id, manager) -> {
TelephonyCallback callback = mTelephonyCallbackMap.get(id); TelephonyCallback callback = mTelephonyCallbackMap.get(id);
@@ -763,7 +741,14 @@ public class MobileNetworkRepository extends SubscriptionManager.OnSubscriptions
} }
private class PhoneCallStateTelephonyCallback extends TelephonyCallback implements private class PhoneCallStateTelephonyCallback extends TelephonyCallback implements
TelephonyCallback.CallStateListener { TelephonyCallback.CallStateListener,
TelephonyCallback.UserMobileDataStateListener {
private int mSubId;
public PhoneCallStateTelephonyCallback(int subId) {
mSubId = subId;
}
@Override @Override
public void onCallStateChanged(int state) { public void onCallStateChanged(int state) {
@@ -771,6 +756,15 @@ public class MobileNetworkRepository extends SubscriptionManager.OnSubscriptions
callback.onCallStateChanged(state); callback.onCallStateChanged(state);
} }
} }
@Override
public void onUserMobileDataStateChanged(boolean enabled) {
Log.d(TAG, "onUserMobileDataStateChanged enabled " + enabled + " on SUB " + mSubId);
sExecutor.execute(() -> {
insertMobileNetworkInfo(mContext, mSubId,
getTelephonyManagerBySubId(mContext, mSubId));
});
}
} }
/** /**

View File

@@ -100,9 +100,6 @@ public abstract class DefaultSubscriptionController extends TelephonyBasePrefere
mMobileNetworkRepository.addRegister(mLifecycleOwner, this, mMobileNetworkRepository.addRegister(mLifecycleOwner, this,
SubscriptionManager.INVALID_SUBSCRIPTION_ID); SubscriptionManager.INVALID_SUBSCRIPTION_ID);
mMobileNetworkRepository.updateEntity(); mMobileNetworkRepository.updateEntity();
// Can not get default subId from database until get the callback, add register by subId
// later.
mMobileNetworkRepository.addRegisterBySubId(getDefaultSubscriptionId());
mDataSubscriptionChangedReceiver.registerReceiver(); mDataSubscriptionChangedReceiver.registerReceiver();
} }