Fixed wifi status preference to update itself when initialized. When
wifi disabled, preference displays an about icon and is unselectable.
Bug: 146516398, 148543036
Test: Robolectric, manual
Change-Id: I45e5d68559f869330d167f27bb4894000cc91737
Merged-In: I45e5d68559f869330d167f27bb4894000cc91737
diff --git a/src/com/android/car/settings/wifi/WifiStatusPreferenceController.java b/src/com/android/car/settings/wifi/WifiStatusPreferenceController.java
index 4bc0b56..8ae4b58 100644
--- a/src/com/android/car/settings/wifi/WifiStatusPreferenceController.java
+++ b/src/com/android/car/settings/wifi/WifiStatusPreferenceController.java
@@ -41,18 +41,31 @@
}
@Override
- public void onWifiStateChanged(int state) {
- switch (state) {
- case WifiManager.WIFI_STATE_DISABLED:
- getPreference().setVisible(true);
- getPreference().setTitle(R.string.wifi_disabled);
- break;
- case WifiManager.WIFI_STATE_ENABLING:
- getPreference().setVisible(true);
- getPreference().setTitle(R.string.loading_wifi_list);
- break;
- default:
- getPreference().setVisible(false);
+ protected void updateState(Preference preference) {
+ CarWifiManager manager = getCarWifiManager();
+ if (manager != null) {
+ switch (manager.getWifiState()) {
+ case WifiManager.WIFI_STATE_DISABLED:
+ getPreference().setVisible(true);
+ getPreference().setTitle(R.string.wifi_disabled);
+ getPreference().setSelectable(false);
+ getPreference().setIcon(R.drawable.ic_settings_about);
+ break;
+ case WifiManager.WIFI_STATE_ENABLING:
+ getPreference().setVisible(true);
+ getPreference().setTitle(R.string.loading_wifi_list);
+ getPreference().setSelectable(true);
+ getPreference().setIcon(null);
+ break;
+ default:
+ getPreference().setVisible(false);
+ }
}
}
+
+ @Override
+ public void onWifiStateChanged(int state) {
+ refreshUi();
+ }
+
}
diff --git a/tests/robotests/src/com/android/car/settings/testutils/ShadowCarWifiManager.java b/tests/robotests/src/com/android/car/settings/testutils/ShadowCarWifiManager.java
index e07116a..0fd2657 100644
--- a/tests/robotests/src/com/android/car/settings/testutils/ShadowCarWifiManager.java
+++ b/tests/robotests/src/com/android/car/settings/testutils/ShadowCarWifiManager.java
@@ -29,7 +29,7 @@
import java.util.List;
-/** TODO: Refactor all methods to run without relying on sInstance. */
+/** TODO(b/148971715): Refactor all methods to run without relying on sInstance. */
@Implements(CarWifiManager.class)
public class ShadowCarWifiManager {
@@ -43,6 +43,7 @@
private static WifiConfiguration sWifiConfiguration = new WifiConfiguration();
private static boolean sIsDualModeSupported = true;
private static boolean sIsDualBandSupported = true;
+ private static int sWifiState = WifiManager.WIFI_STATE_UNKNOWN;
public static void setInstance(CarWifiManager wifiManager) {
sInstance = wifiManager;
@@ -55,6 +56,7 @@
sCurrentState = STATE_UNKNOWN;
sIsDualModeSupported = true;
sIsDualBandSupported = true;
+ sWifiState = WifiManager.WIFI_STATE_UNKNOWN;
}
@Implementation
@@ -63,25 +65,16 @@
@Implementation
public void start() {
- if (sInstance != null) {
- sInstance.start();
- }
sCurrentState = STATE_STARTED;
}
@Implementation
public void stop() {
- if (sInstance != null) {
- sInstance.stop();
- }
sCurrentState = STATE_STOPPED;
}
@Implementation
public void destroy() {
- if (sInstance != null) {
- sInstance.destroy();
- }
sCurrentState = STATE_DESTROYED;
}
@@ -106,6 +99,15 @@
}
@Implementation
+ public int getWifiState() {
+ return sWifiState;
+ }
+
+ public static void setWifiState(int wifiState) {
+ sWifiState = wifiState;
+ }
+
+ @Implementation
public boolean isWifiApEnabled() {
return sInstance.isWifiApEnabled();
}
diff --git a/tests/robotests/src/com/android/car/settings/wifi/WifiStatusPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/wifi/WifiStatusPreferenceControllerTest.java
index 32692dd..dce15ed 100644
--- a/tests/robotests/src/com/android/car/settings/wifi/WifiStatusPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/wifi/WifiStatusPreferenceControllerTest.java
@@ -19,24 +19,30 @@
import static com.google.common.truth.Truth.assertThat;
import android.content.Context;
+import android.content.pm.PackageManager;
import android.net.wifi.WifiManager;
-import androidx.lifecycle.Lifecycle;
+import androidx.lifecycle.Lifecycle.Event;
import androidx.preference.Preference;
import com.android.car.settings.CarSettingsRobolectricTestRunner;
import com.android.car.settings.R;
import com.android.car.settings.common.PreferenceControllerTestHelper;
+import com.android.car.settings.testutils.ShadowCarWifiManager;
+import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RuntimeEnvironment;
+import org.robolectric.Shadows;
+import org.robolectric.annotation.Config;
import java.util.Arrays;
import java.util.List;
@RunWith(CarSettingsRobolectricTestRunner.class)
+@Config(shadows = {ShadowCarWifiManager.class})
public class WifiStatusPreferenceControllerTest {
private static final List<Integer> VISIBLE_STATES = Arrays.asList(
WifiManager.WIFI_STATE_DISABLED,
@@ -53,17 +59,75 @@
@Before
public void setUp() {
mContext = RuntimeEnvironment.application;
+ Shadows.shadowOf(mContext.getPackageManager()).setSystemFeature(
+ PackageManager.FEATURE_WIFI, true);
mPreference = new Preference(mContext);
PreferenceControllerTestHelper<WifiStatusPreferenceController> controllerHelper =
new PreferenceControllerTestHelper<>(mContext,
WifiStatusPreferenceController.class, mPreference);
mController = controllerHelper.getController();
- controllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_CREATE);
+ ShadowCarWifiManager.setInstance(new CarWifiManager(mContext));
+ controllerHelper.sendLifecycleEvent(Event.ON_CREATE);
+ }
+
+ @After
+ public void tearDown() {
+ ShadowCarWifiManager.reset();
+ }
+
+ @Test
+ public void updateState_wifiNotAvailable_invisible() {
+ ShadowCarWifiManager.setWifiState(WifiManager.WIFI_STATE_UNKNOWN);
+
+ mController.refreshUi();
+
+ assertThat(mPreference.isVisible()).isFalse();
+ }
+
+ @Test
+ public void updateState_wifiDisabled_visible() {
+ ShadowCarWifiManager.setWifiState(WifiManager.WIFI_STATE_DISABLED);
+
+ mController.refreshUi();
+
+ assertThat(mPreference.isVisible()).isTrue();
+ }
+
+ @Test
+ public void updateState_wifiDisabled_isNotSelectable() {
+ ShadowCarWifiManager.setWifiState(WifiManager.WIFI_STATE_DISABLED);
+
+ mController.refreshUi();
+
+ assertThat(mPreference.isSelectable()).isFalse();
+ }
+
+ @Test
+ public void updateState_wifiDisabled_showsDisabledText() {
+ ShadowCarWifiManager.setWifiState(WifiManager.WIFI_STATE_DISABLED);
+
+ mController.refreshUi();
+
+ assertThat(mPreference.getTitle())
+ .isEqualTo(mContext.getResources().getString(R.string.wifi_disabled));
+ }
+
+ @Test
+ public void updateState_wifiDisabled_showsIcon() {
+ ShadowCarWifiManager.setWifiState(WifiManager.WIFI_STATE_DISABLED);
+
+ mController.refreshUi();
+
+ assertThat(mPreference.getIcon()).isEqualTo(
+ mContext.getResources().getDrawable(R.drawable.ic_settings_about,
+ mContext.getTheme())
+ );
}
@Test
public void onWifiStateChanged_invisible() {
for (int state : INVISIBLE_STATES) {
+ ShadowCarWifiManager.setWifiState(state);
mController.onWifiStateChanged(state);
assertThat(mPreference.isVisible()).isEqualTo(false);
}
@@ -72,6 +136,7 @@
@Test
public void onWifiStateChanged_visible() {
for (int state : VISIBLE_STATES) {
+ ShadowCarWifiManager.setWifiState(state);
mController.onWifiStateChanged(state);
assertThat(mPreference.isVisible()).isEqualTo(true);
}
@@ -79,14 +144,24 @@
@Test
public void onWifiStateChanged_disabled() {
- mController.onWifiStateChanged(WifiManager.WIFI_STATE_DISABLED);
+ int state = WifiManager.WIFI_STATE_DISABLED;
+ ShadowCarWifiManager.setWifiState(state);
+ mController.onWifiStateChanged(state);
+
+ assertThat(mPreference.isSelectable()).isFalse();
+ assertThat(mPreference.getIcon()).isNotNull();
assertThat(mPreference.getTitle())
.isEqualTo(mContext.getResources().getString(R.string.wifi_disabled));
}
@Test
public void onWifiStateChanged_enabling() {
- mController.onWifiStateChanged(WifiManager.WIFI_STATE_ENABLING);
+ int state = WifiManager.WIFI_STATE_ENABLING;
+ ShadowCarWifiManager.setWifiState(state);
+ mController.onWifiStateChanged(state);
+
+ assertThat(mPreference.isSelectable()).isTrue();
+ assertThat(mPreference.getIcon()).isNull();
assertThat(mPreference.getTitle())
.isEqualTo(mContext.getResources().getString(R.string.loading_wifi_list));
}