91 QPalette::ColorRole role)
94 palette.setColor(QPalette::Active,
96 QRgb(object.value(
"ENABLED_FOCUSED_WINDOW_FOCUSED_STATE_SET"_L1).toInt()));
99 palette.setColor(QPalette::Inactive,
101 QRgb(object.value(
"ENABLED_STATE_SET"_L1).toInt()));
104 palette.setColor(QPalette::Disabled,
106 QRgb(object.value(
"EMPTY_STATE_SET"_L1).toInt()));
108 palette.setColor(QPalette::Current, role, palette.color(QPalette::Active, role));
110 if (role == QPalette::WindowText) {
113 palette.setColor(QPalette::Active,
114 QPalette::BrightText,
115 QRgb(object.value(
"PRESSED_ENABLED_FOCUSED_WINDOW_FOCUSED_STATE_SET"_L1).toInt()));
118 palette.setColor(QPalette::Inactive,
119 QPalette::BrightText,
120 QRgb(object.value(
"PRESSED_ENABLED_STATE_SET"_L1).toInt()));
123 palette.setColor(QPalette::Disabled,
124 QPalette::BrightText,
125 QRgb(object.value(
"PRESSED_STATE_SET"_L1).toInt()));
127 palette.setColor(QPalette::Current, QPalette::BrightText, palette.color(QPalette::Active, QPalette::BrightText));
131 palette.setColor(QPalette::Active,
132 QPalette::HighlightedText,
133 QRgb(object.value(
"ENABLED_SELECTED_WINDOW_FOCUSED_STATE_SET"_L1).toInt()));
136 palette.setColor(QPalette::Inactive,
137 QPalette::HighlightedText,
138 QRgb(object.value(
"ENABLED_SELECTED_STATE_SET"_L1).toInt()));
141 palette.setColor(QPalette::Disabled,
142 QPalette::HighlightedText,
143 QRgb(object.value(
"SELECTED_STATE_SET"_L1).toInt()));
145 palette.setColor(QPalette::Current,
146 QPalette::HighlightedText,
147 palette.color(QPalette::Active, QPalette::HighlightedText));
150 palette.setColor(QPalette::Active, QPalette::Text, palette.color(QPalette::Active, role));
151 palette.setColor(QPalette::Inactive, QPalette::Text, palette.color(QPalette::Inactive, role));
152 palette.setColor(QPalette::Disabled, QPalette::Text, palette.color(QPalette::Disabled, role));
153 palette.setColor(QPalette::Current, QPalette::Text, palette.color(QPalette::Current, role));
156 palette.setColor(QPalette::Active, QPalette::ButtonText, palette.color(QPalette::Active, role));
157 palette.setColor(QPalette::Inactive, QPalette::ButtonText, palette.color(QPalette::Inactive, role));
158 palette.setColor(QPalette::Disabled, QPalette::ButtonText, palette.color(QPalette::Disabled, role));
159 palette.setColor(QPalette::Current, QPalette::ButtonText, palette.color(QPalette::Current, role));
163QJsonObject AndroidStyle::loadStyleData()
165 QString stylePath(QLatin1StringView(qgetenv(
"ANDROID_STYLE_PATH")));
166 const QLatin1Char slashChar(
'/');
167 if (!stylePath.isEmpty() && !stylePath.endsWith(slashChar))
168 stylePath += slashChar;
172 : QAndroidPlatformIntegration::colorScheme();
173 if (colorScheme == Qt::ColorScheme::Dark)
174 stylePath +=
"darkUiMode/"_L1;
176 Q_ASSERT(!stylePath.isEmpty());
178 QFile f(stylePath +
"style.json"_L1);
179 if (!f.open(QIODevice::ReadOnly))
180 return QJsonObject();
182 QJsonParseError error;
183 QJsonDocument document = QJsonDocument::fromJson(f.readAll(), &error);
184 if (Q_UNLIKELY(document.isNull())) {
185 qCritical() << error.errorString();
186 return QJsonObject();
189 if (Q_UNLIKELY(!document.isObject())) {
190 qCritical(
"Style.json does not contain a valid style.");
191 return QJsonObject();
193 return document.object();
198 double pixelDensity = QHighDpiScaling::isActive() ? QtAndroid::pixelDensity() : 1.0;
200 style->m_standardPalette = QPalette();
201 style->m_palettes.clear();
202 style->m_fonts.clear();
203 style->m_QWidgetsFonts.clear();
205 style =
std::make_shared<AndroidStyle>();
208 style->m_styleData = AndroidStyle::loadStyleData();
210 if (style->m_styleData.isEmpty())
214 QFont font(
"Droid Sans Mono"_L1, 14.0 * 100 / 72);
215 style->m_fonts.insert(QPlatformTheme::FixedFont, font);
218 for (QJsonObject::const_iterator objectIterator = style->m_styleData.constBegin();
219 objectIterator != style->m_styleData.constEnd();
221 QString key = objectIterator.key();
222 QJsonValue value = objectIterator.value();
223 if (!value.isObject()) {
224 qWarning(
"Style.json structure is unrecognized.");
227 QJsonObject item = value.toObject();
228 QJsonObject::const_iterator attributeIterator = item.find(
"qtClass"_L1);
229 QByteArray qtClassName;
230 if (attributeIterator != item.constEnd()) {
232 qtClassName = attributeIterator.value().toString().toLatin1();
234 const int ft = fontType(key);
235 if (ft > -1 || !qtClassName.isEmpty()) {
238 QFont font(QGuiApplicationPrivate::platformIntegration()->fontDatabase()->defaultFont());
241 attributeIterator = item.find(
"TextAppearance_textSize"_L1);
242 if (attributeIterator != item.constEnd())
243 font.setPixelSize(
int(attributeIterator.value().toDouble() / pixelDensity));
246 attributeIterator = item.find(
"TextAppearance_textStyle"_L1);
247 if (attributeIterator != item.constEnd()) {
248 const int style =
int(attributeIterator.value().toDouble());
249 font.setBold(style & textStyle_bold);
250 font.setItalic(style & textStyle_italic);
254 attributeIterator = item.find(
"TextAppearance_typeface"_L1);
255 if (attributeIterator != item.constEnd()) {
256 QFont::StyleHint styleHint = QFont::AnyStyle;
257 switch (
int(attributeIterator.value().toDouble())) {
259 styleHint = QFont::SansSerif;
262 styleHint = QFont::Serif;
264 case typeface_monospace:
265 styleHint = QFont::Monospace;
268 font.setStyleHint(styleHint, QFont::PreferMatch);
270 if (!qtClassName.isEmpty())
271 style->m_QWidgetsFonts.insert(qtClassName, font);
274 style->m_fonts.insert(ft, font);
279 const int pt = paletteType(key);
280 if (pt > -1 || !qtClassName.isEmpty()) {
282 QPalette palette = *defaultPalette;
284 attributeIterator = item.find(
"defaultTextColorPrimary"_L1);
285 if (attributeIterator != item.constEnd())
286 palette.setColor(QPalette::WindowText, QRgb(
int(attributeIterator.value().toDouble())));
288 attributeIterator = item.find(
"defaultBackgroundColor"_L1);
289 if (attributeIterator != item.constEnd())
290 palette.setColor(QPalette::Window, QRgb(
int(attributeIterator.value().toDouble())));
292 attributeIterator = item.find(
"TextAppearance_textColor"_L1);
293 if (attributeIterator != item.constEnd())
294 setPaletteColor(attributeIterator.value().toObject().toVariantMap(), palette, QPalette::WindowText);
296 attributeIterator = item.find(
"TextAppearance_textColorLink"_L1);
297 if (attributeIterator != item.constEnd())
298 setPaletteColor(attributeIterator.value().toObject().toVariantMap(), palette, QPalette::Link);
300 attributeIterator = item.find(
"TextAppearance_textColorHighlight"_L1);
301 if (attributeIterator != item.constEnd())
302 palette.setColor(QPalette::Highlight, QRgb(
int(attributeIterator.value().toDouble())));
304 if (pt == QPlatformTheme::SystemPalette)
305 *defaultPalette = style->m_standardPalette = palette;
308 style->m_palettes.insert(pt, palette);
349 QColor windowText = Qt::black;
350 QColor background(229, 229, 229);
351 QColor light = background.lighter(150);
352 QColor mid(background.darker(130));
353 QColor midLight = mid.lighter(110);
354 QColor base(249, 249, 249);
355 QColor disabledBase(background);
356 QColor dark = background.darker(150);
357 QColor darkDisabled = dark.darker(110);
358 QColor text = Qt::black;
359 QColor highlightedText = Qt::black;
360 QColor disabledText = QColor(190, 190, 190);
361 QColor button(241, 241, 241);
362 QColor shadow(201, 201, 201);
363 QColor highlight(148, 210, 231);
364 QColor disabledShadow = shadow.lighter(150);
366 if (colorScheme() == Qt::ColorScheme::Dark) {
368 windowText = QColor(250, 250, 250);
369 background = QColor(48, 48, 48);
370 light = background.darker(150);
371 mid = background.lighter(130);
372 midLight = mid.darker(110);
374 disabledBase = background;
375 dark = background.darker(150);
376 darkDisabled = dark.darker(110);
377 text = QColor(250, 250, 250);
378 highlightedText = QColor(250, 250, 250);
379 disabledText = QColor(96, 96, 96);
380 button = QColor(48, 48, 48);
381 shadow = QColor(32, 32, 32);
382 highlight = QColor(102, 178, 204);
383 disabledShadow = shadow.darker(150);
386 m_defaultPalette = QPalette(windowText,background,light,dark,mid,text,base);
387 m_defaultPalette.setBrush(QPalette::Midlight, midLight);
388 m_defaultPalette.setBrush(QPalette::Button, button);
389 m_defaultPalette.setBrush(QPalette::Shadow, shadow);
390 m_defaultPalette.setBrush(QPalette::HighlightedText, highlightedText);
392 m_defaultPalette.setBrush(QPalette::Disabled, QPalette::Text, disabledText);
393 m_defaultPalette.setBrush(QPalette::Disabled, QPalette::WindowText, disabledText);
394 m_defaultPalette.setBrush(QPalette::Disabled, QPalette::ButtonText, disabledText);
395 m_defaultPalette.setBrush(QPalette::Disabled, QPalette::Base, disabledBase);
396 m_defaultPalette.setBrush(QPalette::Disabled, QPalette::Dark, darkDisabled);
397 m_defaultPalette.setBrush(QPalette::Disabled, QPalette::Shadow, disabledShadow);
399 m_defaultPalette.setBrush(QPalette::Active, QPalette::Highlight, highlight);
400 m_defaultPalette.setBrush(QPalette::Inactive, QPalette::Highlight, highlight);
401 m_defaultPalette.setBrush(QPalette::Disabled, QPalette::Highlight, highlight.lighter(150));
403 loadAndroidStyle(&m_defaultPalette, m_androidStyleData);
442 m_colorSchemeOverride = scheme;
443 QMetaObject::invokeMethod(qGuiApp, [
this]{
447 if (m_colorSchemeOverride == Qt::ColorScheme::Unknown)
450 const auto iface = qGuiApp->nativeInterface<QNativeInterface::QAndroidApplication>();
451 iface->runOnAndroidMainThread([=]() {
452 bool isLight = scheme == Qt::ColorScheme::Light;
453 QtJniTypes::QtWindowInsetsController::callStaticMethod(
"setStatusBarColorHint",
454 iface->context().object<QtJniTypes::Activity>(), isLight);
455 QtJniTypes::QtWindowInsetsController::callStaticMethod(
"setNavigationBarColorHint",
456 iface->context().object<QtJniTypes::Activity>(), isLight);
487 case QPlatformTheme::ToolButtonPalette:
488 case QPlatformTheme::ButtonPalette:
489 return QPlatformTheme::ButtonPalette;
491 case QPlatformTheme::CheckBoxPalette:
492 return QPlatformTheme::CheckBoxPalette;
494 case QPlatformTheme::RadioButtonPalette:
495 return QPlatformTheme::RadioButtonPalette;
497 case QPlatformTheme::ComboBoxPalette:
498 return QPlatformTheme::ComboBoxPalette;
500 case QPlatformTheme::TextEditPalette:
501 case QPlatformTheme::TextLineEditPalette:
502 return QPlatformTheme::TextLineEditPalette;
504 case QPlatformTheme::ItemViewPalette:
505 return QPlatformTheme::ItemViewPalette;
508 return QPlatformTheme::SystemPalette;