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 "file_asset_info_ani.h"
17
18 #include "ani_class_name.h"
19 #include "medialibrary_ani_log.h"
20 #include "medialibrary_ani_utils.h"
21 #include "media_library_enum_ani.h"
22 #include "media_column.h"
23
24 namespace OHOS {
25 namespace Media {
ToFileAssetInfoObject(ani_env * env,std::unique_ptr<FileAsset> fileAsset)26 ani_object FileAssetInfo::ToFileAssetInfoObject(ani_env *env, std::unique_ptr<FileAsset> fileAsset)
27 {
28 ani_class cls;
29 if (ANI_OK != env->FindClass(ANI_CLASS_FILE_ASSET_INFO.c_str(), &cls)) {
30 ANI_ERR_LOG("Failed to find class: %{public}s", ANI_CLASS_FILE_ASSET_INFO.c_str());
31 return nullptr;
32 }
33
34 ani_method ctor;
35 if (ANI_OK != env->Class_FindMethod(cls, "<ctor>", nullptr, &ctor)) {
36 ANI_ERR_LOG("Failed to find method: %{public}s", "ctor");
37 return nullptr;
38 }
39
40 ani_object fileAssetObj = nullptr;
41 if (ANI_OK != env->Object_New(cls, ctor, &fileAssetObj)) {
42 ANI_ERR_LOG("New FileAsset Fail");
43 return nullptr;
44 }
45 if (ANI_OK != BindFileAssetInfoAttributes(env, cls, fileAssetObj, std::move(fileAsset))) {
46 ANI_ERR_LOG("BindFileAssetInfoAttributes failed");
47 return nullptr;
48 }
49
50 return fileAssetObj;
51 }
52
BindFileAssetInfoAttributes(ani_env * env,ani_class cls,ani_object object,std::unique_ptr<FileAsset> fileAsset)53 ani_status FileAssetInfo::BindFileAssetInfoAttributes(ani_env *env, ani_class cls, ani_object object,
54 std::unique_ptr<FileAsset> fileAsset)
55 {
56 CHECK_STATUS_RET(SetFileId(env, cls, object, (double)fileAsset->GetId()), "SetFileId failed");
57 CHECK_STATUS_RET(SetUri(env, cls, object, fileAsset->GetUri()), "SetUri failed");
58 CHECK_STATUS_RET(SetMediaType(env, cls, object, fileAsset->GetMediaType()), "SetMediaType failed");
59 CHECK_STATUS_RET(SetDisplayName(env, cls, object, fileAsset->GetDisplayName()), "SetDisplayName failed");
60 CHECK_STATUS_RET(SetSize(env, cls, object, (double)fileAsset->GetSize()), "SetSize failed");
61 CHECK_STATUS_RET(SetDateAdded(env, cls, object, (double)fileAsset->GetDateAdded()), "SetDateAdded failed");
62 CHECK_STATUS_RET(SetDateModified(env, cls, object, (double)fileAsset->GetDateModified()), "SetDateModified failed");
63 CHECK_STATUS_RET(SetDuration(env, cls, object, (double)fileAsset->GetDuration()), "SetDuration failed");
64 CHECK_STATUS_RET(SetWidth(env, cls, object, (double)fileAsset->GetWidth()), "SetWidth failed");
65 CHECK_STATUS_RET(SetHeight(env, cls, object, (double)fileAsset->GetHeight()), "SetHeight failed");
66 CHECK_STATUS_RET(SetDateTaken(env, cls, object, (double)fileAsset->GetDateTaken()), "SetDateTaken failed");
67 CHECK_STATUS_RET(SetOrientation(env, cls, object, (double)fileAsset->GetOrientation()), "SetOrientation failed");
68 CHECK_STATUS_RET(SetIsFavorite(env, cls, object, fileAsset->IsFavorite()), "SetIsFavorite failed");
69 CHECK_STATUS_RET(SetTitle(env, cls, object, fileAsset->GetTitle()), "SetTitle failed");
70 CHECK_STATUS_RET(SetPosition(env, cls, object, (PhotoPositionType)fileAsset->GetPosition()), "SetPosition failed");
71 CHECK_STATUS_RET(SetDateTrashed(env, cls, object, (double)fileAsset->GetDateTrashed()), "SetDateTrashed failed");
72 CHECK_STATUS_RET(SetHidden(env, cls, object, fileAsset->IsHidden()), "SetHidden failed");
73 CHECK_STATUS_RET(SetUserComment(env, cls, object, fileAsset->GetUserComment()), "SetUserComment failed");
74 CHECK_STATUS_RET(SetCameraShotKey(env, cls, object, fileAsset->GetCameraShotKey()), "SetCameraShotKey failed");
75 CHECK_STATUS_RET(SetDateYear(env, cls, object, fileAsset->GetStrMember(PhotoColumn::PHOTO_DATE_YEAR)),
76 "SetDateYear failed");
77 CHECK_STATUS_RET(SetDateMonth(env, cls, object, fileAsset->GetStrMember(PhotoColumn::PHOTO_DATE_MONTH)),
78 "SetDateMonth failed");
79 CHECK_STATUS_RET(SetDateDay(env, cls, object, fileAsset->GetStrMember(PhotoColumn::PHOTO_DATE_DAY)),
80 "SetDateDay failed");
81 CHECK_STATUS_RET(SetPending(env, cls, object, fileAsset->GetTimePending()), "SetPending failed");
82 CHECK_STATUS_RET(SetDateAddedMs(env, cls, object, (double)fileAsset->GetDateAdded()), "SetDateAddedMs failed");
83 CHECK_STATUS_RET(SetDateModifiedMs(env, cls, object, (double)fileAsset->GetDateModified()),
84 "SetDateModifiedMs failed");
85 CHECK_STATUS_RET(SetDateTrashedMs(env, cls, object, (double)fileAsset->GetDateTrashed()),
86 "SetDateTrashedMs failed");
87 CHECK_STATUS_RET(SetSubtype(env, cls, object, (PhotoSubType)fileAsset->GetPhotoSubType()), "SetSubtype failed");
88
89 return ANI_OK;
90 }
91
SetFileId(ani_env * env,ani_class cls,ani_object object,double fileId)92 ani_status FileAssetInfo::SetFileId(ani_env *env, ani_class cls, ani_object object, double fileId)
93 {
94 ani_method fileIdSetter {};
95 CHECK_STATUS_RET(env->Class_FindMethod(cls, "<set>file_id", nullptr, &fileIdSetter), "No <set>file_id");
96 CHECK_STATUS_RET(env->Object_CallMethod_Void(object, fileIdSetter, fileId), "<set>file_id fail");
97 return ANI_OK;
98 }
99
SetUri(ani_env * env,ani_class cls,ani_object object,const std::string & uri)100 ani_status FileAssetInfo::SetUri(ani_env *env, ani_class cls, ani_object object, const std::string &uri)
101 {
102 ani_method uriSetter {};
103 CHECK_STATUS_RET(env->Class_FindMethod(cls, "<set>uri", nullptr, &uriSetter), "No <set>uri");
104 ani_string uriObj {};
105 CHECK_STATUS_RET(MediaLibraryAniUtils::ToAniString(env, uri, uriObj), "ToAniString uri fail");
106 CHECK_STATUS_RET(env->Object_CallMethod_Void(object, uriSetter, uriObj), "<set>uri fail");
107 return ANI_OK;
108 }
109
SetMediaType(ani_env * env,ani_class cls,ani_object object,MediaType mediaType)110 ani_status FileAssetInfo::SetMediaType(ani_env *env, ani_class cls, ani_object object, MediaType mediaType)
111 {
112 ani_method mediaTypeSetter {};
113 CHECK_STATUS_RET(env->Class_FindMethod(cls, "<set>media_type", nullptr, &mediaTypeSetter), "No <set>media_type");
114 ani_enum_item mediaTypeObj = 0;
115 CHECK_STATUS_RET(MediaLibraryEnumAni::ToAniEnum(env, mediaType, mediaTypeObj), "Get mediaType index fail");
116 CHECK_STATUS_RET(env->Object_CallMethod_Void(object, mediaTypeSetter, mediaTypeObj), "<set>media_type fail");
117 return ANI_OK;
118 }
119
SetDisplayName(ani_env * env,ani_class cls,ani_object object,const std::string & displayName)120 ani_status FileAssetInfo::SetDisplayName(ani_env *env, ani_class cls, ani_object object, const std::string &displayName)
121 {
122 ani_method displayNameSetter {};
123 CHECK_STATUS_RET(env->Class_FindMethod(cls, "<set>display_name", nullptr, &displayNameSetter),
124 "No <set>display_name");
125 ani_string displayNameObj {};
126 CHECK_STATUS_RET(MediaLibraryAniUtils::ToAniString(env, displayName, displayNameObj), "ToAniString fail");
127 CHECK_STATUS_RET(env->Object_CallMethod_Void(object, displayNameSetter, displayNameObj), "<set>displayName fail");
128 return ANI_OK;
129 }
130
SetSize(ani_env * env,ani_class cls,ani_object object,double size)131 ani_status FileAssetInfo::SetSize(ani_env *env, ani_class cls, ani_object object, double size)
132 {
133 ani_method doubleSetter {};
134 CHECK_STATUS_RET(env->Class_FindMethod(cls, "<set>size", nullptr, &doubleSetter), "No doubleSetter");
135 CHECK_STATUS_RET(env->Object_CallMethod_Void(object, doubleSetter, size), "doubleSetter fail");
136 return ANI_OK;
137 }
138
SetDateAdded(ani_env * env,ani_class cls,ani_object object,double dateAdded)139 ani_status FileAssetInfo::SetDateAdded(ani_env *env, ani_class cls, ani_object object, double dateAdded)
140 {
141 ani_method doubleSetter {};
142 CHECK_STATUS_RET(env->Class_FindMethod(cls, "<set>date_added", nullptr, &doubleSetter), "No doubleSetter");
143 CHECK_STATUS_RET(env->Object_CallMethod_Void(object, doubleSetter, dateAdded), "doubleSetter fail");
144 return ANI_OK;
145 }
146
SetDateModified(ani_env * env,ani_class cls,ani_object object,double dateModified)147 ani_status FileAssetInfo::SetDateModified(ani_env *env, ani_class cls, ani_object object, double dateModified)
148 {
149 ani_method doubleSetter {};
150 CHECK_STATUS_RET(env->Class_FindMethod(cls, "<set>date_modified", nullptr, &doubleSetter), "No doubleSetter");
151 CHECK_STATUS_RET(env->Object_CallMethod_Void(object, doubleSetter, dateModified), "doubleSetter fail");
152 return ANI_OK;
153 }
154
SetDuration(ani_env * env,ani_class cls,ani_object object,double duration)155 ani_status FileAssetInfo::SetDuration(ani_env *env, ani_class cls, ani_object object, double duration)
156 {
157 ani_method doubleSetter {};
158 CHECK_STATUS_RET(env->Class_FindMethod(cls, "<set>duration", nullptr, &doubleSetter), "No doubleSetter");
159 CHECK_STATUS_RET(env->Object_CallMethod_Void(object, doubleSetter, duration), "doubleSetter fail");
160 return ANI_OK;
161 }
162
SetWidth(ani_env * env,ani_class cls,ani_object object,double width)163 ani_status FileAssetInfo::SetWidth(ani_env *env, ani_class cls, ani_object object, double width)
164 {
165 ani_method doubleSetter {};
166 CHECK_STATUS_RET(env->Class_FindMethod(cls, "<set>width", nullptr, &doubleSetter), "No doubleSetter");
167 CHECK_STATUS_RET(env->Object_CallMethod_Void(object, doubleSetter, width), "doubleSetter fail");
168 return ANI_OK;
169 }
170
SetHeight(ani_env * env,ani_class cls,ani_object object,double height)171 ani_status FileAssetInfo::SetHeight(ani_env *env, ani_class cls, ani_object object, double height)
172 {
173 ani_method doubleSetter {};
174 CHECK_STATUS_RET(env->Class_FindMethod(cls, "<set>height", nullptr, &doubleSetter), "No doubleSetter");
175 CHECK_STATUS_RET(env->Object_CallMethod_Void(object, doubleSetter, height), "doubleSetter fail");
176 return ANI_OK;
177 }
178
SetDateTaken(ani_env * env,ani_class cls,ani_object object,double dateTaken)179 ani_status FileAssetInfo::SetDateTaken(ani_env *env, ani_class cls, ani_object object, double dateTaken)
180 {
181 ani_method doubleSetter {};
182 CHECK_STATUS_RET(env->Class_FindMethod(cls, "<set>date_taken", nullptr, &doubleSetter), "No doubleSetter");
183 CHECK_STATUS_RET(env->Object_CallMethod_Void(object, doubleSetter, dateTaken), "doubleSetter fail");
184 return ANI_OK;
185 }
186
SetOrientation(ani_env * env,ani_class cls,ani_object object,double orientation)187 ani_status FileAssetInfo::SetOrientation(ani_env *env, ani_class cls, ani_object object, double orientation)
188 {
189 ani_method doubleSetter {};
190 CHECK_STATUS_RET(env->Class_FindMethod(cls, "<set>orientation", nullptr, &doubleSetter), "No doubleSetter");
191 CHECK_STATUS_RET(env->Object_CallMethod_Void(object, doubleSetter, orientation), "doubleSetter fail");
192 return ANI_OK;
193 }
194
SetIsFavorite(ani_env * env,ani_class cls,ani_object object,bool isFavorite)195 ani_status FileAssetInfo::SetIsFavorite(ani_env *env, ani_class cls, ani_object object, bool isFavorite)
196 {
197 ani_method boolSetter {};
198 CHECK_STATUS_RET(env->Class_FindMethod(cls, "<set>is_favorite", nullptr, &boolSetter), "No boolSetter");
199 CHECK_STATUS_RET(env->Object_CallMethod_Void(object, boolSetter, isFavorite), "boolSetter fail");
200 return ANI_OK;
201 }
202
SetTitle(ani_env * env,ani_class cls,ani_object object,const std::string & title)203 ani_status FileAssetInfo::SetTitle(ani_env *env, ani_class cls, ani_object object, const std::string &title)
204 {
205 ani_method strSetter {};
206 CHECK_STATUS_RET(env->Class_FindMethod(cls, "<set>title", nullptr, &strSetter), "No strSetter");
207 ani_string strObj {};
208 CHECK_STATUS_RET(MediaLibraryAniUtils::ToAniString(env, title, strObj), "ToAniString fail");
209 CHECK_STATUS_RET(env->Object_CallMethod_Void(object, strSetter, strObj), "strSetter fail");
210 return ANI_OK;
211 }
212
SetPosition(ani_env * env,ani_class cls,ani_object object,PhotoPositionType position)213 ani_status FileAssetInfo::SetPosition(ani_env *env, ani_class cls, ani_object object, PhotoPositionType position)
214 {
215 ani_method positionSetter {};
216 CHECK_STATUS_RET(env->Class_FindMethod(cls, "<set>position", nullptr, &positionSetter), "No <set>position");
217 ani_enum_item positionObj = 0;
218 CHECK_STATUS_RET(MediaLibraryEnumAni::ToAniEnum(env, position, positionObj), "Get position object fail");
219 CHECK_STATUS_RET(env->Object_CallMethod_Void(object, positionSetter, positionObj), "<set>position fail");
220 return ANI_OK;
221 }
222
SetDateTrashed(ani_env * env,ani_class cls,ani_object object,double dateTrashed)223 ani_status FileAssetInfo::SetDateTrashed(ani_env *env, ani_class cls, ani_object object, double dateTrashed)
224 {
225 ani_method doubleSetter {};
226 CHECK_STATUS_RET(env->Class_FindMethod(cls, "<set>date_trashed", nullptr, &doubleSetter), "No doubleSetter");
227 CHECK_STATUS_RET(env->Object_CallMethod_Void(object, doubleSetter, dateTrashed), "doubleSetter fail");
228 return ANI_OK;
229 }
230
SetHidden(ani_env * env,ani_class cls,ani_object object,bool hidden)231 ani_status FileAssetInfo::SetHidden(ani_env *env, ani_class cls, ani_object object, bool hidden)
232 {
233 ani_method boolSetter {};
234 CHECK_STATUS_RET(env->Class_FindMethod(cls, "<set>hidden", nullptr, &boolSetter), "No boolSetter");
235 CHECK_STATUS_RET(env->Object_CallMethod_Void(object, boolSetter, hidden), "boolSetter fail");
236 return ANI_OK;
237 }
238
SetUserComment(ani_env * env,ani_class cls,ani_object object,const std::string & userComment)239 ani_status FileAssetInfo::SetUserComment(ani_env *env, ani_class cls, ani_object object, const std::string &userComment)
240 {
241 ani_method strSetter {};
242 CHECK_STATUS_RET(env->Class_FindMethod(cls, "<set>user_comment", nullptr, &strSetter), "No strSetter");
243 ani_string strObj {};
244 CHECK_STATUS_RET(MediaLibraryAniUtils::ToAniString(env, userComment, strObj), "ToAniString fail");
245 CHECK_STATUS_RET(env->Object_CallMethod_Void(object, strSetter, strObj), "strSetter fail");
246 return ANI_OK;
247 }
248
SetCameraShotKey(ani_env * env,ani_class cls,ani_object object,const std::string & camera)249 ani_status FileAssetInfo::SetCameraShotKey(ani_env *env, ani_class cls, ani_object object, const std::string &camera)
250 {
251 ani_method strSetter {};
252 CHECK_STATUS_RET(env->Class_FindMethod(cls, "<set>camera_shot_key", nullptr, &strSetter), "No strSetter");
253 ani_string strObj {};
254 CHECK_STATUS_RET(MediaLibraryAniUtils::ToAniString(env, camera, strObj), "ToAniString fail");
255 CHECK_STATUS_RET(env->Object_CallMethod_Void(object, strSetter, strObj), "strSetter fail");
256 return ANI_OK;
257 }
258
SetDateYear(ani_env * env,ani_class cls,ani_object object,const std::string & dateYear)259 ani_status FileAssetInfo::SetDateYear(ani_env *env, ani_class cls, ani_object object, const std::string &dateYear)
260 {
261 ani_method strSetter {};
262 CHECK_STATUS_RET(env->Class_FindMethod(cls, "<set>date_year", nullptr, &strSetter), "No strSetter");
263 ani_string strObj {};
264 CHECK_STATUS_RET(MediaLibraryAniUtils::ToAniString(env, dateYear, strObj), "ToAniString fail");
265 CHECK_STATUS_RET(env->Object_CallMethod_Void(object, strSetter, strObj), "strSetter fail");
266 return ANI_OK;
267 }
268
SetDateMonth(ani_env * env,ani_class cls,ani_object object,const std::string & dateMonth)269 ani_status FileAssetInfo::SetDateMonth(ani_env *env, ani_class cls, ani_object object, const std::string &dateMonth)
270 {
271 ani_method strSetter {};
272 CHECK_STATUS_RET(env->Class_FindMethod(cls, "<set>date_month", nullptr, &strSetter), "No strSetter");
273 ani_string strObj {};
274 CHECK_STATUS_RET(MediaLibraryAniUtils::ToAniString(env, dateMonth, strObj), "ToAniString fail");
275 CHECK_STATUS_RET(env->Object_CallMethod_Void(object, strSetter, strObj), "strSetter fail");
276 return ANI_OK;
277 }
278
SetDateDay(ani_env * env,ani_class cls,ani_object object,const std::string & dateDay)279 ani_status FileAssetInfo::SetDateDay(ani_env *env, ani_class cls, ani_object object, const std::string &dateDay)
280 {
281 ani_method strSetter {};
282 CHECK_STATUS_RET(env->Class_FindMethod(cls, "<set>date_day", nullptr, &strSetter), "No strSetter");
283 ani_string strObj {};
284 CHECK_STATUS_RET(MediaLibraryAniUtils::ToAniString(env, dateDay, strObj), "ToAniString fail");
285 CHECK_STATUS_RET(env->Object_CallMethod_Void(object, strSetter, strObj), "strSetter fail");
286 return ANI_OK;
287 }
288
SetPending(ani_env * env,ani_class cls,ani_object object,bool pending)289 ani_status FileAssetInfo::SetPending(ani_env *env, ani_class cls, ani_object object, bool pending)
290 {
291 ani_method boolSetter {};
292 CHECK_STATUS_RET(env->Class_FindMethod(cls, "<set>pending", nullptr, &boolSetter), "No boolSetter");
293 CHECK_STATUS_RET(env->Object_CallMethod_Void(object, boolSetter, pending), "boolSetter fail");
294 return ANI_OK;
295 }
296
SetDateAddedMs(ani_env * env,ani_class cls,ani_object object,double dateAddedMs)297 ani_status FileAssetInfo::SetDateAddedMs(ani_env *env, ani_class cls, ani_object object, double dateAddedMs)
298 {
299 ani_method doubleSetter {};
300 CHECK_STATUS_RET(env->Class_FindMethod(cls, "<set>date_added_ms", nullptr, &doubleSetter), "No doubleSetter");
301 CHECK_STATUS_RET(env->Object_CallMethod_Void(object, doubleSetter, dateAddedMs), "doubleSetter fail");
302 return ANI_OK;
303 }
304
SetDateModifiedMs(ani_env * env,ani_class cls,ani_object object,double dateModifiedMs)305 ani_status FileAssetInfo::SetDateModifiedMs(ani_env *env, ani_class cls, ani_object object, double dateModifiedMs)
306 {
307 ani_method doubleSetter {};
308 CHECK_STATUS_RET(env->Class_FindMethod(cls, "<set>date_modified_ms", nullptr, &doubleSetter), "No doubleSetter");
309 CHECK_STATUS_RET(env->Object_CallMethod_Void(object, doubleSetter, dateModifiedMs), "doubleSetter fail");
310 return ANI_OK;
311 }
312
SetDateTrashedMs(ani_env * env,ani_class cls,ani_object object,double dateTrashedMs)313 ani_status FileAssetInfo::SetDateTrashedMs(ani_env *env, ani_class cls, ani_object object, double dateTrashedMs)
314 {
315 ani_method doubleSetter {};
316 CHECK_STATUS_RET(env->Class_FindMethod(cls, "<set>date_trashed_ms", nullptr, &doubleSetter), "No doubleSetter");
317 CHECK_STATUS_RET(env->Object_CallMethod_Void(object, doubleSetter, dateTrashedMs), "doubleSetter fail");
318 return ANI_OK;
319 }
320
SetSubtype(ani_env * env,ani_class cls,ani_object object,PhotoSubType subtype)321 ani_status FileAssetInfo::SetSubtype(ani_env *env, ani_class cls, ani_object object, PhotoSubType subtype)
322 {
323 ani_method subtypeSetter {};
324 CHECK_STATUS_RET(env->Class_FindMethod(cls, "<set>subtype", nullptr, &subtypeSetter), "No <set>subtype");
325 ani_enum_item subtypeObj = 0;
326 CHECK_STATUS_RET(MediaLibraryEnumAni::ToAniEnum(env, subtype, subtypeObj), "Get subtype object fail");
327 CHECK_STATUS_RET(env->Object_CallMethod_Void(object, subtypeSetter, subtypeObj), "<set>subtype fail");
328 return ANI_OK;
329 }
330 } // namespace Media
331 } // namespace OHOS