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 #include "param_wrapper.h"
20 #include "parameters.h"
21 #include "product_name_definition.h"
22
23 #undef MMI_LOG_DOMAIN
24 #define MMI_LOG_DOMAIN MMI_LOG_SERVER
25 #undef MMI_LOG_TAG
26 #define MMI_LOG_TAG "MultiModalInputPreferencesManager"
27
28 namespace OHOS {
29 namespace MMI {
30 namespace {
31 constexpr int32_t KEYBOARD_REPEATRATE { 50 };
32 constexpr int32_t KEYBOARD_REPEATDELAY { 500 };
33 constexpr int32_t MOUSE_SCROLL_ROWS { 3 };
34 constexpr int32_t PRIMARY_BUTTON { 0 };
35 constexpr int32_t POINTER_SPEED { 10 };
36 constexpr int32_t TOUCHPAD_POINTER_SPEED { 6 };
37 constexpr int32_t TOUCHPAD_SCROLL_ROWS { 3 };
38 constexpr int32_t POINTER_COLOR { -1 };
39 constexpr int32_t POINTER_SIZE_DEFAULT { 1 };
40 constexpr int32_t POINTER_SIZE_FOLD_PC { 2 };
41
GetPointSize()42 int32_t GetPointSize()
43 {
44 const std::string PRODUCT_TYPE = OHOS::system::GetParameter("const.build.product", "HYM");
45 if (PRODUCT_TYPE == DEVICE_TYPE_FOLD_PC) {
46 return POINTER_SIZE_FOLD_PC;
47 }
48 return POINTER_SIZE_DEFAULT;
49 }
50
51 #ifdef OHOS_BUILD_ENABLE_MAGICCURSOR
52 constexpr int32_t MAGIC_POINTER_SIZE { 1 };
53 #endif // OHOS_BUILD_ENABLE_MAGICCURSOR
54 constexpr int32_t POINTER_STYLE { 0 };
55 constexpr int32_t ERROR_DELAY_VALUE { -1000 };
56 constexpr int32_t RIGHT_MENU_TYPE_INDEX_V1 { 0 };
57 constexpr int32_t RIGHT_MENU_TYPE_INDEX_V2 { 1 };
58 constexpr bool BOOL_DEFAULT { true };
59 const std::string PATH { "/data/service/el1/public/multimodalinput/" };
60 const std::string SHORT_KEY_FILE_NAME { "Settings.xml" };
61 const std::string MOUSE_FILE_NAME { "mouse_settings.xml" };
62 const std::string KEYBOARD_FILE_NAME { "keyboard_settings.xml" };
63 const std::string TOUCHPAD_FILE_NAME { "touchpad_settings.xml" };
64 const std::string DEFAULT_MOUSE_SPEED_NAME { "const.multimodalinput.default_mouse_speed" };
65 } // namespace
66
67 std::shared_ptr<IPreferenceManager> IPreferenceManager::instance_;
68 std::mutex IPreferenceManager::mutex_;
69
GetInstance()70 std::shared_ptr<IPreferenceManager> IPreferenceManager::GetInstance()
71 {
72 if (instance_ == nullptr) {
73 std::lock_guard<std::mutex> lock(mutex_);
74 if (instance_ == nullptr) {
75 instance_ = std::make_shared<MultiModalInputPreferencesManager>();
76 }
77 }
78 return instance_;
79 }
80
SetInstanceForTesting(std::shared_ptr<IPreferenceManager> instance)81 void IPreferenceManager::SetInstanceForTesting(std::shared_ptr<IPreferenceManager> instance)
82 {
83 instance_ = instance;
84 }
85
InitPreferences()86 int32_t MultiModalInputPreferencesManager::InitPreferences()
87 {
88 CALL_DEBUG_ENTER;
89 int32_t ret = GetPreferencesSettings();
90 if (ret != RET_OK) {
91 MMI_HILOGE("Get multimodal input preferences settings failed");
92 return RET_ERR;
93 }
94 ret = InitPreferencesMap();
95 if (ret != RET_OK) {
96 MMI_HILOGE("Init multimodal input preferences map failed");
97 return RET_ERR;
98 }
99 isInitPreference_.store(true);
100 return RET_OK;
101 }
102
IsInitPreference()103 bool MultiModalInputPreferencesManager::IsInitPreference()
104 {
105 return isInitPreference_.load();
106 }
107
GetRightClickTypeVal(std::shared_ptr<NativePreferences::Preferences> & touchpadPref)108 int32_t MultiModalInputPreferencesManager::GetRightClickTypeVal(
109 std::shared_ptr<NativePreferences::Preferences> &touchpadPref)
110 {
111 int32_t clickType = 0;
112 std::vector<uint8_t> clickTypeVect = {TOUCHPAD_RIGHT_BUTTON, 0}; // index0: v1.0, index1: v2.0
113 clickTypeVect[RIGHT_MENU_TYPE_INDEX_V2] = mousePrimaryButton_ == PRIMARY_BUTTON ?
114 TOUCHPAD_TWO_FINGER_TAP_OR_RIGHT_BUTTON : TOUCHPAD_TWO_FINGER_TAP_OR_LEFT_BUTTON;
115
116 clickType = touchpadPref->GetInt(strTouchpadRightClickType_, 0);
117 if (clickType != 0) {
118 clickTypeVect[RIGHT_MENU_TYPE_INDEX_V1] = clickType;
119 touchpadPref->Delete(strTouchpadRightClickType_);
120 touchpadPref->Put(strTouchpadRightClickType_, clickTypeVect);
121 touchpadPref->FlushSync();
122 } else {
123 clickTypeVect = static_cast<std::vector<uint8_t>>(touchpadPref->Get(strTouchpadRightClickType_, clickTypeVect));
124 }
125
126 MMI_HILOGI("clickType = %{public}d, %{public}d.", clickTypeVect[RIGHT_MENU_TYPE_INDEX_V1],
127 clickTypeVect[RIGHT_MENU_TYPE_INDEX_V2]);
128 return clickTypeVect[RIGHT_MENU_TYPE_INDEX_V2];
129 }
130
GetPreferencesSettings()131 int32_t MultiModalInputPreferencesManager::GetPreferencesSettings()
132 {
133 int32_t errCode = RET_OK;
134 std::shared_ptr<NativePreferences::Preferences> mousePref =
135 NativePreferences::PreferencesHelper::GetPreferences(PATH + MOUSE_FILE_NAME, errCode);
136 CHKPR(mousePref, errno);
137 std::shared_ptr<NativePreferences::Preferences> keyboardPref =
138 NativePreferences::PreferencesHelper::GetPreferences(PATH + KEYBOARD_FILE_NAME, errCode);
139 CHKPR(keyboardPref, errno);
140 std::shared_ptr<NativePreferences::Preferences> touchpadPref =
141 NativePreferences::PreferencesHelper::GetPreferences(PATH + TOUCHPAD_FILE_NAME, errCode);
142 CHKPR(touchpadPref, errno);
143 pointerSize_ = mousePref->GetInt(strPointerSize_, GetPointSize());
144 pointerSpeed_ = mousePref->GetInt(strPointerSpeed_,
145 OHOS::system::GetIntParameter(DEFAULT_MOUSE_SPEED_NAME, POINTER_SPEED));
146 pointerColor_ = mousePref->GetInt(strPointerColor_, POINTER_COLOR);
147 pointerStyle_ = mousePref->GetInt(strPointerStyle_, POINTER_STYLE);
148 mouseScrollRows_ = mousePref->GetInt(strMouseScrollRows_, MOUSE_SCROLL_ROWS);
149 hoverScrollState_ = mousePref->GetBool(strHoverScrollState_, BOOL_DEFAULT);
150 mousePrimaryButton_ = mousePref->GetInt(strMousePrimaryButton_, PRIMARY_BUTTON);
151 touchpadTapSwitch_ = touchpadPref->GetBool(strTouchpadTapSwitch_, BOOL_DEFAULT);
152 keyboardRepeatRate_ = keyboardPref->GetInt(strKeyboardRepeatRate_, KEYBOARD_REPEATRATE);
153 keyboardRepeatDelay_ = keyboardPref->GetInt(strKeyboardRepeatDelay_, KEYBOARD_REPEATDELAY);
154 touchpadPinchSwitch_ = touchpadPref->GetBool(strTouchpadPinchSwitch_, BOOL_DEFAULT);
155 touchpadSwipeSwitch_ = touchpadPref->GetBool(strTouchpadSwipeSwitch_, BOOL_DEFAULT);
156 touchpadPointerSpeed_ = touchpadPref->GetInt(strTouchpadPointerSpeed_, TOUCHPAD_POINTER_SPEED);
157 touchpadScrollSwitch_ = touchpadPref->GetBool(strTouchpadScrollSwitch_, BOOL_DEFAULT);
158 touchpadRightClickType_ = GetRightClickTypeVal(touchpadPref);
159 touchpadScrollDirection_ = touchpadPref->GetBool(strTouchpadScrollDirection_, BOOL_DEFAULT);
160 touchpadThreeFingerTapSwitch_ = touchpadPref->GetBool(strTouchpadThreeFingerTapSwitch_, BOOL_DEFAULT);
161 touchpadScrollRows_ = touchpadPref->GetInt(strTouchpadScrollRows_, TOUCHPAD_SCROLL_ROWS);
162 touchpadDoubleTapAndDrag_ = touchpadPref->GetBool(strTouchpadDoubleTapAndDrag_, BOOL_DEFAULT);
163 #ifdef OHOS_BUILD_ENABLE_MAGICCURSOR
164 magicPointerSize_ = mousePref->GetInt(strMagicPointerSize_, MAGIC_POINTER_SIZE);
165 magicPointerColor_ = mousePref->GetInt(strMagicPointerColor_, POINTER_COLOR);
166 #endif // OHOS_BUILD_ENABLE_MAGICCURSOR
167 #ifdef OHOS_BUILD_ENABLE_MOVE_EVENT_FILTERS
168 moveEventFilterFlag_ = mousePref->GetBool(strMoveEventFilterFlag_, BOOL_DEFAULT);
169 #endif // OHOS_BUILD_ENABLE_MOVE_EVENT_FILTERS
170 NativePreferences::PreferencesHelper::RemovePreferencesFromCache(PATH + MOUSE_FILE_NAME);
171 NativePreferences::PreferencesHelper::RemovePreferencesFromCache(PATH + KEYBOARD_FILE_NAME);
172 NativePreferences::PreferencesHelper::RemovePreferencesFromCache(PATH + TOUCHPAD_FILE_NAME);
173 return RET_OK;
174 }
175
InitPreferencesMap()176 int32_t MultiModalInputPreferencesManager::InitPreferencesMap()
177 {
178 preferencesMap_[strPointerSize_] = {MOUSE_FILE_NAME, pointerSize_};
179 preferencesMap_[strPointerSpeed_] = {MOUSE_FILE_NAME, pointerSpeed_};
180 preferencesMap_[strPointerColor_] = {MOUSE_FILE_NAME, pointerColor_};
181 preferencesMap_[strPointerStyle_] = {MOUSE_FILE_NAME, pointerStyle_};
182 preferencesMap_[strMouseScrollRows_] = {MOUSE_FILE_NAME, mouseScrollRows_};
183 preferencesMap_[strHoverScrollState_] = {MOUSE_FILE_NAME, static_cast<int32_t>(hoverScrollState_)};
184 preferencesMap_[strMousePrimaryButton_] = {MOUSE_FILE_NAME, mousePrimaryButton_};
185 preferencesMap_[strTouchpadTapSwitch_] = {TOUCHPAD_FILE_NAME, static_cast<int32_t>(touchpadTapSwitch_)};
186 preferencesMap_[strKeyboardRepeatRate_] = {KEYBOARD_FILE_NAME, keyboardRepeatRate_};
187 preferencesMap_[strKeyboardRepeatDelay_] = {KEYBOARD_FILE_NAME, keyboardRepeatDelay_};
188 preferencesMap_[strTouchpadPinchSwitch_] = {TOUCHPAD_FILE_NAME, static_cast<int32_t>(touchpadPinchSwitch_)};
189 preferencesMap_[strTouchpadSwipeSwitch_] = {TOUCHPAD_FILE_NAME, static_cast<int32_t>(touchpadSwipeSwitch_)};
190 preferencesMap_[strTouchpadPointerSpeed_] = {TOUCHPAD_FILE_NAME, touchpadPointerSpeed_};
191 preferencesMap_[strTouchpadScrollSwitch_] = {TOUCHPAD_FILE_NAME, static_cast<int32_t>(touchpadScrollSwitch_)};
192 preferencesMap_[strTouchpadRightClickType_] = {TOUCHPAD_FILE_NAME, touchpadRightClickType_};
193 preferencesMap_[strTouchpadScrollDirection_] = {TOUCHPAD_FILE_NAME, static_cast<int32_t>(touchpadScrollDirection_)};
194 preferencesMap_[strTouchpadThreeFingerTapSwitch_] = {TOUCHPAD_FILE_NAME,
195 static_cast<int32_t>(touchpadThreeFingerTapSwitch_)};
196 preferencesMap_[strTouchpadScrollRows_] = {TOUCHPAD_FILE_NAME, touchpadScrollRows_};
197 preferencesMap_[strTouchpadDoubleTapAndDrag_] = {TOUCHPAD_FILE_NAME,
198 static_cast<int32_t>(touchpadDoubleTapAndDrag_)};
199 #ifdef OHOS_BUILD_ENABLE_MAGICCURSOR
200 preferencesMap_[strMagicPointerSize_] = {MOUSE_FILE_NAME, magicPointerSize_};
201 preferencesMap_[strMagicPointerColor_] = {MOUSE_FILE_NAME, magicPointerColor_};
202 #endif // OHOS_BUILD_ENABLE_MAGICCURSOR
203 #ifdef OHOS_BUILD_ENABLE_MOVE_EVENT_FILTERS
204 preferencesMap_[strMoveEventFilterFlag_] = {MOUSE_FILE_NAME, static_cast<int32_t>(moveEventFilterFlag_)};
205 #endif // OHOS_BUILD_ENABLE_MOVE_EVENT_FILTERS
206 return RET_OK;
207 }
208
GetPreValue(const std::string & key,NativePreferences::PreferencesValue defaultValue)209 NativePreferences::PreferencesValue MultiModalInputPreferencesManager::GetPreValue(const std::string &key,
210 NativePreferences::PreferencesValue defaultValue)
211 {
212 int32_t errCode = RET_OK;
213 auto iter = preferencesMap_.find(key);
214 if (iter == preferencesMap_.end()) {
215 MMI_HILOGI("do not find preferences value, return defaultValue.");
216 return defaultValue;
217 }
218 std::string filePath = "";
219 auto [fileName, value] = iter->second;
220 filePath = PATH + fileName;
221 std::shared_ptr<NativePreferences::Preferences> pref =
222 NativePreferences::PreferencesHelper::GetPreferences(filePath, errCode);
223 CHKPR(pref, errno);
224 NativePreferences::PreferencesValue ret = pref->Get(key, defaultValue);
225 NativePreferences::PreferencesHelper::RemovePreferencesFromCache(filePath);
226 return ret;
227 }
228
GetIntValue(const std::string & key,int32_t defaultValue)229 int32_t MultiModalInputPreferencesManager::GetIntValue(const std::string &key, int32_t defaultValue)
230 {
231 auto iter = preferencesMap_.find(key);
232 if (iter == preferencesMap_.end()) {
233 return defaultValue;
234 }
235 auto [fileName, value] = iter->second;
236 return value;
237 }
238
GetBoolValue(const std::string & key,bool defaultValue)239 bool MultiModalInputPreferencesManager::GetBoolValue(const std::string &key, bool defaultValue)
240 {
241 auto iter = preferencesMap_.find(key);
242 if (iter == preferencesMap_.end()) {
243 return defaultValue;
244 }
245 auto [fileName, value] = iter->second;
246 return static_cast<bool>(value);
247 }
248
UpdatePreferencesMap(const std::string & key,const std::string & setFile,int32_t setValue,std::string & filePath)249 void MultiModalInputPreferencesManager::UpdatePreferencesMap(const std::string &key, const std::string &setFile,
250 int32_t setValue, std::string &filePath)
251 {
252 auto iter = preferencesMap_.find(key);
253 if (iter == preferencesMap_.end()) {
254 preferencesMap_[key] = {setFile, setValue};
255 filePath = PATH + setFile;
256 } else {
257 auto [fileName, value] = iter->second;
258 filePath = PATH + fileName;
259 preferencesMap_[key].second = setValue;
260 }
261 }
262
SetIntValue(const std::string & key,const std::string & setFile,int32_t setValue)263 int32_t MultiModalInputPreferencesManager::SetIntValue(const std::string &key, const std::string &setFile,
264 int32_t setValue)
265 {
266 auto iter = preferencesMap_.find(key);
267 std::string filePath = "";
268 if (iter == preferencesMap_.end()) {
269 preferencesMap_[key] = {setFile, setValue};
270 filePath = PATH + setFile;
271 } else {
272 auto [fileName, value] = iter->second;
273 if (value == setValue) {
274 MMI_HILOGD("The set value is same");
275 return RET_OK;
276 }
277 filePath = PATH + fileName;
278 preferencesMap_[key].second = setValue;
279 }
280
281 int32_t errCode = RET_OK;
282 std::shared_ptr<NativePreferences::Preferences> pref =
283 NativePreferences::PreferencesHelper::GetPreferences(filePath, errCode);
284 CHKPR(pref, errno);
285 int32_t ret = pref->PutInt(key, setValue);
286 if (ret != RET_OK) {
287 MMI_HILOGE("Put value is failed, ret:%{public}d", ret);
288 return RET_ERR;
289 }
290 ret = pref->FlushSync();
291 if (ret != RET_OK) {
292 MMI_HILOGE("Flush sync is failed, ret:%{public}d", ret);
293 return RET_ERR;
294 }
295 NativePreferences::PreferencesHelper::RemovePreferencesFromCache(filePath);
296 return RET_OK;
297 }
298
SetBoolValue(const std::string & key,const std::string & setFile,bool setValue)299 int32_t MultiModalInputPreferencesManager::SetBoolValue(const std::string &key, const std::string &setFile,
300 bool setValue)
301 {
302 auto iter = preferencesMap_.find(key);
303 std::string filePath = "";
304 if (iter == preferencesMap_.end()) {
305 preferencesMap_[key] = {setFile, static_cast<int32_t>(setValue)};
306 filePath = PATH + setFile;
307 } else {
308 auto [fileName, value] = iter->second;
309 if (static_cast<bool>(value) == setValue) {
310 MMI_HILOGD("The set value is same");
311 return RET_OK;
312 }
313 filePath = PATH + fileName;
314 preferencesMap_[key].second = setValue;
315 }
316
317 int32_t errCode = RET_OK;
318 std::shared_ptr<NativePreferences::Preferences> pref =
319 NativePreferences::PreferencesHelper::GetPreferences(filePath, errCode);
320 CHKPR(pref, errno);
321 int32_t ret = pref->PutBool(key, setValue);
322 if (ret != RET_OK) {
323 MMI_HILOGE("Put value is failed, ret:%{public}d", ret);
324 return RET_ERR;
325 }
326 ret = pref->FlushSync();
327 if (ret != RET_OK) {
328 MMI_HILOGE("Flush sync is failed, ret:%{public}d", ret);
329 return RET_ERR;
330 }
331 NativePreferences::PreferencesHelper::RemovePreferencesFromCache(filePath);
332 return RET_OK;
333 }
334
SetPreValue(const std::string & key,const std::string & filePath,const NativePreferences::PreferencesValue & setValue)335 int32_t MultiModalInputPreferencesManager::SetPreValue(const std::string &key, const std::string &filePath,
336 const NativePreferences::PreferencesValue &setValue)
337 {
338 int32_t errCode = RET_OK;
339 std::shared_ptr<NativePreferences::Preferences> pref =
340 NativePreferences::PreferencesHelper::GetPreferences(filePath, errCode);
341 CHKPR(pref, errno);
342 int32_t ret = pref->Put(key, setValue);
343 if (ret != RET_OK) {
344 MMI_HILOGE("Put value is failed, ret:%{public}d", ret);
345 return RET_ERR;
346 }
347 ret = pref->FlushSync();
348 if (ret != RET_OK) {
349 MMI_HILOGE("Flush sync is failed, ret:%{public}d", ret);
350 return RET_ERR;
351 }
352 NativePreferences::PreferencesHelper::RemovePreferencesFromCache(filePath);
353 return RET_OK;
354 }
355
GetShortKeyDuration(const std::string & key)356 int32_t MultiModalInputPreferencesManager::GetShortKeyDuration(const std::string &key)
357 {
358 int32_t errCode = RET_OK;
359 if (shortcutKeyMap_.empty() || shortcutKeyMap_.find(key) == shortcutKeyMap_.end()) {
360 std::shared_ptr<NativePreferences::Preferences> pref =
361 NativePreferences::PreferencesHelper::GetPreferences(PATH + SHORT_KEY_FILE_NAME, errCode);
362 CHKPR(pref, errno);
363 int32_t duration = pref->GetInt(key, ERROR_DELAY_VALUE);
364 NativePreferences::PreferencesHelper::RemovePreferencesFromCache(PATH + SHORT_KEY_FILE_NAME);
365 shortcutKeyMap_.emplace(key, duration);
366 return duration;
367 }
368 return shortcutKeyMap_[key];
369 }
370
SetShortKeyDuration(const std::string & key,int32_t setValue)371 int32_t MultiModalInputPreferencesManager::SetShortKeyDuration(const std::string &key, int32_t setValue)
372 {
373 auto iter = shortcutKeyMap_.find(key);
374 if (iter != shortcutKeyMap_.end() && iter->second == setValue) {
375 MMI_HILOGD("The set value is same");
376 return RET_OK;
377 }
378
379 shortcutKeyMap_[key] = setValue;
380 int32_t errCode = RET_OK;
381 std::shared_ptr<NativePreferences::Preferences> pref =
382 NativePreferences::PreferencesHelper::GetPreferences(PATH + SHORT_KEY_FILE_NAME, errCode);
383 CHKPR(pref, errno);
384 int32_t ret = pref->PutInt(key, setValue);
385 if (ret != RET_OK) {
386 MMI_HILOGE("Put value is failed, ret:%{public}d", ret);
387 return RET_ERR;
388 }
389 ret = pref->FlushSync();
390 if (ret != RET_OK) {
391 MMI_HILOGE("Flush sync is failed, ret:%{public}d", ret);
392 return RET_ERR;
393 }
394 NativePreferences::PreferencesHelper::RemovePreferencesFromCache(PATH + SHORT_KEY_FILE_NAME);
395 return RET_OK;
396 }
397 } // namespace MMI
398 } // namespace OHOS