1  /*
2   * Copyright (C) 2021-2022 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 OHOS_MEDIALIBRARY_DATA_MANAGER_H
17  #define OHOS_MEDIALIBRARY_DATA_MANAGER_H
18  
19  #include <memory>
20  #include <string>
21  #include <unordered_map>
22  #include <shared_mutex>
23  
24  #include "ability_context.h"
25  #include "cloud_sync_observer.h"
26  #include "context/context.h"
27  #include "dir_asset.h"
28  #include "datashare_predicates.h"
29  #include "datashare_values_bucket.h"
30  #include "distributed_kv_data_manager.h"
31  #include "imedia_scanner_callback.h"
32  #include "medialibrary_command.h"
33  #include "medialibrary_data_manager_utils.h"
34  #include "medialibrary_helper_container.h"
35  #include "medialibrary_db_const.h"
36  #include "medialibrary_rdbstore.h"
37  #include "rdb_predicates.h"
38  #include "rdb_store.h"
39  #include "result_set_bridge.h"
40  #include "uri.h"
41  #include "values_bucket.h"
42  #include "thumbnail_service.h"
43  #include "bundle_mgr_interface.h"
44  
45  #define EXPORT __attribute__ ((visibility ("default")))
46  
47  namespace OHOS {
48  namespace AbilityRuntime {
49  class MediaDataShareExtAbility;
50  }
51  namespace Media {
52  using OHOS::AbilityRuntime::MediaDataShareExtAbility;
53  class MediaLibraryDataManager {
54  public:
55      static constexpr uint32_t URI_MIN_NUM = 3;
56      EXPORT MediaLibraryDataManager();
57      EXPORT ~MediaLibraryDataManager();
58      EXPORT static MediaLibraryDataManager* GetInstance();
59  
60      EXPORT int32_t Insert(MediaLibraryCommand &cmd, const DataShare::DataShareValuesBucket &value);
61      EXPORT int32_t InsertExt(MediaLibraryCommand &cmd, const DataShare::DataShareValuesBucket &value,
62          std::string &result);
63      EXPORT int32_t Delete(MediaLibraryCommand &cmd, const DataShare::DataSharePredicates &predicates);
64      EXPORT int32_t BatchInsert(MediaLibraryCommand &cmd,
65          const std::vector<DataShare::DataShareValuesBucket> &values);
66      EXPORT int32_t Update(MediaLibraryCommand &cmd, const DataShare::DataShareValuesBucket &value,
67          const DataShare::DataSharePredicates &predicates);
68      EXPORT std::shared_ptr<DataShare::ResultSetBridge> Query(MediaLibraryCommand &cmd,
69          const std::vector<std::string> &columns, const DataShare::DataSharePredicates &predicates, int &errCode);
70      EXPORT std::shared_ptr<NativeRdb::ResultSet>
71      EXPORT QueryRdb(MediaLibraryCommand &cmd, const std::vector<std::string> &columns,
72          const DataShare::DataSharePredicates &predicates, int &errCode);
73      EXPORT int32_t OpenFile(MediaLibraryCommand &cmd, const std::string &mode);
74      EXPORT std::string GetType(const Uri &uri);
75      EXPORT void NotifyChange(const Uri &uri);
76      EXPORT int32_t GenerateThumbnailBackground();
77  
78      // upgrade existed thumbnails to fix such as size, rotation and quality etc. problems
79      EXPORT int32_t UpgradeThumbnailBackground(bool isWifiConnected);
80  
81      // restore thumbnail for date fronted 500 photos from dual framework upgrade or clone
82      EXPORT int32_t RestoreThumbnailDualFrame();
83      void InterruptBgworker();
84      EXPORT int32_t DoAging();
85      EXPORT int32_t DoTrashAging(std::shared_ptr<int> countPtr = nullptr);
86      /**
87       * @brief Revert the pending state through the package name
88       * @param bundleName packageName
89       * @return revert result
90       */
91      EXPORT int32_t RevertPendingByPackage(const std::string &bundleName);
92  
93      // update burst photo from gallery
94      EXPORT int32_t UpdateBurstFromGallery();
95      // update burst_cover_level from gallery
96      EXPORT int32_t UpdateBurstCoverLevelFromGallery();
97  
98      EXPORT std::shared_ptr<MediaLibraryRdbStore> rdbStore_;
99  
100      EXPORT int32_t InitMediaLibraryMgr(const std::shared_ptr<OHOS::AbilityRuntime::Context> &context,
101          const std::shared_ptr<OHOS::AbilityRuntime::Context> &extensionContext, int32_t &sceneCode);
102      EXPORT void ClearMediaLibraryMgr();
103      EXPORT int32_t MakeDirQuerySetMap(std::unordered_map<std::string, DirAsset> &outDirQuerySetMap);
104      EXPORT void CreateThumbnailAsync(const std::string &uri, const std::string &path);
105      EXPORT static std::unordered_map<std::string, DirAsset> GetDirQuerySetMap();
106      EXPORT std::shared_ptr<MediaDataShareExtAbility> GetOwner();
107      EXPORT void SetOwner(const std::shared_ptr<MediaDataShareExtAbility> &datashareExtension);
108      EXPORT int GetThumbnail(const std::string &uri);
109      EXPORT void SetStartupParameter();
110      EXPORT void ReCreateMediaDir();
111      EXPORT int32_t CheckCloudThumbnailDownloadFinish();
112      EXPORT void UploadDBFileInner();
113      EXPORT int32_t UpdateDateTakenWhenZero();
114  
115  private:
116      int32_t InitMediaLibraryRdbStore();
117      void InitResourceInfo();
118      void HandleUpgradeRdbAsync();
119  
120  #ifdef DISTRIBUTED
121      bool QuerySync(const std::string &networkId, const std::string &tableName);
122  #endif
123      int32_t HandleThumbnailOperations(MediaLibraryCommand &cmd);
124  
125      EXPORT int32_t SolveInsertCmd(MediaLibraryCommand &cmd);
126      EXPORT int32_t SetCmdBundleAndDevice(MediaLibraryCommand &outCmd);
127  #ifdef DISTRIBUTED
128      int32_t InitDeviceData();
129  #endif
130      EXPORT int32_t InitialiseThumbnailService(const std::shared_ptr<OHOS::AbilityRuntime::Context> &extensionContext);
131      std::shared_ptr<NativeRdb::ResultSet> QuerySet(MediaLibraryCommand &cmd, const std::vector<std::string> &columns,
132          const DataShare::DataSharePredicates &predicates, int &errCode);
133      void InitACLPermission();
134      void InitDatabaseACLPermission();
135      std::shared_ptr<NativeRdb::ResultSet> QueryInternal(MediaLibraryCommand &cmd,
136          const std::vector<std::string> &columns, const DataShare::DataSharePredicates &predicates);
137  #ifdef DISTRIBUTED
138      int32_t LcdDistributeAging();
139      int32_t DistributeDeviceAging();
140  #endif
141      EXPORT std::shared_ptr<ThumbnailService> thumbnailService_;
142      int32_t RevertPendingByFileId(const std::string &fileId);
143  #ifdef DISTRIBUTED
144      int32_t SyncPullThumbnailKeys(const Uri &uri);
145  #endif
146      int32_t DeleteInRdbPredicates(MediaLibraryCommand &cmd, NativeRdb::RdbPredicates &rdbPredicate);
147      int32_t DeleteInRdbPredicatesAnalysis(MediaLibraryCommand &cmd, NativeRdb::RdbPredicates &rdbPredicate);
148      int32_t UpdateInternal(MediaLibraryCommand &cmd, NativeRdb::ValuesBucket &value,
149          const DataShare::DataSharePredicates &predicates);
150      int32_t SolveInsertCmdSub(MediaLibraryCommand &cmd);
151      void HandleOtherInitOperations();
152      void InitRefreshAlbum();
153      int32_t ProcessThumbnailBatchCmd(const MediaLibraryCommand &cmd,
154          const NativeRdb::ValuesBucket &value, const DataShare::DataSharePredicates &predicates);
155      void SubscriberPowerConsumptionDetection();
156      std::shared_mutex mgrSharedMutex_;
157  #ifdef DISTRIBUTED
158      std::shared_ptr<DistributedKv::SingleKvStore> kvStorePtr_;
159      DistributedKv::DistributedKvDataManager dataManager_;
160  #endif
161      std::shared_ptr<OHOS::AbilityRuntime::Context> context_;
162      std::string bundleName_ {BUNDLE_NAME};
163      static std::mutex mutex_;
164      static std::unique_ptr<MediaLibraryDataManager> instance_;
165      static std::unordered_map<std::string, DirAsset> dirQuerySetMap_;
166      std::atomic<int> refCnt_ {0};
167      std::shared_ptr<MediaDataShareExtAbility> extension_;
168      std::shared_ptr<CloudSyncObserver> cloudPhotoObserver_;
169      std::shared_ptr<CloudSyncObserver> cloudPhotoAlbumObserver_;
170  };
171  
172  // Scanner callback objects
173  class ScanFileCallback : public IMediaScannerCallback {
174  public:
175      ScanFileCallback() = default;
176      ~ScanFileCallback() = default;
177      int32_t OnScanFinished(const int32_t status, const std::string &uri, const std::string &path) override;
178  };
179  } // namespace Media
180  } // namespace OHOS
181  #endif // OHOS_MEDIALIBRARY_DATA_ABILITY_H
182