diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist index 5f5d9c5ea2..2d1cabcc0e 100644 --- a/ios/Runner/Info.plist +++ b/ios/Runner/Info.plist @@ -1,75 +1,96 @@ - - CADisableMinimumFrameDurationOnPhone - - CFBundleDevelopmentRegion - $(DEVELOPMENT_LANGUAGE) - CFBundleDisplayName - Zulip beta - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - Zulip beta - CFBundlePackageType - APPL - CFBundleShortVersionString - $(FLUTTER_BUILD_NAME) - CFBundleSignature - ???? - CFBundleURLTypes - - - CFBundleURLName - com.zulip.flutter - CFBundleURLSchemes - - zulip - - - - CFBundleVersion - $(FLUTTER_BUILD_NUMBER) - FlutterDeepLinkingEnabled - - ITSAppUsesNonExemptEncryption - - LSRequiresIPhoneOS - - NSCameraUsageDescription - By allowing camera access, you can take photos and send them in Zulip messages. - NSPhotoLibraryUsageDescription - Choose photos from your library and send them in Zulip messages. - UIApplicationSupportsIndirectInputEvents - - UIBackgroundModes - - fetch - remote-notification - - UILaunchStoryboardName - LaunchScreen - UIMainStoryboardFile - Main - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UISupportedInterfaceOrientations~ipad - - UIInterfaceOrientationPortrait - UIInterfaceOrientationPortraitUpsideDown - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UIViewControllerBasedStatusBarAppearance - - + + CADisableMinimumFrameDurationOnPhone + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleDisplayName + Zulip beta + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + Zulip beta + CFBundlePackageType + APPL + CFBundleShortVersionString + $(FLUTTER_BUILD_NAME) + CFBundleSignature + ???? + CFBundleURLTypes + + + CFBundleURLName + com.zulip.flutter + CFBundleURLSchemes + + zulip + + + + CFBundleVersion + $(FLUTTER_BUILD_NUMBER) + FlutterDeepLinkingEnabled + + ITSAppUsesNonExemptEncryption + + LSRequiresIPhoneOS + + NSCameraUsageDescription + By allowing camera access, you can take photos and send them in Zulip messages. + NSPhotoLibraryUsageDescription + Choose photos from your library and send them in Zulip messages. + UIApplicationSupportsIndirectInputEvents + + UIBackgroundModes + + fetch + remote-notification + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UIViewControllerBasedStatusBarAppearance + + UIApplicationSceneManifest + + UIApplicationSupportsMultipleScenes + + UISceneConfigurations + + UIWindowSceneSessionRoleApplication + + + UISceneClassName + UIWindowScene + UISceneDelegateClassName + FlutterSceneDelegate + UISceneConfigurationName + flutter + UISceneStoryboardFile + Main + + + + + diff --git a/lib/widgets/settings.dart b/lib/widgets/settings.dart index 9e7581c539..1846282dbd 100644 --- a/lib/widgets/settings.dart +++ b/lib/widgets/settings.dart @@ -44,18 +44,19 @@ class _ThemeSetting extends StatelessWidget { Widget build(BuildContext context) { final zulipLocalizations = ZulipLocalizations.of(context); final globalSettings = GlobalStoreWidget.settingsOf(context); - return Column( - children: [ - ListTile(title: Text(zulipLocalizations.themeSettingTitle)), - for (final themeSettingOption in [null, ...ThemeSetting.values]) - RadioListTile.adaptive( - title: Text(ThemeSetting.displayName( - themeSetting: themeSettingOption, - zulipLocalizations: zulipLocalizations)), - value: themeSettingOption, - groupValue: globalSettings.themeSetting, - onChanged: (newValue) => _handleChange(context, newValue)), - ]); + return RadioGroup( + groupValue: globalSettings.themeSetting, + onChanged: (newValue) => _handleChange(context, newValue), + child: Column( + children: [ + ListTile(title: Text(zulipLocalizations.themeSettingTitle)), + for (final themeSettingOption in [null, ...ThemeSetting.values]) + RadioListTile.adaptive( + title: Text(ThemeSetting.displayName( + themeSetting: themeSettingOption, + zulipLocalizations: zulipLocalizations)), + value: themeSettingOption), + ])); } } diff --git a/pubspec.lock b/pubspec.lock index 4784adf19a..8d9e507392 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1079,26 +1079,26 @@ packages: dependency: "direct dev" description: name: test - sha256: "301b213cd241ca982e9ba50266bd3f5bd1ea33f1455554c5abb85d1be0e2d87e" + sha256: "65e29d831719be0591f7b3b1a32a3cda258ec98c58c7b25f7b84241bc31215bb" url: "https://pub.dev" source: hosted - version: "1.25.15" + version: "1.26.2" test_api: dependency: "direct dev" description: name: test_api - sha256: fb31f383e2ee25fbbfe06b40fe21e1e458d14080e3c67e7ba0acfde4df4e0bbd + sha256: "522f00f556e73044315fa4585ec3270f1808a4b186c936e612cab0b565ff1e00" url: "https://pub.dev" source: hosted - version: "0.7.4" + version: "0.7.6" test_core: dependency: transitive description: name: test_core - sha256: "84d17c3486c8dfdbe5e12a50c8ae176d15e2a771b96909a9442b40173649ccaa" + sha256: "80bf5a02b60af04b09e14f6fe68b921aad119493e26e490deaca5993fef1b05a" url: "https://pub.dev" source: hosted - version: "0.6.8" + version: "0.6.11" timing: dependency: transitive description: @@ -1191,10 +1191,10 @@ packages: dependency: transitive description: name: vector_math - sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" + sha256: d530bd74fea330e6e364cda7a85019c434070188383e1cd8d9777ee586914c5b url: "https://pub.dev" source: hosted - version: "2.1.4" + version: "2.2.0" video_player: dependency: "direct main" description: @@ -1355,5 +1355,5 @@ packages: source: path version: "0.0.1" sdks: - dart: ">=3.9.0-114.0.dev <4.0.0" - flutter: ">=3.33.0-1.0.pre.44" + dart: ">=3.9.0-172.0.dev <4.0.0" + flutter: ">=3.33.0-1.0.pre.347" diff --git a/pubspec.yaml b/pubspec.yaml index b49bf1fd7d..f82430ca5b 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -14,8 +14,8 @@ environment: # We use a recent version of Flutter from its main channel, and # the corresponding recent version of the Dart SDK. # Feel free to update these regularly; see README.md for instructions. - sdk: '>=3.9.0-114.0.dev <4.0.0' - flutter: '>=3.33.0-1.0.pre.44' # 358b0726882869cd917e1e2dc07b6c298e6c2992 + sdk: '>=3.9.0-172.0.dev <4.0.0' + flutter: '>=3.33.0-1.0.pre.347' # d2e4017f8174fcb71baeb17d6210c4b51f59c564 # To update dependencies, see instructions in README.md. dependencies: diff --git a/test/flutter_checks.dart b/test/flutter_checks.dart index 0bfbd2d33a..c6e31bb1fa 100644 --- a/test/flutter_checks.dart +++ b/test/flutter_checks.dart @@ -249,7 +249,3 @@ extension IconButtonChecks on Subject { extension SwitchListTileChecks on Subject { Subject get value => has((x) => x.value, 'value'); } - -extension RadioListTileChecks on Subject> { - Subject get checked => has((x) => x.checked, 'checked'); -} diff --git a/test/widgets/settings_test.dart b/test/widgets/settings_test.dart index 46df165ecc..9c1ed065be 100644 --- a/test/widgets/settings_test.dart +++ b/test/widgets/settings_test.dart @@ -2,6 +2,7 @@ import 'package:checks/checks.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; +import 'package:legacy_checks/legacy_checks.dart'; import 'package:zulip/model/settings.dart'; import 'package:zulip/widgets/settings.dart'; @@ -39,9 +40,18 @@ void main() { ThemeSetting.dark => 'Dark', }; for (final title in ['System', 'Light', 'Dark']) { - check(tester.widget>( - findRadioListTileWithTitle(title))) - .checked.equals(title == expectedCheckedTitle); + final expectedIsChecked = title == expectedCheckedTitle; + final element = tester.element(findRadioListTileWithTitle(title)); + final checkedColor = Theme.of(element).colorScheme.primary; + // `paints` isn't a [Matcher] so we wrap it with `equals`; + // awkward but it works + final paintsAsCheckedMatcher = equals(paints..circle(color: checkedColor)); + check(because: '$title should be ${expectedIsChecked ? 'checked' : 'unchecked'}', + element.renderObject, + ).legacyMatcher( + expectedIsChecked + ? paintsAsCheckedMatcher + : isNot(paintsAsCheckedMatcher)); } check(testBinding.globalStore) .settings.themeSetting.equals(expectedThemeSetting);