1 /* 2 * Copyright (c) 2021 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 16 #include "adapter/ohos/osal/resource_convertor.h" 17 18 namespace OHOS::Ace { 19 ConvertDeviceTypeToGlobal(DeviceType type)20 Global::Resource::DeviceType ConvertDeviceTypeToGlobal(DeviceType type) 21 { 22 switch (type) { 23 case DeviceType::PHONE: 24 return Global::Resource::DeviceType::DEVICE_PHONE; 25 case DeviceType::TV: 26 return Global::Resource::DeviceType::DEVICE_TV; 27 case DeviceType::WATCH: 28 return Global::Resource::DeviceType::DEVICE_WEARABLE; 29 case DeviceType::CAR: 30 return Global::Resource::DeviceType::DEVICE_CAR; 31 case DeviceType::TABLET: 32 return Global::Resource::DeviceType::DEVICE_TABLET; 33 case DeviceType::TWO_IN_ONE: 34 return Global::Resource::DeviceType::DEVICE_TWOINONE; 35 case DeviceType::WEARABLE: 36 return Global::Resource::DeviceType::DEVICE_WEARABLE; 37 default: 38 return Global::Resource::DeviceType::DEVICE_NOT_SET; 39 } 40 } 41 ConvertDirectionToGlobal(DeviceOrientation orientation)42 Global::Resource::Direction ConvertDirectionToGlobal(DeviceOrientation orientation) 43 { 44 switch (orientation) { 45 case DeviceOrientation::PORTRAIT: 46 return Global::Resource::Direction::DIRECTION_VERTICAL; 47 case DeviceOrientation::LANDSCAPE: 48 return Global::Resource::Direction::DIRECTION_HORIZONTAL; 49 default: 50 return Global::Resource::Direction::DIRECTION_NOT_SET; 51 } 52 } 53 ConvertDensityToGlobal(double density)54 Global::Resource::ScreenDensity ConvertDensityToGlobal(double density) 55 { 56 static const std::vector<std::pair<double, Global::Resource::ScreenDensity>> resolutions = { 57 { 0.0, Global::Resource::ScreenDensity::SCREEN_DENSITY_NOT_SET }, 58 { 120.0, Global::Resource::ScreenDensity::SCREEN_DENSITY_SDPI }, 59 { 160.0, Global::Resource::ScreenDensity::SCREEN_DENSITY_MDPI }, 60 { 240.0, Global::Resource::ScreenDensity::SCREEN_DENSITY_LDPI }, 61 { 320.0, Global::Resource::ScreenDensity::SCREEN_DENSITY_XLDPI }, 62 { 480.0, Global::Resource::ScreenDensity::SCREEN_DENSITY_XXLDPI }, 63 { 640.0, Global::Resource::ScreenDensity::SCREEN_DENSITY_XXXLDPI }, 64 }; 65 double deviceDpi = density * DPI_BASE; 66 auto resolution = Global::Resource::ScreenDensity::SCREEN_DENSITY_NOT_SET; 67 for (const auto& [dpi, value] : resolutions) { 68 resolution = value; 69 if (LessOrEqual(deviceDpi, dpi)) { 70 break; 71 } 72 } 73 return resolution; 74 } ConvertColorModeToGlobal(ColorMode colorMode)75 Global::Resource::ColorMode ConvertColorModeToGlobal(ColorMode colorMode) 76 { 77 switch (colorMode) { 78 case ColorMode::DARK: 79 return Global::Resource::ColorMode::DARK; 80 case ColorMode::LIGHT: 81 return Global::Resource::ColorMode::LIGHT; 82 default: 83 return Global::Resource::ColorMode::COLOR_MODE_NOT_SET; 84 } 85 } 86 ConvertInputDevice(bool deviceAccess)87 Global::Resource::InputDevice ConvertInputDevice(bool deviceAccess) 88 { 89 return deviceAccess ? Global::Resource::InputDevice::INPUTDEVICE_POINTINGDEVICE : 90 Global::Resource::InputDevice::INPUTDEVICE_NOT_SET; 91 } 92 ConvertConfigToGlobal(const ResourceConfiguration & config)93 std::shared_ptr<Global::Resource::ResConfig> ConvertConfigToGlobal(const ResourceConfiguration& config) 94 { 95 std::shared_ptr<Global::Resource::ResConfig> newResCfg(Global::Resource::CreateResConfig()); 96 icu::Locale locale(config.GetLanguage().c_str()); 97 newResCfg->SetLocaleInfo(locale); 98 newResCfg->SetDeviceType(ConvertDeviceTypeToGlobal(config.GetDeviceType())); 99 newResCfg->SetDirection(ConvertDirectionToGlobal(config.GetOrientation())); 100 newResCfg->SetScreenDensity(config.GetDensity()); 101 newResCfg->SetColorMode(ConvertColorModeToGlobal(config.GetColorMode())); 102 newResCfg->SetInputDevice(ConvertInputDevice(config.GetDeviceAccess())); 103 newResCfg->SetAppColorMode(config.GetColorModeIsSetByApp()); 104 newResCfg->SetMcc(config.GetMcc()); 105 newResCfg->SetMnc(config.GetMnc()); 106 icu::Locale preferredLocale(config.GetPreferredLanguage().c_str()); 107 newResCfg->SetPreferredLocaleInfo(preferredLocale); 108 return newResCfg; 109 } 110 ConvertDeviceTypeToAce(Global::Resource::DeviceType type)111 DeviceType ConvertDeviceTypeToAce(Global::Resource::DeviceType type) 112 { 113 switch (type) { 114 case Global::Resource::DeviceType::DEVICE_PHONE: 115 return DeviceType::PHONE; 116 case Global::Resource::DeviceType::DEVICE_TV: 117 return DeviceType::TV; 118 case Global::Resource::DeviceType::DEVICE_WEARABLE: 119 return DeviceType::WATCH; 120 case Global::Resource::DeviceType::DEVICE_CAR: 121 return DeviceType::CAR; 122 case Global::Resource::DeviceType::DEVICE_TABLET: 123 return DeviceType::TABLET; 124 default: 125 return DeviceType::UNKNOWN; 126 } 127 } 128 ConvertDirectionToAce(Global::Resource::Direction orientation)129 DeviceOrientation ConvertDirectionToAce(Global::Resource::Direction orientation) 130 { 131 switch (orientation) { 132 case Global::Resource::Direction::DIRECTION_VERTICAL: 133 return DeviceOrientation::PORTRAIT; 134 case Global::Resource::Direction::DIRECTION_HORIZONTAL: 135 return DeviceOrientation::LANDSCAPE; 136 default: 137 return DeviceOrientation::ORIENTATION_UNDEFINED; 138 } 139 } 140 ConvertDensityToAce(Global::Resource::ScreenDensity density)141 double ConvertDensityToAce(Global::Resource::ScreenDensity density) 142 { 143 switch (density) { 144 case Global::Resource::ScreenDensity::SCREEN_DENSITY_SDPI: 145 return 120.0 / DPI_BASE; 146 case Global::Resource::ScreenDensity::SCREEN_DENSITY_MDPI: 147 return 160.0 / DPI_BASE; 148 case Global::Resource::ScreenDensity::SCREEN_DENSITY_LDPI: 149 return 240.0 / DPI_BASE; 150 case Global::Resource::ScreenDensity::SCREEN_DENSITY_XLDPI: 151 return 320.0 / DPI_BASE; 152 case Global::Resource::ScreenDensity::SCREEN_DENSITY_XXLDPI: 153 return 480.0 / DPI_BASE; 154 case Global::Resource::ScreenDensity::SCREEN_DENSITY_XXXLDPI: 155 return 640.0 / DPI_BASE; 156 default: 157 return 0.0; 158 } 159 } 160 161 } // namespace OHOS::Ace