Skip to content

Commit 76d5e1a

Browse files
author
Michael Strauß
committed
8343398: Add reducedData preference
Reviewed-by: angorya, kcr
1 parent 98916fe commit 76d5e1a

File tree

20 files changed

+475
-209
lines changed

20 files changed

+475
-209
lines changed

buildSrc/mac.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,7 @@ def dynamicLinkFlags = [
156156
"-framework", "OpenGL",
157157
"-framework", "QuartzCore",
158158
"-framework", "Security",
159+
"-framework", "Network",
159160
"-dynamiclib", "-lobjc"].flatten();
160161
def dynamicLinkFlagsAlt = ["-dynamiclib", commonParams].flatten()
161162

modules/javafx.graphics/src/main/java/com/sun/glass/ui/gtk/GtkApplication.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -454,7 +454,8 @@ protected boolean _supportsInputMethods() {
454454
"GTK.theme_bg_color", new PreferenceMapping<>("backgroundColor", Color.class),
455455
"GTK.theme_selected_bg_color", new PreferenceMapping<>("accentColor", Color.class),
456456
"GTK.enable_animations", new PreferenceMapping<>("reducedMotion", Boolean.class, b -> !b),
457-
"GTK.overlay_scrolling", new PreferenceMapping<>("persistentScrollBars", Boolean.class, b -> !b)
457+
"GTK.overlay_scrolling", new PreferenceMapping<>("persistentScrollBars", Boolean.class, b -> !b),
458+
"GTK.network_metered", new PreferenceMapping<>("reducedData", Boolean.class)
458459
);
459460
}
460461

@@ -482,7 +483,8 @@ public Map<String, Class<?>> getPlatformKeys() {
482483
Map.entry("GTK.error_color", Color.class),
483484
Map.entry("GTK.success_color", Color.class),
484485
Map.entry("GTK.enable_animations", Boolean.class),
485-
Map.entry("GTK.overlay_scrolling", Boolean.class)
486+
Map.entry("GTK.overlay_scrolling", Boolean.class),
487+
Map.entry("GTK.network_metered", Boolean.class)
486488
);
487489
}
488490
}

modules/javafx.graphics/src/main/java/com/sun/glass/ui/mac/MacApplication.java

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -103,8 +103,12 @@ private static void finishKeepAliveThread() {
103103

104104
private Menu appleMenu;
105105

106-
native void _runLoop(ClassLoader classLoader, Runnable launchable,
107-
boolean isTaskbarApplication);
106+
private long delegateHandle;
107+
108+
native long _initDelegate(ClassLoader classLoader, Runnable launchable, boolean isTaskbarApplication);
109+
110+
native void _runLoop(long delegate);
111+
108112
@Override
109113
protected void runLoop(final Runnable launchable) {
110114
// For normal (not embedded) taskbar applications the masOS activation
@@ -128,7 +132,8 @@ protected void runLoop(final Runnable launchable) {
128132
startKeepAliveThread();
129133

130134
ClassLoader classLoader = MacApplication.class.getClassLoader();
131-
_runLoop(classLoader, wrappedRunnable, isTaskbarApplication);
135+
delegateHandle = _initDelegate(classLoader, wrappedRunnable, isTaskbarApplication);
136+
_runLoop(delegateHandle);
132137
}
133138

134139
private final CountDownLatch reactivationLatch = new CountDownLatch(1);
@@ -154,10 +159,10 @@ void waitForReactivation() {
154159
eventLoop.enter();
155160
}
156161

157-
native private void _finishTerminating();
162+
native private void _finishTerminating(long delegateHandle);
158163
@Override
159164
protected void finishTerminating() {
160-
_finishTerminating();
165+
_finishTerminating(delegateHandle);
161166
finishKeepAliveThread();
162167

163168
super.finishTerminating();
@@ -420,8 +425,12 @@ public String getDataDirectory() {
420425

421426
private native String _getApplicationClassName();
422427

428+
private native Map<String, Object> _getPlatformPreferences(long delegateHandle);
429+
423430
@Override
424-
public native Map<String, Object> getPlatformPreferences();
431+
public Map<String, Object> getPlatformPreferences() {
432+
return _getPlatformPreferences(delegateHandle);
433+
}
425434

426435
@Override
427436
public Map<String, PreferenceMapping<?, ?>> getPlatformKeyMappings() {
@@ -431,7 +440,8 @@ public String getDataDirectory() {
431440
"macOS.NSColor.controlAccentColor", new PreferenceMapping<>("accentColor", Color.class),
432441
"macOS.NSWorkspace.accessibilityDisplayShouldReduceMotion", new PreferenceMapping<>("reducedMotion", Boolean.class),
433442
"macOS.NSWorkspace.accessibilityDisplayShouldReduceTransparency", new PreferenceMapping<>("reducedTransparency", Boolean.class),
434-
"macOS.NSScroller.preferredScrollerStyle", new PreferenceMapping<>("persistentScrollBars", String.class, "NSScrollerStyleLegacy"::equals)
443+
"macOS.NSScroller.preferredScrollerStyle", new PreferenceMapping<>("persistentScrollBars", String.class, "NSScrollerStyleLegacy"::equals),
444+
"macOS.NWPathMonitor.currentPathConstrained", new PreferenceMapping<>("reducedData", Boolean.class)
435445
);
436446
}
437447

@@ -487,7 +497,9 @@ public Map<String, Class<?>> getPlatformKeys() {
487497
Map.entry("macOS.NSColor.systemYellowColor", Color.class),
488498
Map.entry("macOS.NSWorkspace.accessibilityDisplayShouldReduceMotion", Boolean.class),
489499
Map.entry("macOS.NSWorkspace.accessibilityDisplayShouldReduceTransparency", Boolean.class),
490-
Map.entry("macOS.NSScroller.preferredScrollerStyle", String.class)
500+
Map.entry("macOS.NSScroller.preferredScrollerStyle", String.class),
501+
Map.entry("macOS.NWPathMonitor.currentPathConstrained", Boolean.class),
502+
Map.entry("macOS.NWPathMonitor.currentPathExpensive", Boolean.class)
491503
);
492504
}
493505

modules/javafx.graphics/src/main/java/com/sun/glass/ui/win/WinApplication.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -364,7 +364,12 @@ public String getDataDirectory() {
364364
"Windows.UIColor.Accent", new PreferenceMapping<>("accentColor", Color.class),
365365
"Windows.UISettings.AdvancedEffectsEnabled", new PreferenceMapping<>("reducedTransparency", Boolean.class, b -> !b),
366366
"Windows.UISettings.AutoHideScrollBars", new PreferenceMapping<>("persistentScrollBars", Boolean.class, b -> !b),
367-
"Windows.SPI.ClientAreaAnimation", new PreferenceMapping<>("reducedMotion", Boolean.class, b -> !b)
367+
"Windows.SPI.ClientAreaAnimation", new PreferenceMapping<>("reducedMotion", Boolean.class, b -> !b),
368+
"Windows.NetworkInformation.InternetCostType", new PreferenceMapping<>(
369+
"reducedData", String.class, v -> switch (v) {
370+
case "Unknown", "Unrestricted" -> false;
371+
default -> true;
372+
})
368373
);
369374
}
370375

@@ -393,7 +398,8 @@ public Map<String, Class<?>> getPlatformKeys() {
393398
Map.entry("Windows.UIColor.AccentLight2", Color.class),
394399
Map.entry("Windows.UIColor.AccentLight3", Color.class),
395400
Map.entry("Windows.UISettings.AdvancedEffectsEnabled", Boolean.class),
396-
Map.entry("Windows.UISettings.AutoHideScrollBars", Boolean.class)
401+
Map.entry("Windows.UISettings.AutoHideScrollBars", Boolean.class),
402+
Map.entry("Windows.NetworkInformation.InternetCostType", String.class)
397403
);
398404
}
399405
}

modules/javafx.graphics/src/main/java/com/sun/javafx/application/preferences/PlatformPreferences.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -223,6 +223,16 @@ public boolean isReducedTransparency() {
223223
return properties.isReducedTransparency();
224224
}
225225

226+
@Override
227+
public ReadOnlyBooleanProperty reducedDataProperty() {
228+
return properties.reducedDataProperty();
229+
}
230+
231+
@Override
232+
public boolean isReducedData() {
233+
return properties.isReducedData();
234+
}
235+
226236
@Override
227237
public ReadOnlyBooleanProperty persistentScrollBarsProperty() {
228238
return properties.persistentScrollBarsProperty();

modules/javafx.graphics/src/main/java/com/sun/javafx/application/preferences/PreferenceProperties.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,9 +51,11 @@ final class PreferenceProperties {
5151
private final ColorSchemeProperty colorScheme = new ColorSchemeProperty();
5252
private final DeferredProperty<Boolean> reducedMotion = new DeferredProperty<>("reducedMotion", false);
5353
private final DeferredProperty<Boolean> reducedTransparency = new DeferredProperty<>("reducedTransparency", false);
54+
private final DeferredProperty<Boolean> reducedData = new DeferredProperty<>("reducedData", false);
5455
private final DeferredProperty<Boolean> persistentScrollBars = new DeferredProperty<>("persistentScrollBars", false);
5556
private final ReadOnlyBooleanWrapper reducedMotionFlag;
5657
private final ReadOnlyBooleanWrapper reducedTransparencyFlag;
58+
private final ReadOnlyBooleanWrapper reducedDataFlag;
5759
private final ReadOnlyBooleanWrapper persistentScrollBarsFlag;
5860
private final Object bean;
5961

@@ -66,6 +68,9 @@ final class PreferenceProperties {
6668
reducedTransparencyFlag = new ReadOnlyBooleanWrapper(bean, reducedTransparency.getName());
6769
reducedTransparencyFlag.bind(reducedTransparency);
6870

71+
reducedDataFlag = new ReadOnlyBooleanWrapper(bean, reducedData.getName());
72+
reducedDataFlag.bind(reducedData);
73+
6974
persistentScrollBarsFlag = new ReadOnlyBooleanWrapper(bean, persistentScrollBars.getName());
7075
persistentScrollBarsFlag.bind(persistentScrollBars);
7176
}
@@ -94,6 +99,18 @@ public void setReducedTransparency(boolean value) {
9499
reducedTransparency.setValueOverride(value);
95100
}
96101

102+
public ReadOnlyBooleanProperty reducedDataProperty() {
103+
return reducedDataFlag.getReadOnlyProperty();
104+
}
105+
106+
public boolean isReducedData() {
107+
return reducedData.get();
108+
}
109+
110+
public void setReducedData(boolean value) {
111+
reducedData.setValueOverride(value);
112+
}
113+
97114
public ReadOnlyBooleanProperty persistentScrollBarsProperty() {
98115
return persistentScrollBarsFlag.getReadOnlyProperty();
99116
}

modules/javafx.graphics/src/main/java/javafx/application/Platform.java

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -456,7 +456,7 @@ public static Preferences getPreferences() {
456456
}
457457

458458
/**
459-
* Contains UI preferences of the current platform.
459+
* Contains preferences of the current platform.
460460
* <p>
461461
* {@code Preferences} extends {@link ObservableMap} to expose platform preferences as key-value pairs.
462462
* The map is unmodifiable, which means that keys and values cannot be added, removed, or updated.
@@ -498,6 +498,7 @@ public static Preferences getPreferences() {
498498
* <tr><td>{@code Windows.UIColor.AccentLight3}</td><td>{@link Color}</td></tr>
499499
* <tr><td>{@code Windows.UISettings.AdvancedEffectsEnabled}</td><td>{@link Boolean}</td></tr>
500500
* <tr><td>{@code Windows.UISettings.AutoHideScrollBars}</td><td>{@link Boolean}</td></tr>
501+
* <tr><td>{@code Windows.NetworkInformation.InternetCostType}</td><td>{@link String}</td></tr>
501502
* <tr></tr>
502503
* </tbody>
503504
* </table>
@@ -553,6 +554,8 @@ public static Preferences getPreferences() {
553554
* <tr><td>{@code macOS.NSWorkspace.accessibilityDisplayShouldReduceMotion}</td><td>{@link Boolean}</td></tr>
554555
* <tr><td>{@code macOS.NSWorkspace.accessibilityDisplayShouldReduceTransparency}</td><td>{@link Boolean}</td></tr>
555556
* <tr><td>{@code macOS.NSScroller.preferredScrollerStyle}</td><td>{@link String}</td></tr>
557+
* <tr><td>{@code macOS.NWPathMonitor.currentPathConstrained}</td><td>{@link Boolean}</td></tr>
558+
* <tr><td>{@code macOS.NWPathMonitor.currentPathExpensive}</td><td>{@link Boolean}</td></tr>
556559
* <tr></tr>
557560
* </tbody>
558561
* </table>
@@ -580,6 +583,7 @@ public static Preferences getPreferences() {
580583
* <tr><td>{@code GTK.success_color}</td><td>{@link Color}</td></tr>
581584
* <tr><td>{@code GTK.enable_animations}</td><td>{@link Boolean}</td></tr>
582585
* <tr><td>{@code GTK.overlay_scrolling}</td><td>{@link Boolean}</td></tr>
586+
* <tr><td>{@code GTK.network_metered}</td><td>{@link Boolean}</td></tr>
583587
* <tr></tr>
584588
* </tbody>
585589
* </table>
@@ -631,6 +635,20 @@ public sealed interface Preferences extends ObservableMap<String, Object>
631635

632636
boolean isReducedTransparency();
633637

638+
/**
639+
* Specifies whether applications should minimize the amount of internet traffic, which users
640+
* might request because they are on a metered network or a limited data plan.
641+
* <p>
642+
* If the platform does not report this preference, this property defaults to {@code false}.
643+
*
644+
* @return the {@code reducedData} property
645+
* @defaultValue {@code false}
646+
* @since 24
647+
*/
648+
ReadOnlyBooleanProperty reducedDataProperty();
649+
650+
boolean isReducedData();
651+
634652
/**
635653
* The platform color scheme, which specifies whether applications should prefer light text on
636654
* dark backgrounds, or dark text on light backgrounds.

modules/javafx.graphics/src/main/native-glass/gtk/GlassApplication.cpp

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -74,13 +74,6 @@ static gboolean call_runnable (gpointer data)
7474
return FALSE;
7575
}
7676

77-
static void call_update_preferences()
78-
{
79-
if (platformSupport) {
80-
platformSupport->updatePreferences();
81-
}
82-
}
83-
8477
extern "C" {
8578

8679
#pragma GCC diagnostic push
@@ -197,14 +190,6 @@ JNIEXPORT void JNICALL Java_com_sun_glass_ui_gtk_GtkApplication__1init
197190
gdk_window_set_events(root, static_cast<GdkEventMask>(gdk_window_get_events(root) | GDK_PROPERTY_CHANGE_MASK));
198191

199192
platformSupport = new PlatformSupport(env, obj);
200-
201-
GtkSettings* settings = gtk_settings_get_default();
202-
if (settings != NULL) {
203-
for (const auto& setting : PlatformSupport::observedSettings) {
204-
g_signal_connect_after(G_OBJECT(settings), setting,
205-
G_CALLBACK(call_update_preferences), NULL);
206-
}
207-
}
208193
}
209194

210195
/*

modules/javafx.graphics/src/main/native-glass/gtk/PlatformSupport.cpp

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,12 +71,45 @@ namespace
7171
env->CallObjectMethod(preferences, jMapPut, prefKey, prefValue);
7272
CHECK_JNI_EXCEPTION(env);
7373
}
74+
75+
void notifySettingChanged(GObject*, GParamSpec*, PlatformSupport* instance) {
76+
instance->updatePreferences();
77+
}
78+
79+
void notifyNetworkChanged(GNetworkMonitor*, gboolean, PlatformSupport* instance) {
80+
instance->updatePreferences();
81+
}
7482
}
7583

7684
PlatformSupport::PlatformSupport(JNIEnv* env, jobject application)
77-
: env(env), application(env->NewGlobalRef(application)), preferences(NULL) {}
85+
: env(env), application(env->NewGlobalRef(application)), preferences(NULL) {
86+
GtkSettings* settings = gtk_settings_get_default();
87+
if (settings != NULL) {
88+
for (int i = 0; i < NUM_OBSERVED_SETTINGS; ++i) {
89+
settingChangedHandlers[i] = g_signal_connect_data(
90+
G_OBJECT(settings), OBSERVED_SETTINGS[i],
91+
G_CALLBACK(notifySettingChanged), this,
92+
NULL, G_CONNECT_AFTER);
93+
}
94+
}
95+
96+
networkChangedHandler = g_signal_connect_data(
97+
G_OBJECT(g_network_monitor_get_default()), "network-changed",
98+
G_CALLBACK(notifyNetworkChanged), this,
99+
NULL, G_CONNECT_AFTER);
100+
}
78101

79102
PlatformSupport::~PlatformSupport() {
103+
GtkSettings* settings = gtk_settings_get_default();
104+
105+
for (int i = 0; i < NUM_OBSERVED_SETTINGS; ++i) {
106+
if (settingChangedHandlers[i] != 0) {
107+
g_signal_handler_disconnect(G_OBJECT(settings), settingChangedHandlers[i]);
108+
}
109+
}
110+
111+
g_signal_handler_disconnect(G_OBJECT(g_network_monitor_get_default()), networkChangedHandler);
112+
80113
env->DeleteGlobalRef(application);
81114

82115
if (preferences) {
@@ -129,6 +162,10 @@ jobject PlatformSupport::collectPreferences() const {
129162
}
130163
}
131164

165+
GNetworkMonitor* networkMonitor = g_network_monitor_get_default();
166+
bool metered = g_network_monitor_get_network_metered(networkMonitor);
167+
putBoolean(env, prefs, "GTK.network_metered", metered);
168+
132169
return prefs;
133170
}
134171

modules/javafx.graphics/src/main/native-glass/gtk/PlatformSupport.h

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -30,12 +30,6 @@
3030
class PlatformSupport final
3131
{
3232
public:
33-
static constexpr const char* observedSettings[] = {
34-
"notify::gtk-theme-name",
35-
"notify::gtk-enable-animations",
36-
"notify::gtk-overlay-scrolling"
37-
};
38-
3933
PlatformSupport(JNIEnv*, jobject);
4034
~PlatformSupport();
4135
PlatformSupport(PlatformSupport const&) = delete;
@@ -53,7 +47,17 @@ class PlatformSupport final
5347
void updatePreferences() const;
5448

5549
private:
50+
static constexpr const char* OBSERVED_SETTINGS[] = {
51+
"notify::gtk-theme-name",
52+
"notify::gtk-enable-animations",
53+
"notify::gtk-overlay-scrolling"
54+
};
55+
56+
static constexpr int NUM_OBSERVED_SETTINGS = sizeof(OBSERVED_SETTINGS) / sizeof(const char*);
57+
5658
JNIEnv* env;
5759
jobject application;
60+
unsigned long settingChangedHandlers[NUM_OBSERVED_SETTINGS] = {};
61+
unsigned long networkChangedHandler = 0;
5862
mutable jobject preferences;
5963
};

0 commit comments

Comments
 (0)