1c29fa5a6Sopenharmony_ci/* 2c29fa5a6Sopenharmony_ci * Copyright (c) 2024 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 "stylus_key_handler.h" 17c29fa5a6Sopenharmony_ci 18c29fa5a6Sopenharmony_ci#include "ability_manager_client.h" 19c29fa5a6Sopenharmony_ci#include "define_multimodal.h" 20c29fa5a6Sopenharmony_ci#include "error_multimodal.h" 21c29fa5a6Sopenharmony_ci#include "mmi_log.h" 22c29fa5a6Sopenharmony_ci#include "setting_datashare.h" 23c29fa5a6Sopenharmony_ci#include "system_ability_definition.h" 24c29fa5a6Sopenharmony_ci 25c29fa5a6Sopenharmony_ci#undef MMI_LOG_TAG 26c29fa5a6Sopenharmony_ci#define MMI_LOG_TAG "StylusKeyHandler" 27c29fa5a6Sopenharmony_ci 28c29fa5a6Sopenharmony_cinamespace OHOS { 29c29fa5a6Sopenharmony_cinamespace MMI { 30c29fa5a6Sopenharmony_ciconst std::string SHORTHAND_ABILITY_NAME { "HiNotePcMainAbility" }; 31c29fa5a6Sopenharmony_ciconst std::string SHORTHAND_BUNDLE_NAME { "com.hmos.hinote" }; 32c29fa5a6Sopenharmony_ciconst std::string MEMORANDUM_ABILITY_NAME { "MainAbility" }; 33c29fa5a6Sopenharmony_ciconst std::string MEMORANDUM_BUNDLE_NAME { "com.hmos.hinote.notepad" }; 34c29fa5a6Sopenharmony_ciconst std::string IS_SCREEN_OFF { "is_sceen_off" }; 35c29fa5a6Sopenharmony_ciconst std::string SHORTHAND_SWITCH { "shorthand_switch_state" }; 36c29fa5a6Sopenharmony_ciconst std::string SHORTHAND_TARGET { "shorthand_target" }; 37c29fa5a6Sopenharmony_ci 38c29fa5a6Sopenharmony_ciStylusKeyHandler::StylusKeyHandler() {} 39c29fa5a6Sopenharmony_ciStylusKeyHandler::~StylusKeyHandler() {} 40c29fa5a6Sopenharmony_ci 41c29fa5a6Sopenharmony_cibool StylusKeyHandler::HandleStylusKey(std::shared_ptr<KeyEvent> keyEvent) 42c29fa5a6Sopenharmony_ci{ 43c29fa5a6Sopenharmony_ci CHKPF(keyEvent); 44c29fa5a6Sopenharmony_ci if (!isShortHandConfig_) { 45c29fa5a6Sopenharmony_ci stylusKey_.statusConfig = SHORTHAND_SWITCH; 46c29fa5a6Sopenharmony_ci CreateStatusConfigObserver(stylusKey_); 47c29fa5a6Sopenharmony_ci shortHandTarget_.statusConfig = SHORTHAND_TARGET; 48c29fa5a6Sopenharmony_ci CreateStatusConfigObserver(shortHandTarget_); 49c29fa5a6Sopenharmony_ci isShortHandConfig_ = true; 50c29fa5a6Sopenharmony_ci } 51c29fa5a6Sopenharmony_ci if (keyEvent->GetKeyCode() != KeyEvent::KEYCODE_STYLUS_SCREEN) { 52c29fa5a6Sopenharmony_ci stylusKey_.lastEventIsStylus = false; 53c29fa5a6Sopenharmony_ci return false; 54c29fa5a6Sopenharmony_ci } 55c29fa5a6Sopenharmony_ci if (stylusKey_.isLaunchAbility) { 56c29fa5a6Sopenharmony_ci stylusKey_.isLaunchAbility = false; 57c29fa5a6Sopenharmony_ci return true; 58c29fa5a6Sopenharmony_ci } 59c29fa5a6Sopenharmony_ci stylusKey_.lastEventIsStylus = true; 60c29fa5a6Sopenharmony_ci return false; 61c29fa5a6Sopenharmony_ci} 62c29fa5a6Sopenharmony_ci 63c29fa5a6Sopenharmony_citemplate <class T> 64c29fa5a6Sopenharmony_civoid StylusKeyHandler::CreateStatusConfigObserver(T& item) 65c29fa5a6Sopenharmony_ci{ 66c29fa5a6Sopenharmony_ci CALL_DEBUG_ENTER; 67c29fa5a6Sopenharmony_ci SettingObserver::UpdateFunc updateFunc = [&item](const std::string& key) { 68c29fa5a6Sopenharmony_ci bool statusValue = true; 69c29fa5a6Sopenharmony_ci auto ret = SettingDataShare::GetInstance(MULTIMODAL_INPUT_SERVICE_ID) 70c29fa5a6Sopenharmony_ci .GetBoolValue(key, statusValue); 71c29fa5a6Sopenharmony_ci if (ret != RET_OK) { 72c29fa5a6Sopenharmony_ci MMI_HILOGE("Get value from setting date fail"); 73c29fa5a6Sopenharmony_ci return; 74c29fa5a6Sopenharmony_ci } 75c29fa5a6Sopenharmony_ci MMI_HILOGI("Config changed key:%{public}s, value:%{public}d", key.c_str(), statusValue); 76c29fa5a6Sopenharmony_ci item.statusConfigValue = statusValue; 77c29fa5a6Sopenharmony_ci }; 78c29fa5a6Sopenharmony_ci sptr<SettingObserver> statusObserver = SettingDataShare::GetInstance(MULTIMODAL_INPUT_SERVICE_ID) 79c29fa5a6Sopenharmony_ci .CreateObserver(item.statusConfig, updateFunc); 80c29fa5a6Sopenharmony_ci ErrCode ret = SettingDataShare::GetInstance(MULTIMODAL_INPUT_SERVICE_ID).RegisterObserver(statusObserver); 81c29fa5a6Sopenharmony_ci if (ret != ERR_OK) { 82c29fa5a6Sopenharmony_ci MMI_HILOGE("Register setting observer failed, ret:%{public}d", ret); 83c29fa5a6Sopenharmony_ci statusObserver = nullptr; 84c29fa5a6Sopenharmony_ci } 85c29fa5a6Sopenharmony_ci bool configValue = true; 86c29fa5a6Sopenharmony_ci ret = SettingDataShare::GetInstance(MULTIMODAL_INPUT_SERVICE_ID) 87c29fa5a6Sopenharmony_ci .GetBoolValue(item.statusConfig, configValue); 88c29fa5a6Sopenharmony_ci if (ret != RET_OK) { 89c29fa5a6Sopenharmony_ci MMI_HILOGE("Get value from setting date fail"); 90c29fa5a6Sopenharmony_ci return; 91c29fa5a6Sopenharmony_ci } 92c29fa5a6Sopenharmony_ci MMI_HILOGI("Get value success key:%{public}s, value:%{public}d", item.statusConfig.c_str(), configValue); 93c29fa5a6Sopenharmony_ci item.statusConfigValue = configValue; 94c29fa5a6Sopenharmony_ci} 95c29fa5a6Sopenharmony_ci 96c29fa5a6Sopenharmony_civoid StylusKeyHandler::IsLaunchAbility() 97c29fa5a6Sopenharmony_ci{ 98c29fa5a6Sopenharmony_ci if (stylusKey_.statusConfigValue && stylusKey_.lastEventIsStylus) { 99c29fa5a6Sopenharmony_ci if (shortHandTarget_.statusConfigValue) { 100c29fa5a6Sopenharmony_ci stylusKey_.ability.abilityName = SHORTHAND_ABILITY_NAME; 101c29fa5a6Sopenharmony_ci stylusKey_.ability.bundleName = SHORTHAND_BUNDLE_NAME; 102c29fa5a6Sopenharmony_ci stylusKey_.ability.params.emplace(IS_SCREEN_OFF, "true"); 103c29fa5a6Sopenharmony_ci } else { 104c29fa5a6Sopenharmony_ci stylusKey_.ability.abilityName = MEMORANDUM_ABILITY_NAME; 105c29fa5a6Sopenharmony_ci stylusKey_.ability.bundleName = MEMORANDUM_BUNDLE_NAME; 106c29fa5a6Sopenharmony_ci } 107c29fa5a6Sopenharmony_ci LaunchAbility(stylusKey_.ability); 108c29fa5a6Sopenharmony_ci stylusKey_.lastEventIsStylus = false; 109c29fa5a6Sopenharmony_ci stylusKey_.isLaunchAbility = true; 110c29fa5a6Sopenharmony_ci } 111c29fa5a6Sopenharmony_ci} 112c29fa5a6Sopenharmony_ci 113c29fa5a6Sopenharmony_civoid StylusKeyHandler::LaunchAbility(const Ability &ability) 114c29fa5a6Sopenharmony_ci{ 115c29fa5a6Sopenharmony_ci AAFwk::Want want; 116c29fa5a6Sopenharmony_ci want.SetElementName(ability.deviceId, ability.bundleName, ability.abilityName); 117c29fa5a6Sopenharmony_ci want.SetAction(ability.action); 118c29fa5a6Sopenharmony_ci want.SetUri(ability.uri); 119c29fa5a6Sopenharmony_ci want.SetType(ability.type); 120c29fa5a6Sopenharmony_ci for (const auto &entity : ability.entities) { 121c29fa5a6Sopenharmony_ci want.AddEntity(entity); 122c29fa5a6Sopenharmony_ci } 123c29fa5a6Sopenharmony_ci for (const auto &item : ability.params) { 124c29fa5a6Sopenharmony_ci want.SetParam(item.first, item.second); 125c29fa5a6Sopenharmony_ci } 126c29fa5a6Sopenharmony_ci 127c29fa5a6Sopenharmony_ci ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->StartAbility(want); 128c29fa5a6Sopenharmony_ci if (err != ERR_OK) { 129c29fa5a6Sopenharmony_ci MMI_HILOGE("LaunchAbility failed, bundleName:%{public}s, err:%{public}d", ability.bundleName.c_str(), err); 130c29fa5a6Sopenharmony_ci } 131c29fa5a6Sopenharmony_ci MMI_HILOGD("End launch ability, bundleName:%{public}s", ability.bundleName.c_str()); 132c29fa5a6Sopenharmony_ci} 133c29fa5a6Sopenharmony_ci 134c29fa5a6Sopenharmony_civoid StylusKeyHandler::SetLastEventState(bool state) 135c29fa5a6Sopenharmony_ci{ 136c29fa5a6Sopenharmony_ci stylusKey_.lastEventIsStylus = state; 137c29fa5a6Sopenharmony_ci} 138c29fa5a6Sopenharmony_ci 139c29fa5a6Sopenharmony_ci} // namespace AppExecFwk 140c29fa5a6Sopenharmony_ci} // namespace OHOS 141