Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 84b2a24b authored by Treehugger Robot's avatar Treehugger Robot Committed by Android (Google) Code Review
Browse files

Merge "[Action Corner] Dialog for action selection" into main

parents 5abd083b 09a96ff0
Loading
Loading
Loading
Loading
+18 −0
Original line number Diff line number Diff line
@@ -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>
+27 −7
Original line number Diff line number Diff line
@@ -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>
+61 −0
Original line number Diff line number Diff line
@@ -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>
+2 −2
Original line number Diff line number Diff line
@@ -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"/>

+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