blob: e5a751f76f60846ae0dcdefb61b6d69a5f281e16 [file] [log] [blame]
// Copyright 2014 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:ui';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_test/flutter_test.dart';
void main() {
group('SystemChrome - style', () {
const double statusBarHeight = 25.0;
const double navigationBarHeight = 54.0;
const double deviceHeight = 960.0;
const double deviceWidth = 480.0;
const double devicePixelRatio = 2.0;
void setupTestDevice() {
final TestWidgetsFlutterBinding binding = TestWidgetsFlutterBinding.ensureInitialized() as TestWidgetsFlutterBinding;
const FakeWindowPadding padding = FakeWindowPadding(
top: statusBarHeight * devicePixelRatio,
bottom: navigationBarHeight * devicePixelRatio,
);
binding.window
..viewPaddingTestValue = padding
..paddingTestValue = padding
..devicePixelRatioTestValue = devicePixelRatio
..physicalSizeTestValue = const Size(
deviceWidth * devicePixelRatio,
deviceHeight * devicePixelRatio,
);
}
tearDown(() async {
SystemChrome.setSystemUIOverlayStyle(const SystemUiOverlayStyle());
await pumpEventQueue();
});
group('status bar', () {
testWidgets(
"statusBarColor isn't set for unannotated view",
(WidgetTester tester) async {
await tester.pumpWidget(const SizedBox.expand());
await tester.pumpAndSettle();
expect(SystemChrome.latestStyle?.statusBarColor, isNull);
},
);
testWidgets(
'statusBarColor is set for annotated view',
(WidgetTester tester) async {
setupTestDevice();
await tester.pumpWidget(const AnnotatedRegion<SystemUiOverlayStyle>(
value: SystemUiOverlayStyle(
statusBarColor: Colors.blue,
),
child: SizedBox.expand(),
));
await tester.pumpAndSettle();
expect(
SystemChrome.latestStyle?.statusBarColor,
Colors.blue,
);
},
variant: TargetPlatformVariant.mobile(),
);
testWidgets(
"statusBarColor isn't set when view covers less than half of the system status bar",
(WidgetTester tester) async {
setupTestDevice();
const double lessThanHalfOfTheStatusBarHeight =
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: lessThanHalfOfTheStatusBarHeight,
),
),
));
await tester.pumpAndSettle();
expect(SystemChrome.latestStyle?.statusBarColor, isNull);
},
variant: TargetPlatformVariant.mobile(),
);
testWidgets(
'statusBarColor is set when view covers more than half of tye system status bar',
(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,
Colors.blue,
);
},
variant: TargetPlatformVariant.mobile(),
);
});
group('navigation color (Android only)', () {
testWidgets(
"systemNavigationBarColor isn't set for non Android device",
(WidgetTester tester) async {
setupTestDevice();
await tester.pumpWidget(const AnnotatedRegion<SystemUiOverlayStyle>(
value: SystemUiOverlayStyle(
systemNavigationBarColor: Colors.blue,
),
child: SizedBox.expand(),
));
await tester.pumpAndSettle();
expect(
SystemChrome.latestStyle?.systemNavigationBarColor,
isNull,
);
},
variant: TargetPlatformVariant.only(TargetPlatform.iOS),
);
testWidgets(
"systemNavigationBarColor isn't set for unannotated view",
(WidgetTester tester) async {
await tester.pumpWidget(const SizedBox.expand());
await tester.pumpAndSettle();
expect(SystemChrome.latestStyle?.systemNavigationBarColor, isNull);
},
variant: TargetPlatformVariant.only(TargetPlatform.android),
);
testWidgets(
'systemNavigationBarColor is set for annotated view',
(WidgetTester tester) async {
setupTestDevice();
await tester.pumpWidget(const AnnotatedRegion<SystemUiOverlayStyle>(
value: SystemUiOverlayStyle(
systemNavigationBarColor: Colors.blue,
),
child: SizedBox.expand(),
));
await tester.pumpAndSettle();
expect(
SystemChrome.latestStyle?.systemNavigationBarColor,
Colors.blue,
);
},
variant: TargetPlatformVariant.only(TargetPlatform.android),
);
testWidgets(
"systemNavigationBarColor isn't set when view covers less than half of navigation bar",
(WidgetTester tester) async {
setupTestDevice();
const double lessThanHalfOfTheNavigationBarHeight =
navigationBarHeight / 2.0 - 1;
await tester.pumpWidget(const Align(
alignment: Alignment.bottomCenter,
child: AnnotatedRegion<SystemUiOverlayStyle>(
value: SystemUiOverlayStyle(
systemNavigationBarColor: Colors.blue,
),
child: SizedBox(
width: 100,
height: lessThanHalfOfTheNavigationBarHeight,
),
),
));
await tester.pumpAndSettle();
expect(SystemChrome.latestStyle?.systemNavigationBarColor, isNull);
},
variant: TargetPlatformVariant.only(TargetPlatform.android),
);
testWidgets(
'systemNavigationBarColor is set when view covers more than half of navigation bar',
(WidgetTester tester) async {
setupTestDevice();
const double moreThanHalfOfTheNavigationBarHeight =
navigationBarHeight / 2.0 + 1;
await tester.pumpWidget(const Align(
alignment: Alignment.bottomCenter,
child: AnnotatedRegion<SystemUiOverlayStyle>(
value: SystemUiOverlayStyle(
systemNavigationBarColor: Colors.blue,
),
child: SizedBox(
width: 100,
height: moreThanHalfOfTheNavigationBarHeight,
),
),
));
await tester.pumpAndSettle();
expect(
SystemChrome.latestStyle?.systemNavigationBarColor,
Colors.blue,
);
},
variant: TargetPlatformVariant.only(TargetPlatform.android),
);
});
});
}
class FakeWindowPadding implements WindowPadding {
const FakeWindowPadding({
this.left = 0.0,
this.top = 0.0,
this.right = 0.0,
this.bottom = 0.0,
});
@override
final double left;
@override
final double top;
@override
final double right;
@override
final double bottom;
}