From 91ed63124cee163e4e72154f374de91aa8a8e2fb Mon Sep 17 00:00:00 2001 From: Hugh Chen Date: Mon, 14 Sep 2020 15:55:57 +0800 Subject: [PATCH 1/4] Fix the usb menu didn't switch to "File Transfer/Android Auto" right after connecting to the car unit. - Before this CL, the usb receivers didn't check the extra information of the accessory. It causes the usb menu not to be aware that the usb port is switched to accessory mode. In this CL, the receivers will check whether the intent has an accessory extra. If the usb port is switched to accessory mode the usb menu will switch to "File Transfer/Android Auto". Bug: 162451162 Test: make -j42 RunSettingsRoboTests Change-Id: I0eca89a23670c674b74753fc526256cc1d52e759 Merged-In: I0eca89a23670c674b74753fc526256cc1d52e759 (cherry picked from commit af0a45bb7a8f2317965dbda41c570ad684c08d52) --- .../usb/UsbConnectionBroadcastReceiver.java | 3 +++ .../usb/UsbDetailsFunctionsController.java | 6 +++++- .../usb/UsbDetailsFunctionsControllerTest.java | 13 +++++++++++++ 3 files changed, 21 insertions(+), 1 deletion(-) 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..ded1294c94c 100644 --- a/src/com/android/settings/connecteddevice/usb/UsbDetailsFunctionsController.java +++ b/src/com/android/settings/connecteddevice/usb/UsbDetailsFunctionsController.java @@ -100,7 +100,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 (functions == UsbManager.FUNCTION_ACCESSORY) { + pref.setChecked(UsbManager.FUNCTION_MTP == option); + } else { + pref.setChecked(functions == option); + } } else { mProfilesContainer.removePreference(pref); } 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..149df6ef33e 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); From e8dc7bc2831db9eae8aeba2fde68eea4eb20c097 Mon Sep 17 00:00:00 2001 From: Hugh Chen Date: Mon, 28 Sep 2020 14:58:34 +0800 Subject: [PATCH 2/4] Do nothing when choosing file transfer when in accessory mode - Before this CL, the device will be disconnected and reconnected to accessory mode when choosing "File transfer/Android Auto" in accessory mode. Because the USB menu didn't check state of function, it should do nothing when choosing "File transfer/Android Auto" in accessory mode. This CL add condition to check state of function, it will do nothing when choosing "File transfer/Android Auto" in accessory mode. Bug: 162451162 Test: make -j42 RunSettingsRoboTests Change-Id: I1749c6c43d2a192e4ce1bf1ae5343ff8deafbe48 Merged-In: I1749c6c43d2a192e4ce1bf1ae5343ff8deafbe48 (cherry picked from commit 3251a04ba3bb21bf5309bfd4431250ad567eca94) --- .../usb/UsbDetailsFunctionsController.java | 8 +++++++- .../usb/UsbDetailsFunctionsControllerTest.java | 12 ++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/com/android/settings/connecteddevice/usb/UsbDetailsFunctionsController.java b/src/com/android/settings/connecteddevice/usb/UsbDetailsFunctionsController.java index ded1294c94c..b91bb794265 100644 --- a/src/com/android/settings/connecteddevice/usb/UsbDetailsFunctionsController.java +++ b/src/com/android/settings/connecteddevice/usb/UsbDetailsFunctionsController.java @@ -115,7 +115,8 @@ 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 (function != previousFunction && !Utils.isMonkeyRunning() + && !shouldIgnoreClickEvent(function, previousFunction)) { mPreviousFunction = previousFunction; //Update the UI in advance to make it looks smooth @@ -138,6 +139,11 @@ public class UsbDetailsFunctionsController extends UsbDetailsController } } + private boolean shouldIgnoreClickEvent(long function, long previousFunction) { + return previousFunction == UsbManager.FUNCTION_ACCESSORY + && function == UsbManager.FUNCTION_MTP; + } + @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 149df6ef33e..9e31ca13524 100644 --- a/tests/robotests/src/com/android/settings/connecteddevice/usb/UsbDetailsFunctionsControllerTest.java +++ b/tests/robotests/src/com/android/settings/connecteddevice/usb/UsbDetailsFunctionsControllerTest.java @@ -263,6 +263,18 @@ 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_clickSameButton_doNothing() { mRadioButtonPreference.setKey(UsbBackend.usbFunctionsToString(UsbManager.FUNCTION_PTP)); From b767df1a08c99f21501e8323826912987a62affa Mon Sep 17 00:00:00 2001 From: Hugh Chen Date: Mon, 14 Dec 2020 15:31:02 +0800 Subject: [PATCH 3/4] Add condition to check case of accessory combinations Before this CL, we only compare whether the value of function is equal to accessory to ensure usb is in accessory mode. But in some cases there are different accessory combinations, like "accessory,audio source". It will make the condition return false when encountering accessory combinations. This CL will check whether the function will include accessory mode to fix this issue. Bug: 162451162 Test: make -j42 RunSettingsRoboTests Change-Id: I7c80f02de5340799e292949608e19b86b187b982 Merged-In: I7c80f02de5340799e292949608e19b86b187b982 (cherry picked from commit 7d71081d45be8346c3ce342422644f6c7c86f398) --- .../usb/UsbDetailsFunctionsController.java | 23 ++++++++++++++++--- .../UsbDetailsFunctionsControllerTest.java | 12 ++++++++++ 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/src/com/android/settings/connecteddevice/usb/UsbDetailsFunctionsController.java b/src/com/android/settings/connecteddevice/usb/UsbDetailsFunctionsController.java index b91bb794265..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,7 @@ public class UsbDetailsFunctionsController extends UsbDetailsController pref = getProfilePreference(UsbBackend.usbFunctionsToString(option), title); // Only show supported options if (mUsbBackend.areFunctionsSupported(option)) { - if (functions == UsbManager.FUNCTION_ACCESSORY) { + if (isAccessoryMode(functions)) { pref.setChecked(UsbManager.FUNCTION_MTP == option); } else { pref.setChecked(functions == option); @@ -115,6 +123,12 @@ public class UsbDetailsFunctionsController extends UsbDetailsController public void onRadioButtonClicked(RadioButtonPreference preference) { final long function = UsbBackend.usbFunctionsFromString(preference.getKey()); final long previousFunction = mUsbBackend.getCurrentFunctions(); + 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; @@ -140,8 +154,11 @@ public class UsbDetailsFunctionsController extends UsbDetailsController } private boolean shouldIgnoreClickEvent(long function, long previousFunction) { - return previousFunction == UsbManager.FUNCTION_ACCESSORY - && function == UsbManager.FUNCTION_MTP; + return isAccessoryMode(previousFunction) && function == UsbManager.FUNCTION_MTP; + } + + private boolean isAccessoryMode(long function) { + return (function & UsbManager.FUNCTION_ACCESSORY) != 0; } @Override 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 9e31ca13524..3ea27562eb8 100644 --- a/tests/robotests/src/com/android/settings/connecteddevice/usb/UsbDetailsFunctionsControllerTest.java +++ b/tests/robotests/src/com/android/settings/connecteddevice/usb/UsbDetailsFunctionsControllerTest.java @@ -275,6 +275,18 @@ public class UsbDetailsFunctionsControllerTest { 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)); From ee1d07d59b9c547d17325909d10a046ea6b081c8 Mon Sep 17 00:00:00 2001 From: "Wesley.CW Wang" Date: Tue, 15 Dec 2020 18:18:42 +0800 Subject: [PATCH 4/4] Update Battery Defender tips title Bug: 175662315 Test: make SettingsRoboTests Change-Id: I13ba773ea4402c5ae54260a8b8cbea4620eed535 --- res/values/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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.