1 /*
2 * Copyright (C) 2025 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 "settings_monitor.h"
17 #include "enhancement_manager.h"
18 #include "medialibrary_type_const.h"
19 #include "media_log.h"
20
21 namespace OHOS {
22 namespace Media {
CreateNonBlockDataShareHelper()23 std::shared_ptr<DataShare::DataShareHelper> SettingsMonitor::CreateNonBlockDataShareHelper()
24 {
25 sptr<ISystemAbilityManager> saManager = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
26 if (saManager == nullptr) {
27 MEDIA_ERR_LOG("CreateNonBlockDataShareHelper: GetSystemAbilityManager failed.");
28 return nullptr;
29 }
30 sptr<IRemoteObject> remoteObj = saManager->GetSystemAbility(PHOTOS_STORAGE_MANAGER_ID);
31 if (remoteObj == nullptr) {
32 MEDIA_ERR_LOG("CreateNonBlockDataShareHelper: GetSystemAbility Service Failed.");
33 return nullptr;
34 }
35 auto [ret, helper] = DataShare::DataShareHelper::Create(remoteObj, SETTINGS_DATASHARE_URI, SETTINGS_DATA_EXT_URI);
36 if (ret == DataShare::E_OK) {
37 return helper;
38 } else if (ret == DataShare::E_DATA_SHARE_NOT_READY) {
39 MEDIA_ERR_LOG("CreateNonBlockDataShareHelper: datashare not ready.");
40 return nullptr;
41 } else {
42 MEDIA_ERR_LOG("CreateNonBlockDataShareHelper: create datashare fail, ret = %{public}d.", ret);
43 return nullptr;
44 }
45 }
46
CreateDataShareHelper()47 std::shared_ptr<DataShare::DataShareHelper> SettingsMonitor::CreateDataShareHelper()
48 {
49 sptr<ISystemAbilityManager> saManager = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
50 if (saManager == nullptr) {
51 MEDIA_ERR_LOG("CreateDataShareHelper, GetSystemAbilityManager failed.");
52 return nullptr;
53 }
54 sptr<IRemoteObject> remoteObj = saManager->GetSystemAbility(PHOTOS_STORAGE_MANAGER_ID);
55
56 if (remoteObj == nullptr) {
57 MEDIA_ERR_LOG("CreateDataShareHelper, GetSystemAbility Service Failed.");
58 return nullptr;
59 }
60 return DataShare::DataShareHelper::Creator(remoteObj, SETTINGS_DATASHARE_URI, SETTINGS_DATA_EXT_URI);
61 }
62
RegisterSettingsObserver(const Uri & uri,const sptr<AAFwk::IDataAbilityObserver> & dataObserver)63 void SettingsMonitor::RegisterSettingsObserver(const Uri &uri,
64 const sptr<AAFwk::IDataAbilityObserver> &dataObserver)
65 {
66 auto settingHelper = CreateDataShareHelper();
67 if (settingHelper == nullptr) {
68 MEDIA_ERR_LOG("RegisterSettingsObserver, settingHelper is nullptr");
69 return;
70 }
71 settingHelper->RegisterObserver(uri, dataObserver);
72 settingHelper->Release();
73 return;
74 }
75
UnregisterSettingsObserver(const Uri & uri,const sptr<AAFwk::IDataAbilityObserver> & dataObserver)76 void SettingsMonitor::UnregisterSettingsObserver(const Uri &uri,
77 const sptr<AAFwk::IDataAbilityObserver> &dataObserver)
78 {
79 auto settingHelper = CreateDataShareHelper();
80 if (settingHelper == nullptr) {
81 MEDIA_ERR_LOG("UnregisterSettingsObserver, settingHelper is nullptr");
82 return;
83 }
84 settingHelper->UnregisterObserver(uri, dataObserver);
85 settingHelper->Release();
86 return;
87 }
88
Insert(Uri uri,const std::string & key,const std::string & value)89 int32_t SettingsMonitor::Insert(Uri uri, const std::string &key, const std::string &value)
90 {
91 std::shared_ptr<DataShare::DataShareHelper> settingHelper = CreateDataShareHelper();
92 if (settingHelper == nullptr) {
93 MEDIA_ERR_LOG("settingHelper is null");
94 return 0;
95 }
96 DataShare::DataShareValuesBucket valuesBucket;
97 DataShare::DataShareValueObject keyObj(key);
98 DataShare::DataShareValueObject valueObj(value);
99 valuesBucket.Put(SETTING_KEY, keyObj);
100 valuesBucket.Put(SETTING_VALUE, valueObj);
101 int32_t result = settingHelper->Insert(uri, valuesBucket);
102 if (result == -1) {
103 settingHelper->Release();
104 return 0;
105 }
106 MEDIA_ERR_LOG("insert success");
107 settingHelper->NotifyChange(uri);
108 settingHelper->Release();
109 return 0;
110 }
111
Query(Uri uri,const std::string & key,std::string & value)112 int32_t SettingsMonitor::Query(Uri uri, const std::string &key, std::string &value)
113 {
114 std::shared_ptr<DataShare::DataShareHelper> settingHelper = CreateNonBlockDataShareHelper();
115 if (settingHelper == nullptr) {
116 MEDIA_ERR_LOG("settingHelper is null");
117 return 0;
118 }
119
120 std::vector<std::string> columns;
121 DataShare::DataSharePredicates predicates;
122 predicates.EqualTo(SETTING_KEY, key);
123 auto result = settingHelper->Query(uri, predicates, columns);
124 if (result == nullptr) {
125 MEDIA_ERR_LOG("SettingsMonitor: query error, result is null");
126 settingHelper->Release();
127 return 0;
128 }
129
130 if (result->GoToFirstRow() != DataShare::E_OK) {
131 MEDIA_ERR_LOG("SettingsMonitor: query error, go to first row error");
132 result->Close();
133 settingHelper->Release();
134 return 0;
135 }
136
137 int columnIndex = 0;
138 result->GetColumnIndex(SETTING_VALUE, columnIndex);
139 result->GetString(columnIndex, value);
140 result->Close();
141 settingHelper->Release();
142 MEDIA_ERR_LOG("SettingsMonitor: query success");
143 return 0;
144 }
145
QueryPhotosAutoOption()146 std::string SettingsMonitor::QueryPhotosAutoOption()
147 {
148 Uri uri(SETTINGS_DATASHARE_AUTO_OPTION_URI);
149 std::string key = "persist.photos.ce.auto.option";
150 std::string value = "";
151 SettingsMonitor::Query(uri, key, value);
152 MEDIA_INFO_LOG("QueryPhotosAutoOption value: %{public}s", value.c_str());
153 return value;
154 }
155
QueryPhotosWaterMark()156 bool SettingsMonitor::QueryPhotosWaterMark()
157 {
158 Uri uri(SETTINGS_DATASHARE_WATER_MARK_URI);
159 std::string key = "persist.photos.ce.watermark.enable";
160 std::string value = "";
161 SettingsMonitor::Query(uri, key, value);
162 MEDIA_INFO_LOG("QueryPhotosWaterMark value: %{public}s", value.c_str());
163 return value == WATER_MARK_ENABLED;
164 }
165
OnChange()166 void PhotosAutoOptionObserver::OnChange()
167 {
168 MEDIA_INFO_LOG("PhotosAutoOptionObserver OnChange");
169 EnhancementManager::GetInstance().HandlePhotosAutoOptionChange(SettingsMonitor::QueryPhotosAutoOption());
170 }
171
OnChange()172 void PhotosWaterMarkObserver::OnChange()
173 {
174 MEDIA_INFO_LOG("PhotosWaterMarkObserver OnChange");
175 EnhancementManager::GetInstance().HandlePhotosWaterMarkChange(SettingsMonitor::QueryPhotosWaterMark());
176 }
177
178 } // namespace Media
179 } // namespace OHOS
180