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();