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));