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

Bug: 189983549
Test: atest ProviderModelSliceTest
Change-Id: I83fcadb07e4f8dff5d07bc4015c0c6004c4f5de5
This commit is contained in:
SongFerngWang
2021-06-17 01:18:41 +08:00
parent 2110a5b95e
commit c9a9faf5b8
4 changed files with 141 additions and 3 deletions

View File

@@ -13315,6 +13315,12 @@
<string name="non_carrier_network_unavailable">No other networks available</string> <string name="non_carrier_network_unavailable">No other networks available</string>
<!-- Provider Model: Summary indicating that no networks available [CHAR LIMIT=50] --> <!-- Provider Model: Summary indicating that no networks available [CHAR LIMIT=50] -->
<string name="all_network_unavailable">No networks available</string> <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] --> <!-- 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> <string name="aware_summary_when_bedtime_on">Unavailable because bedtime mode is on</string>

View File

@@ -22,16 +22,20 @@ import static android.app.slice.Slice.EXTRA_TOGGLE_STATE;
import static com.android.settings.slices.CustomSliceRegistry.PROVIDER_MODEL_SLICE_URI; import static com.android.settings.slices.CustomSliceRegistry.PROVIDER_MODEL_SLICE_URI;
import android.annotation.ColorInt; import android.annotation.ColorInt;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.app.PendingIntent; import android.app.PendingIntent;
import android.app.settings.SettingsEnums; import android.app.settings.SettingsEnums;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Color; import android.graphics.Color;
import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import android.net.Uri; import android.net.Uri;
import android.telephony.SubscriptionManager; import android.telephony.SubscriptionManager;
import android.util.Log; import android.util.Log;
import android.view.WindowManager.LayoutParams;
import androidx.annotation.VisibleForTesting; import androidx.annotation.VisibleForTesting;
import androidx.core.graphics.drawable.IconCompat; import androidx.core.graphics.drawable.IconCompat;
@@ -64,12 +68,16 @@ import java.util.stream.Collectors;
public class ProviderModelSlice extends WifiSlice { public class ProviderModelSlice extends WifiSlice {
private static final String TAG = "ProviderModelSlice"; 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 ProviderModelSliceHelper mHelper;
private final SharedPreferences mSharedPref;
public ProviderModelSlice(Context context) { public ProviderModelSlice(Context context) {
super(context); super(context);
mHelper = getHelper(); mHelper = getHelper();
mSharedPref = getSharedPreference();
} }
@Override @Override
@@ -194,10 +202,21 @@ public class ProviderModelSlice extends WifiSlice {
boolean isToggleAction = intent.hasExtra(EXTRA_TOGGLE_STATE); boolean isToggleAction = intent.hasExtra(EXTRA_TOGGLE_STATE);
boolean newState = intent.getBooleanExtra(EXTRA_TOGGLE_STATE, boolean newState = intent.getBooleanExtra(EXTRA_TOGGLE_STATE,
mHelper.isMobileDataEnabled()); mHelper.isMobileDataEnabled());
if (isToggleAction) { if (isToggleAction) {
// The ToggleAction is used to set mobile data enabled. // The ToggleAction is used to set mobile data enabled.
MobileNetworkUtils.setMobileDataEnabled(mContext, defaultSubId, newState, if (!newState && mSharedPref != null
false /* disableOtherSubscriptions */); && 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 = final boolean isDataEnabled =
@@ -205,6 +224,38 @@ public class ProviderModelSlice extends WifiSlice {
doCarrierNetworkAction(isToggleAction, isDataEnabled, defaultSubId); doCarrierNetworkAction(isToggleAction, isDataEnabled, defaultSubId);
} }
@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 @VisibleForTesting
void doCarrierNetworkAction(boolean isToggleAction, boolean isDataEnabled, int subId) { void doCarrierNetworkAction(boolean isToggleAction, boolean isDataEnabled, int subId) {
final NetworkProviderWorker worker = getWorker(); final NetworkProviderWorker worker = getWorker();
@@ -247,6 +298,11 @@ public class ProviderModelSlice extends WifiSlice {
return SliceBackgroundWorker.getInstance(getUri()); return SliceBackgroundWorker.getInstance(getUri());
} }
@VisibleForTesting
SharedPreferences getSharedPreference() {
return mContext.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE);
}
private @InternetUpdater.InternetType int getInternetType() { private @InternetUpdater.InternetType int getInternetType() {
final NetworkProviderWorker worker = getWorker(); final NetworkProviderWorker worker = getWorker();
if (worker == null) { if (worker == null) {

View File

@@ -264,7 +264,7 @@ public class ProviderModelSliceHelper {
return summary; return summary;
} }
private String getMobileTitle() { protected String getMobileTitle() {
String title = mContext.getText(R.string.mobile_data_settings_title).toString(); String title = mContext.getText(R.string.mobile_data_settings_title).toString();
if (mSubscriptionManager == null) { if (mSubscriptionManager == null) {
return title; return title;

View File

@@ -16,6 +16,10 @@
package com.android.settings.network; 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 com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.any;
@@ -28,9 +32,11 @@ import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
import android.app.AlertDialog;
import android.app.PendingIntent; import android.app.PendingIntent;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Color; import android.graphics.Color;
import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.ColorDrawable;
import android.net.ConnectivityManager; import android.net.ConnectivityManager;
@@ -100,6 +106,7 @@ public class ProviderModelSliceTest {
WifiPickerTracker mWifiPickerTracker; WifiPickerTracker mWifiPickerTracker;
@Mock @Mock
WifiSliceItem mWifiSliceItem; WifiSliceItem mWifiSliceItem;
AlertDialog mMockAlertDialog;
private FakeFeatureFactory mFeatureFactory; private FakeFeatureFactory mFeatureFactory;
@@ -128,6 +135,11 @@ public class ProviderModelSliceTest {
PROVIDER_MODEL_SLICE_URI)); PROVIDER_MODEL_SLICE_URI));
mMockProviderModelSlice = spy(new MockProviderModelSlice( mMockProviderModelSlice = spy(new MockProviderModelSlice(
mContext, mMockNetworkProviderWorker)); mContext, mMockNetworkProviderWorker));
mMockAlertDialog = new AlertDialog.Builder(mContext)
.setTitle("")
.create();
mMockAlertDialog = spy(mMockAlertDialog);
mMockProviderModelSlice.setMobileDataDisableDialog(mMockAlertDialog);
mListBuilder = spy(new ListBuilder(mContext, PROVIDER_MODEL_SLICE_URI, mListBuilder = spy(new ListBuilder(mContext, PROVIDER_MODEL_SLICE_URI,
ListBuilder.INFINITY).setAccentColor(-1)); ListBuilder.INFINITY).setAccentColor(-1));
when(mProviderModelSliceHelper.createListBuilder(PROVIDER_MODEL_SLICE_URI)).thenReturn( when(mProviderModelSliceHelper.createListBuilder(PROVIDER_MODEL_SLICE_URI)).thenReturn(
@@ -350,6 +362,7 @@ public class ProviderModelSliceTest {
private MockNetworkProviderWorker mNetworkProviderWorker; private MockNetworkProviderWorker mNetworkProviderWorker;
private boolean mHasCreateEthernetRow; private boolean mHasCreateEthernetRow;
private boolean mHasSeeAllRow; private boolean mHasSeeAllRow;
private AlertDialog mAlertDialog;
MockProviderModelSlice(Context context, MockNetworkProviderWorker networkProviderWorker) { MockProviderModelSlice(Context context, MockNetworkProviderWorker networkProviderWorker) {
super(context); super(context);
@@ -366,6 +379,11 @@ public class ProviderModelSliceTest {
return mNetworkProviderWorker; return mNetworkProviderWorker;
} }
@Override
AlertDialog getMobileDataDisableDialog(int defaultSubId, String carrierName) {
return mAlertDialog;
}
@Override @Override
ListBuilder.RowBuilder createEthernetRow() { ListBuilder.RowBuilder createEthernetRow() {
mHasCreateEthernetRow = true; mHasCreateEthernetRow = true;
@@ -385,6 +403,64 @@ public class ProviderModelSliceTest {
public boolean hasSeeAllRow() { public boolean hasSeeAllRow() {
return mHasSeeAllRow; 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 @Test