Skip to content

Commit

Permalink
customization: Convert button remapping mojom object to dict
Browse files Browse the repository at this point in the history
This CL converts the button remapping mojom object to dict and tests
different cases for the button remapping object.

Bug: b/241965717
Test: ash_unittests ConvertButtonRemappingToDict
Change-Id: Idc34bc6990d290819a24af89ffcc430299575e4b
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/4654791
Commit-Queue: Danny Wang <wangdanny@google.com>
Reviewed-by: Wes Okuhara <wesokuhara@google.com>
Reviewed-by: David Padlipsky <dpad@google.com>
Reviewed-by: Daniel Cheng <dcheng@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1176257}
  • Loading branch information
Zihao-Danny authored and Chromium LUCI CQ committed Jul 27, 2023
1 parent cf99a52 commit 2148b7c
Show file tree
Hide file tree
Showing 6 changed files with 196 additions and 0 deletions.
43 changes: 43 additions & 0 deletions ash/public/mojom/input_device_settings.mojom
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@

module ash.mojom;

import "ash/public/mojom/accelerator_actions.mojom";
import "ash/public/mojom/accelerator_keys.mojom";
import "mojo/public/mojom/base/time.mojom";
import "ui/events/ash/mojom/modifier_key.mojom";
import "ui/events/ash/mojom/simulate_right_click_modifier.mojom";
Expand Down Expand Up @@ -208,3 +210,44 @@ struct Stylus {
// `mojom::GraphicsTablet` struct.
struct GraphicsTablet {
};

// Contains all information needed to apply remappings from a button to
// either an action or key event and display it within the settings app.
struct ButtonRemapping {
// Human-readable label of the button remapping which user can rename.
string name;
Button button;
RemappingAction? remapping_action;
};

// Represents the remapping action which can be either a key event or action.
union RemappingAction {
ash.mojom.AcceleratorAction action;
KeyEvent key_event;
};

// Represents the key event the button remaps to.
struct KeyEvent {
ash.mojom.VKey vkey;
uint32 dom_code;
uint32 dom_key;
uint32 modifiers;
};

// Represents the button to remap which can be either a virtual key or
// customizable button.
union Button {
ash.mojom.VKey vkey;
CustomizableButton customizable_button;
};

// Contains the valid set of customizable buttons on the mouse.
enum CustomizableButton {
kLeft = 0,
kRight = 1,
kMiddle = 2,
kForward = 3,
kBack = 4,
kExtra = 5,
kSide = 6,
};
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,17 @@ constexpr char kPointingStickSettingSensitivity[] = "sensitivity";
constexpr char kPointingStickSettingSwapRight[] = "swap_right";
constexpr char kPointingStickSettingAcceleration[] = "acceleration";

// Button Remapping dictionary keys.
constexpr char kButtonRemappings[] = "button_remappings";
constexpr char kButtonRemappingName[] = "name";
constexpr char kButtonRemappingCustomizableButton[] = "customizable_button";
constexpr char kButtonRemappingKeyboardCode[] = "vkey";
constexpr char kButtonRemappingAction[] = "action";
constexpr char kButtonRemappingKeyEvent[] = "key_event";
constexpr char kButtonRemappingDomCode[] = "dom_code";
constexpr char kButtonRemappingDomKey[] = "dom_key";
constexpr char kButtonRemappingModifiers[] = "modifiers";

} // namespace ash::prefs

#endif // ASH_SYSTEM_INPUT_DEVICE_SETTINGS_INPUT_DEVICE_SETTINGS_PREF_NAMES_H_
40 changes: 40 additions & 0 deletions ash/system/input_device_settings/input_device_settings_utils.cc
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
#include "ash/system/input_device_settings/input_device_settings_utils.h"

#include "ash/public/mojom/input_device_settings.mojom.h"
#include "ash/system/input_device_settings/input_device_settings_pref_names.h"
#include "base/containers/fixed_flat_set.h"
#include "base/export_template.h"
#include "base/strings/strcat.h"
Expand Down Expand Up @@ -138,4 +139,43 @@ bool IsKeyboardPretendingToBeMouse(const ui::InputDevice& device) {
{device.vendor_id, device.product_id});
}

base::Value::Dict ConvertButtonRemappingToDict(
const mojom::ButtonRemapping& remapping) {
base::Value::Dict dict;

dict.Set(prefs::kButtonRemappingName, remapping.name);
if (remapping.button->is_customizable_button()) {
dict.Set(prefs::kButtonRemappingCustomizableButton,
static_cast<int>(remapping.button->get_customizable_button()));
} else if (remapping.button->is_vkey()) {
dict.Set(prefs::kButtonRemappingKeyboardCode,
static_cast<int>(remapping.button->get_vkey()));
}

if (!remapping.remapping_action) {
return dict;
}
if (remapping.remapping_action->is_key_event()) {
base::Value::Dict key_event;
key_event.Set(prefs::kButtonRemappingDomCode,
static_cast<int>(
remapping.remapping_action->get_key_event()->dom_code));
key_event.Set(
prefs::kButtonRemappingDomKey,
static_cast<int>(remapping.remapping_action->get_key_event()->dom_key));
key_event.Set(prefs::kButtonRemappingModifiers,
static_cast<int>(
remapping.remapping_action->get_key_event()->modifiers));
key_event.Set(
prefs::kButtonRemappingKeyboardCode,
static_cast<int>(remapping.remapping_action->get_key_event()->vkey));
dict.Set(prefs::kButtonRemappingKeyEvent, std::move(key_event));
} else if (remapping.remapping_action->is_action()) {
dict.Set(prefs::kButtonRemappingAction,
static_cast<int>(remapping.remapping_action->get_action()));
}

return dict;
}

} // namespace ash
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,9 @@ ASH_EXPORT const base::Value::Dict* GetLoginScreenSettingsDict(
AccountId account_id,
const std::string& pref_name);

ASH_EXPORT base::Value::Dict ConvertButtonRemappingToDict(
const mojom::ButtonRemapping& remapping);

ASH_EXPORT bool IsKeyboardPretendingToBeMouse(const ui::InputDevice& device);

} // namespace ash
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@

#include <cstdint>

#include "ash/public/mojom/input_device_settings.mojom.h"
#include "ash/system/input_device_settings/input_device_settings_pref_names.h"
#include "base/values.h"
#include "components/account_id/account_id.h"
#include "components/prefs/pref_registry_simple.h"
Expand All @@ -22,6 +24,29 @@ namespace {
constexpr char kTestPrefKey[] = "test_key";
const AccountId account_id = AccountId::FromUserEmail("example@email.com");

const mojom::ButtonRemapping button_remapping1(
/*name=*/"test1",
/*button=*/
mojom::Button::NewCustomizableButton(mojom::CustomizableButton::kBack),
/*remapping_action=*/
mojom::RemappingAction::NewAction(ash::AcceleratorAction::kBrightnessDown));
const mojom::ButtonRemapping button_remapping2(
/*name=*/"test2",
/*button=*/
mojom::Button::NewCustomizableButton(mojom::CustomizableButton::kLeft),
/*remapping_action=*/
mojom::RemappingAction::NewKeyEvent(
mojom::KeyEvent::New(::ui::KeyboardCode::VKEY_0, 1, 2, 3)));
const mojom::ButtonRemapping button_remapping3(
/*name=*/"test3",
/*button=*/mojom::Button::NewVkey(::ui::KeyboardCode::VKEY_1),
/*remapping_action=*/
mojom::RemappingAction::NewKeyEvent(
mojom::KeyEvent::New(::ui::KeyboardCode::VKEY_2, 4, 5, 6)));
const mojom::ButtonRemapping button_remapping4(
/*name=*/"test4",
/*button=*/mojom::Button::NewVkey(::ui::KeyboardCode::VKEY_3),
/*remapping_action=*/nullptr);
} // namespace

class DeviceKeyTest : public testing::TestWithParam<
Expand Down Expand Up @@ -62,4 +87,74 @@ TEST(GetLoginScreenSettingsDictTest, RetrieveSettingsDict) {
EXPECT_NE(nullptr, valid_settings);
}

TEST(ConvertButtonRemappingToDict, ConvertButtonRemappingToDict) {
const base::Value::Dict dict1 =
ConvertButtonRemappingToDict(button_remapping1);
EXPECT_EQ(button_remapping1.name,
*dict1.FindString(prefs::kButtonRemappingName));
EXPECT_EQ(
static_cast<int>(button_remapping1.button->get_customizable_button()),
*dict1.FindInt(prefs::kButtonRemappingCustomizableButton));
EXPECT_EQ(static_cast<int>(button_remapping1.remapping_action->get_action()),
*dict1.FindInt(prefs::kButtonRemappingAction));

const base::Value::Dict dict2 =
ConvertButtonRemappingToDict(button_remapping2);
EXPECT_EQ(button_remapping2.name,
*dict2.FindString(prefs::kButtonRemappingName));
EXPECT_EQ(
static_cast<int>(button_remapping2.button->get_customizable_button()),
*dict2.FindInt(prefs::kButtonRemappingCustomizableButton));
EXPECT_NE(nullptr, dict2.FindDict(prefs::kButtonRemappingKeyEvent));
EXPECT_EQ(static_cast<int>(
button_remapping2.remapping_action->get_key_event()->dom_code),
*dict2.FindDict(prefs::kButtonRemappingKeyEvent)
->FindInt(prefs::kButtonRemappingDomCode));
EXPECT_EQ(static_cast<int>(
button_remapping2.remapping_action->get_key_event()->dom_key),
*dict2.FindDict(prefs::kButtonRemappingKeyEvent)
->FindInt(prefs::kButtonRemappingDomKey));
EXPECT_EQ(static_cast<int>(
button_remapping2.remapping_action->get_key_event()->modifiers),
*dict2.FindDict(prefs::kButtonRemappingKeyEvent)
->FindInt(prefs::kButtonRemappingModifiers));
EXPECT_EQ(static_cast<int>(
button_remapping2.remapping_action->get_key_event()->vkey),
*dict2.FindDict(prefs::kButtonRemappingKeyEvent)
->FindInt(prefs::kButtonRemappingKeyboardCode));

const base::Value::Dict dict3 =
ConvertButtonRemappingToDict(button_remapping3);
EXPECT_EQ(button_remapping3.name,
*dict3.FindString(prefs::kButtonRemappingName));
EXPECT_EQ(static_cast<int>(button_remapping3.button->get_vkey()),
*dict3.FindInt(prefs::kButtonRemappingKeyboardCode));
EXPECT_NE(nullptr, dict3.FindDict(prefs::kButtonRemappingKeyEvent));
EXPECT_EQ(static_cast<int>(
button_remapping3.remapping_action->get_key_event()->dom_code),
*dict3.FindDict(prefs::kButtonRemappingKeyEvent)
->FindInt(prefs::kButtonRemappingDomCode));
EXPECT_EQ(static_cast<int>(
button_remapping3.remapping_action->get_key_event()->dom_key),
*dict3.FindDict(prefs::kButtonRemappingKeyEvent)
->FindInt(prefs::kButtonRemappingDomKey));
EXPECT_EQ(static_cast<int>(
button_remapping3.remapping_action->get_key_event()->modifiers),
*dict3.FindDict(prefs::kButtonRemappingKeyEvent)
->FindInt(prefs::kButtonRemappingModifiers));
EXPECT_EQ(static_cast<int>(
button_remapping3.remapping_action->get_key_event()->vkey),
*dict3.FindDict(prefs::kButtonRemappingKeyEvent)
->FindInt(prefs::kButtonRemappingKeyboardCode));

const base::Value::Dict dict4 =
ConvertButtonRemappingToDict(button_remapping4);
EXPECT_EQ(button_remapping4.name,
*dict4.FindString(prefs::kButtonRemappingName));
EXPECT_EQ(static_cast<int>(button_remapping4.button->get_vkey()),
*dict4.FindInt(prefs::kButtonRemappingKeyboardCode));
EXPECT_EQ(nullptr, dict4.FindDict(prefs::kButtonRemappingKeyEvent));
EXPECT_EQ(absl::nullopt, dict4.FindInt(prefs::kButtonRemappingAction));
}

} // namespace ash
4 changes: 4 additions & 0 deletions chrome/browser/resources/ash/settings/BUILD.gn
Original file line number Diff line number Diff line change
Expand Up @@ -436,6 +436,8 @@ build_webui("build") {

mojo_files_deps = [
":rename_personalization_search_mojom",
"//ash/public/mojom:accelerator_actions_ts__generator",
"//ash/public/mojom:accelerator_keys_ts__generator",
"//ash/public/mojom:input_device_settings_ts__generator",
"//chrome/browser/ui/webui/settings/ash/files_page/mojom:mojom_ts__generator",
"//chrome/browser/ui/webui/settings/ash/input_device_settings:mojom_ts__generator",
Expand All @@ -447,6 +449,8 @@ build_webui("build") {
"//ui/events/ash/mojom:mojom_ts__generator",
]
mojo_files = [
"$root_gen_dir/ash/public/mojom/accelerator_actions.mojom-webui.ts",
"$root_gen_dir/ash/public/mojom/accelerator_keys.mojom-webui.ts",
"$root_gen_dir/ash/public/mojom/input_device_settings.mojom-webui.ts",
"$root_gen_dir/chrome/browser/ui/webui/settings/ash/files_page/mojom/google_drive_handler.mojom-webui.ts",
"$root_gen_dir/chrome/browser/ui/webui/settings/ash/files_page/mojom/one_drive_handler.mojom-webui.ts",
Expand Down

0 comments on commit 2148b7c

Please sign in to comment.