• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 }