1 /*
2 * Copyright (c) 2023 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 "multimodal_input_preferences_manager.h"
17
18 #include "mmi_log.h"
19
20 #undef MMI_LOG_DOMAIN
21 #define MMI_LOG_DOMAIN MMI_LOG_SERVER
22 #undef MMI_LOG_TAG
23 #define MMI_LOG_TAG "MultiModalInputPreferencesManager"
24
25 namespace OHOS {
26 namespace MMI {
27 namespace {
28 constexpr int32_t KEYBOARD_REPEATRATE { 50 };
29 constexpr int32_t KEYBOARD_REPEATDELAY { 500 };
30 constexpr int32_t MOUSE_SCROLL_ROWS { 3 };
31 constexpr int32_t PRIMARY_BUTTON { 0 };
32 constexpr int32_t POINTER_SPEED { 7 };
33 constexpr int32_t TOUCHPAD_POINTER_SPEED { 6 };
34 constexpr int32_t RIGHT_CLICK_TYPE { 1 };
35 constexpr int32_t POINTER_COLOR { -1 };
36 constexpr int32_t POINTER_SIZE { 1 };
37 #ifdef OHOS_BUILD_ENABLE_MAGICCURSOR
38 constexpr int32_t MAGIC_POINTER_SIZE { 1 };
39 #endif // OHOS_BUILD_ENABLE_MAGICCURSOR
40 constexpr int32_t POINTER_STYLE { 0 };
41 constexpr int32_t ERROR_DELAY_VALUE { -1000 };
42 constexpr bool BOOL_DEFAULT { true };
43 const std::string PATH { "/data/service/el1/public/multimodalinput/" };
44 const std::string SHORT_KEY_FILE_NAME { "Settings.xml" };
45 const std::string MOUSE_FILE_NAME { "mouse_settings.xml" };
46 const std::string KEYBOARD_FILE_NAME { "keyboard_settings.xml" };
47 const std::string TOUCHPAD_FILE_NAME { "touchpad_settings.xml" };
48 } // namespace
49
50 std::shared_ptr<IPreferenceManager> IPreferenceManager::instance_;
51 std::mutex IPreferenceManager::mutex_;
52
GetInstance()53 std::shared_ptr<IPreferenceManager> IPreferenceManager::GetInstance()
54 {
55 if (instance_ == nullptr) {
56 std::lock_guard<std::mutex> lock(mutex_);
57 if (instance_ == nullptr) {
58 instance_ = std::make_shared<MultiModalInputPreferencesManager>();
59 }
60 }
61 return instance_;
62 }
63
InitPreferences()64 int32_t MultiModalInputPreferencesManager::InitPreferences()
65 {
66 CALL_DEBUG_ENTER;
67 int32_t ret = GetPreferencesSettings();
68 if (ret != RET_OK) {
69 MMI_HILOGE("Get multimodal input preferences settings failed");
70 return RET_ERR;
71 }
72 ret = InitPreferencesMap();
73 if (ret != RET_OK) {
74 MMI_HILOGE("Init multimodal input preferences map failed");
75 return RET_ERR;
76 }
77 return RET_OK;
78 }
79
GetPreferencesSettings()80 int32_t MultiModalInputPreferencesManager::GetPreferencesSettings()
81 {
82 int32_t errCode = RET_OK;
83 std::shared_ptr<NativePreferences::Preferences> mousePref =
84 NativePreferences::PreferencesHelper::GetPreferences(PATH + MOUSE_FILE_NAME, errCode);
85 CHKPR(mousePref, errno);
86 std::shared_ptr<NativePreferences::Preferences> keyboardPref =
87 NativePreferences::PreferencesHelper::GetPreferences(PATH + KEYBOARD_FILE_NAME, errCode);
88 CHKPR(keyboardPref, errno);
89 std::shared_ptr<NativePreferences::Preferences> touchpadPref =
90 NativePreferences::PreferencesHelper::GetPreferences(PATH + TOUCHPAD_FILE_NAME, errCode);
91 CHKPR(touchpadPref, errno);
92 pointerSize_ = mousePref->GetInt(strPointerSize_, POINTER_SIZE);
93 pointerSpeed_ = mousePref->GetInt(strPointerSpeed_, POINTER_SPEED);
94 pointerColor_ = mousePref->GetInt(strPointerColor_, POINTER_COLOR);
95 pointerStyle_ = mousePref->GetInt(strPointerStyle_, POINTER_STYLE);
96 mouseScrollRows_ = mousePref->GetInt(strMouseScrollRows_, MOUSE_SCROLL_ROWS);
97 hoverScrollState_ = mousePref->GetBool(strHoverScrollState_, BOOL_DEFAULT);
98 mousePrimaryButton_ = mousePref->GetInt(strMousePrimaryButton_, PRIMARY_BUTTON);
99 touchpadTapSwitch_ = touchpadPref->GetBool(strTouchpadTapSwitch_, BOOL_DEFAULT);
100 keyboardRepeatRate_ = keyboardPref->GetInt(strKeyboardRepeatRate_, KEYBOARD_REPEATRATE);
101 keyboardRepeatDelay_ = keyboardPref->GetInt(strKeyboardRepeatDelay_, KEYBOARD_REPEATDELAY);
102 touchpadPinchSwitch_ = touchpadPref->GetBool(strTouchpadPinchSwitch_, BOOL_DEFAULT);
103 touchpadSwipeSwitch_ = touchpadPref->GetBool(strTouchpadSwipeSwitch_, BOOL_DEFAULT);
104 touchpadPointerSpeed_ = touchpadPref->GetInt(strTouchpadPointerSpeed_, TOUCHPAD_POINTER_SPEED);
105 touchpadScrollSwitch_ = touchpadPref->GetBool(strTouchpadScrollSwitch_, BOOL_DEFAULT);
106 touchpadRightClickType_ = touchpadPref->GetInt(strTouchpadRightClickType_, RIGHT_CLICK_TYPE);
107 touchpadScrollDirection_ = touchpadPref->GetBool(strTouchpadScrollDirection_, BOOL_DEFAULT);
108 #ifdef OHOS_BUILD_ENABLE_MAGICCURSOR
109 magicPointerSize_ = mousePref->GetInt(strMagicPointerSize_, MAGIC_POINTER_SIZE);
110 magicPointerColor_ = mousePref->GetInt(strMagicPointerColor_, POINTER_COLOR);
111 #endif // OHOS_BUILD_ENABLE_MAGICCURSOR
112 NativePreferences::PreferencesHelper::RemovePreferencesFromCache(PATH + MOUSE_FILE_NAME);
113 NativePreferences::PreferencesHelper::RemovePreferencesFromCache(PATH + KEYBOARD_FILE_NAME);
114 NativePreferences::PreferencesHelper::RemovePreferencesFromCache(PATH + TOUCHPAD_FILE_NAME);
115 return RET_OK;
116 }
117
InitPreferencesMap()118 int32_t MultiModalInputPreferencesManager::InitPreferencesMap()
119 {
120 preferencesMap_[strPointerSize_] = {MOUSE_FILE_NAME, pointerSize_};
121 preferencesMap_[strPointerSpeed_] = {MOUSE_FILE_NAME, pointerSpeed_};
122 preferencesMap_[strPointerColor_] = {MOUSE_FILE_NAME, pointerColor_};
123 preferencesMap_[strPointerStyle_] = {MOUSE_FILE_NAME, pointerStyle_};
124 preferencesMap_[strMouseScrollRows_] = {MOUSE_FILE_NAME, mouseScrollRows_};
125 preferencesMap_[strHoverScrollState_] = {MOUSE_FILE_NAME, static_cast<int32_t>(hoverScrollState_)};
126 preferencesMap_[strMousePrimaryButton_] = {MOUSE_FILE_NAME, mousePrimaryButton_};
127 preferencesMap_[strTouchpadTapSwitch_] = {TOUCHPAD_FILE_NAME, static_cast<int32_t>(touchpadTapSwitch_)};
128 preferencesMap_[strKeyboardRepeatRate_] = {KEYBOARD_FILE_NAME, keyboardRepeatRate_};
129 preferencesMap_[strKeyboardRepeatDelay_] = {KEYBOARD_FILE_NAME, keyboardRepeatDelay_};
130 preferencesMap_[strTouchpadPinchSwitch_] = {TOUCHPAD_FILE_NAME, static_cast<int32_t>(touchpadPinchSwitch_)};
131 preferencesMap_[strTouchpadSwipeSwitch_] = {TOUCHPAD_FILE_NAME, static_cast<int32_t>(touchpadSwipeSwitch_)};
132 preferencesMap_[strTouchpadPointerSpeed_] = {TOUCHPAD_FILE_NAME, touchpadPointerSpeed_};
133 preferencesMap_[strTouchpadScrollSwitch_] = {TOUCHPAD_FILE_NAME, static_cast<int32_t>(touchpadScrollSwitch_)};
134 preferencesMap_[strTouchpadRightClickType_] = {TOUCHPAD_FILE_NAME, touchpadRightClickType_};
135 preferencesMap_[strTouchpadScrollDirection_] = {TOUCHPAD_FILE_NAME, static_cast<int32_t>(touchpadScrollDirection_)};
136 #ifdef OHOS_BUILD_ENABLE_MAGICCURSOR
137 preferencesMap_[strMagicPointerSize_] = {MOUSE_FILE_NAME, magicPointerSize_};
138 preferencesMap_[strMagicPointerColor_] = {MOUSE_FILE_NAME, magicPointerColor_};
139 #endif // OHOS_BUILD_ENABLE_MAGICCURSOR
140 return RET_OK;
141 }
142
GetIntValue(const std::string & key,int32_t defaultValue)143 int32_t MultiModalInputPreferencesManager::GetIntValue(const std::string &key, int32_t defaultValue)
144 {
145 auto iter = preferencesMap_.find(key);
146 if (iter == preferencesMap_.end()) {
147 return defaultValue;
148 }
149 auto [fileName, value] = iter->second;
150 return value;
151 }
152
GetBoolValue(const std::string & key,bool defaultValue)153 bool MultiModalInputPreferencesManager::GetBoolValue(const std::string &key, bool defaultValue)
154 {
155 auto iter = preferencesMap_.find(key);
156 if (iter == preferencesMap_.end()) {
157 return defaultValue;
158 }
159 auto [fileName, value] = iter->second;
160 return static_cast<bool>(value);
161 }
162
SetIntValue(const std::string & key,const std::string & setFile,int32_t setValue)163 int32_t MultiModalInputPreferencesManager::SetIntValue(const std::string &key, const std::string &setFile,
164 int32_t setValue)
165 {
166 auto iter = preferencesMap_.find(key);
167 std::string filePath = "";
168 if (iter == preferencesMap_.end()) {
169 preferencesMap_[key] = {setFile, setValue};
170 filePath = PATH + setFile;
171 } else {
172 auto [fileName, value] = iter->second;
173 if (value == setValue) {
174 MMI_HILOGD("The set value is same");
175 return RET_OK;
176 }
177 filePath = PATH + fileName;
178 preferencesMap_[key].second = setValue;
179 }
180
181 int32_t errCode = RET_OK;
182 std::shared_ptr<NativePreferences::Preferences> pref =
183 NativePreferences::PreferencesHelper::GetPreferences(filePath, errCode);
184 CHKPR(pref, errno);
185 int32_t ret = pref->PutInt(key, setValue);
186 if (ret != RET_OK) {
187 MMI_HILOGE("Put value is failed, ret:%{public}d", ret);
188 return RET_ERR;
189 }
190 ret = pref->FlushSync();
191 if (ret != RET_OK) {
192 MMI_HILOGE("Flush sync is failed, ret:%{public}d", ret);
193 return RET_ERR;
194 }
195 NativePreferences::PreferencesHelper::RemovePreferencesFromCache(filePath);
196 return RET_OK;
197 }
198
SetBoolValue(const std::string & key,const std::string & setFile,bool setValue)199 int32_t MultiModalInputPreferencesManager::SetBoolValue(const std::string &key, const std::string &setFile,
200 bool setValue)
201 {
202 auto iter = preferencesMap_.find(key);
203 std::string filePath = "";
204 if (iter == preferencesMap_.end()) {
205 preferencesMap_[key] = {setFile, static_cast<int32_t>(setValue)};
206 filePath = PATH + setFile;
207 } else {
208 auto [fileName, value] = iter->second;
209 if (static_cast<bool>(value) == setValue) {
210 MMI_HILOGD("The set value is same");
211 return RET_OK;
212 }
213 filePath = PATH + fileName;
214 preferencesMap_[key].second = setValue;
215 }
216
217 int32_t errCode = RET_OK;
218 std::shared_ptr<NativePreferences::Preferences> pref =
219 NativePreferences::PreferencesHelper::GetPreferences(filePath, errCode);
220 CHKPR(pref, errno);
221 int32_t ret = pref->PutBool(key, setValue);
222 if (ret != RET_OK) {
223 MMI_HILOGE("Put value is failed, ret:%{public}d", ret);
224 return RET_ERR;
225 }
226 ret = pref->FlushSync();
227 if (ret != RET_OK) {
228 MMI_HILOGE("Flush sync is failed, ret:%{public}d", ret);
229 return RET_ERR;
230 }
231 NativePreferences::PreferencesHelper::RemovePreferencesFromCache(filePath);
232 return RET_OK;
233 }
234
GetShortKeyDuration(const std::string & key)235 int32_t MultiModalInputPreferencesManager::GetShortKeyDuration(const std::string &key)
236 {
237 int32_t errCode = RET_OK;
238 if (shortcutKeyMap_.empty() || shortcutKeyMap_.find(key) == shortcutKeyMap_.end()) {
239 std::shared_ptr<NativePreferences::Preferences> pref =
240 NativePreferences::PreferencesHelper::GetPreferences(PATH + SHORT_KEY_FILE_NAME, errCode);
241 CHKPR(pref, errno);
242 int32_t duration = pref->GetInt(key, ERROR_DELAY_VALUE);
243 NativePreferences::PreferencesHelper::RemovePreferencesFromCache(PATH + SHORT_KEY_FILE_NAME);
244 shortcutKeyMap_.emplace(key, duration);
245 return duration;
246 }
247 return shortcutKeyMap_[key];
248 }
249
SetShortKeyDuration(const std::string & key,int32_t setValue)250 int32_t MultiModalInputPreferencesManager::SetShortKeyDuration(const std::string &key, int32_t setValue)
251 {
252 auto iter = shortcutKeyMap_.find(key);
253 if (iter != shortcutKeyMap_.end() && iter->second == setValue) {
254 MMI_HILOGD("The set value is same");
255 return RET_OK;
256 }
257
258 shortcutKeyMap_[key] = setValue;
259 int32_t errCode = RET_OK;
260 std::shared_ptr<NativePreferences::Preferences> pref =
261 NativePreferences::PreferencesHelper::GetPreferences(PATH + SHORT_KEY_FILE_NAME, errCode);
262 CHKPR(pref, errno);
263 int32_t ret = pref->PutInt(key, setValue);
264 if (ret != RET_OK) {
265 MMI_HILOGE("Put value is failed, ret:%{public}d", ret);
266 return RET_ERR;
267 }
268 ret = pref->FlushSync();
269 if (ret != RET_OK) {
270 MMI_HILOGE("Flush sync is failed, ret:%{public}d", ret);
271 return RET_ERR;
272 }
273 NativePreferences::PreferencesHelper::RemovePreferencesFromCache(PATH + SHORT_KEY_FILE_NAME);
274 return RET_OK;
275 }
276 } // namespace MMI
277 } // namespace OHOS
278