From 8f98a98409e9ced127c39202bf1a7948c6ef9640 Mon Sep 17 00:00:00 2001 From: raul <3293272615@qq.com> Date: Fri, 14 Jan 2022 11:31:43 +0800 Subject: [PATCH 1/2] fix mission snapshot problem Signed-off-by: laoyitong Change-Id: I54a0b9c281547bf0d26d9d64825a2790317a21b6 --- .../include/ability_manager_interface.h | 1 + .../aafwk/mission_manager/mission_manager.cpp | 6 +- services/abilitymgr/BUILD.gn | 1 + .../include/ability_manager_service.h | 1 + .../abilitymgr/src/ability_manager_proxy.cpp | 2 +- .../src/ability_manager_service.cpp | 69 ++++++++++++++++++- .../abilitymgr/src/ability_manager_stub.cpp | 1 + 7 files changed, 75 insertions(+), 6 deletions(-) diff --git a/interfaces/innerkits/ability_manager/include/ability_manager_interface.h b/interfaces/innerkits/ability_manager/include/ability_manager_interface.h index 4357ee24a3c..015d8768312 100755 --- a/interfaces/innerkits/ability_manager/include/ability_manager_interface.h +++ b/interfaces/innerkits/ability_manager/include/ability_manager_interface.h @@ -794,6 +794,7 @@ public: START_SYNC_MISSIONS = 1112, STOP_SYNC_MISSIONS = 1113, REGISTER_SNAPSHOT_HANDLER = 1114, + GET_MISSION_SNAPSHOT_INFO = 1115, // ipc id 2001-3000 for tools // ipc id for dumping state (2001) diff --git a/interfaces/kits/napi/aafwk/mission_manager/mission_manager.cpp b/interfaces/kits/napi/aafwk/mission_manager/mission_manager.cpp index 3f9a59de06d..8590eaf5300 100644 --- a/interfaces/kits/napi/aafwk/mission_manager/mission_manager.cpp +++ b/interfaces/kits/napi/aafwk/mission_manager/mission_manager.cpp @@ -33,7 +33,7 @@ using namespace OHOS::AppExecFwk; using AbilityManagerClient = AAFwk::AbilityManagerClient; namespace { constexpr int32_t ARG_COUNT_TWO = 1; - constexpr int32_t ARG_COUNT_THREE = 1; + constexpr int32_t ARG_COUNT_THREE = 3; } class JsMissionManager { public: @@ -245,7 +245,7 @@ private: NativeValue* OnGetMissionSnapShot(NativeEngine &engine, NativeCallbackInfo &info) { - HILOG_INFO("%{public}s is called", __FUNCTION__); + HILOG_INFO("%{public}s is called, argc =%{public}d", __FUNCTION__, static_cast(info.argc)); if (info.argc != ARG_COUNT_TWO && info.argc != ARG_COUNT_THREE) { HILOG_ERROR("missionSnapshot: need two or three params"); return engine.CreateUndefined(); @@ -256,7 +256,7 @@ private: return engine.CreateUndefined(); } int32_t missionId = -1; - if (!ConvertFromJsValue(engine, info.argv[0], missionId)) { + if (!ConvertFromJsValue(engine, info.argv[1], missionId)) { HILOG_ERROR("missionSnapshot: Parse missionId failed"); return engine.CreateUndefined(); } diff --git a/services/abilitymgr/BUILD.gn b/services/abilitymgr/BUILD.gn index 6865fc8bc2f..84593d7fd5c 100644 --- a/services/abilitymgr/BUILD.gn +++ b/services/abilitymgr/BUILD.gn @@ -88,6 +88,7 @@ ohos_shared_library("abilityms") { "//foundation/distributedschedule/samgr/interfaces/innerkits/samgr_proxy:samgr_proxy", "//foundation/multimedia/image_standard/interfaces/innerkits:image_native", "//utils/native/base:utils", + "//third_party/libpng:libpng", ] external_deps = [ diff --git a/services/abilitymgr/include/ability_manager_service.h b/services/abilitymgr/include/ability_manager_service.h index bf5bee2b625..ad1670ca3a7 100755 --- a/services/abilitymgr/include/ability_manager_service.h +++ b/services/abilitymgr/include/ability_manager_service.h @@ -851,6 +851,7 @@ private: int GetRemoteMissionInfo(const std::string& deviceId, int32_t missionId, MissionInfo &missionInfo); int CallMissionListener(const std::string &deviceId, const sptr &listener); + bool writeToPng(const char* fileName, uint32_t w, uint32_t h, const uint8_t* data); void DumpInner(const std::string &args, std::vector &info); void DumpStackListInner(const std::string &args, std::vector &info); diff --git a/services/abilitymgr/src/ability_manager_proxy.cpp b/services/abilitymgr/src/ability_manager_proxy.cpp index 559c1dcbf61..8471ac68637 100755 --- a/services/abilitymgr/src/ability_manager_proxy.cpp +++ b/services/abilitymgr/src/ability_manager_proxy.cpp @@ -684,7 +684,7 @@ int AbilityManagerProxy::GetMissionSnapshot(const std::string& deviceId, int32_t HILOG_ERROR("missionId write failed."); return ERR_INVALID_VALUE; } - error = Remote()->SendRequest(IAbilityManager::GET_MISSION_SNAPSHOT, data, reply, option); + error = Remote()->SendRequest(IAbilityManager::GET_MISSION_SNAPSHOT_INFO, data, reply, option); if (error != NO_ERROR) { HILOG_ERROR("Send request error: %{public}d", error); return error; diff --git a/services/abilitymgr/src/ability_manager_service.cpp b/services/abilitymgr/src/ability_manager_service.cpp index 016320bfe55..53709054ea1 100644 --- a/services/abilitymgr/src/ability_manager_service.cpp +++ b/services/abilitymgr/src/ability_manager_service.cpp @@ -40,6 +40,7 @@ #include "softbus_bus_center.h" #include "string_ex.h" #include "system_ability_definition.h" +#include "png.h" using OHOS::AppExecFwk::ElementName; @@ -2704,6 +2705,7 @@ int AbilityManagerService::GetMissionSaveTime() const int32_t AbilityManagerService::GetMissionIdByAbilityToken(const sptr &token) { if (!currentMissionListManager_) { + return -1; } return currentMissionListManager_->GetMissionIdByAbilityToken(token); @@ -2787,13 +2789,76 @@ int AbilityManagerService::RegisterSnapshotHandler(const sptr& int32_t AbilityManagerService::GetMissionSnapshot(const std::string& deviceId, int32_t missionId, MissionSnapshot& missionSnapshot) { + HILOG_ERROR("snapshot: GetMissionSnapshot 1"); if (!snapshotHandler_) { + HILOG_ERROR("snapshot: snapshotHandler_ is null"); return 0; } + HILOG_ERROR("snapshot: GetMissionSnapshot 2"); Snapshot snapshot; - int32_t result = snapshotHandler_->GetSnapshot(GetAbilityTokenByMissionId(missionId), snapshot); - missionSnapshot.snapshot = snapshot.GetPixelMap(); + std::vector missionInfos; + std::vector files = {"/data/1.png", "/data/2.png", "/data/3.png", "/data/4.png", "/data/5.png"}; + GetMissionInfos(0, 100, missionInfos); + int index = 0; + int32_t result = 0; + for (const MissionInfo& info : missionInfos) { + // int32_t result = snapshotHandler_->GetSnapshot(GetAbilityTokenByMissionId(missionId), snapshot); + result = snapshotHandler_->GetSnapshot(GetAbilityTokenByMissionId(info.id), snapshot); + HILOG_ERROR("snapshot: GetMissionSnapshot 3"); + missionSnapshot.snapshot = snapshot.GetPixelMap(); + const uint8_t* data = missionSnapshot.snapshot->GetPixels(); + auto width = missionSnapshot.snapshot->GetWidth(); + auto height = missionSnapshot.snapshot->GetHeight(); + writeToPng(files[index++].c_str(), width, height, data); + HILOG_ERROR("snapshot: width = %{public}d, height = %{public}d", width, height); + } return result; } + +bool AbilityManagerService::writeToPng(const char* fileName, uint32_t w, uint32_t h, const uint8_t* data) +{ + const int BITMAP_DEPTH = 8; // color depth + const int BPP = 4; // bytes per pixel + png_structp png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, nullptr, nullptr, nullptr); + if (png_ptr == nullptr) { + printf("png_create_write_struct error, nullptr!\n"); + return false; + } + png_infop info_ptr = png_create_info_struct(png_ptr); + if (png_ptr == nullptr) { + printf("png_create_info_struct error, nullptr!\n"); + png_destroy_write_struct(&png_ptr, nullptr); + return false; + } + FILE *fp = fopen(fileName,"wb"); + if (fp == nullptr) { + printf("open file [%s] error, nullptr!\n", fileName); + png_destroy_write_struct(&png_ptr,&info_ptr); + return false; + } + png_init_io(png_ptr,fp); + + // set png header + png_set_IHDR(png_ptr,info_ptr, + w, h, + BITMAP_DEPTH, + PNG_COLOR_TYPE_RGBA, + PNG_INTERLACE_NONE, + PNG_COMPRESSION_TYPE_BASE, + PNG_FILTER_TYPE_BASE); + png_set_packing(png_ptr); // set packing info + png_write_info(png_ptr, info_ptr); // write to header + + for (uint32_t i = 0; i < h; i++) { + png_write_row(png_ptr, data + (i * w * BPP)); + } + + png_write_end(png_ptr,info_ptr); + + // free + png_destroy_write_struct(&png_ptr,&info_ptr); + fclose(fp); + return true; +} } // namespace AAFwk } // namespace OHOS diff --git a/services/abilitymgr/src/ability_manager_stub.cpp b/services/abilitymgr/src/ability_manager_stub.cpp index bfb6d7b5cd4..b4e6d02ff8c 100755 --- a/services/abilitymgr/src/ability_manager_stub.cpp +++ b/services/abilitymgr/src/ability_manager_stub.cpp @@ -125,6 +125,7 @@ void AbilityManagerStub::SecondStepInit() requestFuncMap_[MOVE_MISSION_TO_FRONT] = &AbilityManagerStub::MoveMissionToFrontInner; requestFuncMap_[START_USER] = &AbilityManagerStub::StartUserInner; requestFuncMap_[STOP_USER] = &AbilityManagerStub::StopUserInner; + requestFuncMap_[GET_MISSION_SNAPSHOT_INFO] = &AbilityManagerStub::GetMissionSnapshotInfoInner; } int AbilityManagerStub::OnRemoteRequest(uint32_t code, MessageParcel &data, MessageParcel &reply, MessageOption &option) -- Gitee From fc781e13f7dd6f8b60f98497f771eef6e37014a3 Mon Sep 17 00:00:00 2001 From: raul <3293272615@qq.com> Date: Sat, 15 Jan 2022 17:08:43 +0800 Subject: [PATCH 2/2] add snapshotChanged callback Signed-off-by: laoyitong Change-Id: Ibfc2827d49911a89d5aedf75960a0bc91a2beb54 --- services/abilitymgr/src/ability_manager_service.cpp | 3 ++- services/abilitymgr/src/mission_list_manager.cpp | 4 ++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/services/abilitymgr/src/ability_manager_service.cpp b/services/abilitymgr/src/ability_manager_service.cpp index 25d0ce17c6e..9c17f0254f3 100644 --- a/services/abilitymgr/src/ability_manager_service.cpp +++ b/services/abilitymgr/src/ability_manager_service.cpp @@ -2809,8 +2809,9 @@ int32_t AbilityManagerService::GetMissionSnapshot(const std::string& deviceId, i int32_t result = 0; for (const MissionInfo& info : missionInfos) { // int32_t result = snapshotHandler_->GetSnapshot(GetAbilityTokenByMissionId(missionId), snapshot); + HILOG_ERROR("snapshot: GetMissionSnapshot 3, id = %{public}d", info.id); result = snapshotHandler_->GetSnapshot(GetAbilityTokenByMissionId(info.id), snapshot); - HILOG_ERROR("snapshot: GetMissionSnapshot 3"); + HILOG_ERROR("snapshot: GetMissionSnapshot 4"); missionSnapshot.snapshot = snapshot.GetPixelMap(); const uint8_t* data = missionSnapshot.snapshot->GetPixels(); auto width = missionSnapshot.snapshot->GetWidth(); diff --git a/services/abilitymgr/src/mission_list_manager.cpp b/services/abilitymgr/src/mission_list_manager.cpp index c934493732e..056ca6f7cc0 100644 --- a/services/abilitymgr/src/mission_list_manager.cpp +++ b/services/abilitymgr/src/mission_list_manager.cpp @@ -751,6 +751,10 @@ void MissionListManager::CompleteBackground(const std::shared_ptr terminateAbility->Terminate(timeoutTask); } } + auto mission = abilityRecord->GetMission(); + if (mission && listenerController_) { + listenerController_->NotifyMissionSnapshotChanged(mission->GetMissionId()); + } } int MissionListManager::TerminateAbility(const std::shared_ptr &abilityRecord, -- Gitee