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