From 7397ad0ee2d71fb399b02510f9f04de1b90aaa3e Mon Sep 17 00:00:00 2001 From: Sarah Jamie Lewis Date: Mon, 15 Jan 2024 12:27:30 -0800 Subject: [PATCH] Formatting + Initial Integration of Enhanced Permissions --- lib/cwtch/cwtch.dart | 4 + lib/cwtch/ffi.dart | 14 + lib/cwtch/gomobile.dart | 9 + lib/models/acl.dart | 24 + lib/themes/opaque.dart | 4 +- lib/themes/yamltheme.dart | 5 +- lib/views/globalsettingsaboutview.dart | 228 +++----- lib/views/globalsettingsappearanceview.dart | 445 ++++++--------- lib/views/globalsettingsbehaviourview.dart | 113 ++-- lib/views/globalsettingsexperimentsview.dart | 541 +++++++------------ lib/views/globalsettingsview.dart | 33 +- lib/views/peersettingsview.dart | 6 + 12 files changed, 560 insertions(+), 866 deletions(-) create mode 100644 lib/models/acl.dart diff --git a/lib/cwtch/cwtch.dart b/lib/cwtch/cwtch.dart index 3976bfb9..ee2adc5f 100644 --- a/lib/cwtch/cwtch.dart +++ b/lib/cwtch/cwtch.dart @@ -2,6 +2,8 @@ // Details: https://docs.openprivacy.ca/cwtch-security-handbook/profile_encryption_and_storage.html import 'dart:collection'; +import '../models/acl.dart'; + const DefaultPassword = "be gay do crime"; const LastMessageSeenTimeKey = "profile.lastMessageSeenTime"; @@ -159,5 +161,7 @@ abstract class Cwtch { void PublishServerUpdate(String onion); Future ConfigureConnections(String onion, bool listen, bool peers, bool servers); + Future GetConversationAccessControlList(String profile, int conversation); + bool IsLoaded(); } diff --git a/lib/cwtch/ffi.dart b/lib/cwtch/ffi.dart index 1ccc4817..41a38c5f 100644 --- a/lib/cwtch/ffi.dart +++ b/lib/cwtch/ffi.dart @@ -5,6 +5,7 @@ import 'dart:io'; import 'dart:isolate'; import 'dart:io' show Platform; import 'package:cwtch/cwtch/cwtchNotifier.dart'; +import 'package:cwtch/models/acl.dart'; import 'package:path/path.dart' as path; import 'package:ffi/ffi.dart'; @@ -1141,4 +1142,17 @@ class CwtchFfi implements Cwtch { EnvironmentConfig.debugLog("Checking that the FFI Interface is Correctly Loaded... $check"); return check; } + + @override + Future GetConversationAccessControlList(String profile, int conversation) { + var getConversationACLC = library.lookup>("c_GetConversationAccessControlList"); + // ignore: non_constant_identifier_names + final GetConversationACL = getConversationACLC.asFunction(); + final utf8profile = profile.toNativeUtf8(); + Pointer aclRaw = GetConversationACL(utf8profile, utf8profile.length, conversation); + AccessControlList acl = AccessControl.FromJson(aclRaw.toDartString()); + _UnsafeFreePointerAnyUseOfThisFunctionMustBeDoubleApproved(aclRaw); + malloc.free(utf8profile); + return Future.value(acl); + } } diff --git a/lib/cwtch/gomobile.dart b/lib/cwtch/gomobile.dart index 7d28fcd3..d05d73c7 100644 --- a/lib/cwtch/gomobile.dart +++ b/lib/cwtch/gomobile.dart @@ -2,6 +2,7 @@ import 'dart:collection'; import 'dart:convert'; import 'package:cwtch/config.dart'; +import 'package:cwtch/models/acl.dart'; import 'package:flutter/services.dart'; import 'package:path_provider/path_provider.dart'; import 'dart:async'; @@ -479,4 +480,12 @@ class CwtchGomobile implements Cwtch { bool IsLoaded() { return true; } + + @override + Future GetConversationAccessControlList(String profile, int conversation) async { + return await cwtchPlatform.invokeMethod("GetConversationAttribute", {"ProfileOnion": profile, "conversation": conversation}).then((dynamic json) { + AccessControlList acl = AccessControl.FromJson(json); + return acl; + }); + } } diff --git a/lib/models/acl.dart b/lib/models/acl.dart new file mode 100644 index 00000000..9b0da85a --- /dev/null +++ b/lib/models/acl.dart @@ -0,0 +1,24 @@ +import 'dart:convert'; + +typedef AccessControlList = Map; + +class AccessControl { + bool Blocked = false; + bool AutoConnect = false; + bool ExchangeAttributes = false; + bool ShareFiles = false; + bool RenderImages = false; + AccessControl({this.Blocked = false, this.AutoConnect = false, this.ExchangeAttributes = false, this.ShareFiles = false, this.RenderImages = false}); + + static AccessControlList FromJson(String json) { + Map accessControlList = jsonDecode(json); + return accessControlList.map((key, value) => MapEntry( + key, + AccessControl( + Blocked: value["Blocked"], ExchangeAttributes: value["ExchangeAttributes"], AutoConnect: value["AutoConnect"], RenderImages: value["RenderImages"], ShareFiles: value["ShareFiles"]))); + } + + Map toJson() { + return {'Blocked': Blocked, 'AutoConnect': AutoConnect, 'ExchangeAttributes': ExchangeAttributes, 'ShareFiles': ShareFiles, 'RenderImages': RenderImages}; + } +} diff --git a/lib/themes/opaque.dart b/lib/themes/opaque.dart index 1fb8a2a1..4be37f84 100644 --- a/lib/themes/opaque.dart +++ b/lib/themes/opaque.dart @@ -123,7 +123,9 @@ abstract class OpaqueThemeType { get chatImage => null; - ImageProvider loadImage(String key, {BuildContext? context}) { return AssetImage(""); } + ImageProvider loadImage(String key, {BuildContext? context}) { + return AssetImage(""); + } // Sizes double contactOnionTextSize() { diff --git a/lib/themes/yamltheme.dart b/lib/themes/yamltheme.dart index e5be331a..04b50c54 100644 --- a/lib/themes/yamltheme.dart +++ b/lib/themes/yamltheme.dart @@ -149,10 +149,7 @@ class YmlTheme extends OpaqueThemeType { } if (context != null) { - File af = File(path.join(Provider - .of(context, listen: false) - .cwtch - .getAssetsDir(), key)); + File af = File(path.join(Provider.of(context, listen: false).cwtch.getAssetsDir(), key)); if (af.existsSync()) { return FileImage(af); } diff --git a/lib/views/globalsettingsaboutview.dart b/lib/views/globalsettingsaboutview.dart index 215a819c..ccf8919c 100644 --- a/lib/views/globalsettingsaboutview.dart +++ b/lib/views/globalsettingsaboutview.dart @@ -19,154 +19,104 @@ class GlobalSettingsAboutView extends StatefulWidget { } class _GlobalSettingsAboutViewState extends State { - ScrollController settingsListScrollController = ScrollController(); Widget build(BuildContext context) { return Consumer(builder: (ccontext, settings, child) { - return LayoutBuilder( - builder: (BuildContext context, BoxConstraints viewportConstraints) { - var appIcon = Icon(Icons.info, color: settings - .current() - .mainTextColor); - return Scrollbar( - key: Key("AboutSettingsView"), - trackVisibility: true, + return LayoutBuilder(builder: (BuildContext context, BoxConstraints viewportConstraints) { + var appIcon = Icon(Icons.info, color: settings.current().mainTextColor); + return Scrollbar( + key: Key("AboutSettingsView"), + trackVisibility: true, + controller: settingsListScrollController, + child: SingleChildScrollView( + clipBehavior: Clip.antiAlias, controller: settingsListScrollController, - child: SingleChildScrollView( - clipBehavior: Clip.antiAlias, - controller: settingsListScrollController, - padding: EdgeInsets.symmetric(vertical: 0, horizontal: 20), - child: ConstrainedBox( - constraints: BoxConstraints( - minHeight: viewportConstraints.maxHeight, - ), - child: Column(children: [ - AboutListTile( - icon: appIcon, - applicationIcon: Padding( - padding: EdgeInsets.all(5), - child: Icon(CwtchIcons.cwtch_knott)), - applicationName: "Cwtch UI", - applicationLegalese: - '\u{a9} 2021-2023 Open Privacy Research Society', - aboutBoxChildren: [ - Padding( - padding: EdgeInsets.fromLTRB( - 24.0 + 10.0 + (appIcon.size ?? 24.0), - 16.0, - 0.0, - 0.0), - // About has 24 padding (ln 389) and there appears to be another 10 of padding in the widget - child: SelectableText( - AppLocalizations.of(context)! - .versionBuilddate - .replaceAll( - "%1", EnvironmentConfig.BUILD_VER) - .replaceAll("%2", - EnvironmentConfig.BUILD_DATE)), - ) - ]), - SwitchListTile( - // TODO: Translate, Remove, OR Hide Prior to Release - title: Text("Show Performance Overlay"), - subtitle: - Text("Display an overlay graph of render time."), - value: settings.profileMode, + padding: EdgeInsets.symmetric(vertical: 0, horizontal: 20), + child: ConstrainedBox( + constraints: BoxConstraints( + minHeight: viewportConstraints.maxHeight, + ), + child: Column(children: [ + AboutListTile( + icon: appIcon, + applicationIcon: Padding(padding: EdgeInsets.all(5), child: Icon(CwtchIcons.cwtch_knott)), + applicationName: "Cwtch UI", + applicationLegalese: '\u{a9} 2021-2023 Open Privacy Research Society', + aboutBoxChildren: [ + Padding( + padding: EdgeInsets.fromLTRB(24.0 + 10.0 + (appIcon.size ?? 24.0), 16.0, 0.0, 0.0), + // About has 24 padding (ln 389) and there appears to be another 10 of padding in the widget + child: SelectableText(AppLocalizations.of(context)!.versionBuilddate.replaceAll("%1", EnvironmentConfig.BUILD_VER).replaceAll("%2", EnvironmentConfig.BUILD_DATE)), + ) + ]), + SwitchListTile( + // TODO: Translate, Remove, OR Hide Prior to Release + title: Text("Show Performance Overlay"), + subtitle: Text("Display an overlay graph of render time."), + value: settings.profileMode, + onChanged: (bool value) { + setState(() { + if (value) { + settings.profileMode = value; + } else { + settings.profileMode = value; + } + }); + }, + activeTrackColor: settings.theme.defaultButtonActiveColor, + inactiveTrackColor: settings.theme.defaultButtonDisabledColor, + secondary: Icon(Icons.bar_chart, color: settings.current().mainTextColor), + ), + Visibility( + visible: EnvironmentConfig.BUILD_VER == dev_version && !Platform.isAndroid, + child: SwitchListTile( + title: Text("Show Semantic Debugger"), + subtitle: Text("Show Accessibility Debugging View"), + value: settings.useSemanticDebugger, onChanged: (bool value) { - setState(() { - if (value) { - settings.profileMode = value; - } else { - settings.profileMode = value; - } - }); + if (value) { + settings.useSemanticDebugger = value; + } else { + settings.useSemanticDebugger = value; + } + saveSettings(context); }, - activeTrackColor: - settings.theme.defaultButtonActiveColor, - inactiveTrackColor: - settings.theme.defaultButtonDisabledColor, - secondary: Icon(Icons.bar_chart, - color: settings - .current() - .mainTextColor), - ), - Visibility( - visible: - EnvironmentConfig.BUILD_VER == dev_version && - !Platform.isAndroid, - child: SwitchListTile( - title: Text("Show Semantic Debugger"), - subtitle: - Text("Show Accessibility Debugging View"), - value: settings.useSemanticDebugger, - onChanged: (bool value) { - if (value) { - settings.useSemanticDebugger = value; - } else { - settings.useSemanticDebugger = value; - } - saveSettings(context); - }, - activeTrackColor: - settings.theme.defaultButtonActiveColor, - inactiveTrackColor: - settings.theme.defaultButtonDisabledColor, - secondary: Icon(Icons.settings_accessibility, - color: settings - .current() - .mainTextColor), - )), - Visibility( - visible: EnvironmentConfig.BUILD_VER == dev_version && - !Platform.isAndroid, - child: FutureBuilder( - future: - EnvironmentConfig.BUILD_VER != dev_version || - Platform.isAndroid - ? null - : Provider - .of(context) - .cwtch - .GetDebugInfo(), + activeTrackColor: settings.theme.defaultButtonActiveColor, + inactiveTrackColor: settings.theme.defaultButtonDisabledColor, + secondary: Icon(Icons.settings_accessibility, color: settings.current().mainTextColor), + )), + Visibility( + visible: EnvironmentConfig.BUILD_VER == dev_version && !Platform.isAndroid, + child: FutureBuilder( + future: EnvironmentConfig.BUILD_VER != dev_version || Platform.isAndroid ? null : Provider.of(context).cwtch.GetDebugInfo(), + builder: (context, snapshot) { + if (snapshot.hasData) { + return Column( + children: [ + Text("libCwtch Debug Info: " + snapshot.data.toString()), + Text("Message Cache Size (Mb): " + (Provider.of(context).profs.cacheMemUsage() / (1024 * 1024)).toString()) + ], + ); + } else { + return Container(); + } + }, + ), + ), + Visibility( + visible: EnvironmentConfig.BUILD_VER == dev_version, + child: FutureBuilder( + future: Provider.of(context).cwtch.PlatformChannelInfo(), builder: (context, snapshot) { if (snapshot.hasData) { - return Column( - children: [ - Text("libCwtch Debug Info: " + - snapshot.data.toString()), - Text("Message Cache Size (Mb): " + - (Provider - .of(context) - .profs - .cacheMemUsage() / - (1024 * 1024)) - .toString()) - ], - ); - } else { - return Container(); + HashMap data = snapshot.data as HashMap; + return getPlatformInfo(settings, data); } - }, - ), - ), - Visibility( - visible: EnvironmentConfig.BUILD_VER == dev_version, - child: FutureBuilder( - future: Provider - .of(context) - .cwtch - .PlatformChannelInfo(), - builder: (context, snapshot) { - if (snapshot.hasData) { - HashMap data = snapshot.data - as HashMap; - return getPlatformInfo(settings, data); - } - return Container(); - })) - ])))); - }); + return Container(); + })) + ])))); + }); }); } @@ -194,4 +144,4 @@ class _GlobalSettingsAboutViewState extends State { } return pinfo.version + "." + pinfo.buildNumber; } -} \ No newline at end of file +} diff --git a/lib/views/globalsettingsappearanceview.dart b/lib/views/globalsettingsappearanceview.dart index 54882d74..b9ccfbbb 100644 --- a/lib/views/globalsettingsappearanceview.dart +++ b/lib/views/globalsettingsappearanceview.dart @@ -15,301 +15,186 @@ class GlobalSettingsAppearanceView extends StatefulWidget { } class _GlobalSettingsAppearanceViewState extends State { - ScrollController settingsListScrollController = ScrollController(); Widget build(BuildContext context) { return Consumer(builder: (ccontext, settings, child) { - return LayoutBuilder( - builder: (BuildContext context, BoxConstraints viewportConstraints) { - return Scrollbar( - key: Key("AppearanceSettingsView"), - trackVisibility: true, + return LayoutBuilder(builder: (BuildContext context, BoxConstraints viewportConstraints) { + return Scrollbar( + key: Key("AppearanceSettingsView"), + trackVisibility: true, + controller: settingsListScrollController, + child: SingleChildScrollView( + clipBehavior: Clip.antiAlias, controller: settingsListScrollController, - child: SingleChildScrollView( - clipBehavior: Clip.antiAlias, - controller: settingsListScrollController, - padding: EdgeInsets.symmetric(vertical: 0, horizontal: 20), - child: ConstrainedBox( - constraints: BoxConstraints( - minHeight: viewportConstraints.maxHeight, - ), - child: Column(children: [ - ListTile( - title: Text( - AppLocalizations.of(context)!.settingLanguage), - leading: Icon(CwtchIcons.change_language, - color: settings - .current() - .mainTextColor), - trailing: Container( - width: MediaQuery - .of(context) - .size - .width / 4, - child: DropdownButton( - key: Key("languagelist"), - isExpanded: true, - value: Provider - .of(context) - .locale - .toString(), - onChanged: (String? newValue) { - setState(() { - EnvironmentConfig.debugLog( - "setting language: $newValue"); - settings.switchLocaleByCode(newValue!); - saveSettings(context); - }); - }, - items: AppLocalizations.supportedLocales - .map>( - (Locale value) { - return DropdownMenuItem( - value: value.toString(), - child: Text( - key: Key("dropdownLanguage" + - value.languageCode), - getLanguageFull( - context, - value.languageCode, - value.countryCode), - style: settings.scaleFonts( - defaultDropDownMenuItemTextStyle), - overflow: TextOverflow.ellipsis, - ), - ); - }).toList()))), - SwitchListTile( - title: - Text(AppLocalizations.of(context)!.settingTheme), - value: settings - .current() - .mode == mode_light, - onChanged: (bool value) { - if (value) { - settings.setTheme( - settings.theme.theme, mode_light); - } else { - settings.setTheme( - settings.theme.theme, mode_dark); - } + padding: EdgeInsets.symmetric(vertical: 0, horizontal: 20), + child: ConstrainedBox( + constraints: BoxConstraints( + minHeight: viewportConstraints.maxHeight, + ), + child: Column(children: [ + ListTile( + title: Text(AppLocalizations.of(context)!.settingLanguage), + leading: Icon(CwtchIcons.change_language, color: settings.current().mainTextColor), + trailing: Container( + width: MediaQuery.of(context).size.width / 4, + child: DropdownButton( + key: Key("languagelist"), + isExpanded: true, + value: Provider.of(context).locale.toString(), + onChanged: (String? newValue) { + setState(() { + EnvironmentConfig.debugLog("setting language: $newValue"); + settings.switchLocaleByCode(newValue!); + saveSettings(context); + }); + }, + items: AppLocalizations.supportedLocales.map>((Locale value) { + return DropdownMenuItem( + value: value.toString(), + child: Text( + key: Key("dropdownLanguage" + value.languageCode), + getLanguageFull(context, value.languageCode, value.countryCode), + style: settings.scaleFonts(defaultDropDownMenuItemTextStyle), + overflow: TextOverflow.ellipsis, + ), + ); + }).toList()))), + SwitchListTile( + title: Text(AppLocalizations.of(context)!.settingTheme), + value: settings.current().mode == mode_light, + onChanged: (bool value) { + if (value) { + settings.setTheme(settings.theme.theme, mode_light); + } else { + settings.setTheme(settings.theme.theme, mode_dark); + } // Save Settings... - saveSettings(context); - }, - activeTrackColor: settings.theme.defaultButtonColor, - inactiveTrackColor: - settings.theme.defaultButtonDisabledColor, - secondary: Icon(CwtchIcons.change_theme, - color: settings - .current() - .mainTextColor), + saveSettings(context); + }, + activeTrackColor: settings.theme.defaultButtonColor, + inactiveTrackColor: settings.theme.defaultButtonDisabledColor, + secondary: Icon(CwtchIcons.change_theme, color: settings.current().mainTextColor), + ), + ListTile( + title: Text(AppLocalizations.of(context)!.themeColorLabel), + trailing: Container( + width: MediaQuery.of(context).size.width / 4, + child: DropdownButton( + key: Key("DropdownTheme"), + isExpanded: true, + value: Provider.of(context).theme.theme, + onChanged: (String? newValue) { + setState(() { + settings.setTheme(newValue!, settings.theme.mode); + saveSettings(context); + }); + }, + items: themes.keys.map>((String themeId) { + return DropdownMenuItem( + value: themeId, + child: Text(getThemeName(context, themeId), style: settings.scaleFonts(defaultDropDownMenuItemTextStyle)), //"ddi_$themeId", key: Key("ddi_$themeId")), + ); + }).toList())), + leading: Icon(Icons.palette, color: settings.current().mainTextColor), + ), + ListTile( + title: Text(AppLocalizations.of(context)!.settingUIColumnPortrait), + leading: Icon(Icons.table_chart, color: settings.current().mainTextColor), + trailing: Container( + width: MediaQuery.of(context).size.width / 4, + child: DropdownButton( + isExpanded: true, + value: settings.uiColumnModePortrait.toString(), + onChanged: (String? newValue) { + settings.uiColumnModePortrait = Settings.uiColumnModeFromString(newValue!); + saveSettings(context); + }, + items: Settings.uiColumnModeOptions(false).map>((DualpaneMode value) { + return DropdownMenuItem( + value: value.toString(), + child: Text(Settings.uiColumnModeToString(value, context), style: settings.scaleFonts(defaultDropDownMenuItemTextStyle)), + ); + }).toList()))), + ListTile( + title: Text( + AppLocalizations.of(context)!.settingUIColumnLandscape, + textWidthBasis: TextWidthBasis.longestLine, + softWrap: true, ), - ListTile( - title: Text( - AppLocalizations.of(context)!.themeColorLabel), - trailing: Container( - width: MediaQuery - .of(context) - .size - .width / 4, - child: DropdownButton( - key: Key("DropdownTheme"), - isExpanded: true, - value: Provider - .of(context) - .theme - .theme, - onChanged: (String? newValue) { - setState(() { - settings.setTheme( - newValue!, settings.theme.mode); - saveSettings(context); - }); - }, - items: themes.keys - .map>( - (String themeId) { - return DropdownMenuItem( - value: themeId, - child: Text( - getThemeName(context, themeId), - style: settings.scaleFonts( - defaultDropDownMenuItemTextStyle)), //"ddi_$themeId", key: Key("ddi_$themeId")), - ); - }).toList())), - leading: Icon(Icons.palette, - color: settings - .current() - .mainTextColor), - ), - ListTile( - title: Text(AppLocalizations.of(context)! - .settingUIColumnPortrait), - leading: Icon(Icons.table_chart, - color: settings - .current() - .mainTextColor), - trailing: Container( - width: MediaQuery - .of(context) - .size - .width / 4, + leading: Icon(Icons.stay_primary_landscape, color: settings.current().mainTextColor), + trailing: Container( + width: MediaQuery.of(context).size.width / 4, + child: Container( + width: MediaQuery.of(context).size.width / 4, child: DropdownButton( isExpanded: true, - value: settings.uiColumnModePortrait - .toString(), + value: settings.uiColumnModeLandscape.toString(), onChanged: (String? newValue) { - settings.uiColumnModePortrait = - Settings.uiColumnModeFromString( - newValue!); + settings.uiColumnModeLandscape = Settings.uiColumnModeFromString(newValue!); saveSettings(context); }, - items: Settings.uiColumnModeOptions(false) - .map>( - (DualpaneMode value) { - return DropdownMenuItem( - value: value.toString(), - child: Text( - Settings.uiColumnModeToString( - value, context), - style: settings.scaleFonts( - defaultDropDownMenuItemTextStyle)), - ); - }).toList()))), - ListTile( - title: Text( - AppLocalizations.of(context)! - .settingUIColumnLandscape, - textWidthBasis: TextWidthBasis.longestLine, - softWrap: true, - ), - leading: Icon(Icons.stay_primary_landscape, - color: settings - .current() - .mainTextColor), - trailing: Container( - width: MediaQuery - .of(context) - .size - .width / 4, - child: Container( - width: - MediaQuery - .of(context) - .size - .width / 4, - child: DropdownButton( - isExpanded: true, - value: settings.uiColumnModeLandscape - .toString(), - onChanged: (String? newValue) { - settings.uiColumnModeLandscape = - Settings.uiColumnModeFromString( - newValue!); - saveSettings(context); - }, - items: - Settings.uiColumnModeOptions(true) - .map>( - (DualpaneMode value) { - return DropdownMenuItem( - value: value.toString(), - child: Text( - Settings.uiColumnModeToString( - value, context), - overflow: TextOverflow.ellipsis, - style: settings.scaleFonts( - defaultDropDownMenuItemTextStyle)), - ); - }).toList())))), - ListTile( - title: Text( - AppLocalizations.of(context)!.defaultScalingText), - subtitle: Text(AppLocalizations.of(context)! - .fontScalingDescription), - trailing: Container( - width: MediaQuery - .of(context) - .size - .width / 4, - child: Slider( - onChanged: (double value) { - settings.fontScaling = value; + items: Settings.uiColumnModeOptions(true).map>((DualpaneMode value) { + return DropdownMenuItem( + value: value.toString(), + child: Text(Settings.uiColumnModeToString(value, context), overflow: TextOverflow.ellipsis, style: settings.scaleFonts(defaultDropDownMenuItemTextStyle)), + ); + }).toList())))), + ListTile( + title: Text(AppLocalizations.of(context)!.defaultScalingText), + subtitle: Text(AppLocalizations.of(context)!.fontScalingDescription), + trailing: Container( + width: MediaQuery.of(context).size.width / 4, + child: Slider( + onChanged: (double value) { + settings.fontScaling = value; // Save Settings... - saveSettings(context); - EnvironmentConfig.debugLog( - "Font Scaling: $value"); - }, - min: 0.5, - divisions: 12, - max: 2.0, - label: '${settings.fontScaling * 100}%', - activeColor: - settings - .current() - .defaultButtonColor, - thumbColor: settings - .current() - .mainTextColor, - overlayColor: MaterialStateProperty.all( - settings - .current() - .mainTextColor), - inactiveColor: - settings.theme.defaultButtonDisabledColor, - value: settings.fontScaling)), - leading: Icon(Icons.format_size, - color: settings - .current() - .mainTextColor), - ), - SwitchListTile( - title: Text( - AppLocalizations.of(context)!.streamerModeLabel), - subtitle: Text(AppLocalizations.of(context)! - .descriptionStreamerMode), - value: settings.streamerMode, - onChanged: (bool value) { - settings.setStreamerMode(value); + saveSettings(context); + EnvironmentConfig.debugLog("Font Scaling: $value"); + }, + min: 0.5, + divisions: 12, + max: 2.0, + label: '${settings.fontScaling * 100}%', + activeColor: settings.current().defaultButtonColor, + thumbColor: settings.current().mainTextColor, + overlayColor: MaterialStateProperty.all(settings.current().mainTextColor), + inactiveColor: settings.theme.defaultButtonDisabledColor, + value: settings.fontScaling)), + leading: Icon(Icons.format_size, color: settings.current().mainTextColor), + ), + SwitchListTile( + title: Text(AppLocalizations.of(context)!.streamerModeLabel), + subtitle: Text(AppLocalizations.of(context)!.descriptionStreamerMode), + value: settings.streamerMode, + onChanged: (bool value) { + settings.setStreamerMode(value); // Save Settings... - saveSettings(context); - }, - activeTrackColor: settings.theme.defaultButtonColor, - inactiveTrackColor: - settings.theme.defaultButtonDisabledColor, - secondary: Icon(CwtchIcons.streamer_bunnymask, - color: settings - .current() - .mainTextColor), - ), - SwitchListTile( - title: Text(AppLocalizations.of(context)! - .formattingExperiment), - subtitle: Text(AppLocalizations.of(context)! - .messageFormattingDescription), - value: settings - .isExperimentEnabled(FormattingExperiment), - onChanged: (bool value) { - if (value) { - settings.enableExperiment(FormattingExperiment); - } else { - settings.disableExperiment(FormattingExperiment); - } - saveSettings(context); - }, - activeTrackColor: - settings.theme.defaultButtonActiveColor, - inactiveTrackColor: - settings.theme.defaultButtonDisabledColor, - secondary: Icon(Icons.text_fields, - color: settings - .current() - .mainTextColor), - ), - ])))); - }); + saveSettings(context); + }, + activeTrackColor: settings.theme.defaultButtonColor, + inactiveTrackColor: settings.theme.defaultButtonDisabledColor, + secondary: Icon(CwtchIcons.streamer_bunnymask, color: settings.current().mainTextColor), + ), + SwitchListTile( + title: Text(AppLocalizations.of(context)!.formattingExperiment), + subtitle: Text(AppLocalizations.of(context)!.messageFormattingDescription), + value: settings.isExperimentEnabled(FormattingExperiment), + onChanged: (bool value) { + if (value) { + settings.enableExperiment(FormattingExperiment); + } else { + settings.disableExperiment(FormattingExperiment); + } + saveSettings(context); + }, + activeTrackColor: settings.theme.defaultButtonActiveColor, + inactiveTrackColor: settings.theme.defaultButtonDisabledColor, + secondary: Icon(Icons.text_fields, color: settings.current().mainTextColor), + ), + ])))); + }); }); } diff --git a/lib/views/globalsettingsbehaviourview.dart b/lib/views/globalsettingsbehaviourview.dart index 31116d86..fc72e582 100644 --- a/lib/views/globalsettingsbehaviourview.dart +++ b/lib/views/globalsettingsbehaviourview.dart @@ -20,7 +20,6 @@ class _GlobalSettingsBehaviourViewState extends State setState(() { - powerExempt = value; - })); + powerExempt = value; + })); } else { powerExempt = false; } @@ -51,8 +50,7 @@ class _GlobalSettingsBehaviourViewState extends State isBatteryExempt() async { - return await androidSettingsChannel.invokeMethod('isBatteryExempt', {}) ?? - false; + return await androidSettingsChannel.invokeMethod('isBatteryExempt', {}) ?? false; } Future requestBatteryExemption() async { @@ -62,11 +60,9 @@ class _GlobalSettingsBehaviourViewState extends State(builder: (ccontext, settings, child) { - return LayoutBuilder( - builder: (BuildContext context, BoxConstraints viewportConstraints) { + return LayoutBuilder(builder: (BuildContext context, BoxConstraints viewportConstraints) { return Scrollbar( key: Key("BehaviourSettingsView"), trackVisibility: true, @@ -83,10 +79,8 @@ class _GlobalSettingsBehaviourViewState extends State>( - (NotificationPolicy value) { - return DropdownMenuItem( - value: value, - child: Text( - Settings.notificationPolicyToString( - value, context), - overflow: TextOverflow.ellipsis, - style: settings.scaleFonts( - defaultDropDownMenuItemTextStyle)), - ); - }).toList())), - leading: Icon(CwtchIcons.chat_bubble_empty_24px, - color: settings.current().mainTextColor), + items: NotificationPolicy.values.map>((NotificationPolicy value) { + return DropdownMenuItem( + value: value, + child: Text(Settings.notificationPolicyToString(value, context), overflow: TextOverflow.ellipsis, style: settings.scaleFonts(defaultDropDownMenuItemTextStyle)), + ); + }).toList())), + leading: Icon(CwtchIcons.chat_bubble_empty_24px, color: settings.current().mainTextColor), ), ListTile( - title: Text(AppLocalizations.of(context)! - .notificationContentSettingLabel), - subtitle: Text(AppLocalizations.of(context)! - .notificationContentSettingDescription), + title: Text(AppLocalizations.of(context)!.notificationContentSettingLabel), + subtitle: Text(AppLocalizations.of(context)!.notificationContentSettingDescription), trailing: Container( width: MediaQuery.of(context).size.width / 4, child: DropdownButton( @@ -147,29 +127,17 @@ class _GlobalSettingsBehaviourViewState extends State>( - (NotificationContent value) { - return DropdownMenuItem< - NotificationContent>( - value: value, - child: Text( - Settings.notificationContentToString( - value, context), - overflow: TextOverflow.ellipsis, - style: settings.scaleFonts( - defaultDropDownMenuItemTextStyle)), - ); - }).toList())), - leading: Icon(CwtchIcons.chat_bubble_empty_24px, - color: settings.current().mainTextColor), + items: NotificationContent.values.map>((NotificationContent value) { + return DropdownMenuItem( + value: value, + child: Text(Settings.notificationContentToString(value, context), overflow: TextOverflow.ellipsis, style: settings.scaleFonts(defaultDropDownMenuItemTextStyle)), + ); + }).toList())), + leading: Icon(CwtchIcons.chat_bubble_empty_24px, color: settings.current().mainTextColor), ), SwitchListTile( - title: Text( - AppLocalizations.of(context)!.blockUnknownLabel), - subtitle: Text(AppLocalizations.of(context)! - .descriptionBlockUnknownConnections), + title: Text(AppLocalizations.of(context)!.blockUnknownLabel), + subtitle: Text(AppLocalizations.of(context)!.descriptionBlockUnknownConnections), value: settings.blockUnknownConnections, onChanged: (bool value) { if (value) { @@ -182,16 +150,12 @@ class _GlobalSettingsBehaviourViewState extends State { - ScrollController settingsListScrollController = ScrollController(); Widget build(BuildContext context) { return Consumer(builder: (ccontext, settings, child) { - return LayoutBuilder( - builder: (BuildContext context, BoxConstraints viewportConstraints) { - return Scrollbar( - key: Key("ExperimentsSettingsView"), - trackVisibility: true, + return LayoutBuilder(builder: (BuildContext context, BoxConstraints viewportConstraints) { + return Scrollbar( + key: Key("ExperimentsSettingsView"), + trackVisibility: true, + controller: settingsListScrollController, + child: SingleChildScrollView( + clipBehavior: Clip.antiAlias, controller: settingsListScrollController, - child: SingleChildScrollView( - clipBehavior: Clip.antiAlias, - controller: settingsListScrollController, - padding: EdgeInsets.symmetric(vertical: 0, horizontal: 20), - child: ConstrainedBox( - constraints: BoxConstraints( - minHeight: viewportConstraints.maxHeight, - ), - child: Column(children: [ - SwitchListTile( - title: Text( - AppLocalizations.of(context)!.experimentsEnabled), - subtitle: Text(AppLocalizations.of(context)! - .descriptionExperiments), - value: settings.experimentsEnabled, - onChanged: (bool value) { - if (value) { - settings.enableExperiments(); - } else { - settings.disableExperiments(); - } - // Save Settings... - saveSettings(context); - }, - activeTrackColor: settings.theme.defaultButtonColor, - inactiveTrackColor: - settings.theme.defaultButtonDisabledColor, - secondary: Icon(CwtchIcons.enable_experiments, - color: settings - .current() - .mainTextColor), - ), - Visibility( - visible: settings.experimentsEnabled, - child: Column( - children: [ - SwitchListTile( - title: Text(AppLocalizations.of(context)! - .enableGroups), - subtitle: Text(AppLocalizations.of(context)! - .descriptionExperimentsGroups), - value: settings.isExperimentEnabled( - TapirGroupsExperiment), - onChanged: (bool value) { - if (value) { - settings.enableExperiment( - TapirGroupsExperiment); - } else { - settings.disableExperiment( - TapirGroupsExperiment); - } - // Save Settings... - saveSettings(context); - }, - activeTrackColor: - settings.theme.defaultButtonColor, - inactiveTrackColor: - settings.theme.defaultButtonDisabledColor, - secondary: Icon(CwtchIcons.enable_groups, - color: settings - .current() - .mainTextColor), - ), - Visibility( - visible: - !Platform.isAndroid && !Platform.isIOS, - child: SwitchListTile( - title: Text(AppLocalizations.of(context)! - .settingServers), - subtitle: Provider - .of( - context, - listen: false) - .cwtch - .IsServersCompiled() - ? Text(AppLocalizations.of(context)! - .settingServersDescription) - : Text( - "This version of Cwtch has been compiled without support for the server hosting experiment."), - value: Provider - .of(context, - listen: false) - .cwtch - .IsServersCompiled() && - settings.isExperimentEnabled( - ServerManagementExperiment), - onChanged: Provider - .of( - context, - listen: false) - .cwtch - .IsServersCompiled() - ? (bool value) { - Provider.of( - context, - listen: false) - .clear(); - if (value) { - settings.enableExperiment( - ServerManagementExperiment); - } else { - settings.disableExperiment( - ServerManagementExperiment); - } - // Save Settings... - saveSettings(context); - } - : null, - activeTrackColor: - settings.theme.defaultButtonColor, - inactiveTrackColor: settings - .theme.defaultButtonDisabledColor, - inactiveThumbColor: settings - .theme.defaultButtonDisabledColor, - secondary: Icon(CwtchIcons.dns_24px), - )), - SwitchListTile( - title: Text(AppLocalizations.of(context)! - .settingFileSharing), - subtitle: Text(AppLocalizations.of(context)! - .descriptionFileSharing), - value: settings.isExperimentEnabled( - FileSharingExperiment), - onChanged: (bool value) { - if (value) { - if (checkDownloadDirectory( - context, settings)) { - settings.enableExperiment( - FileSharingExperiment); - } else { - settings.enableExperiment( - FileSharingExperiment); - settings.disableExperiment( - ImagePreviewsExperiment); - } - } else { - settings.disableExperiment( - FileSharingExperiment); - settings.disableExperiment( - ImagePreviewsExperiment); - } - saveSettings(context); - }, - activeTrackColor: - settings.theme.defaultButtonColor, - inactiveTrackColor: - settings.theme.defaultButtonDisabledColor, - secondary: Icon(CwtchIcons.attached_file_3, - color: settings - .current() - .mainTextColor), - ), - Visibility( - visible: settings.isExperimentEnabled( - FileSharingExperiment), - child: Column(children: [ - SwitchListTile( - title: Text(AppLocalizations.of(context)! - .settingImagePreviews), - subtitle: Text( - AppLocalizations.of(context)! - .settingImagePreviewsDescription), - value: settings.isExperimentEnabled( - ImagePreviewsExperiment), - onChanged: (bool value) { - if (value) { - if (checkDownloadDirectory( - context, settings)) { - settings.enableExperiment( - ImagePreviewsExperiment); - } else { - settings.disableExperiment( - ImagePreviewsExperiment); - } - } else { - settings.disableExperiment( - ImagePreviewsExperiment); - } - saveSettings(context); - }, - activeTrackColor: settings - .theme.defaultButtonActiveColor, - inactiveTrackColor: settings - .theme.defaultButtonDisabledColor, - secondary: Icon(Icons.photo, - color: - settings - .current() - .mainTextColor), - ), - Visibility( - visible: settings.isExperimentEnabled( - ImagePreviewsExperiment) && - !Platform.isAndroid, - child: CwtchFolderPicker( - testKey: Key("DownloadFolderPicker"), - label: AppLocalizations.of(context)! - .settingDownloadFolder, - initialValue: settings.downloadPath, - textStyle: settings.scaleFonts( - defaultDropDownMenuItemTextStyle), - description: AppLocalizations.of( - context)! - .fileSharingSettingsDownloadFolderDescription, - tooltip: AppLocalizations.of(context)! - .fileSharingSettingsDownloadFolderTooltip, - onSave: (newVal) { - settings.downloadPath = newVal; - saveSettings(context); - }, - ), - ), - ]), - ), - SwitchListTile( - title: Text(AppLocalizations.of(context)! - .blodeuweddExperimentEnable), - subtitle: Provider - .of(context, - listen: false) - .cwtch - .IsBlodeuweddSupported() - ? Text(AppLocalizations.of(context)! - .blodeuweddDescription) - : Text(AppLocalizations.of(context)! - .blodeuweddNotSupported), - value: Provider - .of(context, - listen: false) - .cwtch - .IsBlodeuweddSupported() && - settings.isExperimentEnabled( - BlodeuweddExperiment), - onChanged: Provider - .of(context, - listen: false) - .cwtch - .IsBlodeuweddSupported() + padding: EdgeInsets.symmetric(vertical: 0, horizontal: 20), + child: ConstrainedBox( + constraints: BoxConstraints( + minHeight: viewportConstraints.maxHeight, + ), + child: Column(children: [ + SwitchListTile( + title: Text(AppLocalizations.of(context)!.experimentsEnabled), + subtitle: Text(AppLocalizations.of(context)!.descriptionExperiments), + value: settings.experimentsEnabled, + onChanged: (bool value) { + if (value) { + settings.enableExperiments(); + } else { + settings.disableExperiments(); + } + // Save Settings... + saveSettings(context); + }, + activeTrackColor: settings.theme.defaultButtonColor, + inactiveTrackColor: settings.theme.defaultButtonDisabledColor, + secondary: Icon(CwtchIcons.enable_experiments, color: settings.current().mainTextColor), + ), + Visibility( + visible: settings.experimentsEnabled, + child: Column( + children: [ + SwitchListTile( + title: Text(AppLocalizations.of(context)!.enableGroups), + subtitle: Text(AppLocalizations.of(context)!.descriptionExperimentsGroups), + value: settings.isExperimentEnabled(TapirGroupsExperiment), + onChanged: (bool value) { + if (value) { + settings.enableExperiment(TapirGroupsExperiment); + } else { + settings.disableExperiment(TapirGroupsExperiment); + } + // Save Settings... + saveSettings(context); + }, + activeTrackColor: settings.theme.defaultButtonColor, + inactiveTrackColor: settings.theme.defaultButtonDisabledColor, + secondary: Icon(CwtchIcons.enable_groups, color: settings.current().mainTextColor), + ), + Visibility( + visible: !Platform.isAndroid && !Platform.isIOS, + child: SwitchListTile( + title: Text(AppLocalizations.of(context)!.settingServers), + subtitle: Provider.of(context, listen: false).cwtch.IsServersCompiled() + ? Text(AppLocalizations.of(context)!.settingServersDescription) + : Text("This version of Cwtch has been compiled without support for the server hosting experiment."), + value: Provider.of(context, listen: false).cwtch.IsServersCompiled() && settings.isExperimentEnabled(ServerManagementExperiment), + onChanged: Provider.of(context, listen: false).cwtch.IsServersCompiled() ? (bool value) { + Provider.of(context, listen: false).clear(); + if (value) { + settings.enableExperiment(ServerManagementExperiment); + } else { + settings.disableExperiment(ServerManagementExperiment); + } + // Save Settings... + saveSettings(context); + } + : null, + activeTrackColor: settings.theme.defaultButtonColor, + inactiveTrackColor: settings.theme.defaultButtonDisabledColor, + inactiveThumbColor: settings.theme.defaultButtonDisabledColor, + secondary: Icon(CwtchIcons.dns_24px), + )), + SwitchListTile( + title: Text(AppLocalizations.of(context)!.settingFileSharing), + subtitle: Text(AppLocalizations.of(context)!.descriptionFileSharing), + value: settings.isExperimentEnabled(FileSharingExperiment), + onChanged: (bool value) { + if (value) { + if (checkDownloadDirectory(context, settings)) { + settings.enableExperiment(FileSharingExperiment); + } else { + settings.enableExperiment(FileSharingExperiment); + settings.disableExperiment(ImagePreviewsExperiment); + } + } else { + settings.disableExperiment(FileSharingExperiment); + settings.disableExperiment(ImagePreviewsExperiment); + } + saveSettings(context); + }, + activeTrackColor: settings.theme.defaultButtonColor, + inactiveTrackColor: settings.theme.defaultButtonDisabledColor, + secondary: Icon(CwtchIcons.attached_file_3, color: settings.current().mainTextColor), + ), + Visibility( + visible: settings.isExperimentEnabled(FileSharingExperiment), + child: Column(children: [ + SwitchListTile( + title: Text(AppLocalizations.of(context)!.settingImagePreviews), + subtitle: Text(AppLocalizations.of(context)!.settingImagePreviewsDescription), + value: settings.isExperimentEnabled(ImagePreviewsExperiment), + onChanged: (bool value) { if (value) { - settings.enableExperiment( - BlodeuweddExperiment); + if (checkDownloadDirectory(context, settings)) { + settings.enableExperiment(ImagePreviewsExperiment); + } else { + settings.disableExperiment(ImagePreviewsExperiment); + } } else { - settings.disableExperiment( - BlodeuweddExperiment); + settings.disableExperiment(ImagePreviewsExperiment); } saveSettings(context); - } - : null, - activeTrackColor: - settings.theme.defaultButtonColor, - inactiveTrackColor: - settings.theme.defaultButtonDisabledColor, - inactiveThumbColor: - settings.theme.defaultButtonDisabledColor, - secondary: Icon(Icons.assistant, - color: settings - .current() - .mainTextColor), + }, + activeTrackColor: settings.theme.defaultButtonActiveColor, + inactiveTrackColor: settings.theme.defaultButtonDisabledColor, + secondary: Icon(Icons.photo, color: settings.current().mainTextColor), ), Visibility( - visible: Provider - .of(context, - listen: false) - .cwtch - .IsBlodeuweddSupported() && - settings.isExperimentEnabled( - BlodeuweddExperiment), + visible: settings.isExperimentEnabled(ImagePreviewsExperiment) && !Platform.isAndroid, child: CwtchFolderPicker( testKey: Key("DownloadFolderPicker"), - label: AppLocalizations.of(context)! - .settingDownloadFolder, - initialValue: settings.blodeuweddPath, - description: AppLocalizations.of(context)! - .blodeuweddPath, - tooltip: AppLocalizations.of(context)! - .blodeuweddPath, + label: AppLocalizations.of(context)!.settingDownloadFolder, + initialValue: settings.downloadPath, + textStyle: settings.scaleFonts(defaultDropDownMenuItemTextStyle), + description: AppLocalizations.of(context)!.fileSharingSettingsDownloadFolderDescription, + tooltip: AppLocalizations.of(context)!.fileSharingSettingsDownloadFolderTooltip, onSave: (newVal) { - settings.blodeuweddPath = newVal; + settings.downloadPath = newVal; saveSettings(context); }, ), ), - ], - )), - Visibility( - visible: settings.experimentsEnabled, - child: SwitchListTile( - title: Text(AppLocalizations.of(context)! - .enableExperimentClickableLinks), - subtitle: Text(AppLocalizations.of(context)! - .experimentClickableLinksDescription), - value: settings.isExperimentEnabled( - ClickableLinksExperiment), - onChanged: (bool value) { - if (value) { - settings.enableExperiment( - ClickableLinksExperiment); - } else { - settings.disableExperiment( - ClickableLinksExperiment); - } - saveSettings(context); - }, - activeTrackColor: - settings.theme.defaultButtonActiveColor, - inactiveTrackColor: - settings.theme.defaultButtonDisabledColor, - secondary: Icon(Icons.link, - color: settings - .current() - .mainTextColor), - )), - Visibility( - visible: settings.experimentsEnabled, - child: SwitchListTile( - title: Text(AppLocalizations.of(context)! - .enableExperimentQRCode), - subtitle: Text(AppLocalizations.of(context)! - .experimentQRCodeDescription), - value: settings - .isExperimentEnabled(QRCodeExperiment), - onChanged: (bool value) { - if (value) { - settings.enableExperiment(QRCodeExperiment); - } else { - settings.disableExperiment(QRCodeExperiment); - } - saveSettings(context); - }, - activeTrackColor: - settings.theme.defaultButtonActiveColor, - inactiveTrackColor: - settings.theme.defaultButtonDisabledColor, - secondary: Icon(Icons.qr_code, - color: settings - .current() - .mainTextColor), - )), - ])))); - }); + ]), + ), + SwitchListTile( + title: Text(AppLocalizations.of(context)!.blodeuweddExperimentEnable), + subtitle: Provider.of(context, listen: false).cwtch.IsBlodeuweddSupported() + ? Text(AppLocalizations.of(context)!.blodeuweddDescription) + : Text(AppLocalizations.of(context)!.blodeuweddNotSupported), + value: Provider.of(context, listen: false).cwtch.IsBlodeuweddSupported() && settings.isExperimentEnabled(BlodeuweddExperiment), + onChanged: Provider.of(context, listen: false).cwtch.IsBlodeuweddSupported() + ? (bool value) { + if (value) { + settings.enableExperiment(BlodeuweddExperiment); + } else { + settings.disableExperiment(BlodeuweddExperiment); + } + saveSettings(context); + } + : null, + activeTrackColor: settings.theme.defaultButtonColor, + inactiveTrackColor: settings.theme.defaultButtonDisabledColor, + inactiveThumbColor: settings.theme.defaultButtonDisabledColor, + secondary: Icon(Icons.assistant, color: settings.current().mainTextColor), + ), + Visibility( + visible: Provider.of(context, listen: false).cwtch.IsBlodeuweddSupported() && settings.isExperimentEnabled(BlodeuweddExperiment), + child: CwtchFolderPicker( + testKey: Key("DownloadFolderPicker"), + label: AppLocalizations.of(context)!.settingDownloadFolder, + initialValue: settings.blodeuweddPath, + description: AppLocalizations.of(context)!.blodeuweddPath, + tooltip: AppLocalizations.of(context)!.blodeuweddPath, + onSave: (newVal) { + settings.blodeuweddPath = newVal; + saveSettings(context); + }, + ), + ), + ], + )), + Visibility( + visible: settings.experimentsEnabled, + child: SwitchListTile( + title: Text(AppLocalizations.of(context)!.enableExperimentClickableLinks), + subtitle: Text(AppLocalizations.of(context)!.experimentClickableLinksDescription), + value: settings.isExperimentEnabled(ClickableLinksExperiment), + onChanged: (bool value) { + if (value) { + settings.enableExperiment(ClickableLinksExperiment); + } else { + settings.disableExperiment(ClickableLinksExperiment); + } + saveSettings(context); + }, + activeTrackColor: settings.theme.defaultButtonActiveColor, + inactiveTrackColor: settings.theme.defaultButtonDisabledColor, + secondary: Icon(Icons.link, color: settings.current().mainTextColor), + )), + Visibility( + visible: settings.experimentsEnabled, + child: SwitchListTile( + title: Text(AppLocalizations.of(context)!.enableExperimentQRCode), + subtitle: Text(AppLocalizations.of(context)!.experimentQRCodeDescription), + value: settings.isExperimentEnabled(QRCodeExperiment), + onChanged: (bool value) { + if (value) { + settings.enableExperiment(QRCodeExperiment); + } else { + settings.disableExperiment(QRCodeExperiment); + } + saveSettings(context); + }, + activeTrackColor: settings.theme.defaultButtonActiveColor, + inactiveTrackColor: settings.theme.defaultButtonDisabledColor, + secondary: Icon(Icons.qr_code, color: settings.current().mainTextColor), + )), + ])))); + }); }); } @@ -379,9 +245,7 @@ class _GlobalSettingsExperimentsViewState extends State(context, listen: false) - .cwtch - .defaultDownloadPath(); + var path = Provider.of(context, listen: false).cwtch.defaultDownloadPath(); if (path != null) { settings.downloadPath = path; } else { @@ -393,11 +257,10 @@ class _GlobalSettingsExperimentsViewState extends State { - ScrollController settingsListScrollController = ScrollController(); @override @@ -35,7 +34,6 @@ class _GlobalSettingsViewState extends State { super.dispose(); } - @override Widget build(BuildContext context) { return DefaultTabController( @@ -46,23 +44,10 @@ class _GlobalSettingsViewState extends State { bottom: TabBar( isScrollable: true, tabs: [ - Tab( - key: Key("OpenSettingsAppearance"), - icon: Icon(Icons.palette), - text: AppLocalizations.of(context)! - .settingsGroupAppearance), - Tab( - key: Key("OpenSettingsBehaviour"), - icon: Icon(Icons.settings), - text: - AppLocalizations.of(context)!.settingGroupBehaviour), - Tab( - key: Key("OpenSettingsExperiments"), - icon: Icon(CwtchIcons.enable_experiments), - text: AppLocalizations.of(context)! - .settingsGroupExperiments), - Tab(icon: Icon(Icons.info), text: AppLocalizations.of(context)! - .settingsGroupAbout), + Tab(key: Key("OpenSettingsAppearance"), icon: Icon(Icons.palette), text: AppLocalizations.of(context)!.settingsGroupAppearance), + Tab(key: Key("OpenSettingsBehaviour"), icon: Icon(Icons.settings), text: AppLocalizations.of(context)!.settingGroupBehaviour), + Tab(key: Key("OpenSettingsExperiments"), icon: Icon(CwtchIcons.enable_experiments), text: AppLocalizations.of(context)!.settingsGroupExperiments), + Tab(icon: Icon(Icons.info), text: AppLocalizations.of(context)!.settingsGroupAbout), ], )), body: _buildSettingsList(), @@ -71,15 +56,11 @@ class _GlobalSettingsViewState extends State { Widget _buildSettingsList() { return Consumer(builder: (ccontext, settings, child) { - return LayoutBuilder( - builder: (BuildContext context, BoxConstraints viewportConstraints) { + return LayoutBuilder(builder: (BuildContext context, BoxConstraints viewportConstraints) { return TabBarView(children: [ GlobalSettingsAppearanceView(), - GlobalSettingsBehaviourView(), - GlobalSettingsExperimentsView(), - GlobalSettingsAboutView(), ]); }); @@ -90,7 +71,5 @@ class _GlobalSettingsViewState extends State { /// Send an UpdateGlobalSettings to the Event Bus saveSettings(context) { var settings = Provider.of(context, listen: false); - Provider.of(context, listen: false) - .cwtch - .UpdateSettings(jsonEncode(settings.asJson())); + Provider.of(context, listen: false).cwtch.UpdateSettings(jsonEncode(settings.asJson())); } diff --git a/lib/views/peersettingsview.dart b/lib/views/peersettingsview.dart index ff307427..50a79f73 100644 --- a/lib/views/peersettingsview.dart +++ b/lib/views/peersettingsview.dart @@ -92,6 +92,12 @@ class _PeerSettingsViewState extends State { ); }).toList(); + ProfileInfoState profileInfoState = Provider.of(context, listen: false); + ContactInfoState contact = Provider.of(context, listen: false); + Provider.of(context, listen: false).cwtch.GetConversationAccessControlList(profileInfoState.onion, contact.identifier).then((value) { + EnvironmentConfig.debugLog("acl: ${jsonEncode(value)}"); + }); + return Scrollbar( trackVisibility: true, controller: peerSettingsScrollController,