Loading packages/SystemUI/accessibility/accessibilitymenu/Android.bp +9 −0 Original line number Diff line number Diff line Loading @@ -18,6 +18,15 @@ package { default_applicable_licenses: ["Android-Apache-2.0"], } // This filegroup is used by menu tests. filegroup { name: "AccessibilityMenuSource", srcs: [ "src/**/AccessibilityMenuService.java", "src/**/A11yMenuShortcut.java", ], } android_app { name: "AccessibilityMenu", Loading packages/SystemUI/accessibility/accessibilitymenu/res/layout/grid_item.xml +1 −0 Original line number Diff line number Diff line <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/shortcutItem" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingTop="@dimen/grid_item_padding" Loading packages/SystemUI/accessibility/accessibilitymenu/src/com/android/systemui/accessibility/accessibilitymenu/AccessibilityMenuService.java +34 −7 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package com.android.systemui.accessibility.accessibilitymenu; import android.Manifest; import android.accessibilityservice.AccessibilityButtonController; import android.accessibilityservice.AccessibilityService; import android.content.BroadcastReceiver; Loading Loading @@ -51,8 +52,12 @@ import java.util.List; /** @hide */ public class AccessibilityMenuService extends AccessibilityService implements View.OnTouchListener { private static final String TAG = "A11yMenuService"; public static final String PACKAGE_NAME = AccessibilityMenuService.class.getPackageName(); public static final String INTENT_TOGGLE_MENU = ".toggle_menu"; public static final String INTENT_HIDE_MENU = ".hide_menu"; private static final String TAG = "A11yMenuService"; private static final long BUFFER_MILLISECONDS_TO_PREVENT_UPDATE_FAILURE = 100L; private static final int BRIGHTNESS_UP_INCREMENT_GAMMA = Loading @@ -74,7 +79,8 @@ public class AccessibilityMenuService extends AccessibilityService // TODO(b/136716947): Support multi-display once a11y framework side is ready. private DisplayManager mDisplayManager; final DisplayManager.DisplayListener mDisplayListener = new DisplayManager.DisplayListener() { private final DisplayManager.DisplayListener mDisplayListener = new DisplayManager.DisplayListener() { int mRotation; @Override Loading @@ -95,13 +101,20 @@ public class AccessibilityMenuService extends AccessibilityService } }; final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() { private final BroadcastReceiver mHideMenuReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { mA11yMenuLayout.hideMenu(); } }; private final BroadcastReceiver mToggleMenuReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { mA11yMenuLayout.toggleVisibility(); } }; /** * Update a11y menu layout when large button setting is changed. */ Loading Loading @@ -172,7 +185,19 @@ public class AccessibilityMenuService extends AccessibilityService protected void onServiceConnected() { mA11yMenuLayout = new A11yMenuOverlayLayout(this); registerReceiver(mBroadcastReceiver, new IntentFilter(Intent.ACTION_SCREEN_OFF)); IntentFilter hideMenuFilter = new IntentFilter(); hideMenuFilter.addAction(Intent.ACTION_SCREEN_OFF); hideMenuFilter.addAction(PACKAGE_NAME + INTENT_HIDE_MENU); // Including WRITE_SECURE_SETTINGS enforces that we only listen to apps // with the restricted WRITE_SECURE_SETTINGS permission who broadcast this intent. registerReceiver(mHideMenuReceiver, hideMenuFilter, Manifest.permission.WRITE_SECURE_SETTINGS, null, Context.RECEIVER_EXPORTED); registerReceiver(mToggleMenuReceiver, new IntentFilter(PACKAGE_NAME + INTENT_TOGGLE_MENU), Manifest.permission.WRITE_SECURE_SETTINGS, null, Context.RECEIVER_EXPORTED); mPrefs = PreferenceManager.getDefaultSharedPreferences(this); mPrefs.registerOnSharedPreferenceChangeListener(mSharedPreferenceChangeListener); Loading Loading @@ -260,7 +285,8 @@ public class AccessibilityMenuService extends AccessibilityService * @param increment The increment amount in gamma-space */ private void adjustBrightness(int increment) { BrightnessInfo info = getDisplay().getBrightnessInfo(); Display display = mDisplayManager.getDisplay(Display.DEFAULT_DISPLAY); BrightnessInfo info = display.getBrightnessInfo(); int gamma = BrightnessUtils.convertLinearToGammaFloat( info.brightness, info.brightnessMinimum, Loading @@ -275,7 +301,7 @@ public class AccessibilityMenuService extends AccessibilityService info.brightnessMinimum, info.brightnessMaximum ); mDisplayManager.setBrightness(getDisplayId(), brightness); mDisplayManager.setBrightness(display.getDisplayId(), brightness); mA11yMenuLayout.showSnackbar( getString(R.string.brightness_percentage_label, (gamma / (BrightnessUtils.GAMMA_SPACE_MAX / 100)))); Loading Loading @@ -310,7 +336,8 @@ public class AccessibilityMenuService extends AccessibilityService @Override public boolean onUnbind(Intent intent) { unregisterReceiver(mBroadcastReceiver); unregisterReceiver(mHideMenuReceiver); unregisterReceiver(mToggleMenuReceiver); mPrefs.unregisterOnSharedPreferenceChangeListener(mSharedPreferenceChangeListener); sInitialized = false; return super.onUnbind(intent); Loading packages/SystemUI/accessibility/accessibilitymenu/src/com/android/systemui/accessibility/accessibilitymenu/view/A11yMenuAdapter.java +10 −0 Original line number Diff line number Diff line Loading @@ -21,6 +21,7 @@ import android.view.LayoutInflater; import android.view.TouchDelegate; import android.view.View; import android.view.ViewGroup; import android.view.accessibility.AccessibilityNodeInfo; import android.widget.BaseAdapter; import android.widget.ImageButton; import android.widget.TextView; Loading Loading @@ -146,6 +147,15 @@ public class A11yMenuAdapter extends BaseAdapter { shortcutIconButton.setBackground( mShortcutDrawableUtils.createAdaptiveIconDrawable(shortcutItem.imageColor)); shortcutIconButton.setAccessibilityDelegate(new View.AccessibilityDelegate() { @Override public void onInitializeAccessibilityNodeInfo( View host, AccessibilityNodeInfo info) { super.onInitializeAccessibilityNodeInfo(host, info); info.setUniqueId(host.getTag().toString()); } }); } } } packages/SystemUI/accessibility/accessibilitymenu/tests/Android.bp 0 → 100644 +43 −0 Original line number Diff line number Diff line // // Copyright (C) 2023 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 { default_applicable_licenses: ["Android-Apache-2.0"], } android_test { name: "AccessibilityMenuServiceTests", certificate: "platform", libs: [ "android.test.runner", "android.test.base", ], static_libs: [ "androidx.test.core", "androidx.test.runner", "androidx.test.ext.junit", "compatibility-device-util-axt", "platform-test-annotations", "truth-prebuilt", ], srcs: [ "src/**/*.java", ":AccessibilityMenuSource", ], platform_apis: true, test_suites: ["device-tests"], instrumentation_for: "AccessibilityMenu", } Loading
packages/SystemUI/accessibility/accessibilitymenu/Android.bp +9 −0 Original line number Diff line number Diff line Loading @@ -18,6 +18,15 @@ package { default_applicable_licenses: ["Android-Apache-2.0"], } // This filegroup is used by menu tests. filegroup { name: "AccessibilityMenuSource", srcs: [ "src/**/AccessibilityMenuService.java", "src/**/A11yMenuShortcut.java", ], } android_app { name: "AccessibilityMenu", Loading
packages/SystemUI/accessibility/accessibilitymenu/res/layout/grid_item.xml +1 −0 Original line number Diff line number Diff line <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/shortcutItem" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingTop="@dimen/grid_item_padding" Loading
packages/SystemUI/accessibility/accessibilitymenu/src/com/android/systemui/accessibility/accessibilitymenu/AccessibilityMenuService.java +34 −7 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package com.android.systemui.accessibility.accessibilitymenu; import android.Manifest; import android.accessibilityservice.AccessibilityButtonController; import android.accessibilityservice.AccessibilityService; import android.content.BroadcastReceiver; Loading Loading @@ -51,8 +52,12 @@ import java.util.List; /** @hide */ public class AccessibilityMenuService extends AccessibilityService implements View.OnTouchListener { private static final String TAG = "A11yMenuService"; public static final String PACKAGE_NAME = AccessibilityMenuService.class.getPackageName(); public static final String INTENT_TOGGLE_MENU = ".toggle_menu"; public static final String INTENT_HIDE_MENU = ".hide_menu"; private static final String TAG = "A11yMenuService"; private static final long BUFFER_MILLISECONDS_TO_PREVENT_UPDATE_FAILURE = 100L; private static final int BRIGHTNESS_UP_INCREMENT_GAMMA = Loading @@ -74,7 +79,8 @@ public class AccessibilityMenuService extends AccessibilityService // TODO(b/136716947): Support multi-display once a11y framework side is ready. private DisplayManager mDisplayManager; final DisplayManager.DisplayListener mDisplayListener = new DisplayManager.DisplayListener() { private final DisplayManager.DisplayListener mDisplayListener = new DisplayManager.DisplayListener() { int mRotation; @Override Loading @@ -95,13 +101,20 @@ public class AccessibilityMenuService extends AccessibilityService } }; final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() { private final BroadcastReceiver mHideMenuReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { mA11yMenuLayout.hideMenu(); } }; private final BroadcastReceiver mToggleMenuReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { mA11yMenuLayout.toggleVisibility(); } }; /** * Update a11y menu layout when large button setting is changed. */ Loading Loading @@ -172,7 +185,19 @@ public class AccessibilityMenuService extends AccessibilityService protected void onServiceConnected() { mA11yMenuLayout = new A11yMenuOverlayLayout(this); registerReceiver(mBroadcastReceiver, new IntentFilter(Intent.ACTION_SCREEN_OFF)); IntentFilter hideMenuFilter = new IntentFilter(); hideMenuFilter.addAction(Intent.ACTION_SCREEN_OFF); hideMenuFilter.addAction(PACKAGE_NAME + INTENT_HIDE_MENU); // Including WRITE_SECURE_SETTINGS enforces that we only listen to apps // with the restricted WRITE_SECURE_SETTINGS permission who broadcast this intent. registerReceiver(mHideMenuReceiver, hideMenuFilter, Manifest.permission.WRITE_SECURE_SETTINGS, null, Context.RECEIVER_EXPORTED); registerReceiver(mToggleMenuReceiver, new IntentFilter(PACKAGE_NAME + INTENT_TOGGLE_MENU), Manifest.permission.WRITE_SECURE_SETTINGS, null, Context.RECEIVER_EXPORTED); mPrefs = PreferenceManager.getDefaultSharedPreferences(this); mPrefs.registerOnSharedPreferenceChangeListener(mSharedPreferenceChangeListener); Loading Loading @@ -260,7 +285,8 @@ public class AccessibilityMenuService extends AccessibilityService * @param increment The increment amount in gamma-space */ private void adjustBrightness(int increment) { BrightnessInfo info = getDisplay().getBrightnessInfo(); Display display = mDisplayManager.getDisplay(Display.DEFAULT_DISPLAY); BrightnessInfo info = display.getBrightnessInfo(); int gamma = BrightnessUtils.convertLinearToGammaFloat( info.brightness, info.brightnessMinimum, Loading @@ -275,7 +301,7 @@ public class AccessibilityMenuService extends AccessibilityService info.brightnessMinimum, info.brightnessMaximum ); mDisplayManager.setBrightness(getDisplayId(), brightness); mDisplayManager.setBrightness(display.getDisplayId(), brightness); mA11yMenuLayout.showSnackbar( getString(R.string.brightness_percentage_label, (gamma / (BrightnessUtils.GAMMA_SPACE_MAX / 100)))); Loading Loading @@ -310,7 +336,8 @@ public class AccessibilityMenuService extends AccessibilityService @Override public boolean onUnbind(Intent intent) { unregisterReceiver(mBroadcastReceiver); unregisterReceiver(mHideMenuReceiver); unregisterReceiver(mToggleMenuReceiver); mPrefs.unregisterOnSharedPreferenceChangeListener(mSharedPreferenceChangeListener); sInitialized = false; return super.onUnbind(intent); Loading
packages/SystemUI/accessibility/accessibilitymenu/src/com/android/systemui/accessibility/accessibilitymenu/view/A11yMenuAdapter.java +10 −0 Original line number Diff line number Diff line Loading @@ -21,6 +21,7 @@ import android.view.LayoutInflater; import android.view.TouchDelegate; import android.view.View; import android.view.ViewGroup; import android.view.accessibility.AccessibilityNodeInfo; import android.widget.BaseAdapter; import android.widget.ImageButton; import android.widget.TextView; Loading Loading @@ -146,6 +147,15 @@ public class A11yMenuAdapter extends BaseAdapter { shortcutIconButton.setBackground( mShortcutDrawableUtils.createAdaptiveIconDrawable(shortcutItem.imageColor)); shortcutIconButton.setAccessibilityDelegate(new View.AccessibilityDelegate() { @Override public void onInitializeAccessibilityNodeInfo( View host, AccessibilityNodeInfo info) { super.onInitializeAccessibilityNodeInfo(host, info); info.setUniqueId(host.getTag().toString()); } }); } } }
packages/SystemUI/accessibility/accessibilitymenu/tests/Android.bp 0 → 100644 +43 −0 Original line number Diff line number Diff line // // Copyright (C) 2023 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 { default_applicable_licenses: ["Android-Apache-2.0"], } android_test { name: "AccessibilityMenuServiceTests", certificate: "platform", libs: [ "android.test.runner", "android.test.base", ], static_libs: [ "androidx.test.core", "androidx.test.runner", "androidx.test.ext.junit", "compatibility-device-util-axt", "platform-test-annotations", "truth-prebuilt", ], srcs: [ "src/**/*.java", ":AccessibilityMenuSource", ], platform_apis: true, test_suites: ["device-tests"], instrumentation_for: "AccessibilityMenu", }