From c0b39601bf3986eac564ed85916034b26df74d61 Mon Sep 17 00:00:00 2001 From: tomhsu Date: Mon, 6 May 2024 11:37:46 +0000 Subject: [PATCH] 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 (cherry picked from commit 29b2f16edf4a3af2e0dc849dbba4a83ab92e33ae) Merged-In: I45cd92a8688e7a619613361ea4a8d58a0984d99f --- .../AirplaneModePreferenceController.java | 61 +++++++++++++++---- .../network/SatelliteWarningDialogActivity.kt | 2 +- .../android/settings/wifi/WifiEnabler.java | 38 +++++++++++- .../settings/wifi/slice/WifiSlice.java | 21 ++++++- .../settings/wifi/WifiEnablerTest.java | 16 +++++ .../AirplaneModePreferenceControllerTest.java | 23 ++++++- 6 files changed, 141 insertions(+), 20 deletions(-) diff --git a/src/com/android/settings/network/AirplaneModePreferenceController.java b/src/com/android/settings/network/AirplaneModePreferenceController.java index b3fc5177e9d..d73d3fa6d54 100644 --- a/src/com/android/settings/network/AirplaneModePreferenceController.java +++ b/src/com/android/settings/network/AirplaneModePreferenceController.java @@ -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; @@ -37,13 +41,20 @@ import com.android.settings.R; 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; -public class AirplaneModePreferenceController extends TogglePreferenceController - implements LifecycleObserver, OnStart, OnStop, OnDestroy, - AirplaneModeEnabler.OnAirplaneModeChangedListener { +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, OnResume, OnStop, OnDestroy, + AirplaneModeEnabler.OnAirplaneModeChangedListener { + private static final String TAG = AirplaneModePreferenceController.class.getSimpleName(); public static final int REQUEST_CODE_EXIT_ECM = 1; /** @@ -59,12 +70,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); } } @@ -79,17 +93,27 @@ 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 (mFragment != null) { - mFragment.startActivityForResult( - new Intent(TelephonyManager.ACTION_SHOW_NOTICE_ECM_BLOCK_OTHERS, null), - REQUEST_CODE_EXIT_ECM); + if (mAirplaneModeEnabler.isInEcmMode()) { + if (mFragment != null) { + mFragment.startActivityForResult( + new Intent(TelephonyManager.ACTION_SHOW_NOTICE_ECM_BLOCK_OTHERS, null) + REQUEST_CODE_EXIT_ECM); + } + return true; } - 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; } @@ -132,6 +156,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()) { @@ -163,7 +198,7 @@ public class AirplaneModePreferenceController extends TogglePreferenceController @Override public boolean setChecked(boolean isChecked) { - if (isChecked() == isChecked) { + if (isChecked() == isChecked || mIsSatelliteOn.get()) { return false; } if (isAvailable()) { diff --git a/src/com/android/settings/network/SatelliteWarningDialogActivity.kt b/src/com/android/settings/network/SatelliteWarningDialogActivity.kt index a0d494cdef6..0702e4fbc66 100644 --- a/src/com/android/settings/network/SatelliteWarningDialogActivity.kt +++ b/src/com/android/settings/network/SatelliteWarningDialogActivity.kt @@ -41,7 +41,7 @@ class SatelliteWarningDialogActivity : SpaDialogWindowTypeActivity() { } override fun getDialogWindowType(): Int { - return WindowManager.LayoutParams.FIRST_APPLICATION_WINDOW + return WindowManager.LayoutParams.LAST_APPLICATION_WINDOW } @Composable diff --git a/src/com/android/settings/wifi/WifiEnabler.java b/src/com/android/settings/wifi/WifiEnabler.java index 794587de626..d1cf7d679cd 100644 --- a/src/com/android/settings/wifi/WifiEnabler.java +++ b/src/com/android/settings/wifi/WifiEnabler.java @@ -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(); diff --git a/src/com/android/settings/wifi/slice/WifiSlice.java b/src/com/android/settings/wifi/slice/WifiSlice.java index f75fe11953d..599bf6b6d91 100644 --- a/src/com/android/settings/wifi/slice/WifiSlice.java +++ b/src/com/android/settings/wifi/slice/WifiSlice.java @@ -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; + } } diff --git a/tests/robotests/src/com/android/settings/wifi/WifiEnablerTest.java b/tests/robotests/src/com/android/settings/wifi/WifiEnablerTest.java index 65cc8111e36..6980e8ae1bc 100644 --- a/tests/robotests/src/com/android/settings/wifi/WifiEnablerTest.java +++ b/tests/robotests/src/com/android/settings/wifi/WifiEnablerTest.java @@ -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()); + } } diff --git a/tests/unit/src/com/android/settings/network/AirplaneModePreferenceControllerTest.java b/tests/unit/src/com/android/settings/network/AirplaneModePreferenceControllerTest.java index 1d6a62425cf..7612805370a 100644 --- a/tests/unit/src/com/android/settings/network/AirplaneModePreferenceControllerTest.java +++ b/tests/unit/src/com/android/settings/network/AirplaneModePreferenceControllerTest.java @@ -16,10 +16,14 @@ package com.android.settings.network; +import static android.provider.SettingsSlicesContract.KEY_AIRPLANE_MODE; + import static com.google.common.truth.Truth.assertThat; +import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.content.ContentResolver; @@ -28,6 +32,7 @@ import android.content.pm.PackageManager; import android.os.Looper; import android.provider.Settings; import android.provider.SettingsSlicesContract; +import android.util.AndroidRuntimeException; import androidx.preference.PreferenceManager; import androidx.preference.PreferenceScreen; @@ -73,12 +78,12 @@ public class AirplaneModePreferenceControllerTest { mResolver = mContext.getContentResolver(); doReturn(mPackageManager).when(mContext).getPackageManager(); mController = new AirplaneModePreferenceController(mContext, - SettingsSlicesContract.KEY_AIRPLANE_MODE); + KEY_AIRPLANE_MODE); mPreferenceManager = new PreferenceManager(mContext); mScreen = mPreferenceManager.createPreferenceScreen(mContext); mPreference = new RestrictedSwitchPreference(mContext); - mPreference.setKey(SettingsSlicesContract.KEY_AIRPLANE_MODE); + mPreference.setKey(KEY_AIRPLANE_MODE); mScreen.addPreference(mPreference); mController.setFragment(null); } @@ -167,4 +172,18 @@ public class AirplaneModePreferenceControllerTest { public void isPublicSlice_returnsTrue() { assertThat(mController.isPublicSlice()).isTrue(); } + + @Test + public void handlePreferenceTreeClick_satelliteOn_startWarningActivity() { + mController.mIsSatelliteOn.set(true); + when(mAirplaneModeEnabler.isInEcmMode()).thenReturn(false); + + try { + mController.handlePreferenceTreeClick(mPreference); + } catch (AndroidRuntimeException e) { + // Catch exception of starting activity . + } + + verify(mContext).startActivity(any()); + } }