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 <thread>
16 #include <cerrno>
17 #include <unistd.h>
18 #include <sys/types.h>
19 #include <sys/stat.h>
20 #include <fcntl.h>
21 #include <cstdlib>
22 #include <cstring>
23 #include <sys/sendfile.h>
24 #include <window_manager.h>
25 #include <display_type.h>
26 #include <iostream>
27 #include <cstdio>
28 #include <rs_surface_node.h>
29 #include "hilog_wrapper.h"
30 #include "system_ability_definition.h"
31 #include "wallpaper_common_event.h"
32 #include "image_utils.h"
33 #include "file_ex.h"
34 #include "directory_ex.h"
35 #include "file_util.h"
36 #include "time_util.h"
37 #include "image_packer.h"
38 #include "bundle_mgr_interface.h"
39 #include "permission/permission_kit.h"
40 #include "iservice_registry.h"
41 #include "image/bitmap.h"
42 #include "pixel_map.h"
43 #include "image_type.h"
44 #include "image_utils.h"
45 #include "image_source.h"
46 #include "canvas.h"
47 #include "pen.h"
48 #include "surface.h"
49 #include "window.h"
50 #include "wallpaper_service_cb_proxy.h"
51 #include "ability_manager_client.h"
52 #include "wallpaper_service.h"
53
54 namespace OHOS {
55 namespace WallpaperMgrService {
56 REGISTER_SYSTEM_ABILITY_BY_ID(WallpaperService, WALLPAPER_MANAGER_SERVICE_ID, true);
57
58 using namespace OHOS::Media;
59 using namespace OHOS::HiviewDFX::FileUtil;
60 using namespace OHOS::HiviewDFX::TimeUtil;
61
62 const std::string WallpaperService::WALLPAPER = "wallpaper_orig";
63 const std::string WallpaperService::WALLPAPER_CROP = "wallpaper";
64 const std::string WallpaperService::WALLPAPER_LOCK_ORIG = "wallpaper_lock_orig";
65 const std::string WallpaperService::WALLPAPER_LOCK_CROP = "wallpaper_lock";
66
67 const std::int64_t INIT_INTERVAL = 10000L;
68 constexpr int SCREEN_WIDTH = 480;
69 constexpr int SCREEN_HEIGHT = 960;
70
71 constexpr int HALF = 2;
72 constexpr int DOUBLE = 2;
73 constexpr int THREE = 3;
74 constexpr int FORE = 4;
75 constexpr int FIVE = 5;
76 constexpr int SIX = 6;
77 constexpr int TEN = 10;
78 constexpr int FIFTY = 50;
79 constexpr int HUNDRED = 100;
80 constexpr int HUNDRED_FIFTY = 150;
81 constexpr int FOO_MAX_LEN = 52428800;
82 std::mutex WallpaperService::instanceLock_;
83
84 sptr<WallpaperService> WallpaperService::instance_;
85
86 std::shared_ptr<AppExecFwk::EventHandler> WallpaperService::serviceHandler_;
87
WallpaperService(int32_t systemAbilityId,bool runOnCreate)88 WallpaperService::WallpaperService(int32_t systemAbilityId, bool runOnCreate)
89 : SystemAbility(systemAbilityId, runOnCreate), state_(ServiceRunningState::STATE_NOT_START)
90 {
91 }
92
WallpaperService()93 WallpaperService::WallpaperService() : state_(ServiceRunningState::STATE_NOT_START)
94 {
95 InitData();
96 }
97
~WallpaperService()98 WallpaperService::~WallpaperService()
99 {
100 }
101
GetInstance()102 sptr<WallpaperService> WallpaperService::GetInstance()
103 {
104 if (instance_ == nullptr) {
105 std::lock_guard<std::mutex> autoLock(instanceLock_);
106 if (instance_ == nullptr) {
107 instance_ = new WallpaperService();
108 }
109 }
110 return instance_;
111 }
112
Init()113 int32_t WallpaperService::Init()
114 {
115 bool ret = Publish(WallpaperService::GetInstance());
116 if (!ret) {
117 HILOG_ERROR("Publish failed.");
118 return -1;
119 }
120 HILOG_INFO("Publish success.");
121 state_ = ServiceRunningState::STATE_RUNNING;
122 return 0;
123 }
124
OnStart()125 void WallpaperService::OnStart()
126 {
127 HILOG_INFO("Enter OnStart.");
128 if (state_ == ServiceRunningState::STATE_RUNNING) {
129 HILOG_ERROR("WallpaperService is already running.");
130 return;
131 }
132
133 InitServiceHandler();
134 if (Init() != 0) {
135 auto callback = [=]() { Init(); };
136 serviceHandler_->PostTask(callback, INIT_INTERVAL);
137 HILOG_ERROR("Init failed. Try again 10s later");
138 return;
139 }
140 HILOG_INFO("RegisterSubscriber");
141 OHOS::EventFwk::MatchingSkills matchingSkills;
142 HILOG_INFO("WallpaperCommonEvent::AddEvent");
143 matchingSkills.AddEvent(EventFwk::CommonEventSupport::COMMON_EVENT_BOOT_COMPLETED);
144 HILOG_INFO("WallpaperCommonEvent::subscriberInfo");
145 OHOS::EventFwk::CommonEventSubscribeInfo subscriberInfo(matchingSkills);
146 std::shared_ptr<EventFwk::CommonEventSubscriber> subscriberPtr_ =
147 std::make_shared<WallpaperCommonEvent>(subscriberInfo);
148 bool subRes = OHOS::EventFwk::CommonEventManager::SubscribeCommonEvent(subscriberPtr_);
149 if (subRes == false) {
150 HILOG_INFO("RegisterSubscriber failed");
151 } else {
152 HILOG_INFO("RegisterSubscriber success");
153 }
154 HILOG_INFO("RegisterSubscriber end");
155
156 std::thread(&WallpaperService::StartExt, this).detach();
157 return;
158 }
159
InitServiceHandler()160 void WallpaperService::InitServiceHandler()
161 {
162 HILOG_INFO("InitServiceHandler started.");
163 if (serviceHandler_ != nullptr) {
164 HILOG_ERROR("InitServiceHandler already init.");
165 return;
166 }
167 std::shared_ptr<AppExecFwk::EventRunner> runner =
168 AppExecFwk::EventRunner::Create("WallpaperService");
169 serviceHandler_ = std::make_shared<AppExecFwk::EventHandler>(runner);
170
171 HILOG_INFO("InitServiceHandler succeeded.");
172 }
173
OnStop()174 void WallpaperService::OnStop()
175 {
176 HILOG_INFO("OnStop started.");
177 if (state_ != ServiceRunningState::STATE_RUNNING) {
178 return;
179 }
180 serviceHandler_ = nullptr;
181 state_ = ServiceRunningState::STATE_NOT_START;
182 HILOG_INFO("OnStop end.");
183 }
184
185
InitData()186 void WallpaperService::InitData()
187 {
188 HILOG_INFO("WallpaperService::initData --> start ");
189 userId_ = 0;
190 wallpaperId_ = 0;
191 wallpaperMap_.clear();
192 lockWallpaperMap_.clear();
193 userId_ = GetUserId();
194 std::string userIdPath = GetWallpaperDir(userId_);
195 this->wallpaperLockScreenFilePath_ = userIdPath +
196 "/" + WALLPAPER_DIRNAME + "/" + WALLPAPER_LOCKSCREEN_DIRNAME;
197 this->wallpaperSystemFilePath_ = userIdPath +
198 "/" + WALLPAPER_DIRNAME + "/" + WALLPAPER_SYSTEM_DIRNAME;
199 wallpaperLockScreenFileFullPath_ = wallpaperLockScreenFilePath_ + "/" + WALLPAPER_LOCK_ORIG;
200 wallpaperLockScreenCropFileFullPath_ = wallpaperLockScreenFilePath_ + "/" + WALLPAPER_LOCK_CROP;
201 wallpaperSystemCropFileFullPath_ = wallpaperSystemFilePath_ + "/" + WALLPAPER_CROP;
202 wallpaperSystemFileFullPath_ = wallpaperSystemFilePath_ + "/" + WALLPAPER;
203 wallpaperTmpFullPath_ = wallpaperSystemFilePath_ + "/" + WALLPAPER_TMP_DIRNAME;
204 wallpaperCropPath = wallpaperSystemFilePath_ + "/" + WALLPAPER_CROP_PICTURE;
205 LoadSettingsLocked(userId_, true);
206 HILOG_INFO("WallpaperService::initData --> end ");
207 }
StartExt()208 void WallpaperService::StartExt()
209 {
210 HILOG_INFO("WallpaperService StartExt");
211 int time = 0;
212 ErrCode ret = 0;
213 AAFwk::Want want;
214 want.SetElementName("com.example.ohosproject.hmservice", "WallpaperExtAbility");
215 AAFwk::AbilityManagerClient::GetInstance()->Connect();
216 HILOG_INFO("WallpaperService::Startwhile");
217 while (1) {
218 HILOG_INFO("WallpaperService::StartAbility");
219 time++;
220 ret = AAFwk::AbilityManagerClient::GetInstance()->StartAbility(want);
221 if (ret == 0 || time == TEN) {
222 break;
223 }
224 sleep(SIX);
225 HILOG_INFO("WallpaperService::StartAbility %{public}d", time);
226 }
227 if (ret != 0) {
228 HILOG_ERROR("WallpaperService::StartAbility --> failed ");
229 }
230 }
OnBootPhase()231 void WallpaperService::OnBootPhase()
232 {
233 HILOG_INFO("WallpaperService OnBootPhase");
234 AAFwk::Want want;
235 want.SetElementName("com.example.ohosproject.hmservice", "WallpaperExtAbility");
236 AAFwk::AbilityManagerClient::GetInstance()->Connect();
237 ErrCode ret = AAFwk::AbilityManagerClient::GetInstance()->StartAbility(want);
238 }
239
GetUserId()240 int WallpaperService::GetUserId()
241 {
242 userId_ = 0;
243 return userId_;
244 }
245
GetDisplayId()246 int WallpaperService::GetDisplayId()
247 {
248 int displayid = 0;
249 return displayid;
250 }
251
GetWallpaperDir(int userId)252 std::string WallpaperService::GetWallpaperDir(int userId)
253 {
254 std::string sWallpaperPath = WALLPAPER_USERID_PATH + std::to_string(userId_);
255 return sWallpaperPath;
256 }
257
MakeWallpaperIdLocked()258 int WallpaperService::MakeWallpaperIdLocked()
259 {
260 do {
261 ++wallpaperId_;
262 } while (wallpaperId_ == 0);
263 return wallpaperId_;
264 }
265
LoadSettingsLocked(int userId,bool keepDimensionHints)266 void WallpaperService::LoadSettingsLocked(int userId, bool keepDimensionHints)
267 {
268 HILOG_INFO("load Setting locked start.");
269 std::map<int, WallpaperData>::iterator itr;
270 std::map<int, WallpaperData>::iterator itrLock;
271 itr = wallpaperMap_.find(userId);
272 itrLock = lockWallpaperMap_.find(userId);
273
274 if (itr == wallpaperMap_.end()) {
275 MigrateFromOld();
276 WallpaperData wallpaper(userId, wallpaperSystemFileFullPath_, wallpaperSystemCropFileFullPath_);
277 wallpaper.allowBackup = true;
278 wallpaper.wallpaperId_ = MakeWallpaperIdLocked();
279 wallpaperMap_.insert(std::pair<int, WallpaperData>(userId, wallpaper));
280 }
281
282 if (itrLock == lockWallpaperMap_.end()) {
283 WallpaperData wallpaperLock(userId, wallpaperLockScreenFileFullPath_, wallpaperLockScreenCropFileFullPath_);
284 wallpaperLock.allowBackup = true;
285 wallpaperLock.wallpaperId_ = MakeWallpaperIdLocked();
286 lockWallpaperMap_.insert(std::pair<int, WallpaperData>(userId, wallpaperLock));
287 }
288 HILOG_INFO("load Setting locked end.");
289 }
290
ChangingToSame(ComponentName componentName,WallpaperData wallpaper)291 bool WallpaperService::ChangingToSame(ComponentName componentName, WallpaperData wallpaper)
292 {
293 if (wallpaper.wallpaperComponent.equals(componentName)) {
294 return true;
295 }
296
297 return false;
298 }
BindWallpaperComponentLocked(ComponentName & componentName,bool force,bool fromUser,WallpaperData wallpaper)299 bool WallpaperService::BindWallpaperComponentLocked(ComponentName& componentName,
300 bool force, bool fromUser, WallpaperData wallpaper)
301 {
302 if (!force && ChangingToSame(componentName, wallpaper)) {
303 return true;
304 }
305 return true;
306 }
307
SetLockWallpaperCallback(IWallpaperManagerCallback * cb)308 bool WallpaperService::SetLockWallpaperCallback(IWallpaperManagerCallback* cb)
309 {
310 keyguardListener_ = cb;
311
312 return true;
313 }
314
MigrateFromOld()315 void WallpaperService::MigrateFromOld()
316 {
317 int ret = 0;
318 if (!OHOS::FileExists(wallpaperLockScreenFilePath_)) {
319 if (!OHOS::ForceCreateDirectory(wallpaperLockScreenFilePath_)) {
320 return ;
321 }
322 }
323 if (!OHOS::FileExists(wallpaperSystemFilePath_)) {
324 if (!OHOS::ForceCreateDirectory(wallpaperSystemFilePath_)) {
325 return ;
326 }
327 }
328 if (OHOS::FileExists(wallpaperSystemCropFileFullPath_)) {
329 if (!OHOS::FileExists(wallpaperSystemFileFullPath_)) {
330 ret = OHOS::HiviewDFX::FileUtil::CopyFile(wallpaperSystemCropFileFullPath_,
331 wallpaperSystemFileFullPath_);
332 if (ret < 0) {
333 return;
334 }
335 }
336 } else if (OHOS::FileExists(WALLPAPER_DEFAULT_FILEFULLPATH)) {
337 ret = OHOS::HiviewDFX::FileUtil::CopyFile(WALLPAPER_DEFAULT_FILEFULLPATH, wallpaperSystemCropFileFullPath_);
338 if (ret < 0) {
339 return;
340 }
341 ret = OHOS::HiviewDFX::FileUtil::CopyFile(WALLPAPER_DEFAULT_FILEFULLPATH,
342 wallpaperSystemFileFullPath_);
343 if (ret < 0) {
344 return;
345 }
346 }
347 if (OHOS::FileExists(wallpaperLockScreenCropFileFullPath_)) {
348 if (!OHOS::FileExists(wallpaperLockScreenFileFullPath_)) {
349 ret = OHOS::HiviewDFX::FileUtil::CopyFile(wallpaperLockScreenCropFileFullPath_,
350 wallpaperLockScreenFileFullPath_);
351 if (ret < 0) {
352 return;
353 }
354 }
355 } else if (OHOS::FileExists(WALLPAPER_DEFAULT_LOCK_FILEFULLPATH)) {
356 ret = OHOS::HiviewDFX::FileUtil::CopyFile(WALLPAPER_DEFAULT_LOCK_FILEFULLPATH,
357 wallpaperLockScreenCropFileFullPath_);
358 if (ret < 0) {
359 return;
360 }
361 ret = OHOS::HiviewDFX::FileUtil::CopyFile(WALLPAPER_DEFAULT_LOCK_FILEFULLPATH,
362 wallpaperLockScreenFileFullPath_);
363 if (ret < 0) {
364 return;
365 }
366 }
367 }
368
GetColors(int wallpaperType)369 std::vector<RgbaColor> WallpaperService::GetColors(int wallpaperType)
370 {
371 std::vector<RgbaColor> Colors;
372 RgbaColor tmpColor;
373 for (int32_t indx = 0; indx < FIVE; indx++) {
374 tmpColor.red = HUNDRED + DOUBLE * indx;
375 tmpColor.blue = FIFTY + THREE * indx;
376 tmpColor.green = FIFTY + FORE * indx;
377 tmpColor.alpha = HUNDRED_FIFTY + DOUBLE * indx;
378 Colors.emplace_back(tmpColor);
379 }
380 HILOG_INFO(" Service End!");
381 return Colors;
382 }
383
WritePixelMapToFile(const std::string & filePath,std::unique_ptr<PixelMap> pixelMap)384 int64_t WallpaperService::WritePixelMapToFile(const std::string &filePath, std::unique_ptr<PixelMap> pixelMap)
385 {
386 ImagePacker imagePacker;
387 PackOption option;
388 option.format = "image/jpeg";
389 option.quality = HUNDRED;
390 option.numberHint = 1;
391 std::set<std::string> formats;
392 uint32_t ret = imagePacker.GetSupportedFormats(formats);
393 if (ret != 0) {
394 return 0;
395 }
396 imagePacker.StartPacking(filePath, option);
397 HILOG_INFO("AddImage start");
398 imagePacker.AddImage(*pixelMap);
399 int64_t packedSize = 0;
400 HILOG_INFO("FinalizePacking start");
401 imagePacker.FinalizePacking(packedSize);
402 return packedSize;
403 }
404
MakeCropWallpaper(int wallpaperType)405 bool WallpaperService::MakeCropWallpaper(int wallpaperType)
406 {
407 uint32_t errorCode = 0;
408 bool ret = false;
409 OHOS::Media::SourceOptions opts;
410 opts.formatHint = "image/jpeg";
411
412 std::unique_ptr<OHOS::Media::ImageSource> imageSource =
413 OHOS::Media::ImageSource::CreateImageSource((wallpaperType == WALLPAPER_SYSTEM ?
414 wallpaperSystemFileFullPath_: wallpaperLockScreenFileFullPath_), opts, errorCode);
415 if (errorCode != 0) {
416 return ret;
417 }
418 OHOS::Media::DecodeOptions decodeOpts;
419 std::unique_ptr<PixelMap> wallpaperPixelMap = imageSource->CreatePixelMap(decodeOpts, errorCode);
420 if (errorCode != 0) {
421 return ret;
422 }
423 int32_t pictrueHeight = wallpaperPixelMap->GetHeight();
424 int32_t pictrueWidth = wallpaperPixelMap->GetWidth();
425 int pyScrWidth = GetWallpaperMinWidth();
426 int pyScrHeight = GetWallpaperMinHeight();
427 bool needCropHeight = false;
428 bool needCropWidth = false;
429 if (pictrueHeight > pyScrHeight) {
430 decodeOpts.CropRect.top = (pictrueHeight - pyScrHeight)/HALF;
431 needCropHeight = true;
432 }
433 if (pictrueWidth > pyScrWidth) {
434 decodeOpts.CropRect.left = (pictrueWidth - pyScrWidth)/HALF;
435 needCropWidth = true;
436 }
437 decodeOpts.CropRect.height = needCropHeight ? pyScrHeight : pictrueHeight;
438 decodeOpts.desiredSize.height = decodeOpts.CropRect.height;
439 decodeOpts.CropRect.width = needCropWidth ? pyScrWidth : pictrueHeight;
440 decodeOpts.desiredSize.width = decodeOpts.CropRect.width;
441 wallpaperPixelMap = imageSource->CreatePixelMap(decodeOpts, errorCode);
442 if (errorCode != 0) {
443 ret = false;
444 } else {
445 std::string tmpPath = wallpaperCropPath;
446 int64_t packedSize = WritePixelMapToFile(tmpPath, std::move(wallpaperPixelMap));
447 if (packedSize != 0) {
448 ret = CopyFile(tmpPath, (wallpaperType == WALLPAPER_SYSTEM ? wallpaperSystemCropFileFullPath_:
449 wallpaperLockScreenCropFileFullPath_));
450 if (remove(tmpPath.c_str()) < 0) {
451 return false;
452 }
453 }
454 }
455 HILOG_INFO("End Crop wallpaper: ret= %{public}d", ret);
456 return ret;
457 }
458
SetWallpaperByMap(int fd,int wallpaperType,int length)459 bool WallpaperService::SetWallpaperByMap(int fd, int wallpaperType, int length)
460 {
461 HILOG_INFO("SetWallpaperByMap");
462 bool permissionSet = WPCheckCallingPermission(WALLPAPER_PERMISSION_NAME_SET_WALLPAPER);
463 if (!permissionSet) {
464 HILOG_INFO("SetWallpaperByMap no set permission!");
465 return false;
466 }
467 if (length == 0 || length > FOO_MAX_LEN) {
468 return false;
469 }
470 std::string url = wallpaperTmpFullPath_;
471 char* paperBuf = new char[length];
472 mtx.lock();
473 int32_t bufsize = read(fd, paperBuf, length);
474 if (bufsize <= 0) {
475 HILOG_ERROR("read fd failed");
476 delete[] paperBuf;
477 close(fd);
478 mtx.unlock();
479 return false;
480 }
481 int fdw = open(url.c_str(), O_WRONLY | O_CREAT, 0660);
482 if (fdw == -1) {
483 HILOG_ERROR("WallpaperService:: fdw fail");
484 delete[] paperBuf;
485 close(fd);
486 mtx.unlock();
487 return false;
488 }
489 int writeSize = write(fdw, paperBuf, length);
490 mtx.unlock();
491 if (writeSize <= 0) {
492 HILOG_ERROR("WritefdToFile failed");
493 delete[] paperBuf;
494 close(fd);
495 close(fdw);
496 return false;
497 }
498 delete[] paperBuf;
499 close(fd);
500 close(fdw);
501 return SetWallpaperBackupData(url, wallpaperType);
502 }
503
SetWallpaperByFD(int fd,int wallpaperType,int length)504 bool WallpaperService::SetWallpaperByFD(int fd, int wallpaperType, int length)
505 {
506 HILOG_INFO("SetWallpaperByFD");
507 bool permissionSet = WPCheckCallingPermission(WALLPAPER_PERMISSION_NAME_SET_WALLPAPER);
508 if (!permissionSet) {
509 HILOG_INFO("SetWallpaperByFD no set permission!");
510 return false;
511 }
512 std::string url = wallpaperTmpFullPath_;
513 if (length == 0 || length > FOO_MAX_LEN) {
514 close(fd);
515 return false;
516 }
517 char* paperBuf = new char[length];
518 mtx.lock();
519 int readSize = read(fd, paperBuf, length);
520 if (readSize <= 0) {
521 HILOG_ERROR("read from fd fail");
522 delete[] paperBuf;
523 close(fd);
524 mtx.unlock();
525 return false;
526 }
527
528 int fdw = open(url.c_str(), O_WRONLY | O_CREAT, 0660);
529 if (fdw == -1) {
530 HILOG_ERROR("WallpaperService:: fdw fail");
531 delete[] paperBuf;
532 close(fd);
533 mtx.unlock();
534 return false;
535 }
536 int writeSize = write(fdw, paperBuf, length);
537 mtx.unlock();
538 if (writeSize <= 0) {
539 HILOG_ERROR("write to fdw fail");
540 close(fd);
541 close(fdw);
542 delete[] paperBuf;
543 return false;
544 }
545 close(fd);
546 close(fdw);
547 delete[] paperBuf;
548 return SetWallpaperBackupData(url, wallpaperType);
549 }
550
551
SetWallpaperBackupData(std::string uriOrPixelMap,int wallpaperType)552 bool WallpaperService::SetWallpaperBackupData(std::string uriOrPixelMap, int wallpaperType)
553 {
554 HILOG_INFO("set wallpaper and backup data Start.");
555 if (wallpaperType != WALLPAPER_LOCKSCREEN && wallpaperType != WALLPAPER_SYSTEM) {
556 return false;
557 }
558
559 if (!OHOS::FileExists(uriOrPixelMap)) {
560 return false;
561 }
562 WallpaperData tmpWP(userId_,
563 (wallpaperType == WALLPAPER_SYSTEM ? wallpaperSystemFileFullPath_:
564 wallpaperLockScreenFileFullPath_),
565 (wallpaperType == WALLPAPER_SYSTEM ? wallpaperSystemCropFileFullPath_:
566 wallpaperLockScreenCropFileFullPath_));
567
568 mtx.lock();
569 bool ret = GetWallpaperSafeLocked(userId_, wallpaperType, tmpWP);
570 if (!ret) {
571 HILOG_ERROR("GetWallpaperSafeLocked failed !");
572 mtx.unlock();
573 return false;
574 }
575
576 tmpWP.wallpaperId_ = MakeWallpaperIdLocked();
577
578 bool retFileCp = CopyFile(uriOrPixelMap, (wallpaperType ==
579 WALLPAPER_SYSTEM ? wallpaperSystemFileFullPath_:wallpaperLockScreenFileFullPath_));
580 bool retCropFileCp = MakeCropWallpaper(wallpaperType);
581 mtx.unlock();
582 if (wallpaperType == WALLPAPER_SYSTEM) {
583 wallpaperMap_.insert(std::pair<int, WallpaperData>(userId_, tmpWP));
584 WallpaperCommonEvent::SendWallpaperSystemSettingMessage();
585 HILOG_INFO(" SetWallpaperBackupData callbackProxy->OnCall start");
586 if (callbackProxy != nullptr) {
587 callbackProxy->OnCall(wallpaperType);
588 }
589 } else if (wallpaperType == WALLPAPER_LOCKSCREEN) {
590 lockWallpaperMap_.insert(std::pair<int, WallpaperData>(userId_, tmpWP));
591 WallpaperCommonEvent::SendWallpaperLockSettingMessage();
592 HILOG_INFO(" SetWallpaperBackupData callbackProxy->OnCall start");
593 if (callbackProxy != nullptr) {
594 callbackProxy->OnCall(wallpaperType);
595 }
596 } else {
597 return false;
598 }
599 if (remove(uriOrPixelMap.c_str()) < 0) {
600 return false;
601 }
602 return !retFileCp && !retCropFileCp;
603 }
GetPixelMap(int wallpaperType)604 IWallpaperService::mapFD WallpaperService::GetPixelMap(int wallpaperType)
605 {
606 mapFD mapFd;
607 HILOG_INFO("WallpaperService::getPixelMap --> start ");
608 bool permissionGet = WPCheckCallingPermission(WALLPAPER_PERMISSION_NAME_GET_WALLPAPER);
609 if (!permissionGet) {
610 HILOG_INFO("GetPixelMap no get permission!");
611 return mapFd;
612 }
613
614 std::string filePath = "";
615
616 if (wallpaperType == WALLPAPER_LOCKSCREEN) {
617 filePath = lockWallpaperMap_.find(userId_)->second.cropFile_;
618 } else if (wallpaperType == WALLPAPER_SYSTEM) {
619 filePath = wallpaperMap_.find(userId_)->second.cropFile_;
620 }
621
622 if (!OHOS::FileExists(filePath)) {
623 HILOG_ERROR("file is not exist!");
624 return mapFd;
625 }
626 mtx.lock();
627 FILE *pixmap = fopen(filePath.c_str(), "rb");
628 if (pixmap == nullptr) {
629 HILOG_ERROR("fopen failed");
630 mtx.unlock();
631 return mapFd;
632 }
633 int fend = fseek(pixmap, 0, SEEK_END);
634 int length = ftell(pixmap);
635 int fset = fseek(pixmap, 0, SEEK_SET);
636 if (length <= 0 || fend != 0 || fset != 0) {
637 HILOG_ERROR("ftell failed or fseek failed");
638 fclose(pixmap);
639 mtx.unlock();
640 return mapFd;
641 }
642
643 mapFd.size = length;
644 int closeRes = fclose(pixmap);
645 int fd = open(filePath.c_str(), O_RDONLY, 0440);
646 mtx.unlock();
647 if (closeRes != 0 || fd < 0) {
648 HILOG_ERROR("open failed");
649 return mapFd;
650 }
651 mapFd.fd = fd;
652 HILOG_INFO("mapFd.fd = %{public}d", mapFd.fd);
653 return mapFd;
654 }
655
GetWallpaperId(int wallpaperType)656 int WallpaperService::GetWallpaperId(int wallpaperType)
657 {
658 HILOG_INFO("WallpaperService::GetWallpaperId --> start ");
659 int iWallpaperId = 1;
660 if (wallpaperType == WALLPAPER_LOCKSCREEN) {
661 iWallpaperId = lockWallpaperMap_.find(userId_)->second.wallpaperId_;
662 } else if (wallpaperType == WALLPAPER_SYSTEM) {
663 iWallpaperId = wallpaperMap_.find(userId_)->second.wallpaperId_;
664 }
665 HILOG_INFO("WallpaperService::GetWallpaperId --> end ID[%{public}d]", iWallpaperId);
666 return iWallpaperId;
667 }
GetWallpaperMinHeight()668 int WallpaperService::GetWallpaperMinHeight()
669 {
670 HILOG_INFO("WallpaperService::GetWallpaperMinHeight --> start ");
671 auto display = Rosen::DisplayManager::GetInstance().GetDefaultDisplay();
672 int iWallpaperMinHeight = display->GetHeight();
673 HILOG_INFO("WallpaperService height: %{public}d", iWallpaperMinHeight);
674 return iWallpaperMinHeight;
675 }
676
GetWallpaperMinWidth()677 int WallpaperService::GetWallpaperMinWidth()
678 {
679 HILOG_INFO("WallpaperService::GetWallpaperMinWidth --> start ");
680 auto display = Rosen::DisplayManager::GetInstance().GetDefaultDisplay();
681 int iWallpaperMinWidth = display->GetWidth();
682 HILOG_INFO("WallpaperService width: %{public}d", iWallpaperMinWidth);
683 return iWallpaperMinWidth;
684 }
685
IsChangePermitted()686 bool WallpaperService::IsChangePermitted()
687 {
688 HILOG_INFO("IsChangePermitted wallpaper Start!");
689 bool bFlag = WPCheckCallingPermission(WALLPAPER_PERMISSION_NAME_SET_WALLPAPER);
690 return bFlag;
691 }
692
IsOperationAllowed()693 bool WallpaperService::IsOperationAllowed()
694 {
695 HILOG_INFO("IsOperationAllowed wallpaper Start!");
696 bool bFlag = WPCheckCallingPermission(WALLPAPER_PERMISSION_NAME_SET_WALLPAPER);
697 return bFlag;
698 }
699
ResetWallpaper(int wallpaperType)700 bool WallpaperService::ResetWallpaper(int wallpaperType)
701 {
702 HILOG_INFO("reset wallpaper Start!");
703 bool permissionSet = WPCheckCallingPermission(WALLPAPER_PERMISSION_NAME_SET_WALLPAPER);
704 if (!permissionSet) {
705 HILOG_INFO("reset wallpaper no set permission!");
706 return false;
707 }
708 bool bFlag = false;
709 if (wallpaperType != WALLPAPER_LOCKSCREEN && wallpaperType != WALLPAPER_SYSTEM) {
710 HILOG_INFO("wallpaperType = %{public}d type not support ", wallpaperType);
711 return bFlag;
712 }
713
714 ClearWallpaperLocked(userId_, wallpaperType);
715 bFlag = SetDefaultDateForWallpaper(userId_, wallpaperType);
716 HILOG_INFO(" Set default data result[%{public}d]", bFlag);
717
718 std::map<int, WallpaperData>::iterator itr;
719 if (wallpaperType == WALLPAPER_LOCKSCREEN) {
720 itr = lockWallpaperMap_.find(userId_);
721 } else {
722 itr = wallpaperMap_.find(userId_);
723 }
724
725 if (itr != lockWallpaperMap_.end()) {
726 bFlag = true;
727 }
728 HILOG_INFO("reset wallpaper End!");
729 return bFlag;
730 }
731
CopySystemWallpaper()732 bool WallpaperService::CopySystemWallpaper()
733 {
734 bool ret = false;
735 if (!OHOS::FileExists(wallpaperSystemFilePath_)) {
736 if (!OHOS::ForceCreateDirectory(wallpaperSystemFilePath_)) {
737 return false;
738 }
739 }
740 if (OHOS::FileExists(WALLPAPER_DEFAULT_FILEFULLPATH)) {
741 ret = CopyFile(WALLPAPER_DEFAULT_FILEFULLPATH, wallpaperSystemCropFileFullPath_);
742 if (ret == true) {
743 return false;
744 }
745 ret = CopyFile(WALLPAPER_DEFAULT_FILEFULLPATH, wallpaperSystemFileFullPath_);
746 if (ret == true) {
747 return false;
748 }
749 WallpaperCommonEvent::SendWallpaperSystemSettingMessage();
750 HILOG_INFO("SetDefaultDateForWallpaper callbackProxy->OnCall start");
751 if (callbackProxy != nullptr) {
752 callbackProxy->OnCall(WALLPAPER_SYSTEM);
753 }
754 }
755 return ret;
756 }
CopyScreenLockWallpaper()757 bool WallpaperService::CopyScreenLockWallpaper()
758 {
759 bool ret = false;
760 if (!OHOS::FileExists(wallpaperLockScreenFilePath_)) {
761 if (!OHOS::ForceCreateDirectory(wallpaperLockScreenFilePath_)) {
762 return false;
763 }
764 }
765 if (OHOS::FileExists(WALLPAPER_DEFAULT_FILEFULLPATH)) {
766 if (CopyFile(WALLPAPER_DEFAULT_FILEFULLPATH, wallpaperLockScreenCropFileFullPath_)) {
767 return false;
768 }
769 ret = CopyFile(WALLPAPER_DEFAULT_FILEFULLPATH, wallpaperLockScreenFileFullPath_);
770 if (ret == true) {
771 return false;
772 }
773 WallpaperCommonEvent::SendWallpaperLockSettingMessage();
774 HILOG_INFO("SetDefaultDateForWallpaper callbackProxy->OnCall start");
775 if (callbackProxy != nullptr) {
776 callbackProxy->OnCall(WALLPAPER_LOCKSCREEN);
777 }
778 }
779 return ret;
780 }
781
SetDefaultDateForWallpaper(int userId,int wpType)782 bool WallpaperService::SetDefaultDateForWallpaper(int userId, int wpType)
783 {
784 std::string tmpPath = "";
785 std::string tmpCropPath = "";
786 bool ret = false;
787 if (wpType == WALLPAPER_LOCKSCREEN) {
788 CopyScreenLockWallpaper();
789 tmpPath = wallpaperLockScreenFileFullPath_;
790 tmpCropPath = wallpaperLockScreenCropFileFullPath_;
791 } else {
792 CopySystemWallpaper();
793 tmpPath = wallpaperSystemFileFullPath_;
794 tmpCropPath = wallpaperSystemCropFileFullPath_;
795 }
796 WallpaperData sdwpdata(userId, tmpPath, tmpCropPath);
797 sdwpdata.wallpaperId_ = 0;
798 sdwpdata.allowBackup = true;
799 if (wpType == WALLPAPER_LOCKSCREEN) {
800 lockWallpaperMap_.insert(std::pair<int, WallpaperData>(userId, sdwpdata));
801 } else {
802 wallpaperMap_.insert(std::pair<int, WallpaperData>(userId, sdwpdata));
803 }
804 return true;
805 }
ScreenshotLiveWallpaper(int scaleNumber,OHOS::Media::PixelMap pixelMap)806 bool WallpaperService::ScreenshotLiveWallpaper(int scaleNumber, OHOS::Media::PixelMap pixelMap)
807 {
808 bool bFlag = false;
809 return bFlag;
810 }
811
On(sptr<IWallpaperColorChangeListener> listener)812 bool WallpaperService::On(sptr<IWallpaperColorChangeListener> listener)
813 {
814 std::vector<RgbaColor> Colors;
815 RgbaColor tmpColor;
816 for (int32_t indx = 0; indx < FIVE; indx++) {
817 tmpColor.red = HUNDRED + DOUBLE * indx;
818 tmpColor.blue = FIFTY + THREE * indx;
819 tmpColor.green = FIFTY + FORE * indx;
820 tmpColor.alpha = HUNDRED_FIFTY + DOUBLE * indx;
821 Colors.emplace_back(tmpColor);
822 }
823 listener->onColorsChange(Colors, 0);
824 return true;
825 }
826
Off(sptr<IWallpaperColorChangeListener> listener)827 bool WallpaperService::Off(sptr<IWallpaperColorChangeListener> listener)
828 {
829 HILOG_DEBUG("WallpaperService::Off in");
830 std::vector<RgbaColor> Colors;
831 HILOG_INFO(" Service Start!");
832 RgbaColor tmpColor;
833 for (int32_t indx = 0; indx < FIVE; indx++) {
834 tmpColor.red = HUNDRED + DOUBLE * indx;
835 tmpColor.blue = FIFTY + THREE * indx;
836 tmpColor.green = FIFTY + FORE * indx;
837 tmpColor.alpha = HUNDRED_FIFTY + DOUBLE * indx;
838 Colors.emplace_back(tmpColor);
839 }
840 listener->onColorsChange(Colors, 0);
841 HILOG_DEBUG("WallpaperService::Off out");
842 return true;
843 }
844
RegisterWallpaperCallback(const sptr<IWallpaperCallback> callback)845 bool WallpaperService::RegisterWallpaperCallback(const sptr<IWallpaperCallback> callback)
846 {
847 HILOG_INFO(" WallpaperService::RegisterWallpaperCallback");
848 callbackProxy = callback;
849 return true;
850 }
851
GetWallpaperSafeLocked(int userId,int wpType,WallpaperData paperdata)852 bool WallpaperService::GetWallpaperSafeLocked(int userId, int wpType, WallpaperData paperdata)
853 {
854 HILOG_INFO("function start.");
855 bool ret = true;
856 std::map<int, WallpaperData>::iterator itr;
857 if (wpType == WALLPAPER_LOCKSCREEN) {
858 itr = lockWallpaperMap_.find(userId);
859 if (itr == lockWallpaperMap_.end()) {
860 HILOG_INFO(" No Lock wallpaper? Not tracking for lock-only ");
861 LoadSettingsLocked(userId, true);
862 itr = lockWallpaperMap_.find(userId);
863 if (itr == lockWallpaperMap_.end()) {
864 ret = false;
865 HILOG_INFO("default data is saved into mLockWallpaperMap failed.");
866 }
867 }
868 if (ret) {
869 paperdata.wallpaperId_ = itr->second.wallpaperId_;
870 paperdata.allowBackup = itr->second.allowBackup;
871 }
872 } else {
873 itr = wallpaperMap_.find(userId);
874 if (itr == wallpaperMap_.end()) {
875 HILOG_INFO(" No system wallpaper? Not tracking for lock-only ");
876 LoadSettingsLocked(userId, true);
877 itr = wallpaperMap_.find(userId);
878 if (itr == wallpaperMap_.end()) {
879 ret = false;
880 HILOG_INFO("default data is saved into mWallpaperMap failed.");
881 }
882 }
883 if (ret) {
884 paperdata.wallpaperId_ = itr->second.wallpaperId_;
885 paperdata.allowBackup = itr->second.allowBackup;
886 }
887 }
888 return ret;
889 }
890
ClearWallpaperLocked(int userId,int wpType)891 void WallpaperService::ClearWallpaperLocked(int userId, int wpType)
892 {
893 HILOG_INFO("Clear wallpaper Start!");
894 std::map<int, WallpaperData>::iterator itr;
895 if (wpType == WALLPAPER_LOCKSCREEN) {
896 itr = lockWallpaperMap_.find(userId);
897 if (itr == lockWallpaperMap_.end()) {
898 HILOG_INFO("Lock wallpaper already cleared");
899 return;
900 }
901 } else {
902 itr = wallpaperMap_.find(userId);
903 if (itr == wallpaperMap_.end()) {
904 HILOG_INFO("system wallpaper already cleared");
905 LoadSettingsLocked(userId, true);
906 itr = wallpaperMap_.find(userId);
907 }
908 if (itr == wallpaperMap_.end()) {
909 HILOG_INFO("system wallpaper already cleared too");
910 return;
911 }
912 }
913 if (itr->second.wallpaperFile_.size() != 0) {
914 if (wpType == WALLPAPER_LOCKSCREEN) {
915 lockWallpaperMap_.erase(itr);
916 } else {
917 wallpaperMap_.erase(itr);
918 }
919 }
920 HILOG_INFO("Clear wallpaper End!");
921 }
922
WPCheckCallingPermission(const std::string & permissionName)923 bool WallpaperService::WPCheckCallingPermission(const std::string &permissionName)
924 {
925 bool bflag = false;
926 int result;
927 Security::AccessToken::AccessTokenID callerToken = IPCSkeleton::GetCallingTokenID();
928 if (Security::AccessToken::AccessTokenKit::GetTokenTypeFlag(callerToken) == Security::AccessToken::TOKEN_NATIVE) {
929 result = Security::AccessToken::AccessTokenKit::VerifyNativeToken(callerToken,
930 permissionName);
931 } else if (Security::AccessToken::AccessTokenKit::GetTokenTypeFlag(callerToken) ==
932 Security::AccessToken::TOKEN_HAP) {
933 result = Security::AccessToken::AccessTokenKit::VerifyAccessToken(callerToken,
934 permissionName);
935 } else {
936 HILOG_INFO("Check permission tokenId ilegal");
937 return false;
938 }
939 if (result == Security::AccessToken::TypePermissionState::PERMISSION_GRANTED) {
940 bflag = true;
941 } else {
942 bflag = false;
943 }
944 HILOG_INFO("Check permission result %{public}d", result);
945 return bflag;
946 }
947
WPGetBundleNameByUid(std::int32_t uid,std::string & bname)948 bool WallpaperService::WPGetBundleNameByUid(std::int32_t uid, std::string &bname)
949 {
950 sptr<ISystemAbilityManager> systemMgr = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
951 if (systemMgr == nullptr) {
952 HILOG_ERROR("Fail to get system ability mgr");
953 return false;
954 }
955
956 sptr<IRemoteObject> remoteObject = systemMgr->GetSystemAbility(BUNDLE_MGR_SERVICE_SYS_ABILITY_ID);
957 if (remoteObject == nullptr) {
958 HILOG_ERROR("Fail to get bundle manager proxy");
959 return false;
960 }
961
962 sptr<OHOS::AppExecFwk::IBundleMgr> bundleMgrProxy = iface_cast<OHOS::AppExecFwk::IBundleMgr>(remoteObject);
963 if (bundleMgrProxy == nullptr) {
964 HILOG_ERROR("Bundle mgr proxy is nullptr");
965 return false;
966 }
967
968 if (!bundleMgrProxy->GetBundleNameForUid(uid, bname)) {
969 HILOG_ERROR("Get bundle name failed");
970 return false;
971 }
972
973 return true;
974 }
WallpaperDump(int fd)975 void WallpaperService::WallpaperDump(int fd)
976 {
977 dprintf(fd, "\n - Wallpaper System State :\n");
978 dprintf(fd, " * UserId = %d\n", userId_);
979 dprintf(fd, " * WallpaperId = %d\n", wallpaperId_);
980 int32_t height = GetWallpaperMinHeight();
981 dprintf(fd, " * heigh = %d\n", height);
982 int32_t width = GetWallpaperMinWidth();
983 dprintf(fd, " * heigh = %d\n", width);
984 }
985 }
986 }