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:
@@ -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,8 +180,10 @@ public class NetworkRequestDialogActivity extends FragmentActivity implements
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (mDialogFragment != null) {
|
||||||
mDialogFragment.onUserSelectionCallbackRegistration(userSelectionCallback);
|
mDialogFragment.onUserSelectionCallbackRegistration(userSelectionCallback);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onAbort() {
|
public void onAbort() {
|
||||||
@@ -201,8 +209,10 @@ public class NetworkRequestDialogActivity extends FragmentActivity implements
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (mDialogFragment != null) {
|
||||||
mDialogFragment.onMatch(scanResults);
|
mDialogFragment.onMatch(scanResults);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onUserSelectionConnectSuccess(WifiConfiguration wificonfiguration) {
|
public void onUserSelectionConnectSuccess(WifiConfiguration wificonfiguration) {
|
||||||
|
@@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user