1 /*
2 * Copyright (c) 2022 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "ime_cfg_manager.h"
17 #include "file_operator.h"
18 #include "ime_enabled_info_manager.h"
19 namespace OHOS {
20 namespace MiscServices {
21 namespace {
22 constexpr const char *IME_CFG_FILE_PATH = "/data/service/el1/public/imf/ime_cfg.json";
23 } // namespace
24 std::shared_ptr<AppExecFwk::EventHandler> ImeCfgManager::serviceHandler_ = nullptr;
GetInstance()25 ImeCfgManager &ImeCfgManager::GetInstance()
26 {
27 static ImeCfgManager instance;
28 return instance;
29 }
30
Init()31 void ImeCfgManager::Init()
32 {
33 ReadImeCfg();
34 }
35
ReadImeCfg()36 void ImeCfgManager::ReadImeCfg()
37 {
38 if (!FileOperator::IsExist(IME_CFG_FILE_PATH)) {
39 IMSA_HILOGD("ime cfg file not found.");
40 return;
41 }
42 std::string cfg;
43 bool ret = FileOperator::Read(IME_CFG_FILE_PATH, cfg);
44 if (!ret) {
45 IMSA_HILOGE("failed to ReadJsonFile!");
46 return;
47 }
48 ParseImeCfg(cfg);
49 }
50
WriteImeCfg()51 void ImeCfgManager::WriteImeCfg()
52 {
53 auto content = PackageImeCfg();
54 if (content.empty()) {
55 IMSA_HILOGE("failed to Package imeCfg!");
56 return;
57 }
58 if (serviceHandler_ == nullptr) {
59 IMSA_HILOGE("serviceHandler_ is nullptr!");
60 return;
61 }
62 auto task = [content]() {
63 IMSA_HILOGD("start WriteJsonFile!");
64 if (!FileOperator::Write(IME_CFG_FILE_PATH, content, O_CREAT | O_WRONLY | O_SYNC | O_TRUNC)) {
65 IMSA_HILOGE("failed to WriteJsonFile!");
66 }
67 };
68 serviceHandler_->PostTask(task, "WriteImeCfg", 0, AppExecFwk::EventQueue::Priority::IMMEDIATE);
69 }
70
ParseImeCfg(const std::string & content)71 bool ImeCfgManager::ParseImeCfg(const std::string &content)
72 {
73 IMSA_HILOGD("content: %{public}s", content.c_str());
74 ImePersistCfg cfg;
75 auto ret = cfg.Unmarshall(content);
76 if (!ret) {
77 IMSA_HILOGE("Unmarshall failed!");
78 return false;
79 }
80 std::lock_guard<std::recursive_mutex> lock(imeCfgLock_);
81 imeConfigs_ = cfg.imePersistInfo;
82 return true;
83 }
84
PackageImeCfg()85 std::string ImeCfgManager::PackageImeCfg()
86 {
87 ImePersistCfg cfg;
88 {
89 std::lock_guard<std::recursive_mutex> lock(imeCfgLock_);
90 cfg.imePersistInfo = imeConfigs_;
91 }
92 std::string content;
93 auto ret = cfg.Marshall(content);
94 IMSA_HILOGD("ret: %{public}d, content: %{public}s, size: %{public}zu", ret, content.c_str(),
95 cfg.imePersistInfo.size());
96 return content;
97 }
98
AddImeCfg(const ImePersistInfo & cfg)99 void ImeCfgManager::AddImeCfg(const ImePersistInfo &cfg)
100 {
101 ImeEnabledInfoManager::GetInstance().SetCurrentIme(
102 cfg.userId, cfg.currentIme, cfg.currentSubName, cfg.isDefaultImeSet);
103 }
104
ModifyImeCfg(const ImePersistInfo & cfg)105 void ImeCfgManager::ModifyImeCfg(const ImePersistInfo &cfg)
106 {
107 ImeEnabledInfoManager::GetInstance().SetCurrentIme(
108 cfg.userId, cfg.currentIme, cfg.currentSubName, cfg.isDefaultImeSet);
109 }
110
ModifyTempScreenLockImeCfg(int32_t userId,const std::string & ime)111 void ImeCfgManager::ModifyTempScreenLockImeCfg(int32_t userId, const std::string &ime)
112 {
113 ImeEnabledInfoManager::GetInstance().SetTmpIme(userId, ime);
114 }
115
DeleteImeCfg(int32_t userId)116 void ImeCfgManager::DeleteImeCfg(int32_t userId)
117 {
118 std::lock_guard<std::recursive_mutex> lock(imeCfgLock_);
119 for (auto iter = imeConfigs_.begin(); iter != imeConfigs_.end(); iter++) {
120 if (iter->userId == userId) {
121 imeConfigs_.erase(iter);
122 break;
123 }
124 }
125 WriteImeCfg();
126 }
127
GetImeCfg(int32_t userId)128 ImePersistInfo ImeCfgManager::GetImeCfg(int32_t userId)
129 {
130 std::lock_guard<std::recursive_mutex> lock(imeCfgLock_);
131 auto it = std::find_if(imeConfigs_.begin(), imeConfigs_.end(),
132 [userId](const ImePersistInfo &cfg) { return cfg.userId == userId; });
133 if (it != imeConfigs_.end()) {
134 return *it;
135 }
136 return {};
137 }
138
GetCurrentImeCfg(int32_t userId)139 std::shared_ptr<ImeNativeCfg> ImeCfgManager::GetCurrentImeCfg(int32_t userId)
140 {
141 return ImeEnabledInfoManager::GetInstance().GetCurrentImeCfg(userId);
142 }
143
IsDefaultImeSet(int32_t userId)144 bool ImeCfgManager::IsDefaultImeSet(int32_t userId)
145 {
146 IMSA_HILOGI("ImeCfgManager::IsDefaultImeSet enter.");
147 auto ret = ImeEnabledInfoManager::GetInstance().IsDefaultImeSet(userId);
148 IMSA_HILOGI("isDefaultImeSet: %{public}d", ret);
149 return ret;
150 }
151
SetEventHandler(const std::shared_ptr<AppExecFwk::EventHandler> & eventHandler)152 void ImeCfgManager::SetEventHandler(const std::shared_ptr<AppExecFwk::EventHandler> &eventHandler)
153 {
154 serviceHandler_ = eventHandler;
155 }
156 } // namespace MiscServices
157 } // namespace OHOS