Added Settings page for AccessibilityMenu
Bug: 261252772
Test: Install apk, then navigate to AccessibilityMenu settings.
Change-Id: I89c792819a0fbadc899db5585295f0ddf8d0083b
diff --git a/packages/SystemUI/accessibility/accessibilitymenu/Android.bp b/packages/SystemUI/accessibility/accessibilitymenu/Android.bp
index 2c04630..140c10d 100644
--- a/packages/SystemUI/accessibility/accessibilitymenu/Android.bp
+++ b/packages/SystemUI/accessibility/accessibilitymenu/Android.bp
@@ -24,6 +24,7 @@
static_libs: [
"androidx.coordinatorlayout_coordinatorlayout",
"androidx.core_core",
+ "androidx.preference_preference",
"androidx.viewpager_viewpager",
"SettingsLibDisplayUtils",
],
diff --git a/packages/SystemUI/accessibility/accessibilitymenu/AndroidManifest.xml b/packages/SystemUI/accessibility/accessibilitymenu/AndroidManifest.xml
index 77412d9..82ddf38 100644
--- a/packages/SystemUI/accessibility/accessibilitymenu/AndroidManifest.xml
+++ b/packages/SystemUI/accessibility/accessibilitymenu/AndroidManifest.xml
@@ -33,5 +33,27 @@
android:name="android.accessibilityservice"
android:resource="@xml/accessibilitymenu_service"/>
</service>
+
+ <!-- Accessibility Menu Settings -->
+ <activity
+ android:name="com.android.systemui.accessibility.accessibilitymenu.activity.A11yMenuSettingsActivity"
+ android:exported="true"
+ android:label="@string/accessibility_menu_settings_name"
+ android:launchMode="singleTop"
+ android:theme="@style/AccessibilityMenuSettings">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN"/>
+
+ <category android:name="android.accessibilityservice.SERVICE_SETTINGS"/>
+ </intent-filter>
+ </activity>
</application>
+
+ <queries>
+ <intent>
+ <action android:name="android.intent.action.VIEW" />
+ <category android:name="android.intent.category.BROWSABLE" />
+ <data android:scheme="https" />
+ </intent>
+ </queries>
</manifest>
\ No newline at end of file
diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values/donottranslate.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values/donottranslate.xml
index 0c25ec4..01758e87 100644
--- a/packages/SystemUI/accessibility/accessibilitymenu/res/values/donottranslate.xml
+++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values/donottranslate.xml
@@ -1,11 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
- <!-- user customized shortcuts preference -->
- <string name="pref_user_shortcuts">accessibility_menu_user_shortcuts</string>
- <!-- key for user customized shortcuts -->
- <string name="pref_user_shortcuts_key">pref_user_shortcuts_key</string>
- <!-- value for empty shortcut -->
- <string name="pref_user_shortcuts_value_empty">[]</string>
<!-- empty string for shortcut label -->
<string name="empty_content"></string>
@@ -14,4 +8,6 @@
<!-- key for Help&feedback settings [CHAR_LIMIT=NONE] -->
<string name="pref_help">pref_help</string>
+ <!-- url for help page -->
+ <string name="help_url">https://support.google.com/accessibility/android/answer/9078941</string>
</resources>
diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values/styles.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values/styles.xml
index a2cf267..2009cd1 100644
--- a/packages/SystemUI/accessibility/accessibilitymenu/res/values/styles.xml
+++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values/styles.xml
@@ -17,7 +17,7 @@
<resources>
<!--The theme is for preference CollapsingToolbarBaseActivity settings-->
- <style name="AccessibilityMenuSettings" parent="android:Theme.DeviceDefault.Light" />
+ <style name="AccessibilityMenuSettings" parent="android:Theme.DeviceDefault.DayNight" />
<!--Adds the theme to support SnackBar component and user configurable theme. -->
<style name="ServiceTheme" parent="android:Theme.DeviceDefault.Light">
diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/xml/accessibilitymenu_preferences.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/xml/accessibilitymenu_preferences.xml
new file mode 100644
index 0000000..3b79287
--- /dev/null
+++ b/packages/SystemUI/accessibility/accessibilitymenu/res/xml/accessibilitymenu_preferences.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ 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.
+ -->
+
+<androidx.preference.PreferenceScreen
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto">
+
+ <SwitchPreference
+ android:defaultValue="false"
+ android:key="@string/pref_large_buttons"
+ android:persistent="true"
+ android:summary="@string/accessibility_menu_large_buttons_summary"
+ android:title="@string/accessibility_menu_large_buttons_title"/>
+
+ <Preference
+ android:key="@string/pref_help"
+ android:title="@string/pref_help_and_feedback_title"/>
+
+</androidx.preference.PreferenceScreen>
\ No newline at end of file
diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/xml/accessibilitymenu_service.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/xml/accessibilitymenu_service.xml
index 3dbbb1a..569de3d 100644
--- a/packages/SystemUI/accessibility/accessibilitymenu/res/xml/accessibilitymenu_service.xml
+++ b/packages/SystemUI/accessibility/accessibilitymenu/res/xml/accessibilitymenu_service.xml
@@ -21,4 +21,5 @@
android:intro="@string/accessibility_menu_intro"
android:animatedImageDrawable="@drawable/a11ymenu_intro"
android:isAccessibilityTool="true"
+ android:settingsActivity="com.android.systemui.accessibility.accessibilitymenu.activity.A11yMenuSettingsActivity"
/>
\ No newline at end of file
diff --git a/packages/SystemUI/accessibility/accessibilitymenu/src/com/android/systemui/accessibility/accessibilitymenu/AccessibilityMenuService.java b/packages/SystemUI/accessibility/accessibilitymenu/src/com/android/systemui/accessibility/accessibilitymenu/AccessibilityMenuService.java
index ca6c332..216c2dc 100644
--- a/packages/SystemUI/accessibility/accessibilitymenu/src/com/android/systemui/accessibility/accessibilitymenu/AccessibilityMenuService.java
+++ b/packages/SystemUI/accessibility/accessibilitymenu/src/com/android/systemui/accessibility/accessibilitymenu/AccessibilityMenuService.java
@@ -22,6 +22,8 @@
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
+import android.content.SharedPreferences;
+import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.content.res.Configuration;
@@ -38,6 +40,8 @@
import android.view.View;
import android.view.accessibility.AccessibilityEvent;
+import androidx.preference.PreferenceManager;
+
import com.android.settingslib.display.BrightnessUtils;
import com.android.systemui.accessibility.accessibilitymenu.model.A11yMenuShortcut.ShortcutId;
import com.android.systemui.accessibility.accessibilitymenu.view.A11yMenuOverlayLayout;
@@ -62,6 +66,7 @@
public static final long BUTTON_CLICK_TIMEOUT = 200;
private A11yMenuOverlayLayout mA11yMenuLayout;
+ private SharedPreferences mPrefs;
private static boolean sInitialized = false;
@@ -90,6 +95,25 @@
}
};
+ final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ mA11yMenuLayout.hideMenu();
+ }
+ };
+
+ /**
+ * Update a11y menu layout when large button setting is changed.
+ */
+ private final OnSharedPreferenceChangeListener mSharedPreferenceChangeListener =
+ (SharedPreferences prefs, String key) -> {
+ {
+ if (key.equals(getString(R.string.pref_large_buttons))) {
+ mA11yMenuLayout.configureLayout();
+ }
+ }
+ };
+
// Update layout.
private final Handler mHandler = new Handler(Looper.getMainLooper());
private final Runnable mOnConfigChangedRunnable = new Runnable() {
@@ -147,12 +171,11 @@
protected void onServiceConnected() {
mA11yMenuLayout = new A11yMenuOverlayLayout(this);
- registerReceiver(new BroadcastReceiver() {
- @Override
- public void onReceive(Context context, Intent intent) {
- mA11yMenuLayout.hideMenu();
- }}, new IntentFilter(Intent.ACTION_SCREEN_OFF)
- );
+ registerReceiver(mBroadcastReceiver, new IntentFilter(Intent.ACTION_SCREEN_OFF));
+
+ mPrefs = PreferenceManager.getDefaultSharedPreferences(this);
+ mPrefs.registerOnSharedPreferenceChangeListener(mSharedPreferenceChangeListener);
+
mDisplayManager = getSystemService(DisplayManager.class);
mDisplayManager.registerDisplayListener(mDisplayListener, null);
@@ -286,6 +309,14 @@
}
@Override
+ public boolean onUnbind(Intent intent) {
+ unregisterReceiver(mBroadcastReceiver);
+ mPrefs.unregisterOnSharedPreferenceChangeListener(mSharedPreferenceChangeListener);
+ sInitialized = false;
+ return super.onUnbind(intent);
+ }
+
+ @Override
protected boolean onKeyEvent(KeyEvent event) {
if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) {
mA11yMenuLayout.hideMenu();
diff --git a/packages/SystemUI/accessibility/accessibilitymenu/src/com/android/systemui/accessibility/accessibilitymenu/activity/A11yMenuSettingsActivity.java b/packages/SystemUI/accessibility/accessibilitymenu/src/com/android/systemui/accessibility/accessibilitymenu/activity/A11yMenuSettingsActivity.java
new file mode 100644
index 0000000..8f29348
--- /dev/null
+++ b/packages/SystemUI/accessibility/accessibilitymenu/src/com/android/systemui/accessibility/accessibilitymenu/activity/A11yMenuSettingsActivity.java
@@ -0,0 +1,97 @@
+/*
+ * 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 com.android.systemui.accessibility.accessibilitymenu.activity;
+
+import android.content.Context;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.content.pm.PackageManager;
+import android.net.Uri;
+import android.os.Bundle;
+import android.provider.Browser;
+import android.provider.Settings;
+
+import androidx.fragment.app.FragmentActivity;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceFragmentCompat;
+import androidx.preference.PreferenceManager;
+
+import com.android.systemui.accessibility.accessibilitymenu.R;
+
+/**
+ * Settings activity for AccessibilityMenu.
+ */
+public class A11yMenuSettingsActivity extends FragmentActivity {
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ getSupportFragmentManager()
+ .beginTransaction()
+ .replace(android.R.id.content, new A11yMenuPreferenceFragment())
+ .commit();
+ }
+
+ /**
+ * Settings/preferences fragment for AccessibilityMenu.
+ */
+ public static class A11yMenuPreferenceFragment extends PreferenceFragmentCompat {
+ @Override
+ public void onCreatePreferences(Bundle bundle, String s) {
+ setPreferencesFromResource(R.xml.accessibilitymenu_preferences, s);
+ initializeHelpAndFeedbackPreference();
+ }
+
+ /**
+ * Returns large buttons settings state.
+ *
+ * @param context The parent context
+ * @return {@code true} large button is enabled; {@code false} large button is disabled
+ */
+ public static boolean isLargeButtonsEnabled(Context context) {
+ SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
+ String key = context.getResources().getString(R.string.pref_large_buttons);
+ return prefs.getBoolean(key, false);
+ }
+
+ private void initializeHelpAndFeedbackPreference() {
+ final Preference prefHelp = findPreference(getString(R.string.pref_help));
+ if (prefHelp != null) {
+ prefHelp.setTitle(R.string.pref_help_title);
+
+ // Do not allow access to web during setup.
+ if (Settings.Secure.getInt(
+ getContext().getContentResolver(),
+ Settings.Secure.USER_SETUP_COMPLETE, 0) != 1) {
+ return;
+ }
+
+ // Configure preference to open the help page in the default web browser.
+ // If the system has no browser, hide the preference.
+ Uri uri = Uri.parse(getResources().getString(R.string.help_url));
+ Intent intent = new Intent(Intent.ACTION_VIEW, uri);
+ intent.putExtra(Browser.EXTRA_APPLICATION_ID, getContext().getPackageName());
+ if (getActivity().getPackageManager().queryIntentActivities(
+ intent, PackageManager.ResolveInfoFlags.of(0)).isEmpty()) {
+ prefHelp.setVisible(false);
+ return;
+ }
+ prefHelp.setIntent(intent);
+ }
+ }
+ }
+}
diff --git a/packages/SystemUI/accessibility/accessibilitymenu/src/com/android/systemui/accessibility/accessibilitymenu/view/A11yMenuAdapter.java b/packages/SystemUI/accessibility/accessibilitymenu/src/com/android/systemui/accessibility/accessibilitymenu/view/A11yMenuAdapter.java
index 337814e..6f0fe37 100644
--- a/packages/SystemUI/accessibility/accessibilitymenu/src/com/android/systemui/accessibility/accessibilitymenu/view/A11yMenuAdapter.java
+++ b/packages/SystemUI/accessibility/accessibilitymenu/src/com/android/systemui/accessibility/accessibilitymenu/view/A11yMenuAdapter.java
@@ -27,6 +27,7 @@
import com.android.systemui.accessibility.accessibilitymenu.AccessibilityMenuService;
import com.android.systemui.accessibility.accessibilitymenu.R;
+import com.android.systemui.accessibility.accessibilitymenu.activity.A11yMenuSettingsActivity.A11yMenuPreferenceFragment;
import com.android.systemui.accessibility.accessibilitymenu.model.A11yMenuShortcut;
import com.android.systemui.accessibility.accessibilitymenu.utils.ShortcutDrawableUtils;
@@ -124,7 +125,12 @@
ImageButton shortcutIconButton = convertView.findViewById(R.id.shortcutIconBtn);
TextView shortcutLabel = convertView.findViewById(R.id.shortcutLabel);
- // TODO: Enlarge shortcut icon & label when large button setting is on.
+ if (A11yMenuPreferenceFragment.isLargeButtonsEnabled(mService)) {
+ ViewGroup.LayoutParams params = shortcutIconButton.getLayoutParams();
+ params.width = (int) (params.width * LARGE_BUTTON_SCALE);
+ params.height = (int) (params.height * LARGE_BUTTON_SCALE);
+ shortcutLabel.setTextSize(android.util.TypedValue.COMPLEX_UNIT_PX, mLargeTextSize);
+ }
if (shortcutItem.getId() == A11yMenuShortcut.ShortcutId.UNSPECIFIED_ID_VALUE.ordinal()) {
// Sets empty shortcut icon and label when the shortcut is ADD_ITEM.
diff --git a/packages/SystemUI/accessibility/accessibilitymenu/src/com/android/systemui/accessibility/accessibilitymenu/view/A11yMenuOverlayLayout.java b/packages/SystemUI/accessibility/accessibilitymenu/src/com/android/systemui/accessibility/accessibilitymenu/view/A11yMenuOverlayLayout.java
index 7bdb8f9..2a1b3c9 100644
--- a/packages/SystemUI/accessibility/accessibilitymenu/src/com/android/systemui/accessibility/accessibilitymenu/view/A11yMenuOverlayLayout.java
+++ b/packages/SystemUI/accessibility/accessibilitymenu/src/com/android/systemui/accessibility/accessibilitymenu/view/A11yMenuOverlayLayout.java
@@ -43,6 +43,7 @@
import com.android.systemui.accessibility.accessibilitymenu.AccessibilityMenuService;
import com.android.systemui.accessibility.accessibilitymenu.R;
+import com.android.systemui.accessibility.accessibilitymenu.activity.A11yMenuSettingsActivity.A11yMenuPreferenceFragment;
import com.android.systemui.accessibility.accessibilitymenu.model.A11yMenuShortcut;
import java.util.ArrayList;
@@ -71,6 +72,24 @@
A11yMenuShortcut.ShortcutId.ID_SCREENSHOT_VALUE.ordinal()
};
+ /** Predefined default shortcuts when large button setting is on. */
+ private static final int[] LARGE_SHORTCUT_LIST_DEFAULT = {
+ A11yMenuShortcut.ShortcutId.ID_ASSISTANT_VALUE.ordinal(),
+ A11yMenuShortcut.ShortcutId.ID_A11YSETTING_VALUE.ordinal(),
+ A11yMenuShortcut.ShortcutId.ID_POWER_VALUE.ordinal(),
+ A11yMenuShortcut.ShortcutId.ID_RECENT_VALUE.ordinal(),
+ A11yMenuShortcut.ShortcutId.ID_VOLUME_DOWN_VALUE.ordinal(),
+ A11yMenuShortcut.ShortcutId.ID_VOLUME_UP_VALUE.ordinal(),
+ A11yMenuShortcut.ShortcutId.ID_BRIGHTNESS_DOWN_VALUE.ordinal(),
+ A11yMenuShortcut.ShortcutId.ID_BRIGHTNESS_UP_VALUE.ordinal(),
+ A11yMenuShortcut.ShortcutId.ID_LOCKSCREEN_VALUE.ordinal(),
+ A11yMenuShortcut.ShortcutId.ID_QUICKSETTING_VALUE.ordinal(),
+ A11yMenuShortcut.ShortcutId.ID_NOTIFICATION_VALUE.ordinal(),
+ A11yMenuShortcut.ShortcutId.ID_SCREENSHOT_VALUE.ordinal()
+ };
+
+
+
private final AccessibilityMenuService mService;
private final WindowManager mWindowManager;
private ViewGroup mLayout;
@@ -153,7 +172,10 @@
*/
private List<A11yMenuShortcut> createShortcutList() {
List<A11yMenuShortcut> shortcutList = new ArrayList<>();
- for (int shortcutId : SHORTCUT_LIST_DEFAULT) {
+
+ for (int shortcutId :
+ (A11yMenuPreferenceFragment.isLargeButtonsEnabled(mService)
+ ? LARGE_SHORTCUT_LIST_DEFAULT : SHORTCUT_LIST_DEFAULT)) {
shortcutList.add(new A11yMenuShortcut(shortcutId));
}
return shortcutList;
diff --git a/packages/SystemUI/accessibility/accessibilitymenu/src/com/android/systemui/accessibility/accessibilitymenu/view/A11yMenuViewPager.java b/packages/SystemUI/accessibility/accessibilitymenu/src/com/android/systemui/accessibility/accessibilitymenu/view/A11yMenuViewPager.java
index cec503c..0a349e5 100644
--- a/packages/SystemUI/accessibility/accessibilitymenu/src/com/android/systemui/accessibility/accessibilitymenu/view/A11yMenuViewPager.java
+++ b/packages/SystemUI/accessibility/accessibilitymenu/src/com/android/systemui/accessibility/accessibilitymenu/view/A11yMenuViewPager.java
@@ -33,6 +33,7 @@
import com.android.systemui.accessibility.accessibilitymenu.AccessibilityMenuService;
import com.android.systemui.accessibility.accessibilitymenu.R;
+import com.android.systemui.accessibility.accessibilitymenu.activity.A11yMenuSettingsActivity.A11yMenuPreferenceFragment;
import com.android.systemui.accessibility.accessibilitymenu.model.A11yMenuShortcut;
import com.android.systemui.accessibility.accessibilitymenu.view.A11yMenuFooter.A11yMenuFooterCallBack;
@@ -65,9 +66,6 @@
/** The number of columns in the grid view when large button settings is on. */
public static final int LARGE_GRID_COLUMN_COUNT = 2;
- /** Temporary measure to test both item types. */
- private static final boolean USE_LARGE_ITEMS = false;
-
/**
* Returns the number of items in the grid view.
*
@@ -75,7 +73,7 @@
* @return Grid item count
*/
public static int getGridItemCount(Context context) {
- return USE_LARGE_ITEMS
+ return A11yMenuPreferenceFragment.isLargeButtonsEnabled(context)
? LARGE_GRID_ITEM_COUNT
: GRID_ITEM_COUNT;
}
@@ -87,7 +85,7 @@
* @return Grid column count
*/
public static int getGridColumnCount(Context context) {
- return USE_LARGE_ITEMS
+ return A11yMenuPreferenceFragment.isLargeButtonsEnabled(context)
? LARGE_GRID_COLUMN_COUNT
: GRID_COLUMN_COUNT;
}
@@ -99,7 +97,7 @@
* @return Grid row count
*/
public static int getGridRowCount(Context context) {
- return USE_LARGE_ITEMS
+ return A11yMenuPreferenceFragment.isLargeButtonsEnabled(context)
? (LARGE_GRID_ITEM_COUNT / LARGE_GRID_COLUMN_COUNT)
: (GRID_ITEM_COUNT / GRID_COLUMN_COUNT);
}