Loading aconfig/settings_connecteddevice_flag_declarations.aconfig +10 −0 Original line number Diff line number Diff line Loading @@ -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 src/com/android/settings/connecteddevice/usb/UsbDetailsFunctionsController.java +46 −30 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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() : " Loading Loading @@ -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) { Loading tests/robotests/src/com/android/settings/connecteddevice/usb/UsbDetailsFunctionsControllerTest.java +29 −0 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading Loading @@ -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() { Loading Loading @@ -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); Loading Loading
aconfig/settings_connecteddevice_flag_declarations.aconfig +10 −0 Original line number Diff line number Diff line Loading @@ -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
src/com/android/settings/connecteddevice/usb/UsbDetailsFunctionsController.java +46 −30 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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() : " Loading Loading @@ -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) { Loading
tests/robotests/src/com/android/settings/connecteddevice/usb/UsbDetailsFunctionsControllerTest.java +29 −0 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading Loading @@ -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() { Loading Loading @@ -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); Loading