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