Skip to content

Commit 25787b1

Browse files
committed
Add ScreenBrightness service and Python bindings
Introduces ScreenBrightnessService in Dart and ScreenBrightness control in Python, enabling control and observation of system and application screen brightness. Updates plugin registrants for macOS and Windows, adds documentation and example usage, and includes the screen_brightness dependency in pubspec.yaml.
1 parent cb20ac0 commit 25787b1

File tree

12 files changed

+410
-0
lines changed

12 files changed

+410
-0
lines changed

client/macos/Flutter/GeneratedPluginRegistrant.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import package_info_plus
1515
import path_provider_foundation
1616
import record_macos
1717
import rive_common
18+
import screen_brightness_macos
1819
import screen_retriever_macos
1920
import shared_preferences_foundation
2021
import url_launcher_macos
@@ -35,6 +36,7 @@ func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
3536
PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin"))
3637
RecordMacOsPlugin.register(with: registry.registrar(forPlugin: "RecordMacOsPlugin"))
3738
RivePlugin.register(with: registry.registrar(forPlugin: "RivePlugin"))
39+
ScreenBrightnessMacosPlugin.register(with: registry.registrar(forPlugin: "ScreenBrightnessMacosPlugin"))
3840
ScreenRetrieverMacosPlugin.register(with: registry.registrar(forPlugin: "ScreenRetrieverMacosPlugin"))
3941
SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin"))
4042
UrlLauncherPlugin.register(with: registry.registrar(forPlugin: "UrlLauncherPlugin"))

client/pubspec.lock

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1054,6 +1054,14 @@ packages:
10541054
url: "https://pub.dev"
10551055
source: hosted
10561056
version: "2.0.1"
1057+
screen_brightness:
1058+
dependency: transitive
1059+
description:
1060+
name: screen_brightness
1061+
sha256: "5f70754028f169f059fdc61112a19dcbee152f8b293c42c848317854d650cba3"
1062+
url: "https://pub.dev"
1063+
source: hosted
1064+
version: "2.1.7"
10571065
screen_brightness_android:
10581066
dependency: transitive
10591067
description:
@@ -1062,6 +1070,30 @@ packages:
10621070
url: "https://pub.dev"
10631071
source: hosted
10641072
version: "2.1.3"
1073+
screen_brightness_ios:
1074+
dependency: transitive
1075+
description:
1076+
name: screen_brightness_ios
1077+
sha256: "2493953340ecfe8f4f13f61db50ce72533a55b0bbd58ba1402893feecf3727f5"
1078+
url: "https://pub.dev"
1079+
source: hosted
1080+
version: "2.1.2"
1081+
screen_brightness_macos:
1082+
dependency: transitive
1083+
description:
1084+
name: screen_brightness_macos
1085+
sha256: "4edf330ad21078686d8bfaf89413325fbaf571dcebe1e89254d675a3f288b5b9"
1086+
url: "https://pub.dev"
1087+
source: hosted
1088+
version: "2.1.1"
1089+
screen_brightness_ohos:
1090+
dependency: transitive
1091+
description:
1092+
name: screen_brightness_ohos
1093+
sha256: a93a263dcd39b5c56e589eb495bcd001ce65cdd96ff12ab1350683559d5c5bb7
1094+
url: "https://pub.dev"
1095+
source: hosted
1096+
version: "2.1.2"
10651097
screen_brightness_platform_interface:
10661098
dependency: transitive
10671099
description:
@@ -1070,6 +1102,14 @@ packages:
10701102
url: "https://pub.dev"
10711103
source: hosted
10721104
version: "2.1.0"
1105+
screen_brightness_windows:
1106+
dependency: transitive
1107+
description:
1108+
name: screen_brightness_windows
1109+
sha256: d3518bf0f5d7a884cee2c14449ae0b36803802866de09f7ef74077874b6b2448
1110+
url: "https://pub.dev"
1111+
source: hosted
1112+
version: "2.1.0"
10731113
screen_retriever:
10741114
dependency: transitive
10751115
description:

client/windows/flutter/generated_plugin_registrant.cc

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
#include <permission_handler_windows/permission_handler_windows_plugin.h>
1414
#include <record_windows/record_windows_plugin_c_api.h>
1515
#include <rive_common/rive_plugin.h>
16+
#include <screen_brightness_windows/screen_brightness_windows_plugin.h>
1617
#include <screen_retriever_windows/screen_retriever_windows_plugin_c_api.h>
1718
#include <url_launcher_windows/url_launcher_windows.h>
1819
#include <volume_controller/volume_controller_plugin_c_api.h>
@@ -34,6 +35,8 @@ void RegisterPlugins(flutter::PluginRegistry* registry) {
3435
registry->GetRegistrarForPlugin("RecordWindowsPluginCApi"));
3536
RivePluginRegisterWithRegistrar(
3637
registry->GetRegistrarForPlugin("RivePlugin"));
38+
ScreenBrightnessWindowsPluginRegisterWithRegistrar(
39+
registry->GetRegistrarForPlugin("ScreenBrightnessWindowsPlugin"));
3740
ScreenRetrieverWindowsPluginCApiRegisterWithRegistrar(
3841
registry->GetRegistrarForPlugin("ScreenRetrieverWindowsPluginCApi"));
3942
UrlLauncherWindowsRegisterWithRegistrar(

client/windows/flutter/generated_plugins.cmake

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ list(APPEND FLUTTER_PLUGIN_LIST
1010
permission_handler_windows
1111
record_windows
1212
rive_common
13+
screen_brightness_windows
1314
screen_retriever_windows
1415
url_launcher_windows
1516
volume_controller

packages/flet/lib/src/flet_core_extension.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,7 @@ import 'services/semantics_service.dart';
114114
import 'services/shake_detector.dart';
115115
import 'services/sensors.dart';
116116
import 'services/shared_preferences.dart';
117+
import 'services/screen_brightness.dart';
117118
import 'services/storage_paths.dart';
118119
import 'services/tester.dart';
119120
import 'services/url_launcher.dart';
@@ -391,6 +392,8 @@ class FletCoreExtension extends FletExtension {
391392
return SemanticsServiceControl(control: control);
392393
case "Magnetometer":
393394
return MagnetometerService(control: control);
395+
case "ScreenBrightness":
396+
return ScreenBrightnessService(control: control);
394397
case "StoragePaths":
395398
return StoragePaths(control: control);
396399
case "Window":
Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,134 @@
1+
import 'dart:async';
2+
3+
import 'package:flutter/foundation.dart';
4+
import 'package:screen_brightness/screen_brightness.dart';
5+
6+
import '../flet_service.dart';
7+
import '../utils/numbers.dart';
8+
import '../utils/platform.dart';
9+
10+
class ScreenBrightnessService extends FletService {
11+
final ScreenBrightness _screenBrightness = ScreenBrightness();
12+
StreamSubscription<double>? _systemSubscription;
13+
StreamSubscription<double>? _applicationSubscription;
14+
15+
ScreenBrightnessService({required super.control});
16+
17+
@override
18+
void init() {
19+
super.init();
20+
debugPrint("ScreenBrightnessService(${control.id}).init");
21+
control.addInvokeMethodListener(_invokeMethod);
22+
_updateListeners();
23+
}
24+
25+
@override
26+
void update() {
27+
_updateListeners();
28+
}
29+
30+
Future<dynamic> _invokeMethod(String name, dynamic args) async {
31+
if (isWebPlatform()) {
32+
return null;
33+
}
34+
35+
switch (name) {
36+
case "get_system_screen_brightness":
37+
return _screenBrightness.system;
38+
case "can_change_system_screen_brightness":
39+
return _screenBrightness.canChangeSystemBrightness;
40+
case "set_system_screen_brightness":
41+
final brightness = parseDouble(args["value"]);
42+
if (brightness == null) {
43+
throw ArgumentError.notNull("value");
44+
}
45+
return _screenBrightness.setSystemScreenBrightness(brightness);
46+
case "get_application_screen_brightness":
47+
return _screenBrightness.application;
48+
case "set_application_screen_brightness":
49+
final brightness = parseDouble(args["value"]);
50+
if (brightness == null) {
51+
throw ArgumentError.notNull("value");
52+
}
53+
return _screenBrightness.setApplicationScreenBrightness(brightness);
54+
case "reset_application_screen_brightness":
55+
return _screenBrightness.resetApplicationScreenBrightness();
56+
case "is_animate":
57+
return _screenBrightness.isAnimate;
58+
case "set_animate":
59+
final isAnimate = parseBool(args["value"]);
60+
if (isAnimate == null) {
61+
throw ArgumentError.notNull("value");
62+
}
63+
return _screenBrightness.setAnimate(isAnimate);
64+
case "is_auto_reset":
65+
return _screenBrightness.isAutoReset;
66+
case "set_auto_reset":
67+
final isAutoReset = parseBool(args["value"]);
68+
if (isAutoReset == null) {
69+
throw ArgumentError.notNull("value");
70+
}
71+
return _screenBrightness.setAutoReset(isAutoReset);
72+
default:
73+
throw Exception("Unknown ScreenBrightness method: $name");
74+
}
75+
}
76+
77+
void _updateListeners() {
78+
if (isWebPlatform()) {
79+
_disposeSubscriptions();
80+
return;
81+
}
82+
83+
final listenSystem =
84+
control.getBool("on_system_screen_brightness_change") == true;
85+
final listenApplication =
86+
control.getBool("on_application_screen_brightness_change") == true;
87+
88+
if (listenSystem && _systemSubscription == null) {
89+
_systemSubscription = _screenBrightness.onSystemScreenBrightnessChanged
90+
.listen((value) {
91+
control.triggerEvent(
92+
"system_screen_brightness_change", {"brightness": value});
93+
}, onError: (error) {
94+
debugPrint(
95+
"ScreenBrightnessService: error listening for system changes: $error");
96+
});
97+
} else if (!listenSystem && _systemSubscription != null) {
98+
_systemSubscription?.cancel();
99+
_systemSubscription = null;
100+
}
101+
102+
if (listenApplication && _applicationSubscription == null) {
103+
_applicationSubscription =
104+
_screenBrightness.onApplicationScreenBrightnessChanged.listen(
105+
(value) {
106+
control.triggerEvent(
107+
"application_screen_brightness_change", {"brightness": value});
108+
},
109+
onError: (error) {
110+
debugPrint(
111+
"ScreenBrightnessService: error listening for application changes: $error");
112+
},
113+
);
114+
} else if (!listenApplication && _applicationSubscription != null) {
115+
_applicationSubscription?.cancel();
116+
_applicationSubscription = null;
117+
}
118+
}
119+
120+
void _disposeSubscriptions() {
121+
_systemSubscription?.cancel();
122+
_systemSubscription = null;
123+
_applicationSubscription?.cancel();
124+
_applicationSubscription = null;
125+
}
126+
127+
@override
128+
void dispose() {
129+
debugPrint("ScreenBrightnessService(${control.id}).dispose()");
130+
control.removeInvokeMethodListener(_invokeMethod);
131+
_disposeSubscriptions();
132+
super.dispose();
133+
}
134+
}

packages/flet/pubspec.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ dependencies:
3636
path_provider: ^2.1.5
3737
provider: ^6.1.2
3838
screenshot: ^3.0.0
39+
screen_brightness: ^2.1.0
3940
sensors_plus: ^7.0.0
4041
shared_preferences: 2.5.3
4142
shimmer: ^3.0.0
Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
import flet as ft
2+
3+
4+
async def main(page: ft.Page):
5+
sb = ft.ScreenBrightness()
6+
page.services.append(sb)
7+
8+
info = ft.Text()
9+
system_change = ft.Text()
10+
app_change = ft.Text()
11+
12+
level = ft.Slider(min=0, max=1, divisions=20, value=0.5, label="Brightness")
13+
animate_switch = ft.Switch(
14+
label="Animate application changes", value=True, on_change=None
15+
)
16+
auto_reset_switch = ft.Switch(
17+
label="Auto-reset application brightness on lifecycle changes",
18+
value=True,
19+
on_change=None,
20+
)
21+
22+
async def refresh_info():
23+
system_brightness = await sb.get_system_screen_brightness()
24+
app_brightness = await sb.get_application_screen_brightness()
25+
can_change_system = await sb.can_change_system_screen_brightness()
26+
27+
animate_switch.value = await sb.is_animate()
28+
auto_reset_switch.value = await sb.is_auto_reset()
29+
30+
info.value = (
31+
f"System: {system_brightness:.2f} | "
32+
f"Application: {app_brightness:.2f} | "
33+
f"Can change system: {can_change_system}"
34+
)
35+
36+
async def set_application_brightness(_):
37+
await sb.set_application_screen_brightness(level.value)
38+
await refresh_info()
39+
40+
async def set_system_brightness(_):
41+
await sb.set_system_screen_brightness(level.value)
42+
await refresh_info()
43+
44+
async def reset_application_brightness(_):
45+
await sb.reset_application_screen_brightness()
46+
await refresh_info()
47+
48+
async def toggle_animate(e: ft.Event[ft.Switch]):
49+
await sb.set_animate(e.control.value)
50+
await refresh_info()
51+
52+
async def toggle_auto_reset(e: ft.Event[ft.Switch]):
53+
await sb.set_auto_reset(e.control.value)
54+
await refresh_info()
55+
56+
async def on_system_change(e: ft.ScreenBrightnessChangeEvent):
57+
system_change.value = f"System brightness changed: {e.brightness:.2f}"
58+
59+
async def on_application_change(e: ft.ScreenBrightnessChangeEvent):
60+
app_change.value = f"Application brightness changed: {e.brightness:.2f}"
61+
62+
sb.on_system_screen_brightness_change = on_system_change
63+
sb.on_application_screen_brightness_change = on_application_change
64+
65+
await refresh_info()
66+
67+
animate_switch.on_change = toggle_animate
68+
auto_reset_switch.on_change = toggle_auto_reset
69+
70+
page.add(
71+
ft.Column(
72+
[
73+
info,
74+
level,
75+
ft.Row(
76+
[
77+
ft.Button(
78+
"Set application", on_click=set_application_brightness
79+
),
80+
ft.Button("Set system", on_click=set_system_brightness),
81+
ft.TextButton(
82+
"Reset application", on_click=reset_application_brightness
83+
),
84+
],
85+
wrap=True,
86+
),
87+
animate_switch,
88+
auto_reset_switch,
89+
ft.Divider(),
90+
system_change,
91+
app_change,
92+
],
93+
spacing=12,
94+
)
95+
)
96+
97+
98+
ft.run(main)
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
---
2+
class_name: flet.ScreenBrightness
3+
examples: ../../../../examples/controls/screen_brightness
4+
---
5+
6+
{{ class_summary(class_name) }}
7+
8+
## Examples
9+
10+
```python
11+
--8<-- "{{ examples }}/basic.py"
12+
```
13+
14+
{{ class_members(class_name) }}

sdk/python/packages/flet/mkdocs.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -440,6 +440,7 @@ nav:
440440
- SelectionArea: controls/selectionarea.md
441441
- Semantics: controls/semantics.md
442442
- SemanticsService: controls/semanticsservice.md
443+
- ScreenBrightness: controls/screenbrightness.md
443444
- ShaderMask: controls/shadermask.md
444445
- Shimmer: controls/shimmer.md
445446
- ShakeDetector: controls/shakedetector.md

0 commit comments

Comments
 (0)