diff options
author | Ling Ma <linggm@google.com> | 2022-05-24 23:16:16 -0700 |
---|---|---|
committer | Ling Ma <linggm@google.com> | 2022-06-02 21:32:49 +0000 |
commit | c9d38985575291cb7b325a64e5cf17af4c3b4083 (patch) | |
tree | b64e574123ce15e226ed10d6fd501696e2f32ce1 | |
parent | 81009d6647a760914857d24f38c8c6580f556567 (diff) | |
download | telephony-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.java | 9 | ||||
-rw-r--r-- | tests/telephonytests/src/com/android/internal/telephony/data/DataProfileManagerTest.java | 42 |
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(); |