89 QPalette::ColorRole role)
92 palette.setColor(QPalette::Active,
94 QRgb(object.value(
"ENABLED_FOCUSED_WINDOW_FOCUSED_STATE_SET"_L1).toInt()));
97 palette.setColor(QPalette::Inactive,
99 QRgb(object.value(
"ENABLED_STATE_SET"_L1).toInt()));
102 palette.setColor(QPalette::Disabled,
104 QRgb(object.value(
"EMPTY_STATE_SET"_L1).toInt()));
106 palette.setColor(QPalette::Current, role, palette.color(QPalette::Active, role));
108 if (role == QPalette::WindowText) {
111 palette.setColor(QPalette::Active,
112 QPalette::BrightText,
113 QRgb(object.value(
"PRESSED_ENABLED_FOCUSED_WINDOW_FOCUSED_STATE_SET"_L1).toInt()));
116 palette.setColor(QPalette::Inactive,
117 QPalette::BrightText,
118 QRgb(object.value(
"PRESSED_ENABLED_STATE_SET"_L1).toInt()));
121 palette.setColor(QPalette::Disabled,
122 QPalette::BrightText,
123 QRgb(object.value(
"PRESSED_STATE_SET"_L1).toInt()));
125 palette.setColor(QPalette::Current, QPalette::BrightText, palette.color(QPalette::Active, QPalette::BrightText));
129 palette.setColor(QPalette::Active,
130 QPalette::HighlightedText,
131 QRgb(object.value(
"ENABLED_SELECTED_WINDOW_FOCUSED_STATE_SET"_L1).toInt()));
134 palette.setColor(QPalette::Inactive,
135 QPalette::HighlightedText,
136 QRgb(object.value(
"ENABLED_SELECTED_STATE_SET"_L1).toInt()));
139 palette.setColor(QPalette::Disabled,
140 QPalette::HighlightedText,
141 QRgb(object.value(
"SELECTED_STATE_SET"_L1).toInt()));
143 palette.setColor(QPalette::Current,
144 QPalette::HighlightedText,
145 palette.color(QPalette::Active, QPalette::HighlightedText));
148 palette.setColor(QPalette::Active, QPalette::Text, palette.color(QPalette::Active, role));
149 palette.setColor(QPalette::Inactive, QPalette::Text, palette.color(QPalette::Inactive, role));
150 palette.setColor(QPalette::Disabled, QPalette::Text, palette.color(QPalette::Disabled, role));
151 palette.setColor(QPalette::Current, QPalette::Text, palette.color(QPalette::Current, role));
154 palette.setColor(QPalette::Active, QPalette::ButtonText, palette.color(QPalette::Active, role));
155 palette.setColor(QPalette::Inactive, QPalette::ButtonText, palette.color(QPalette::Inactive, role));
156 palette.setColor(QPalette::Disabled, QPalette::ButtonText, palette.color(QPalette::Disabled, role));
157 palette.setColor(QPalette::Current, QPalette::ButtonText, palette.color(QPalette::Current, role));
161QJsonObject AndroidStyle::loadStyleData()
163 QString stylePath(QLatin1StringView(qgetenv(
"ANDROID_STYLE_PATH")));
164 const QLatin1Char slashChar(
'/');
165 if (!stylePath.isEmpty() && !stylePath.endsWith(slashChar))
166 stylePath += slashChar;
170 : QAndroidPlatformIntegration::colorScheme();
171 if (colorScheme == Qt::ColorScheme::Dark)
172 stylePath +=
"darkUiMode/"_L1;
174 Q_ASSERT(!stylePath.isEmpty());
176 QFile f(stylePath +
"style.json"_L1);
177 if (!f.open(QIODevice::ReadOnly))
178 return QJsonObject();
180 QJsonParseError error;
181 QJsonDocument document = QJsonDocument::fromJson(f.readAll(), &error);
182 if (Q_UNLIKELY(document.isNull())) {
183 qCritical() << error.errorString();
184 return QJsonObject();
187 if (Q_UNLIKELY(!document.isObject())) {
188 qCritical(
"Style.json does not contain a valid style.");
189 return QJsonObject();
191 return document.object();
196 double pixelDensity = QHighDpiScaling::isActive() ? QtAndroid::pixelDensity() : 1.0;
198 style->m_standardPalette = QPalette();
199 style->m_palettes.clear();
200 style->m_fonts.clear();
201 style->m_QWidgetsFonts.clear();
203 style =
std::make_shared<AndroidStyle>();
206 style->m_styleData = AndroidStyle::loadStyleData();
208 if (style->m_styleData.isEmpty())
212 QFont font(
"Droid Sans Mono"_L1, 14.0 * 100 / 72);
213 style->m_fonts.insert(QPlatformTheme::FixedFont, font);
216 for (QJsonObject::const_iterator objectIterator = style->m_styleData.constBegin();
217 objectIterator != style->m_styleData.constEnd();
219 QString key = objectIterator.key();
220 QJsonValue value = objectIterator.value();
221 if (!value.isObject()) {
222 qWarning(
"Style.json structure is unrecognized.");
225 QJsonObject item = value.toObject();
226 QJsonObject::const_iterator attributeIterator = item.find(
"qtClass"_L1);
227 QByteArray qtClassName;
228 if (attributeIterator != item.constEnd()) {
230 qtClassName = attributeIterator.value().toString().toLatin1();
232 const int ft = fontType(key);
233 if (ft > -1 || !qtClassName.isEmpty()) {
238 attributeIterator = item.find(
"TextAppearance_textSize"_L1);
239 if (attributeIterator != item.constEnd())
240 font.setPixelSize(
int(attributeIterator.value().toDouble() / pixelDensity));
243 attributeIterator = item.find(
"TextAppearance_textStyle"_L1);
244 if (attributeIterator != item.constEnd()) {
245 const int style =
int(attributeIterator.value().toDouble());
246 font.setBold(style & textStyle_bold);
247 font.setItalic(style & textStyle_italic);
251 attributeIterator = item.find(
"TextAppearance_typeface"_L1);
252 if (attributeIterator != item.constEnd()) {
253 QFont::StyleHint styleHint = QFont::AnyStyle;
254 switch (
int(attributeIterator.value().toDouble())) {
256 styleHint = QFont::SansSerif;
259 styleHint = QFont::Serif;
261 case typeface_monospace:
262 styleHint = QFont::Monospace;
265 font.setStyleHint(styleHint, QFont::PreferMatch);
267 if (!qtClassName.isEmpty())
268 style->m_QWidgetsFonts.insert(qtClassName, font);
271 style->m_fonts.insert(ft, font);
272 if (ft == QPlatformTheme::SystemFont)
273 QGuiApplication::setFont(font);
278 const int pt = paletteType(key);
279 if (pt > -1 || !qtClassName.isEmpty()) {
281 QPalette palette = *defaultPalette;
283 attributeIterator = item.find(
"defaultTextColorPrimary"_L1);
284 if (attributeIterator != item.constEnd())
285 palette.setColor(QPalette::WindowText, QRgb(
int(attributeIterator.value().toDouble())));
287 attributeIterator = item.find(
"defaultBackgroundColor"_L1);
288 if (attributeIterator != item.constEnd())
289 palette.setColor(QPalette::Window, QRgb(
int(attributeIterator.value().toDouble())));
291 attributeIterator = item.find(
"TextAppearance_textColor"_L1);
292 if (attributeIterator != item.constEnd())
293 setPaletteColor(attributeIterator.value().toObject().toVariantMap(), palette, QPalette::WindowText);
295 attributeIterator = item.find(
"TextAppearance_textColorLink"_L1);
296 if (attributeIterator != item.constEnd())
297 setPaletteColor(attributeIterator.value().toObject().toVariantMap(), palette, QPalette::Link);
299 attributeIterator = item.find(
"TextAppearance_textColorHighlight"_L1);
300 if (attributeIterator != item.constEnd())
301 palette.setColor(QPalette::Highlight, QRgb(
int(attributeIterator.value().toDouble())));
303 if (pt == QPlatformTheme::SystemPalette)
304 *defaultPalette = style->m_standardPalette = palette;
307 style->m_palettes.insert(pt, palette);
347 QColor windowText = Qt::black;
348 QColor background(229, 229, 229);
349 QColor light = background.lighter(150);
350 QColor mid(background.darker(130));
351 QColor midLight = mid.lighter(110);
352 QColor base(249, 249, 249);
353 QColor disabledBase(background);
354 QColor dark = background.darker(150);
355 QColor darkDisabled = dark.darker(110);
356 QColor text = Qt::black;
357 QColor highlightedText = Qt::black;
358 QColor disabledText = QColor(190, 190, 190);
359 QColor button(241, 241, 241);
360 QColor shadow(201, 201, 201);
361 QColor highlight(148, 210, 231);
362 QColor disabledShadow = shadow.lighter(150);
364 if (colorScheme() == Qt::ColorScheme::Dark) {
366 windowText = QColor(250, 250, 250);
367 background = QColor(48, 48, 48);
368 light = background.darker(150);
369 mid = background.lighter(130);
370 midLight = mid.darker(110);
372 disabledBase = background;
373 dark = background.darker(150);
374 darkDisabled = dark.darker(110);
375 text = QColor(250, 250, 250);
376 highlightedText = QColor(250, 250, 250);
377 disabledText = QColor(96, 96, 96);
378 button = QColor(48, 48, 48);
379 shadow = QColor(32, 32, 32);
380 highlight = QColor(102, 178, 204);
381 disabledShadow = shadow.darker(150);
384 m_defaultPalette = QPalette(windowText,background,light,dark,mid,text,base);
385 m_defaultPalette.setBrush(QPalette::Midlight, midLight);
386 m_defaultPalette.setBrush(QPalette::Button, button);
387 m_defaultPalette.setBrush(QPalette::Shadow, shadow);
388 m_defaultPalette.setBrush(QPalette::HighlightedText, highlightedText);
390 m_defaultPalette.setBrush(QPalette::Disabled, QPalette::Text, disabledText);
391 m_defaultPalette.setBrush(QPalette::Disabled, QPalette::WindowText, disabledText);
392 m_defaultPalette.setBrush(QPalette::Disabled, QPalette::ButtonText, disabledText);
393 m_defaultPalette.setBrush(QPalette::Disabled, QPalette::Base, disabledBase);
394 m_defaultPalette.setBrush(QPalette::Disabled, QPalette::Dark, darkDisabled);
395 m_defaultPalette.setBrush(QPalette::Disabled, QPalette::Shadow, disabledShadow);
397 m_defaultPalette.setBrush(QPalette::Active, QPalette::Highlight, highlight);
398 m_defaultPalette.setBrush(QPalette::Inactive, QPalette::Highlight, highlight);
399 m_defaultPalette.setBrush(QPalette::Disabled, QPalette::Highlight, highlight.lighter(150));
401 loadAndroidStyle(&m_defaultPalette, m_androidStyleData);
440 m_colorSchemeOverride = scheme;
441 QMetaObject::invokeMethod(qGuiApp, [
this]{
445 if (m_colorSchemeOverride == Qt::ColorScheme::Unknown)
448 const auto iface = qGuiApp->nativeInterface<QNativeInterface::QAndroidApplication>();
449 iface->runOnAndroidMainThread([=]() {
450 bool isLight = scheme == Qt::ColorScheme::Light;
451 QtJniTypes::QtDisplayManager::callStaticMethod(
"setStatusBarColorHint",
452 iface->context().object<QtJniTypes::Activity>(), isLight);
453 QtJniTypes::QtDisplayManager::callStaticMethod(
"setNavigationBarColorHint",
454 iface->context().object<QtJniTypes::Activity>(), isLight);
485 case QPlatformTheme::ToolButtonPalette:
486 case QPlatformTheme::ButtonPalette:
487 return QPlatformTheme::ButtonPalette;
489 case QPlatformTheme::CheckBoxPalette:
490 return QPlatformTheme::CheckBoxPalette;
492 case QPlatformTheme::RadioButtonPalette:
493 return QPlatformTheme::RadioButtonPalette;
495 case QPlatformTheme::ComboBoxPalette:
496 return QPlatformTheme::ComboBoxPalette;
498 case QPlatformTheme::TextEditPalette:
499 case QPlatformTheme::TextLineEditPalette:
500 return QPlatformTheme::TextLineEditPalette;
502 case QPlatformTheme::ItemViewPalette:
503 return QPlatformTheme::ItemViewPalette;
506 return QPlatformTheme::SystemPalette;