Merge "Rely on S+ HDM interface priority for enabling Wifi when tethering" into main
diff --git a/service/java/com/android/server/wifi/WifiServiceImpl.java b/service/java/com/android/server/wifi/WifiServiceImpl.java
index 3795d4a..d24b9eb 100644
--- a/service/java/com/android/server/wifi/WifiServiceImpl.java
+++ b/service/java/com/android/server/wifi/WifiServiceImpl.java
@@ -1260,8 +1260,11 @@
return false;
}
- // If SoftAp is enabled, only privileged apps are allowed to toggle wifi
- if (!isPrivileged && mTetheredSoftApTracker.getState() == WIFI_AP_STATE_ENABLED) {
+ // Pre-S interface priority is solely based on interface type, which allows STA to delete AP
+ // for any requester. To prevent non-privileged apps from deleting a tethering AP by
+ // enabling Wi-Fi, only allow privileged apps to toggle Wi-Fi if tethering AP is up.
+ if (!SdkLevel.isAtLeastS() && !isPrivileged
+ && mTetheredSoftApTracker.getState() == WIFI_AP_STATE_ENABLED) {
mLog.err("setWifiEnabled with SoftAp enabled: only Settings can toggle wifi").flush();
return false;
}
diff --git a/service/tests/wifitests/src/com/android/server/wifi/WifiServiceImplTest.java b/service/tests/wifitests/src/com/android/server/wifi/WifiServiceImplTest.java
index 6c64cd1..aa6bb77 100644
--- a/service/tests/wifitests/src/com/android/server/wifi/WifiServiceImplTest.java
+++ b/service/tests/wifitests/src/com/android/server/wifi/WifiServiceImplTest.java
@@ -620,6 +620,9 @@
when(mScanRequestProxy.startScan(anyInt(), anyString())).thenReturn(true);
when(mLohsCallback.asBinder()).thenReturn(mock(IBinder.class));
when(mWifiSettingsConfigStore.get(eq(WIFI_VERBOSE_LOGGING_ENABLED))).thenReturn(true);
+ when(mWifiSettingsConfigStore.get(
+ eq(SHOW_DIALOG_WHEN_THIRD_PARTY_APPS_ENABLE_WIFI_SET_BY_API)))
+ .thenReturn(false);
when(mWifiPermissionsUtil.isSystem(anyString(), anyInt())).thenReturn(false);
when(mActiveModeWarden.getClientModeManagersInRoles(
ROLE_CLIENT_LOCAL_ONLY, ROLE_CLIENT_SECONDARY_LONG_LIVED))
@@ -874,9 +877,6 @@
*/
@Test
public void testSetWifiEnabledMetricsNormalAppBelowQSdk() throws Exception {
- when(mWifiSettingsConfigStore.get(
- eq(SHOW_DIALOG_WHEN_THIRD_PARTY_APPS_ENABLE_WIFI_SET_BY_API)))
- .thenReturn(false);
doReturn(AppOpsManager.MODE_ALLOWED).when(mAppOpsManager)
.noteOp(AppOpsManager.OPSTR_CHANGE_WIFI_STATE, Process.myUid(), TEST_PACKAGE_NAME);
when(mWifiPermissionsUtil.isTargetSdkLessThan(anyString(),
@@ -986,9 +986,6 @@
*/
@Test
public void testSetWifiEnabledSuccessForAppsTargetingBelowQSdk() throws Exception {
- when(mWifiSettingsConfigStore.get(
- eq(SHOW_DIALOG_WHEN_THIRD_PARTY_APPS_ENABLE_WIFI_SET_BY_API)))
- .thenReturn(false);
doReturn(AppOpsManager.MODE_ALLOWED).when(mAppOpsManager)
.noteOp(AppOpsManager.OPSTR_CHANGE_WIFI_STATE, Process.myUid(), TEST_PACKAGE_NAME);
when(mWifiPermissionsUtil.isTargetSdkLessThan(anyString(),
@@ -1159,9 +1156,6 @@
*/
@Test
public void testSetWifiEnabledDialogForThirdPartyAppsTargetingBelowQSdk() throws Exception {
- when(mWifiSettingsConfigStore.get(
- eq(SHOW_DIALOG_WHEN_THIRD_PARTY_APPS_ENABLE_WIFI_SET_BY_API)))
- .thenReturn(false);
when(mResources.getBoolean(
R.bool.config_showConfirmationDialogForThirdPartyAppsEnablingWifi))
.thenReturn(true);
@@ -1328,9 +1322,6 @@
*/
@Test
public void testSetWifiEnabledNoDialogForNonThirdPartyAppsTargetingBelowQSdk() {
- when(mWifiSettingsConfigStore.get(
- eq(SHOW_DIALOG_WHEN_THIRD_PARTY_APPS_ENABLE_WIFI_SET_BY_API)))
- .thenReturn(false);
when(mResources.getBoolean(
R.bool.config_showConfirmationDialogForThirdPartyAppsEnablingWifi))
.thenReturn(true);
@@ -1389,10 +1380,10 @@
}
/**
- * Verify that a call from an app cannot enable wifi if we are in softap mode.
+ * Verify that a call from an app cannot enable wifi if we are in softap mode for Pre-S
*/
@Test
- public void testSetWifiEnabledFromAppFailsWhenApEnabled() throws Exception {
+ public void testSetWifiEnabledFromAppFailsWhenApEnabledForPreS() throws Exception {
doReturn(AppOpsManager.MODE_ALLOWED).when(mAppOpsManager)
.noteOp(AppOpsManager.OPSTR_CHANGE_WIFI_STATE, Process.myUid(), TEST_PACKAGE_NAME);
when(mWifiPermissionsUtil.isTargetSdkLessThan(anyString(),
@@ -1408,9 +1399,16 @@
eq(android.Manifest.permission.NETWORK_SETTINGS), anyInt(), anyInt()))
.thenReturn(PackageManager.PERMISSION_DENIED);
when(mSettingsStore.isAirplaneModeOn()).thenReturn(false);
- assertFalse(mWifiServiceImpl.setWifiEnabled(TEST_PACKAGE_NAME, true));
- verify(mSettingsStore, never()).handleWifiToggled(anyBoolean());
- verify(mActiveModeWarden, never()).wifiToggled(any());
+ when(mSettingsStore.handleWifiToggled(eq(true))).thenReturn(true);
+ if (!SdkLevel.isAtLeastS()) {
+ assertFalse(mWifiServiceImpl.setWifiEnabled(TEST_PACKAGE_NAME, true));
+ verify(mSettingsStore, never()).handleWifiToggled(anyBoolean());
+ verify(mActiveModeWarden, never()).wifiToggled(any());
+ } else {
+ assertTrue(mWifiServiceImpl.setWifiEnabled(TEST_PACKAGE_NAME, true));
+ verify(mActiveModeWarden).wifiToggled(
+ eq(new WorkSource(Binder.getCallingUid(), TEST_PACKAGE_NAME)));
+ }
}