From a24e2484e544a22d7ff143023970fdc254bd9509 Mon Sep 17 00:00:00 2001 From: Swarn Singh Date: Wed, 11 Jan 2023 17:00:54 +0530 Subject: Wi-Fi: Display Wi-Fi standard in signal icons for Wi-Fi 7 APs Update APIs and add corresponding xml files to accommodate Wi-Fi standard in signal icons for Wi-Fi 7 APs. Change-Id: I6717a3a40170551e3df2314fe523fa9186c91cb5 CRs-Fixed: 3369975 --- core/res/res/drawable/ic_wifi_7_signal_0.xml | 17 ++++++++++++++ core/res/res/drawable/ic_wifi_7_signal_1.xml | 20 ++++++++++++++++ core/res/res/drawable/ic_wifi_7_signal_2.xml | 20 ++++++++++++++++ core/res/res/drawable/ic_wifi_7_signal_3.xml | 20 ++++++++++++++++ core/res/res/drawable/ic_wifi_7_signal_4.xml | 17 ++++++++++++++ core/res/res/values/symbols.xml | 5 ++++ .../src/com/android/settingslib/Utils.java | 17 +++++++++++--- .../com/android/settingslib/wifi/WifiUtils.java | 16 ++++++++++--- packages/SystemUI/res/drawable/ic_qs_wifi_7_0.xml | 27 ++++++++++++++++++++++ packages/SystemUI/res/drawable/ic_qs_wifi_7_1.xml | 23 ++++++++++++++++++ packages/SystemUI/res/drawable/ic_qs_wifi_7_2.xml | 23 ++++++++++++++++++ packages/SystemUI/res/drawable/ic_qs_wifi_7_3.xml | 23 ++++++++++++++++++ packages/SystemUI/res/drawable/ic_qs_wifi_7_4.xml | 23 ++++++++++++++++++ .../systemui/statusbar/connectivity/WifiIcons.java | 23 ++++++++++++++++++ .../connectivity/WifiSignalController.java | 22 +++++++++++++++--- 15 files changed, 287 insertions(+), 9 deletions(-) create mode 100644 core/res/res/drawable/ic_wifi_7_signal_0.xml create mode 100644 core/res/res/drawable/ic_wifi_7_signal_1.xml create mode 100644 core/res/res/drawable/ic_wifi_7_signal_2.xml create mode 100644 core/res/res/drawable/ic_wifi_7_signal_3.xml create mode 100644 core/res/res/drawable/ic_wifi_7_signal_4.xml create mode 100644 packages/SystemUI/res/drawable/ic_qs_wifi_7_0.xml create mode 100644 packages/SystemUI/res/drawable/ic_qs_wifi_7_1.xml create mode 100644 packages/SystemUI/res/drawable/ic_qs_wifi_7_2.xml create mode 100644 packages/SystemUI/res/drawable/ic_qs_wifi_7_3.xml create mode 100644 packages/SystemUI/res/drawable/ic_qs_wifi_7_4.xml diff --git a/core/res/res/drawable/ic_wifi_7_signal_0.xml b/core/res/res/drawable/ic_wifi_7_signal_0.xml new file mode 100644 index 000000000000..d9dad63a6348 --- /dev/null +++ b/core/res/res/drawable/ic_wifi_7_signal_0.xml @@ -0,0 +1,17 @@ + + + + + + diff --git a/core/res/res/drawable/ic_wifi_7_signal_1.xml b/core/res/res/drawable/ic_wifi_7_signal_1.xml new file mode 100644 index 000000000000..9b2ce6f326b2 --- /dev/null +++ b/core/res/res/drawable/ic_wifi_7_signal_1.xml @@ -0,0 +1,20 @@ + + + + + + + diff --git a/core/res/res/drawable/ic_wifi_7_signal_2.xml b/core/res/res/drawable/ic_wifi_7_signal_2.xml new file mode 100644 index 000000000000..f9a961171e81 --- /dev/null +++ b/core/res/res/drawable/ic_wifi_7_signal_2.xml @@ -0,0 +1,20 @@ + + + + + + + diff --git a/core/res/res/drawable/ic_wifi_7_signal_3.xml b/core/res/res/drawable/ic_wifi_7_signal_3.xml new file mode 100644 index 000000000000..f2b1e49775fc --- /dev/null +++ b/core/res/res/drawable/ic_wifi_7_signal_3.xml @@ -0,0 +1,20 @@ + + + + + + + diff --git a/core/res/res/drawable/ic_wifi_7_signal_4.xml b/core/res/res/drawable/ic_wifi_7_signal_4.xml new file mode 100644 index 000000000000..1d6c748df4a2 --- /dev/null +++ b/core/res/res/drawable/ic_wifi_7_signal_4.xml @@ -0,0 +1,17 @@ + + + + + + diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index a243a262122a..c1bf882e7927 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -1407,6 +1407,11 @@ + + + + + diff --git a/packages/SettingsLib/src/com/android/settingslib/Utils.java b/packages/SettingsLib/src/com/android/settingslib/Utils.java index d889d0416919..9540aec7ced8 100644 --- a/packages/SettingsLib/src/com/android/settingslib/Utils.java +++ b/packages/SettingsLib/src/com/android/settingslib/Utils.java @@ -40,6 +40,7 @@ import android.telephony.AccessNetworkConstants; import android.telephony.NetworkRegistrationInfo; import android.telephony.ServiceState; import android.telephony.TelephonyManager; +import android.net.wifi.ScanResult; import androidx.annotation.NonNull; import androidx.annotation.RequiresApi; @@ -107,6 +108,14 @@ public class Utils { com.android.internal.R.drawable.ic_wifi_6_signal_4 }; + static final int[] WIFI_7_PIE = { + com.android.internal.R.drawable.ic_wifi_7_signal_0, + com.android.internal.R.drawable.ic_wifi_7_signal_1, + com.android.internal.R.drawable.ic_wifi_7_signal_2, + com.android.internal.R.drawable.ic_wifi_7_signal_3, + com.android.internal.R.drawable.ic_wifi_7_signal_4 + }; + public static void updateLocationEnabled(Context context, boolean enabled, int userId, int source) { Settings.Secure.putIntForUser( @@ -497,12 +506,14 @@ public class Utils { if (showX) return SHOW_X_WIFI_PIE[level]; switch (standard) { - case 4: + case ScanResult.WIFI_STANDARD_11N: return WIFI_4_PIE[level]; - case 5: + case ScanResult.WIFI_STANDARD_11AC: return WIFI_5_PIE[level]; - case 6: + case ScanResult.WIFI_STANDARD_11AX: return WIFI_6_PIE[level]; + case ScanResult.WIFI_STANDARD_11BE: + return WIFI_7_PIE[level]; default: return WIFI_PIE[level]; } diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/WifiUtils.java b/packages/SettingsLib/src/com/android/settingslib/wifi/WifiUtils.java index 5097ccc64c62..b599dd82f7f3 100644 --- a/packages/SettingsLib/src/com/android/settingslib/wifi/WifiUtils.java +++ b/packages/SettingsLib/src/com/android/settingslib/wifi/WifiUtils.java @@ -127,6 +127,14 @@ public class WifiUtils { com.android.internal.R.drawable.ic_wifi_6_signal_4 }; + static final int[] WIFI_7_PIE = { + com.android.internal.R.drawable.ic_wifi_7_signal_0, + com.android.internal.R.drawable.ic_wifi_7_signal_1, + com.android.internal.R.drawable.ic_wifi_7_signal_2, + com.android.internal.R.drawable.ic_wifi_7_signal_3, + com.android.internal.R.drawable.ic_wifi_7_signal_4 + }; + public static String buildLoggingSummary(AccessPoint accessPoint, WifiConfiguration config) { final StringBuilder summary = new StringBuilder(); final WifiInfo info = accessPoint.getInfo(); @@ -387,12 +395,14 @@ public class WifiUtils { } if (noInternet) return NO_INTERNET_WIFI_PIE[wifiLevel]; switch (standard) { - case 4: + case ScanResult.WIFI_STANDARD_11N: return WIFI_4_PIE[wifiLevel]; - case 5: + case ScanResult.WIFI_STANDARD_11AC: return WIFI_5_PIE[wifiLevel]; - case 6: + case ScanResult.WIFI_STANDARD_11AX: return WIFI_6_PIE[wifiLevel]; + case ScanResult.WIFI_STANDARD_11BE: + return WIFI_7_PIE[wifiLevel]; default: return WIFI_PIE[wifiLevel]; } diff --git a/packages/SystemUI/res/drawable/ic_qs_wifi_7_0.xml b/packages/SystemUI/res/drawable/ic_qs_wifi_7_0.xml new file mode 100644 index 000000000000..5d55f2b7c764 --- /dev/null +++ b/packages/SystemUI/res/drawable/ic_qs_wifi_7_0.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + diff --git a/packages/SystemUI/res/drawable/ic_qs_wifi_7_1.xml b/packages/SystemUI/res/drawable/ic_qs_wifi_7_1.xml new file mode 100644 index 000000000000..a09b069e986b --- /dev/null +++ b/packages/SystemUI/res/drawable/ic_qs_wifi_7_1.xml @@ -0,0 +1,23 @@ + + + + + + + + + + diff --git a/packages/SystemUI/res/drawable/ic_qs_wifi_7_2.xml b/packages/SystemUI/res/drawable/ic_qs_wifi_7_2.xml new file mode 100644 index 000000000000..54f42b5ed32f --- /dev/null +++ b/packages/SystemUI/res/drawable/ic_qs_wifi_7_2.xml @@ -0,0 +1,23 @@ + + + + + + + + + + diff --git a/packages/SystemUI/res/drawable/ic_qs_wifi_7_3.xml b/packages/SystemUI/res/drawable/ic_qs_wifi_7_3.xml new file mode 100644 index 000000000000..f67ba5cbfc92 --- /dev/null +++ b/packages/SystemUI/res/drawable/ic_qs_wifi_7_3.xml @@ -0,0 +1,23 @@ + + + + + + + + + + diff --git a/packages/SystemUI/res/drawable/ic_qs_wifi_7_4.xml b/packages/SystemUI/res/drawable/ic_qs_wifi_7_4.xml new file mode 100644 index 000000000000..ca1079e98d8a --- /dev/null +++ b/packages/SystemUI/res/drawable/ic_qs_wifi_7_4.xml @@ -0,0 +1,23 @@ + + + + + + + + + + diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/WifiIcons.java b/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/WifiIcons.java index 41cbae67eb02..78708ff5e7f1 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/WifiIcons.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/WifiIcons.java @@ -87,6 +87,22 @@ public class WifiIcons { R.drawable.ic_qs_wifi_6_4 }; + static final int[] WIFI_7_FULL_ICONS = { + com.android.internal.R.drawable.ic_wifi_7_signal_0, + com.android.internal.R.drawable.ic_wifi_7_signal_1, + com.android.internal.R.drawable.ic_wifi_7_signal_2, + com.android.internal.R.drawable.ic_wifi_7_signal_3, + com.android.internal.R.drawable.ic_wifi_7_signal_4 + }; + + private static final int[] WIFI_7_NO_INTERNET_ICONS = { + R.drawable.ic_qs_wifi_7_0, + R.drawable.ic_qs_wifi_7_1, + R.drawable.ic_qs_wifi_7_2, + R.drawable.ic_qs_wifi_7_3, + R.drawable.ic_qs_wifi_7_4 + }; + public static final int[][] QS_WIFI_SIGNAL_STRENGTH = { WIFI_NO_INTERNET_ICONS, WIFI_FULL_ICONS @@ -115,6 +131,13 @@ public class WifiIcons { static final int[][] WIFI_6_SIGNAL_STRENGTH = QS_WIFI_6_SIGNAL_STRENGTH; + public static final int[][] QS_WIFI_7_SIGNAL_STRENGTH = { + WIFI_7_NO_INTERNET_ICONS, + WIFI_7_FULL_ICONS + }; + + static final int[][] WIFI_7_SIGNAL_STRENGTH = QS_WIFI_7_SIGNAL_STRENGTH; + public static final int QS_WIFI_DISABLED = com.android.internal.R.drawable.ic_wifi_signal_0; public static final int QS_WIFI_NO_NETWORK = com.android.internal.R.drawable.ic_wifi_signal_0; public static final int WIFI_NO_NETWORK = QS_WIFI_NO_NETWORK; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/WifiSignalController.java b/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/WifiSignalController.java index f51ae1b4be82..9cba877983b6 100755 --- a/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/WifiSignalController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/WifiSignalController.java @@ -25,6 +25,7 @@ import android.net.NetworkCapabilities; import android.net.wifi.WifiManager; import android.os.Handler; import android.text.Html; +import android.net.wifi.ScanResult; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.Preconditions; @@ -53,6 +54,7 @@ public class WifiSignalController extends SignalController private final IconGroup mWifi4IconGroup; private final IconGroup mWifi5IconGroup; private final IconGroup mWifi6IconGroup; + private final IconGroup mWifi7IconGroup; public WifiSignalController( Context context, @@ -122,6 +124,18 @@ public class WifiSignalController extends SignalController AccessibilityContentDescriptions.WIFI_NO_CONNECTION ); + mWifi7IconGroup = new IconGroup( + "Wi-Fi 7 Icons", + WifiIcons.WIFI_7_SIGNAL_STRENGTH, + WifiIcons.QS_WIFI_7_SIGNAL_STRENGTH, + AccessibilityContentDescriptions.WIFI_CONNECTION_STRENGTH, + WifiIcons.WIFI_NO_NETWORK, + WifiIcons.QS_WIFI_NO_NETWORK, + WifiIcons.WIFI_NO_NETWORK, + WifiIcons.QS_WIFI_NO_NETWORK, + AccessibilityContentDescriptions.WIFI_NO_CONNECTION + ); + mCurrentState.iconGroup = mLastState.iconGroup = mDefaultWifiIconGroup; } @@ -233,12 +247,14 @@ public class WifiSignalController extends SignalController private void updateIconGroup() { - if (mCurrentState.wifiStandard == 4) { + if (mCurrentState.wifiStandard == ScanResult.WIFI_STANDARD_11N) { mCurrentState.iconGroup = mWifi4IconGroup; - } else if (mCurrentState.wifiStandard == 5) { + } else if (mCurrentState.wifiStandard == ScanResult.WIFI_STANDARD_11AC) { mCurrentState.iconGroup = mWifi5IconGroup; - } else if (mCurrentState.wifiStandard == 6) { + } else if (mCurrentState.wifiStandard == ScanResult.WIFI_STANDARD_11AX) { mCurrentState.iconGroup = mWifi6IconGroup; + } else if (mCurrentState.wifiStandard == ScanResult.WIFI_STANDARD_11BE) { + mCurrentState.iconGroup = mWifi7IconGroup; } else { mCurrentState.iconGroup = mDefaultWifiIconGroup; } -- cgit v1.2.3 From eb3edef5ada09ddfa14848b46516ee12c2695260 Mon Sep 17 00:00:00 2001 From: junklu Date: Tue, 14 Feb 2023 16:08:26 +0800 Subject: SystemUI: Fix emergency call button shows on lock screen The control logic of emergency call button was removed in the refactoring, causing the emergency call button to show on the lock screen. Migrate the control logic to the refactored file. Change-Id: Iac771cd6c8c167c15832bdab1fccfcff3b6c8c50 CRs-Fixed: 3405434 --- .../keyguard/ui/binder/KeyguardBottomAreaViewBinder.kt | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardBottomAreaViewBinder.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardBottomAreaViewBinder.kt index c4e3d4e4c1b5..d905cb7280a7 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardBottomAreaViewBinder.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardBottomAreaViewBinder.kt @@ -27,6 +27,7 @@ import androidx.core.view.isVisible import androidx.core.view.updateLayoutParams import androidx.lifecycle.Lifecycle import androidx.lifecycle.repeatOnLifecycle +import com.android.keyguard.EmergencyCarrierArea import com.android.settingslib.Utils import com.android.systemui.R import com.android.systemui.animation.ActivityLaunchAnimator @@ -86,6 +87,8 @@ object KeyguardBottomAreaViewBinder { val indicationText: TextView = view.requireViewById(R.id.keyguard_indication_text) val indicationTextBottom: TextView = view.requireViewById(R.id.keyguard_indication_text_bottom) + val emergencyCarrierArea: EmergencyCarrierArea = + view.requireViewById(R.id.keyguard_selector_fade_container) view.clipChildren = false view.clipToPadding = false @@ -122,6 +125,16 @@ object KeyguardBottomAreaViewBinder { } else { View.INVISIBLE } + val showEmergencyButton: Boolean = + view.context.resources.getBoolean(R.bool.config_showEmergencyButton) + emergencyCarrierArea.visibility = + if (!showEmergencyButton) { + View.GONE + } else if (isVisible) { + View.VISIBLE + } else { + View.INVISIBLE + } } } @@ -138,6 +151,7 @@ object KeyguardBottomAreaViewBinder { indicationArea.alpha = alpha startButton.alpha = alpha endButton.alpha = alpha + emergencyCarrierArea.alpha = alpha } } -- cgit v1.2.3 From a66951386e2cfd176cbb487849ecd41c914e8f7b Mon Sep 17 00:00:00 2001 From: Vala Zadeh Date: Thu, 9 Feb 2023 10:52:44 -0800 Subject: Fix NPE when retrieving IMS registration status Change-Id: I272a4534d7cb3f31c64e984a39b5cb52da457a04 CRs-Fixed: 3400185 --- .../com/android/systemui/qs/tiles/dialog/InternetDialog.java | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialog.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialog.java index ac3645b8921b..5ee5960cb01e 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialog.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialog.java @@ -630,11 +630,13 @@ public class InternetDialog extends SystemUIDialog implements mIsCallIdle = mTelephonyManager.getCallState() == TelephonyManager.CALL_STATE_IDLE; IImsRegistration imsRegistrationImpl = mTelephonyManager.getImsRegistration( mSubscriptionManager.getSlotIndex(mDefaultDataSubId), FEATURE_MMTEL); - try { - mIsImsRegisteredOverCiwlan = imsRegistrationImpl.getRegistrationTechnology() == - REGISTRATION_TECH_CROSS_SIM; - } catch (RemoteException ex) { - Log.e(TAG, "getRegistrationTechnology failed", ex); + if (imsRegistrationImpl != null) { + try { + mIsImsRegisteredOverCiwlan = imsRegistrationImpl.getRegistrationTechnology() == + REGISTRATION_TECH_CROSS_SIM; + } catch (RemoteException ex) { + Log.e(TAG, "getRegistrationTechnology failed", ex); + } } if (mInternetDialogController.isMobileDataEnabled() && !mIsCallIdle && mIsImsRegisteredOverCiwlan) { -- cgit v1.2.3 From 7861df83464ce866e92132cf666acdd1adeaf2ee Mon Sep 17 00:00:00 2001 From: Siddhesh Sahane Date: Thu, 16 Feb 2023 11:44:13 -0800 Subject: base: base: delay LE Audio device unavailability -Like A2DP, add delay for LE Audio unavailability in order to account broadcast noisy intent delay. -This added delay will avoid any leakage of data over speaker when CNSSSSR triggers during ongoing music on BLE headset. -Disconnect DEVICE_IN_BLE_HEADSET also as a part of disconnectLeAudioUnicast(). Change-Id: Ic37c0d428a33e95969097c15119bdbfb14bf4746 CRs-Fixed: 3379602 --- services/art-profile | 3 ++ .../android/server/audio/AudioDeviceBroker.java | 17 +++++++++ .../android/server/audio/AudioDeviceInventory.java | 41 ++++++++++++++++------ 3 files changed, 51 insertions(+), 10 deletions(-) diff --git a/services/art-profile b/services/art-profile index 948661d12c5b..8c49766bd991 100644 --- a/services/art-profile +++ b/services/art-profile @@ -12663,6 +12663,7 @@ HSPLcom/android/server/audio/AudioDeviceBroker;->topCommunicationRouteClient()Lc PLcom/android/server/audio/AudioDeviceBroker;->unregisterCommunicationDeviceDispatcher(Landroid/media/ICommunicationDeviceDispatcher;)V HSPLcom/android/server/audio/AudioDeviceBroker;->updateActiveCommunicationDevice()V HSPLcom/android/server/audio/AudioDeviceBroker;->waitForBrokerHandlerCreation()V +PLcom/android/server/audio/AudioDeviceBroker;->setLeAudioTimeout(Ljava/lang/String;II)V PLcom/android/server/audio/AudioDeviceInventory$$ExternalSyntheticLambda0;->(Lcom/android/server/audio/AudioDeviceInventory;)V PLcom/android/server/audio/AudioDeviceInventory$$ExternalSyntheticLambda0;->test(Ljava/lang/Object;)Z PLcom/android/server/audio/AudioDeviceInventory$$ExternalSyntheticLambda10;->(Landroid/util/ArraySet;)V @@ -12760,6 +12761,8 @@ PLcom/android/server/audio/AudioDeviceInventory;->setPreferredDevicesForStrategy HSPLcom/android/server/audio/AudioDeviceInventory;->setWiredDeviceConnectionState(Landroid/media/AudioDeviceAttributes;ILjava/lang/String;)I HSPLcom/android/server/audio/AudioDeviceInventory;->startWatchingRoutes(Landroid/media/IAudioRoutesObserver;)Landroid/media/AudioRoutesInfo; HSPLcom/android/server/audio/AudioDeviceInventory;->updateAudioRoutes(II)V +PLcom/android/server/audio/AudioDeviceInventory;->makeLeAudioUnavailableLater(Ljava/lang/String;II)V +PLcom/android/server/audio/AudioDeviceInventory;->onMakeLeAudioUnavailableNow(Ljava/lang/String;I)V HSPLcom/android/server/audio/AudioEventLogger$Event;->()V HSPLcom/android/server/audio/AudioEventLogger$Event;->()V HSPLcom/android/server/audio/AudioEventLogger$Event;->printLog(ILjava/lang/String;)Lcom/android/server/audio/AudioEventLogger$Event; diff --git a/services/core/java/com/android/server/audio/AudioDeviceBroker.java b/services/core/java/com/android/server/audio/AudioDeviceBroker.java index c7f0336941a9..506754ae4e08 100644 --- a/services/core/java/com/android/server/audio/AudioDeviceBroker.java +++ b/services/core/java/com/android/server/audio/AudioDeviceBroker.java @@ -12,6 +12,11 @@ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. + * + * Changes from Qualcomm Innovation Center are provided under the following license: + * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved. + * SPDX-License-Identifier: BSD-3-Clause-Clear + * */ package com.android.server.audio; @@ -1160,6 +1165,10 @@ import java.util.concurrent.atomic.AtomicBoolean; sendILMsg(MSG_IL_BTA2DP_TIMEOUT, SENDMSG_QUEUE, a2dpCodec, address, delayMs); } + /*package*/ void setLeAudioTimeout(String address, int device, int delayMs) { + sendILMsg(MSG_IL_BTLEA_TIMEOUT, SENDMSG_QUEUE, device, address, delayMs); + } + /*package*/ void setAvrcpAbsoluteVolumeSupported(boolean supported) { synchronized (mDeviceStateLock) { mBtHelper.setAvrcpAbsoluteVolumeSupported(supported); @@ -1543,6 +1552,11 @@ import java.util.concurrent.atomic.AtomicBoolean; final int capturePreset = msg.arg1; mDeviceInventory.onSaveClearPreferredDevicesForCapturePreset(capturePreset); } break; + case MSG_IL_BTLEA_TIMEOUT: + synchronized (mDeviceStateLock) { + mDeviceInventory.onMakeLeAudioUnavailableNow((String) msg.obj, msg.arg1); + } + break; default: Log.wtf(TAG, "Invalid message " + msg.what); } @@ -1618,6 +1632,7 @@ import java.util.concurrent.atomic.AtomicBoolean; // process set volume for Le Audio, obj is BleVolumeInfo private static final int MSG_II_SET_LE_AUDIO_OUT_VOLUME = 46; private static final int MSG_L_A2DP_DEVICE_CONFIG_CHANGE_SHO = 47; + private static final int MSG_IL_BTLEA_TIMEOUT = 48; private static boolean isMessageHandledUnderWakelock(int msgId) { switch(msgId) { @@ -1631,6 +1646,7 @@ import java.util.concurrent.atomic.AtomicBoolean; case MSG_L_HEARING_AID_DEVICE_CONNECTION_CHANGE_EXT: case MSG_CHECK_MUTE_MUSIC: case MSG_L_A2DP_ACTIVE_DEVICE_CHANGE_EXT: + case MSG_IL_BTLEA_TIMEOUT: return true; default: return false; @@ -1716,6 +1732,7 @@ import java.util.concurrent.atomic.AtomicBoolean; case MSG_L_SET_BT_ACTIVE_DEVICE: case MSG_L_SET_WIRED_DEVICE_CONNECTION_STATE: case MSG_IL_BTA2DP_TIMEOUT: + case MSG_IL_BTLEA_TIMEOUT: case MSG_L_A2DP_DEVICE_CONFIG_CHANGE: case MSG_L_A2DP_DEVICE_CONFIG_CHANGE_SHO: if (sLastDeviceConnectMsgTime >= time) { diff --git a/services/core/java/com/android/server/audio/AudioDeviceInventory.java b/services/core/java/com/android/server/audio/AudioDeviceInventory.java index 55366437aa8f..4dcd5e5254e7 100644 --- a/services/core/java/com/android/server/audio/AudioDeviceInventory.java +++ b/services/core/java/com/android/server/audio/AudioDeviceInventory.java @@ -12,6 +12,11 @@ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. + * + * Changes from Qualcomm Innovation Center are provided under the following license: + * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved. + * SPDX-License-Identifier: BSD-3-Clause-Clear + * */ package com.android.server.audio; @@ -513,6 +518,12 @@ public class AudioDeviceInventory { } } + /*package*/ void onMakeLeAudioUnavailableNow(String address, int device) { + synchronized (mDevicesLock) { + makeLeAudioDeviceUnavailable(address, device); + } + } + /*package*/ void onReportNewRoutes() { int n = mRoutesObservers.beginBroadcast(); if (n > 0) { @@ -893,15 +904,11 @@ public class AudioDeviceInventory { } /*package*/ void disconnectLeAudio(int device) { - if (device != AudioSystem.DEVICE_OUT_BLE_HEADSET - && device != AudioSystem.DEVICE_OUT_BLE_BROADCAST) { - Log.e(TAG, "disconnectLeAudio: Can't disconnect not LE Audio device " + device); - return; - } - synchronized (mDevicesLock) { final ArraySet toRemove = new ArraySet<>(); - // Disconnect ALL DEVICE_OUT_BLE_HEADSET or DEVICE_OUT_BLE_BROADCAST devices + /* Disconnect ALL DEVICE_OUT_BLE_HEADSET, + * DEVICE_IN_BLE_HEADSET or DEVICE_OUT_BLE_BROADCAST devices + */ mConnectedDevices.values().forEach(deviceInfo -> { if (deviceInfo.mDeviceType == device) { toRemove.add(deviceInfo.mDeviceAddress); @@ -910,17 +917,22 @@ public class AudioDeviceInventory { new MediaMetrics.Item(mMetricsId + "disconnectLeAudio") .record(); if (toRemove.size() > 0) { - final int delay = checkSendBecomingNoisyIntentInt(device, 0, + final int delay; + if (device != AudioSystem.DEVICE_IN_BLE_HEADSET) { + delay = checkSendBecomingNoisyIntentInt(device, 0, AudioSystem.DEVICE_NONE); + } else { + delay = 0; + } toRemove.stream().forEach(deviceAddress -> - makeLeAudioDeviceUnavailable(deviceAddress, device) - ); + makeLeAudioUnavailableLater(deviceAddress, delay, device)); } } } /*package*/ void disconnectLeAudioUnicast() { disconnectLeAudio(AudioSystem.DEVICE_OUT_BLE_HEADSET); + disconnectLeAudio(AudioSystem.DEVICE_IN_BLE_HEADSET); } /*package*/ void disconnectLeAudioBroadcast() { @@ -1179,6 +1191,15 @@ public class AudioDeviceInventory { mDeviceBroker.setA2dpTimeout(address, a2dpCodec, delayMs); } + @GuardedBy("mDevicesLock") + private void makeLeAudioUnavailableLater(String address, int delayMs, int device) { + final String deviceKey = + DeviceInfo.makeDeviceListKey(device, address); + // the device will be made unavailable later, so consider it disconnected right away + mConnectedDevices.remove(deviceKey); + // send the delayed message to make the device unavailable later + mDeviceBroker.setLeAudioTimeout(address, device, delayMs); + } @GuardedBy("mDevicesLock") private void makeA2dpSrcAvailable(String address, int a2dpCodec) { -- cgit v1.2.3