From ddd7a9c33dd767764bcc38dddf329e8f6daed243 Mon Sep 17 00:00:00 2001 From: zhangzezhong Date: Tue, 19 Aug 2025 21:04:11 +0800 Subject: [PATCH] add missionManager Signed-off-by: zhangzezhong --- .../include/ets_mission_info_utils.h | 4 + .../include/ets_mission_listener_utils.h | 30 ++ .../src/ets_mission_info_utils.cpp | 26 ++ .../src/ets_mission_listener_utils.cpp | 46 +++ .../src/ets_mission_manager.cpp | 341 ++++++++++++++++++ .../ets/@ohos.app.ability.missionManager.ets | 284 +++++++++++++++ frameworks/ets/ets/BUILD.gn | 16 + .../ets/ets/application/MissionListener.ets | 63 ++++ 8 files changed, 810 insertions(+) create mode 100644 frameworks/ets/ani/ani_mission_manager/include/ets_mission_listener_utils.h create mode 100644 frameworks/ets/ani/ani_mission_manager/src/ets_mission_listener_utils.cpp create mode 100644 frameworks/ets/ets/application/MissionListener.ets diff --git a/frameworks/ets/ani/ani_mission_manager/include/ets_mission_info_utils.h b/frameworks/ets/ani/ani_mission_manager/include/ets_mission_info_utils.h index fe58d7980bd..62e68997dfa 100644 --- a/frameworks/ets/ani/ani_mission_manager/include/ets_mission_info_utils.h +++ b/frameworks/ets/ani/ani_mission_manager/include/ets_mission_info_utils.h @@ -16,6 +16,9 @@ #ifndef OHOS_ABILITY_RUNTIME_ETS_MISSION_INFO_UTILS_H #define OHOS_ABILITY_RUNTIME_ETS_MISSION_INFO_UTILS_H +#include "ability_state_data.h" +#include + typedef struct __ani_env ani_env; typedef class __ani_object *ani_object; @@ -25,6 +28,7 @@ struct MissionInfo; } namespace AbilityRuntime { ani_object CreateEtsMissionInfo(ani_env *env, const AAFwk::MissionInfo &missionInfo); +ani_object CreateEtsMissionInfos(ani_env *env, const std::vector &missionInfos); } // namespace AbilityRuntime } // namespace OHOS #endif // OHOS_ABILITY_RUNTIME_ETS_MISSION_INFO_UTILS_H diff --git a/frameworks/ets/ani/ani_mission_manager/include/ets_mission_listener_utils.h b/frameworks/ets/ani/ani_mission_manager/include/ets_mission_listener_utils.h new file mode 100644 index 00000000000..95e8e1d88f4 --- /dev/null +++ b/frameworks/ets/ani/ani_mission_manager/include/ets_mission_listener_utils.h @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef OHOS_ABILITY_RUNTIME_ETS_MISSION_LISTENER_UTILS_H +#define OHOS_ABILITY_RUNTIME_ETS_MISSION_LISTENER_UTILS_H + +typedef struct __ani_env ani_env; +typedef class __ani_object *ani_object; + +namespace OHOS { +namespace AAFwk { +struct MissionListener; +} +namespace AbilityRuntime { +//ani_object CreateEtsMissionListener(ani_env *env, const AAFwk::MissionListener &missionListener); +} // namespace AbilityRuntime +} // namespace OHOS +#endif // OHOS_ABILITY_RUNTIME_ETS_MISSION_LISTENER_UTILS_H \ No newline at end of file diff --git a/frameworks/ets/ani/ani_mission_manager/src/ets_mission_info_utils.cpp b/frameworks/ets/ani/ani_mission_manager/src/ets_mission_info_utils.cpp index e26bd01cfe8..6e134548ba1 100644 --- a/frameworks/ets/ani/ani_mission_manager/src/ets_mission_info_utils.cpp +++ b/frameworks/ets/ani/ani_mission_manager/src/ets_mission_info_utils.cpp @@ -37,6 +37,7 @@ constexpr const char* KEY_CONTINUABLE = "continuable"; constexpr const char* KEY_ABILITY_STATE = "abilityState"; constexpr const char* KEY_UNCLEARABLE = "unclearable"; constexpr const char* KEY_WANT = "want"; +constexpr const char *SET_OBJECT_VOID_SIGNATURE = "ILstd/core/Object;:V"; } bool WrapWantInner(ani_env *env, ani_class cls, ani_object object, const AAFwk::Want &want) @@ -123,5 +124,30 @@ ani_object CreateEtsMissionInfo(ani_env *env, const AAFwk::MissionInfo &missionI } return object; } + +ani_object CreateEtsMissionInfos(ani_env *env, const std::vector &missionInfos) +{ + if (env == nullptr) { + TAG_LOGE(AAFwkTag::MISSION, "result or env is null"); + return nullptr; + } + ani_class cls = nullptr; + ani_status status = ANI_ERROR; + ani_object object = nullptr; + ani_object arrayObj = nullptr; //注意这块,应该不对 + + for (size_t i = 0; i < missionInfos.size(); i++) { + if (!WrapMissionInfo(env, cls, object, missionInfos[i])) { //调用某个函数 ----》mission的函数 + TAG_LOGE(AAFwkTag::MISSION, "WrapMissionInfo failed"); + return nullptr; + } + status = env->Object_CallMethodByName_Void(arrayObj, "$_set", SET_OBJECT_VOID_SIGNATURE, i, object); //调用是否有问题 + if (status != ANI_OK) { + TAG_LOGE(AAFwkTag::MISSION, "status : %{public}d", status); + return nullptr; + } + } + return object; +} } // namespace AbilityRuntime } // namespace OHOS diff --git a/frameworks/ets/ani/ani_mission_manager/src/ets_mission_listener_utils.cpp b/frameworks/ets/ani/ani_mission_manager/src/ets_mission_listener_utils.cpp new file mode 100644 index 00000000000..9e7e74927f4 --- /dev/null +++ b/frameworks/ets/ani/ani_mission_manager/src/ets_mission_listener_utils.cpp @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "ets_mission_listener_utils.h" + +#include "ani.h" +#include "ani_common_want.h" +#include "ani_common_util.h" +#include "hilog_tag_wrapper.h" +#include "mission_info.h" +#include "want.h" + +namespace OHOS { +namespace AbilityRuntime { + +namespace { +constexpr const char* ETS_MISSION_INFO_NAME = "Lapplication/MissionListener/MissionListenerInner;"; + +constexpr const char* KEY_MISSION_ID = "missionId"; +constexpr const char* KEY_RUNNING_STATE = "runningState"; +constexpr const char* KEY_LOCKED_STATE = "lockedState"; +constexpr const char* KEY_TIMESTAMP = "timestamp"; +constexpr const char* KEY_LABEL = "label"; +constexpr const char* KEY_ICON_PATH = "iconPath"; +constexpr const char* KEY_CONTINUABLE = "continuable"; +constexpr const char* KEY_ABILITY_STATE = "abilityState"; +constexpr const char* KEY_UNCLEARABLE = "unclearable"; +constexpr const char* KEY_WANT = "want"; +} + +//一些函数 + +} // namespace AbilityRuntime +} // namespace OHOS diff --git a/frameworks/ets/ani/ani_mission_manager/src/ets_mission_manager.cpp b/frameworks/ets/ani/ani_mission_manager/src/ets_mission_manager.cpp index 96cf5f6a820..a6a30d97a2f 100644 --- a/frameworks/ets/ani/ani_mission_manager/src/ets_mission_manager.cpp +++ b/frameworks/ets/ani/ani_mission_manager/src/ets_mission_manager.cpp @@ -18,6 +18,7 @@ #include "ability_manager_client.h" #include "ani.h" #include "ani_common_util.h" +#include "ani_common_want.h" #include "ets_error_utils.h" #include "ets_mission_info_utils.h" #include "hilog_tag_wrapper.h" @@ -30,6 +31,7 @@ using AbilityManagerClient = AAFwk::AbilityManagerClient; namespace { constexpr const char* ETS_MISSION_INFO_NAME = "Lapplication/MissionInfo/MissionInfoInner;"; constexpr const char* ETS_MISSION_MANAGER_NAME = "L@ohos/app/ability/missionManager/missionManager;"; +constexpr const char* ETS_MISSION_LISTENER_NAME = "Lapplication/MissionListener/MissionListenerInner;"; } class EtsMissionManager { public: @@ -50,6 +52,69 @@ public: { instance.OnGetMissionInfo(env, deviceId, missionId, callback); } + + static void GetMissionInfos(ani_env* env, ani_string deviceId, ani_int numMax, ani_object callback) + { + instance.OnGetMissionInfos(env, deviceId, numMax, callback); + } + + static void ClearMission(ani_env* env, ani_int missionId, ani_object callback) + { + instance.OnClearMission(env, missionId, callback); + } + + static void LockMission(ani_env* env, ani_int missionId, ani_object callback) + { + instance.OnLockMission(env, missionId, callback); + } + + static void UnlockMission(ani_env* env, ani_int missionId, ani_object callback) + { + instance.OnUnlockMission(env, missionId, callback); + } + + static void GetMissionSnapShot(ani_env* env, ani_string deviceId, ani_int missionId, ani_object callback) + { + instance.OnGetMissionSnapShot(env, deviceId, missionId, callback, false); + } + + static void GetLowResolutionMissionSnapShot(ani_env* env, ani_string deviceId, ani_int missionId, ani_object callback) + { + instance.OnGetMissionSnapShot(env, deviceId, missionId, callback, true); + } +/* + + static void GetMissionSnapShot(ani_env* env, ani_string deviceId, ani_int missionId, ani_object callback) + { + instance.OnGetMissionSnapShot(env, deviceId, missionId, callback); + } + + static void MoveMissionsToBackground(ani_env* env, ani_int missionIds, ani_object callback) //注意:ani_int missionIds,这个的类型? + { + instance.OnMoveMissionsToBackground(env, missionIds, callback); + } + + static void MoveMissionsToForeground(ani_env* env, ani_int missionIds, ani_int topMission, ani_object callback) //ani_int missionIds,这个的类型? + { + instance.OnMoveMissionsToForeground(env, missionIds, topMission, callback); + } + + static void MoveMissionToFront(ani_env* env, ani_int missionId, ani_object options, ani_object callback) //注意:ani_object options,这个的类型? + { + instance.OnMoveMissionToFront(env, missionId, missionId, callback); + } + + static void On(ani_env* env, ani_object type, ani_object listener) //注意:ani_object type,ani_object listener,这两个的类型? + { + instance.OnOn(env, type, listener); + } + + static void Off(ani_env* env, ani_object type, ani_int listenerId, ani_object callback) //注意:ani_object type,这个的类型? + { + instance.OnOff(env, type, listenerId, callback); + } +*/ + private: EtsMissionManager() = default; ~EtsMissionManager() = default; @@ -127,6 +192,235 @@ private: } return objValue; } + + void OnGetMissionInfos(ani_env* env, ani_string deviceId, ani_int numMax, ani_object callback) + { + TAG_LOGD(AAFwkTag::MISSION, "OnGetMissionInfos Call"); + if (env == nullptr) { + TAG_LOGE(AAFwkTag::MISSION, "null env"); + return; + } + auto emptyObject = GetEmptyMissionInfo(env); + std::string stdDeviceId = ""; + if (!GetStdString(env, deviceId, stdDeviceId) || stdDeviceId.empty()) { + TAG_LOGE(AAFwkTag::MISSION, "GetStdString failed"); + AsyncCallback(env, callback, EtsErrorUtil::CreateInvalidParamError(env, + "Parse param deviceId failed, must be a string."), emptyObject); + return; + } + std::vector missionInfos; + auto ret = AbilityManagerClient::GetInstance()->GetMissionInfos(stdDeviceId, + numMax, missionInfos); + if (ret != 0) { + TAG_LOGE(AAFwkTag::MISSION, "GetMissionInfos is failed. ret = %{public}d.", ret); + AsyncCallback(env, callback, EtsErrorUtil::CreateErrorByNativeErr(env, + ret, PermissionConstants::PERMISSION_MANAGE_MISSION), emptyObject); + return; + } + auto aniMissionInfos = CreateEtsMissionInfos(env, missionInfos); //这个函数在missionInfo文件里面写的,注意看看 + AsyncCallback(env, callback, EtsErrorUtil::CreateError(env, AbilityErrorCode::ERROR_OK), aniMissionInfos); + } + + void OnClearMission(ani_env* env, ani_int missionId, ani_object callback) + { + TAG_LOGD(AAFwkTag::MISSION, "OnClearMission Call"); + if (env == nullptr) { + TAG_LOGE(AAFwkTag::MISSION, "null env"); + return; + } + + auto ret = AbilityManagerClient::GetInstance()->CleanMission(missionId); + if (ret != 0) { + TAG_LOGE(AAFwkTag::MISSION, "OnClearMission is failed. ret = %{public}d.", ret); + AsyncCallback(env, callback, EtsErrorUtil::CreateErrorByNativeErr(env, + ret, PermissionConstants::PERMISSION_MANAGE_MISSION), nullptr); + return; + } + + AsyncCallback(env, callback, EtsErrorUtil::CreateError(env, AbilityErrorCode::ERROR_OK), nullptr); + } + + + void OnLockMission(ani_env* env, ani_int missionId, ani_object callback) + { + TAG_LOGD(AAFwkTag::MISSION, "OnLockMission Call"); + if (env == nullptr) { + TAG_LOGE(AAFwkTag::MISSION, "null env"); + return; + } + + auto ret = AbilityManagerClient::GetInstance()->LockMissionForCleanup(missionId); + if (ret != 0) { + TAG_LOGE(AAFwkTag::MISSION, "OnLockMission is failed. ret = %{public}d.", ret); + AsyncCallback(env, callback, EtsErrorUtil::CreateErrorByNativeErr(env, + ret, PermissionConstants::PERMISSION_MANAGE_MISSION), nullptr); + return; + } + + AsyncCallback(env, callback, EtsErrorUtil::CreateError(env, AbilityErrorCode::ERROR_OK), nullptr); + } + void OnUnlockMission(ani_env* env, ani_int missionId, ani_object callback) + { + TAG_LOGD(AAFwkTag::MISSION, "OnUnlockMission Call"); + if (env == nullptr) { + TAG_LOGE(AAFwkTag::MISSION, "null env"); + return; + } + + auto ret = AbilityManagerClient::GetInstance()->UnlockMissionForCleanup(missionId); + if (ret != 0) { + TAG_LOGE(AAFwkTag::MISSION, "OnUnlockMission is failed. ret = %{public}d.", ret); + AsyncCallback(env, callback, EtsErrorUtil::CreateErrorByNativeErr(env, + ret, PermissionConstants::PERMISSION_MANAGE_MISSION), nullptr); + return; + } + + AsyncCallback(env, callback, EtsErrorUtil::CreateError(env, AbilityErrorCode::ERROR_OK), nullptr); + } + + void OnGetMissionSnapShot(ani_env* env, ani_string deviceId, ani_int missionId, ani_object callback, bool isLowResolution) + { + TAG_LOGD(AAFwkTag::MISSION, "OnGetMissionSnapShot Call"); + if (env == nullptr) { + TAG_LOGE(AAFwkTag::MISSION, "null env"); + return; + } + + auto emptyObject = GetEmptyMissionSnapShot(env); //可能需要新增这个函数 + + std::string stdDeviceId = ""; + if (!GetStdString(env, deviceId, stdDeviceId) || stdDeviceId.empty()) { + TAG_LOGE(AAFwkTag::MISSION, "GetStdString failed"); + AsyncCallback(env, callback, EtsErrorUtil::CreateInvalidParamError(env, + "Parse param deviceId failed, must be a string."), emptyObject); + return; + } + AAFwk::MissionSnapShot missionSnapShot; //这个文件新增? + auto ret = AbilityManagerClient::GetInstance()->GetMissionSnapShot(stdDeviceId, + missionId, missionSnapShot, isLowResolution); + if (ret != 0) { + TAG_LOGE(AAFwkTag::MISSION, "OnGetMissionSnapShot is failed. ret = %{public}d.", ret); + AsyncCallback(env, callback, EtsErrorUtil::CreateErrorByNativeErr(env, + ret, PermissionConstants::PERMISSION_MANAGE_MISSION), emptyObject); + return; + } + auto aniMissionSnapShot = CreateEtsMissionSnapShot(env, MissionSnapShot); + AsyncCallback(env, callback, EtsErrorUtil::CreateError(env, AbilityErrorCode::ERROR_OK), aniMissionSnapShot); + } + + ani_object CreateEtsMissionSnapShot(ani_env* env, const AAFwk::MissionSnapShot &missionSnapShot) + { + if (env == nullptr) { + TAG_LOGE(AAFwkTag::MISSION, "env is null"); + return nullptr; + } + ani_class cls = nullptr; + ani_status status = ANI_ERROR; + status = env->FindClass(env, "Lapplication/MissionSnapShot/MissionSnapShotInner;", cls); + if (status != ANI_OK || cls == nullptr) { + TAG_LOGE(AAFwkTag::MISSION, "FindClass failed"); + return nullptr; + } + ani_method method = nullptr; + status = env->Class_FindMethod(cls, "", ":V", &method); + if (status != ANI_OK || method == nullptr) { + TAG_LOGE(AAFwkTag::MISSION, "Class_FindMethod failed"); + return nullptr; + } + ani_object object = nullptr; + status = env->Object_New(cls, method, &object); + if (status != ANI_OK || object == nullptr) { + TAG_LOGE(AAFwkTag::MISSION, "Object_New failed"); + return nullptr; + } + ani_object abilityObj = WrapElementName(env, missionSnapShot.topAbility); + if (!SetRefProperty(env, object, "ability", abilityObj)) { + TAG_LOGE(AAFwkTag::MISSION, "Set ability failed"); + return nullptr; + } +#ifdef SUPPORT_SCREEN + auto snapshotValue = + OHOS::Media::PixelMapTaiheAni::CreateEtsPixelMap(env, missionSnapShot.snapshot); + if (!SetRefProperty(env, object, "snapshot", snapshotValue)) { + TAG_LOGE(AAFwkTag::MISSION, "Set snapshot failed"); + return nullptr; + } +#endif + return object; + } + + ani_object GetEmptyMissionSnapShot(ani_env* env) + { + if (env == nullptr) { + TAG_LOGE(AAFwkTag::MISSION, "null env"); + return nullptr; + } + ani_class cls = nullptr; + ani_status status = env->FindClass("Lapplication/MissionSnapShot/MissionSnapShotInner;", &cls); + if (status != ANI_OK || cls == nullptr) { + TAG_LOGE(AAFwkTag::MISSION, "find Context failed status: %{public}d", status); + return nullptr; + } + ani_method method = nullptr; + status = env->Class_FindMethod(cls, "", ":V", &method); + if (status != ANI_OK || method == nullptr) { + TAG_LOGE(AAFwkTag::MISSION, "Class_FindMethod ctor failed status: %{public}d", status); + return nullptr; + } + ani_object objValue = nullptr; + status = env->Object_New(cls, method, &objValue); + if (status != ANI_OK || objValue == nullptr) { + TAG_LOGE(AAFwkTag::MISSION, "Object_New failed status: %{public}d", status); + return nullptr; + } + return objValue; + } + /* + void OnMoveMissionsToBackground(ani_env* env, ani_int missionIds, ani_object callback) //注意:ani_int missionIds,这个的类型? + { + TAG_LOGD(AAFwkTag::MISSION, "OnMoveMissionsToBackground Call"); + if (env == nullptr) { + TAG_LOGE(AAFwkTag::MISSION, "null env"); + return; + } + } + + void OnMoveMissionsToForeground(ani_env* env, ani_int missionIds, ani_int topMission, ani_object callback) //ani_int missionIds,这个的类型? + { + TAG_LOGD(AAFwkTag::MISSION, "OnMoveMissionsToForeground Call"); + if (env == nullptr) { + TAG_LOGE(AAFwkTag::MISSION, "null env"); + return; + } + } + + void OnMoveMissionToFront(ani_env* env, ani_int missionId, ani_object options, ani_object callback) //注意:ani_object options,这个的类型? + { + TAG_LOGD(AAFwkTag::MISSION, "OnMoveMissionToFront Call"); + if (env == nullptr) { + TAG_LOGE(AAFwkTag::MISSION, "null env"); + return; + } + } + + void OnOn(ani_env* env, ani_object type, ani_object listener) //注意:ani_object type,ani_object listener,这两个的类型? + { + TAG_LOGD(AAFwkTag::MISSION, "OnOn Call"); + if (env == nullptr) { + TAG_LOGE(AAFwkTag::MISSION, "null env"); + return; + } + } + + void OnOff(ani_env* env, ani_object type, ani_int listenerId, ani_object callback) //注意:ani_object type,这个的类型? + { + TAG_LOGD(AAFwkTag::MISSION, "OnOff Call"); + if (env == nullptr) { + TAG_LOGE(AAFwkTag::MISSION, "null env"); + return; + } + } + */ }; EtsMissionManager EtsMissionManager::instance; @@ -155,6 +449,53 @@ void EtsMissionManagerInit(ani_env* env) "Lstd/core/String;ILutils/AbilityUtils/AsyncCallbackWrapper;:V", reinterpret_cast(EtsMissionManager::GetMissionInfo) }, + ani_native_function { + "nativeGetMissionInfos", + "Lstd/core/String;ILutils/AbilityUtils/AsyncCallbackWrapper;:V", + reinterpret_cast(EtsMissionManager::GetMissionInfos) + }, + ani_native_function { + "nativeClearMission","ILutils/AbilityUtils/AsyncCallbackWrapper;:V", + reinterpret_cast(EtsMissionManager::ClearMission) + }, + ani_native_function { + "nativeLockMission","ILutils/AbilityUtils/AsyncCallbackWrapper;:V", + reinterpret_cast(EtsMissionManager::LockMission) + }, + ani_native_function { + "nativeUnlockMission","ILutils/AbilityUtils/AsyncCallbackWrapper;:V", + reinterpret_cast(EtsMissionManager::UnlockMission) + }, + ani_native_function { + "nativeGetMissionSnapShot", + "Lstd/core/String;ILutils/AbilityUtils/AsyncCallbackWrapper;:V", + reinterpret_cast(EtsMissionManager::GetMissionSnapShot) + }, + ani_native_function { + "nativeMoveMissionsToBackground", + "Lstd/core/String;ILutils/AbilityUtils/AsyncCallbackWrapper;:V", + reinterpret_cast(EtsMissionManager::MoveMissionsToBackground) + }, + ani_native_function { + "nativeMoveMissionsToForeground", + "Lstd/core/String;ILutils/AbilityUtils/AsyncCallbackWrapper;:V", + reinterpret_cast(EtsMissionManager::MoveMissionsToForeground) + }, + ani_native_function { + "nativeMoveMissionToFront", + "Lstd/core/String;ILutils/AbilityUtils/AsyncCallbackWrapper;:V", + reinterpret_cast(EtsMissionManager::MoveMissionToFront) + }, + ani_native_function { + "nativeOn", + "Lstd/core/String;ILutils/AbilityUtils/AsyncCallbackWrapper;:V", + reinterpret_cast(EtsMissionManager::On) + }, + ani_native_function { + "nativeOff", + "Lstd/core/String;ILutils/AbilityUtils/AsyncCallbackWrapper;:V", + reinterpret_cast(EtsMissionManager::Off) + } }; status = env->Namespace_BindNativeFunctions(ns, methods.data(), methods.size()); if (status != ANI_OK) { diff --git a/frameworks/ets/ets/@ohos.app.ability.missionManager.ets b/frameworks/ets/ets/@ohos.app.ability.missionManager.ets index ad2ec9c8f72..741f2dd491e 100644 --- a/frameworks/ets/ets/@ohos.app.ability.missionManager.ets +++ b/frameworks/ets/ets/@ohos.app.ability.missionManager.ets @@ -15,12 +15,35 @@ import { BusinessError, AsyncCallback } from '@ohos.base'; import { MissionInfo as _MissionInfo } from 'application.MissionInfo'; import AsyncCallbackWrapper from './utils/AbilityUtils'; +import { MissionListener as _MissionListener } from 'application.MissionListener'; +//import {MissionSnapshot as _MissionSnapshot } from 'application.MissionSnapshot'; //后续加文件 export default namespace missionManager { loadLibrary("missionmanager_ani.z") export native function nativeClearAllMissions(callback: AsyncCallbackWrapper): void; export native function nativeGetMissionInfo(deviceId: string, missionId: int, callback: AsyncCallbackWrapper): void; + export native function nativeGetMissionInfos(deviceId: string, numMax: int, //getMissionInfos 一 + callback: AsyncCallbackWrapper>): void; + export native function nativeClearMission(missionId: int, //clearMission 二 + callback: AsyncCallbackWrapper): void; + export native function nativeLockMission(missionId: int, //lockMission 三 + callback: AsyncCallbackWrapper): void; + export native function nativeUnlockMission(missionId: int, //unlockMission 四 + callback: AsyncCallbackWrapper): void; + export native function nativeGetLowResolutionMissionSnapShot(deviceId: string, missionId: int, //getLowResolutionMissionSnapShot 五 + callback: AsyncCallbackWrapper): void; + export native function nativeGetMissionSnapShot(deviceId: string, missionId: int, //getMissionSnapShot 六 + callback: AsyncCallbackWrapper): void; + export native function nativeMoveMissionsToBackground(missionIds: Array, //moveMissionsToBackground 七 + callback: AsyncCallbackWrapper>): void; + export native function nativeMoveMissionsToForeground(missionIds: Array, topMission: int, //moveMissionsToForeground 八 + callback: AsyncCallbackWrapper): void; + export native function nativeMoveMissionToFront(missionId: int, options: StartOptions, //MoveMissionToFront 九 + callback: AsyncCallbackWrapper): void; + export native function nativeOn(type: 'mission', listener: MissionListener): int; //on 十 + export native function nativeOff(type: 'mission', listenerId: int, //off 十一 + callback: AsyncCallbackWrapper): void; export function clearAllMissions(callback: AsyncCallback): void { let myCall = new AsyncCallbackWrapper(callback); @@ -70,5 +93,266 @@ export default namespace missionManager { return p; } +export function getMissionInfos(deviceId: string, numMax: int, callback: AsyncCallback>): void { //getMissionInfos 一 + let myCall = new AsyncCallbackWrapper>(callback); //Array 注意这个? + taskpool.execute((): void => { + missionManager.nativeGetMissionInfos(deviceId, numMax, myCall); + }); + } + + export function getMissionInfos(deviceId: string, numMax: int): Promise> { + let p = + new Promise>((resolve: (data: Array) => void, reject: (err: BusinessError) => void): void => { + let myCall = new AsyncCallbackWrapper>((err: BusinessError | null, data: Array | undefined) => { + if (err == null || err.code == 0) { + resolve(data as Array); + } else { + reject(err); + } + }); + taskpool.execute((): void => { + missionManager.nativeGetMissionInfos(deviceId, numMax, myCall); + }); + }); + return p; + } + + export function clearMission(missionId: int, callback: AsyncCallback): void { //clearMission 二 + let myCall = new AsyncCallbackWrapper(callback); + taskpool.execute((): void => { + missionManager.nativeClearMission(missionId, myCall); + }); + } + + export function clearMission(missionId: int): Promise { + let p: Promise = + new Promise((resolve: (data: undefined) => void, reject: (err: BusinessError | null) => void): void => { + let myCall = new AsyncCallbackWrapper((err: BusinessError | null) => { + if (err == null || err.code == 0) { + resolve(undefined); + } else { + reject(err); + } + }); + taskpool.execute((): void => { + missionManager.nativeClearMission(missionId, myCall); + }); + }); + return p; + } + + export function lockMission(missionId: int, callback: AsyncCallback): void { //lockMission 三 + let myCall = new AsyncCallbackWrapper(callback); + taskpool.execute((): void => { + missionManager.nativeLockMission(missionId, myCall); + }); + } + + export function lockMission(missionId: int): Promise { + let p: Promise = + new Promise((resolve: (data: undefined) => void, reject: (err: BusinessError | null) => void): void => { + let myCall = new AsyncCallbackWrapper((err: BusinessError | null) => { + if (err == null || err.code == 0) { + resolve(undefined); + } else { + reject(err); + } + }); + taskpool.execute((): void => { + missionManager.nativeLockMission(missionId, myCall); + }); + }); + return p; + } + + export function unlockMission(missionId: int, callback: AsyncCallback): void { //unlockMission 四 + let myCall = new AsyncCallbackWrapper(callback); + taskpool.execute((): void => { + missionManager.nativeUnlockMission(missionId, myCall); //nativeUnlockMission 大小写注意一下? + }); + } + + export function unlockMission(missionId: int): Promise { + let p: Promise = + new Promise((resolve: (data: undefined) => void, reject: (err: BusinessError | null) => void): void => { + let myCall = new AsyncCallbackWrapper((err: BusinessError | null) => { + if (err == null || err.code == 0) { + resolve(undefined); + } else { + reject(err); + } + }); + taskpool.execute((): void => { + missionManager.nativeUnlockMission(missionId, myCall); + }); + }); + return p; + } + + + export function getLowResolutionMissionSnapShot(deviceId: string, missionId: int, callback: AsyncCallback): void { + let myCall = new AsyncCallbackWrapper(callback); //getLowResolutionMissionSnapShot 五 + taskpool.execute((): void => { + missionManager.nativeGetLowResolutionMissionSnapShot(deviceId, missionId, myCall); + }); + } + + export function getLowResolutionMissionSnapShot(deviceId: string, missionId: int): Promise { + let p = + new Promise((resolve: (data: MissionSnapshot) => void, reject: (err: BusinessError) => void): void => { + let myCall = new AsyncCallbackWrapper((err: BusinessError | null, data: MissionSnapshot| undefined) => { + if (err == null || err.code == 0) { + resolve(data as MissionSnapshot); + } else { + reject(err); + } + }); + taskpool.execute((): void => { + missionManager.nativeGetLowResolutionMissionSnapShot(deviceId, missionId, myCall); + }); + }); + return p; + } + + export function getMissionSnapShot(deviceId: string, missionId: int, callback: AsyncCallback): void { + let myCall = new AsyncCallbackWrapper(callback); //getMissionSnapShot 六 + taskpool.execute((): void => { + missionManager.nativeGetMissionSnapShot(deviceId, missionId, myCall); + }); + } + + export function getMissionSnapShot(deviceId: string, missionId: number): Promise { + let p = + new Promise((resolve: (data: MissionSnapshot) => void, reject: (err: BusinessError) => void): void => { + let myCall = new AsyncCallbackWrapper((err: BusinessError | null, data: MissionSnapshot| undefined) => { + if (err == null || err.code == 0) { + resolve(data as MissionSnapshot); + } else { + reject(err); + } + }); + taskpool.execute((): void => { + missionManager.nativeGetMissionSnapShot(deviceId, missionId, myCall); + }); + }); + return p; + } + + export function moveMissionsToBackground(missionIds: Array, callback: AsyncCallback>): void { + let myCall = new AsyncCallbackWrapper>(callback); //moveMissionsToBackground 七 + taskpool.execute((): void => { //注意这个类型 Array -> Array + missionManager.nativeMoveMissionsToBackground(missionIds, myCall); + }); + } + + export function moveMissionsToBackground(missionIds : Array): Promise> { + let p = + new Promise>((resolve: (data: Array) => void, reject: (err: BusinessError) => void): void => { + let myCall = new AsyncCallbackWrapper>((err: BusinessError | null, data: Array| undefined) => { + if (err == null || err.code == 0) { + resolve(data as Array); + } else { + reject(err); + } + }); + taskpool.execute((): void => { + missionManager.nativeMoveMissionsToBackground(missionIds, myCall); + }); + }); + return p; + } + + export function moveMissionsToForeground(missionIds: Array, topMission: int, callback: AsyncCallback): void { + let myCall = new AsyncCallbackWrapper(callback); //moveMissionsToForeground 八 + taskpool.execute((): void => { + missionManager.nativeMoveMissionsToForeground(missionIds, topMission, myCall); + }); + } + + export function moveMissionsToForeground(missionIds: Array, callback: AsyncCallback): void { + let myCall = new AsyncCallbackWrapper(callback); + taskpool.execute((): void => { + missionManager.nativeMoveMissionsToForeground(missionIds, myCall); + }); + } + + export function moveMissionsToForeground(missionIds: Array, topMission?: int): Promise { //可选参数? + let p: Promise = + new Promise((resolve: (data: undefined) => void, reject: (err: BusinessError | null) => void): void => { + let myCall = new AsyncCallbackWrapper((err: BusinessError | null) => { + if (err == null || err.code == 0) { + resolve(undefined); + } else { + reject(err); + } + }); + taskpool.execute((): void => { + missionManager.nativeMoveMissionsToForeground(missionIds, topMission, myCall); + }); + }); + return p; + } + + export function moveMissionToFront(missionId: int, options: StartOptions, callback: AsyncCallback): void { + let myCall = new AsyncCallbackWrapper(callback); //MoveMissionToFront 九 + taskpool.execute((): void => { + missionManager.nativeMoveMissionToFront(missionId, options, myCall); + }); + } + + export function moveMissionToFront(missionId: int, callback: AsyncCallback): void { + let myCall = new AsyncCallbackWrapper(callback); + taskpool.execute((): void => { + missionManager.nativeMoveMissionToFront(missionId, myCall); + }); + } + + export function moveMissionToFront(missionId: int, options?: StartOptions): Promise { //可选参数 + let p: Promise = + new Promise((resolve: (data: undefined) => void, reject: (err: BusinessError | null) => void): void => { + let myCall = new AsyncCallbackWrapper((err: BusinessError | null) => { + if (err == null || err.code == 0) { + resolve(undefined); + } else { + reject(err); + } + }); + taskpool.execute((): void => { + missionManager.nativeMoveMissionToFront(missionId, options, myCall); + }); + }); + return p; + } + + export function on(type: 'mission', listener: MissionListener): number { //on 十 + return missionManager.nativeOn('misson',listener); + } + + export function off(type: 'mission', listenerId: int, callback: AsyncCallback): void { //off 十一 + let myCall = new AsyncCallbackWrapper(callback); + taskpool.execute((): void => { + missionManager.nativeOff(type, listenerId, myCall); + }); + } + + export function off(type: 'mission', listenerId: int): Promise { + let p: Promise = + new Promise((resolve: (data: undefined) => void, reject: (err: BusinessError | null) => void): void => { + let myCall = new AsyncCallbackWrapper((err: BusinessError | null) => { + if (err == null || err.code == 0) { + resolve(undefined); + } else { + reject(err); + } + }); + taskpool.execute((): void => { + missionManager.nativeOff(type, listenerId, myCall); + }); + }); + return p; + } + export type MissionInfo = _MissionInfo; + export type MissionListener = _MissionListener; + export type MissionSnapshot = _MissionSnapshot; } \ No newline at end of file diff --git a/frameworks/ets/ets/BUILD.gn b/frameworks/ets/ets/BUILD.gn index 128a246f4b8..b0eb992e337 100644 --- a/frameworks/ets/ets/BUILD.gn +++ b/frameworks/ets/ets/BUILD.gn @@ -1133,6 +1133,21 @@ ohos_prebuilt_etc("ability_runtime_ability_mission_manager_abc_etc") { deps = [ ":ability_runtime_ability_mission_manager_abc" ] } +generate_static_abc("ability_runtime_mission_listener_abc") { + base_url = "./" + files = [ "./application/MissionListener.ets" ] + is_boot_abc = "True" + device_dst_file = "/system/framework/ability_runtime_mission_listener_abc.abc" +} + +ohos_prebuilt_etc("ability_runtime_mission_listener_abc_etc") { + source = "$target_out_dir/ability_runtime_mission_listener_abc.abc" + module_install_dir = "framework" + subsystem_name = "ability" + part_name = "ability_runtime" + deps = [ ":ability_runtime_mission_listener_abc" ] +} + generate_static_abc("atomic_service_options_abc") { base_url = "./" files = [ "./@ohos.app.ability.AtomicServiceOptions.ets" ] @@ -1315,6 +1330,7 @@ group("ets_packages") { ":ability_runtime_insight_intent_executor_abc_etc", ":ability_runtime_interop_ability_lifecycle_callback_abc_etc", ":ability_runtime_mission_info_abc_etc", + ":ability_runtime_mission_listener_abc_etc", ":ability_runtime_openLink_options_abc_etc", ":ability_runtime_share_extension_ability_abc_etc", ":ability_runtime_shell_cmd_result_abc_etc", diff --git a/frameworks/ets/ets/application/MissionListener.ets b/frameworks/ets/ets/application/MissionListener.ets new file mode 100644 index 00000000000..cacd4a2d2bb --- /dev/null +++ b/frameworks/ets/ets/application/MissionListener.ets @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"), + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import image from '@ohos.multimedia.image'; + +export type OnMissionCreatedFn = (mission: int) => void; +export type OnMissionDestroyedFn = (mission: int) => void; +export type OnMissionSnapshotChangedFn = (mission: int) => void; +export type OnMissionMovedToFrontFn = (mission: int) => void; +export type OnMissionLabelUpdatedFn = (mission: int) => void; +export type OnMissionIconUpdatedFn = (mission: int, icon: image.PixelMap) => void; +export type OnMissionClosedFn = (mission: int) => void; + +export interface MissionListener { + onMissionCreated: OnMissionCreatedFn; + onMissionDestroyed: OnMissionDestroyedFn; + onMissionSnapshotChanged: OnMissionSnapshotChangedFn; + onMissionMovedToFront: OnMissionMovedToFrontFn; + onMissionLabelUpdated: OnMissionLabelUpdatedFn; + onMissionIconUpdated: OnMissionIconUpdatedFn; + onMissionClosed: OnMissionClosedFn; +} + +class MissionListenerInner implements MissionListener { + onMissionCreated: OnMissionCreatedFn = (mission: int) => { + } + onMissionDestroyed: OnMissionDestroyedFn = (mission: int) => { + } + onMissionSnapshotChanged: OnMissionSnapshotChangedFn = (mission: int) => { + } + onMissionMovedToFront: OnMissionMovedToFrontFn = (mission: int) => { + } + onMissionLabelUpdated: OnMissionLabelUpdatedFn = (mission: int) => { + } + onMissionIconUpdated: OnMissionIconUpdatedFn = (mission: int, icon: image.PixelMap) => { + } + onMissionClosed: OnMissionClosedFn = (mission: int) => { + } +} + +/* +export interface MissionListener { //方法转属性 + onMissionCreated(mission: int): void; + onMissionDestroyed(mission: int): void; + onMissionSnapshotChanged(mission: int): void; + onMissionMovedToFront(mission: int): void; + onMissionLabelUpdated(mission: int): void; + onMissionIconUpdated(mission: int, icon: image.PixelMap): void; + onMissionClosed(mission: int): void; +} +*/ \ No newline at end of file -- Gitee