1 /* 2 * Copyright (c) 2021-2022 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 FOUNDATION_DMSERVER_ABSTRACT_DISPLAY_CONTROLLER_H 17 #define FOUNDATION_DMSERVER_ABSTRACT_DISPLAY_CONTROLLER_H 18 19 #include "abstract_screen_controller.h" 20 21 #include <map> 22 #include <pixel_map.h> 23 #include <surface.h> 24 #include <transaction/rs_interfaces.h> 25 26 #include "screen.h" 27 #include "abstract_display.h" 28 #include "display_change_listener.h" 29 #include "future.h" 30 31 namespace OHOS::Rosen { 32 class AbstractDisplayController : public RefBase { 33 using DisplayStateChangeListener = std::function<void(DisplayId, sptr<DisplayInfo>, 34 const std::map<DisplayId, sptr<DisplayInfo>>&, DisplayStateChangeType)>; 35 public: 36 AbstractDisplayController(std::recursive_mutex& mutex, DisplayStateChangeListener); 37 ~AbstractDisplayController(); 38 WM_DISALLOW_COPY_AND_MOVE(AbstractDisplayController); 39 40 void Init(sptr<AbstractScreenController> abstractScreenController); 41 ScreenId GetDefaultScreenId(); 42 RSScreenModeInfo GetScreenActiveMode(ScreenId id); 43 44 std::shared_ptr<Media::PixelMap> GetScreenSnapshot(DisplayId displayId); 45 sptr<AbstractDisplay> GetAbstractDisplay(DisplayId displayId) const; 46 sptr<AbstractDisplay> GetAbstractDisplayByScreen(ScreenId screenId) const; 47 std::vector<DisplayId> GetAllDisplayIds() const; 48 void SetFreeze(std::vector<DisplayId> displayIds, bool isFreeze); 49 50 private: 51 void OnAbstractScreenConnect(sptr<AbstractScreen> absScreen); 52 void OnAbstractScreenDisconnect(sptr<AbstractScreen> absScreen); 53 void OnAbstractScreenChange(sptr<AbstractScreen> absScreen, DisplayChangeEvent event); 54 void ProcessDisplayUpdateOrientation(sptr<AbstractScreen> absScreen, DisplayStateChangeType type); 55 void ProcessDisplaySizeChange(sptr<AbstractScreen> absScreen); 56 void ProcessVirtualPixelRatioChange(sptr<AbstractScreen> absScreen); 57 void ProcessDisplayRotationChange(sptr<AbstractScreen> absScreen, DisplayStateChangeType type); 58 void ProcessDisplayCompression(sptr<AbstractScreen> absScreen); 59 sptr<AbstractDisplay> GetAbstractDisplayByAbsScreen(sptr<AbstractScreen> absScreen); 60 void BindAloneScreenLocked(sptr<AbstractScreen> absScreen); 61 void AddScreenToMirrorLocked(sptr<AbstractScreen> absScreen); 62 void AddScreenToExpandLocked(sptr<AbstractScreen> absScreen); 63 std::map<DisplayId, sptr<DisplayInfo>> GetAllDisplayInfoOfGroup(sptr<DisplayInfo> info); 64 DisplayId ProcessNormalScreenDisconnected( 65 sptr<AbstractScreen> absScreen, sptr<AbstractScreenGroup> screenGroup, sptr<AbstractDisplay>& absDisplay); 66 DisplayId ProcessExpandScreenDisconnected( 67 sptr<AbstractScreen> absScreen, sptr<AbstractScreenGroup> screenGroup, sptr<AbstractDisplay>& absDisplay); 68 bool UpdateDisplaySize(sptr<AbstractDisplay> absDisplay, sptr<SupportedScreenModes> info); 69 void SetDisplayStateChangeListener(sptr<AbstractDisplay> abstractDisplay, DisplayStateChangeType type); 70 DisplayId GetDefaultDisplayId(); 71 72 std::recursive_mutex& mutex_; 73 std::atomic<DisplayId> displayCount_ { 0 }; 74 sptr<AbstractDisplay> dummyDisplay_; 75 std::map<DisplayId, sptr<AbstractDisplay>> abstractDisplayMap_; 76 sptr<AbstractScreenController> abstractScreenController_; 77 sptr<AbstractScreenController::AbstractScreenCallback> abstractScreenCallback_; 78 OHOS::Rosen::RSInterfaces& rsInterface_; 79 DisplayStateChangeListener displayStateChangeListener_; 80 }; 81 } // namespace OHOS::Rosen 82 #endif // FOUNDATION_DMSERVER_ABSTRACT_DISPLAY_CONTROLLER_H