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 #include <fcntl.h>
16 #include <sys/prctl.h>
17 #include <sys/sendfile.h>
18 #include <sys/stat.h>
19 #include <sys/types.h>
20 #include <unistd.h>
21
22 #include <cerrno>
23 #include <cstdio>
24 #include <cstdlib>
25 #include <cstring>
26 #include <fstream>
27 #include <iostream>
28 #include <sstream>
29 #include <thread>
30
31 #include "bundle_mgr_interface.h"
32 #include "bundle_mgr_proxy.h"
33 #include "color_picker.h"
34 #include "command.h"
35 #include "config_policy_utils.h"
36 #include "directory_ex.h"
37 #include "dump_helper.h"
38 #include "effect_errors.h"
39 #include "export/color.h"
40 #include "file_deal.h"
41 #include "file_ex.h"
42 #include "hilog_wrapper.h"
43 #include "hitrace_meter.h"
44 #include "image_packer.h"
45 #include "image_source.h"
46 #include "image_type.h"
47 #include "image_utils.h"
48 #include "iservice_registry.h"
49 #include "mem_mgr_client.h"
50 #include "mem_mgr_proxy.h"
51 #include "memory_guard.h"
52 #include "nlohmann/json.hpp"
53 #include "parameter.h"
54 #include "pixel_map.h"
55 #include "scene_board_judgement.h"
56 #include "system_ability_definition.h"
57 #include "tokenid_kit.h"
58 #include "uri.h"
59 #include "wallpaper_common.h"
60 #include "wallpaper_common_event_manager.h"
61 #include "wallpaper_manager_common_info.h"
62 #include "wallpaper_service.h"
63 #include "wallpaper_service_cb_proxy.h"
64 #include "want.h"
65 #include "window.h"
66
67 #ifndef THEME_SERVICE
68 #include "ability_manager_client.h"
69 #include "wallpaper_extension_ability_death_recipient.h"
70 #endif
71
72 namespace OHOS {
73 namespace WallpaperMgrService {
74 REGISTER_SYSTEM_ABILITY_BY_ID(WallpaperService, WALLPAPER_MANAGER_SERVICE_ID, true);
75
76 using namespace OHOS::Media;
77 using namespace OHOS::MiscServices;
78 using namespace OHOS::Security::AccessToken;
79 using namespace OHOS::AccountSA;
80
81 constexpr const char *WALLPAPER_SYSTEM_ORIG = "wallpaper_system_orig";
82 constexpr const char *WALLPAPER_HOME = "wallpaper_home";
83 constexpr const char *WALLPAPER_LOCK_ORIG = "wallpaper_lock_orig";
84 constexpr const char *WALLPAPER_LOCK = "wallpaper_lock";
85 constexpr const char *LIVE_WALLPAPER_SYSTEM_ORIG = "live_wallpaper_system_orig";
86 constexpr const char *LIVE_WALLPAPER_LOCK_ORIG = "live_wallpaper_lock_orig";
87 constexpr const char *CUSTOM_WALLPAPER_LOCK = "custom_lock.zip";
88 constexpr const char *CUSTOM_WALLPAPER_SYSTEM = "custom_system.zip";
89 constexpr const char *OHOS_WALLPAPER_BUNDLE_NAME = "com.ohos.launcher";
90 constexpr const char *SHOW_SYSTEM_SCREEN = "SHOW_SYSTEMSCREEN";
91 constexpr const char *SHOW_LOCK_SCREEN = "SHOW_LOCKSCREEN";
92 constexpr const char *SYSTEM_RES_TYPE = "SystemResType";
93 constexpr const char *LOCKSCREEN_RES_TYPE = "LockScreenResType";
94 constexpr const char *WALLPAPER_CHANGE = "wallpaperChange";
95 constexpr const char *COLOR_CHANGE = "colorChange";
96 constexpr const char *SCENEBOARD_BUNDLE_NAME = "com.ohos.sceneboard";
97
98 constexpr const char *WALLPAPER_USERID_PATH = "/data/service/el1/public/wallpaper/";
99 constexpr const char *WALLPAPER_SYSTEM_DIRNAME = "system";
100 constexpr const char *WALLPAPER_TMP_DIRNAME = "fwsettmp";
101 constexpr const char *WALLPAPER_LOCKSCREEN_DIRNAME = "lockscreen";
102 constexpr const char *WALLPAPER_DEFAULT_FILEFULLPATH = "/system/etc/wallpaperdefault.jpeg";
103 constexpr const char *WALLPAPER_DEFAULT_LOCK_FILEFULLPATH = "/system/etc/wallpaperlockdefault.jpeg";
104 constexpr const char *WALLPAPER_CROP_PICTURE = "crop_file";
105 constexpr const char *RESOURCE_PATH = "resource/themes/theme/";
106 constexpr const char *DEFAULT_PATH = "default/";
107 constexpr const char *MANIFEST = "manifest.json";
108 constexpr const char *RES = "resources/";
109 constexpr const char *HOME = "home/";
110 constexpr const char *LOCK = "lock/";
111 constexpr const char *BASE = "base/";
112 constexpr const char *LAND_PATH = "land/";
113 constexpr const char *HOME_UNFOLDED = "home/unfolded/";
114 constexpr const char *HOME_UNFOLDED2 = "home/unfolded2/";
115 constexpr const char *LOCK_UNFOLDED = "lock/unfolded/";
116 constexpr const char *LOCK_UNFOLDED2 = "lock/unfolded2/";
117 constexpr const char *IMAGE = "image";
118 constexpr const char *SRC = "src";
119 constexpr const char *NORMAL_LAND_WALLPAPER_HOME = "normal_land_wallpaper_home";
120 constexpr const char *UNFOLD1_PORT_WALLPAPER_HOME = "unfold1_port_wallpaper_home";
121 constexpr const char *UNFOLD1_LAND_WALLPAPER_HOME = "unfold1_land_wallpaper_home";
122 constexpr const char *UNFOLD2_PORT_WALLPAPER_HOME = "unfold2_port_wallpaper_home";
123 constexpr const char *UNFOLD2_LAND_WALLPAPER_HOME = "unfold2_land_wallpaper_home";
124 constexpr const char *NORMAL_LAND_WALLPAPER_LOCK = "normal_land_wallpaper_lock";
125 constexpr const char *UNFOLD1_PORT_WALLPAPER_LOCK = "unfold1_port_wallpaper_lock";
126 constexpr const char *UNFOLD1_LAND_WALLPAPER_LOCK = "unfold1_land_wallpaper_lock";
127 constexpr const char *UNFOLD2_PORT_WALLPAPER_LOCK = "unfold2_port_wallpaper_lock";
128 constexpr const char *UNFOLD2_LAND_WALLPAPER_LOCK = "unfold2_land_wallpaper_lock";
129 constexpr int64_t INIT_INTERVAL = 10000L;
130 constexpr int64_t DELAY_TIME = 1000L;
131 constexpr int64_t QUERY_USER_ID_INTERVAL = 300L;
132 constexpr int32_t FOO_MAX_LEN = 52428800;
133 constexpr int32_t MAX_RETRY_TIMES = 20;
134 constexpr int32_t QUERY_USER_MAX_RETRY_TIMES = 100;
135 constexpr int32_t DEFAULT_WALLPAPER_ID = -1;
136 constexpr int32_t DEFAULT_USER_ID = 0;
137 constexpr int32_t MAX_VIDEO_SIZE = 104857600;
138 constexpr int32_t OPTION_QUALITY = 100;
139
140 #ifndef THEME_SERVICE
141 constexpr int32_t CONNECT_EXTENSION_INTERVAL = 100;
142 constexpr int32_t DEFAULT_VALUE = -1;
143 constexpr int32_t CONNECT_EXTENSION_MAX_RETRY_TIMES = 50;
144 #endif
145
146 std::mutex WallpaperService::instanceLock_;
147
148 sptr<WallpaperService> WallpaperService::instance_;
149
150 std::shared_ptr<AppExecFwk::EventHandler> WallpaperService::serviceHandler_;
151
WallpaperService(int32_t systemAbilityId,bool runOnCreate)152 WallpaperService::WallpaperService(int32_t systemAbilityId, bool runOnCreate)
153 : SystemAbility(systemAbilityId, runOnCreate), WallpaperServiceStub(true),
154 state_(ServiceRunningState::STATE_NOT_START)
155 {
156 }
157
WallpaperService()158 WallpaperService::WallpaperService() : WallpaperServiceStub(true), state_(ServiceRunningState::STATE_NOT_START)
159 {
160 }
161
~WallpaperService()162 WallpaperService::~WallpaperService()
163 {
164 }
165
Init()166 int32_t WallpaperService::Init()
167 {
168 InitQueryUserId(QUERY_USER_MAX_RETRY_TIMES);
169 bool ret = Publish(this);
170 if (!ret) {
171 HILOG_ERROR("Publish failed!");
172 ReporterFault(FaultType::SERVICE_FAULT, FaultCode::SF_SERVICE_UNAVAILABLE);
173 return -1;
174 }
175 HILOG_INFO("Publish success.");
176 state_ = ServiceRunningState::STATE_RUNNING;
177 #ifndef THEME_SERVICE
178 StartExtensionAbility(CONNECT_EXTENSION_MAX_RETRY_TIMES);
179 #endif
180 return E_OK;
181 }
182
OnStart()183 void WallpaperService::OnStart()
184 {
185 HILOG_INFO("Enter OnStart.");
186 MemoryGuard cacheGuard;
187 if (state_ == ServiceRunningState::STATE_RUNNING) {
188 HILOG_ERROR("WallpaperService is already running.");
189 return;
190 }
191 InitData();
192 InitServiceHandler();
193 AddSystemAbilityListener(COMMON_EVENT_SERVICE_ID);
194 AddSystemAbilityListener(MEMORY_MANAGER_SA_ID);
195 auto cmd = std::make_shared<Command>(std::vector<std::string>({ "-all" }), "Show all",
196 [this](const std::vector<std::string> &input, std::string &output) -> bool {
197 output.append(
198 "WallpaperExtensionAbility\t: ExtensionInfo{" + std::string(OHOS_WALLPAPER_BUNDLE_NAME) + "}\n");
199 return true;
200 });
201 DumpHelper::GetInstance().RegisterCommand(cmd);
202 if (Init() != E_OK) {
203 auto callback = [=]() { Init(); };
204 serviceHandler_->PostTask(callback, INIT_INTERVAL);
205 HILOG_ERROR("Init failed. Try again 10s later.");
206 }
207 return;
208 }
209
OnAddSystemAbility(int32_t systemAbilityId,const std::string & deviceId)210 void WallpaperService::OnAddSystemAbility(int32_t systemAbilityId, const std::string &deviceId)
211 {
212 HILOG_INFO("OnAddSystemAbility systemAbilityId:%{public}d added!", systemAbilityId);
213 if (systemAbilityId == COMMON_EVENT_SERVICE_ID) {
214 int32_t times = 0;
215 RegisterSubscriber(times);
216 } else if (systemAbilityId == MEMORY_MANAGER_SA_ID) {
217 int32_t pid = getpid();
218 Memory::MemMgrClient::GetInstance().NotifyProcessStatus(pid, 1, 1, WALLPAPER_MANAGER_SERVICE_ID);
219 }
220 }
221
RegisterSubscriber(int32_t times)222 void WallpaperService::RegisterSubscriber(int32_t times)
223 {
224 MemoryGuard cacheGuard;
225 times++;
226 subscriber_ = std::make_shared<WallpaperCommonEventSubscriber>(*this);
227 bool subRes = OHOS::EventFwk::CommonEventManager::SubscribeCommonEvent(subscriber_);
228 if (!subRes && times <= MAX_RETRY_TIMES) {
229 HILOG_INFO("RegisterSubscriber failed!");
230 auto callback = [this, times]() { RegisterSubscriber(times); };
231 serviceHandler_->PostTask(callback, DELAY_TIME);
232 }
233 }
234
InitServiceHandler()235 void WallpaperService::InitServiceHandler()
236 {
237 HILOG_INFO("InitServiceHandler started.");
238 if (serviceHandler_ != nullptr) {
239 HILOG_ERROR("InitServiceHandler already init.");
240 return;
241 }
242 std::shared_ptr<AppExecFwk::EventRunner> runner =
243 AppExecFwk::EventRunner::Create("WallpaperService", AppExecFwk::ThreadMode::FFRT);
244 serviceHandler_ = std::make_shared<AppExecFwk::EventHandler>(runner);
245 }
246
OnStop()247 void WallpaperService::OnStop()
248 {
249 HILOG_INFO("OnStop started.");
250 if (state_ != ServiceRunningState::STATE_RUNNING) {
251 return;
252 }
253 serviceHandler_ = nullptr;
254 #ifndef THEME_SERVICE
255 connection_ = nullptr;
256 #endif
257 recipient_ = nullptr;
258 extensionRemoteObject_ = nullptr;
259 if (subscriber_ != nullptr) {
260 bool unSubscribeResult = OHOS::EventFwk::CommonEventManager::UnSubscribeCommonEvent(subscriber_);
261 subscriber_ = nullptr;
262 HILOG_INFO("UnregisterSubscriber end, unSubscribeResult = %{public}d", unSubscribeResult);
263 }
264 state_ = ServiceRunningState::STATE_NOT_START;
265 int32_t pid = getpid();
266 Memory::MemMgrClient::GetInstance().NotifyProcessStatus(pid, 1, 0, WALLPAPER_MANAGER_SERVICE_ID);
267 }
268
InitData()269 void WallpaperService::InitData()
270 {
271 HILOG_INFO("WallpaperService::initData --> start.");
272 wallpaperId_ = DEFAULT_WALLPAPER_ID;
273 int32_t userId = DEFAULT_USER_ID;
274 systemWallpaperMap_.Clear();
275 lockWallpaperMap_.Clear();
276 wallpaperTmpFullPath_ = std::string(WALLPAPER_USERID_PATH) + std::string(WALLPAPER_TMP_DIRNAME);
277 wallpaperCropPath_ = std::string(WALLPAPER_USERID_PATH) + std::string(WALLPAPER_CROP_PICTURE);
278 {
279 std::lock_guard<std::mutex> lock(wallpaperColorMtx_);
280 systemWallpaperColor_ = 0;
281 lockWallpaperColor_ = 0;
282 }
283 currentUserId_ = userId;
284 wallpaperEventMap_.clear();
285 appBundleName_ = SCENEBOARD_BUNDLE_NAME;
286 InitUserDir(userId);
287 UpdataWallpaperMap(userId, WALLPAPER_SYSTEM);
288 UpdataWallpaperMap(userId, WALLPAPER_LOCKSCREEN);
289 LoadWallpaperState();
290 ClearRedundantFile(userId, WALLPAPER_SYSTEM, WALLPAPER_SYSTEM_ORIG);
291 ClearRedundantFile(userId, WALLPAPER_LOCKSCREEN, WALLPAPER_LOCK_ORIG);
292 }
293
294 #ifndef THEME_SERVICE
AddWallpaperExtensionDeathRecipient(const sptr<IRemoteObject> & remoteObject)295 void WallpaperService::AddWallpaperExtensionDeathRecipient(const sptr<IRemoteObject> &remoteObject)
296 {
297 if (remoteObject != nullptr) {
298 std::lock_guard<std::mutex> lock(remoteObjectMutex_);
299 IPCObjectProxy *proxy = reinterpret_cast<IPCObjectProxy *>(remoteObject.GetRefPtr());
300 if (recipient_ == nullptr) {
301 recipient_ = sptr<IRemoteObject::DeathRecipient>(new WallpaperExtensionAbilityDeathRecipient(*this));
302 }
303 if (proxy != nullptr && !proxy->IsObjectDead()) {
304 HILOG_INFO("get remoteObject succeed.");
305 proxy->AddDeathRecipient(recipient_);
306 extensionRemoteObject_ = remoteObject;
307 }
308 }
309 }
310 #endif
311
RemoveExtensionDeathRecipient()312 void WallpaperService::RemoveExtensionDeathRecipient()
313 {
314 if (extensionRemoteObject_ != nullptr && recipient_ != nullptr) {
315 HILOG_INFO("Remove Extension DeathRecipient.");
316 std::lock_guard<std::mutex> lock(remoteObjectMutex_);
317 extensionRemoteObject_->RemoveDeathRecipient(recipient_);
318 recipient_ = nullptr;
319 extensionRemoteObject_ = nullptr;
320 }
321 }
322
InitQueryUserId(int32_t times)323 void WallpaperService::InitQueryUserId(int32_t times)
324 {
325 times--;
326 bool ret = InitUsersOnBoot();
327 if (!ret && times > 0) {
328 HILOG_DEBUG("InitQueryUserId failed!");
329 auto callback = [this, times]() { InitQueryUserId(times); };
330 serviceHandler_->PostTask(callback, QUERY_USER_ID_INTERVAL);
331 }
332 }
333
334 #ifndef THEME_SERVICE
StartExtensionAbility(int32_t times)335 void WallpaperService::StartExtensionAbility(int32_t times)
336 {
337 times--;
338 bool ret = ConnectExtensionAbility();
339 if (!ret && times > 0 && serviceHandler_ != nullptr) {
340 HILOG_ERROR("StartExtensionAbilty failed, remainder of the times: %{public}d", times);
341 auto callback = [this, times]() { StartExtensionAbility(times); };
342 serviceHandler_->PostTask(callback, CONNECT_EXTENSION_INTERVAL);
343 }
344 }
345 #endif
346
InitUsersOnBoot()347 bool WallpaperService::InitUsersOnBoot()
348 {
349 std::vector<AccountSA::OsAccountInfo> osAccountInfos;
350 ErrCode errCode = AccountSA::OsAccountManager::QueryAllCreatedOsAccounts(osAccountInfos);
351 if (errCode != ERR_OK || osAccountInfos.empty()) {
352 HILOG_ERROR("Query all created userIds failed, errCode:%{public}d", errCode);
353 return false;
354 }
355 for (const auto &osAccountInfo : osAccountInfos) {
356 int32_t userId = osAccountInfo.GetLocalId();
357 HILOG_INFO("InitUsersOnBoot Current userId: %{public}d", userId);
358 InitUserDir(userId);
359 UpdataWallpaperMap(userId, WALLPAPER_SYSTEM);
360 UpdataWallpaperMap(userId, WALLPAPER_LOCKSCREEN);
361 ClearRedundantFile(userId, WALLPAPER_SYSTEM, WALLPAPER_SYSTEM_ORIG);
362 ClearRedundantFile(userId, WALLPAPER_LOCKSCREEN, WALLPAPER_LOCK_ORIG);
363 }
364 return true;
365 }
366
ClearRedundantFile(int32_t userId,WallpaperType wallpaperType,std::string fileName)367 void WallpaperService::ClearRedundantFile(int32_t userId, WallpaperType wallpaperType, std::string fileName)
368 {
369 HILOG_DEBUG("ClearRedundantFile Current userId: %{public}d", userId);
370 std::string wallpaperFilePath = GetWallpaperDir(userId, wallpaperType) + "/" + fileName;
371 FileDeal::DeleteFile(wallpaperFilePath);
372 }
373
OnInitUser(int32_t userId)374 void WallpaperService::OnInitUser(int32_t userId)
375 {
376 if (userId < 0) {
377 HILOG_ERROR("userId error, userId = %{public}d", userId);
378 return;
379 }
380 std::string userDir = WALLPAPER_USERID_PATH + std::to_string(userId);
381 if (FileDeal::IsFileExist(userDir)) {
382 std::lock_guard<std::mutex> lock(mtx_);
383 if (!OHOS::ForceRemoveDirectory(userDir)) {
384 HILOG_ERROR("Force remove user directory path failed, errno %{public}d, userId:%{public}d", errno, userId);
385 return;
386 }
387 }
388 if (!InitUserDir(userId)) {
389 return;
390 }
391 UpdataWallpaperMap(userId, WALLPAPER_SYSTEM);
392 UpdataWallpaperMap(userId, WALLPAPER_LOCKSCREEN);
393 HILOG_INFO("OnInitUser success, userId = %{public}d", userId);
394 }
395
InitUserDir(int32_t userId)396 bool WallpaperService::InitUserDir(int32_t userId)
397 {
398 std::string userDir = WALLPAPER_USERID_PATH + std::to_string(userId);
399 if (!FileDeal::Mkdir(userDir)) {
400 HILOG_ERROR("Failed to create destination path, userId:%{public}d", userId);
401 return false;
402 }
403 std::string wallpaperSystemFilePath = userDir + "/" + WALLPAPER_SYSTEM_DIRNAME;
404 if (!FileDeal::Mkdir(wallpaperSystemFilePath)) {
405 HILOG_ERROR("Failed to create destination wallpaper system path, userId:%{public}d, type:%{public}s.", userId,
406 WALLPAPER_SYSTEM_DIRNAME);
407 return false;
408 }
409 std::string wallpaperLockScreenFilePath = userDir + "/" + WALLPAPER_LOCKSCREEN_DIRNAME;
410 if (!FileDeal::Mkdir(wallpaperLockScreenFilePath)) {
411 HILOG_ERROR("Failed to create destination wallpaper lockscreen path, userId:%{public}d, type:%{public}s.",
412 userId, WALLPAPER_LOCKSCREEN_DIRNAME);
413 return false;
414 }
415 return true;
416 }
417
RestoreUserResources(int32_t userId,WallpaperData & wallpaperData,WallpaperType wallpaperType)418 bool WallpaperService::RestoreUserResources(int32_t userId, WallpaperData &wallpaperData, WallpaperType wallpaperType)
419 {
420 if (!FileDeal::DeleteDir(GetWallpaperDir(userId, wallpaperType), false)) {
421 HILOG_ERROR("delete resources failed, userId:%{public}d, wallpaperType:%{public}d.", userId, wallpaperType);
422 return false;
423 }
424 std::string wallpaperPath = GetWallpaperDir(userId, wallpaperType);
425 wallpaperData = GetWallpaperDefaultPath(wallpaperType);
426 wallpaperData.userId = userId;
427 wallpaperData.allowBackup = true;
428 wallpaperData.resourceType = PICTURE;
429 wallpaperData.wallpaperId = DEFAULT_WALLPAPER_ID;
430 wallpaperData.liveWallpaperFile =
431 wallpaperPath + "/"
432 + (wallpaperType == WALLPAPER_SYSTEM ? LIVE_WALLPAPER_SYSTEM_ORIG : LIVE_WALLPAPER_LOCK_ORIG);
433 wallpaperData.customPackageUri =
434 wallpaperPath + "/" + (wallpaperType == WALLPAPER_SYSTEM ? CUSTOM_WALLPAPER_SYSTEM : CUSTOM_WALLPAPER_LOCK);
435 if (wallpaperData.wallpaperFile.empty()) {
436 HILOG_ERROR("get default path failed, userId:%{public}d, wallpaperType:%{public}d.", userId, wallpaperType);
437 return false;
438 }
439 HILOG_INFO("Restore user resources end.");
440 return true;
441 }
442
GetWallpaperDefaultPath(WallpaperType wallpaperType)443 WallpaperData WallpaperService::GetWallpaperDefaultPath(WallpaperType wallpaperType)
444 {
445 WallpaperData wallpaperData;
446 std::string manifest = MANIFEST;
447 std::string res = RES;
448 std::string base = BASE;
449 std::string land = LAND_PATH;
450 if (wallpaperType == WallpaperType::WALLPAPER_SYSTEM) {
451 wallpaperData.wallpaperFile = GetWallpaperPathInJson(HOME + manifest, HOME + base + res);
452 wallpaperData.normalLandFile = GetWallpaperPathInJson(HOME + base + land + manifest, HOME + base + land + res);
453 wallpaperData.unfoldedOnePortFile = GetWallpaperPathInJson(HOME_UNFOLDED + manifest, HOME_UNFOLDED + res);
454 wallpaperData.unfoldedOneLandFile =
455 GetWallpaperPathInJson(HOME_UNFOLDED + land + manifest, HOME_UNFOLDED + land + res);
456 wallpaperData.unfoldedTwoPortFile = GetWallpaperPathInJson(HOME_UNFOLDED2 + manifest, HOME_UNFOLDED2 + res);
457 wallpaperData.unfoldedTwoLandFile =
458 GetWallpaperPathInJson(HOME_UNFOLDED2 + land + manifest, HOME_UNFOLDED2 + land + res);
459 } else {
460 wallpaperData.wallpaperFile = GetWallpaperPathInJson(LOCK + manifest, LOCK + base + res);
461 wallpaperData.normalLandFile = GetWallpaperPathInJson(LOCK + base + land + manifest, LOCK + base + land + res);
462 wallpaperData.unfoldedOnePortFile = GetWallpaperPathInJson(LOCK_UNFOLDED + manifest, LOCK_UNFOLDED + res);
463 wallpaperData.unfoldedOneLandFile =
464 GetWallpaperPathInJson(LOCK_UNFOLDED + land + manifest, LOCK_UNFOLDED + land + res);
465 wallpaperData.unfoldedTwoPortFile = GetWallpaperPathInJson(LOCK_UNFOLDED2 + manifest, LOCK_UNFOLDED2 + res);
466 wallpaperData.unfoldedTwoLandFile =
467 GetWallpaperPathInJson(LOCK_UNFOLDED2 + land + manifest, LOCK_UNFOLDED2 + land + res);
468 }
469 if (wallpaperData.wallpaperFile.empty()) {
470 wallpaperData.wallpaperFile = (wallpaperType == WallpaperType::WALLPAPER_SYSTEM)
471 ? WALLPAPER_DEFAULT_FILEFULLPATH
472 : WALLPAPER_DEFAULT_LOCK_FILEFULLPATH;
473 }
474 return wallpaperData;
475 }
OnRemovedUser(int32_t userId)476 void WallpaperService::OnRemovedUser(int32_t userId)
477 {
478 if (userId < 0) {
479 HILOG_ERROR("userId error, userId = %{public}d", userId);
480 return;
481 }
482 ClearWallpaperLocked(userId, WALLPAPER_SYSTEM);
483 ClearWallpaperLocked(userId, WALLPAPER_LOCKSCREEN);
484 std::string userDir = WALLPAPER_USERID_PATH + std::to_string(userId);
485 std::lock_guard<std::mutex> lock(mtx_);
486 if (!OHOS::ForceRemoveDirectory(userDir)) {
487 HILOG_ERROR("Force remove user directory path failed, errno %{public}d", errno);
488 }
489 HILOG_INFO("OnRemovedUser end, userId = %{public}d", userId);
490 }
491
OnSwitchedUser(int32_t userId)492 void WallpaperService::OnSwitchedUser(int32_t userId)
493 {
494 if (userId < 0) {
495 HILOG_ERROR("userId error, userId = %{public}d", userId);
496 return;
497 }
498 if (userId == currentUserId_) {
499 HILOG_ERROR("userId not switch, userId = %{public}d", userId);
500 return;
501 }
502 currentUserId_ = userId;
503 RemoveExtensionDeathRecipient();
504 #ifndef THEME_SERVICE
505 ConnectExtensionAbility();
506 #endif
507 std::string userDir = WALLPAPER_USERID_PATH + std::to_string(userId);
508 if (!FileDeal::IsFileExist(userDir)) {
509 HILOG_INFO("User file is not exist, userId = %{public}d", userId);
510 InitUserDir(userId);
511 UpdataWallpaperMap(userId, WALLPAPER_SYSTEM);
512 UpdataWallpaperMap(userId, WALLPAPER_LOCKSCREEN);
513 }
514 LoadWallpaperState();
515 SendWallpaperChangeEvent(userId, WALLPAPER_SYSTEM);
516 SendWallpaperChangeEvent(userId, WALLPAPER_LOCKSCREEN);
517 SaveColor(userId, WALLPAPER_SYSTEM);
518 SaveColor(userId, WALLPAPER_LOCKSCREEN);
519 HILOG_INFO("OnSwitchedUser end, newUserId = %{public}d", userId);
520 }
521
GetWallpaperDir(int32_t userId,WallpaperType wallpaperType)522 std::string WallpaperService::GetWallpaperDir(int32_t userId, WallpaperType wallpaperType)
523 {
524 std::string userIdPath = WALLPAPER_USERID_PATH + std::to_string(userId);
525 std::string wallpaperFilePath;
526 if (wallpaperType == WALLPAPER_SYSTEM) {
527 wallpaperFilePath = userIdPath + "/" + WALLPAPER_SYSTEM_DIRNAME;
528 } else if (wallpaperType == WALLPAPER_LOCKSCREEN) {
529 wallpaperFilePath = userIdPath + "/" + WALLPAPER_LOCKSCREEN_DIRNAME;
530 }
531 return wallpaperFilePath;
532 }
533
GetFileNameFromMap(int32_t userId,WallpaperType wallpaperType,std::string & filePathName)534 bool WallpaperService::GetFileNameFromMap(int32_t userId, WallpaperType wallpaperType, std::string &filePathName)
535 {
536 auto iterator = wallpaperType == WALLPAPER_SYSTEM ? systemWallpaperMap_.Find(userId)
537 : lockWallpaperMap_.Find(userId);
538 if (!iterator.first) {
539 HILOG_ERROR("system wallpaper already cleared.");
540 return false;
541 }
542 HILOG_DEBUG("GetFileNameFromMap resourceType : %{public}d", static_cast<int32_t>(iterator.second.resourceType));
543 switch (iterator.second.resourceType) {
544 case PICTURE:
545 filePathName = iterator.second.wallpaperFile;
546 break;
547 case VIDEO:
548 filePathName = iterator.second.liveWallpaperFile;
549 break;
550 case DEFAULT:
551 filePathName = iterator.second.wallpaperFile;
552 break;
553 case PACKAGE:
554 filePathName = iterator.second.customPackageUri;
555 break;
556 default:
557 filePathName = "";
558 break;
559 }
560 return filePathName != "";
561 }
562
GetPictureFileName(int32_t userId,WallpaperType wallpaperType,std::string & filePathName)563 bool WallpaperService::GetPictureFileName(int32_t userId, WallpaperType wallpaperType, std::string &filePathName)
564 {
565 auto iterator = wallpaperType == WALLPAPER_SYSTEM ? systemWallpaperMap_.Find(userId)
566 : lockWallpaperMap_.Find(userId);
567 if (!iterator.first) {
568 HILOG_INFO("WallpaperType:%{public}d, WallpaperMap not found userId: %{public}d", wallpaperType, userId);
569 OnInitUser(userId);
570 iterator = wallpaperType == WALLPAPER_SYSTEM ? systemWallpaperMap_.Find(userId)
571 : lockWallpaperMap_.Find(userId);
572 }
573 filePathName = iterator.second.wallpaperFile;
574 HILOG_INFO("GetPictureFileName filePathName : %{public}s", filePathName.c_str());
575 return filePathName != "";
576 }
577
MakeWallpaperIdLocked()578 int32_t WallpaperService::MakeWallpaperIdLocked()
579 {
580 HILOG_INFO("MakeWallpaperIdLocked start.");
581 if (wallpaperId_ == INT32_MAX) {
582 wallpaperId_ = DEFAULT_WALLPAPER_ID;
583 }
584 return ++wallpaperId_;
585 }
586
UpdataWallpaperMap(int32_t userId,WallpaperType wallpaperType)587 void WallpaperService::UpdataWallpaperMap(int32_t userId, WallpaperType wallpaperType)
588 {
589 HILOG_INFO("updata wallpaperMap.");
590 std::string wallpaperPath = GetWallpaperDir(userId, wallpaperType);
591 std::string wallpaperFilePath =
592 wallpaperPath + "/" + (wallpaperType == WALLPAPER_SYSTEM ? WALLPAPER_HOME : WALLPAPER_LOCK);
593 ConcurrentMap<int32_t, WallpaperData> &wallpaperMap = [&]() -> ConcurrentMap<int32_t, WallpaperData>& {
594 if (wallpaperType == WALLPAPER_SYSTEM) {
595 return systemWallpaperMap_;
596 } else {
597 return lockWallpaperMap_;
598 }
599 }();
600 auto wallpaperData = GetWallpaperDefaultPath(wallpaperType);
601 wallpaperData.userId = userId;
602 wallpaperData.allowBackup = true;
603 wallpaperData.resourceType = PICTURE;
604 wallpaperData.wallpaperId = DEFAULT_WALLPAPER_ID;
605 wallpaperData.liveWallpaperFile =
606 wallpaperPath + "/"
607 + (wallpaperType == WALLPAPER_SYSTEM ? LIVE_WALLPAPER_SYSTEM_ORIG : LIVE_WALLPAPER_LOCK_ORIG);
608 wallpaperData.customPackageUri =
609 wallpaperPath + "/" + (wallpaperType == WALLPAPER_SYSTEM ? CUSTOM_WALLPAPER_SYSTEM : CUSTOM_WALLPAPER_LOCK);
610 if (FileDeal::IsFileExist(wallpaperFilePath)) {
611 wallpaperData.wallpaperFile = GetExistFilePath(
612 wallpaperPath + "/" + (wallpaperType == WALLPAPER_SYSTEM ? WALLPAPER_HOME : WALLPAPER_LOCK));
613 wallpaperData.normalLandFile = GetExistFilePath(
614 wallpaperPath + "/"
615 + (wallpaperType == WALLPAPER_SYSTEM ? NORMAL_LAND_WALLPAPER_HOME : NORMAL_LAND_WALLPAPER_LOCK));
616 wallpaperData.unfoldedOnePortFile = GetExistFilePath(
617 wallpaperPath + "/"
618 + (wallpaperType == WALLPAPER_SYSTEM ? UNFOLD1_PORT_WALLPAPER_HOME : UNFOLD1_PORT_WALLPAPER_LOCK));
619 wallpaperData.unfoldedOneLandFile = GetExistFilePath(
620 wallpaperPath + "/"
621 + (wallpaperType == WALLPAPER_SYSTEM ? UNFOLD1_LAND_WALLPAPER_HOME : UNFOLD1_LAND_WALLPAPER_LOCK));
622 wallpaperData.unfoldedTwoPortFile = GetExistFilePath(
623 wallpaperPath + "/"
624 + (wallpaperType == WALLPAPER_SYSTEM ? UNFOLD2_PORT_WALLPAPER_HOME : UNFOLD2_PORT_WALLPAPER_LOCK));
625 wallpaperData.unfoldedTwoLandFile = GetExistFilePath(
626 wallpaperPath + "/"
627 + (wallpaperType == WALLPAPER_SYSTEM ? UNFOLD2_LAND_WALLPAPER_HOME : UNFOLD2_LAND_WALLPAPER_LOCK));
628 }
629 wallpaperMap.InsertOrAssign(userId, wallpaperData);
630 }
631
GetColors(int32_t wallpaperType,std::vector<uint64_t> & colors)632 ErrorCode WallpaperService::GetColors(int32_t wallpaperType, std::vector<uint64_t> &colors)
633 {
634 if (wallpaperType == WALLPAPER_SYSTEM) {
635 std::lock_guard<std::mutex> lock(wallpaperColorMtx_);
636 colors.emplace_back(systemWallpaperColor_);
637 } else if (wallpaperType == WALLPAPER_LOCKSCREEN) {
638 std::lock_guard<std::mutex> lock(wallpaperColorMtx_);
639 colors.emplace_back(lockWallpaperColor_);
640 }
641 HILOG_INFO("GetColors Service End.");
642 return E_OK;
643 }
644
GetColorsV9(int32_t wallpaperType,std::vector<uint64_t> & colors)645 ErrorCode WallpaperService::GetColorsV9(int32_t wallpaperType, std::vector<uint64_t> &colors)
646 {
647 if (!IsSystemApp()) {
648 HILOG_ERROR("CallingApp is not SystemApp.");
649 return E_NOT_SYSTEM_APP;
650 }
651 return GetColors(wallpaperType, colors);
652 }
653
GetFile(int32_t wallpaperType,int32_t & wallpaperFd)654 ErrorCode WallpaperService::GetFile(int32_t wallpaperType, int32_t &wallpaperFd)
655 {
656 if (!CheckCallingPermission(WALLPAPER_PERMISSION_NAME_GET_WALLPAPER)) {
657 HILOG_ERROR("GetPixelMap no get permission!");
658 return E_NO_PERMISSION;
659 }
660 if (wallpaperType != static_cast<int32_t>(WALLPAPER_LOCKSCREEN)
661 && wallpaperType != static_cast<int32_t>(WALLPAPER_SYSTEM)) {
662 return E_PARAMETERS_INVALID;
663 }
664 auto type = static_cast<WallpaperType>(wallpaperType);
665 int32_t userId = QueryActiveUserId();
666 HILOG_INFO("QueryCurrentOsAccount userId: %{public}d", userId);
667 ErrorCode ret = GetImageFd(userId, type, wallpaperFd);
668 HILOG_INFO("GetImageFd fd:%{public}d, ret:%{public}d", wallpaperFd, ret);
669 return ret;
670 }
671
CompareColor(const uint64_t & localColor,const ColorManager::Color & color)672 bool WallpaperService::CompareColor(const uint64_t &localColor, const ColorManager::Color &color)
673 {
674 return localColor == color.PackValue();
675 }
676
SaveColor(int32_t userId,WallpaperType wallpaperType)677 bool WallpaperService::SaveColor(int32_t userId, WallpaperType wallpaperType)
678 {
679 uint32_t errorCode = 0;
680 OHOS::Media::SourceOptions opts;
681 opts.formatHint = "image/jpeg";
682 std::string pathName;
683 if (!GetPictureFileName(userId, wallpaperType, pathName)) {
684 return false;
685 }
686 std::unique_ptr<OHOS::Media::ImageSource> imageSource =
687 OHOS::Media::ImageSource::CreateImageSource(pathName, opts, errorCode);
688 if (errorCode != 0 || imageSource == nullptr) {
689 HILOG_ERROR("CreateImageSource failed!");
690 return false;
691 }
692 OHOS::Media::DecodeOptions decodeOpts;
693 std::unique_ptr<PixelMap> wallpaperPixelMap = imageSource->CreatePixelMap(decodeOpts, errorCode);
694 if (errorCode != 0) {
695 HILOG_ERROR("CreatePixelMap failed!");
696 return false;
697 }
698 auto colorPicker = Rosen::ColorPicker::CreateColorPicker(std::move(wallpaperPixelMap), errorCode);
699 if (errorCode != 0) {
700 HILOG_ERROR("CreateColorPicker failed!");
701 return false;
702 }
703 auto color = ColorManager::Color();
704 uint32_t ret = colorPicker->GetMainColor(color);
705 if (ret != Rosen::SUCCESS) {
706 HILOG_ERROR("GetMainColor failed ret is : %{public}d", ret);
707 return false;
708 }
709 OnColorsChange(wallpaperType, color);
710 return true;
711 }
712
SetWallpaper(int32_t fd,int32_t wallpaperType,int32_t length)713 ErrorCode WallpaperService::SetWallpaper(int32_t fd, int32_t wallpaperType, int32_t length)
714 {
715 StartAsyncTrace(HITRACE_TAG_MISC, "SetWallpaper", static_cast<int32_t>(TraceTaskId::SET_WALLPAPER));
716 ErrorCode wallpaperErrorCode = SetWallpaper(fd, wallpaperType, length, PICTURE);
717 FinishAsyncTrace(HITRACE_TAG_MISC, "SetWallpaper", static_cast<int32_t>(TraceTaskId::SET_WALLPAPER));
718 return wallpaperErrorCode;
719 }
720
SetWallpaperByPixelMap(std::shared_ptr<OHOS::Media::PixelMap> pixelMap,int32_t wallpaperType)721 ErrorCode WallpaperService::SetWallpaperByPixelMap(
722 std::shared_ptr<OHOS::Media::PixelMap> pixelMap, int32_t wallpaperType)
723 {
724 if (pixelMap == nullptr) {
725 HILOG_ERROR("pixelMap is nullptr");
726 return E_FILE_ERROR;
727 }
728 StartAsyncTrace(HITRACE_TAG_MISC, "SetWallpaper", static_cast<int32_t>(TraceTaskId::SET_WALLPAPER));
729 ErrorCode wallpaperErrorCode = SetWallpaperByPixelMap(pixelMap, wallpaperType, PICTURE);
730 FinishAsyncTrace(HITRACE_TAG_MISC, "SetWallpaper", static_cast<int32_t>(TraceTaskId::SET_WALLPAPER));
731 return wallpaperErrorCode;
732 }
733
SetWallpaperV9(int32_t fd,int32_t wallpaperType,int32_t length)734 ErrorCode WallpaperService::SetWallpaperV9(int32_t fd, int32_t wallpaperType, int32_t length)
735 {
736 if (!IsSystemApp()) {
737 HILOG_ERROR("CallingApp is not SystemApp.");
738 return E_NOT_SYSTEM_APP;
739 }
740 return SetWallpaper(fd, wallpaperType, length);
741 }
742
SetWallpaperV9ByPixelMap(std::shared_ptr<OHOS::Media::PixelMap> pixelMap,int32_t wallpaperType)743 ErrorCode WallpaperService::SetWallpaperV9ByPixelMap(
744 std::shared_ptr<OHOS::Media::PixelMap> pixelMap, int32_t wallpaperType)
745 {
746 if (!IsSystemApp()) {
747 HILOG_INFO("CallingApp is not SystemApp.");
748 return E_NOT_SYSTEM_APP;
749 }
750 if (pixelMap == nullptr) {
751 HILOG_ERROR("pixelMap is nullptr");
752 return E_FILE_ERROR;
753 }
754 return SetWallpaperByPixelMap(pixelMap, wallpaperType);
755 }
756
SetWallpaperBackupData(int32_t userId,WallpaperResourceType resourceType,const std::string & uriOrPixelMap,WallpaperType wallpaperType)757 ErrorCode WallpaperService::SetWallpaperBackupData(
758 int32_t userId, WallpaperResourceType resourceType, const std::string &uriOrPixelMap, WallpaperType wallpaperType)
759 {
760 HILOG_INFO("set wallpaper and backup data Start.");
761 if (!OHOS::FileExists(uriOrPixelMap)) {
762 return E_DEAL_FAILED;
763 }
764 if (!FileDeal::DeleteDir(GetWallpaperDir(userId, wallpaperType), false)) {
765 return E_DEAL_FAILED;
766 }
767 WallpaperData wallpaperData;
768 bool ret = GetWallpaperSafeLocked(userId, wallpaperType, wallpaperData);
769 if (!ret) {
770 HILOG_ERROR("GetWallpaperSafeLocked failed!");
771 return E_DEAL_FAILED;
772 }
773 if (resourceType == PICTURE || resourceType == DEFAULT) {
774 wallpaperData.wallpaperFile = GetWallpaperDir(userId, wallpaperType) + "/"
775 + (wallpaperType == WALLPAPER_SYSTEM ? WALLPAPER_HOME : WALLPAPER_LOCK);
776 }
777 wallpaperData.resourceType = resourceType;
778 wallpaperData.wallpaperId = MakeWallpaperIdLocked();
779 std::string wallpaperFile;
780 WallpaperService::GetWallpaperFile(resourceType, wallpaperData, wallpaperFile);
781 {
782 std::lock_guard<std::mutex> lock(mtx_);
783 if (!FileDeal::CopyFile(uriOrPixelMap, wallpaperFile)) {
784 HILOG_ERROR("CopyFile failed!");
785 FileDeal::DeleteFile(uriOrPixelMap);
786 return E_DEAL_FAILED;
787 }
788 if (!FileDeal::DeleteFile(uriOrPixelMap)) {
789 return E_DEAL_FAILED;
790 }
791 }
792 if (!SaveWallpaperState(userId, wallpaperType, resourceType)) {
793 HILOG_ERROR("Save wallpaper state failed!");
794 return E_DEAL_FAILED;
795 }
796 if (wallpaperType == WALLPAPER_SYSTEM) {
797 systemWallpaperMap_.InsertOrAssign(userId, wallpaperData);
798 } else if (wallpaperType == WALLPAPER_LOCKSCREEN) {
799 lockWallpaperMap_.InsertOrAssign(userId, wallpaperData);
800 }
801 if (!SendWallpaperChangeEvent(userId, wallpaperType)) {
802 HILOG_ERROR("Send wallpaper state failed!");
803 return E_DEAL_FAILED;
804 }
805 return E_OK;
806 }
807
GetWallpaperFile(WallpaperResourceType resourceType,const WallpaperData & wallpaperData,std::string & wallpaperFile)808 void WallpaperService::GetWallpaperFile(
809 WallpaperResourceType resourceType, const WallpaperData &wallpaperData, std::string &wallpaperFile)
810 {
811 switch (resourceType) {
812 case PICTURE:
813 wallpaperFile = wallpaperData.wallpaperFile;
814 break;
815 case DEFAULT:
816 wallpaperFile = wallpaperData.wallpaperFile;
817 break;
818 case VIDEO:
819 wallpaperFile = wallpaperData.liveWallpaperFile;
820 break;
821 case PACKAGE:
822 wallpaperFile = wallpaperData.customPackageUri;
823 break;
824 default:
825 HILOG_ERROR("Non-existent error type!");
826 break;
827 }
828 }
829
GetResType(int32_t userId,WallpaperType wallpaperType)830 WallpaperResourceType WallpaperService::GetResType(int32_t userId, WallpaperType wallpaperType)
831 {
832 if (wallpaperType == WALLPAPER_LOCKSCREEN) {
833 auto iterator = lockWallpaperMap_.Find(userId);
834 if (iterator.first) {
835 return iterator.second.resourceType;
836 }
837 } else if (wallpaperType == WALLPAPER_SYSTEM) {
838 auto iterator = systemWallpaperMap_.Find(userId);
839 if (iterator.first) {
840 return iterator.second.resourceType;
841 }
842 }
843 return WallpaperResourceType::DEFAULT;
844 }
845
SendEvent(const std::string & eventType)846 ErrorCode WallpaperService::SendEvent(const std::string &eventType)
847 {
848 HILOG_INFO("Send event start.");
849 if (!CheckCallingPermission(WALLPAPER_PERMISSION_NAME_SET_WALLPAPER)) {
850 HILOG_ERROR("Send event not set permission!");
851 return E_NO_PERMISSION;
852 }
853
854 int32_t userId = QueryActiveUserId();
855 WallpaperType wallpaperType;
856 WallpaperData data;
857 if (eventType == SHOW_SYSTEM_SCREEN) {
858 wallpaperType = WALLPAPER_SYSTEM;
859 } else if (eventType == SHOW_LOCK_SCREEN) {
860 wallpaperType = WALLPAPER_LOCKSCREEN;
861 } else {
862 HILOG_ERROR("Event type error!");
863 return E_PARAMETERS_INVALID;
864 }
865
866 if (!GetWallpaperSafeLocked(userId, wallpaperType, data)) {
867 HILOG_ERROR("Get wallpaper safe locked failed!");
868 return E_PARAMETERS_INVALID;
869 }
870 std::string uri;
871 GetFileNameFromMap(userId, WALLPAPER_SYSTEM, uri);
872 WallpaperChanged(wallpaperType, data.resourceType, uri);
873 return E_OK;
874 }
875
SendWallpaperChangeEvent(int32_t userId,WallpaperType wallpaperType)876 bool WallpaperService::SendWallpaperChangeEvent(int32_t userId, WallpaperType wallpaperType)
877 {
878 WallpaperData wallpaperData;
879 if (!GetWallpaperSafeLocked(userId, wallpaperType, wallpaperData)) {
880 HILOG_ERROR("GetWallpaperSafeLocked failed!");
881 return false;
882 }
883 shared_ptr<WallpaperCommonEventManager> wallpaperCommonEventManager = make_shared<WallpaperCommonEventManager>();
884 if (wallpaperType == WALLPAPER_SYSTEM) {
885 HILOG_INFO("Send wallpaper system setting message.");
886 wallpaperCommonEventManager->SendWallpaperSystemSettingMessage(wallpaperData.resourceType);
887 } else if (wallpaperType == WALLPAPER_LOCKSCREEN) {
888 HILOG_INFO("Send wallpaper lock setting message.");
889 wallpaperCommonEventManager->SendWallpaperLockSettingMessage(wallpaperData.resourceType);
890 }
891 HILOG_INFO("SetWallpaperBackupData callbackProxy_->OnCall start.");
892 if (callbackProxy_ != nullptr && (wallpaperData.resourceType == PICTURE || wallpaperData.resourceType == DEFAULT)) {
893 callbackProxy_->OnCall(wallpaperType);
894 }
895 std::string uri;
896 WallpaperChanged(wallpaperType, wallpaperData.resourceType, uri);
897 return true;
898 }
899
SetVideo(int32_t fd,int32_t wallpaperType,int32_t length)900 ErrorCode WallpaperService::SetVideo(int32_t fd, int32_t wallpaperType, int32_t length)
901 {
902 if (!IsSystemApp()) {
903 HILOG_ERROR("current app is not SystemApp.");
904 return E_NOT_SYSTEM_APP;
905 }
906 StartAsyncTrace(HITRACE_TAG_MISC, "SetVideo", static_cast<int32_t>(TraceTaskId::SET_VIDEO));
907 ErrorCode wallpaperErrorCode = SetWallpaper(fd, wallpaperType, length, VIDEO);
908 FinishAsyncTrace(HITRACE_TAG_MISC, "SetVideo", static_cast<int32_t>(TraceTaskId::SET_VIDEO));
909 return wallpaperErrorCode;
910 }
911
SetCustomWallpaper(int32_t fd,int32_t type,int32_t length)912 ErrorCode WallpaperService::SetCustomWallpaper(int32_t fd, int32_t type, int32_t length)
913 {
914 if (!IsSystemApp()) {
915 HILOG_ERROR("current app is not SystemApp.");
916 return E_NOT_SYSTEM_APP;
917 }
918 if (!CheckCallingPermission(WALLPAPER_PERMISSION_NAME_SET_WALLPAPER)) {
919 HILOG_ERROR("SetWallpaper no set permission!");
920 return E_NO_PERMISSION;
921 }
922 if (type != static_cast<int32_t>(WALLPAPER_LOCKSCREEN) && type != static_cast<int32_t>(WALLPAPER_SYSTEM)) {
923 return E_PARAMETERS_INVALID;
924 }
925 StartAsyncTrace(HITRACE_TAG_MISC, "SetCustomWallpaper", static_cast<int32_t>(TraceTaskId::SET_CUSTOM_WALLPAPER));
926 int32_t userId = QueryActiveUserId();
927 WallpaperType wallpaperType = static_cast<WallpaperType>(type);
928 WallpaperData wallpaperData;
929 if (!GetWallpaperSafeLocked(userId, wallpaperType, wallpaperData)) {
930 HILOG_ERROR("GetWallpaper data failed!");
931 return E_DEAL_FAILED;
932 }
933 if (!Rosen::SceneBoardJudgement::IsSceneBoardEnabled()) {
934 HILOG_ERROR("SceneBoard is not Enabled.");
935 return E_NO_PERMISSION;
936 }
937 if (!SaveWallpaperState(userId, wallpaperType, PACKAGE)) {
938 HILOG_ERROR("Save wallpaper state failed!");
939 return E_DEAL_FAILED;
940 }
941 ErrorCode wallpaperErrorCode = SetWallpaper(fd, wallpaperType, length, PACKAGE);
942 wallpaperData.resourceType = PACKAGE;
943 wallpaperData.wallpaperId = MakeWallpaperIdLocked();
944 if (wallpaperType == WALLPAPER_SYSTEM) {
945 systemWallpaperMap_.InsertOrAssign(userId, wallpaperData);
946 } else if (wallpaperType == WALLPAPER_LOCKSCREEN) {
947 lockWallpaperMap_.InsertOrAssign(userId, wallpaperData);
948 }
949 if (!SendWallpaperChangeEvent(userId, wallpaperType)) {
950 HILOG_ERROR("Send wallpaper state failed!");
951 return E_DEAL_FAILED;
952 }
953 FinishAsyncTrace(HITRACE_TAG_MISC, "SetCustomWallpaper", static_cast<int32_t>(TraceTaskId::SET_CUSTOM_WALLPAPER));
954 return wallpaperErrorCode;
955 }
956
GetPixelMap(int32_t wallpaperType,IWallpaperService::FdInfo & fdInfo)957 ErrorCode WallpaperService::GetPixelMap(int32_t wallpaperType, IWallpaperService::FdInfo &fdInfo)
958 {
959 HILOG_INFO("WallpaperService::getPixelMap start.");
960 if (!IsSystemApp()) {
961 HILOG_ERROR("CallingApp is not SystemApp.");
962 return E_NOT_SYSTEM_APP;
963 }
964 if (!CheckCallingPermission(WALLPAPER_PERMISSION_NAME_GET_WALLPAPER)) {
965 HILOG_ERROR("GetPixelMap no get permission!");
966 return E_NO_PERMISSION;
967 }
968 if (wallpaperType != static_cast<int32_t>(WALLPAPER_LOCKSCREEN)
969 && wallpaperType != static_cast<int32_t>(WALLPAPER_SYSTEM)) {
970 return E_PARAMETERS_INVALID;
971 }
972 auto type = static_cast<WallpaperType>(wallpaperType);
973 int32_t userId = QueryActiveUserId();
974 HILOG_INFO("QueryCurrentOsAccount userId: %{public}d", userId);
975 // current user's wallpaper is live video, not image
976 WallpaperResourceType resType = GetResType(userId, type);
977 if (resType != PICTURE && resType != DEFAULT) {
978 HILOG_ERROR("Current user's wallpaper is live video, not image.");
979 fdInfo.size = 0; // 0: empty file size
980 fdInfo.fd = -1; // -1: invalid file description
981 return E_OK;
982 }
983 ErrorCode ret = GetImageSize(userId, type, fdInfo.size);
984 if (ret != E_OK) {
985 HILOG_ERROR("GetImageSize failed!");
986 return ret;
987 }
988 ret = GetImageFd(userId, type, fdInfo.fd);
989 if (ret != E_OK) {
990 HILOG_ERROR("GetImageFd failed!");
991 return ret;
992 }
993 return E_OK;
994 }
995
GetPixelMapV9(int32_t wallpaperType,IWallpaperService::FdInfo & fdInfo)996 ErrorCode WallpaperService::GetPixelMapV9(int32_t wallpaperType, IWallpaperService::FdInfo &fdInfo)
997 {
998 return GetPixelMap(wallpaperType, fdInfo);
999 }
1000
GetWallpaperId(int32_t wallpaperType)1001 int32_t WallpaperService::GetWallpaperId(int32_t wallpaperType)
1002 {
1003 HILOG_INFO("WallpaperService::GetWallpaperId --> start.");
1004 int32_t iWallpaperId = -1;
1005 int32_t userId = QueryActiveUserId();
1006 HILOG_INFO("QueryCurrentOsAccount userId: %{public}d", userId);
1007 if (wallpaperType == WALLPAPER_LOCKSCREEN) {
1008 auto iterator = lockWallpaperMap_.Find(userId);
1009 if (iterator.first) {
1010 iWallpaperId = iterator.second.wallpaperId;
1011 }
1012 } else if (wallpaperType == WALLPAPER_SYSTEM) {
1013 auto iterator = systemWallpaperMap_.Find(userId);
1014 if (iterator.first) {
1015 iWallpaperId = iterator.second.wallpaperId;
1016 }
1017 }
1018 HILOG_INFO("WallpaperService::GetWallpaperId --> end ID[%{public}d]", iWallpaperId);
1019 return iWallpaperId;
1020 }
1021
IsChangePermitted()1022 bool WallpaperService::IsChangePermitted()
1023 {
1024 HILOG_INFO("IsChangePermitted wallpaper Start.");
1025 bool bFlag = CheckCallingPermission(WALLPAPER_PERMISSION_NAME_SET_WALLPAPER);
1026 return bFlag;
1027 }
1028
IsOperationAllowed()1029 bool WallpaperService::IsOperationAllowed()
1030 {
1031 HILOG_INFO("IsOperationAllowed wallpaper Start.");
1032 bool bFlag = CheckCallingPermission(WALLPAPER_PERMISSION_NAME_SET_WALLPAPER);
1033 return bFlag;
1034 }
1035
ResetWallpaper(int32_t wallpaperType)1036 ErrorCode WallpaperService::ResetWallpaper(int32_t wallpaperType)
1037 {
1038 HILOG_INFO("reset wallpaper Start.");
1039 bool permissionSet = CheckCallingPermission(WALLPAPER_PERMISSION_NAME_SET_WALLPAPER);
1040 if (!permissionSet) {
1041 HILOG_ERROR("reset wallpaper no set permission!");
1042 return E_NO_PERMISSION;
1043 }
1044 if (wallpaperType != static_cast<int32_t>(WALLPAPER_LOCKSCREEN)
1045 && wallpaperType != static_cast<int32_t>(WALLPAPER_SYSTEM)) {
1046 HILOG_ERROR("wallpaperType = %{public}d type not support ", wallpaperType);
1047 return E_PARAMETERS_INVALID;
1048 }
1049 WallpaperType type = static_cast<WallpaperType>(wallpaperType);
1050 int32_t userId = QueryActiveUserId();
1051 HILOG_INFO("QueryCurrentOsAccount userId: %{public}d", userId);
1052 if (!CheckUserPermissionById(userId)) {
1053 return E_USER_IDENTITY_ERROR;
1054 }
1055 ErrorCode wallpaperErrorCode = SetDefaultDataForWallpaper(userId, type);
1056 HILOG_INFO(" Set default data result[%{public}d]", wallpaperErrorCode);
1057 return wallpaperErrorCode;
1058 }
1059
ResetWallpaperV9(int32_t wallpaperType)1060 ErrorCode WallpaperService::ResetWallpaperV9(int32_t wallpaperType)
1061 {
1062 if (!IsSystemApp()) {
1063 HILOG_ERROR("CallingApp is not SystemApp.");
1064 return E_NOT_SYSTEM_APP;
1065 }
1066 return ResetWallpaper(wallpaperType);
1067 }
1068
SetDefaultDataForWallpaper(int32_t userId,WallpaperType wallpaperType)1069 ErrorCode WallpaperService::SetDefaultDataForWallpaper(int32_t userId, WallpaperType wallpaperType)
1070 {
1071 WallpaperData wallpaperData;
1072 if (!GetWallpaperSafeLocked(userId, wallpaperType, wallpaperData)) {
1073 return E_DEAL_FAILED;
1074 }
1075 if (!RestoreUserResources(userId, wallpaperData, wallpaperType)) {
1076 HILOG_ERROR("RestoreUserResources error!");
1077 return E_DEAL_FAILED;
1078 }
1079 if (!SaveWallpaperState(userId, wallpaperType, DEFAULT)) {
1080 HILOG_ERROR("Save wallpaper state failed!");
1081 return E_DEAL_FAILED;
1082 }
1083 wallpaperData.wallpaperId = DEFAULT_WALLPAPER_ID;
1084 wallpaperData.resourceType = DEFAULT;
1085 wallpaperData.allowBackup = true;
1086 if (wallpaperType == WALLPAPER_LOCKSCREEN) {
1087 lockWallpaperMap_.InsertOrAssign(userId, wallpaperData);
1088 } else if (wallpaperType == WALLPAPER_SYSTEM) {
1089 systemWallpaperMap_.InsertOrAssign(userId, wallpaperData);
1090 }
1091 if (!SendWallpaperChangeEvent(userId, wallpaperType)) {
1092 HILOG_ERROR("Send wallpaper state failed!");
1093 return E_DEAL_FAILED;
1094 }
1095 SaveColor(userId, wallpaperType);
1096 return E_OK;
1097 }
1098
On(const std::string & type,sptr<IWallpaperEventListener> listener)1099 ErrorCode WallpaperService::On(const std::string &type, sptr<IWallpaperEventListener> listener)
1100 {
1101 HILOG_DEBUG("WallpaperService::On in.");
1102 if (listener == nullptr) {
1103 HILOG_ERROR("WallpaperService::On listener is null.");
1104 return E_DEAL_FAILED;
1105 }
1106 if (type == WALLPAPER_CHANGE && !IsSystemApp()) {
1107 HILOG_ERROR("current app is not SystemApp.");
1108 return E_NOT_SYSTEM_APP;
1109 }
1110 std::lock_guard<std::mutex> autoLock(listenerMapMutex_);
1111 wallpaperEventMap_[type].insert_or_assign(IPCSkeleton::GetCallingTokenID(), listener);
1112 return E_OK;
1113 }
1114
Off(const std::string & type,sptr<IWallpaperEventListener> listener)1115 ErrorCode WallpaperService::Off(const std::string &type, sptr<IWallpaperEventListener> listener)
1116 {
1117 HILOG_DEBUG("WallpaperService::Off in.");
1118 (void)listener;
1119 if (type == WALLPAPER_CHANGE && !IsSystemApp()) {
1120 HILOG_ERROR("current app is not SystemApp.");
1121 return E_NOT_SYSTEM_APP;
1122 }
1123 std::lock_guard<std::mutex> autoLock(listenerMapMutex_);
1124 auto iter = wallpaperEventMap_.find(type);
1125 if (iter != wallpaperEventMap_.end()) {
1126 auto it = iter->second.find(IPCSkeleton::GetCallingTokenID());
1127 if (it != iter->second.end()) {
1128 it->second = nullptr;
1129 iter->second.erase(it);
1130 }
1131 }
1132 return E_OK;
1133 }
1134
RegisterWallpaperCallback(const sptr<IWallpaperCallback> callback)1135 bool WallpaperService::RegisterWallpaperCallback(const sptr<IWallpaperCallback> callback)
1136 {
1137 HILOG_INFO(" WallpaperService::RegisterWallpaperCallback.");
1138 callbackProxy_ = callback;
1139 return true;
1140 }
1141
GetWallpaperSafeLocked(int32_t userId,WallpaperType wallpaperType,WallpaperData & wallpaperData)1142 bool WallpaperService::GetWallpaperSafeLocked(int32_t userId, WallpaperType wallpaperType, WallpaperData &wallpaperData)
1143 {
1144 HILOG_DEBUG("GetWallpaperSafeLocked start.");
1145 auto iterator = wallpaperType == WALLPAPER_SYSTEM ? systemWallpaperMap_.Find(userId)
1146 : lockWallpaperMap_.Find(userId);
1147 if (!iterator.first) {
1148 HILOG_INFO("No Lock wallpaper? Not tracking for lock-only");
1149 UpdataWallpaperMap(userId, wallpaperType);
1150 iterator = wallpaperType == WALLPAPER_SYSTEM ? systemWallpaperMap_.Find(userId)
1151 : lockWallpaperMap_.Find(userId);
1152 if (!iterator.first) {
1153 HILOG_ERROR("Fail to get wallpaper data");
1154 return false;
1155 }
1156 }
1157 wallpaperData = iterator.second;
1158 ClearnWallpaperDataFile(wallpaperData);
1159 return true;
1160 }
1161
ClearWallpaperLocked(int32_t userId,WallpaperType wallpaperType)1162 void WallpaperService::ClearWallpaperLocked(int32_t userId, WallpaperType wallpaperType)
1163 {
1164 HILOG_INFO("Clear wallpaper Start.");
1165 auto iterator = wallpaperType == WALLPAPER_SYSTEM ? systemWallpaperMap_.Find(userId)
1166 : lockWallpaperMap_.Find(userId);
1167 if (!iterator.first) {
1168 HILOG_ERROR("Lock wallpaper already cleared.");
1169 return;
1170 }
1171 if (!iterator.second.wallpaperFile.empty() || !iterator.second.liveWallpaperFile.empty()) {
1172 if (wallpaperType == WALLPAPER_LOCKSCREEN) {
1173 lockWallpaperMap_.Erase(userId);
1174 } else if (wallpaperType == WALLPAPER_SYSTEM) {
1175 systemWallpaperMap_.Erase(userId);
1176 }
1177 }
1178 }
1179
CheckCallingPermission(const std::string & permissionName)1180 bool WallpaperService::CheckCallingPermission(const std::string &permissionName)
1181 {
1182 AccessTokenID callerToken = IPCSkeleton::GetCallingTokenID();
1183 int32_t result = AccessTokenKit::VerifyAccessToken(callerToken, permissionName);
1184 if (result != TypePermissionState::PERMISSION_GRANTED) {
1185 HILOG_ERROR("Check permission failed!");
1186 return false;
1187 }
1188 return true;
1189 }
1190
ReporterFault(FaultType faultType,FaultCode faultCode)1191 void WallpaperService::ReporterFault(FaultType faultType, FaultCode faultCode)
1192 {
1193 FaultMsg msg;
1194 msg.faultType = faultType;
1195 msg.errorCode = faultCode;
1196 ReportStatus nRet;
1197 if (faultType == FaultType::SERVICE_FAULT) {
1198 msg.moduleName = "WallpaperService";
1199 nRet = FaultReporter::ReportServiceFault(msg);
1200 } else {
1201 nRet = FaultReporter::ReportRuntimeFault(msg);
1202 }
1203
1204 if (nRet == ReportStatus::SUCCESS) {
1205 HILOG_INFO("ReporterFault success.");
1206 } else {
1207 HILOG_ERROR("ReporterFault failed!");
1208 }
1209 }
1210
Dump(int32_t fd,const std::vector<std::u16string> & args)1211 int32_t WallpaperService::Dump(int32_t fd, const std::vector<std::u16string> &args)
1212 {
1213 std::vector<std::string> argsStr;
1214 for (auto item : args) {
1215 argsStr.emplace_back(Str16ToStr8(item));
1216 }
1217
1218 if (DumpHelper::GetInstance().Dispatch(fd, argsStr)) {
1219 HILOG_ERROR("DumpHelper Dispatch failed!");
1220 return 0;
1221 }
1222 return 1;
1223 }
1224
1225 #ifndef THEME_SERVICE
ConnectExtensionAbility()1226 bool WallpaperService::ConnectExtensionAbility()
1227 {
1228 HILOG_DEBUG("ConnectAdapter.");
1229 MemoryGuard cacheGuard;
1230 AAFwk::Want want;
1231 want.SetElementName(OHOS_WALLPAPER_BUNDLE_NAME, "WallpaperExtAbility");
1232 ErrCode errCode = AAFwk::AbilityManagerClient::GetInstance()->Connect();
1233 if (errCode != ERR_OK) {
1234 HILOG_ERROR("connect ability server failed errCode=%{public}d", errCode);
1235 return false;
1236 }
1237 if (connection_ == nullptr) {
1238 connection_ = new WallpaperExtensionAbilityConnection(*this);
1239 }
1240 auto ret = AAFwk::AbilityManagerClient::GetInstance()->ConnectExtensionAbility(want, connection_, DEFAULT_VALUE);
1241 HILOG_INFO("ConnectExtensionAbility errCode=%{public}d", ret);
1242 return ret;
1243 }
1244 #endif
1245
IsSystemApp()1246 bool WallpaperService::IsSystemApp()
1247 {
1248 HILOG_INFO("IsSystemApp start.");
1249 uint64_t tokenId = IPCSkeleton::GetCallingFullTokenID();
1250 return TokenIdKit::IsSystemAppByFullTokenID(tokenId);
1251 }
1252
GetImageFd(int32_t userId,WallpaperType wallpaperType,int32_t & fd)1253 ErrorCode WallpaperService::GetImageFd(int32_t userId, WallpaperType wallpaperType, int32_t &fd)
1254 {
1255 HILOG_INFO("WallpaperService::GetImageFd start.");
1256 std::string filePathName;
1257 if (!GetFileNameFromMap(userId, wallpaperType, filePathName)) {
1258 return E_DEAL_FAILED;
1259 }
1260 if (GetResType(userId, wallpaperType) == WallpaperResourceType::PACKAGE) {
1261 HILOG_INFO("The current wallpaper is a custom wallpaper");
1262 return E_OK;
1263 }
1264 {
1265 std::lock_guard<std::mutex> lock(mtx_);
1266 fd = open(filePathName.c_str(), O_RDONLY, S_IREAD);
1267 }
1268 if (fd < 0) {
1269 HILOG_ERROR("Open file failed, errno %{public}d", errno);
1270 ReporterFault(FaultType::LOAD_WALLPAPER_FAULT, FaultCode::RF_FD_INPUT_FAILED);
1271 return E_DEAL_FAILED;
1272 }
1273 HILOG_INFO("fd = %{public}d", fd);
1274 return E_OK;
1275 }
1276
GetImageSize(int32_t userId,WallpaperType wallpaperType,int32_t & size)1277 ErrorCode WallpaperService::GetImageSize(int32_t userId, WallpaperType wallpaperType, int32_t &size)
1278 {
1279 HILOG_INFO("WallpaperService::GetImageSize start.");
1280 std::string filePathName;
1281 HILOG_INFO("userId = %{public}d", userId);
1282 if (!GetPictureFileName(userId, wallpaperType, filePathName)) {
1283 return E_DEAL_FAILED;
1284 }
1285
1286 if (!OHOS::FileExists(filePathName)) {
1287 HILOG_ERROR("file is not exist.");
1288 return E_NOT_FOUND;
1289 }
1290 std::lock_guard<std::mutex> lock(mtx_);
1291 FILE *fd = fopen(filePathName.c_str(), "rb");
1292 if (fd == nullptr) {
1293 HILOG_ERROR("fopen file failed, errno %{public}d", errno);
1294 return E_FILE_ERROR;
1295 }
1296 int32_t fend = fseek(fd, 0, SEEK_END);
1297 size = ftell(fd);
1298 int32_t fset = fseek(fd, 0, SEEK_SET);
1299 if (size <= 0 || fend != 0 || fset != 0) {
1300 HILOG_ERROR("ftell file failed or fseek file failed, errno %{public}d", errno);
1301 fclose(fd);
1302 return E_FILE_ERROR;
1303 }
1304 fclose(fd);
1305 return E_OK;
1306 }
1307
QueryActiveUserId()1308 int32_t WallpaperService::QueryActiveUserId()
1309 {
1310 std::vector<int32_t> ids;
1311 ErrCode errCode = AccountSA::OsAccountManager::QueryActiveOsAccountIds(ids);
1312 if (errCode != ERR_OK || ids.empty()) {
1313 HILOG_ERROR("Query active userid failed, errCode: %{public}d,", errCode);
1314 return DEFAULT_USER_ID;
1315 }
1316 return ids[0];
1317 }
1318
CheckUserPermissionById(int32_t userId)1319 bool WallpaperService::CheckUserPermissionById(int32_t userId)
1320 {
1321 OsAccountInfo osAccountInfo;
1322 ErrCode errCode = OsAccountManager::QueryOsAccountById(userId, osAccountInfo);
1323 if (errCode != ERR_OK) {
1324 HILOG_ERROR("Query os account info failed, errCode: %{public}d", errCode);
1325 return false;
1326 }
1327 HILOG_INFO("osAccountInfo GetType: %{public}d", static_cast<int32_t>(osAccountInfo.GetType()));
1328 if (osAccountInfo.GetType() == OsAccountType::GUEST) {
1329 HILOG_ERROR("The guest does not have permissions.");
1330 return false;
1331 }
1332 return true;
1333 }
1334
SetWallpaper(int32_t fd,int32_t wallpaperType,int32_t length,WallpaperResourceType resourceType)1335 ErrorCode WallpaperService::SetWallpaper(
1336 int32_t fd, int32_t wallpaperType, int32_t length, WallpaperResourceType resourceType)
1337 {
1338 int32_t userId = QueryActiveUserId();
1339 HILOG_INFO("QueryCurrentOsAccount userId: %{public}d", userId);
1340 if (!CheckUserPermissionById(userId)) {
1341 return E_USER_IDENTITY_ERROR;
1342 }
1343 ErrorCode errCode = CheckValid(wallpaperType, length, resourceType);
1344 if (errCode != E_OK) {
1345 return errCode;
1346 }
1347 std::string uri = wallpaperTmpFullPath_;
1348 char *paperBuf = new (std::nothrow) char[length]();
1349 if (paperBuf == nullptr) {
1350 return E_NO_MEMORY;
1351 }
1352 {
1353 std::lock_guard<std::mutex> lock(mtx_);
1354 if (read(fd, paperBuf, length) <= 0) {
1355 HILOG_ERROR("read fd failed!");
1356 delete[] paperBuf;
1357 return E_DEAL_FAILED;
1358 }
1359 mode_t mode = S_IRUSR | S_IWUSR;
1360 int32_t fdw = open(uri.c_str(), O_WRONLY | O_CREAT, mode);
1361 if (fdw < 0) {
1362 HILOG_ERROR("Open wallpaper tmpFullPath failed, errno %{public}d", errno);
1363 delete[] paperBuf;
1364 return E_DEAL_FAILED;
1365 }
1366 if (write(fdw, paperBuf, length) <= 0) {
1367 HILOG_ERROR("Write to fdw failed, errno %{public}d", errno);
1368 ReporterFault(FaultType::SET_WALLPAPER_FAULT, FaultCode::RF_DROP_FAILED);
1369 delete[] paperBuf;
1370 close(fdw);
1371 return E_DEAL_FAILED;
1372 }
1373 delete[] paperBuf;
1374 close(fdw);
1375 }
1376 WallpaperType type = static_cast<WallpaperType>(wallpaperType);
1377 ErrorCode wallpaperErrorCode = SetWallpaperBackupData(userId, resourceType, uri, type);
1378 if (resourceType == PICTURE) {
1379 SaveColor(userId, type);
1380 }
1381 return wallpaperErrorCode;
1382 }
1383
SetWallpaperByPixelMap(std::shared_ptr<OHOS::Media::PixelMap> pixelMap,int32_t wallpaperType,WallpaperResourceType resourceType)1384 ErrorCode WallpaperService::SetWallpaperByPixelMap(
1385 std::shared_ptr<OHOS::Media::PixelMap> pixelMap, int32_t wallpaperType, WallpaperResourceType resourceType)
1386 {
1387 if (pixelMap == nullptr) {
1388 HILOG_ERROR("pixelMap is nullptr");
1389 return E_FILE_ERROR;
1390 }
1391 int32_t userId = QueryActiveUserId();
1392 HILOG_INFO("QueryCurrentOsAccount userId: %{public}d", userId);
1393 if (!CheckUserPermissionById(userId)) {
1394 return E_USER_IDENTITY_ERROR;
1395 }
1396 std::string uri = wallpaperTmpFullPath_;
1397 ErrorCode errCode = WritePixelMapToFile(pixelMap, uri, wallpaperType, resourceType);
1398 if (errCode != E_OK) {
1399 HILOG_ERROR("WritePixelMapToFile failed!");
1400 return errCode;
1401 }
1402 WallpaperType type = static_cast<WallpaperType>(wallpaperType);
1403 ErrorCode wallpaperErrorCode = SetWallpaperBackupData(userId, resourceType, uri, type);
1404 if (resourceType == PICTURE) {
1405 SaveColor(userId, type);
1406 }
1407 return wallpaperErrorCode;
1408 }
1409
WritePixelMapToFile(std::shared_ptr<OHOS::Media::PixelMap> pixelMap,std::string wallpaperTmpFullPath,int32_t wallpaperType,WallpaperResourceType resourceType)1410 ErrorCode WallpaperService::WritePixelMapToFile(std::shared_ptr<OHOS::Media::PixelMap> pixelMap,
1411 std::string wallpaperTmpFullPath, int32_t wallpaperType, WallpaperResourceType resourceType)
1412 {
1413 if (pixelMap == nullptr) {
1414 HILOG_ERROR("pixelMap is nullptr");
1415 return E_FILE_ERROR;
1416 }
1417 std::stringbuf stringBuf;
1418 std::ostream ostream(&stringBuf);
1419 int32_t mapSize = WritePixelMapToStream(pixelMap, ostream);
1420 if (mapSize <= 0) {
1421 HILOG_ERROR("WritePixelMapToStream failed!");
1422 return E_WRITE_PARCEL_ERROR;
1423 }
1424 ErrorCode errCode = CheckValid(wallpaperType, mapSize, resourceType);
1425 if (errCode != E_OK) {
1426 HILOG_ERROR("CheckValid failed!");
1427 return errCode;
1428 }
1429 char *buffer = new (std::nothrow) char[mapSize]();
1430 if (buffer == nullptr) {
1431 HILOG_ERROR("buffer failed!");
1432 return E_NO_MEMORY;
1433 }
1434 stringBuf.sgetn(buffer, mapSize);
1435 {
1436 std::lock_guard<std::mutex> lock(mtx_);
1437 mode_t mode = S_IRUSR | S_IWUSR;
1438 int32_t fdw = open(wallpaperTmpFullPath.c_str(), O_WRONLY | O_CREAT, mode);
1439 if (fdw < 0) {
1440 HILOG_ERROR("Open wallpaper tmpFullPath failed, errno %{public}d", errno);
1441 delete[] buffer;
1442 return E_DEAL_FAILED;
1443 }
1444 if (write(fdw, buffer, mapSize) <= 0) {
1445 HILOG_ERROR("Write to fdw failed, errno %{public}d", errno);
1446 ReporterFault(FaultType::SET_WALLPAPER_FAULT, FaultCode::RF_DROP_FAILED);
1447 delete[] buffer;
1448 close(fdw);
1449 return E_DEAL_FAILED;
1450 }
1451 delete[] buffer;
1452 close(fdw);
1453 }
1454 return E_OK;
1455 }
1456
WritePixelMapToStream(std::shared_ptr<OHOS::Media::PixelMap> pixelMap,std::ostream & outputStream)1457 int64_t WallpaperService::WritePixelMapToStream(
1458 std::shared_ptr<OHOS::Media::PixelMap> pixelMap, std::ostream &outputStream)
1459 {
1460 if (pixelMap == nullptr) {
1461 HILOG_ERROR("pixelMap is nullptr");
1462 return 0;
1463 }
1464 OHOS::Media::ImagePacker imagePacker;
1465 OHOS::Media::PackOption option;
1466 option.format = "image/jpeg";
1467 option.quality = OPTION_QUALITY;
1468 option.numberHint = 1;
1469 std::set<std::string> formats;
1470 uint32_t ret = imagePacker.GetSupportedFormats(formats);
1471 if (ret != 0) {
1472 HILOG_ERROR("image packer get supported format failed, ret=%{public}u.", ret);
1473 }
1474
1475 imagePacker.StartPacking(outputStream, option);
1476 imagePacker.AddImage(*pixelMap);
1477 int64_t packedSize = 0;
1478 imagePacker.FinalizePacking(packedSize);
1479 HILOG_INFO("FrameWork WritePixelMapToStream End! packedSize=%{public}lld.", static_cast<long long>(packedSize));
1480 return packedSize;
1481 }
1482
OnColorsChange(WallpaperType wallpaperType,const ColorManager::Color & color)1483 void WallpaperService::OnColorsChange(WallpaperType wallpaperType, const ColorManager::Color &color)
1484 {
1485 std::vector<uint64_t> colors;
1486 if (wallpaperType == WALLPAPER_SYSTEM && !CompareColor(systemWallpaperColor_, color)) {
1487 {
1488 std::lock_guard<std::mutex> lock(wallpaperColorMtx_);
1489 systemWallpaperColor_ = color.PackValue();
1490 colors.emplace_back(systemWallpaperColor_);
1491 }
1492 NotifyColorChange(colors, WALLPAPER_SYSTEM);
1493 } else if (wallpaperType == WALLPAPER_LOCKSCREEN && !CompareColor(lockWallpaperColor_, color)) {
1494 {
1495 std::lock_guard<std::mutex> lock(wallpaperColorMtx_);
1496 lockWallpaperColor_ = color.PackValue();
1497 colors.emplace_back(lockWallpaperColor_);
1498 }
1499 NotifyColorChange(colors, WALLPAPER_LOCKSCREEN);
1500 }
1501 }
1502
CheckValid(int32_t wallpaperType,int32_t length,WallpaperResourceType resourceType)1503 ErrorCode WallpaperService::CheckValid(int32_t wallpaperType, int32_t length, WallpaperResourceType resourceType)
1504 {
1505 if (!CheckCallingPermission(WALLPAPER_PERMISSION_NAME_SET_WALLPAPER)) {
1506 HILOG_ERROR("SetWallpaper no set permission.");
1507 return E_NO_PERMISSION;
1508 }
1509 if (wallpaperType != static_cast<int32_t>(WALLPAPER_LOCKSCREEN)
1510 && wallpaperType != static_cast<int32_t>(WALLPAPER_SYSTEM)) {
1511 return E_PARAMETERS_INVALID;
1512 }
1513
1514 int32_t maxLength = resourceType == VIDEO ? MAX_VIDEO_SIZE : FOO_MAX_LEN;
1515 if (length <= 0 || length > maxLength) {
1516 return E_PARAMETERS_INVALID;
1517 }
1518 return E_OK;
1519 }
1520
WallpaperChanged(WallpaperType wallpaperType,WallpaperResourceType resType,const std::string & uri)1521 bool WallpaperService::WallpaperChanged(
1522 WallpaperType wallpaperType, WallpaperResourceType resType, const std::string &uri)
1523 {
1524 std::lock_guard<std::mutex> autoLock(listenerMapMutex_);
1525 auto it = wallpaperEventMap_.find(WALLPAPER_CHANGE);
1526 if (it != wallpaperEventMap_.end()) {
1527 for (auto iter = it->second.begin(); iter != it->second.end(); iter++) {
1528 if (iter->second == nullptr) {
1529 continue;
1530 }
1531 iter->second->OnWallpaperChange(wallpaperType, resType, uri);
1532 }
1533 return true;
1534 }
1535 return false;
1536 }
1537
NotifyColorChange(const std::vector<uint64_t> & colors,const WallpaperType & wallpaperType)1538 void WallpaperService::NotifyColorChange(const std::vector<uint64_t> &colors, const WallpaperType &wallpaperType)
1539 {
1540 std::lock_guard<std::mutex> autoLock(listenerMapMutex_);
1541 auto it = wallpaperEventMap_.find(COLOR_CHANGE);
1542 if (it != wallpaperEventMap_.end()) {
1543 for (auto iter = it->second.begin(); iter != it->second.end(); iter++) {
1544 if (iter->second == nullptr) {
1545 continue;
1546 }
1547 iter->second->OnColorsChange(colors, wallpaperType);
1548 }
1549 }
1550 }
1551
SaveWallpaperState(int32_t userId,WallpaperType wallpaperType,WallpaperResourceType resourceType)1552 bool WallpaperService::SaveWallpaperState(
1553 int32_t userId, WallpaperType wallpaperType, WallpaperResourceType resourceType)
1554 {
1555 WallpaperData systemData;
1556 WallpaperData lockScreenData;
1557 if (!GetWallpaperSafeLocked(userId, WALLPAPER_SYSTEM, systemData)
1558 || !GetWallpaperSafeLocked(userId, WALLPAPER_LOCKSCREEN, lockScreenData)) {
1559 return false;
1560 }
1561 nlohmann::json root;
1562 if (wallpaperType == WALLPAPER_SYSTEM) {
1563 root[SYSTEM_RES_TYPE] = static_cast<int32_t>(resourceType);
1564 root[LOCKSCREEN_RES_TYPE] = static_cast<int32_t>(lockScreenData.resourceType);
1565 } else {
1566 root[LOCKSCREEN_RES_TYPE] = static_cast<int32_t>(resourceType);
1567 root[SYSTEM_RES_TYPE] = static_cast<int32_t>(systemData.resourceType);
1568 }
1569 std::string json = root.dump();
1570 if (json.empty()) {
1571 HILOG_ERROR("write user config file failed. because json content is empty.");
1572 return false;
1573 }
1574
1575 std::string userPath = WALLPAPER_USERID_PATH + std::to_string(userId) + "/wallpapercfg";
1576 mode_t mode = S_IRUSR | S_IWUSR;
1577 int fd = open(userPath.c_str(), O_CREAT | O_WRONLY | O_SYNC, mode);
1578 if (fd <= 0) {
1579 HILOG_ERROR("open user config file failed!");
1580 return false;
1581 }
1582 ssize_t size = write(fd, json.c_str(), json.size());
1583 if (size <= 0) {
1584 HILOG_ERROR("write user config file failed!");
1585 close(fd);
1586 return false;
1587 }
1588 close(fd);
1589 return true;
1590 }
1591
LoadWallpaperState()1592 void WallpaperService::LoadWallpaperState()
1593 {
1594 int32_t userId = QueryActiveUserId();
1595 std::string userPath = WALLPAPER_USERID_PATH + std::to_string(userId) + "/wallpapercfg";
1596 int fd = open(userPath.c_str(), O_RDONLY, S_IREAD);
1597 if (fd <= 0) {
1598 HILOG_ERROR("open user config file failed!");
1599 return;
1600 }
1601 const size_t len = 255;
1602 char buf[len] = { 0 };
1603 ssize_t size = read(fd, buf, len);
1604 if (size <= 0) {
1605 HILOG_ERROR("read user config file failed!");
1606 close(fd);
1607 return;
1608 }
1609 close(fd);
1610
1611 if (buf[0] == '\0') {
1612 return;
1613 }
1614 WallpaperData systemData;
1615 WallpaperData lockScreenData;
1616 if (!GetWallpaperSafeLocked(userId, WALLPAPER_SYSTEM, systemData)
1617 || !GetWallpaperSafeLocked(userId, WALLPAPER_LOCKSCREEN, lockScreenData)) {
1618 return;
1619 }
1620 if (Json::accept(buf)) {
1621 auto root = nlohmann::json::parse(buf);
1622 if (root.contains(SYSTEM_RES_TYPE) && root[SYSTEM_RES_TYPE].is_number()) {
1623 systemData.resourceType = static_cast<WallpaperResourceType>(root[SYSTEM_RES_TYPE].get<int>());
1624 }
1625 if (root.contains(LOCKSCREEN_RES_TYPE) && root[SYSTEM_RES_TYPE].is_number()) {
1626 lockScreenData.resourceType = static_cast<WallpaperResourceType>(root[LOCKSCREEN_RES_TYPE].get<int>());
1627 }
1628 }
1629 }
1630
GetDefaultResDir()1631 std::string WallpaperService::GetDefaultResDir()
1632 {
1633 std::string resPath;
1634 CfgFiles *cfgFiles = GetCfgFiles(RESOURCE_PATH);
1635 if (cfgFiles != nullptr) {
1636 for (auto &cfgPath : cfgFiles->paths) {
1637 if (cfgPath != nullptr) {
1638 HILOG_DEBUG("GetCfgFiles path is :%{public}s", cfgPath);
1639 resPath = cfgPath + std::string(DEFAULT_PATH);
1640 break;
1641 }
1642 }
1643 FreeCfgFiles(cfgFiles);
1644 }
1645 return resPath;
1646 }
1647
GetWallpaperPathInJson(const std::string manifestName,const std::string filePath)1648 std::string WallpaperService::GetWallpaperPathInJson(const std::string manifestName, const std::string filePath)
1649 {
1650 std::string wallpaperPath;
1651 std::string resPath = GetDefaultResDir();
1652 if (resPath.empty() && !FileDeal::IsDirExist(resPath)) {
1653 HILOG_ERROR("wallpaperDefaultDir get failed!");
1654 return "";
1655 }
1656 std::string manifestFile = resPath + manifestName;
1657 std::ifstream file(manifestFile);
1658 if (!file.is_open()) {
1659 HILOG_ERROR("open fail:%{public}s", manifestFile.c_str());
1660 file.close();
1661 return "";
1662 }
1663 std::string content((std::istreambuf_iterator<char>(file)), std::istreambuf_iterator<char>());
1664 file.close();
1665 if (!nlohmann::json::accept(content)) {
1666 HILOG_ERROR("accept failed!");
1667 return "";
1668 }
1669 auto root = nlohmann::json::parse(content.c_str());
1670 if (root.contains(IMAGE) && root[IMAGE].contains(SRC)) {
1671 std::string srcValue = root[IMAGE][SRC];
1672 return GetExistFilePath(resPath + filePath + srcValue);
1673 }
1674 HILOG_ERROR("src not exist.");
1675 return "";
1676 }
1677
GetExistFilePath(const std::string & filePath)1678 std::string WallpaperService::GetExistFilePath(const std::string &filePath)
1679 {
1680 if (!FileDeal::IsFileExist(filePath)) {
1681 HILOG_ERROR("path file is not exist! %{public}s", filePath.c_str());
1682 return "";
1683 }
1684 return filePath;
1685 }
SetAllWallpapers(std::vector<WallpaperPictureInfo> allWallpaperInfos,int32_t wallpaperType)1686 ErrorCode WallpaperService::SetAllWallpapers(std::vector<WallpaperPictureInfo> allWallpaperInfos, int32_t wallpaperType)
1687 {
1688 StartAsyncTrace(HITRACE_TAG_MISC, "SetAllWallpapers", static_cast<int32_t>(TraceTaskId::SET_ALL_WALLPAPERS));
1689 ErrorCode wallpaperErrorCode = SetAllWallpapers(allWallpaperInfos, wallpaperType, PICTURE);
1690 FinishAsyncTrace(HITRACE_TAG_MISC, "SetAllWallpapers", static_cast<int32_t>(TraceTaskId::SET_ALL_WALLPAPERS));
1691 return wallpaperErrorCode;
1692 }
1693
SetAllWallpapers(std::vector<WallpaperPictureInfo> allWallpaperInfos,int32_t wallpaperType,WallpaperResourceType resourceType)1694 ErrorCode WallpaperService::SetAllWallpapers(
1695 std::vector<WallpaperPictureInfo> allWallpaperInfos, int32_t wallpaperType, WallpaperResourceType resourceType)
1696 {
1697 StartAsyncTrace(HITRACE_TAG_MISC, "SetAllWallpapers", static_cast<int32_t>(TraceTaskId::SET_ALL_WALLPAPERS));
1698 if (!IsSystemApp()) {
1699 HILOG_ERROR("CallingApp is not SystemApp.");
1700 return E_NOT_SYSTEM_APP;
1701 }
1702 int32_t userId = QueryActiveUserId();
1703 HILOG_INFO("SetAllWallpapers userId: %{public}d", userId);
1704 if (!CheckUserPermissionById(userId)) {
1705 return E_USER_IDENTITY_ERROR;
1706 }
1707 ErrorCode errCode;
1708 for (auto &wallpaperInfo : allWallpaperInfos) {
1709 wallpaperInfo.tempPath = std::string(WALLPAPER_USERID_PATH) + GetFoldStateName(wallpaperInfo.foldState) + "_"
1710 + GetRotateStateName(wallpaperInfo.rotateState);
1711 errCode = CheckValid(wallpaperType, wallpaperInfo.length, resourceType);
1712 if (errCode != E_OK) {
1713 return errCode;
1714 }
1715 errCode = WriteFdToFile(wallpaperInfo, wallpaperInfo.tempPath);
1716 if (errCode != E_OK) {
1717 DeleteTempResource(allWallpaperInfos);
1718 HILOG_ERROR("WriteFdToFile failed!");
1719 return errCode;
1720 }
1721 }
1722 WallpaperType type = static_cast<WallpaperType>(wallpaperType);
1723 std::string wallpaperPath = GetWallpaperDir(userId, type);
1724 FileDeal::DeleteDir(wallpaperPath, false);
1725 errCode = UpdateWallpaperData(allWallpaperInfos, userId, type);
1726 if (errCode != E_OK) {
1727 HILOG_ERROR("UpdateWallpaperData failed!");
1728 return errCode;
1729 }
1730 SaveColor(userId, type);
1731 if (!SendWallpaperChangeEvent(userId, type)) {
1732 HILOG_ERROR("Send wallpaper state failed!");
1733 return E_DEAL_FAILED;
1734 }
1735 FinishAsyncTrace(HITRACE_TAG_MISC, "SetAllWallpapers", static_cast<int32_t>(TraceTaskId::SET_ALL_WALLPAPERS));
1736 return errCode;
1737 }
1738
UpdateWallpaperData(std::vector<WallpaperPictureInfo> allWallpaperInfos,int32_t userId,WallpaperType wallpaperType)1739 ErrorCode WallpaperService::UpdateWallpaperData(
1740 std::vector<WallpaperPictureInfo> allWallpaperInfos, int32_t userId, WallpaperType wallpaperType)
1741 {
1742 ErrorCode errCode;
1743 WallpaperData wallpaperData;
1744 bool ret = GetWallpaperSafeLocked(userId, wallpaperType, wallpaperData);
1745 if (!ret) {
1746 HILOG_ERROR("GetWallpaperSafeLocked failed!");
1747 return E_DEAL_FAILED;
1748 }
1749 ClearnWallpaperDataFile(wallpaperData);
1750 errCode = SetAllWallpaperBackupData(allWallpaperInfos, userId, wallpaperType, wallpaperData);
1751 if (errCode != E_OK) {
1752 DeleteTempResource(allWallpaperInfos);
1753 HILOG_ERROR("SetAllWallpaperBackupData failed!");
1754 return errCode;
1755 }
1756 wallpaperData.resourceType = PICTURE;
1757 wallpaperData.wallpaperId = MakeWallpaperIdLocked();
1758 if (wallpaperType == WALLPAPER_SYSTEM) {
1759 systemWallpaperMap_.InsertOrAssign(userId, wallpaperData);
1760 } else if (wallpaperType == WALLPAPER_LOCKSCREEN) {
1761 lockWallpaperMap_.InsertOrAssign(userId, wallpaperData);
1762 }
1763 return E_OK;
1764 }
1765
WriteFdToFile(WallpaperPictureInfo & wallpaperPictureInfo,std::string & path)1766 ErrorCode WallpaperService::WriteFdToFile(WallpaperPictureInfo &wallpaperPictureInfo, std::string &path)
1767 {
1768 std::lock_guard<std::mutex> lock(mtx_);
1769 char *wallpaperBuffer = new (std::nothrow) char[wallpaperPictureInfo.length]();
1770 if (wallpaperBuffer == nullptr) {
1771 HILOG_ERROR("create wallpaperBuffer failed!");
1772 return E_NO_MEMORY;
1773 }
1774 if (read(wallpaperPictureInfo.fd, wallpaperBuffer, wallpaperPictureInfo.length) <= 0) {
1775 HILOG_ERROR("read fd failed!");
1776 delete[] wallpaperBuffer;
1777 return E_DEAL_FAILED;
1778 }
1779 mode_t mode = S_IRUSR | S_IWUSR;
1780 int32_t fdw = open(path.c_str(), O_WRONLY | O_CREAT, mode);
1781 if (fdw < 0) {
1782 HILOG_ERROR("Open wallpaper tmpFullPath failed, errno %{public}d", errno);
1783 delete[] wallpaperBuffer;
1784 return E_DEAL_FAILED;
1785 }
1786 if (write(fdw, wallpaperBuffer, wallpaperPictureInfo.length) <= 0) {
1787 HILOG_ERROR("Write to fdw failed, errno %{public}d", errno);
1788 ReporterFault(FaultType::SET_WALLPAPER_FAULT, FaultCode::RF_DROP_FAILED);
1789 delete[] wallpaperBuffer;
1790 close(fdw);
1791 return E_DEAL_FAILED;
1792 }
1793 delete[] wallpaperBuffer;
1794 close(fdw);
1795 return E_OK;
1796 }
1797
SetAllWallpaperBackupData(std::vector<WallpaperPictureInfo> allWallpaperInfos,int32_t userId,WallpaperType wallpaperType,WallpaperData & wallpaperData)1798 ErrorCode WallpaperService::SetAllWallpaperBackupData(std::vector<WallpaperPictureInfo> allWallpaperInfos,
1799 int32_t userId, WallpaperType wallpaperType, WallpaperData &wallpaperData)
1800 {
1801 HILOG_INFO("set All wallpaper and backup data Start.");
1802 for (auto &wallpaperInfo : allWallpaperInfos) {
1803 if (!OHOS::FileExists(wallpaperInfo.tempPath)) {
1804 return E_DEAL_FAILED;
1805 }
1806 UpdateWallpaperDataFile(wallpaperInfo, userId, wallpaperType, wallpaperData);
1807 std::string wallpaperFile = GetWallpaperDataFile(wallpaperInfo, userId, wallpaperType);
1808 {
1809 std::lock_guard<std::mutex> lock(mtx_);
1810 if (!FileDeal::CopyFile(wallpaperInfo.tempPath, wallpaperFile)) {
1811 HILOG_ERROR("CopyFile failed!");
1812 FileDeal::DeleteFile(wallpaperInfo.tempPath);
1813 return E_DEAL_FAILED;
1814 }
1815 if (!FileDeal::DeleteFile(wallpaperInfo.tempPath)) {
1816 return E_DEAL_FAILED;
1817 }
1818 }
1819 }
1820 return E_OK;
1821 }
1822
UpdateWallpaperDataFile(WallpaperPictureInfo & wallpaperPictureInfo,int32_t userId,WallpaperType wallpaperType,WallpaperData & wallpaperData)1823 void WallpaperService::UpdateWallpaperDataFile(WallpaperPictureInfo &wallpaperPictureInfo, int32_t userId,
1824 WallpaperType wallpaperType, WallpaperData &wallpaperData)
1825 {
1826 switch (static_cast<FoldState>(wallpaperPictureInfo.foldState)) {
1827 case FoldState::NORMAL:
1828 if (static_cast<RotateState>(wallpaperPictureInfo.rotateState) == RotateState::PORT) {
1829 wallpaperData.wallpaperFile = GetWallpaperDir(userId, wallpaperType) + "/"
1830 + (wallpaperType == WALLPAPER_SYSTEM ? WALLPAPER_HOME : WALLPAPER_LOCK);
1831 } else if (static_cast<RotateState>(wallpaperPictureInfo.rotateState) == RotateState::LAND) {
1832 wallpaperData.normalLandFile = GetWallpaperDataFile(wallpaperPictureInfo, userId, wallpaperType);
1833 }
1834 break;
1835
1836 case FoldState::UNFOLD_1:
1837 if (static_cast<RotateState>(wallpaperPictureInfo.rotateState) == RotateState::PORT) {
1838 wallpaperData.unfoldedOnePortFile = GetWallpaperDataFile(wallpaperPictureInfo, userId, wallpaperType);
1839 } else if (static_cast<RotateState>(wallpaperPictureInfo.rotateState) == RotateState::LAND) {
1840 wallpaperData.unfoldedOneLandFile = GetWallpaperDataFile(wallpaperPictureInfo, userId, wallpaperType);
1841 }
1842 break;
1843
1844 case FoldState::UNFOLD_2:
1845 if (static_cast<RotateState>(wallpaperPictureInfo.rotateState) == RotateState::PORT) {
1846 wallpaperData.unfoldedTwoPortFile = GetWallpaperDataFile(wallpaperPictureInfo, userId, wallpaperType);
1847 } else if (static_cast<RotateState>(wallpaperPictureInfo.rotateState) == RotateState::LAND) {
1848 wallpaperData.unfoldedTwoLandFile = GetWallpaperDataFile(wallpaperPictureInfo, userId, wallpaperType);
1849 }
1850 break;
1851 default:
1852 break;
1853 }
1854 }
1855
GetWallpaperDataFile(WallpaperPictureInfo & wallpaperPictureInfo,int32_t userId,WallpaperType wallpaperType)1856 std::string WallpaperService::GetWallpaperDataFile(
1857 WallpaperPictureInfo &wallpaperPictureInfo, int32_t userId, WallpaperType wallpaperType)
1858 {
1859 std::string wallpaperTypeName = wallpaperType == WALLPAPER_SYSTEM ? WALLPAPER_HOME : WALLPAPER_LOCK;
1860 std::string foldStateName = GetFoldStateName(wallpaperPictureInfo.foldState);
1861 std::string rotateStateName = GetRotateStateName(wallpaperPictureInfo.rotateState);
1862 if (foldStateName == "normal" && rotateStateName == "port") {
1863 return GetWallpaperDir(userId, wallpaperType) + "/" + wallpaperTypeName;
1864 }
1865 std::string wallpaperFile =
1866 GetWallpaperDir(userId, wallpaperType) + "/" + foldStateName + "_" + rotateStateName + "_" + wallpaperTypeName;
1867 return wallpaperFile;
1868 }
1869
ClearnWallpaperDataFile(WallpaperData & wallpaperData)1870 void WallpaperService::ClearnWallpaperDataFile(WallpaperData &wallpaperData)
1871 {
1872 wallpaperData.normalLandFile = "";
1873 wallpaperData.unfoldedOnePortFile = "";
1874 wallpaperData.unfoldedOneLandFile = "";
1875 wallpaperData.unfoldedTwoPortFile = "";
1876 wallpaperData.unfoldedTwoLandFile = "";
1877 }
1878
GetCorrespondWallpaper(int32_t wallpaperType,int32_t foldState,int32_t rotateState,IWallpaperService::FdInfo & fdInfo)1879 ErrorCode WallpaperService::GetCorrespondWallpaper(
1880 int32_t wallpaperType, int32_t foldState, int32_t rotateState, IWallpaperService::FdInfo &fdInfo)
1881 {
1882 StartAsyncTrace(
1883 HITRACE_TAG_MISC, "GetCorrespondWallpaper", static_cast<int32_t>(TraceTaskId::GET_CORRESPOND_WALLPAPER));
1884 HILOG_DEBUG("WallpaperService::GetCorrespondWallpaper start.");
1885 if (!IsSystemApp()) {
1886 HILOG_ERROR("CallingApp is not SystemApp.");
1887 return E_NOT_SYSTEM_APP;
1888 }
1889 if (!CheckCallingPermission(WALLPAPER_PERMISSION_NAME_GET_WALLPAPER)) {
1890 HILOG_ERROR("GetPixelMap no get permission!");
1891 return E_NO_PERMISSION;
1892 }
1893 if (wallpaperType != static_cast<int32_t>(WALLPAPER_LOCKSCREEN)
1894 && wallpaperType != static_cast<int32_t>(WALLPAPER_SYSTEM)) {
1895 return E_PARAMETERS_INVALID;
1896 }
1897 auto type = static_cast<WallpaperType>(wallpaperType);
1898 int32_t userId = QueryActiveUserId();
1899 HILOG_INFO("QueryCurrentOsAccount userId: %{public}d", userId);
1900 // current user's wallpaper is live video, not image
1901 WallpaperResourceType resType = GetResType(userId, type);
1902 if (resType != PICTURE && resType != DEFAULT) {
1903 HILOG_ERROR("Current user's wallpaper is live video, not image.");
1904 fdInfo.size = 0; // 0: empty file size
1905 fdInfo.fd = -1; // -1: invalid file description
1906 return E_OK;
1907 }
1908 ErrorCode ret = GetImageSize(userId, type, fdInfo.size, foldState, rotateState);
1909 if (ret != E_OK) {
1910 HILOG_ERROR("GetImageSize failed!");
1911 return ret;
1912 }
1913 ret = GetImageFd(userId, type, fdInfo.fd, foldState, rotateState);
1914 if (ret != E_OK) {
1915 HILOG_ERROR("GetImageFd failed!");
1916 return ret;
1917 }
1918 return E_OK;
1919 }
1920
GetImageSize(int32_t userId,WallpaperType wallpaperType,int32_t & size,int32_t foldState,int32_t rotateState)1921 ErrorCode WallpaperService::GetImageSize(
1922 int32_t userId, WallpaperType wallpaperType, int32_t &size, int32_t foldState, int32_t rotateState)
1923 {
1924 HILOG_DEBUG("WallpaperService::GetImageSize start.");
1925 std::string filePathName;
1926 if (!GetWallpaperDataPath(userId, wallpaperType, filePathName, foldState, rotateState)) {
1927 return E_DEAL_FAILED;
1928 }
1929 HILOG_INFO("GetImageSize file: %{public}s", filePathName.c_str());
1930 if (!OHOS::FileExists(filePathName)) {
1931 HILOG_ERROR("file is not exist.");
1932 return E_NOT_FOUND;
1933 }
1934 std::lock_guard<std::mutex> lock(mtx_);
1935 FILE *fd = fopen(filePathName.c_str(), "rb");
1936 if (fd == nullptr) {
1937 HILOG_ERROR("fopen file failed, errno %{public}d", errno);
1938 return E_FILE_ERROR;
1939 }
1940 int32_t fend = fseek(fd, 0, SEEK_END);
1941 size = ftell(fd);
1942 int32_t fset = fseek(fd, 0, SEEK_SET);
1943 if (size <= 0 || fend != 0 || fset != 0) {
1944 HILOG_ERROR("ftell file failed or fseek file failed, errno %{public}d", errno);
1945 fclose(fd);
1946 return E_FILE_ERROR;
1947 }
1948 fclose(fd);
1949 return E_OK;
1950 }
1951
GetImageFd(int32_t userId,WallpaperType wallpaperType,int32_t & fd,int32_t foldState,int32_t rotateState)1952 ErrorCode WallpaperService::GetImageFd(
1953 int32_t userId, WallpaperType wallpaperType, int32_t &fd, int32_t foldState, int32_t rotateState)
1954 {
1955 HILOG_DEBUG("WallpaperService::GetImageFd start.");
1956 std::string filePathName;
1957 if (!GetWallpaperDataPath(userId, wallpaperType, filePathName, foldState, rotateState)) {
1958 return E_DEAL_FAILED;
1959 }
1960 if (GetResType(userId, wallpaperType) == WallpaperResourceType::PACKAGE) {
1961 HILOG_INFO("The current wallpaper is a custom wallpaper");
1962 return E_OK;
1963 }
1964 fd = open(filePathName.c_str(), O_RDONLY, S_IREAD);
1965 if (fd < 0) {
1966 HILOG_ERROR("Open file failed, errno %{public}d", errno);
1967 ReporterFault(FaultType::LOAD_WALLPAPER_FAULT, FaultCode::RF_FD_INPUT_FAILED);
1968 return E_DEAL_FAILED;
1969 }
1970 HILOG_INFO("fd = %{public}d", fd);
1971 return E_OK;
1972 }
1973
GetWallpaperDataPath(int32_t userId,WallpaperType wallpaperType,std::string & filePathName,int32_t foldState,int32_t rotateState)1974 bool WallpaperService::GetWallpaperDataPath(
1975 int32_t userId, WallpaperType wallpaperType, std::string &filePathName, int32_t foldState, int32_t rotateState)
1976 {
1977 auto iterator = wallpaperType == WALLPAPER_SYSTEM ? systemWallpaperMap_.Find(userId)
1978 : lockWallpaperMap_.Find(userId);
1979 if (!iterator.first) {
1980 HILOG_INFO("WallpaperType:%{public}d, WallpaperMap not found userId: %{public}d", wallpaperType, userId);
1981 OnInitUser(userId);
1982 iterator = wallpaperType == WALLPAPER_SYSTEM ? systemWallpaperMap_.Find(userId)
1983 : lockWallpaperMap_.Find(userId);
1984 }
1985 filePathName = GetWallpaperPath(foldState, rotateState, iterator.second);
1986 return filePathName != "";
1987 }
1988
GetWallpaperPath(int32_t foldState,int32_t rotateState,WallpaperData & wallpaperData)1989 std::string WallpaperService::GetWallpaperPath(int32_t foldState, int32_t rotateState, WallpaperData &wallpaperData)
1990 {
1991 std::string wallpaperFilePath;
1992 if (foldState == static_cast<int32_t>(FoldState::UNFOLD_2)) {
1993 if (rotateState == static_cast<int32_t>(RotateState::LAND)) {
1994 wallpaperFilePath = wallpaperData.unfoldedTwoLandFile;
1995 if (wallpaperFilePath != "") {
1996 return wallpaperFilePath;
1997 }
1998 }
1999 wallpaperFilePath = wallpaperData.unfoldedTwoPortFile;
2000 if (wallpaperFilePath != "") {
2001 return wallpaperFilePath;
2002 }
2003 wallpaperFilePath = wallpaperData.wallpaperFile;
2004 }
2005 if (foldState == static_cast<int32_t>(FoldState::UNFOLD_1)) {
2006 if (rotateState == static_cast<int32_t>(RotateState::LAND)) {
2007 wallpaperFilePath = wallpaperData.unfoldedOneLandFile;
2008 if (wallpaperFilePath != "") {
2009 return wallpaperFilePath;
2010 }
2011 }
2012 wallpaperFilePath = wallpaperData.unfoldedOnePortFile;
2013 if (wallpaperFilePath != "") {
2014 return wallpaperFilePath;
2015 }
2016 wallpaperFilePath = wallpaperData.wallpaperFile;
2017 }
2018 if (foldState == static_cast<int32_t>(FoldState::NORMAL)) {
2019 if (rotateState == static_cast<int32_t>(RotateState::LAND)) {
2020 wallpaperFilePath = wallpaperData.normalLandFile;
2021 if (wallpaperFilePath != "") {
2022 return wallpaperFilePath;
2023 }
2024 }
2025 wallpaperFilePath = wallpaperData.wallpaperFile;
2026 }
2027 return wallpaperFilePath;
2028 }
2029
DeleteTempResource(std::vector<WallpaperPictureInfo> & tempResourceFiles)2030 void WallpaperService::DeleteTempResource(std::vector<WallpaperPictureInfo> &tempResourceFiles)
2031 {
2032 for (auto &wallpaperFile : tempResourceFiles) {
2033 FileDeal::DeleteFile(wallpaperFile.tempPath);
2034 }
2035 }
2036
GetFoldStateName(FoldState foldState)2037 std::string WallpaperService::GetFoldStateName(FoldState foldState)
2038 {
2039 std::string foldStateName;
2040 switch (foldState) {
2041 case FoldState::NORMAL:
2042 foldStateName = "normal";
2043 break;
2044 case FoldState::UNFOLD_1:
2045 foldStateName = "unfold1";
2046 break;
2047 case FoldState::UNFOLD_2:
2048 foldStateName = "unfold2";
2049 break;
2050 default:
2051 break;
2052 }
2053 return foldStateName;
2054 }
2055
GetRotateStateName(RotateState rotateState)2056 std::string WallpaperService::GetRotateStateName(RotateState rotateState)
2057 {
2058 std::string rotateStateName;
2059 switch (rotateState) {
2060 case RotateState::PORT:
2061 rotateStateName = "port";
2062 break;
2063 case RotateState::LAND:
2064 rotateStateName = "land";
2065 break;
2066 default:
2067 break;
2068 }
2069 return rotateStateName;
2070 }
2071 } // namespace WallpaperMgrService
2072 } // namespace OHOS
2073