1c29fa5a6Sopenharmony_ci/* 2c29fa5a6Sopenharmony_ci * Copyright (c) 2022 Huawei Device Co., Ltd. 3c29fa5a6Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4c29fa5a6Sopenharmony_ci * you may not use this file except in compliance with the License. 5c29fa5a6Sopenharmony_ci * You may obtain a copy of the License at 6c29fa5a6Sopenharmony_ci * 7c29fa5a6Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8c29fa5a6Sopenharmony_ci * 9c29fa5a6Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10c29fa5a6Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11c29fa5a6Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12c29fa5a6Sopenharmony_ci * See the License for the specific language governing permissions and 13c29fa5a6Sopenharmony_ci * limitations under the License. 14c29fa5a6Sopenharmony_ci */ 15c29fa5a6Sopenharmony_ci 16c29fa5a6Sopenharmony_ci#include "key_map_manager.h" 17c29fa5a6Sopenharmony_ci 18c29fa5a6Sopenharmony_ci#include <array> 19c29fa5a6Sopenharmony_ci 20c29fa5a6Sopenharmony_ci#include "define_multimodal.h" 21c29fa5a6Sopenharmony_ci#include "input_device_manager.h" 22c29fa5a6Sopenharmony_ci#include "mmi_log.h" 23c29fa5a6Sopenharmony_ci#include "util.h" 24c29fa5a6Sopenharmony_ci 25c29fa5a6Sopenharmony_ci#undef MMI_LOG_DOMAIN 26c29fa5a6Sopenharmony_ci#define MMI_LOG_DOMAIN MMI_LOG_DISPATCH 27c29fa5a6Sopenharmony_ci#undef MMI_LOG_TAG 28c29fa5a6Sopenharmony_ci#define MMI_LOG_TAG "KeyMapManager" 29c29fa5a6Sopenharmony_ci 30c29fa5a6Sopenharmony_cinamespace OHOS { 31c29fa5a6Sopenharmony_cinamespace MMI { 32c29fa5a6Sopenharmony_ciKeyMapManager::KeyMapManager() {} 33c29fa5a6Sopenharmony_ciKeyMapManager::~KeyMapManager() {} 34c29fa5a6Sopenharmony_ci 35c29fa5a6Sopenharmony_civoid KeyMapManager::GetConfigKeyValue(const std::string &fileName, int32_t deviceId) 36c29fa5a6Sopenharmony_ci{ 37c29fa5a6Sopenharmony_ci CALL_DEBUG_ENTER; 38c29fa5a6Sopenharmony_ci if (fileName.empty()) { 39c29fa5a6Sopenharmony_ci MMI_HILOGE("fileName is empty"); 40c29fa5a6Sopenharmony_ci return; 41c29fa5a6Sopenharmony_ci } 42c29fa5a6Sopenharmony_ci std::string filePath = GetProFilePath(fileName); 43c29fa5a6Sopenharmony_ci ReadProFile(filePath, deviceId, configKeyValue_); 44c29fa5a6Sopenharmony_ci MMI_HILOGD("Number of loaded config files:%{public}zu", configKeyValue_.size()); 45c29fa5a6Sopenharmony_ci} 46c29fa5a6Sopenharmony_ci 47c29fa5a6Sopenharmony_civoid KeyMapManager::ParseDeviceConfigFile(struct libinput_device *device) 48c29fa5a6Sopenharmony_ci{ 49c29fa5a6Sopenharmony_ci CHKPV(device); 50c29fa5a6Sopenharmony_ci std::string fileName = GetKeyEventFileName(device); 51c29fa5a6Sopenharmony_ci if (fileName.empty()) { 52c29fa5a6Sopenharmony_ci MMI_HILOGE("Get fileName is empty"); 53c29fa5a6Sopenharmony_ci return; 54c29fa5a6Sopenharmony_ci } 55c29fa5a6Sopenharmony_ci int32_t deviceId = INPUT_DEV_MGR->FindInputDeviceId(device); 56c29fa5a6Sopenharmony_ci GetConfigKeyValue(fileName, deviceId); 57c29fa5a6Sopenharmony_ci} 58c29fa5a6Sopenharmony_ci 59c29fa5a6Sopenharmony_civoid KeyMapManager::RemoveKeyValue(struct libinput_device *device) 60c29fa5a6Sopenharmony_ci{ 61c29fa5a6Sopenharmony_ci CHKPV(device); 62c29fa5a6Sopenharmony_ci int32_t deviceId = INPUT_DEV_MGR->FindInputDeviceId(device); 63c29fa5a6Sopenharmony_ci auto iter = configKeyValue_.find(deviceId); 64c29fa5a6Sopenharmony_ci if (iter == configKeyValue_.end()) { 65c29fa5a6Sopenharmony_ci MMI_HILOGD("Device config file does not exist"); 66c29fa5a6Sopenharmony_ci return; 67c29fa5a6Sopenharmony_ci } 68c29fa5a6Sopenharmony_ci configKeyValue_.erase(iter); 69c29fa5a6Sopenharmony_ci MMI_HILOGD("Number of files that remain after deletion:%{public}zu", configKeyValue_.size()); 70c29fa5a6Sopenharmony_ci} 71c29fa5a6Sopenharmony_ci 72c29fa5a6Sopenharmony_ciint32_t KeyMapManager::GetDefaultKeyId() 73c29fa5a6Sopenharmony_ci{ 74c29fa5a6Sopenharmony_ci return defaultKeyId_; 75c29fa5a6Sopenharmony_ci} 76c29fa5a6Sopenharmony_ci 77c29fa5a6Sopenharmony_cistd::string KeyMapManager::GetProFilePath(const std::string &fileName) const 78c29fa5a6Sopenharmony_ci{ 79c29fa5a6Sopenharmony_ci return "/vendor/etc/keymap/" + fileName + ".pro"; 80c29fa5a6Sopenharmony_ci} 81c29fa5a6Sopenharmony_ci 82c29fa5a6Sopenharmony_cistd::string KeyMapManager::GetKeyEventFileName(struct libinput_device *device) 83c29fa5a6Sopenharmony_ci{ 84c29fa5a6Sopenharmony_ci CHKPS(device); 85c29fa5a6Sopenharmony_ci uint32_t vendor = libinput_device_get_id_vendor(device); 86c29fa5a6Sopenharmony_ci uint32_t product = libinput_device_get_id_product(device); 87c29fa5a6Sopenharmony_ci uint32_t version = libinput_device_get_id_version(device); 88c29fa5a6Sopenharmony_ci const char *name = libinput_device_get_name(device); 89c29fa5a6Sopenharmony_ci CHKPS(name); 90c29fa5a6Sopenharmony_ci std::string fileName = std::to_string(vendor) + "_" + std::to_string(product) + "_" + 91c29fa5a6Sopenharmony_ci std::to_string(version) + "_" + name; 92c29fa5a6Sopenharmony_ci RemoveSpace(fileName); 93c29fa5a6Sopenharmony_ci return fileName; 94c29fa5a6Sopenharmony_ci} 95c29fa5a6Sopenharmony_ci 96c29fa5a6Sopenharmony_ciint32_t KeyMapManager::TransferDefaultKeyValue(int32_t inputKey) 97c29fa5a6Sopenharmony_ci{ 98c29fa5a6Sopenharmony_ci CALL_DEBUG_ENTER; 99c29fa5a6Sopenharmony_ci if (auto itr = configKeyValue_.find(defaultKeyId_); itr != configKeyValue_.end()) { 100c29fa5a6Sopenharmony_ci if (auto defaultKey = itr->second.find(inputKey); defaultKey != itr->second.end()) { 101c29fa5a6Sopenharmony_ci return defaultKey->second; 102c29fa5a6Sopenharmony_ci } 103c29fa5a6Sopenharmony_ci } 104c29fa5a6Sopenharmony_ci MMI_HILOGD("Return key values in the TransferKeyValue"); 105c29fa5a6Sopenharmony_ci return TransferKeyValue(inputKey).sysKeyValue; 106c29fa5a6Sopenharmony_ci} 107c29fa5a6Sopenharmony_ci 108c29fa5a6Sopenharmony_ciint32_t KeyMapManager::TransferDeviceKeyValue(struct libinput_device *device, 109c29fa5a6Sopenharmony_ci int32_t inputKey) 110c29fa5a6Sopenharmony_ci{ 111c29fa5a6Sopenharmony_ci CALL_DEBUG_ENTER; 112c29fa5a6Sopenharmony_ci if (device == nullptr) { 113c29fa5a6Sopenharmony_ci return TransferDefaultKeyValue(inputKey); 114c29fa5a6Sopenharmony_ci } 115c29fa5a6Sopenharmony_ci int32_t deviceId = INPUT_DEV_MGR->FindInputDeviceId(device); 116c29fa5a6Sopenharmony_ci if (auto itr = configKeyValue_.find(deviceId); itr != configKeyValue_.end()) { 117c29fa5a6Sopenharmony_ci if (auto devKey = itr->second.find(inputKey); devKey != itr->second.end()) { 118c29fa5a6Sopenharmony_ci return devKey->second; 119c29fa5a6Sopenharmony_ci } 120c29fa5a6Sopenharmony_ci } 121c29fa5a6Sopenharmony_ci return TransferDefaultKeyValue(inputKey); 122c29fa5a6Sopenharmony_ci} 123c29fa5a6Sopenharmony_ci 124c29fa5a6Sopenharmony_cistd::vector<int32_t> KeyMapManager::InputTransferKeyValue(int32_t deviceId, int32_t keyCode) 125c29fa5a6Sopenharmony_ci{ 126c29fa5a6Sopenharmony_ci std::vector<int32_t> sysKey; 127c29fa5a6Sopenharmony_ci if (auto iter = configKeyValue_.find(deviceId); iter != configKeyValue_.end()) { 128c29fa5a6Sopenharmony_ci for (const auto &it : iter->second) { 129c29fa5a6Sopenharmony_ci if (it.second == keyCode) { 130c29fa5a6Sopenharmony_ci sysKey.push_back(it.first); 131c29fa5a6Sopenharmony_ci } 132c29fa5a6Sopenharmony_ci } 133c29fa5a6Sopenharmony_ci return sysKey; 134c29fa5a6Sopenharmony_ci } else if (auto itr = configKeyValue_.find(defaultKeyId_); itr != configKeyValue_.end()) { 135c29fa5a6Sopenharmony_ci for (const auto &it : itr->second) { 136c29fa5a6Sopenharmony_ci if (it.second == keyCode) { 137c29fa5a6Sopenharmony_ci sysKey.push_back(it.first); 138c29fa5a6Sopenharmony_ci } 139c29fa5a6Sopenharmony_ci } 140c29fa5a6Sopenharmony_ci return sysKey; 141c29fa5a6Sopenharmony_ci } else { 142c29fa5a6Sopenharmony_ci sysKey.push_back(InputTransformationKeyValue(keyCode)); 143c29fa5a6Sopenharmony_ci return sysKey; 144c29fa5a6Sopenharmony_ci } 145c29fa5a6Sopenharmony_ci return sysKey; 146c29fa5a6Sopenharmony_ci} 147c29fa5a6Sopenharmony_ci} // namespace MMI 148c29fa5a6Sopenharmony_ci} // namespace OHOS 149