Merge "Extract and fix logic for showing rac dialog." into 24D1-dev
diff --git a/src/com/android/settings/ResetNetwork.java b/src/com/android/settings/ResetNetwork.java
index 05c8598..6ef4237 100644
--- a/src/com/android/settings/ResetNetwork.java
+++ b/src/com/android/settings/ResetNetwork.java
@@ -158,7 +158,7 @@
                         .setTitleRes(R.string.reset_mobile_network_settings_confirm_title)
                         .setSourceMetricsCategory(getMetricsCategory());
 
-        if (resetSims && SubscriptionUtil.shouldShowRacDialog(context)) {
+        if (resetSims && SubscriptionUtil.shouldShowRacDialogWhenErasingAllEsims(context)) {
             context.startActivity(
                     EuiccRacConnectivityDialogActivity.getIntent(context, launcher.toIntent()));
         } else {
diff --git a/src/com/android/settings/network/EraseEuiccDataController.java b/src/com/android/settings/network/EraseEuiccDataController.java
index 4e89da0..a12d853 100644
--- a/src/com/android/settings/network/EraseEuiccDataController.java
+++ b/src/com/android/settings/network/EraseEuiccDataController.java
@@ -50,7 +50,7 @@
         if (!TextUtils.equals(preference.getKey(), getPreferenceKey())) {
             return false;
         }
-        if (SubscriptionUtil.shouldShowRacDialog(mContext)) {
+        if (SubscriptionUtil.shouldShowRacDialogWhenErasingAllEsims(mContext)) {
             EuiccRacConnectivityDialogFragment.show(mHostFragment);
         } else {
             EraseEuiccDataDialogFragment.show(mHostFragment);
diff --git a/src/com/android/settings/network/SubscriptionUtil.java b/src/com/android/settings/network/SubscriptionUtil.java
index 9277417..c0ef042 100644
--- a/src/com/android/settings/network/SubscriptionUtil.java
+++ b/src/com/android/settings/network/SubscriptionUtil.java
@@ -542,9 +542,7 @@
             return;
         }
 
-        if (isCarrierRac(context, carrierId)
-                && (!isConnectedToWifi(context)
-                        || isConnectedToMobileDataWithDifferentSubId(context, subId))) {
+        if (shouldShowRacDialogWhenErasingEsim(context, subId, carrierId)) {
             context.startActivity(EuiccRacConnectivityDialogActivity.getIntent(context, subId));
         } else {
             context.startActivity(DeleteEuiccSubscriptionDialogActivity.getIntent(context, subId));
@@ -883,19 +881,36 @@
     }
 
     /**
-     * Check if warning dialog should be presented when erasing all eSIMS.
+     * Check if warning dialog should be presented when erasing all eSIMs.
      *
      * @param context Context to check if any sim carrier use RAC and device Wi-Fi connection.
      * @return {@code true} if dialog should be presented to the user.
      */
-    public static boolean shouldShowRacDialog(@NonNull Context context) {
+    public static boolean shouldShowRacDialogWhenErasingAllEsims(@NonNull Context context) {
         if (sEnableRacDialogForTesting != null) {
             return sEnableRacDialogForTesting;
         }
+
         return !isConnectedToWifi(context) && hasSubscriptionWithRacCarrier(context);
     }
 
     /**
+     * Check if warning dialog should be presented when erasing eSIM.
+     *
+     * @param context Context to check if any sim carrier use RAC and device Wi-Fi connection.
+     * @param subId Subscription ID for the single eSIM.
+     * @param carrierId Carrier ID for the single eSIM.
+     * @return {@code true} if dialog should be presented to the user.
+     */
+    @VisibleForTesting
+    static boolean shouldShowRacDialogWhenErasingEsim(
+            @NonNull Context context, int subId, int carrierId) {
+        return isCarrierRac(context, carrierId)
+                && !isConnectedToWifi(context)
+                && !isConnectedToMobileDataWithDifferentSubId(context, subId);
+    }
+
+    /**
      * Retrieves NetworkCapabilities for the active network.
      *
      * @param context context
diff --git a/tests/robotests/src/com/android/settings/network/SubscriptionUtilRoboTest.java b/tests/robotests/src/com/android/settings/network/SubscriptionUtilRoboTest.java
index ae504be..a6c9ef6 100644
--- a/tests/robotests/src/com/android/settings/network/SubscriptionUtilRoboTest.java
+++ b/tests/robotests/src/com/android/settings/network/SubscriptionUtilRoboTest.java
@@ -19,11 +19,13 @@
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.when;
 import static org.robolectric.Shadows.shadowOf;
 
 import android.content.Context;
+import android.content.res.Resources;
 import android.net.ConnectivityManager;
 import android.net.NetworkCapabilities;
 import android.telephony.SubscriptionManager;
@@ -42,6 +44,8 @@
 public class SubscriptionUtilRoboTest {
     private static final int SUBID_1 = 1;
     private static final int SUBID_2 = 2;
+    private static final int RAC_CARRIER_ID = 1;
+    private static final int CARRIER_ID = 2;
 
     private Context mContext;
     private NetworkCapabilities mNetworkCapabilities;
@@ -49,13 +53,16 @@
 
     @Mock
     private ConnectivityManager mConnectivityManager;
+    @Mock private Resources mResources;
 
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
         mContext = spy(ApplicationProvider.getApplicationContext());
         mShadowSubscriptionManager = shadowOf(mContext.getSystemService(SubscriptionManager.class));
+        when(mContext.getResources()).thenReturn(mResources);
         when(mContext.getSystemService(ConnectivityManager.class)).thenReturn(mConnectivityManager);
+        when(mResources.getIntArray(anyInt())).thenReturn(new int[] {RAC_CARRIER_ID});
     }
 
     @Test
@@ -74,6 +81,58 @@
         assertFalse(SubscriptionUtil.isConnectedToMobileDataWithDifferentSubId(mContext, SUBID_1));
     }
 
+    @Test
+    public void carrierIsNotRAC_showRacDialogForEsim_returnFalse() {
+        assertFalse(
+                SubscriptionUtil.shouldShowRacDialogWhenErasingEsim(mContext, SUBID_1, CARRIER_ID));
+    }
+
+    @Test
+    public void carrierIsNotRAC_noWifi_noDataConnection_showRacDialogForEsimreturnFalse() {
+        addNetworkTransportType(NetworkCapabilities.TRANSPORT_BLUETOOTH);
+
+        assertFalse(
+                SubscriptionUtil.shouldShowRacDialogWhenErasingEsim(mContext, SUBID_1, CARRIER_ID));
+    }
+
+    @Test
+    public void carrierIsRAC_isConnectedToDataOnSubId2_showRacDialogForEsim_returnFalse() {
+        addNetworkTransportType(NetworkCapabilities.TRANSPORT_CELLULAR);
+        mShadowSubscriptionManager.setActiveDataSubscriptionId(SUBID_2);
+
+        assertFalse(
+                SubscriptionUtil.shouldShowRacDialogWhenErasingEsim(
+                        mContext, SUBID_1, RAC_CARRIER_ID));
+    }
+
+    @Test
+    public void carrierIsRAC_hasWifi_showRacDialogForEsim_returnFalse() {
+        addNetworkTransportType(NetworkCapabilities.TRANSPORT_WIFI);
+
+        assertFalse(
+                SubscriptionUtil.shouldShowRacDialogWhenErasingEsim(
+                        mContext, SUBID_1, RAC_CARRIER_ID));
+    }
+
+    @Test
+    public void carrierIsRAC_isConnectedToDataOnSubId1_noWifi_showRacDialogForEsim_returnTrue() {
+        addNetworkTransportType(NetworkCapabilities.TRANSPORT_CELLULAR);
+        mShadowSubscriptionManager.setActiveDataSubscriptionId(SUBID_1);
+
+        assertTrue(
+                SubscriptionUtil.shouldShowRacDialogWhenErasingEsim(
+                        mContext, SUBID_1, RAC_CARRIER_ID));
+    }
+
+    @Test
+    public void carrierIsRAC_noData_noWifi_showRacDialogForEsim_returnTrue() {
+        addNetworkTransportType(NetworkCapabilities.TRANSPORT_BLUETOOTH);
+
+        assertTrue(
+                SubscriptionUtil.shouldShowRacDialogWhenErasingEsim(
+                        mContext, SUBID_1, RAC_CARRIER_ID));
+    }
+
     private void addNetworkTransportType(int networkType) {
         mNetworkCapabilities =
                 new NetworkCapabilities.Builder().addTransportType(networkType).build();
diff --git a/tests/unit/src/com/android/settings/network/SubscriptionUtilTest.java b/tests/unit/src/com/android/settings/network/SubscriptionUtilTest.java
index 46c281f..0de0907 100644
--- a/tests/unit/src/com/android/settings/network/SubscriptionUtilTest.java
+++ b/tests/unit/src/com/android/settings/network/SubscriptionUtilTest.java
@@ -658,36 +658,36 @@
     }
 
     @Test
-    public void hasSubscriptionWithRacCarrier_hasNoWifi_showRacDialog_returnTrue() {
+    public void hasSubscriptionWithRacCarrier_hasNoWifi_showRacDialogForAllEsims_returnTrue() {
         when(mResources.getIntArray(anyInt())).thenReturn(CARRIERS_THAT_USE_RAC);
         final SubscriptionInfo info = mock(SubscriptionInfo.class);
         when(info.getCarrierId()).thenReturn(RAC_CARRIER_ID);
         when(mSubMgr.getAvailableSubscriptionInfoList()).thenReturn(Arrays.asList(info));
         addNetworkTransportType(NetworkCapabilities.TRANSPORT_BLUETOOTH);
 
-        assertTrue(SubscriptionUtil.shouldShowRacDialog(mContext));
+        assertTrue(SubscriptionUtil.shouldShowRacDialogWhenErasingAllEsims(mContext));
     }
 
     @Test
-    public void hasSubscriptionWithRacCarrier_hasWifi_showRacDialog_returnFalse() {
+    public void hasSubscriptionWithRacCarrier_hasWifi_showRacDialogForAllEsims_returnFalse() {
         when(mResources.getIntArray(anyInt())).thenReturn(CARRIERS_THAT_USE_RAC);
         final SubscriptionInfo info = mock(SubscriptionInfo.class);
         when(info.getCarrierId()).thenReturn(RAC_CARRIER_ID);
         when(mSubMgr.getAvailableSubscriptionInfoList()).thenReturn(Arrays.asList(info));
         addNetworkTransportType(NetworkCapabilities.TRANSPORT_WIFI);
 
-        assertFalse(SubscriptionUtil.shouldShowRacDialog(mContext));
+        assertFalse(SubscriptionUtil.shouldShowRacDialogWhenErasingAllEsims(mContext));
     }
 
     @Test
-    public void hasNoSubscriptionWithRacCarrier_hasNoWifi_showRacDialog_returnFalse() {
+    public void hasNoSubscriptionWithRacCarrier_hasNoWifi_showRacDialogForAllEsims_returnFalse() {
         when(mResources.getIntArray(anyInt())).thenReturn(CARRIERS_THAT_USE_RAC);
         final SubscriptionInfo info = mock(SubscriptionInfo.class);
         when(info.getCarrierId()).thenReturn(NO_RAC_CARRIER_ID);
         when(mSubMgr.getAvailableSubscriptionInfoList()).thenReturn(Arrays.asList(info));
         addNetworkTransportType(NetworkCapabilities.TRANSPORT_WIFI);
 
-        assertFalse(SubscriptionUtil.shouldShowRacDialog(mContext));
+        assertFalse(SubscriptionUtil.shouldShowRacDialogWhenErasingAllEsims(mContext));
     }
 
     private void addNetworkTransportType(int networkType) {