Merge "Fix the burst callback issue on the repository" into main am: a23320eedd am: 4362f09737

Original change: https://android-review.googlesource.com/c/platform/packages/apps/Settings/+/2780887

Change-Id: I69a30d3d6af7b75177cee4c259786b7acbfdd5cc
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
SongFerng Wang
2023-11-07 10:11:00 +00:00
committed by Automerger Merge Worker

View File

@@ -225,6 +225,9 @@ public class MobileNetworkRepository extends SubscriptionManager.OnSubscriptions
createTelephonyManagerBySubId(subId); createTelephonyManagerBySubId(subId);
mDataRoamingObserver.register(mContext, subId); mDataRoamingObserver.register(mContext, subId);
} }
// When one client registers callback first time, convey the cached results to the client
// so that the client is aware of the content therein.
sendAvailableSubInfoCache(mobileNetworkCallback);
} }
public void addRegisterBySubId(int subId) { public void addRegisterBySubId(int subId) {
@@ -415,7 +418,15 @@ public class MobileNetworkRepository extends SubscriptionManager.OnSubscriptions
private void onAvailableSubInfoChanged( private void onAvailableSubInfoChanged(
List<SubscriptionInfoEntity> availableSubInfoEntityList) { List<SubscriptionInfoEntity> availableSubInfoEntityList) {
mAvailableSubInfoEntityList = new ArrayList<>(availableSubInfoEntityList); synchronized (this) {
if (mAvailableSubInfoEntityList != null
&& mAvailableSubInfoEntityList.size() == availableSubInfoEntityList.size()
&& mAvailableSubInfoEntityList.containsAll(availableSubInfoEntityList)) {
Log.d(TAG, "onAvailableSubInfoChanged, duplicates = " + availableSubInfoEntityList);
return;
}
mAvailableSubInfoEntityList = new ArrayList<>(availableSubInfoEntityList);
}
if (DEBUG) { if (DEBUG) {
Log.d(TAG, "onAvailableSubInfoChanged, availableSubInfoEntityList = " Log.d(TAG, "onAvailableSubInfoChanged, availableSubInfoEntityList = "
+ availableSubInfoEntityList); + availableSubInfoEntityList);
@@ -425,23 +436,48 @@ public class MobileNetworkRepository extends SubscriptionManager.OnSubscriptions
} }
mMetricsFeatureProvider.action(mContext, mMetricsFeatureProvider.action(mContext,
SettingsEnums.ACTION_MOBILE_NETWORK_DB_NOTIFY_SUB_INFO_IS_CHANGED, 0); SettingsEnums.ACTION_MOBILE_NETWORK_DB_NOTIFY_SUB_INFO_IS_CHANGED, 0);
onActiveSubInfoListChanged(mAvailableSubInfoEntityList); onActiveSubInfoListChanged(availableSubInfoEntityList);
} }
private void onActiveSubInfoListChanged( private void onActiveSubInfoListChanged(
List<SubscriptionInfoEntity> availableSubInfoEntityList) { List<SubscriptionInfoEntity> availableSubInfoEntityList) {
mActiveSubInfoEntityList = availableSubInfoEntityList.stream() List<SubscriptionInfoEntity> activeSubInfoEntityList =
availableSubInfoEntityList.stream()
.filter(SubscriptionInfoEntity::isActiveSubscription) .filter(SubscriptionInfoEntity::isActiveSubscription)
.filter(SubscriptionInfoEntity::isSubscriptionVisible) .filter(SubscriptionInfoEntity::isSubscriptionVisible)
.collect(Collectors.toList()); .collect(Collectors.toList());
if (DEBUG) { if (DEBUG) {
Log.d(TAG, "onActiveSubInfoChanged, activeSubInfoEntityList = " Log.d(TAG, "onActiveSubInfoChanged, activeSubInfoEntityList = "
+ mActiveSubInfoEntityList); + activeSubInfoEntityList);
}
List<SubscriptionInfoEntity> tempActiveSubInfoEntityList = new ArrayList<>(
activeSubInfoEntityList);
synchronized (this) {
mActiveSubInfoEntityList = activeSubInfoEntityList;
} }
List<SubscriptionInfoEntity> activeSubInfoEntityList = new ArrayList<>(
mActiveSubInfoEntityList);
for (MobileNetworkCallback callback : sCallbacks) { for (MobileNetworkCallback callback : sCallbacks) {
callback.onActiveSubInfoChanged(activeSubInfoEntityList); callback.onActiveSubInfoChanged(tempActiveSubInfoEntityList);
}
}
private void sendAvailableSubInfoCache(MobileNetworkCallback callback) {
if (callback != null) {
List<SubscriptionInfoEntity> availableSubInfoEntityList = null;
List<SubscriptionInfoEntity> activeSubInfoEntityList = null;
synchronized (this) {
if (mAvailableSubInfoEntityList != null) {
availableSubInfoEntityList = new ArrayList<>(mAvailableSubInfoEntityList);
}
if (mActiveSubInfoEntityList != null) {
activeSubInfoEntityList = new ArrayList<>(mActiveSubInfoEntityList);
}
}
if (availableSubInfoEntityList != null) {
callback.onAvailableSubInfoChanged(availableSubInfoEntityList);
}
if (activeSubInfoEntityList != null) {
callback.onActiveSubInfoChanged(activeSubInfoEntityList);
}
} }
} }
@@ -497,8 +533,6 @@ public class MobileNetworkRepository extends SubscriptionManager.OnSubscriptions
mMobileNetworkDatabase.deleteSubInfoBySubId(subId); mMobileNetworkDatabase.deleteSubInfoBySubId(subId);
mMobileNetworkDatabase.deleteUiccInfoBySubId(subId); mMobileNetworkDatabase.deleteUiccInfoBySubId(subId);
mMobileNetworkDatabase.deleteMobileNetworkInfoBySubId(subId); mMobileNetworkDatabase.deleteMobileNetworkInfoBySubId(subId);
mAvailableSubInfoEntityList.removeIf(info -> info.subId.equals(subId));
mActiveSubInfoEntityList.removeIf(info -> info.subId.equals(subId));
mUiccInfoEntityList.removeIf(info -> info.subId.equals(subId)); mUiccInfoEntityList.removeIf(info -> info.subId.equals(subId));
mMobileNetworkInfoEntityList.removeIf(info -> info.subId.equals(subId)); mMobileNetworkInfoEntityList.removeIf(info -> info.subId.equals(subId));
int id = Integer.parseInt(subId); int id = Integer.parseInt(subId);
@@ -655,10 +689,15 @@ public class MobileNetworkRepository extends SubscriptionManager.OnSubscriptions
private void insertAvailableSubInfoToEntity(List<SubscriptionInfo> inputAvailableInfoList) { private void insertAvailableSubInfoToEntity(List<SubscriptionInfo> inputAvailableInfoList) {
sExecutor.execute(() -> { sExecutor.execute(() -> {
SubscriptionInfoEntity[] availableInfoArray = mAvailableSubInfoEntityList.toArray( SubscriptionInfoEntity[] availableInfoArray = null;
int availableEntitySize = 0;
synchronized (this) {
availableInfoArray = mAvailableSubInfoEntityList.toArray(
new SubscriptionInfoEntity[0]); new SubscriptionInfoEntity[0]);
availableEntitySize = mAvailableSubInfoEntityList.size();
}
if ((inputAvailableInfoList == null || inputAvailableInfoList.size() == 0) if ((inputAvailableInfoList == null || inputAvailableInfoList.size() == 0)
&& mAvailableSubInfoEntityList.size() != 0) { && availableEntitySize != 0) {
if (DEBUG) { if (DEBUG) {
Log.d(TAG, "availableSudInfoList from framework is empty, remove all subs"); Log.d(TAG, "availableSudInfoList from framework is empty, remove all subs");
} }
@@ -671,7 +710,7 @@ public class MobileNetworkRepository extends SubscriptionManager.OnSubscriptions
SubscriptionInfo[] inputAvailableInfoArray = inputAvailableInfoList.toArray( SubscriptionInfo[] inputAvailableInfoArray = inputAvailableInfoList.toArray(
new SubscriptionInfo[0]); new SubscriptionInfo[0]);
// Remove the redundant subInfo // Remove the redundant subInfo
if (inputAvailableInfoList.size() <= mAvailableSubInfoEntityList.size()) { if (inputAvailableInfoList.size() <= availableEntitySize) {
for (SubscriptionInfo subInfo : inputAvailableInfoArray) { for (SubscriptionInfo subInfo : inputAvailableInfoArray) {
int subId = subInfo.getSubscriptionId(); int subId = subInfo.getSubscriptionId();
if (mSubscriptionInfoMap.containsKey(subId)) { if (mSubscriptionInfoMap.containsKey(subId)) {
@@ -685,7 +724,7 @@ public class MobileNetworkRepository extends SubscriptionManager.OnSubscriptions
deleteAllInfoBySubId(String.valueOf(key)); deleteAllInfoBySubId(String.valueOf(key));
} }
} }
} else if (inputAvailableInfoList.size() < mAvailableSubInfoEntityList.size()) { } else if (inputAvailableInfoList.size() < availableEntitySize) {
// Check the subInfo between the new list from framework and old list in // Check the subInfo between the new list from framework and old list in
// the database, if the subInfo is not existed in the new list, delete it // the database, if the subInfo is not existed in the new list, delete it
// from the database. // from the database.