Loading src/com/android/settings/network/AirplaneModePreferenceController.java +48 −13 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading @@ -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; /** Loading @@ -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); } } Loading @@ -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) Loading @@ -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; } Loading Loading @@ -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()) { Loading Loading @@ -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()) { Loading src/com/android/settings/network/SatelliteWarningDialogActivity.kt +1 −1 Original line number Diff line number Diff line Loading @@ -41,7 +41,7 @@ class SatelliteWarningDialogActivity : SpaDialogWindowTypeActivity() { } override fun getDialogWindowType(): Int { return WindowManager.LayoutParams.FIRST_APPLICATION_WINDOW return WindowManager.LayoutParams.LAST_APPLICATION_WINDOW } @Composable Loading src/com/android/settings/wifi/WifiEnabler.java +35 −3 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading @@ -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; Loading Loading @@ -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(); } Loading Loading @@ -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() { Loading Loading @@ -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(); Loading src/com/android/settings/wifi/slice/WifiSlice.java +20 −1 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; /** Loading Loading @@ -228,7 +233,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; } Loading Loading @@ -419,4 +425,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; } } tests/robotests/src/com/android/settings/wifi/WifiEnablerTest.java +16 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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
src/com/android/settings/network/AirplaneModePreferenceController.java +48 −13 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading @@ -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; /** Loading @@ -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); } } Loading @@ -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) Loading @@ -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; } Loading Loading @@ -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()) { Loading Loading @@ -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()) { Loading
src/com/android/settings/network/SatelliteWarningDialogActivity.kt +1 −1 Original line number Diff line number Diff line Loading @@ -41,7 +41,7 @@ class SatelliteWarningDialogActivity : SpaDialogWindowTypeActivity() { } override fun getDialogWindowType(): Int { return WindowManager.LayoutParams.FIRST_APPLICATION_WINDOW return WindowManager.LayoutParams.LAST_APPLICATION_WINDOW } @Composable Loading
src/com/android/settings/wifi/WifiEnabler.java +35 −3 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading @@ -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; Loading Loading @@ -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(); } Loading Loading @@ -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() { Loading Loading @@ -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(); Loading
src/com/android/settings/wifi/slice/WifiSlice.java +20 −1 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; /** Loading Loading @@ -228,7 +233,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; } Loading Loading @@ -419,4 +425,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; } }
tests/robotests/src/com/android/settings/wifi/WifiEnablerTest.java +16 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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()); } }