From f68812c35ab31b7743523cffdbd5723ac3849ef5 Mon Sep 17 00:00:00 2001 From: cheerful_ricky Date: Mon, 1 Sep 2025 10:21:50 +0800 Subject: [PATCH] only subscribeSelf subscriber died will remove system live view notifications Signed-off-by: cheerful_ricky --- .../include/notification_subscriber_manager.h | 15 ++++- .../advanced_notification_publish_service.cpp | 2 +- .../src/notification_subscriber_manager.cpp | 17 +---- .../mock/include/mock_ans_subscriber.h | 11 +--- .../notification_subscriber_manager_test.cpp | 66 ++++++++++++++----- 5 files changed, 72 insertions(+), 39 deletions(-) diff --git a/services/ans/include/notification_subscriber_manager.h b/services/ans/include/notification_subscriber_manager.h index 9306d9218..15f122884 100644 --- a/services/ans/include/notification_subscriber_manager.h +++ b/services/ans/include/notification_subscriber_manager.h @@ -39,7 +39,20 @@ namespace OHOS { namespace Notification { class NotificationSubscriberManager : public DelayedSingleton { public: - struct SubscriberRecord; + struct SubscriberRecord { + sptr subscriber {nullptr}; + std::set bundleList_ {}; + bool subscribedAll {false}; + int32_t userId {SUBSCRIBE_USER_INIT}; + std::string deviceType {CURRENT_DEVICE_TYPE}; + int32_t subscriberUid {DEFAULT_UID}; + std::string subscriberBundleName_; + bool needNotifyApplicationChanged = false; + bool needNotifyResponse = false; + uint32_t filterType {0}; + std::set slotTypes {}; + bool isSubscribeSelf = false; + }; /** * @brief Add a subscriber. diff --git a/services/ans/src/advanced_notification_publish_service.cpp b/services/ans/src/advanced_notification_publish_service.cpp index 077b52072..f2268cf5d 100644 --- a/services/ans/src/advanced_notification_publish_service.cpp +++ b/services/ans/src/advanced_notification_publish_service.cpp @@ -736,7 +736,7 @@ ErrCode AdvancedNotificationService::PublishNotificationBySa(const sptrIsAgentNotification() || request->GetOwnerUid() != DEFAULT_UID) { + if (request->IsAgentNotification()) { uid = request->GetOwnerUid(); request->SetIsAgentNotification(false); directAgency = true; diff --git a/services/ans/src/notification_subscriber_manager.cpp b/services/ans/src/notification_subscriber_manager.cpp index 5700fb351..f380f92b9 100644 --- a/services/ans/src/notification_subscriber_manager.cpp +++ b/services/ans/src/notification_subscriber_manager.cpp @@ -42,19 +42,6 @@ namespace OHOS { namespace Notification { -struct NotificationSubscriberManager::SubscriberRecord { - sptr subscriber {nullptr}; - std::set bundleList_ {}; - bool subscribedAll {false}; - int32_t userId {SUBSCRIBE_USER_INIT}; - std::string deviceType {CURRENT_DEVICE_TYPE}; - int32_t subscriberUid {DEFAULT_UID}; - bool needNotifyApplicationChanged = false; - bool needNotifyResponse = false; - uint32_t filterType {0}; - std::set slotTypes {}; - bool isSubscribeSelf = false; -}; const uint32_t FILTETYPE_IM = 1 << 0; const uint32_t FILTETYPE_QUICK_REPLY_IM = 2 << 0; @@ -351,7 +338,9 @@ void NotificationSubscriberManager::OnRemoteDied(const wptr &obje auto subscriberUid = record->subscriberUid; ANS_LOGI("subscriber removed . subscriberUid = %{public}d", record->subscriberUid); subscriberRecordList_.remove(record); - AdvancedNotificationService::GetInstance()->RemoveSystemLiveViewNotificationsOfSa(record->subscriberUid); + if (record->isSubscribeSelf) { + AdvancedNotificationService::GetInstance()->RemoveSystemLiveViewNotificationsOfSa(subscriberUid); + } } })); notificationSubQueue_->wait(handler); diff --git a/services/ans/test/unittest/mock/include/mock_ans_subscriber.h b/services/ans/test/unittest/mock/include/mock_ans_subscriber.h index aedd39afb..dcec2e172 100644 --- a/services/ans/test/unittest/mock/include/mock_ans_subscriber.h +++ b/services/ans/test/unittest/mock/include/mock_ans_subscriber.h @@ -17,19 +17,14 @@ #define BASE_NOTIFICATION_MOCK_ANS_SUBCRIBER_OBJECT_H #include "gmock/gmock.h" -#include "ians_subscriber.h" +#include "ans_subscriber_proxy.h" namespace OHOS { namespace Notification { -class MockAnsSubscriber : public IAnsSubscriber { +class MockAnsSubscriber : public AnsSubscriberProxy { public: - MockAnsSubscriber() {} - ~MockAnsSubscriber() {} + explicit MockAnsSubscriber(const sptr& remote) : AnsSubscriberProxy(remote) {}; - sptr AsObject() override - { - return nullptr; - } ErrCode OnConnected() override { return ERR_OK; }; ErrCode OnDisconnected() override { return ERR_OK; }; diff --git a/services/ans/test/unittest/notification_subscriber_manager_test.cpp b/services/ans/test/unittest/notification_subscriber_manager_test.cpp index ec975480f..e39237816 100644 --- a/services/ans/test/unittest/notification_subscriber_manager_test.cpp +++ b/services/ans/test/unittest/notification_subscriber_manager_test.cpp @@ -37,11 +37,7 @@ namespace OHOS { namespace Notification { class MockAnsSubscriberTest : public MockAnsSubscriber { public: - sptr AsObject() override - { - return new MockIRemoteObject(); - } - + explicit MockAnsSubscriberTest(const sptr& remote) : MockAnsSubscriber(remote) {}; ErrCode OnConsumed(const sptr ¬ification, const sptr ¬ificationMap) override { @@ -323,7 +319,7 @@ HWTEST_F(NotificationSubscriberManagerTest, UnRegisterOnSubscriberAddCallbackTes */ HWTEST_F(NotificationSubscriberManagerTest, BatchNotifyConsumedInner_001, Function | SmallTest | Level1) { - sptr mockSubscriber = new MockAnsSubscriber(); + sptr mockSubscriber = new MockAnsSubscriber(new MockIRemoteObject()); EXPECT_CALL(*mockSubscriber, OnConsumedList(_, _)).Times(1); sptr request = new NotificationRequest(); @@ -351,7 +347,7 @@ HWTEST_F(NotificationSubscriberManagerTest, BatchNotifyConsumedInner_001, Functi */ HWTEST_F(NotificationSubscriberManagerTest, BatchNotifyConsumedInner_002, Function | SmallTest | Level1) { - sptr mockSubscriber = new MockAnsSubscriber(); + sptr mockSubscriber = new MockAnsSubscriber(new MockIRemoteObject()); EXPECT_CALL(*mockSubscriber, OnConsumedList(_, _)).Times(0); std::vector> notifications; notificationSubscriberManager_->BatchNotifyConsumedInner(notifications, nullptr, nullptr); @@ -364,7 +360,7 @@ HWTEST_F(NotificationSubscriberManagerTest, BatchNotifyConsumedInner_002, Functi */ HWTEST_F(NotificationSubscriberManagerTest, BatchNotifyConsumedInner_003, Function | SmallTest | Level1) { - sptr mockSubscriber = new MockAnsSubscriber(); + sptr mockSubscriber = new MockAnsSubscriber(new MockIRemoteObject()); EXPECT_CALL(*mockSubscriber, OnConsumedList(_, _)).Times(0); sptr request = new NotificationRequest(); @@ -903,6 +899,46 @@ HWTEST_F(NotificationSubscriberManagerTest, OnRemoteDied_001, Function | SmallTe notificationSubscriberManager_->OnRemoteDied(obj); EXPECT_NE(notificationSubscriberManager_, nullptr); } + +HWTEST_F(NotificationSubscriberManagerTest, OnRemoteDied_recordNotNull, TestSize.Level1) +{ + // Arrange + NotificationSubscriberManager notificationSubscriberManager; + notificationSubscriberManager.notificationSubQueue_ = std::make_shared("test"); + std::shared_ptr testAnsSubscriber = std::make_shared(); + sptr subscriber(new (std::nothrow) SubscriberListener(testAnsSubscriber)); + std::shared_ptr record = + notificationSubscriberManager.CreateSubscriberRecord(subscriber); + record->subscriberUid = 123; + notificationSubscriberManager.subscriberRecordList_.push_back(record); + LivePublishProcess::GetInstance()->AddLiveViewSubscriber(123); + + notificationSubscriberManager.OnRemoteDied(subscriber->AsObject()); + + EXPECT_EQ(notificationSubscriberManager.subscriberRecordList_.size(), 0); + EXPECT_TRUE(LivePublishProcess::GetInstance()->GetLiveViewSubscribeState(123)); +} + +HWTEST_F(NotificationSubscriberManagerTest, OnRemoteDied_recordIsSubscribeSelf, TestSize.Level1) +{ + // Arrange + NotificationSubscriberManager notificationSubscriberManager; + notificationSubscriberManager.notificationSubQueue_ = std::make_shared("test"); + std::shared_ptr testAnsSubscriber = std::make_shared(); + sptr subscriber(new (std::nothrow) SubscriberListener(testAnsSubscriber)); + std::shared_ptr record = + notificationSubscriberManager.CreateSubscriberRecord(subscriber); + record->subscriberUid = 123; + record->isSubscribeSelf = true; + notificationSubscriberManager.subscriberRecordList_.push_back(record); + LivePublishProcess::GetInstance()->AddLiveViewSubscriber(123); + + notificationSubscriberManager.OnRemoteDied(subscriber->AsObject()); + + EXPECT_EQ(notificationSubscriberManager.subscriberRecordList_.size(), 0); + EXPECT_FALSE(LivePublishProcess::GetInstance()->GetLiveViewSubscribeState(123)); +} + /** * @tc.name: NotifyConsumedInner_001 * @tc.desc: Test NotifyConsumedInner when notification is nullptr @@ -927,7 +963,7 @@ HWTEST_F(NotificationSubscriberManagerTest, NotifyConsumedInner_001, Function | HWTEST_F(NotificationSubscriberManagerTest, NotifyConsumedInner_002, Function | SmallTest | Level1) { NotificationSubscriberManager notificationSubscriberManager; - sptr subscriber(new (std::nothrow) MockAnsSubscriberTest()); + sptr subscriber(new (std::nothrow) MockAnsSubscriberTest(new MockIRemoteObject())); const sptr subscribeInfo = new NotificationSubscribeInfo(); subscribeInfo->AddAppUserId(SUBSCRIBE_USER_ALL); notificationSubscriberManager.AddSubscriberInner(subscriber, subscribeInfo); @@ -951,7 +987,7 @@ HWTEST_F(NotificationSubscriberManagerTest, NotifyConsumedInner_002, Function | HWTEST_F(NotificationSubscriberManagerTest, NotifyConsumedInner_003, Function | SmallTest | Level1) { NotificationSubscriberManager notificationSubscriberManager; - sptr subscriber(new (std::nothrow) MockAnsSubscriberTest()); + sptr subscriber(new (std::nothrow) MockAnsSubscriberTest(new MockIRemoteObject())); const sptr subscribeInfo = new NotificationSubscribeInfo(); subscribeInfo->AddAppUserId(SUBSCRIBE_USER_ALL); notificationSubscriberManager.AddSubscriberInner(subscriber, subscribeInfo); @@ -979,7 +1015,7 @@ HWTEST_F(NotificationSubscriberManagerTest, NotifyConsumedInner_003, Function | HWTEST_F(NotificationSubscriberManagerTest, NotifyConsumedInner_004, Function | SmallTest | Level1) { NotificationSubscriberManager notificationSubscriberManager; - sptr subscriber(new (std::nothrow) MockAnsSubscriberTest()); + sptr subscriber(new (std::nothrow) MockAnsSubscriberTest(new MockIRemoteObject())); const sptr subscribeInfo = new NotificationSubscribeInfo(); subscribeInfo->AddAppUserId(SUBSCRIBE_USER_ALL); notificationSubscriberManager.AddSubscriberInner(subscriber, subscribeInfo); @@ -1003,7 +1039,7 @@ HWTEST_F(NotificationSubscriberManagerTest, NotifyConsumedInner_004, Function | HWTEST_F(NotificationSubscriberManagerTest, NotifyConsumedInner_005, Function | SmallTest | Level1) { NotificationSubscriberManager notificationSubscriberManager; - sptr subscriber(new (std::nothrow) MockAnsSubscriberTest()); + sptr subscriber(new (std::nothrow) MockAnsSubscriberTest(new MockIRemoteObject())); const sptr subscribeInfo = new NotificationSubscribeInfo(); subscribeInfo->AddAppUserId(SUBSCRIBE_USER_ALL); notificationSubscriberManager.AddSubscriberInner(subscriber, subscribeInfo); @@ -1046,7 +1082,7 @@ HWTEST_F(NotificationSubscriberManagerTest, GetIsEnableEffectedRemind_001, Funct HWTEST_F(NotificationSubscriberManagerTest, GetIsEnableEffectedRemind_002, Function | SmallTest | Level1) { NotificationSubscriberManager notificationSubscriberManager; - sptr subscriber(new (std::nothrow) MockAnsSubscriberTest()); + sptr subscriber(new (std::nothrow) MockAnsSubscriberTest(new MockIRemoteObject())); const sptr subscribeInfo = new NotificationSubscribeInfo(); subscribeInfo->AddAppUserId(SUBSCRIBE_USER_ALL); subscribeInfo->AddDeviceType(NotificationConstant::PC_DEVICE_TYPE); @@ -1080,7 +1116,7 @@ HWTEST_F(NotificationSubscriberManagerTest, IsDeviceTypeSubscriberd_002, Functio { NotificationSubscriberManager notificationSubscriberManager; std::string deviceType = NotificationConstant::PC_DEVICE_TYPE; - sptr subscriber(new (std::nothrow) MockAnsSubscriberTest()); + sptr subscriber(new (std::nothrow) MockAnsSubscriberTest(new MockIRemoteObject())); const sptr subscribeInfo = new NotificationSubscribeInfo(); subscribeInfo->AddAppUserId(SUBSCRIBE_USER_ALL); subscribeInfo->AddDeviceType(deviceType); @@ -1100,7 +1136,7 @@ HWTEST_F(NotificationSubscriberManagerTest, IsDeviceTypeAffordConsume_001, Funct { NotificationSubscriberManager notificationSubscriberManager; std::string deviceType = NotificationConstant::PC_DEVICE_TYPE; - sptr subscriber(new (std::nothrow) MockAnsSubscriberTest()); + sptr subscriber(new (std::nothrow) MockAnsSubscriberTest(new MockIRemoteObject())); const sptr subscribeInfo = new NotificationSubscribeInfo(); subscribeInfo->AddAppUserId(SUBSCRIBE_USER_ALL); subscribeInfo->AddDeviceType(deviceType); -- Gitee