// Copyright 2022 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/ash/system_logs/virtual_keyboard_log_source.h"
#include <memory>
#include <string>
#include <utility>
#include "ash/keyboard/keyboard_controller_impl.h"
#include "ash/keyboard/ui/keyboard_ui_controller.h"
#include "ash/keyboard/virtual_keyboard_controller.h"
#include "ash/public/cpp/keyboard/keyboard_types.h"
#include "ash/shell.h"
#include "base/strings/strcat.h"
#include "base/strings/string_number_conversions.h"
#include "base/strings/stringprintf.h"
namespace system_logs {
namespace {
std::string LogEntryForBooleanField(const std::string& field_name, bool value) {
return base::StrCat({field_name, ": ", base::NumberToString(value), "\n"});
}
} // namespace
VirtualKeyboardLogSource::VirtualKeyboardLogSource()
: SystemLogsSource("VirtualKeyboard") {}
void VirtualKeyboardLogSource::Fetch(SysLogsSourceCallback callback) {
DCHECK(!callback.is_null());
auto response = std::make_unique<SystemLogsResponse>();
keyboard::KeyboardUIController* keyboard_ui_controller =
keyboard::KeyboardUIController::Get();
ash::VirtualKeyboardController* virtual_keyboard_controller =
ash::Shell::Get()->keyboard_controller()->virtual_keyboard_controller();
std::string log_data;
int touchscreen_count = 1;
for (const ui::InputDevice& device :
virtual_keyboard_controller->GetTouchscreens()) {
const std::string touchscreen_count_converted =
base::NumberToString(touchscreen_count);
log_data += base::StrCat({"Touchscreen ", touchscreen_count_converted,
" Product ID"}) +
": " + base::StringPrintf("0x%04x", device.product_id) + "\n";
log_data += base::StrCat({"Touchscreen ", touchscreen_count_converted,
" Vendor ID"}) +
": " + base::StringPrintf("0x%04x", device.vendor_id) + "\n";
++touchscreen_count;
}
log_data +=
"Internal Keyboard Name: " +
(virtual_keyboard_controller->GetInternalKeyboardName()
? virtual_keyboard_controller->GetInternalKeyboardName().value()
: "No Internal Keyboard Detected") +
"\n";
log_data += "Is Internal Keyboard Ignored: " +
base::NumberToString(
virtual_keyboard_controller->IsInternalKeyboardIgnored()) +
"\n";
int external_keyboard_count = 1;
std::vector<ui::InputDevice> external_keyboards =
virtual_keyboard_controller->GetExternalKeyboards();
if (external_keyboards.size() == 0) {
log_data += "No External Keyboard Detected\n";
}
for (const ui::InputDevice& device : external_keyboards) {
const std::string external_keyboard_count_converted =
base::NumberToString(external_keyboard_count);
log_data +=
base::StrCat({"External Keyboard ", external_keyboard_count_converted,
" Product ID"}) +
": " + base::StringPrintf("0x%04x", device.product_id) + "\n";
log_data +=
base::StrCat({"External Keyboard ", external_keyboard_count_converted,
" Vendor ID"}) +
": " + base::StringPrintf("0x%04x", device.vendor_id) + "\n";
++external_keyboard_count;
}
log_data += LogEntryForBooleanField(
"Is External Keyboard Ignored: ",
virtual_keyboard_controller->IsExternalKeyboardIgnored());
log_data += LogEntryForBooleanField(
"kPolicyEnabled Flag: ",
keyboard_ui_controller->IsEnableFlagSet(
keyboard::KeyboardEnableFlag::kPolicyEnabled));
log_data += LogEntryForBooleanField(
"kPolicyDisabled Flag: ",
keyboard_ui_controller->IsEnableFlagSet(
keyboard::KeyboardEnableFlag::kPolicyDisabled));
log_data += LogEntryForBooleanField(
"kAndroidDisabled Flag: ",
keyboard_ui_controller->IsEnableFlagSet(
keyboard::KeyboardEnableFlag::kAndroidDisabled));
log_data += LogEntryForBooleanField(
"kExtensionEnabled Flag: ",
keyboard_ui_controller->IsEnableFlagSet(
keyboard::KeyboardEnableFlag::kExtensionEnabled));
log_data += LogEntryForBooleanField(
"kExtensionDisabled Flag: ",
keyboard_ui_controller->IsEnableFlagSet(
keyboard::KeyboardEnableFlag::kExtensionDisabled));
log_data += LogEntryForBooleanField(
"kAccessibilityEnabled Flag: ",
keyboard_ui_controller->IsEnableFlagSet(
keyboard::KeyboardEnableFlag::kAccessibilityEnabled));
log_data += LogEntryForBooleanField(
"kShelfEnabled Flag: ", keyboard_ui_controller->IsEnableFlagSet(
keyboard::KeyboardEnableFlag::kShelfEnabled));
log_data += LogEntryForBooleanField(
"kTouchEnabled Flag: ", keyboard_ui_controller->IsEnableFlagSet(
keyboard::KeyboardEnableFlag::kTouchEnabled));
log_data += LogEntryForBooleanField(
"kCommandLineEnabled Flag: ",
keyboard_ui_controller->IsEnableFlagSet(
keyboard::KeyboardEnableFlag::kCommandLineEnabled));
log_data += LogEntryForBooleanField(
"kCommandLineDisabled Flag: ",
keyboard_ui_controller->IsEnableFlagSet(
keyboard::KeyboardEnableFlag::kCommandLineDisabled));
response->emplace("virtual_keyboard", log_data);
std::move(callback).Run(std::move(response));
}
} // namespace system_logs