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);