diff --git a/src/com/android/settings/wifi/dpp/WifiDppQrCodeScannerFragment.java b/src/com/android/settings/wifi/dpp/WifiDppQrCodeScannerFragment.java index 821c6e49586..3fd6c45d2b2 100644 --- a/src/com/android/settings/wifi/dpp/WifiDppQrCodeScannerFragment.java +++ b/src/com/android/settings/wifi/dpp/WifiDppQrCodeScannerFragment.java @@ -37,6 +37,7 @@ import android.os.Process; import android.os.SimpleClock; import android.os.SystemClock; import android.text.TextUtils; +import android.util.EventLog; import android.util.Log; import android.util.Size; import android.view.LayoutInflater; @@ -58,6 +59,7 @@ import com.android.settings.R; import com.android.settings.overlay.FeatureFactory; import com.android.settingslib.qrcode.QrCamera; import com.android.settingslib.qrcode.QrDecorateView; +import com.android.settingslib.wifi.WifiPermissionChecker; import com.android.wifitrackerlib.WifiEntry; import com.android.wifitrackerlib.WifiPickerTracker; @@ -117,9 +119,9 @@ public class WifiDppQrCodeScannerFragment extends WifiDppQrCodeBaseFragment impl private int mLatestStatusCode = WifiDppUtils.EASY_CONNECT_EVENT_FAILURE_NONE; - @VisibleForTesting - WifiPickerTracker mWifiPickerTracker; + private WifiPickerTracker mWifiPickerTracker; private HandlerThread mWorkerThread; + private WifiPermissionChecker mWifiPermissionChecker; private final Handler mHandler = new Handler() { @Override @@ -363,6 +365,15 @@ public class WifiDppQrCodeScannerFragment extends WifiDppQrCodeBaseFragment impl mIsConfiguratorMode = true; } + public WifiDppQrCodeScannerFragment(WifiPickerTracker wifiPickerTracker, + WifiPermissionChecker wifiPermissionChecker) { + super(); + + mIsConfiguratorMode = true; + mWifiPickerTracker = wifiPickerTracker; + mWifiPermissionChecker = wifiPermissionChecker; + } + /** * Enrollee container activity of the fragment should create instance with this constructor and * specify the SSID string of the WI-Fi network to be provisioned. @@ -719,6 +730,28 @@ public class WifiDppQrCodeScannerFragment extends WifiDppQrCodeBaseFragment impl resultIntent.putExtra(KEY_WIFI_CONFIGURATION, mEnrolleeWifiConfiguration); final Activity hostActivity = getActivity(); + if (hostActivity == null) return; + if (mWifiPermissionChecker == null) { + mWifiPermissionChecker = new WifiPermissionChecker(hostActivity); + } + + if (!mWifiPermissionChecker.canAccessWifiState()) { + Log.w(TAG, "Calling package does not have ACCESS_WIFI_STATE permission for result."); + EventLog.writeEvent(0x534e4554, "187176859", + mWifiPermissionChecker.getLaunchedPackage(), "no ACCESS_WIFI_STATE permission"); + hostActivity.finish(); + return; + } + + if (!mWifiPermissionChecker.canAccessFineLocation()) { + Log.w(TAG, "Calling package does not have ACCESS_FINE_LOCATION permission for result."); + EventLog.writeEvent(0x534e4554, "187176859", + mWifiPermissionChecker.getLaunchedPackage(), + "no ACCESS_FINE_LOCATION permission"); + hostActivity.finish(); + return; + } + hostActivity.setResult(Activity.RESULT_OK, resultIntent); hostActivity.finish(); } diff --git a/tests/robotests/src/com/android/settings/wifi/dpp/WifiDppQrCodeScannerFragmentTest.java b/tests/robotests/src/com/android/settings/wifi/dpp/WifiDppQrCodeScannerFragmentTest.java index 1046418055d..bf978c7d917 100644 --- a/tests/robotests/src/com/android/settings/wifi/dpp/WifiDppQrCodeScannerFragmentTest.java +++ b/tests/robotests/src/com/android/settings/wifi/dpp/WifiDppQrCodeScannerFragmentTest.java @@ -19,11 +19,19 @@ package com.android.settings.wifi.dpp; import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.anyInt; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.any; import static org.mockito.Mockito.doNothing; +import static org.mockito.Mockito.never; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import android.app.Activity; + +import androidx.fragment.app.FragmentActivity; + +import com.android.settingslib.wifi.WifiPermissionChecker; import com.android.wifitrackerlib.WifiEntry; import com.android.wifitrackerlib.WifiPickerTracker; @@ -49,6 +57,10 @@ public class WifiDppQrCodeScannerFragmentTest { WifiPickerTracker mWifiPickerTracker; @Mock WifiEntry mWifiEntry; + @Mock + WifiPermissionChecker mWifiPermissionChecker; + @Mock + FragmentActivity mActivity; WifiDppQrCodeScannerFragment mFragment; @@ -57,8 +69,8 @@ public class WifiDppQrCodeScannerFragmentTest { when(mWifiEntry.getSsid()).thenReturn(WIFI_SSID); when(mWifiPickerTracker.getWifiEntries()).thenReturn(Arrays.asList(mWifiEntry)); - mFragment = spy(new WifiDppQrCodeScannerFragment()); - mFragment.mWifiPickerTracker = mWifiPickerTracker; + mFragment = spy( + new WifiDppQrCodeScannerFragment(mWifiPickerTracker, mWifiPermissionChecker)); } @Test @@ -84,4 +96,52 @@ public class WifiDppQrCodeScannerFragmentTest { assertThat(mFragment.canConnectWifi(WIFI_SSID)).isFalse(); verify(mFragment).showErrorMessageAndRestartCamera(anyInt()); } + + @Test + public void onSuccess_noWifiPermission_finishActivityWithoutSetResult() { + when(mFragment.getActivity()).thenReturn(mActivity); + when(mWifiPermissionChecker.canAccessWifiState()).thenReturn(false); + when(mWifiPermissionChecker.canAccessFineLocation()).thenReturn(false); + + mFragment.onSuccess(); + + verify(mActivity).finish(); + verify(mActivity, never()).setResult(eq(Activity.RESULT_OK), any()); + } + + @Test + public void onSuccess_hasAccessWifiStatePermissionOnly_finishActivityWithoutSetResult() { + when(mFragment.getActivity()).thenReturn(mActivity); + when(mWifiPermissionChecker.canAccessWifiState()).thenReturn(true); + when(mWifiPermissionChecker.canAccessFineLocation()).thenReturn(false); + + mFragment.onSuccess(); + + verify(mActivity).finish(); + verify(mActivity, never()).setResult(eq(Activity.RESULT_OK), any()); + } + + @Test + public void onSuccess_hasAccessFineLocationPermissionOnly_finishActivityWithoutSetResult() { + when(mFragment.getActivity()).thenReturn(mActivity); + when(mWifiPermissionChecker.canAccessWifiState()).thenReturn(false); + when(mWifiPermissionChecker.canAccessFineLocation()).thenReturn(true); + + mFragment.onSuccess(); + + verify(mActivity).finish(); + verify(mActivity, never()).setResult(eq(Activity.RESULT_OK), any()); + } + + @Test + public void onSuccess_hasRequiredPermissions_finishActivityWithSetResult() { + when(mFragment.getActivity()).thenReturn(mActivity); + when(mWifiPermissionChecker.canAccessWifiState()).thenReturn(true); + when(mWifiPermissionChecker.canAccessFineLocation()).thenReturn(true); + + mFragment.onSuccess(); + + verify(mActivity).setResult(eq(Activity.RESULT_OK), any()); + verify(mActivity).finish(); + } }