view_chrome_style_test.dart 10 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
// 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 '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;

17
    void setupTestDevice(WidgetTester tester) {
18
      const FakeViewPadding padding = FakeViewPadding(
19
        top: statusBarHeight * devicePixelRatio,
20
        bottom: navigationBarHeight * devicePixelRatio,
21 22
      );

23 24 25 26 27 28
      addTearDown(tester.view.reset);
      tester.view
        ..viewPadding = padding
        ..padding = padding
        ..devicePixelRatio = devicePixelRatio
        ..physicalSize = const Size(
29 30 31 32 33 34 35 36 37 38 39
          deviceWidth * devicePixelRatio,
          deviceHeight * devicePixelRatio,
        );
    }

    tearDown(() async {
      SystemChrome.setSystemUIOverlayStyle(const SystemUiOverlayStyle());
      await pumpEventQueue();
    });

    group('status bar', () {
40
      testWidgets("statusBarColor isn't set for unannotated view",
41 42 43 44 45 46 47 48
        (WidgetTester tester) async {
          await tester.pumpWidget(const SizedBox.expand());
          await tester.pumpAndSettle();

          expect(SystemChrome.latestStyle?.statusBarColor, isNull);
        },
      );

49
      testWidgets('statusBarColor is set for annotated view',
50
        (WidgetTester tester) async {
51
          setupTestDevice(tester);
52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
          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(),
      );

68
      testWidgets("statusBarColor isn't set when view covers less than half of the system status bar",
69
        (WidgetTester tester) async {
70
          setupTestDevice(tester);
71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91
          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(),
      );

92
      testWidgets('statusBarColor is set when view covers more than half of tye system status bar',
93
        (WidgetTester tester) async {
94
          setupTestDevice(tester);
95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120
          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)', () {
121
      testWidgets("systemNavigationBarColor isn't set for non Android device",
122
        (WidgetTester tester) async {
123
          setupTestDevice(tester);
124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139
          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),
      );

140
      testWidgets("systemNavigationBarColor isn't set for unannotated view",
141 142 143 144 145 146 147 148 149
        (WidgetTester tester) async {
          await tester.pumpWidget(const SizedBox.expand());
          await tester.pumpAndSettle();

          expect(SystemChrome.latestStyle?.systemNavigationBarColor, isNull);
        },
        variant: TargetPlatformVariant.only(TargetPlatform.android),
      );

150
      testWidgets('systemNavigationBarColor is set for annotated view',
151
        (WidgetTester tester) async {
152
          setupTestDevice(tester);
153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168
          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),
      );

169
      testWidgets("systemNavigationBarColor isn't set when view covers less than half of navigation bar",
170
        (WidgetTester tester) async {
171
          setupTestDevice(tester);
172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192
          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),
      );

193
      testWidgets('systemNavigationBarColor is set when view covers more than half of navigation bar',
194
        (WidgetTester tester) async {
195
          setupTestDevice(tester);
196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219
          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),
      );
    });
220

221
    testWidgets('Top AnnotatedRegion provides status bar overlay style and bottom AnnotatedRegion provides navigation bar overlay style', (WidgetTester tester) async {
222
      setupTestDevice(tester);
223
      await tester.pumpWidget(
224
        const Column(children: <Widget>[
225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246
          Expanded(child: AnnotatedRegion<SystemUiOverlayStyle>(
            value: SystemUiOverlayStyle(
              systemNavigationBarColor: Colors.blue,
              statusBarColor: Colors.blue
            ),
            child: SizedBox.expand(),
          )),
          Expanded(child: AnnotatedRegion<SystemUiOverlayStyle>(
            value: SystemUiOverlayStyle(
              systemNavigationBarColor: Colors.green,
              statusBarColor: Colors.green,
            ),
            child: SizedBox.expand(),
          )),
        ]),
      );
      await tester.pumpAndSettle();

      expect(SystemChrome.latestStyle?.statusBarColor, Colors.blue);
      expect(SystemChrome.latestStyle?.systemNavigationBarColor, Colors.green);
    }, variant: TargetPlatformVariant.only(TargetPlatform.android));

247
    testWidgets('Top only AnnotatedRegion provides status bar and navigation bar style properties', (WidgetTester tester) async {
248
      setupTestDevice(tester);
249
      await tester.pumpWidget(
250
        const Column(children: <Widget>[
251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266
          Expanded(child: AnnotatedRegion<SystemUiOverlayStyle>(
            value: SystemUiOverlayStyle(
              systemNavigationBarColor: Colors.blue,
              statusBarColor: Colors.blue
            ),
            child: SizedBox.expand(),
          )),
          Expanded(child: SizedBox.expand()),
        ]),
      );
      await tester.pumpAndSettle();

      expect(SystemChrome.latestStyle?.statusBarColor, Colors.blue);
      expect(SystemChrome.latestStyle?.systemNavigationBarColor, Colors.blue);
    }, variant: TargetPlatformVariant.only(TargetPlatform.android));

267
    testWidgets('Bottom only AnnotatedRegion provides status bar and navigation bar style properties', (WidgetTester tester) async {
268
      setupTestDevice(tester);
269
      await tester.pumpWidget(
270
        const Column(children: <Widget>[
271 272 273 274 275 276 277 278 279 280 281 282 283 284 285
          Expanded(child: SizedBox.expand()),
          Expanded(child: AnnotatedRegion<SystemUiOverlayStyle>(
            value: SystemUiOverlayStyle(
              systemNavigationBarColor: Colors.green,
              statusBarColor: Colors.green
            ),
            child: SizedBox.expand(),
          )),
        ]),
      );
      await tester.pumpAndSettle();

      expect(SystemChrome.latestStyle?.statusBarColor, Colors.green);
      expect(SystemChrome.latestStyle?.systemNavigationBarColor, Colors.green);
    }, variant: TargetPlatformVariant.only(TargetPlatform.android));
286 287
  });
}