From dd4764b7f4de6156a8dcaa75832fc6c486d7c9af Mon Sep 17 00:00:00 2001 From: clownshen Date: Wed, 24 Apr 2019 13:52:06 +0800 Subject: [PATCH] Fix NPE when connect timeout If user click connect button and then receive timeout event after leave detail page, the NPE happened. Ignore the timeout event if activity already gone. Bug: 131141866 Test: manual test Test: make RunSettingsRoboTests -j32 ROBOTEST_FILTER=com.android.settings.wifi.details.WifiDetailPreferenceControllerTest Change-Id: Ic22c22027386d4a6de5d693eafcd9cd463ed3415 --- .../WifiDetailPreferenceController.java | 4 +++ .../WifiDetailPreferenceControllerTest.java | 33 +++++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java b/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java index f98dc589579..dfb59d19787 100644 --- a/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java +++ b/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java @@ -1109,6 +1109,10 @@ public class WifiDetailPreferenceController extends AbstractPreferenceController } @Override public void onFinish() { + if (mFragment == null || mFragment.getActivity() == null) { + Log.d(TAG, "Ignore timeout since activity not exist!"); + return; + } Log.e(TAG, "Timeout for state:" + mConnectingState); if (mConnectingState == STATE_ENABLE_WIFI) { updateConnectingState(STATE_ENABLE_WIFI_FAILED); diff --git a/tests/robotests/src/com/android/settings/wifi/details/WifiDetailPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/wifi/details/WifiDetailPreferenceControllerTest.java index d4ce481e005..3ffe61a7729 100644 --- a/tests/robotests/src/com/android/settings/wifi/details/WifiDetailPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/wifi/details/WifiDetailPreferenceControllerTest.java @@ -1623,6 +1623,39 @@ public class WifiDetailPreferenceControllerTest { mContext.getString(R.string.wifi_failed_connect_message)); } + @Test + public void testConnectButton_clickConnectAndBackKey_ignoreTimeoutEvent() { + setUpForDisconnectedNetwork(); + when(mockWifiManager.isWifiEnabled()).thenReturn(true); + InOrder inOrder = inOrder(mockButtonsPref); + setUpForToast(); + + displayAndResume(); + + // check connect button exist + verifyConnectBtnSetUpAsVisible(inOrder); + + // click connect button + mController.connectNetwork(); + + // check display button as connecting + verify(mockWifiManager, times(1)).connect(anyInt(), any(WifiManager.ActionListener.class)); + verifyConnectBtnSetUpAsConnecting(inOrder); + + // leave detail page + when(mockFragment.getActivity()).thenReturn(null); + + // timeout happened + mController.mTimer.onFinish(); + + // check connect button visible, be init as default and toast failed message + inOrder.verify(mockButtonsPref, never()).setButton3Text(R.string.wifi_connect); + inOrder.verify(mockButtonsPref, never()).setButton3Icon(R.drawable.ic_settings_wireless); + inOrder.verify(mockButtonsPref, never()).setButton3Enabled(true); + inOrder.verify(mockButtonsPref, never()).setButton3Visible(true); + assertThat(ShadowToast.shownToastCount()).isEqualTo(0); + } + @Test public void updateAccessPoint_returnFalseForNothingChanged() { setUpForDisconnectedNetwork();