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));
157QJsonObject AndroidStyle::loadStyleData()
159 QString stylePath(QLatin1StringView(qgetenv(
"ANDROID_STYLE_PATH")));
160 const QLatin1Char slashChar(
'/');
161 if (!stylePath.isEmpty() && !stylePath.endsWith(slashChar))
162 stylePath += slashChar;
166 : QAndroidPlatformIntegration::colorScheme();
167 if (colorScheme == Qt::ColorScheme::Dark)
168 stylePath +=
"darkUiMode/"_L1;
170 Q_ASSERT(!stylePath.isEmpty());
172 QFile f(stylePath +
"style.json"_L1);
173 if (!f.open(QIODevice::ReadOnly))
174 return QJsonObject();
176 QJsonParseError error;
177 QJsonDocument document = QJsonDocument::fromJson(f.readAll(), &error);
178 if (Q_UNLIKELY(document.isNull())) {
179 qCritical() << error.errorString();
180 return QJsonObject();
183 if (Q_UNLIKELY(!document.isObject())) {
184 qCritical(
"Style.json does not contain a valid style.");
185 return QJsonObject();
187 return document.object();
192 double pixelDensity = QHighDpiScaling::isActive() ? QtAndroid::pixelDensity() : 1.0;
194 style->m_standardPalette = QPalette();
195 style->m_palettes.clear();
196 style->m_fonts.clear();
197 style->m_QWidgetsFonts.clear();
199 style =
std::make_shared<AndroidStyle>();
202 style->m_styleData = AndroidStyle::loadStyleData();
204 if (style->m_styleData.isEmpty())
208 QFont font(
"Droid Sans Mono"_L1, 14.0 * 100 / 72);
209 style->m_fonts.insert(QPlatformTheme::FixedFont, font);
212 for (QJsonObject::const_iterator objectIterator = style->m_styleData.constBegin();
213 objectIterator != style->m_styleData.constEnd();
215 QString key = objectIterator.key();
216 QJsonValue value = objectIterator.value();
217 if (!value.isObject()) {
218 qWarning(
"Style.json structure is unrecognized.");
221 QJsonObject item = value.toObject();
222 QJsonObject::const_iterator attributeIterator = item.find(
"qtClass"_L1);
223 QByteArray qtClassName;
224 if (attributeIterator != item.constEnd()) {
226 qtClassName = attributeIterator.value().toString().toLatin1();
228 const int ft = fontType(key);
229 if (ft > -1 || !qtClassName.isEmpty()) {
232 QFont font(QGuiApplicationPrivate::platformIntegration()->fontDatabase()->defaultFont());
235 attributeIterator = item.find(
"TextAppearance_textSize"_L1);
236 if (attributeIterator != item.constEnd())
237 font.setPixelSize(
int(attributeIterator.value().toDouble() / pixelDensity));
240 attributeIterator = item.find(
"TextAppearance_textStyle"_L1);
241 if (attributeIterator != item.constEnd()) {
242 const int textStyle =
int(attributeIterator.value().toDouble());
243 font.setBold(textStyle & textStyle_bold);
244 font.setItalic(textStyle & textStyle_italic);
248 attributeIterator = item.find(
"TextAppearance_typeface"_L1);
249 if (attributeIterator != item.constEnd()) {
250 QFont::StyleHint styleHint = QFont::AnyStyle;
251 switch (
int(attributeIterator.value().toDouble())) {
253 styleHint = QFont::SansSerif;
256 styleHint = QFont::Serif;
258 case typeface_monospace:
259 styleHint = QFont::Monospace;
262 font.setStyleHint(styleHint, QFont::PreferMatch);
264 if (!qtClassName.isEmpty())
265 style->m_QWidgetsFonts.insert(qtClassName, font);
268 style->m_fonts.insert(ft, font);
273 const int pt = paletteType(key);
274 if (pt > -1 || !qtClassName.isEmpty()) {
276 QPalette palette = *defaultPalette;
278 attributeIterator = item.find(
"defaultTextColorPrimary"_L1);
279 if (attributeIterator != item.constEnd())
280 palette.setColor(QPalette::WindowText, QRgb(
int(attributeIterator.value().toDouble())));
282 attributeIterator = item.find(
"defaultBackgroundColor"_L1);
283 if (attributeIterator != item.constEnd())
284 palette.setColor(QPalette::Window, QRgb(
int(attributeIterator.value().toDouble())));
286 attributeIterator = item.find(
"TextAppearance_textColor"_L1);
287 if (attributeIterator != item.constEnd())
288 setPaletteColor(attributeIterator.value().toObject().toVariantMap(), palette, QPalette::WindowText);
290 attributeIterator = item.find(
"TextAppearance_textColorLink"_L1);
291 if (attributeIterator != item.constEnd())
292 setPaletteColor(attributeIterator.value().toObject().toVariantMap(), palette, QPalette::Link);
294 attributeIterator = item.find(
"TextAppearance_textColorHighlight"_L1);
295 if (attributeIterator != item.constEnd())
296 palette.setColor(QPalette::Highlight, QRgb(
int(attributeIterator.value().toDouble())));
298 if (pt == QPlatformTheme::SystemPalette)
299 *defaultPalette = style->m_standardPalette = palette;
302 style->m_palettes.insert(pt, palette);
343 QColor windowText = Qt::black;
344 QColor background(229, 229, 229);
345 QColor light = background.lighter(150);
346 QColor mid(background.darker(130));
347 QColor midLight = mid.lighter(110);
348 QColor base(249, 249, 249);
349 QColor disabledBase(background);
350 QColor dark = background.darker(150);
351 QColor darkDisabled = dark.darker(110);
352 QColor text = Qt::black;
353 QColor highlightedText = Qt::black;
354 QColor disabledText = QColor(190, 190, 190);
355 QColor button(241, 241, 241);
356 QColor shadow(201, 201, 201);
357 QColor highlight(148, 210, 231);
358 QColor disabledShadow = shadow.lighter(150);
360 if (colorScheme() == Qt::ColorScheme::Dark) {
362 windowText = QColor(250, 250, 250);
363 background = QColor(48, 48, 48);
364 light = background.darker(150);
365 mid = background.lighter(130);
366 midLight = mid.darker(110);
368 disabledBase = background;
369 dark = background.darker(150);
370 darkDisabled = dark.darker(110);
371 text = QColor(250, 250, 250);
372 highlightedText = QColor(250, 250, 250);
373 disabledText = QColor(96, 96, 96);
374 button = QColor(48, 48, 48);
375 shadow = QColor(32, 32, 32);
376 highlight = QColor(102, 178, 204);
377 disabledShadow = shadow.darker(150);
380 m_defaultPalette = QPalette(windowText,background,light,dark,mid,text,base);
381 m_defaultPalette.setBrush(QPalette::Midlight, midLight);
382 m_defaultPalette.setBrush(QPalette::Button, button);
383 m_defaultPalette.setBrush(QPalette::Shadow, shadow);
384 m_defaultPalette.setBrush(QPalette::HighlightedText, highlightedText);
386 m_defaultPalette.setBrush(QPalette::Disabled, QPalette::Text, disabledText);
387 m_defaultPalette.setBrush(QPalette::Disabled, QPalette::WindowText, disabledText);
388 m_defaultPalette.setBrush(QPalette::Disabled, QPalette::ButtonText, disabledText);
389 m_defaultPalette.setBrush(QPalette::Disabled, QPalette::Base, disabledBase);
390 m_defaultPalette.setBrush(QPalette::Disabled, QPalette::Dark, darkDisabled);
391 m_defaultPalette.setBrush(QPalette::Disabled, QPalette::Shadow, disabledShadow);
393 m_defaultPalette.setBrush(QPalette::Active, QPalette::Highlight, highlight);
394 m_defaultPalette.setBrush(QPalette::Inactive, QPalette::Highlight, highlight);
395 m_defaultPalette.setBrush(QPalette::Disabled, QPalette::Highlight, highlight.lighter(150));
397 loadAndroidStyle(&m_defaultPalette, m_androidStyleData);
436 m_colorSchemeOverride = scheme;
437 QMetaObject::invokeMethod(qGuiApp, [
this]{
441 if (m_colorSchemeOverride == Qt::ColorScheme::Unknown)
444 const auto iface = qGuiApp->nativeInterface<QNativeInterface::QAndroidApplication>();
445 iface->runOnAndroidMainThread([=]() {
446 bool isLight = scheme == Qt::ColorScheme::Light;
447 QtJniTypes::QtWindowInsetsController::callStaticMethod(
"setStatusBarColorHint",
448 iface->context().object<QtJniTypes::Activity>(), isLight);
449 QtJniTypes::QtWindowInsetsController::callStaticMethod(
"setNavigationBarColorHint",
450 iface->context().object<QtJniTypes::Activity>(), isLight);
481 case QPlatformTheme::ToolButtonPalette:
482 case QPlatformTheme::ButtonPalette:
483 return QPlatformTheme::ButtonPalette;
485 case QPlatformTheme::CheckBoxPalette:
486 return QPlatformTheme::CheckBoxPalette;
488 case QPlatformTheme::RadioButtonPalette:
489 return QPlatformTheme::RadioButtonPalette;
491 case QPlatformTheme::ComboBoxPalette:
492 return QPlatformTheme::ComboBoxPalette;
494 case QPlatformTheme::TextEditPalette:
495 case QPlatformTheme::TextLineEditPalette:
496 return QPlatformTheme::TextLineEditPalette;
498 case QPlatformTheme::ItemViewPalette:
499 return QPlatformTheme::ItemViewPalette;
502 return QPlatformTheme::SystemPalette;