1/*
2 * Copyright (C) 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 SERVICES_INCLUDE_WALLPAPER_SERVICES_H
17#define SERVICES_INCLUDE_WALLPAPER_SERVICES_H
18
19#include <list>
20#include <map>
21#include <mutex>
22
23#include "accesstoken_kit.h"
24#include "component_name.h"
25#include "concurrent_map.h"
26#include "event_handler.h"
27#include "fault_reporter.h"
28#include "file_deal.h"
29#include "i_wallpaper_manager_callback.h"
30#include "image_source.h"
31#include "ipc_skeleton.h"
32#include "os_account_manager.h"
33#include "pixel_map.h"
34#include "system_ability.h"
35#include "wallpaper_common.h"
36#include "wallpaper_common_event_subscriber.h"
37#include "wallpaper_data.h"
38#include "wallpaper_event_listener.h"
39#include "wallpaper_manager_common_info.h"
40#include "wallpaper_service_stub.h"
41#include "want.h"
42
43#ifndef THEME_SERVICE
44#include "ability_connect_callback_interface.h"
45#include "ability_manager_errors.h"
46#include "wallpaper_extension_ability_connection.h"
47#endif
48namespace OHOS {
49namespace ColorManager {
50class Color;
51}
52namespace WallpaperMgrService {
53class WallpaperService : public SystemAbility, public WallpaperServiceStub {
54    DECLARE_SYSTEM_ABILITY(WallpaperService);
55    enum class ServiceRunningState { STATE_NOT_START, STATE_RUNNING };
56    enum class FileType : uint8_t { WALLPAPER_FILE, CROP_FILE };
57    using WallpaperListenerMap = std::map<int32_t, sptr<IWallpaperEventListener>>;
58
59public:
60    DISALLOW_COPY_AND_MOVE(WallpaperService);
61
62    WallpaperService(int32_t systemAbilityId, bool runOnCreate);
63    WallpaperService();
64    ~WallpaperService();
65
66    ErrorCode SetWallpaper(int32_t fd, int32_t wallpaperType, int32_t length) override;
67    ErrorCode SetWallpaperByPixelMap(std::shared_ptr<OHOS::Media::PixelMap> pixelMap, int32_t wallpaperType) override;
68    ErrorCode GetPixelMap(int32_t wallpaperType, FdInfo &fdInfo) override;
69    ErrorCode GetColors(int32_t wallpaperType, std::vector<uint64_t> &colors) override;
70    ErrorCode GetFile(int32_t wallpaperType, int32_t &wallpaperFd) override;
71    int32_t GetWallpaperId(int32_t wallpaperType) override;
72    bool IsChangePermitted() override;
73    bool IsOperationAllowed() override;
74    ErrorCode ResetWallpaper(int32_t wallpaperType) override;
75    ErrorCode On(const std::string &type, sptr<IWallpaperEventListener> listener) override;
76    ErrorCode Off(const std::string &type, sptr<IWallpaperEventListener> listener) override;
77    bool RegisterWallpaperCallback(const sptr<IWallpaperCallback> callback) override;
78    int32_t Dump(int32_t fd, const std::vector<std::u16string> &args) override;
79
80    ErrorCode SetWallpaperV9(int32_t fd, int32_t wallpaperType, int32_t length) override;
81    ErrorCode SetWallpaperV9ByPixelMap(std::shared_ptr<OHOS::Media::PixelMap> pixelMap, int32_t wallpaperType) override;
82    ErrorCode GetPixelMapV9(int32_t wallpaperType, FdInfo &fdInfo) override;
83    ErrorCode GetColorsV9(int32_t wallpaperType, std::vector<uint64_t> &colors) override;
84    ErrorCode ResetWallpaperV9(int32_t wallpaperType) override;
85    ErrorCode SetVideo(int32_t fd, int32_t wallpaperType, int32_t length) override;
86    ErrorCode SetCustomWallpaper(int32_t fd, int32_t wallpaperType, int32_t length) override;
87    ErrorCode SendEvent(const std::string &eventType) override;
88
89public:
90    void OnInitUser(int32_t newUserId);
91    void OnRemovedUser(int32_t userId);
92    void OnSwitchedUser(int32_t userId);
93    void ReporterFault(MiscServices::FaultType faultType, MiscServices::FaultCode faultCode);
94    void RegisterSubscriber(int32_t times);
95#ifndef THEME_SERVICE
96    void AddWallpaperExtensionDeathRecipient(const sptr<IRemoteObject> &remoteObject);
97    void StartExtensionAbility(int32_t times);
98#endif
99protected:
100    void OnStart() override;
101    void OnStop() override;
102    void OnAddSystemAbility(int32_t systemAbilityId, const std::string &deviceId) override;
103
104private:
105    void InitData();
106    void InitQueryUserId(int32_t times);
107    bool InitUsersOnBoot();
108    bool CompareColor(const uint64_t &localColor, const ColorManager::Color &color);
109    bool SaveColor(int32_t userId, WallpaperType wallpaperType);
110    void UpdataWallpaperMap(int32_t userId, WallpaperType wallpaperType);
111    std::string GetWallpaperDir(int32_t userId, WallpaperType wallpaperType);
112    bool GetFileNameFromMap(int32_t userId, WallpaperType wallpaperType, std::string &fileName);
113    bool GetPictureFileName(int32_t userId, WallpaperType wallpaperType, std::string &fileName);
114    bool GetWallpaperSafeLocked(int32_t userId, WallpaperType wallpaperType, WallpaperData &wallpaperData);
115    void ClearWallpaperLocked(int32_t userId, WallpaperType wallpaperType);
116    ErrorCode SetDefaultDataForWallpaper(int32_t userId, WallpaperType wallpaperType);
117    int32_t MakeWallpaperIdLocked();
118    bool CheckCallingPermission(const std::string &permissionName);
119    ErrorCode SetWallpaperBackupData(int32_t userId, WallpaperResourceType resourceType,
120        const std::string &uriOrPixelMap, WallpaperType wallpaperType);
121    ErrorCode WritePixelMapToFile(std::shared_ptr<OHOS::Media::PixelMap> pixelMap, std::string wallpaperTmpFullPath,
122        int32_t wallpaperType, WallpaperResourceType resourceType);
123    int64_t WritePixelMapToStream(std::shared_ptr<OHOS::Media::PixelMap> pixelMap, std::ostream &outputStream);
124#ifndef THEME_SERVICE
125    bool ConnectExtensionAbility();
126#endif
127    bool IsSystemApp();
128    ErrorCode GetImageFd(int32_t userId, WallpaperType wallpaperType, int32_t &fd);
129    ErrorCode GetImageSize(int32_t userId, WallpaperType wallpaperType, int32_t &size);
130    bool RestoreUserResources(int32_t userId, WallpaperData &wallpaperData, WallpaperType wallpaperType);
131    bool InitUserDir(int32_t userId);
132    int32_t QueryActiveUserId();
133    bool CheckUserPermissionById(int32_t userId);
134
135    bool SendWallpaperChangeEvent(int32_t userId, WallpaperType wallpaperType);
136    ErrorCode SetWallpaper(int32_t fd, int32_t wallpaperType, int32_t length, WallpaperResourceType resourceType);
137    ErrorCode SetWallpaperByPixelMap(
138        std::shared_ptr<OHOS::Media::PixelMap> pixelMap, int32_t wallpaperType, WallpaperResourceType resourceType);
139    void OnColorsChange(WallpaperType wallpaperType, const ColorManager::Color &color);
140    ErrorCode CheckValid(int32_t wallpaperType, int32_t length, WallpaperResourceType resourceType);
141    bool WallpaperChanged(WallpaperType wallpaperType, WallpaperResourceType resType, const std::string &uri);
142    void NotifyColorChange(const std::vector<uint64_t> &colors, const WallpaperType &wallpaperType);
143    bool SaveWallpaperState(int32_t userId, WallpaperType wallpaperType, WallpaperResourceType resourceType);
144    void LoadWallpaperState();
145    WallpaperResourceType GetResType(int32_t userId, WallpaperType wallpaperType);
146    void RemoveExtensionDeathRecipient();
147    static void GetWallpaperFile(
148        WallpaperResourceType resourceType, const WallpaperData &wallpaperData, std::string &wallpaperFile);
149    std::string GetDefaultResDir();
150    std::string GetWallpaperDefaultPath(WallpaperType wallpaperType);
151    std::string GetWallpaperPathInJson(const std::string filePath);
152    void ClearRedundantFile(int32_t userId, WallpaperType wallpaperType, std::string fileName);
153
154private:
155    int32_t Init();
156    ServiceRunningState state_;
157    void InitServiceHandler();
158    static std::mutex instanceLock_;
159    static sptr<WallpaperService> instance_;
160    static std::shared_ptr<AppExecFwk::EventHandler> serviceHandler_;
161    std::string wallpaperLockScreenFilePath_;
162    std::string wallpaperSystemFilePath_;
163    std::string wallpaperLockScreenFileFullPath_;
164    std::string wallpaperSystemFileFullPath_;
165    std::string wallpaperLockScreenCropFileFullPath_;
166    std::string wallpaperSystemCropFileFullPath_;
167    std::string wallpaperTmpFullPath_;
168    std::string wallpaperCropPath_;
169    typedef std::map<int32_t, WallpaperEventListener *> DISPLAYIDCOLORSLISTENERMAP;
170    typedef std::map<int32_t, DISPLAYIDCOLORSLISTENERMAP> COLORSLISTENERMAP;
171    typedef std::list<WallpaperEventListener *> LISTENERLIST;
172    LISTENERLIST colorListeners_;
173    COLORSLISTENERMAP colorsChangedListeners_;
174    ConcurrentMap<int32_t, WallpaperData> systemWallpaperMap_;
175    ConcurrentMap<int32_t, WallpaperData> lockWallpaperMap_;
176    atomic<int32_t> wallpaperId_;
177    sptr<IWallpaperCallback> callbackProxy_ = nullptr;
178    std::shared_ptr<WallpaperCommonEventSubscriber> subscriber_;
179#ifndef THEME_SERVICE
180    sptr<WallpaperExtensionAbilityConnection> connection_;
181#endif
182    sptr<IRemoteObject::DeathRecipient> recipient_;
183    sptr<IRemoteObject> extensionRemoteObject_;
184    std::mutex remoteObjectMutex_;
185
186    std::mutex mtx_;
187    uint64_t lockWallpaperColor_;
188    uint64_t systemWallpaperColor_;
189    std::map<std::string, WallpaperListenerMap> wallpaperEventMap_;
190    std::mutex listenerMapMutex_;
191    std::int32_t currentUserId_;
192    std::string appBundleName_;
193    std::mutex wallpaperColorMtx_;
194};
195} // namespace WallpaperMgrService
196} // namespace OHOS
197#endif // SERVICES_INCLUDE_WALLPAPER_SERVICES_H