Loading res/values/arrays.xml +18 −0 Original line number Diff line number Diff line Loading @@ -1651,4 +1651,22 @@ <!-- Packages that will not show Display over other apps permission --> <string-array name="display_over_apps_permission_change_exempt"> </string-array> <!-- Titles for Action Corner customization option. [CHAR LIMIT=35] --> <string-array name="action_corner_action_titles"> <item>None</item> <item>Home</item> <item>Recent apps</item> <item>Notifications</item> <item>Quick settings</item> </string-array> <!-- Values for Action Corner customization option. --> <string-array name="action_corner_action_values" translatable="false" > <item>none</item> <item>home</item> <item>recent_apps</item> <item>notifications</item> <item>quick_settings</item> </string-array> </resources> res/values/strings.xml +27 −7 Original line number Diff line number Diff line Loading @@ -5137,19 +5137,39 @@ <string name="gesture_button_done">Done</string> <!-- Title text for 'Customize action corners' preference. This preference allows the user to select actions to be triggered when moving the cursor to a corner. [CHAR LIMIT=60] --> <string name="action_corners_title">Customize action corners</string> <string name="action_corner_title">Customize action corners</string> <!-- Summary text for 'Customize action corners' preference. [CHAR LIMIT=NONE] --> <string name="action_corners_summary">Use cursors to navigate the system</string> <string name="action_corner_summary">Use cursors to navigate the system</string> <!-- Intro text for 'Customize action corners'. [CHAR LIMIT=NONE] --> <string name="action_corners_intro">Choose the following areas to customize action corners</string> <string name="action_corner_intro">Choose the following areas to customize action corners</string> <!-- Preference title for 'Bottom-left corner'. [CHAR LIMIT=60] --> <string name="action_corner_bottom_left_title">Bottom-left corner</string> <!-- Preference title for 'Bottom-right corner'. [CHAR LIMIT=60] --> <string name="action_corner_bottom_right_title">Bottom-right corner</string> <!-- Preference title for 'Top-left corner'. [CHAR LIMIT=60] --> <string name="action_corner_top_left_title">Top-left corner</string> <!-- Preference title for 'Top-right corner'. [CHAR LIMIT=60] --> <string name="action_corner_top_right_title">Top-right corner</string> <!-- Text for 'None' action radio button. [CHAR LIMIT=60] --> <string name="action_corner_action_none">None</string> <!-- Text for 'Home' action radio button. [CHAR LIMIT=60] --> <string name="action_corner_action_home">Home</string> <!-- Text for 'Recent apps' action radio button. [CHAR LIMIT=60] --> <string name="action_corner_action_recent_apps">Recent apps</string> <!-- Text for 'Notifications' action radio button. [CHAR LIMIT=60] --> <string name="action_corner_action_notifications">Notifications</string> <!-- Text for 'Quick settings' action radio button. [CHAR LIMIT=60] --> <string name="action_corner_action_quick_settings">Quick settings</string> <!-- Title text for action selection dialog. [CHAR LIMIT=NONE] --> <string name="action_corner_action_dialog_title">Choose a shortcut for the <xliff:g id="corner">%1$s</xliff:g></string> <!-- Text for 'Bottom-left corner'. [CHAR LIMIT=60] --> <string name="action_corners_bottom_left_title">Bottom-left corner</string> <string name="action_corner_bottom_left_name">bottom-left corner</string> <!-- Text for 'Bottom-right corner'. [CHAR LIMIT=60] --> <string name="action_corners_bottom_right_title">Bottom-right corner</string> <string name="action_corner_bottom_right_name">bottom-right corner</string> <!-- Text for 'Top-left corner'. [CHAR LIMIT=60] --> <string name="action_corners_top_left_title">Top-left corner</string> <string name="action_corner_top_left_name">top-left corner</string> <!-- Text for 'Top-right corner'. [CHAR LIMIT=60] --> <string name="action_corners_top_right_title">Top-right corner</string> <string name="action_corner_top_right_name">top-right corner</string> <!-- Title for the button to trigger the 'modifier keys settings' page. [CHAR LIMIT=35] --> <string name="modifier_keys_settings">Modifier keys</string> res/xml/action_corners_customization.xml→res/xml/action_corner_customization.xml +61 −0 Original line number Diff line number Diff line Loading @@ -18,36 +18,44 @@ <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" xmlns:settings="http://schemas.android.com/apk/res-auto" android:title="@string/action_corners_title"> android:title="@string/action_corner_title"> <com.android.settingslib.widget.TopIntroPreference android:key="action_corners_intro" android:title="@string/action_corners_intro" android:key="action_corner_intro" android:title="@string/action_corner_intro" settings:searchable="false"/> <!-- TODO (b/413860922): replace with the correct animation --> <com.android.settingslib.widget.IllustrationPreference android:key="action_corners_video" android:key="action_corner_video" settings:lottie_rawRes="@raw/lottie_swipe_fingerprint"/> <com.android.settingslib.widget.MainSwitchPreference android:key="action_corners_switch" android:title="@string/action_corners_title" /> <PreferenceCategory android:key="action_corners_customization_category"> <Preference android:key="action_corners_bottom_left" android:title="@string/action_corners_bottom_left_title" /> <Preference android:key="action_corners_bottom_right" android:title="@string/action_corners_bottom_right_title" /> <Preference android:key="action_corners_top_left" android:title="@string/action_corners_top_left_title" /> <Preference android:key="action_corners_top_right" android:title="@string/action_corners_top_right_title" /> android:key="action_corner_customization_category"> <ListPreference android:key="action_corner_bottom_left" android:title="@string/action_corner_bottom_left_title" android:entries="@array/action_corner_action_titles" android:entryValues="@array/action_corner_action_values" settings:controller="com.android.settings.inputmethod.ActionCornerCustomizationController"/> <ListPreference android:key="action_corner_bottom_right" android:title="@string/action_corner_bottom_right_title" android:entries="@array/action_corner_action_titles" android:entryValues="@array/action_corner_action_values" settings:controller="com.android.settings.inputmethod.ActionCornerCustomizationController"/> <ListPreference android:key="action_corner_top_left" android:title="@string/action_corner_top_left_title" android:entries="@array/action_corner_action_titles" android:entryValues="@array/action_corner_action_values" settings:controller="com.android.settings.inputmethod.ActionCornerCustomizationController"/> <ListPreference android:key="action_corner_top_right" android:title="@string/action_corner_top_right_title" android:entries="@array/action_corner_action_titles" android:entryValues="@array/action_corner_action_values" settings:controller="com.android.settings.inputmethod.ActionCornerCustomizationController"/> </PreferenceCategory> </PreferenceScreen> res/xml/touchpad_settings.xml +2 −2 Original line number Diff line number Diff line Loading @@ -57,8 +57,8 @@ <Preference android:fragment="com.android.settings.inputmethod.ActionCornerFragment" android:key="action_corners" android:title="@string/action_corners_title" android:summary="@string/action_corners_summary" android:title="@string/action_corner_title" android:summary="@string/action_corner_summary" settings:controller="com.android.settings.inputmethod.ActionCornerPreferenceController" android:order="37"/> Loading src/com/android/settings/inputmethod/ActionCornerCustomizationController.kt 0 → 100644 +113 −0 Original line number Diff line number Diff line /* * Copyright (C) 2025 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.settings.inputmethod import android.app.ActivityManager import android.content.Context import android.provider.Settings import android.provider.Settings.Secure.ACTION_CORNER_ACTION_NONE import android.provider.Settings.Secure.ACTION_CORNER_BOTTOM_LEFT_ACTION import android.provider.Settings.Secure.ACTION_CORNER_BOTTOM_RIGHT_ACTION import android.provider.Settings.Secure.ACTION_CORNER_TOP_LEFT_ACTION import android.provider.Settings.Secure.ACTION_CORNER_TOP_RIGHT_ACTION import androidx.preference.ListPreference import androidx.preference.Preference import androidx.preference.PreferenceScreen import com.android.settings.R import com.android.settings.core.BasePreferenceController import com.android.settings.flags.Flags.actionCornerCustomization import com.android.settings.inputmethod.InputPeripheralsSettingsUtils.isMouse import com.android.settings.inputmethod.InputPeripheralsSettingsUtils.isTouchpad /** * The controller that handles the customization of each action corner. */ class ActionCornerCustomizationController(context: Context, preferenceKey: String) : BasePreferenceController(context, preferenceKey), Preference.OnPreferenceChangeListener { private lateinit var listPreference: ListPreference private val corner: Corner = prefKeyToCorner[preferenceKey]!! private val actions = context.resources.getStringArray(R.array.action_corner_action_values).asList() override fun getAvailabilityStatus(): Int { return if (actionCornerCustomization() && (isTouchpad() || isMouse())) AVAILABLE else CONDITIONALLY_UNAVAILABLE } override fun displayPreference(screen: PreferenceScreen) { super.displayPreference(screen) listPreference = screen.findPreference(preferenceKey)!! val cornerName = mContext.getString(corner.nameId) listPreference.dialogTitle = mContext.getString(R.string.action_corner_action_dialog_title, cornerName) } override fun updateState(preference: Preference?) { updateListPreference() } private fun updateListPreference() { listPreference.value = getCurrentAction() listPreference.summary = summary } private fun getCurrentAction(): String { val current = Settings.System.getIntForUser(mContext.contentResolver, corner.target, ACTION_CORNER_ACTION_NONE, ActivityManager.getCurrentUser()) return actions[current] } override fun getSummary(): CharSequence? = listPreference.entry override fun onPreferenceChange(preference: Preference, newValue: Any?): Boolean { val action = actions.indexOf(newValue.toString()) Settings.System.putIntForUser( mContext.contentResolver, corner.target, action, ActivityManager.getCurrentUser()) updateListPreference() return true } companion object { val prefKeyToCorner = mapOf( "action_corner_bottom_left" to Corner.BOTTOM_LEFT, "action_corner_bottom_right" to Corner.BOTTOM_RIGHT, "action_corner_top_left" to Corner.TOP_LEFT, "action_corner_top_right" to Corner.TOP_RIGHT,) } enum class Corner(val nameId: Int, val target: String) { BOTTOM_LEFT( nameId = R.string.action_corner_bottom_left_name, target = ACTION_CORNER_BOTTOM_LEFT_ACTION ), BOTTOM_RIGHT( nameId = R.string.action_corner_bottom_right_name, target = ACTION_CORNER_BOTTOM_RIGHT_ACTION ), TOP_LEFT( nameId = R.string.action_corner_top_left_name, target = ACTION_CORNER_TOP_LEFT_ACTION ), TOP_RIGHT( nameId = R.string.action_corner_top_right_name, target = ACTION_CORNER_TOP_RIGHT_ACTION ), } } Loading
res/values/arrays.xml +18 −0 Original line number Diff line number Diff line Loading @@ -1651,4 +1651,22 @@ <!-- Packages that will not show Display over other apps permission --> <string-array name="display_over_apps_permission_change_exempt"> </string-array> <!-- Titles for Action Corner customization option. [CHAR LIMIT=35] --> <string-array name="action_corner_action_titles"> <item>None</item> <item>Home</item> <item>Recent apps</item> <item>Notifications</item> <item>Quick settings</item> </string-array> <!-- Values for Action Corner customization option. --> <string-array name="action_corner_action_values" translatable="false" > <item>none</item> <item>home</item> <item>recent_apps</item> <item>notifications</item> <item>quick_settings</item> </string-array> </resources>
res/values/strings.xml +27 −7 Original line number Diff line number Diff line Loading @@ -5137,19 +5137,39 @@ <string name="gesture_button_done">Done</string> <!-- Title text for 'Customize action corners' preference. This preference allows the user to select actions to be triggered when moving the cursor to a corner. [CHAR LIMIT=60] --> <string name="action_corners_title">Customize action corners</string> <string name="action_corner_title">Customize action corners</string> <!-- Summary text for 'Customize action corners' preference. [CHAR LIMIT=NONE] --> <string name="action_corners_summary">Use cursors to navigate the system</string> <string name="action_corner_summary">Use cursors to navigate the system</string> <!-- Intro text for 'Customize action corners'. [CHAR LIMIT=NONE] --> <string name="action_corners_intro">Choose the following areas to customize action corners</string> <string name="action_corner_intro">Choose the following areas to customize action corners</string> <!-- Preference title for 'Bottom-left corner'. [CHAR LIMIT=60] --> <string name="action_corner_bottom_left_title">Bottom-left corner</string> <!-- Preference title for 'Bottom-right corner'. [CHAR LIMIT=60] --> <string name="action_corner_bottom_right_title">Bottom-right corner</string> <!-- Preference title for 'Top-left corner'. [CHAR LIMIT=60] --> <string name="action_corner_top_left_title">Top-left corner</string> <!-- Preference title for 'Top-right corner'. [CHAR LIMIT=60] --> <string name="action_corner_top_right_title">Top-right corner</string> <!-- Text for 'None' action radio button. [CHAR LIMIT=60] --> <string name="action_corner_action_none">None</string> <!-- Text for 'Home' action radio button. [CHAR LIMIT=60] --> <string name="action_corner_action_home">Home</string> <!-- Text for 'Recent apps' action radio button. [CHAR LIMIT=60] --> <string name="action_corner_action_recent_apps">Recent apps</string> <!-- Text for 'Notifications' action radio button. [CHAR LIMIT=60] --> <string name="action_corner_action_notifications">Notifications</string> <!-- Text for 'Quick settings' action radio button. [CHAR LIMIT=60] --> <string name="action_corner_action_quick_settings">Quick settings</string> <!-- Title text for action selection dialog. [CHAR LIMIT=NONE] --> <string name="action_corner_action_dialog_title">Choose a shortcut for the <xliff:g id="corner">%1$s</xliff:g></string> <!-- Text for 'Bottom-left corner'. [CHAR LIMIT=60] --> <string name="action_corners_bottom_left_title">Bottom-left corner</string> <string name="action_corner_bottom_left_name">bottom-left corner</string> <!-- Text for 'Bottom-right corner'. [CHAR LIMIT=60] --> <string name="action_corners_bottom_right_title">Bottom-right corner</string> <string name="action_corner_bottom_right_name">bottom-right corner</string> <!-- Text for 'Top-left corner'. [CHAR LIMIT=60] --> <string name="action_corners_top_left_title">Top-left corner</string> <string name="action_corner_top_left_name">top-left corner</string> <!-- Text for 'Top-right corner'. [CHAR LIMIT=60] --> <string name="action_corners_top_right_title">Top-right corner</string> <string name="action_corner_top_right_name">top-right corner</string> <!-- Title for the button to trigger the 'modifier keys settings' page. [CHAR LIMIT=35] --> <string name="modifier_keys_settings">Modifier keys</string>
res/xml/action_corners_customization.xml→res/xml/action_corner_customization.xml +61 −0 Original line number Diff line number Diff line Loading @@ -18,36 +18,44 @@ <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" xmlns:settings="http://schemas.android.com/apk/res-auto" android:title="@string/action_corners_title"> android:title="@string/action_corner_title"> <com.android.settingslib.widget.TopIntroPreference android:key="action_corners_intro" android:title="@string/action_corners_intro" android:key="action_corner_intro" android:title="@string/action_corner_intro" settings:searchable="false"/> <!-- TODO (b/413860922): replace with the correct animation --> <com.android.settingslib.widget.IllustrationPreference android:key="action_corners_video" android:key="action_corner_video" settings:lottie_rawRes="@raw/lottie_swipe_fingerprint"/> <com.android.settingslib.widget.MainSwitchPreference android:key="action_corners_switch" android:title="@string/action_corners_title" /> <PreferenceCategory android:key="action_corners_customization_category"> <Preference android:key="action_corners_bottom_left" android:title="@string/action_corners_bottom_left_title" /> <Preference android:key="action_corners_bottom_right" android:title="@string/action_corners_bottom_right_title" /> <Preference android:key="action_corners_top_left" android:title="@string/action_corners_top_left_title" /> <Preference android:key="action_corners_top_right" android:title="@string/action_corners_top_right_title" /> android:key="action_corner_customization_category"> <ListPreference android:key="action_corner_bottom_left" android:title="@string/action_corner_bottom_left_title" android:entries="@array/action_corner_action_titles" android:entryValues="@array/action_corner_action_values" settings:controller="com.android.settings.inputmethod.ActionCornerCustomizationController"/> <ListPreference android:key="action_corner_bottom_right" android:title="@string/action_corner_bottom_right_title" android:entries="@array/action_corner_action_titles" android:entryValues="@array/action_corner_action_values" settings:controller="com.android.settings.inputmethod.ActionCornerCustomizationController"/> <ListPreference android:key="action_corner_top_left" android:title="@string/action_corner_top_left_title" android:entries="@array/action_corner_action_titles" android:entryValues="@array/action_corner_action_values" settings:controller="com.android.settings.inputmethod.ActionCornerCustomizationController"/> <ListPreference android:key="action_corner_top_right" android:title="@string/action_corner_top_right_title" android:entries="@array/action_corner_action_titles" android:entryValues="@array/action_corner_action_values" settings:controller="com.android.settings.inputmethod.ActionCornerCustomizationController"/> </PreferenceCategory> </PreferenceScreen>
res/xml/touchpad_settings.xml +2 −2 Original line number Diff line number Diff line Loading @@ -57,8 +57,8 @@ <Preference android:fragment="com.android.settings.inputmethod.ActionCornerFragment" android:key="action_corners" android:title="@string/action_corners_title" android:summary="@string/action_corners_summary" android:title="@string/action_corner_title" android:summary="@string/action_corner_summary" settings:controller="com.android.settings.inputmethod.ActionCornerPreferenceController" android:order="37"/> Loading
src/com/android/settings/inputmethod/ActionCornerCustomizationController.kt 0 → 100644 +113 −0 Original line number Diff line number Diff line /* * Copyright (C) 2025 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.settings.inputmethod import android.app.ActivityManager import android.content.Context import android.provider.Settings import android.provider.Settings.Secure.ACTION_CORNER_ACTION_NONE import android.provider.Settings.Secure.ACTION_CORNER_BOTTOM_LEFT_ACTION import android.provider.Settings.Secure.ACTION_CORNER_BOTTOM_RIGHT_ACTION import android.provider.Settings.Secure.ACTION_CORNER_TOP_LEFT_ACTION import android.provider.Settings.Secure.ACTION_CORNER_TOP_RIGHT_ACTION import androidx.preference.ListPreference import androidx.preference.Preference import androidx.preference.PreferenceScreen import com.android.settings.R import com.android.settings.core.BasePreferenceController import com.android.settings.flags.Flags.actionCornerCustomization import com.android.settings.inputmethod.InputPeripheralsSettingsUtils.isMouse import com.android.settings.inputmethod.InputPeripheralsSettingsUtils.isTouchpad /** * The controller that handles the customization of each action corner. */ class ActionCornerCustomizationController(context: Context, preferenceKey: String) : BasePreferenceController(context, preferenceKey), Preference.OnPreferenceChangeListener { private lateinit var listPreference: ListPreference private val corner: Corner = prefKeyToCorner[preferenceKey]!! private val actions = context.resources.getStringArray(R.array.action_corner_action_values).asList() override fun getAvailabilityStatus(): Int { return if (actionCornerCustomization() && (isTouchpad() || isMouse())) AVAILABLE else CONDITIONALLY_UNAVAILABLE } override fun displayPreference(screen: PreferenceScreen) { super.displayPreference(screen) listPreference = screen.findPreference(preferenceKey)!! val cornerName = mContext.getString(corner.nameId) listPreference.dialogTitle = mContext.getString(R.string.action_corner_action_dialog_title, cornerName) } override fun updateState(preference: Preference?) { updateListPreference() } private fun updateListPreference() { listPreference.value = getCurrentAction() listPreference.summary = summary } private fun getCurrentAction(): String { val current = Settings.System.getIntForUser(mContext.contentResolver, corner.target, ACTION_CORNER_ACTION_NONE, ActivityManager.getCurrentUser()) return actions[current] } override fun getSummary(): CharSequence? = listPreference.entry override fun onPreferenceChange(preference: Preference, newValue: Any?): Boolean { val action = actions.indexOf(newValue.toString()) Settings.System.putIntForUser( mContext.contentResolver, corner.target, action, ActivityManager.getCurrentUser()) updateListPreference() return true } companion object { val prefKeyToCorner = mapOf( "action_corner_bottom_left" to Corner.BOTTOM_LEFT, "action_corner_bottom_right" to Corner.BOTTOM_RIGHT, "action_corner_top_left" to Corner.TOP_LEFT, "action_corner_top_right" to Corner.TOP_RIGHT,) } enum class Corner(val nameId: Int, val target: String) { BOTTOM_LEFT( nameId = R.string.action_corner_bottom_left_name, target = ACTION_CORNER_BOTTOM_LEFT_ACTION ), BOTTOM_RIGHT( nameId = R.string.action_corner_bottom_right_name, target = ACTION_CORNER_BOTTOM_RIGHT_ACTION ), TOP_LEFT( nameId = R.string.action_corner_top_left_name, target = ACTION_CORNER_TOP_LEFT_ACTION ), TOP_RIGHT( nameId = R.string.action_corner_top_right_name, target = ACTION_CORNER_TOP_RIGHT_ACTION ), } }