1e0dac50fSopenharmony_ci/*
2e0dac50fSopenharmony_ci * Copyright (c) 2022 Huawei Device Co., Ltd.
3e0dac50fSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4e0dac50fSopenharmony_ci * you may not use this file except in compliance with the License.
5e0dac50fSopenharmony_ci * You may obtain a copy of the License at
6e0dac50fSopenharmony_ci *
7e0dac50fSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8e0dac50fSopenharmony_ci *
9e0dac50fSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10e0dac50fSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11e0dac50fSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12e0dac50fSopenharmony_ci * See the License for the specific language governing permissions and
13e0dac50fSopenharmony_ci * limitations under the License.
14e0dac50fSopenharmony_ci */
15e0dac50fSopenharmony_ci
16e0dac50fSopenharmony_ci#ifndef OHOS_ROSEN_WINDOW_PAIR_H
17e0dac50fSopenharmony_ci#define OHOS_ROSEN_WINDOW_PAIR_H
18e0dac50fSopenharmony_ci
19e0dac50fSopenharmony_ci#include <refbase.h>
20e0dac50fSopenharmony_ci#include "class_var_definition.h"
21e0dac50fSopenharmony_ci#include "window_node.h"
22e0dac50fSopenharmony_ci#include "window_layout_policy.h"
23e0dac50fSopenharmony_ci#include "wm_common_inner.h"
24e0dac50fSopenharmony_ci#include "wm_common.h"
25e0dac50fSopenharmony_ci
26e0dac50fSopenharmony_cinamespace OHOS {
27e0dac50fSopenharmony_cinamespace Rosen {
28e0dac50fSopenharmony_ci/**
29e0dac50fSopenharmony_ci * @brief Enumerates the status of window pair.
30e0dac50fSopenharmony_ci */
31e0dac50fSopenharmony_cienum class WindowPairStatus : uint32_t {
32e0dac50fSopenharmony_ci    EMPTY,
33e0dac50fSopenharmony_ci    SINGLE_PRIMARY,
34e0dac50fSopenharmony_ci    SINGLE_SECONDARY,
35e0dac50fSopenharmony_ci    SINGLE_SPLIT,
36e0dac50fSopenharmony_ci    PRIMARY_AND_SECONDARY,
37e0dac50fSopenharmony_ci    PRIMARY_AND_DIVIDER,
38e0dac50fSopenharmony_ci    SECONDARY_AND_DIVIDER,
39e0dac50fSopenharmony_ci    PAIRED_DONE
40e0dac50fSopenharmony_ci};
41e0dac50fSopenharmony_ci/**
42e0dac50fSopenharmony_ci * @brief Enumerates the message of split event.
43e0dac50fSopenharmony_ci */
44e0dac50fSopenharmony_cienum class SplitEventMsgType : uint32_t {
45e0dac50fSopenharmony_ci    MSG_SHOW_PRIMARY,
46e0dac50fSopenharmony_ci    MSG_SHOW_SECONDARY,
47e0dac50fSopenharmony_ci    MSG_SHOW_DIVIDER,
48e0dac50fSopenharmony_ci    MSG_DESTROY_DIVIDER,
49e0dac50fSopenharmony_ci};
50e0dac50fSopenharmony_ci
51e0dac50fSopenharmony_ciclass WindowPair : public RefBase {
52e0dac50fSopenharmony_cipublic:
53e0dac50fSopenharmony_ci    /**
54e0dac50fSopenharmony_ci     * @brief Constructor used to create an empty WindowPair instance.
55e0dac50fSopenharmony_ci     *
56e0dac50fSopenharmony_ci     * @param displayId the display of window pair
57e0dac50fSopenharmony_ci     */
58e0dac50fSopenharmony_ci    explicit WindowPair(const DisplayId& displayId) : displayId_(displayId) {};
59e0dac50fSopenharmony_ci
60e0dac50fSopenharmony_ci    /**
61e0dac50fSopenharmony_ci     * @brief Deconstructor used to deconstruct.
62e0dac50fSopenharmony_ci     *
63e0dac50fSopenharmony_ci     */
64e0dac50fSopenharmony_ci    ~WindowPair();
65e0dac50fSopenharmony_ci
66e0dac50fSopenharmony_ci    /**
67e0dac50fSopenharmony_ci     * @brief Clear window pair.
68e0dac50fSopenharmony_ci     *
69e0dac50fSopenharmony_ci     */
70e0dac50fSopenharmony_ci    void Clear();
71e0dac50fSopenharmony_ci
72e0dac50fSopenharmony_ci    /**
73e0dac50fSopenharmony_ci     * @brief Set split ratio.
74e0dac50fSopenharmony_ci     *
75e0dac50fSopenharmony_ci     * @param ratio split ratio
76e0dac50fSopenharmony_ci     */
77e0dac50fSopenharmony_ci    void SetSplitRatio(float ratio);
78e0dac50fSopenharmony_ci
79e0dac50fSopenharmony_ci    /**
80e0dac50fSopenharmony_ci     * @brief Get split ratio.
81e0dac50fSopenharmony_ci     *
82e0dac50fSopenharmony_ci     * @return split ratio
83e0dac50fSopenharmony_ci     */
84e0dac50fSopenharmony_ci    float GetSplitRatio() const;
85e0dac50fSopenharmony_ci
86e0dac50fSopenharmony_ci    /**
87e0dac50fSopenharmony_ci     * @brief Get whether the window pair is paired.
88e0dac50fSopenharmony_ci     *
89e0dac50fSopenharmony_ci     * @return the pair state of window pair
90e0dac50fSopenharmony_ci     */
91e0dac50fSopenharmony_ci    bool IsPaired() const;
92e0dac50fSopenharmony_ci
93e0dac50fSopenharmony_ci    /**
94e0dac50fSopenharmony_ci     * @brief Get whether the window status_ is valid.
95e0dac50fSopenharmony_ci     */
96e0dac50fSopenharmony_ci    bool IsAbnormalStatus() const;
97e0dac50fSopenharmony_ci
98e0dac50fSopenharmony_ci    /**
99e0dac50fSopenharmony_ci     * @brief Check pair status support recent update
100e0dac50fSopenharmony_ci     *
101e0dac50fSopenharmony_ci     * @param node trigger window node
102e0dac50fSopenharmony_ci     */
103e0dac50fSopenharmony_ci    bool StatusSupprtedWhenRecentUpdate(sptr<WindowNode>& node);
104e0dac50fSopenharmony_ci    /**
105e0dac50fSopenharmony_ci     * @brief Handle changes in the state of the window pair
106e0dac50fSopenharmony_ci     *
107e0dac50fSopenharmony_ci     * @param node trigger window node
108e0dac50fSopenharmony_ci     */
109e0dac50fSopenharmony_ci    void UpdateIfSplitRelated(sptr<WindowNode>& node);
110e0dac50fSopenharmony_ci
111e0dac50fSopenharmony_ci    /**
112e0dac50fSopenharmony_ci     * @brief Handle remove window from pair.
113e0dac50fSopenharmony_ci     *
114e0dac50fSopenharmony_ci     * @param node target node
115e0dac50fSopenharmony_ci     */
116e0dac50fSopenharmony_ci    void HandleRemoveWindow(sptr<WindowNode>& node);
117e0dac50fSopenharmony_ci
118e0dac50fSopenharmony_ci    /**
119e0dac50fSopenharmony_ci     * @brief Find window node from window pair.
120e0dac50fSopenharmony_ci     *
121e0dac50fSopenharmony_ci     * @param node target window node
122e0dac50fSopenharmony_ci     * @return window node
123e0dac50fSopenharmony_ci     */
124e0dac50fSopenharmony_ci    sptr<WindowNode> Find(sptr<WindowNode>& node);
125e0dac50fSopenharmony_ci
126e0dac50fSopenharmony_ci    /**
127e0dac50fSopenharmony_ci     * @brief Get divider window node.
128e0dac50fSopenharmony_ci     *
129e0dac50fSopenharmony_ci     * @return divider window node
130e0dac50fSopenharmony_ci     */
131e0dac50fSopenharmony_ci    sptr<WindowNode> GetDividerWindow() const;
132e0dac50fSopenharmony_ci
133e0dac50fSopenharmony_ci    /**
134e0dac50fSopenharmony_ci     * @brief Get pair status.
135e0dac50fSopenharmony_ci     *
136e0dac50fSopenharmony_ci     * @return the pair status of window pair
137e0dac50fSopenharmony_ci     */
138e0dac50fSopenharmony_ci    WindowPairStatus GetPairStatus() const;
139e0dac50fSopenharmony_ci
140e0dac50fSopenharmony_ci    /**
141e0dac50fSopenharmony_ci     * @brief Get all window node form pair in Z order.
142e0dac50fSopenharmony_ci     *
143e0dac50fSopenharmony_ci     * @return the list window form pair
144e0dac50fSopenharmony_ci     */
145e0dac50fSopenharmony_ci    std::vector<sptr<WindowNode>> GetOrderedPair(sptr<WindowNode>& node);
146e0dac50fSopenharmony_ci
147e0dac50fSopenharmony_ci    /**
148e0dac50fSopenharmony_ci     * @brief Get all window node form pair.
149e0dac50fSopenharmony_ci     *
150e0dac50fSopenharmony_ci     * @return the list window form pair
151e0dac50fSopenharmony_ci     */
152e0dac50fSopenharmony_ci    std::vector<sptr<WindowNode>> GetPairedWindows();
153e0dac50fSopenharmony_ci
154e0dac50fSopenharmony_ci    /**
155e0dac50fSopenharmony_ci     * @brief Get whether dock slice is forbidden to move.
156e0dac50fSopenharmony_ci     *
157e0dac50fSopenharmony_ci     * @return whether dock slice is forbidden to move
158e0dac50fSopenharmony_ci     */
159e0dac50fSopenharmony_ci    bool IsForbidDockSliceMove() const;
160e0dac50fSopenharmony_ci
161e0dac50fSopenharmony_ci    /**
162e0dac50fSopenharmony_ci     * @brief Exit split screen mode when dock slice in exit split screen mode area.
163e0dac50fSopenharmony_ci     */
164e0dac50fSopenharmony_ci    void ExitSplitMode();
165e0dac50fSopenharmony_ci
166e0dac50fSopenharmony_ci    /**
167e0dac50fSopenharmony_ci     * @brief whether dock slice in exit split screen mode area
168e0dac50fSopenharmony_ci     */
169e0dac50fSopenharmony_ci    bool IsDockSliceInExitSplitModeArea(const std::vector<int32_t>& exitSplitPoints);
170e0dac50fSopenharmony_ci
171e0dac50fSopenharmony_ci    /**
172e0dac50fSopenharmony_ci     * @brief Set the initial rect of divider window.
173e0dac50fSopenharmony_ci     *
174e0dac50fSopenharmony_ci     * @param rect divider window rect
175e0dac50fSopenharmony_ci     */
176e0dac50fSopenharmony_ci    void SetDividerRect(const Rect& rect);
177e0dac50fSopenharmony_ci
178e0dac50fSopenharmony_ci    /**
179e0dac50fSopenharmony_ci     * @brief Update divider window rect when display orientation changed.
180e0dac50fSopenharmony_ci     *
181e0dac50fSopenharmony_ci     * @param rect default divider rect
182e0dac50fSopenharmony_ci     */
183e0dac50fSopenharmony_ci    void RotateDividerWindow(const Rect& rect);
184e0dac50fSopenharmony_ci
185e0dac50fSopenharmony_ci    /**
186e0dac50fSopenharmony_ci     * @brief Take window pair node snapshot.
187e0dac50fSopenharmony_ci     */
188e0dac50fSopenharmony_ci    bool TakePairSnapshot();
189e0dac50fSopenharmony_ci
190e0dac50fSopenharmony_ci    /**
191e0dac50fSopenharmony_ci     * @brief Clear window pair node snapshot.
192e0dac50fSopenharmony_ci     */
193e0dac50fSopenharmony_ci    void ClearPairSnapshot();
194e0dac50fSopenharmony_ci
195e0dac50fSopenharmony_ci    /**
196e0dac50fSopenharmony_ci     * @brief Set split ratio config.
197e0dac50fSopenharmony_ci     */
198e0dac50fSopenharmony_ci    void SetSplitRatioConfig(const SplitRatioConfig& splitRatioConfig);
199e0dac50fSopenharmony_ci
200e0dac50fSopenharmony_ci    /**
201e0dac50fSopenharmony_ci     * @brief Calculate split ratio points.
202e0dac50fSopenharmony_ci     */
203e0dac50fSopenharmony_ci    void CalculateSplitRatioPoints(const Rect& displayRect);
204e0dac50fSopenharmony_ci
205e0dac50fSopenharmony_ci    /**
206e0dac50fSopenharmony_ci     * @brief Get exit split points.
207e0dac50fSopenharmony_ci     */
208e0dac50fSopenharmony_ci    std::vector<int32_t> GetExitSplitPoints();
209e0dac50fSopenharmony_ci
210e0dac50fSopenharmony_ci    /**
211e0dac50fSopenharmony_ci     * @brief Get split ratio points.
212e0dac50fSopenharmony_ci     */
213e0dac50fSopenharmony_ci    std::vector<int32_t> GetSplitRatioPoints();
214e0dac50fSopenharmony_ci
215e0dac50fSopenharmony_ci    /**
216e0dac50fSopenharmony_ci     * @brief is during split.
217e0dac50fSopenharmony_ci     * @return true means existing recent or status is not PARI_DONE.
218e0dac50fSopenharmony_ci     */
219e0dac50fSopenharmony_ci    bool IsDuringSplit();
220e0dac50fSopenharmony_ci
221e0dac50fSopenharmony_ciprivate:
222e0dac50fSopenharmony_ci    /**
223e0dac50fSopenharmony_ci     * @brief Gets whether the window is related to split window.
224e0dac50fSopenharmony_ci     *
225e0dac50fSopenharmony_ci     * @param node target node
226e0dac50fSopenharmony_ci     * @return Whether target node is related to the split window
227e0dac50fSopenharmony_ci     */
228e0dac50fSopenharmony_ci    bool IsSplitRelated(sptr<WindowNode>& node) const;
229e0dac50fSopenharmony_ci
230e0dac50fSopenharmony_ci    /**
231e0dac50fSopenharmony_ci     * @brief Check Z order for window node form pair.
232e0dac50fSopenharmony_ci     *
233e0dac50fSopenharmony_ci     * @return the Z order of window form pair
234e0dac50fSopenharmony_ci     */
235e0dac50fSopenharmony_ci    void CheckOrderedPairZorder(
236e0dac50fSopenharmony_ci        sptr<WindowNode>& node, bool& hasPrimaryDialog, bool& hasSecondaryDialog, bool& isPrimaryAbove);
237e0dac50fSopenharmony_ci
238e0dac50fSopenharmony_ci    /**
239e0dac50fSopenharmony_ci     * @brief Create all window node form pair.
240e0dac50fSopenharmony_ci     *
241e0dac50fSopenharmony_ci     * @return the list window form pair
242e0dac50fSopenharmony_ci     */
243e0dac50fSopenharmony_ci    std::vector<sptr<WindowNode>> CreateOrderedPair(
244e0dac50fSopenharmony_ci        sptr<WindowNode>& bottom, sptr<WindowNode>& mid, sptr<WindowNode>& top);
245e0dac50fSopenharmony_ci
246e0dac50fSopenharmony_ci    /**
247e0dac50fSopenharmony_ci     * @brief Replace paired window.
248e0dac50fSopenharmony_ci     *
249e0dac50fSopenharmony_ci     * @param node current node
250e0dac50fSopenharmony_ci     */
251e0dac50fSopenharmony_ci    void Insert(sptr<WindowNode>& node);
252e0dac50fSopenharmony_ci
253e0dac50fSopenharmony_ci    /**
254e0dac50fSopenharmony_ci     * @brief Update paired window node
255e0dac50fSopenharmony_ci     *
256e0dac50fSopenharmony_ci     */
257e0dac50fSopenharmony_ci    void HandlePairedNodesChange();
258e0dac50fSopenharmony_ci
259e0dac50fSopenharmony_ci    /**
260e0dac50fSopenharmony_ci     * @brief Update pair status
261e0dac50fSopenharmony_ci     *
262e0dac50fSopenharmony_ci     */
263e0dac50fSopenharmony_ci    void UpdateWindowPairStatus();
264e0dac50fSopenharmony_ci
265e0dac50fSopenharmony_ci    /**
266e0dac50fSopenharmony_ci     * @brief Switch the position of two paired window.
267e0dac50fSopenharmony_ci     *
268e0dac50fSopenharmony_ci     */
269e0dac50fSopenharmony_ci    void SwitchPosition();
270e0dac50fSopenharmony_ci
271e0dac50fSopenharmony_ci    /**
272e0dac50fSopenharmony_ci     * @brief Dump the info of pair.
273e0dac50fSopenharmony_ci     *
274e0dac50fSopenharmony_ci     */
275e0dac50fSopenharmony_ci    void DumpPairInfo();
276e0dac50fSopenharmony_ci
277e0dac50fSopenharmony_ci    /**
278e0dac50fSopenharmony_ci     * @brief Send split screen event.
279e0dac50fSopenharmony_ci     *
280e0dac50fSopenharmony_ci     * @param msgType split event message type
281e0dac50fSopenharmony_ci     * @param missionId mission id
282e0dac50fSopenharmony_ci     */
283e0dac50fSopenharmony_ci    void SendSplitScreenCommonEvent(SplitEventMsgType msgType, int32_t missionId);
284e0dac50fSopenharmony_ci
285e0dac50fSopenharmony_ci    /**
286e0dac50fSopenharmony_ci     * @brief Send split screen event to notify create recent view.
287e0dac50fSopenharmony_ci     *
288e0dac50fSopenharmony_ci     * @param node split node
289e0dac50fSopenharmony_ci     */
290e0dac50fSopenharmony_ci    void NotifyShowRecent(sptr<WindowNode> node);
291e0dac50fSopenharmony_ci
292e0dac50fSopenharmony_ci    /**
293e0dac50fSopenharmony_ci     * @brief Send split screen event to notify create or destroy divider window.
294e0dac50fSopenharmony_ci     *
295e0dac50fSopenharmony_ci     * @param node split node
296e0dac50fSopenharmony_ci     * @param isDestroy destroy or create divider window flag
297e0dac50fSopenharmony_ci     */
298e0dac50fSopenharmony_ci    void NotifyCreateOrDestroyDivider(sptr<WindowNode> node, bool isDestroy);
299e0dac50fSopenharmony_ci
300e0dac50fSopenharmony_ci    /**
301e0dac50fSopenharmony_ci     * @brief Calculate and Get split ratio point
302e0dac50fSopenharmony_ci     */
303e0dac50fSopenharmony_ci    int32_t GetSplitRatioPoint(float ratio, const Rect& displayRect);
304e0dac50fSopenharmony_ci
305e0dac50fSopenharmony_ciprivate:
306e0dac50fSopenharmony_ci    float ratio_ = DEFAULT_SPLIT_RATIO;
307e0dac50fSopenharmony_ci    DisplayId displayId_;
308e0dac50fSopenharmony_ci    sptr<WindowNode> primary_;
309e0dac50fSopenharmony_ci    sptr<WindowNode> secondary_;
310e0dac50fSopenharmony_ci    sptr<WindowNode> divider_;
311e0dac50fSopenharmony_ci    WindowPairStatus status_ = {WindowPairStatus::EMPTY};
312e0dac50fSopenharmony_ci    Rect dividerRect_ {0, 0, 0, 0};
313e0dac50fSopenharmony_ci    std::vector<int32_t> exitSplitPoints_; // 2 element, first element < second element
314e0dac50fSopenharmony_ci    std::vector<int32_t> splitRatioPoints_;
315e0dac50fSopenharmony_ci    SplitRatioConfig splitRatioConfig_;
316e0dac50fSopenharmony_ci    DEFINE_VAR_DEFAULT_FUNC_SET(bool, AllSplitAppWindowsRestoring, isAllSplitAppWindowsRestoring, false)
317e0dac50fSopenharmony_ci};
318e0dac50fSopenharmony_ci} // namespace Rosen
319e0dac50fSopenharmony_ci} // namespace OHOS
320e0dac50fSopenharmony_ci#endif // OHOS_ROSEN_WINDOW_PAIR_H