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 "wallpaper_service.h"
16
17 #include <display_type.h>
18 #include <fcntl.h>
19 #include <rs_surface_node.h>
20 #include <sys/sendfile.h>
21 #include <sys/stat.h>
22 #include <sys/types.h>
23 #include <unistd.h>
24 #include <window_manager.h>
25
26 #include <cerrno>
27 #include <cstdio>
28 #include <cstdlib>
29 #include <cstring>
30 #include <iostream>
31 #include <thread>
32
33 #include "ability_manager_client.h"
34 #include "accesstoken_adapter.h"
35 #include "bundle_mgr_proxy.h"
36 #include "canvas.h"
37 #include "color_picker.h"
38 #include "command.h"
39 #include "directory_ex.h"
40 #include "dump_helper.h"
41 #include "effect_errors.h"
42 #include "export/color.h"
43 #include "file_deal.h"
44 #include "file_ex.h"
45 #include "hilog_wrapper.h"
46 #include "hitrace_meter.h"
47 #include "image/bitmap.h"
48 #include "image_packer.h"
49 #include "image_source.h"
50 #include "image_type.h"
51 #include "image_utils.h"
52 #include "iservice_registry.h"
53 #include "pen.h"
54 #include "pixel_map.h"
55 #include "surface.h"
56 #include "system_ability_definition.h"
57 #include "wallpaper_common.h"
58 #include "wallpaper_common_event.h"
59 #include "wallpaper_service_cb_proxy.h"
60 #include "wallpaper_extension_ability_death_recipient.h"
61 #include "window.h"
62 #include "memory_guard.h"
63
64 namespace OHOS {
65 namespace WallpaperMgrService {
66 REGISTER_SYSTEM_ABILITY_BY_ID(WallpaperService, WALLPAPER_MANAGER_SERVICE_ID, true);
67
68 using namespace OHOS::Media;
69 using namespace OHOS::MiscServices;
70
71 const std::string WallpaperService::WALLPAPER = "wallpaper_orig";
72 const std::string WallpaperService::WALLPAPER_CROP = "wallpaper";
73 const std::string WallpaperService::WALLPAPER_LOCK_ORIG = "wallpaper_lock_orig";
74 const std::string WallpaperService::WALLPAPER_LOCK_CROP = "wallpaper_lock";
75 const std::string WallpaperService::WALLPAPER_BUNDLE_NAME = "com.ohos.launcher";
76
77 const std::int64_t INIT_INTERVAL = 10000L;
78 const std::int64_t DELAY_TIME = 1000L;
79 constexpr int HALF = 2;
80 constexpr int32_t CONNECT_EXTENSION_INTERVAL = 500000;
81 constexpr int32_t CONNECT_EXTENSION_MAX_RETRY_TIMES = 360;
82 constexpr int HUNDRED = 100;
83 constexpr int FOO_MAX_LEN = 52428800;
84 constexpr int MAX_RETRY_TIMES = 20;
85 constexpr int32_t DEFAULT_WALLPAPER_ID = -1;
86 std::mutex WallpaperService::instanceLock_;
87
88 sptr<WallpaperService> WallpaperService::instance_;
89
90 std::shared_ptr<AppExecFwk::EventHandler> WallpaperService::serviceHandler_;
91
WallpaperService(int32_t systemAbilityId,bool runOnCreate)92 WallpaperService::WallpaperService(int32_t systemAbilityId, bool runOnCreate)
93 : SystemAbility(systemAbilityId, runOnCreate), state_(ServiceRunningState::STATE_NOT_START)
94 {
95 }
96
WallpaperService()97 WallpaperService::WallpaperService() : state_(ServiceRunningState::STATE_NOT_START)
98 {
99 }
100
~WallpaperService()101 WallpaperService::~WallpaperService()
102 {
103 }
104
GetInstance()105 sptr<WallpaperService> WallpaperService::GetInstance()
106 {
107 if (instance_ == nullptr) {
108 std::lock_guard<std::mutex> autoLock(instanceLock_);
109 if (instance_ == nullptr) {
110 instance_ = new WallpaperService();
111 }
112 }
113 return instance_;
114 }
115
Init()116 int32_t WallpaperService::Init()
117 {
118 bool ret = Publish(this);
119 if (!ret) {
120 HILOG_ERROR("Publish failed.");
121 ReporterFault(FaultType::SERVICE_FAULT, FaultCode::SF_SERVICE_UNAVAIABLE);
122 return -1;
123 }
124 HILOG_INFO("Publish success.");
125 state_ = ServiceRunningState::STATE_RUNNING;
126 return E_OK;
127 }
128
OnStart()129 void WallpaperService::OnStart()
130 {
131 HILOG_INFO("Enter OnStart.");
132 MemoryGuard cacheGuard;
133 if (state_ == ServiceRunningState::STATE_RUNNING) {
134 HILOG_ERROR("WallpaperService is already running.");
135 return;
136 }
137 InitData();
138 InitServiceHandler();
139 AddSystemAbilityListener(COMMON_EVENT_SERVICE_ID);
140 std::thread(&WallpaperService::StartWallpaperExtension, this).detach();
141 int uid = static_cast<int>(IPCSkeleton::GetCallingUid());
142 auto cmd = std::make_shared<Command>(std::vector<std::string>({ "-all" }), "Show all",
143 [this, uid](const std::vector<std::string> &input, std::string &output) -> bool {
144 int32_t height = GetWallpaperMinHeight();
145 int32_t width = GetWallpaperMinWidth();
146 std::string bundleName(WALLPAPER_BUNDLE_NAME);
147 WPGetBundleNameByUid(uid, bundleName);
148 output.append("height\t\t\t: " + std::to_string(height) + "\n")
149 .append("width\t\t\t: " + std::to_string(width) + "\n")
150 .append("WallpaperExtension\t: ExtensionInfo{" + bundleName + "}\n");
151 return true;
152 });
153 DumpHelper::GetInstance().RegisterCommand(cmd);
154 StatisticReporter::StartTimerThread();
155 if (Init() != 0) {
156 auto callback = [=]() { Init(); };
157 serviceHandler_->PostTask(callback, INIT_INTERVAL);
158 HILOG_ERROR("Init failed. Try again 10s later");
159 return;
160 }
161 return;
162 }
163
OnAddSystemAbility(int32_t systemAbilityId,const std::string & deviceId)164 void WallpaperService::OnAddSystemAbility(int32_t systemAbilityId, const std::string &deviceId)
165 {
166 HILOG_INFO("OnAddSystemAbility systemAbilityId:%{public}d added!", systemAbilityId);
167 if (systemAbilityId == COMMON_EVENT_SERVICE_ID) {
168 int times = 0;
169 RegisterSubscriber(times);
170 }
171 }
172
RegisterSubscriber(int times)173 void WallpaperService::RegisterSubscriber(int times)
174 {
175 MemoryGuard cacheGuard;
176 times++;
177 bool subRes = WallpaperCommonEvent::RegisterSubscriber();
178 if (subRes == false && times <= MAX_RETRY_TIMES) {
179 HILOG_INFO("RegisterSubscriber failed");
180 auto callback = [this, times]() { RegisterSubscriber(times); };
181 serviceHandler_->PostTask(callback, DELAY_TIME);
182 }
183 }
184
InitServiceHandler()185 void WallpaperService::InitServiceHandler()
186 {
187 HILOG_INFO("InitServiceHandler started.");
188 if (serviceHandler_ != nullptr) {
189 HILOG_ERROR("InitServiceHandler already init.");
190 return;
191 }
192 std::shared_ptr<AppExecFwk::EventRunner> runner = AppExecFwk::EventRunner::Create("WallpaperService");
193 serviceHandler_ = std::make_shared<AppExecFwk::EventHandler>(runner);
194
195 HILOG_INFO("InitServiceHandler succeeded.");
196 }
197
OnStop()198 void WallpaperService::OnStop()
199 {
200 HILOG_INFO("OnStop started.");
201 if (state_ != ServiceRunningState::STATE_RUNNING) {
202 return;
203 }
204 serviceHandler_ = nullptr;
205 recipient_ = nullptr;
206 state_ = ServiceRunningState::STATE_NOT_START;
207 HILOG_INFO("OnStop end.");
208 }
209
InitData()210 void WallpaperService::InitData()
211 {
212 HILOG_INFO("WallpaperService::initData --> start ");
213 userId_ = 0;
214 wallpaperId_ = DEFAULT_WALLPAPER_ID;
215 wallpaperMap_.Clear();
216 lockWallpaperMap_.Clear();
217 userId_ = GetUserId();
218 std::string userIdPath = GetWallpaperDir();
219 this->wallpaperLockScreenFilePath_ = userIdPath + "/" + WALLPAPER_LOCKSCREEN_DIRNAME;
220 this->wallpaperSystemFilePath_ = userIdPath + "/" + WALLPAPER_SYSTEM_DIRNAME;
221 wallpaperLockScreenFileFullPath_ = wallpaperLockScreenFilePath_ + "/" + WALLPAPER_LOCK_ORIG;
222 wallpaperLockScreenCropFileFullPath_ = wallpaperLockScreenFilePath_ + "/" + WALLPAPER_LOCK_CROP;
223 wallpaperSystemCropFileFullPath_ = wallpaperSystemFilePath_ + "/" + WALLPAPER_CROP;
224 wallpaperSystemFileFullPath_ = wallpaperSystemFilePath_ + "/" + WALLPAPER;
225 wallpaperTmpFullPath_ = wallpaperSystemFilePath_ + "/" + WALLPAPER_TMP_DIRNAME;
226 wallpaperCropPath = wallpaperSystemFilePath_ + "/" + WALLPAPER_CROP_PICTURE;
227 LoadSettingsLocked(userId_, true);
228 SaveColor(WALLPAPER_SYSTEM);
229 SaveColor(WALLPAPER_LOCKSCREEN);
230 systemWallpaperColor_ = 0;
231 lockWallpaperColor_ = 0;
232 colorChangeListenerMap_.clear();
233 HILOG_INFO("WallpaperService::initData --> end ");
234 }
235
AddWallpaperExtensionDeathRecipient(const sptr<IRemoteObject> & remoteObject)236 void WallpaperService::AddWallpaperExtensionDeathRecipient(const sptr<IRemoteObject> &remoteObject)
237 {
238 if (remoteObject != nullptr) {
239 IPCObjectProxy *proxy = reinterpret_cast<IPCObjectProxy *>(remoteObject.GetRefPtr());
240 if (recipient_ == nullptr) {
241 recipient_ = sptr<IRemoteObject::DeathRecipient>(new WallpaperExtensionAbilityDeathRecipient(*this));
242 }
243 if (proxy != nullptr && !proxy->IsObjectDead()) {
244 HILOG_INFO("get remoteObject succeed");
245 proxy->AddDeathRecipient(recipient_);
246 }
247 }
248 }
249
StartWallpaperExtension()250 void WallpaperService::StartWallpaperExtension()
251 {
252 MemoryGuard cacheGuard;
253 HILOG_INFO("WallpaperService StartWallpaperExtension");
254 int time = 0;
255 ErrCode ret = 0;
256 AAFwk::Want want;
257 want.SetElementName(WALLPAPER_BUNDLE_NAME, "WallpaperExtAbility");
258 AAFwk::AbilityManagerClient::GetInstance()->Connect();
259 HILOG_INFO("WallpaperService::Startwhile");
260 while (1) {
261 HILOG_INFO("WallpaperService::StartAbility");
262 time++;
263 ret = ConnectExtensionAbility(want);
264 if (ret == 0 || time == CONNECT_EXTENSION_MAX_RETRY_TIMES) {
265 break;
266 }
267 usleep(CONNECT_EXTENSION_INTERVAL);
268 HILOG_INFO("WallpaperService::StartAbility %{public}d", time);
269 }
270 if (ret != 0) {
271 HILOG_ERROR("WallpaperService::StartAbility --> failed ");
272 ReporterFault(FaultType::SERVICE_FAULT, FaultCode::SF_STARTABILITY_FAILED);
273 }
274 }
OnBootPhase()275 void WallpaperService::OnBootPhase()
276 {
277 HILOG_INFO("WallpaperService OnBootPhase");
278 AAFwk::Want want;
279 want.SetElementName(WALLPAPER_BUNDLE_NAME, "WallpaperExtAbility");
280 AAFwk::AbilityManagerClient::GetInstance()->Connect();
281 AAFwk::AbilityManagerClient::GetInstance()->StartAbility(want);
282 }
283
GetUserId()284 int WallpaperService::GetUserId()
285 {
286 userId_ = 0;
287 return userId_;
288 }
289
GetDisplayId()290 int WallpaperService::GetDisplayId()
291 {
292 int displayid = 0;
293 return displayid;
294 }
295
GetWallpaperDir()296 std::string WallpaperService::GetWallpaperDir()
297 {
298 std::string sWallpaperPath = WALLPAPER_USERID_PATH + std::to_string(userId_);
299 return sWallpaperPath;
300 }
301
MakeWallpaperIdLocked()302 int WallpaperService::MakeWallpaperIdLocked()
303 {
304 HILOG_INFO("MakeWallpaperIdLocked start");
305 if (wallpaperId_ == INT32_MAX) {
306 wallpaperId_ = DEFAULT_WALLPAPER_ID;
307 }
308 return ++wallpaperId_;
309 }
310
LoadSettingsLocked(int userId,bool keepDimensionHints)311 void WallpaperService::LoadSettingsLocked(int userId, bool keepDimensionHints)
312 {
313 HILOG_INFO("load Setting locked start.");
314 if (!wallpaperMap_.Contains(userId)) {
315 HILOG_INFO("wallpaperMap_ does not contains userId");
316 MigrateFromOld();
317 WallpaperData wallpaper(userId, wallpaperSystemFileFullPath_, wallpaperSystemCropFileFullPath_);
318 wallpaper.allowBackup = true;
319 wallpaper.wallpaperId_ = DEFAULT_WALLPAPER_ID;
320 wallpaperMap_.InsertOrAssign(userId, wallpaper);
321 }
322
323 if (!lockWallpaperMap_.Contains(userId)) {
324 HILOG_INFO("lockWallpaperMap_ does not Contains userId");
325 WallpaperData wallpaperLock(userId, wallpaperLockScreenFileFullPath_, wallpaperLockScreenCropFileFullPath_);
326 wallpaperLock.allowBackup = true;
327 wallpaperLock.wallpaperId_ = DEFAULT_WALLPAPER_ID;
328 lockWallpaperMap_.InsertOrAssign(userId, wallpaperLock);
329 }
330 HILOG_INFO("load Setting locked end.");
331 }
332
MigrateFromOld()333 void WallpaperService::MigrateFromOld()
334 {
335 if (!OHOS::FileExists(wallpaperLockScreenFilePath_)) {
336 if (!OHOS::ForceCreateDirectory(wallpaperLockScreenFilePath_)) {
337 return;
338 }
339 }
340 if (!OHOS::FileExists(wallpaperSystemFilePath_)) {
341 if (!OHOS::ForceCreateDirectory(wallpaperSystemFilePath_)) {
342 return;
343 }
344 }
345 if (OHOS::FileExists(wallpaperSystemCropFileFullPath_)) {
346 if (!OHOS::FileExists(wallpaperSystemFileFullPath_)) {
347 int ret = FileDeal::CopyFile(wallpaperSystemCropFileFullPath_, wallpaperSystemFileFullPath_);
348 if (ret < 0) {
349 return;
350 }
351 }
352 } else if (OHOS::FileExists(WALLPAPER_DEFAULT_FILEFULLPATH)) {
353 int ret = FileDeal::CopyFile(WALLPAPER_DEFAULT_FILEFULLPATH, wallpaperSystemCropFileFullPath_);
354 if (ret < 0) {
355 return;
356 }
357 ret = FileDeal::CopyFile(WALLPAPER_DEFAULT_FILEFULLPATH, wallpaperSystemFileFullPath_);
358 if (ret < 0) {
359 return;
360 }
361 }
362 if (OHOS::FileExists(wallpaperLockScreenCropFileFullPath_)) {
363 if (!OHOS::FileExists(wallpaperLockScreenFileFullPath_)) {
364 int ret = FileDeal::CopyFile(wallpaperLockScreenCropFileFullPath_, wallpaperLockScreenFileFullPath_);
365 if (ret < 0) {
366 return;
367 }
368 }
369 } else if (OHOS::FileExists(WALLPAPER_DEFAULT_LOCK_FILEFULLPATH)) {
370 int ret = FileDeal::CopyFile(WALLPAPER_DEFAULT_LOCK_FILEFULLPATH, wallpaperLockScreenCropFileFullPath_);
371 if (ret < 0) {
372 return;
373 }
374 ret = FileDeal::CopyFile(WALLPAPER_DEFAULT_LOCK_FILEFULLPATH, wallpaperLockScreenFileFullPath_);
375 if (ret < 0) {
376 return;
377 }
378 }
379 }
380
GetColors(int wallpaperType)381 std::vector<uint64_t> WallpaperService::GetColors(int wallpaperType)
382 {
383 std::vector<uint64_t> colors;
384 if (wallpaperType == WALLPAPER_SYSTEM) {
385 colors.emplace_back(systemWallpaperColor_);
386 } else if (wallpaperType == WALLPAPER_LOCKSCREEN) {
387 colors.emplace_back(lockWallpaperColor_);
388 }
389 HILOG_INFO(" Service End!");
390 return colors;
391 }
392
GetFile(int32_t wallpaperType,int32_t & wallpaperFd)393 int32_t WallpaperService::GetFile(int32_t wallpaperType, int32_t &wallpaperFd)
394 {
395 FdInfo fdInfo;
396 int wallpaperErrorCode = GetPixelMap(wallpaperType, fdInfo);
397 wallpaperFd = fdInfo.fd;
398 return wallpaperErrorCode;
399 }
400
WritePixelMapToFile(const std::string & filePath,std::unique_ptr<PixelMap> pixelMap)401 int64_t WallpaperService::WritePixelMapToFile(const std::string &filePath, std::unique_ptr<PixelMap> pixelMap)
402 {
403 ImagePacker imagePacker;
404 PackOption option;
405 option.format = "image/jpeg";
406 option.quality = HUNDRED;
407 option.numberHint = 1;
408 std::set<std::string> formats;
409 uint32_t ret = imagePacker.GetSupportedFormats(formats);
410 if (ret != 0) {
411 return 0;
412 }
413 imagePacker.StartPacking(filePath, option);
414 HILOG_INFO("AddImage start");
415 imagePacker.AddImage(*pixelMap);
416 int64_t packedSize = 0;
417 HILOG_INFO("FinalizePacking start");
418 imagePacker.FinalizePacking(packedSize);
419 return packedSize;
420 }
421
CompareColor(const uint64_t & localColor,const ColorManager::Color & color)422 bool WallpaperService::CompareColor(const uint64_t &localColor, const ColorManager::Color &color)
423 {
424 return localColor == color.PackValue();
425 }
426
SaveColor(int wallpaperType)427 bool WallpaperService::SaveColor(int wallpaperType)
428 {
429 uint32_t errorCode = 0;
430 OHOS::Media::SourceOptions opts;
431 opts.formatHint = "image/jpeg";
432 std::unique_ptr<OHOS::Media::ImageSource> imageSource =
433 OHOS::Media::ImageSource::CreateImageSource((wallpaperType == WALLPAPER_SYSTEM ?
434 wallpaperSystemCropFileFullPath_: wallpaperLockScreenCropFileFullPath_), opts, errorCode);
435 if (errorCode != 0) {
436 HILOG_ERROR("CreateImageSource failed");
437 return false;
438 }
439 OHOS::Media::DecodeOptions decodeOpts;
440 std::unique_ptr<PixelMap> wallpaperPixelMap = imageSource->CreatePixelMap(decodeOpts, errorCode);
441 if (errorCode != 0) {
442 HILOG_ERROR("CreatePixelMap failed");
443 return false;
444 }
445
446 auto colorPicker = Rosen::ColorPicker::CreateColorPicker(std::move(wallpaperPixelMap), errorCode);
447 if (errorCode != 0) {
448 HILOG_ERROR("CreateColorPicker failed");
449 return false;
450 }
451 auto color = ColorManager::Color();
452 uint32_t ret = colorPicker->GetMainColor(color);
453 if (ret != Rosen::SUCCESS) {
454 HILOG_ERROR("GetMainColor failed ret is : %{public}d", ret);
455 return false;
456 }
457 std::vector<uint64_t> colors;
458 if (wallpaperType == WALLPAPER_SYSTEM && !CompareColor(systemWallpaperColor_, color)) {
459 systemWallpaperColor_ = color.PackValue();
460 colors.emplace_back(systemWallpaperColor_);
461 std::lock_guard<std::mutex> autoLock(listenerMapMutex_);
462 for (const auto listener : colorChangeListenerMap_) {
463 listener.second->OnColorsChange(colors, WALLPAPER_SYSTEM);
464 }
465 } else if (wallpaperType == WALLPAPER_LOCKSCREEN && !CompareColor(lockWallpaperColor_, color)) {
466 lockWallpaperColor_ = color.PackValue();
467 colors.emplace_back(lockWallpaperColor_);
468 std::lock_guard<std::mutex> autoLock(listenerMapMutex_);
469 for (const auto listener : colorChangeListenerMap_) {
470 listener.second->OnColorsChange(colors, WALLPAPER_LOCKSCREEN);
471 }
472 }
473 return true;
474 }
475
MakeCropWallpaper(int wallpaperType)476 bool WallpaperService::MakeCropWallpaper(int wallpaperType)
477 {
478 uint32_t errorCode = 0;
479 bool ret = false;
480 OHOS::Media::SourceOptions opts;
481 opts.formatHint = "image/jpeg";
482 std::unique_ptr<OHOS::Media::ImageSource> imageSource = OHOS::Media::ImageSource::CreateImageSource(
483 (wallpaperType == WALLPAPER_SYSTEM ? wallpaperSystemFileFullPath_ : wallpaperLockScreenFileFullPath_), opts,
484 errorCode);
485 if (imageSource == nullptr || errorCode != 0) {
486 return ret;
487 }
488 OHOS::Media::DecodeOptions decodeOpts;
489 std::unique_ptr<PixelMap> wallpaperPixelMap = imageSource->CreatePixelMap(decodeOpts, errorCode);
490 if (wallpaperPixelMap == nullptr || errorCode != 0) {
491 return ret;
492 }
493 int32_t pictrueHeight = wallpaperPixelMap->GetHeight();
494 int32_t pictrueWidth = wallpaperPixelMap->GetWidth();
495 int pyScrWidth = GetWallpaperMinWidth();
496 int pyScrHeight = GetWallpaperMinHeight();
497 bool bHeightFlag = false;
498 bool bWidthFlag = false;
499 if (pictrueHeight > pyScrHeight) {
500 decodeOpts.CropRect.top = (pictrueHeight - pyScrHeight) / HALF;
501 bHeightFlag = true;
502 }
503 if (pictrueWidth > pyScrWidth) {
504 decodeOpts.CropRect.left = (pictrueWidth - pyScrWidth) / HALF;
505 bWidthFlag = true;
506 }
507 decodeOpts.CropRect.height = bHeightFlag ? pyScrHeight : pictrueHeight;
508 decodeOpts.desiredSize.height = decodeOpts.CropRect.height;
509 decodeOpts.CropRect.width = bWidthFlag ? pyScrWidth : pictrueWidth;
510 decodeOpts.desiredSize.width = decodeOpts.CropRect.width;
511 wallpaperPixelMap = imageSource->CreatePixelMap(decodeOpts, errorCode);
512 if (errorCode != 0) {
513 return false;
514 }
515 std::string tmpPath = wallpaperCropPath;
516 int64_t packedSize = WritePixelMapToFile(tmpPath, std::move(wallpaperPixelMap));
517 if (packedSize != 0) {
518 ret = FileDeal::CopyFile(tmpPath, (wallpaperType == WALLPAPER_SYSTEM ? wallpaperSystemCropFileFullPath_
519 : wallpaperLockScreenCropFileFullPath_));
520 if (remove(tmpPath.c_str()) < 0) {
521 return false;
522 }
523 }
524 HILOG_INFO("End Crop wallpaper: ret= %{public}d", ret);
525 return ret;
526 }
527
SetWallpaperByMap(int fd,int wallpaperType,int length)528 int32_t WallpaperService::SetWallpaperByMap(int fd, int wallpaperType, int length)
529 {
530 StartAsyncTrace(HITRACE_TAG_MISC, "SetWallpaperByMap", static_cast<int32_t>(TraceTaskId::SET_WALLPAPER_BY_MAP));
531 HILOG_INFO("SetWallpaperByMap");
532 if (!WPCheckCallingPermission(WALLPAPER_PERMISSION_NAME_SET_WALLPAPER)) {
533 HILOG_INFO("SetWallpaperByMap no set permission!");
534 return static_cast<int32_t>(E_NO_PERMISSION);
535 }
536 if (length <= 0 || length > FOO_MAX_LEN) {
537 return static_cast<int32_t>(E_PARAMETERS_INVALID);
538 }
539 std::string url = wallpaperTmpFullPath_;
540 char *paperBuf = new (std::nothrow) char[length]();
541 if (paperBuf == nullptr) {
542 return static_cast<int32_t>(E_NO_MEMORY);
543 }
544 mtx.lock();
545 int32_t bufsize = read(fd, paperBuf, length);
546 if (bufsize <= 0) {
547 HILOG_ERROR("read fd failed");
548 delete[] paperBuf;
549 mtx.unlock();
550 return static_cast<int32_t>(E_DEAL_FAILED);
551 }
552 int fdw = open(url.c_str(), O_WRONLY | O_CREAT, 0660);
553 if (fdw < 0) {
554 HILOG_ERROR("Open wallpaper tmpFullPath failed, errno %{public}d", errno);
555 delete[] paperBuf;
556 mtx.unlock();
557 return static_cast<int32_t>(E_DEAL_FAILED);
558 }
559 int writeSize = write(fdw, paperBuf, length);
560 mtx.unlock();
561 if (writeSize <= 0) {
562 HILOG_ERROR("WritefdToFile failed");
563 ReporterFault(FaultType::SET_WALLPAPER_FAULT, FaultCode::RF_DROP_FAILED);
564 delete[] paperBuf;
565 close(fdw);
566 return static_cast<int32_t>(E_DEAL_FAILED);
567 }
568 delete[] paperBuf;
569 close(fdw);
570 int32_t wallpaperErrorCode = SetWallpaperBackupData(url, wallpaperType);
571 SaveColor(wallpaperType);
572 FinishAsyncTrace(HITRACE_TAG_MISC, "SetWallpaperByMap", static_cast<int32_t>(TraceTaskId::SET_WALLPAPER_BY_MAP));
573 return wallpaperErrorCode;
574 }
575
SetWallpaperByFD(int fd,int wallpaperType,int length)576 int32_t WallpaperService::SetWallpaperByFD(int fd, int wallpaperType, int length)
577 {
578 StartAsyncTrace(HITRACE_TAG_MISC, "SetWallpaperByFD", static_cast<int32_t>(TraceTaskId::SET_WALLPAPER_BY_FD));
579 HILOG_INFO("SetWallpaperByFD");
580 if (!WPCheckCallingPermission(WALLPAPER_PERMISSION_NAME_SET_WALLPAPER)) {
581 return static_cast<int32_t>(E_NO_PERMISSION);
582 }
583 std::string url = wallpaperTmpFullPath_;
584 if (length <= 0 || length > FOO_MAX_LEN) {
585 return static_cast<int32_t>(E_PARAMETERS_INVALID);
586 }
587 char *paperBuf = new (std::nothrow) char[length];
588 if (paperBuf == nullptr) {
589 return E_NO_MEMORY;
590 }
591 mtx.lock();
592 int readSize = read(fd, paperBuf, length);
593 if (readSize <= 0) {
594 HILOG_ERROR("read from fd fail");
595 delete[] paperBuf;
596 mtx.unlock();
597 return static_cast<int32_t>(E_DEAL_FAILED);
598 }
599 int fdw = open(url.c_str(), O_WRONLY | O_CREAT, 0660);
600 if (fdw < 0) {
601 HILOG_ERROR("Open wallpaper tmpFullPath failed, errno %{public}d", errno);
602 delete[] paperBuf;
603 mtx.unlock();
604 return static_cast<int32_t>(E_DEAL_FAILED);
605 }
606 int writeSize = write(fdw, paperBuf, length);
607 mtx.unlock();
608 if (writeSize <= 0) {
609 HILOG_ERROR("Write to fdw fail, errno %{public}d", errno);
610 ReporterFault(FaultType::SET_WALLPAPER_FAULT, FaultCode::RF_DROP_FAILED);
611 close(fdw);
612 delete[] paperBuf;
613 return static_cast<int32_t>(E_DEAL_FAILED);
614 }
615 close(fdw);
616 delete[] paperBuf;
617 int32_t wallpaperErrorCode = SetWallpaperBackupData(url, wallpaperType);
618 SaveColor(wallpaperType);
619 FinishAsyncTrace(HITRACE_TAG_MISC, "SetWallpaperByFD", static_cast<int32_t>(TraceTaskId::SET_WALLPAPER_BY_FD));
620 return wallpaperErrorCode;
621 }
622
SetWallpaperBackupData(std::string uriOrPixelMap,int wallpaperType)623 int32_t WallpaperService::SetWallpaperBackupData(std::string uriOrPixelMap, int wallpaperType)
624 {
625 HILOG_INFO("set wallpaper and backup data Start.");
626 if (wallpaperType != WALLPAPER_LOCKSCREEN && wallpaperType != WALLPAPER_SYSTEM) {
627 return static_cast<int32_t>(E_PARAMETERS_INVALID);
628 }
629
630 if (!OHOS::FileExists(uriOrPixelMap)) {
631 return static_cast<int32_t>(E_DEAL_FAILED);
632 }
633 WallpaperData wallpaperData(userId_,
634 (wallpaperType == WALLPAPER_SYSTEM ? wallpaperSystemFileFullPath_ : wallpaperLockScreenFileFullPath_),
635 (wallpaperType == WALLPAPER_SYSTEM ? wallpaperSystemCropFileFullPath_ : wallpaperLockScreenCropFileFullPath_));
636
637 mtx.lock();
638 bool ret = GetWallpaperSafeLocked(userId_, wallpaperType, wallpaperData);
639 if (!ret) {
640 HILOG_ERROR("GetWallpaperSafeLocked failed !");
641 mtx.unlock();
642 return static_cast<int32_t>(E_DEAL_FAILED);
643 }
644
645 wallpaperData.wallpaperId_ = MakeWallpaperIdLocked();
646 bool retFileCp = FileDeal::CopyFile(uriOrPixelMap,
647 (wallpaperType == WALLPAPER_SYSTEM ? wallpaperSystemFileFullPath_ : wallpaperLockScreenFileFullPath_));
648 bool retCropFileCp = MakeCropWallpaper(wallpaperType);
649 mtx.unlock();
650
651 if (wallpaperType == WALLPAPER_SYSTEM) {
652 wallpaperMap_.InsertOrAssign(userId_, wallpaperData);
653 WallpaperCommonEvent::SendWallpaperSystemSettingMessage();
654 ReporterUsageTimeStatisic();
655 HILOG_INFO(" SetWallpaperBackupData callbackProxy->OnCall start");
656 if (callbackProxy != nullptr) {
657 callbackProxy->OnCall(wallpaperType);
658 }
659 } else if (wallpaperType == WALLPAPER_LOCKSCREEN) {
660 lockWallpaperMap_.InsertOrAssign(userId_, wallpaperData);
661 WallpaperCommonEvent::SendWallpaperLockSettingMessage();
662 ReporterUsageTimeStatisic();
663 HILOG_INFO(" SetWallpaperBackupData callbackProxy->OnCall start");
664 if (callbackProxy != nullptr) {
665 callbackProxy->OnCall(wallpaperType);
666 }
667 }
668 if (remove(uriOrPixelMap.c_str()) < 0) {
669 return static_cast<int32_t>(E_DEAL_FAILED);
670 }
671 return (retFileCp && retCropFileCp) ? static_cast<int32_t>(E_OK) : static_cast<int32_t>(E_DEAL_FAILED);
672 }
673
ReporterUsageTimeStatisic()674 void WallpaperService::ReporterUsageTimeStatisic()
675 {
676 int userId = static_cast<int>(IPCSkeleton::GetCallingUid());
677 std::string bundleName;
678 bool bRet = WPGetBundleNameByUid(userId, bundleName);
679 if (!bRet) {
680 bundleName = WALLPAPER_BUNDLE_NAME;
681 }
682 UsageTimeStat timeStat;
683 timeStat.packagesName = bundleName;
684 timeStat.startTime = time(nullptr);
685 StatisticReporter::ReportUsageTimeStatistic(userId, timeStat);
686 }
687
GetPixelMap(int wallpaperType,IWallpaperService::FdInfo & fdInfo)688 int32_t WallpaperService::GetPixelMap(int wallpaperType, IWallpaperService::FdInfo &fdInfo)
689 {
690 HILOG_INFO("WallpaperService::getPixelMap start ");
691 if (!IsSystemApp()) {
692 HILOG_INFO("CallingApp is not SystemApp");
693 return static_cast<int32_t>(E_NOT_SYSTEM_APP);
694 }
695 bool permissionGet = WPCheckCallingPermission(WALLPAPER_PERMISSION_NAME_GET_WALLPAPER);
696 if (!permissionGet) {
697 HILOG_INFO("GetPixelMap no get permission!");
698 return static_cast<int32_t>(E_NO_PERMISSION);
699 }
700
701 std::string filePath = "";
702 if (GetFilePath(wallpaperType, filePath) != static_cast<int32_t>(E_OK)) {
703 return static_cast<int32_t>(E_PARAMETERS_INVALID);
704 }
705
706 if (!OHOS::FileExists(filePath)) {
707 HILOG_ERROR("file is not exist!");
708 return static_cast<int32_t>(E_NOT_FOUND);
709 }
710 mtx.lock();
711 FILE *pixmap = fopen(filePath.c_str(), "rb");
712 if (pixmap == nullptr) {
713 HILOG_ERROR("fopen file Path failed, errno %{public}d.", errno);
714 mtx.unlock();
715 return static_cast<int32_t>(E_FILE_ERROR);
716 }
717 int fend = fseek(pixmap, 0, SEEK_END);
718 int length = ftell(pixmap);
719 int fset = fseek(pixmap, 0, SEEK_SET);
720 if (length <= 0 || fend != 0 || fset != 0) {
721 HILOG_ERROR("ftell file failed or fseek file failed, errno %{public}d", errno);
722 fclose(pixmap);
723 mtx.unlock();
724 return static_cast<int32_t>(E_FILE_ERROR);
725 }
726
727 fdInfo.size = length;
728 fclose(pixmap);
729 int fd = open(filePath.c_str(), O_RDONLY, 0440);
730 mtx.unlock();
731 if (fd < 0) {
732 HILOG_ERROR("Open file Path failed, errno %{public}d.", errno);
733 ReporterFault(FaultType::LOAD_WALLPAPER_FAULT, FaultCode::RF_FD_INPUT_FAILED);
734 return static_cast<int32_t>(E_DEAL_FAILED);
735 }
736 fdInfo.fd = fd;
737 HILOG_INFO("fdInfo.fd = %{public}d", fdInfo.fd);
738 return static_cast<int32_t>(E_OK);
739 }
740
GetWallpaperId(int wallpaperType)741 int WallpaperService::GetWallpaperId(int wallpaperType)
742 {
743 HILOG_INFO("WallpaperService::GetWallpaperId --> start ");
744 int iWallpaperId = 1;
745 if (wallpaperType == WALLPAPER_LOCKSCREEN) {
746 auto wallpaperData = lockWallpaperMap_.Find(userId_);
747 if (wallpaperData.first) {
748 iWallpaperId = wallpaperData.second.wallpaperId_;
749 }
750 } else if (wallpaperType == WALLPAPER_SYSTEM) {
751 auto wallpaperData = wallpaperMap_.Find(userId_);
752 if (wallpaperData.first) {
753 iWallpaperId = wallpaperData.second.wallpaperId_;
754 }
755 }
756 HILOG_INFO("WallpaperService::GetWallpaperId --> end ID[%{public}d]", iWallpaperId);
757 return iWallpaperId;
758 }
GetWallpaperMinHeight()759 int WallpaperService::GetWallpaperMinHeight()
760 {
761 HILOG_INFO("WallpaperService::GetWallpaperMinHeight --> start ");
762 auto display = Rosen::DisplayManager::GetInstance().GetDefaultDisplay();
763 if (display == nullptr) {
764 HILOG_ERROR("GetDefaultDisplay is nullptr");
765 return -1;
766 }
767 int iWallpaperMinHeight = display->GetHeight();
768 HILOG_INFO("WallpaperService height: %{public}d", iWallpaperMinHeight);
769 return iWallpaperMinHeight;
770 }
771
GetWallpaperMinWidth()772 int WallpaperService::GetWallpaperMinWidth()
773 {
774 HILOG_INFO("WallpaperService::GetWallpaperMinWidth --> start ");
775 auto display = Rosen::DisplayManager::GetInstance().GetDefaultDisplay();
776 if (display == nullptr) {
777 HILOG_ERROR("GetDefaultDisplay is nullptr");
778 return -1;
779 }
780 int iWallpaperMinWidth = display->GetWidth();
781 HILOG_INFO("WallpaperService width: %{public}d", iWallpaperMinWidth);
782 return iWallpaperMinWidth;
783 }
784
IsChangePermitted()785 bool WallpaperService::IsChangePermitted()
786 {
787 HILOG_INFO("IsChangePermitted wallpaper Start!");
788 bool bFlag = WPCheckCallingPermission(WALLPAPER_PERMISSION_NAME_SET_WALLPAPER);
789 return bFlag;
790 }
791
IsOperationAllowed()792 bool WallpaperService::IsOperationAllowed()
793 {
794 HILOG_INFO("IsOperationAllowed wallpaper Start!");
795 bool bFlag = WPCheckCallingPermission(WALLPAPER_PERMISSION_NAME_SET_WALLPAPER);
796 return bFlag;
797 }
798
ResetWallpaper(int wallpaperType)799 int32_t WallpaperService::ResetWallpaper(int wallpaperType)
800 {
801 HILOG_INFO("reset wallpaper Start!");
802 bool permissionSet = WPCheckCallingPermission(WALLPAPER_PERMISSION_NAME_SET_WALLPAPER);
803 if (!permissionSet) {
804 HILOG_INFO("reset wallpaper no set permission!");
805 return static_cast<int32_t>(E_NO_PERMISSION);
806 }
807
808 if (wallpaperType != WALLPAPER_LOCKSCREEN && wallpaperType != WALLPAPER_SYSTEM) {
809 HILOG_INFO("wallpaperType = %{public}d type not support ", wallpaperType);
810 return static_cast<int32_t>(E_PARAMETERS_INVALID);
811 }
812 int32_t wallpaperErrorCode;
813 ClearWallpaperLocked(userId_, wallpaperType);
814 wallpaperErrorCode = SetDefaultDateForWallpaper(userId_, wallpaperType);
815 HILOG_INFO(" Set default data result[%{public}d]", wallpaperErrorCode);
816
817 if (wallpaperType == WALLPAPER_LOCKSCREEN) {
818 if (lockWallpaperMap_.Contains(userId_)) {
819 wallpaperErrorCode = static_cast<int32_t>(E_OK);
820 }
821 } else {
822 if (wallpaperMap_.Contains(userId_)) {
823 wallpaperErrorCode = static_cast<int32_t>(E_OK);
824 }
825 }
826 HILOG_INFO("reset wallpaper End!");
827 return wallpaperErrorCode;
828 }
829
CopySystemWallpaper()830 bool WallpaperService::CopySystemWallpaper()
831 {
832 if (!OHOS::FileExists(wallpaperSystemFilePath_)) {
833 if (!OHOS::ForceCreateDirectory(wallpaperSystemFilePath_)) {
834 HILOG_ERROR("CopySystemWallpaper ForceCreateDirectory error");
835 return false;
836 }
837 }
838 if (OHOS::FileExists(WALLPAPER_DEFAULT_FILEFULLPATH)) {
839 if (!FileDeal::CopyFile(WALLPAPER_DEFAULT_FILEFULLPATH, wallpaperSystemCropFileFullPath_)) {
840 HILOG_ERROR("CopyScreenLockWallpaper copy Crop file error");
841 return false;
842 }
843 if (!FileDeal::CopyFile(WALLPAPER_DEFAULT_FILEFULLPATH, wallpaperSystemFileFullPath_)) {
844 HILOG_ERROR("CopyScreenLockWallpaper copy Original file error");
845 return false;
846 }
847 WallpaperCommonEvent::SendWallpaperSystemSettingMessage();
848 if (callbackProxy != nullptr) {
849 HILOG_INFO("CopySystemWallpaper callbackProxy OnCall start");
850 callbackProxy->OnCall(WALLPAPER_SYSTEM);
851 }
852 SaveColor(WALLPAPER_SYSTEM);
853 } else {
854 HILOG_ERROR("FileExists error");
855 return false;
856 }
857 return true;
858 }
CopyScreenLockWallpaper()859 bool WallpaperService::CopyScreenLockWallpaper()
860 {
861 if (!OHOS::FileExists(wallpaperLockScreenFilePath_)) {
862 if (!OHOS::ForceCreateDirectory(wallpaperLockScreenFilePath_)) {
863 HILOG_ERROR("CopyScreenLockWallpaper ForceCreateDirectory error");
864 return false;
865 }
866 }
867 if (OHOS::FileExists(WALLPAPER_DEFAULT_LOCK_FILEFULLPATH)) {
868 if (!FileDeal::CopyFile(WALLPAPER_DEFAULT_LOCK_FILEFULLPATH, wallpaperLockScreenCropFileFullPath_)) {
869 HILOG_ERROR("CopyScreenLockWallpaper copy Crop file error");
870 return false;
871 }
872 if (!FileDeal::CopyFile(WALLPAPER_DEFAULT_LOCK_FILEFULLPATH, wallpaperLockScreenFileFullPath_)) {
873 HILOG_ERROR("CopyScreenLockWallpaper copy Original file error");
874 return false;
875 }
876 WallpaperCommonEvent::SendWallpaperLockSettingMessage();
877 if (callbackProxy != nullptr) {
878 HILOG_INFO("CopyScreenLockWallpaper callbackProxy OnCall start");
879 callbackProxy->OnCall(WALLPAPER_LOCKSCREEN);
880 }
881 SaveColor(WALLPAPER_LOCKSCREEN);
882 } else {
883 HILOG_ERROR("FileExists error");
884 return false;
885 }
886 return true;
887 }
888
SetDefaultDateForWallpaper(int32_t userId,int32_t wpType)889 int32_t WallpaperService::SetDefaultDateForWallpaper(int32_t userId, int32_t wpType)
890 {
891 std::string tmpPath = "";
892 std::string tmpCropPath = "";
893 if (wpType == WALLPAPER_LOCKSCREEN) {
894 if (!CopyScreenLockWallpaper()) {
895 HILOG_ERROR("CopyScreenLockWallpaper error");
896 return static_cast<int32_t>(E_DEAL_FAILED);
897 }
898 tmpPath = wallpaperLockScreenFileFullPath_;
899 tmpCropPath = wallpaperLockScreenCropFileFullPath_;
900 } else {
901 if (!CopySystemWallpaper()) {
902 HILOG_ERROR("CopySystemWallpaper error");
903 return static_cast<int32_t>(E_DEAL_FAILED);
904 }
905 tmpPath = wallpaperSystemFileFullPath_;
906 tmpCropPath = wallpaperSystemCropFileFullPath_;
907 }
908 WallpaperData wallpaperData(userId, tmpPath, tmpCropPath);
909 wallpaperData.wallpaperId_ = DEFAULT_WALLPAPER_ID;
910 wallpaperData.allowBackup = true;
911 if (wpType == WALLPAPER_LOCKSCREEN) {
912 lockWallpaperMap_.InsertOrAssign(userId, wallpaperData);
913 } else {
914 wallpaperMap_.InsertOrAssign(userId, wallpaperData);
915 }
916 return static_cast<int32_t>(E_OK);
917 }
918
On(sptr<IWallpaperColorChangeListener> listener)919 bool WallpaperService::On(sptr<IWallpaperColorChangeListener> listener)
920 {
921 HILOG_DEBUG("WallpaperService::On in");
922 if (listener == nullptr) {
923 HILOG_ERROR("WallpaperService::On listener is null");
924 return false;
925 }
926 std::lock_guard<std::mutex> autoLock(listenerMapMutex_);
927 colorChangeListenerMap_.insert_or_assign(IPCSkeleton::GetCallingTokenID(), listener);
928 HILOG_DEBUG("WallpaperService::On out");
929 return true;
930 }
931
Off(sptr<IWallpaperColorChangeListener> listener)932 bool WallpaperService::Off(sptr<IWallpaperColorChangeListener> listener)
933 {
934 HILOG_DEBUG("WallpaperService::Off in");
935 (void)listener;
936 std::lock_guard<std::mutex> autoLock(listenerMapMutex_);
937 auto iter = colorChangeListenerMap_.find(IPCSkeleton::GetCallingTokenID());
938 if (iter != colorChangeListenerMap_.end()) {
939 iter->second = nullptr;
940 colorChangeListenerMap_.erase(iter);
941 }
942 HILOG_DEBUG("WallpaperService::Off out");
943 return true;
944 }
945
RegisterWallpaperCallback(const sptr<IWallpaperCallback> callback)946 bool WallpaperService::RegisterWallpaperCallback(const sptr<IWallpaperCallback> callback)
947 {
948 HILOG_INFO(" WallpaperService::RegisterWallpaperCallback");
949 callbackProxy = callback;
950 return true;
951 }
952
GetWallpaperSafeLocked(int userId,int wpType,WallpaperData paperdata)953 bool WallpaperService::GetWallpaperSafeLocked(int userId, int wpType, WallpaperData paperdata)
954 {
955 HILOG_INFO("function start.");
956 bool ret = true;
957 if (wpType == WALLPAPER_LOCKSCREEN) {
958 auto wallpaperData = lockWallpaperMap_.Find(userId);
959 if (!wallpaperData.first) {
960 HILOG_INFO(" No Lock wallpaper? Not tracking for lock-only ");
961 LoadSettingsLocked(userId, true);
962 wallpaperData = lockWallpaperMap_.Find(userId);
963 if (!wallpaperData.first) {
964 ret = false;
965 HILOG_INFO("default data is saved into mLockWallpaperMap failed.");
966 }
967 }
968 if (ret) {
969 paperdata.wallpaperId_ = wallpaperData.second.wallpaperId_;
970 paperdata.allowBackup = wallpaperData.second.allowBackup;
971 }
972 } else {
973 auto wallpaperData = wallpaperMap_.Find(userId);
974 if (!wallpaperData.first) {
975 HILOG_INFO(" No system wallpaper? Not tracking for lock-only ");
976 LoadSettingsLocked(userId, true);
977 wallpaperData = wallpaperMap_.Find(userId);
978 if (!wallpaperData.first) {
979 ret = false;
980 HILOG_INFO("default data is saved into mWallpaperMap failed.");
981 }
982 }
983 if (ret) {
984 paperdata.wallpaperId_ = wallpaperData.second.wallpaperId_;
985 paperdata.allowBackup = wallpaperData.second.allowBackup;
986 }
987 }
988 return ret;
989 }
990
ClearWallpaperLocked(int userId,int wpType)991 void WallpaperService::ClearWallpaperLocked(int userId, int wpType)
992 {
993 HILOG_INFO("Clear wallpaper Start!");
994 if (wpType == WALLPAPER_LOCKSCREEN) {
995 auto wallpaperData = lockWallpaperMap_.Find(userId);
996 if (!wallpaperData.first) {
997 HILOG_INFO("Lock wallpaper already cleared");
998 return;
999 }
1000 if (!wallpaperData.second.wallpaperFile_.empty()) {
1001 lockWallpaperMap_.Erase(userId);
1002 }
1003 } else {
1004 auto wallpaperData = wallpaperMap_.Find(userId);
1005 if (!wallpaperData.first) {
1006 HILOG_INFO("system wallpaper already cleared");
1007 LoadSettingsLocked(userId, true);
1008 wallpaperData = wallpaperMap_.Find(userId);
1009 if (!wallpaperData.first) {
1010 HILOG_INFO("system wallpaper already cleared too");
1011 return;
1012 }
1013 }
1014 if (!wallpaperData.second.wallpaperFile_.empty()) {
1015 wallpaperMap_.Erase(userId);
1016 }
1017 }
1018 HILOG_INFO("Clear wallpaper End!");
1019 }
1020
WPCheckCallingPermission(const std::string & permissionName)1021 bool WallpaperService::WPCheckCallingPermission(const std::string &permissionName)
1022 {
1023 bool bflag = false;
1024 int result;
1025 Security::AccessToken::AccessTokenID callerToken = IPCSkeleton::GetCallingTokenID();
1026 auto tokenType = Security::AccessToken::AccessTokenKit::GetTokenTypeFlag(callerToken);
1027 if (tokenType == Security::AccessToken::TOKEN_NATIVE || tokenType == Security::AccessToken::TOKEN_SHELL
1028 || tokenType == Security::AccessToken::TOKEN_HAP) {
1029 result = AccessTokenProxy::VerifyAccessToken(callerToken, permissionName);
1030 } else {
1031 HILOG_INFO("Check permission tokenId ilegal");
1032 return false;
1033 }
1034 if (result == Security::AccessToken::TypePermissionState::PERMISSION_GRANTED) {
1035 bflag = true;
1036 } else {
1037 bflag = false;
1038 }
1039 HILOG_INFO("Check permission result %{public}d", result);
1040 return bflag;
1041 }
1042
WPGetBundleNameByUid(std::int32_t uid,std::string & bname)1043 bool WallpaperService::WPGetBundleNameByUid(std::int32_t uid, std::string &bname)
1044 {
1045 sptr<ISystemAbilityManager> systemMgr = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
1046 if (systemMgr == nullptr) {
1047 HILOG_ERROR("Fail to get system ability mgr");
1048 return false;
1049 }
1050
1051 sptr<IRemoteObject> remoteObject = systemMgr->GetSystemAbility(BUNDLE_MGR_SERVICE_SYS_ABILITY_ID);
1052 if (remoteObject == nullptr) {
1053 HILOG_ERROR("Fail to get bundle manager proxy");
1054 return false;
1055 }
1056
1057 sptr<OHOS::AppExecFwk::IBundleMgr> bundleMgrProxy = iface_cast<OHOS::AppExecFwk::IBundleMgr>(remoteObject);
1058 if (bundleMgrProxy == nullptr) {
1059 HILOG_ERROR("Bundle mgr proxy is nullptr");
1060 return false;
1061 }
1062
1063 if (!bundleMgrProxy->GetBundleNameForUid(uid, bname)) {
1064 HILOG_ERROR("Get bundle name failed");
1065 return false;
1066 }
1067 HILOG_INFO("Get bundle name is %{public}s", bname.c_str());
1068 return true;
1069 }
1070
ReporterFault(FaultType faultType,FaultCode faultCode)1071 void WallpaperService::ReporterFault(FaultType faultType, FaultCode faultCode)
1072 {
1073 FaultMsg msg;
1074 msg.faultType = faultType;
1075 msg.errorCode = faultCode;
1076 ReportStatus nRet;
1077 if (faultType == FaultType::SERVICE_FAULT) {
1078 msg.moduleName = "WallpaperService";
1079 nRet = FaultReporter::ReportServiceFault(msg);
1080 } else {
1081 nRet = FaultReporter::ReportRuntimeFault(msg);
1082 }
1083
1084 if (nRet == ReportStatus::SUCCESS) {
1085 HILOG_INFO("ReporterFault success");
1086 } else {
1087 HILOG_ERROR("ReporterFault failed");
1088 }
1089 }
1090
Dump(int fd,const std::vector<std::u16string> & args)1091 int WallpaperService::Dump(int fd, const std::vector<std::u16string> &args)
1092 {
1093 int uid = static_cast<int>(IPCSkeleton::GetCallingUid());
1094 const int maxUid = 10000;
1095 if (uid > maxUid) {
1096 Security::AccessToken::AccessTokenID callerToken = IPCSkeleton::GetCallingTokenID();
1097 auto tokenType = Security::AccessToken::AccessTokenKit::GetTokenTypeFlag(callerToken);
1098 if (tokenType != Security::AccessToken::TOKEN_NATIVE && tokenType != Security::AccessToken::TOKEN_SHELL) {
1099 return 1;
1100 }
1101 }
1102
1103 std::vector<std::string> argsStr;
1104 for (auto item : args) {
1105 argsStr.emplace_back(Str16ToStr8(item));
1106 }
1107
1108 if (DumpHelper::GetInstance().Dispatch(fd, argsStr)) {
1109 HILOG_ERROR("DumpHelper Dispatch failed");
1110 return 0;
1111 }
1112 return 1;
1113 }
1114
ConnectExtensionAbility(const AAFwk::Want & want)1115 int32_t WallpaperService::ConnectExtensionAbility(const AAFwk::Want &want)
1116 {
1117 HILOG_DEBUG("ConnectAdapter");
1118 ErrCode errCode = AAFwk::AbilityManagerClient::GetInstance()->Connect();
1119 if (errCode != ERR_OK) {
1120 HILOG_ERROR("connect ability server failed errCode=%{public}d", errCode);
1121 return errCode;
1122 }
1123 std::vector<int> ids;
1124 ErrCode ret = AccountSA::OsAccountManager::QueryActiveOsAccountIds(ids);
1125 if (ret != ERR_OK || ids.empty()) {
1126 HILOG_ERROR("query active user failed errCode=%{public}d", ret);
1127 return AAFwk::INVALID_PARAMETERS_ERR;
1128 }
1129 const sptr<AAFwk::IAbilityConnection> connection = new WallpaperExtensionAbilityConnection();
1130 ret = AAFwk::AbilityManagerClient::GetInstance()->ConnectExtensionAbility(want, connection, ids[0]);
1131 HILOG_INFO("ConnectExtensionAbility errCode=%{public}d", ret);
1132 return ret;
1133 }
1134
GetFilePath(int wallpaperType,std::string & filePath)1135 int32_t WallpaperService::GetFilePath(int wallpaperType, std::string &filePath)
1136 {
1137 if (wallpaperType == WALLPAPER_LOCKSCREEN) {
1138 auto wallpaperData = lockWallpaperMap_.Find(userId_);
1139 if (wallpaperData.first) {
1140 filePath = wallpaperData.second.cropFile_;
1141 return static_cast<int32_t>(E_OK);
1142 }
1143 } else if (wallpaperType == WALLPAPER_SYSTEM) {
1144 auto wallpaperData = wallpaperMap_.Find(userId_);
1145 if (wallpaperData.first) {
1146 filePath = wallpaperData.second.cropFile_;
1147 return static_cast<int32_t>(E_OK);
1148 }
1149 }
1150 return static_cast<int32_t>(E_PARAMETERS_INVALID);
1151 }
1152
IsSystemApp()1153 bool WallpaperService::IsSystemApp()
1154 {
1155 int32_t uid = IPCSkeleton::GetCallingUid();
1156 auto bundleMgr = GetBundleMgr();
1157 bool isSystemApplication = false;
1158 if (bundleMgr != nullptr) {
1159 isSystemApplication = bundleMgr->CheckIsSystemAppByUid(uid);
1160 }
1161 return isSystemApplication;
1162 }
1163
GetBundleMgr()1164 OHOS::sptr<OHOS::AppExecFwk::IBundleMgr> WallpaperService::GetBundleMgr()
1165 {
1166 auto systemAbilityManager = OHOS::SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
1167 if (systemAbilityManager == nullptr) {
1168 return nullptr;
1169 }
1170 auto bundleMgrSa = systemAbilityManager->GetSystemAbility(OHOS::BUNDLE_MGR_SERVICE_SYS_ABILITY_ID);
1171 if (bundleMgrSa == nullptr) {
1172 return nullptr;
1173 }
1174 auto bundleMgr = OHOS::iface_cast<AppExecFwk::IBundleMgr>(bundleMgrSa);
1175 if (bundleMgr == nullptr) {
1176 HILOG_INFO("GetBundleMgr is null");
1177 }
1178 return bundleMgr;
1179 }
1180 } // namespace WallpaperMgrService
1181 } // namespace OHOS