• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 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 
16 #ifndef OHOS_MULTI_SCREEN_POWER_CHANGE_MANAGER_H
17 #define OHOS_MULTI_SCREEN_POWER_CHANGE_MANAGER_H
18 #include "wm_single_instance.h"
19 
20 #include "dm_common.h"
21 #include "multi_screen_change_utils.h"
22 #include "screen_session_manager.h"
23 #include "session/screen/include/screen_session.h"
24 
25 namespace OHOS::Rosen {
26 
27 class MultiScreenPowerChangeManager {
28 WM_DECLARE_SINGLE_INSTANCE_BASE(MultiScreenPowerChangeManager);
29 public:
30     MultiScreenPowerChangeManager();
31     ~MultiScreenPowerChangeManager();
32 
33     DMError OnMultiScreenPowerChangeRequest(sptr<ScreenSession>& innerScreen, sptr<ScreenSession>& externalScreen,
34         MultiScreenPowerSwitchType switchStatus);
35 
36     void SetInnerAndExternalCombination(ScreenCombination innerCombination, ScreenCombination externalCombination);
37 
38 private:
39     ScreenCombination innerCombination_ = ScreenCombination::SCREEN_MAIN;
40     ScreenCombination externalCombination_ = ScreenCombination::SCREEN_EXTEND;
41 
42     /* screen power status map */
43     using HandleScreenPowerChange = std::function<DMError(sptr<ScreenSession> &, sptr<ScreenSession> &)>;
44     using HandleScreenPowerChangeMap = std::map<MultiScreenPowerSwitchType, HandleScreenPowerChange>;
45     HandleScreenPowerChangeMap handleScreenPowerChangeMap_ {};
46 
47     void InitMultiScreenPowerChangeMap();
48     DMError HandleScreenOnChange(sptr<ScreenSession>& innerScreen, sptr<ScreenSession>& externalScreen);
49     DMError HandleScreenOffChange(sptr<ScreenSession>& innerScreen, sptr<ScreenSession>& externalScreen);
50 
51     /* only external*/
52     DMError HandleScreenOnlyExternalModeChange(sptr<ScreenSession>& innerScreen, sptr<ScreenSession>& externalScreen);
53 
54     /* screen off mode change map */
55     using HandleScreenOffModeChange = std::function<DMError(sptr<ScreenSession> &, sptr<ScreenSession> &)>;
56     /* inner screen old combination and external screen old combination */
57     using ScreenCombinationChangeEvent = std::pair<ScreenCombination, ScreenCombination>;
58     using HandleScreenOffModeChangeMap = std::map<ScreenCombinationChangeEvent, HandleScreenOffModeChange>;
59     HandleScreenOffModeChangeMap handleScreenOffModeChangeMap_ {};
60 
61     /* mode change handler: external only */
62     void InitMultiScreenModeOffChangeMap();
63 
64    /* recovery screen mode from power off */
65     using HandleRecoveryScreenModeChange = std::function<DMError(sptr<ScreenSession> &, sptr<ScreenSession> &)>;
66     using HandleRecoveryScreenModeChangeMap = std::map<ScreenCombinationChangeEvent, HandleRecoveryScreenModeChange>;
67     HandleRecoveryScreenModeChangeMap handleRecoveryScreenModeChangeMap_ {};
68 
69     /* mode change handler: recovery */
70     void InitRecoveryMultiScreenModeChangeMap();
71 
72     /* inner main and external extend to external main */
73     DMError HandleInnerMainExternalExtendChange(sptr<ScreenSession>& innerScreen,
74         sptr<ScreenSession>& externalScreen);
75 
76     /* inner main and external mirror to external main */
77     DMError HandleInnerMainExternalMirrorChange(sptr<ScreenSession>& innerScreen,
78         sptr<ScreenSession>& externalScreen);
79 
80     /* inner extend and external main to external main */
81     DMError HandleInnerExtendExternalMainChange(sptr<ScreenSession>& innerScreen,
82         sptr<ScreenSession>& externalScreen);
83 
84     /* inner mirror and external main to external main */
85     DMError HandleInnerMirrorExternalMainChange(sptr<ScreenSession>& innerScreen,
86         sptr<ScreenSession>& externalScreen);
87 
88     /* recovery screen by screen on */
89     DMError OnRecoveryScreenModeByPowerChange(sptr<ScreenSession>& mainScreen, sptr<ScreenSession>& extendScreen);
90 
91     /* recovery external main to inner main and external extend */
92     DMError HandleRecoveryInnerMainExternalExtendChange(sptr<ScreenSession>& mainScreen,
93         sptr<ScreenSession>& extendScreen);
94     /* recovery external main to inner main and external mirror */
95     DMError HandleRecoveryInnerMainExternalMirrorChange(sptr<ScreenSession>& mainScreen,
96         sptr<ScreenSession>& extendScreen);
97     /* recovery external main to inner extend and external main */
98     DMError HandleRecoveryInnerExtendExternalMainChange(sptr<ScreenSession>& mainScreen,
99         sptr<ScreenSession>& extendScreen);
100     /* recovery external main to inner mirror and external main */
101     DMError HandleRecoveryInnerMirrorExternalMainChange(sptr<ScreenSession>& mainScreen,
102         sptr<ScreenSession>& extendScreen);
103 
104     void NotifyClientCreateSessionOnly(sptr<IScreenSessionManagerClient> ssmClient,
105         sptr<ScreenSession> screenSession);
106     void CallRsSetScreenPowerStatusSyncToOn(ScreenId screenId);
107 
108     void CreateExternalScreenDisplayNodeOnly(sptr<ScreenSession>& innerScreen,
109         sptr<ScreenSession>& externalScreen, ScreenCombination combination);
110     void ScreenDisplayNodeRemove(sptr<ScreenSession>& screenScreen);
111     void ScreenToExtendChange(sptr<IScreenSessionManagerClient> ssmClient, sptr<ScreenSession> screenSession);
112 };
113 } // namespace OHOS::Rosen
114 #endif // OHOS_MULTI_SCREEN_POWER_CHANGE_MANAGER_H
115