diff --git a/interfaces/innerkits/ability_manager/include/ability_manager_interface.h b/interfaces/innerkits/ability_manager/include/ability_manager_interface.h index 4357ee24a3c76fc40fa9f8b51c587f20dee25fdc..015d8768312d018d3b9a6967021d47866e7c5ba6 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 3f9a59de06d0b5193ea1cb7913dd463ac851f804..8590eaf53004cc928c87f6d4cbaf8300f1beddce 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 2d3bd5854bdfad0680fa01803e3712a4be24fe54..378b3e0b506c373ea6703eaa9afc909344188533 100644 --- a/services/abilitymgr/BUILD.gn +++ b/services/abilitymgr/BUILD.gn @@ -93,6 +93,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 2dc14ac91478209d998f7ffbe3f36912c336109f..b44154421b9e51abc4e2c5c38ea6df35d3e3e537 100644 --- a/services/abilitymgr/include/ability_manager_service.h +++ b/services/abilitymgr/include/ability_manager_service.h @@ -853,6 +853,7 @@ private: std::vector &missionInfos); int GetRemoteMissionInfo(const std::string& deviceId, int32_t missionId, MissionInfo &missionInfo); + 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 559c1dcbf6121a171986905ea5c3c9aae70ee53c..8471ac68637b4915f279fe67a438d4c7bd224fed 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 b3d55fd5343e2737c295240e91894f23ba3e164a..9c17f0254f3e015e9f7fab4dc8dd52719689148c 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; @@ -2701,6 +2702,7 @@ int AbilityManagerService::GetMissionSaveTime() const int32_t AbilityManagerService::GetMissionIdByAbilityToken(const sptr &token) { if (!currentMissionListManager_) { + return -1; } return currentMissionListManager_->GetMissionIdByAbilityToken(token); @@ -2793,15 +2795,79 @@ 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); + HILOG_ERROR("snapshot: GetMissionSnapshot 3, id = %{public}d", info.id); + result = snapshotHandler_->GetSnapshot(GetAbilityTokenByMissionId(info.id), snapshot); + HILOG_ERROR("snapshot: GetMissionSnapshot 4"); + 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; +} + void AbilityManagerService::StartFreezingScreen() { HILOG_DEBUG("%{public}s", __func__); diff --git a/services/abilitymgr/src/ability_manager_stub.cpp b/services/abilitymgr/src/ability_manager_stub.cpp index bfb6d7b5cd4f464bcfc8082a32e94900c402fc3c..b4e6d02ff8c59b74da008062da11a47150d44d98 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) diff --git a/services/abilitymgr/src/mission_list_manager.cpp b/services/abilitymgr/src/mission_list_manager.cpp index c934493732e873220a6fd281aee0fd0d352fba87..056ca6f7cc0931da6ae6d9dab2722104d75f0a9f 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,