17c804472Sopenharmony_ci/*
27c804472Sopenharmony_ci * Copyright (c) 2023 Huawei Device Co., Ltd.
37c804472Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
47c804472Sopenharmony_ci * you may not use this file except in compliance with the License.
57c804472Sopenharmony_ci * You may obtain a copy of the License at
67c804472Sopenharmony_ci *
77c804472Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
87c804472Sopenharmony_ci *
97c804472Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
107c804472Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
117c804472Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
127c804472Sopenharmony_ci * See the License for the specific language governing permissions and
137c804472Sopenharmony_ci * limitations under the License.
147c804472Sopenharmony_ci */
157c804472Sopenharmony_ci
167c804472Sopenharmony_ci#ifndef JSAPPIMPL_H
177c804472Sopenharmony_ci#define JSAPPIMPL_H
187c804472Sopenharmony_ci
197c804472Sopenharmony_ci#include <atomic>
207c804472Sopenharmony_ci#include <memory>
217c804472Sopenharmony_ci#include <thread>
227c804472Sopenharmony_ci
237c804472Sopenharmony_ci#include "JsApp.h"
247c804472Sopenharmony_ci#include "ace_ability.h"
257c804472Sopenharmony_ci#include "ace_run_args.h"
267c804472Sopenharmony_ci#include "device_config.h"
277c804472Sopenharmony_ci#include "device_type.h"
287c804472Sopenharmony_ci#include "window_animation_config.h"
297c804472Sopenharmony_ci
307c804472Sopenharmony_cinamespace OHOS {
317c804472Sopenharmony_cinamespace Previewer {
327c804472Sopenharmony_ci    struct PreviewerWindowModel;
337c804472Sopenharmony_ci    class PreviewerDisplay;
347c804472Sopenharmony_ci}
357c804472Sopenharmony_cinamespace Rosen {
367c804472Sopenharmony_ci    class GlfwRenderContext;
377c804472Sopenharmony_ci    enum class FoldStatus: uint32_t;
387c804472Sopenharmony_ci    enum class WindowType : uint32_t;
397c804472Sopenharmony_ci    struct SystemBarProperty;
407c804472Sopenharmony_ci    struct Rect;
417c804472Sopenharmony_ci}
427c804472Sopenharmony_ci#if defined(__APPLE__) || defined(_WIN32)
437c804472Sopenharmony_cinamespace AbilityRuntime {
447c804472Sopenharmony_ci    class Simulator;
457c804472Sopenharmony_ci    struct Options;
467c804472Sopenharmony_ci}
477c804472Sopenharmony_cinamespace AppExecFwk {
487c804472Sopenharmony_ci    class Configuration;
497c804472Sopenharmony_ci}
507c804472Sopenharmony_ci#endif
517c804472Sopenharmony_ci}
527c804472Sopenharmony_ci
537c804472Sopenharmony_ciclass JsAppImpl : public JsApp {
547c804472Sopenharmony_cipublic:
557c804472Sopenharmony_ci    JsAppImpl() noexcept;
567c804472Sopenharmony_ci    ~JsAppImpl();
577c804472Sopenharmony_ci    JsAppImpl& operator=(const JsAppImpl&) = delete;
587c804472Sopenharmony_ci    JsAppImpl(const JsAppImpl&) = delete;
597c804472Sopenharmony_ci
607c804472Sopenharmony_ci    static JsAppImpl& GetInstance();
617c804472Sopenharmony_ci    void Start() override;
627c804472Sopenharmony_ci    void Restart() override;
637c804472Sopenharmony_ci    void Interrupt() override;
647c804472Sopenharmony_ci    std::string GetJSONTree() override;
657c804472Sopenharmony_ci    std::string GetDefaultJSONTree() override;
667c804472Sopenharmony_ci    void OrientationChanged(std::string commandOrientation) override;
677c804472Sopenharmony_ci    void ResolutionChanged(ResolutionParam& param, int32_t screenDensity, std::string reason) override;
687c804472Sopenharmony_ci    OHOS::Ace::WindowSizeChangeReason ConvertResizeReason(std::string reason);
697c804472Sopenharmony_ci    void SetResolutionParams(int32_t changedOriginWidth, int32_t changedOriginHeight,
707c804472Sopenharmony_ci                           int32_t changedWidth, int32_t changedHeight, int32_t screenDensity);
717c804472Sopenharmony_ci    void SetArgsColorMode(const std::string& value) override;
727c804472Sopenharmony_ci    void SetArgsAceVersion(const std::string& value) override;
737c804472Sopenharmony_ci    void SetDeviceOrentation(const std::string& value);
747c804472Sopenharmony_ci    std::string GetOrientation() const override;
757c804472Sopenharmony_ci    std::string GetColorMode() const override;
767c804472Sopenharmony_ci    void ColorModeChanged(const std::string commandColorMode) override;
777c804472Sopenharmony_ci    void ReloadRuntimePage(const std::string currentPage) override;
787c804472Sopenharmony_ci    void SetScreenDensity(const std::string value) override;
797c804472Sopenharmony_ci    void SetConfigChanges(const std::string value) override;
807c804472Sopenharmony_ci    bool MemoryRefresh(const std::string memoryRefreshArgs) const override;
817c804472Sopenharmony_ci    void LoadDocument(const std::string, const std::string, const Json2::Value&) override;
827c804472Sopenharmony_ci    void FoldStatusChanged(const std::string commandFoldStatus,
837c804472Sopenharmony_ci        int32_t currentWidth, int32_t currentHeight) override;
847c804472Sopenharmony_ci    void SetAvoidArea(const AvoidAreas& areas) override;
857c804472Sopenharmony_ci    void UpdateAvoidArea2Ide(const std::string& key, const OHOS::Rosen::Rect& value);
867c804472Sopenharmony_ci    OHOS::Rosen::Window* GetWindow() const;
877c804472Sopenharmony_ci
887c804472Sopenharmony_ci    void DispatchBackPressedEvent() const;
897c804472Sopenharmony_ci    void DispatchKeyEvent(const std::shared_ptr<OHOS::MMI::KeyEvent>& keyEvent) const;
907c804472Sopenharmony_ci    void DispatchPointerEvent(const std::shared_ptr<OHOS::MMI::PointerEvent>& pointerEvent) const;
917c804472Sopenharmony_ci    void DispatchAxisEvent(const std::shared_ptr<OHOS::MMI::AxisEvent>& axisEvent) const;
927c804472Sopenharmony_ci    void DispatchInputMethodEvent(const unsigned int codePoint) const;
937c804472Sopenharmony_ci#ifdef COMPONENT_TEST_ENABLED
947c804472Sopenharmony_ci    void SetComponentTestModeConfig(const std::string value);
957c804472Sopenharmony_ci#endif // COMPONENT_TEST_ENABLED
967c804472Sopenharmony_ci    void InitGlfwEnv();
977c804472Sopenharmony_ci    void CalculateAvoidAreaByType(OHOS::Rosen::WindowType type,
987c804472Sopenharmony_ci        const OHOS::Rosen::SystemBarProperty& property);
997c804472Sopenharmony_ci    void InitAvoidAreas(OHOS::Rosen::Window* window);
1007c804472Sopenharmony_ci    void InitJsApp() override;
1017c804472Sopenharmony_ci    void StopAbility();
1027c804472Sopenharmony_ci    void InitCommandInfo();
1037c804472Sopenharmony_ci    void InitScreenInfo();
1047c804472Sopenharmony_ci
1057c804472Sopenharmony_ciprotected:
1067c804472Sopenharmony_ci    void SetJsAppArgs(OHOS::Ace::Platform::AceRunArgs& args);
1077c804472Sopenharmony_ci    void RunJsApp();
1087c804472Sopenharmony_ci    void RunNormalAbility();
1097c804472Sopenharmony_ci    void RunDebugAbility();
1107c804472Sopenharmony_ci    double watchScreenDensity = 320;  // Watch Screen Density
1117c804472Sopenharmony_ci    double phoneScreenDensity = 480;  // Phone Screen Density
1127c804472Sopenharmony_ci    double tvScreenDensity = 320;     // TV Screen Density
1137c804472Sopenharmony_ci    double tabletScreenDensity = 400; // Tablet Screen Density
1147c804472Sopenharmony_ci    double carScreenDensity = 320;    // Car Screen Density
1157c804472Sopenharmony_ci    double twoInOneScreenDensity = 240;    // Car Screen Density
1167c804472Sopenharmony_ci
1177c804472Sopenharmony_ciprivate:
1187c804472Sopenharmony_ci    void SetPkgContextInfo();
1197c804472Sopenharmony_ci    void SetMockJsonInfo();
1207c804472Sopenharmony_ci    void SetAssetPath(OHOS::Ace::Platform::AceRunArgs& args, const std::string) const;
1217c804472Sopenharmony_ci    void SetProjectModel(OHOS::Ace::Platform::AceRunArgs& args) const;
1227c804472Sopenharmony_ci    void SetPageProfile(OHOS::Ace::Platform::AceRunArgs& args, const std::string) const;
1237c804472Sopenharmony_ci    void SetDeviceWidth(OHOS::Ace::Platform::AceRunArgs& args, const int32_t) const;
1247c804472Sopenharmony_ci    void SetDeviceHeight(OHOS::Ace::Platform::AceRunArgs& args, const int32_t) const;
1257c804472Sopenharmony_ci    void SetWindowTitle(OHOS::Ace::Platform::AceRunArgs& args, const std::string) const;
1267c804472Sopenharmony_ci    void SetUrl(OHOS::Ace::Platform::AceRunArgs& args, const std::string) const;
1277c804472Sopenharmony_ci    void SetConfigChanges(OHOS::Ace::Platform::AceRunArgs& args, const std::string) const;
1287c804472Sopenharmony_ci#ifdef COMPONENT_TEST_ENABLED
1297c804472Sopenharmony_ci    void SetComponentTestConfig(OHOS::Ace::Platform::AceRunArgs& args, const std::string) const;
1307c804472Sopenharmony_ci#endif // COMPONENT_TEST_ENABLED
1317c804472Sopenharmony_ci    void SetColorMode(OHOS::Ace::Platform::AceRunArgs& args, const std::string) const;
1327c804472Sopenharmony_ci    void SetOrientation(OHOS::Ace::Platform::AceRunArgs& args, const std::string) const;
1337c804472Sopenharmony_ci    void SetAceVersionArgs(OHOS::Ace::Platform::AceRunArgs& args, const std::string) const;
1347c804472Sopenharmony_ci    void SetLanguage(OHOS::Ace::Platform::AceRunArgs& args, const std::string) const;
1357c804472Sopenharmony_ci    void SetRegion(OHOS::Ace::Platform::AceRunArgs& args, const std::string) const;
1367c804472Sopenharmony_ci    void SetScript(OHOS::Ace::Platform::AceRunArgs& args, const std::string) const;
1377c804472Sopenharmony_ci    void SetSystemResourcesPath(OHOS::Ace::Platform::AceRunArgs& args) const;
1387c804472Sopenharmony_ci    void SetAppResourcesPath(OHOS::Ace::Platform::AceRunArgs& args, const std::string) const;
1397c804472Sopenharmony_ci    void SetFormsEnabled(OHOS::Ace::Platform::AceRunArgs& args, bool formsEnabled) const;
1407c804472Sopenharmony_ci    void SetContainerSdkPath(OHOS::Ace::Platform::AceRunArgs& args, const std::string) const;
1417c804472Sopenharmony_ci    void SetOnRouterChange(OHOS::Ace::Platform::AceRunArgs& args) const;
1427c804472Sopenharmony_ci    void SetOnError(OHOS::Ace::Platform::AceRunArgs& args) const;
1437c804472Sopenharmony_ci    void SetComponentModeEnabled(OHOS::Ace::Platform::AceRunArgs& args, bool isComponentMode) const;
1447c804472Sopenharmony_ci    void AssignValueForWidthAndHeight(const int32_t origWidth, const int32_t origHeight,
1457c804472Sopenharmony_ci                                      const int32_t compWidth, const int32_t compHeight);
1467c804472Sopenharmony_ci    void AdaptDeviceType(OHOS::Ace::Platform::AceRunArgs& args, const std::string,
1477c804472Sopenharmony_ci                         const int32_t, double screenDendity = 0) const;
1487c804472Sopenharmony_ci    void ParseSystemParams(OHOS::Ace::Platform::AceRunArgs& args, const Json2::Value& paramObj);
1497c804472Sopenharmony_ci    void SetSystemParams(OHOS::Ace::Platform::SystemParams& args, const Json2::Value& paramObj);
1507c804472Sopenharmony_ci    void SetDeviceScreenDensity(const int32_t screenDensity, const std::string type);
1517c804472Sopenharmony_ci    std::string GetDeviceTypeName(const OHOS::Ace::DeviceType) const;
1527c804472Sopenharmony_ci    OHOS::Rosen::FoldStatus ConvertFoldStatus(std::string value) const;
1537c804472Sopenharmony_ci    const double BASE_SCREEN_DENSITY = 160; // Device Baseline Screen Density
1547c804472Sopenharmony_ci    std::unique_ptr<OHOS::Ace::Platform::AceAbility> ability;
1557c804472Sopenharmony_ci    std::atomic<bool> isStop;
1567c804472Sopenharmony_ci    int32_t width = 0;
1577c804472Sopenharmony_ci    int32_t height = 0;
1587c804472Sopenharmony_ci    int32_t orignalWidth = 0;
1597c804472Sopenharmony_ci    int32_t orignalHeight = 0;
1607c804472Sopenharmony_ci    AvoidAreas avoidInitialAreas;
1617c804472Sopenharmony_ci    OHOS::Ace::Platform::AceRunArgs aceRunArgs;
1627c804472Sopenharmony_ci    std::shared_ptr<OHOS::Rosen::GlfwRenderContext> glfwRenderContext;
1637c804472Sopenharmony_ci#ifdef COMPONENT_TEST_ENABLED
1647c804472Sopenharmony_ci    std::string componentTestModeConfig;
1657c804472Sopenharmony_ci#endif // COMPONENT_TEST_ENABLED
1667c804472Sopenharmony_ci#if defined(__APPLE__) || defined(_WIN32)
1677c804472Sopenharmony_ci    std::shared_ptr<OHOS::AbilityRuntime::Simulator> simulator;
1687c804472Sopenharmony_ci    int64_t debugAbilityId = -1;
1697c804472Sopenharmony_ci    void SetSimulatorParams(OHOS::AbilityRuntime::Options& options);
1707c804472Sopenharmony_ci    void SetSimulatorCommonParams(OHOS::AbilityRuntime::Options& options);
1717c804472Sopenharmony_ci    std::shared_ptr<OHOS::AppExecFwk::Configuration> UpdateConfiguration(OHOS::Ace::Platform::AceRunArgs& args);
1727c804472Sopenharmony_ci
1737c804472Sopenharmony_ci    std::shared_ptr<OHOS::Previewer::PreviewerWindowModel> windowModel;
1747c804472Sopenharmony_ci    void SetWindowParams() const;
1757c804472Sopenharmony_ci    template<typename T>
1767c804472Sopenharmony_ci    T SetDevice(const OHOS::Ace::DeviceType& deviceType) const
1777c804472Sopenharmony_ci    {
1787c804472Sopenharmony_ci        static_assert(std::is_enum_v<T>, "T must be an enum type");
1797c804472Sopenharmony_ci        switch (deviceType) {
1807c804472Sopenharmony_ci            case OHOS::Ace::DeviceType::WATCH:
1817c804472Sopenharmony_ci                return T::WATCH;
1827c804472Sopenharmony_ci            case OHOS::Ace::DeviceType::TV:
1837c804472Sopenharmony_ci                return T::TV;
1847c804472Sopenharmony_ci            case OHOS::Ace::DeviceType::CAR:
1857c804472Sopenharmony_ci                return T::CAR;
1867c804472Sopenharmony_ci            case OHOS::Ace::DeviceType::TABLET:
1877c804472Sopenharmony_ci                return T::TABLET;
1887c804472Sopenharmony_ci            case OHOS::Ace::DeviceType::PHONE:
1897c804472Sopenharmony_ci                return T::PHONE;
1907c804472Sopenharmony_ci            default:
1917c804472Sopenharmony_ci                return T::UNKNOWN;
1927c804472Sopenharmony_ci        }
1937c804472Sopenharmony_ci    }
1947c804472Sopenharmony_ci    template<typename T>
1957c804472Sopenharmony_ci    T SetColorMode(const OHOS::Ace::ColorMode& colorMode) const
1967c804472Sopenharmony_ci    {
1977c804472Sopenharmony_ci        static_assert(std::is_enum_v<T>, "T must be an enum type");
1987c804472Sopenharmony_ci        if (colorMode == OHOS::Ace::ColorMode::LIGHT) {
1997c804472Sopenharmony_ci            return T::LIGHT;
2007c804472Sopenharmony_ci        } else if (colorMode == OHOS::Ace::ColorMode::DARK) {
2017c804472Sopenharmony_ci            return T::DARK;
2027c804472Sopenharmony_ci        } else {
2037c804472Sopenharmony_ci            return T::COLOR_MODE_UNDEFINED;
2047c804472Sopenharmony_ci        }
2057c804472Sopenharmony_ci    }
2067c804472Sopenharmony_ci    template<typename T>
2077c804472Sopenharmony_ci    T SetOrientation(const OHOS::Ace::DeviceOrientation& orientation) const
2087c804472Sopenharmony_ci    {
2097c804472Sopenharmony_ci        static_assert(std::is_enum_v<T>, "T must be an enum type");
2107c804472Sopenharmony_ci        if (orientation == OHOS::Ace::DeviceOrientation::PORTRAIT) {
2117c804472Sopenharmony_ci            return T::PORTRAIT;
2127c804472Sopenharmony_ci        } else if (orientation == OHOS::Ace::DeviceOrientation::LANDSCAPE) {
2137c804472Sopenharmony_ci            return T::LANDSCAPE;
2147c804472Sopenharmony_ci        } else {
2157c804472Sopenharmony_ci            return T::ORIENTATION_UNDEFINED;
2167c804472Sopenharmony_ci        }
2177c804472Sopenharmony_ci    }
2187c804472Sopenharmony_ci#endif
2197c804472Sopenharmony_ci};
2207c804472Sopenharmony_ci
2217c804472Sopenharmony_ci#endif // JSAPPIMPL_H
222