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