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