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