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_CJ_APPLICATION_CONTEXT_H
17 #define OHOS_ABILITY_RUNTIME_CJ_APPLICATION_CONTEXT_H
18 
19 #include <cstdint>
20 #include <shared_mutex>
21 
22 #include "cj_macro.h"
23 #include "cj_environment_callback.h"
24 #include "cj_ability_lifecycle_callback.h"
25 #include "cj_application_state_change_callback.h"
26 #include "cj_common_ffi.h"
27 #include "ffi_remote_data.h"
28 #include "ability_delegator_registry.h"
29 
30 namespace OHOS {
31 namespace ApplicationContextCJ {
32 using namespace OHOS::AbilityRuntime;
33 
34 class CJApplicationContext : public FFI::FFIData {
35 public:
CJApplicationContext(std::weak_ptr<AbilityRuntime::ApplicationContext> &&applicationContext)36     explicit CJApplicationContext(std::weak_ptr<AbilityRuntime::ApplicationContext> &&applicationContext)
37         : applicationContext_(std::move(applicationContext)) {};
38 
39     int GetArea();
40     std::shared_ptr<AppExecFwk::ApplicationInfo> GetApplicationInfo();
41     void RegisterAbilityLifecycleCallback(const std::shared_ptr<CjAbilityLifecycleCallback> &abilityLifecycleCallback);
42     void UnregisterAbilityLifecycleCallback(
43         const std::shared_ptr<CjAbilityLifecycleCallback> &abilityLifecycleCallback);
44     bool IsAbilityLifecycleCallbackEmpty();
45     void DispatchOnAbilityCreate(const int64_t &ability);
46     void DispatchOnWindowStageCreate(const int64_t &ability, WindowStagePtr windowStage);
47     void DispatchWindowStageFocus(const int64_t &ability, WindowStagePtr windowStage);
48     void DispatchWindowStageUnfocus(const int64_t &ability, WindowStagePtr windowStage);
49     void DispatchOnWindowStageDestroy(const int64_t &ability, WindowStagePtr windowStage);
50     void DispatchOnAbilityDestroy(const int64_t &ability);
51     void DispatchOnAbilityForeground(const int64_t &ability);
52     void DispatchOnAbilityBackground(const int64_t &ability);
53     void DispatchOnAbilityContinue(const int64_t &ability);
54     // optional callbacks
55     void DispatchOnAbilityWillCreate(const int64_t &ability);
56     void DispatchOnWindowStageWillCreate(const int64_t &ability, WindowStagePtr windowStage);
57     void DispatchOnWindowStageWillDestroy(const int64_t &ability, WindowStagePtr windowStage);
58     void DispatchOnAbilityWillDestroy(const int64_t &ability);
59     void DispatchOnAbilityWillForeground(const int64_t &ability);
60     void DispatchOnAbilityWillBackground(const int64_t &ability);
61     void DispatchOnNewWant(const int64_t &ability);
62     void DispatchOnWillNewWant(const int64_t &ability);
63     void DispatchOnAbilityWillContinue(const int64_t &ability);
64     void DispatchOnWindowStageWillRestore(const int64_t &ability, WindowStagePtr windowStage);
65     void DispatchOnWindowStageRestore(const int64_t &ability, WindowStagePtr windowStage);
66     void DispatchOnAbilityWillSaveState(const int64_t &ability);
67     void DispatchOnAbilitySaveState(const int64_t &ability);
68 
69     int32_t OnOnEnvironment(void (*cfgCallback)(AbilityRuntime::CConfiguration),
70         void (*memCallback)(int32_t), bool isSync, int32_t *errCode);
71     int32_t OnOnAbilityLifecycle(CArrI64 cFuncIds, bool isSync, int32_t *errCode);
72     int32_t OnOnApplicationStateChange(void (*foregroundCallback)(void),
73         void (*backgroundCallback)(void), int32_t *errCode);
74     void OnOffEnvironment(int32_t callbackId, int32_t *errCode);
75     void OnOffAbilityLifecycle(int32_t callbackId, int32_t *errCode);
76     void OnOffApplicationStateChange(int32_t callbackId, int32_t *errCode);
77     static CJApplicationContext* GetCJApplicationContext(
78         std::weak_ptr<AbilityRuntime::ApplicationContext> &&applicationContext);
79 private:
80     std::weak_ptr<AbilityRuntime::ApplicationContext> applicationContext_;
81     std::shared_ptr<AbilityRuntime::CjAbilityLifecycleCallback> callback_;
82     std::shared_ptr<AbilityRuntime::CjEnvironmentCallback> envCallback_;
83     std::shared_ptr<CjApplicationStateChangeCallback> applicationStateCallback_;
84     std::mutex applicationStateCallbackLock_;
85     std::recursive_mutex callbackLock_;
86     static std::vector<std::shared_ptr<CjAbilityLifecycleCallback>> callbacks_;
87     static CJApplicationContext* cjApplicationContext_;
88 };
89 
90 extern "C" {
91 struct CApplicationInfo {
92     const char* name;
93     const char* bundleName;
94 };
95 
96 CJ_EXPORT int64_t FFIGetArea(int64_t id);
97 CJ_EXPORT CApplicationInfo* FFICJApplicationInfo(int64_t id);
98 CJ_EXPORT int32_t FfiCJApplicationContextOnOnEnvironment(int64_t id, void (*cfgCallback)(CConfiguration),
99     void (*memCallback)(int32_t), int32_t *errCode);
100 CJ_EXPORT int32_t FfiCJApplicationContextOnOnAbilityLifecycle(int64_t id, CArrI64 cFuncIds, int32_t *errCode);
101 CJ_EXPORT int32_t FfiCJApplicationContextOnOnApplicationStateChange(int64_t id, void (*foregroundCallback)(void),
102     void (*backgroundCallback)(void), int32_t *errCode);
103 CJ_EXPORT void FfiCJApplicationContextOnOff(int64_t id, const char* type, int32_t callbackId, int32_t *errCode);
104 };
105 }
106 }
107 #endif // OHOS_ABILITY_RUNTIME_CJ_APPLICATION_CONTEXT_H