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