From fee4807dc0b8f6a8ce34b8c0f786a7711501fc14 Mon Sep 17 00:00:00 2001 From: CY Cheng Date: Mon, 26 Mar 2018 18:38:59 +0800 Subject: [PATCH] Refactor airplane mode preference controller. - Convert inheritance from AbstractPreferenceController to TogglePreferenceController. - Register AirplaneModePreferenceController in XML. - Decouple AirplaneModeEnabler with preference, leave the UI be controled by PreferenceController. - Add RoboTests test cases for AirplaneModePreferenceController. Fixes: 67997339 Test: RunSettingsRoboTests Change-Id: I7398943ed51345e014ee7aa774bfae1ca28632f1 --- res/xml/network_and_internet.xml | 1 + .../android/settings/AirplaneModeEnabler.java | 55 ++++++----- .../AirplaneModePreferenceController.java | 56 +++++++---- .../network/NetworkDashboardFragment.java | 6 +- .../AirplaneModePreferenceControllerTest.java | 96 +++++++++++++++++-- 5 files changed, 158 insertions(+), 56 deletions(-) diff --git a/res/xml/network_and_internet.xml b/res/xml/network_and_internet.xml index ee99998d293..064d625681b 100644 --- a/res/xml/network_and_internet.xml +++ b/res/xml/network_and_internet.xml @@ -73,6 +73,7 @@ android:icon="@drawable/ic_airplanemode_active" android:disableDependentsState="true" android:order="5" + settings:controller="com.android.settings.network.AirplaneModePreferenceController" settings:userRestriction="no_airplane_mode"/> buildPreferenceControllers(Context context, Lifecycle lifecycle, MetricsFeatureProvider metricsFeatureProvider, Fragment fragment, MobilePlanPreferenceHost mobilePlanHost) { - final AirplaneModePreferenceController airplaneModePreferenceController = - new AirplaneModePreferenceController(context, fragment); final MobilePlanPreferenceController mobilePlanPreferenceController = new MobilePlanPreferenceController(context, mobilePlanHost); final WifiMasterSwitchPreferenceController wifiPreferenceController = @@ -108,7 +108,6 @@ public class NetworkDashboardFragment extends DashboardFragment implements new PrivateDnsPreferenceController(context); if (lifecycle != null) { - lifecycle.addObserver(airplaneModePreferenceController); lifecycle.addObserver(mobilePlanPreferenceController); lifecycle.addObserver(wifiPreferenceController); lifecycle.addObserver(mobileNetworkPreferenceController); @@ -117,7 +116,6 @@ public class NetworkDashboardFragment extends DashboardFragment implements } final List controllers = new ArrayList<>(); - controllers.add(airplaneModePreferenceController); controllers.add(mobileNetworkPreferenceController); controllers.add(new TetherPreferenceController(context, lifecycle)); controllers.add(vpnPreferenceController); diff --git a/tests/robotests/src/com/android/settings/network/AirplaneModePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/network/AirplaneModePreferenceControllerTest.java index 33eed3eae7d..a255333e535 100644 --- a/tests/robotests/src/com/android/settings/network/AirplaneModePreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/network/AirplaneModePreferenceControllerTest.java @@ -22,13 +22,18 @@ import static org.mockito.Mockito.spy; import static org.mockito.Mockito.when; import android.arch.lifecycle.LifecycleOwner; +import android.content.ContentResolver; import android.content.Context; import android.content.pm.PackageManager; +import android.provider.Settings; +import android.support.v7.preference.PreferenceManager; import android.support.v7.preference.PreferenceScreen; +import com.android.settings.core.BasePreferenceController; import com.android.settings.testutils.FakeFeatureFactory; import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settingslib.core.lifecycle.Lifecycle; +import com.android.settingslib.RestrictedSwitchPreference; import org.junit.Before; import org.junit.Test; @@ -41,13 +46,17 @@ import org.robolectric.annotation.Config; @RunWith(SettingsRobolectricTestRunner.class) public class AirplaneModePreferenceControllerTest { - @Mock - private PreferenceScreen mScreen; + private static final int ON = 1; + private static final int OFF = 0; @Mock private PackageManager mPackageManager; private Context mContext; + private ContentResolver mResolver; + private PreferenceManager mPreferenceManager; + private PreferenceScreen mScreen; + private RestrictedSwitchPreference mPreference; private AirplaneModePreferenceController mController; private LifecycleOwner mLifecycleOwner; private Lifecycle mLifecycle; @@ -57,8 +66,17 @@ public class AirplaneModePreferenceControllerTest { MockitoAnnotations.initMocks(this); FakeFeatureFactory.setupForTest(); mContext = spy(RuntimeEnvironment.application); + mResolver = RuntimeEnvironment.application.getContentResolver(); doReturn(mPackageManager).when(mContext).getPackageManager(); - mController = spy(new AirplaneModePreferenceController(mContext, null)); + mController = new AirplaneModePreferenceController(mContext, + AirplaneModePreferenceController.KEY_TOGGLE_AIRPLANE); + + mPreferenceManager = new PreferenceManager(mContext); + mScreen = mPreferenceManager.createPreferenceScreen(mContext); + mPreference = new RestrictedSwitchPreference(mContext); + mPreference.setKey("toggle_airplane"); + mScreen.addPreference(mPreference); + mController.setFragment(null); mLifecycleOwner = () -> mLifecycle; mLifecycle = new Lifecycle(mLifecycleOwner); mLifecycle.addObserver(mController); @@ -67,7 +85,8 @@ public class AirplaneModePreferenceControllerTest { @Test @Config(qualifiers = "mcc999") public void airplaneModePreference_shouldNotBeAvailable_ifSetToNotVisible() { - assertThat(mController.isAvailable()).isFalse(); + assertThat(mController.getAvailabilityStatus()) + .isNotEqualTo(BasePreferenceController.AVAILABLE); mController.displayPreference(mScreen); @@ -79,7 +98,8 @@ public class AirplaneModePreferenceControllerTest { @Test public void airplaneModePreference_shouldNotBeAvailable_ifHasLeanbackFeature() { when(mPackageManager.hasSystemFeature(PackageManager.FEATURE_LEANBACK)).thenReturn(true); - assertThat(mController.isAvailable()).isFalse(); + assertThat(mController.getAvailabilityStatus()) + .isNotEqualTo(BasePreferenceController.AVAILABLE); mController.displayPreference(mScreen); @@ -91,6 +111,70 @@ public class AirplaneModePreferenceControllerTest { @Test public void airplaneModePreference_shouldBeAvailable_ifNoLeanbackFeature() { when(mPackageManager.hasSystemFeature(PackageManager.FEATURE_LEANBACK)).thenReturn(false); - assertThat(mController.isAvailable()).isTrue(); + assertThat(mController.getAvailabilityStatus()) + .isEqualTo(BasePreferenceController.AVAILABLE); + } + + @Test + public void airplaneModePreference_testSetValue_updatesCorrectly() { + // Airplane mode default off + Settings.Global.putInt(mResolver, Settings.Global.AIRPLANE_MODE_ON, OFF); + + mController.displayPreference(mScreen); + mController.onResume(); + + assertThat(mPreference.isChecked()).isFalse(); + + assertThat(mController.isChecked()).isFalse(); + + // Set airplane mode ON by setChecked + boolean updated = mController.setChecked(true); + assertThat(updated).isTrue(); + + // Check return value if set same status. + updated = mController.setChecked(true); + assertThat(updated).isFalse(); + + // UI is updated + assertThat(mPreference.isChecked()).isTrue(); + + // Settings status changed. + int updatedValue = Settings.Global.getInt(mResolver, Settings.Global.AIRPLANE_MODE_ON, OFF); + assertThat(updatedValue).isEqualTo(ON); + + // Set to OFF + assertThat(mController.setChecked(false)).isTrue(); + assertThat(mPreference.isChecked()).isFalse(); + updatedValue = Settings.Global.getInt(mResolver, Settings.Global.AIRPLANE_MODE_ON, OFF); + assertThat(updatedValue).isEqualTo(OFF); + } + + @Test + public void airplaneModePreference_testGetValue_correctValueReturned() { + // Set airplane mode ON + Settings.Global.putInt(mResolver, Settings.Global.AIRPLANE_MODE_ON, ON); + + mController.displayPreference(mScreen); + mController.onResume(); + + assertThat(mController.isChecked()).isTrue(); + + Settings.Global.putInt(mResolver, Settings.Global.AIRPLANE_MODE_ON, OFF); + assertThat(mController.isChecked()).isFalse(); + } + + @Test + public void airplaneModePreference_testPreferenceUI_updatesCorrectly() { + // Airplane mode default off + Settings.Global.putInt(mResolver, Settings.Global.AIRPLANE_MODE_ON, OFF); + + mController.displayPreference(mScreen); + mController.onResume(); + + assertThat(mPreference.isChecked()).isFalse(); + + mController.onAirplaneModeChanged(true); + + assertThat(mPreference.isChecked()).isTrue(); } }