Add the confirmation dialog when user disable mobile data at first time

Bug: 189983549
Test: atest ProviderModelSliceTest
Change-Id: I83fcadb07e4f8dff5d07bc4015c0c6004c4f5de5
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 92a90ce..fd49d15 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -13315,6 +13315,12 @@
     <string name="non_carrier_network_unavailable">No other networks available</string>
     <!-- Provider Model: Summary indicating that no networks available [CHAR LIMIT=50] -->
     <string name="all_network_unavailable">No networks available</string>
+    <!-- Title of the dialog to turn off data usage [CHAR LIMIT=NONE] -->
+    <string name="mobile_data_disable_title">Turn off mobile data?</string>
+    <!-- Message body of the dialog to turn off data usage [CHAR LIMIT=NONE] -->
+    <string name="mobile_data_disable_message">You won\’t have access to data or the internet through <xliff:g id="carrier" example="T-Mobile">%s</xliff:g>. Internet will only be available via Wi\u2011Fi.</string>
+    <!-- Text used to refer to the user's current carrier in mobile_data_disable_message if the users's mobile network carrier name is not available [CHAR LIMIT=NONE] -->
+    <string name="mobile_data_disable_message_default_carrier">your carrier</string>
 
     <!-- Summary for preference when Bedtime mode is on [CHAR LIMIT=NONE] -->
     <string name="aware_summary_when_bedtime_on">Unavailable because bedtime mode is on</string>
diff --git a/src/com/android/settings/network/ProviderModelSlice.java b/src/com/android/settings/network/ProviderModelSlice.java
index 0ae270c..aafe715 100644
--- a/src/com/android/settings/network/ProviderModelSlice.java
+++ b/src/com/android/settings/network/ProviderModelSlice.java
@@ -22,16 +22,20 @@
 import static com.android.settings.slices.CustomSliceRegistry.PROVIDER_MODEL_SLICE_URI;
 
 import android.annotation.ColorInt;
+import android.app.AlertDialog;
+import android.app.AlertDialog.Builder;
 import android.app.PendingIntent;
 import android.app.settings.SettingsEnums;
 import android.content.Context;
 import android.content.Intent;
+import android.content.SharedPreferences;
 import android.graphics.Color;
 import android.graphics.drawable.ColorDrawable;
 import android.graphics.drawable.Drawable;
 import android.net.Uri;
 import android.telephony.SubscriptionManager;
 import android.util.Log;
+import android.view.WindowManager.LayoutParams;
 
 import androidx.annotation.VisibleForTesting;
 import androidx.core.graphics.drawable.IconCompat;
@@ -64,12 +68,16 @@
 public class ProviderModelSlice extends WifiSlice {
 
     private static final String TAG = "ProviderModelSlice";
+    protected static final String PREF_NAME = "ProviderModelSlice";
+    protected static final String PREF_HAS_TURNED_OFF_MOBILE_DATA = "PrefHasTurnedOffMobileData";
 
     private final ProviderModelSliceHelper mHelper;
+    private final SharedPreferences mSharedPref;
 
     public ProviderModelSlice(Context context) {
         super(context);
         mHelper = getHelper();
+        mSharedPref = getSharedPreference();
     }
 
     @Override
@@ -194,10 +202,21 @@
         boolean isToggleAction = intent.hasExtra(EXTRA_TOGGLE_STATE);
         boolean newState = intent.getBooleanExtra(EXTRA_TOGGLE_STATE,
                 mHelper.isMobileDataEnabled());
+
         if (isToggleAction) {
             // The ToggleAction is used to set mobile data enabled.
-            MobileNetworkUtils.setMobileDataEnabled(mContext, defaultSubId, newState,
-                    false /* disableOtherSubscriptions */);
+            if (!newState && mSharedPref != null
+                    && mSharedPref.getBoolean(PREF_HAS_TURNED_OFF_MOBILE_DATA, true)) {
+                String carrierName = mHelper.getMobileTitle();
+                if (carrierName.equals(mContext.getString(R.string.mobile_data_settings_title))) {
+                    carrierName = mContext.getString(
+                            R.string.mobile_data_disable_message_default_carrier);
+                }
+                showMobileDataDisableDialog(getMobileDataDisableDialog(defaultSubId, carrierName));
+            } else {
+                MobileNetworkUtils.setMobileDataEnabled(mContext, defaultSubId, newState,
+                        false /* disableOtherSubscriptions */);
+            }
         }
 
         final boolean isDataEnabled =
@@ -206,6 +225,38 @@
     }
 
     @VisibleForTesting
+    AlertDialog getMobileDataDisableDialog(int defaultSubId, String carrierName) {
+        return new Builder(mContext)
+                .setTitle(R.string.mobile_data_disable_title)
+                .setMessage(mContext.getString(R.string.mobile_data_disable_message,
+                        carrierName))
+                .setNegativeButton(android.R.string.cancel, null)
+                .setPositiveButton(
+                        com.android.internal.R.string.alert_windows_notification_turn_off_action,
+                        (dialog, which) -> {
+                            MobileNetworkUtils.setMobileDataEnabled(mContext, defaultSubId,
+                                    false /* enabled */,
+                                    false /* disableOtherSubscriptions */);
+                            if (mSharedPref != null) {
+                                SharedPreferences.Editor editor = mSharedPref.edit();
+                                editor.putBoolean(PREF_HAS_TURNED_OFF_MOBILE_DATA, false);
+                                editor.apply();
+                            }
+                        })
+                .create();
+    }
+
+    private void showMobileDataDisableDialog(AlertDialog dialog) {
+        if (dialog == null) {
+            log("AlertDialog is null");
+            return;
+        }
+
+        dialog.getWindow().setType(LayoutParams.TYPE_KEYGUARD_DIALOG);
+        dialog.show();
+    }
+
+    @VisibleForTesting
     void doCarrierNetworkAction(boolean isToggleAction, boolean isDataEnabled, int subId) {
         final NetworkProviderWorker worker = getWorker();
         if (worker == null) {
@@ -247,6 +298,11 @@
         return SliceBackgroundWorker.getInstance(getUri());
     }
 
+    @VisibleForTesting
+    SharedPreferences getSharedPreference() {
+        return mContext.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE);
+    }
+
     private @InternetUpdater.InternetType int getInternetType() {
         final NetworkProviderWorker worker = getWorker();
         if (worker == null) {
diff --git a/src/com/android/settings/network/ProviderModelSliceHelper.java b/src/com/android/settings/network/ProviderModelSliceHelper.java
index 28f8574..16d5c92 100644
--- a/src/com/android/settings/network/ProviderModelSliceHelper.java
+++ b/src/com/android/settings/network/ProviderModelSliceHelper.java
@@ -264,7 +264,7 @@
         return summary;
     }
 
-    private String getMobileTitle() {
+    protected String getMobileTitle() {
         String title = mContext.getText(R.string.mobile_data_settings_title).toString();
         if (mSubscriptionManager == null) {
             return title;
diff --git a/tests/unit/src/com/android/settings/network/ProviderModelSliceTest.java b/tests/unit/src/com/android/settings/network/ProviderModelSliceTest.java
index 4e9ed76..722e305 100644
--- a/tests/unit/src/com/android/settings/network/ProviderModelSliceTest.java
+++ b/tests/unit/src/com/android/settings/network/ProviderModelSliceTest.java
@@ -16,6 +16,10 @@
 
 package com.android.settings.network;
 
+import static android.app.slice.Slice.EXTRA_TOGGLE_STATE;
+
+import static com.android.settings.network.ProviderModelSlice.PREF_HAS_TURNED_OFF_MOBILE_DATA;
+
 import static com.google.common.truth.Truth.assertThat;
 
 import static org.mockito.ArgumentMatchers.any;
@@ -28,9 +32,11 @@
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
+import android.app.AlertDialog;
 import android.app.PendingIntent;
 import android.content.Context;
 import android.content.Intent;
+import android.content.SharedPreferences;
 import android.graphics.Color;
 import android.graphics.drawable.ColorDrawable;
 import android.net.ConnectivityManager;
@@ -100,6 +106,7 @@
     WifiPickerTracker mWifiPickerTracker;
     @Mock
     WifiSliceItem mWifiSliceItem;
+    AlertDialog mMockAlertDialog;
 
     private FakeFeatureFactory mFeatureFactory;
 
@@ -128,6 +135,11 @@
                 PROVIDER_MODEL_SLICE_URI));
         mMockProviderModelSlice = spy(new MockProviderModelSlice(
                 mContext, mMockNetworkProviderWorker));
+        mMockAlertDialog =  new AlertDialog.Builder(mContext)
+                .setTitle("")
+                .create();
+        mMockAlertDialog = spy(mMockAlertDialog);
+        mMockProviderModelSlice.setMobileDataDisableDialog(mMockAlertDialog);
         mListBuilder = spy(new ListBuilder(mContext, PROVIDER_MODEL_SLICE_URI,
                 ListBuilder.INFINITY).setAccentColor(-1));
         when(mProviderModelSliceHelper.createListBuilder(PROVIDER_MODEL_SLICE_URI)).thenReturn(
@@ -350,6 +362,7 @@
         private MockNetworkProviderWorker mNetworkProviderWorker;
         private boolean mHasCreateEthernetRow;
         private boolean mHasSeeAllRow;
+        private AlertDialog mAlertDialog;
 
         MockProviderModelSlice(Context context, MockNetworkProviderWorker networkProviderWorker) {
             super(context);
@@ -367,6 +380,11 @@
         }
 
         @Override
+        AlertDialog getMobileDataDisableDialog(int defaultSubId, String carrierName) {
+            return mAlertDialog;
+        }
+
+        @Override
         ListBuilder.RowBuilder createEthernetRow() {
             mHasCreateEthernetRow = true;
             return super.createEthernetRow();
@@ -385,6 +403,64 @@
         public boolean hasSeeAllRow() {
             return mHasSeeAllRow;
         }
+
+        public void setMobileDataDisableDialog(AlertDialog alertDialog) {
+            mAlertDialog = alertDialog;
+        }
+    }
+
+    @Test
+    @UiThreadTest
+    public void onNotifyChange_FirstTimeDisableToggleState_showDialog() {
+        final Intent intent = new Intent();
+        intent.putExtra(EXTRA_TOGGLE_STATE, false);
+        SharedPreferences sharedPref = mMockProviderModelSlice.getSharedPreference();
+        when(mProviderModelSliceHelper.getMobileTitle()).thenReturn("mockRow");
+        if (sharedPref != null) {
+            SharedPreferences.Editor editor = sharedPref.edit();
+            editor.putBoolean(PREF_HAS_TURNED_OFF_MOBILE_DATA, true);
+            editor.apply();
+        }
+
+        mMockProviderModelSlice.onNotifyChange(intent);
+
+        verify(mMockAlertDialog).show();
+    }
+
+    @Test
+    @UiThreadTest
+    public void onNotifyChange_EnableToggleState_doNotShowDialog() {
+        final Intent intent = new Intent();
+        intent.putExtra(EXTRA_TOGGLE_STATE, true);
+        SharedPreferences sharedPref = mMockProviderModelSlice.getSharedPreference();
+        when(mProviderModelSliceHelper.getMobileTitle()).thenReturn("mockRow");
+        if (sharedPref != null) {
+            SharedPreferences.Editor editor = sharedPref.edit();
+            editor.putBoolean(PREF_HAS_TURNED_OFF_MOBILE_DATA, true);
+            editor.apply();
+        }
+
+        mMockProviderModelSlice.onNotifyChange(intent);
+
+        verify(mMockAlertDialog, never()).show();
+    }
+
+    @Test
+    @UiThreadTest
+    public void onNotifyChange_notFirstTimeDisableToggleState_doNotShowDialog() {
+        final Intent intent = new Intent();
+        intent.putExtra(EXTRA_TOGGLE_STATE, false);
+        SharedPreferences sharedPref = mMockProviderModelSlice.getSharedPreference();
+        when(mProviderModelSliceHelper.getMobileTitle()).thenReturn("mockRow");
+        if (sharedPref != null) {
+            SharedPreferences.Editor editor = sharedPref.edit();
+            editor.putBoolean(PREF_HAS_TURNED_OFF_MOBILE_DATA, false);
+            editor.apply();
+        }
+
+        mMockProviderModelSlice.onNotifyChange(intent);
+
+        verify(mMockAlertDialog, never()).show();
     }
 
     @Test