• 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 
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