diff --git a/src/com/android/settings/wifi/AppStateChangeWifiStateBridge.java b/src/com/android/settings/wifi/AppStateChangeWifiStateBridge.java index 23d6b67712a..c643b8ca05d 100644 --- a/src/com/android/settings/wifi/AppStateChangeWifiStateBridge.java +++ b/src/com/android/settings/wifi/AppStateChangeWifiStateBridge.java @@ -20,6 +20,7 @@ import android.Manifest; import android.app.AppOpsManager; import android.content.Context; +import com.android.internal.util.ArrayUtils; import com.android.settings.applications.AppStateAppOpsBridge; import com.android.settings.applications.AppStateAppOpsBridge.PermissionState; import com.android.settingslib.applications.ApplicationsState; @@ -37,6 +38,7 @@ public class AppStateChangeWifiStateBridge extends AppStateAppOpsBridge { private static final String TAG = "AppStateChangeWifiStateBridge"; private static final int APP_OPS_OP_CODE = AppOpsManager.OP_CHANGE_WIFI_STATE; private static final String PM_CHANGE_WIFI_STATE = Manifest.permission.CHANGE_WIFI_STATE; + private static final String PM_NETWORK_SETTINGS = Manifest.permission.NETWORK_SETTINGS; private static final String[] PM_PERMISSIONS = { PM_CHANGE_WIFI_STATE @@ -86,6 +88,17 @@ public class AppStateChangeWifiStateBridge extends AppStateAppOpsBridge { return false; } WifiSettingsState wifiSettingsState = (WifiSettingsState) info.extraInfo; + if (wifiSettingsState.packageInfo != null) { + final String[] requestedPermissions + = wifiSettingsState.packageInfo.requestedPermissions; + if (ArrayUtils.contains(requestedPermissions, PM_NETWORK_SETTINGS)) { + /* + * NETWORK_SETTINGS permission trumps CHANGE_WIFI_CONFIG, so remove this from + * the list. + */ + return false; + } + } return wifiSettingsState.permissionDeclared; } }; diff --git a/tests/robotests/src/com/android/settings/wifi/AppStateChangeWifiStateBridgeTest.java b/tests/robotests/src/com/android/settings/wifi/AppStateChangeWifiStateBridgeTest.java index a5ecd94a41d..d49c019aeb6 100644 --- a/tests/robotests/src/com/android/settings/wifi/AppStateChangeWifiStateBridgeTest.java +++ b/tests/robotests/src/com/android/settings/wifi/AppStateChangeWifiStateBridgeTest.java @@ -16,6 +16,10 @@ package com.android.settings.wifi; import static com.google.common.truth.Truth.assertThat; +import static org.mockito.Mockito.mock; + +import android.content.pm.PackageInfo; +import android.Manifest; import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settingslib.applications.ApplicationsState.AppEntry; @@ -66,4 +70,14 @@ public class AppStateChangeWifiStateBridgeTest { mEntry.extraInfo = mState; assertThat(mFilter.filterApp(mEntry)).isFalse(); } + + @Test + public void testFilterApp_networkSettingsGranted_returnFalse() { + mState.permissionDeclared = true; + mState.packageInfo = mock(PackageInfo.class); + mState.packageInfo.requestedPermissions + = new String[]{ Manifest.permission.NETWORK_SETTINGS }; + mEntry.extraInfo = mState; + assertThat(mFilter.filterApp(mEntry)).isFalse(); + } }