diff --git a/res/values/strings.xml b/res/values/strings.xml index c1c6a92781b..8bc30d8c0d6 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -5654,7 +5654,7 @@ Battery may run out earlier than usual - Preserving battery health + Optimizing for battery health Battery limited temporarily. Tap to learn more. diff --git a/src/com/android/settings/connecteddevice/usb/UsbConnectionBroadcastReceiver.java b/src/com/android/settings/connecteddevice/usb/UsbConnectionBroadcastReceiver.java index e557847d06e..a203534dded 100644 --- a/src/com/android/settings/connecteddevice/usb/UsbConnectionBroadcastReceiver.java +++ b/src/com/android/settings/connecteddevice/usb/UsbConnectionBroadcastReceiver.java @@ -72,6 +72,9 @@ public class UsbConnectionBroadcastReceiver extends BroadcastReceiver implements if (intent.getExtras().getBoolean(UsbManager.USB_FUNCTION_RNDIS)) { functions |= UsbManager.FUNCTION_RNDIS; } + if (intent.getExtras().getBoolean(UsbManager.USB_FUNCTION_ACCESSORY)) { + functions |= UsbManager.FUNCTION_ACCESSORY; + } mFunctions = functions; mDataRole = mUsbBackend.getDataRole(); mPowerRole = mUsbBackend.getPowerRole(); diff --git a/src/com/android/settings/connecteddevice/usb/UsbDetailsFunctionsController.java b/src/com/android/settings/connecteddevice/usb/UsbDetailsFunctionsController.java index 31bca1241ec..99e9d50be32 100644 --- a/src/com/android/settings/connecteddevice/usb/UsbDetailsFunctionsController.java +++ b/src/com/android/settings/connecteddevice/usb/UsbDetailsFunctionsController.java @@ -22,6 +22,7 @@ import static android.net.ConnectivityManager.TETHERING_USB; import android.content.Context; import android.hardware.usb.UsbManager; import android.net.ConnectivityManager; +import android.util.Log; import androidx.annotation.VisibleForTesting; import androidx.preference.PreferenceCategory; @@ -40,6 +41,9 @@ import java.util.Map; public class UsbDetailsFunctionsController extends UsbDetailsController implements RadioButtonPreference.OnClickListener { + private static final String TAG = "UsbFunctionsCtrl"; + private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG); + static final Map FUNCTIONS_MAP = new LinkedHashMap<>(); static { @@ -88,6 +92,10 @@ public class UsbDetailsFunctionsController extends UsbDetailsController @Override protected void refresh(boolean connected, long functions, int powerRole, int dataRole) { + if (DEBUG) { + Log.d(TAG, "refresh() connected : " + connected + ", functions : " + functions + + ", powerRole : " + powerRole + ", dataRole : " + dataRole); + } if (!connected || dataRole != DATA_ROLE_DEVICE) { mProfilesContainer.setEnabled(false); } else { @@ -100,7 +108,11 @@ public class UsbDetailsFunctionsController extends UsbDetailsController pref = getProfilePreference(UsbBackend.usbFunctionsToString(option), title); // Only show supported options if (mUsbBackend.areFunctionsSupported(option)) { - pref.setChecked(functions == option); + if (isAccessoryMode(functions)) { + pref.setChecked(UsbManager.FUNCTION_MTP == option); + } else { + pref.setChecked(functions == option); + } } else { mProfilesContainer.removePreference(pref); } @@ -111,7 +123,14 @@ public class UsbDetailsFunctionsController extends UsbDetailsController public void onRadioButtonClicked(RadioButtonPreference preference) { final long function = UsbBackend.usbFunctionsFromString(preference.getKey()); final long previousFunction = mUsbBackend.getCurrentFunctions(); - if (function != previousFunction && !Utils.isMonkeyRunning()) { + if (DEBUG) { + Log.d(TAG, "onRadioButtonClicked() function : " + function + ", toString() : " + + UsbManager.usbFunctionsToString(function) + ", previousFunction : " + + previousFunction + ", toString() : " + + UsbManager.usbFunctionsToString(previousFunction)); + } + if (function != previousFunction && !Utils.isMonkeyRunning() + && !shouldIgnoreClickEvent(function, previousFunction)) { mPreviousFunction = previousFunction; //Update the UI in advance to make it looks smooth @@ -134,6 +153,14 @@ public class UsbDetailsFunctionsController extends UsbDetailsController } } + private boolean shouldIgnoreClickEvent(long function, long previousFunction) { + return isAccessoryMode(previousFunction) && function == UsbManager.FUNCTION_MTP; + } + + private boolean isAccessoryMode(long function) { + return (function & UsbManager.FUNCTION_ACCESSORY) != 0; + } + @Override public boolean isAvailable() { return !Utils.isMonkeyRunning(); diff --git a/tests/robotests/src/com/android/settings/connecteddevice/usb/UsbDetailsFunctionsControllerTest.java b/tests/robotests/src/com/android/settings/connecteddevice/usb/UsbDetailsFunctionsControllerTest.java index 3a6eec0fd89..3ea27562eb8 100644 --- a/tests/robotests/src/com/android/settings/connecteddevice/usb/UsbDetailsFunctionsControllerTest.java +++ b/tests/robotests/src/com/android/settings/connecteddevice/usb/UsbDetailsFunctionsControllerTest.java @@ -153,6 +153,19 @@ public class UsbDetailsFunctionsControllerTest { assertThat(prefs.get(0).isChecked()).isTrue(); } + @Test + public void displayRefresh_accessoryEnabled_shouldCheckSwitches() { + when(mUsbBackend.areFunctionsSupported(anyLong())).thenReturn(true); + + mDetailsFunctionsController.refresh(true, UsbManager.FUNCTION_ACCESSORY, POWER_ROLE_SINK, + DATA_ROLE_DEVICE); + List prefs = getRadioPreferences(); + + assertThat(prefs.get(0).getKey()) + .isEqualTo(UsbBackend.usbFunctionsToString(UsbManager.FUNCTION_MTP)); + assertThat(prefs.get(0).isChecked()).isTrue(); + } + @Test public void onClickMtp_noneEnabled_shouldEnableMtp() { when(mUsbBackend.areFunctionsSupported(anyLong())).thenReturn(true); @@ -250,6 +263,30 @@ public class UsbDetailsFunctionsControllerTest { UsbManager.FUNCTION_MTP); } + @Test + public void onRadioButtonClicked_functionMtp_inAccessoryMode_doNothing() { + mRadioButtonPreference.setKey(UsbBackend.usbFunctionsToString(UsbManager.FUNCTION_MTP)); + doReturn(UsbManager.FUNCTION_ACCESSORY).when(mUsbBackend).getCurrentFunctions(); + + mDetailsFunctionsController.mPreviousFunction = UsbManager.FUNCTION_ACCESSORY; + mDetailsFunctionsController.onRadioButtonClicked(mRadioButtonPreference); + + assertThat(mDetailsFunctionsController.mPreviousFunction).isEqualTo( + UsbManager.FUNCTION_ACCESSORY); + } + + @Test + public void onRadioButtonClicked_functionMtp_inAccessoryCombinationsMode_doNothing() { + final long function = UsbManager.FUNCTION_ACCESSORY | UsbManager.FUNCTION_AUDIO_SOURCE; + mRadioButtonPreference.setKey(UsbBackend.usbFunctionsToString(UsbManager.FUNCTION_MTP)); + doReturn(UsbManager.FUNCTION_ACCESSORY).when(mUsbBackend).getCurrentFunctions(); + + mDetailsFunctionsController.mPreviousFunction = function; + mDetailsFunctionsController.onRadioButtonClicked(mRadioButtonPreference); + + assertThat(mDetailsFunctionsController.mPreviousFunction).isEqualTo(function); + } + @Test public void onRadioButtonClicked_clickSameButton_doNothing() { mRadioButtonPreference.setKey(UsbBackend.usbFunctionsToString(UsbManager.FUNCTION_PTP));