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:
@@ -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>
|
||||||
|
@@ -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) {
|
||||||
|
@@ -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;
|
||||||
|
@@ -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
|
||||||
|
Reference in New Issue
Block a user