summaryrefslogtreecommitdiff
path: root/services/accessibility
diff options
context:
space:
mode:
author Jason Hsu <jasonwshsu@google.com> 2025-03-06 21:49:50 -0800
committer Android (Google) Code Review <android-gerrit@google.com> 2025-03-06 21:49:50 -0800
commit3ee821a4b67062df4b7265ce0445b76fa446bd98 (patch)
tree1569e53f58c28302231f729afa5b42904167c4c8 /services/accessibility
parent5e35d8cabacf8f1020ed295c0b1b18735bf40361 (diff)
parenta0241d2dbc04304e5211434721fc8e026c07235f (diff)
Merge "Fix to not show mic input notification when communication device is other bluetooth device" into main
Diffstat (limited to 'services/accessibility')
-rw-r--r--services/accessibility/accessibility.aconfig10
-rw-r--r--services/accessibility/java/com/android/server/accessibility/HearingDevicePhoneCallNotificationController.java49
2 files changed, 53 insertions, 6 deletions
diff --git a/services/accessibility/accessibility.aconfig b/services/accessibility/accessibility.aconfig
index 64a4a4ae3c0d..35db3c6f0a6d 100644
--- a/services/accessibility/accessibility.aconfig
+++ b/services/accessibility/accessibility.aconfig
@@ -346,3 +346,13 @@ flag {
purpose: PURPOSE_BUGFIX
}
}
+
+flag {
+ name: "hearing_input_change_when_comm_device"
+ namespace: "accessibility"
+ description: "Listen to the CommunicationDeviceChanged to show hearing device input notification."
+ bug: "394070235"
+ metadata {
+ purpose: PURPOSE_BUGFIX
+ }
+}
diff --git a/services/accessibility/java/com/android/server/accessibility/HearingDevicePhoneCallNotificationController.java b/services/accessibility/java/com/android/server/accessibility/HearingDevicePhoneCallNotificationController.java
index 10dffb59317e..805d7f820c8d 100644
--- a/services/accessibility/java/com/android/server/accessibility/HearingDevicePhoneCallNotificationController.java
+++ b/services/accessibility/java/com/android/server/accessibility/HearingDevicePhoneCallNotificationController.java
@@ -65,9 +65,9 @@ public class HearingDevicePhoneCallNotificationController {
private final Executor mCallbackExecutor;
public HearingDevicePhoneCallNotificationController(@NonNull Context context) {
- mTelephonyListener = new CallStateListener(context);
mTelephonyManager = context.getSystemService(TelephonyManager.class);
mCallbackExecutor = Executors.newSingleThreadExecutor();
+ mTelephonyListener = new CallStateListener(context, mCallbackExecutor);
}
@VisibleForTesting
@@ -109,14 +109,29 @@ public class HearingDevicePhoneCallNotificationController {
AudioDeviceAttributes.ROLE_INPUT, AudioDeviceInfo.TYPE_BUILTIN_MIC, "");
private final Context mContext;
+ private final Executor mCommDeviceChangedExecutor;
+ private final AudioManager.OnCommunicationDeviceChangedListener mCommDeviceChangedListener;
private NotificationManager mNotificationManager;
private AudioManager mAudioManager;
private BroadcastReceiver mHearingDeviceActionReceiver;
private BluetoothDevice mHearingDevice;
+ private boolean mIsCommDeviceChangedRegistered = false;
private boolean mIsNotificationShown = false;
- CallStateListener(@NonNull Context context) {
+ CallStateListener(@NonNull Context context, @NonNull Executor executor) {
mContext = context;
+ mCommDeviceChangedExecutor = executor;
+ mCommDeviceChangedListener = device -> {
+ if (device == null) {
+ return;
+ }
+ mHearingDevice = getSupportedInputHearingDeviceInfo(List.of(device));
+ if (mHearingDevice != null) {
+ showNotificationIfNeeded();
+ } else {
+ dismissNotificationIfNeeded();
+ }
+ };
}
@Override
@@ -134,6 +149,11 @@ public class HearingDevicePhoneCallNotificationController {
}
if (state == TelephonyManager.CALL_STATE_IDLE) {
+ if (mIsCommDeviceChangedRegistered) {
+ mIsCommDeviceChangedRegistered = false;
+ mAudioManager.removeOnCommunicationDeviceChangedListener(
+ mCommDeviceChangedListener);
+ }
dismissNotificationIfNeeded();
if (mHearingDevice != null) {
@@ -143,10 +163,23 @@ public class HearingDevicePhoneCallNotificationController {
mHearingDevice = null;
}
if (state == TelephonyManager.CALL_STATE_OFFHOOK) {
- mHearingDevice = getSupportedInputHearingDeviceInfo(
- mAudioManager.getAvailableCommunicationDevices());
- if (mHearingDevice != null) {
- showNotificationIfNeeded();
+ if (com.android.server.accessibility.Flags.hearingInputChangeWhenCommDevice()) {
+ AudioDeviceInfo commDevice = mAudioManager.getCommunicationDevice();
+ mHearingDevice = getSupportedInputHearingDeviceInfo(List.of(commDevice));
+ if (mHearingDevice != null) {
+ showNotificationIfNeeded();
+ } else {
+ mAudioManager.addOnCommunicationDeviceChangedListener(
+ mCommDeviceChangedExecutor,
+ mCommDeviceChangedListener);
+ mIsCommDeviceChangedRegistered = true;
+ }
+ } else {
+ mHearingDevice = getSupportedInputHearingDeviceInfo(
+ mAudioManager.getAvailableCommunicationDevices());
+ if (mHearingDevice != null) {
+ showNotificationIfNeeded();
+ }
}
}
}
@@ -264,6 +297,10 @@ public class HearingDevicePhoneCallNotificationController {
PendingIntent.FLAG_IMMUTABLE);
}
case ACTION_BLUETOOTH_DEVICE_DETAILS -> {
+ if (mHearingDevice == null) {
+ return null;
+ }
+
Bundle bundle = new Bundle();
bundle.putString(KEY_BLUETOOTH_ADDRESS, mHearingDevice.getAddress());
intent.putExtra(EXTRA_SHOW_FRAGMENT_ARGUMENTS, bundle);