Implement Hearing Devices Quick Settings Tile (5/n)
This patch provides
* Change accessibility service to broadcast intent to open hearing devices dialog
* Use BroadcastReceiver to receive and launch hearing devices dialog
Bug: 291423171
Bug: 319197158
Test: atest AccessibilityManagerServiceTest
Flag: ACONFIG com.android.systemui.hearing_aids_qs_tile_dialog DEVELOPMENT
Change-Id: Ie08169982efa4b9ceb1eb15efb0d4666f32e92e6
diff --git a/packages/SystemUI/AndroidManifest.xml b/packages/SystemUI/AndroidManifest.xml
index e346e72..bbc9fe4 100644
--- a/packages/SystemUI/AndroidManifest.xml
+++ b/packages/SystemUI/AndroidManifest.xml
@@ -1059,6 +1059,13 @@
</intent-filter>
</receiver>
+ <receiver android:name=".accessibility.hearingaid.HearingDevicesDialogReceiver"
+ android:exported="false">
+ <intent-filter android:priority="1">
+ <action android:name="com.android.systemui.action.LAUNCH_HEARING_DEVICES_DIALOG" />
+ </intent-filter>
+ </receiver>
+
<activity android:name=".logcat.LogAccessDialogActivity"
android:theme="@android:style/Theme.Translucent.NoTitleBar"
android:excludeFromRecents="true"
diff --git a/packages/SystemUI/aconfig/Android.bp b/packages/SystemUI/aconfig/Android.bp
index 76cb6bd..15c2c17 100644
--- a/packages/SystemUI/aconfig/Android.bp
+++ b/packages/SystemUI/aconfig/Android.bp
@@ -25,6 +25,8 @@
"//visibility:override",
"//frameworks/base/packages/SystemUI:__subpackages__",
"//frameworks/libs/systemui/tracinglib:__subpackages__",
+ "//frameworks/base/services/accessibility:__subpackages__",
+ "//frameworks/base/services/tests:__subpackages__",
"//platform_testing:__subpackages__",
"//vendor:__subpackages__",
"//cts:__subpackages__",
diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/hearingaid/HearingDevicesDialogReceiver.java b/packages/SystemUI/src/com/android/systemui/accessibility/hearingaid/HearingDevicesDialogReceiver.java
new file mode 100644
index 0000000..6a34d19
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/accessibility/hearingaid/HearingDevicesDialogReceiver.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * 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.
+ */
+
+package com.android.systemui.accessibility.hearingaid;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+
+import com.android.systemui.Flags;
+
+import javax.inject.Inject;
+
+/**
+ * BroadcastReceiver for handling hearing devices dialog intent.
+ *
+ * <p> This is not exported. Need to call from framework and use SYSTEM user to send the intent.
+ */
+public class HearingDevicesDialogReceiver extends BroadcastReceiver {
+ public static String ACTION = "com.android.systemui.action.LAUNCH_HEARING_DEVICES_DIALOG";
+
+ private final HearingDevicesDialogManager mDialogManager;
+ @Inject
+ public HearingDevicesDialogReceiver(
+ HearingDevicesDialogManager hearingDevicesDialogManager) {
+ mDialogManager = hearingDevicesDialogManager;
+ }
+
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ if (!Flags.hearingAidsQsTileDialog()) {
+ return;
+ }
+
+ if (ACTION.equals(intent.getAction())) {
+ mDialogManager.showDialog(/* view= */ null);
+ }
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/dagger/DefaultBroadcastReceiverBinder.java b/packages/SystemUI/src/com/android/systemui/dagger/DefaultBroadcastReceiverBinder.java
index 6aa5e8b..2fa42ec 100644
--- a/packages/SystemUI/src/com/android/systemui/dagger/DefaultBroadcastReceiverBinder.java
+++ b/packages/SystemUI/src/com/android/systemui/dagger/DefaultBroadcastReceiverBinder.java
@@ -19,6 +19,7 @@
import android.content.BroadcastReceiver;
import com.android.systemui.GuestResetOrExitSessionReceiver;
+import com.android.systemui.accessibility.hearingaid.HearingDevicesDialogReceiver;
import com.android.systemui.media.dialog.MediaOutputDialogReceiver;
import com.android.systemui.people.widget.PeopleSpaceWidgetPinnedReceiver;
import com.android.systemui.people.widget.PeopleSpaceWidgetProvider;
@@ -88,4 +89,13 @@
@ClassKey(GuestResetOrExitSessionReceiver.class)
public abstract BroadcastReceiver bindGuestResetOrExitSessionReceiver(
GuestResetOrExitSessionReceiver broadcastReceiver);
+
+ /**
+ *
+ */
+ @Binds
+ @IntoMap
+ @ClassKey(HearingDevicesDialogReceiver.class)
+ public abstract BroadcastReceiver bindHearingDevicesDialogReceiver(
+ HearingDevicesDialogReceiver broadcastReceiver);
}
diff --git a/services/accessibility/Android.bp b/services/accessibility/Android.bp
index 69cc68a..467adc7 100644
--- a/services/accessibility/Android.bp
+++ b/services/accessibility/Android.bp
@@ -34,6 +34,8 @@
],
static_libs: [
"com_android_server_accessibility_flags_lib",
+ "//frameworks/base/packages/SystemUI/aconfig:com_android_systemui_flags_lib",
+
],
}
diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
index 880a687..b48894d 100644
--- a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
+++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
@@ -242,6 +242,13 @@
private static final String SET_PIP_ACTION_REPLACEMENT =
"setPictureInPictureActionReplacingConnection";
+ /**
+ * An intent action to launch Hearing devices dialog.
+ */
+ @VisibleForTesting
+ static final String ACTION_LAUNCH_HEARING_DEVICES_DIALOG =
+ "com.android.systemui.action.LAUNCH_HEARING_DEVICES_DIALOG";
+
private static final char COMPONENT_NAME_SEPARATOR = ':';
private static final int OWN_PROCESS_ID = android.os.Process.myPid();
@@ -2293,6 +2300,14 @@
}
}
+ private void launchHearingDevicesDialog() {
+ final Intent intent = new Intent(ACTION_LAUNCH_HEARING_DEVICES_DIALOG);
+ intent.setFlags(Intent.FLAG_RECEIVER_FOREGROUND);
+ intent.setPackage(
+ mContext.getString(com.android.internal.R.string.config_systemUi));
+ mContext.sendBroadcastAsUser(intent, UserHandle.SYSTEM);
+ }
+
private void notifyAccessibilityButtonVisibilityChangedLocked(boolean available) {
final AccessibilityUserState state = getCurrentUserStateLocked();
mIsAccessibilityButtonShown = available;
@@ -4102,7 +4117,13 @@
private void launchAccessibilityFrameworkFeature(int displayId, ComponentName assignedTarget) {
if (assignedTarget.equals(ACCESSIBILITY_HEARING_AIDS_COMPONENT_NAME)) {
- launchAccessibilitySubSettings(displayId, ACCESSIBILITY_HEARING_AIDS_COMPONENT_NAME);
+ //import com.android.systemui.Flags;
+ if (com.android.systemui.Flags.hearingAidsQsTileDialog()) {
+ launchHearingDevicesDialog();
+ } else {
+ launchAccessibilitySubSettings(displayId,
+ ACCESSIBILITY_HEARING_AIDS_COMPONENT_NAME);
+ }
}
}
diff --git a/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityManagerServiceTest.java
index 9d32ed8..1bf9a9d 100644
--- a/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityManagerServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityManagerServiceTest.java
@@ -25,6 +25,7 @@
import static com.android.internal.accessibility.AccessibilityShortcutController.ACCESSIBILITY_HEARING_AIDS_COMPONENT_NAME;
import static com.android.internal.accessibility.AccessibilityShortcutController.MAGNIFICATION_CONTROLLER_NAME;
+import static com.android.server.accessibility.AccessibilityManagerService.ACTION_LAUNCH_HEARING_DEVICES_DIALOG;
import static com.google.common.truth.Truth.assertThat;
@@ -771,6 +772,7 @@
@SmallTest
@Test
+ @RequiresFlagsDisabled(com.android.systemui.Flags.FLAG_HEARING_AIDS_QS_TILE_DIALOG)
public void testPerformAccessibilityShortcut_hearingAids_startActivityWithExpectedComponent() {
final AccessibilityUserState userState = mA11yms.mUserStates.get(
mA11yms.getCurrentUserIdLocked());
@@ -786,6 +788,27 @@
ACCESSIBILITY_HEARING_AIDS_COMPONENT_NAME.flattenToString());
}
+ @SmallTest
+ @Test
+ @RequiresFlagsEnabled(com.android.systemui.Flags.FLAG_HEARING_AIDS_QS_TILE_DIALOG)
+ public void testPerformAccessibilityShortcut_hearingAids_sendExpectedBroadcast() {
+ final AccessibilityUserState userState = mA11yms.mUserStates.get(
+ mA11yms.getCurrentUserIdLocked());
+ mockManageAccessibilityGranted(mTestableContext);
+ userState.mAccessibilityShortcutKeyTargets.add(
+ ACCESSIBILITY_HEARING_AIDS_COMPONENT_NAME.flattenToString());
+
+ mA11yms.performAccessibilityShortcut(
+ ACCESSIBILITY_HEARING_AIDS_COMPONENT_NAME.flattenToString());
+ mTestableLooper.processAllMessages();
+
+ ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class);
+ verify(mTestableContext.getMockContext()).sendBroadcastAsUser(intentCaptor.capture(),
+ eq(UserHandle.SYSTEM));
+ assertThat(intentCaptor.getValue().getAction()).isEqualTo(
+ ACTION_LAUNCH_HEARING_DEVICES_DIALOG);
+ }
+
@Test
public void testPackagesForceStopped_disablesRelevantService() {
final AccessibilityServiceInfo info_a = new AccessibilityServiceInfo();
@@ -1618,6 +1641,11 @@
}
@Override
+ public void sendBroadcastAsUser(Intent intent, UserHandle user) {
+ mMockContext.sendBroadcastAsUser(intent, user);
+ }
+
+ @Override
public Intent registerReceiverAsUser(BroadcastReceiver receiver, UserHandle user,
IntentFilter filter, String broadcastPermission, Handler scheduler) {
Iterator<String> actions = filter.actionsIterator();