diff options
-rw-r--r-- | service/java/com/android/server/wifi/WifiServiceImpl.java | 43 | ||||
-rw-r--r-- | tests/wifitests/src/com/android/server/wifi/WifiServiceImplTest.java | 34 |
2 files changed, 64 insertions, 13 deletions
diff --git a/service/java/com/android/server/wifi/WifiServiceImpl.java b/service/java/com/android/server/wifi/WifiServiceImpl.java index 0772b4c80..9d12aa000 100644 --- a/service/java/com/android/server/wifi/WifiServiceImpl.java +++ b/service/java/com/android/server/wifi/WifiServiceImpl.java @@ -879,6 +879,14 @@ public class WifiServiceImpl extends BaseWifiService { mLog.info("startSoftAp uid=%").c(Binder.getCallingUid()).flush(); + SoftApConfiguration softApConfig = null; + if (wifiConfig != null) { + softApConfig = ApConfigUtil.fromWifiConfiguration(wifiConfig); + if (softApConfig == null) { + return false; + } + } + if (!mTetheredSoftApTracker.setEnablingIfAllowed()) { mLog.err("Tethering is already active.").flush(); return false; @@ -890,17 +898,14 @@ public class WifiServiceImpl extends BaseWifiService { mLohsSoftApTracker.stopAll(); } - if (wifiConfig != null) { - SoftApConfiguration softApConfig = ApConfigUtil.fromWifiConfiguration(wifiConfig); - if (softApConfig == null) return false; - return startSoftApInternal(new SoftApModeConfiguration( - WifiManager.IFACE_IP_MODE_TETHERED, - softApConfig, mTetheredSoftApTracker.getSoftApCapability())); - } else { - return startSoftApInternal(new SoftApModeConfiguration( - WifiManager.IFACE_IP_MODE_TETHERED, null, - mTetheredSoftApTracker.getSoftApCapability())); + if (!startSoftApInternal(new SoftApModeConfiguration( + WifiManager.IFACE_IP_MODE_TETHERED, softApConfig, + mTetheredSoftApTracker.getSoftApCapability()))) { + mTetheredSoftApTracker.setFailedWhileEnabling(); + return false; } + + return true; } private boolean validateSoftApBand(int apBand) { @@ -951,11 +956,15 @@ public class WifiServiceImpl extends BaseWifiService { mLohsSoftApTracker.stopAll(); } - return startSoftApInternal(new SoftApModeConfiguration( + if (!startSoftApInternal(new SoftApModeConfiguration( WifiManager.IFACE_IP_MODE_TETHERED, softApConfig, - mTetheredSoftApTracker.getSoftApCapability())); - } + mTetheredSoftApTracker.getSoftApCapability()))) { + mTetheredSoftApTracker.setFailedWhileEnabling(); + return false; + } + return true; + } /** * Internal method to start softap mode. Callers of this method should have already checked @@ -1053,6 +1062,14 @@ public class WifiServiceImpl extends BaseWifiService { } } + public void setFailedWhileEnabling() { + synchronized (mLock) { + if (mTetheredSoftApState == WIFI_AP_STATE_ENABLING) { + mTetheredSoftApState = WIFI_AP_STATE_FAILED; + } + } + } + public List<WifiClient> getConnectedClients() { synchronized (mLock) { return mTetheredSoftApConnectedClients; diff --git a/tests/wifitests/src/com/android/server/wifi/WifiServiceImplTest.java b/tests/wifitests/src/com/android/server/wifi/WifiServiceImplTest.java index d91dffbfb..603a4d8f5 100644 --- a/tests/wifitests/src/com/android/server/wifi/WifiServiceImplTest.java +++ b/tests/wifitests/src/com/android/server/wifi/WifiServiceImplTest.java @@ -1324,6 +1324,24 @@ public class WifiServiceImplTest extends WifiBaseTest { } /** + * Verify that startSoftAp() with valid config succeeds after a failed call + */ + @Test + public void testStartSoftApWithValidConfigSucceedsAfterFailure() { + // First initiate a failed call + assertFalse(mWifiServiceImpl.startSoftAp(mApConfig)); + verify(mActiveModeWarden, never()).startSoftAp(any()); + + // Next attempt a valid config + WifiConfiguration config = createValidWifiApConfiguration(); + assertTrue(mWifiServiceImpl.startSoftAp(config)); + verify(mActiveModeWarden).startSoftAp(mSoftApModeConfigCaptor.capture()); + WifiConfigurationTestUtil.assertConfigurationEqualForSoftAp( + config, + mSoftApModeConfigCaptor.getValue().getSoftApConfiguration().toWifiConfiguration()); + } + + /** * Verify caller with proper permission can call startTetheredHotspot. */ @Test @@ -1497,6 +1515,22 @@ public class WifiServiceImplTest extends WifiBaseTest { } /** + * Verify a valied call to startTetheredHotspot succeeds after a failed call. + */ + @Test + public void testStartTetheredHotspotWithValidConfigSucceedsAfterFailedCall() { + // First issue an invalid call + assertFalse(mWifiServiceImpl.startTetheredHotspot( + new SoftApConfiguration.Builder().build())); + verify(mActiveModeWarden, never()).startSoftAp(any()); + + // Now attempt a successful call + assertTrue(mWifiServiceImpl.startTetheredHotspot(null)); + verify(mActiveModeWarden).startSoftAp(mSoftApModeConfigCaptor.capture()); + assertNull(mSoftApModeConfigCaptor.getValue().getSoftApConfiguration()); + } + + /** * Verify caller with proper permission can call stopSoftAp. */ @Test |