• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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