diff --git a/CHANGELOG.md b/CHANGELOG.md
index 2fc550140..267423d61 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -7,6 +7,7 @@ All notable changes to this project will be documented in this file.
### Added
- Viewer: prompt to show newly edited item
+- Widget: outline color options according to device theme
- Catalan translation (thanks Marc AmorĂ³s)
## [v1.10.4] - 2024-02-07
diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/HomeWidgetProvider.kt b/android/app/src/main/kotlin/deckers/thibault/aves/HomeWidgetProvider.kt
index c65609042..81933f251 100644
--- a/android/app/src/main/kotlin/deckers/thibault/aves/HomeWidgetProvider.kt
+++ b/android/app/src/main/kotlin/deckers/thibault/aves/HomeWidgetProvider.kt
@@ -87,6 +87,8 @@ class HomeWidgetProvider : AppWidgetProvider() {
val (widthPx, heightPx) = getWidgetSizePx(context, widgetInfo)
if (widthPx == 0 || heightPx == 0) return null
+ val isNightModeOn = (context.resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK) == Configuration.UI_MODE_NIGHT_YES
+
initFlutterEngine(context)
val messenger = flutterEngine!!.dartExecutor
val channel = MethodChannel(messenger, WIDGET_DRAW_CHANNEL)
@@ -101,6 +103,7 @@ class HomeWidgetProvider : AppWidgetProvider() {
"devicePixelRatio" to getDevicePixelRatio(),
"drawEntryImage" to drawEntryImage,
"reuseEntry" to reuseEntry,
+ "isSystemThemeDark" to isNightModeOn,
), object : MethodChannel.Result {
override fun success(result: Any?) {
cont.resume(result)
diff --git a/lib/model/settings/enums/widget_outline.dart b/lib/model/settings/enums/widget_outline.dart
new file mode 100644
index 000000000..0b4f0e13f
--- /dev/null
+++ b/lib/model/settings/enums/widget_outline.dart
@@ -0,0 +1,23 @@
+import 'package:aves_model/aves_model.dart';
+import 'package:dynamic_color/dynamic_color.dart';
+import 'package:flutter/foundation.dart';
+import 'package:flutter/material.dart';
+
+extension ExtraWidgetOutline on WidgetOutline {
+ Future color(Brightness brightness) async {
+ switch (this) {
+ case WidgetOutline.none:
+ return SynchronousFuture(null);
+ case WidgetOutline.black:
+ return SynchronousFuture(Colors.black);
+ case WidgetOutline.white:
+ return SynchronousFuture(Colors.white);
+ case WidgetOutline.systemBlackAndWhite:
+ return SynchronousFuture(brightness == Brightness.dark ? Colors.black : Colors.white);
+ case WidgetOutline.systemDynamic:
+ final corePalette = await DynamicColorPlugin.getCorePalette();
+ final scheme = corePalette?.toColorScheme(brightness: brightness);
+ return scheme?.primary ?? await WidgetOutline.systemBlackAndWhite.color(brightness);
+ }
+ }
+}
diff --git a/lib/model/settings/settings.dart b/lib/model/settings/settings.dart
index 693f8d9e7..f8a7325d8 100644
--- a/lib/model/settings/settings.dart
+++ b/lib/model/settings/settings.dart
@@ -274,12 +274,9 @@ class Settings with ChangeNotifier, SettingsAccess, AppSettings, DisplaySettings
// widget
- Color? getWidgetOutline(int widgetId) {
- final value = getInt('${SettingKeys.widgetOutlinePrefixKey}$widgetId');
- return value != null ? Color(value) : null;
- }
+ WidgetOutline getWidgetOutline(int widgetId) => getEnumOrDefault('${SettingKeys.widgetOutlinePrefixKey}$widgetId', WidgetOutline.none, WidgetOutline.values);
- void setWidgetOutline(int widgetId, Color? newValue) => set('${SettingKeys.widgetOutlinePrefixKey}$widgetId', newValue?.value);
+ void setWidgetOutline(int widgetId, WidgetOutline newValue) => set('${SettingKeys.widgetOutlinePrefixKey}$widgetId', newValue.toString());
WidgetShape getWidgetShape(int widgetId) => getEnumOrDefault('${SettingKeys.widgetShapePrefixKey}$widgetId', SettingsDefaults.widgetShape, WidgetShape.values);
diff --git a/lib/widget_common.dart b/lib/widget_common.dart
index caca41659..fd20ac7eb 100644
--- a/lib/widget_common.dart
+++ b/lib/widget_common.dart
@@ -3,6 +3,7 @@ import 'dart:async';
import 'package:aves/app_flavor.dart';
import 'package:aves/model/entry/entry.dart';
import 'package:aves/model/entry/sort.dart';
+import 'package:aves/model/settings/enums/widget_outline.dart';
import 'package:aves/model/settings/settings.dart';
import 'package:aves/model/source/collection_lens.dart';
import 'package:aves/model/source/media_store_source.dart';
@@ -20,6 +21,7 @@ void widgetMainCommon(AppFlavor flavor) async {
WidgetsFlutterBinding.ensureInitialized();
initPlatformServices();
await settings.init(monitorPlatformSettings: false);
+ await reportService.init();
_widgetDrawChannel.setMethodCallHandler((call) async {
// widget settings may be modified in a different process after channel setup
@@ -41,6 +43,10 @@ Future