1 /*
2  * Copyright (c) 2024 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 
16 #ifndef OHOS_ABILITY_RUNTIME_ABILITY_FIRST_FRAME_STATE_OBSERVER_MANAGER_H
17 #define OHOS_ABILITY_RUNTIME_ABILITY_FIRST_FRAME_STATE_OBSERVER_MANAGER_H
18 #ifdef SUPPORT_GRAPHICS
19 
20 #include <map>
21 #include <string>
22 
23 #include "ability_first_frame_state_observer_interface.h"
24 #include "ability_record.h"
25 #include "cpp/mutex.h"
26 #include "singleton.h"
27 
28 namespace OHOS {
29 namespace AppExecFwk {
30 using AbilityFirstFrameStateObserverMap = std::map<sptr<IAbilityFirstFrameStateObserver>, std::string>;
31 
32 class AbilityFirstFrameStateObserverSet final {
33 public:
34     explicit AbilityFirstFrameStateObserverSet(bool isNotifyAllBundles);
35     ~AbilityFirstFrameStateObserverSet() = default;
36     int32_t AddAbilityFirstFrameStateObserver(const sptr<IAbilityFirstFrameStateObserver> &observer,
37         const std::string &bundleName);
38     int32_t RemoveAbilityFirstFrameStateObserver(const sptr<IAbilityFirstFrameStateObserver> &observer);
39     void OnAbilityFirstFrameState(const std::shared_ptr<AbilityRecord> &abilityRecord);
40 
41 protected:
42     void AddObserverDeathRecipient(const sptr<IRemoteBroker> &observer);
43     void RemoveObserverDeathRecipient(const sptr<IRemoteBroker> &observer);
44 
45 private:
46     ffrt::mutex observerLock_;
47     AbilityFirstFrameStateObserverMap observerMap_;
48     std::map<sptr<IRemoteObject>, sptr<IRemoteObject::DeathRecipient>> recipientMap_;
49     bool isNotifyAllBundles_;
50 };
51 
52 class AbilityFirstFrameStateObserverManager {
53 public:
54     static AbilityFirstFrameStateObserverManager &GetInstance();
55 
56     AbilityFirstFrameStateObserverManager() = default;
57     ~AbilityFirstFrameStateObserverManager() = default;
58     void Init();
59     int32_t RegisterAbilityFirstFrameStateObserver(const sptr<IAbilityFirstFrameStateObserver> &observer,
60         const std::string &targetBundleName);
61     int32_t UnregisterAbilityFirstFrameStateObserver(const sptr<IAbilityFirstFrameStateObserver> &observer);
62     void HandleOnFirstFrameState(const std::shared_ptr<AbilityRecord> &abilityRecord);
63 
64 private:
65     std::unique_ptr<AbilityFirstFrameStateObserverSet> stateObserverSetForBundleName_;
66     std::unique_ptr<AbilityFirstFrameStateObserverSet> stateObserverSetForAllBundles_;
67 };
68 }  // namespace AppExecFwk
69 }  // namespace OHOS
70 #endif // SUPPORT_GRAPHICS
71 #endif  // OHOS_ABILITY_RUNTIME_ABILITY_FIRST_FRAME_STATE_OBSERVER_MANAGER_H
72