Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c9a9faf5 authored by SongFerngWang's avatar SongFerngWang
Browse files

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

Bug: 189983549
Test: atest ProviderModelSliceTest
Change-Id: I83fcadb07e4f8dff5d07bc4015c0c6004c4f5de5
parent 2110a5b9
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -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>
+58 −2
Original line number Diff line number Diff line
@@ -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 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 @@ import java.util.stream.Collectors;
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,17 +202,60 @@ public class ProviderModelSlice extends WifiSlice {
        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.
            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 =
                isToggleAction ? newState : MobileNetworkUtils.isMobileDataEnabled(mContext);
        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
    void doCarrierNetworkAction(boolean isToggleAction, boolean isDataEnabled, int subId) {
        final NetworkProviderWorker worker = getWorker();
@@ -247,6 +298,11 @@ public class ProviderModelSlice extends WifiSlice {
        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) {
+1 −1
Original line number Diff line number Diff line
@@ -264,7 +264,7 @@ public class ProviderModelSliceHelper {
        return summary;
    }

    private String getMobileTitle() {
    protected String getMobileTitle() {
        String title = mContext.getText(R.string.mobile_data_settings_title).toString();
        if (mSubscriptionManager == null) {
            return title;
+76 −0
Original line number Diff line number Diff line
@@ -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.times;
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 @@ public class ProviderModelSliceTest {
    WifiPickerTracker mWifiPickerTracker;
    @Mock
    WifiSliceItem mWifiSliceItem;
    AlertDialog mMockAlertDialog;

    private FakeFeatureFactory mFeatureFactory;

@@ -128,6 +135,11 @@ public class ProviderModelSliceTest {
                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 @@ public class ProviderModelSliceTest {
        private MockNetworkProviderWorker mNetworkProviderWorker;
        private boolean mHasCreateEthernetRow;
        private boolean mHasSeeAllRow;
        private AlertDialog mAlertDialog;

        MockProviderModelSlice(Context context, MockNetworkProviderWorker networkProviderWorker) {
            super(context);
@@ -366,6 +379,11 @@ public class ProviderModelSliceTest {
            return mNetworkProviderWorker;
        }

        @Override
        AlertDialog getMobileDataDisableDialog(int defaultSubId, String carrierName) {
            return mAlertDialog;
        }

        @Override
        ListBuilder.RowBuilder createEthernetRow() {
            mHasCreateEthernetRow = true;
@@ -385,6 +403,64 @@ public class ProviderModelSliceTest {
        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