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