From a2559ab1289f28bf111ec8c6921d566a3fd17308 Mon Sep 17 00:00:00 2001 From: Antony Sargent Date: Mon, 11 Sep 2017 16:43:58 -0700 Subject: [PATCH] Prevent brief flash of "Error" in hotspot status text When toggling the master preference to turn on wifi hotspot, it briefly changes the status text to "Error" because we have a catch-all in a function monitoring wifi state changes for unexpected status codes, and we weren't expecting to see the status of WIFI_AP_STATE_ENABLING before the status of WIFI_AP_STATE_ENABLED. Bug: 64811203 Test: make RunSettingsRoboTests Change-Id: Ifba7abadbfba9ce93cc524b17232c65570f0f428 --- .../WifiTetherPreferenceController.java | 1 + .../WifiTetherPreferenceControllerTest.java | 43 +++++++++++++------ 2 files changed, 32 insertions(+), 12 deletions(-) diff --git a/src/com/android/settings/wifi/tether/WifiTetherPreferenceController.java b/src/com/android/settings/wifi/tether/WifiTetherPreferenceController.java index afc3a29909d..87adf73f561 100644 --- a/src/com/android/settings/wifi/tether/WifiTetherPreferenceController.java +++ b/src/com/android/settings/wifi/tether/WifiTetherPreferenceController.java @@ -139,6 +139,7 @@ public class WifiTetherPreferenceController extends AbstractPreferenceController private void handleWifiApStateChanged(int state, int reason) { switch (state) { + case WifiManager.WIFI_AP_STATE_ENABLING: case WifiManager.WIFI_AP_STATE_ENABLED: /** * Summary on enable is handled by tether diff --git a/tests/robotests/src/com/android/settings/wifi/tether/WifiTetherPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/wifi/tether/WifiTetherPreferenceControllerTest.java index 860a9148d1f..a23347abbbc 100644 --- a/tests/robotests/src/com/android/settings/wifi/tether/WifiTetherPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/wifi/tether/WifiTetherPreferenceControllerTest.java @@ -161,12 +161,7 @@ public class WifiTetherPreferenceControllerTest { @Test public void testReceiver_apStateChangedToDisabled_shouldUpdatePreferenceSummary() { mController.displayPreference(mScreen); - final BroadcastReceiver receiver = ReflectionHelpers.getField(mController, "mReceiver"); - final Intent broadcast = new Intent(WifiManager.WIFI_AP_STATE_CHANGED_ACTION); - broadcast.putExtra(WifiManager.EXTRA_WIFI_AP_STATE, WifiManager.WIFI_AP_STATE_DISABLED); - - receiver.onReceive(RuntimeEnvironment.application, broadcast); - + receiveApStateChangedBroadcast(WifiManager.WIFI_AP_STATE_DISABLED); assertThat(mPreference.getSummary().toString()).isEqualTo( RuntimeEnvironment.application.getString(R.string.wifi_hotspot_off_subtext)); } @@ -174,16 +169,28 @@ public class WifiTetherPreferenceControllerTest { @Test public void testReceiver_apStateChangedToDisabling_shouldUpdatePreferenceSummary() { mController.displayPreference(mScreen); - final BroadcastReceiver receiver = ReflectionHelpers.getField(mController, "mReceiver"); - final Intent broadcast = new Intent(WifiManager.WIFI_AP_STATE_CHANGED_ACTION); - broadcast.putExtra(WifiManager.EXTRA_WIFI_AP_STATE, WifiManager.WIFI_AP_STATE_DISABLING); - - receiver.onReceive(RuntimeEnvironment.application, broadcast); - + receiveApStateChangedBroadcast(WifiManager.WIFI_AP_STATE_DISABLING); assertThat(mPreference.getSummary().toString()).isEqualTo( RuntimeEnvironment.application.getString(R.string.wifi_tether_stopping)); } + @Test + public void testReceiver_apStateChangedToEnablingOrEnabled_shouldNotUpdatePreferenceSummary() { + mController.displayPreference(mScreen); + receiveApStateChangedBroadcast(WifiManager.WIFI_AP_STATE_DISABLED); + assertThat(mPreference.getSummary().toString()).isEqualTo( + RuntimeEnvironment.application.getString(R.string.wifi_hotspot_off_subtext)); + + // When turning on the hotspot, we receive STATE_ENABLING followed by STATE_ENABLED. Neither + // of these should change the summary. + receiveApStateChangedBroadcast(WifiManager.WIFI_AP_STATE_ENABLING); + assertThat(mPreference.getSummary().toString()).isEqualTo( + RuntimeEnvironment.application.getString(R.string.wifi_hotspot_off_subtext)); + receiveApStateChangedBroadcast(WifiManager.WIFI_AP_STATE_ENABLED); + assertThat(mPreference.getSummary().toString()).isEqualTo( + RuntimeEnvironment.application.getString(R.string.wifi_hotspot_off_subtext)); + } + @Test public void testReceiver_goingToAirplaneMode_shouldClearPreferenceSummary() { final ContentResolver cr = mock(ContentResolver.class); @@ -248,4 +255,16 @@ public class WifiTetherPreferenceControllerTest { onStopCalled = true; } } + + /** + * Helper to cause the controller to receive a WIFI_AP_STATE_CHANGED_ACTION with a specific + * state. + * @param state - the state, as specified by one of the WifiManager.WIFI_AP_STATE_* values + */ + private void receiveApStateChangedBroadcast(int state) { + final BroadcastReceiver receiver = ReflectionHelpers.getField(mController, "mReceiver"); + final Intent broadcast = new Intent(WifiManager.WIFI_AP_STATE_CHANGED_ACTION); + broadcast.putExtra(WifiManager.EXTRA_WIFI_AP_STATE, state); + receiver.onReceive(RuntimeEnvironment.application, broadcast); + } }