diff --git a/AndroidManifest.xml b/AndroidManifest.xml index ccc36526356..8e3378a2610 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -25,6 +25,7 @@ + diff --git a/res/layout/trusted_credential_list_container.xml b/res/layout/trusted_credential_list_container.xml index 42dbfd9755b..5f8b7b3a654 100644 --- a/res/layout/trusted_credential_list_container.xml +++ b/res/layout/trusted_credential_list_container.xml @@ -53,6 +53,7 @@ diff --git a/src/com/android/settings/wifi/dpp/WifiDppEnrolleeActivity.java b/src/com/android/settings/wifi/dpp/WifiDppEnrolleeActivity.java index c5f1e81f80d..3ce244cea30 100644 --- a/src/com/android/settings/wifi/dpp/WifiDppEnrolleeActivity.java +++ b/src/com/android/settings/wifi/dpp/WifiDppEnrolleeActivity.java @@ -18,11 +18,14 @@ package com.android.settings.wifi.dpp; import android.app.settings.SettingsEnums; import android.content.Intent; +import android.util.EventLog; import android.util.Log; +import androidx.annotation.VisibleForTesting; import androidx.fragment.app.FragmentTransaction; import com.android.settings.R; +import com.android.settingslib.wifi.WifiRestrictionsCache; /** * To provision "this" device with specified Wi-Fi network. @@ -37,6 +40,9 @@ public class WifiDppEnrolleeActivity extends WifiDppBaseActivity implements static final String ACTION_ENROLLEE_QR_CODE_SCANNER = "android.settings.WIFI_DPP_ENROLLEE_QR_CODE_SCANNER"; + @VisibleForTesting + protected WifiRestrictionsCache mWifiRestrictionsCache; + @Override public int getMetricsCategory() { return SettingsEnums.SETTINGS_WIFI_DPP_ENROLLEE; @@ -50,6 +56,14 @@ public class WifiDppEnrolleeActivity extends WifiDppBaseActivity implements return; } + if (!isWifiConfigAllowed()) { + Log.e(TAG, "The user is not allowed to configure Wi-Fi."); + finish(); + EventLog.writeEvent(0x534e4554, "202017876", getApplicationContext().getUserId(), + "The user is not allowed to configure Wi-Fi."); + return; + } + switch (action) { case ACTION_ENROLLEE_QR_CODE_SCANNER: String ssid = intent.getStringExtra(WifiDppUtils.EXTRA_WIFI_SSID); @@ -61,7 +75,15 @@ public class WifiDppEnrolleeActivity extends WifiDppBaseActivity implements } } - private void showQrCodeScannerFragment(String ssid) { + private boolean isWifiConfigAllowed() { + if (mWifiRestrictionsCache == null) { + mWifiRestrictionsCache = WifiRestrictionsCache.getInstance(getApplicationContext()); + } + return mWifiRestrictionsCache.isConfigWifiAllowed(); + } + + @VisibleForTesting + protected void showQrCodeScannerFragment(String ssid) { WifiDppQrCodeScannerFragment fragment = (WifiDppQrCodeScannerFragment) mFragmentManager.findFragmentByTag( WifiDppUtils.TAG_FRAGMENT_QR_CODE_SCANNER); diff --git a/src/com/android/settings/wifi/p2p/WifiP2pPreferenceController.java b/src/com/android/settings/wifi/p2p/WifiP2pPreferenceController.java index 96044100647..db150dab3b5 100644 --- a/src/com/android/settings/wifi/p2p/WifiP2pPreferenceController.java +++ b/src/com/android/settings/wifi/p2p/WifiP2pPreferenceController.java @@ -33,6 +33,7 @@ import com.android.settingslib.core.lifecycle.Lifecycle; import com.android.settingslib.core.lifecycle.LifecycleObserver; import com.android.settingslib.core.lifecycle.events.OnPause; import com.android.settingslib.core.lifecycle.events.OnResume; +import com.android.settingslib.wifi.WifiEnterpriseRestrictionUtils; /** * {@link PreferenceControllerMixin} to toggle Wifi Direct preference on Wi-Fi state. @@ -51,27 +52,17 @@ public class WifiP2pPreferenceController extends AbstractPreferenceController } }; private final IntentFilter mFilter = new IntentFilter(WifiManager.WIFI_STATE_CHANGED_ACTION); - private final LocationManager mLocationManager; - @VisibleForTesting - final BroadcastReceiver mLocationReceiver = new BroadcastReceiver() { - @Override - public void onReceive(Context context, Intent intent) { - if (mWifiDirectPref != null) { - updateState(mWifiDirectPref); - } - } - }; - private final IntentFilter mLocationFilter = - new IntentFilter(LocationManager.MODE_CHANGED_ACTION); private Preference mWifiDirectPref; + @VisibleForTesting + boolean mIsWifiDirectAllow; public WifiP2pPreferenceController( Context context, Lifecycle lifecycle, WifiManager wifiManager) { super(context); mWifiManager = wifiManager; + mIsWifiDirectAllow = WifiEnterpriseRestrictionUtils.isWifiDirectAllowed(context); lifecycle.addObserver(this); - mLocationManager = (LocationManager) context.getSystemService(Service.LOCATION_SERVICE); } @Override @@ -84,19 +75,17 @@ public class WifiP2pPreferenceController extends AbstractPreferenceController @Override public void updateState(Preference preference) { super.updateState(preference); - preference.setEnabled(mLocationManager.isLocationEnabled() && mWifiManager.isWifiEnabled()); + preference.setEnabled(isWifiP2pAvailable()); } @Override public void onResume() { mContext.registerReceiver(mReceiver, mFilter); - mContext.registerReceiver(mLocationReceiver, mLocationFilter); } @Override public void onPause() { mContext.unregisterReceiver(mReceiver); - mContext.unregisterReceiver(mLocationReceiver); } @Override @@ -111,9 +100,11 @@ public class WifiP2pPreferenceController extends AbstractPreferenceController private void togglePreferences() { if (mWifiDirectPref != null) { - mWifiDirectPref.setEnabled( - mWifiManager.isWifiEnabled() - && mLocationManager.isLocationEnabled()); + mWifiDirectPref.setEnabled(isWifiP2pAvailable()); } } + private boolean isWifiP2pAvailable() { + return mWifiManager.isWifiEnabled() && mIsWifiDirectAllow; + } + } diff --git a/tests/robotests/src/com/android/settings/wifi/dpp/WifiDppEnrolleeActivityTest.java b/tests/robotests/src/com/android/settings/wifi/dpp/WifiDppEnrolleeActivityTest.java index 819b7f4331d..67d467803b2 100644 --- a/tests/robotests/src/com/android/settings/wifi/dpp/WifiDppEnrolleeActivityTest.java +++ b/tests/robotests/src/com/android/settings/wifi/dpp/WifiDppEnrolleeActivityTest.java @@ -16,16 +16,82 @@ package com.android.settings.wifi.dpp; +import static com.android.settings.wifi.dpp.WifiDppEnrolleeActivity.ACTION_ENROLLEE_QR_CODE_SCANNER; + +import static org.mockito.Mockito.doNothing; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import android.content.Intent; + +import com.android.settingslib.wifi.WifiRestrictionsCache; + +import org.junit.Before; +import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.junit.MockitoJUnit; +import org.mockito.junit.MockitoRule; import org.robolectric.Robolectric; import org.robolectric.RobolectricTestRunner; @RunWith(RobolectricTestRunner.class) public class WifiDppEnrolleeActivityTest { + + private static final String WIFI_SSID = "wifi-ssid"; + + @Rule + public final MockitoRule mMockitoRule = MockitoJUnit.rule(); + @Mock + WifiRestrictionsCache mWifiRestrictionsCache; + @Mock + Intent mIntent; + + WifiDppEnrolleeActivity mActivity; + + @Before + public void setUp() { + when(mWifiRestrictionsCache.isConfigWifiAllowed()).thenReturn(true); + when(mIntent.getAction()).thenReturn(ACTION_ENROLLEE_QR_CODE_SCANNER); + when(mIntent.getStringExtra(WifiDppUtils.EXTRA_WIFI_SSID)).thenReturn(WIFI_SSID); + + mActivity = spy(Robolectric.setupActivity(WifiDppEnrolleeActivity.class)); + mActivity.mWifiRestrictionsCache = mWifiRestrictionsCache; + } + @Test public void launchActivity_noIntentAction_shouldNotFatalException() { WifiDppEnrolleeActivity wifiDppEnrolleeActivity = Robolectric.setupActivity(WifiDppEnrolleeActivity.class); } + + @Test + public void handleIntent_noIntentAction_shouldFinish() { + when(mIntent.getAction()).thenReturn(null); + + mActivity.handleIntent(mIntent); + + verify(mActivity).finish(); + } + + @Test + public void handleIntent_notAllowedConfigWifi_shouldFinish() { + when(mWifiRestrictionsCache.isConfigWifiAllowed()).thenReturn(false); + + mActivity.handleIntent(mIntent); + + verify(mActivity).finish(); + } + + @Test + public void handleIntent_hasIntentDataAndAllowedConfigWifi_shouldShowFragment() { + when(mWifiRestrictionsCache.isConfigWifiAllowed()).thenReturn(true); + doNothing().when(mActivity).showQrCodeScannerFragment(WIFI_SSID); + + mActivity.handleIntent(mIntent); + + verify(mActivity).showQrCodeScannerFragment(WIFI_SSID); + } } diff --git a/tests/robotests/src/com/android/settings/wifi/p2p/WifiP2PPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/wifi/p2p/WifiP2PPreferenceControllerTest.java index 10d76d39305..a9d5611918d 100644 --- a/tests/robotests/src/com/android/settings/wifi/p2p/WifiP2PPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/wifi/p2p/WifiP2PPreferenceControllerTest.java @@ -32,8 +32,9 @@ import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; -import android.location.LocationManager; import android.net.wifi.WifiManager; +import android.os.Bundle; +import android.os.UserManager; import androidx.lifecycle.LifecycleOwner; import androidx.preference.Preference; @@ -56,12 +57,15 @@ public class WifiP2PPreferenceControllerTest { private Context mContext; @Mock(answer = Answers.RETURNS_DEEP_STUBS) private WifiManager mWifiManager; + @Mock + private UserManager mUserManager; + @Mock + private Bundle mBundle; + @Mock private PreferenceScreen mScreen; @Mock private Preference mWifiDirectPreference; - @Mock - private LocationManager mLocationManager; private Lifecycle mLifecycle; private LifecycleOwner mLifecycleOwner; @@ -74,8 +78,11 @@ public class WifiP2PPreferenceControllerTest { mLifecycle = new Lifecycle(mLifecycleOwner); when(mContext.getSystemService(WifiManager.class)).thenReturn(mWifiManager); when(mScreen.findPreference(anyString())).thenReturn(mWifiDirectPreference); - when(mContext.getSystemService(eq(Service.LOCATION_SERVICE))).thenReturn(mLocationManager); + when(mContext.getSystemService(UserManager.class)).thenReturn(mUserManager); + when(mUserManager.getUserRestrictions()).thenReturn(mBundle); + when(mWifiManager.isWifiEnabled()).thenReturn(true); mController = new WifiP2pPreferenceController(mContext, mLifecycle, mWifiManager); + mController.mIsWifiDirectAllow = true; } @Test @@ -86,21 +93,19 @@ public class WifiP2PPreferenceControllerTest { @Test public void testOnResume_shouldRegisterListener() { mLifecycle.handleLifecycleEvent(ON_RESUME); - verify(mContext, times(2)).registerReceiver( - any(BroadcastReceiver.class), any(IntentFilter.class)); + verify(mContext).registerReceiver(any(BroadcastReceiver.class), any(IntentFilter.class)); } @Test public void testOnPause_shouldUnregisterListener() { mLifecycle.handleLifecycleEvent(ON_RESUME); mLifecycle.handleLifecycleEvent(ON_PAUSE); - verify(mContext, times(2)).unregisterReceiver(any(BroadcastReceiver.class)); + verify(mContext).unregisterReceiver(any(BroadcastReceiver.class)); } @Test public void testWifiStateChange_shouldToggleEnabledState() { when(mWifiManager.isWifiEnabled()).thenReturn(true); - when(mLocationManager.isLocationEnabled()).thenReturn(true); //Sets the preferences. mController.displayPreference(mScreen); @@ -118,7 +123,6 @@ public class WifiP2PPreferenceControllerTest { @Test public void testDisplayPreference_shouldToggleEnabledState() { when(mWifiManager.isWifiEnabled()).thenReturn(true); - when(mLocationManager.isLocationEnabled()).thenReturn(true); mController.displayPreference(mScreen); verify(mWifiDirectPreference).setEnabled(true); @@ -127,21 +131,25 @@ public class WifiP2PPreferenceControllerTest { verify(mWifiDirectPreference).setEnabled(false); when(mWifiManager.isWifiEnabled()).thenReturn(true); - when(mLocationManager.isLocationEnabled()).thenReturn(false); mController.displayPreference(mScreen); - verify(mWifiDirectPreference, times(2)).setEnabled(false); + verify(mWifiDirectPreference).setEnabled(false); } @Test - public void updateState_withLocationDisabled_preferenceShouldBeDisable() { - when(mWifiManager.isWifiEnabled()).thenReturn(true); - when(mLocationManager.isLocationEnabled()).thenReturn(true); - Intent fakeIntent = new Intent(); - mController.displayPreference(mScreen); - verify(mWifiDirectPreference).setEnabled(true); + public void displayPreference_wifiDirectNotAllowed_shouldDisable() { + mController.mIsWifiDirectAllow = false; + + mController.displayPreference(mScreen); - when(mLocationManager.isLocationEnabled()).thenReturn(false); - mController.mLocationReceiver.onReceive(mContext, fakeIntent); verify(mWifiDirectPreference).setEnabled(false); } + + @Test + public void displayPreference_wifiDirectNotAllowed_shouldEnable() { + mController.mIsWifiDirectAllow = true; + + mController.displayPreference(mScreen); + + verify(mWifiDirectPreference).setEnabled(true); + } }