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

Commit 29b2f16e authored by tomhsu's avatar tomhsu Committed by Tom Hsu
Browse files

Show dialog on Wifi, and APM' entries in Settings

 - When satellite mode is switched on Wifi, and APM entry shall show the warning dialog and avoid user uses these functions.

Bug: 337154438
Test: Manual test.
Test: atest pass
Change-Id: I45cd92a8688e7a619613361ea4a8d58a0984d99f
parent 41273946
Loading
Loading
Loading
Loading
+48 −13
Original line number Diff line number Diff line
@@ -17,6 +17,9 @@ package com.android.settings.network;

import static android.provider.SettingsSlicesContract.KEY_AIRPLANE_MODE;

import static com.android.settings.network.SatelliteWarningDialogActivity.EXTRA_TYPE_OF_SATELLITE_WARNING_DIALOG;
import static com.android.settings.network.SatelliteWarningDialogActivity.TYPE_IS_AIRPLANE_MODE;

import android.app.Activity;
import android.content.ContentResolver;
import android.content.Context;
@@ -25,6 +28,7 @@ import android.content.pm.PackageManager;
import android.net.Uri;
import android.provider.SettingsSlicesContract;
import android.telephony.TelephonyManager;
import android.util.Log;

import androidx.annotation.VisibleForTesting;
import androidx.fragment.app.Fragment;
@@ -38,13 +42,20 @@ import com.android.settings.Utils;
import com.android.settings.core.TogglePreferenceController;
import com.android.settingslib.core.lifecycle.LifecycleObserver;
import com.android.settingslib.core.lifecycle.events.OnDestroy;
import com.android.settingslib.core.lifecycle.events.OnResume;
import com.android.settingslib.core.lifecycle.events.OnStart;
import com.android.settingslib.core.lifecycle.events.OnStop;

import java.util.concurrent.ExecutionException;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import java.util.concurrent.atomic.AtomicBoolean;

public class AirplaneModePreferenceController extends TogglePreferenceController
        implements LifecycleObserver, OnStart, OnStop, OnDestroy,
        implements LifecycleObserver, OnStart, OnResume, OnStop, OnDestroy,
        AirplaneModeEnabler.OnAirplaneModeChangedListener {

    private static final String TAG = AirplaneModePreferenceController.class.getSimpleName();
    public static final int REQUEST_CODE_EXIT_ECM = 1;

    /**
@@ -60,12 +71,15 @@ public class AirplaneModePreferenceController extends TogglePreferenceController
    private Fragment mFragment;
    private AirplaneModeEnabler mAirplaneModeEnabler;
    private TwoStatePreference mAirplaneModePreference;
    private SatelliteRepository mSatelliteRepository;
    @VisibleForTesting
    AtomicBoolean mIsSatelliteOn = new AtomicBoolean(false);

    public AirplaneModePreferenceController(Context context, String key) {
        super(context, key);

        if (isAvailable(mContext)) {
            mAirplaneModeEnabler = new AirplaneModeEnabler(mContext, this);
            mSatelliteRepository = new SatelliteRepository(mContext);
        }
    }

@@ -80,9 +94,9 @@ public class AirplaneModePreferenceController extends TogglePreferenceController

    @Override
    public boolean handlePreferenceTreeClick(Preference preference) {
        if (KEY_AIRPLANE_MODE.equals(preference.getKey()) && isAvailable()
                && mAirplaneModeEnabler.isInEcmMode()) {
        if (KEY_AIRPLANE_MODE.equals(preference.getKey()) && isAvailable()) {
            // In ECM mode launch ECM app dialog
            if (mAirplaneModeEnabler.isInEcmMode()) {
                if (mFragment != null) {
                    mFragment.startActivityForResult(
                            new Intent(TelephonyManager.ACTION_SHOW_NOTICE_ECM_BLOCK_OTHERS, null)
@@ -92,6 +106,16 @@ public class AirplaneModePreferenceController extends TogglePreferenceController
                return true;
            }

            if (mIsSatelliteOn.get()) {
                mContext.startActivity(
                        new Intent(mContext, SatelliteWarningDialogActivity.class)
                                .putExtra(
                                        EXTRA_TYPE_OF_SATELLITE_WARNING_DIALOG,
                                        TYPE_IS_AIRPLANE_MODE)
                );
                return true;
            }
        }
        return false;
    }

@@ -134,6 +158,17 @@ public class AirplaneModePreferenceController extends TogglePreferenceController
        }
    }

    @Override
    public void onResume() {
        try {
            mIsSatelliteOn.set(
                    mSatelliteRepository.requestIsEnabled(Executors.newSingleThreadExecutor())
                            .get(2000, TimeUnit.MILLISECONDS));
        } catch (ExecutionException | TimeoutException | InterruptedException e) {
            Log.e(TAG, "Error to get satellite status : " + e);
        }
    }

    @Override
    public void onStop() {
        if (isAvailable()) {
@@ -165,7 +200,7 @@ public class AirplaneModePreferenceController extends TogglePreferenceController

    @Override
    public boolean setChecked(boolean isChecked) {
        if (isChecked() == isChecked) {
        if (isChecked() == isChecked || mIsSatelliteOn.get()) {
            return false;
        }
        if (isAvailable()) {
+1 −1
Original line number Diff line number Diff line
@@ -41,7 +41,7 @@ class SatelliteWarningDialogActivity : SpaDialogWindowTypeActivity() {
    }

    override fun getDialogWindowType(): Int {
        return WindowManager.LayoutParams.FIRST_APPLICATION_WINDOW
        return WindowManager.LayoutParams.LAST_APPLICATION_WINDOW
    }

    @Composable
+35 −3
Original line number Diff line number Diff line
@@ -16,6 +16,9 @@

package com.android.settings.wifi;

import static com.android.settings.network.SatelliteWarningDialogActivity.EXTRA_TYPE_OF_SATELLITE_WARNING_DIALOG;
import static com.android.settings.network.SatelliteWarningDialogActivity.TYPE_IS_WIFI;

import android.app.settings.SettingsEnums;
import android.content.BroadcastReceiver;
import android.content.Context;
@@ -27,19 +30,26 @@ import android.net.wifi.SupplicantState;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.provider.Settings;
import android.util.Log;
import android.widget.Toast;

import androidx.annotation.VisibleForTesting;

import com.android.settings.R;
import com.android.settings.network.SatelliteRepository;
import com.android.settings.network.SatelliteWarningDialogActivity;
import com.android.settings.widget.SwitchWidgetController;
import com.android.settingslib.WirelessUtils;
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;

import java.util.concurrent.ExecutionException;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import java.util.concurrent.atomic.AtomicBoolean;

public class WifiEnabler implements SwitchWidgetController.OnSwitchChangeListener  {

    private static final String TAG = WifiEnabler.class.getSimpleName();
    private final SwitchWidgetController mSwitchWidget;
    private final WifiManager mWifiManager;
    private final ConnectivityManager mConnectivityManager;
@@ -48,7 +58,9 @@ public class WifiEnabler implements SwitchWidgetController.OnSwitchChangeListene
    private Context mContext;
    private boolean mListeningToOnSwitchChange = false;
    private AtomicBoolean mConnected = new AtomicBoolean(false);

    private SatelliteRepository mSatelliteRepository;
    @VisibleForTesting
    AtomicBoolean mIsSatelliteOn = new AtomicBoolean(false);

    private boolean mStateMachineEvent;
    private final IntentFilter mIntentFilter;
@@ -93,7 +105,7 @@ public class WifiEnabler implements SwitchWidgetController.OnSwitchChangeListene
        // The order matters! We really should not depend on this. :(
        mIntentFilter.addAction(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION);
        mIntentFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);

        mSatelliteRepository = new SatelliteRepository(context);
        setupSwitchController();
    }

@@ -124,6 +136,14 @@ public class WifiEnabler implements SwitchWidgetController.OnSwitchChangeListene
            mSwitchWidget.startListening();
            mListeningToOnSwitchChange = true;
        }
        // Refresh satellite mode status.
        try {
            mIsSatelliteOn.set(
                    mSatelliteRepository.requestIsEnabled(Executors.newSingleThreadExecutor())
                            .get(2000, TimeUnit.MILLISECONDS));
        } catch (ExecutionException | TimeoutException | InterruptedException e) {
            Log.e(TAG, "Error to get satellite status : " + e);
        }
    }

    public void pause() {
@@ -185,6 +205,18 @@ public class WifiEnabler implements SwitchWidgetController.OnSwitchChangeListene
        if (mStateMachineEvent) {
            return true;
        }

        // Show dialog and do nothing under satellite mode.
        if (mIsSatelliteOn.get()) {
            mContext.startActivity(
                    new Intent(mContext, SatelliteWarningDialogActivity.class)
                            .putExtra(
                                    EXTRA_TYPE_OF_SATELLITE_WARNING_DIALOG,
                                    TYPE_IS_WIFI)
            );
            return false;
        }

        // Show toast message if Wi-Fi is not allowed in airplane mode
        if (isChecked && !WirelessUtils.isRadioAllowed(mContext, Settings.Global.RADIO_WIFI)) {
            Toast.makeText(mContext, R.string.wifi_in_airplane_mode, Toast.LENGTH_SHORT).show();
+20 −1
Original line number Diff line number Diff line
@@ -52,6 +52,7 @@ import com.android.settings.SubSettings;
import com.android.settings.Utils;
import com.android.settings.core.SubSettingLauncher;
import com.android.settings.network.NetworkProviderSettings;
import com.android.settings.network.SatelliteRepository;
import com.android.settings.network.WifiSwitchPreferenceController;
import com.android.settings.slices.CustomSliceable;
import com.android.settings.slices.SliceBackgroundWorker;
@@ -66,6 +67,10 @@ import com.android.wifitrackerlib.WifiEntry;
import java.util.Arrays;
import java.util.List;
import java.util.Set;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import java.util.stream.Collectors;

/**
@@ -225,7 +230,8 @@ public class WifiSlice implements CustomSliceable {
                .setAccentColor(COLOR_NOT_TINTED)
                .setKeywords(getKeywords())
                .addRow(getHeaderRow(isWifiEnabled, wifiSliceItem));
        if (!isWiFiPermissionGranted || !mWifiRestriction.isChangeWifiStateAllowed(mContext)) {
        if (!isWiFiPermissionGranted || !mWifiRestriction.isChangeWifiStateAllowed(mContext)
                || isSatelliteOn()) {
            return builder;
        }

@@ -416,4 +422,17 @@ public class WifiSlice implements CustomSliceable {
            return WifiEnterpriseRestrictionUtils.isChangeWifiStateAllowed(context);
        }
    }

    private boolean isSatelliteOn() {
        SatelliteRepository satelliteRepository = new SatelliteRepository(mContext);
        boolean isSatelliteOn = false;
        try {
            isSatelliteOn =
                    satelliteRepository.requestIsEnabled(Executors.newSingleThreadExecutor())
                            .get(2000, TimeUnit.MILLISECONDS);
        } catch (ExecutionException | TimeoutException | InterruptedException e) {
            Log.e(TAG, "Error to get satellite status : " + e);
        }
        return isSatelliteOn;
    }
}
+16 −0
Original line number Diff line number Diff line
@@ -18,12 +18,15 @@ package com.android.settings.wifi;

import static com.google.common.truth.Truth.assertThat;

import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

import android.content.Context;
import android.net.ConnectivityManager;
import android.net.wifi.WifiManager;
import android.util.AndroidRuntimeException;

import com.android.settings.testutils.shadow.ShadowRestrictedLockUtilsInternal;
import com.android.settings.widget.SwitchWidgetController;
@@ -65,4 +68,17 @@ public class WifiEnablerTest {

        assertThat(mEnabler.onSwitchToggled(true)).isTrue();
    }

    @Test
    public void onSwitchToggled_satelliteOn_startWarningActivity() {
        mEnabler.mIsSatelliteOn.set(true);

        try {
            mEnabler.onSwitchToggled(true);
        } catch (AndroidRuntimeException e) {
            // Catch exception of starting activity .
        }

        verify(mContext).startActivity(any());
    }
}
Loading