1/*
2 * Copyright (c) 2022-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#ifndef OHOS_ABILITY_RUNTIME_SYSTEM_DIALOG_SCHEDULER_H
16#define OHOS_ABILITY_RUNTIME_SYSTEM_DIALOG_SCHEDULER_H
17
18#include <functional>
19
20#include "application_info.h"
21#include "bundle_mgr_interface.h"
22#include "singleton.h"
23
24namespace OHOS {
25namespace AAFwk {
26enum class DialogType {
27    DIALOG_ANR = 0,
28    DIALOG_TIPS,
29    DIALOG_SELECTOR,
30    DIALOG_JUMP_INTERCEPTOR,
31};
32enum class DialogAlign {
33    TOP = 0,
34    CENTER,
35    BOTTOM,
36    LEFT,
37    RIGHT,
38};
39struct DialogPosition {
40    int32_t offsetX = 0;
41    int32_t offsetY = 0;
42    int32_t width = 0;
43    int32_t height = 0;
44    int32_t window_width = 0;
45    int32_t window_height = 0;
46    int32_t window_offsetX = 0;
47    int32_t window_offsetY = 0;
48    int32_t width_narrow = 0;
49    int32_t height_narrow = 0;
50    bool wideScreen = true;
51    bool oversizeHeight = false;
52    DialogAlign align = DialogAlign::CENTER;
53};
54struct DialogAppInfo {
55    int32_t abilityIconId = 0;
56    int32_t abilityLabelId = 0;
57    int32_t bundleIconId = 0;
58    int32_t bundleLabelId = 0;
59    std::string bundleName = {};
60    std::string abilityName = {};
61    std::string moduleName = {};
62    bool visible = true;
63    int32_t appIndex = 0;
64    AppExecFwk::MultiAppModeData multiAppMode;
65};
66/**
67 * @class SystemDialogScheduler
68 * SystemDialogScheduler.
69 */
70class SystemDialogScheduler : public DelayedSingleton<SystemDialogScheduler> {
71public:
72
73    explicit SystemDialogScheduler() = default;
74    virtual ~SystemDialogScheduler() = default;
75
76    int GetSelectorDialogWantCommon(const std::vector<DialogAppInfo> &dialogAppInfos, Want &requestWant,
77        Want &targetWant, const sptr<IRemoteObject> &callerToken);
78    int GetPcSelectorDialogWant(const std::vector<DialogAppInfo> &dialogAppInfos, Want &requestWant, Want &targetWant,
79        const std::string &type, int32_t userId, const sptr<IRemoteObject> &callerToken);
80    int GetSelectorDialogWant(const std::vector<DialogAppInfo> &dialogAppInfos, Want &requestWant, Want &targetWant,
81        const sptr<IRemoteObject> &callerToken);
82    Want GetTipsDialogWant(const sptr<IRemoteObject> &callerToken);
83    Want GetJumpInterceptorDialogWant(Want &targetWant);
84    Want GetSwitchUserDialogWant();
85    bool GetAssertFaultDialogWant(Want &want);
86
87private:
88    const std::string GetSelectorParams(const std::vector<DialogAppInfo> &infos) const;
89    const std::string GetPcSelectorParams(const std::vector<DialogAppInfo> &infos,
90        const std::string &type, int32_t userId, const std::string &action) const;
91    const std::string GetDialogPositionParams(const DialogPosition position) const;
92
93    void InitDialogPosition(DialogType type, DialogPosition &position) const;
94    void GetDialogPositionAndSize(DialogType type, DialogPosition &position, int lineNums = 0) const;
95    void GetSelectorDialogPositionAndSize(
96        DialogPosition &portraitPosition, DialogPosition &landscapePosition, int lineNums) const;
97    void GetSelectorDialogLandscapePosition(
98        DialogPosition &position, int32_t height, int32_t width, int lineNums, float densityPixels) const;
99    void DialogLandscapePositionAdaptive(
100        DialogPosition &position, float densityPixels, int lineNums) const;
101    void GetSelectorDialogPortraitPosition(
102        DialogPosition &position, int32_t height, int32_t width, int lineNums, float densityPixels) const;
103    void DialogPortraitPositionAdaptive(
104        DialogPosition &position, float densityPixels, int lineNums) const;
105    void DialogPositionAdaptive(DialogPosition &position, int lineNums) const;
106};
107}  // namespace AAFwk
108}  // namespace OHOS
109#endif  // OHOS_ABILITY_RUNTIME_SYSTEM_DIALOG_SCHEDULER_H
110