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 #ifndef MEDIALIBRARY_PHOTO_OPERATIONS_H
17 #define MEDIALIBRARY_PHOTO_OPERATIONS_H
18 
19 #include <memory>
20 #include <shared_mutex>
21 #include <string>
22 #include <vector>
23 
24 #include "abs_shared_result_set.h"
25 #include "file_asset.h"
26 #include "medialibrary_asset_operations.h"
27 #include "medialibrary_command.h"
28 #include "picture.h"
29 
30 namespace OHOS {
31 namespace Media {
32 
33 class AlbumData {
34 public:
35     AlbumData() = default;
36     ~AlbumData() = default;
37     std::vector<bool> isHidden = {};
38 };
39 
40 #define EXPORT __attribute__ ((visibility ("default")))
41 class MediaLibraryPhotoOperations : public MediaLibraryAssetOperations {
42 public:
43     EXPORT static int32_t Create(MediaLibraryCommand &cmd);
44     EXPORT static std::shared_ptr<NativeRdb::ResultSet> Query(MediaLibraryCommand &cmd,
45         const std::vector<std::string> &columns);
46     EXPORT static int32_t Update(MediaLibraryCommand &cmd);
47     EXPORT static int32_t Delete(MediaLibraryCommand &cmd);
48     EXPORT static int32_t Open(MediaLibraryCommand &cmd, const std::string &mode);
49     EXPORT static int32_t Close(MediaLibraryCommand &cmd);
50     EXPORT static int32_t SubmitCache(MediaLibraryCommand &cmd);
51     EXPORT static int32_t CommitEditInsert(MediaLibraryCommand &cmd);
52     EXPORT static int32_t RevertToOrigin(MediaLibraryCommand &cmd);
53     EXPORT static void DeleteRevertMessage(const std::string &path);
54     EXPORT static std::shared_ptr<NativeRdb::ResultSet> ScanMovingPhoto(MediaLibraryCommand &cmd,
55         const std::vector<std::string> &columns);
56     EXPORT static void StoreThumbnailSize(const std::string& photoId, const std::string& photoPath);
57     EXPORT static bool HasDroppedThumbnailSize(const std::string& photoId);
58     EXPORT static int32_t AddFilters(MediaLibraryCommand &cmd);
59     EXPORT static int32_t ProcessMultistagesPhoto(bool isEdited, const std::string &path,
60         const uint8_t *addr, const long bytes, int32_t fileId);
61     EXPORT static int32_t ScanFileWithoutAlbumUpdate(MediaLibraryCommand &cmd);
62     EXPORT static int32_t ProcessMultistagesPhotoForPicture(bool isEdited, const std::string &path,
63         std::shared_ptr<Media::Picture> &picture, int32_t fileId, const std::string &mime_type);
64     EXPORT static int32_t Save(bool isEdited, const std::string &path,
65         const uint8_t *addr, const long bytes, int32_t fileId);
66     EXPORT static int32_t AddFiltersToPicture(std::shared_ptr<Media::Picture>& inPicture,
67         const std::string &outputPath, std::string &editdata, const std::string &mime_type,
68         bool isHighQualityPicture);
69     EXPORT static int32_t SavePicture(const int32_t &fileType, const int32_t &fileId);
70     EXPORT static int32_t GetPicture(const int32_t &fileId, std::shared_ptr<Media::Picture> &picture,
71         bool isCleanImmediately, std::string &photoId, bool &isHighQualityPicture);
72     EXPORT static int32_t FinishRequestPicture(MediaLibraryCommand &cmd);
73     EXPORT static int64_t CloneSingleAsset(MediaLibraryCommand &cmd);
74     EXPORT static int32_t AddFiltersForCloudEnhancementPhoto(int32_t fileId, const std::string& assetPath,
75         const std::string& editDataCameraSourcePath, const std::string& mimeType);
76     EXPORT static int32_t ProcessMultistagesVideo(bool isEdited, const std::string &path);
77     EXPORT static int32_t RemoveTempVideo(const std::string &path);
78     EXPORT static void UpdateSourcePath(const std::vector<std::string> &whereArgs);
79     EXPORT static void TrashPhotosSendNotify(std::vector<std::string> &notifyUris,
80         std::shared_ptr<AlbumData> AlbumData = nullptr);
81 
82 private:
83     static int32_t CreateV9(MediaLibraryCommand &cmd);
84     static int32_t CreateV10(MediaLibraryCommand &cmd);
85     static int32_t DeletePhoto(const std::shared_ptr<FileAsset> &fileAsset, MediaLibraryApi api);
86     static int32_t UpdateV9(MediaLibraryCommand &cmd);
87     static int32_t UpdateV10(MediaLibraryCommand &cmd);
88     static int32_t TrashPhotos(MediaLibraryCommand &cmd);
89     static void SolvePhotoAlbumInCreate(MediaLibraryCommand &cmd, FileAsset &fileAsset);
90     static int32_t OpenCache(MediaLibraryCommand &cmd, const std::string &mode, bool &isCacheOperation);
91     static int32_t DeleteCache(MediaLibraryCommand &cmd);
92     static int32_t OpenEditOperation(MediaLibraryCommand &cmd, bool &isSkip);
93     static int32_t RequestEditData(MediaLibraryCommand &cmd);
94     static int32_t RequestEditSource(MediaLibraryCommand &cmd);
95     static int32_t CommitEditOpen(MediaLibraryCommand &cmd);
96     static int32_t CommitEditOpenExecute(const std::shared_ptr<FileAsset> &fileAsset);
97     static int32_t CommitEditInsertExecute(const std::shared_ptr<FileAsset> &fileAsset,
98         const std::string &editData);
99     static int32_t DoRevertEdit(const std::shared_ptr<FileAsset> &fileAsset);
100     static int32_t RevertMovingPhotoVideo(const std::shared_ptr<FileAsset> &fileAsset,
101         const std::string &path, const std::string &sourceVideoPath, int32_t subtype);
102     static int32_t ParseMediaAssetEditData(MediaLibraryCommand &cmd, std::string &editData);
103     static void ParseCloudEnhancementEditData(std::string& editData);
104     static bool IsSetEffectMode(MediaLibraryCommand &cmd);
105     static bool IsContainsData(MediaLibraryCommand &cm);
106     static bool IsCameraEditData(MediaLibraryCommand &cmd);
107     static int32_t ReadEditdataFromFile(const std::string &editDataPath, std::string &editData);
108     static int32_t SaveEditDataCamera(MediaLibraryCommand &cmd, const std::string &assetPath,
109         std::string &editData);
110     static int32_t SaveSourceAndEditData(const std::shared_ptr<FileAsset> &fileAsset, const std::string &editData);
111     static int32_t SaveSourceVideoFile(MediaLibraryCommand &cmd, const std::shared_ptr<FileAsset> &fileAsset,
112         const std::string &assetPath);
113     static int32_t AddFiltersExecute(MediaLibraryCommand& cmd, const std::shared_ptr<FileAsset>& fileAsset,
114         const std::string &cachePath);
115     static int32_t SubmitEditCacheExecute(MediaLibraryCommand &cmd,
116         const std::shared_ptr<FileAsset> &fileAsset, const std::string &cachePath);
117     static int32_t SubmitCacheExecute(MediaLibraryCommand &cmd,
118         const std::shared_ptr<FileAsset> &fileAsset, const std::string &cachePath);
119     static int32_t SubmitEffectModeExecute(MediaLibraryCommand &cmd);
120     static int32_t SubmitEditMovingPhotoExecute(MediaLibraryCommand &cmd, const std::shared_ptr<FileAsset> &fileAsset);
121     static int32_t GetMovingPhotoCachePath(MediaLibraryCommand &cmd, const std::shared_ptr<FileAsset> &fileAsset,
122         std::string &imageCachePath, std::string &videoCachePath);
123     static bool CheckCacheCmd(MediaLibraryCommand &cmd, int32_t subtype, const std::string &displayName);
124     static int32_t MoveCacheFile(MediaLibraryCommand &cmd, int32_t subtype,
125         const std::string &cachePath, const std::string &destPath);
126     static int32_t UpdateMovingPhotoSubtype(int32_t fileId, int32_t currentPhotoSubType);
127     static int32_t UpdateFileAsset(MediaLibraryCommand &cmd);
128     static int32_t UpdateExif(MediaLibraryCommand &cmd, const std::shared_ptr<FileAsset> &fileAsset);
129     static int32_t BatchSetUserComment(MediaLibraryCommand &cmd);
130     static int32_t BatchSetOwnerAlbumId(MediaLibraryCommand &cmd);
131     static int32_t AddFiltersToPhoto(const std::string &inputPath, const std::string &outputPath,
132         const std::string &editdata, const std::string &photoStatus = "");
133     static int32_t RevertToOriginalEffectMode(MediaLibraryCommand &cmd, const std::shared_ptr<FileAsset> &fileAsset,
134         bool &isNeedScan);
135     static bool IsNeedRevertEffectMode(MediaLibraryCommand& cmd, const std::shared_ptr<FileAsset>& fileAsset,
136         int32_t& effectMode);
137     static void ProcessEditedEffectMode(MediaLibraryCommand& cmd, int32_t effectMode);
138     static int32_t SaveCameraPhoto(MediaLibraryCommand &cmd);
139     static std::shared_ptr<FileAsset> GetFileAsset(MediaLibraryCommand &cmd);
140     static int32_t SetVideoEnhancementAttr(MediaLibraryCommand &cmd);
141     static int32_t ForceSavePicture(MediaLibraryCommand& cmd);
142     static int32_t DegenerateMovingPhoto(MediaLibraryCommand &cmd);
143     static int32_t UpdateOwnerAlbumId(MediaLibraryCommand &cmd);
144 private:
145     static int32_t UpdateExtension(const int32_t &fileId, std::string &mimeType, const int32_t &fileType,
146         std::string &oldFilePath);
147     static void UpdateEditDataPath(std::string filePath, const std::string &extension);
148     static void DeleteAbnormalFile(std::string &assetPath, const int32_t &fileId, const std::string &oldFilePath);
149     static std::mutex saveCameraPhotoMutex_;
150     static std::condition_variable condition_;
151     static std::string lastPhotoId_;
152 };
153 
154 class PhotoEditingRecord {
155 public:
156     EXPORT explicit PhotoEditingRecord();
157     EXPORT static std::shared_ptr<PhotoEditingRecord> GetInstance();
158 
159     EXPORT bool StartCommitEdit(int32_t fileId);
160     EXPORT void EndCommitEdit(int32_t fileId);
161     EXPORT bool StartRevert(int32_t fileId);
162     EXPORT void EndRevert(int32_t fileId);
163     EXPORT bool IsInRevertOperation(int32_t fileId);
164     EXPORT bool IsInEditOperation(int32_t fileId);
165 
166 private:
167     static std::mutex mutex_;
168     static std::shared_ptr<PhotoEditingRecord> instance_;
169     std::shared_mutex addMutex_;
170     std::set<int32_t> editingPhotoSet_;
171     std::set<int32_t> revertingPhotoSet_;
172 };
173 } // namespace Media
174 } // namespace OHOS
175 
176 #endif // OHOS_MEDIALIBRARY_PHOTO_OPERATIONS_H