• 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 "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