Merge "Fix adopt the last data profile that works for internet as preferred"
diff --git a/src/java/com/android/internal/telephony/data/DataProfileManager.java b/src/java/com/android/internal/telephony/data/DataProfileManager.java
index b4dc698..2cf1452 100644
--- a/src/java/com/android/internal/telephony/data/DataProfileManager.java
+++ b/src/java/com/android/internal/telephony/data/DataProfileManager.java
@@ -170,10 +170,6 @@
@NonNull List<DataProfile> dataProfiles) {
DataProfileManager.this.onInternetDataNetworkConnected(dataProfiles);
}
- @Override
- public void onInternetDataNetworkDisconnected() {
- DataProfileManager.this.onInternetDataNetworkDisconnected();
- }
});
mDataConfigManager.registerCallback(new DataConfigManagerCallback(this::post) {
@Override
@@ -411,31 +407,25 @@
* @param dataProfiles The connected internet data networks' profiles.
*/
private void onInternetDataNetworkConnected(@NonNull List<DataProfile> dataProfiles) {
- // If there is already a preferred data profile set, then we don't need to do anything.
- if (mPreferredDataProfile != null) return;
-
- // If there is no preferred data profile, then we should use one of the data profiles,
- // which is good for internet, as the preferred data profile.
-
// Most of the cases there should be only one, but in case there are multiple, choose the
// one which has longest life cycle.
DataProfile dataProfile = dataProfiles.stream()
.max(Comparator.comparingLong(DataProfile::getLastSetupTimestamp).reversed())
.orElse(null);
+
+ // Update a working internet data profile as a future candidate for preferred data profile
+ // after APNs are reset to default
mLastInternetDataProfile = dataProfile;
+
+ // If there is no preferred data profile, then we should use one of the data profiles,
+ // which is good for internet, as the preferred data profile.
+ if (mPreferredDataProfile != null) return;
// Save the preferred data profile into database.
setPreferredDataProfile(dataProfile);
updateDataProfiles(ONLY_UPDATE_IA_IF_CHANGED);
}
/**
- * Called when internet data is disconnected.
- */
- private void onInternetDataNetworkDisconnected() {
- mLastInternetDataProfile = null;
- }
-
- /**
* Get the preferred data profile for internet data.
*
* @return The preferred data profile.
diff --git a/tests/telephonytests/src/com/android/internal/telephony/data/DataProfileManagerTest.java b/tests/telephonytests/src/com/android/internal/telephony/data/DataProfileManagerTest.java
index 6a238cb..1fbe386 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/data/DataProfileManagerTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/data/DataProfileManagerTest.java
@@ -1065,7 +1065,6 @@
tnr, TelephonyManager.NETWORK_TYPE_LTE, false);
assertThat(dataProfile.getApnSetting().getApnName()).isEqualTo(GENERAL_PURPOSE_APN);
dataProfile.setLastSetupTimestamp(SystemClock.elapsedRealtime());
- dataProfile.setPreferred(true);
mDataNetworkControllerCallback.onInternetDataNetworkConnected(List.of(dataProfile));
processAllMessages();
@@ -1082,25 +1081,35 @@
assertThat(mDataProfileManagerUT.isAnyPreferredDataProfileExisting()).isTrue();
assertThat(mDataProfileManagerUT.isDataProfilePreferred(dataProfile)).isTrue();
- // no active internet, expect no preferred APN after reset
- mDataNetworkControllerCallback.onInternetDataNetworkDisconnected();
+ // Test user selected a bad data profile, expects to adopt the last data profile that
+ // succeeded for internet setup after APN reset
+ // some bad profile that cannot be used for internet
+ mApnSettingContentProvider.setPreferredApn(MATCH_ALL_APN_SET_ID_IMS_APN);
+ mDataProfileManagerUT.obtainMessage(2 /*EVENT_APN_DATABASE_CHANGED*/).sendToTarget();
+ processAllMessages();
+
+ assertThat(mDataProfileManagerUT.isAnyPreferredDataProfileExisting()).isTrue();
+ assertThat(mDataProfileManagerUT.isDataProfilePreferred(dataProfile)).isFalse();
+
+ // APN reset, preferred APN should set to be the last data profile that succeeded for
+ // internet setup
mPreferredApnId = -1;
mDataProfileManagerUT.obtainMessage(2 /*EVENT_APN_DATABASE_CHANGED*/).sendToTarget();
processAllMessages();
- assertThat(mDataProfileManagerUT.isAnyPreferredDataProfileExisting()).isFalse();
- assertThat(mDataProfileManagerUT.isDataProfilePreferred(dataProfile)).isFalse();
+ assertThat(mDataProfileManagerUT.isAnyPreferredDataProfileExisting()).isTrue();
+ assertThat(mDataProfileManagerUT.isDataProfilePreferred(dataProfile)).isTrue();
- // setup internet again
+ // Test removed data profile(user created after reset) shouldn't show up
mDataNetworkControllerCallback.onInternetDataNetworkConnected(List.of(dataProfile));
processAllMessages();
- //APN reset and removed GENERAL_PURPOSE_APN(as if user created) from APN DB
+ //APN reset and removed GENERAL_PURPOSE_APN from APN DB
mPreferredApnId = -1;
mApnSettingContentProvider.removeApnByApnId(1);
mDataProfileManagerUT.obtainMessage(2 /*EVENT_APN_DATABASE_CHANGED*/).sendToTarget();
processAllMessages();
- // There should be no preferred APN after APN reset
+ // There should be no preferred APN after APN reset because last working profile is removed
assertThat(mDataProfileManagerUT.isAnyPreferredDataProfileExisting()).isFalse();
assertThat(mDataProfileManagerUT.isDataProfilePreferred(dataProfile)).isFalse();