diff options
7 files changed, 123 insertions, 1 deletions
diff --git a/packages/SystemUI/AndroidManifest.xml b/packages/SystemUI/AndroidManifest.xml index e346e72516cf..bbc9fe47a18b 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 76cb6bd91714..15c2c17fd7f0 100644 --- a/packages/SystemUI/aconfig/Android.bp +++ b/packages/SystemUI/aconfig/Android.bp @@ -25,6 +25,8 @@ package { "//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 000000000000..6a34d1969fe5 --- /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 6aa5e8b6d098..2fa42ec3904d 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 @@ package com.android.systemui.dagger; 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 @@ public abstract class DefaultBroadcastReceiverBinder { @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 69cc68a55108..467adc7a9628 100644 --- a/services/accessibility/Android.bp +++ b/services/accessibility/Android.bp @@ -34,6 +34,8 @@ java_library_static { ], 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 880a68776055..b48894d2b147 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 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub 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 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub } } + 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 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub 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 9d32ed847645..1bf9a9d02431 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 android.view.accessibility.Flags.FLAG_SKIP_ACCESSIBILITY_WARNING_D 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 @@ public class AccessibilityManagerServiceTest { @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 @@ public class AccessibilityManagerServiceTest { 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 @@ public class AccessibilityManagerServiceTest { } @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(); |