diff --git a/frameworks/js/napi/aafwk/mission_manager/mission_manager.cpp b/frameworks/js/napi/aafwk/mission_manager/mission_manager.cpp index e7bd6f68b00f1c9df0e2d6c3b4f15ec8819f5673..5ebd2315f924fc39a8fcc5c6d5d788467dbde617 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 9da99e5e883fb3c7e8089d6894fef9b4df707568..6dce8adf485661cf46310333bf91bbdadf43e88b 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 65e8c7250d81f85f76e26495b4fc3be76dd7df93..5f3cf1d1b75fa24006b346ade2c7584bd3e603db 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 246852961b93fbb4105838361e5d186ab97cb58a..414c36477f8012b0535e9725fc2ea3419a824875 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 ed3c9a3c118c4129d599975ad992cbe726cae920..9ce596a96f27a98904b9f448911c0ad0d37e87d4 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 71b2f1c30608829ae694101bf22751dbddc31514..d5e95063883f29c472773367728ba33597084f7d 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 eb3290cf105c3e2238b4bf4f4ab6584bf72c3659..ed13c13dfc12371b991d1e3ae3ae9e45d4a814be 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 af9f5cab329a5dc5daf1597ea82a74f7cdfecc53..fafd66ab48bbc173cb0ff218adc0ab5173fcc244 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 dd18bee70e7eb6309a157b9a95f809d37ec1edaa..3aba35194c1387cd77911d6db301ab353dbdbbf2 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 9899f974502a55a2351da08ba5e04417c2286c21..9b29932c62d8d9f7b4d2c4b6440f7e72d52b3577 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 437c640e4755bba3d616add0c03aa4730223cca7..df145af92b05a252eb4be8b5523e55db3813964a 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 40e6b1d7f2a97eb9a3300b6dc7bd176278927d2d..9a9dc6ffbdd6d99e7dce31e5e1335c1d6eadf796 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 f2c83a6cc8bd13f03378ee8586539371d94f28d3..da8d4f1a1effc77399f1e45fb0d1b253a8e8f124 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 24b68f4c076485c5d4332125cda5b21a8b157ae3..93ab652de51ec336f8b1ec04fce31a71d5aa6510 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 c0c673befa92d9379c0667fc2a147c90cc618b77..a0583cfbd65c99a726b4e936c35b6536e29f6da0 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 d3d3d118d47479f45b141b84f2ba9960cee9ac55..0dff8adc31919f78e10265d83f430f855c1d8070 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 b6fc85c75bc22ea4f9ba9b8becd9e9306d659b9a..83d4ee27c13f15c74200b5827b2caa6b52ed30e4 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 b09c1615bb19c3a5f6a166cb38e427bc61cdef90..fce615f2a8fb8a5dfe4ee173ec56cc3c30187785 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 3e656985817c06979bd387bb6e54844bdb31a729..d3ceed284aaddeb301ade533fe0c1fb8d482bff8 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 d6ffbfbcb26df6921bc27013f02cf02996aa26d2..bfd53331f67656fcd1c52f69c0168d6e0d83d6a7 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 f7d4e7001de50741d3844a3022208fd851c85c12..9485a42156639919d4fa0fe07daa4e523ecc3a82 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 1ecb45bd96c06077889bfabbda4cc5f95bc45288..2af160c590aa27600278dabe27e862c30a59cbb3 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 e804f9e13bca98b00a6d6eef946ffa5b6f9c1cb2..a7cec185110b485d8413217901419909f37f280e 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 9fdb452e9cfab941448d56a44d43dd82ccb8b445..642d02d71cb6b1e9a1861f8bd6f1ea34384c70d3 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 43ef397085db0930b69f17ddf481aeca99332bb8..a9cdb7d59415c0e0abbb348c7c9f630d476beaaf 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; }