1 /* 2 * Copyright (c) 2021-2025 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 #ifdef NOTIFICATION_SMART_REMINDER_SUPPORTED 16 #include "reminder_swing_decision_center.h" 17 #include "notification_preferences.h" 18 #include "smart_reminder_center.h" 19 #include "reminder_affected.h" 20 21 namespace OHOS { 22 namespace Notification { 23 using namespace std; 24 mutex ReminderSwingDecisionCenter::swingMutex_; 25 sptr<ISwingCallBack> ReminderSwingDecisionCenter::swingCallback_ = nullptr; 26 ReminderSwingDecisionCenter()27ReminderSwingDecisionCenter::ReminderSwingDecisionCenter() 28 {} 29 ~ReminderSwingDecisionCenter()30ReminderSwingDecisionCenter::~ReminderSwingDecisionCenter() {} 31 GetInstance()32ReminderSwingDecisionCenter &ReminderSwingDecisionCenter::GetInstance() 33 { 34 return DelayedRefSingleton<ReminderSwingDecisionCenter>::GetInstance(); 35 } 36 RegisterSwingCallback(const sptr<IRemoteObject> & swingCallback)37ErrCode ReminderSwingDecisionCenter::RegisterSwingCallback(const sptr<IRemoteObject> &swingCallback) 38 { 39 if (swingCallback == nullptr) { 40 ANS_LOGE("swingCallback is null."); 41 return ERR_INVALID_VALUE; 42 } 43 swingRecipient_ = new (nothrow) SwingCallbackRecipient(); 44 if (!swingRecipient_) { 45 ANS_LOGE("Failed to create death Recipient ptr SwingCallbackRecipient!"); 46 return ERR_NO_INIT; 47 } 48 swingCallback->AddDeathRecipient(swingRecipient_); 49 lock_guard<mutex> lock(swingMutex_); 50 swingCallback_ = iface_cast<ISwingCallBack>(swingCallback); 51 ANS_LOGI("RegisterSwingCallback OK"); 52 return ERR_OK; 53 } 54 ResetSwingCallbackProxy()55void ReminderSwingDecisionCenter::ResetSwingCallbackProxy() 56 { 57 ANS_LOGD("enter"); 58 lock_guard<mutex> lock(swingMutex_); 59 if (swingCallback_ == nullptr || swingCallback_->AsObject() == nullptr) { 60 ANS_LOGE("invalid proxy state"); 61 return; 62 } 63 swingCallback_->AsObject()->RemoveDeathRecipient(swingRecipient_); 64 swingCallback_ = nullptr; 65 } 66 OnRemoteDied(const wptr<IRemoteObject> & remote)67void SwingCallbackRecipient::OnRemoteDied(const wptr<IRemoteObject> &remote) 68 { 69 ANS_LOGI("Swing Callback died, remove the proxy object"); 70 ReminderSwingDecisionCenter::GetInstance().ResetSwingCallbackProxy(); 71 } 72 SwingCallbackRecipient()73SwingCallbackRecipient::SwingCallbackRecipient() {} 74 ~SwingCallbackRecipient()75SwingCallbackRecipient::~SwingCallbackRecipient() {} 76 } 77 } 78 #endif