1 /* 2 * Copyright (C) 2017 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.settings.network; 18 19 import static com.google.common.truth.Truth.assertThat; 20 import static org.mockito.Mockito.doReturn; 21 import static org.mockito.Mockito.spy; 22 import static org.mockito.Mockito.when; 23 24 import android.arch.lifecycle.LifecycleOwner; 25 import android.content.ContentResolver; 26 import android.content.Context; 27 import android.content.pm.PackageManager; 28 import android.provider.Settings; 29 import android.provider.SettingsSlicesContract; 30 import android.support.v7.preference.PreferenceManager; 31 import android.support.v7.preference.PreferenceScreen; 32 33 import com.android.settings.core.BasePreferenceController; 34 import com.android.settings.testutils.FakeFeatureFactory; 35 import com.android.settings.testutils.SettingsRobolectricTestRunner; 36 import com.android.settingslib.core.lifecycle.Lifecycle; 37 import com.android.settingslib.RestrictedSwitchPreference; 38 39 import org.junit.Before; 40 import org.junit.Test; 41 import org.junit.runner.RunWith; 42 import org.mockito.Mock; 43 import org.mockito.MockitoAnnotations; 44 import org.robolectric.RuntimeEnvironment; 45 import org.robolectric.annotation.Config; 46 47 @RunWith(SettingsRobolectricTestRunner.class) 48 public class AirplaneModePreferenceControllerTest { 49 50 private static final int ON = 1; 51 private static final int OFF = 0; 52 53 @Mock 54 private PackageManager mPackageManager; 55 56 private Context mContext; 57 private ContentResolver mResolver; 58 private PreferenceManager mPreferenceManager; 59 private PreferenceScreen mScreen; 60 private RestrictedSwitchPreference mPreference; 61 private AirplaneModePreferenceController mController; 62 private LifecycleOwner mLifecycleOwner; 63 private Lifecycle mLifecycle; 64 65 @Before 66 public void setUp() { 67 MockitoAnnotations.initMocks(this); 68 FakeFeatureFactory.setupForTest(); 69 mContext = spy(RuntimeEnvironment.application); 70 mResolver = RuntimeEnvironment.application.getContentResolver(); 71 doReturn(mPackageManager).when(mContext).getPackageManager(); 72 mController = new AirplaneModePreferenceController(mContext, 73 SettingsSlicesContract.KEY_AIRPLANE_MODE); 74 75 mPreferenceManager = new PreferenceManager(mContext); 76 mScreen = mPreferenceManager.createPreferenceScreen(mContext); 77 mPreference = new RestrictedSwitchPreference(mContext); 78 mPreference.setKey(SettingsSlicesContract.KEY_AIRPLANE_MODE); 79 mScreen.addPreference(mPreference); 80 mController.setFragment(null); 81 mLifecycleOwner = () -> mLifecycle; 82 mLifecycle = new Lifecycle(mLifecycleOwner); 83 mLifecycle.addObserver(mController); 84 } 85 86 @Test 87 @Config(qualifiers = "mcc999") 88 public void airplaneModePreference_shouldNotBeAvailable_ifSetToNotVisible() { 89 assertThat(mController.getAvailabilityStatus()) 90 .isNotEqualTo(BasePreferenceController.AVAILABLE); 91 92 mController.displayPreference(mScreen); 93 94 // This should not crash 95 mController.onResume(); 96 mController.onPause(); 97 } 98 99 @Test 100 public void airplaneModePreference_shouldNotBeAvailable_ifHasLeanbackFeature() { 101 when(mPackageManager.hasSystemFeature(PackageManager.FEATURE_LEANBACK)).thenReturn(true); 102 assertThat(mController.getAvailabilityStatus()) 103 .isNotEqualTo(BasePreferenceController.AVAILABLE); 104 105 mController.displayPreference(mScreen); 106 107 // This should not crash 108 mController.onResume(); 109 mController.onPause(); 110 } 111 112 @Test 113 public void airplaneModePreference_shouldBeAvailable_ifNoLeanbackFeature() { 114 when(mPackageManager.hasSystemFeature(PackageManager.FEATURE_LEANBACK)).thenReturn(false); 115 assertThat(mController.getAvailabilityStatus()) 116 .isEqualTo(BasePreferenceController.AVAILABLE); 117 } 118 119 @Test 120 public void airplaneModePreference_testSetValue_updatesCorrectly() { 121 // Airplane mode default off 122 Settings.Global.putInt(mResolver, Settings.Global.AIRPLANE_MODE_ON, OFF); 123 124 mController.displayPreference(mScreen); 125 mController.onResume(); 126 127 assertThat(mPreference.isChecked()).isFalse(); 128 129 assertThat(mController.isChecked()).isFalse(); 130 131 // Set airplane mode ON by setChecked 132 boolean updated = mController.setChecked(true); 133 assertThat(updated).isTrue(); 134 135 // Check return value if set same status. 136 updated = mController.setChecked(true); 137 assertThat(updated).isFalse(); 138 139 // UI is updated 140 assertThat(mPreference.isChecked()).isTrue(); 141 142 // Settings status changed. 143 int updatedValue = Settings.Global.getInt(mResolver, Settings.Global.AIRPLANE_MODE_ON, OFF); 144 assertThat(updatedValue).isEqualTo(ON); 145 146 // Set to OFF 147 assertThat(mController.setChecked(false)).isTrue(); 148 assertThat(mPreference.isChecked()).isFalse(); 149 updatedValue = Settings.Global.getInt(mResolver, Settings.Global.AIRPLANE_MODE_ON, OFF); 150 assertThat(updatedValue).isEqualTo(OFF); 151 } 152 153 @Test 154 public void airplaneModePreference_testGetValue_correctValueReturned() { 155 // Set airplane mode ON 156 Settings.Global.putInt(mResolver, Settings.Global.AIRPLANE_MODE_ON, ON); 157 158 mController.displayPreference(mScreen); 159 mController.onResume(); 160 161 assertThat(mController.isChecked()).isTrue(); 162 163 Settings.Global.putInt(mResolver, Settings.Global.AIRPLANE_MODE_ON, OFF); 164 assertThat(mController.isChecked()).isFalse(); 165 } 166 167 @Test 168 public void airplaneModePreference_testPreferenceUI_updatesCorrectly() { 169 // Airplane mode default off 170 Settings.Global.putInt(mResolver, Settings.Global.AIRPLANE_MODE_ON, OFF); 171 172 mController.displayPreference(mScreen); 173 mController.onResume(); 174 175 assertThat(mPreference.isChecked()).isFalse(); 176 177 mController.onAirplaneModeChanged(true); 178 179 assertThat(mPreference.isChecked()).isTrue(); 180 } 181 182 @Test 183 public void isSliceableCorrectKey_returnsTrue() { 184 final AirplaneModePreferenceController controller = 185 new AirplaneModePreferenceController(mContext,"toggle_airplane"); 186 assertThat(controller.isSliceable()).isTrue(); 187 } 188 189 @Test 190 public void isSliceableIncorrectKey_returnsFalse() { 191 final AirplaneModePreferenceController controller = 192 new AirplaneModePreferenceController(mContext, "bad_key"); 193 assertThat(controller.isSliceable()).isFalse(); 194 } 195 } 196