Found mobile_network_settings preference is dependent on toggle_airplane
preference so once Disallow_airplane_mode is turned on, toggle_airplane
preference will be set disabled, and mobile_network_settings preference
is also set disabled because of the dependence. Can fix this bug moving
the dependance and let MobileNetworkPreferenceController listen to
Settings.Global.AIRPLANE_MODE_ON.
Bug:
76468718
Test: manually but TestDpc
Change-Id: I137938766557d7bc5ae0795bc3359a6bfbae17e3
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"
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;
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;
@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
}
mTelephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_SERVICE_STATE);
}
+ if (mAirplanModeChangedReceiver != null) {
+ mContext.registerReceiver(mAirplanModeChangedReceiver,
+ new IntentFilter(Intent.ACTION_AIRPLANE_MODE_CHANGED));
+ }
}
@Override
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
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;
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;
// 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();
+ }
}