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