diff --git a/interfaces/inner_api/ability_manager/include/kiosk_status.h b/interfaces/inner_api/ability_manager/include/kiosk_status.h index 5df85c30b41dfbbe4b03ceb79ffd0194c95506e0..9b5afcff0bfe686dfa2c28cc43d25df8393d2b4f 100644 --- a/interfaces/inner_api/ability_manager/include/kiosk_status.h +++ b/interfaces/inner_api/ability_manager/include/kiosk_status.h @@ -16,7 +16,7 @@ #define OHOS_ABILITY_RUNTIME_KIOSK_STATUS_H #include - +#include "iremote_object.h" #include "parcel.h" namespace OHOS { @@ -26,14 +26,14 @@ namespace AAFwk { * KioskStatus is used to save information about Kiosk mode. */ struct KioskStatus : public Parcelable { - bool ReadFromParcel(Parcel &parcel); - virtual bool Marshalling(Parcel &parcel) const override; - static KioskStatus *Unmarshalling(Parcel &parcel); + virtual bool Marshalling(MessageParcel &parcel) const override; + static bool UnMarshalling(MessageParcel &parcel, KioskStatus &kioskStatus); void Clear(); bool isKioskMode_ = false; std::string kioskBundleName_; int32_t kioskBundleUid_{}; + sptr kioskToken_; }; } // namespace AAFwk } // namespace OHOS diff --git a/services/abilitymgr/src/ability_manager_proxy.cpp b/services/abilitymgr/src/ability_manager_proxy.cpp index 8854ad86ad3c79a5a7913204b10b5d2d035bc4a9..bec99822682f6770a5ca7d75dd5612f2d4353783 100644 --- a/services/abilitymgr/src/ability_manager_proxy.cpp +++ b/services/abilitymgr/src/ability_manager_proxy.cpp @@ -6736,6 +6736,11 @@ int32_t AbilityManagerProxy::EnterKioskMode(sptr callerToken) int32_t AbilityManagerProxy::ExitKioskMode(sptr callerToken) { + TAG_LOGI(AAFwkTag::ABILITYMGR, "ttt 1"); + KioskStatus kioskStatus; + GetKioskStatus(kioskStatus); + TAG_LOGI(AAFwkTag::ABILITYMGR, "ttt 1-1"); + MessageParcel data; MessageParcel reply; MessageOption option; @@ -6766,6 +6771,7 @@ int32_t AbilityManagerProxy::ExitKioskMode(sptr callerToken) int32_t AbilityManagerProxy::GetKioskStatus(KioskStatus &kioskStatus) { + TAG_LOGI(AAFwkTag::ABILITYMGR, "ttt 2"); MessageParcel data; MessageParcel reply; MessageOption option; @@ -6774,19 +6780,21 @@ int32_t AbilityManagerProxy::GetKioskStatus(KioskStatus &kioskStatus) TAG_LOGE(AAFwkTag::ABILITYMGR, "writeInterfaceToken failed"); return ERR_WRITE_INTERFACE_TOKEN_FAILED; } + TAG_LOGI(AAFwkTag::ABILITYMGR, "ttt 2-1"); auto error = SendRequest(AbilityManagerInterfaceCode::GET_KIOSK_INFO, data, reply, option); if (error != NO_ERROR) { TAG_LOGE(AAFwkTag::ABILITYMGR, "request error:%{public}d", error); return error; } + TAG_LOGI(AAFwkTag::ABILITYMGR, "ttt 2-2"); - std::unique_ptr info(reply.ReadParcelable()); - if (!info) { + if (!KioskStatus::UnMarshalling(reply, kioskStatus)) { + TAG_LOGI(AAFwkTag::ABILITYMGR, "ttt 2-3"); TAG_LOGE(AAFwkTag::ABILITYMGR, "read KioskStatus fail"); return ERR_READ_RESULT_PARCEL_FAILED; } - kioskStatus = *info; + TAG_LOGI(AAFwkTag::ABILITYMGR, "ttt 2-4"); return reply.ReadInt32(); } diff --git a/services/abilitymgr/src/ability_manager_service.cpp b/services/abilitymgr/src/ability_manager_service.cpp index 87192be9a16ba880e2089033df01afb0a76897d6..6a12467237b04e17f304ed182a3aeab92bb142bf 100644 --- a/services/abilitymgr/src/ability_manager_service.cpp +++ b/services/abilitymgr/src/ability_manager_service.cpp @@ -7162,8 +7162,15 @@ void AbilityManagerService::OnAbilityDied(std::shared_ptr ability TAG_LOGI(AAFwkTag::ABILITYMGR, "On ability died: %{public}s, %{public}d, %{public}" PRId64, abilityRecord->GetURI().c_str(), abilityRecord->GetRecordId(), abilityRecord->GetAbilityRecordId()); + TAG_LOGI(AAFwkTag::ABILITYMGR, "ttt call 1."); if (abilityRecord->GetToken()) { + TAG_LOGI(AAFwkTag::ABILITYMGR, "ttt call 2."); FreezeUtil::GetInstance().DeleteLifecycleEvent(abilityRecord->GetToken()->AsObject()); + if (KioskManager::GetInstance().IsInKioskMode() && + KioskManager::GetInstance().IsInWhiteList(abilityRecord->GetAbilityInfo().bundleName)) { + TAG_LOGI(AAFwkTag::ABILITYMGR, "ttt call 3."); + KioskManager::GetInstance().ExitKioskMode(abilityRecord->GetToken()->AsObject()); + } } FreezeUtil::GetInstance().DeleteAppLifecycleEvent(abilityRecord->GetPid()); if (Rosen::SceneBoardJudgement::IsSceneBoardEnabled()) { diff --git a/services/abilitymgr/src/kiosk_manager.cpp b/services/abilitymgr/src/kiosk_manager.cpp index dac983486c6b46f926638ae5c79cd0a73a73b334..23aee7203e1ddbe8b5cc74be7a5f883499c7ff78 100644 --- a/services/abilitymgr/src/kiosk_manager.cpp +++ b/services/abilitymgr/src/kiosk_manager.cpp @@ -94,6 +94,7 @@ int32_t KioskManager::UpdateKioskApplicationList(const std::vector int32_t KioskManager::EnterKioskMode(sptr callerToken) { + kioskStatus_.kioskToken_ = callerToken; if (!system::GetBoolParameter(KIOSK_MODE_ENABLED, false)) { TAG_LOGE(AAFwkTag::ABILITYMGR, "Disabled config"); return ERR_CAPABILITY_NOT_SUPPORT; @@ -120,6 +121,7 @@ int32_t KioskManager::EnterKioskMode(sptr callerToken) kioskStatus_.isKioskMode_ = true; kioskStatus_.kioskBundleName_ = bundleName; kioskStatus_.kioskBundleUid_ = IPCSkeleton::GetCallingUid(); + kioskStatus_.kioskToken_ = callerToken; GetEnterKioskModeCallback()(); NotifyKioskModeChanged(true); auto sceneSessionManager = Rosen::SessionManagerLite::GetInstance().GetSceneSessionManagerLiteProxy(); diff --git a/services/abilitymgr/src/kiosk_status.cpp b/services/abilitymgr/src/kiosk_status.cpp index 34e457ac3dd1d1f35cabe127ea4eed3a44f7e97d..dd5d4887abd42838c71738b0abcea6c06ff547c4 100644 --- a/services/abilitymgr/src/kiosk_status.cpp +++ b/services/abilitymgr/src/kiosk_status.cpp @@ -19,26 +19,7 @@ namespace OHOS { namespace AAFwk { -bool KioskStatus::ReadFromParcel(Parcel &parcel) -{ - isKioskMode_ = parcel.ReadBool(); - kioskBundleName_ = Str16ToStr8(parcel.ReadString16()); - kioskBundleUid_ = parcel.ReadInt32(); - return true; -} - -KioskStatus *KioskStatus::Unmarshalling(Parcel &parcel) -{ - KioskStatus *info = new KioskStatus(); - if (!info->ReadFromParcel(parcel)) { - TAG_LOGE(AAFwkTag::ABILITYMGR, "ReadFromParcel failed"); - delete info; - info = nullptr; - } - return info; -} - -bool KioskStatus::Marshalling(Parcel &parcel) const +bool KioskStatus::Marshalling(MessageParcel& parcel) const { if (!parcel.WriteBool(isKioskMode_)) { TAG_LOGE(AAFwkTag::ABILITYMGR, "write isKioskMode_ failed"); @@ -54,6 +35,24 @@ bool KioskStatus::Marshalling(Parcel &parcel) const TAG_LOGE(AAFwkTag::ABILITYMGR, "write kioskBundleUid_ failed"); return false; } + + if (!parcel.WriteRemoteObject(kioskToken_)) { + TAG_LOGE(AAFwkTag::ABILITYMGR, "write kioskToken_ failed"); + return false; + } + + return true; +} + +bool KioskStatus::UnMarshalling(MessageParcel &parcel, KioskStatus &kioskStatus) +{ + TAG_LOGI(AAFwkTag::ABILITYMGR, "ttt UnMarshalling"); + kioskStatus.isKioskMode_ = parcel.ReadBool(); + kioskStatus.kioskBundleName_ = Str16ToStr8(parcel.ReadString16()); + kioskStatus.kioskBundleUid_ = parcel.ReadInt32(); + TAG_LOGI(AAFwkTag::ABILITYMGR, "ttt UnMarshalling 2"); + kioskStatus.kioskToken_ = parcel.ReadRemoteObject(); + TAG_LOGI(AAFwkTag::ABILITYMGR, "ttt UnMarshalling 3"); return true; } @@ -62,6 +61,7 @@ void KioskStatus::Clear() isKioskMode_ = false; kioskBundleUid_ = 0; kioskBundleName_.clear(); + kioskToken_ = nullptr; } } // namespace AAFwk } // namespace OHOS