From 33980ff28e321bef62a53c2bc9f86179f752f60e Mon Sep 17 00:00:00 2001 From: caochunlei Date: Mon, 20 Jun 2022 10:11:25 +0800 Subject: [PATCH] caochunlei1@huawei.com Signed-off-by: caochunlei --- .../aafwk/mission_manager/mission_manager.cpp | 16 +- .../AMS/mock_serviceability_manager_service.h | 2 +- .../include/mock_ability_manager_service.h | 3 +- .../mock_ability_delegator_stub.cpp | 4 +- .../mock_ability_delegator_stub.h | 6 +- ...mock_ability_manager_client_interface1.cpp | 5 - .../mock/AMS/mock_ability_manager_service.h | 3 +- .../AMS/mock_serviceability_manager_service.h | 3 +- .../include/ability_manager_client.h | 16 +- .../include/ability_manager_interface.h | 3 +- .../include/ability_manager_proxy.h | 3 +- .../include/ability_manager_service.h | 2 +- .../abilitymgr/include/mission_data_storage.h | 40 +++-- .../abilitymgr/include/mission_info_mgr.h | 6 +- .../abilitymgr/include/mission_list_manager.h | 3 +- .../include/task_data_persistence_mgr.h | 5 +- .../abilitymgr/src/ability_manager_client.cpp | 4 +- .../abilitymgr/src/ability_manager_proxy.cpp | 7 +- .../src/ability_manager_service.cpp | 4 +- .../abilitymgr/src/ability_manager_stub.cpp | 3 +- .../abilitymgr/src/mission_data_storage.cpp | 147 +++++++++++------- services/abilitymgr/src/mission_info_mgr.cpp | 21 ++- .../abilitymgr/src/mission_list_manager.cpp | 4 +- .../src/task_data_persistence_mgr.cpp | 4 +- .../ability_manager_stub_mock_test.h | 3 +- .../ability_manager_stub_mock.h | 3 +- .../ability_manager_stub_impl_mock.h | 3 +- .../ability_manager_stub_mock.h | 3 +- .../mock/include/mock_ability_mgr_service.h | 3 +- tools/test/mock/mock_ability_manager_stub.h | 3 +- 30 files changed, 205 insertions(+), 127 deletions(-) diff --git a/frameworks/js/napi/aafwk/mission_manager/mission_manager.cpp b/frameworks/js/napi/aafwk/mission_manager/mission_manager.cpp index e7bd6f68b00..5ebd2315f92 100644 --- a/frameworks/js/napi/aafwk/mission_manager/mission_manager.cpp +++ b/frameworks/js/napi/aafwk/mission_manager/mission_manager.cpp @@ -79,7 +79,13 @@ public: static NativeValue* GetMissionSnapShot(NativeEngine* engine, NativeCallbackInfo* info) { JsMissionManager* me = CheckParamsAndGetThis(engine, info); - return (me != nullptr) ? me->OnGetMissionSnapShot(*engine, *info) : nullptr; + return (me != nullptr) ? me->OnGetMissionSnapShot(*engine, *info, false) : nullptr; + } + + static NativeValue* GetLowResolutionMissionSnapShot(NativeEngine* engine, NativeCallbackInfo* info) + { + JsMissionManager* me = CheckParamsAndGetThis(engine, info); + return (me != nullptr) ? me->OnGetMissionSnapShot(*engine, *info, true) : nullptr; } static NativeValue* LockMission(NativeEngine* engine, NativeCallbackInfo* info) @@ -266,7 +272,7 @@ private: return result; } - NativeValue* OnGetMissionSnapShot(NativeEngine &engine, NativeCallbackInfo &info) + NativeValue* OnGetMissionSnapShot(NativeEngine &engine, NativeCallbackInfo &info, bool isLowResolution) { HILOG_INFO("%{public}s is called", __FUNCTION__); int32_t errCode = 0; @@ -285,14 +291,14 @@ private: errCode = ERR_NOT_OK; } AsyncTask::CompleteCallback complete = - [deviceId, missionId, errCode](NativeEngine &engine, AsyncTask &task, int32_t status) { + [deviceId, missionId, errCode, isLowResolution](NativeEngine &engine, AsyncTask &task, int32_t status) { if (errCode != 0) { task.Reject(engine, CreateJsError(engine, errCode, "Invalidate params.")); return; } AAFwk::MissionSnapshot missionSnapshot; auto ret = AbilityManagerClient::GetInstance()->GetMissionSnapshot( - deviceId, missionId, missionSnapshot); + deviceId, missionId, missionSnapshot, isLowResolution); if (ret == 0) { NativeValue* objValue = engine.CreateObject(); NativeObject* object = ConvertNativeValueTo(objValue); @@ -515,6 +521,8 @@ NativeValue* JsMissionManagerInit(NativeEngine* engine, NativeValue* exportObj) BindNativeFunction(*engine, *object, "getMissionInfos", JsMissionManager::GetMissionInfos); BindNativeFunction(*engine, *object, "getMissionInfo", JsMissionManager::GetMissionInfo); BindNativeFunction(*engine, *object, "getMissionSnapShot", JsMissionManager::GetMissionSnapShot); + BindNativeFunction(*engine, *object, "getLowResolutionMissionSnapShot", + JsMissionManager::GetLowResolutionMissionSnapShot); BindNativeFunction(*engine, *object, "lockMission", JsMissionManager::LockMission); BindNativeFunction(*engine, *object, "unlockMission", JsMissionManager::UnlockMission); BindNativeFunction(*engine, *object, "clearMission", JsMissionManager::ClearMission); diff --git a/frameworks/kits/ability/ability_runtime/test/mock/AMS/mock_serviceability_manager_service.h b/frameworks/kits/ability/ability_runtime/test/mock/AMS/mock_serviceability_manager_service.h index 9da99e5e883..6dce8adf485 100644 --- a/frameworks/kits/ability/ability_runtime/test/mock/AMS/mock_serviceability_manager_service.h +++ b/frameworks/kits/ability/ability_runtime/test/mock/AMS/mock_serviceability_manager_service.h @@ -149,7 +149,7 @@ public: } int GetMissionSnapshot( - const std::string& deviceId, const int32_t missionId, MissionSnapshot& snapshot) override + const std::string& deviceId, const int32_t missionId, MissionSnapshot& snapshot, bool isLowResolution) override { return 0; } diff --git a/frameworks/kits/ability/native/test/mock/include/mock_ability_manager_service.h b/frameworks/kits/ability/native/test/mock/include/mock_ability_manager_service.h index 65e8c7250d8..5f3cf1d1b75 100644 --- a/frameworks/kits/ability/native/test/mock/include/mock_ability_manager_service.h +++ b/frameworks/kits/ability/native/test/mock/include/mock_ability_manager_service.h @@ -192,7 +192,8 @@ public: { return 0; } - virtual int GetMissionSnapshot(const std::string& deviceId, int32_t missionId, MissionSnapshot& snapshot) + virtual int GetMissionSnapshot(const std::string& deviceId, int32_t missionId, + MissionSnapshot& snapshot, bool isLowResolution) { return 0; } diff --git a/frameworks/kits/appkit/native/test/mock/ability_delegator/mock_ability_delegator_stub.cpp b/frameworks/kits/appkit/native/test/mock/ability_delegator/mock_ability_delegator_stub.cpp index 246852961b9..414c36477f8 100644 --- a/frameworks/kits/appkit/native/test/mock/ability_delegator/mock_ability_delegator_stub.cpp +++ b/frameworks/kits/appkit/native/test/mock/ability_delegator/mock_ability_delegator_stub.cpp @@ -97,7 +97,7 @@ int MockAbilityDelegatorStub::ReleaseAbility(const sptr &con } int MockAbilityDelegatorStub::GetMissionSnapshot(const std::string& deviceId, int32_t missionId, - MissionSnapshot& snapshot) + MissionSnapshot& snapshot, bool isLowResolution) { return 0; } @@ -279,7 +279,7 @@ int MockAbilityDelegatorStub2::ReleaseAbility(const sptr &co } int MockAbilityDelegatorStub2::GetMissionSnapshot(const std::string& deviceId, int32_t missionId, - MissionSnapshot& snapshot) + MissionSnapshot& snapshot, bool isLowResolution) { return 0; } diff --git a/frameworks/kits/appkit/native/test/mock/ability_delegator/mock_ability_delegator_stub.h b/frameworks/kits/appkit/native/test/mock/ability_delegator/mock_ability_delegator_stub.h index ed3c9a3c118..9ce596a96f2 100644 --- a/frameworks/kits/appkit/native/test/mock/ability_delegator/mock_ability_delegator_stub.h +++ b/frameworks/kits/appkit/native/test/mock/ability_delegator/mock_ability_delegator_stub.h @@ -125,7 +125,8 @@ public: const Want &want, const sptr &connect, const sptr &callerToken) override; virtual int ReleaseAbility(const sptr &connect, const AppExecFwk::ElementName &element) override; - virtual int GetMissionSnapshot(const std::string& deviceId, int32_t missionId, MissionSnapshot& snapshot) override; + virtual int GetMissionSnapshot(const std::string& deviceId, int32_t missionId, + MissionSnapshot& snapshot, bool isLowResolution) override; virtual int RegisterSnapshotHandler(const sptr& handler) override; virtual int SendANRProcessID(int pid) override; virtual int SetAbilityController(const sptr &abilityController, @@ -260,7 +261,8 @@ public: const Want &want, const sptr &connect, const sptr &callerToken) override; virtual int ReleaseAbility(const sptr &connect, const AppExecFwk::ElementName &element) override; - virtual int GetMissionSnapshot(const std::string& deviceId, int32_t missionId, MissionSnapshot& snapshot) override; + virtual int GetMissionSnapshot(const std::string& deviceId, int32_t missionId, + MissionSnapshot& snapshot, bool isLowResolution) override; virtual int RegisterSnapshotHandler(const sptr& handler) override; virtual int SendANRProcessID(int pid) override; virtual int SetAbilityController(const sptr &abilityController, diff --git a/frameworks/kits/appkit/native/test/mock/include/mock_ability_manager_client_interface1.cpp b/frameworks/kits/appkit/native/test/mock/include/mock_ability_manager_client_interface1.cpp index 71b2f1c3060..d5e95063883 100644 --- a/frameworks/kits/appkit/native/test/mock/include/mock_ability_manager_client_interface1.cpp +++ b/frameworks/kits/appkit/native/test/mock/include/mock_ability_manager_client_interface1.cpp @@ -137,11 +137,6 @@ ErrCode AbilityManagerClient::StopServiceAbility(const Want &want, const sptr& handler) override; - virtual int GetMissionSnapshot(const std::string& deviceId, int32_t missionId, MissionSnapshot& snapshot) override; + virtual int GetMissionSnapshot(const std::string& deviceId, int32_t missionId, + MissionSnapshot& snapshot, bool isLowResolution) override; virtual int StartUserTest(const Want &want, const sptr &observer) override; diff --git a/services/abilitymgr/include/ability_manager_service.h b/services/abilitymgr/include/ability_manager_service.h index eb3290cf105..ed13c13dfc1 100644 --- a/services/abilitymgr/include/ability_manager_service.h +++ b/services/abilitymgr/include/ability_manager_service.h @@ -628,7 +628,7 @@ public: virtual int RegisterSnapshotHandler(const sptr& handler) override; virtual int32_t GetMissionSnapshot(const std::string& deviceId, int32_t missionId, - MissionSnapshot& snapshot) override; + MissionSnapshot& snapshot, bool isLowResolution) override; /** * Set ability controller. diff --git a/services/abilitymgr/include/mission_data_storage.h b/services/abilitymgr/include/mission_data_storage.h index af9f5cab329..fafd66ab48b 100644 --- a/services/abilitymgr/include/mission_data_storage.h +++ b/services/abilitymgr/include/mission_data_storage.h @@ -29,8 +29,12 @@ namespace AAFwk { const std::string TASK_DATA_FILE_BASE_PATH = "/data/service/el1/public/AbilityManagerService"; const std::string MISSION_DATA_FILE_PATH = "MissionInfo"; const std::string MISSION_JSON_FILE_PREFIX = "mission"; +const std::string LOW_RESOLUTION_FLAG = "little"; const std::string JSON_FILE_SUFFIX = ".json"; const std::string PNG_FILE_SUFFIX = ".png"; +const std::string FILE_SEPARATOR = "/"; +const std::string UNDERLINE_SEPARATOR = "_"; +const int32_t SCALE = 2; class MissionDataStorage : public std::enable_shared_from_this { public: @@ -73,25 +77,31 @@ public: /** * @brief Get the Mission Snapshot object - * @param missionId - * @param missionSnapshot + * @param missionId id of mission. + * @param missionSnapshot snapshot of target mission id. + * @param isLowResolution low resolution. * @return Returns true if this function is successfully called; returns false otherwise. */ - bool GetMissionSnapshot(int32_t missionId, MissionSnapshot& missionSnapshot); + bool GetMissionSnapshot(int32_t missionId, MissionSnapshot& missionSnapshot, bool isLowResolution); #ifdef SUPPORT_GRAPHICS -public: + /** + * Get low resoultion pixelmap of source. + * + * @param source source pixelmap. + * @return return reduced pixel map. + */ + static std::shared_ptr GetReducedPixelMap( + const std::shared_ptr& source); + /** * @brief Get the Snapshot object * @param missionId Indicates this mission id. * @return Returns PixelMap of snapshot. */ - sptr GetSnapshot(int missionId) const; - - std::unique_ptr GetPixelMap(int missionId) const; + sptr GetSnapshot(int missionId, bool isLowResolution = false) const; -private: - std::map> cachedPixelMap_; + std::unique_ptr GetPixelMap(int missionId, bool isLowResolution) const; #endif private: @@ -99,10 +109,11 @@ private: std::string GetMissionDataFilePath(int missionId); - std::string GetMissionSnapshotPath(int32_t missionId) const; + std::string GetMissionSnapshotPath(int32_t missionId, bool isLowResolution) const; bool CheckFileNameValid(const std::string &fileName); +#ifdef SUPPORT_GRAPHICS bool WriteToPng(const char* fileName, uint32_t width, uint32_t height, const uint8_t* data); bool GetCachedSnapshot(int32_t missionId, MissionSnapshot& missionSnapshot); @@ -110,13 +121,20 @@ private: bool SaveCachedSnapshot(int32_t missionId, const MissionSnapshot& missionSnapshot); bool DeleteCachedSnapshot(int32_t missionId); + void DeleteMissionSnapshot(int32_t missionId, bool isLowResolution); void SaveSnapshotFile(int32_t missionId, const MissionSnapshot& missionSnapshot); + void SaveSnapshotFile(int32_t missionId, const std::shared_ptr& snapshot, + bool isPrivate, bool isLowResolution); + + std::map> cachedPixelMap_; +#endif + int userId_ = 0; std::shared_ptr handler_; std::mutex cachedPixelMapMutex_; }; } // namespace AAFwk } // namespace OHOS -#endif // FOUNDATION_AAFWK_SERVICES_ABILITYMGR_INCLUDE_MISSION_DATA_STORAGE_H +#endif // FOUNDATION_AAFWK_SERVICES_ABILITYMGR_INCLUDE_MISSION_DATA_STORAGE_H \ No newline at end of file diff --git a/services/abilitymgr/include/mission_info_mgr.h b/services/abilitymgr/include/mission_info_mgr.h index dd18bee70e7..3aba35194c1 100644 --- a/services/abilitymgr/include/mission_info_mgr.h +++ b/services/abilitymgr/include/mission_info_mgr.h @@ -137,10 +137,11 @@ public: * @param missionId mission id * @param abilityToken abilityToken to get current mission snapshot * @param missionSnapshot result of snapshot + * @param isLowResolution low resolution snapshot. * @return return true if update mission snapshot success, else false */ bool UpdateMissionSnapshot(int32_t missionId, const sptr& abilityToken, - MissionSnapshot& missionSnapshot) const; + MissionSnapshot& missionSnapshot, bool isLowResolution = false) const; #ifdef SUPPORT_GRAPHICS /** @@ -156,11 +157,12 @@ public: * @param missionId mission id * @param abilityToken abilityToken to get current mission snapshot * @param missionSnapshot result of snapshot + # @param isLowResolution low resolution. * @param force force get snapshot from window manager service. * @return true return true if get mission snapshot success, else false */ bool GetMissionSnapshot(int32_t missionId, const sptr& abilityToken, - MissionSnapshot& missionSnapshot, bool force = false) const; + MissionSnapshot& missionSnapshot, bool isLowResolution, bool force = false) const; /** * @brief register snapshotHandler diff --git a/services/abilitymgr/include/mission_list_manager.h b/services/abilitymgr/include/mission_list_manager.h index 9899f974502..9b29932c62d 100644 --- a/services/abilitymgr/include/mission_list_manager.h +++ b/services/abilitymgr/include/mission_list_manager.h @@ -317,10 +317,11 @@ public: * @param missionId mission id * @param abilityToken abilityToken to get current mission snapshot * @param missionSnapshot result of snapshot + * @param isLowResolution low resolution. * @return Returns true on success, false on failure. */ bool GetMissionSnapshot(int32_t missionId, const sptr& abilityToken, - MissionSnapshot& missionSnapshot); + MissionSnapshot& missionSnapshot, bool isLowResolution); void GetAbilityRunningInfos(std::vector &info, bool isPerm); #ifdef ABILITY_COMMAND_FOR_TEST diff --git a/services/abilitymgr/include/task_data_persistence_mgr.h b/services/abilitymgr/include/task_data_persistence_mgr.h index 437c640e475..df145af92b0 100644 --- a/services/abilitymgr/include/task_data_persistence_mgr.h +++ b/services/abilitymgr/include/task_data_persistence_mgr.h @@ -88,10 +88,11 @@ public: /** * @brief Get the mission snapshot object * @param missionId id of mission - * @param missionSnapshot + * @param missionSnapshot output snapshot of mission. + * @param isLowResolution low resolution. * @return return true if update mission snapshot success, else false */ - bool GetMissionSnapshot(int missionId, MissionSnapshot& missionSnapshot); + bool GetMissionSnapshot(int missionId, MissionSnapshot& missionSnapshot, bool isLowResolution); private: std::unordered_map> missionDataStorageMgr_; diff --git a/services/abilitymgr/src/ability_manager_client.cpp b/services/abilitymgr/src/ability_manager_client.cpp index 40e6b1d7f2a..9a9dc6ffbdd 100644 --- a/services/abilitymgr/src/ability_manager_client.cpp +++ b/services/abilitymgr/src/ability_manager_client.cpp @@ -741,11 +741,11 @@ ErrCode AbilityManagerClient::RegisterSnapshotHandler(const sptrGetMissionSnapshot(deviceId, missionId, snapshot); + return abms->GetMissionSnapshot(deviceId, missionId, snapshot, isLowResolution); } ErrCode AbilityManagerClient::StartUserTest(const Want &want, const sptr &observer) diff --git a/services/abilitymgr/src/ability_manager_proxy.cpp b/services/abilitymgr/src/ability_manager_proxy.cpp index f2c83a6cc8b..da8d4f1a1ef 100644 --- a/services/abilitymgr/src/ability_manager_proxy.cpp +++ b/services/abilitymgr/src/ability_manager_proxy.cpp @@ -843,7 +843,8 @@ int AbilityManagerProxy::GetParcelableInfos(MessageParcel &reply, std::vector return NO_ERROR; } -int AbilityManagerProxy::GetMissionSnapshot(const std::string& deviceId, int32_t missionId, MissionSnapshot& snapshot) +int AbilityManagerProxy::GetMissionSnapshot(const std::string& deviceId, int32_t missionId, + MissionSnapshot& snapshot, bool isLowResolution) { int error; MessageParcel data; @@ -861,6 +862,10 @@ int AbilityManagerProxy::GetMissionSnapshot(const std::string& deviceId, int32_t HILOG_ERROR("missionId write failed."); return ERR_INVALID_VALUE; } + if (!data.WriteBool(isLowResolution)) { + HILOG_ERROR("isLowResolution write failed."); + return ERR_INVALID_VALUE; + } error = Remote()->SendRequest(IAbilityManager::GET_MISSION_SNAPSHOT_INFO, data, reply, option); if (error != NO_ERROR) { HILOG_ERROR("Send request error: %{public}d", error); diff --git a/services/abilitymgr/src/ability_manager_service.cpp b/services/abilitymgr/src/ability_manager_service.cpp index 24b68f4c076..93ab652de51 100644 --- a/services/abilitymgr/src/ability_manager_service.cpp +++ b/services/abilitymgr/src/ability_manager_service.cpp @@ -3795,7 +3795,7 @@ int AbilityManagerService::RegisterSnapshotHandler(const sptr& } int32_t AbilityManagerService::GetMissionSnapshot(const std::string& deviceId, int32_t missionId, - MissionSnapshot& missionSnapshot) + MissionSnapshot& missionSnapshot, bool isLowResolution) { if (VerifyMissionPermission() == CHECK_PERMISSION_FAILED) { HILOG_ERROR("%{public}s: Permission verification failed", __func__); @@ -3812,7 +3812,7 @@ int32_t AbilityManagerService::GetMissionSnapshot(const std::string& deviceId, i return INNER_ERR; } auto token = GetAbilityTokenByMissionId(missionId); - bool result = currentMissionListManager_->GetMissionSnapshot(missionId, token, missionSnapshot); + bool result = currentMissionListManager_->GetMissionSnapshot(missionId, token, missionSnapshot, isLowResolution); if (!result) { return INNER_ERR; } diff --git a/services/abilitymgr/src/ability_manager_stub.cpp b/services/abilitymgr/src/ability_manager_stub.cpp index c0c673befa9..a0583cfbd65 100644 --- a/services/abilitymgr/src/ability_manager_stub.cpp +++ b/services/abilitymgr/src/ability_manager_stub.cpp @@ -1188,8 +1188,9 @@ int AbilityManagerStub::GetMissionSnapshotInfoInner(MessageParcel &data, Message { std::string deviceId = data.ReadString(); int32_t missionId = data.ReadInt32(); + bool isLowResolution = data.ReadBool(); MissionSnapshot missionSnapshot; - int32_t result = GetMissionSnapshot(deviceId, missionId, missionSnapshot); + int32_t result = GetMissionSnapshot(deviceId, missionId, missionSnapshot, isLowResolution); HILOG_INFO("snapshot: AbilityManagerStub get snapshot result = %{public}d", result); if (!reply.WriteParcelable(&missionSnapshot)) { HILOG_ERROR("GetMissionSnapshot error"); diff --git a/services/abilitymgr/src/mission_data_storage.cpp b/services/abilitymgr/src/mission_data_storage.cpp index d3d3d118d47..0dff8adc319 100644 --- a/services/abilitymgr/src/mission_data_storage.cpp +++ b/services/abilitymgr/src/mission_data_storage.cpp @@ -103,6 +103,46 @@ void MissionDataStorage::DeleteMissionInfo(int missionId) DeleteMissionSnapshot(missionId); } +void MissionDataStorage::SaveMissionSnapshot(int32_t missionId, const MissionSnapshot& missionSnapshot) +{ +#ifdef SUPPORT_GRAPHICS + HILOG_INFO("snapshot: save snapshot from cache, missionId = %{public}d", missionId); + SaveCachedSnapshot(missionId, missionSnapshot); + SaveSnapshotFile(missionId, missionSnapshot); + HILOG_INFO("snapshot: delete snapshot from cache, missionId = %{public}d", missionId); + DeleteCachedSnapshot(missionId); +#endif +} + +void MissionDataStorage::DeleteMissionSnapshot(int32_t missionId) +{ +#ifdef SUPPORT_GRAPHICS + DeleteMissionSnapshot(missionId, false); + DeleteMissionSnapshot(missionId, true); +#endif +} + +bool MissionDataStorage::GetMissionSnapshot(int32_t missionId, MissionSnapshot& missionSnapshot, bool isLowResolution) +{ +#ifdef SUPPORT_GRAPHICS + if (GetCachedSnapshot(missionId, missionSnapshot)) { + if (isLowResolution) { + missionSnapshot.snapshot = GetReducedPixelMap(missionSnapshot.snapshot); + } + HILOG_INFO("snapshot: GetMissionSnapshot from cache, missionId = %{public}d", missionId); + return true; + } + + auto pixelMap = GetPixelMap(missionId, isLowResolution); + if (!pixelMap) { + HILOG_ERROR("%{public}s: GetPixelMap failed.", __func__); + return false; + } + missionSnapshot.snapshot = std::move(pixelMap); +#endif + return true; +} + std::string MissionDataStorage::GetMissionDataDirPath() const { return TASK_DATA_FILE_BASE_PATH + "/" + std::to_string(userId_) + "/" + MISSION_DATA_FILE_PATH; @@ -114,6 +154,17 @@ std::string MissionDataStorage::GetMissionDataFilePath(int missionId) + MISSION_JSON_FILE_PREFIX + "_" + std::to_string(missionId) + JSON_FILE_SUFFIX; } +std::string MissionDataStorage::GetMissionSnapshotPath(int32_t missionId, bool isLowResolution) const +{ + std::string filePath = GetMissionDataDirPath() + FILE_SEPARATOR + MISSION_JSON_FILE_PREFIX + + UNDERLINE_SEPARATOR + std::to_string(missionId); + if (isLowResolution) { + filePath = filePath + UNDERLINE_SEPARATOR + LOW_RESOLUTION_FLAG; + } + filePath = filePath + PNG_FILE_SUFFIX; + return filePath; +} + bool MissionDataStorage::CheckFileNameValid(const std::string &fileName) { std::string fileNameExcludePath = OHOS::HiviewDFX::FileUtil::ExtractFileName(fileName); @@ -140,9 +191,21 @@ bool MissionDataStorage::CheckFileNameValid(const std::string &fileName) return true; } +#ifdef SUPPORT_GRAPHICS void MissionDataStorage::SaveSnapshotFile(int32_t missionId, const MissionSnapshot& missionSnapshot) { - std::string filePath = GetMissionSnapshotPath(missionId); + SaveSnapshotFile(missionId, missionSnapshot.snapshot, missionSnapshot.isPrivate, false); + SaveSnapshotFile(missionId, GetReducedPixelMap(missionSnapshot.snapshot), missionSnapshot.isPrivate, true); +} + +void MissionDataStorage::SaveSnapshotFile(int32_t missionId, const std::shared_ptr& snapshot, + bool isPrivate, bool isLowResolution) +{ + if (!snapshot) { + return; + } + + std::string filePath = GetMissionSnapshotPath(missionId, isLowResolution); std::string dirPath = OHOS::HiviewDFX::FileUtil::ExtractFilePath(filePath); if (!OHOS::HiviewDFX::FileUtil::FileExists(dirPath)) { bool createDir = OHOS::HiviewDFX::FileUtil::ForceCreateDirectory(dirPath); @@ -151,79 +214,75 @@ void MissionDataStorage::SaveSnapshotFile(int32_t missionId, const MissionSnapsh return; } } -#ifdef SUPPORT_GRAPHICS + bool saveMissionFile = false; - if (missionSnapshot.isPrivate) { - ssize_t dataLength = missionSnapshot.snapshot->GetWidth() * missionSnapshot.snapshot->GetHeight() * BPP; + if (isPrivate) { + ssize_t dataLength = snapshot->GetWidth() * snapshot->GetHeight() * BPP; uint8_t* data = (uint8_t*) malloc(dataLength); if (memset_s(data, dataLength, 0xff, dataLength) == EOK) { - saveMissionFile = WriteToPng(filePath.c_str(), missionSnapshot.snapshot->GetWidth(), - missionSnapshot.snapshot->GetHeight(), data); + saveMissionFile = WriteToPng(filePath.c_str(), snapshot->GetWidth(), snapshot->GetHeight(), data); } free(data); } else { - const uint8_t* data = missionSnapshot.snapshot->GetPixels(); - saveMissionFile = WriteToPng(filePath.c_str(), missionSnapshot.snapshot->GetWidth(), - missionSnapshot.snapshot->GetHeight(), data); + const uint8_t* data = snapshot->GetPixels(); + saveMissionFile = WriteToPng(filePath.c_str(), snapshot->GetWidth(), snapshot->GetHeight(), data); } if (!saveMissionFile) { HILOG_ERROR("snapshot: save mission snapshot failed, path = %{public}s.", filePath.c_str()); } -#endif } -void MissionDataStorage::SaveMissionSnapshot(int32_t missionId, const MissionSnapshot& missionSnapshot) +std::shared_ptr MissionDataStorage::GetReducedPixelMap( + const std::shared_ptr& snapshot) { - HILOG_INFO("snapshot: save snapshot from cache, missionId = %{public}d", missionId); - SaveCachedSnapshot(missionId, missionSnapshot); - SaveSnapshotFile(missionId, missionSnapshot); - HILOG_INFO("snapshot: delete snapshot from cache, missionId = %{public}d", missionId); - DeleteCachedSnapshot(missionId); + if (!snapshot) { + return nullptr; + } + + OHOS::Media::InitializationOptions options; + options.size.width = snapshot->GetWidth() / SCALE; + options.size.height = snapshot->GetHeight() / SCALE; + std::unique_ptr reducedPixelMap = OHOS::Media::PixelMap::Create(*snapshot, options); + return std::shared_ptr(reducedPixelMap.release()); } bool MissionDataStorage::GetCachedSnapshot(int32_t missionId, MissionSnapshot& missionSnapshot) { -#ifdef SUPPORT_GRAPHICS std::lock_guard lock(cachedPixelMapMutex_); auto pixelMap = cachedPixelMap_.find(missionId); if (pixelMap != cachedPixelMap_.end()) { missionSnapshot.snapshot = pixelMap->second; return true; } -#endif return false; } bool MissionDataStorage::SaveCachedSnapshot(int32_t missionId, const MissionSnapshot& missionSnapshot) { -#ifdef SUPPORT_GRAPHICS std::lock_guard lock(cachedPixelMapMutex_); auto result = cachedPixelMap_.insert_or_assign(missionId, missionSnapshot.snapshot); if (!result.second) { HILOG_ERROR("snapshot: save snapshot cache failed, missionId = %{public}d", missionId); return false; } -#endif return true; } bool MissionDataStorage::DeleteCachedSnapshot(int32_t missionId) { -#ifdef SUPPORT_GRAPHICS std::lock_guard lock(cachedPixelMapMutex_); auto result = cachedPixelMap_.erase(missionId); if (result != 1) { HILOG_ERROR("snapshot: delete snapshot cache failed, missionId = %{public}d", missionId); return false; } -#endif return true; } -void MissionDataStorage::DeleteMissionSnapshot(int32_t missionId) +void MissionDataStorage::DeleteMissionSnapshot(int32_t missionId, bool isLowResolution) { - std::string filePath = GetMissionSnapshotPath(missionId); + std::string filePath = GetMissionSnapshotPath(missionId, isLowResolution); std::string dirPath = OHOS::HiviewDFX::FileUtil::ExtractFilePath(filePath); if (!OHOS::HiviewDFX::FileUtil::FileExists(filePath)) { HILOG_WARN("snapshot: remove snapshot file %{public}s failed, file not exists", filePath.c_str()); @@ -235,10 +294,9 @@ void MissionDataStorage::DeleteMissionSnapshot(int32_t missionId) } } -#ifdef SUPPORT_GRAPHICS -sptr MissionDataStorage::GetSnapshot(int missionId) const +sptr MissionDataStorage::GetSnapshot(int missionId, bool isLowResolution) const { - auto pixelMapPtr = GetPixelMap(missionId); + auto pixelMapPtr = GetPixelMap(missionId, isLowResolution); if (!pixelMapPtr) { HILOG_ERROR("%{public}s: GetPixelMap failed.", __func__); return nullptr; @@ -246,9 +304,9 @@ sptr MissionDataStorage::GetSnapshot(int missionId) const return sptr(pixelMapPtr.release()); } -std::unique_ptr MissionDataStorage::GetPixelMap(int missionId) const +std::unique_ptr MissionDataStorage::GetPixelMap(int missionId, bool isLowResolution) const { - std::string filePath = GetMissionSnapshotPath(missionId); + std::string filePath = GetMissionSnapshotPath(missionId, isLowResolution); if (!OHOS::HiviewDFX::FileUtil::FileExists(filePath)) { HILOG_INFO("snapshot: storage snapshot not exists, missionId = %{public}d", missionId); return nullptr; @@ -268,35 +326,9 @@ std::unique_ptr MissionDataStorage::GetPixelMap(int missionId) } return pixelMapPtr; } -#endif - -bool MissionDataStorage::GetMissionSnapshot(int32_t missionId, MissionSnapshot& missionSnapshot) -{ -#ifdef SUPPORT_GRAPHICS - if (GetCachedSnapshot(missionId, missionSnapshot)) { - HILOG_INFO("snapshot: GetMissionSnapshot from cache, missionId = %{public}d", missionId); - return true; - } - - auto pixelMap = GetPixelMap(missionId); - if (!pixelMap) { - HILOG_ERROR("%{public}s: GetPixelMap failed.", __func__); - return false; - } - missionSnapshot.snapshot = std::move(pixelMap); -#endif - return true; -} - -std::string MissionDataStorage::GetMissionSnapshotPath(int32_t missionId) const -{ - return GetMissionDataDirPath() + "/" - + MISSION_JSON_FILE_PREFIX + "_" + std::to_string(missionId) + PNG_FILE_SUFFIX; -} bool MissionDataStorage::WriteToPng(const char* fileName, uint32_t width, uint32_t height, const uint8_t* data) { -#ifdef SUPPORT_GRAPHICS if (data == nullptr) { HILOG_ERROR("snapshot: data error, nullptr!\n"); return false; @@ -347,8 +379,9 @@ bool MissionDataStorage::WriteToPng(const char* fileName, uint32_t width, uint32 // free memory png_destroy_write_struct(&png_ptr, &info_ptr); (void)fclose(fp); -#endif + return true; } +#endif } // namespace AAFwk -} // namespace OHOS +} // namespace OHOS \ No newline at end of file diff --git a/services/abilitymgr/src/mission_info_mgr.cpp b/services/abilitymgr/src/mission_info_mgr.cpp index b6fc85c75bc..83d4ee27c13 100644 --- a/services/abilitymgr/src/mission_info_mgr.cpp +++ b/services/abilitymgr/src/mission_info_mgr.cpp @@ -405,7 +405,7 @@ void MissionInfoMgr::RegisterSnapshotHandler(const sptr& handl } bool MissionInfoMgr::UpdateMissionSnapshot(int32_t missionId, const sptr& abilityToken, - MissionSnapshot& missionSnapshot) const + MissionSnapshot& missionSnapshot, bool isLowResolution) const { HILOG_INFO("Update mission snapshot, missionId:%{public}d.", missionId); std::lock_guard lock(mutex_); @@ -430,11 +430,18 @@ bool MissionInfoMgr::UpdateMissionSnapshot(int32_t missionId, const sptrmissionInfo.want.GetElement(); - if (!taskDataPersistenceMgr_->SaveMissionSnapshot(missionId, missionSnapshot)) { + + MissionSnapshot savedSnapshot = missionSnapshot; +#ifdef SUPPORT_GRAPHICS + savedSnapshot.snapshot = snapshot.GetPixelMap(); +#endif + if (!taskDataPersistenceMgr_->SaveMissionSnapshot(missionId, savedSnapshot)) { HILOG_ERROR("snapshot: save mission snapshot failed"); return false; } @@ -463,7 +470,7 @@ sptr MissionInfoMgr::GetSnapshot(int32_t missionId) const #endif bool MissionInfoMgr::GetMissionSnapshot(int32_t missionId, const sptr& abilityToken, - MissionSnapshot& missionSnapshot, bool force) const + MissionSnapshot& missionSnapshot, bool isLowResolution, bool force) const { HILOG_INFO("mission_list_info GetMissionSnapshot, missionId:%{public}d, force:%{public}d", missionId, force); std::lock_guard lock(mutex_); @@ -481,16 +488,16 @@ bool MissionInfoMgr::GetMissionSnapshot(int32_t missionId, const sptrGetMissionSnapshot(missionId, missionSnapshot)) { + if (taskDataPersistenceMgr_->GetMissionSnapshot(missionId, missionSnapshot, isLowResolution)) { missionSnapshot.topAbility = it->missionInfo.want.GetElement(); HILOG_ERROR("mission_list_info GetMissionSnapshot, find snapshot OK, missionId:%{public}d", missionId); return true; } HILOG_INFO("snapshot: storage mission snapshot not exists, create new snapshot"); - return UpdateMissionSnapshot(missionId, abilityToken, missionSnapshot); + return UpdateMissionSnapshot(missionId, abilityToken, missionSnapshot, isLowResolution); } } // namespace AAFwk } // namespace OHOS diff --git a/services/abilitymgr/src/mission_list_manager.cpp b/services/abilitymgr/src/mission_list_manager.cpp index b09c1615bb1..fce615f2a8f 100644 --- a/services/abilitymgr/src/mission_list_manager.cpp +++ b/services/abilitymgr/src/mission_list_manager.cpp @@ -2443,7 +2443,7 @@ void MissionListManager::RegisterSnapshotHandler(const sptr& h } bool MissionListManager::GetMissionSnapshot(int32_t missionId, const sptr& abilityToken, - MissionSnapshot& missionSnapshot) + MissionSnapshot& missionSnapshot, bool isLowResolution) { HILOG_INFO("snapshot: Start get mission snapshot."); bool forceSnapshot = false; @@ -2455,7 +2455,7 @@ bool MissionListManager::GetMissionSnapshot(int32_t missionId, const sptr::GetInstance()->GetMissionSnapshot( - missionId, abilityToken, missionSnapshot, forceSnapshot); + missionId, abilityToken, missionSnapshot, isLowResolution, forceSnapshot); } void MissionListManager::GetAbilityRunningInfos(std::vector &info, bool isPerm) diff --git a/services/abilitymgr/src/task_data_persistence_mgr.cpp b/services/abilitymgr/src/task_data_persistence_mgr.cpp index 3e656985817..d3ceed284aa 100644 --- a/services/abilitymgr/src/task_data_persistence_mgr.cpp +++ b/services/abilitymgr/src/task_data_persistence_mgr.cpp @@ -150,14 +150,14 @@ sptr TaskDataPersistenceMgr::GetSnapshot(int missionId) const } #endif -bool TaskDataPersistenceMgr::GetMissionSnapshot(int missionId, MissionSnapshot& snapshot) +bool TaskDataPersistenceMgr::GetMissionSnapshot(int missionId, MissionSnapshot& snapshot, bool isLowResolution) { std::lock_guard lock(mutex_); if (!currentMissionDataStorage_) { HILOG_ERROR("snapshot: currentMissionDataStorage_ is nullptr"); return false; } - return currentMissionDataStorage_->GetMissionSnapshot(missionId, snapshot); + return currentMissionDataStorage_->GetMissionSnapshot(missionId, snapshot, isLowResolution); } } // namespace AAFwk } // namespace OHOS diff --git a/services/abilitymgr/test/unittest/phone/ability_manager_client_test/ability_manager_stub_mock_test.h b/services/abilitymgr/test/unittest/phone/ability_manager_client_test/ability_manager_stub_mock_test.h index d6ffbfbcb26..bfd53331f67 100644 --- a/services/abilitymgr/test/unittest/phone/ability_manager_client_test/ability_manager_stub_mock_test.h +++ b/services/abilitymgr/test/unittest/phone/ability_manager_client_test/ability_manager_stub_mock_test.h @@ -205,7 +205,8 @@ public: { return 0; } - virtual int GetMissionSnapshot(const std::string& deviceId, int32_t missionId, MissionSnapshot& snapshot) + virtual int GetMissionSnapshot(const std::string& deviceId, int32_t missionId, + MissionSnapshot& snapshot, bool isLowResolution) { return 0; } diff --git a/services/abilitymgr/test/unittest/phone/ability_manager_proxy_test/ability_manager_stub_mock.h b/services/abilitymgr/test/unittest/phone/ability_manager_proxy_test/ability_manager_stub_mock.h index f7d4e7001de..9485a421566 100644 --- a/services/abilitymgr/test/unittest/phone/ability_manager_proxy_test/ability_manager_stub_mock.h +++ b/services/abilitymgr/test/unittest/phone/ability_manager_proxy_test/ability_manager_stub_mock.h @@ -211,7 +211,8 @@ public: { return 0; } - virtual int GetMissionSnapshot(const std::string& deviceId, int32_t missionId, MissionSnapshot& snapshot) + virtual int GetMissionSnapshot(const std::string& deviceId, int32_t missionId, + MissionSnapshot& snapshot, bool isLowResolution) { return 0; } diff --git a/services/abilitymgr/test/unittest/phone/ability_manager_stub_test/ability_manager_stub_impl_mock.h b/services/abilitymgr/test/unittest/phone/ability_manager_stub_test/ability_manager_stub_impl_mock.h index 1ecb45bd96c..2af160c590a 100644 --- a/services/abilitymgr/test/unittest/phone/ability_manager_stub_test/ability_manager_stub_impl_mock.h +++ b/services/abilitymgr/test/unittest/phone/ability_manager_stub_test/ability_manager_stub_impl_mock.h @@ -283,7 +283,8 @@ public: { return 0; } - virtual int GetMissionSnapshot(const std::string& deviceId, int32_t missionId, MissionSnapshot& snapshot) + virtual int GetMissionSnapshot(const std::string& deviceId, int32_t missionId, + MissionSnapshot& snapshot, bool isLowResolution) { return 0; } diff --git a/services/abilitymgr/test/unittest/phone/ability_manager_test/ability_manager_stub_mock.h b/services/abilitymgr/test/unittest/phone/ability_manager_test/ability_manager_stub_mock.h index e804f9e13bc..a7cec185110 100644 --- a/services/abilitymgr/test/unittest/phone/ability_manager_test/ability_manager_stub_mock.h +++ b/services/abilitymgr/test/unittest/phone/ability_manager_test/ability_manager_stub_mock.h @@ -120,7 +120,8 @@ public: { return 0; } - virtual int GetMissionSnapshot(const std::string& deviceId, int32_t missionId, MissionSnapshot& snapshot) + virtual int GetMissionSnapshot(const std::string& deviceId, int32_t missionId, + MissionSnapshot& snapshot, bool isLowResolution) { return 0; } diff --git a/services/test/mock/include/mock_ability_mgr_service.h b/services/test/mock/include/mock_ability_mgr_service.h index 9fdb452e9cf..642d02d71cb 100644 --- a/services/test/mock/include/mock_ability_mgr_service.h +++ b/services/test/mock/include/mock_ability_mgr_service.h @@ -153,7 +153,8 @@ public: { return 0; } - virtual int GetMissionSnapshot(const std::string& deviceId, int32_t missionId, MissionSnapshot& snapshot) + virtual int GetMissionSnapshot(const std::string& deviceId, int32_t missionId, + MissionSnapshot& snapshot, bool isLowResolution) { return 0; } diff --git a/tools/test/mock/mock_ability_manager_stub.h b/tools/test/mock/mock_ability_manager_stub.h index 43ef397085d..a9cdb7d5941 100644 --- a/tools/test/mock/mock_ability_manager_stub.h +++ b/tools/test/mock/mock_ability_manager_stub.h @@ -158,7 +158,8 @@ public: return 0; } - virtual int GetMissionSnapshot(const std::string& deviceId, int32_t missionId, MissionSnapshot& snapshot) + virtual int GetMissionSnapshot(const std::string& deviceId, int32_t missionId, + MissionSnapshot& snapshot, bool isLowResolution) { return 0; } -- Gitee