aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLing Ma <linggm@google.com>2022-05-24 23:16:16 -0700
committerLing Ma <linggm@google.com>2022-06-02 21:32:49 +0000
commitc9d38985575291cb7b325a64e5cf17af4c3b4083 (patch)
treeb64e574123ce15e226ed10d6fd501696e2f32ce1
parent81009d6647a760914857d24f38c8c6580f556567 (diff)
downloadtelephony-c9d38985575291cb7b325a64e5cf17af4c3b4083.tar.gz
Fix Sync preferred apn and preferred apn set id
When APN db is reset to default, mPreferredSetId is set to 0 along with the preferred db is reset to empty. However, we do have preferred profile that's loaded from carrier config, and the preferred db should be in sync with the mPreferredDataProfile. Bug: 232890963 Bug: 234725522 Test: manually verified SIM unlock reboot + checked log Change-Id: I035bd604391ff2aa684ecca0355be9bc79248204
-rw-r--r--src/java/com/android/internal/telephony/data/DataProfileManager.java9
-rw-r--r--tests/telephonytests/src/com/android/internal/telephony/data/DataProfileManagerTest.java42
2 files changed, 49 insertions, 2 deletions
diff --git a/src/java/com/android/internal/telephony/data/DataProfileManager.java b/src/java/com/android/internal/telephony/data/DataProfileManager.java
index abf1009358..1ec345c943 100644
--- a/src/java/com/android/internal/telephony/data/DataProfileManager.java
+++ b/src/java/com/android/internal/telephony/data/DataProfileManager.java
@@ -312,14 +312,15 @@ public class DataProfileManager extends Handler {
profilesChanged = true;
}
+ // Reload the latest preferred data profile from either database or config.
+ profilesChanged |= updatePreferredDataProfile();
+
int setId = getPreferredDataProfileSetId();
if (setId != mPreferredDataProfileSetId) {
logl("Changed preferred data profile set id to " + setId);
mPreferredDataProfileSetId = setId;
profilesChanged = true;
}
- // Reload the latest preferred data profile from either database or config.
- profilesChanged |= updatePreferredDataProfile();
updateDataProfilesAtModem();
updateInitialAttachDataProfileAtModem();
@@ -461,6 +462,10 @@ public class DataProfileManager extends Handler {
preferredDataProfile = getPreferredDataProfileFromDb();
if (preferredDataProfile == null) {
preferredDataProfile = getPreferredDataProfileFromConfig();
+ if (preferredDataProfile != null) {
+ // Save the carrier specified preferred data profile into database
+ setPreferredDataProfile(preferredDataProfile);
+ }
}
} else {
preferredDataProfile = null;
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 96e2098673..783df82e39 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/data/DataProfileManagerTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/data/DataProfileManagerTest.java
@@ -363,6 +363,16 @@ public class DataProfileManagerTest extends TelephonyTest {
logd("ApnSettingContentProvider: uri=" + uri + ", values=" + values);
if (uri.isPathPrefixMatch(Telephony.Carriers.PREFERRED_APN_URI)) {
mPreferredApnId = values.getAsInteger(Telephony.Carriers.APN_ID);
+ if (mPreferredApnId != -1) {
+ for (Object apnSetting : mAllApnSettings) {
+ int id = (int) ((Object[]) apnSetting)[0];
+ if (id == mPreferredApnId) {
+ mPreferredApnSet = (int) ((Object[]) apnSetting)[28]; //update setId too
+ }
+ }
+ } else {
+ mPreferredApnSet = 0; // db is emptied
+ }
logd("mPreferredApnId=" + mPreferredApnId);
}
return null;
@@ -864,6 +874,38 @@ public class DataProfileManagerTest extends TelephonyTest {
}
@Test
+ public void testResetApnWithPreferredConfig() {
+ // carrier configured preferred data profile should be picked
+ doReturn(GENERAL_PURPOSE_APN1).when(mDataConfigManager).getDefaultPreferredApn();
+ TelephonyNetworkRequest tnr = new TelephonyNetworkRequest(
+ new NetworkRequest.Builder()
+ .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
+ .build(), mPhone);
+ mSimInserted = true;
+ mDataProfileManagerUT.obtainMessage(2 /*EVENT_APN_DATABASE_CHANGED*/).sendToTarget();
+ processAllMessages();
+
+ // The carrier configured data profile should be the preferred APN after APN reset
+ DataProfile dataProfile = mDataProfileManagerUT.getDataProfileForNetworkRequest(
+ tnr, TelephonyManager.NETWORK_TYPE_LTE);
+
+ assertThat(dataProfile.getApnSetting().getApnName()).isEqualTo(GENERAL_PURPOSE_APN1);
+ assertThat(mDataProfileManagerUT.isDataProfilePreferred(dataProfile)).isTrue();
+
+ // APN reset
+ mPreferredApnId = -1;
+ mDataProfileManagerUT.obtainMessage(2 /*EVENT_APN_DATABASE_CHANGED*/).sendToTarget();
+ Mockito.clearInvocations(mDataConfigManager);
+ processAllMessages();
+
+ // The carrier configured data profile should be the preferred APN after APN reset
+ dataProfile = mDataProfileManagerUT.getDataProfileForNetworkRequest(
+ tnr, TelephonyManager.NETWORK_TYPE_LTE);
+ assertThat(dataProfile.getApnSetting().getApnName()).isEqualTo(GENERAL_PURPOSE_APN1);
+ assertThat(mDataProfileManagerUT.isDataProfilePreferred(dataProfile)).isTrue();
+ }
+
+ @Test
public void testTetheringApnExisting() {
assertThat(mDataProfileManagerUT.isTetheringDataProfileExisting(
TelephonyManager.NETWORK_TYPE_NR)).isTrue();