Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b6629ab5 authored by Weng Su's avatar Weng Su Committed by Android (Google) Code Review
Browse files

Merge "Check Wi-Fi permissions for QrCode scanner" into tm-dev

parents 17365c8e 71b9cc0e
Loading
Loading
Loading
Loading
+35 −2
Original line number Diff line number Diff line
@@ -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();
    }
+62 −2
Original line number Diff line number Diff line
@@ -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();
    }
}