OSDN Git Service

Disallow_airplane_mode should not disable mobile network.
authoryuemingw <yuemingw@google.com>
Tue, 27 Mar 2018 15:56:24 +0000 (16:56 +0100)
committeryuemingw <yuemingw@google.com>
Thu, 29 Mar 2018 13:34:33 +0000 (14:34 +0100)
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

res/xml/network_and_internet.xml
src/com/android/settings/network/MobileNetworkPreferenceController.java
tests/robotests/src/com/android/settings/network/MobileNetworkPreferenceControllerTest.java

index 6758e7e..a28b1e6 100644 (file)
@@ -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"
index 09f0f8b..f3129dd 100644 (file)
@@ -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
index dfcd661..6b8c0f7 100644 (file)
@@ -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();
+    }
 }