Merge "Fix the burst callback issue on the repository" into main
This commit is contained in:
@@ -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) {
|
||||||
|
synchronized (this) {
|
||||||
|
if (mAvailableSubInfoEntityList != null
|
||||||
|
&& mAvailableSubInfoEntityList.size() == availableSubInfoEntityList.size()
|
||||||
|
&& mAvailableSubInfoEntityList.containsAll(availableSubInfoEntityList)) {
|
||||||
|
Log.d(TAG, "onAvailableSubInfoChanged, duplicates = " + availableSubInfoEntityList);
|
||||||
|
return;
|
||||||
|
}
|
||||||
mAvailableSubInfoEntityList = new ArrayList<>(availableSubInfoEntityList);
|
mAvailableSubInfoEntityList = new ArrayList<>(availableSubInfoEntityList);
|
||||||
|
}
|
||||||
if (DEBUG) {
|
if (DEBUG) {
|
||||||
Log.d(TAG, "onAvailableSubInfoChanged, availableSubInfoEntityList = "
|
Log.d(TAG, "onAvailableSubInfoChanged, availableSubInfoEntityList = "
|
||||||
+ availableSubInfoEntityList);
|
+ availableSubInfoEntityList);
|
||||||
@@ -425,25 +436,50 @@ 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(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);
|
callback.onActiveSubInfoChanged(activeSubInfoEntityList);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void onAllUiccInfoChanged(List<UiccInfoEntity> uiccInfoEntityList) {
|
private void onAllUiccInfoChanged(List<UiccInfoEntity> uiccInfoEntityList) {
|
||||||
mUiccInfoEntityList = new ArrayList<>(uiccInfoEntityList);
|
mUiccInfoEntityList = new ArrayList<>(uiccInfoEntityList);
|
||||||
@@ -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.
|
||||||
|
Reference in New Issue
Block a user