Unverified Commit a7a3d8ba authored by Jonah Williams's avatar Jonah Williams Committed by GitHub

[framework] don't hit test for system nav bar or system chrome on desktop (#97883)

parent 41a70b50
......@@ -265,30 +265,49 @@ class RenderView extends RenderObject with RenderObjectWithChildMixin<RenderBox>
// | |
// ++++++++++++++++++++++++++ <- bounds.bottom
final Rect bounds = paintBounds;
// Center of the status bar
final Offset top = Offset(
// Horizontal center of the screen
bounds.center.dx,
// The vertical center of the system status bar. The system status bar
// height is kept as top window padding.
_window.padding.top / 2.0,
);
// Center of the navigation bar
final Offset bottom = Offset(
// Horizontal center of the screen
bounds.center.dx,
// Vertical center of the system navigation bar. The system navigation bar
// height is kept as bottom window padding. The "1" needs to be subtracted
// from the bottom because available pixels are in (0..bottom) range.
// I.e. for a device with 1920 height, bound.bottom is 1920, but the most
// bottom drawn pixel is at 1919 position.
bounds.bottom - 1.0 - _window.padding.bottom / 2.0,
);
final SystemUiOverlayStyle? upperOverlayStyle = layer!.find<SystemUiOverlayStyle>(top);
// Only android has a customizable system navigation bar.
// Only Android / iOS / Fuchsia have a customizable status bar.
SystemUiOverlayStyle? upperOverlayStyle;
switch (defaultTargetPlatform) {
case TargetPlatform.android:
case TargetPlatform.iOS:
case TargetPlatform.fuchsia:
// Center of the status bar
final Offset top = Offset(
// Horizontal center of the screen
bounds.center.dx,
// The vertical center of the system status bar. The system status bar
// height is kept as top window padding.
_window.padding.top / 2.0,
);
upperOverlayStyle = layer!.find<SystemUiOverlayStyle>(top);
break;
case TargetPlatform.linux:
case TargetPlatform.macOS:
case TargetPlatform.windows:
break;
}
// Only Android has a customizable system navigation bar.
SystemUiOverlayStyle? lowerOverlayStyle;
switch (defaultTargetPlatform) {
case TargetPlatform.android:
// If there is no bottom view padding, then there is no navigation bar
// and the hit test can be skipped.
if (_window.viewPadding.bottom == 0.0) {
break;
}
// Center of the navigation bar
final Offset bottom = Offset(
// Horizontal center of the screen
bounds.center.dx,
// Vertical center of the system navigation bar. The system navigation bar
// height is kept as bottom window padding. The "1" needs to be subtracted
// from the bottom because available pixels are in (0..bottom) range.
// I.e. for a device with 1920 height, bound.bottom is 1920, but the most
// bottom drawn pixel is at 1919 position.
bounds.bottom - 1.0 - _window.padding.bottom / 2.0,
);
lowerOverlayStyle = layer!.find<SystemUiOverlayStyle>(bottom);
break;
case TargetPlatform.fuchsia:
......
......@@ -974,8 +974,11 @@ void main() {
},
),
);
expect(SystemChrome.latestStyle, SystemUiOverlayStyle.light);
});
expect(SystemChrome.latestStyle, const SystemUiOverlayStyle(
statusBarIconBrightness: Brightness.light,
statusBarBrightness: Brightness.dark,
));
}, variant: TargetPlatformVariant.mobile());
testWidgets('NavBar draws a dark system bar for a light background', (WidgetTester tester) async {
await tester.pumpWidget(
......@@ -994,8 +997,11 @@ void main() {
},
),
);
expect(SystemChrome.latestStyle, SystemUiOverlayStyle.dark);
});
expect(SystemChrome.latestStyle, const SystemUiOverlayStyle(
statusBarIconBrightness: Brightness.dark,
statusBarBrightness: Brightness.light,
));
}, variant: TargetPlatformVariant.mobile());
testWidgets('CupertinoNavigationBarBackButton shows an error when manually added outside a route', (WidgetTester tester) async {
await tester.pumpWidget(const CupertinoNavigationBarBackButton());
......
......@@ -16,11 +16,11 @@ void main() {
const double deviceWidth = 480.0;
const double devicePixelRatio = 2.0;
void setupTestDevice() {
void setupTestDevice({ double bottomPadding = navigationBarHeight * devicePixelRatio }) {
final TestWidgetsFlutterBinding binding = TestWidgetsFlutterBinding.ensureInitialized();
const FakeWindowPadding padding = FakeWindowPadding(
final FakeWindowPadding padding = FakeWindowPadding(
top: statusBarHeight * devicePixelRatio,
bottom: navigationBarHeight * devicePixelRatio,
bottom: bottomPadding,
);
binding.window
......@@ -94,8 +94,35 @@ void main() {
variant: TargetPlatformVariant.mobile(),
);
testWidgets("statusBarColor isn't set on desktop platforms",
(WidgetTester tester) async {
setupTestDevice();
const double moreThanHalfOfTheStatusBarHeight =
statusBarHeight / 2.0 + 1;
await tester.pumpWidget(const Align(
alignment: Alignment.topCenter,
child: AnnotatedRegion<SystemUiOverlayStyle>(
value: SystemUiOverlayStyle(
statusBarColor: Colors.blue,
),
child: SizedBox(
width: 100,
height: moreThanHalfOfTheStatusBarHeight,
),
),
));
await tester.pumpAndSettle();
expect(
SystemChrome.latestStyle?.statusBarColor,
isNull,
);
},
variant: TargetPlatformVariant.desktop(),
);
testWidgets(
'statusBarColor is set when view covers more than half of tye system status bar',
'statusBarColor is set when view covers more than half of the system status bar',
(WidgetTester tester) async {
setupTestDevice();
const double moreThanHalfOfTheStatusBarHeight =
......@@ -228,6 +255,28 @@ void main() {
variant: TargetPlatformVariant.only(TargetPlatform.android),
);
});
testWidgets('systemNavigationBarColor is not set when there is no window padding', (WidgetTester tester) async {
setupTestDevice(bottomPadding: 0);
await tester.pumpWidget(const Align(
alignment: Alignment.bottomCenter,
child: AnnotatedRegion<SystemUiOverlayStyle>(
value: SystemUiOverlayStyle(
systemNavigationBarColor: Colors.blue,
),
child: SizedBox(
width: 100,
height: 100
),
),
));
await tester.pumpAndSettle();
expect(
SystemChrome.latestStyle?.systemNavigationBarColor,
null,
);
}, variant: TargetPlatformVariant.only(TargetPlatform.android));
});
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment