Fix ConnectivityManager.requestNetwork crash issue when try again

- When the user requests "try again", the Network-Request-Dialog will be
  recreated. If the Wi-Fi framework sends the callback result at this
  time, the Network-Request-Dialog may not be ready at the moment,
  causing the NPE to crash.

- Add NPE checks to avoid crash issues.

Bug: 220679437
Test: manual test
make RunSettingsRoboTests \
  ROBOTEST_FILTER=NetworkRequestDialogActivityTest

Change-Id: I8e48a29649e72d9f8c67c4ac24f0eb27ba600dae
This commit is contained in:
Weng Su
2022-03-23 02:09:19 +08:00
parent b39ab3e1c4
commit 98d30c880d
2 changed files with 53 additions and 35 deletions

View File

@@ -58,12 +58,17 @@ public class NetworkRequestDialogActivity extends FragmentActivity implements
final static String EXTRA_IS_SPECIFIED_SSID = final static String EXTRA_IS_SPECIFIED_SSID =
"com.android.settings.wifi.extra.REQUEST_IS_FOR_SINGLE_NETWORK"; "com.android.settings.wifi.extra.REQUEST_IS_FOR_SINGLE_NETWORK";
@VisibleForTesting NetworkRequestDialogBaseFragment mDialogFragment; @VisibleForTesting
NetworkRequestDialogBaseFragment mDialogFragment;
@VisibleForTesting
boolean mIsSpecifiedSsid;
@VisibleForTesting
boolean mShowingErrorDialog;
@VisibleForTesting
ProgressDialog mProgressDialog;
private NetworkRequestUserSelectionCallback mUserSelectionCallback; private NetworkRequestUserSelectionCallback mUserSelectionCallback;
private boolean mIsSpecifiedSsid;
private boolean mShowingErrorDialog;
private WifiConfiguration mMatchedConfig; private WifiConfiguration mMatchedConfig;
@VisibleForTesting ProgressDialog mProgressDialog;
@Override @Override
protected void onCreate(@Nullable Bundle savedInstanceState) { protected void onCreate(@Nullable Bundle savedInstanceState) {
@@ -103,7 +108,8 @@ public class NetworkRequestDialogActivity extends FragmentActivity implements
mDialogFragment.show(getSupportFragmentManager(), TAG); mDialogFragment.show(getSupportFragmentManager(), TAG);
} }
private void dismissDialogs() { @VisibleForTesting
void dismissDialogs() {
if (mDialogFragment != null) { if (mDialogFragment != null) {
mDialogFragment.dismiss(); mDialogFragment.dismiss();
mDialogFragment = null; mDialogFragment = null;
@@ -174,7 +180,9 @@ public class NetworkRequestDialogActivity extends FragmentActivity implements
return; return;
} }
mDialogFragment.onUserSelectionCallbackRegistration(userSelectionCallback); if (mDialogFragment != null) {
mDialogFragment.onUserSelectionCallbackRegistration(userSelectionCallback);
}
} }
@Override @Override
@@ -201,7 +209,9 @@ public class NetworkRequestDialogActivity extends FragmentActivity implements
return; return;
} }
mDialogFragment.onMatch(scanResults); if (mDialogFragment != null) {
mDialogFragment.onMatch(scanResults);
}
} }
@Override @Override

View File

@@ -25,7 +25,6 @@ import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.net.wifi.ScanResult; import android.net.wifi.ScanResult;
import android.net.wifi.WifiConfiguration; import android.net.wifi.WifiConfiguration;
@@ -42,9 +41,12 @@ import com.android.settings.wifi.NetworkRequestErrorDialogFragment.ERROR_DIALOG_
import com.android.wifitrackerlib.WifiPickerTracker; import com.android.wifitrackerlib.WifiPickerTracker;
import org.junit.Before; import org.junit.Before;
import org.junit.Rule;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.mockito.MockitoAnnotations; import org.mockito.Mock;
import org.mockito.junit.MockitoJUnit;
import org.mockito.junit.MockitoRule;
import org.robolectric.Robolectric; import org.robolectric.Robolectric;
import org.robolectric.RobolectricTestRunner; import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment; import org.robolectric.RuntimeEnvironment;
@@ -61,25 +63,26 @@ public class NetworkRequestDialogActivityTest {
private static final String TEST_SSID = "testssid"; private static final String TEST_SSID = "testssid";
private static final String TEST_CAPABILITY = "wep"; private static final String TEST_CAPABILITY = "wep";
NetworkRequestDialogActivity mActivity; @Rule
public MockitoRule mRule = MockitoJUnit.rule();
@Mock
WifiManager mWifiManager; WifiManager mWifiManager;
Context mContext; @Mock
NetworkRequestUserSelectionCallback mNetworkRequestUserSelectionCallback;
NetworkRequestDialogActivity mActivity;
List<ScanResult> mScanResults = new ArrayList<>();
@Before @Before
public void setUp() { public void setUp() {
MockitoAnnotations.initMocks(this);
mContext = spy(RuntimeEnvironment.application);
FakeFeatureFactory fakeFeatureFactory = FakeFeatureFactory.setupForTest(); FakeFeatureFactory fakeFeatureFactory = FakeFeatureFactory.setupForTest();
when(fakeFeatureFactory.wifiTrackerLibProvider.createWifiPickerTracker( when(fakeFeatureFactory.wifiTrackerLibProvider.createWifiPickerTracker(
any(), any(), any(), any(), any(), anyLong(), anyLong(), any())) any(), any(), any(), any(), any(), anyLong(), anyLong(), any()))
.thenReturn(mock(WifiPickerTracker.class)); .thenReturn(mock(WifiPickerTracker.class));
mScanResults.add(getScanResult(TEST_SSID, TEST_CAPABILITY));
NetworkRequestDialogActivity activity = mActivity = spy(Robolectric.setupActivity(NetworkRequestDialogActivity.class));
Robolectric.setupActivity(NetworkRequestDialogActivity.class); when(mActivity.getSystemService(WifiManager.class)).thenReturn(mWifiManager);
mActivity = spy(activity);
mWifiManager = mock(WifiManager.class);
when(mActivity.getSystemService(Context.WIFI_SERVICE)).thenReturn(mWifiManager);
} }
@Test @Test
@@ -169,10 +172,7 @@ public class NetworkRequestDialogActivityTest {
public void specifiedSsid_onMatch_shouldShowDialogFragment() { public void specifiedSsid_onMatch_shouldShowDialogFragment() {
startSpecifiedActivity(); startSpecifiedActivity();
final List<ScanResult> scanResults = new ArrayList<>(); mActivity.onMatch(mScanResults);
scanResults.add(getScanResult(TEST_SSID, TEST_CAPABILITY));
mActivity.onMatch(scanResults);
assertThat(mActivity.mProgressDialog).isNull(); assertThat(mActivity.mProgressDialog).isNull();
assertThat(mActivity.mDialogFragment).isNotNull(); assertThat(mActivity.mDialogFragment).isNotNull();
@@ -193,9 +193,7 @@ public class NetworkRequestDialogActivityTest {
public void onUserSelectionConnectFailure_shouldShowDialogFragment() { public void onUserSelectionConnectFailure_shouldShowDialogFragment() {
WifiConfiguration wifiConfiguration = mock(WifiConfiguration.class); WifiConfiguration wifiConfiguration = mock(WifiConfiguration.class);
startSpecifiedActivity(); startSpecifiedActivity();
final List<ScanResult> scanResults = new ArrayList<>(); mActivity.onMatch(mScanResults);
scanResults.add(getScanResult(TEST_SSID, TEST_CAPABILITY));
mActivity.onMatch(scanResults);
mActivity.onUserSelectionConnectFailure(wifiConfiguration); mActivity.onUserSelectionConnectFailure(wifiConfiguration);
@@ -205,13 +203,9 @@ public class NetworkRequestDialogActivityTest {
@Test @Test
public void onClickConnectButton_shouldShowProgressDialog() { public void onClickConnectButton_shouldShowProgressDialog() {
NetworkRequestUserSelectionCallback networkRequestUserSelectionCallback = mock(
NetworkRequestUserSelectionCallback.class);
startSpecifiedActivity(); startSpecifiedActivity();
final List<ScanResult> scanResults = new ArrayList<>(); mActivity.onMatch(mScanResults);
scanResults.add(getScanResult(TEST_SSID, TEST_CAPABILITY)); mActivity.onUserSelectionCallbackRegistration(mNetworkRequestUserSelectionCallback);
mActivity.onMatch(scanResults);
mActivity.onUserSelectionCallbackRegistration(networkRequestUserSelectionCallback);
mActivity.onClickConnectButton(); mActivity.onClickConnectButton();
@@ -222,9 +216,7 @@ public class NetworkRequestDialogActivityTest {
@Test @Test
public void onCancel_shouldCloseAllUI() { public void onCancel_shouldCloseAllUI() {
startSpecifiedActivity(); startSpecifiedActivity();
final List<ScanResult> scanResults = new ArrayList<>(); mActivity.onMatch(mScanResults);
scanResults.add(getScanResult(TEST_SSID, TEST_CAPABILITY));
mActivity.onMatch(scanResults);
mActivity.onCancel(); mActivity.onCancel();
@@ -240,4 +232,20 @@ public class NetworkRequestDialogActivityTest {
verify(mActivity).finish(); verify(mActivity).finish();
} }
@Test
public void onUserSelectionCallbackRegistration_dismissDialogsAndDialogIsNull_shouldNotCrash() {
mActivity.dismissDialogs();
mActivity.onUserSelectionCallbackRegistration(mNetworkRequestUserSelectionCallback);
}
@Test
public void onMatch_dismissDialogsAndDialogIsNull_shouldNotCrash() {
mActivity.mIsSpecifiedSsid = false;
mActivity.mShowingErrorDialog = false;
mActivity.dismissDialogs();
mActivity.onMatch(mScanResults);
}
} }