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
This commit is contained in:
CY Cheng
2018-03-26 18:38:59 +08:00
parent 17a463130e
commit fee4807dc0
5 changed files with 158 additions and 56 deletions

View File

@@ -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();
}
}