diff --git a/res/xml/network_and_internet.xml b/res/xml/network_and_internet.xml index 6758e7e73db..a28b1e6b268 100644 --- a/res/xml/network_and_internet.xml +++ b/res/xml/network_and_internet.xml @@ -37,7 +37,6 @@ android:title="@string/network_settings_title" android:summary="@string/summary_placeholder" android:icon="@drawable/ic_network_cell" - android:dependency="toggle_airplane" android:order="-15" settings:keywords="@string/keywords_more_mobile_networks" settings:userRestriction="no_config_mobile_networks" diff --git a/src/com/android/settings/network/MobileNetworkPreferenceController.java b/src/com/android/settings/network/MobileNetworkPreferenceController.java index 09f0f8b2440..f3129dd8eea 100644 --- a/src/com/android/settings/network/MobileNetworkPreferenceController.java +++ b/src/com/android/settings/network/MobileNetworkPreferenceController.java @@ -18,8 +18,12 @@ package com.android.settings.network; import static android.os.UserHandle.myUserId; import static android.os.UserManager.DISALLOW_CONFIG_MOBILE_NETWORKS; +import android.content.BroadcastReceiver; import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; import android.os.UserManager; +import android.provider.Settings; import android.support.annotation.VisibleForTesting; import android.support.v7.preference.Preference; import android.support.v7.preference.PreferenceScreen; @@ -29,6 +33,7 @@ import android.telephony.TelephonyManager; import com.android.settings.core.PreferenceControllerMixin; import com.android.settings.wrapper.RestrictedLockUtilsWrapper; +import com.android.settingslib.RestrictedPreference; import com.android.settingslib.Utils; import com.android.settingslib.core.AbstractPreferenceController; import com.android.settingslib.core.lifecycle.LifecycleObserver; @@ -47,11 +52,20 @@ public class MobileNetworkPreferenceController extends AbstractPreferenceControl @VisibleForTesting PhoneStateListener mPhoneStateListener; + private BroadcastReceiver mAirplanModeChangedReceiver; + public MobileNetworkPreferenceController(Context context) { super(context); mUserManager = (UserManager) context.getSystemService(Context.USER_SERVICE); mTelephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); mIsSecondaryUser = !mUserManager.isAdminUser(); + + mAirplanModeChangedReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + updateState(mPreference); + } + }; } @Override @@ -92,6 +106,10 @@ public class MobileNetworkPreferenceController extends AbstractPreferenceControl } mTelephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_SERVICE_STATE); } + if (mAirplanModeChangedReceiver != null) { + mContext.registerReceiver(mAirplanModeChangedReceiver, + new IntentFilter(Intent.ACTION_AIRPLANE_MODE_CHANGED)); + } } @Override @@ -99,6 +117,21 @@ public class MobileNetworkPreferenceController extends AbstractPreferenceControl if (mPhoneStateListener != null) { mTelephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_NONE); } + if (mAirplanModeChangedReceiver != null) { + mContext.unregisterReceiver(mAirplanModeChangedReceiver); + } + } + + @Override + public void updateState(Preference preference) { + super.updateState(preference); + + if (preference instanceof RestrictedPreference && + ((RestrictedPreference) preference).isDisabledByAdmin()) { + return; + } + preference.setEnabled(Settings.Global.getInt( + mContext.getContentResolver(), Settings.Global.AIRPLANE_MODE_ON, 0) == 0); } @Override diff --git a/tests/robotests/src/com/android/settings/network/MobileNetworkPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/network/MobileNetworkPreferenceControllerTest.java index dfcd66162e5..6b8c0f789fd 100644 --- a/tests/robotests/src/com/android/settings/network/MobileNetworkPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/network/MobileNetworkPreferenceControllerTest.java @@ -29,6 +29,8 @@ import android.arch.lifecycle.LifecycleOwner; import android.content.Context; import android.net.ConnectivityManager; import android.os.UserManager; +import android.provider.Settings; +import android.provider.Settings.Global; import android.support.v7.preference.Preference; import android.support.v7.preference.PreferenceScreen; import android.telephony.PhoneStateListener; @@ -38,6 +40,8 @@ import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settings.testutils.shadow.ShadowConnectivityManager; import com.android.settings.testutils.shadow.ShadowRestrictedLockUtilsWrapper; import com.android.settings.testutils.shadow.ShadowUserManager; +import com.android.settingslib.RestrictedLockUtils.EnforcedAdmin; +import com.android.settingslib.RestrictedPreference; import com.android.settingslib.core.lifecycle.Lifecycle; import org.junit.Before; @@ -138,4 +142,36 @@ public class MobileNetworkPreferenceControllerTest { // Carrier name should be set. verify(mPreference).setSummary(testCarrierName); } + + @Test + public void airplaneModeTurnedOn_shouldDisablePreference() { + Settings.Global.putInt(mContext.getContentResolver(), + Global.AIRPLANE_MODE_ON, 1); + mController = spy(new MobileNetworkPreferenceController(mContext)); + final RestrictedPreference mPreference = new RestrictedPreference(mContext); + mController.updateState(mPreference); + assertThat(mPreference.isEnabled()).isFalse(); + } + + @Test + public void airplaneModeTurnedOffAndNoUserRestriction_shouldEnablePreference() { + Settings.Global.putInt(mContext.getContentResolver(), + Global.AIRPLANE_MODE_ON, 0); + mController = spy(new MobileNetworkPreferenceController(mContext)); + final RestrictedPreference mPreference = new RestrictedPreference(mContext); + mPreference.setDisabledByAdmin(null); + mController.updateState(mPreference); + assertThat(mPreference.isEnabled()).isTrue(); + } + + @Test + public void airplaneModeTurnedOffAndHasUserRestriction_shouldDisablePreference() { + Settings.Global.putInt(mContext.getContentResolver(), + Global.AIRPLANE_MODE_ON, 0); + mController = spy(new MobileNetworkPreferenceController(mContext)); + final RestrictedPreference mPreference = new RestrictedPreference(mContext); + mPreference.setDisabledByAdmin(EnforcedAdmin.MULTIPLE_ENFORCED_ADMIN); + mController.updateState(mPreference); + assertThat(mPreference.isEnabled()).isFalse(); + } }