diff --git a/packages/flutter_tools/templates/app_shared/ios.tmpl/Runner/Info.plist.tmpl b/packages/flutter_tools/templates/app_shared/ios.tmpl/Runner/Info.plist.tmpl index 4d224546da..e5332a5951 100644 --- a/packages/flutter_tools/templates/app_shared/ios.tmpl/Runner/Info.plist.tmpl +++ b/packages/flutter_tools/templates/app_shared/ios.tmpl/Runner/Info.plist.tmpl @@ -42,6 +42,6 @@ UIInterfaceOrientationLandscapeRight UIViewControllerBasedStatusBarAppearance - + diff --git a/packages/flutter_tools/templates/module/ios/host_app_ephemeral/Runner.tmpl/Info.plist.tmpl b/packages/flutter_tools/templates/module/ios/host_app_ephemeral/Runner.tmpl/Info.plist.tmpl index 23f020ccce..3202215f8a 100644 --- a/packages/flutter_tools/templates/module/ios/host_app_ephemeral/Runner.tmpl/Info.plist.tmpl +++ b/packages/flutter_tools/templates/module/ios/host_app_ephemeral/Runner.tmpl/Info.plist.tmpl @@ -42,6 +42,6 @@ UIInterfaceOrientationLandscapeRight UIViewControllerBasedStatusBarAppearance - + diff --git a/packages/flutter_tools/test/commands.shard/permeable/create_test.dart b/packages/flutter_tools/test/commands.shard/permeable/create_test.dart index 535e074f9a..3c31a0b383 100755 --- a/packages/flutter_tools/test/commands.shard/permeable/create_test.dart +++ b/packages/flutter_tools/test/commands.shard/permeable/create_test.dart @@ -1363,6 +1363,84 @@ void main() { ProcessManager: () => fakeProcessManager, }); + testUsingContext('UIViewControllerBasedStatusBarAppearance is YES for objc iOS project.', () async { + Cache.flutterRoot = '../..'; + + final CreateCommand command = CreateCommand(); + final CommandRunner runner = createTestCommandRunner(command); + + await runner.run(['create', '--template=app', '--no-pub', '--org', 'com.foo.bar','--ios-language=objc', '--project-name=my_project', projectDir.path]); + + final String plistPath = globals.fs.path.join('ios', 'Runner', 'Info.plist'); + final File plistFile = globals.fs.file(globals.fs.path.join(projectDir.path, plistPath)); + expect(plistFile, exists); + final bool viewControllerBasedStatusBarAppearance = _getBooleanValueFromPlist(plistFile: plistFile, key: 'UIViewControllerBasedStatusBarAppearance'); + expect(viewControllerBasedStatusBarAppearance, true); + }); + + testUsingContext('UIViewControllerBasedStatusBarAppearance is YES for objc swift project.', () async { + Cache.flutterRoot = '../..'; + + final CreateCommand command = CreateCommand(); + final CommandRunner runner = createTestCommandRunner(command); + + await runner.run(['create', '--template=app', '--no-pub', '--org', 'com.foo.bar','--ios-language=swift', '--project-name=my_project', projectDir.path]); + + final String plistPath = globals.fs.path.join('ios', 'Runner', 'Info.plist'); + final File plistFile = globals.fs.file(globals.fs.path.join(projectDir.path, plistPath)); + expect(plistFile, exists); + final bool viewControllerBasedStatusBarAppearance = _getBooleanValueFromPlist(plistFile: plistFile, key: 'UIViewControllerBasedStatusBarAppearance'); + expect(viewControllerBasedStatusBarAppearance, true); + }); + + testUsingContext('UIViewControllerBasedStatusBarAppearance is YES for objc iOS module.', () async { + Cache.flutterRoot = '../..'; + + final CreateCommand command = CreateCommand(); + final CommandRunner runner = createTestCommandRunner(command); + + await runner.run(['create', '--template=module', '--org', 'com.foo.bar','--ios-language=objc', '--project-name=my_project', projectDir.path]); + + final String plistPath = globals.fs.path.join('.ios', 'Runner', 'Info.plist'); + final File plistFile = globals.fs.file(globals.fs.path.join(projectDir.path, plistPath)); + expect(plistFile, exists); + final bool viewControllerBasedStatusBarAppearance = _getBooleanValueFromPlist(plistFile: plistFile, key: 'UIViewControllerBasedStatusBarAppearance'); + expect(viewControllerBasedStatusBarAppearance, true); + }, overrides: { + Pub: () => Pub( + fileSystem: globals.fs, + logger: globals.logger, + processManager: globals.processManager, + usage: globals.flutterUsage, + botDetector: globals.botDetector, + platform: globals.platform, + ), + }); + + testUsingContext('UIViewControllerBasedStatusBarAppearance is YES for swift iOS module.', () async { + Cache.flutterRoot = '../..'; + + final CreateCommand command = CreateCommand(); + final CommandRunner runner = createTestCommandRunner(command); + + await runner.run(['create', '--template=module', '--org', 'com.foo.bar','--ios-language=swift', '--project-name=my_project', projectDir.path]); + + final String plistPath = globals.fs.path.join('.ios', 'Runner', 'Info.plist'); + final File plistFile = globals.fs.file(globals.fs.path.join(projectDir.path, plistPath)); + expect(plistFile, exists); + final bool viewControllerBasedStatusBarAppearance = _getBooleanValueFromPlist(plistFile: plistFile, key: 'UIViewControllerBasedStatusBarAppearance'); + expect(viewControllerBasedStatusBarAppearance, true); + }, overrides: { + Pub: () => Pub( + fileSystem: globals.fs, + logger: globals.logger, + processManager: globals.processManager, + usage: globals.flutterUsage, + botDetector: globals.botDetector, + platform: globals.platform, + ), + }); + testUsingContext('display name is Title Case for objc iOS project.', () async { Cache.flutterRoot = '../..'; @@ -2973,3 +3051,10 @@ String _getStringValueFromPlist({File plistFile, String key}) { assert(keyIndex > 0); return plist[keyIndex+1].replaceAll('', '').replaceAll('', ''); } + +bool _getBooleanValueFromPlist({File plistFile, String key}) { + final List plist = plistFile.readAsLinesSync().map((String line) => line.trim()).toList(); + final int keyIndex = plist.indexOf('$key'); + assert(keyIndex > 0); + return plist[keyIndex+1].replaceAll('<', '').replaceAll('/>', '') == 'true'; +}