1/*
2 * Copyright (c) 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#include "updater_ui_env.h"
16#include <chrono>
17#include <fstream>
18#include <map>
19#include <thread>
20#include <unistd.h>
21#include "callback_manager.h"
22#include "common/graphic_startup.h"
23#include "common/screen.h"
24#include "components/root_view.h"
25#include "graphic_engine.h"
26#include "input_event.h"
27#include "language/language_ui.h"
28#include "log/log.h"
29#include "page/page_manager.h"
30#include "updater_ui_config.h"
31
32namespace Updater {
33namespace {
34constexpr std::array BRIGHTNESS_FILES {
35    std::pair { "/sys/class/leds/lcd_backlight0/brightness", "/sys/class/leds/lcd_backlight0/max_brightness" },
36    std::pair { "/sys/class/leds/lcd-backlight/brightness", "/sys/class/leds/lcd-backlight/max_brightness" }
37};
38
39constexpr uint32_t WHITE_BGCOLOR = 0x000000ff;
40}
41
42__attribute__((weak)) void InitDisplayDriverExt(void)
43{
44    LOG(INFO) << "InitDisplayDriver extension function";
45}
46
47void UpdaterUiEnv::Init()
48{
49    [[maybe_unused]] static bool initOnce = [] () {
50        InitDisplayDriver(); // init display driver
51        InitEngine(); // Graphic UI init
52        InitConfig(); // page manager init
53        InitEvts(); // init input driver and input events callback
54        InitInputDriver(); // init input driver and input events callback
55        return true;
56    } ();
57}
58
59void UpdaterUiEnv::InitEngine()
60{
61    OHOS::GraphicStartUp::Init();
62    GraphicEngine::GetInstance().Init(WHITE_BGCOLOR, OHOS::ColorMode::ARGB8888, VECTOR_FONT_DIR);
63    InitRootView();
64    LOG(INFO) << "UxInitEngine done";
65}
66
67void UpdaterUiEnv::InitConfig()
68{
69    // load pages, language resource, ui strategy
70    if (!UpdaterUiConfig::Init()) {
71        LOG(ERROR) << "config init failed";
72    }
73}
74
75void UpdaterUiEnv::InitEvts()
76{
77    CallbackManager::Init(UpdaterUiConfig::GetFocusCfg());
78}
79
80void UpdaterUiEnv::InitInputDriver()
81{
82    InputEvent::GetInstance().HdfInit();
83}
84
85void UpdaterUiEnv::InitDisplayDriver()
86{
87    InitDisplayDriverExt();
88    static_cast<void>(std::find_if(std::begin(BRIGHTNESS_FILES), std::end(BRIGHTNESS_FILES), [] (auto filePair) {
89        return InitBrightness(filePair.first, filePair.second);
90    }));
91}
92
93void UpdaterUiEnv::InitRootView()
94{
95    using namespace OHOS;
96    RootView::GetInstance()->SetPosition(0, 0);
97    RootView::GetInstance()->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);
98    RootView::GetInstance()->Resize(Screen::GetInstance().GetWidth(), Screen::GetInstance().GetHeight());
99    RootView::GetInstance()->Invalidate();
100}
101
102bool UpdaterUiEnv::InitBrightness(const char *brightnessFile, const char *maxBrightnessFile)
103{
104    if (access(brightnessFile, R_OK | W_OK) != 0 || access(maxBrightnessFile, R_OK) != 0) {
105        LOG(ERROR) << "can't access brigntness file";
106        return false;
107    }
108
109    std::ifstream ifs { maxBrightnessFile };
110    if (!ifs.is_open()) {
111        LOG(ERROR) << "open " << maxBrightnessFile << " failed";
112        return false;
113    }
114    int maxValue = 0;
115    ifs >> maxValue;
116    if (ifs.fail() || ifs.bad()) {
117        LOG(ERROR) << "read int from " << maxBrightnessFile << " failed sd maxValue = " << maxValue;
118        return false;
119    }
120
121    std::ofstream ofs { brightnessFile };
122    if (!ofs.is_open()) {
123        LOG(ERROR) << "open " << brightnessFile << " failed";
124        return false;
125    }
126
127    constexpr std::size_t SHIFT_WIDTH = 3;
128    // set to one eighth of max brigtness
129    ofs << (static_cast<std::size_t>(maxValue) >> SHIFT_WIDTH);
130    if (ofs.fail() || ofs.bad()) {
131        LOG(ERROR) << "write int to " << brightnessFile << " failed";
132        return false;
133    }
134    return true;
135}
136} // namespace Updater
137