view_chrome_style_test.dart 10.1 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 40
          deviceWidth * devicePixelRatio,
          deviceHeight * devicePixelRatio,
        );
    }

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

    group('status bar', () {
      testWidgets(
41
        "statusBarColor isn't set for unannotated view",
42 43 44 45 46 47 48 49 50 51 52
        (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 {
53
          setupTestDevice(tester);
54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
          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(
71
        "statusBarColor isn't set when view covers less than half of the system status bar",
72
        (WidgetTester tester) async {
73
          setupTestDevice(tester);
74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
          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(
96
        'statusBarColor is set when view covers more than half of tye system status bar',
97
        (WidgetTester tester) async {
98
          setupTestDevice(tester);
99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125
          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(
126
        "systemNavigationBarColor isn't set for non Android device",
127
        (WidgetTester tester) async {
128
          setupTestDevice(tester);
129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145
          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(
146
        "systemNavigationBarColor isn't set for unannotated view",
147 148 149 150 151 152 153 154 155 156 157 158
        (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 {
159
          setupTestDevice(tester);
160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176
          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(
177
        "systemNavigationBarColor isn't set when view covers less than half of navigation bar",
178
        (WidgetTester tester) async {
179
          setupTestDevice(tester);
180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203
          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 {
204
          setupTestDevice(tester);
205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228
          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),
      );
    });
229 230

    testWidgets('Top AnnotatedRegion provides status bar overlay style and bottom AnnotatedRegion provides navigation bar overlay style', (WidgetTester tester) async {
231
      setupTestDevice(tester);
232
      await tester.pumpWidget(
233
        const Column(children: <Widget>[
234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256
          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));

    testWidgets('Top only AnnotatedRegion provides status bar and navigation bar style properties', (WidgetTester tester) async {
257
      setupTestDevice(tester);
258
      await tester.pumpWidget(
259
        const Column(children: <Widget>[
260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276
          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));

    testWidgets('Bottom only AnnotatedRegion provides status bar and navigation bar style properties', (WidgetTester tester) async {
277
      setupTestDevice(tester);
278
      await tester.pumpWidget(
279
        const Column(children: <Widget>[
280 281 282 283 284 285 286 287 288 289 290 291 292 293 294
          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));
295 296
  });
}