From 949a9784e43720aaf3710589565ef5d8e22e20ab Mon Sep 17 00:00:00 2001 From: Roshan Pius Date: Tue, 13 Aug 2019 11:23:28 -0700 Subject: WifiServiceImpl: Allow setWifiEnabled for system apps This allows system apps to toggle wifi on/off during emergency calls to get user's location for example. Bug: 138091278 Test: atest com.android.server.wifi Change-Id: I095f9755c60034064e467dedcdb16b33dc63d9eb Merged-In: I095f9755c60034064e467dedcdb16b33dc63d9eb (cherry-picked from b46e815669ba3f376f7dda2a24479f84bad0b4a8) --- .../com/android/server/wifi/WifiServiceImpl.java | 3 +- .../android/server/wifi/WifiServiceImplTest.java | 37 ++++++++++++++++++++++ 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/service/java/com/android/server/wifi/WifiServiceImpl.java b/service/java/com/android/server/wifi/WifiServiceImpl.java index b25a84593..cf5dcea97 100644 --- a/service/java/com/android/server/wifi/WifiServiceImpl.java +++ b/service/java/com/android/server/wifi/WifiServiceImpl.java @@ -875,7 +875,8 @@ public class WifiServiceImpl extends BaseWifiService { } boolean isPrivileged = isPrivileged(Binder.getCallingPid(), Binder.getCallingUid()); if (!isPrivileged - && !mWifiPermissionsUtil.isTargetSdkLessThan(packageName, Build.VERSION_CODES.Q)) { + && !mWifiPermissionsUtil.isTargetSdkLessThan(packageName, Build.VERSION_CODES.Q) + && !isSystem(packageName)) { mLog.info("setWifiEnabled not allowed for uid=%") .c(Binder.getCallingUid()).flush(); return false; diff --git a/tests/wifitests/src/com/android/server/wifi/WifiServiceImplTest.java b/tests/wifitests/src/com/android/server/wifi/WifiServiceImplTest.java index 80b7406ee..e286e339b 100644 --- a/tests/wifitests/src/com/android/server/wifi/WifiServiceImplTest.java +++ b/tests/wifitests/src/com/android/server/wifi/WifiServiceImplTest.java @@ -599,6 +599,24 @@ public class WifiServiceImplTest { verify(mWifiController).sendMessage(eq(CMD_WIFI_TOGGLED)); } + /** + * Verify that wifi can be enabled by the system apps targeting Q SDK. + */ + @Test + public void testSetWifiEnabledSuccessForSystemAppsTargetingQSDK() throws Exception { + doReturn(AppOpsManager.MODE_ALLOWED).when(mAppOpsManager) + .noteOp(AppOpsManager.OPSTR_CHANGE_WIFI_STATE, Process.myUid(), TEST_PACKAGE_NAME); + when(mWifiPermissionsUtil.isTargetSdkLessThan(anyString(), + eq(Build.VERSION_CODES.Q))).thenReturn(false); + mApplicationInfo.flags = ApplicationInfo.FLAG_SYSTEM; + + when(mSettingsStore.handleWifiToggled(eq(true))).thenReturn(true); + when(mSettingsStore.isAirplaneModeOn()).thenReturn(false); + assertTrue(mWifiServiceImpl.setWifiEnabled(TEST_PACKAGE_NAME, true)); + + verify(mWifiController).sendMessage(eq(CMD_WIFI_TOGGLED)); + } + /** * Verify that wifi can be enabled by the apps targeting pre-Q SDK. */ @@ -811,6 +829,25 @@ public class WifiServiceImplTest { verify(mWifiController).sendMessage(eq(CMD_WIFI_TOGGLED)); } + /** + * Verify that wifi can be disabled by the system apps targeting Q SDK. + */ + @Test + public void testSetWifiDisabledSuccessForSystemAppsTargetingQSDK() throws Exception { + doReturn(AppOpsManager.MODE_ALLOWED).when(mAppOpsManager) + .noteOp(AppOpsManager.OPSTR_CHANGE_WIFI_STATE, Process.myUid(), TEST_PACKAGE_NAME); + when(mWifiPermissionsUtil.isTargetSdkLessThan(anyString(), + eq(Build.VERSION_CODES.Q))).thenReturn(false); + mApplicationInfo.flags = ApplicationInfo.FLAG_SYSTEM; + + when(mSettingsStore.handleWifiToggled(eq(false))).thenReturn(true); + when(mSettingsStore.isAirplaneModeOn()).thenReturn(false); + assertTrue(mWifiServiceImpl.setWifiEnabled(TEST_PACKAGE_NAME, false)); + + verify(mWifiController).sendMessage(eq(CMD_WIFI_TOGGLED)); + } + + /** * Verify that wifi can be disabled by the apps targeting pre-Q SDK. */ -- cgit v1.2.3