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

Commit 8569d2ad authored by Jayant Chowdhary's avatar Jayant Chowdhary Committed by Android (Google) Code Review
Browse files

Merge "Exclude webcam and MIDI USB preferences from requiring auth challenge" into main

parents bee9ccf3 cf9eee0b
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
@@ -38,3 +38,13 @@ flag {
        purpose: PURPOSE_BUGFIX
    }
}

flag {
    name: "exclude_webcam_auth_challenge"
    namespace: "safety_center"
    description: "Gates whether to exclude webcam from USB preferences auth challenge."
    bug: "349370229"
    metadata {
        purpose: PURPOSE_BUGFIX
    }
}
 No newline at end of file
+46 −30
Original line number Diff line number Diff line
@@ -31,6 +31,7 @@ import androidx.preference.PreferenceScreen;

import com.android.settings.R;
import com.android.settings.Utils;
import com.android.settings.flags.Flags;
import com.android.settingslib.widget.SelectorWithWidgetPreference;

import java.util.LinkedHashMap;
@@ -130,8 +131,15 @@ public class UsbDetailsFunctionsController extends UsbDetailsController

    @Override
    public void onRadioButtonClicked(SelectorWithWidgetPreference preference) {
        requireAuthAndExecute(() -> {
        final long function = UsbBackend.usbFunctionsFromString(preference.getKey());
        if (isAuthRequired(function)) {
            requireAuthAndExecute(()->handleRadioButtonClicked(preference, function));
        } else {
            handleRadioButtonClicked(preference, function);
        }
    }

    private void handleRadioButtonClicked(SelectorWithWidgetPreference preference, long function) {
        final long previousFunction = mUsbBackend.getCurrentFunctions();
        if (DEBUG) {
            Log.d(TAG, "onRadioButtonClicked() function : " + function + ", toString() : "
@@ -162,7 +170,15 @@ public class UsbDetailsFunctionsController extends UsbDetailsController
                mUsbBackend.setCurrentFunctions(function);
            }
        }
        });
    }

    private boolean isAuthRequired(long function) {
        if (!Flags.excludeWebcamAuthChallenge()) {
            return true;
        }
        // Since webcam and MIDI don't transfer any persistent data over USB
        // don't require authentication.
        return !(function == UsbManager.FUNCTION_UVC || function == UsbManager.FUNCTION_MIDI);
    }

    private boolean isClickEventIgnored(long function, long previousFunction) {
+29 −0
Original line number Diff line number Diff line
@@ -35,6 +35,8 @@ import android.content.Context;
import android.hardware.usb.UsbManager;
import android.net.TetheringManager;
import android.platform.test.annotations.RequiresFlagsEnabled;
import android.platform.test.flag.junit.CheckFlagsRule;
import android.platform.test.flag.junit.DeviceFlagsValueProvider;

import androidx.fragment.app.FragmentActivity;
import androidx.preference.PreferenceCategory;
@@ -48,6 +50,7 @@ import com.android.settingslib.widget.SelectorWithWidgetPreference;

import org.junit.Before;
import org.junit.Ignore;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
@@ -82,6 +85,8 @@ public class UsbDetailsFunctionsControllerTest {
    private FragmentActivity mActivity;
    @Mock
    private TetheringManager mTetheringManager;
    @Rule
    public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule();

    @Before
    public void setUp() {
@@ -349,6 +354,30 @@ public class UsbDetailsFunctionsControllerTest {
        assertThat(mFragment.isUserAuthenticated()).isTrue();
    }

    @Test
    @RequiresFlagsEnabled(Flags.FLAG_EXCLUDE_WEBCAM_AUTH_CHALLENGE)
    public void onRadioButtonClicked_webcamNoAuthNeeded() {
        mRadioButtonPreference.setKey(UsbBackend.usbFunctionsToString(UsbManager.FUNCTION_UVC));
        doReturn(UsbManager.FUNCTION_MTP).when(mUsbBackend).getCurrentFunctions();
        setAuthPassesAutomatically();

        mDetailsFunctionsController.onRadioButtonClicked(mRadioButtonPreference);

        assertThat(mFragment.isUserAuthenticated()).isFalse();
    }

    @Test
    @RequiresFlagsEnabled(Flags.FLAG_EXCLUDE_WEBCAM_AUTH_CHALLENGE)
    public void onRadioButtonClicked_MidiNoAuthNeeded() {
        mRadioButtonPreference.setKey(UsbBackend.usbFunctionsToString(UsbManager.FUNCTION_MIDI));
        doReturn(UsbManager.FUNCTION_MTP).when(mUsbBackend).getCurrentFunctions();
        setAuthPassesAutomatically();

        mDetailsFunctionsController.onRadioButtonClicked(mRadioButtonPreference);

        assertThat(mFragment.isUserAuthenticated()).isFalse();
    }

    private void setAuthPassesAutomatically() {
        Shadows.shadowOf(mContext.getSystemService(KeyguardManager.class))
                .setIsKeyguardSecure(false);